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  }