{"version":3,"file":"seniorsistemas-angular-components-checkbox-list.mjs","sources":["../../projects/angular-components/checkbox-list/src/lib/checkbox-list/checkbox-list.component.ts","../../projects/angular-components/checkbox-list/src/lib/checkbox-list/checkbox-list.component.html","../../projects/angular-components/checkbox-list/src/lib/checkbox-list/checkbox-list.module.ts","../../projects/angular-components/checkbox-list/src/seniorsistemas-angular-components-checkbox-list.ts"],"sourcesContent":["import { Component, forwardRef, inject, Input } from '@angular/core';\r\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { CheckboxListData } from './models/checkbox-list-data';\r\nimport { CheckboxListChildren, CheckboxListState } from './models/checkbox-list-state';\r\n\r\n/**\r\n * @description Componente de lista de checkboxes hierárquica, com suporte a estados\r\n * pai/filho e indeterminado. Ao marcar/desmarcar o item pai, todos os filhos são\r\n * afetados, e o estado do pai é calculado automaticamente com base nos filhos.\r\n * Implementa {@link ControlValueAccessor} para uso em formulários Angular.\r\n *\r\n * @example\r\n * ```html\r\n * <s-checkbox-list\r\n *   formControlName=\"permissoes\"\r\n *   [data]=\"estruturaPermissoes\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n    selector: 's-checkbox-list',\r\n    templateUrl: './checkbox-list.component.html',\r\n    styles: [`\r\n        .checkbox-input--checked::after {\r\n            border: solid white;\r\n            border-width: 0 2px 2px 0;\r\n            content: \"\";\r\n            height: 12px;\r\n            left: 6px;\r\n            position: absolute;\r\n            top: 2px;\r\n            transform: rotate(45deg);\r\n            width: 6px;\r\n        }\r\n        .checkbox-input--indeterminate::after {\r\n            background-color: white;\r\n            content: \"\";\r\n            height: 2px;\r\n            left: 50%;\r\n            position: absolute;\r\n            top: 50%;\r\n            transform: translate(-50%, -50%);\r\n            width: 10px;\r\n        }\r\n    `],\r\n    providers: [\r\n        {\r\n            provide: NG_VALUE_ACCESSOR,\r\n            useExisting: forwardRef(() => CheckboxListComponent),\r\n            multi: true,\r\n        },\r\n    ],\r\n    standalone: true,\r\n    imports: [CheckboxListComponent, FormsModule],\r\n})\r\nexport class CheckboxListComponent implements ControlValueAccessor {\r\n    /**\r\n     * @description Estrutura de dados que define o item raiz e seus filhos.\r\n     * Cada `CheckboxListData` pode conter o label, estado inicial e uma lista de filhos recursiva.\r\n     * Campo obrigatório.\r\n     */\r\n    @Input({ required: true })\r\n    public data!: CheckboxListData;\r\n\r\n    /**\r\n     * @description Instância do nó pai na árvore recursiva, obtida via DI (`@SkipSelf`).\r\n     * `null` para o nó raiz. Usada para herdar o estado `disabled` sem expor um `@Input`\r\n     * paralelo ao contrato de `ControlValueAccessor`.\r\n     */\r\n    private readonly _parent = inject(CheckboxListComponent, { skipSelf: true, optional: true });\r\n\r\n    public state: CheckboxListState = {\r\n        checked: false,\r\n        indeterminate: false,\r\n        children: {},\r\n    };\r\n\r\n    private _onChange: (value: CheckboxListState) => void = () => {};\r\n    private _onTouched: () => void = () => {};\r\n\r\n    public writeValue(value: CheckboxListState): void {\r\n        if (value) {\r\n            this.state = value;\r\n        } else {\r\n            this.state = {\r\n                checked: false,\r\n                indeterminate: false,\r\n                disabled: false,\r\n                children: this._initializeChildren(this.data),\r\n            };\r\n        }\r\n    }\r\n\r\n    public get renderType() {\r\n        return this.data.renderType ?? 'inline';\r\n    }\r\n\r\n    public get isDisabled(): boolean {\r\n        return !!this.state.disabled || !!this._parent?.isDisabled;\r\n    }\r\n\r\n    public registerOnChange(onChange: (value: CheckboxListState) => void): void {\r\n        this._onChange = onChange;\r\n    }\r\n\r\n    public registerOnTouched(onTouched: () => void): void {\r\n        this._onTouched = onTouched;\r\n    }\r\n\r\n    public setDisabledState(isDisabled: boolean): void {\r\n        this.state.disabled = isDisabled;\r\n    }\r\n\r\n    private _initializeChildren(item: CheckboxListData): CheckboxListChildren {\r\n        const childrenState: CheckboxListChildren = {};\r\n        if (item.children) {\r\n            item.children.forEach((child) => {\r\n                childrenState[child.label] = {\r\n                    checked: false,\r\n                    indeterminate: false,\r\n                    children: this._initializeChildren(child),\r\n                };\r\n            });\r\n        }\r\n        return childrenState;\r\n    }\r\n\r\n    public getCheckboxState(item: CheckboxListChildren | undefined, label: string) {\r\n        if (item) {\r\n            return item[label];\r\n        } else {\r\n            return {};\r\n        }\r\n    }\r\n\r\n    public updateParent(): void {\r\n        const _getProperty = (obj: CheckboxListChildren | undefined, field: string) => {\r\n            if (obj) {\r\n                return obj[field];\r\n            } else {\r\n                return null;\r\n            }\r\n        };\r\n        if (this.data.children && this.data.children.length > 0) {\r\n            const allChecked = this.data.children.every(\r\n                (child) => _getProperty(this.state.children, child.label)?.checked,\r\n            );\r\n            const someChecked = this.data.children.some(\r\n                (child) =>\r\n                    _getProperty(this.state.children, child.label)?.checked ||\r\n                    _getProperty(this.state.children, child.label)?.indeterminate,\r\n            );\r\n            this.state.checked = allChecked;\r\n            this.state.indeterminate = !allChecked && someChecked;\r\n        }\r\n        this._onChange(this.state);\r\n        this._onTouched();\r\n    }\r\n\r\n    public onCheckboxChange(): void {\r\n        if (this.isDisabled) {\r\n            return;\r\n        }\r\n\r\n        this.state.checked = !this.state.checked;\r\n        this.state.indeterminate = false;\r\n        this._toggleChildrenCheck(this.data, this.state, this.state.checked);\r\n        this._onChange(this.state);\r\n        this._onTouched();\r\n    }\r\n\r\n    private _toggleChildrenCheck(item: CheckboxListData, state: CheckboxListState, checked: boolean): void {\r\n        if (item.children?.length) {\r\n            item.children.forEach((child) => {\r\n                if (state.children && !state.children[child.label]) {\r\n                    state.children[child.label] = {\r\n                        checked: false,\r\n                        indeterminate: false,\r\n                        children: this._initializeChildren(child),\r\n                    };\r\n                }\r\n                if (state.children) {\r\n                    state.children[child.label].checked = checked;\r\n                    state.children[child.label].indeterminate = false;\r\n                }\r\n                if (child.children && state.children) {\r\n                    this._toggleChildrenCheck(child, state.children[child.label], checked);\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n","<div class=\"flex flex-col gap-[10px] mb-[10px]\">\r\n    <label>\r\n        <div\r\n            class=\"flex text-grayscale-90 font-open-sans text-sm gap-3\"\r\n            [class.items-center]=\"renderType === 'inline'\"\r\n            [class.flex-col-reverse]=\"renderType === 'block'\"\r\n            [class.opacity-50]=\"isDisabled\"\r\n            [class.cursor-default]=\"isDisabled\"\r\n        >\r\n            <input\r\n                type=\"checkbox\"\r\n                class=\"checkbox-input appearance-none border rounded-medium shrink-0 h-5 w-5 relative\"\r\n                [class.bg-grayscale-0]=\"!state.checked && !state.indeterminate\"\r\n                [class.border-grayscale-30]=\"!state.checked && !state.indeterminate\"\r\n                [class.bg-criticality-blue]=\"state.checked || state.indeterminate\"\r\n                [class.border-criticality-blue]=\"state.checked || state.indeterminate\"\r\n                [class.checkbox-input--checked]=\"state.checked\"\r\n                [class.checkbox-input--indeterminate]=\"state.indeterminate\"\r\n                [class.hover:bg-hippie-blue-50]=\"!isDisabled && !state.checked && !state.indeterminate\"\r\n                [class.cursor-pointer]=\"!isDisabled\"\r\n                [class.cursor-default]=\"isDisabled\"\r\n                [disabled]=\"isDisabled\"\r\n                (change)=\"onCheckboxChange()\"\r\n                [attr.aria-checked]=\"state.indeterminate ? 'mixed' : state.checked\"\r\n                [attr.aria-disabled]=\"isDisabled\"\r\n            />\r\n            {{ data.label }}\r\n        </div>\r\n    </label>\r\n    @if (data.children && data.children.length) {\r\n        <div class=\"ml-5\">\r\n            @for (child of data.children; track child) {\r\n                <s-checkbox-list\r\n                    [data]=\"child\"\r\n                    [ngModel]=\"getCheckboxState(state.children, child.label)\"\r\n                    (ngModelChange)=\"updateParent()\"\r\n                >\r\n                </s-checkbox-list>\r\n            }\r\n        </div>\r\n    }\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { CheckboxListComponent } from './checkbox-list.component';\r\n\r\n@NgModule({\r\n    imports: [CheckboxListComponent],\r\n    exports: [CheckboxListComponent],\r\n})\r\nexport class CheckboxListModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}