desk state scanning started

This commit is contained in:
Seth Trowbridge 2025-07-27 15:29:50 -04:00
parent 84cb05f9d6
commit bd0ff30f2a
6 changed files with 40 additions and 30 deletions

2
app.js
View File

@ -39,7 +39,7 @@ async function getFolderHandle(dirHandle)
const listPass = H("ul"); const listPass = H("ul");
Object.entries(roomData.Pass).forEach(([passID, passData])=>{ Object.entries(roomData.Pass).forEach(([passID, passData])=>{
listPass.appendChild(H("li", {}, listPass.appendChild(H("li", {},
H("button", { onclick(){ passData.load();console.log(roomData.Part); } }, passID) H("button", { onclick(){ passData.load();console.log(roomData); } }, passID)
)) ))
}); });

View File

@ -11,7 +11,6 @@ export default Graph(
}, },
part: part:
{ {
"a nice room": "yep!",
p1:"hey", p1:"hey",
p2:"sup" p2:"sup"
}, },
@ -20,7 +19,8 @@ export default Graph(
d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"] d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"]
}, },
pass:{ pass:{
pass_01:["pass 01"] pass_01:["pass 01"],
pass_02:["pass 02"]
} }
} }
} }

View File

@ -51,7 +51,8 @@ function Builder({user, role, part, desk, pass}, folderHandle, folderName)
need, need,
time, time,
make:[], make:[],
role:[] role:[],
pass:new Map()
}; };
for(const partId in needObj) for(const partId in needObj)
@ -138,12 +139,23 @@ function Builder({user, role, part, desk, pass}, folderHandle, folderName)
} }
} }
} }
const selfPass = this;
Object.entries(DeskList).forEach(([deskID, deskObj])=>{
Scan(deskObj, selfPass);
});
this.live = true; this.live = true;
}, },
dump(){ dump(){
const selfPass = this;
Object.entries(PartList).forEach(([partID, partObj])=>{ Object.entries(PartList).forEach(([partID, partObj])=>{
partObj.pass.delete(this); partObj.pass.delete(selfPass);
}); });
Object.entries(DeskList).forEach(([deskID, deskObj])=>{
deskObj.pass.delete(selfPass);
});
this.live = false; this.live = false;
}, },
live:false live:false
@ -172,45 +184,42 @@ export default function Graph(params)
} }
const Scan =(desk)=> /** @type {TYPES.Scanner} */
const Scan =(desk, pass)=>
{ {
const need = Object.keys(desk.need);
const make = desk.make;
const dirtyNeed = []; const dirtyNeed = [];
const dirtyMake = []; const dirtyMake = [];
let makeMin = Infinity; let makeMin = Infinity;
let needMax = -Infinity; let needMax = -Infinity;
for(let i=0; i<need.length; i++) for(let i=0; i<desk.need.length; i++)
{ {
const id = need[i]; const part = desk.need[i];
const part = Part.find(id); const partPassTime = part.pass.get(pass)?.time || 0;
if(part.time > needMax) needMax = part.time; if(partPassTime > needMax) needMax = partPassTime;
} }
for(let i=0; i<make.length; i++) for(let i=0; i<desk.make.length; i++)
{ {
const id = make[i]; const part = desk.make[i];
const part = Part.find(make[i]); const partPassTime = part.pass.get(pass)?.time || 0;
if(part.time < makeMin) makeMin = part.time; if(partPassTime < makeMin) makeMin = partPassTime;
if(part.time < needMax) if(partPassTime < needMax)
{ {
dirtyMake.push(id); dirtyMake.push(i);
} }
} }
for(let i=0; i<need.length; i++) for(let i=0; i<desk.need.length; i++)
{ {
const id = need[i]; const part = desk.need[i];
const part = Part.find(id); const partPassTime = part.pass.get(pass)?.time || 0;
if(part.time > makeMin) if(partPassTime > makeMin)
{ {
dirtyNeed.push(id); dirtyNeed.push(i);
} }
} }
console.log("scan", dirtyNeed, dirtyMake); desk.pass.set(pass, [dirtyNeed, dirtyMake])
return [dirtyNeed, dirtyMake];
}; };

View File

@ -29,11 +29,9 @@ async function Interceptor(event)
{ {
filePointer = await filePointer.getDirectoryHandle(parts[i], {create: false}); filePointer = await filePointer.getDirectoryHandle(parts[i], {create: false});
} }
console.log("about to get file handle", filePointer);
filePointer = await filePointer.getFileHandle(parts[parts.length-1], {create: false}); filePointer = await filePointer.getFileHandle(parts[parts.length-1], {create: false});
const file = await filePointer.getFile(); const file = await filePointer.getFile();
const content = await file.text(); const content = await file.text();
console.log("responding to", pathname, "with content:", content);
return new Response(content, { return new Response(content, {
headers: { headers: {
'Content-Type': 'application/javascript', 'Content-Type': 'application/javascript',

View File

@ -1,6 +1,6 @@
export type User = {name:string, desk:Set<Desk>}; export type User = {name:string, desk:Set<Desk>};
export type Role = {name:string, user:User[]}; export type Role = {name:string, user:User[]};
export type Desk = {name:string, need:Part[], time:number[], make:Part[], mode:string, role:Role[]}; export type Desk = {name:string, need:Part[], time:number[], make:Part[], pass:Map<Pass, [dirtyNeed:number[], dirtyMake:number[]]>, mode:string, role:Role[]};
export type Work = [user:User, time:number, data:string]; export type Work = [user:User, time:number, data:string];
export type Pass = {name:string, path:string, live:boolean, load:()=Promise<void>, dump:()=>void}; export type Pass = {name:string, path:string, live:boolean, load:()=Promise<void>, dump:()=>void};
export type Part = {name:string, pass:Map<Pass, {time:number, work:Work[]}>, need:Desk[], make:Desk[]}; export type Part = {name:string, pass:Map<Pass, {time:number, work:Work[]}>, need:Desk[], make:Desk[]};
@ -36,4 +36,7 @@ export type MassDscription=
( (
params:Record<string, Parameters<GraphBuilder>[0]> params:Record<string, Parameters<GraphBuilder>[0]>
) )
=>(folder:FileSystemDirectoryHandle)=>Record<string, ReturnType<GraphBuilder>> =>(folder:FileSystemDirectoryHandle)=>Record<string, ReturnType<GraphBuilder>>
export type Scanner =(desk:Desk, pass:Pass)=>void;