@geosdi/ngx-ui 0.0.0-stage → 1.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geosdi-ngx-ui.mjs","names":["nextId","nextId","POSITIONS","nextId","nextId","i1","nextId","POSITIONS","nextId","POSITIONS","i1","nextId","nextId","nextId","POSITIONS","nextId","NARROW","sameDay"],"sources":["../../../../projects/geosdi/components/ngx-ui/src/lib/button/button.directive.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/input-text/input-text.directive.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/checkbox/checkbox.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/tooltip/tooltip.directive.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/dialog/dialog-options.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/dialog/dialog-container.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/dialog/dialog.service.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/dialog/dialog.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/toast/toast.store.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/toast/toast.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/confirm/confirm.service.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/select/select-options.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/overlay/scroll-follower.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/select/select.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/floatlabel/floatlabel.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/inputnumber/number-format.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/inputnumber/inputnumber.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/toggleswitch/toggleswitch.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/slider/slider.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/selectbutton/selectbutton.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/radiobutton/radiobutton.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/popover/popover.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/drawer/drawer.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/spinner/spinner.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/tabs/tabs.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/accordion/accordion.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/autocomplete/autocomplete.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/paginator/paginator.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/cascadeselect/cascadeselect.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/datepicker/calendar.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/datepicker/datepicker.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/tree/tree.component.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/table/table-filter.ts","../../../../projects/geosdi/components/ngx-ui/src/lib/table/table.component.ts"],"sourcesContent":["import {\n Directive,\n booleanAttribute,\n input,\n InputSignal,\n InputSignalWithTransform,\n} from \"@angular/core\";\n\n/** I colori disponibili per un pulsante. */\nexport type ButtonSeverity =\n \"primary\" | \"secondary\" | \"success\" | \"info\" | \"warn\" | \"danger\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Directive({\n selector: \"button[mlButton], a[mlButton]\",\n host: {\n class: \"ml-button\",\n \"[attr.data-severity]\": \"severity()\",\n \"[class.ml-button--outlined]\": \"outlined()\",\n \"[class.ml-button--text]\": \"text()\",\n \"[class.ml-button--rounded]\": \"rounded()\",\n \"[class.ml-button--icon-only]\": \"iconOnly()\",\n \"[class.ml-button--small]\": \"size() === 'small'\",\n },\n})\nexport class ButtonDirective {\n readonly severity: InputSignal<ButtonSeverity> =\n input<ButtonSeverity>(\"primary\");\n /** Solo il bordo, sul fondo della pagina. */\n readonly outlined: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** Né fondo né bordo : un comando discreto. */\n readonly text: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n readonly rounded: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** La sola icona : quadrato, e il nome va nell'`aria-label`. */\n readonly iconOnly: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly size: InputSignal<\"small\" | \"normal\"> = input<\"small\" | \"normal\">(\n \"normal\",\n );\n}\n","import {\n AfterContentInit,\n DestroyRef,\n Directive,\n ElementRef,\n WritableSignal,\n inject,\n signal,\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { NgControl } from \"@angular/forms\";\n\n/**\n * Con un valore porta anche `ml-input--filled`, che `ml-floatlabel`\n * guarda per alzare l'etichetta : senza, resterebbe sopra il valore.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Directive({\n selector: \"input[mlInputText], textarea[mlInputText]\",\n host: {\n class: \"ml-input\",\n \"[class.ml-input--filled]\": \"filled()\",\n \"(input)\": \"sync()\",\n },\n})\nexport class InputTextDirective implements AfterContentInit {\n protected readonly filled: WritableSignal<boolean> = signal(false);\n private readonly host: ElementRef<HTMLInputElement | HTMLTextAreaElement> =\n inject(ElementRef);\n private readonly control: NgControl | null = inject(NgControl, {\n self: true,\n optional: true,\n });\n private readonly destroyRef: DestroyRef = inject(DestroyRef);\n\n // Da Angular 22 i componenti sono OnPush di serie : una scrittura della\n // form fatta da codice (il `patchValue` quando arriva la mappa) non\n // ridisegnerebbe il binding. Il signal sì, ovunque lo si scriva. Il\n // controllo della form c'è solo da qui : prima `formControlName` non l'ha\n // ancora creato.\n ngAfterContentInit(): void {\n this.sync();\n this.control?.valueChanges\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((value: unknown) =>\n this.filled.set(value != null && value !== \"\"),\n );\n }\n\n protected sync(): void {\n this.filled.set(this.host.nativeElement.value !== \"\");\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n output,\n signal,\n Signal,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\nlet nextId: number = 0;\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-checkbox\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-checkbox\",\n \"[class.ml-checkbox--checked]\": \"checked()\",\n \"[class.ml-checkbox--disabled]\": \"isDisabled()\",\n },\n template: `\n <input\n (blur)=\"onTouched()\"\n (change)=\"toggle($event)\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [id]=\"id()\"\n class=\"ml-checkbox__input\"\n type=\"checkbox\"\n />\n <span aria-hidden=\"true\" class=\"ml-checkbox__box\">\n <svg viewBox=\"0 0 16 16\" focusable=\"false\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </span>\n `,\n})\nexport class CheckboxComponent implements ControlValueAccessor {\n /** L'`id` della casella vera, per il `label for`. */\n readonly inputId: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n /** Spenta da fuori, senza una form ; con una form vale la sua. */\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** Il valore nuovo, a ogni clic. */\n readonly changed: OutputEmitterRef<boolean> = output<boolean>();\n\n protected readonly checked: WritableSignal<boolean> =\n signal<boolean>(false);\n private readonly formDisabled: WritableSignal<boolean> =\n signal<boolean>(false);\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n private readonly fallbackId: string = `ml-checkbox-${nextId++}`;\n protected readonly id: Signal<string> = computed(\n () => this.inputId() || this.fallbackId,\n );\n\n private onChange: (value: boolean) => void = () => undefined;\n protected onTouched: () => void = () => undefined;\n\n protected toggle(event: Event): void {\n const value: boolean = (event.target as HTMLInputElement).checked;\n this.checked.set(value);\n this.onChange(value);\n this.changed.emit(value);\n }\n\n writeValue(value: unknown): void {\n this.checked.set(value === true);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n booleanAttribute,\n inject,\n input,\n} from \"@angular/core\";\nimport { ConnectedPosition, Overlay, OverlayRef } from \"@angular/cdk/overlay\";\nimport { ComponentPortal } from \"@angular/cdk/portal\";\n\n/** Da che parte del comando esce il suggerimento. */\nexport type TooltipPosition = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nlet nextId: number = 0;\n\n/** Le posizioni del suggerimento, la preferita per prima e l'opposta come ripiego. */\nconst POSITIONS: Record<TooltipPosition, ConnectedPosition[]> = {\n top: [\n {\n originX: \"center\",\n originY: \"top\",\n overlayX: \"center\",\n overlayY: \"bottom\",\n offsetY: -8,\n },\n {\n originX: \"center\",\n originY: \"bottom\",\n overlayX: \"center\",\n overlayY: \"top\",\n offsetY: 8,\n },\n ],\n bottom: [\n {\n originX: \"center\",\n originY: \"bottom\",\n overlayX: \"center\",\n overlayY: \"top\",\n offsetY: 8,\n },\n {\n originX: \"center\",\n originY: \"top\",\n overlayX: \"center\",\n overlayY: \"bottom\",\n offsetY: -8,\n },\n ],\n left: [\n {\n originX: \"start\",\n originY: \"center\",\n overlayX: \"end\",\n overlayY: \"center\",\n offsetX: -8,\n },\n {\n originX: \"end\",\n originY: \"center\",\n overlayX: \"start\",\n overlayY: \"center\",\n offsetX: 8,\n },\n ],\n right: [\n {\n originX: \"end\",\n originY: \"center\",\n overlayX: \"start\",\n overlayY: \"center\",\n offsetX: 8,\n },\n {\n originX: \"start\",\n originY: \"center\",\n overlayX: \"end\",\n overlayY: \"center\",\n offsetX: -8,\n },\n ],\n};\n\n@Component({\n selector: \"ml-tooltip-bubble\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-tooltip\",\n role: \"tooltip\",\n \"[id]\": \"id\",\n },\n template: `{{ text }}`,\n})\nexport class TooltipBubbleComponent {\n text: string = \"\";\n id: string = \"\";\n}\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Directive({\n selector: \"[mlTooltip]\",\n host: {\n \"(mouseenter)\": \"schedule()\",\n \"(mouseleave)\": \"hide()\",\n \"(focusin)\": \"focused()\",\n \"(focusout)\": \"hide()\",\n \"(touchstart)\": \"touched()\",\n \"(keydown.escape)\": \"hide()\",\n // Un clic o un cambio di pagina chiudono : una pagina riusata dal\n // router viene staccata e non distrutta, e il mouse non ne esce mai.\n \"(click)\": \"hide()\",\n \"(window:hashchange)\": \"hide()\",\n \"(window:popstate)\": \"hide()\",\n },\n})\nexport class TooltipDirective {\n /** Il testo ; vuoto, niente suggerimento. */\n readonly text: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >(\"\", { alias: \"mlTooltip\" });\n readonly tooltipPosition: InputSignal<TooltipPosition> =\n input<TooltipPosition>(\"top\");\n readonly tooltipDisabled: InputSignalWithTransform<boolean, unknown> =\n input(false, { transform: booleanAttribute });\n /** Al tocco : vero si chiude da sé, falso resta finché non si tocca altrove. */\n readonly autoHide: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n /** Solo se il testo dell'elemento è troncato (con i puntini) : altrimenti si legge già. */\n readonly showOnEllipsis: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n\n private readonly overlay: Overlay = inject(Overlay);\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly bubbleId: string = `ml-tooltip-${nextId++}`;\n private ref?: OverlayRef;\n private timer?: ReturnType<typeof setTimeout>;\n private readonly outside = (event: Event): void => {\n if (!this.host.nativeElement.contains(event.target as Node)) {\n this.hide();\n }\n };\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.hide());\n }\n\n /** Col mouse si aspetta un attimo : non si accende su ogni pulsante attraversato. */\n protected schedule(): void {\n clearTimeout(this.timer);\n this.timer = setTimeout(() => this.show(), 300);\n }\n\n /**\n * Al fuoco solo se si vede, cioè da tastiera : quando lo rimette il codice\n * — una finestra che si chiude lo restituisce al pulsante che l'ha aperta\n * — la bolla resterebbe accesa senza che nessuno l'abbia chiesta.\n */\n protected focused(): void {\n if (this.host.nativeElement.matches(\":focus-visible\")) this.show();\n }\n\n protected touched(): void {\n if (this.autoHide()) return;\n this.show();\n document.addEventListener(\"touchstart\", this.outside, {\n capture: true,\n });\n }\n\n show(): void {\n clearTimeout(this.timer);\n const text: string = (this.text() ?? \"\").trim();\n if (this.ref || !text || this.tooltipDisabled()) return;\n const el: HTMLElement = this.host.nativeElement;\n if (this.showOnEllipsis() && el.scrollWidth <= el.clientWidth) return;\n this.ref = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(POSITIONS[this.tooltipPosition()])\n .withPush(true)\n .withViewportMargin(8),\n scrollStrategy: this.overlay.scrollStrategies.close(),\n panelClass: \"ml-tooltip-pane\",\n });\n const bubble: ComponentRef<TooltipBubbleComponent> = this.ref.attach(\n new ComponentPortal(TooltipBubbleComponent),\n );\n bubble.instance.text = text;\n bubble.instance.id = this.bubbleId;\n bubble.changeDetectorRef.detectChanges();\n this.host.nativeElement.setAttribute(\"aria-describedby\", this.bubbleId);\n }\n\n hide(): void {\n clearTimeout(this.timer);\n document.removeEventListener(\"touchstart\", this.outside, {\n capture: true,\n });\n if (!this.ref) return;\n this.ref.dispose();\n this.ref = undefined;\n this.host.nativeElement.removeAttribute(\"aria-describedby\");\n }\n}\n","import { DialogRef as CdkDialogRef } from \"@angular/cdk/dialog\";\nimport { Observable } from \"rxjs\";\n\nexport interface DialogOptions<D = unknown> {\n header?: string;\n /** Di serie vero. */\n showHeader?: boolean;\n /** La X in alto a destra. */\n closable?: boolean;\n /** Di serie vero. */\n closeOnEscape?: boolean;\n /** Il clic sulla maschera chiude ; di serie no. */\n dismissableMask?: boolean;\n width?: string;\n height?: string;\n /** Stile del riquadro della finestra. */\n style?: Record<string, string>;\n /**\n * Larghezze per misura dello schermo, `{ \"1279px\": \"95vw\" }` : vale la\n * prima soglia che la finestra non supera.\n */\n breakpoints?: Record<string, string>;\n /** Classe del riquadro. */\n styleClass?: string;\n /** Quello che la finestra riceve in {@link DialogConfig}. */\n data?: D;\n}\n\nexport class DialogConfig<D = any> {\n data?: D;\n header?: string;\n}\n\nexport class DialogRef<R = any> {\n /**\n * Emette una volta, alla chiusura : col valore passato a {@link close}, o\n * `undefined` se la si è chiusa con la X, con ESC o dalla maschera.\n */\n readonly onClose: Observable<R | undefined>;\n\n constructor(private readonly cdkRef: CdkDialogRef<R, any>) {\n this.onClose = cdkRef.closed;\n }\n\n close(result?: R): void {\n this.cdkRef.close(result);\n }\n\n /** Chiude la finestra senza restituire un valore. */\n destroy(): void {\n this.cdkRef.close();\n }\n}\n\n/**\n * La larghezza che i `breakpoints` danno alla misura attuale dello schermo, o\n * `undefined` se nessuna soglia vale.\n */\nexport function breakpointWidth(\n breakpoints: Record<string, string> | undefined,\n viewportWidth: number,\n): string | undefined {\n if (!breakpoints) return undefined;\n const steps: [number, string][] = Object.entries(breakpoints)\n .map(([max, width]): [number, string] => [parseFloat(max), width])\n .filter(([max]) => !Number.isNaN(max))\n .sort((a, b) => a[0] - b[0]);\n return steps.find(([max]) => viewportWidth <= max)?.[1];\n}\n","import { CdkDialogContainer } from \"@angular/cdk/dialog\";\nimport { CdkPortalOutlet } from \"@angular/cdk/portal\";\nimport { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { DialogOptions } from \"./dialog-options\";\n\nlet nextId: number = 0;\n\n/**\n * La cornice delle finestre aperte da {@link DialogService} : intestazione col\n * titolo e la X, e sotto il componente. È il contenitore del dialog del CDK,\n * quindi tiene da lui il fuoco intrappolato, i ruoli aria e il ritorno del\n * fuoco alla chiusura.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-dialog-container\",\n imports: [CdkPortalOutlet],\n // Il contenitore riceve configurazione e callback dal servizio dopo la creazione.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n host: { class: \"ml-dialog ml-dialog--overlay\" },\n template: `\n @if (options.showHeader !== false) {\n <div class=\"ml-dialog__header\">\n <h2 class=\"ml-dialog__title\" [id]=\"titleId\">\n {{ options.header }}\n </h2>\n @if (options.closable) {\n <button\n (click)=\"closeFn?.()\"\n aria-label=\"Chiudi\"\n class=\"ml-dialog__close\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-times\"></i>\n </button>\n }\n </div>\n }\n <div class=\"ml-dialog__content\">\n <ng-template cdkPortalOutlet />\n </div>\n `,\n})\nexport class DialogContainerComponent extends CdkDialogContainer {\n protected readonly titleId: string = `ml-dialog-title-${nextId++}`;\n /** La chiusura : la scrive il servizio, che ha in mano il riferimento. */\n closeFn?: () => void;\n\n constructor() {\n super();\n if (this.options.header && this.options.showHeader !== false) {\n this._ariaLabelledByQueue.push(this.titleId);\n }\n }\n\n // Le opzioni viaggiano nei dati del dialog del CDK : quelli del chiamante\n // li riceve il componente da `DialogConfig`, non da qui.\n protected get options(): DialogOptions {\n return (this._config.data as DialogOptions | null) ?? {};\n }\n}\n","import { Dialog, DialogRef as CdkDialogRef } from \"@angular/cdk/dialog\";\nimport { Injectable, Type, inject } from \"@angular/core\";\nimport { filter } from \"rxjs\";\nimport { DialogContainerComponent } from \"./dialog-container.component\";\nimport {\n DialogConfig,\n DialogOptions,\n DialogRef,\n breakpointWidth,\n} from \"./dialog-options\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Injectable({ providedIn: \"root\" })\nexport class DialogService {\n private readonly dialog: Dialog = inject(Dialog);\n\n /**\n * @param component il componente da mostrare : trova nell'iniettore\n * {@link DialogConfig} (i dati) e {@link DialogRef} (per chiudersi)\n * @param options vedi {@link DialogOptions}\n */\n open<C, R = any>(\n component: Type<C>,\n options: DialogOptions = {},\n ): DialogRef<R> {\n let ref: DialogRef<R> | undefined;\n const config: DialogConfig = {\n data: options.data,\n header: options.header,\n };\n const style: Record<string, string> = options.style ?? {};\n const cdkRef: CdkDialogRef<R, C> = this.dialog.open<R, unknown, C>(\n component,\n {\n container: DialogContainerComponent,\n data: options,\n // ESC e maschera li decide la finestra, qui sotto : il\n // dialog del CDK li legherebbe insieme.\n disableClose: true,\n hasBackdrop: true,\n backdropClass: \"ml-dialog-backdrop\",\n panelClass: [\"ml-dialog-pane\", options.styleClass ?? \"\"],\n\n autoFocus: \"dialog\",\n width:\n breakpointWidth(options.breakpoints, window.innerWidth) ??\n style[\"width\"] ??\n options.width,\n height: style[\"height\"] ?? options.height,\n maxWidth: style[\"maxWidth\"] ?? \"calc(100vw - 2rem)\",\n providers: (cdk: CdkDialogRef<R, C>) => {\n ref = new DialogRef<R>(cdk);\n return [\n { provide: DialogConfig, useValue: config },\n { provide: DialogRef, useValue: ref },\n ];\n },\n },\n );\n const container: DialogContainerComponent =\n cdkRef.containerInstance as DialogContainerComponent;\n container.closeFn = () => cdkRef.close();\n if (options.closeOnEscape !== false) {\n cdkRef.keydownEvents\n .pipe(filter((event: KeyboardEvent) => event.key === \"Escape\"))\n .subscribe(() => cdkRef.close());\n }\n if (options.dismissableMask) {\n cdkRef.backdropClick.subscribe(() => cdkRef.close());\n }\n return ref ?? new DialogRef<R>(cdkRef);\n }\n\n /** Chiude tutte le finestre aperte da questo servizio. */\n closeAll(): void {\n this.dialog.closeAll();\n }\n}\n","import { A11yModule } from \"@angular/cdk/a11y\";\nimport { NgStyle, NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n WritableSignal,\n booleanAttribute,\n computed,\n contentChild,\n effect,\n input,\n model,\n output,\n signal,\n untracked,\n} from \"@angular/core\";\nimport { breakpointWidth } from \"./dialog-options\";\n\nlet nextId: number = 0;\n\n/**\n * L'intestazione è il titolo `header`, oppure un `<ng-template #header>` ;\n * il piede un `<ng-template #footer>`. Il contenuto è quello fra i tag.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-dialog\",\n imports: [A11yModule, NgStyle, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { \"(window:resize)\": \"resized()\" },\n template: `\n @if (visible()) {\n <div\n (click)=\"maskClicked($event)\"\n [class.ml-dialog-mask--modal]=\"modal()\"\n class=\"ml-dialog-mask\"\n >\n <div\n (keydown.escape)=\"escape($event)\"\n [attr.aria-labelledby]=\"showHeader() ? titleId : null\"\n [cdkTrapFocusAutoCapture]=\"focusOnShow()\"\n [ngStyle]=\"panelStyle()\"\n aria-modal=\"true\"\n cdkTrapFocus\n class=\"ml-dialog\"\n role=\"dialog\"\n tabindex=\"-1\"\n >\n @if (showHeader()) {\n <div class=\"ml-dialog__header\" [id]=\"titleId\">\n @if (headerTemplate(); as tpl) {\n <ng-container *ngTemplateOutlet=\"tpl\" />\n } @else {\n <h2 class=\"ml-dialog__title\">{{ header() }}</h2>\n }\n @if (closable()) {\n <button\n (click)=\"close()\"\n aria-label=\"Chiudi\"\n class=\"ml-dialog__close\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-times\"\n ></i>\n </button>\n }\n </div>\n }\n <div class=\"ml-dialog__content\">\n <ng-content />\n </div>\n @if (footerTemplate(); as tpl) {\n <div class=\"ml-dialog__footer\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </div>\n }\n </div>\n </div>\n }\n `,\n})\nexport class DialogComponent {\n readonly visible: ModelSignal<boolean> = model(false);\n readonly header: InputSignal<string | undefined> = input<string>();\n readonly showHeader: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n readonly closable: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n readonly closeOnEscape: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n readonly dismissableMask: InputSignalWithTransform<boolean, unknown> =\n input(false, { transform: booleanAttribute });\n readonly modal: InputSignalWithTransform<boolean, unknown> = input(true, {\n transform: booleanAttribute,\n });\n /** Il fuoco al primo elemento all'apertura ; falso, resta alla finestra. */\n readonly focusOnShow: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n readonly style: InputSignal<Record<string, string> | undefined> =\n input<Record<string, string>>();\n readonly breakpoints: InputSignal<Record<string, string> | undefined> =\n input<Record<string, string>>();\n /** Alla chiusura, da qualunque parte arrivi. */\n readonly closed: OutputEmitterRef<void> = output<void>();\n\n protected readonly headerTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"header\");\n protected readonly footerTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"footer\");\n protected readonly titleId: string = `ml-dialog-${nextId++}`;\n protected readonly viewport: WritableSignal<number> = signal(\n window.innerWidth,\n );\n protected readonly panelStyle: Signal<Record<string, string>> = computed(\n () => {\n const width: string | undefined = breakpointWidth(\n this.breakpoints(),\n this.viewport(),\n );\n return { ...(this.style() ?? {}), ...(width ? { width } : {}) };\n },\n );\n private wasVisible: boolean = false;\n\n constructor() {\n effect(() => {\n const visible: boolean = this.visible();\n untracked(() => {\n if (this.wasVisible && !visible) this.closed.emit();\n this.wasVisible = visible;\n });\n });\n }\n\n protected resized(): void {\n this.viewport.set(window.innerWidth);\n }\n\n close(): void {\n this.visible.set(false);\n }\n\n protected escape(event: Event): void {\n if (!this.closeOnEscape()) return;\n event.stopPropagation();\n this.close();\n }\n\n protected maskClicked(event: MouseEvent): void {\n if (this.dismissableMask() && event.target === event.currentTarget) {\n this.close();\n }\n }\n}\n","import { Injectable, Signal, WritableSignal, signal } from \"@angular/core\";\n\nexport type ToastSeverity = \"success\" | \"info\" | \"warn\" | \"error\";\n\n/** Un avviso : il testo è già tradotto. */\nexport interface ToastMessage {\n id: number;\n severity: ToastSeverity;\n detail: string;\n}\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Injectable({ providedIn: \"root\" })\nexport class ToastStore {\n /** Durata di visualizzazione di un avviso. */\n static readonly LIFE_MS: number = 3000;\n\n private nextId: number = 0;\n private readonly list: WritableSignal<ToastMessage[]> = signal([]);\n readonly messages: Signal<ToastMessage[]> = this.list.asReadonly();\n\n add(\n severity: ToastSeverity,\n detail: string,\n life: number = ToastStore.LIFE_MS,\n ): void {\n const id: number = this.nextId++;\n this.list.update((list: ToastMessage[]) => [\n ...list,\n { id, severity, detail },\n ]);\n setTimeout(() => this.remove(id), life);\n }\n\n remove(id: number): void {\n this.list.update((list: ToastMessage[]) =>\n list.filter((m: ToastMessage) => m.id !== id),\n );\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from \"@angular/core\";\nimport { ToastStore, ToastSeverity } from \"./toast.store\";\n\nconst ICONS: Record<ToastSeverity, string> = {\n success: \"ml-icon-check-circle\",\n info: \"ml-icon-info-circle\",\n warn: \"ml-icon-exclamation-triangle\",\n error: \"ml-icon-times-circle\",\n};\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-toast\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: \"ml-toast-stack\" },\n template: `\n @for (m of store.messages(); track m.id) {\n <div\n [attr.data-severity]=\"m.severity\"\n [attr.role]=\"m.severity === 'error' ? 'alert' : 'status'\"\n class=\"ml-toast\"\n >\n <i\n [class]=\"'ml-icon ' + icons[m.severity]\"\n aria-hidden=\"true\"\n ></i>\n <span class=\"ml-toast__text\">{{ m.detail }}</span>\n <button\n (click)=\"store.remove(m.id)\"\n aria-label=\"Chiudi\"\n class=\"ml-toast__close\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-times\"></i>\n </button>\n </div>\n }\n `,\n})\nexport class ToastComponent {\n protected readonly store: ToastStore = inject(ToastStore);\n protected readonly icons: Record<ToastSeverity, string> = ICONS;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n inject,\n} from \"@angular/core\";\nimport { ButtonDirective } from \"../button/button.directive\";\nimport { DialogService } from \"../dialog/dialog.service\";\nimport { DialogConfig, DialogRef } from \"../dialog/dialog-options\";\n\n/** Che cosa chiedere, e che cosa fare alla risposta. */\nexport interface ConfirmOptions {\n message: string;\n header?: string;\n /** Al «Sì». */\n accept?: () => void;\n /** Al «No», e anche alla X e a ESC : non si è confermato niente. */\n reject?: () => void;\n acceptLabel?: string;\n rejectLabel?: string;\n}\n\n/**\n * Il corpo della finestra di conferma : il messaggio e i due pulsanti.\n */\n@Component({\n selector: \"ml-confirm\",\n imports: [ButtonDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <p class=\"ml-confirm__message\">{{ options.message }}</p>\n <div class=\"ml-confirm__actions\">\n <button\n (click)=\"ref.close(false)\"\n mlButton\n outlined\n severity=\"secondary\"\n type=\"button\"\n >\n {{ options.rejectLabel ?? \"No\" }}\n </button>\n <button (click)=\"ref.close(true)\" mlButton type=\"button\">\n {{ options.acceptLabel ?? \"Sì\" }}\n </button>\n </div>\n `,\n})\nexport class ConfirmComponent {\n protected readonly options: ConfirmOptions =\n inject<DialogConfig<ConfirmOptions>>(DialogConfig).data ??\n ({ message: \"\" } as ConfirmOptions);\n protected readonly ref: DialogRef<boolean> = inject(DialogRef);\n}\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Injectable({ providedIn: \"root\" })\nexport class ConfirmService {\n private readonly dialog: DialogService = inject(DialogService);\n\n confirm(options: ConfirmOptions): void {\n this.dialog\n .open<ConfirmComponent, boolean>(ConfirmComponent, {\n header: options.header ?? \"Conferma\",\n closable: true,\n width: \"34rem\",\n styleClass: \"ml-confirm\",\n data: options,\n })\n .onClose.subscribe((accepted: boolean | undefined) =>\n accepted ? options.accept?.() : options.reject?.(),\n );\n }\n}\n","/**\n * Le regole delle voci di una tendina, senza Angular : si provano da sole.\n *\n * Una voce può essere un valore semplice (una stringa, un numero : etichetta\n * e valore sono lei) o un oggetto, di cui `optionLabel` e `optionValue`\n * dicono quali campi leggere. Senza `optionValue` il valore è l'oggetto.\n */\n\n/** Il valore di un campo dell'oggetto, anche annidato (`a.b`). */\nexport function fieldOf(option: unknown, field: string | undefined): unknown {\n if (!field || option === null || typeof option !== \"object\") return option;\n return field\n .split(\".\")\n .reduce(\n (o: unknown, k: string) =>\n o && typeof o === \"object\"\n ? (o as Record<string, unknown>)[k]\n : undefined,\n option,\n );\n}\n\nexport function labelOf(option: unknown, optionLabel?: string): string {\n const label: unknown = optionLabel\n ? fieldOf(option, optionLabel)\n : option !== null && typeof option === \"object\"\n ? ((option as Record<string, unknown>)[\"label\"] ?? option)\n : option;\n return label === null || label === undefined ? \"\" : String(label);\n}\n\nexport function valueOf(option: unknown, optionValue?: string): unknown {\n return optionValue ? fieldOf(option, optionValue) : option;\n}\n\n/**\n * Due valori sono lo stesso valore : uguali, o oggetti con lo stesso\n * contenuto. Le form a volte rileggono un oggetto uguale e non lo stesso.\n */\nexport function sameValue(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (\n a === null ||\n b === null ||\n typeof a !== \"object\" ||\n typeof b !== \"object\"\n ) {\n return false;\n }\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n}\n\n/** Una riga del pannello : l'intestazione di un gruppo o una voce. */\nexport type SelectRow =\n | { kind: \"group\"; group: unknown; label: string }\n | {\n kind: \"option\";\n option: unknown;\n label: string;\n value: unknown;\n index: number;\n };\n\nexport interface RowsSpec {\n options: readonly unknown[];\n optionLabel?: string;\n optionValue?: string;\n group?: boolean;\n optionGroupLabel?: string;\n optionGroupChildren?: string;\n /** Il testo cercato ; vuoto, tutte. */\n query?: string;\n /** I campi su cui cercare, separati da virgole ; di serie l'etichetta. */\n filterBy?: string;\n}\n\n/**\n * Le righe del pannello, con i gruppi e la ricerca applicati. `index` numera\n * le sole voci, ed è quello che la tastiera percorre. Un gruppo senza voci\n * rimaste dopo la ricerca non si mostra.\n */\nexport function rowsOf(spec: RowsSpec): SelectRow[] {\n const query: string = (spec.query ?? \"\").trim().toLocaleLowerCase();\n const fields: string[] | undefined = spec.filterBy\n ?.split(\",\")\n .map((f: string) => f.trim())\n .filter(Boolean);\n const matches = (option: unknown, label: string): boolean =>\n !query ||\n (fields?.length\n ? fields.map((f: string) => String(fieldOf(option, f) ?? \"\"))\n : [label]\n ).some((text: string) => text.toLocaleLowerCase().includes(query));\n\n const rows: SelectRow[] = [];\n let index: number = 0;\n const push = (option: unknown): void => {\n const label: string = labelOf(option, spec.optionLabel);\n if (!matches(option, label)) return;\n rows.push({\n kind: \"option\",\n option,\n label,\n value: valueOf(option, spec.optionValue),\n index: index++,\n });\n };\n for (const entry of spec.options ?? []) {\n if (!spec.group) {\n push(entry);\n continue;\n }\n const children: unknown = fieldOf(\n entry,\n spec.optionGroupChildren ?? \"items\",\n );\n const before: number = rows.length;\n rows.push({\n kind: \"group\",\n group: entry,\n label: labelOf(entry, spec.optionGroupLabel ?? \"label\"),\n });\n (Array.isArray(children) ? children : []).forEach(push);\n if (rows.length === before + 1) rows.pop();\n }\n return rows;\n}\n","/**\n * Fa seguire al pannello di un overlay il suo campo, quando a scorrere è un\n * contenitore e non la finestra.\n *\n * Il CDK riposiziona un overlay agganciato solo quando scorrono la finestra o i\n * contenitori marcati `cdkScrollable`. Nel builder a scorrere è `.workspace`\n * (la pagina ha `overflow: hidden` per la mappa), e il pannello di una\n * tendina aperta restava fermo mentre il campo scorreva via. Si ascolta quindi\n * lo scorrimento di **qualunque** elemento, in cattura, finché il pannello è\n * aperto, e a ogni passo lo si riposiziona. Lo scorrimento dentro il pannello\n * stesso (l'elenco delle voci) non lo sposta, e riposizionarlo non costa niente.\n */\nexport class ScrollFollower {\n private listening: boolean = false;\n private readonly onScroll = (): void => this.reposition();\n\n constructor(private readonly reposition: () => void) {}\n\n start(): void {\n if (this.listening) return;\n this.listening = true;\n document.addEventListener(\"scroll\", this.onScroll, {\n capture: true,\n passive: true,\n });\n }\n\n stop(): void {\n if (!this.listening) return;\n this.listening = false;\n document.removeEventListener(\"scroll\", this.onScroll, {\n capture: true,\n });\n }\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ConnectedPosition,\n} from \"@angular/cdk/overlay\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n WritableSignal,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { ScrollFollower } from \"../overlay/scroll-follower\";\nimport { SelectRow, labelOf, rowsOf, sameValue } from \"./select-options\";\n\nlet nextId: number = 0;\n\n/** Sotto il campo, o sopra se sotto non c'è posto. */\nconst POSITIONS: ConnectedPosition[] = [\n {\n originX: \"start\",\n originY: \"bottom\",\n overlayX: \"start\",\n overlayY: \"top\",\n offsetY: 4,\n },\n {\n originX: \"start\",\n originY: \"top\",\n overlayX: \"start\",\n overlayY: \"bottom\",\n offsetY: -4,\n },\n];\n\n/** Oltre tante voci scelte, a video se ne dice il numero. */\nconst MAX_LABELS: number = 3;\n\ntype OptionRow = Extract<SelectRow, { kind: \"option\" }>;\n\n/**\n * Segue il modello combobox + listbox delle WAI-ARIA : il fuoco resta sul\n * campo (o sulla ricerca, a pannello aperto) e la voce attiva la indica\n * `aria-activedescendant`. Frecce, Home, Fine, Invio, Esc e Tab fanno quello\n * che ci si aspetta.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-select\",\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-select\",\n \"[class.ml-select--filled]\": \"filled()\",\n \"[class.ml-select--focus]\": \"focused() || open()\",\n \"[class.ml-select--disabled]\": \"isDisabled()\",\n \"[class.ml-select--small]\": \"size() === 'small'\",\n \"[class.ml-select--fluid]\": \"fluid()\",\n },\n template: `\n <div\n #origin=\"cdkOverlayOrigin\"\n #trigger\n (click)=\"toggle()\"\n [class]=\"styleClass() ?? ''\"\n cdkOverlayOrigin\n class=\"ml-select__trigger\"\n >\n @if (editable()) {\n <input\n #field\n (blur)=\"blurred()\"\n (focus)=\"focused.set(true)\"\n (input)=\"typed($any($event.target).value)\"\n (keydown)=\"keydown($event)\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-controls]=\"open() ? listId : null\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [disabled]=\"isDisabled()\"\n [id]=\"fieldId()\"\n [placeholder]=\"placeholder() ?? ''\"\n [value]=\"displayText()\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n class=\"ml-select__label ml-select__input\"\n role=\"combobox\"\n type=\"text\"\n />\n } @else {\n <span\n #field\n (blur)=\"blurred()\"\n (focus)=\"focused.set(true)\"\n (keydown)=\"keydown($event)\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-controls]=\"open() ? listId : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabel() ? null : labelledBy()\"\n [class.ml-select__placeholder]=\"!filled()\"\n [id]=\"fieldId()\"\n [tabindex]=\"isDisabled() ? -1 : 0\"\n aria-haspopup=\"listbox\"\n class=\"ml-select__label\"\n role=\"combobox\"\n >\n @if (filled() && selectedItemTemplate() && !multiple()) {\n <ng-container\n *ngTemplateOutlet=\"\n selectedItemTemplate()!;\n context: { $implicit: selectedOptions()[0] }\n \"\n />\n } @else {\n {{ displayText() || placeholder() || \"&nbsp;\" }}\n }\n </span>\n }\n @if (showClear() && filled() && !isDisabled()) {\n <button\n (click)=\"clear($event)\"\n aria-label=\"Svuota\"\n class=\"ml-select__clear\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-times\"></i>\n </button>\n }\n <span aria-hidden=\"true\" class=\"ml-select__arrow\">\n <i class=\"ml-icon ml-icon-chevron-down\"></i>\n </span>\n </div>\n\n <ng-template\n #connected=\"cdkConnectedOverlay\"\n (attach)=\"attached()\"\n (detach)=\"close()\"\n (overlayOutsideClick)=\"outsideClick($event)\"\n [cdkConnectedOverlayMinWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPanelClass]=\"[\n 'ml-select-pane',\n panelStyleClass() ?? '',\n ]\"\n [cdkConnectedOverlayPositions]=\"positions\"\n cdkConnectedOverlay\n >\n <div class=\"ml-select__panel\">\n @if (filter()) {\n <div class=\"ml-select__search\">\n <input\n #search\n (input)=\"query.set($any($event.target).value)\"\n (keydown)=\"keydown($event)\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-controls]=\"listId\"\n [value]=\"query()\"\n aria-autocomplete=\"list\"\n aria-label=\"Cerca\"\n autocomplete=\"off\"\n class=\"ml-input\"\n role=\"combobox\"\n aria-expanded=\"true\"\n type=\"search\"\n />\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-search\"\n ></i>\n </div>\n }\n <ul\n [attr.aria-multiselectable]=\"multiple() || null\"\n [id]=\"listId\"\n class=\"ml-select__list\"\n role=\"listbox\"\n >\n @for (row of rows(); track $index) {\n @if (row.kind === \"group\") {\n <li class=\"ml-select__group\" role=\"presentation\">\n @if (groupTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: row.group }\n \"\n />\n } @else {\n {{ row.label }}\n }\n </li>\n } @else {\n <li\n (click)=\"pick(row)\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"active.set(row.index)\"\n [attr.aria-selected]=\"isSelected(row)\"\n [class.ml-select__option--active]=\"\n active() === row.index\n \"\n [class.ml-select__option--selected]=\"\n isSelected(row)\n \"\n [id]=\"optionId(row.index)\"\n class=\"ml-select__option\"\n role=\"option\"\n >\n @if (multiple()) {\n <span\n aria-hidden=\"true\"\n class=\"ml-select__check\"\n >\n <i class=\"ml-icon ml-icon-check\"></i>\n </span>\n }\n @if (itemTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: row.option }\n \"\n />\n } @else {\n {{ row.label }}\n }\n </li>\n }\n } @empty {\n <li class=\"ml-select__empty\" role=\"presentation\">\n {{ emptyMessage() }}\n </li>\n }\n </ul>\n </div>\n </ng-template>\n `,\n})\nexport class SelectComponent implements ControlValueAccessor {\n readonly options: InputSignal<readonly unknown[] | null | undefined> =\n input<readonly unknown[] | null | undefined>([]);\n readonly optionLabel: InputSignal<string | undefined> = input<string>();\n readonly optionValue: InputSignal<string | undefined> = input<string>();\n readonly group: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n readonly optionGroupLabel: InputSignal<string | undefined> =\n input<string>();\n readonly optionGroupChildren: InputSignal<string | undefined> =\n input<string>();\n readonly placeholder: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n readonly showClear: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** La casella di ricerca in cima al pannello. */\n readonly filter: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n /** I campi su cui cercare, separati da virgole ; di serie l'etichetta. */\n readonly filterBy: InputSignal<string | undefined> = input<string>();\n /** Si può scrivere un valore che fra le voci non c'è. */\n readonly editable: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** Più voci insieme : il valore è un elenco. */\n readonly multiple: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** L'`id` del campo, per il `label for`. */\n readonly inputId: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n /** Classe del campo (il riquadro con il bordo). */\n readonly styleClass: InputSignal<string | undefined> = input<string>();\n readonly panelStyleClass: InputSignal<string | undefined> = input<string>();\n readonly size: InputSignal<\"small\" | undefined> = input<\"small\">();\n /** Larga quanto il suo contenitore. */\n readonly fluid: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n readonly emptyMessage: InputSignal<string> = input(\"Nessun risultato\");\n\n readonly changed: OutputEmitterRef<any> = output<any>();\n /** La X ha svuotato la scelta. */\n readonly cleared: OutputEmitterRef<void> = output<void>();\n\n protected readonly itemTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"item\");\n protected readonly selectedItemTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"selectedItem\");\n protected readonly groupTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"group\");\n\n private readonly triggerRef: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>(\"trigger\");\n private readonly fieldRef: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>(\"field\");\n private readonly searchRef: Signal<\n ElementRef<HTMLInputElement> | undefined\n > = viewChild<ElementRef<HTMLInputElement>>(\"search\");\n\n private readonly connected: Signal<CdkConnectedOverlay | undefined> =\n viewChild<CdkConnectedOverlay>(\"connected\");\n private readonly follow: ScrollFollower = new ScrollFollower(() =>\n this.connected()?.overlayRef?.updatePosition(),\n );\n\n protected readonly positions: ConnectedPosition[] = POSITIONS;\n protected readonly listId: string = `ml-select-list-${nextId++}`;\n private readonly ownId: string = `ml-select-field-${nextId}`;\n protected readonly fieldId: Signal<string> = computed(\n () => this.inputId() ?? this.ownId,\n );\n\n protected readonly open: WritableSignal<boolean> = signal(false);\n protected readonly focused: WritableSignal<boolean> = signal(false);\n protected readonly query: WritableSignal<string> = signal(\"\");\n protected readonly active: WritableSignal<number> = signal(-1);\n protected readonly triggerWidth: WritableSignal<number> = signal(0);\n private readonly selection: WritableSignal<unknown> = signal(null);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n protected readonly rows: Signal<SelectRow[]> = computed(() =>\n rowsOf({\n options: this.options() ?? [],\n optionLabel: this.optionLabel(),\n optionValue: this.optionValue(),\n group: this.group(),\n optionGroupLabel: this.optionGroupLabel(),\n optionGroupChildren: this.optionGroupChildren(),\n query: this.query(),\n filterBy: this.filterBy(),\n }),\n );\n private readonly allOptions: Signal<OptionRow[]> = computed(() =>\n rowsOf({\n options: this.options() ?? [],\n optionLabel: this.optionLabel(),\n optionValue: this.optionValue(),\n group: this.group(),\n optionGroupLabel: this.optionGroupLabel(),\n optionGroupChildren: this.optionGroupChildren(),\n }).filter((r: SelectRow): r is OptionRow => r.kind === \"option\"),\n );\n private readonly visibleOptions: Signal<OptionRow[]> = computed(() =>\n this.rows().filter(\n (r: SelectRow): r is OptionRow => r.kind === \"option\",\n ),\n );\n protected readonly selectedOptions: Signal<unknown[]> = computed(() => {\n const values: unknown[] = this.selectedValues();\n return this.allOptions()\n .filter((r: OptionRow) =>\n values.some((v: unknown) => sameValue(v, r.value)),\n )\n .map((r: OptionRow) => r.option);\n });\n private readonly selectedValues: Signal<unknown[]> = computed(() => {\n const value: unknown = this.selection();\n if (this.multiple()) return Array.isArray(value) ? value : [];\n return value === null || value === undefined || value === \"\"\n ? []\n : [value];\n });\n protected readonly filled: Signal<boolean> = computed(\n () => this.selectedValues().length > 0,\n );\n /** Il testo a video : le etichette scelte, o il valore scritto a mano. */\n protected readonly displayText: Signal<string> = computed(() => {\n const labels: string[] = this.selectedOptions().map((o: unknown) =>\n labelOf(o, this.optionLabel()),\n );\n if (this.multiple()) {\n return labels.length > MAX_LABELS\n ? `${labels.length} selezionati`\n : labels.join(\", \");\n }\n if (labels.length) return labels[0];\n const value: unknown = this.selection();\n return this.editable() && value !== null && value !== undefined\n ? String(value)\n : \"\";\n });\n protected readonly activeId: Signal<string | null> = computed(() =>\n this.open() && this.active() >= 0 ? this.optionId(this.active()) : null,\n );\n\n /** L'`id` del `<label for>` che nomina la tendina, se c'è. */\n protected readonly labelledBy: WritableSignal<string | null> = signal(null);\n\n constructor() {\n const destroyRef: DestroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => this.follow.stop());\n // Il `<label for>` punta a uno `span`, che non è un elemento\n // etichettabile : il nome non arriverebbe ai lettori di schermo e il\n // clic sull'etichetta non darebbe il fuoco. Si collegano a mano.\n afterNextRender(() => {\n if (this.editable()) return;\n const id: string = this.fieldId();\n const label: HTMLLabelElement | undefined = Array.from(\n document.getElementsByTagName(\"label\"),\n ).find((l: HTMLLabelElement) => l.htmlFor === id);\n if (!label) return;\n label.id ||= `${id}-label`;\n this.labelledBy.set(label.id);\n const focus = (): void => this.fieldRef()?.nativeElement.focus();\n label.addEventListener(\"click\", focus);\n destroyRef.onDestroy(() =>\n label.removeEventListener(\"click\", focus),\n );\n });\n }\n\n private onChange: (value: unknown) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n get value(): any {\n return this.selection();\n }\n\n writeValue(value: unknown): void {\n this.selection.set(value);\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n if (disabled) this.open.set(false);\n }\n\n protected optionId(index: number): string {\n return `${this.listId}-${index}`;\n }\n\n protected isSelected(row: OptionRow): boolean {\n return this.selectedValues().some((v: unknown) =>\n sameValue(v, row.value),\n );\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n if (this.open()) this.close();\n else this.show();\n }\n\n private show(): void {\n this.triggerWidth.set(\n this.triggerRef()?.nativeElement.getBoundingClientRect().width ?? 0,\n );\n this.query.set(\"\");\n const selected: number =\n this.visibleOptions().find((r: OptionRow) => this.isSelected(r))\n ?.index ?? 0;\n this.active.set(this.visibleOptions().length ? selected : -1);\n this.open.set(true);\n }\n\n protected attached(): void {\n this.follow.start();\n // La ricerca prende il fuoco quando c'è ; la voce attiva si porta in\n // vista, o con molte voci quella scelta resterebbe sotto.\n queueMicrotask(() => {\n this.searchRef()?.nativeElement.focus();\n this.scrollToActive();\n });\n }\n\n close(): void {\n this.follow.stop();\n if (!this.open()) return;\n this.open.set(false);\n this.query.set(\"\");\n if (this.filter()) this.fieldRef()?.nativeElement.focus();\n }\n\n protected outsideClick(event: MouseEvent): void {\n if (!this.triggerRef()?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected blurred(): void {\n this.focused.set(false);\n this.onTouched();\n }\n\n protected pick(row: OptionRow): void {\n if (this.multiple()) {\n const values: unknown[] = this.selectedValues();\n this.commit(\n this.isSelected(row)\n ? values.filter((v: unknown) => !sameValue(v, row.value))\n : [...values, row.value],\n );\n this.active.set(row.index);\n return;\n }\n this.commit(row.value);\n this.close();\n this.fieldRef()?.nativeElement.focus();\n }\n\n protected typed(text: string): void {\n this.commit(text === \"\" ? null : text);\n if (!this.open()) this.show();\n }\n\n protected clear(event: Event): void {\n event.stopPropagation();\n this.commit(this.multiple() ? [] : null);\n this.cleared.emit();\n this.close();\n }\n\n private commit(value: unknown): void {\n this.selection.set(value);\n this.onChange(value);\n this.changed.emit(value);\n }\n\n protected keydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const options: OptionRow[] = this.visibleOptions();\n const at: number = options.findIndex(\n (r: OptionRow) => r.index === this.active(),\n );\n const move = (to: number): void => {\n if (!options.length) return;\n const next: OptionRow =\n options[Math.max(0, Math.min(options.length - 1, to))];\n this.active.set(next.index);\n this.scrollToActive();\n };\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!this.open()) this.show();\n else move(at + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (!this.open()) this.show();\n else move(at - 1);\n break;\n case \"Home\":\n if (this.open() && !this.editable() && !this.filter()) {\n event.preventDefault();\n move(0);\n }\n break;\n case \"End\":\n if (this.open() && !this.editable() && !this.filter()) {\n event.preventDefault();\n move(options.length - 1);\n }\n break;\n case \"Enter\":\n case \" \":\n if (\n event.key === \" \" &&\n (this.editable() ||\n event.target !== this.fieldRef()?.nativeElement)\n ) {\n break;\n }\n event.preventDefault();\n if (!this.open()) this.show();\n else if (at >= 0) this.pick(options[at]);\n break;\n case \"Escape\":\n if (this.open()) {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n this.fieldRef()?.nativeElement.focus();\n }\n break;\n case \"Tab\":\n this.close();\n break;\n }\n }\n\n private scrollToActive(): void {\n const id: string | null = this.activeId();\n if (id)\n document.getElementById(id)?.scrollIntoView({ block: \"nearest\" });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n input,\n} from \"@angular/core\";\n\n/**\n * `variant=\"on\"` mette l'etichetta salita **sul bordo** del campo ; di serie\n * («over») sta sopra.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-floatlabel\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-floatlabel\",\n \"[class.ml-floatlabel--on]\": \"variant() === 'on'\",\n },\n template: `<ng-content />`,\n})\nexport class FloatLabelComponent {\n readonly variant: InputSignal<\"on\" | \"over\"> = input<\"on\" | \"over\">(\"over\");\n}\n","/**\n * Le regole del campo numerico, senza Angular : si provano da sole.\n */\nexport interface NumberFormatOptions {\n locale?: string;\n minFractionDigits?: number;\n maxFractionDigits?: number;\n useGrouping?: boolean;\n}\n\n/** Il separatore dei decimali e quello delle migliaia della lingua. */\nexport function separators(locale?: string): {\n decimal: string;\n group: string;\n} {\n const parts: Intl.NumberFormatPart[] = new Intl.NumberFormat(\n locale,\n ).formatToParts(11111.1);\n return {\n decimal: parts.find((p) => p.type === \"decimal\")?.value ?? \".\",\n group: parts.find((p) => p.type === \"group\")?.value ?? \",\",\n };\n}\n\n/** Il numero scritto, come lo mostra il campo ; vuoto per `null`. */\nexport function formatNumber(\n value: number | null | undefined,\n options: NumberFormatOptions = {},\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return \"\";\n return new Intl.NumberFormat(options.locale, {\n minimumFractionDigits: options.minFractionDigits ?? 0,\n maximumFractionDigits: Math.max(\n options.maxFractionDigits ?? 0,\n options.minFractionDigits ?? 0,\n ),\n useGrouping: options.useGrouping ?? true,\n }).format(value);\n}\n\n/**\n * Il numero di un testo scritto a mano, o `null` se non lo è. Le migliaia si\n * tolgono, il separatore dei decimali della lingua vale come punto ; un testo\n * vuoto è `null`, non zero.\n */\nexport function parseNumber(\n text: string,\n options: NumberFormatOptions = {},\n): number | null {\n const { decimal, group } = separators(options.locale);\n const clean: string = text\n .trim()\n .split(group)\n .join(\"\")\n .replace(decimal, \".\")\n .replace(/\\s/g, \"\");\n if (clean === \"\" || clean === \"-\" || clean === \".\") return null;\n if (!/^-?\\d*\\.?\\d*$/.test(clean)) return null;\n const value: number = Number(clean);\n return Number.isNaN(value) ? null : value;\n}\n\n/** Il numero dentro i limiti, e arrotondato ai decimali ammessi. */\nexport function clampNumber(\n value: number,\n min?: number | null,\n max?: number | null,\n maxFractionDigits?: number,\n): number {\n let v: number = value;\n if (min !== null && min !== undefined) v = Math.max(min, v);\n if (max !== null && max !== undefined) v = Math.min(max, v);\n const digits: number = maxFractionDigits ?? 0;\n return Number(v.toFixed(digits));\n}\n\nexport interface AllowedInput extends NumberFormatOptions {\n /** Il minimo : sotto lo zero, o assente, ammette il meno. */\n min?: number;\n}\n\n/**\n * Il testo scritto, ripulito di quello che in un numero non può stare :\n * restano le cifre, il separatore dei decimali (uno solo, e solo se i\n * decimali sono ammessi), quello delle migliaia (solo con `useGrouping`) e il\n * meno (solo in testa, e solo se il minimo lo consente). È quello che il campo\n * fa a ogni tasto e a ogni incolla : le lettere non arrivano mai a video.\n */\nexport function allowedText(text: string, options: AllowedInput = {}): string {\n const { decimal, group } = separators(options.locale);\n const decimals: boolean = (options.maxFractionDigits ?? 0) > 0;\n const negative: boolean = options.min === undefined || options.min < 0;\n let out: string = \"\";\n let seenDecimal: boolean = false;\n for (const ch of text) {\n if (ch >= \"0\" && ch <= \"9\") out += ch;\n else if (ch === \"-\" && negative && out === \"\") out += ch;\n else if (ch === decimal && decimals && !seenDecimal) {\n out += ch;\n seenDecimal = true;\n } else if (\n ch === group &&\n (options.useGrouping ?? true) &&\n !seenDecimal\n ) {\n out += ch;\n }\n }\n return out;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n numberAttribute,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport {\n NumberFormatOptions,\n allowedText,\n clampNumber,\n formatNumber,\n parseNumber,\n} from \"./number-format\";\n\nlet nextId: number = 0;\n\n/**\n * Mentre si scrive il valore arriva alla form a ogni tasto ; minimo,\n * massimo e arrotondamento si applicano all'uscita dal campo, che è quando\n * si riscrive il testo. Le frecce su e giù, e i due pulsanti con\n * `showButtons`, cambiano di `step`.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-inputnumber\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputNumberComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-inputnumber\",\n \"[class.ml-inputnumber--buttons]\": \"showButtons()\",\n },\n template: `\n <input\n #field\n (blur)=\"blurred()\"\n (input)=\"typed($any($event.target).value)\"\n (keydown)=\"keydown($event)\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-valuemax]=\"max() ?? null\"\n [attr.aria-valuemin]=\"min() ?? null\"\n [attr.aria-valuenow]=\"value()\"\n [class.ml-input--filled]=\"value() !== null\"\n [disabled]=\"isDisabled()\"\n [id]=\"inputId() ?? ownId\"\n [placeholder]=\"placeholder() ?? ''\"\n [value]=\"text()\"\n autocomplete=\"off\"\n class=\"ml-input\"\n inputmode=\"decimal\"\n role=\"spinbutton\"\n type=\"text\"\n />\n @if (showButtons()) {\n <span class=\"ml-inputnumber__buttons\">\n <button\n (click)=\"spin(1)\"\n [disabled]=\"isDisabled()\"\n aria-label=\"Aumenta\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-angle-up\"></i>\n </button>\n <button\n (click)=\"spin(-1)\"\n [disabled]=\"isDisabled()\"\n aria-label=\"Diminuisci\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-angle-down\"\n ></i>\n </button>\n </span>\n }\n `,\n})\nexport class InputNumberComponent implements ControlValueAccessor {\n readonly inputId: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n readonly placeholder: InputSignal<string | undefined> = input<string>();\n readonly min: InputSignalWithTransform<number | undefined, unknown> = input(\n undefined,\n { transform: optionalNumber },\n );\n readonly max: InputSignalWithTransform<number | undefined, unknown> = input(\n undefined,\n { transform: optionalNumber },\n );\n readonly step: InputSignalWithTransform<number, unknown> = input(1, {\n transform: numberAttribute,\n });\n readonly minFractionDigits: InputSignalWithTransform<\n number | undefined,\n unknown\n > = input(undefined, { transform: optionalNumber });\n readonly maxFractionDigits: InputSignalWithTransform<\n number | undefined,\n unknown\n > = input(undefined, { transform: optionalNumber });\n /** Abilita i separatori delle migliaia; attivo di serie. */\n readonly useGrouping: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n /** La lingua dei separatori ; di serie quella del browser. */\n readonly locale: InputSignal<string | undefined> = input<string>();\n /** Modalità di inserimento numerico: sempre «decimal». */\n readonly mode: InputSignal<string | undefined> = input<string>();\n readonly showButtons: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n\n protected readonly ownId: string = `ml-inputnumber-${nextId++}`;\n protected readonly value: WritableSignal<number | null> = signal(null);\n /** Il testo scritto, finché non si esce dal campo. */\n private readonly draft: WritableSignal<string | null> = signal(null);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n private readonly field: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>(\"field\");\n\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n private readonly format: Signal<NumberFormatOptions> = computed(() => ({\n locale: this.locale(),\n minFractionDigits: this.minFractionDigits(),\n maxFractionDigits: this.maxFractionDigits(),\n useGrouping: this.useGrouping(),\n }));\n protected readonly text: Signal<string> = computed(\n () => this.draft() ?? formatNumber(this.value(), this.format()),\n );\n\n private onChange: (value: number | null) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n const n: number | null =\n value === null || value === undefined || value === \"\"\n ? null\n : Number(value);\n this.value.set(n === null || Number.isNaN(n) ? null : n);\n this.draft.set(null);\n }\n\n registerOnChange(fn: (value: number | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n protected typed(raw: string): void {\n // Quello che in un numero non sta si scarta subito, anche incollato :\n // il testo a video si riscrive, e il cursore va in fondo.\n const text: string = allowedText(raw, {\n ...this.format(),\n min: this.min(),\n });\n const el: HTMLInputElement | undefined = this.field()?.nativeElement;\n if (el && text !== raw) el.value = text;\n this.draft.set(text);\n const value: number | null = parseNumber(text, this.format());\n if (value === null && text.trim() !== \"\") return;\n this.set(value);\n }\n\n protected blurred(): void {\n const value: number | null = this.value();\n if (value !== null) {\n const clamped: number = clampNumber(\n value,\n this.min(),\n this.max(),\n this.maxFractionDigits(),\n );\n if (clamped !== value) this.set(clamped);\n }\n this.draft.set(null);\n // Il testo scritto si riscrive anche se il valore non è cambiato\n // («1,50» torna «1,5»), e il binding su un valore uguale non lo fa.\n const el: HTMLInputElement | undefined = this.field()?.nativeElement;\n if (el) el.value = this.text();\n this.onTouched();\n }\n\n protected keydown(event: KeyboardEvent): void {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n this.spin(event.key === \"ArrowUp\" ? 1 : -1);\n }\n }\n\n protected spin(direction: 1 | -1): void {\n if (this.isDisabled()) return;\n const step: number = this.step() || 1;\n const digits: number = Math.max(\n this.maxFractionDigits() ?? 0,\n (String(step).split(\".\")[1] ?? \"\").length,\n );\n const next: number = clampNumber(\n (this.value() ?? this.min() ?? 0) + direction * step,\n this.min(),\n this.max(),\n digits,\n );\n this.draft.set(null);\n this.set(next);\n }\n\n private set(value: number | null): void {\n this.value.set(value);\n this.onChange(value);\n }\n}\n\n/** Un numero dal template, o `undefined` se manca : `null` non è un limite. */\nfunction optionalNumber(value: unknown): number | undefined {\n if (value === null || value === undefined || value === \"\") return undefined;\n const n: number = Number(value);\n return Number.isNaN(n) ? undefined : n;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-toggleswitch\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleSwitchComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-switch\",\n \"[class.ml-switch--on]\": \"checked()\",\n \"[class.ml-switch--disabled]\": \"isDisabled()\",\n },\n template: `\n <input\n (blur)=\"onTouched()\"\n (change)=\"toggle($any($event.target).checked)\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [id]=\"inputId() ?? null\"\n class=\"ml-switch__input\"\n role=\"switch\"\n type=\"checkbox\"\n />\n <span aria-hidden=\"true\" class=\"ml-switch__track\">\n <span class=\"ml-switch__handle\"></span>\n </span>\n `,\n})\nexport class ToggleSwitchComponent implements ControlValueAccessor {\n readonly inputId: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly changed: OutputEmitterRef<boolean> = output<boolean>();\n\n protected readonly checked: WritableSignal<boolean> = signal(false);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n private onChange: (value: boolean) => void = () => undefined;\n protected onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n this.checked.set(!!value);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n protected toggle(value: boolean): void {\n this.checked.set(value);\n this.onChange(value);\n this.changed.emit(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n numberAttribute,\n output,\n signal,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-slider\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SliderComponent),\n multi: true,\n },\n ],\n host: { class: \"ml-slider\" },\n template: `\n <input\n (blur)=\"onTouched()\"\n (input)=\"moved($any($event.target).valueAsNumber)\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [disabled]=\"isDisabled()\"\n [max]=\"max()\"\n [min]=\"min()\"\n [step]=\"step()\"\n [style.--ml-slider-fill]=\"fill()\"\n [value]=\"value()\"\n class=\"ml-slider__input\"\n type=\"range\"\n />\n `,\n})\nexport class SliderComponent implements ControlValueAccessor {\n readonly min: InputSignalWithTransform<number, unknown> = input(0, {\n transform: numberAttribute,\n });\n readonly max: InputSignalWithTransform<number, unknown> = input(100, {\n transform: numberAttribute,\n });\n readonly step: InputSignalWithTransform<number, unknown> = input(1, {\n transform: numberAttribute,\n });\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n readonly ariaLabelledBy: InputSignal<string | undefined> = input<string>();\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly changed: OutputEmitterRef<number> = output<number>();\n\n protected readonly value: WritableSignal<number> = signal(0);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n /** La parte piena della pista, in percentuale : la disegna il css. */\n protected readonly fill: Signal<string> = computed(() => {\n const span: number = this.max() - this.min() || 1;\n return `${((this.value() - this.min()) / span) * 100}%`;\n });\n private onChange: (value: number) => void = () => undefined;\n protected onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n const n: number = Number(value);\n this.value.set(Number.isNaN(n) ? this.min() : n);\n }\n\n registerOnChange(fn: (value: number) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n protected moved(value: number): void {\n this.value.set(value);\n this.onChange(value);\n this.changed.emit(value);\n }\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n TemplateRef,\n WritableSignal,\n booleanAttribute,\n contentChild,\n forwardRef,\n input,\n signal,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { labelOf, sameValue, valueOf } from \"../select/select-options\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-selectbutton\",\n imports: [NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectButtonComponent),\n multi: true,\n },\n ],\n host: { class: \"ml-selectbutton\", role: \"group\" },\n template: `\n @for (option of options() ?? []; track $index) {\n <button\n (click)=\"pick(option)\"\n [attr.aria-pressed]=\"isSelected(option)\"\n [class.ml-selectbutton__option--on]=\"isSelected(option)\"\n [disabled]=\"disabled()\"\n class=\"ml-selectbutton__option\"\n type=\"button\"\n >\n @if (itemTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"tpl; context: { $implicit: option }\"\n />\n } @else {\n {{ labelOf(option) }}\n }\n </button>\n }\n `,\n})\nexport class SelectButtonComponent implements ControlValueAccessor {\n readonly options: InputSignal<readonly unknown[] | null | undefined> =\n input<readonly unknown[] | null | undefined>([]);\n readonly optionLabel: InputSignal<string | undefined> = input<string>();\n readonly optionValue: InputSignal<string | undefined> = input<string>();\n readonly allowEmpty: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n protected readonly itemTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"item\");\n\n private readonly value: WritableSignal<unknown> = signal(null);\n private onChange: (value: unknown) => void = () => undefined;\n\n writeValue(value: unknown): void {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(): void {\n // Una fila di pulsanti non ha un'uscita dal campo da segnalare.\n }\n\n protected labelOf(option: unknown): string {\n return labelOf(option, this.optionLabel());\n }\n\n protected isSelected(option: unknown): boolean {\n return sameValue(valueOf(option, this.optionValue()), this.value());\n }\n\n protected pick(option: unknown): void {\n const selected: boolean = this.isSelected(option);\n if (selected && !this.allowEmpty()) return;\n const value: unknown = selected\n ? null\n : valueOf(option, this.optionValue());\n this.value.set(value);\n this.onChange(value);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n signal,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { sameValue } from \"../select/select-options\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-radiobutton\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RadioButtonComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-radio\",\n \"[class.ml-radio--checked]\": \"checked()\",\n \"[class.ml-radio--disabled]\": \"isDisabled()\",\n },\n template: `\n <input\n (blur)=\"onTouched()\"\n (change)=\"pick()\"\n [attr.name]=\"name() ?? null\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [id]=\"inputId() ?? null\"\n class=\"ml-radio__input\"\n type=\"radio\"\n />\n <span aria-hidden=\"true\" class=\"ml-radio__dot\"></span>\n `,\n})\nexport class RadioButtonComponent implements ControlValueAccessor {\n readonly value: InputSignal<unknown> = input<unknown>();\n readonly name: InputSignal<string | undefined> = input<string>();\n readonly inputId: InputSignal<string | undefined> = input<string>();\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n\n private readonly model: WritableSignal<unknown> = signal(undefined);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n protected readonly checked: Signal<boolean> = computed(() =>\n sameValue(this.model(), this.value()),\n );\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n private onChange: (value: unknown) => void = () => undefined;\n protected onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n this.model.set(value);\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n }\n\n protected pick(): void {\n this.model.set(this.value());\n this.onChange(this.value());\n }\n}\n","import {\n CdkConnectedOverlay,\n ConnectedPosition,\n FlexibleConnectedPositionStrategyOrigin,\n} from \"@angular/cdk/overlay\";\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n InputSignal,\n Signal,\n WritableSignal,\n inject,\n input,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { ScrollFollower } from \"../overlay/scroll-follower\";\n\nconst POSITIONS: ConnectedPosition[] = [\n {\n originX: \"start\",\n originY: \"bottom\",\n overlayX: \"start\",\n overlayY: \"top\",\n offsetY: 6,\n },\n {\n originX: \"end\",\n originY: \"bottom\",\n overlayX: \"end\",\n overlayY: \"top\",\n offsetY: 6,\n },\n {\n originX: \"start\",\n originY: \"top\",\n overlayX: \"start\",\n overlayY: \"bottom\",\n offsetY: -6,\n },\n];\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-popover\",\n imports: [CdkConnectedOverlay],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <ng-template\n #connected=\"cdkConnectedOverlay\"\n (attach)=\"follow.start()\"\n (detach)=\"hide()\"\n (overlayKeydown)=\"keydown($event)\"\n (overlayOutsideClick)=\"outsideClick($event)\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayOrigin]=\"origin()!\"\n [cdkConnectedOverlayPanelClass]=\"[\n 'ml-popover-pane',\n styleClass() ?? '',\n ]\"\n [cdkConnectedOverlayPositions]=\"positions\"\n cdkConnectedOverlay\n >\n <div class=\"ml-popover\" role=\"dialog\">\n <ng-content />\n </div>\n </ng-template>\n `,\n})\nexport class PopoverComponent {\n readonly styleClass: InputSignal<string | undefined> = input<string>();\n\n protected readonly positions: ConnectedPosition[] = POSITIONS;\n protected readonly open: WritableSignal<boolean> = signal(false);\n protected readonly origin: WritableSignal<\n FlexibleConnectedPositionStrategyOrigin | undefined\n > = signal(undefined);\n private trigger?: HTMLElement;\n private readonly connected: Signal<CdkConnectedOverlay | undefined> =\n viewChild<CdkConnectedOverlay>(\"connected\");\n protected readonly follow: ScrollFollower = new ScrollFollower(() =>\n this.connected()?.overlayRef?.updatePosition(),\n );\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.follow.stop());\n }\n\n /** Apre accanto all'elemento dell'evento, o chiude se è già aperto. */\n toggle(event: Event): void {\n if (this.open()) this.hide();\n else this.show(event);\n }\n\n show(event: Event): void {\n const target: HTMLElement = event.currentTarget as HTMLElement;\n this.trigger = target;\n this.origin.set(target);\n this.open.set(true);\n }\n\n hide(): void {\n this.follow.stop();\n this.open.set(false);\n }\n\n protected outsideClick(event: MouseEvent): void {\n // Il clic sull'elemento che l'ha aperto lo richiude da sé, con\n // `toggle` : chiuderlo anche qui lo riaprirebbe subito.\n if (!this.trigger?.contains(event.target as Node)) this.hide();\n }\n\n protected keydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n this.hide();\n this.trigger?.focus();\n }\n }\n}\n","import { A11yModule } from \"@angular/cdk/a11y\";\nimport {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n input,\n model,\n output,\n} from \"@angular/core\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-drawer\",\n imports: [A11yModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n @if (visible()) {\n <div (click)=\"close()\" class=\"ml-drawer-mask\"></div>\n <div\n (keydown.escape)=\"close()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.data-position]=\"position()\"\n aria-modal=\"true\"\n cdkTrapFocus\n cdkTrapFocusAutoCapture\n class=\"ml-drawer\"\n role=\"dialog\"\n tabindex=\"-1\"\n >\n <button\n (click)=\"close()\"\n aria-label=\"Chiudi\"\n class=\"ml-dialog__close ml-drawer__close\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-times\"></i>\n </button>\n <div class=\"ml-drawer__content\"><ng-content /></div>\n </div>\n }\n `,\n})\nexport class DrawerComponent {\n readonly visible: ModelSignal<boolean> = model(false);\n readonly position: InputSignal<\"left\" | \"right\"> = input<\"left\" | \"right\">(\n \"left\",\n );\n readonly ariaLabel: InputSignal<string | undefined> = input<string>();\n readonly closed: OutputEmitterRef<void> = output<void>();\n\n close(): void {\n this.visible.set(false);\n this.closed.emit();\n }\n}\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-spinner\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: \"ml-spinner\", role: \"status\", \"aria-label\": \"Caricamento\" },\n template: `\n <svg viewBox=\"0 0 50 50\" aria-hidden=\"true\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\" />\n </svg>\n `,\n})\nexport class SpinnerComponent {}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n ModelSignal,\n Signal,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n model,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { sameValue } from \"../select/select-options\";\n\nlet nextId: number = 0;\n\n/**\n * <ml-tabs [(value)]=\"scheda\">\n * <ml-tablist>\n * <ml-tab value=\"a\">A</ml-tab> …\n * </ml-tablist>\n * <ml-tabpanels>\n * <ml-tabpanel value=\"a\">…</ml-tabpanel> …\n * </ml-tabpanels>\n * </ml-tabs>\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-tabs\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: \"ml-tabs\" },\n template: `<ng-content />`,\n})\nexport class TabsComponent {\n readonly value: ModelSignal<any> = model<any>();\n /** Abilita le frecce di scorrimento quando le schede non entrano nella fila. */\n readonly scrollable = input(false, { transform: booleanAttribute });\n readonly previousButtonLabel = input(\"Previous tabs\");\n readonly nextButtonLabel = input(\"Next tabs\");\n /** Il prefisso degli `id` che legano schede e pannelli. */\n readonly uid: string = `ml-tabs-${nextId++}`;\n\n isActive(value: unknown): boolean {\n return sameValue(this.value(), value);\n }\n\n idOf(kind: \"tab\" | \"panel\", value: unknown): string {\n return `${this.uid}-${kind}-${String(value).replace(/\\s+/g, \"_\")}`;\n }\n}\n\n@Component({\n selector: \"ml-tablist\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-tablist\",\n \"[class.ml-tablist--scrollable]\": \"tabs.scrollable()\",\n \"(keydown)\": \"keydown($event)\",\n },\n template: `\n @if (tabs.scrollable() && overflowing()) {\n <button\n type=\"button\"\n class=\"ml-tablist__scroll-button\"\n [attr.aria-label]=\"tabs.previousButtonLabel()\"\n [disabled]=\"atStart()\"\n (click)=\"scroll(-1)\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"m14 6-6 6 6 6\" />\n </svg>\n </button>\n }\n <div\n #viewport\n class=\"ml-tablist__viewport\"\n role=\"tablist\"\n (scroll)=\"measure()\"\n >\n <ng-content />\n </div>\n @if (tabs.scrollable() && overflowing()) {\n <button\n type=\"button\"\n class=\"ml-tablist__scroll-button\"\n [attr.aria-label]=\"tabs.nextButtonLabel()\"\n [disabled]=\"atEnd()\"\n (click)=\"scroll(1)\"\n >\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"m10 6 6 6-6 6\" />\n </svg>\n </button>\n }\n `,\n})\nexport class TabListComponent {\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n protected readonly tabs = inject(TabsComponent);\n protected readonly overflowing = signal(false);\n protected readonly atStart = signal(true);\n protected readonly atEnd = signal(false);\n private readonly viewport =\n viewChild.required<ElementRef<HTMLElement>>(\"viewport\");\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n // Cambiano sia lo spazio disponibile sia le etichette proiettate.\n const resize =\n typeof ResizeObserver === \"undefined\"\n ? undefined\n : new ResizeObserver(() => this.measure());\n resize?.observe(this.viewport().nativeElement);\n const changes = new MutationObserver(() => this.measure());\n changes.observe(this.viewport().nativeElement, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n destroyRef.onDestroy(() => {\n resize?.disconnect();\n changes.disconnect();\n });\n this.measure();\n });\n afterRenderEffect(() => {\n this.tabs.value();\n if (this.tabs.scrollable()) this.revealActive();\n this.measure();\n });\n }\n\n protected measure(): void {\n const el = this.viewport().nativeElement;\n this.overflowing.set(el.scrollWidth > el.clientWidth + 1);\n // scrollLeft negativo nei contenitori RTL.\n const offset = Math.abs(el.scrollLeft);\n this.atStart.set(offset <= 1);\n this.atEnd.set(offset + el.clientWidth >= el.scrollWidth - 1);\n }\n\n protected scroll(direction: number): void {\n const el = this.viewport().nativeElement;\n const rtl = getComputedStyle(el).direction === \"rtl\";\n el.scrollBy({\n left: direction * (rtl ? -1 : 1) * el.clientWidth * 0.75,\n behavior:\n typeof matchMedia !== \"undefined\" &&\n matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\",\n });\n }\n\n private revealActive(): void {\n const el = this.viewport().nativeElement;\n const active = el.querySelector<HTMLElement>(\n '[role=\"tab\"][aria-selected=\"true\"]',\n );\n if (!active) return;\n const bounds = el.getBoundingClientRect();\n const tab = active.getBoundingClientRect();\n // Si muove solo la fila: scrollIntoView farebbe scorrere anche la pagina.\n if (tab.left < bounds.left) el.scrollLeft += tab.left - bounds.left;\n else if (tab.right > bounds.right)\n el.scrollLeft += tab.right - bounds.right;\n }\n\n // La tastiera la gestisce la fila e non la scheda : è lei che sa quale\n // viene prima e quale dopo.\n protected keydown(event: KeyboardEvent): void {\n const tabs: HTMLElement[] = Array.from(\n this.host.nativeElement.querySelectorAll<HTMLElement>(\n '[role=\"tab\"]',\n ),\n );\n const at: number = tabs.indexOf(document.activeElement as HTMLElement);\n if (at < 0) return;\n const to: number | undefined = {\n ArrowRight: at + 1,\n ArrowLeft: at - 1,\n Home: 0,\n End: tabs.length - 1,\n }[event.key];\n if (to === undefined) return;\n event.preventDefault();\n const next: HTMLElement = tabs[(to + tabs.length) % tabs.length];\n next.focus();\n next.click();\n }\n}\n\n@Component({\n selector: \"ml-tab\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-tab\",\n role: \"tab\",\n \"[class.ml-tab--active]\": \"active()\",\n \"[attr.aria-selected]\": \"active()\",\n \"[attr.aria-controls]\": \"tabs.idOf('panel', value())\",\n \"[attr.tabindex]\": \"active() ? 0 : -1\",\n \"[id]\": \"tabs.idOf('tab', value())\",\n \"(click)\": \"tabs.value.set(value())\",\n \"(keydown.enter)\": \"tabs.value.set(value())\",\n \"(keydown.space)\": \"$event.preventDefault(); tabs.value.set(value())\",\n },\n template: `<ng-content />`,\n})\nexport class TabComponent {\n readonly value: InputSignal<unknown> = input<unknown>();\n protected readonly tabs: TabsComponent = inject(TabsComponent);\n protected readonly active: Signal<boolean> = computed(() =>\n this.tabs.isActive(this.value()),\n );\n}\n\n@Component({\n selector: \"ml-tabpanels\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: \"ml-tabpanels\" },\n template: `<ng-content />`,\n})\nexport class TabPanelsComponent {}\n\n@Component({\n selector: \"ml-tabpanel\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-tabpanel\",\n role: \"tabpanel\",\n \"[hidden]\": \"!active()\",\n \"[id]\": \"tabs.idOf('panel', value())\",\n \"[attr.aria-labelledby]\": \"tabs.idOf('tab', value())\",\n },\n template: `<ng-content />`,\n})\nexport class TabPanelComponent {\n readonly value: InputSignal<unknown> = input<unknown>();\n protected readonly tabs: TabsComponent = inject(TabsComponent);\n protected readonly active: Signal<boolean> = computed(() =>\n this.tabs.isActive(this.value()),\n );\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n ModelSignal,\n OutputEmitterRef,\n Signal,\n computed,\n inject,\n input,\n model,\n output,\n} from \"@angular/core\";\nimport { sameValue } from \"../select/select-options\";\n\nlet nextId: number = 0;\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-accordion\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: \"ml-accordion\" },\n template: `<ng-content />`,\n})\nexport class AccordionComponent {\n /** La voce aperta : il `value` di un `ml-accordion-panel`. */\n\n readonly value: ModelSignal<any> = model<any>(null);\n readonly opened: OutputEmitterRef<any> = output<any>();\n readonly closed: OutputEmitterRef<any> = output<any>();\n\n isOpen(value: unknown): boolean {\n return sameValue(this.value(), value);\n }\n\n toggle(value: unknown): void {\n if (this.isOpen(value)) {\n this.value.set(null);\n this.closed.emit(value);\n } else {\n this.value.set(value);\n this.opened.emit(value);\n }\n }\n}\n\n@Component({\n selector: \"ml-accordion-panel\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-accordion-panel\",\n \"[class.ml-accordion-panel--active]\": \"open()\",\n },\n template: `<ng-content />`,\n})\nexport class AccordionPanelComponent {\n readonly value: InputSignal<unknown> = input<unknown>();\n readonly accordion: AccordionComponent = inject(AccordionComponent);\n readonly uid: string = `ml-accordion-${nextId++}`;\n readonly open: Signal<boolean> = computed(() =>\n this.accordion.isOpen(this.value()),\n );\n\n toggle(): void {\n this.accordion.toggle(this.value());\n }\n}\n\n@Component({\n selector: \"ml-accordion-header\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-accordion-header\",\n role: \"button\",\n tabindex: \"0\",\n \"[id]\": \"panel.uid + '-header'\",\n \"[attr.aria-expanded]\": \"panel.open()\",\n \"[attr.aria-controls]\": \"panel.uid + '-content'\",\n \"(click)\": \"panel.toggle()\",\n \"(keydown.enter)\": \"panel.toggle()\",\n \"(keydown.space)\": \"$event.preventDefault(); panel.toggle()\",\n },\n template: `\n <span class=\"ml-accordion-header__title\"><ng-content /></span>\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-chevron-down ml-accordion-header__icon\"\n ></i>\n `,\n})\nexport class AccordionHeaderComponent {\n protected readonly panel: AccordionPanelComponent = inject(\n AccordionPanelComponent,\n );\n}\n\n@Component({\n selector: \"ml-accordion-content\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: \"ml-accordion-content\",\n role: \"region\",\n \"[class.ml-accordion-content--open]\": \"panel.open()\",\n // Chiuso il contenuto resta nel DOM, alto zero : `inert` lo toglie dal\n // giro del Tab e dai lettori di schermo, come faceva `hidden`.\n \"[attr.inert]\": \"panel.open() ? null : ''\",\n \"[id]\": \"panel.uid + '-content'\",\n \"[attr.aria-labelledby]\": \"panel.uid + '-header'\",\n },\n // Due livelli : il primo si chiude a zero (la riga della griglia va da\n // `0fr` a `1fr`, che è ciò che si può animare al posto di `height: auto`),\n // il secondo porta il padding, che un elemento alto zero non perderebbe.\n template: `<div class=\"ml-accordion-content__clip\">\n <div class=\"ml-accordion-content__inner\"><ng-content /></div>\n </div>`,\n})\nexport class AccordionContentComponent {\n protected readonly panel: AccordionPanelComponent = inject(\n AccordionPanelComponent,\n );\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ConnectedPosition,\n} from \"@angular/cdk/overlay\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n WritableSignal,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChild,\n effect,\n forwardRef,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n untracked,\n viewChild,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { ScrollFollower } from \"../overlay/scroll-follower\";\nimport { labelOf } from \"../select/select-options\";\n\nlet nextId: number = 0;\n\n/** Sotto il campo, o sopra se sotto non c'è posto. */\nconst POSITIONS: ConnectedPosition[] = [\n {\n originX: \"start\",\n originY: \"bottom\",\n overlayX: \"start\",\n overlayY: \"top\",\n offsetY: 4,\n },\n {\n originX: \"start\",\n originY: \"top\",\n overlayX: \"start\",\n overlayY: \"bottom\",\n offsetY: -4,\n },\n];\n\n/**\n * Il modello `#item` disegna una proposta al posto della sola etichetta.\n *\n * Con `dropdown` accanto al campo c'è la freccia, che chiede tutte le proposte\n * (`(complete)` col testo vuoto). Disegno e classi sono quelli della tendina\n * (`ml-select`), quindi etichetta sul campo, larghezza e stato invalido valgono\n * allo stesso modo.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-autocomplete\",\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgTemplateOutlet],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AutocompleteComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-select ml-autocomplete\",\n \"[class.ml-select--filled]\": \"filled()\",\n \"[class.ml-select--focus]\": \"focused()\",\n \"[class.ml-select--disabled]\": \"isDisabled()\",\n \"[class.ml-select--small]\": \"size() === 'small'\",\n \"[class.ml-select--fluid]\": \"fluid()\",\n },\n template: `\n <div\n #origin=\"cdkOverlayOrigin\"\n #trigger\n [class]=\"styleClass() ?? ''\"\n cdkOverlayOrigin\n class=\"ml-select__trigger\"\n >\n <input\n #field\n (blur)=\"leave()\"\n (focus)=\"focused.set(true)\"\n (input)=\"typed($any($event.target).value)\"\n (keydown)=\"keydown($event)\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-controls]=\"open() ? listId : null\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.enterkeyhint]=\"enterKeyHint() || null\"\n [disabled]=\"isDisabled()\"\n [id]=\"fieldId()\"\n [placeholder]=\"placeholder() ?? ''\"\n [value]=\"displayText()\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n class=\"ml-select__label ml-select__input\"\n role=\"combobox\"\n type=\"text\"\n />\n @if (showClear() && filled() && !isDisabled()) {\n <button\n (click)=\"clear()\"\n (mousedown)=\"$event.preventDefault()\"\n aria-label=\"Svuota\"\n class=\"ml-select__clear\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-times\"></i>\n </button>\n }\n @if (dropdown()) {\n <button\n (click)=\"all()\"\n (mousedown)=\"$event.preventDefault()\"\n [disabled]=\"isDisabled()\"\n aria-label=\"Mostra tutte le proposte\"\n class=\"ml-select__arrow ml-autocomplete__dropdown\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-chevron-down\"\n ></i>\n </button>\n }\n </div>\n\n <ng-template\n #connected=\"cdkConnectedOverlay\"\n (attach)=\"follow.start()\"\n (detach)=\"close()\"\n (overlayOutsideClick)=\"outsideClick($event)\"\n [cdkConnectedOverlayMinWidth]=\"triggerWidth()\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPanelClass]=\"[\n 'ml-select-pane',\n panelStyleClass() ?? '',\n ]\"\n [cdkConnectedOverlayPositions]=\"positions\"\n cdkConnectedOverlay\n >\n <div class=\"ml-select__panel\">\n <ul [id]=\"listId\" class=\"ml-select__list\" role=\"listbox\">\n @for (item of items(); track $index) {\n <li\n (click)=\"pick(item)\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"active.set($index)\"\n [attr.aria-selected]=\"active() === $index\"\n [class.ml-select__option--active]=\"\n active() === $index\n \"\n [id]=\"optionId($index)\"\n class=\"ml-select__option\"\n role=\"option\"\n >\n @if (itemTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: item }\n \"\n />\n } @else {\n {{ labelOf(item) }}\n }\n </li>\n } @empty {\n <li class=\"ml-select__empty\" role=\"presentation\">\n {{ emptyMessage() }}\n </li>\n }\n </ul>\n </div>\n </ng-template>\n `,\n})\nexport class AutocompleteComponent implements ControlValueAccessor {\n /** Le proposte : testi, o oggetti con l'etichetta in `optionLabel`. */\n readonly suggestions: InputSignal<readonly unknown[] | null | undefined> =\n input<readonly unknown[] | null | undefined>([]);\n readonly optionLabel: InputSignal<string | undefined> = input<string>();\n /** I millisecondi fra l'ultimo tasto e la richiesta delle proposte. */\n readonly delay: InputSignalWithTransform<number, unknown> = input(300, {\n transform: numberAttribute,\n });\n /** I caratteri che servono perché si chiedano le proposte. */\n readonly minQueryLength: InputSignalWithTransform<number, unknown> = input(\n 1,\n { transform: numberAttribute },\n );\n /** La freccia accanto al campo, che chiede tutte le proposte. */\n readonly dropdown: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly showClear: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly placeholder: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n /**\n * Il testo del pannello quando una ricerca non trova niente. Senza, il\n * pannello resta chiuso.\n */\n readonly emptyMessage: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** L'`id` del campo, per il `label for`. */\n readonly inputId: InputSignal<string | undefined> = input<string>();\n /** Il tasto d'invio della tastiera del telefono : `search` per le ricerche. */\n readonly enterKeyHint: InputSignal<string | undefined> = input<string>();\n readonly ariaLabel: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n /** Classe del campo (il riquadro con il bordo). */\n readonly styleClass: InputSignal<string | undefined> = input<string>();\n readonly panelStyleClass: InputSignal<string | undefined> = input<string>();\n readonly size: InputSignal<\"small\" | undefined> = input<\"small\">();\n /**\n * Il fuoco nel campo appena è a video : per una ricerca aperta in una\n * finestra, dove si è appena chiesto di cercare. Sul telefono apre anche\n * la tastiera, ed è quello che si vuole.\n */\n readonly autoFocus: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** Largo quanto il suo contenitore. */\n readonly fluid: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n\n /** Il testo da cui cercare le proposte ; vuoto dalla freccia. */\n readonly complete: OutputEmitterRef<string> = output<string>();\n\n readonly selected: OutputEmitterRef<any> = output<any>();\n /** La X ha svuotato il campo. */\n readonly cleared: OutputEmitterRef<void> = output<void>();\n /** Il campo ha perso il fuoco. */\n readonly blurred: OutputEmitterRef<void> = output<void>();\n\n /** Il modello `#item` disegna una proposta, come nella tendina. */\n protected readonly itemTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"item\");\n\n private readonly triggerRef: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>(\"trigger\");\n private readonly fieldRef: Signal<\n ElementRef<HTMLInputElement> | undefined\n > = viewChild<ElementRef<HTMLInputElement>>(\"field\");\n private readonly connected: Signal<CdkConnectedOverlay | undefined> =\n viewChild<CdkConnectedOverlay>(\"connected\");\n protected readonly follow: ScrollFollower = new ScrollFollower(() =>\n this.connected()?.overlayRef?.updatePosition(),\n );\n\n protected readonly positions: ConnectedPosition[] = POSITIONS;\n protected readonly listId: string = `ml-autocomplete-list-${nextId++}`;\n private readonly ownId: string = `ml-autocomplete-field-${nextId}`;\n protected readonly fieldId: Signal<string> = computed(\n () => this.inputId() ?? this.ownId,\n );\n\n protected readonly open: WritableSignal<boolean> = signal(false);\n protected readonly focused: WritableSignal<boolean> = signal(false);\n protected readonly active: WritableSignal<number> = signal(-1);\n protected readonly triggerWidth: WritableSignal<number> = signal(0);\n private readonly selection: WritableSignal<unknown> = signal(null);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n protected readonly items: Signal<readonly unknown[]> = computed(\n () => this.suggestions() ?? [],\n );\n protected readonly filled: Signal<boolean> = computed(\n () => this.displayText() !== \"\",\n );\n /** Il testo a video : quello scritto, o l'etichetta della proposta scelta. */\n protected readonly displayText: Signal<string> = computed(() => {\n const value: unknown = this.selection();\n if (value === null || value === undefined) return \"\";\n return typeof value === \"object\"\n ? labelOf(value, this.optionLabel())\n : String(value);\n });\n protected readonly activeId: Signal<string | null> = computed(() =>\n this.open() && this.active() >= 0 ? this.optionId(this.active()) : null,\n );\n\n /**\n * Si è chiesto `(complete)` e si aspettano le proposte : sono loro, quando\n * arrivano, ad aprire il pannello.\n */\n private waiting: boolean = false;\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor() {\n inject(DestroyRef).onDestroy(() => {\n this.follow.stop();\n clearTimeout(this.timer);\n });\n afterNextRender(() => {\n if (this.autoFocus()) this.fieldRef()?.nativeElement.focus();\n });\n // Le proposte arrivano da chi ascolta `(complete)`, anche dopo una\n // http : il pannello si apre quando cambiano, non quando si chiedono.\n effect(() => {\n const items: readonly unknown[] = this.items();\n untracked(() => this.suggestionsArrived(items));\n });\n }\n\n private onChange: (value: unknown) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n /** Il valore di adesso : il testo scritto, o la proposta scelta. */\n get value(): any {\n return this.selection();\n }\n\n writeValue(value: unknown): void {\n this.selection.set(value);\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n if (disabled) this.close();\n }\n\n protected labelOf(item: unknown): string {\n return labelOf(item, this.optionLabel());\n }\n\n protected optionId(index: number): string {\n return `${this.listId}-${index}`;\n }\n\n protected typed(text: string): void {\n this.commit(text);\n clearTimeout(this.timer);\n if (text.length < this.minQueryLength()) {\n this.waiting = false;\n this.close();\n return;\n }\n this.timer = setTimeout(() => this.ask(text), this.delay());\n }\n\n /** La freccia : tutte le proposte, o chiude il pannello aperto. */\n protected all(): void {\n if (this.isDisabled()) return;\n this.fieldRef()?.nativeElement.focus();\n if (this.open()) {\n this.close();\n return;\n }\n clearTimeout(this.timer);\n this.ask(\"\");\n }\n\n private ask(query: string): void {\n this.waiting = true;\n this.complete.emit(query);\n }\n\n private suggestionsArrived(items: readonly unknown[]): void {\n // Le proposte possono arrivare anche senza che il campo le abbia\n // chieste (la ricerca indirizzi cerca da sé con l'invio) : con il\n // fuoco nel campo si mostrano lo stesso. Il messaggio del vuoto invece\n // solo dopo una ricerca del campo, o svuotando le proposte (la X) lo\n // si vedrebbe senza aver cercato niente.\n const asked: boolean = this.waiting;\n this.waiting = false;\n if (items.length && (asked || this.focused())) this.show();\n else if (asked && this.emptyMessage()) this.show();\n else this.close();\n }\n\n private show(): void {\n this.triggerWidth.set(\n this.triggerRef()?.nativeElement.getBoundingClientRect().width ?? 0,\n );\n this.active.set(-1);\n this.open.set(true);\n }\n\n close(): void {\n this.follow.stop();\n if (this.open()) this.open.set(false);\n }\n\n protected outsideClick(event: MouseEvent): void {\n if (!this.triggerRef()?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected leave(): void {\n this.focused.set(false);\n this.close();\n this.onTouched();\n this.blurred.emit();\n }\n\n protected pick(item: unknown): void {\n clearTimeout(this.timer);\n this.waiting = false;\n this.commit(item);\n this.close();\n this.selected.emit(item);\n this.fieldRef()?.nativeElement.focus();\n }\n\n protected clear(): void {\n clearTimeout(this.timer);\n this.waiting = false;\n this.commit(null);\n this.close();\n this.cleared.emit();\n this.fieldRef()?.nativeElement.focus();\n }\n\n private commit(value: unknown): void {\n this.selection.set(value);\n this.onChange(value);\n }\n\n protected keydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const count: number = this.items().length;\n const move = (to: number): void => {\n if (!count) return;\n this.active.set(Math.max(0, Math.min(count - 1, to)));\n const id: string | null = this.activeId();\n if (id)\n document\n .getElementById(id)\n ?.scrollIntoView({ block: \"nearest\" });\n };\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!this.open()) {\n if (count) this.show();\n } else move(this.active() + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (this.open()) move(this.active() - 1);\n break;\n case \"Enter\":\n // Solo con una proposta attiva : altrimenti l'invio resta a\n // chi usa il campo (la ricerca indirizzi cerca subito).\n if (this.open() && this.active() >= 0) {\n event.preventDefault();\n this.pick(this.items()[this.active()]);\n }\n break;\n case \"Escape\":\n if (this.open()) {\n event.preventDefault();\n event.stopPropagation();\n this.close();\n }\n break;\n case \"Tab\":\n this.close();\n break;\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n computed,\n input,\n numberAttribute,\n output,\n} from \"@angular/core\";\n\nexport interface PageChange {\n /** L'indice del primo elemento della pagina. */\n first: number;\n rows: number;\n /** La pagina, da zero. */\n page: number;\n pageCount: number;\n}\n\n/** Quante pagine si vedono per numero, al più, intorno a quella corrente. */\nconst PAGE_LINKS: number = 5;\n\n/**\n * Sul telefono i numeri delle pagine lasciano il posto a «3 / 12» : cinque\n * numeri più quattro frecce, a 44 px ciascuno, non ci starebbero.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-paginator\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: \"ml-paginator\", role: \"navigation\" },\n template: `\n <button\n (click)=\"go(0)\"\n [disabled]=\"page() === 0\"\n aria-label=\"Prima pagina\"\n class=\"ml-paginator__button\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-angle-double-left\"></i>\n </button>\n <button\n (click)=\"go(page() - 1)\"\n [disabled]=\"page() === 0\"\n aria-label=\"Pagina precedente\"\n class=\"ml-paginator__button\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-angle-left\"></i>\n </button>\n <span class=\"ml-paginator__pages\">\n @for (p of links(); track p) {\n <button\n (click)=\"go(p)\"\n [attr.aria-current]=\"p === page() ? 'page' : null\"\n [attr.aria-label]=\"'Pagina ' + (p + 1)\"\n [class.ml-paginator__button--current]=\"p === page()\"\n class=\"ml-paginator__button\"\n type=\"button\"\n >\n {{ p + 1 }}\n </button>\n }\n </span>\n <span class=\"ml-paginator__count\" aria-hidden=\"true\">\n {{ page() + 1 }} / {{ pageCount() }}\n </span>\n <button\n (click)=\"go(page() + 1)\"\n [disabled]=\"page() >= pageCount() - 1\"\n aria-label=\"Pagina successiva\"\n class=\"ml-paginator__button\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-angle-right\"></i>\n </button>\n <button\n (click)=\"go(pageCount() - 1)\"\n [disabled]=\"page() >= pageCount() - 1\"\n aria-label=\"Ultima pagina\"\n class=\"ml-paginator__button\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-angle-double-right\"\n ></i>\n </button>\n `,\n})\nexport class PaginatorComponent {\n readonly first: InputSignalWithTransform<number, unknown> = input(0, {\n transform: numberAttribute,\n });\n readonly rows: InputSignalWithTransform<number, unknown> = input(10, {\n transform: numberAttribute,\n });\n readonly totalRecords: InputSignalWithTransform<number, unknown> = input(\n 0,\n { transform: numberAttribute },\n );\n readonly pageChange: OutputEmitterRef<PageChange> = output<PageChange>();\n\n protected readonly pageCount: Signal<number> = computed(() =>\n Math.max(1, Math.ceil(this.totalRecords() / Math.max(1, this.rows()))),\n );\n protected readonly page: Signal<number> = computed(() =>\n Math.min(\n this.pageCount() - 1,\n Math.floor(this.first() / Math.max(1, this.rows())),\n ),\n );\n /** I numeri a video : la pagina corrente al centro, quando si può. */\n protected readonly links: Signal<number[]> = computed(() =>\n pageLinks(this.page(), this.pageCount()),\n );\n\n protected go(page: number): void {\n const count: number = this.pageCount();\n const to: number = Math.max(0, Math.min(count - 1, page));\n if (to === this.page()) return;\n this.pageChange.emit({\n first: to * this.rows(),\n rows: this.rows(),\n page: to,\n pageCount: count,\n });\n }\n}\n\n/**\n * Le pagine da mostrare per numero : al più {@link PAGE_LINKS}, con la corrente\n * al centro finché non si arriva a un capo.\n */\nexport function pageLinks(page: number, pageCount: number): number[] {\n const size: number = Math.min(PAGE_LINKS, pageCount);\n const start: number = Math.max(\n 0,\n Math.min(page - Math.floor(size / 2), pageCount - size),\n );\n return Array.from({ length: size }, (_: unknown, i: number) => start + i);\n}\n","import {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ConnectedPosition,\n} from \"@angular/cdk/overlay\";\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { ScrollFollower } from \"../overlay/scroll-follower\";\nimport { labelOf } from \"../select/select-options\";\n\nlet nextId: number = 0;\n\nconst POSITIONS: ConnectedPosition[] = [\n {\n originX: \"start\",\n originY: \"bottom\",\n overlayX: \"start\",\n overlayY: \"top\",\n offsetY: 4,\n },\n {\n originX: \"start\",\n originY: \"top\",\n overlayX: \"start\",\n overlayY: \"bottom\",\n offsetY: -4,\n },\n];\n\nexport function childrenOf(\n item: unknown,\n level: number,\n optionGroupChildren: string | readonly string[] | undefined,\n): unknown[] | undefined {\n if (!optionGroupChildren || item === null || typeof item !== \"object\") {\n return undefined;\n }\n const key: string | undefined =\n typeof optionGroupChildren === \"string\"\n ? optionGroupChildren\n : optionGroupChildren[\n Math.min(level, optionGroupChildren.length - 1)\n ];\n const children: unknown = key\n ? (item as Record<string, unknown>)[key]\n : undefined;\n return Array.isArray(children) ? children : undefined;\n}\n\n/**\n * Le stesse posizioni allineate al bordo destro del campo : per un campo nella\n * metà destra dello schermo, dove le colonne si aprono verso sinistra.\n */\nconst POSITIONS_TO_LEFT: ConnectedPosition[] = POSITIONS.map(\n (p: ConnectedPosition) => ({ ...p, originX: \"end\", overlayX: \"end\" }),\n);\n\n/** Una colonna del menu : le voci di un livello e dove sta in verticale. */\ninterface CascadeColumn {\n level: number;\n items: readonly unknown[];\n offset: number;\n}\n\n/** Sotto questa larghezza le colonne di fianco non ci stanno. */\nconst NARROW: string = \"(max-width: 640px)\";\n\n/**\n * Sul telefono (sotto i 640 px) le colonne di fianco non ci starebbero : lì un\n * gruppo si apre al posto del suo livello, con una riga in cima per tornare\n * indietro.\n *\n * È un `ControlValueAccessor` ; il valore è la voce finale scelta, e\n * `(changed)` la dà (era `(onChange)` con `$event.value`).\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-cascadeselect\",\n imports: [CdkConnectedOverlay, CdkOverlayOrigin],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CascadeSelectComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-select ml-cascadeselect\",\n \"[class.ml-select--filled]\": \"filled()\",\n \"[class.ml-select--focus]\": \"focused() || open()\",\n \"[class.ml-select--disabled]\": \"isDisabled()\",\n },\n template: `\n <div\n #origin=\"cdkOverlayOrigin\"\n #trigger\n (click)=\"toggle()\"\n cdkOverlayOrigin\n class=\"ml-select__trigger\"\n >\n <span\n #field\n (blur)=\"blurred()\"\n (focus)=\"focused.set(true)\"\n (keydown)=\"keydown($event)\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-controls]=\"open() ? listId : null\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"ariaLabel() || placeholder() || null\"\n [class.ml-select__placeholder]=\"!filled()\"\n [tabindex]=\"isDisabled() ? -1 : 0\"\n aria-haspopup=\"listbox\"\n class=\"ml-select__label\"\n role=\"combobox\"\n >\n {{ displayText() || placeholder() || \"&nbsp;\" }}\n </span>\n <span aria-hidden=\"true\" class=\"ml-select__arrow\">\n <i class=\"ml-icon ml-icon-chevron-down\"></i>\n </span>\n </div>\n\n <ng-template\n #connected=\"cdkConnectedOverlay\"\n (attach)=\"follow.start()\"\n (detach)=\"close()\"\n (overlayOutsideClick)=\"outsideClick($event)\"\n [cdkConnectedOverlayOpen]=\"open()\"\n [cdkConnectedOverlayOrigin]=\"origin\"\n [cdkConnectedOverlayPanelClass]=\"['ml-select-pane']\"\n [cdkConnectedOverlayPositions]=\"\n toLeft() ? positionsToLeft : positions\n \"\n [cdkConnectedOverlayPush]=\"true\"\n cdkConnectedOverlay\n >\n <div\n [class.ml-cascadeselect__columns--to-left]=\"toLeft()\"\n [id]=\"listId\"\n class=\"ml-cascadeselect__columns\"\n role=\"listbox\"\n >\n @for (column of visibleColumns(); track column.level) {\n <div\n [style.margin-top.px]=\"narrow() ? 0 : column.offset\"\n [style.min-width.px]=\"\n column.level === 0 || narrow()\n ? triggerWidth()\n : null\n \"\n class=\"ml-select__panel ml-cascadeselect__column\"\n >\n <ul class=\"ml-select__list\" role=\"group\">\n @if (narrow() && path().length) {\n <li\n (click)=\"back()\"\n (mousedown)=\"$event.preventDefault()\"\n class=\"ml-select__option ml-cascadeselect__back\"\n role=\"presentation\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-chevron-left\"\n ></i>\n {{ groupLabel(path()[path().length - 1]) }}\n </li>\n }\n @if (!narrow() && column.level > 0) {\n <li\n class=\"ml-cascadeselect__title\"\n role=\"presentation\"\n >\n {{ groupLabel(path()[column.level - 1]) }}\n </li>\n }\n @for (item of column.items; track $index) {\n <li\n (click)=\"\n choose(\n item,\n column.level,\n $index,\n $any($event.currentTarget)\n )\n \"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"\n hover(\n item,\n column.level,\n $index,\n $any($event.currentTarget)\n )\n \"\n [attr.aria-disabled]=\"\n isItemDisabled(item) || null\n \"\n [attr.aria-expanded]=\"\n isGroup(item, column.level)\n ? path()[column.level] === item\n : null\n \"\n [class.ml-cascadeselect__option--disabled]=\"\n isItemDisabled(item)\n \"\n [class.ml-cascadeselect__option--open]=\"\n path()[column.level] === item\n \"\n [class.ml-select__option--active]=\"\n column.level === path().length &&\n active() === $index\n \"\n [id]=\"optionId(column.level, $index)\"\n class=\"ml-select__option\"\n role=\"option\"\n >\n <span class=\"ml-cascadeselect__text\">\n {{\n isGroup(item, column.level)\n ? groupLabel(item)\n : itemLabel(item)\n }}\n </span>\n @if (isGroup(item, column.level)) {\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-chevron-right\"\n ></i>\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </ng-template>\n `,\n})\nexport class CascadeSelectComponent implements ControlValueAccessor {\n readonly options: InputSignal<readonly unknown[] | null | undefined> =\n input<readonly unknown[] | null | undefined>([]);\n readonly optionLabel: InputSignal<string | undefined> = input<string>();\n readonly optionGroupLabel: InputSignal<string | undefined> =\n input<string>();\n readonly optionGroupChildren: InputSignal<\n string | readonly string[] | undefined\n > = input<string | readonly string[]>();\n /** Il campo che dice che una voce non si sceglie. */\n readonly optionDisabled: InputSignal<string | undefined> = input<string>();\n readonly placeholder: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n readonly ariaLabel: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /**\n * Spento, la voce scelta va solo in `(changed)` e il campo resta sul\n * `placeholder` : per chi usa il menu come un comando e scrive da sé che\n * cosa è scelto (la mappa divisa, che lo scrive nel `placeholder`).\n */\n readonly keepSelection: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n\n readonly changed: OutputEmitterRef<any> = output<any>();\n\n private readonly triggerRef: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>(\"trigger\");\n private readonly fieldRef: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>(\"field\");\n private readonly connected: Signal<CdkConnectedOverlay | undefined> =\n viewChild<CdkConnectedOverlay>(\"connected\");\n protected readonly follow: ScrollFollower = new ScrollFollower(() =>\n this.connected()?.overlayRef?.updatePosition(),\n );\n\n protected readonly positions: ConnectedPosition[] = POSITIONS;\n protected readonly positionsToLeft: ConnectedPosition[] = POSITIONS_TO_LEFT;\n protected readonly listId: string = `ml-cascadeselect-list-${nextId++}`;\n\n protected readonly open: WritableSignal<boolean> = signal(false);\n protected readonly focused: WritableSignal<boolean> = signal(false);\n /** La voce attiva, nell'ultima colonna. */\n protected readonly active: WritableSignal<number> = signal(-1);\n protected readonly triggerWidth: WritableSignal<number> = signal(0);\n /** Schermo stretto : un livello per volta invece delle colonne. */\n protected readonly narrow: WritableSignal<boolean> = signal(false);\n /** Il campo sta nella metà destra : le colonne si aprono verso sinistra. */\n protected readonly toLeft: WritableSignal<boolean> = signal(false);\n /** I gruppi aperti, dal primo livello in giù. */\n protected readonly path: WritableSignal<unknown[]> = signal([]);\n /** Lo scostamento in verticale di ogni colonna, allineata al suo gruppo. */\n private readonly offsets: WritableSignal<number[]> = signal([0]);\n private readonly selection: WritableSignal<unknown> = signal(null);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n /** Una colonna per livello aperto : la prima, e i figli di ogni gruppo. */\n protected readonly columns: Signal<CascadeColumn[]> = computed(() => {\n const offsets: number[] = this.offsets();\n const columns: CascadeColumn[] = [\n { level: 0, items: this.options() ?? [], offset: 0 },\n ];\n this.path().forEach((group: unknown, level: number) =>\n columns.push({\n level: level + 1,\n items:\n childrenOf(group, level, this.optionGroupChildren()) ?? [],\n offset: offsets[level + 1] ?? 0,\n }),\n );\n return columns;\n });\n protected readonly visibleColumns: Signal<CascadeColumn[]> = computed(() =>\n this.narrow() ? this.columns().slice(-1) : this.columns(),\n );\n /** Le voci dell'ultimo livello aperto, dove va la tastiera. */\n private readonly items: Signal<readonly unknown[]> = computed(\n () => this.columns()[this.columns().length - 1].items,\n );\n protected readonly displayText: Signal<string> = computed(() => {\n const value: unknown = this.selection();\n return value === null || value === undefined\n ? \"\"\n : labelOf(value, this.optionLabel());\n });\n protected readonly filled: Signal<boolean> = computed(\n () => this.displayText() !== \"\",\n );\n protected readonly activeId: Signal<string | null> = computed(() =>\n this.open() && this.active() >= 0\n ? this.optionId(this.path().length, this.active())\n : null,\n );\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.follow.stop());\n }\n\n private onChange: (value: unknown) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n this.selection.set(value);\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n if (disabled) this.close();\n }\n\n protected optionId(level: number, index: number): string {\n return `${this.listId}-${level}-${index}`;\n }\n\n protected isGroup(item: unknown, level: number): boolean {\n return (\n childrenOf(item, level, this.optionGroupChildren()) !== undefined\n );\n }\n\n protected isItemDisabled(item: unknown): boolean {\n const key: string | undefined = this.optionDisabled();\n return (\n !!key &&\n item !== null &&\n typeof item === \"object\" &&\n !!(item as Record<string, unknown>)[key]\n );\n }\n\n protected groupLabel(item: unknown): string {\n return labelOf(item, this.optionGroupLabel() ?? this.optionLabel());\n }\n\n protected itemLabel(item: unknown): string {\n return labelOf(item, this.optionLabel());\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n if (this.open()) this.close();\n else this.show();\n }\n\n private show(): void {\n const rect: DOMRect | undefined =\n this.triggerRef()?.nativeElement.getBoundingClientRect();\n this.triggerWidth.set(rect?.width ?? 0);\n this.narrow.set(window.matchMedia(NARROW).matches);\n this.toLeft.set(\n !!rect && rect.left + rect.width / 2 > window.innerWidth / 2,\n );\n this.path.set([]);\n this.offsets.set([0]);\n this.active.set(-1);\n this.open.set(true);\n }\n\n close(): void {\n this.follow.stop();\n if (!this.open()) return;\n this.open.set(false);\n this.path.set([]);\n }\n\n protected outsideClick(event: MouseEvent): void {\n if (!this.triggerRef()?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n protected blurred(): void {\n this.focused.set(false);\n this.onTouched();\n }\n\n /**\n * Col mouse un gruppo si apre passandoci sopra, e una voce finale chiude\n * le colonne più a destra. Col dito (e sul telefono) decide il tocco.\n */\n protected hover(\n item: unknown,\n level: number,\n index: number,\n element: HTMLElement,\n ): void {\n if (this.narrow() || !window.matchMedia(\"(hover: hover)\").matches) {\n return;\n }\n if (this.isGroup(item, level) && !this.isItemDisabled(item)) {\n this.openGroup(item, level, element);\n this.active.set(-1);\n return;\n }\n this.path.update((p: unknown[]) => p.slice(0, level));\n this.active.set(index);\n }\n\n protected choose(\n item: unknown,\n level: number,\n index: number,\n element: HTMLElement,\n ): void {\n if (this.isItemDisabled(item)) return;\n if (this.isGroup(item, level)) {\n this.openGroup(item, level, element);\n this.active.set(0);\n return;\n }\n this.active.set(index);\n if (this.keepSelection()) {\n this.selection.set(item);\n this.onChange(item);\n }\n this.changed.emit(item);\n this.close();\n this.fieldRef()?.nativeElement.focus();\n }\n\n /**\n * Apre i figli di un gruppo nella colonna dopo la sua, allineata in\n * verticale alla voce del gruppo.\n */\n private openGroup(\n item: unknown,\n level: number,\n element: HTMLElement | null,\n ): void {\n if (this.path()[level] === item && this.path().length === level + 1) {\n return;\n }\n const list: HTMLElement | null = element?.parentElement ?? null;\n const top: number = element\n ? element.offsetTop - (list?.scrollTop ?? 0)\n : 0;\n this.offsets.update((o: number[]) => {\n const next: number[] = o.slice(0, level + 1);\n next[level + 1] = (o[level] ?? 0) + top;\n return next;\n });\n this.path.update((p: unknown[]) => [...p.slice(0, level), item]);\n }\n\n protected back(): void {\n const path: unknown[] = this.path();\n if (!path.length) return;\n const parent: unknown = path[path.length - 1];\n this.path.set(path.slice(0, -1));\n this.active.set(Math.max(0, this.items().indexOf(parent)));\n }\n\n protected keydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const count: number = this.items().length;\n const level: number = this.path().length;\n const move = (to: number): void => {\n if (!count) return;\n this.active.set(Math.max(0, Math.min(count - 1, to)));\n const id: string | null = this.activeId();\n if (id)\n document\n .getElementById(id)\n ?.scrollIntoView({ block: \"nearest\" });\n };\n const current: unknown = this.items()[this.active()];\n const element = (): HTMLElement =>\n document.getElementById(\n this.optionId(level, this.active()),\n ) as HTMLElement;\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!this.open()) this.show();\n else move(this.active() + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (this.open()) move(this.active() - 1);\n break;\n case \"ArrowRight\":\n if (\n this.open() &&\n current !== undefined &&\n this.isGroup(current, level)\n ) {\n event.preventDefault();\n this.choose(current, level, this.active(), element());\n }\n break;\n case \"ArrowLeft\":\n if (this.open() && level) {\n event.preventDefault();\n this.back();\n }\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n if (!this.open()) this.show();\n else if (current !== undefined)\n this.choose(current, level, this.active(), element());\n break;\n case \"Escape\":\n if (this.open()) {\n event.preventDefault();\n event.stopPropagation();\n if (level) this.back();\n else this.close();\n }\n break;\n case \"Tab\":\n this.close();\n break;\n }\n }\n}\n","/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n\n/** Le sei settimane a video di un mese, dal lunedì : 42 giorni. */\nexport function monthGrid(year: number, month: number): Date[] {\n const first: Date = new Date(year, month, 1);\n // Il lunedì è il primo giorno : `getDay()` dà 0 alla domenica.\n const offset: number = (first.getDay() + 6) % 7;\n return Array.from(\n { length: 42 },\n (_: unknown, i: number) => new Date(year, month, 1 - offset + i),\n );\n}\n\nexport function sameDay(\n a: Date | null | undefined,\n b: Date | null | undefined,\n): boolean {\n return (\n !!a &&\n !!b &&\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/** Il giorno, senza l'ora : per confrontare due date per giorno. */\nexport function dayOf(date: Date): number {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n ).getTime();\n}\n\n/** Se `day` cade fra `start` ed `end`, estremi compresi. */\nexport function inRange(\n day: Date,\n start: Date | null | undefined,\n end: Date | null | undefined,\n): boolean {\n if (!start || !end) return false;\n const d: number = dayOf(day);\n return d >= dayOf(start) && d <= dayOf(end);\n}\n\nfunction pad(n: number): string {\n return String(n).padStart(2, \"0\");\n}\n\n/** `dd/mm/yyyy`, e con l'ora `dd/mm/yyyy HH:mm`. */\nexport function formatDate(\n date: Date | null | undefined,\n showTime = false,\n): string {\n if (!date || isNaN(date.getTime())) return \"\";\n const day: string = `${pad(date.getDate())}/${pad(date.getMonth() + 1)}/${date.getFullYear()}`;\n return showTime\n ? `${day} ${pad(date.getHours())}:${pad(date.getMinutes())}`\n : day;\n}\n\n/**\n * Il testo del campo : una data, o un intervallo «dal – al» (con il solo\n * inizio, finché la fine non è scelta).\n */\nexport function formatValue(value: unknown, showTime = false): string {\n if (Array.isArray(value)) {\n const [start, end] = value as (Date | null)[];\n if (!start) return \"\";\n return end\n ? `${formatDate(start, showTime)} – ${formatDate(end, showTime)}`\n : `${formatDate(start, showTime)} –`;\n }\n return value instanceof Date ? formatDate(value, showTime) : \"\";\n}\n\n/** Il giorno scelto con l'ora di `time` : il calendario sceglie giorni. */\nexport function withTime(day: Date, time: Date | null | undefined): Date {\n return new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n time?.getHours() ?? 0,\n time?.getMinutes() ?? 0,\n );\n}\n\n/**\n * Il prossimo valore di un intervallo dopo il clic su un giorno : il primo\n * clic (o quello dopo un intervallo intero) apre, il secondo chiude, e un\n * giorno prima dell'inizio diventa il nuovo inizio.\n */\nexport function nextRange(\n current: (Date | null)[] | null | undefined,\n day: Date,\n): [Date, Date | null] {\n const [start, end] = current ?? [];\n if (!start || end) return [day, null];\n return dayOf(day) < dayOf(start) ? [day, start] : [start, day];\n}\n\n/** I nomi brevi dei giorni, da lunedì, nella lingua di `locale`. */\nexport function weekdayNames(locale: string): string[] {\n const format: Intl.DateTimeFormat = new Intl.DateTimeFormat(locale, {\n weekday: \"short\",\n });\n // Il 5 gennaio 2026 è un lunedì.\n return Array.from({ length: 7 }, (_: unknown, i: number) =>\n format.format(new Date(2026, 0, 5 + i)),\n );\n}\n\n/** «novembre 2026», nella lingua di `locale`. */\nexport function monthTitle(\n year: number,\n month: number,\n locale: string,\n): string {\n return new Intl.DateTimeFormat(locale, {\n month: \"long\",\n year: \"numeric\",\n }).format(new Date(year, month, 1));\n}\n","import { Overlay, OverlayRef } from \"@angular/cdk/overlay\";\nimport { TemplatePortal } from \"@angular/cdk/portal\";\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n ViewContainerRef,\n WritableSignal,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { takeUntil } from \"rxjs\";\nimport {\n formatDate,\n formatValue,\n inRange,\n monthGrid,\n monthTitle,\n nextRange,\n sameDay,\n weekdayNames,\n withTime,\n} from \"./calendar\";\n\nlet nextId: number = 0;\n\n/** Sotto questa larghezza il calendario si apre al centro dello schermo. */\nconst NARROW: string = \"(max-width: 640px)\";\n\n/**\n * Il campo non si scrive : si sceglie dal calendario, che si apre col clic,\n * con Invio o con la freccia in giù. Nel calendario le frecce spostano il\n * giorno, Pagina su e giù il mese, Esc chiude. Il formato è `dd/mm/yyyy`.\n *\n * Sul telefono (`touchUI`, o sotto i 640 px) si apre al centro dello schermo\n * con la maschera, e l'ora la sceglie il selettore del sistema.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-datepicker\",\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatePickerComponent),\n multi: true,\n },\n ],\n host: {\n class: \"ml-datepicker\",\n \"[class.ml-datepicker--filled]\": \"filled()\",\n \"[class.ml-datepicker--disabled]\": \"isDisabled()\",\n },\n template: `\n <div #field class=\"ml-datepicker__field\">\n <input\n #input\n (click)=\"toggle()\"\n (keydown)=\"fieldKey($event)\"\n (blur)=\"onTouched()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-label]=\"ariaLabel() || placeholder() || null\"\n [disabled]=\"isDisabled()\"\n [id]=\"fieldId()\"\n [placeholder]=\"placeholder() ?? ''\"\n [value]=\"text()\"\n aria-haspopup=\"dialog\"\n autocomplete=\"off\"\n class=\"ml-input ml-datepicker__input\"\n readonly\n role=\"combobox\"\n type=\"text\"\n />\n @if (showClear() && filled() && !isDisabled()) {\n <button\n (click)=\"clear()\"\n aria-label=\"Svuota\"\n class=\"ml-datepicker__clear\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-times\"></i>\n </button>\n }\n @if (showIcon()) {\n <button\n (click)=\"toggle()\"\n [disabled]=\"isDisabled()\"\n aria-label=\"Apri il calendario\"\n class=\"ml-datepicker__icon\"\n tabindex=\"-1\"\n type=\"button\"\n >\n <i aria-hidden=\"true\" class=\"ml-icon ml-icon-calendar\"></i>\n </button>\n }\n </div>\n\n <ng-template #panel>\n <div\n (keydown)=\"panelKey($event)\"\n [attr.aria-label]=\"title()\"\n [class.ml-datepicker__panel--sheet]=\"sheet()\"\n class=\"ml-datepicker__panel\"\n role=\"dialog\"\n >\n <div class=\"ml-datepicker__head\">\n <button\n (click)=\"move(-12)\"\n aria-label=\"Anno precedente\"\n class=\"ml-datepicker__nav\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-angle-double-left\"\n ></i>\n </button>\n <button\n (click)=\"move(-1)\"\n aria-label=\"Mese precedente\"\n class=\"ml-datepicker__nav\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-angle-left\"\n ></i>\n </button>\n <span aria-live=\"polite\" class=\"ml-datepicker__title\">{{\n title()\n }}</span>\n <button\n (click)=\"move(1)\"\n aria-label=\"Mese successivo\"\n class=\"ml-datepicker__nav\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-angle-right\"\n ></i>\n </button>\n <button\n (click)=\"move(12)\"\n aria-label=\"Anno successivo\"\n class=\"ml-datepicker__nav\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-angle-double-right\"\n ></i>\n </button>\n </div>\n <div class=\"ml-datepicker__grid\" role=\"grid\">\n @for (name of weekdays(); track $index) {\n <span\n aria-hidden=\"true\"\n class=\"ml-datepicker__weekday\"\n >{{ name }}</span\n >\n }\n @for (day of days(); track day.getTime()) {\n <button\n (click)=\"pick(day)\"\n [attr.aria-label]=\"label(day)\"\n [attr.aria-pressed]=\"isSelected(day)\"\n [class.ml-datepicker__day--in-range]=\"\n isInRange(day)\n \"\n [class.ml-datepicker__day--other]=\"\n day.getMonth() !== viewMonth()\n \"\n [class.ml-datepicker__day--selected]=\"\n isSelected(day)\n \"\n [class.ml-datepicker__day--today]=\"isToday(day)\"\n [tabindex]=\"isFocused(day) ? 0 : -1\"\n class=\"ml-datepicker__day\"\n type=\"button\"\n >\n {{ day.getDate() }}\n </button>\n }\n </div>\n @if (showTime() && !isRange()) {\n <label class=\"ml-datepicker__time\">\n <span>Ora</span>\n <input\n (change)=\"setTime($any($event.target).value)\"\n [value]=\"timeText()\"\n class=\"ml-input\"\n type=\"time\"\n />\n </label>\n }\n <div class=\"ml-datepicker__foot\">\n <button\n (click)=\"pickToday()\"\n class=\"ml-datepicker__link\"\n type=\"button\"\n >\n Oggi\n </button>\n @if (showClear()) {\n <button\n (click)=\"clear()\"\n class=\"ml-datepicker__link\"\n type=\"button\"\n >\n Svuota\n </button>\n }\n <button\n (click)=\"close(true)\"\n class=\"ml-datepicker__link ml-datepicker__link--done\"\n type=\"button\"\n >\n Fatto\n </button>\n </div>\n </div>\n </ng-template>\n `,\n})\nexport class DatePickerComponent implements ControlValueAccessor {\n /** Modalità di selezione: `single` (di serie) o `range`. */\n readonly selectionMode: InputSignal<\"single\" | \"range\" | undefined> = input<\n \"single\" | \"range\"\n >();\n readonly showTime: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly showClear: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** La piccola icona del calendario accanto al campo ; di serie sì. */\n readonly showIcon: InputSignalWithTransform<boolean, unknown> = input(\n true,\n { transform: booleanAttribute },\n );\n /** Il calendario al centro dello schermo, con la maschera. */\n readonly touchUI: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly placeholder: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n readonly ariaLabel: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n /** L'`id` del campo, per il `label for`. */\n readonly inputId: InputSignal<string | undefined> = input<string>();\n readonly disabled: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /** La lingua dei nomi di mesi e giorni. */\n readonly locale: InputSignal<string> = input(\"it-IT\");\n\n /** Il valore nuovo, a ogni scelta : una `Date`, un intervallo o `null`. */\n readonly changed: OutputEmitterRef<any> = output<any>();\n\n private readonly fieldRef: Signal<ElementRef<HTMLElement> | undefined> =\n viewChild<ElementRef<HTMLElement>>(\"field\");\n private readonly inputRef: Signal<\n ElementRef<HTMLInputElement> | undefined\n > = viewChild<ElementRef<HTMLInputElement>>(\"input\");\n private readonly panelRef: Signal<TemplateRef<unknown> | undefined> =\n viewChild<TemplateRef<unknown>>(\"panel\");\n\n private readonly overlay: Overlay = inject(Overlay);\n private readonly viewContainerRef: ViewContainerRef =\n inject(ViewContainerRef);\n private overlayRef: OverlayRef | null = null;\n\n private readonly ownId: string = `ml-datepicker-${nextId++}`;\n protected readonly fieldId: Signal<string> = computed(\n () => this.inputId() ?? this.ownId,\n );\n\n protected readonly open: WritableSignal<boolean> = signal(false);\n /** Aperto al centro dello schermo invece che sotto il campo. */\n protected readonly sheet: WritableSignal<boolean> = signal(false);\n protected readonly viewYear: WritableSignal<number> = signal(\n new Date().getFullYear(),\n );\n protected readonly viewMonth: WritableSignal<number> = signal(\n new Date().getMonth(),\n );\n /** Il giorno che ha il fuoco della tastiera nel calendario. */\n protected readonly focused: WritableSignal<Date> = signal(new Date());\n private readonly value: WritableSignal<unknown> = signal(null);\n private readonly formDisabled: WritableSignal<boolean> = signal(false);\n\n protected readonly isDisabled: Signal<boolean> = computed(\n () => this.disabled() || this.formDisabled(),\n );\n protected readonly isRange: Signal<boolean> = computed(\n () => this.selectionMode() === \"range\",\n );\n protected readonly text: Signal<string> = computed(() =>\n formatValue(this.value(), this.showTime()),\n );\n protected readonly filled: Signal<boolean> = computed(\n () => this.text() !== \"\",\n );\n protected readonly days: Signal<Date[]> = computed(() =>\n monthGrid(this.viewYear(), this.viewMonth()),\n );\n protected readonly weekdays: Signal<string[]> = computed(() =>\n weekdayNames(this.locale()),\n );\n protected readonly title: Signal<string> = computed(() =>\n monthTitle(this.viewYear(), this.viewMonth(), this.locale()),\n );\n protected readonly timeText: Signal<string> = computed(() => {\n const value: unknown = this.value();\n return value instanceof Date\n ? formatDate(value, true).slice(-5)\n : \"00:00\";\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.detach());\n }\n\n private onChange: (value: unknown) => void = () => undefined;\n protected onTouched: () => void = () => undefined;\n\n writeValue(value: unknown): void {\n this.value.set(value ?? null);\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.formDisabled.set(disabled);\n if (disabled) this.close(false);\n }\n\n private start(): Date | null {\n const value: unknown = this.value();\n if (Array.isArray(value)) return (value[0] as Date | null) ?? null;\n return value instanceof Date ? value : null;\n }\n\n private end(): Date | null {\n const value: unknown = this.value();\n return Array.isArray(value)\n ? ((value[1] as Date | null) ?? null)\n : null;\n }\n\n protected isSelected(day: Date): boolean {\n return sameDay(day, this.start()) || sameDay(day, this.end());\n }\n\n protected isInRange(day: Date): boolean {\n return (\n this.isRange() &&\n !this.isSelected(day) &&\n inRange(day, this.start(), this.end())\n );\n }\n\n protected isToday(day: Date): boolean {\n return sameDay(day, new Date());\n }\n\n protected isFocused(day: Date): boolean {\n return sameDay(day, this.focused());\n }\n\n protected label(day: Date): string {\n return new Intl.DateTimeFormat(this.locale(), {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n }).format(day);\n }\n\n protected toggle(): void {\n if (this.isDisabled()) return;\n if (this.open()) this.close(true);\n else this.show();\n }\n\n private show(): void {\n const field: HTMLElement | undefined = this.fieldRef()?.nativeElement;\n const template: TemplateRef<unknown> | undefined = this.panelRef();\n if (!field || !template) return;\n const at: Date = this.start() ?? new Date();\n this.viewYear.set(at.getFullYear());\n this.viewMonth.set(at.getMonth());\n this.focused.set(at);\n const sheet: boolean =\n this.touchUI() || window.matchMedia(NARROW).matches;\n this.sheet.set(sheet);\n this.overlayRef = this.overlay.create({\n positionStrategy: sheet\n ? this.overlay\n .position()\n .global()\n .centerHorizontally()\n .centerVertically()\n : this.overlay\n .position()\n .flexibleConnectedTo(field)\n .withPush(true)\n .withPositions([\n {\n originX: \"start\",\n originY: \"bottom\",\n overlayX: \"start\",\n overlayY: \"top\",\n offsetY: 4,\n },\n {\n originX: \"start\",\n originY: \"top\",\n overlayX: \"start\",\n overlayY: \"bottom\",\n offsetY: -4,\n },\n ]),\n scrollStrategy: sheet\n ? this.overlay.scrollStrategies.block()\n : this.overlay.scrollStrategies.reposition(),\n hasBackdrop: sheet,\n backdropClass: \"ml-dialog-backdrop\",\n panelClass: \"ml-datepicker-pane\",\n });\n this.overlayRef.attach(\n new TemplatePortal(template, this.viewContainerRef),\n );\n // Le due iscrizioni finiscono con l'overlay : `dispose` lo stacca.\n const ref: OverlayRef = this.overlayRef;\n ref.backdropClick()\n .pipe(takeUntil(ref.detachments()))\n .subscribe(() => this.close(true));\n ref.outsidePointerEvents()\n .pipe(takeUntil(ref.detachments()))\n .subscribe((event: MouseEvent) => {\n if (!field.contains(event.target as Node)) {\n this.close(false);\n }\n });\n this.open.set(true);\n this.focusDay();\n }\n\n /**\n * Chiude il calendario. Col fuoco nel calendario (Esc, «Fatto», un\n * giorno scelto) lo si rimette nel campo ; con un clic fuori no, o lo si\n * toglierebbe a quello che si è cliccato.\n */\n close(refocus: boolean): void {\n if (!this.open()) return;\n this.detach();\n this.open.set(false);\n if (refocus) this.inputRef()?.nativeElement.focus();\n }\n\n private detach(): void {\n this.overlayRef?.dispose();\n this.overlayRef = null;\n }\n\n /** Sposta il mese a video di `months` mesi (12 per un anno). */\n protected move(months: number): void {\n const at: Date = new Date(\n this.viewYear(),\n this.viewMonth() + months,\n 1,\n );\n this.viewYear.set(at.getFullYear());\n this.viewMonth.set(at.getMonth());\n const focused: Date = this.focused();\n const day: number = Math.min(\n focused.getDate(),\n new Date(at.getFullYear(), at.getMonth() + 1, 0).getDate(),\n );\n this.focused.set(new Date(at.getFullYear(), at.getMonth(), day));\n }\n\n protected pick(day: Date): void {\n if (this.isRange()) {\n const next: [Date, Date | null] = nextRange(\n this.value() as (Date | null)[] | null,\n day,\n );\n this.commit(next);\n this.focused.set(day);\n if (next[1]) this.close(true);\n return;\n }\n this.commit(\n this.showTime() ? withTime(day, this.start()) : withTime(day, null),\n );\n this.focused.set(day);\n // Con l'ora il calendario resta aperto : la si sceglie dopo il giorno.\n if (!this.showTime()) this.close(true);\n }\n\n protected pickToday(): void {\n const today: Date = new Date();\n this.viewYear.set(today.getFullYear());\n this.viewMonth.set(today.getMonth());\n this.pick(today);\n }\n\n protected setTime(text: string): void {\n const [hours, minutes] = text.split(\":\").map(Number);\n const day: Date = this.start() ?? new Date();\n if (isNaN(hours) || isNaN(minutes)) return;\n this.commit(\n new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n hours,\n minutes,\n ),\n );\n }\n\n protected clear(): void {\n this.commit(null);\n this.close(false);\n this.inputRef()?.nativeElement.focus();\n }\n\n private commit(value: unknown): void {\n this.value.set(value);\n this.onChange(value);\n this.changed.emit(value);\n }\n\n protected fieldKey(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n if (\n !this.open() &&\n (event.key === \"ArrowDown\" ||\n event.key === \"Enter\" ||\n event.key === \" \")\n ) {\n event.preventDefault();\n this.show();\n } else if (this.open() && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n }\n }\n\n protected panelKey(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n this.close(true);\n return;\n }\n const onDay: boolean = (event.target as HTMLElement).classList.contains(\n \"ml-datepicker__day\",\n );\n if (!onDay) return;\n const steps: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -7,\n ArrowDown: 7,\n };\n const focused: Date = this.focused();\n let next: Date | null = null;\n if (event.key in steps) {\n next = new Date(\n focused.getFullYear(),\n focused.getMonth(),\n focused.getDate() + steps[event.key],\n );\n } else if (event.key === \"PageUp\" || event.key === \"PageDown\") {\n next = new Date(\n focused.getFullYear(),\n focused.getMonth() + (event.key === \"PageUp\" ? -1 : 1),\n Math.min(focused.getDate(), 28),\n );\n } else if (event.key === \"Home\" || event.key === \"End\") {\n const offset: number = (focused.getDay() + 6) % 7;\n next = new Date(\n focused.getFullYear(),\n focused.getMonth(),\n focused.getDate() +\n (event.key === \"Home\" ? -offset : 6 - offset),\n );\n }\n if (!next) return;\n event.preventDefault();\n this.focused.set(next);\n if (\n next.getMonth() !== this.viewMonth() ||\n next.getFullYear() !== this.viewYear()\n ) {\n this.viewYear.set(next.getFullYear());\n this.viewMonth.set(next.getMonth());\n }\n this.focusDay();\n }\n\n /** Porta il fuoco sul giorno che lo deve avere, a vista aggiornata. */\n private focusDay(): void {\n setTimeout(() =>\n (\n this.overlayRef?.overlayElement.querySelector(\n '.ml-datepicker__day[tabindex=\"0\"]',\n ) as HTMLElement | null\n )?.focus(),\n );\n }\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n Signal,\n TemplateRef,\n computed,\n contentChild,\n input,\n} from \"@angular/core\";\n\n/** Un nodo letto dal componente ad albero. */\nexport interface TreeItem {\n label?: string;\n children?: TreeItem[];\n /** Aperto o chiuso : lo scrive il tree, e lo possono scrivere le azioni. */\n expanded?: boolean;\n /** Un nodo foglia non ha la freccia anche se ha `children`. */\n leaf?: boolean;\n /** Nodo padre, assegnato dal componente ad albero. */\n parent?: TreeItem;\n [key: string]: any;\n}\n\nexport function linkParents(\n nodes: readonly TreeItem[] | null | undefined,\n parent?: TreeItem,\n): void {\n for (const node of nodes ?? []) {\n node.parent = parent;\n linkParents(node.children, node);\n }\n}\n\n/** Se il nodo ha figli da aprire. */\nexport function hasChildren(node: TreeItem): boolean {\n return !node.leaf && (node.children?.length ?? 0) > 0;\n}\n\n/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-tree\",\n imports: [NgTemplateOutlet],\n // I nodi possono essere modificati sul posto dal consumatore, senza cambiare riferimento.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n host: { class: \"ml-tree\" },\n template: `\n <ul class=\"ml-tree__list\" role=\"tree\">\n <ng-container\n *ngTemplateOutlet=\"\n list;\n context: { $implicit: nodes(), level: 1 }\n \"\n />\n </ul>\n\n <ng-template #list let-nodes let-level=\"level\">\n @for (node of nodes; track $index) {\n <li\n [attr.aria-expanded]=\"\n hasChildren(node) ? !!node.expanded : null\n \"\n [attr.aria-level]=\"level\"\n class=\"ml-tree__item\"\n role=\"treeitem\"\n >\n <div class=\"ml-tree__row\">\n @if (hasChildren(node)) {\n <button\n (click)=\"node.expanded = !node.expanded\"\n [attr.aria-label]=\"\n (node.expanded ? 'Chiudi ' : 'Apri ') +\n (node.label ?? '')\n \"\n [class.ml-tree__toggle--open]=\"node.expanded\"\n class=\"ml-tree__toggle\"\n type=\"button\"\n >\n <i\n aria-hidden=\"true\"\n class=\"ml-icon ml-icon-chevron-right\"\n ></i>\n </button>\n } @else {\n <span\n aria-hidden=\"true\"\n class=\"ml-tree__spacer\"\n ></span>\n }\n <div class=\"ml-tree__content\">\n @if (nodeTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: node }\n \"\n />\n } @else {\n {{ node.label }}\n }\n </div>\n </div>\n @if (hasChildren(node) && node.expanded) {\n <ul class=\"ml-tree__children\" role=\"group\">\n <ng-container\n *ngTemplateOutlet=\"\n list;\n context: {\n $implicit: node.children,\n level: level + 1,\n }\n \"\n />\n </ul>\n }\n </li>\n }\n </ng-template>\n `,\n})\nexport class TreeComponent {\n readonly value: InputSignal<readonly TreeItem[] | null | undefined> = input<\n readonly TreeItem[] | null | undefined\n >([]);\n\n protected readonly nodeTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"node\");\n\n /**\n * I nodi con il loro `parent` già scritto : prima che il template li\n * disegni, perché chi disegna le righe lo legge.\n */\n protected readonly nodes: Signal<readonly TreeItem[]> = computed(() => {\n const nodes: readonly TreeItem[] = this.value() ?? [];\n linkParents(nodes);\n return nodes;\n });\n\n protected readonly hasChildren: (node: TreeItem) => boolean = hasChildren;\n}\n","/**\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n\nexport type ColumnFilterType = \"text\" | \"numeric\" | \"boolean\" | \"date\";\n\n/** `equals` confronta tutto il valore, `contains` una sua parte. */\nexport type ColumnMatchMode = \"equals\" | \"contains\";\n\n/** Un filtro acceso su una colonna. */\nexport interface ColumnFilter {\n type: ColumnFilterType;\n matchMode: ColumnMatchMode;\n /** Il valore scritto : testo, numero, `true`/`false` o una `Date`. */\n value: unknown;\n}\n\n/** I filtri della tabella, per nome del campo. */\nexport type ColumnFilters = Record<string, ColumnFilter>;\n\n/** Se il filtro non ha un valore, e quindi lascia passare tutto. */\nexport function isEmptyFilter(filter: ColumnFilter | undefined): boolean {\n const value: unknown = filter?.value;\n return value === null || value === undefined || value === \"\";\n}\n\nfunction sameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function matchesFilter(cell: unknown, filter: ColumnFilter): boolean {\n if (isEmptyFilter(filter)) return true;\n if (cell === null || cell === undefined || cell === \"\") return false;\n switch (filter.type) {\n case \"numeric\":\n return Number(cell) === Number(filter.value);\n case \"boolean\":\n return String(cell).toLowerCase() === String(filter.value);\n case \"date\": {\n const date: Date =\n cell instanceof Date ? cell : new Date(String(cell));\n return (\n filter.value instanceof Date &&\n !isNaN(date.getTime()) &&\n sameDay(date, filter.value)\n );\n }\n default: {\n const text: string = String(cell).toLocaleLowerCase();\n const wanted: string = String(filter.value).toLocaleLowerCase();\n return filter.matchMode === \"contains\"\n ? text.includes(wanted)\n : text === wanted;\n }\n }\n}\n\n/** Le righe che passano tutti i filtri, leggendo il campo con `row[field]`. */\nexport function filterRows<T>(rows: readonly T[], filters: ColumnFilters): T[] {\n const active: [string, ColumnFilter][] = Object.entries(filters).filter(\n ([, filter]: [string, ColumnFilter]) => !isEmptyFilter(filter),\n );\n if (!active.length) return [...rows];\n return rows.filter((row: T) =>\n active.every(([field, filter]: [string, ColumnFilter]) =>\n matchesFilter((row as Record<string, unknown>)?.[field], filter),\n ),\n );\n}\n","import { NgStyle, NgTemplateOutlet } from \"@angular/common\";\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OnInit,\n OutputEmitterRef,\n Signal,\n TemplateRef,\n WritableSignal,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n output,\n signal,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { CheckboxComponent } from \"../checkbox/checkbox.component\";\nimport {\n PageChange,\n PaginatorComponent,\n} from \"../paginator/paginator.component\";\nimport { SpinnerComponent } from \"../spinner/spinner.component\";\nimport {\n ColumnFilter,\n ColumnFilterType,\n ColumnFilters,\n ColumnMatchMode,\n filterRows,\n} from \"./table-filter\";\n\n/** Una riga scelta o tolta : la riga e la sua posizione in `value`. */\nexport interface TableRowEvent<T = any> {\n data: T;\n index: number;\n}\n\n/** La pagina da chiedere quando il caricamento è differito (`lazy`). */\nexport interface TableLazyLoad {\n first: number;\n rows: number;\n}\n\n/**\n * `rowIndex` è la posizione della riga in `value`, anche a righe filtrate :\n * chi la usa per ritrovare la feature (la tabella WMS) trova quella giusta.\n *\n * @author Vito Salvia - CNR IMAA geoSDI Group\n * @email vito.salvia@gmail.com\n */\n@Component({\n selector: \"ml-table\",\n imports: [NgTemplateOutlet, NgStyle, PaginatorComponent, SpinnerComponent],\n // I template proiettati e i dati mutabili del consumatore richiedono il controllo a ogni ciclo.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n host: {\n \"[class]\": \"'ml-table ' + (styleClass() ?? '')\",\n \"[class.ml-table--striped]\": \"stripedRows()\",\n \"[class.ml-table--hover]\": \"rowHover()\",\n \"[class.ml-table--small]\": \"size() === 'small'\",\n \"[class.ml-table--flex]\": \"scrollHeight() === 'flex'\",\n },\n template: `\n @if (captionTemplate(); as tpl) {\n <div class=\"ml-table__caption\">\n <ng-container *ngTemplateOutlet=\"tpl\" />\n </div>\n }\n <div\n [style.max-height]=\"\n scrollHeight() && scrollHeight() !== 'flex'\n ? scrollHeight()\n : null\n \"\n class=\"ml-table__container\"\n >\n <table [ngStyle]=\"tableStyle() ?? {}\" class=\"ml-table__table\">\n @if (colgroupTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: columns() }\n \"\n />\n }\n @if (headerTemplate(); as tpl) {\n <thead class=\"ml-table__thead\">\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: columns() }\n \"\n />\n </thead>\n }\n <tbody class=\"ml-table__tbody\">\n @for (row of pageRows(); track $index) {\n @if (bodyTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: {\n $implicit: row,\n rowIndex: indexOf(row),\n columns: columns(),\n }\n \"\n />\n }\n } @empty {\n @if (emptyTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: columns() }\n \"\n />\n }\n }\n </tbody>\n @if (footerTemplate(); as tpl) {\n <tfoot class=\"ml-table__tfoot\">\n <ng-container\n *ngTemplateOutlet=\"\n tpl;\n context: { $implicit: columns() }\n \"\n />\n </tfoot>\n }\n </table>\n @if (loading()) {\n <div class=\"ml-table__loading\" role=\"status\">\n <ml-spinner />\n </div>\n }\n </div>\n @if (paginator()) {\n <ml-paginator\n (pageChange)=\"changePage($event)\"\n [first]=\"firstShown()\"\n [rows]=\"rows()\"\n [totalRecords]=\"lazy() ? totalRecords() : filtered().length\"\n />\n }\n `,\n})\nexport class TableComponent implements OnInit {\n readonly value: InputSignal<readonly any[] | null | undefined> = input<\n readonly any[] | null | undefined\n >([]);\n /** Passate ai modelli come `columns`. */\n readonly columns: InputSignal<any[] | null | undefined> = input<\n any[] | null | undefined\n >();\n /** Il campo che riconosce una riga nella selezione ; senza, la riga stessa. */\n readonly dataKey: InputSignal<string | undefined> = input<string>();\n readonly size: InputSignal<\"small\" | undefined> = input<\"small\">();\n readonly stripedRows: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly rowHover: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n /**\n * `flex` riempie l'altezza del contenitore della tabella, un'altezza\n * (`\"300px\"`) la fa scorrere oltre.\n */\n readonly scrollHeight: InputSignal<string | null | undefined> = input<\n string | null | undefined\n >();\n readonly tableStyle: InputSignal<\n Record<string, string> | null | undefined\n > = input<Record<string, string> | null | undefined>();\n readonly styleClass: InputSignal<string | undefined> = input<string>();\n readonly paginator: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n readonly rows: InputSignalWithTransform<number, unknown> = input(10, {\n transform: numberAttribute,\n });\n /** Con `lazy`, il totale delle righe che il servizio ha. */\n readonly totalRecords: InputSignalWithTransform<number, unknown> = input(\n 0,\n { transform: numberAttribute },\n );\n /** Indice della prima riga visibile con il paginatore. */\n readonly first: InputSignalWithTransform<number, unknown> = input(0, {\n transform: numberAttribute,\n });\n /** Le pagine le dà chi usa la tabella, a ogni `(lazyLoad)`. */\n readonly lazy: InputSignalWithTransform<boolean, unknown> = input(false, {\n transform: booleanAttribute,\n });\n readonly loading: InputSignalWithTransform<boolean, unknown> = input(\n false,\n { transform: booleanAttribute },\n );\n\n /** Le righe scelte con le caselle. */\n readonly selection: ModelSignal<any[] | null | undefined> = model<\n any[] | null | undefined\n >([]);\n readonly rowSelect: OutputEmitterRef<TableRowEvent> =\n output<TableRowEvent>();\n readonly rowUnselect: OutputEmitterRef<TableRowEvent> =\n output<TableRowEvent>();\n /** La pagina da chiedere, con `lazy` : anche la prima, alla nascita. */\n readonly lazyLoad: OutputEmitterRef<TableLazyLoad> =\n output<TableLazyLoad>();\n\n protected readonly captionTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"caption\");\n protected readonly colgroupTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"colgroup\");\n protected readonly headerTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"header\");\n protected readonly bodyTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"body\");\n protected readonly footerTemplate: Signal<\n TemplateRef<unknown> | undefined\n > = contentChild<TemplateRef<unknown>>(\"footer\");\n protected readonly emptyTemplate: Signal<TemplateRef<unknown> | undefined> =\n contentChild<TemplateRef<unknown>>(\"emptymessage\");\n\n /** L'elemento che scorre : chi carica righe mentre si scorre lo ascolta. */\n readonly element: ElementRef<HTMLElement> = inject(ElementRef);\n\n /**\n * La prima riga a video : la cambia il paginatore, e la riporta a quella\n * di chi usa la tabella quando lui la cambia (la ricerca degli utenti la\n * rimette a 0).\n */\n protected readonly firstShown: WritableSignal<number> = linkedSignal(() =>\n this.first(),\n );\n private readonly filters: WritableSignal<ColumnFilters> = signal({});\n\n protected readonly filtered: Signal<readonly any[]> = computed(() =>\n filterRows(this.value() ?? [], this.filters()),\n );\n /** Le righe a video : la pagina, se il paginatore le divide qui. */\n protected readonly pageRows: Signal<readonly any[]> = computed(() => {\n const rows: readonly any[] = this.filtered();\n if (!this.paginator() || this.lazy()) return rows;\n return rows.slice(this.firstShown(), this.firstShown() + this.rows());\n });\n\n ngOnInit(): void {\n if (this.lazy()) {\n this.lazyLoad.emit({ first: this.firstShown(), rows: this.rows() });\n }\n }\n\n /** La posizione della riga in `value`. */\n protected indexOf(row: unknown): number {\n return (this.value() ?? []).indexOf(row);\n }\n\n protected changePage(page: PageChange): void {\n this.firstShown.set(page.first);\n if (this.lazy()) {\n this.lazyLoad.emit({ first: page.first, rows: page.rows });\n }\n }\n\n private keyOf(row: unknown): unknown {\n const key: string | undefined = this.dataKey();\n return key && row !== null && typeof row === \"object\"\n ? (row as Record<string, unknown>)[key]\n : row;\n }\n\n isSelected(row: unknown): boolean {\n const key: unknown = this.keyOf(row);\n return (this.selection() ?? []).some(\n (r: unknown) => r === row || this.keyOf(r) === key,\n );\n }\n\n /** Seleziona o deseleziona una riga. */\n toggle(row: unknown, index?: number): void {\n const at: number = index ?? this.indexOf(row);\n const selected: any[] = [...(this.selection() ?? [])];\n if (this.isSelected(row)) {\n const key: unknown = this.keyOf(row);\n this.selection.set(\n selected.filter(\n (r: unknown) => r !== row && this.keyOf(r) !== key,\n ),\n );\n this.rowUnselect.emit({ data: row, index: at });\n } else {\n this.selection.set([...selected, row]);\n this.rowSelect.emit({ data: row, index: at });\n }\n }\n\n /** Accende, cambia o spegne il filtro di una colonna. */\n setFilter(field: string, filter: ColumnFilter): void {\n this.filters.update((f: ColumnFilters) => ({ ...f, [field]: filter }));\n this.firstShown.set(0);\n }\n\n /** Toglie tutti i filtri per colonna. */\n clearFilters(): void {\n this.filters.set({});\n this.firstShown.set(0);\n }\n\n filterOf(field: string): ColumnFilter | undefined {\n return this.filters()[field];\n }\n}\n\n@Component({\n selector: \"ml-table-checkbox\",\n imports: [CheckboxComponent, FormsModule],\n // I template proiettati e i dati mutabili del consumatore richiedono il controllo a ogni ciclo.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n template: `\n <ml-checkbox\n (changed)=\"table.toggle(value(), index())\"\n [ngModel]=\"table.isSelected(value())\"\n ariaLabel=\"Scegli la riga\"\n />\n `,\n})\nexport class TableCheckboxComponent {\n readonly value: InputSignal<unknown> = input<unknown>();\n readonly index: InputSignal<number | undefined> = input<number>();\n protected readonly table: TableComponent = inject(TableComponent);\n}\n\n@Directive({\n selector: \"th[mlResizableColumn]\",\n host: { class: \"ml-table__resizable\" },\n})\nexport class ResizableColumnDirective implements OnInit {\n private readonly th: HTMLElement = inject(ElementRef).nativeElement;\n\n ngOnInit(): void {\n const handle: HTMLSpanElement = document.createElement(\"span\");\n handle.className = \"ml-table__resizer\";\n handle.setAttribute(\"aria-hidden\", \"true\");\n handle.addEventListener(\"pointerdown\", (event: PointerEvent) =>\n this.start(event, handle),\n );\n this.th.appendChild(handle);\n }\n\n private start(event: PointerEvent, handle: HTMLElement): void {\n event.preventDefault();\n event.stopPropagation();\n const startX: number = event.clientX;\n const startWidth: number = this.th.getBoundingClientRect().width;\n handle.setPointerCapture(event.pointerId);\n const move = (e: PointerEvent): void => {\n const width: number = Math.max(48, startWidth + e.clientX - startX);\n this.th.style.width = `${width}px`;\n this.th.style.minWidth = `${width}px`;\n };\n const end = (): void => {\n handle.removeEventListener(\"pointermove\", move);\n handle.removeEventListener(\"pointerup\", end);\n handle.removeEventListener(\"pointercancel\", end);\n };\n handle.addEventListener(\"pointermove\", move);\n handle.addEventListener(\"pointerup\", end);\n handle.addEventListener(\"pointercancel\", end);\n }\n}\n\n@Component({\n selector: \"ml-column-filter\",\n imports: [FormsModule],\n // I template proiettati e i dati mutabili del consumatore richiedono il controllo a ogni ciclo.\n // eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection\n changeDetection: ChangeDetectionStrategy.Eager,\n host: { class: \"ml-column-filter\" },\n template: `\n @switch (type()) {\n @case (\"boolean\") {\n <select\n (change)=\"set($any($event.target).value || null)\"\n [attr.aria-label]=\"'Filtra ' + field()\"\n [value]=\"current() ?? ''\"\n class=\"ml-input ml-column-filter__control\"\n >\n <option value=\"\">Tutti</option>\n <option value=\"true\">Sì</option>\n <option value=\"false\">No</option>\n </select>\n }\n @case (\"date\") {\n <input\n (change)=\"setDate($any($event.target).value)\"\n [attr.aria-label]=\"'Filtra ' + field()\"\n class=\"ml-input ml-column-filter__control\"\n type=\"date\"\n />\n }\n @default {\n <input\n (input)=\"set($any($event.target).value)\"\n [attr.aria-label]=\"'Filtra ' + field()\"\n [attr.inputmode]=\"type() === 'numeric' ? 'decimal' : null\"\n [value]=\"current() ?? ''\"\n autocomplete=\"off\"\n class=\"ml-input ml-column-filter__control\"\n enterkeyhint=\"search\"\n type=\"search\"\n />\n }\n }\n `,\n})\nexport class ColumnFilterComponent {\n readonly field: InputSignal<string> = input.required<string>();\n readonly type: InputSignal<ColumnFilterType> =\n input<ColumnFilterType>(\"text\");\n readonly matchMode: InputSignal<ColumnMatchMode> =\n input<ColumnMatchMode>(\"equals\");\n private readonly table: TableComponent = inject(TableComponent);\n\n protected current(): unknown {\n return this.table.filterOf(this.field())?.value;\n }\n\n protected set(value: unknown): void {\n this.table.setFilter(this.field(), {\n type: this.type(),\n matchMode: this.matchMode(),\n value: value === \"\" ? null : value,\n });\n }\n\n protected setDate(text: string): void {\n const [year, month, day] = text.split(\"-\").map(Number);\n this.set(text ? new Date(year, month - 1, day) : null);\n }\n}\n"],"mappings":"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"}