@arsedizioni/ars-utils 22.5.36 → 22.5.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +174 -150
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.date.mjs +92 -10
- package/fesm2022/arsedizioni-ars-utils-core.date.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.mjs +43 -7
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.validators.mjs +0 -6
- package/fesm2022/arsedizioni-ars-utils-core.validators.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +91 -30
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +97 -42
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +24 -10
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs.map +1 -1
- package/package.json +1 -1
- package/types/arsedizioni-ars-utils-clipper.ui.d.ts +79 -23
- package/types/arsedizioni-ars-utils-core.d.ts +46 -10
- package/types/arsedizioni-ars-utils-core.date.d.ts +37 -4
- package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts +116 -6
- package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts +93 -11
- package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts +29 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arsedizioni-ars-utils-ui.dialogs.select.mjs","sources":["../../../projects/ars-utils/ui.dialogs.select/select/select-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.select/select/select-dialog.component.html","../../../projects/ars-utils/ui.dialogs.select/select-tree/select-tree-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.select/select-tree/select-tree-dialog.component.html","../../../projects/ars-utils/ui.dialogs.select/send-to/send-to-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.select/send-to/send-to-dialog.component.html","../../../projects/ars-utils/ui.dialogs.select/public_api.ts","../../../projects/ars-utils/ui.dialogs.select/arsedizioni-ars-utils-ui.dialogs.select.ts"],"sourcesContent":["import {\n afterNextRender, ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n output,\n signal,\n viewChild\n} from \"@angular/core\";\nimport { FormField, form } from '@angular/forms/signals';\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatCheckboxChange, MatCheckboxModule } from \"@angular/material/checkbox\";\nimport { MatOptionModule } from \"@angular/material/core\";\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from \"@angular/material/dialog\";\nimport { MatDividerModule } from \"@angular/material/divider\";\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatListModule, MatSelectionList, MatSelectionListChange } from \"@angular/material/list\";\nimport { MatMenuModule } from \"@angular/material/menu\";\nimport { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatSelectModule } from \"@angular/material/select\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { SafeHtmlPipe, SearchFilterMetadata, SearchFilterPipe } from '@arsedizioni/ars-utils/core';\nimport {\n SelectDialogAppend,\n SelectDialogData,\n SelectDialogDelete,\n SelectDialogEdit,\n SelectDialogFilter,\n SelectDialogLookup,\n SelectDialogResult,\n SelectableFilter,\n SelectableItem,\n} from \"@arsedizioni/ars-utils/ui\";\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\n\n\n\n@Component({\n templateUrl: \"./select-dialog.component.html\",\n styleUrl: './select-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n FlexLayoutModule,\n MatDialogTitle,\n MatFormFieldModule,\n MatInputModule,\n FormField,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatOptionModule,\n MatTooltipModule,\n MatMenuModule,\n MatDividerModule,\n MatCheckboxModule,\n MatDialogContent,\n MatListModule,\n MatDialogActions,\n MatDialogClose,\n MatPaginatorModule,\n SearchFilterPipe,\n SafeHtmlPipe\n ],\n})\nexport class SelectDialogComponent {\n readonly paginator = viewChild.required<MatPaginator>('paginator');\n readonly selection = viewChild.required<MatSelectionList>(\"selection\");\n private isViewReady = false;\n private readonly dialogRef = inject(MatDialogRef<SelectDialogComponent>);\n private readonly cdr = inject(ChangeDetectorRef);\n protected readonly dialogData = signal<SelectDialogData>((() => {\n const data: SelectDialogData = inject(MAT_DIALOG_DATA) ?? {};\n return {\n ...data,\n appearance: data.appearance ?? 'outline',\n title: data.title ?? 'Seleziona',\n okCaption: data.okCaption ?? 'Ok',\n multipleSelection: data.multipleSelection ?? false,\n items: data.canLookup ? [] : (data.items ?? []),\n pageSize: data.canLookup && data.canPaginate && !data.pageSize ? 100 : data.pageSize,\n };\n })());\n readonly done = output<SelectDialogResult>();\n readonly edit = output<SelectDialogEdit>();\n readonly view = output<SelectableItem>();\n readonly append = output<SelectDialogAppend>();\n readonly delete = output<SelectDialogDelete>();\n readonly lookup = output<SelectDialogLookup>();\n readonly lookupOptions = output();\n readonly filter = output<SelectDialogFilter>();\n protected canEdit = signal<boolean>(false);\n protected canView = signal<boolean>(false);\n protected canAppend = signal<boolean>(this.dialogData().canAppend ?? false);\n protected canDelete = signal<boolean>(false);\n protected canPaginate = signal<boolean>(this.dialogData().canPaginate ?? false);\n // Handle submit button activity\n protected okDisabled = signal<boolean>(this.dialogData().mustSelect ?? true);\n // Used for array filtering\n protected filterMetadata: SearchFilterMetadata = { total: 0, count: 0 };\n protected readonly filterText = signal<string>('');\n /** Root signal form bound to the filter text input. */\n protected readonly filterForm = form(this.filterText);\n protected readonly filterOptions = signal<SelectableFilter[]>([]);\n protected filterOptionsInfo = signal<string>(\"Tutto\");\n // Used to sincronize lookup fields and params\n protected lookupField: string = \"\";\n private lookupParams?: any;\n // Used to display selected elements\n protected selectionInfo = signal<string | null>(null);\n protected selectionMasterIndeterminate = signal<boolean>(false);\n protected selectionMasterChecked = signal<boolean>(false);\n protected total = signal(this.dialogData().items?.length ?? 0);\n\n constructor() {\n const d = this.dialogData();\n if (d.canLookup) {\n if (d.lookupFields?.length) {\n this.lookupField = d.lookupFields[0].value;\n }\n if (d.canFilter) {\n this.filterOptions.set(d.filters ?? []);\n }\n }\n\n afterNextRender(() => {\n this.isViewReady = true;\n const selectedOption = this.filterOptions().find(x => x.checked);\n if (selectedOption) {\n this.applyFilterByOptions(selectedOption);\n }\n if (d.lookupOnInit) {\n this.applyFilter();\n }\n\n });\n }\n\n\n /**\n * Updates the total item count signal, triggering UI refresh.\n * @param newTotal - The new total count; defaults to 0 if omitted.\n */\n notifyChanges(newTotal?: number): void {\n this.total.set(newTotal ?? 0);\n this.cdr.markForCheck();\n }\n\n\n\n /** Returns `true` when every list item is currently selected. */\n private isAllSelected(): boolean {\n return this.selection().selectedOptions.selected.length === this.dialogData().items.length;\n }\n\n /** Returns `true` when at least one list item is selected. */\n private hasSelection(): boolean {\n return this.selection().selectedOptions.selected.length > 0;\n }\n\n /**\n * Selects or deselects all items based on the master checkbox state.\n * @param e - The checkbox change event.\n */\n protected masterSelectionToggle(e: MatCheckboxChange): void {\n if (e.checked)\n // Deselect if not allselected so that toggle makes the right choice\n this.selection().selectAll();\n else this.selection().deselectAll();\n this.selectionMasterIndeterminate.set(false);\n this.selectionMasterChecked.set(e.checked);\n const selection = this.selection();\n this.okDisabled.set(\n !!(this.dialogData().mustSelect &&\n selection.selectedOptions.selected.length === 0));\n this.updateSelectionInfo();\n }\n\n /**\n * Handles selection or deselection of a list item.\n * @param e - The selection list change event.\n */\n protected select(e: MatSelectionListChange): void {\n const selection = this.selection();\n if (!this.dialogData().multipleSelection) {\n this.selection().deselectAll();\n if (e.options?.length > 0)\n e.options[0].selected = true;\n this.okDisabled.set(false);\n } else {\n this.okDisabled.set(\n !!(this.dialogData().mustSelect &&\n selection.selectedOptions.selected.length === 0));\n }\n\n // Update editors\n this.canEdit.set(\n !!(this.dialogData().canEdit &&\n selection.selectedOptions.selected.length === 1));\n this.canView.set(\n !!(this.dialogData().canView &&\n selection.selectedOptions.selected.length === 1));\n this.canDelete.set(\n !!(this.dialogData().canDelete &&\n selection.selectedOptions.selected.length > 0));\n this.selectionMasterIndeterminate.set(\n !this.isAllSelected() && this.hasSelection());\n this.selectionMasterChecked.set(this.hasSelection());\n this.updateSelectionInfo();\n }\n\n /** Refreshes the selection info label shown in the dialog footer. */\n private updateSelectionInfo(): void {\n const selection = this.selection();\n if (selection.selectedOptions.selected.length > 0 && this.dialogData().multipleSelection) {\n this.selectionInfo.set(\n selection.selectedOptions.selected.length +\n \" / \" +\n selection.options.length);\n } else {\n this.selectionInfo.set(null);\n }\n }\n\n /** Deselects all items and resets the master checkbox state. */\n clearSelection(): void {\n this.selectionMasterIndeterminate.set(false);\n this.selectionMasterChecked.set(false);\n if (this.isViewReady) {\n this.selection().deselectAll();\n }\n this.selectionInfo.set(null);\n }\n\n /** Emits the current selection and closes the dialog. */\n protected ok(): void {\n if (!this.okDisabled()) {\n const selectedItems: SelectableItem[] = [];\n this.selection().selectedOptions.selected.forEach((element) => {\n selectedItems.push(element.value);\n });\n this.done.emit({ selectedItems: selectedItems });\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n }\n\n /** Clears the current filter text input. */\n protected clearFilter(): void {\n this.filterText.set('');\n }\n\n /**\n * Sets the filter text programmatically.\n * @param text - The new filter string to apply.\n */\n public setFilter(text: string): void {\n this.filterText.set(text);\n }\n\n\n /**\n * Returns the current filter text.\n * @returns The active filter string.\n */\n public getFilter(): string {\n return this.filterText();\n }\n\n /** Emits the `lookupOptions` output event to open the filter options panel. */\n protected showFilterOptions(): void {\n if (this.lookupOptions) {\n this.lookupOptions.emit();\n }\n }\n\n /**\n * Applies the given text filter, emitting a lookup when enabled.\n * @param text - Optional filter string; populates `filterText` when provided.\n * @param e - Optional keyboard event; lookup only fires on Enter.\n */\n protected doFilter(text?: string, e?: KeyboardEvent): void {\n if (text) {\n this.filterText.set(text);\n }\n if (this.dialogData().canLookup) {\n if (!e || e.key === 'Enter') {\n this.applyFilter();\n }\n }\n }\n\n /**\n * Applies the current filter text, emitting a lookup event.\n */\n private applyFilter() {\n this.clearSelection();\n this.lookup.emit({ items: this.dialogData().items, filter: this.filterText(), owner: this });\n }\n\n /**\n * Applies a structured filter option, emitting the filter output event.\n * @param filterOption - The selected filter option object.\n */\n private applyFilterByOptions(filterOption: any): void {\n if (this.dialogData().canLookup && this.dialogData().canFilter) {\n this.filter.emit({\n items: this.dialogData().items,\n filter: this.filterText(),\n filterOption: filterOption,\n owner: this,\n });\n this.filterOptionsInfo.set(filterOption ? (filterOption.title ?? \"Tutto\") : \"Tutto\");\n }\n }\n\n /**\n * Applies a structured filter option, emitting the filter output event.\n * @param filterOption - The selected filter option object.\n * @param apply - Optional flag to immediately apply the filter.\n */\n protected doFilterByOptions(filterOption: any, apply?: boolean): void {\n this.applyFilterByOptions(filterOption);\n if (apply) {\n setTimeout(() => {\n this.doFilter();\n }, 250);\n }\n }\n\n /**\n * Triggers a server-side lookup with the given parameters (public API).\n * @param params - An object containing the lookup query parameters.\n */\n doLookup(params: any): void {\n if (this.dialogData().canLookup) {\n this.clearSelection();\n this.lookupParams = params;\n this.lookupParams.first = 0;\n this.lookup.emit({ items: this.dialogData().items, params: this.lookupParams, owner: this });\n }\n }\n\n /**\n * Updates the paginator length and resets it to the first page.\n * @param total - The new total number of items.\n */\n protected updateLookupPaginator(total: number): void {\n if (this.canPaginate()) {\n const paginator = this.paginator();\n if (paginator) {\n paginator.pageIndex = 0;\n paginator.length = total ?? 0;\n }\n }\n }\n\n /**\n * Handles a paginator page change and triggers a new lookup.\n * @param e - The paginator page change event.\n */\n protected doLookupPage(e: PageEvent): void {\n if (this.canPaginate() && this.dialogData().canLookup) {\n this.clearSelection();\n if (!this.lookupParams) {\n this.lookupParams = { first: 0, count: this.dialogData().pageSize ?? 0 };\n }\n this.lookupParams.first = e.pageIndex * (this.dialogData().pageSize ?? 0);\n this.lookup.emit({ items: this.dialogData().items, params: this.lookupParams, owner: this });\n }\n }\n\n /** Emits the `append` output event to open the add-item flow. */\n protected doAppend(): void {\n this.append.emit({ items: this.dialogData().items, owner: this } as SelectDialogAppend);\n }\n\n /** Emits the `edit` output event for the currently selected item. */\n protected doEdit(): void {\n const selection = this.selection();\n if (selection.selectedOptions.selected?.length > 0) {\n this.edit.emit({\n item: selection.selectedOptions.selected[0].value,\n items: this.dialogData().items,\n owner: this\n } as SelectDialogEdit);\n }\n }\n\n /** Emits the `view` output event for the currently selected item. */\n protected doView(): void {\n const selection = this.selection();\n if (selection.selectedOptions.selected?.length > 0) {\n this.view.emit(selection.selectedOptions.selected[0].value);\n }\n }\n\n /** Emits the `delete` output event with all currently selected items. */\n protected doDelete(): void {\n const selectedItems: SelectableItem[] = [];\n this.selection().selectedOptions.selected.forEach((element) => {\n selectedItems.push(element.value);\n });\n this.delete.emit({\n items: this.dialogData().items,\n selectedItems: selectedItems,\n } as SelectDialogDelete);\n this.canDelete.set(false);\n this.canEdit.set(false);\n\n }\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n<div style=\"padding: 0 24px\">\n @if (dialogData().description) {\n <div class=\"select-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n }\n <div>\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"space-between center\" fxFill>\n @if (!dialogData().canLookupWithOptions) {\n <div fxFlex>\n <mat-form-field style='width:100%' [appearance]=\"dialogData().appearance\" subscriptSizing=\"dynamic\">\n <mat-label>{{dialogData().searchLabel ?? 'Cerca...'}}</mat-label>\n <input type=\"text\" (keyup.enter)=\"$event.preventDefault(); $event.stopPropagation(); doFilter()\" matInput\n title=\"{{dialogData().canLookup ? 'Digita il testo e premi invio' : 'Digita il testo'}}\"\n [formField]=\"filterForm\">\n @if (filterText()) {\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n @if (dialogData().canLookupWithInlineOptions) {\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Ricerca\"\n (click)=\"showFilterOptions()\" matTooltip=\"Opzioni di ricerca\">\n <mat-icon>tune</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n }\n @if (!dialogData().canLookupWithOptions && dialogData().canLookup && dialogData().lookupFields) {\n <div fxFlex fxHide.lt-md>\n <mat-form-field style='width:100%' [appearance]=\"dialogData().appearance\" subscriptSizing=\"dynamic\">\n <mat-label>Come...</mat-label>\n <mat-select [(value)]=\"lookupField\">\n @for (field of dialogData().lookupFields; track $index) {\n <mat-option [value]=\"field.value\">\n {{field.name}}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n }\n @if (dialogData().canLookupWithOptions) {\n <div fxFlex fxHide.lt-md>\n <button fxFlexAlign=\"center\" type=\"button\" mat-button aria-label=\"Ricerca\" (click)=\"showFilterOptions()\">\n <mat-icon>search</mat-icon> {{this.dialogData().searchButtonLabel ?? 'Ricerca'}}\n </button>\n </div>\n }\n @if (dialogData().canLookup && dialogData().canFilter) {\n <div fxFlex fxHide.lt-md>\n <button type=\"button\" mat-button matTooltip=\"Filtra\" [attr.aria-label]=\"'Filtra'\"\n [matMenuTriggerFor]=\"menuFilter\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" >\n <div><mat-icon>filter_alt</mat-icon></div>\n <div>{{filterOptionsInfo()}}</div>\n <div><mat-icon class=\"icon-menu-drop-down\">\n arrow_drop_down</mat-icon></div>\n </div>\n </button>\n <mat-menu #menuFilter=\"matMenu\" class=\"mat-menu-300\">\n @for (f of filterOptions(); track $index) {\n @if (f.divider) {\n <mat-divider></mat-divider>\n }\n @if (f.groupName) {\n <span style='font-size:small; padding: 2px 4px;'><i><b>{{f.groupName}}</b></i></span>\n }\n @if (!f.groupName && !f.divider) {\n <button mat-menu-item (click)=\"doFilterByOptions(f, true)\" [attr.aria-label]=\"f.description\">\n @if (f.radio && f.value) {\n <span style=\"padding-left:40px\"></span>\n }\n <mat-icon>{{f.icon}}</mat-icon> {{f.title}}\n </button>\n }\n\n }\n </mat-menu>\n </div>\n }\n @if (canEdit() || canAppend() || canView() || canDelete()) {\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" >\n <div fxFlex fxHide.lt-md>\n @if (canAppend()) {\n <button type=\"button\" mat-icon-button (click)=\"doAppend()\">\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\n </button>\n }\n @if (canEdit()) {\n <button type=\"button\" mat-icon-button (click)=\"doEdit()\">\n <mat-icon aria-label=\"Modifica\" matTooltip=\"Modifica\">edit</mat-icon>\n </button>\n }\n @if (canView()) {\n <button type=\"button\" mat-icon-button (click)=\"doView()\">\n <mat-icon aria-label=\"Mostra\" matTooltip=\"Mostra\">visibility</mat-icon>\n </button>\n }\n @if (canDelete()) {\n <button type=\"button\" mat-icon-button (click)=\"doDelete()\">\n <mat-icon aria-label=\"Elimina\" matTooltip=\"Elimina\">delete</mat-icon>\n </button>\n }\n </div>\n <div fxFlex fxHide.gt-sm>\n <button type=\"button\" mat-icon-button matTooltip=\"Azioni\" [attr.aria-label]=\"'Azioni'\"\n [matMenuTriggerFor]=\"menuActions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menuActions=\"matMenu\" class=\"mat-menu-300\">\n @if (canAppend()) {\n <button mat-menu-item (click)=\"doAppend()\" [attr.aria-label]=\"'Aggiungi'\">\n <mat-icon>add</mat-icon> Aggiungi\n </button>\n }\n @if (canEdit()) {\n <button mat-menu-item (click)=\"doEdit()\" [attr.aria-label]=\"'Modifica'\">\n <mat-icon>edit</mat-icon> Modifica\n </button>\n }\n @if (canView()) {\n <button mat-menu-item (click)=\"doView()\" [attr.aria-label]=\"'Mostra'\">\n <mat-icon>visibility</mat-icon> Mostra\n </button>\n }\n @if (canDelete()) {\n <button mat-menu-item (click)=\"doDelete()\" [attr.aria-label]=\"'Elimina'\">\n <mat-icon>delete</mat-icon> Elimina\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n </div>\n </div>\n @if ((dialogData().multipleSelection || dialogData().header) && dialogData().items?.length > 0) {\n <div>\n <div fxLayout=\"row\" fxFill style=\"padding-top: 10px;\">\n @if (dialogData().multipleSelection) {\n <div fxFlex=\"64px\" fxFlexAlign=\"center\" style=\"padding-left: 8px;\">\n <mat-checkbox (change)=\"$event ? masterSelectionToggle($event) : null\"\n [indeterminate]=\"selectionMasterIndeterminate()\" [checked]=\"selectionMasterChecked()\"\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\">\n </mat-checkbox>\n </div>\n }\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\n @if (dialogData().header) {\n <div class=\"text\" [innerHtml]=\"dialogData().header | safeHtml\"></div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n<mat-dialog-content style=\"padding-top:0\">\n <div fxLayout=\"column\" fxFill>\n @if (dialogData().canLookup && (!dialogData().items || dialogData().items.length == 0)) {\n <div class=\"text message\"><i>\n @if (!dialogData().emptyMessage) {\n <span>Nessun elemento da visualizzare.<br>Esegui una nuova ricerca o modifica quella\n esistente.\n @if (dialogData().maxItems > 0) {\n <span>Saranno mostrati al massimo {{dialogData().maxItems}} elementi.</span>\n }\n </span>\n } @else {\n <span [innerHtml]=\"dialogData().emptyMessage | safeHtml\"></span>\n }\n </i>\n </div>\n }\n <mat-selection-list #selection (selectionChange)=\"select($event)\" dense hideSingleSelectionIndicator=\"true\"\n [multiple]=\"dialogData().multipleSelection\">\n @for (item of (dialogData().items | search: (!dialogData().canLookup ? filterText() : ''): filterMetadata); track\n $index) {\n <mat-list-option [value]=\"item\" [selected]=\"item.selected\" togglePosition=\"before\">\n <div [innerHtml]=\"item.template | safeHtml\"></div>\n </mat-list-option>\n }\n </mat-selection-list>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"column\" fxFill>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"10px\" fxFill>\n <div class=\"secondary\" style=\"padding-left:20px\">\n @if (selectionInfo()) {\n <span class=\"bold\">{{selectionInfo()}}</span> <span class=\"small\"> elementi selezionati</span>\n } @else {\n <span class=\"bold\">{{(dialogData().canLookup ? total() : (filterText() ? filterMetadata.count : total())) ??\n 0}}</span> <span class=\"small\"> elementi</span>\n }\n </div>\n <div fxFlexAlign=\"center\">\n @if (canPaginate()) {\n <mat-paginator class=\"x-small\" #paginator [hidePageSize]=\"true\" [pageSize]=\"dialogData().pageSize\" [showFirstLastButtons]=\"true\"\n (page)=\"doLookupPage($event)\" [length]=\"total() ?? 0\"></mat-paginator>\n }\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"okDisabled()\">\n <span>{{dialogData().mustSelect ? dialogData().okCaption : 'Chiudi'}}</span>\n </button>\n @if (dialogData().mustSelect) {\n <button mat-stroked-button mat-dialog-close>\n <span>Annulla</span>\n </button>\n }\n </div>\n </div>\n</mat-dialog-actions>","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injectable,\n OnDestroy,\n computed,\n inject,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormField, form } from '@angular/forms/signals';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTree, MatTreeModule } from '@angular/material/tree';\nimport { INode, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ItemNode, SelectTreeDialogData, SelectTreeDialogResult, FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\n\n@Injectable()\nexport class TreeDataSource implements OnDestroy {\n private readonly _dataChange = new BehaviorSubject<ItemNode[]>([]);\n readonly dataChange$ = this._dataChange.asObservable();\n\n get data(): ItemNode[] {\n return this._dataChange.value;\n }\n\n ngOnDestroy(): void {\n this._dataChange.complete();\n }\n\n initialize(data: ItemNode[]): void {\n this._dataChange.next(data);\n }\n\n /**\n * Find a node by id recursively.\n * @param node - The source node to search from, or null to search from root.\n * @param id - The id to search for.\n * @returns The matching node, or undefined if not found.\n */\n findNode(node: ItemNode | null, id: string): ItemNode | undefined {\n if (node) {\n if (node.id === id) return node;\n const children = node.children;\n if (children) {\n let _n: ItemNode | undefined;\n children.some(n => {\n _n = this.findNode(n as ItemNode, id);\n return !!_n;\n });\n return _n;\n }\n return undefined;\n }\n // Search all root nodes when called with null\n for (const root of this.data) {\n const found = this.findNode(root, id);\n if (found) return found;\n }\n return undefined;\n }\n /**\n * Remove a node from the tree.\n * @param id - The id of the node to remove.\n */\n removeNode(id: string): void {\n let n = this.findNode(null, id);\n if (!n) return;\n if (n.parent) {\n // children/count are optional on INode: guard before indexing\n const siblings = n.parent.children ?? [];\n const p = siblings.findIndex(c => c.id === id);\n if (p !== -1) {\n siblings.splice(p, 1);\n if ((n.parent.count ?? 0) > 0) n.parent.count!--;\n }\n } else {\n const p = this.data.findIndex(n => n.id === id);\n if (p !== -1) {\n this.data.splice(p, 1);\n }\n }\n\n this._dataChange.next(this.data);\n }\n\n /**\n * Insert a new node at the top of its parent (or root).\n * @param node - The new node to insert.\n */\n insertNode(node: ItemNode): void {\n if (node.parent) {\n (node.parent.children ??= []).unshift(node);\n node.parent.count = (node.parent.count ?? 0) + 1;\n } else this.data.unshift(node);\n\n this._dataChange.next(this.data);\n }\n\n /**\n * Rename a node in the tree.\n * @param id - The id of the node to rename.\n * @param name - The new name for the node.\n * @returns The renamed node, or undefined if not found.\n */\n renameNode(id: string, name: string): ItemNode | undefined {\n const n = this.findNode(null, id);\n if (n) {\n n.name = name;\n this._dataChange.next(this.data);\n }\n return n;\n }\n\n /**\n * Notify all subscribers of the current data state.\n */\n update(): void {\n this._dataChange.next(this.data);\n }\n}\n\nexport interface SelectTreeDialogAppend {\n parent?: ItemNode;\n owner?: any;\n}\n\n@Component({\n templateUrl: './select-tree-dialog.component.html',\n styleUrl: './select-tree-dialog.component.scss',\n providers: [TreeDataSource],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogTitle, FlexLayoutModule, MatFormFieldModule, MatInputModule, FormField, MatButtonModule,\n MatIconModule, MatTooltipModule, MatDialogContent, MatTreeModule, MatDialogActions,\n MatDialogClose, SafeHtmlPipe]\n})\nexport class SelectTreeDialogComponent {\n /** Emitted when the user confirms a selection. */\n readonly done = output<SelectTreeDialogResult>();\n /** Emitted when the user requests to append a new node. */\n readonly append = output<SelectTreeDialogAppend>();\n private readonly destroyRef = inject(DestroyRef);\n private readonly dialogRef = inject(MatDialogRef<SelectTreeDialogComponent>);\n /** Dialog configuration, injected and exposed as a signal. */\n protected readonly dialogData = signal<SelectTreeDialogData>((() => {\n const data: SelectTreeDialogData = inject(MAT_DIALOG_DATA) ?? {};\n return { ...data, title: data.title ?? 'Seleziona', okCaption: data.okCaption ?? 'OK' };\n })());\n private readonly tree = inject(TreeDataSource);\n private readonly _elRef = inject(ElementRef);\n /** Reference to the Material tree component. */\n protected readonly matTree = viewChild<MatTree<ItemNode>>(MatTree);\n /** Provides children of a tree node to the tree component. */\n protected readonly childrenAccessor = (node: ItemNode) => (node.children ?? []) as ItemNode[];\n /** Root nodes used as the tree data source. */\n protected readonly treeNodes = signal<ItemNode[]>([]);\n /** Currently selected tree node. */\n protected readonly currentNode = signal<ItemNode | undefined>(undefined);\n /** Current filter text. */\n protected readonly filterText = signal<string>('');\n /** Root signal form bound to the filter text input. */\n protected readonly filterForm = form(this.filterText);\n /** Nodes matching the current filter text. */\n protected readonly filteredItems = signal<ItemNode[]>([]);\n /** Index of the currently highlighted filtered node (-1 = none). */\n protected readonly filterIndex = signal(-1);\n /** The currently highlighted filtered node, or null. */\n protected readonly filteredNode = computed<ItemNode | null>(() => {\n const idx = this.filterIndex();\n return idx >= 0 ? (this.filteredItems()[idx] ?? null) : null;\n });\n protected readonly canAppend = signal<boolean>(this.dialogData().canAppend || false);\n\n /** Flat node map rebuilt whenever treeNodes changes. */\n private readonly _nodeMap = computed(() => {\n const map = new Map<string, ItemNode>();\n const build = (nodes: ItemNode[]) => {\n for (const n of nodes) {\n map.set(n.id, n);\n if (n.children?.length) build(n.children as ItemNode[]);\n }\n };\n build(this.treeNodes());\n return map;\n });\n\n protected hasChild = (_: number, node: ItemNode) => !!(node.children?.length);\n\n constructor() {\n this.tree.dataChange$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(data => {\n this.treeNodes.set(data);\n setTimeout(() => {\n const current = this.currentNode();\n if (current) {\n const n = this.findInTree(data, current.id);\n if (n) {\n this.currentNode.set(n);\n this.expand(n);\n }\n }\n });\n });\n const data = this.dialogData();\n if (data.nodes) {\n this.tree.initialize(data.nodes);\n }\n if (data.initialFilter) {\n this.filterText.set(data.initialFilter);\n this.doFilter();\n }\n }\n\n /**\n * Confirm the current selection and close the dialog.\n */\n protected ok(): void {\n const node = this.currentNode();\n if (node) {\n this.done.emit({ selectedItems: [node] });\n }\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n\n /**\n * Toggle selection of a tree node. Clicking the already-selected node deselects it.\n * @param e - The mouse event (propagation is stopped).\n * @param node - The node that was clicked.\n */\n protected select(e: MouseEvent, node: ItemNode): void {\n if (e) e.stopPropagation();\n if (node) {\n this.currentNode.set(node.id === this.currentNode()?.id ? undefined : node);\n }\n }\n\n /**\n * Clear the active filter text.\n */\n protected clearFilter(): void {\n this.filterText.set('');\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n }\n\n /**\n * Filter the tree nodes by name (minimum 3 characters).\n */\n protected doFilter(): void {\n const text = this.filterText().trim().toLowerCase();\n if (text.length < 3) {\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n return;\n }\n const matches = Array.from(this._nodeMap().values())\n .filter(n => n.name?.toLowerCase().includes(text));\n this.filteredItems.set(matches);\n const idx = matches.length > 0 ? 0 : -1;\n this.filterIndex.set(idx);\n if (idx >= 0) this._scrollToFiltered(idx, matches);\n }\n\n /**\n * Advance to the next matching filtered node and scroll it into view.\n */\n protected nextFiltered(): void {\n const items = this.filteredItems();\n if (!items.length) return;\n const next = (this.filterIndex() + 1) % items.length;\n this.filterIndex.set(next);\n this._scrollToFiltered(next, items);\n }\n\n /**\n * Returns true when the node is the currently highlighted filter match.\n * @param node - tree node to check.\n */\n protected isFilteredNode(node: ItemNode): boolean {\n return this.filteredNode()?.id === node.id;\n }\n\n /**\n * Expands ancestors of the target node and scrolls it into view.\n * @param index - index within `items` to scroll to.\n * @param items - current filtered items array.\n */\n private _scrollToFiltered(index: number, items: ItemNode[]): void {\n const node = items[index];\n if (!node) return;\n this.currentNode.set(node);\n this.expand(node);\n setTimeout(() => {\n const el: HTMLElement | null = this._elRef.nativeElement.querySelector(`[data-node-id=\"${node.id}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n }\n\n /**\n * Expand a node and all of its parent nodes.\n * @param node - The node to expand.\n * @returns Always false.\n */\n public expand(node: ItemNode): boolean {\n this.matTree()?.expand(node);\n let parent = node.parent;\n const visited = new Set<INode>();\n while (parent && !visited.has(parent)) {\n visited.add(parent);\n this.matTree()?.expand(parent as ItemNode);\n parent = parent.parent;\n }\n return false;\n }\n\n /**\n * Recursively find a node by id.\n * @param nodes - Nodes to search.\n * @param id - The id to find.\n */\n private findInTree(nodes: ItemNode[], id: string): ItemNode | undefined {\n for (const node of nodes) {\n if (node.id === id) return node;\n if (node.children?.length) {\n const found = this.findInTree(node.children as ItemNode[], id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n /**\n * Append a new node to the tree.\n * @param node - The node to insert.\n */\n public appendNode(node: ItemNode): void {\n this.tree.insertNode(node);\n }\n\n /**\n * Collapse all tree nodes and reset the current selection.\n */\n protected collapseAll(): void {\n this.matTree()?.collapseAll();\n this.currentNode.set(undefined);\n }\n\n /**\n * Expand all tree nodes and scroll to the selected node, if any.\n */\n protected expandAll(): void {\n this.matTree()?.expandAll();\n const node = this.currentNode();\n if (node) {\n setTimeout(() => {\n const el: HTMLElement | null = this._elRef.nativeElement.querySelector(`[data-node-id=\"${node.id}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n }\n }\n\n /**\n * Emit an append request with the currently selected node as the parent.\n */\n protected doAppend(): void {\n this.append.emit({ parent: this.currentNode(), owner: this } as SelectTreeDialogAppend);\n }\n\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n<div style=\"padding: 0 24px\">\n @if (dialogData().description) {\n <div class=\"selecttree-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n }\n <div style=\"padding-bottom: 10px;\">\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\n <div fxFlex fxHide.xs>\n <mat-form-field style=\"width:100%\" appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Cerca...</mat-label>\n <input type=\"text\" (keyup)=\"doFilter()\" matInput title=\"Digita il testo'\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\" \n (keydown.arrowDown)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\"\n [formField]=\"filterForm\">\n @if (filterText()) {\n <button type=\"button\" type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\"\n (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n @if (filteredItems().length > 0) {\n <div fxFlex=\"50px\" fxHide.xs fxLayoutAlign=\"end center\">\n <div class=\"small\">{{filterIndex() + 1}} / {{filteredItems().length}}</div>\n </div>\n <div fxFlex=\"48px\" fxHide.xs fxLayoutAlign=\"end center\">\n <button type=\"button\" type=\"button\" mat-icon-button (click)=\"nextFiltered()\">\n <mat-icon aria-label=\"Vai al prossimo\" matTooltip=\"Vai al prossimo\">arrow_downward</mat-icon>\n </button>\n </div>\n }\n <div fxFlex=\"50\" fxLayoutAlign=\"end center\" style=\"white-space:nowrap\">\n <div>\n @if (canAppend()) {\n <button type=\"button\" mat-icon-button (click)=\"doAppend()\">\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\n </button>\n }\n <button type=\"button\" mat-icon-button (click)=\"collapseAll()\">\n <mat-icon aria-label=\"Comprimi tutto\" matTooltip=\"Comprimi tutto\">unfold_less</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"expandAll()\">\n <mat-icon aria-label=\"Espandi tutto\" matTooltip=\"Espandi tutto\">unfold_more</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<mat-dialog-content>\n <div fxLayout=\"column\" fxFill>\n <mat-tree [dataSource]=\"treeNodes()\" [childrenAccessor]=\"childrenAccessor\" class=\"tree\">\n <mat-tree-node [attr.data-node-id]=\"node.id\" *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [matTreeNodePaddingIndent]=\"20\" class=\"tree-node\" (click)=\"select($event, node);\"\n [class.tree-node-activated]=\"currentNode()?.id === node.id\" [class.tree-node-filtered]=\"isFilteredNode(node)\">\n <div fxLayout=\"row\" fxFill>\n <button type=\"button\" mat-icon-button disabled class=\"small-icon-button\"></button>\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"small\">\n {{node.name}}\n </div>\n <div fxFlex=\"30px\" fxFlexAlign=\"center\">\n @if (node.count > 0) {\n <span fxLayoutAlign=\"end\" class=\"small\">({{node.count}})</span>\n }\n </div>\n </div>\n </mat-tree-node>\n\n <mat-tree-node #treeNodeRef=\"matTreeNode\" [attr.data-node-id]=\"node.id\" *matTreeNodeDef=\"let node;when: hasChild\"\n matTreeNodePadding [matTreeNodePaddingIndent]=\"20\" class=\"tree-node\"\n [class.tree-node-activated]=\"currentNode()?.id === node.id\" [class.tree-node-filtered]=\"isFilteredNode(node)\"\n (click)=\"select($event, node);\">\n <div fxLayout=\"row\" fxFill>\n <div fxFlex=\"30px\" fxFlexAlign=\"center\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Apri/chiudi ' + node.name\"\n class=\"small-icon-button\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{treeNodeRef.isExpanded ? 'expand_more' : 'chevron_right'}}\n </mat-icon>\n </button>\n </div>\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"small\">\n {{node.name}}\n </div>\n <div fxFlex=\"30px\" fxFlexAlign=\"center\">\n @if (node.count > 0) {\n <div fxLayoutAlign=\"end\" class=\"small\">({{node.count}})</div>\n }\n </div>\n </div>\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"!currentNode()\">{{dialogData().okCaption}}</button>\n <button mat-button mat-dialog-close>Annulla</button>\n </div>\n</mat-dialog-actions>","import { TextFieldModule } from \"@angular/cdk/text-field\";\nimport { ChangeDetectionStrategy, Component, inject, output, signal } from \"@angular/core\";\nimport { form, FormField, FormRoot, maxLength, required } from '@angular/forms/signals';\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from \"@angular/material/dialog\";\nimport { MatFormFieldAppearance, MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\nimport { emails, notEmpty, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\nimport { FlexLayoutModule, ISendToDialog } from '@arsedizioni/ars-utils/ui';\nimport { SendToDialogResult, SendToPopulateData } from \"@arsedizioni/ars-utils/ui\";\n\nexport interface SendToDialogData {\n count: number;\n canPopulate?: boolean;\n title?: string;\n text?: string;\n subject?: string;\n info?: string;\n appearance?: MatFormFieldAppearance;\n options?: any;\n}\n\n@Component({\n templateUrl: \"./send-to-dialog.component.html\",\n styleUrl: './send-to-dialog.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatDialogTitle,\n MatDialogContent,\n FormField, FormRoot,\n FlexLayoutModule,\n MatFormFieldModule,\n MatInputModule,\n TextFieldModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatCheckboxModule,\n MatDialogActions,\n MatDialogClose,\n SafeHtmlPipe\n ],\n})\nexport class SendToDialogComponent implements ISendToDialog {\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\n\n /** Emitted when the user confirms and sends the message. */\n readonly done = output<SendToDialogResult>();\n /** Emitted when the user requests to populate the recipient list. */\n readonly populate = output<SendToPopulateData>();\n /** Dialog configuration, injected and exposed as a signal. */\n protected readonly dialogData = signal<SendToDialogData>((() => {\n const data: SendToDialogData = inject(MAT_DIALOG_DATA) ?? {};\n const count = data.count ?? 0;\n const title = data.title || (count\n ? (count === 1 ? 'Invia documento a...' : `Invia ${count} documenti a...`)\n : undefined);\n return { ...data, count, appearance: data.appearance ?? 'fill', title };\n })());\n /** Model backing the signal form. */\n private readonly model = signal<SendToDialogResult>({\n recipients: '',\n subject: this.dialogData().subject ?? '',\n text: this.dialogData().text ?? '',\n options: undefined\n });\n\n /**\n * Signal form for the send-to fields: recipients (a required, valid,\n * semicolon-separated email list), subject and text are all required.\n */\n protected readonly form = form(this.model, p => {\n required(p.recipients);\n notEmpty(p.recipients);\n maxLength(p.recipients, 1000);\n emails(p.recipients);\n required(p.subject);\n notEmpty(p.subject);\n maxLength(p.subject, 200);\n required(p.text);\n notEmpty(p.text);\n maxLength(p.text, 1000);\n });\n\n /**\n * Confirm the form and emit the result.\n */\n protected ok(): void {\n this.model.update(m => ({ ...m, options: this.dialogData().options }));\n this.done.emit(this.model());\n }\n\n /**\n * Request the host to populate the recipient list.\n * Only emits if `canPopulate` is enabled in the dialog data.\n */\n protected populateRecipients(): void {\n if (this.dialogData().canPopulate) {\n this.populate.emit({ item: this.model(), source: this });\n }\n }\n\n /**\n * Update the recipient list from an external caller.\n * @param recipients - The new recipients string (semicolon-separated).\n */\n updateRecipients(recipients: string): void {\n this.model.update(m => ({ ...m, recipients }));\n }\n}","<div class=\"dialog-info\">\r\n @if (form().invalid()) {\r\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n } @else {\r\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n }\r\n</div>\r\n<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\r\n<mat-dialog-content class=\"dialog-content\">\r\n <p>{{dialogData().info}}</p>\r\n <form [formRoot]=\"form\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <mat-form-field [appearance]=\"dialogData().appearance\">\r\n <mat-label>Destinatari</mat-label>\r\n <textarea matInput [formField]=\"form.recipients\"\r\n cdkTextareaAutosize cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"></textarea>\r\n @if (form.recipients().value()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"form.recipients().value.set('')\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (dialogData().canPopulate) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Popola\"\r\n (click)=\"populateRecipients()\" matTooltip=\"Popola\">\r\n <mat-icon>person</mat-icon>\r\n </button>\r\n }\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{form.recipients().value()?.length || 0}}/1000 </mat-hint>\r\n @if (form.recipients().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.recipients().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData().appearance\">\r\n <mat-label>Oggetto</mat-label>\r\n <input matInput [formField]=\"form.subject\" />\r\n @if (form.subject().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.subject().errors()) }}</mat-error>\r\n }\r\n <mat-hint align=\"end\">{{form.subject().value()?.length || 0}}/200 </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData().appearance\">\r\n <mat-label>Testo</mat-label>\r\n <textarea matInput [formField]=\"form.text\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"></textarea>\r\n <mat-hint align=\"end\">{{form.text().value()?.length || 0}}/1000 </mat-hint>\r\n @if (form.text().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.text().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n @if (dialogData().options) {\r\n <div style=\"padding-bottom: 24px;\">\r\n @for (o of dialogData().options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox (change)=\"o.selected = $event.checked\" [checked]=\"o.selected === true\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">Invia</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.dialogs.select\n */\nexport * from './select/select-dialog.component';\nexport * from './select-tree/select-tree-dialog.component';\nexport * from './send-to/send-to-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i6","i7","i4","i5","i8"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arsedizioni-ars-utils-ui.dialogs.select.mjs","sources":["../../../projects/ars-utils/ui.dialogs.select/select/select-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.select/select/select-dialog.component.html","../../../projects/ars-utils/ui.dialogs.select/select-tree/select-tree-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.select/select-tree/select-tree-dialog.component.html","../../../projects/ars-utils/ui.dialogs.select/send-to/send-to-dialog.component.ts","../../../projects/ars-utils/ui.dialogs.select/send-to/send-to-dialog.component.html","../../../projects/ars-utils/ui.dialogs.select/public_api.ts","../../../projects/ars-utils/ui.dialogs.select/arsedizioni-ars-utils-ui.dialogs.select.ts"],"sourcesContent":["import {\n afterNextRender, ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n output,\n signal,\n viewChild\n} from \"@angular/core\";\nimport { FormField, form } from '@angular/forms/signals';\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatCheckboxChange, MatCheckboxModule } from \"@angular/material/checkbox\";\nimport { MatOptionModule } from \"@angular/material/core\";\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from \"@angular/material/dialog\";\nimport { MatDividerModule } from \"@angular/material/divider\";\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatListModule, MatSelectionList, MatSelectionListChange } from \"@angular/material/list\";\nimport { MatMenuModule } from \"@angular/material/menu\";\nimport { MatPaginator, MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatSelectModule } from \"@angular/material/select\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { SafeHtmlPipe, SearchFilterMetadata, SearchFilterPipe } from '@arsedizioni/ars-utils/core';\nimport {\n SelectDialogAppend,\n SelectDialogData,\n SelectDialogDelete,\n SelectDialogEdit,\n SelectDialogFilter,\n SelectDialogLookup,\n SelectDialogResult,\n SelectableFilter,\n SelectableItem,\n} from \"@arsedizioni/ars-utils/ui\";\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\n\n\n\n@Component({\n templateUrl: \"./select-dialog.component.html\",\n styleUrl: './select-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n FlexLayoutModule,\n MatDialogTitle,\n MatFormFieldModule,\n MatInputModule,\n FormField,\n MatButtonModule,\n MatIconModule,\n MatSelectModule,\n MatOptionModule,\n MatTooltipModule,\n MatMenuModule,\n MatDividerModule,\n MatCheckboxModule,\n MatDialogContent,\n MatListModule,\n MatDialogActions,\n MatDialogClose,\n MatPaginatorModule,\n SearchFilterPipe,\n SafeHtmlPipe\n ],\n})\nexport class SelectDialogComponent {\n readonly paginator = viewChild.required<MatPaginator>('paginator');\n readonly selection = viewChild.required<MatSelectionList>(\"selection\");\n private isViewReady = false;\n private readonly dialogRef = inject(MatDialogRef<SelectDialogComponent>);\n private readonly cdr = inject(ChangeDetectorRef);\n protected readonly dialogData = signal<SelectDialogData>((() => {\n const data: SelectDialogData = inject(MAT_DIALOG_DATA) ?? {};\n return {\n ...data,\n appearance: data.appearance ?? 'outline',\n title: data.title ?? 'Seleziona',\n okCaption: data.okCaption ?? 'Ok',\n multipleSelection: data.multipleSelection ?? false,\n items: data.canLookup ? [] : (data.items ?? []),\n pageSize: data.canLookup && data.canPaginate && !data.pageSize ? 100 : data.pageSize,\n };\n })());\n readonly done = output<SelectDialogResult>();\n readonly edit = output<SelectDialogEdit>();\n readonly view = output<SelectableItem>();\n readonly append = output<SelectDialogAppend>();\n readonly delete = output<SelectDialogDelete>();\n readonly lookup = output<SelectDialogLookup>();\n readonly lookupOptions = output();\n readonly filter = output<SelectDialogFilter>();\n protected canEdit = signal<boolean>(false);\n protected canView = signal<boolean>(false);\n protected canAppend = signal<boolean>(this.dialogData().canAppend ?? false);\n protected canDelete = signal<boolean>(false);\n protected canPaginate = signal<boolean>(this.dialogData().canPaginate ?? false);\n // Handle submit button activity\n protected okDisabled = signal<boolean>(this.dialogData().mustSelect ?? true);\n // Used for array filtering\n protected filterMetadata: SearchFilterMetadata = { total: 0, count: 0 };\n protected readonly filterText = signal<string>('');\n /** Root signal form bound to the filter text input. */\n protected readonly filterForm = form(this.filterText);\n protected readonly filterOptions = signal<SelectableFilter[]>([]);\n protected filterOptionsInfo = signal<string>(\"Tutto\");\n // Used to sincronize lookup fields and params\n protected lookupField: string = \"\";\n private lookupParams?: any;\n // Used to display selected elements\n protected selectionInfo = signal<string | null>(null);\n protected selectionMasterIndeterminate = signal<boolean>(false);\n protected selectionMasterChecked = signal<boolean>(false);\n protected total = signal(this.dialogData().items?.length ?? 0);\n\n constructor() {\n const d = this.dialogData();\n if (d.canLookup) {\n if (d.lookupFields?.length) {\n this.lookupField = d.lookupFields[0].value;\n }\n if (d.canFilter) {\n this.filterOptions.set(d.filters ?? []);\n }\n }\n\n afterNextRender(() => {\n this.isViewReady = true;\n const selectedOption = this.filterOptions().find(x => x.checked);\n if (selectedOption) {\n this.applyFilterByOptions(selectedOption);\n }\n if (d.lookupOnInit) {\n this.applyFilter();\n }\n\n });\n }\n\n\n /**\n * Updates the total item count signal, triggering UI refresh.\n * @param newTotal - The new total count; defaults to 0 if omitted.\n */\n notifyChanges(newTotal?: number): void {\n this.total.set(newTotal ?? 0);\n this.cdr.markForCheck();\n }\n\n\n\n /** Returns `true` when every list item is currently selected. */\n private isAllSelected(): boolean {\n return this.selection().selectedOptions.selected.length === this.dialogData().items.length;\n }\n\n /** Returns `true` when at least one list item is selected. */\n private hasSelection(): boolean {\n return this.selection().selectedOptions.selected.length > 0;\n }\n\n /**\n * Selects or deselects all items based on the master checkbox state.\n * @param e - The checkbox change event.\n */\n protected masterSelectionToggle(e: MatCheckboxChange): void {\n if (e.checked)\n // Deselect if not allselected so that toggle makes the right choice\n this.selection().selectAll();\n else this.selection().deselectAll();\n this.selectionMasterIndeterminate.set(false);\n this.selectionMasterChecked.set(e.checked);\n const selection = this.selection();\n this.okDisabled.set(\n !!(this.dialogData().mustSelect &&\n selection.selectedOptions.selected.length === 0));\n this.updateSelectionInfo();\n }\n\n /**\n * Handles selection or deselection of a list item.\n * @param e - The selection list change event.\n */\n protected select(e: MatSelectionListChange): void {\n const selection = this.selection();\n if (!this.dialogData().multipleSelection) {\n this.selection().deselectAll();\n if (e.options?.length > 0)\n e.options[0].selected = true;\n this.okDisabled.set(false);\n } else {\n this.okDisabled.set(\n !!(this.dialogData().mustSelect &&\n selection.selectedOptions.selected.length === 0));\n }\n\n // Update editors\n this.canEdit.set(\n !!(this.dialogData().canEdit &&\n selection.selectedOptions.selected.length === 1));\n this.canView.set(\n !!(this.dialogData().canView &&\n selection.selectedOptions.selected.length === 1));\n this.canDelete.set(\n !!(this.dialogData().canDelete &&\n selection.selectedOptions.selected.length > 0));\n this.selectionMasterIndeterminate.set(\n !this.isAllSelected() && this.hasSelection());\n this.selectionMasterChecked.set(this.hasSelection());\n this.updateSelectionInfo();\n }\n\n /** Refreshes the selection info label shown in the dialog footer. */\n private updateSelectionInfo(): void {\n const selection = this.selection();\n if (selection.selectedOptions.selected.length > 0 && this.dialogData().multipleSelection) {\n this.selectionInfo.set(\n selection.selectedOptions.selected.length +\n \" / \" +\n selection.options.length);\n } else {\n this.selectionInfo.set(null);\n }\n }\n\n /** Deselects all items and resets the master checkbox state. */\n clearSelection(): void {\n this.selectionMasterIndeterminate.set(false);\n this.selectionMasterChecked.set(false);\n if (this.isViewReady) {\n this.selection().deselectAll();\n }\n this.selectionInfo.set(null);\n }\n\n /** Emits the current selection and closes the dialog. */\n protected ok(): void {\n if (!this.okDisabled()) {\n const selectedItems: SelectableItem[] = [];\n this.selection().selectedOptions.selected.forEach((element) => {\n selectedItems.push(element.value);\n });\n this.done.emit({ selectedItems: selectedItems });\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n }\n\n /** Clears the current filter text input. */\n protected clearFilter(): void {\n this.filterText.set('');\n }\n\n /**\n * Sets the filter text programmatically.\n * @param text - The new filter string to apply.\n */\n public setFilter(text: string): void {\n this.filterText.set(text);\n }\n\n\n /**\n * Returns the current filter text.\n * @returns The active filter string.\n */\n public getFilter(): string {\n return this.filterText();\n }\n\n /** Emits the `lookupOptions` output event to open the filter options panel. */\n protected showFilterOptions(): void {\n if (this.lookupOptions) {\n this.lookupOptions.emit();\n }\n }\n\n /**\n * Applies the given text filter, emitting a lookup when enabled.\n * @param text - Optional filter string; populates `filterText` when provided.\n * @param e - Optional keyboard event; lookup only fires on Enter.\n */\n protected doFilter(text?: string, e?: KeyboardEvent): void {\n if (text) {\n this.filterText.set(text);\n }\n if (this.dialogData().canLookup) {\n if (!e || e.key === 'Enter') {\n this.applyFilter();\n }\n }\n }\n\n /**\n * Applies the current filter text, emitting a lookup event.\n */\n private applyFilter() {\n this.clearSelection();\n this.lookup.emit({ items: this.dialogData().items, filter: this.filterText(), owner: this });\n }\n\n /**\n * Applies a structured filter option, emitting the filter output event.\n * @param filterOption - The selected filter option object.\n */\n private applyFilterByOptions(filterOption: any): void {\n if (this.dialogData().canLookup && this.dialogData().canFilter) {\n this.filter.emit({\n items: this.dialogData().items,\n filter: this.filterText(),\n filterOption: filterOption,\n owner: this,\n });\n this.filterOptionsInfo.set(filterOption ? (filterOption.title ?? \"Tutto\") : \"Tutto\");\n }\n }\n\n /**\n * Applies a structured filter option, emitting the filter output event.\n * @param filterOption - The selected filter option object.\n * @param apply - Optional flag to immediately apply the filter.\n */\n protected doFilterByOptions(filterOption: any, apply?: boolean): void {\n this.applyFilterByOptions(filterOption);\n if (apply) {\n setTimeout(() => {\n this.doFilter();\n }, 250);\n }\n }\n\n /**\n * Triggers a server-side lookup with the given parameters (public API).\n * @param params - An object containing the lookup query parameters.\n */\n doLookup(params: any): void {\n if (this.dialogData().canLookup) {\n this.clearSelection();\n this.lookupParams = params;\n this.lookupParams.first = 0;\n this.lookup.emit({ items: this.dialogData().items, params: this.lookupParams, owner: this });\n }\n }\n\n /**\n * Updates the paginator length and resets it to the first page.\n * @param total - The new total number of items.\n */\n protected updateLookupPaginator(total: number): void {\n if (this.canPaginate()) {\n const paginator = this.paginator();\n if (paginator) {\n paginator.pageIndex = 0;\n paginator.length = total ?? 0;\n }\n }\n }\n\n /**\n * Handles a paginator page change and triggers a new lookup.\n * @param e - The paginator page change event.\n */\n protected doLookupPage(e: PageEvent): void {\n if (this.canPaginate() && this.dialogData().canLookup) {\n this.clearSelection();\n if (!this.lookupParams) {\n this.lookupParams = { first: 0, count: this.dialogData().pageSize ?? 0 };\n }\n this.lookupParams.first = e.pageIndex * (this.dialogData().pageSize ?? 0);\n this.lookup.emit({ items: this.dialogData().items, params: this.lookupParams, owner: this });\n }\n }\n\n /** Emits the `append` output event to open the add-item flow. */\n protected doAppend(): void {\n this.append.emit({ items: this.dialogData().items, owner: this } as SelectDialogAppend);\n }\n\n /** Emits the `edit` output event for the currently selected item. */\n protected doEdit(): void {\n const selection = this.selection();\n if (selection.selectedOptions.selected?.length > 0) {\n this.edit.emit({\n item: selection.selectedOptions.selected[0].value,\n items: this.dialogData().items,\n owner: this\n } as SelectDialogEdit);\n }\n }\n\n /** Emits the `view` output event for the currently selected item. */\n protected doView(): void {\n const selection = this.selection();\n if (selection.selectedOptions.selected?.length > 0) {\n this.view.emit(selection.selectedOptions.selected[0].value);\n }\n }\n\n /** Emits the `delete` output event with all currently selected items. */\n protected doDelete(): void {\n const selectedItems: SelectableItem[] = [];\n this.selection().selectedOptions.selected.forEach((element) => {\n selectedItems.push(element.value);\n });\n this.delete.emit({\n items: this.dialogData().items,\n selectedItems: selectedItems,\n } as SelectDialogDelete);\n this.canDelete.set(false);\n this.canEdit.set(false);\n\n }\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n<div style=\"padding: 0 24px\">\n @if (dialogData().description) {\n <div class=\"select-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n }\n <div>\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"space-between center\" fxFill>\n @if (!dialogData().canLookupWithOptions) {\n <div fxFlex>\n <mat-form-field style='width:100%' [appearance]=\"dialogData().appearance\" subscriptSizing=\"dynamic\">\n <mat-label>{{dialogData().searchLabel ?? 'Cerca...'}}</mat-label>\n <input type=\"text\" (keyup.enter)=\"$event.preventDefault(); $event.stopPropagation(); doFilter()\" matInput\n title=\"{{dialogData().canLookup ? 'Digita il testo e premi invio' : 'Digita il testo'}}\"\n [formField]=\"filterForm\">\n @if (filterText()) {\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n @if (dialogData().canLookupWithInlineOptions) {\n <button type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Ricerca\"\n (click)=\"showFilterOptions()\" matTooltip=\"Opzioni di ricerca\">\n <mat-icon>tune</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n }\n @if (!dialogData().canLookupWithOptions && dialogData().canLookup && dialogData().lookupFields) {\n <div fxFlex fxHide.lt-md>\n <mat-form-field style='width:100%' [appearance]=\"dialogData().appearance\" subscriptSizing=\"dynamic\">\n <mat-label>Come...</mat-label>\n <mat-select [(value)]=\"lookupField\">\n @for (field of dialogData().lookupFields; track $index) {\n <mat-option [value]=\"field.value\">\n {{field.name}}\n </mat-option>\n }\n </mat-select>\n </mat-form-field>\n </div>\n }\n @if (dialogData().canLookupWithOptions) {\n <div fxFlex fxHide.lt-md>\n <button fxFlexAlign=\"center\" type=\"button\" mat-button aria-label=\"Ricerca\" (click)=\"showFilterOptions()\">\n <mat-icon>search</mat-icon> {{this.dialogData().searchButtonLabel ?? 'Ricerca'}}\n </button>\n </div>\n }\n @if (dialogData().canLookup && dialogData().canFilter) {\n <div fxFlex fxHide.lt-md>\n <button type=\"button\" mat-button matTooltip=\"Filtra\" [attr.aria-label]=\"'Filtra'\"\n [matMenuTriggerFor]=\"menuFilter\">\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" >\n <div><mat-icon>filter_alt</mat-icon></div>\n <div>{{filterOptionsInfo()}}</div>\n <div><mat-icon class=\"icon-menu-drop-down\">\n arrow_drop_down</mat-icon></div>\n </div>\n </button>\n <mat-menu #menuFilter=\"matMenu\" class=\"mat-menu-300\">\n @for (f of filterOptions(); track $index) {\n @if (f.divider) {\n <mat-divider></mat-divider>\n }\n @if (f.groupName) {\n <span style='font-size:small; padding: 2px 4px;'><i><b>{{f.groupName}}</b></i></span>\n }\n @if (!f.groupName && !f.divider) {\n <button mat-menu-item (click)=\"doFilterByOptions(f, true)\" [attr.aria-label]=\"f.description\">\n @if (f.radio && f.value) {\n <span style=\"padding-left:40px\"></span>\n }\n <mat-icon>{{f.icon}}</mat-icon> {{f.title}}\n </button>\n }\n\n }\n </mat-menu>\n </div>\n }\n @if (canEdit() || canAppend() || canView() || canDelete()) {\n <div fxLayout=\"row\" fxLayoutAlign=\"end center\" >\n <div fxFlex fxHide.lt-md>\n @if (canAppend()) {\n <button type=\"button\" mat-icon-button (click)=\"doAppend()\">\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\n </button>\n }\n @if (canEdit()) {\n <button type=\"button\" mat-icon-button (click)=\"doEdit()\">\n <mat-icon aria-label=\"Modifica\" matTooltip=\"Modifica\">edit</mat-icon>\n </button>\n }\n @if (canView()) {\n <button type=\"button\" mat-icon-button (click)=\"doView()\">\n <mat-icon aria-label=\"Mostra\" matTooltip=\"Mostra\">visibility</mat-icon>\n </button>\n }\n @if (canDelete()) {\n <button type=\"button\" mat-icon-button (click)=\"doDelete()\">\n <mat-icon aria-label=\"Elimina\" matTooltip=\"Elimina\">delete</mat-icon>\n </button>\n }\n </div>\n <div fxFlex fxHide.gt-sm>\n <button type=\"button\" mat-icon-button matTooltip=\"Azioni\" [attr.aria-label]=\"'Azioni'\"\n [matMenuTriggerFor]=\"menuActions\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menuActions=\"matMenu\" class=\"mat-menu-300\">\n @if (canAppend()) {\n <button mat-menu-item (click)=\"doAppend()\" [attr.aria-label]=\"'Aggiungi'\">\n <mat-icon>add</mat-icon> Aggiungi\n </button>\n }\n @if (canEdit()) {\n <button mat-menu-item (click)=\"doEdit()\" [attr.aria-label]=\"'Modifica'\">\n <mat-icon>edit</mat-icon> Modifica\n </button>\n }\n @if (canView()) {\n <button mat-menu-item (click)=\"doView()\" [attr.aria-label]=\"'Mostra'\">\n <mat-icon>visibility</mat-icon> Mostra\n </button>\n }\n @if (canDelete()) {\n <button mat-menu-item (click)=\"doDelete()\" [attr.aria-label]=\"'Elimina'\">\n <mat-icon>delete</mat-icon> Elimina\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n </div>\n </div>\n @if ((dialogData().multipleSelection || dialogData().header) && dialogData().items?.length > 0) {\n <div>\n <div fxLayout=\"row\" fxFill style=\"padding-top: 10px;\">\n @if (dialogData().multipleSelection) {\n <div fxFlex=\"64px\" fxFlexAlign=\"center\" style=\"padding-left: 8px;\">\n <mat-checkbox (change)=\"$event ? masterSelectionToggle($event) : null\"\n [indeterminate]=\"selectionMasterIndeterminate()\" [checked]=\"selectionMasterChecked()\"\n [attr.aria-label]=\"'Seleziona/deseleziona tutto'\" matTooltip=\"Seleziona/deseleziona tutto\">\n </mat-checkbox>\n </div>\n }\n <div fxFlex=\"100\" fxFlexAlign=\"center\">\n @if (dialogData().header) {\n <div class=\"text\" [innerHtml]=\"dialogData().header | safeHtml\"></div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n<mat-dialog-content style=\"padding-top:0\">\n <div fxLayout=\"column\" fxFill>\n @if (dialogData().canLookup && (!dialogData().items || dialogData().items.length == 0)) {\n <div class=\"text message\"><i>\n @if (!dialogData().emptyMessage) {\n <span>Nessun elemento da visualizzare.<br>Esegui una nuova ricerca o modifica quella\n esistente.\n @if (dialogData().maxItems > 0) {\n <span>Saranno mostrati al massimo {{dialogData().maxItems}} elementi.</span>\n }\n </span>\n } @else {\n <span [innerHtml]=\"dialogData().emptyMessage | safeHtml\"></span>\n }\n </i>\n </div>\n }\n <mat-selection-list #selection (selectionChange)=\"select($event)\" dense hideSingleSelectionIndicator=\"true\"\n [multiple]=\"dialogData().multipleSelection\">\n @for (item of (dialogData().items | search: (!dialogData().canLookup ? filterText() : ''): filterMetadata); track\n $index) {\n <mat-list-option [value]=\"item\" [selected]=\"item.selected\" togglePosition=\"before\">\n <div [innerHtml]=\"item.template | safeHtml\"></div>\n </mat-list-option>\n }\n </mat-selection-list>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"column\" fxFill>\n <div fxLayout=\"row\" fxLayoutAlign=\"space-between center\" fxLayoutGap=\"10px\" fxFill>\n <div class=\"secondary\" style=\"padding-left:20px\">\n @if (selectionInfo()) {\n <span class=\"bold\">{{selectionInfo()}}</span> <span class=\"small\"> elementi selezionati</span>\n } @else {\n <span class=\"bold\">{{(dialogData().canLookup ? total() : (filterText() ? filterMetadata.count : total())) ??\n 0}}</span> <span class=\"small\"> elementi</span>\n }\n </div>\n <div fxFlexAlign=\"center\">\n @if (canPaginate()) {\n <mat-paginator class=\"x-small\" #paginator [hidePageSize]=\"true\" [pageSize]=\"dialogData().pageSize\" [showFirstLastButtons]=\"true\"\n (page)=\"doLookupPage($event)\" [length]=\"total() ?? 0\"></mat-paginator>\n }\n </div>\n </div>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"okDisabled()\">\n <span>{{dialogData().mustSelect ? dialogData().okCaption : 'Chiudi'}}</span>\n </button>\n @if (dialogData().mustSelect) {\n <button mat-stroked-button mat-dialog-close>\n <span>Annulla</span>\n </button>\n }\n </div>\n </div>\n</mat-dialog-actions>","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injectable,\n OnDestroy,\n computed,\n inject,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormField, form } from '@angular/forms/signals';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTree, MatTreeModule } from '@angular/material/tree';\nimport { INode, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { ItemNode, SelectTreeDialogData, SelectTreeDialogResult, FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\n\n@Injectable()\nexport class TreeDataSource implements OnDestroy {\n private readonly _dataChange = new BehaviorSubject<ItemNode[]>([]);\n readonly dataChange$ = this._dataChange.asObservable();\n\n get data(): ItemNode[] {\n return this._dataChange.value;\n }\n\n ngOnDestroy(): void {\n this._dataChange.complete();\n }\n\n initialize(data: ItemNode[]): void {\n this._dataChange.next(data);\n }\n\n /**\n * Find a node by id recursively.\n * @param node - The source node to search from, or null to search from root.\n * @param id - The id to search for.\n * @returns The matching node, or undefined if not found.\n */\n findNode(node: ItemNode | null, id: string): ItemNode | undefined {\n if (node) {\n if (node.id === id) return node;\n const children = node.children;\n if (children) {\n let _n: ItemNode | undefined;\n children.some(n => {\n _n = this.findNode(n as ItemNode, id);\n return !!_n;\n });\n return _n;\n }\n return undefined;\n }\n // Search all root nodes when called with null\n for (const root of this.data) {\n const found = this.findNode(root, id);\n if (found) return found;\n }\n return undefined;\n }\n /**\n * Remove a node from the tree.\n * @param id - The id of the node to remove.\n */\n removeNode(id: string): void {\n let n = this.findNode(null, id);\n if (!n) return;\n if (n.parent) {\n // children/count are optional on INode: guard before indexing\n const siblings = n.parent.children ?? [];\n const p = siblings.findIndex(c => c.id === id);\n if (p !== -1) {\n siblings.splice(p, 1);\n if ((n.parent.count ?? 0) > 0) n.parent.count!--;\n }\n } else {\n const p = this.data.findIndex(n => n.id === id);\n if (p !== -1) {\n this.data.splice(p, 1);\n }\n }\n\n this._dataChange.next(this.data);\n }\n\n /**\n * Insert a new node at the top of its parent (or root).\n * @param node - The new node to insert.\n */\n insertNode(node: ItemNode): void {\n if (node.parent) {\n (node.parent.children ??= []).unshift(node);\n node.parent.count = (node.parent.count ?? 0) + 1;\n } else this.data.unshift(node);\n\n this._dataChange.next(this.data);\n }\n\n /**\n * Rename a node in the tree.\n * @param id - The id of the node to rename.\n * @param name - The new name for the node.\n * @returns The renamed node, or undefined if not found.\n */\n renameNode(id: string, name: string): ItemNode | undefined {\n const n = this.findNode(null, id);\n if (n) {\n n.name = name;\n this._dataChange.next(this.data);\n }\n return n;\n }\n\n /**\n * Notify all subscribers of the current data state.\n */\n update(): void {\n this._dataChange.next(this.data);\n }\n}\n\nexport interface SelectTreeDialogAppend {\n parent?: ItemNode;\n owner?: any;\n}\n\n@Component({\n templateUrl: './select-tree-dialog.component.html',\n styleUrl: './select-tree-dialog.component.scss',\n providers: [TreeDataSource],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogTitle, FlexLayoutModule, MatFormFieldModule, MatInputModule, FormField, MatButtonModule,\n MatIconModule, MatTooltipModule, MatDialogContent, MatTreeModule, MatDialogActions,\n MatDialogClose, SafeHtmlPipe]\n})\nexport class SelectTreeDialogComponent {\n /** Emitted when the user confirms a selection. */\n readonly done = output<SelectTreeDialogResult>();\n /** Emitted when the user requests to append a new node. */\n readonly append = output<SelectTreeDialogAppend>();\n private readonly destroyRef = inject(DestroyRef);\n private readonly dialogRef = inject(MatDialogRef<SelectTreeDialogComponent>);\n /** Dialog configuration, injected and exposed as a signal. */\n protected readonly dialogData = signal<SelectTreeDialogData>((() => {\n const data: SelectTreeDialogData = inject(MAT_DIALOG_DATA) ?? {};\n return { ...data, title: data.title ?? 'Seleziona', okCaption: data.okCaption ?? 'OK' };\n })());\n private readonly tree = inject(TreeDataSource);\n private readonly _elRef = inject(ElementRef);\n /** Reference to the Material tree component. */\n protected readonly matTree = viewChild<MatTree<ItemNode>>(MatTree);\n /** Provides children of a tree node to the tree component. */\n protected readonly childrenAccessor = (node: ItemNode) => (node.children ?? []) as ItemNode[];\n /** Root nodes used as the tree data source. */\n protected readonly treeNodes = signal<ItemNode[]>([]);\n /** Currently selected tree node. */\n protected readonly currentNode = signal<ItemNode | undefined>(undefined);\n /** Current filter text. */\n protected readonly filterText = signal<string>('');\n /** Root signal form bound to the filter text input. */\n protected readonly filterForm = form(this.filterText);\n /** Nodes matching the current filter text. */\n protected readonly filteredItems = signal<ItemNode[]>([]);\n /** Index of the currently highlighted filtered node (-1 = none). */\n protected readonly filterIndex = signal(-1);\n /** The currently highlighted filtered node, or null. */\n protected readonly filteredNode = computed<ItemNode | null>(() => {\n const idx = this.filterIndex();\n return idx >= 0 ? (this.filteredItems()[idx] ?? null) : null;\n });\n protected readonly canAppend = signal<boolean>(this.dialogData().canAppend || false);\n\n /** Flat node map rebuilt whenever treeNodes changes. */\n private readonly _nodeMap = computed(() => {\n const map = new Map<string, ItemNode>();\n const build = (nodes: ItemNode[]) => {\n for (const n of nodes) {\n map.set(n.id, n);\n if (n.children?.length) build(n.children as ItemNode[]);\n }\n };\n build(this.treeNodes());\n return map;\n });\n\n protected hasChild = (_: number, node: ItemNode) => !!(node.children?.length);\n\n constructor() {\n this.tree.dataChange$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(data => {\n this.treeNodes.set(data);\n setTimeout(() => {\n const current = this.currentNode();\n if (current) {\n const n = this.findInTree(data, current.id);\n if (n) {\n this.currentNode.set(n);\n this.expand(n);\n }\n }\n });\n });\n const data = this.dialogData();\n if (data.nodes) {\n this.tree.initialize(data.nodes);\n }\n if (data.initialFilter) {\n this.filterText.set(data.initialFilter);\n this.doFilter();\n }\n }\n\n /**\n * Confirm the current selection and close the dialog.\n */\n protected ok(): void {\n const node = this.currentNode();\n if (node) {\n this.done.emit({ selectedItems: [node] });\n }\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n\n /**\n * Toggle selection of a tree node. Clicking the already-selected node deselects it.\n * @param e - The mouse event (propagation is stopped).\n * @param node - The node that was clicked.\n */\n protected select(e: MouseEvent, node: ItemNode): void {\n if (e) e.stopPropagation();\n if (node) {\n this.currentNode.set(node.id === this.currentNode()?.id ? undefined : node);\n }\n }\n\n /**\n * Clear the active filter text.\n */\n protected clearFilter(): void {\n this.filterText.set('');\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n }\n\n /**\n * Filter the tree nodes by name (minimum 3 characters).\n */\n protected doFilter(): void {\n const text = this.filterText().trim().toLowerCase();\n if (text.length < 3) {\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n return;\n }\n const matches = Array.from(this._nodeMap().values())\n .filter(n => n.name?.toLowerCase().includes(text));\n this.filteredItems.set(matches);\n const idx = matches.length > 0 ? 0 : -1;\n this.filterIndex.set(idx);\n if (idx >= 0) this._scrollToFiltered(idx, matches);\n }\n\n /**\n * Advance to the next matching filtered node and scroll it into view.\n */\n protected nextFiltered(): void {\n const items = this.filteredItems();\n if (!items.length) return;\n const next = (this.filterIndex() + 1) % items.length;\n this.filterIndex.set(next);\n this._scrollToFiltered(next, items);\n }\n\n /**\n * Returns true when the node is the currently highlighted filter match.\n * @param node - tree node to check.\n */\n protected isFilteredNode(node: ItemNode): boolean {\n return this.filteredNode()?.id === node.id;\n }\n\n /**\n * Expands ancestors of the target node and scrolls it into view.\n * @param index - index within `items` to scroll to.\n * @param items - current filtered items array.\n */\n private _scrollToFiltered(index: number, items: ItemNode[]): void {\n const node = items[index];\n if (!node) return;\n this.currentNode.set(node);\n this.expand(node);\n setTimeout(() => {\n const el: HTMLElement | null = this._elRef.nativeElement.querySelector(`[data-node-id=\"${node.id}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n }\n\n /**\n * Expand a node and all of its parent nodes.\n * @param node - The node to expand.\n * @returns Always false.\n */\n public expand(node: ItemNode): boolean {\n this.matTree()?.expand(node);\n let parent = node.parent;\n const visited = new Set<INode>();\n while (parent && !visited.has(parent)) {\n visited.add(parent);\n this.matTree()?.expand(parent as ItemNode);\n parent = parent.parent;\n }\n return false;\n }\n\n /**\n * Recursively find a node by id.\n * @param nodes - Nodes to search.\n * @param id - The id to find.\n */\n private findInTree(nodes: ItemNode[], id: string): ItemNode | undefined {\n for (const node of nodes) {\n if (node.id === id) return node;\n if (node.children?.length) {\n const found = this.findInTree(node.children as ItemNode[], id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n /**\n * Append a new node to the tree.\n * @param node - The node to insert.\n */\n public appendNode(node: ItemNode): void {\n this.tree.insertNode(node);\n }\n\n /**\n * Collapse all tree nodes and reset the current selection.\n */\n protected collapseAll(): void {\n this.matTree()?.collapseAll();\n this.currentNode.set(undefined);\n }\n\n /**\n * Expand all tree nodes and scroll to the selected node, if any.\n */\n protected expandAll(): void {\n this.matTree()?.expandAll();\n const node = this.currentNode();\n if (node) {\n setTimeout(() => {\n const el: HTMLElement | null = this._elRef.nativeElement.querySelector(`[data-node-id=\"${node.id}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n }\n }\n\n /**\n * Emit an append request with the currently selected node as the parent.\n */\n protected doAppend(): void {\n this.append.emit({ parent: this.currentNode(), owner: this } as SelectTreeDialogAppend);\n }\n\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n<div style=\"padding: 0 24px\">\n @if (dialogData().description) {\n <div class=\"selecttree-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n }\n <div style=\"padding-bottom: 10px;\">\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\n <div fxFlex fxHide.xs>\n <mat-form-field style=\"width:100%\" appearance=\"outline\" subscriptSizing=\"dynamic\">\n <mat-label>Cerca...</mat-label>\n <input type=\"text\" (keyup)=\"doFilter()\" matInput title=\"Digita il testo'\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\" \n (keydown.arrowDown)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\"\n [formField]=\"filterForm\">\n @if (filterText()) {\n <button type=\"button\" type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button aria-label=\"Clear\"\n (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n @if (filteredItems().length > 0) {\n <div fxFlex=\"50px\" fxHide.xs fxLayoutAlign=\"end center\">\n <div class=\"small\">{{filterIndex() + 1}} / {{filteredItems().length}}</div>\n </div>\n <div fxFlex=\"48px\" fxHide.xs fxLayoutAlign=\"end center\">\n <button type=\"button\" type=\"button\" mat-icon-button (click)=\"nextFiltered()\">\n <mat-icon aria-label=\"Vai al prossimo\" matTooltip=\"Vai al prossimo\">arrow_downward</mat-icon>\n </button>\n </div>\n }\n <div fxFlex=\"50\" fxLayoutAlign=\"end center\" style=\"white-space:nowrap\">\n <div>\n @if (canAppend()) {\n <button type=\"button\" mat-icon-button (click)=\"doAppend()\">\n <mat-icon aria-label=\"Aggiungi\" matTooltip=\"Aggiungi\">add</mat-icon>\n </button>\n }\n <button type=\"button\" mat-icon-button (click)=\"collapseAll()\">\n <mat-icon aria-label=\"Comprimi tutto\" matTooltip=\"Comprimi tutto\">unfold_less</mat-icon>\n </button>\n <button type=\"button\" mat-icon-button (click)=\"expandAll()\">\n <mat-icon aria-label=\"Espandi tutto\" matTooltip=\"Espandi tutto\">unfold_more</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n</div>\n<mat-dialog-content>\n <div fxLayout=\"column\" fxFill>\n <mat-tree [dataSource]=\"treeNodes()\" [childrenAccessor]=\"childrenAccessor\" class=\"tree\">\n <mat-tree-node [attr.data-node-id]=\"node.id\" *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\n [matTreeNodePaddingIndent]=\"20\" class=\"tree-node\" (click)=\"select($event, node);\"\n [class.tree-node-activated]=\"currentNode()?.id === node.id\" [class.tree-node-filtered]=\"isFilteredNode(node)\">\n <div fxLayout=\"row\" fxFill>\n <button type=\"button\" mat-icon-button disabled class=\"small-icon-button\"></button>\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"small\">\n {{node.name}}\n </div>\n <div fxFlex=\"30px\" fxFlexAlign=\"center\">\n @if (node.count > 0) {\n <span fxLayoutAlign=\"end\" class=\"small\">({{node.count}})</span>\n }\n </div>\n </div>\n </mat-tree-node>\n\n <mat-tree-node #treeNodeRef=\"matTreeNode\" [attr.data-node-id]=\"node.id\" *matTreeNodeDef=\"let node;when: hasChild\"\n matTreeNodePadding [matTreeNodePaddingIndent]=\"20\" class=\"tree-node\"\n [class.tree-node-activated]=\"currentNode()?.id === node.id\" [class.tree-node-filtered]=\"isFilteredNode(node)\"\n (click)=\"select($event, node);\">\n <div fxLayout=\"row\" fxFill>\n <div fxFlex=\"30px\" fxFlexAlign=\"center\">\n <button type=\"button\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Apri/chiudi ' + node.name\"\n class=\"small-icon-button\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{treeNodeRef.isExpanded ? 'expand_more' : 'chevron_right'}}\n </mat-icon>\n </button>\n </div>\n <div fxFlex=\"*\" fxFlexAlign=\"center\" class=\"small\">\n {{node.name}}\n </div>\n <div fxFlex=\"30px\" fxFlexAlign=\"center\">\n @if (node.count > 0) {\n <div fxLayoutAlign=\"end\" class=\"small\">({{node.count}})</div>\n }\n </div>\n </div>\n </mat-tree-node>\n </mat-tree>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"!currentNode()\">{{dialogData().okCaption}}</button>\n <button mat-button mat-dialog-close>Annulla</button>\n </div>\n</mat-dialog-actions>","import { TextFieldModule } from \"@angular/cdk/text-field\";\nimport { ChangeDetectionStrategy, Component, inject, output, signal } from \"@angular/core\";\nimport { form, FormField, FormRoot, maxLength, required } from '@angular/forms/signals';\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle } from \"@angular/material/dialog\";\nimport { MatFormFieldAppearance, MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { DtoUtils, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\nimport { emails, notEmpty, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\nimport { FlexLayoutModule, ISendToDialog } from '@arsedizioni/ars-utils/ui';\nimport { SendToDialogResult, SendToPopulateData } from \"@arsedizioni/ars-utils/ui\";\n\n/**\n * Form model of the send-to dialog.\n *\n * {@link SendToDialogResult} is the DTO: every field of it is optional, so it cannot\n * back a signal form directly. Here every editable field is present and holds `''` when\n * empty; `options` is not editable and is only added back by {@link toPayload}.\n */\ninterface SendToForm {\n /** Semicolon-separated recipient list; `''` when the input is empty. */\n recipients: string;\n /** Subject of the message; `''` when the input is empty. */\n subject: string;\n /** Body of the message; `''` when the input is empty. */\n text: string;\n}\n\n/** Neutral form model: it declares every field the form owns and its empty value. */\nconst _EMPTY_ITEM: SendToForm = { recipients: '', subject: '', text: '' };\n\nexport interface SendToDialogData {\n count: number;\n canPopulate?: boolean;\n title?: string;\n text?: string;\n subject?: string;\n info?: string;\n appearance?: MatFormFieldAppearance;\n options?: any;\n}\n\n@Component({\n templateUrl: \"./send-to-dialog.component.html\",\n styleUrl: './send-to-dialog.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatDialogTitle,\n MatDialogContent,\n FormField, FormRoot,\n FlexLayoutModule,\n MatFormFieldModule,\n MatInputModule,\n TextFieldModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatCheckboxModule,\n MatDialogActions,\n MatDialogClose,\n SafeHtmlPipe\n ],\n})\nexport class SendToDialogComponent implements ISendToDialog {\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\n\n /** Emitted when the user confirms and sends the message. */\n readonly done = output<SendToDialogResult>();\n /** Emitted when the user requests to populate the recipient list. */\n readonly populate = output<SendToPopulateData>();\n /** Dialog configuration, injected and exposed as a signal. */\n protected readonly dialogData = signal<SendToDialogData>((() => {\n const data: SendToDialogData = inject(MAT_DIALOG_DATA) ?? {};\n const count = data.count ?? 0;\n const title = data.title || (count\n ? (count === 1 ? 'Invia documento a...' : `Invia ${count} documenti a...`)\n : undefined);\n return { ...data, count, appearance: data.appearance ?? 'fill', title };\n })());\n /** Model backing the signal form. */\n private readonly model = signal<SendToForm>(this.toForm());\n\n /**\n * Builds the form model from the dialog data, which may pre-fill subject and body.\n * @returns A fresh form model.\n */\n private toForm(): SendToForm {\n const data = this.dialogData();\n return DtoUtils.toForm(_EMPTY_ITEM, { subject: data.subject, text: data.text });\n }\n\n /**\n * Builds the dialog result from the current form model.\n *\n * Ad-hoc because the result also carries the caller's `options`, which the dialog\n * only passes through and are therefore not part of the form model.\n * @returns The message to emit through `done` or `populate`.\n */\n private toPayload(): SendToDialogResult {\n return { ...DtoUtils.toPayload(this.model()), options: this.dialogData().options };\n }\n\n /**\n * Signal form for the send-to fields: recipients (a required, valid,\n * semicolon-separated email list), subject and text are all required.\n */\n protected readonly form = form(this.model, p => {\n required(p.recipients);\n notEmpty(p.recipients);\n maxLength(p.recipients, 1000);\n emails(p.recipients);\n required(p.subject);\n notEmpty(p.subject);\n maxLength(p.subject, 200);\n required(p.text);\n notEmpty(p.text);\n maxLength(p.text, 1000);\n });\n\n /**\n * Confirm the form and emit the result.\n */\n protected ok(): void {\n this.done.emit(this.toPayload());\n }\n\n /**\n * Request the host to populate the recipient list.\n * Only emits if `canPopulate` is enabled in the dialog data.\n */\n protected populateRecipients(): void {\n if (this.dialogData().canPopulate) {\n this.populate.emit({ item: this.toPayload(), source: this });\n }\n }\n\n /**\n * Update the recipient list from an external caller.\n * @param recipients - The new recipients string (semicolon-separated).\n */\n updateRecipients(recipients: string): void {\n this.model.update(m => ({ ...m, recipients }));\n }\n}","<div class=\"dialog-info\">\r\n @if (form().invalid()) {\r\n <span class=\"dialog-info-error\">Ci sono ancora dei campi obbligatori (*) non compilati.</span>\r\n } @else {\r\n <span class=\"dialog-info-ok\">Tutti i campi obbligatori (*) sono compilati.</span>\r\n }\r\n</div>\r\n<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\r\n<mat-dialog-content class=\"dialog-content\">\r\n <p>{{dialogData().info}}</p>\r\n <form [formRoot]=\"form\" novalidate>\r\n <div fxLayout=\"column\" fxLayoutGap=\"32px\" fxFill>\r\n <div fxFlex=\"*\" fxLayout=\"column\" fxFill>\r\n <mat-form-field [appearance]=\"dialogData().appearance\">\r\n <mat-label>Destinatari</mat-label>\r\n <textarea matInput [formField]=\"form.recipients\"\r\n cdkTextareaAutosize cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"></textarea>\r\n @if (form.recipients().value()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\"\r\n (click)=\"form.recipients().value.set('')\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (dialogData().canPopulate) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Popola\"\r\n (click)=\"populateRecipients()\" matTooltip=\"Popola\">\r\n <mat-icon>person</mat-icon>\r\n </button>\r\n }\r\n <mat-hint align=\"start\">Separati da punto e virgola</mat-hint>\r\n <mat-hint align=\"end\">{{form.recipients().value()?.length || 0}}/1000 </mat-hint>\r\n @if (form.recipients().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.recipients().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData().appearance\">\r\n <mat-label>Oggetto</mat-label>\r\n <input matInput [formField]=\"form.subject\" />\r\n @if (form.subject().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.subject().errors()) }}</mat-error>\r\n }\r\n <mat-hint align=\"end\">{{form.subject().value()?.length || 0}}/200 </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field [appearance]=\"dialogData().appearance\">\r\n <mat-label>Testo</mat-label>\r\n <textarea matInput [formField]=\"form.text\" cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" cdkAutosizeMaxRows=\"10\"></textarea>\r\n <mat-hint align=\"end\">{{form.text().value()?.length || 0}}/1000 </mat-hint>\r\n @if (form.text().invalid()) {\r\n <mat-error>{{ getErrorMessage(form.text().errors()) }}</mat-error>\r\n }\r\n </mat-form-field>\r\n </div>\r\n @if (dialogData().options) {\r\n <div style=\"padding-bottom: 24px;\">\r\n @for (o of dialogData().options; track o; let i = $index) {\r\n <div>\r\n <mat-checkbox (change)=\"o.selected = $event.checked\" [checked]=\"o.selected === true\" name=\"opt_{{i}}\">\r\n {{o.description}}\r\n </mat-checkbox>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </form>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxLayoutAlign=\"end\" fxFill>\r\n <button mat-flat-button [disabled]=\"form().invalid()\" (click)=\"ok()\">Invia</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.dialogs.select\n */\nexport * from './select/select-dialog.component';\nexport * from './select-tree/select-tree-dialog.component';\nexport * from './send-to/send-to-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i6","i7","i4","i5","i8"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -489,11 +489,15 @@ declare class ClipperSearchResultManager extends ClipperDocumentManager {
|
|
|
489
489
|
}
|
|
490
490
|
|
|
491
491
|
/**
|
|
492
|
-
* Shape of the browser filter-pane form model
|
|
493
|
-
*
|
|
494
|
-
*
|
|
492
|
+
* Shape of the browser filter-pane form model, derived from the {@link ClipperSearchParams}
|
|
493
|
+
* DTO: every field of that DTO is optional, so it cannot back a signal form directly.
|
|
494
|
+
*
|
|
495
|
+
* Text fields use '' when empty, numeric/select/date fields use null, list fields use
|
|
496
|
+
* null — never undefined, because signal forms only create child fields for defined
|
|
497
|
+
* values. Dates are always `Date | null` — never a `Date | string` — because `null` is
|
|
498
|
+
* what Material's date accessors write when a datepicker input is cleared.
|
|
495
499
|
*/
|
|
496
|
-
interface
|
|
500
|
+
interface BrowserFilterForm {
|
|
497
501
|
modules: NameValueItem<ClipperModule>[] | null;
|
|
498
502
|
tags: NameValueItem<string>[] | null;
|
|
499
503
|
topics: NameValueItem<string>[] | null;
|
|
@@ -634,15 +638,15 @@ declare class ClipperBrowserComponent extends ClipperSearchResultManager {
|
|
|
634
638
|
/**
|
|
635
639
|
* Model backing the filter-pane signal form. This is the single source of truth
|
|
636
640
|
* for every filter value bound in the template; `filterParams` only carries the
|
|
637
|
-
* assembled query DTO (see
|
|
638
|
-
* false / null-array — never undefined, so every child field exists.
|
|
641
|
+
* assembled query DTO (see toForm/toPayload and loadFilter). Empty values are
|
|
642
|
+
* '' / null / false / null-array — never undefined, so every child field exists.
|
|
639
643
|
*/
|
|
640
|
-
protected readonly filterModel: _angular_core.WritableSignal<
|
|
644
|
+
protected readonly filterModel: _angular_core.WritableSignal<BrowserFilterForm>;
|
|
641
645
|
/**
|
|
642
646
|
* Signal form for the filter pane. The four year fields accept values from 1750
|
|
643
647
|
* (previously the native min attribute on the inputs).
|
|
644
648
|
*/
|
|
645
|
-
protected readonly filterForm: _angular_forms_signals.FieldTree<
|
|
649
|
+
protected readonly filterForm: _angular_forms_signals.FieldTree<BrowserFilterForm, string | number, "writable">;
|
|
646
650
|
/** Root signal form for the sort-mode button selector. */
|
|
647
651
|
protected readonly sortForm: _angular_forms_signals.FieldTree<NameValueItem<ClipperSort>, string | number, "writable">;
|
|
648
652
|
/** Debounced stream of keyup events on the interval inputs (shorthand typing support). */
|
|
@@ -738,18 +742,40 @@ declare class ClipperBrowserComponent extends ClipperSearchResultManager {
|
|
|
738
742
|
*/
|
|
739
743
|
protected clearFilter(): void;
|
|
740
744
|
/**
|
|
741
|
-
*
|
|
742
|
-
*
|
|
745
|
+
* Builds the filter form model from a set of search parameters.
|
|
746
|
+
*
|
|
747
|
+
* Ad-hoc because the two publication ranges do not map field-to-field: the DTO keeps
|
|
748
|
+
* them as `fromDate`/`toDate`, and a range is only restored when both of its bounds
|
|
749
|
+
* are set, exactly as the saved filters were written.
|
|
750
|
+
*
|
|
751
|
+
* @param dto - The search parameters to read: the live `filterParams` on a state
|
|
752
|
+
* restore, or the deserialized data of a saved filter.
|
|
753
|
+
* @returns A fresh form model; the caller decides what to keep of the current one.
|
|
743
754
|
*/
|
|
744
|
-
private
|
|
755
|
+
private toForm;
|
|
756
|
+
/**
|
|
757
|
+
* Builds the search payload out of the filter model, normalizing empty values back to
|
|
758
|
+
* the undefined-based convention of {@link ClipperSearchParams}.
|
|
759
|
+
*
|
|
760
|
+
* Ad-hoc for two reasons. The two publication ranges are not payload fields: they
|
|
761
|
+
* reach the DTO as `fromDate`/`toDate` through {@link loadFilter} and
|
|
762
|
+
* {@link prepareFetch}. And every key has to be listed, `undefined` included, because
|
|
763
|
+
* `filterParams` is a long-lived object — reused across searches and serialized into
|
|
764
|
+
* saved filters — so a field the user has just emptied must be overwritten, not
|
|
765
|
+
* merely left out of the copy the way {@link DtoUtils.toPayload} does.
|
|
766
|
+
*
|
|
767
|
+
* @returns The subset of the search parameters the filter pane owns.
|
|
768
|
+
*/
|
|
769
|
+
private toPayload;
|
|
745
770
|
/**
|
|
746
771
|
* Commits the form model to filterParams before the component state is serialised.
|
|
747
772
|
*/
|
|
748
773
|
protected onStateSaving(): void;
|
|
749
774
|
/**
|
|
750
775
|
* Rebuilds the form model from filterParams after a state restore.
|
|
751
|
-
* The publication intervals are intentionally not rebuilt
|
|
752
|
-
* matching the historical behavior where the range
|
|
776
|
+
* The publication intervals are intentionally not rebuilt here — filterParams carries
|
|
777
|
+
* no fromDate/toDate at this point — matching the historical behavior where the range
|
|
778
|
+
* inputs were not restored.
|
|
753
779
|
*/
|
|
754
780
|
protected onStateRestored(): void;
|
|
755
781
|
/**
|
|
@@ -1344,27 +1370,57 @@ declare class ClipperSearchFreeTextHelpComponent {
|
|
|
1344
1370
|
interface SearchFreeTextQueryParams {
|
|
1345
1371
|
query: string;
|
|
1346
1372
|
}
|
|
1373
|
+
/**
|
|
1374
|
+
* Form model of the free-text query builder: one field per query operator.
|
|
1375
|
+
*
|
|
1376
|
+
* The DTO ({@link SearchFreeTextQueryParams}) is not a projection of this model — it
|
|
1377
|
+
* carries the single Lucene-style expression assembled out of the five fields — which
|
|
1378
|
+
* is why {@link ClipperSearchFreeTextQueryBuilderComponent.toPayload} is ad-hoc.
|
|
1379
|
+
*/
|
|
1380
|
+
interface SearchFreeTextQueryForm {
|
|
1381
|
+
/** Exact phrase to look for; `''` when the input is empty. */
|
|
1382
|
+
queryPhrase: string;
|
|
1383
|
+
/** Comma-separated words that must all appear; `''` when the input is empty. */
|
|
1384
|
+
queryAnd: string;
|
|
1385
|
+
/** Comma-separated words of which at least one must appear; `''` when the input is empty. */
|
|
1386
|
+
queryOr: string;
|
|
1387
|
+
/** Prefix the document must start with; `''` when the input is empty. */
|
|
1388
|
+
queryStart: string;
|
|
1389
|
+
/** Comma-separated words that must not appear; `''` when the input is empty. */
|
|
1390
|
+
queryNot: string;
|
|
1391
|
+
}
|
|
1347
1392
|
declare class ClipperSearchFreeTextQueryBuilderComponent {
|
|
1348
1393
|
readonly done: _angular_core.OutputEmitterRef<SearchFreeTextQueryParams>;
|
|
1349
1394
|
private readonly dialogService;
|
|
1350
1395
|
/** Model backing the signal form: one entry per query operator field. */
|
|
1351
1396
|
private readonly model;
|
|
1397
|
+
/**
|
|
1398
|
+
* Builds the form model. The builder always opens empty, so the model is the neutral
|
|
1399
|
+
* one; it also serves as what the "clear" button restores.
|
|
1400
|
+
* @returns A fresh form model.
|
|
1401
|
+
*/
|
|
1402
|
+
private toForm;
|
|
1403
|
+
/**
|
|
1404
|
+
* Assembles the Lucene-style free-text query out of the five operator fields.
|
|
1405
|
+
*
|
|
1406
|
+
* Ad-hoc because the payload is not a projection of the model: every field
|
|
1407
|
+
* contributes a differently shaped fragment (a quoted phrase, `+` terms, a `*`
|
|
1408
|
+
* wildcard, `-` exclusions) to one single string.
|
|
1409
|
+
* @returns The query to emit, or `undefined` when only the exclusion operator was
|
|
1410
|
+
* filled in, which cannot produce a valid query on its own.
|
|
1411
|
+
*/
|
|
1412
|
+
private toPayload;
|
|
1352
1413
|
/** Signal form for the query fields; every field is capped at 200 characters. */
|
|
1353
|
-
protected readonly form: _angular_forms_signals.FieldTree<
|
|
1354
|
-
queryPhrase: string;
|
|
1355
|
-
queryAnd: string;
|
|
1356
|
-
queryOr: string;
|
|
1357
|
-
queryStart: string;
|
|
1358
|
-
queryNot: string;
|
|
1359
|
-
}, string | number, "writable">;
|
|
1414
|
+
protected readonly form: _angular_forms_signals.FieldTree<SearchFreeTextQueryForm, string | number, "writable">;
|
|
1360
1415
|
/**
|
|
1361
1416
|
* Resets all query fields to empty strings.
|
|
1362
1417
|
*/
|
|
1363
1418
|
protected clear(): void;
|
|
1364
1419
|
/**
|
|
1365
|
-
*
|
|
1366
|
-
*
|
|
1367
|
-
*
|
|
1420
|
+
* Emits the assembled free-text query via `done`.
|
|
1421
|
+
*
|
|
1422
|
+
* Shows an error dialog when only the NOT operator has been filled in, since it
|
|
1423
|
+
* requires at least one positive term to produce a valid query.
|
|
1368
1424
|
*/
|
|
1369
1425
|
protected ok(): void;
|
|
1370
1426
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<ClipperSearchFreeTextQueryBuilderComponent, never>;
|