@arsedizioni/ars-utils 22.5.30 → 22.5.32

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.
@@ -1 +1 @@
1
- {"version":3,"file":"arsedizioni-ars-utils-ui.files.mjs","sources":["../../../projects/ars-utils/ui.files/file-input/file-input.component.ts","../../../projects/ars-utils/ui.files/file-input/file-input.component.html","../../../projects/ars-utils/ui.files/file-preview/file-preview.component.ts","../../../projects/ars-utils/ui.files/file-preview/file-preview.component.html","../../../projects/ars-utils/ui.files/select-file/select-file-dialog.component.ts","../../../projects/ars-utils/ui.files/select-file/select-file-dialog.component.html","../../../projects/ars-utils/ui.files/select-picture/select-picture-dialog.component.ts","../../../projects/ars-utils/ui.files/select-picture/select-picture-dialog.component.html","../../../projects/ars-utils/ui.files/public_api.ts","../../../projects/ars-utils/ui.files/arsedizioni-ars-utils-ui.files.ts"],"sourcesContent":["import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { afterNextRender, ChangeDetectionStrategy, Component, DoCheck, effect, ElementRef, Input, OnDestroy, Optional, Renderer2, Self, inject, input, model, output, signal, viewChild } from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { FormField, disabled as disabledSchema, form, required as requiredSchema } from '@angular/forms/signals';\nimport { fileSize as fileSizeSchema, notEmpty, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\nimport { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport { FileInfo, SystemUtils } from '@arsedizioni/ars-utils/core';\nimport { Subject } from 'rxjs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatInputModule } from '@angular/material/input';\nimport { UIService } from '@arsedizioni/ars-utils/ui';\n\n@Component({\n selector: 'file-input',\n templateUrl: './file-input.component.html',\n styleUrl: './file-input.component.scss',\n providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatFormFieldModule, MatInputModule, FormField, MatButtonModule,\n MatIconModule, MatTooltipModule],\n host: {\n '[id]': 'id',\n '[class.floating]': 'shouldLabelFloat',\n '[attr.aria-describedBy]': 'describedBy',\n },\n})\nexport class FileInputComponent\n implements\n OnDestroy,\n DoCheck,\n MatFormFieldControl<FileInfo>,\n ControlValueAccessor {\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\n protected readonly getFieldErrorMessage = SignalsUtils.getFieldErrorMessage;\n\n\n /** Reference to the hidden native file input element. */\n protected readonly __file = viewChild.required<ElementRef>('__file');\n\n private readonly renderer = inject(Renderer2);\n private readonly uiService = inject(UIService);\n\n // Initialize\n static nextId = 0;\n readonly stateChanges = new Subject<void>();\n private previousNativeValue: any;\n controlType: string = 'file-input';\n focused = false;\n\n /** Whether the device supports camera capture. */\n protected readonly canCapture = signal<boolean>(false);\n\n /** Size in MB of the currently selected file. */\n protected readonly fileSize = signal<number>(0);\n\n private readonly _placeholder = signal<string>('');\n\n private _value: FileInfo = new FileInfo();\n set value(value: FileInfo) {\n this.setValue(value, true);\n }\n\n /**\n * Updates the internal state. Form propagation is skipped for model->view\n * writes (writeValue) to avoid the CVA echo loop, and performed for\n * user-driven changes (selectFile/clearFile) and the public value setter.\n * @param value - The new file info to store and display.\n * @param propagate - When `true`, notifies the registered onChange callback.\n */\n private setValue(value: FileInfo, propagate: boolean): void {\n this._value = value;\n if (propagate) {\n this.propagateChange(this._value);\n }\n this.stateChanges.next();\n this.changed.emit(this._value);\n }\n get value() {\n return this._value;\n }\n get size() {\n return this._value?.file?.size;\n }\n\n /** Backing signal so the internal form schema reacts to `required` changes. */\n private readonly _required = signal<boolean>(false);\n @Input()\n get required() {\n return this._required();\n }\n set required(value: boolean) {\n this._required.set(coerceBooleanProperty(value));\n this.stateChanges.next();\n }\n /** Backing signal so the internal form schema reacts to `disabled` changes. */\n private readonly _disabled = signal<boolean>(false);\n @Input()\n get disabled() {\n if (this.ngControl && this.ngControl.disabled != null) {\n return this.ngControl.disabled;\n }\n return this._disabled();\n }\n set disabled(value: boolean) {\n this._disabled.set(coerceBooleanProperty(value));\n if (this.focused) {\n this.focused = false;\n this.stateChanges.next();\n }\n }\n @Input()\n get placeholder(): string {\n return this._placeholder();\n }\n set placeholder(value: string) {\n this._placeholder.set(value);\n this.stateChanges.next();\n }\n\n /** The currently displayed file name. Can be bound two-way from outside or updated on file selection. */\n readonly fileName = model<string | undefined>(undefined);\n readonly maxSizeMb = input<number>(5);\n readonly minSizeMb = input<number>(0);\n readonly isNew = input<boolean>(false);\n readonly canPreview = input<boolean>(false);\n readonly appearance = input<'fill' | 'outline' | undefined>(this.uiService.appearance());\n readonly accept = input<string>();\n get empty(): boolean {\n return !this._value || !this._value.file;\n }\n /** True when the control has validation errors and has been touched. */\n get errorState(): boolean {\n return (this.ngControl?.errors != null) && (this.ngControl?.touched ?? false);\n }\n\n id = `${this.controlType}-${FileInputComponent.nextId++}`;\n\n /** True when the label should float above the field. */\n get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n describedBy = '';\n\n readonly changed = output<FileInfo>();\n readonly download = output();\n readonly preview = output();\n\n /** Model backing the internal display form: the (readonly) file-name text. */\n private readonly nameModel = signal<{ name: string }>({ name: '' });\n\n /**\n * Internal signal form for the file-name input. It reproduces the previous\n * template-driven validators: `required` follows the `required` input and the\n * size rule mirrors FileSizeValidatorDirective (empty name is left to `required`).\n */\n protected readonly nameForm = form(this.nameModel, p => {\n requiredSchema(p.name, { when: () => this._required() });\n notEmpty(p.name, { when: () => this._required() });\n // The outer-form path is covered by setDisabledState, which writes the DOM directly.\n disabledSchema(p.name, () => this._disabled());\n // The shared rule, so the message comes from the same table as everywhere else.\n fileSizeSchema(p.name, () => this.fileSize(), () => this.maxSizeMb(), () => this.minSizeMb());\n });\n\n private propagateChange: (_: any) => void = (_: any) => { };\n private propagateTouched: () => void = () => { };\n\n\n constructor(\n @Optional() @Self() public ngControl: NgControl) {\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n\n // Keep the internal form model in sync with the two-way bindable fileName.\n effect(() => this.nameModel.set({ name: this.fileName() ?? '' }));\n\n // Detect camera availability and set the default placeholder after the first render.\n // The file-name input is also made read-only imperatively: marking the field as\n // readonly in the form schema would skip its validation entirely by design.\n afterNextRender(() => {\n this.setupDevices();\n const elem = document.getElementById(this.id);\n if (elem) {\n this.renderer.setProperty(elem, 'readOnly', true);\n }\n });\n }\n\n /**\n * Detects camera availability and updates the placeholder accordingly.\n */\n private async setupDevices(): Promise<void> {\n this.canCapture.set(false);\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n if (stream) {\n this.canCapture.set(true);\n }\n } catch { }\n }\n if (!this.placeholder || this.placeholder === 'Seleziona file') {\n this._placeholder.set(\n this.canCapture()\n ? 'Seleziona file o acquisisci con fotocamera'\n : 'Seleziona file'\n );\n }\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n ngDoCheck(): void {\n this.updateInputDirtyCheck();\n }\n\n /**\n * Writes a new value to the component (called by the form layer).\n * @param value - The new file info to display.\n */\n writeValue(value: any): void {\n // Model -> view write: must NOT propagate back to the form (echo loop)\n this.setValue(value as FileInfo, false);\n }\n\n /**\n * Registers the on-change callback (called by the form layer).\n * @param fn - Callback to invoke whenever the value changes.\n */\n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n\n /**\n * Registers the on-touched callback (called by the form layer).\n * @param fn - Callback to invoke when the control is touched.\n */\n registerOnTouched(fn: any): void {\n this.propagateTouched = fn;\n }\n\n /**\n * Sets the ARIA describedby attribute from the given element IDs.\n * @param ids - Array of element IDs that describe this control.\n */\n setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(' ');\n }\n\n /**\n * Updates the disabled state of the underlying native element.\n * @param isDisabled - Whether the control should be disabled.\n */\n setDisabledState?(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n if (!SystemUtils.isBrowser()) return;\n const elem = document.getElementById(this.id);\n if (elem) {\n this.renderer.setProperty(elem, 'disabled', isDisabled);\n }\n }\n\n /** Focuses the native input element and marks the control as touched. */\n onContainerClick(): void {\n if (!this.focused) {\n if (!SystemUtils.isBrowser()) return;\n const elem = document.getElementById(this.id);\n if (elem) {\n elem.focus();\n this.propagateTouched();\n }\n }\n }\n\n /**\n * Checks whether the value has changed since the last dirty check and emits `stateChanges` if needed.\n */\n protected updateInputDirtyCheck(): void {\n const newValue = this._value;\n if (this.previousNativeValue !== newValue) {\n this.previousNativeValue = newValue;\n this.stateChanges.next();\n }\n }\n\n /**\n * Handles file selection from the native input element.\n * @param e - The DOM change event from the file input.\n */\n protected selectFile(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) {\n const f = input.files[0];\n const fileInfo = new FileInfo();\n const fileSizeMb = f.size / 1048576;\n fileInfo.file = f;\n fileInfo.valid =\n (!this.maxSizeMb() || fileSizeMb <= this.maxSizeMb()) &&\n (!this.minSizeMb() || fileSizeMb >= this.minSizeMb());\n this.setValue(fileInfo, true);\n this.fileName.set(f.name);\n this.fileSize.set(Math.round(fileSizeMb));\n }\n }\n\n /**\n * Checks whether a file is currently selected.\n * @returns `true` if a file is attached to the current value.\n */\n protected hasFile(): boolean {\n return !!(this._value?.file);\n }\n\n /**\n * Clears the currently selected file and resets the control.\n */\n protected clearFile(): void {\n if (this.hasFile()) {\n this.fileName.set(undefined);\n this.fileSize.set(0);\n const fi = new FileInfo();\n fi.file = undefined;\n fi.valid = !this.required;\n this.setValue(fi, true);\n this.__file().nativeElement.value = '';\n }\n }\n\n /**\n * Emits the `download` output event if the file is not newly added.\n */\n protected downloadFile(): void {\n if (!this.isNew()) this.download.emit();\n }\n\n /**\n * Emits the `preview` output event if the file is not new and preview is enabled.\n */\n protected previewFile(): void {\n if (!this.isNew() && this.canPreview()) this.preview.emit();\n }\n}\n","<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\n <mat-label>{{placeholder}}</mat-label>\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\n <input [formField]=\"nameForm.name\" [id]=\"id\" matInput />\n @if (hasFile()) {\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\" [disabled]=\"disabled\">\n <mat-icon>close</mat-icon>\n </button>\n }\n @if (!disabled) {\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\n matTooltip=\"Seleziona\" [disabled]=\"disabled\">\n <mat-icon>add</mat-icon>\n </button>\n }\n @if (!isNew() && canPreview()) {\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\" [disabled]=\"disabled\">\n <mat-icon>preview</mat-icon>\n </button>\n }\n @if (!isNew()) {\n <button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\n matTooltip=\"Scarica\" [disabled]=\"disabled\">\n <mat-icon>save_alt</mat-icon>\n </button>\n }\n @if (hasFile() && fileSize() > 0) {\n <mat-hint align=\"start\">{{fileSize()}} MB</mat-hint>\n }\n @if (hasFile() && fileSize() == 0) {\n <mat-hint align=\"start\">\n &gt; 1 MB</mat-hint>\n } @if (maxSizeMb()) {\n <mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\n </mat-hint>\n }\n @if (nameForm.name().invalid()) {\n <mat-error>{{ getFieldErrorMessage(nameForm.name().errors()) }}</mat-error>\n }\n</mat-form-field>","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent } from '@angular/material/dialog';\nimport { SafeUrlPipe } from '@arsedizioni/ars-utils/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport interface FilePreviewDialogData {\n url?: string;\n embed?: boolean;\n authToken?: string;\n}\n\n\n@Component({\n templateUrl: './file-preview.component.html',\n styleUrl: './file-preview.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogContent, FlexLayoutModule, MatDialogActions, MatButtonModule, MatTooltipModule,\n MatDialogClose, SafeUrlPipe]\n})\nexport class FilePreviewComponent {\n readonly iframe = viewChild<ElementRef>('iframe');\n private readonly httpClient = inject(HttpClient);\n private readonly dialogService = inject(DialogService);\n protected readonly dialogData = inject<FilePreviewDialogData>(MAT_DIALOG_DATA) ?? {};\n protected readonly url = signal<string | null>(null);\n\n constructor() {\n // Revoke the blob object URL on destroy: createObjectURL keeps the whole\n // downloaded blob alive until revoked — repeated previews leaked memory.\n inject(DestroyRef).onDestroy(() => {\n const u = this.url();\n if (u?.startsWith('blob:')) URL.revokeObjectURL(u);\n });\n\n const data = this.dialogData;\n if (!data?.url) return;\n\n if (!data.embed) {\n this.dialogService.setBusy('Download in corso...');\n this.httpClient.get(data.url, {\n headers: data.authToken\n ? new HttpHeaders().set('Authorization', data.authToken)\n : new HttpHeaders(),\n responseType: 'blob'\n })\n .pipe(takeUntilDestroyed())\n .subscribe({\n next: (res: Blob) => {\n this.url.set(URL.createObjectURL(res));\n this.dialogService.clearBusy();\n },\n error: () => {\n this.dialogService.clearBusy();\n }\n });\n } else {\n this.url.set('https://view.officeapps.live.com/op/embed.aspx?src=' + encodeURIComponent(data.url));\n }\n }\n\n /**\n * Handles the iframe load event: scrolls to the top and centers a single image when present.\n */\n protected loaded(): void {\n const iframe = this.iframe()?.nativeElement;\n if (!iframe) { return; }\n \n try {\n iframe.contentWindow?.scrollTo(0, 0);\n \n // Resize and center single image\n if (!this.dialogData?.embed && iframe.contentDocument) { \n const images = iframe.contentDocument.querySelectorAll('img') || [];\n if (images.length === 1) { \n Object.assign(images[0].style, {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n maxWidth: images[0].style.maxWidth || '100%',\n maxHeight: images[0].style.maxHeight || '100%'\n });\n const iframeBody = iframe.contentDocument.body;\n if (iframeBody && !iframeBody.style.height) {\n iframeBody.style.height = '100%';\n }\n }\n }\n } catch (e) {\n console.error('Impossibile accedere al contenuto dell\\'iframe:', e);\n }\n }\n\n /**\n * Opens the current file URL in a new browser tab for manual download.\n */\n protected download(): void {\n const currentUrl = this.url();\n if (currentUrl) {\n window.open(currentUrl, '_blank');\n }\n }\n\n /**\n * Displays a help dialog with browser-specific instructions for enabling PDF preview.\n */\n protected troubles(): void {\n this.dialogService.info(\n \"<p>Se non riesci a visualizzare l'anteprima dei file PDF probabilmente devi abilitare un'impostazione del tuo browser.</p>\" +\n \"<b>Per Google Chrome</b><br>\" +\n \"<p class='small' style='padding-left:10px'><i>impostazioni > privacy e sicurezza > impostazioni sito > documenti PDF</i></p>\" +\n \"<b>Per Microsoft Edge</b><br>\" +\n \"<p class='small' style='padding-left:10px'><i>impostazioni > cookie e autorizzazioni sito > documenti PDF</i></p>\" +\n \"<b>Per Mozilla Firefox</b><br>\" +\n \"<p class='small' style='padding-left:10px'><i>impostazioni > generale > applicazioni</i></p>\" +\n \"<b>Altri browser</b><br>\" +\n \"<p class='small' style='padding-left:10px'>Fate riferimento alla documentazione specifica del vostro browser.</p>\",\n \"Problemi con le anteprime dei file PDF?\"\n )\n }\n}\n\n\n\n","<mat-dialog-content class=\"file-preview\" id=\"file-preview-scrollable\">\r\n <div class=\"content\">\r\n @if (!url()) {\r\n <div class=\"loading\">Caricamento in corso...</div>\r\n } @else {\r\n <iframe class=\"iframe\" #iframe (load)=\"loaded()\" [src]=\"url() | safeUrl\"></iframe>\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n<mat-dialog-actions id=\"file-preview-fixed\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"50\">\r\n <button mat-stroked-button (click)=\"troubles()\"\r\n matTooltip=\"Fai click se non riesci a visualizzare l'anteprima dei file PDF\">Problemi con i PDF?</button>\r\n </div>\r\n <div fxFlex=\"50\" fxLayoutAlign=\"end\">\r\n <button mat-stroked-button (click)=\"download()\">Scarica</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\nimport { FlexLayoutModule, SelectFile, SelectFileDialogData } from '@arsedizioni/ars-utils/ui';\nimport { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\n\n@Component({\n templateUrl: './select-file-dialog.component.html',\n styleUrl: './select-file-dialog.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogTitle, MatDialogContent, FlexLayoutModule, MatButtonModule, MatCheckboxModule,\n MatDialogActions, MatDialogClose, SafeHtmlPipe]\n})\nexport class SelectFileDialogComponent {\n readonly done = output<SelectFile>();\n private readonly dialogService = inject(DialogService);\n private readonly dialogRef = inject(MatDialogRef<SelectFileDialogComponent>);\n protected readonly dialogData = signal<SelectFileDialogData>(inject(MAT_DIALOG_DATA) ?? {});\n protected readonly file = signal<File | undefined>(undefined);\n protected fileClass = signal<'selectfile-file' | 'selectfile-file-drop'>('selectfile-file');\n\n /**\n * Handles the native file input change event and delegates to `selectFile`.\n * @param e - The DOM change event from the file input.\n */\n protected update(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) {\n this.selectFile(input.files[0]);\n }\n }\n\n /**\n * Validates and sets the selected file, showing an error if size or type constraints are violated.\n * @param file - The `File` object to validate and store.\n */\n private selectFile(file: File): void {\n const data = this.dialogData();\n const maxSize = data.maxSize ?? 0;\n if (maxSize > 0) {\n const size = file.size / 1048576;\n if (size > maxSize) {\n this.dialogService.error(`File troppo grande (massimo ${SystemUtils.formatFileSize(maxSize * 1048576)})`);\n return;\n }\n }\n if (data.accept) {\n const accept = data.accept.toLowerCase();\n const a = file.name.split('.').pop()?.toLowerCase();\n let b = file.type.toLowerCase();\n if (b.startsWith('image/') && accept.includes('image/*')) {\n b = 'image/*';\n } else if (b.startsWith('video/') && accept.includes('video/*')) {\n b = 'video/*';\n } else if (b.startsWith('audio/') && accept.includes('audio/*')) {\n b = 'audio/*';\n }\n if (!accept.includes(a ?? '') && !accept.includes(b)) {\n this.dialogService.error(`Sono accettati solo questi tipi di file: ${accept}`);\n return;\n }\n }\n this.file.set(file);\n }\n\n /**\n * Formats a byte count into a human-readable size string.\n * @param size - File size in bytes.\n * @returns A formatted size string (e.g. \"1.2 MB\").\n */\n protected size(size: number): string {\n return SystemUtils.formatFileSize(size);\n }\n\n /** Emits the selected file and options, then closes the dialog. */\n protected ok(): void {\n this.done.emit({ file: this.file(), options: this.dialogData().options });\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n\n /** Highlights the drop zone when a drag enters the area.\n * @param e - The drag event.\n */\n protected onDragOver(e: DragEvent): void {\n this.fileClass.set('selectfile-file-drop');\n e.preventDefault();\n }\n\n /** Highlights the drop zone when a dragged item enters.\n * @param e - The drag event.\n */\n protected onDragEnter(e: DragEvent): void {\n this.fileClass.set('selectfile-file-drop');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when dragging ends.\n * @param e - The drag event.\n */\n protected onDragEnd(e: DragEvent): void {\n this.fileClass.set('selectfile-file');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when a dragged item leaves the area.\n * @param e - The drag event.\n */\n protected onDragLeave(e: DragEvent): void {\n this.fileClass.set('selectfile-file');\n e.preventDefault();\n }\n\n /**\n * Handles a file drop event, extracting and processing the dropped files.\n * @param e - The drop event.\n */\n protected onDrop(e: DragEvent): void {\n this.fileClass.set('selectfile-file');\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer?.files?.length) {\n this.addFiles(e.dataTransfer.files);\n }\n }\n\n /**\n * Picks the first file from the list and passes it to `selectFile`.\n * @param files - The `FileList` from the drag-and-drop event.\n */\n private addFiles(files: FileList): void {\n if (files.length > 0) {\n this.selectFile(files[0]);\n }\n }\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n@if (dialogData().description) {\n<div class=\"selectfile-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n}\n<mat-dialog-content class=\"dialog-content\">\n <div fxLayout=\"column\" fxLayoutGap=\"24px\" fxLayoutAlign=\"center center\" fxFill>\n <div fxFlex=\"*\" [class]=\"fileClass()\" (drop)=\"onDrop($event)\" (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\" (dragenter)=\"onDragEnter($event)\" (dragend)=\"onDragEnd($event)\">\n <div fxLayout=\"column\" fxLayoutGap=\"24px\" fxLayoutAlign=\"center center\" fxFill>\n <div fxFlex=\"10px\" fxFlexAlign=\"start\" class=\"x-small secondary\"><i>Trascina qui il file o selezionalo</i></div>\n <div>\n <input #_file type=\"file\" [accept]=\"dialogData().accept\" [hidden]=\"true\" (change)=\"update($event)\" />\n <button type=\"button\" mat-stroked-button (click)=\"_file.click()\">Seleziona file...</button>\n </div>\n @if (file()) {\n <div style=\"padding:0 24px\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFill>\n <div class=\"small accent bold\"><i>{{file().name}}</i></div>\n <div class=\"small\">Dimensioni: <i>{{size(file().size)}}</i></div>\n </div>\n </div>\n }\n </div>\n </div>\n @if (dialogData().options) {\n <div style=\"padding-bottom: 24px;\">\n @for (o of dialogData().options; track o; let i = $index) {\n <div>\n <mat-checkbox (change)=\"o.selected = $event.checked\" [checked]=\"o.selected === true\" name=\"opt_{{i}}\" >\n {{o.description}}\n </mat-checkbox>\n </div>\n }\n </div>\n }\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\n <div fxFlex=\"50\">\n @if (dialogData().helpLink) {\n <a mat-stroked-button href=\"{{dialogData().helpLink}}\" target=\"_blank\">{{dialogData().helpCaption}}</a>\n }\n </div>\n <div fxFlex=\"50\" fxLayoutAlign=\"end\">\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"!file()\">{{dialogData().okCaption}}</button>\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\n </div>\n </div>\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\nimport { FlexLayoutModule, SelectFile, SelectPictureFileDialogData } from '@arsedizioni/ars-utils/ui';\nimport { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\nimport { SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\n\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n templateUrl: './select-picture-dialog.component.html',\n styleUrl: './select-picture-dialog.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogTitle, MatDialogContent, FlexLayoutModule, MatButtonModule, MatCheckboxModule,\n MatDialogActions, MatDialogClose, SafeHtmlPipe]\n})\nexport class SelectPictureDialogComponent {\n readonly done = output<SelectFile>();\n private readonly dialogService = inject(DialogService);\n private readonly dialogRef = inject(MatDialogRef<SelectPictureDialogComponent>);\n protected readonly dialogData = signal<SelectPictureFileDialogData>(inject(MAT_DIALOG_DATA) ?? {});\n protected readonly file = signal<File | undefined>(undefined);\n protected fileClass = signal<'selectpicture-file' | 'selectpicture-file-drop'>('selectpicture-file');\n protected pictureWidth = signal<number>(0);\n protected pictureHeight = signal<number>(0);\n protected picturePreview = signal<any>(undefined);\n\n /**\n * Handles the native file input change event and delegates to `selectFile`.\n * @param e - The DOM change event from the file input.\n */\n protected update(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) {\n this.selectFile(input.files[0]);\n }\n }\n\n /**\n * Validates the file size and type, then reads it as a data URL to generate a preview.\n * @param file - The `File` object to validate and preview.\n */\n private selectFile(file: File): void {\n const data = this.dialogData();\n const maxSize = data.maxSize ?? 0;\n if (maxSize > 0) {\n const size = file.size / 1048576;\n if (size > maxSize) {\n this.dialogService.error(`File troppo grande (massimo ${SystemUtils.formatFileSize(maxSize * 1048576)})`);\n return;\n }\n }\n if (data.accept) {\n const accept = data.accept.toLowerCase();\n const a = file.name.split('.').pop()?.toLowerCase();\n let b = file.type.toLowerCase();\n if (b.startsWith('image/') && accept.includes('image/*')) {\n b = 'image/*';\n } else if (b.startsWith('video/') && accept.includes('video/*')) {\n b = 'video/*';\n } else if (b.startsWith('audio/') && accept.includes('audio/*')) {\n b = 'audio/*';\n }\n if (!accept.includes(a ?? '') && !accept.includes(b)) {\n this.dialogService.error(`Sono accettati solo questi tipi di file: ${accept}`);\n return;\n }\n }\n const reader = new FileReader();\n reader.onload = (_e: ProgressEvent<FileReader>) => {\n const img = new Image();\n img.onload = () => {\n const maxWidth = data.maxWidth ?? 0;\n if (maxWidth > 0 && img.width > maxWidth) {\n this.dialogService.error(`Immagine troppo larga (massimo ${maxWidth} pixel)`);\n return;\n }\n const maxHeight = data.maxHeight ?? 0;\n if (maxHeight > 0 && img.height > maxHeight) {\n this.dialogService.error(`Immagine troppo alta (massimo ${maxHeight} pixel)`);\n return;\n }\n this.pictureWidth.set(img.width);\n this.pictureHeight.set(img.height);\n this.picturePreview.set((_e.target as FileReader).result);\n this.file.set(file);\n };\n img.src = (_e.target as FileReader).result as string;\n };\n reader.readAsDataURL(file);\n }\n\n /**\n * Formats a byte count into a human-readable size string.\n * @param size - File size in bytes.\n * @returns A formatted size string (e.g. \"1.2 MB\").\n */\n protected size(size: number): string {\n return SystemUtils.formatFileSize(size);\n }\n\n /** Emits the selected file and options, then closes the dialog. */\n protected ok(): void {\n this.done.emit({ file: this.file(), options: this.dialogData().options });\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n\n /** Highlights the drop zone when a dragged item is over it.\n * @param e - The drag event.\n */\n protected onDragOver(e: DragEvent): void {\n this.fileClass.set('selectpicture-file-drop');\n e.preventDefault();\n }\n\n /** Highlights the drop zone when a dragged item enters.\n * @param e - The drag event.\n */\n protected onDragEnter(e: DragEvent): void {\n this.fileClass.set('selectpicture-file-drop');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when dragging ends.\n * @param e - The drag event.\n */\n protected onDragEnd(e: DragEvent): void {\n this.fileClass.set('selectpicture-file');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when a dragged item leaves.\n * @param e - The drag event.\n */\n protected onDragLeave(e: DragEvent): void {\n this.fileClass.set('selectpicture-file');\n e.preventDefault();\n }\n\n /**\n * Handles a file drop event, extracting and processing the dropped image.\n * @param e - The drop event.\n */\n protected onDrop(e: DragEvent): void {\n this.fileClass.set('selectpicture-file');\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer?.files?.length) {\n this.addFiles(e.dataTransfer.files);\n }\n }\n\n /**\n * Picks the first file from the list and passes it to `selectFile`.\n * @param files - The `FileList` from the drag-and-drop event.\n */\n private addFiles(files: FileList): void {\n if (files.length > 0) {\n this.selectFile(files[0]);\n }\n }\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n@if (dialogData().description) {\n<div class=\"selectpicture-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n}\n<mat-dialog-content class=\"dialog-content\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxLayoutGap=\"24px\" fxFill>\n <div fxFlex=\"*\" [class]=\"fileClass()\" (drop)=\"onDrop($event)\" (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\" (dragenter)=\"onDragEnter($event)\" (dragend)=\"onDragEnd($event)\">\n <div fxLayout=\"column\" fxLayoutGap=\"24px\" fxLayoutAlign=\"center center\" fxFill>\n <div fxFlex=\"10px\" fxFlexAlign=\"start\" class=\"x-small secondary\"><i>Trascina qui l'immagine o selezionala</i></div>\n <div>\n <input #_file type=\"file\" [hidden]=\"true\" [accept]=\"dialogData().accept ?? 'image/*'\"\n (change)=\"update($event)\" />\n <button type=\"button\" mat-stroked-button (click)=\"_file.click()\">Seleziona file...</button>\n </div>\n @if (file()) {\n <div style=\"padding:0 24px\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFill>\n <img [src]=\"picturePreview()\" class=\"selectpicture-preview\">\n <div class=\"small accent bold \"><i>{{file().name}}</i></div>\n <div class=\"small\">Dimensioni:<i>{{pictureWidth()}} x {{pictureHeight()}} ({{size(file().size)}})</i></div>\n </div>\n </div>\n }\n </div>\n </div>\n @if (dialogData().options) {\n <div style=\"padding-bottom: 24px;\">\n @for (o of dialogData().options; track o; let i = $index) {\n <div>\n <mat-checkbox (change)=\"o.selected = $event.checked\" [checked]=\"o.selected === true\" name=\"opt_{{i}}\" >\n {{o.description}}\n </mat-checkbox>\n </div>\n }\n </div>\n }\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"!file()\">{{dialogData().okCaption}}</button>\n <button mat-stroked-button mat-dialog-close >Annulla</button>\n </div>\n</mat-dialog-actions>\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.files\n */\nexport * from './file-input/file-input.component';\nexport * from './file-preview/file-preview.component';\nexport * from './select-file/select-file-dialog.component';\nexport * from './select-picture/select-picture-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["requiredSchema","disabledSchema","fileSizeSchema","i4","i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"arsedizioni-ars-utils-ui.files.mjs","sources":["../../../projects/ars-utils/ui.files/file-input/file-input.component.ts","../../../projects/ars-utils/ui.files/file-input/file-input.component.html","../../../projects/ars-utils/ui.files/file-preview/file-preview.component.ts","../../../projects/ars-utils/ui.files/file-preview/file-preview.component.html","../../../projects/ars-utils/ui.files/select-file/select-file-dialog.component.ts","../../../projects/ars-utils/ui.files/select-file/select-file-dialog.component.html","../../../projects/ars-utils/ui.files/select-picture/select-picture-dialog.component.ts","../../../projects/ars-utils/ui.files/select-picture/select-picture-dialog.component.html","../../../projects/ars-utils/ui.files/public_api.ts","../../../projects/ars-utils/ui.files/arsedizioni-ars-utils-ui.files.ts"],"sourcesContent":["import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { afterNextRender, ChangeDetectionStrategy, Component, DoCheck, effect, ElementRef, Input, OnDestroy, Optional, Renderer2, Self, inject, input, model, output, signal, viewChild } from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { FormField, disabled as disabledSchema, form, required as requiredSchema } from '@angular/forms/signals';\nimport { fileSize as fileSizeSchema, notEmpty, SignalsUtils } from '@arsedizioni/ars-utils/core.validators';\nimport { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';\nimport { FileInfo, SystemUtils } from '@arsedizioni/ars-utils/core';\nimport { Subject } from 'rxjs';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatInputModule } from '@angular/material/input';\nimport { UIService } from '@arsedizioni/ars-utils/ui';\n\n@Component({\n selector: 'file-input',\n templateUrl: './file-input.component.html',\n styleUrl: './file-input.component.scss',\n providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatFormFieldModule, MatInputModule, FormField, MatButtonModule,\n MatIconModule, MatTooltipModule],\n host: {\n '[id]': 'id',\n '[class.floating]': 'shouldLabelFloat',\n '[attr.aria-describedBy]': 'describedBy',\n },\n})\nexport class FileInputComponent\n implements\n OnDestroy,\n DoCheck,\n MatFormFieldControl<FileInfo>,\n ControlValueAccessor {\n /** Error text of a field: the message declared in the schema, or the shared fallback. */\n protected readonly getErrorMessage = SignalsUtils.getFieldErrorMessage;\n\n\n /** Reference to the hidden native file input element. */\n protected readonly __file = viewChild.required<ElementRef>('__file');\n\n private readonly renderer = inject(Renderer2);\n private readonly uiService = inject(UIService);\n\n // Initialize\n static nextId = 0;\n readonly stateChanges = new Subject<void>();\n private previousNativeValue: any;\n controlType: string = 'file-input';\n focused = false;\n\n /** Whether the device supports camera capture. */\n protected readonly canCapture = signal<boolean>(false);\n\n /** Size in MB of the currently selected file. */\n protected readonly fileSize = signal<number>(0);\n\n private readonly _placeholder = signal<string>('');\n\n private _value: FileInfo = new FileInfo();\n set value(value: FileInfo) {\n this.setValue(value, true);\n }\n\n /**\n * Updates the internal state. Form propagation is skipped for model->view\n * writes (writeValue) to avoid the CVA echo loop, and performed for\n * user-driven changes (selectFile/clearFile) and the public value setter.\n * @param value - The new file info to store and display.\n * @param propagate - When `true`, notifies the registered onChange callback.\n */\n private setValue(value: FileInfo, propagate: boolean): void {\n this._value = value;\n if (propagate) {\n this.propagateChange(this._value);\n }\n this.stateChanges.next();\n this.changed.emit(this._value);\n }\n get value() {\n return this._value;\n }\n get size() {\n return this._value?.file?.size;\n }\n\n /** Backing signal so the internal form schema reacts to `required` changes. */\n private readonly _required = signal<boolean>(false);\n @Input()\n get required() {\n return this._required();\n }\n set required(value: boolean) {\n this._required.set(coerceBooleanProperty(value));\n this.stateChanges.next();\n }\n /** Backing signal so the internal form schema reacts to `disabled` changes. */\n private readonly _disabled = signal<boolean>(false);\n @Input()\n get disabled() {\n if (this.ngControl && this.ngControl.disabled != null) {\n return this.ngControl.disabled;\n }\n return this._disabled();\n }\n set disabled(value: boolean) {\n this._disabled.set(coerceBooleanProperty(value));\n if (this.focused) {\n this.focused = false;\n this.stateChanges.next();\n }\n }\n @Input()\n get placeholder(): string {\n return this._placeholder();\n }\n set placeholder(value: string) {\n this._placeholder.set(value);\n this.stateChanges.next();\n }\n\n /** The currently displayed file name. Can be bound two-way from outside or updated on file selection. */\n readonly fileName = model<string | undefined>(undefined);\n readonly maxSizeMb = input<number>(5);\n readonly minSizeMb = input<number>(0);\n readonly isNew = input<boolean>(false);\n readonly canPreview = input<boolean>(false);\n readonly appearance = input<'fill' | 'outline' | undefined>(this.uiService.appearance());\n readonly accept = input<string>();\n get empty(): boolean {\n return !this._value || !this._value.file;\n }\n /** True when the control has validation errors and has been touched. */\n get errorState(): boolean {\n return (this.ngControl?.errors != null) && (this.ngControl?.touched ?? false);\n }\n\n id = `${this.controlType}-${FileInputComponent.nextId++}`;\n\n /** True when the label should float above the field. */\n get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n describedBy = '';\n\n readonly changed = output<FileInfo>();\n readonly download = output();\n readonly preview = output();\n\n /** Model backing the internal display form: the (readonly) file-name text. */\n private readonly nameModel = signal<{ name: string }>({ name: '' });\n\n /**\n * Internal signal form for the file-name input. It reproduces the previous\n * template-driven validators: `required` follows the `required` input and the\n * size rule mirrors FileSizeValidatorDirective (empty name is left to `required`).\n */\n protected readonly nameForm = form(this.nameModel, p => {\n requiredSchema(p.name, { when: () => this._required() });\n notEmpty(p.name, { when: () => this._required() });\n // The outer-form path is covered by setDisabledState, which writes the DOM directly.\n disabledSchema(p.name, () => this._disabled());\n // The shared rule, so the message comes from the same table as everywhere else.\n fileSizeSchema(p.name, () => this.fileSize(), () => this.maxSizeMb(), () => this.minSizeMb());\n });\n\n private propagateChange: (_: any) => void = (_: any) => { };\n private propagateTouched: () => void = () => { };\n\n\n constructor(\n @Optional() @Self() public ngControl: NgControl) {\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n\n // Keep the internal form model in sync with the two-way bindable fileName.\n effect(() => this.nameModel.set({ name: this.fileName() ?? '' }));\n\n // Detect camera availability and set the default placeholder after the first render.\n // The file-name input is also made read-only imperatively: marking the field as\n // readonly in the form schema would skip its validation entirely by design.\n afterNextRender(() => {\n this.setupDevices();\n const elem = document.getElementById(this.id);\n if (elem) {\n this.renderer.setProperty(elem, 'readOnly', true);\n }\n });\n }\n\n /**\n * Detects camera availability and updates the placeholder accordingly.\n */\n private async setupDevices(): Promise<void> {\n this.canCapture.set(false);\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ video: true });\n if (stream) {\n this.canCapture.set(true);\n }\n } catch { }\n }\n if (!this.placeholder || this.placeholder === 'Seleziona file') {\n this._placeholder.set(\n this.canCapture()\n ? 'Seleziona file o acquisisci con fotocamera'\n : 'Seleziona file'\n );\n }\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n ngDoCheck(): void {\n this.updateInputDirtyCheck();\n }\n\n /**\n * Writes a new value to the component (called by the form layer).\n * @param value - The new file info to display.\n */\n writeValue(value: any): void {\n // Model -> view write: must NOT propagate back to the form (echo loop)\n this.setValue(value as FileInfo, false);\n }\n\n /**\n * Registers the on-change callback (called by the form layer).\n * @param fn - Callback to invoke whenever the value changes.\n */\n registerOnChange(fn: any): void {\n this.propagateChange = fn;\n }\n\n /**\n * Registers the on-touched callback (called by the form layer).\n * @param fn - Callback to invoke when the control is touched.\n */\n registerOnTouched(fn: any): void {\n this.propagateTouched = fn;\n }\n\n /**\n * Sets the ARIA describedby attribute from the given element IDs.\n * @param ids - Array of element IDs that describe this control.\n */\n setDescribedByIds(ids: string[]): void {\n this.describedBy = ids.join(' ');\n }\n\n /**\n * Updates the disabled state of the underlying native element.\n * @param isDisabled - Whether the control should be disabled.\n */\n setDisabledState?(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n if (!SystemUtils.isBrowser()) return;\n const elem = document.getElementById(this.id);\n if (elem) {\n this.renderer.setProperty(elem, 'disabled', isDisabled);\n }\n }\n\n /** Focuses the native input element and marks the control as touched. */\n onContainerClick(): void {\n if (!this.focused) {\n if (!SystemUtils.isBrowser()) return;\n const elem = document.getElementById(this.id);\n if (elem) {\n elem.focus();\n this.propagateTouched();\n }\n }\n }\n\n /**\n * Checks whether the value has changed since the last dirty check and emits `stateChanges` if needed.\n */\n protected updateInputDirtyCheck(): void {\n const newValue = this._value;\n if (this.previousNativeValue !== newValue) {\n this.previousNativeValue = newValue;\n this.stateChanges.next();\n }\n }\n\n /**\n * Handles file selection from the native input element.\n * @param e - The DOM change event from the file input.\n */\n protected selectFile(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) {\n const f = input.files[0];\n const fileInfo = new FileInfo();\n const fileSizeMb = f.size / 1048576;\n fileInfo.file = f;\n fileInfo.valid =\n (!this.maxSizeMb() || fileSizeMb <= this.maxSizeMb()) &&\n (!this.minSizeMb() || fileSizeMb >= this.minSizeMb());\n this.setValue(fileInfo, true);\n this.fileName.set(f.name);\n this.fileSize.set(Math.round(fileSizeMb));\n }\n }\n\n /**\n * Checks whether a file is currently selected.\n * @returns `true` if a file is attached to the current value.\n */\n protected hasFile(): boolean {\n return !!(this._value?.file);\n }\n\n /**\n * Clears the currently selected file and resets the control.\n */\n protected clearFile(): void {\n if (this.hasFile()) {\n this.fileName.set(undefined);\n this.fileSize.set(0);\n const fi = new FileInfo();\n fi.file = undefined;\n fi.valid = !this.required;\n this.setValue(fi, true);\n this.__file().nativeElement.value = '';\n }\n }\n\n /**\n * Emits the `download` output event if the file is not newly added.\n */\n protected downloadFile(): void {\n if (!this.isNew()) this.download.emit();\n }\n\n /**\n * Emits the `preview` output event if the file is not new and preview is enabled.\n */\n protected previewFile(): void {\n if (!this.isNew() && this.canPreview()) this.preview.emit();\n }\n}\n","<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\n <mat-label>{{placeholder}}</mat-label>\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\n <input [formField]=\"nameForm.name\" [id]=\"id\" matInput />\n @if (hasFile()) {\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\" [disabled]=\"disabled\">\n <mat-icon>close</mat-icon>\n </button>\n }\n @if (!disabled) {\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\n matTooltip=\"Seleziona\" [disabled]=\"disabled\">\n <mat-icon>add</mat-icon>\n </button>\n }\n @if (!isNew() && canPreview()) {\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\" [disabled]=\"disabled\">\n <mat-icon>preview</mat-icon>\n </button>\n }\n @if (!isNew()) {\n <button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\n matTooltip=\"Scarica\" [disabled]=\"disabled\">\n <mat-icon>save_alt</mat-icon>\n </button>\n }\n @if (hasFile() && fileSize() > 0) {\n <mat-hint align=\"start\">{{fileSize()}} MB</mat-hint>\n }\n @if (hasFile() && fileSize() == 0) {\n <mat-hint align=\"start\">\n &gt; 1 MB</mat-hint>\n } @if (maxSizeMb()) {\n <mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\n </mat-hint>\n }\n @if (nameForm.name().invalid()) {\n <mat-error>{{ getErrorMessage(nameForm.name().errors()) }}</mat-error>\n }\n</mat-form-field>","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\nimport { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent } from '@angular/material/dialog';\nimport { SafeUrlPipe } from '@arsedizioni/ars-utils/core';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatButtonModule } from '@angular/material/button';\n\nexport interface FilePreviewDialogData {\n url?: string;\n embed?: boolean;\n authToken?: string;\n}\n\n\n@Component({\n templateUrl: './file-preview.component.html',\n styleUrl: './file-preview.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogContent, FlexLayoutModule, MatDialogActions, MatButtonModule, MatTooltipModule,\n MatDialogClose, SafeUrlPipe]\n})\nexport class FilePreviewComponent {\n readonly iframe = viewChild<ElementRef>('iframe');\n private readonly httpClient = inject(HttpClient);\n private readonly dialogService = inject(ShellService);\n protected readonly dialogData = inject<FilePreviewDialogData>(MAT_DIALOG_DATA) ?? {};\n protected readonly url = signal<string | null>(null);\n\n constructor() {\n // Revoke the blob object URL on destroy: createObjectURL keeps the whole\n // downloaded blob alive until revoked — repeated previews leaked memory.\n inject(DestroyRef).onDestroy(() => {\n const u = this.url();\n if (u?.startsWith('blob:')) URL.revokeObjectURL(u);\n });\n\n const data = this.dialogData;\n if (!data?.url) return;\n\n if (!data.embed) {\n this.dialogService.setBusy('Download in corso...');\n this.httpClient.get(data.url, {\n headers: data.authToken\n ? new HttpHeaders().set('Authorization', data.authToken)\n : new HttpHeaders(),\n responseType: 'blob'\n })\n .pipe(takeUntilDestroyed())\n .subscribe({\n next: (res: Blob) => {\n this.url.set(URL.createObjectURL(res));\n this.dialogService.clearBusy();\n },\n error: () => {\n this.dialogService.clearBusy();\n }\n });\n } else {\n this.url.set('https://view.officeapps.live.com/op/embed.aspx?src=' + encodeURIComponent(data.url));\n }\n }\n\n /**\n * Handles the iframe load event: scrolls to the top and centers a single image when present.\n */\n protected loaded(): void {\n const iframe = this.iframe()?.nativeElement;\n if (!iframe) { return; }\n \n try {\n iframe.contentWindow?.scrollTo(0, 0);\n \n // Resize and center single image\n if (!this.dialogData?.embed && iframe.contentDocument) { \n const images = iframe.contentDocument.querySelectorAll('img') || [];\n if (images.length === 1) { \n Object.assign(images[0].style, {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n maxWidth: images[0].style.maxWidth || '100%',\n maxHeight: images[0].style.maxHeight || '100%'\n });\n const iframeBody = iframe.contentDocument.body;\n if (iframeBody && !iframeBody.style.height) {\n iframeBody.style.height = '100%';\n }\n }\n }\n } catch (e) {\n console.error('Impossibile accedere al contenuto dell\\'iframe:', e);\n }\n }\n\n /**\n * Opens the current file URL in a new browser tab for manual download.\n */\n protected download(): void {\n const currentUrl = this.url();\n if (currentUrl) {\n window.open(currentUrl, '_blank');\n }\n }\n\n /**\n * Displays a help dialog with browser-specific instructions for enabling PDF preview.\n */\n protected troubles(): void {\n this.dialogService.info(\n \"<p>Se non riesci a visualizzare l'anteprima dei file PDF probabilmente devi abilitare un'impostazione del tuo browser.</p>\" +\n \"<b>Per Google Chrome</b><br>\" +\n \"<p class='small' style='padding-left:10px'><i>impostazioni > privacy e sicurezza > impostazioni sito > documenti PDF</i></p>\" +\n \"<b>Per Microsoft Edge</b><br>\" +\n \"<p class='small' style='padding-left:10px'><i>impostazioni > cookie e autorizzazioni sito > documenti PDF</i></p>\" +\n \"<b>Per Mozilla Firefox</b><br>\" +\n \"<p class='small' style='padding-left:10px'><i>impostazioni > generale > applicazioni</i></p>\" +\n \"<b>Altri browser</b><br>\" +\n \"<p class='small' style='padding-left:10px'>Fate riferimento alla documentazione specifica del vostro browser.</p>\",\n \"Problemi con le anteprime dei file PDF?\"\n )\n }\n}\n\n\n\n","<mat-dialog-content class=\"file-preview\" id=\"file-preview-scrollable\">\r\n <div class=\"content\">\r\n @if (!url()) {\r\n <div class=\"loading\">Caricamento in corso...</div>\r\n } @else {\r\n <iframe class=\"iframe\" #iframe (load)=\"loaded()\" [src]=\"url() | safeUrl\"></iframe>\r\n }\r\n </div>\r\n</mat-dialog-content>\r\n<mat-dialog-actions id=\"file-preview-fixed\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"50\">\r\n <button mat-stroked-button (click)=\"troubles()\"\r\n matTooltip=\"Fai click se non riesci a visualizzare l'anteprima dei file PDF\">Problemi con i PDF?</button>\r\n </div>\r\n <div fxFlex=\"50\" fxLayoutAlign=\"end\">\r\n <button mat-stroked-button (click)=\"download()\">Scarica</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\" >Chiudi</button>\r\n </div>\r\n </div>\r\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\nimport { FlexLayoutModule, SelectFile, SelectFileDialogData } from '@arsedizioni/ars-utils/ui';\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MAT_DIALOG_DATA, MatDialogActions, MatDialogClose, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\nimport { SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\n\n@Component({\n templateUrl: './select-file-dialog.component.html',\n styleUrl: './select-file-dialog.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogTitle, MatDialogContent, FlexLayoutModule, MatButtonModule, MatCheckboxModule,\n MatDialogActions, MatDialogClose, SafeHtmlPipe]\n})\nexport class SelectFileDialogComponent {\n readonly done = output<SelectFile>();\n private readonly dialogService = inject(ShellService);\n private readonly dialogRef = inject(MatDialogRef<SelectFileDialogComponent>);\n protected readonly dialogData = signal<SelectFileDialogData>(inject(MAT_DIALOG_DATA) ?? {});\n protected readonly file = signal<File | undefined>(undefined);\n protected fileClass = signal<'selectfile-file' | 'selectfile-file-drop'>('selectfile-file');\n\n /**\n * Handles the native file input change event and delegates to `selectFile`.\n * @param e - The DOM change event from the file input.\n */\n protected update(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) {\n this.selectFile(input.files[0]);\n }\n }\n\n /**\n * Validates and sets the selected file, showing an error if size or type constraints are violated.\n * @param file - The `File` object to validate and store.\n */\n private selectFile(file: File): void {\n const data = this.dialogData();\n const maxSize = data.maxSize ?? 0;\n if (maxSize > 0) {\n const size = file.size / 1048576;\n if (size > maxSize) {\n this.dialogService.error(`File troppo grande (massimo ${SystemUtils.formatFileSize(maxSize * 1048576)})`);\n return;\n }\n }\n if (data.accept) {\n const accept = data.accept.toLowerCase();\n const a = file.name.split('.').pop()?.toLowerCase();\n let b = file.type.toLowerCase();\n if (b.startsWith('image/') && accept.includes('image/*')) {\n b = 'image/*';\n } else if (b.startsWith('video/') && accept.includes('video/*')) {\n b = 'video/*';\n } else if (b.startsWith('audio/') && accept.includes('audio/*')) {\n b = 'audio/*';\n }\n if (!accept.includes(a ?? '') && !accept.includes(b)) {\n this.dialogService.error(`Sono accettati solo questi tipi di file: ${accept}`);\n return;\n }\n }\n this.file.set(file);\n }\n\n /**\n * Formats a byte count into a human-readable size string.\n * @param size - File size in bytes.\n * @returns A formatted size string (e.g. \"1.2 MB\").\n */\n protected size(size: number): string {\n return SystemUtils.formatFileSize(size);\n }\n\n /** Emits the selected file and options, then closes the dialog. */\n protected ok(): void {\n this.done.emit({ file: this.file(), options: this.dialogData().options });\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n\n /** Highlights the drop zone when a drag enters the area.\n * @param e - The drag event.\n */\n protected onDragOver(e: DragEvent): void {\n this.fileClass.set('selectfile-file-drop');\n e.preventDefault();\n }\n\n /** Highlights the drop zone when a dragged item enters.\n * @param e - The drag event.\n */\n protected onDragEnter(e: DragEvent): void {\n this.fileClass.set('selectfile-file-drop');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when dragging ends.\n * @param e - The drag event.\n */\n protected onDragEnd(e: DragEvent): void {\n this.fileClass.set('selectfile-file');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when a dragged item leaves the area.\n * @param e - The drag event.\n */\n protected onDragLeave(e: DragEvent): void {\n this.fileClass.set('selectfile-file');\n e.preventDefault();\n }\n\n /**\n * Handles a file drop event, extracting and processing the dropped files.\n * @param e - The drop event.\n */\n protected onDrop(e: DragEvent): void {\n this.fileClass.set('selectfile-file');\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer?.files?.length) {\n this.addFiles(e.dataTransfer.files);\n }\n }\n\n /**\n * Picks the first file from the list and passes it to `selectFile`.\n * @param files - The `FileList` from the drag-and-drop event.\n */\n private addFiles(files: FileList): void {\n if (files.length > 0) {\n this.selectFile(files[0]);\n }\n }\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n@if (dialogData().description) {\n<div class=\"selectfile-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n}\n<mat-dialog-content class=\"dialog-content\">\n <div fxLayout=\"column\" fxLayoutGap=\"24px\" fxLayoutAlign=\"center center\" fxFill>\n <div fxFlex=\"*\" [class]=\"fileClass()\" (drop)=\"onDrop($event)\" (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\" (dragenter)=\"onDragEnter($event)\" (dragend)=\"onDragEnd($event)\">\n <div fxLayout=\"column\" fxLayoutGap=\"24px\" fxLayoutAlign=\"center center\" fxFill>\n <div fxFlex=\"10px\" fxFlexAlign=\"start\" class=\"x-small secondary\"><i>Trascina qui il file o selezionalo</i></div>\n <div>\n <input #_file type=\"file\" [accept]=\"dialogData().accept\" [hidden]=\"true\" (change)=\"update($event)\" />\n <button type=\"button\" mat-stroked-button (click)=\"_file.click()\">Seleziona file...</button>\n </div>\n @if (file()) {\n <div style=\"padding:0 24px\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFill>\n <div class=\"small accent bold\"><i>{{file().name}}</i></div>\n <div class=\"small\">Dimensioni: <i>{{size(file().size)}}</i></div>\n </div>\n </div>\n }\n </div>\n </div>\n @if (dialogData().options) {\n <div style=\"padding-bottom: 24px;\">\n @for (o of dialogData().options; track o; let i = $index) {\n <div>\n <mat-checkbox (change)=\"o.selected = $event.checked\" [checked]=\"o.selected === true\" name=\"opt_{{i}}\" >\n {{o.description}}\n </mat-checkbox>\n </div>\n }\n </div>\n }\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill>\n <div fxFlex=\"50\">\n @if (dialogData().helpLink) {\n <a mat-stroked-button href=\"{{dialogData().helpLink}}\" target=\"_blank\">{{dialogData().helpCaption}}</a>\n }\n </div>\n <div fxFlex=\"50\" fxLayoutAlign=\"end\">\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"!file()\">{{dialogData().okCaption}}</button>\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\n </div>\n </div>\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\nimport { FlexLayoutModule, SelectFile, SelectPictureFileDialogData } from '@arsedizioni/ars-utils/ui';\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\nimport { SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\n\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatButtonModule } from '@angular/material/button';\n\n@Component({\n templateUrl: './select-picture-dialog.component.html',\n styleUrl: './select-picture-dialog.component.scss',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogTitle, MatDialogContent, FlexLayoutModule, MatButtonModule, MatCheckboxModule,\n MatDialogActions, MatDialogClose, SafeHtmlPipe]\n})\nexport class SelectPictureDialogComponent {\n readonly done = output<SelectFile>();\n private readonly dialogService = inject(ShellService);\n private readonly dialogRef = inject(MatDialogRef<SelectPictureDialogComponent>);\n protected readonly dialogData = signal<SelectPictureFileDialogData>(inject(MAT_DIALOG_DATA) ?? {});\n protected readonly file = signal<File | undefined>(undefined);\n protected fileClass = signal<'selectpicture-file' | 'selectpicture-file-drop'>('selectpicture-file');\n protected pictureWidth = signal<number>(0);\n protected pictureHeight = signal<number>(0);\n protected picturePreview = signal<any>(undefined);\n\n /**\n * Handles the native file input change event and delegates to `selectFile`.\n * @param e - The DOM change event from the file input.\n */\n protected update(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files?.length) {\n this.selectFile(input.files[0]);\n }\n }\n\n /**\n * Validates the file size and type, then reads it as a data URL to generate a preview.\n * @param file - The `File` object to validate and preview.\n */\n private selectFile(file: File): void {\n const data = this.dialogData();\n const maxSize = data.maxSize ?? 0;\n if (maxSize > 0) {\n const size = file.size / 1048576;\n if (size > maxSize) {\n this.dialogService.error(`File troppo grande (massimo ${SystemUtils.formatFileSize(maxSize * 1048576)})`);\n return;\n }\n }\n if (data.accept) {\n const accept = data.accept.toLowerCase();\n const a = file.name.split('.').pop()?.toLowerCase();\n let b = file.type.toLowerCase();\n if (b.startsWith('image/') && accept.includes('image/*')) {\n b = 'image/*';\n } else if (b.startsWith('video/') && accept.includes('video/*')) {\n b = 'video/*';\n } else if (b.startsWith('audio/') && accept.includes('audio/*')) {\n b = 'audio/*';\n }\n if (!accept.includes(a ?? '') && !accept.includes(b)) {\n this.dialogService.error(`Sono accettati solo questi tipi di file: ${accept}`);\n return;\n }\n }\n const reader = new FileReader();\n reader.onload = (_e: ProgressEvent<FileReader>) => {\n const img = new Image();\n img.onload = () => {\n const maxWidth = data.maxWidth ?? 0;\n if (maxWidth > 0 && img.width > maxWidth) {\n this.dialogService.error(`Immagine troppo larga (massimo ${maxWidth} pixel)`);\n return;\n }\n const maxHeight = data.maxHeight ?? 0;\n if (maxHeight > 0 && img.height > maxHeight) {\n this.dialogService.error(`Immagine troppo alta (massimo ${maxHeight} pixel)`);\n return;\n }\n this.pictureWidth.set(img.width);\n this.pictureHeight.set(img.height);\n this.picturePreview.set((_e.target as FileReader).result);\n this.file.set(file);\n };\n img.src = (_e.target as FileReader).result as string;\n };\n reader.readAsDataURL(file);\n }\n\n /**\n * Formats a byte count into a human-readable size string.\n * @param size - File size in bytes.\n * @returns A formatted size string (e.g. \"1.2 MB\").\n */\n protected size(size: number): string {\n return SystemUtils.formatFileSize(size);\n }\n\n /** Emits the selected file and options, then closes the dialog. */\n protected ok(): void {\n this.done.emit({ file: this.file(), options: this.dialogData().options });\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n\n /** Highlights the drop zone when a dragged item is over it.\n * @param e - The drag event.\n */\n protected onDragOver(e: DragEvent): void {\n this.fileClass.set('selectpicture-file-drop');\n e.preventDefault();\n }\n\n /** Highlights the drop zone when a dragged item enters.\n * @param e - The drag event.\n */\n protected onDragEnter(e: DragEvent): void {\n this.fileClass.set('selectpicture-file-drop');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when dragging ends.\n * @param e - The drag event.\n */\n protected onDragEnd(e: DragEvent): void {\n this.fileClass.set('selectpicture-file');\n e.preventDefault();\n }\n\n /** Resets the drop zone style when a dragged item leaves.\n * @param e - The drag event.\n */\n protected onDragLeave(e: DragEvent): void {\n this.fileClass.set('selectpicture-file');\n e.preventDefault();\n }\n\n /**\n * Handles a file drop event, extracting and processing the dropped image.\n * @param e - The drop event.\n */\n protected onDrop(e: DragEvent): void {\n this.fileClass.set('selectpicture-file');\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer?.files?.length) {\n this.addFiles(e.dataTransfer.files);\n }\n }\n\n /**\n * Picks the first file from the list and passes it to `selectFile`.\n * @param files - The `FileList` from the drag-and-drop event.\n */\n private addFiles(files: FileList): void {\n if (files.length > 0) {\n this.selectFile(files[0]);\n }\n }\n}\n\n","<div mat-dialog-title [innerHTML]=\"dialogData().title | safeHtml\"></div>\n@if (dialogData().description) {\n<div class=\"selectpicture-description\" [innerHtml]=\"dialogData().description | safeHtml\"></div>\n}\n<mat-dialog-content class=\"dialog-content\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxLayoutGap=\"24px\" fxFill>\n <div fxFlex=\"*\" [class]=\"fileClass()\" (drop)=\"onDrop($event)\" (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\" (dragenter)=\"onDragEnter($event)\" (dragend)=\"onDragEnd($event)\">\n <div fxLayout=\"column\" fxLayoutGap=\"24px\" fxLayoutAlign=\"center center\" fxFill>\n <div fxFlex=\"10px\" fxFlexAlign=\"start\" class=\"x-small secondary\"><i>Trascina qui l'immagine o selezionala</i></div>\n <div>\n <input #_file type=\"file\" [hidden]=\"true\" [accept]=\"dialogData().accept ?? 'image/*'\"\n (change)=\"update($event)\" />\n <button type=\"button\" mat-stroked-button (click)=\"_file.click()\">Seleziona file...</button>\n </div>\n @if (file()) {\n <div style=\"padding:0 24px\">\n <div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFill>\n <img [src]=\"picturePreview()\" class=\"selectpicture-preview\">\n <div class=\"small accent bold \"><i>{{file().name}}</i></div>\n <div class=\"small\">Dimensioni:<i>{{pictureWidth()}} x {{pictureHeight()}} ({{size(file().size)}})</i></div>\n </div>\n </div>\n }\n </div>\n </div>\n @if (dialogData().options) {\n <div style=\"padding-bottom: 24px;\">\n @for (o of dialogData().options; track o; let i = $index) {\n <div>\n <mat-checkbox (change)=\"o.selected = $event.checked\" [checked]=\"o.selected === true\" name=\"opt_{{i}}\" >\n {{o.description}}\n </mat-checkbox>\n </div>\n }\n </div>\n }\n </div>\n</mat-dialog-content>\n<mat-dialog-actions>\n <div fxLayout=\"row\" fxLayoutAlign=\"end\" fxFill>\n <button mat-flat-button (click)=\"ok()\" [disabled]=\"!file()\">{{dialogData().okCaption}}</button>\n <button mat-stroked-button mat-dialog-close >Annulla</button>\n </div>\n</mat-dialog-actions>\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.files\n */\nexport * from './file-input/file-input.component';\nexport * from './file-preview/file-preview.component';\nexport * from './select-file/select-file-dialog.component';\nexport * from './select-picture/select-picture-dialog.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["requiredSchema","disabledSchema","fileSizeSchema","i4","i1","i2","i3"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arsedizioni/ars-utils",
3
- "version": "22.5.30",
3
+ "version": "22.5.32",
4
4
  "author": {
5
5
  "email": "software@arsedizioni.it",
6
6
  "name": "Fabio Buscaroli, Alberto Doria"
@@ -82,10 +82,6 @@
82
82
  "types": "./types/arsedizioni-ars-utils-ui.d.ts",
83
83
  "default": "./fesm2022/arsedizioni-ars-utils-ui.mjs"
84
84
  },
85
- "./ui.application": {
86
- "types": "./types/arsedizioni-ars-utils-ui.application.d.ts",
87
- "default": "./fesm2022/arsedizioni-ars-utils-ui.application.mjs"
88
- },
89
85
  "./ui.controls": {
90
86
  "types": "./types/arsedizioni-ars-utils-ui.controls.d.ts",
91
87
  "default": "./fesm2022/arsedizioni-ars-utils-ui.controls.mjs"
@@ -12,7 +12,7 @@ import { BroadcastService, DateInterval, ThemeType, ThemeService, ScreenService,
12
12
  import { CalendarEmptyHeader, ButtonSelectorComponent, ChipsSelectorComponent } from '@arsedizioni/ars-utils/ui.controls';
13
13
  import { BreakpointObserver } from '@angular/cdk/layout';
14
14
  import { Clipboard } from '@angular/cdk/clipboard';
15
- import { ApplicationDialogService } from '@arsedizioni/ars-utils/ui.application';
15
+ import { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';
16
16
  import { SendToPopulateData } from '@arsedizioni/ars-utils/ui';
17
17
  import { MatCalendar, MatCalendarCellClassFunction } from '@angular/material/datepicker';
18
18
  import { MatSelectionList } from '@angular/material/list';
@@ -79,7 +79,7 @@ declare class ClipperDocumentManager {
79
79
  protected readonly clipboard: Clipboard;
80
80
  readonly clipperService: ClipperService;
81
81
  protected readonly broadcastService: BroadcastService;
82
- protected readonly dialogService: ApplicationDialogService;
82
+ protected readonly dialogService: DialogService;
83
83
  protected readonly canHandleTooManyResults: _angular_core.WritableSignal<boolean>;
84
84
  protected readonly canPopulateContacts: _angular_core.WritableSignal<boolean>;
85
85
  /**
@@ -526,7 +526,7 @@ interface BrowserFilterModel {
526
526
  }
527
527
  declare class ClipperBrowserComponent extends ClipperSearchResultManager {
528
528
  /** Error text of a field: the message declared in the schema, or the shared fallback. */
529
- protected readonly getFieldErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
529
+ protected readonly getErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
530
530
  /**
531
531
  * Error text for a date range: whichever end is in error speaks for the pair.
532
532
  * @param from - Errors of the start field, from `f.from().errors()`.
@@ -293,6 +293,15 @@ interface ArsValidatorConfig<TValue = string, TPathKind extends PathKind = PathK
293
293
  * message here would show "Errore", and one renamed here without touching the validator would
294
294
  * leave the map with a kind nobody produces.
295
295
  */
296
+ /**
297
+ * Earliest date {@link date} and {@link dateRange} accept: 1 January 1970.
298
+ *
299
+ * Everything this application stores — events, certificates, payments, communications — happened
300
+ * after it, so an earlier value is always a typo (a two-digit year, a slipped keystroke) and never
301
+ * real data. The floor is deliberately higher than the one of {@link sqlDate}, which only asks
302
+ * what SQL Server can physically store.
303
+ */
304
+ declare const MIN_VALID_YEAR = 1970;
296
305
  declare const ARS_VALIDATOR_MESSAGES: Record<string, string>;
297
306
  /**
298
307
  * Requires the value to be a well-formed GUID / UUID.
@@ -363,6 +372,48 @@ declare function notEqual<TValue, TPathKind extends PathKind = PathKind.Root>(pa
363
372
  * @returns void
364
373
  */
365
374
  declare function sqlDate<TPathKind extends PathKind = PathKind.Root>(path: SchemaPath<string, SchemaPathRules.Supported, TPathKind>, config?: ArsValidatorConfig<string, TPathKind>): void;
375
+ /**
376
+ * Requires the value to be a real date, as {@link SystemUtils.parseDate} understands one.
377
+ *
378
+ * This is the rule for anything a user picks or types as a date: it accepts both the `Date` a
379
+ * Material datepicker or timepicker writes into the model and the text of a plain input, since
380
+ * `parseDate` handles the shapes this codebase produces (ISO, `dd/MM/yyyy`, `yyyy-MM-dd`, and the
381
+ * shorthand forms). Empty passes — saying "obbligatorio" is the job of `required()`.
382
+ *
383
+ * A date earlier than {@link MIN_VALID_YEAR} (1 January 1970) is rejected: nothing this
384
+ * application stores predates it, so an earlier value is a typo rather than data.
385
+ *
386
+ * Distinct from {@link sqlDate} on purpose: that one is about what the DATABASE can store (the
387
+ * 1750 floor), this one is about whether the value is a date at all. Pair them when both matter.
388
+ *
389
+ * @param path - Path of the field to validate.
390
+ * @param config - Optional message override and `when` condition.
391
+ * @returns void
392
+ * @example
393
+ * const f = form(this.model, p => { required(p.expiry); date(p.expiry); });
394
+ */
395
+ declare function date<TValue extends string | Date | null | undefined, TPathKind extends PathKind = PathKind.Root>(path: SchemaPath<TValue, SchemaPathRules.Supported, TPathKind>, config?: ArsValidatorConfig<TValue, TPathKind>): void;
396
+ /**
397
+ * Requires the two ends of a date range to be real dates and to be in order.
398
+ *
399
+ * Written for the two inputs of a `mat-date-range-input`, whose start and end live in two
400
+ * separate fields of the model. Each end is checked with the same rule as {@link date}, and the
401
+ * ordering is checked only when BOTH ends are filled in — a half-open range ("from today
402
+ * onwards") is a legitimate filter, not an error. The 1 January 1970 floor of {@link date}
403
+ * applies to both ends.
404
+ *
405
+ * The rule is bound to BOTH paths, so the error appears on whichever end the user is looking at
406
+ * and a single `<mat-error>` under the range can read either one. Comparison is made on the end
407
+ * of the day, so picking the same day for both ends is valid.
408
+ *
409
+ * @param from - Path of the field holding the start of the range.
410
+ * @param to - Path of the field holding the end of the range.
411
+ * @param config - Optional message override (used for the ordering error) and `when` condition.
412
+ * @returns void
413
+ * @example
414
+ * const f = form(this.model, p => { dateRange(p.sentFrom, p.sentTo); });
415
+ */
416
+ declare function dateRange<TValue extends string | Date | null | undefined, TPathKind extends PathKind = PathKind.Root>(from: SchemaPath<TValue, SchemaPathRules.Supported, TPathKind>, to: SchemaPath<TValue, SchemaPathRules.Supported, TPathKind>, config?: ArsValidatorConfig<TValue, TPathKind>): void;
366
417
  /**
367
418
  * Requires the value to be a date that is not in the future.
368
419
  *
@@ -495,5 +546,5 @@ declare class SignalsUtils {
495
546
  }[], message?: string): string | undefined;
496
547
  }
497
548
 
498
- export { ARS_VALIDATOR_MESSAGES, EmailsValidatorDirective, EqualsValidatorDirective, FileSizeValidatorDirective, GuidValidatorDirective, MaxTermsValidatorDirective, NotEmptyValidatorDirective, NotEqualValidatorDirective, NotFutureValidatorDirective, PasswordValidatorDirective, SignalsUtils, SqlDateValidatorDirective, TimeValidatorDirective, UrlValidatorDirective, ValidIfDirective, ValidatorDirective, emails, equals, fileSize, guid, maxTerms, notEmpty, notEqual, notFuture, otp, password, sqlDate, time, url, validIf };
549
+ export { ARS_VALIDATOR_MESSAGES, EmailsValidatorDirective, EqualsValidatorDirective, FileSizeValidatorDirective, GuidValidatorDirective, MIN_VALID_YEAR, MaxTermsValidatorDirective, NotEmptyValidatorDirective, NotEqualValidatorDirective, NotFutureValidatorDirective, PasswordValidatorDirective, SignalsUtils, SqlDateValidatorDirective, TimeValidatorDirective, UrlValidatorDirective, ValidIfDirective, ValidatorDirective, date, dateRange, emails, equals, fileSize, guid, maxTerms, notEmpty, notEqual, notFuture, otp, password, sqlDate, time, url, validIf };
499
550
  export type { ArsValidatorConfig };
@@ -126,7 +126,7 @@ interface CredentialsDialogData {
126
126
  }
127
127
  declare class CredentialsDialogComponent {
128
128
  /** Error text of a field: the message declared in the schema, or the shared fallback. */
129
- protected readonly getFieldErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
129
+ protected readonly getErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
130
130
  /** Emitted when the user submits the form. Carries the entered credentials. */
131
131
  readonly done: _angular_core.OutputEmitterRef<CredentialsDialogResult>;
132
132
  /** Emitted when the user requests a password-recovery flow. */
@@ -173,7 +173,7 @@ interface ResetPasswordDialogData {
173
173
  }
174
174
  declare class ResetPasswordDialogComponent {
175
175
  /** Error text of a field: the message declared in the schema, or the shared fallback. */
176
- protected readonly getFieldErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
176
+ protected readonly getErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
177
177
  /** Emitted when the user submits the new password. Carries the entered password data. */
178
178
  readonly done: _angular_core.OutputEmitterRef<ResetPasswordDialogResult>;
179
179
  private readonly dialogService;
@@ -214,7 +214,7 @@ interface RecoverPasswordDialogData {
214
214
  }
215
215
  declare class RecoverPasswordDialogComponent {
216
216
  /** Error text of a field: the message declared in the schema, or the shared fallback. */
217
- protected readonly getFieldErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
217
+ protected readonly getErrorMessage: typeof SignalsUtils.getFieldErrorMessage;
218
218
  /** Emitted when the user submits the recovery request. Carries the entered email and recaptcha state. */
219
219
  readonly done: _angular_core.OutputEmitterRef<RecoverPasswordDialogResult>;
220
220
  /** Dialog configuration with defaults applied at construction time. */