diff --git a/graph.js b/graph.js index 556b398..cff3cd0 100644 --- a/graph.js +++ b/graph.js @@ -1,7 +1,7 @@ /** @import * as TYPES from "./types.ts" */ /** @type {TYPES.GraphBuilder} */ -export default function Builder({user, role, part, desk, pass}) +export default function Builder({user, role, part, desk, pass}, folderHandle, folderName) { // mutate users @@ -80,92 +80,93 @@ export default function Builder({user, role, part, desk, pass}) } // Apply passes + /** @type {Record} */ + const PassList = {}; -// 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; -// } -// }); -// } -// } -// } + for(let passID in pass) + { + const [passName] = pass[passID]; + /** @type {TYPES.Pass} */ + PassList[passID] = { + name: passName, + path:passID, + async load(){ - console.log(user, part, desk); + const roomFolder = await folderHandle.getDirectoryHandle(folderName); + const passFolder = await roomFolder.getDirectoryHandle(passID); + + for await (const [_, userFile] of passFolder.entries()) + { + if(userFile.name.endsWith(".json")) + { + const userID = userFile.name.substring(0, userFile.name.length-5); + const userObject = UserList[userID]; + try + { + /** @type {Record>} */ + const loadedData = await userFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t)); + + Object.entries(loadedData).forEach(([partID, payload])=>{ + + let latest = 0; + payload.forEach((condensedWork)=>{ + if(condensedWork[0] > latest) + { + latest = condensedWork[0]; + } + condensedWork.push(userObject); + }); + + let passCheck = PartList[partID].pass.get(this); + if(!passCheck) + { + passCheck = {time:0, work:[]} + PartList[partID].pass.set(this, passCheck); + } + + if(latest > passCheck.time) + { + passCheck.time = latest; + } + + passCheck.work = /** @type {TYPES.Work[]}*/(payload) + }) + } + catch (e) + { + console.warn(`Couldn't parse user data: ${roomFolder.name} / ${passFolder.name} / ${userFile.name}`, e); + } + } + } + this.live = true; + }, + dump(){ + Object.entries(PartList).forEach(([partID, partObj])=>{ + partObj.pass.delete(this); + }); + this.live = false; + }, + live:false + }; + } + + return { + Desk:DeskList, + Part:PartList, + User:UserList, + Role:RoleList, + Pass:PassList + }; } /** @type {TYPES.MassDscription} */ export function Graph(params) { - Object.entries(params).forEach(([roomFolderName, roomData])=> + 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 = Builder(roomData, globalThis.FOLDER, roomFolderName); + console.log(globalThis.ROOMS); }); - globalThis.ROOMS = params; - console.log(globalThis.ROOMS); } const Scan =(desk)=> diff --git a/types.ts b/types.ts index e05b49c..2eea5ce 100644 --- a/types.ts +++ b/types.ts @@ -1,92 +1,39 @@ +export type User = {name:string, desk:Set}; +export type Role = {name:string, user:User[]}; +export type Desk = {name:string, need:Part[], time:number[], make:Part[], mode:string, role:Role[]}; +export type Work = [user:User, time:number, data:string]; +export type Pass = {name:string, path:string, live:boolean, load:()=Promise, dump:()=>void}; +export type Part = {name:string, pass:Map, need:Desk[], make:Desk[]}; + export type GraphBuilder= < Users extends Record, Roles extends Record]>, Parts extends Record, Desks extends Record, mode:"all"|"one", need:Partial>, ...make:Array]>, - Pass extends Record< - string, - [ - name:string, - user:Partial - >> - >> - ] - > > ( params:{ + meta?:{name:string}, user:Users, role:Roles, part:Parts, desk:Desks, - pass:Pass, - } + pass:Record, + }, + folderHandle:FileSystemDirectoryHandle, + folderName:string ) -=>void +=>{ + Desk:Record, + Part:Record, + User:Record, + Role:Record, + Pass:Record +} - -export type GraphLoader= -< - Users extends Record, - Roles extends Record]>, - Parts extends Record, - Desks extends Record, mode:"all"|"one", need:Partial>, ...make:Array]>, - Passes extends Record< - string, - [ - name:string, - user:Partial - >> - >> - ] - > -> -( - params:{ - user:Users, - role:Roles, - part:Parts, - desk:Desks, - pass?:Passes, - } -) -=>void - - -export type User = {name:string, desk:Set}; -export type Role = {name:string, user:User[]}; -export type Desk = {name:string, need:Part[], time:number[], make:Part[], mode:string, role:Role[]}; -export type Work = [user:User, time:number, data:string]; -export type Pass = {name:string, path:string}; -export type Part = {name:string, pass:Map, need:Desk[], make:Desk[]}; - - -type MassRoomMeta = {name:string} -type MassPassMeta = [name:string] export type MassDscription= -< - Users extends Record, - Roles extends Record]>, - Parts extends Record, - Desks extends Record, mode:"all"|"one", need:Partial>, ...make:Array]>, -> ( - params:Record, - }> + params:Record[0]> ) =>void \ No newline at end of file