/** @import * as TYPES from "./types.ts" */ /** @type {TYPES.GraphBuilder} */ export default function Builder({user, role, part, desk, pass}) { // mutate users /** @type {Record} */ //@ts-ignore const UserList = user; for(let userId in user) { const name = user[userId]; UserList[userId] = {name, desk:new Set()}; } // mutate roles /** @type {Record} */ //@ts-ignore const RoleList = role; for(let roleId in role) { const [name, ...userIds] = role[roleId]; RoleList[roleId] = {name, user:userIds.map(uId=>UserList[/**@type{string}*/(uId)])}; } // mutate parts /** @type {Record} */ //@ts-ignore const PartList = part; for(let partId in part) { const name = part[partId]; PartList[partId] = /** @type {TYPES.Part} */({name, need:[], make:[], pass:new Map()}); } // mutate desks /** @type {Record} */ //@ts-ignore const DeskList = desk; for(let deskId in desk) { const [name, roleIDs, mode, needObj, ...makePartIDs] = desk[deskId]; /** @type {TYPES.Part[]}*/ const need =[]; /** @type {number[]}*/ const time =[]; /** @type {TYPES.Desk} */ const deskObj = { name, mode, need, time, make:[], role:[] }; for(const partId in needObj) { const part = PartList[partId]; need.push(part); part.need.push(deskObj); time.push(needObj[partId]); } deskObj.role = roleIDs.map(roleId=> { const role = RoleList[/**@type{string}*/(roleId)]; role.user.forEach(u =>u.desk.add(deskObj)); return role; }); deskObj.make = makePartIDs.map( partId=> { const part = PartList[/**@type{string}*/(partId)]; part.make.push(deskObj); return part; } ) DeskList[deskId] = deskObj; } // Apply passes // for(let passID in pass) // { // const [name, users] = pass[passID]; // /** @type {TYPES.Pass} */ // const passObj = {name, path:passID}; // // for(let userID in users) // { // const userPart = users[userID]; // const user = UserList[userID]; // for(let partID in userPart) // { // const part = PartList[partID]; // const entries = userPart[partID]; // entries.forEach(([time, data]) => { // /** @type {TYPES.Work} */ // const work = [user, time, data]; // // let partPass = part.pass.get(passObj); // if(!partPass) // { // partPass = {time:0, work:[]} // part.pass.set(passObj, partPass); // } // partPass.work.push(work); // if(partPass.time < time) // { // partPass.time = time; // } // }); // } // } // } console.log(user, part, desk); } /** @type {TYPES.MassDscription} */ export function Graph(params) { Object.entries(params).forEach(([roomFolderName, roomData])=> { Object.entries(roomData.pass).forEach(([passFolderName, passData])=>{ const RebuiltPass = { async load(){ const roomFolder = await globalThis.FOLDER.getDirectoryHandle(roomFolderName); const passFolder = await roomFolder.getDirectoryHandle(passFolderName); console.log(passFolder); for await (const [_, userFile] of passFolder.entries()) { if(userFile.name.endsWith(".json")) { const userID = userFile.name.substring(0, userFile.name.length-5) try { /** @type {Record>} */ const loadedData = await userFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t)); Object.entries(loadedData).forEach(([partID, payload])=>{ const part = roomData.part[partID] payload = [...payload, roomData.user[userID]] }) } catch (e) { console.warn(`Couldn't parse user data: ${roomFolder.name} / ${passFolder.name} / ${userFile.name}`, e); } } } this.live = true; }, dump(){ this.data = {}; this.live = false; }, live:false } roomData.pass[passFolderName] = RebuiltPass; }) }); globalThis.ROOMS = params; console.log(globalThis.ROOMS); } const Scan =(desk)=> { const need = Object.keys(desk.need); const make = desk.make; const dirtyNeed = []; const dirtyMake = []; let makeMin = Infinity; let needMax = -Infinity; for(let i=0; i needMax) needMax = part.time; } for(let i=0; i makeMin) { dirtyNeed.push(id); } } console.log("scan", dirtyNeed, dirtyMake); return [dirtyNeed, dirtyMake]; };