From a0c63c5e5cb537c273bbbbe203f2667d6b475bc9 Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Sat, 26 Jul 2025 21:35:31 -0400 Subject: [PATCH] misc --- app.js | 115 ++------------------------ data/room.js | 27 ++++++ data/{users.js => user.js} | 0 graph.js | 118 ++++++++++++++++++--------- room/room_01/pass_01/_pass_meta.json | 0 room/room_01/pass_01/u2.json | 8 ++ room/room_01/pass_01/u3.json | 8 ++ room/room_01/room.js | 23 ------ types.ts | 24 +++++- 9 files changed, 156 insertions(+), 167 deletions(-) create mode 100644 data/room.js rename data/{users.js => user.js} (100%) delete mode 100644 room/room_01/pass_01/_pass_meta.json delete mode 100644 room/room_01/room.js diff --git a/app.js b/app.js index 4efbab0..e0eb4f4 100644 --- a/app.js +++ b/app.js @@ -1,133 +1,36 @@ import * as FSHandle from "./store-directory-handle.js"; -const Rooms = {}; + async function getFolderHandle(dirHandle) { try { - - const roomsFolder = await dirHandle.getDirectoryHandle("room"); - if(roomsFolder) - { - for await (const [_, roomFolder] of roomsFolder.entries()) - { - if(roomFolder.kind == "directory") - { - const roomMetaFile = await roomFolder.getFileHandle("room.js"); - if(roomMetaFile) - { - let metaData = {}; - //try - //{ - // metaData = await roomMetaFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t)); - //} - //catch (e) - //{ - // console.warn(`Couldn't parse room meta: ${roomFolder.name} / ${roomMetaFile.name}`, e); - //} - - const roomObj = - { - meta: metaData, - pass: {}, - live: false, - async load() - { - if(this.live) return; - for await (const [_, passFolder] of roomFolder.entries()) - { - if(passFolder.kind == "directory") - { - const passMeta = await passFolder.getFileHandle("_pass_meta.json"); - if(passMeta) - { - - let metaData = {}; - try - { - metaData = await passMeta.getFile().then(d=>d.text()).then(t=>JSON.parse(t)); - } - catch (e) - { - console.warn(`Couldn't parse pass meta: ${roomFolder.name} / ${passFolder.name} / ${passMeta.name}`, e); - } - - const passObj = [ - metaData, - {} - ] - roomObj.pass[passFolder.name] = passObj; - - for await (const [_, userFile] of passFolder.entries()) - { - if(userFile.name.endsWith(".json") && userFile.name != "_pass_meta.json") - { - const userID = userFile.name.substring(0, userFile.name.length-5) - try - { - passObj[1][userID] = await userFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t)); - } - catch (e) - { - console.warn(`Couldn't parse user data: ${roomFolder.name} / ${passFolder.name} / ${userFile.name}`, e); - } - - } - } - } - } - } - this.live = true; - - globalThis.Pass = this.pass; - - if (navigator.serviceWorker.controller) - { - navigator.serviceWorker.controller.postMessage(this.pass); - } - - - //await import(`./room/${roomFolder.name}/room.js`); - - }, - async dump() - { - this.live = false; - this.pass = {}; - } - }; - - Rooms[roomFolder.name] = roomObj; - - } - - - } - } - } - console.log("Rooms:", Rooms); - + globalThis.FOLDER = await dirHandle.getDirectoryHandle("room"); + return true; } catch (err) { console.error("Folder selection cancelled or failed:", err); + return false; } } const d =(...args)=> document.createElement(...args); let handle = false; +let valid = false; handle = await FSHandle.getDirectoryHandle(); +console.log("handle:", handle); if(handle) { - await getFolderHandle(handle); + valid = await getFolderHandle(handle); } const button = d("button"); -button.innerText = handle ? "change directory" : "select directory"; +button.innerText = valid ? "change directory" : "select directory"; button.addEventListener("click", async()=>{ const directory = await globalThis.showDirectoryPicker(); await FSHandle.setDirectoryHandle(directory); await getFolderHandle(directory); console.log("about to spoof user filesystem as remote..."); - const module = await import("./room/room_01/room.js"); + const module = await import("./data/room.js"); console.log("module loaded", module); button.innerText = "change directory" }); diff --git a/data/room.js b/data/room.js new file mode 100644 index 0000000..7c34b10 --- /dev/null +++ b/data/room.js @@ -0,0 +1,27 @@ +import {Graph} from "../graph.js"; +import User from "./user.js"; + +Graph( + { + room_01:{ + user:User, + role: + { + dev:["Development", "u1"] + }, + part: + { + "a nice room": "yep!", + p1:"hey", + p2:"sup" + }, + desk: + { + d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"] + }, + pass:{ + pass_01:["pass 01"] + } + } + } +); \ No newline at end of file diff --git a/data/users.js b/data/user.js similarity index 100% rename from data/users.js rename to data/user.js diff --git a/graph.js b/graph.js index cf64b57..556b398 100644 --- a/graph.js +++ b/graph.js @@ -80,48 +80,92 @@ export default function Builder({user, role, part, desk, pass}) } // 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; - } - }); - } - } - } +// 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.GraphLoader} */ -export function Loader(params) -{ - params.pass = globalThis.Pass; - Builder(params); +/** @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)=> diff --git a/room/room_01/pass_01/_pass_meta.json b/room/room_01/pass_01/_pass_meta.json deleted file mode 100644 index e69de29..0000000 diff --git a/room/room_01/pass_01/u2.json b/room/room_01/pass_01/u2.json index e69de29..2df184a 100644 --- a/room/room_01/pass_01/u2.json +++ b/room/room_01/pass_01/u2.json @@ -0,0 +1,8 @@ +{ + "p2": + [ + [123, "data"], + [456, "more data"], + [789, "even more data"] + ] +} \ No newline at end of file diff --git a/room/room_01/pass_01/u3.json b/room/room_01/pass_01/u3.json index e69de29..d58e0a7 100644 --- a/room/room_01/pass_01/u3.json +++ b/room/room_01/pass_01/u3.json @@ -0,0 +1,8 @@ +{ + "p1": + [ + [123, "data"], + [456, "more data"], + [789, "even more data"] + ] +} \ No newline at end of file diff --git a/room/room_01/room.js b/room/room_01/room.js deleted file mode 100644 index 6f89493..0000000 --- a/room/room_01/room.js +++ /dev/null @@ -1,23 +0,0 @@ -console.log("CUSTOM ROOM IMPORTED", import.meta.resolve("./")) - -import {Loader} from "../../graph.js"; -import User from "../../data/users.js"; - -Loader({ - user:User, - role: - { - dev:["Development", "u1"] - }, - part: - { - p1:"hey", - p2:"sup" - }, - desk: - { - d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"] - } -}); - -console.log("Graph loaded !!"); \ No newline at end of file diff --git a/types.ts b/types.ts index 7999327..e05b49c 100644 --- a/types.ts +++ b/types.ts @@ -67,4 +67,26 @@ 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[]}; \ No newline at end of file +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, + }> +) +=>void \ No newline at end of file