{"version":3,"file":"seniorsistemas-angular-components-workspace-switch.mjs","sources":["../../projects/angular-components/workspace-switch/src/lib/workspace-switch/workspace-switch.component.ts","../../projects/angular-components/workspace-switch/src/lib/workspace-switch/workspace-switch.component.html","../../projects/angular-components/workspace-switch/src/lib/workspace-switch/workspace-switch.module.ts","../../projects/angular-components/workspace-switch/src/seniorsistemas-angular-components-workspace-switch.ts"],"sourcesContent":["import { NgClass, NgStyle } from '@angular/common';\r\nimport {\r\n    ChangeDetectorRef,\r\n    Component,\r\n    ElementRef,\r\n    EventEmitter,\r\n    HostBinding,\r\n    HostListener,\r\n    Input,\r\n    OnInit,\r\n    Output,\r\n    QueryList,\r\n    ViewChildren,\r\n    inject,\r\n} from '@angular/core';\r\n\r\nimport { Workspace } from './models/workspace';\r\n\r\n/**\r\n * @description Componente de seleção de workspace exibe um dropdown com a lista de espaços de trabalho\r\n * disponíveis, permitindo ao usuário alternar entre eles. Suporta navegação por teclado\r\n * (setas, Enter, Escape), estado desabilitado e um botão de ação customizável no rodapé.\r\n *\r\n * @example\r\n * ```html\r\n * <s-workspace-switch\r\n *   [workspaces]=\"workspaces\"\r\n *   footerButtonLabel=\"Criar workspace\"\r\n *   (selected)=\"onWorkspaceSelect($event)\"\r\n *   (footerButtonClicked)=\"onCreate()\"\r\n * />\r\n * ```\r\n *\r\n * @category Navegação\r\n */\r\n@Component({\r\n    selector: 's-workspace-switch',\r\n    templateUrl: './workspace-switch.component.html',\r\n    styleUrls: ['./workspace-switch.component.scss'],\r\n    standalone: true,\r\n    imports: [NgClass, NgStyle],\r\n})\r\nexport class WorkspaceSwitchComponent implements OnInit {\r\n    private readonly eRef = inject(ElementRef);\r\n    private readonly changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n    /**\r\n     * @description Lista de workspaces disponíveis para seleção. Campo obrigatório.\r\n     * Cada item deve implementar a interface `Workspace`.\r\n     * Lança um erro em runtime se a lista estiver vazia.\r\n     */\r\n    @Input({ required: true })\r\n    public workspaces: Workspace[] = [];\r\n\r\n    /**\r\n     * @description Rótulo exibido no botão de ação localizado no rodapé do dropdown.\r\n     *\r\n     * @default 'Adicionar'\r\n     */\r\n    @Input()\r\n    public footerButtonLabel = 'Adicionar';\r\n\r\n    /**\r\n     * @description Controla a visibilidade do botão de ação no rodapé do dropdown.\r\n     * Quando `false`, o botão não é renderizado.\r\n     *\r\n     * @default true\r\n     */\r\n    @Input()\r\n    public showFooterButton = true;\r\n\r\n    /**\r\n     * @description Quando `true`, o componente fica desabilitado: não abre o dropdown,\r\n     * não emite eventos e fica inacessível via teclado (`tabindex = -1`).\r\n     *\r\n     * @default false\r\n     */\r\n    @Input()\r\n    public disabled = false;\r\n\r\n    /**\r\n     * @description Emitido quando o usuário clica no botão de ação do rodapé do dropdown.\r\n     */\r\n    @Output()\r\n    public footerButtonClicked = new EventEmitter();\r\n\r\n    /**\r\n     * @description Emitido quando o usuário seleciona um workspace da lista.\r\n     * Retorna o objeto `Workspace` selecionado.\r\n     */\r\n    @Output()\r\n    public selected: EventEmitter<Workspace> = new EventEmitter();\r\n\r\n    @ViewChildren('listItem')\r\n    public listItems: QueryList<ElementRef> | null = null;\r\n\r\n    public get open() {\r\n        return this._open;\r\n    }\r\n\r\n    public set open(open: boolean) {\r\n        this._open = open;\r\n        this.changeDetectorRef.detectChanges();\r\n\r\n        if (open) {\r\n            this._calculateListMaxHeight();\r\n        }\r\n    }\r\n\r\n    public height = 0;\r\n    public selectedItemIndex = 0;\r\n    public currentItemIndex = 0;\r\n\r\n    private _open = false;\r\n\r\n    @HostBinding('attr.tabindex')\r\n    public tabindex = 0;\r\n\r\n    @HostListener('document:click', ['$event'])\r\n    public onClickout(event: MouseEvent): void {\r\n        if (!this.eRef.nativeElement.contains(event.target)) {\r\n            this.open = false;\r\n        }\r\n    }\r\n\r\n    @HostListener('keydown', ['$event'])\r\n    public onKeydown(event: KeyboardEvent): void {\r\n        if (event.key === 'Enter' || event.key === ' ') {\r\n            if (this.open) {\r\n                const workspace = this.workspaces[this.selectedItemIndex];\r\n\r\n                if (workspace.disabled) {\r\n                    return;\r\n                }\r\n\r\n                this.selectedItemIndex = this.currentItemIndex;\r\n                this.selected.emit(this.workspaces[this.selectedItemIndex]);\r\n            }\r\n            this.open = !this.open;\r\n        } else if (event.key === 'Escape') {\r\n            this.open = false;\r\n        } else if (event.key === 'ArrowDown') {\r\n            if (this.currentItemIndex < this.workspaces.length - 1) {\r\n                this.currentItemIndex++;\r\n                this._scrollToCurrentItem();\r\n            }\r\n        } else if (event.key === 'ArrowUp') {\r\n            if (this.currentItemIndex > 0) {\r\n                this.currentItemIndex--;\r\n                this._scrollToCurrentItem();\r\n            }\r\n        }\r\n    }\r\n\r\n    public ngOnInit(): void {\r\n        if (this.disabled) {\r\n            this.tabindex = -1;\r\n        }\r\n    }\r\n\r\n    public validations(): void {\r\n        if (!this.workspaces.length) {\r\n            throw new Error('Workspaces list is empty.');\r\n        }\r\n    }\r\n\r\n    public buttonOnBlur(): void {\r\n        this.open = false;\r\n        this.currentItemIndex = this.selectedItemIndex;\r\n    }\r\n\r\n    public onSelectItem(workspace: Workspace): void {\r\n        if (workspace.disabled) {\r\n            return;\r\n        }\r\n\r\n        this.open = false;\r\n        this.selectedItemIndex = this.workspaces.indexOf(workspace);\r\n        this.currentItemIndex = this.selectedItemIndex;\r\n        this.selected.emit(workspace);\r\n    }\r\n\r\n    public onFooterButtonClick(): void {\r\n        this.open = false;\r\n        this.footerButtonClicked.emit();\r\n    }\r\n\r\n    private _calculateListMaxHeight(): void {\r\n        const workspaceListRef = this.eRef.nativeElement.querySelector('#workspace-list');\r\n        const { top } = workspaceListRef.getBoundingClientRect();\r\n\r\n        this.height = window.innerHeight - top - 20 - (this.showFooterButton ? 64 : 0);\r\n        this.changeDetectorRef.detectChanges();\r\n    }\r\n\r\n    private _scrollToCurrentItem(): void {\r\n        const currentItem = this.listItems?.toArray()[this.currentItemIndex];\r\n        if (currentItem) {\r\n            currentItem.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n        }\r\n    }\r\n}\r\n","<div\r\n    class=\"workspace-switch\"\r\n    [ngClass]=\"{ 'workspace-switch--disabled': disabled }\"\r\n    (blur)=\"buttonOnBlur()\"\r\n>\r\n    <div\r\n        class=\"button\"\r\n        (click)=\"open = !open\"\r\n    >\r\n        <div class=\"item\">\r\n            <span class=\"title\">{{ workspaces[selectedItemIndex].title }}</span>\r\n            <span class=\"subtitle\">{{ workspaces[selectedItemIndex].subtitle }}</span>\r\n        </div>\r\n        <div class=\"icons\">\r\n            <span class=\"fas fa-chevron-up\"></span>\r\n            <span class=\"fas fa-chevron-down\"></span>\r\n        </div>\r\n    </div>\r\n    @if (!disabled && open) {\r\n        <div class=\"drop-panel\">\r\n            <ul\r\n                id=\"workspace-list\"\r\n                class=\"workspace-list\"\r\n                [ngStyle]=\"{ 'max-height': height + 'px' }\"\r\n            >\r\n                @for (workspace of workspaces; track workspace.id; let i = $index) {\r\n                    <li\r\n                        #listItem\r\n                        class=\"workspace\"\r\n                        [ngClass]=\"{\r\n                            'workspace--focused': i === currentItemIndex && !workspace.disabled,\r\n                            'workspace--disabled': workspace.disabled,\r\n                        }\"\r\n                        (click)=\"onSelectItem(workspace)\"\r\n                    >\r\n                        <div class=\"item\">\r\n                            <span class=\"title\">{{ workspace.title }}</span>\r\n                            <span class=\"subtitle\">{{ workspace.subtitle }}</span>\r\n                        </div>\r\n                        @if (i === selectedItemIndex) {\r\n                            <span class=\"active-icon fas fa-check\"></span>\r\n                        }\r\n                    </li>\r\n                }\r\n            </ul>\r\n            @if (showFooterButton) {\r\n                <div class=\"footer\">\r\n                    <div\r\n                        class=\"footer__button\"\r\n                        (click)=\"onFooterButtonClick()\"\r\n                    >\r\n                        <span class=\"footer__button__icon fas fa-plus\"></span>\r\n                        <span class=\"footer__button__title\">{{ footerButtonLabel }}</span>\r\n                    </div>\r\n                </div>\r\n            }\r\n        </div>\r\n    }\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\n\r\nimport { WorkspaceSwitchComponent } from './workspace-switch.component';\r\n\r\n@NgModule({\r\n    imports: [WorkspaceSwitchComponent],\r\n    exports: [WorkspaceSwitchComponent],\r\n})\r\nexport class WorkspaceSwitchModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}