github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/frontend/directeurs/src/components/equipiers/documents.ts (about) 1 import { 2 PublicDocument, 3 Contraintes, 4 Pieces, 5 Contrainte, 6 OptionnalBool, 7 BuiltinContrainte 8 } from "@/logic/types"; 9 10 export interface StateCategorie { 11 idCategorie: number; 12 exigence: OptionnalBool; // Non pour non demandé, zero pour optionnel, Oui pour obligatoire 13 documents: PublicDocument[]; 14 } 15 16 export interface DocumentContrainte { 17 document: PublicDocument; 18 contrainte: Contrainte; 19 } 20 21 export interface RowEquipier { 22 id: number; 23 nom_prenom: string; 24 categories: { [key: number]: StateCategorie }; 25 } 26 27 // ordre intuitif 28 const poids: { [K in BuiltinContrainte]?: number } = { 29 [BuiltinContrainte.CCarteId]: 10, 30 [BuiltinContrainte.CVaccin]: 9, 31 [BuiltinContrainte.CBafa]: 8 32 }; 33 34 export function headers(contraintes: Contraintes) { 35 return Object.values(contraintes || {}) 36 .sort((a, b) => { 37 const pa = poids[a.builtin] || 0; 38 const pb = poids[b.builtin] || 0; 39 return pa != pb ? pb - pa : a.nom.localeCompare(b.nom); 40 }) 41 .map(ct => { 42 return { id: ct.id, nom: ct.nom }; 43 }); 44 } 45 46 /** transforme une liste de lien en une grille equipier x contraintes */ 47 export function piecesToGrid(pieces: Pieces): RowEquipier[] { 48 const cts = Object.values(pieces.contraintes || {}); 49 return (pieces.documents || []).map(equipier => { 50 // on initialise toutes les contraites possibles 51 const ctEq: { [key: number]: StateCategorie } = {}; 52 cts.forEach(ct => { 53 ctEq[ct.id] = { 54 idCategorie: ct.id, 55 exigence: OptionnalBool.OBNon, 56 documents: [] 57 }; 58 }); 59 // on modifie les contraites effectives 60 (equipier.contraintes || []).forEach(eqContrainte => { 61 ctEq[eqContrainte.id_contrainte].exigence = eqContrainte.optionnel 62 ? OptionnalBool.OBPeutEtre 63 : OptionnalBool.OBOui; 64 }); 65 // puis on ajoute les documents actuels 66 const docs = equipier.documents || {}; 67 for (const idContrainte in docs) { 68 ctEq[idContrainte].documents = docs[idContrainte] || []; 69 } 70 return { 71 id: equipier.id_equipier, 72 nom_prenom: equipier.nom_prenom, 73 categories: ctEq 74 }; 75 }); 76 } 77 78 export function rassembleDocs( 79 item: RowEquipier, 80 contraintes: NonNullable<Contraintes> 81 ) { 82 const docs: DocumentContrainte[] = []; 83 Object.values(item.categories).forEach(v => { 84 const contrainte = contraintes[v.idCategorie]; 85 const ds = (v.documents || []).map(doc => ({ 86 document: doc, 87 contrainte: contrainte 88 })); 89 docs.push(...ds); 90 }); 91 return docs; 92 } 93 94 interface CaseId { 95 id_equipier: number; 96 id_contrainte: number; 97 } 98 99 /** Map for object keys */ 100 export class DebounceHandles { 101 private storage: Map<string, number> = new Map(); 102 103 private key = (id: CaseId) => JSON.stringify(id); 104 105 get(id: CaseId) { 106 return this.storage.get(this.key(id)); 107 } 108 109 delete(id: CaseId) { 110 this.storage.delete(this.key(id)); 111 } 112 113 set(id: CaseId, handle: number) { 114 this.storage.set(this.key(id), handle); 115 } 116 }