public static cascadeSelection()

in uui-core/src/data/processing/views/tree/treeStructure/helpers/CheckingHelper.ts [9:80]


    public static cascadeSelection<TItem, TId>({
        tree,
        currentCheckedIds,
        checkedId,
        isChecked,
        isCheckable,
        isUnknown,
        cascadeSelectionType,
    }: CascadeSelectionOptions<TItem, TId>) {
        const isImplicitMode = cascadeSelectionType === CascadeSelectionTypes.IMPLICIT;
        let checkedIdsMap = newMap<TId, boolean>(tree.getParams());
        if (!(checkedId === ROOT_ID && isImplicitMode)) {
            currentCheckedIds.forEach((id) => checkedIdsMap.set(id, true));
        }
        const optionsWithDefaults = { isCheckable: isCheckable ?? (() => true), cascadeSelectionType };

        const { count } = tree.getItems(undefined);
        const treeIsLoaded = count !== 0;
        // If clear items while tree is not loaded yet (while clearing tags of PickerInput before opening body).
        if (!treeIsLoaded && !isChecked) {
            checkedIdsMap = this.clearIfTreeNotLoaded({
                tree,
                checkedIdsMap,
                checkedId,
                isCheckable: optionsWithDefaults.isCheckable,
            });
        }

        if (treeIsLoaded && !optionsWithDefaults.cascadeSelectionType) {
            checkedIdsMap = this.simpleSelection({
                tree,
                checkedIdsMap,
                checkedId,
                isChecked,
                ...optionsWithDefaults,
            });
        }

        if (treeIsLoaded && (
            optionsWithDefaults.cascadeSelectionType === true
            || optionsWithDefaults.cascadeSelectionType === CascadeSelectionTypes.EXPLICIT)
        ) {
            checkedIdsMap = this.explicitCascadeSelection({
                tree,
                checkedIdsMap,
                checkedId,
                isChecked,
                ...optionsWithDefaults,
            });
        }

        if (treeIsLoaded && optionsWithDefaults.cascadeSelectionType === CascadeSelectionTypes.IMPLICIT) {
            checkedIdsMap = this.implicitCascadeSelection({
                tree,
                checkedIdsMap,
                checkedId,
                isChecked,
                ...optionsWithDefaults,
            });
        }

        if (!isChecked && checkedId === ROOT_ID && checkedIdsMap.size > 0) {
            checkedIdsMap = this.clearUnknownItems({ checkedIdsMap, isUnknown });
        }

        const result = [];
        for (const [id, value] of checkedIdsMap) {
            value && result.push(id);
        }

        return result;
    }