UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)

133 lines (131 loc) 5.72 kB
import { DsfrSelectionMode } from '../../models/selection-mode.type'; import { DsfrNode, DsfrViewNode } from './tree.model'; /** * Interface utilisée par TreeSelectManager */ export interface TreeSelectable { /** Indique si toutes les options sont sélectionnées ou non. */ isAllSelected: boolean; /** Retourne la structure arborescente du composant. */ get nodes(): DsfrNode[]; /** Sélectionne / désélectionne tous les nœuds en mode multiple ou checkbox. */ selectAll(select: boolean): void; /** Notifie le composant que node a changé d'état. */ notifySelectEvent(node: DsfrNode): void; /** Mise à jour, graphique, du statut indeterminate. */ updateIndeterminate(node: DsfrNode): void; } /** * TreeSelectManager implémente les fonctionnalités de sélection des nœuds d'une arborescence. * - Gère le mode de sélection * - Gère les checkbox * - Ne gère pas l'apparence des libellés sélectionnés */ export declare class TreeSelectManager { /** * Mode de sélection géré par le manager. Accessible par les composants utilisant ce manager. */ selectionMode: DsfrSelectionMode; /** Stratégie de sélection : pouvoir sélectionner tous les noeuds ou uniquement les feuilles */ selectionStrategy: 'leaf' | 'all'; /** Liste des nœuds sélectionnés. Si le mode de sélection est 'checkbox', seul les noeuds feuilles sont sélectionnables. */ selectedNodes: DsfrNode[]; /** Les noeuds feuilles doivent posséder un id défini à l'initialisation si compareWith n'est pas renseigné */ noGenericId: boolean; /** Nombre total de feuilles de l'arbre */ countLeaves: number; /** Composant géré par le manager. */ private treeSelectable; /** * Attribut permettant de notifier qu'un noeud sélectionné à déjà été rencontré en mode single, permettant d'ignorer * l'état sélectionné de tous les noeuds subséquents. */ private singleModeSelectedSkip; constructor(treeSelectable: TreeSelectable); /** * À appeler à chaque modification de l'arborescence. * * @param nodes Nœuds à initialiser */ init(nodes: DsfrNode[]): DsfrViewNode[]; /** * Sélection / désélection du nœud suite à un clic. * - Le nœud devient le nœud courant en mettant tabIndex=0 * - Gestion des différents modes de sélection * - Envoie d'une notification sur le changement d'état de node.selected * Dans le cas du mode checkbox, il n'y a pas de modification suite aux changements d'états des enfants */ doSelectNode(node: DsfrNode, nodeElt: HTMLElement): void; isSelectable(): boolean; isCheckboxMode(): boolean; isSingleMode(): boolean; isMultipleMode(): boolean; /** * Initialisation par défaut des propriétés d'un nœud : 'selected', 'id'. * * @param nodes Les noeuds à initialiser * @param level Le niveau du noeud dans la hiérarchie */ initNodes(nodes: DsfrNode[], level: number): DsfrViewNode[]; /** * Mise à jour des propriétés des nœuds (label, data, id) sans modifier l'état (select, expand) et ajouts éventuels. * @param nodes Nœuds d'entrée à mettre à jour. * @param viewNodes Nœuds clonés représentant l'état actuel de l'arbre. */ updateNodesContent(nodes: DsfrNode[], viewNodes: DsfrViewNode[], level: number): DsfrNode[]; selectAllNodes(nodes: DsfrNode[], select?: boolean): void; /** * Mise à jour liste des feuilles sélectionnées * (suppression des nœuds non sélectionnés) */ updateSelectedNodes(): DsfrNode[]; /** * Détermine l'état de l'attribut selected d'un noeud en fonction du mode courant et du model fournit. * * @param node Nœud du model fournit. * @param viewNode Nœud cloné représentant l'état actuel de l'arbre. */ private handleNodeSelectedInitialization; private toggleNodeSelectedState; private handleSingleModeSelection; private handleMultipleModeSelection; private handleCheckboxModeSelection; /** * Met à jour, récursivement, l'état de chaque nœud en parcourant l'arborescence de haut en bas. */ private updateChildren; /** * Met à jour l'état `selected` d'une branche en fonction de ses nœuds enfants ('true', 'false' ou 'undefined'). * Émet un événement si l'état du nœud change. * Met à jour la propriété indeterminate de la checkbox * @param node Nœud de l'arbre */ private updateBranchState; /** * Lance la mise à jour de l'état de sélection de chaque banche en parcourant l'arborescence de bas en haut de manière recursive. * * ex: Pour un model tel que le suivant: * B1 * / \ * B2 B3 * | | * F1 F2 * * La méthode updateBranches(B1) tentera de mettre à jour le noeud B2 qui recursivement mettra à jour la * feuille F1 avant de se mettre elle même (B2) à jour. Ensuite, la méthode mettra à jour les noeuds suivants de * la même façon, d'abord F2, puis B3. Enfin, une fois tous ses descendants à jour, B1 se mettra lui même à jour. */ private updateBranches; /** * Retourne le 1er nœud sélectionné dans l'arborescence. * @param nodes arborescence * @return 1er nœud sélectionné ou undefined */ private findFirstNodeSelected; /** * Sélectionne / déselectionne récursivement tous les nœuds nodes et leurs descendants * @param nodes Liste de nœuds à sélectionner * @param select true : selection des noeuds, false : fermeture */ private toggleNodesState; }