passes started

This commit is contained in:
Seth Trowbridge 2025-07-05 13:51:01 -04:00
parent feb55e4c1d
commit bf9d740c13
4 changed files with 82 additions and 20 deletions

View File

@ -1,7 +1,7 @@
/** @import * as TYPES from "./types.ts" */ /** @import * as TYPES from "./types.ts" */
/** @type {TYPES.GraphBuilder} */ /** @type {TYPES.GraphBuilder} */
export default function({users, roles, parts, desks}) export default function({users, roles, parts, desks, passes})
{ {
// mutate users // mutate users
@ -21,7 +21,7 @@ export default function({users, roles, parts, desks})
for(let roleId in roles) for(let roleId in roles)
{ {
const [name, ...userIds] = roles[roleId]; const [name, ...userIds] = roles[roleId];
RoleList[roleId] = {name, user:userIds.map(uId=>UserList[uId])}; RoleList[roleId] = {name, user:userIds.map(uId=>UserList[/**@type{string}*/(uId)])};
} }
// mutate parts // mutate parts
@ -31,20 +31,18 @@ export default function({users, roles, parts, desks})
for(let partId in parts) for(let partId in parts)
{ {
const name = parts[partId]; const name = parts[partId];
PartList[partId] = /** @type {TYPES.Part} */({name, work:[], time:0, need:[], make:[]}); PartList[partId] = /** @type {TYPES.Part} */({name, need:[], make:[], pass:new Map()});
} }
// mutate desks // mutate desks
/** @type {Record<string, TYPES.Desk>} */ /** @type {Record<string, TYPES.Desk>} */
//@ts-ignore //@ts-ignore
const DeskList = desks; const DeskList = desks;
for(let deskId in desks) for(let deskId in desks)
{ {
const [name, roleIDs, mode, needObj, ...makePartIDs] = desks[deskId]; const [name, roleIDs, mode, needObj, ...makePartIDs] = desks[deskId];
const need =[]; /** @type {TYPES.Part[]}*/ const need =[];
const time =[]; /** @type {number[]}*/ const time =[];
/** @type {TYPES.Desk} */ /** @type {TYPES.Desk} */
const desk = { const desk = {
@ -81,6 +79,41 @@ export default function({users, roles, parts, desks})
DeskList[deskId] = desk; DeskList[deskId] = desk;
} }
// Apply passes
for(let passID in passes)
{
const [name, users] = passes[passID];
/** @type {TYPES.Pass} */
const pass = {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(pass);
if(!partPass)
{
partPass = {time:0, work:[]}
part.pass.set(pass, partPass);
}
partPass.work.push(work);
if(partPass.time < time)
{
partPass.time = time;
}
});
}
}
}
console.log(users, parts, desks); console.log(users, parts, desks);
} }

View File

@ -15,5 +15,21 @@ Graph({
desks: desks:
{ {
d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"] d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"]
},
passes:
{
pass1:
[
"Pass One",
{
u2:
{
p1:[
[123, "some data"],
[456, "more data"]
]
}
}
]
} }
}); });

View File

@ -1,18 +1,31 @@
type PartBlueprint = string
type UserBlueprint = string
export type GraphBuilder= export type GraphBuilder=
< <
Users extends Record<string, UserBlueprint>, Users extends Record<string, string>,
Roles extends Record<string, [ name:string, ...users:Array<keyof Users>]>, Roles extends Record<string, [ name:string, ...users:Array<keyof Users>]>,
Parts extends Record<string, PartBlueprint>, Parts extends Record<string, string>,
Desks extends Record<string, [ name:string, roles:Array<keyof Roles>, mode:"all"|"one", need:Partial<Record<keyof Parts, number>>, ...make:Array<keyof Parts>]> Desks extends Record<string, [ name:string, roles:Array<keyof Roles>, mode:"all"|"one", need:Partial<Record<keyof Parts, number>>, ...make:Array<keyof Parts>]>,
Pass extends Record<
string,
[
name:string,
user:Partial<Record<
keyof Users,
Partial<Record<
keyof Parts,
Array<[time:number, data:string]>
>>
>>
]
>
> >
( (
params:{users:Users, params:{
roles:Roles, users:Users,
parts:Parts, roles:Roles,
desks:Desks} parts:Parts,
desks:Desks,
passes:Pass,
}
) )
=>void =>void
@ -20,6 +33,6 @@ export type GraphBuilder=
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[], mode:string, role:Role[]};
export type Work = [user:User, part:Part, time:number, data:string]; export type Work = [user:User, time:number, data:string];
export type Part = {name:string, time:number, work:Work[], need:Desk[], make:Desk[]}; export type Pass = {name:string, path:string};
export type Part = {name:string, pass:Map<Pass, {time:number, work:Work[]}>, need:Desk[], make:Desk[]};