@arsedizioni/ars-utils 22.7.2 → 22.7.4

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.
Files changed (35) hide show
  1. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +2 -2
  2. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs.map +1 -1
  3. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +2 -2
  4. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs.map +1 -1
  5. package/package.json +1 -1
  6. package/fesm2022/arsedizioni-ars-utils-clipper.ui-document.component-B9qqPb0A.mjs +0 -1573
  7. package/fesm2022/arsedizioni-ars-utils-clipper.ui-document.component-B9qqPb0A.mjs.map +0 -1
  8. package/fesm2022/arsedizioni-ars-utils-clipper.ui-references.component-CBuJnNIf.mjs +0 -806
  9. package/fesm2022/arsedizioni-ars-utils-clipper.ui-references.component-CBuJnNIf.mjs.map +0 -1
  10. package/types/arsedizioni-ars-utils-clipper.common.d.ts.map +0 -1
  11. package/types/arsedizioni-ars-utils-clipper.ui.d.ts.map +0 -1
  12. package/types/arsedizioni-ars-utils-core.d.ts.map +0 -1
  13. package/types/arsedizioni-ars-utils-core.date.d.ts.map +0 -1
  14. package/types/arsedizioni-ars-utils-core.markdown.d.ts.map +0 -1
  15. package/types/arsedizioni-ars-utils-core.validators.d.ts.map +0 -1
  16. package/types/arsedizioni-ars-utils-evolution.common.d.ts.map +0 -1
  17. package/types/arsedizioni-ars-utils-support.common.d.ts.map +0 -1
  18. package/types/arsedizioni-ars-utils-ui.controls.d.ts.map +0 -1
  19. package/types/arsedizioni-ars-utils-ui.controls.date.d.ts.map +0 -1
  20. package/types/arsedizioni-ars-utils-ui.controls.tree.d.ts.map +0 -1
  21. package/types/arsedizioni-ars-utils-ui.d.ts.map +0 -1
  22. package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts.map +0 -1
  23. package/types/arsedizioni-ars-utils-ui.dialogs.d.ts.map +0 -1
  24. package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts.map +0 -1
  25. package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts.map +0 -1
  26. package/types/arsedizioni-ars-utils-ui.files.d.ts.map +0 -1
  27. package/types/arsedizioni-ars-utils-ui.filters.d.ts.map +0 -1
  28. package/types/arsedizioni-ars-utils-ui.help.d.ts.map +0 -1
  29. package/types/arsedizioni-ars-utils-ui.navigation.d.ts.map +0 -1
  30. package/types/arsedizioni-ars-utils-ui.notifications.d.ts.map +0 -1
  31. package/types/arsedizioni-ars-utils-ui.oauth.d.ts.map +0 -1
  32. package/types/arsedizioni-ars-utils-ui.paginator.d.ts.map +0 -1
  33. package/types/arsedizioni-ars-utils-ui.shell.d.ts.map +0 -1
  34. package/types/arsedizioni-ars-utils-ui.tinymce.d.ts.map +0 -1
  35. package/types/arsedizioni-ars-utils.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"arsedizioni-ars-utils-clipper.ui-document.component-B9qqPb0A.mjs","names":[],"sources":["../../../projects/ars-utils/clipper.ui/document/document.component.ts","../../../projects/ars-utils/clipper.ui/document/document.component.html"],"sourcesContent":["import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Renderer2,\n effect,\n inject,\n signal,\n output,\n viewChild,\n afterNextRender\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef } from '@angular/material/dialog';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatDrawer, MatSidenavModule } from '@angular/material/sidenav';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { Router } from '@angular/router';\nimport { ClipperDocumentAnchorInfo, ClipperDocumentInfo, ClipperDocumentRelevantChunkHit, ClipperDocumentRelevants, ClipperMessages, ClipperModel, ClipperModule, ClipperQueryReferencesMode, ClipperSearchParams, ClipperSearchUtils, ClipperSelectionMode, ClipperUserInfo, ClipperUtils } from '@arsedizioni/ars-utils/clipper.common';\nimport { SystemUtils, ThemeType } from '@arsedizioni/ars-utils/core';\nimport { ShellService } from '@arsedizioni/ars-utils/ui.shell';\nimport { FilePreviewComponent } from '@arsedizioni/ars-utils/ui.files';\n\nimport type { ClipperReferenceDialogResult } from '../references/references.component';\nimport { ClipperDocumentIndexComponent, ClipperDocumentIndexDialogResult } from '../document-index/document-index.component';\nimport { ClipperDocumentManager } from '../document-manager/document-manager';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { ClipperDocumentViewerService } from '../documents';\nimport { ClipperDocumentMenuComponent } from '../document-menu/document-menu.component';\n\n\nexport interface ClipperDocumentDialogData {\n selectionMode?: ClipperSelectionMode;\n selectableModules?: ClipperModule[];\n id: string;\n query?: string;\n queryChunks?: string;\n theme?: ThemeType;\n canHandleTooManyResults?: boolean;\n\n}\n\n@Component({\n host: { 'Bind': SystemUtils.generateUUID() },\n templateUrl: './document.component.html',\n styleUrls: ['./document.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n FlexLayoutModule,\n MatButtonModule,\n MatTooltipModule,\n MatIconModule,\n MatMenuModule,\n MatDividerModule,\n MatProgressBarModule,\n MatDialogContent,\n MatSidenavModule,\n ClipperDocumentMenuComponent,\n ],\n})\nexport class ClipperDocumentComponent extends ClipperDocumentManager {\n readonly relevantsPane = viewChild<MatDrawer>('relevantsPane');\n /** Reference to the document iframe element, used to drive navigation imperatively. */\n private readonly iframeRef = viewChild<ElementRef<HTMLIFrameElement>>('docIframe');\n /** URL queued to be applied to the iframe as soon as the element becomes available. */\n private pendingUrl: string | null = null;\n readonly closing = output();\n readonly opening = output<string>();\n private readonly destroyRef = inject(DestroyRef);\n private readonly documentUtils = inject(ClipperDocumentViewerService);\n private readonly breakpointObserver = inject(BreakpointObserver);\n private readonly renderer = inject(Renderer2);\n private rendererListener1: (() => void) | undefined;\n private readonly router = inject(Router);\n private readonly shellService = inject(ShellService);\n private readonly dialogRef = inject(MatDialogRef<ClipperDocumentComponent>);\n protected readonly dialogData: ClipperDocumentDialogData = inject(MAT_DIALOG_DATA) ?? { mode: ClipperQueryReferencesMode.ReferencesIn };\n protected readonly url = signal<string | null>(null);\n protected readonly title = signal<string | null>(null);\n protected readonly busy = signal<boolean>(false);\n protected lastQuery?: string;\n protected lastQueryChunks: string = '';\n protected lastQueryType: 'fulltext' | 'semantic' = 'fulltext';\n protected readonly lastDocument = signal<ClipperDocumentInfo | undefined>(undefined);\n protected readonly relevants = signal<ClipperDocumentRelevants>({\n items: [],\n hits: 0,\n hit: 0,\n chunks: 0,\n });\n protected readonly relevantsPaneHasBackdrop = signal<boolean>(false);\n protected readonly relevantsPaneClosed = signal<boolean>(false);\n protected readonly relevantsBusy = signal<boolean>(false);\n protected readonly hasRelevants = signal<boolean>(false);\n protected readonly user: ClipperUserInfo | undefined = this.clipperService.user;\n\n constructor() {\n super();\n\n // Apply any URL queued before the iframe element was available (e.g. the very first\n // navigation triggered from the constructor runs before the view is created).\n effect(() => {\n const ref = this.iframeRef();\n if (ref && this.pendingUrl !== null) {\n const u = this.pendingUrl;\n this.pendingUrl = null;\n this.setIframeSrc(ref.nativeElement, u);\n }\n });\n\n if (this.dialogData?.id) {\n // Build the document render URL from the dialog data\n let id = this.dialogData.id.toString();\n const hashPos = id.indexOf('#');\n if (hashPos !== -1) {\n id = id.substring(0, hashPos);\n }\n let query = this.dialogData.query ?? '';\n if (this.dialogData.queryChunks && this.dialogData.queryChunks.length > 0) {\n query += '__CHUNKS__' + id + ':' + this.dialogData.queryChunks;\n }\n const url =\n this.clipperService.serviceUri +\n '/documents/render/?query=' + query +\n '&theme=' + this.dialogData.theme +\n '&id=' + this.dialogData.id;\n this.navigateByUrl(url);\n }\n\n // Listen to postMessage events from the embedded iframe\n this.rendererListener1 = this.renderer.listen('window', 'message', (e: Event) => {\n const event = e as MessageEvent;\n if (!event?.data) return;\n try {\n const data = JSON.parse(event.data);\n if (!data) return;\n switch (data.type) {\n case 'navigated':\n this.navigated(\n data.id, data.title1, data.title2, data.tags, data.model,\n data.module, data.moduleName, data.date, data.number, data.author,\n data.origin, data.originDescription, data.bag, data.validityInfo,\n data.expiringInfo, data.primaryId, data.primaryModel, data.secondaryId, data.isTrial\n );\n break;\n case 'navigate':\n this.navigate(data.url);\n break;\n case 'references':\n this.openReferences(data.id, data.mode, data.model, data.anchor, data.anchorTitle, data.update);\n break;\n case 'hits':\n this.relevants.update(r => ({ ...r, hits: data.total as number }));\n if (data.update) {\n this.updateRelevants();\n }\n break;\n case 'hits2':\n this.relevants.update(r => ({ ...r, chunks: data.total as number }));\n this.updateRelevants2(data.items as ClipperDocumentRelevantChunkHit[]);\n break;\n }\n } catch {\n // Ignore malformed messages from the iframe\n }\n });\n\n // Release the renderer listener on component destroy\n this.destroyRef.onDestroy(() => this.rendererListener1?.());\n\n // Start tracking breakpoint changes only after the first render, when the DOM is ready.\n afterNextRender(() => {\n this.breakpointObserver\n .observe([\n Breakpoints.XSmall,\n Breakpoints.Small,\n Breakpoints.Medium,\n Breakpoints.Large,\n Breakpoints.XLarge,\n ])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(result => {\n for (const query of Object.keys(result.breakpoints)) {\n if (result.breakpoints[query]) {\n this.handleRelevantsPaneVisibility();\n }\n }\n });\n });\n }\n\n\n\n /**\n * Toggles the relevants side-pane open/closed state.\n */\n protected toggleRelevantsPane(): void {\n this.relevantsPaneClosed.set(!this.relevantsPaneClosed());\n this.relevantsPane()?.toggle();\n }\n\n /**\n * Adjusts the relevants side-pane mode and visibility based on the current viewport breakpoint.\n */\n private handleRelevantsPaneVisibility(): void {\n const relevantsPane = this.relevantsPane();\n if (!relevantsPane) return;\n if (\n this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\n this.breakpointObserver.isMatched(Breakpoints.Medium)\n ) {\n if (relevantsPane.opened) relevantsPane.close();\n relevantsPane.mode = 'over';\n relevantsPane.disableClose = false;\n this.relevantsPaneHasBackdrop.set(true);\n } else {\n if (!relevantsPane.opened && !this.relevantsPaneClosed() && this.hasRelevants()) {\n relevantsPane.open();\n } else if (relevantsPane.opened && this.relevantsPaneClosed()) {\n relevantsPane.close();\n }\n relevantsPane.mode = 'side';\n relevantsPane.disableClose = true;\n this.relevantsPaneHasBackdrop.set(false);\n }\n }\n\n /**\n * Emits the closing event and closes the dialog after a short delay.\n */\n protected close(): void {\n this.closing.emit();\n setTimeout(() => this.dialogRef.close(), 500);\n }\n\n /**\n * Navigates to a document or external URL received from the iframe.\n * @param id - The document id or URL to navigate to.\n */\n navigate(id: string): void {\n if (!id || id.length === 0) return;\n\n if (id.indexOf('?') !== -1) {\n if (id.startsWith('/api')) {\n this.navigateByUrl(this.clipperService.serviceUri + id.substring(4));\n } else if (!id.startsWith(this.clipperService.serviceUri)) {\n this.navigateByUrl(this.clipperService.serviceUri + id);\n\n } else {\n this.navigateByUrl(id);\n }\n } else {\n this.navigateByUrl(this.clipperService.serviceUri + '/documents/render/?query=&id=' + id);\n }\n }\n\n /**\n * Resolves and loads a document by its fully-qualified render URL.\n * Parses query, theme, and anchor information before navigating.\n * @param url - The full render URL to load.\n */\n navigateByUrl(url: string): void {\n if (!url || url.length === 0 || url === 'about:blank') return;\n\n // Keep only the first anchor fragment\n const urlParts = url.split('#');\n url = urlParts[0];\n if (urlParts.length > 1) {\n url += '#' + urlParts[1];\n }\n\n // Extract and process the free-text query parameter\n let query = '';\n let p = url.indexOf('query=');\n if (p !== -1) {\n p += 6;\n while (url.length > p && url[p] !== '&' && url[p] !== '#') {\n query += url[p++];\n }\n if (query.length > 0) {\n if (query[0] === '$') {\n query = query.substring(1);\n this.lastQueryType = 'semantic';\n }\n this.relevants.update(r => ({ ...r, hit: 0 }));\n try {\n query = decodeURIComponent(encodeURIComponent(query));\n } catch {\n // Keep original query if encoding fails\n }\n\n // Extract the document id\n let id = '';\n p = url.indexOf('id=');\n while (url.length > p && url[p] !== '&' && url[p] !== '#') {\n id += url[p++];\n }\n\n // Split into text query and optional chunk offsets\n const queryParts = query.split('__CHUNKS__');\n if (queryParts.length > 0) {\n this.lastQuery = ClipperSearchUtils.normalizeTextQuery2(queryParts[0]);\n if (queryParts.length > 1) {\n const queryChunksParts = queryParts[1].split(':');\n if (queryChunksParts.length > 2 && queryChunksParts[0] === id) {\n this.lastQueryChunks = queryChunksParts[1];\n }\n }\n }\n }\n }\n\n // Inject the current theme into the URL if not already present\n if (url.indexOf('theme=') === -1) {\n p = url.indexOf('id=');\n if (p !== -1) {\n url = url.substring(0, p) + 'theme=' + this.dialogData.theme + '&' + url.substring(p);\n }\n }\n\n if (url.indexOf('&file=true') !== -1) {\n this.previewFile(url);\n } else {\n this.clipperService.documents.preRender().subscribe(() => {\n this.busy.set(url.indexOf('documents/render/item') === -1);\n // Keep the signal in sync as a state mirror (used by other observers/templates).\n this.url.set(url);\n // Drive the iframe imperatively so that re-navigating to the same URL (e.g. after\n // a Back operation that only moved the iframe's internal history) still triggers\n // a real reload, which a `[src]` binding through a pure pipe would not.\n this.applyIframeUrl(url);\n });\n }\n }\n\n /**\n * Applies the given URL to the iframe element if available, otherwise queues it\n * to be applied as soon as the iframe view child resolves.\n * @param url - The URL to load into the iframe.\n */\n private applyIframeUrl(url: string): void {\n const ref = this.iframeRef();\n if (ref) {\n this.setIframeSrc(ref.nativeElement, url);\n } else {\n this.pendingUrl = url;\n }\n }\n\n /**\n * Navigates the iframe to the given URL, always pushing a new entry into its\n * session history — even when the URL is identical to the current one.\n *\n * We use `location.assign` instead of setting `src` directly so that:\n * - the navigation is guaranteed to happen across browsers (assigning the same\n * string to `src` is a no-op in some engines);\n * - a new history entry is added, keeping the iframe's Back stack independent\n * from the parent window's history. Otherwise, repeated Back presses would\n * eventually fall through to the host page and close the dialog.\n *\n * If the iframe is cross-origin and `contentWindow.location` access throws,\n * we fall back to a plain `src` assignment.\n *\n * @param el - The iframe element to update.\n * @param url - The URL to navigate to.\n */\n private setIframeSrc(el: HTMLIFrameElement, url: string): void {\n try {\n el.contentWindow?.location.assign(url);\n } catch {\n // Cross-origin access denied: fall back to the standard src assignment.\n el.src = url;\n }\n }\n\n /**\n * Called by the iframe when a document has finished rendering.\n * Parses and stores all document metadata, then triggers auxiliary data loading.\n * @param id - Document id.\n * @param title1 - Primary title.\n * @param title2 - Secondary title.\n * @param tags - Comma-separated tag list.\n * @param model - Document model identifier.\n * @param moduleId - Module identifier.\n * @param moduleName - Module display name.\n * @param date - Publication date string.\n * @param number - Document number.\n * @param author - Author name.\n * @param origin - Source origin code.\n * @param originDescription - Human-readable origin description.\n * @param bag - Encoded flags string.\n * @param validityInfo - Encoded validity information.\n * @param expiringInfo - Encoded expiration information.\n * @param primaryId - Id of the primary linked document, if any.\n * @param primaryModel - Model of the primary linked document.\n * @param secondaryId - Id of the secondary linked document, if any.\n * @param isTrial - True when the request is a trial/preview access.\n */\n public navigated(\n id: string,\n title1: string,\n title2: string,\n tags: string,\n model: number,\n moduleId: number,\n moduleName: string,\n date: string,\n number: string,\n author: string,\n origin: string,\n originDescription: string,\n bag: string,\n validityInfo: string,\n expiringInfo: string,\n primaryId: string,\n primaryModel: number,\n secondaryId: string,\n isTrial: boolean\n ): void {\n // Redirect to login when the session has expired\n if (title1 === 'Sessione non valida') {\n this.shellService\n .error(title2, null, title1, 'Accedi di nuovo')\n .afterClosed()\n .subscribe(() => this.router.navigate(['login']));\n return;\n }\n\n // Resolve the primary document description label\n let primaryDescription: string | undefined;\n if (primaryId) {\n switch (primaryModel ?? model) {\n case ClipperModel.NormativaVigente: primaryDescription = 'Testo vigente'; break;\n case ClipperModel.AggiornamentoNormativo: primaryDescription = 'Testo storico'; break;\n case ClipperModel.Scadenze: primaryDescription = 'Scadenza'; break;\n case ClipperModel.Coordinamento: primaryDescription = 'Modifica'; break;\n default: primaryDescription = 'Collegamento'; break;\n }\n }\n\n // Parse the expiring info block\n let expiringDate: Date | undefined;\n let expiringInfoText: string | undefined;\n let expiringDescription: string | undefined;\n if (expiringInfo) {\n const expiringParts = expiringInfo.split('#');\n if (expiringParts.length > 0) {\n const dateParts = expiringParts[0].split('|');\n if (dateParts.length > 0) expiringDate = new Date(dateParts[0]);\n if (dateParts.length > 1) expiringInfoText = dateParts[1];\n if (dateParts.length > 2) expiringInfoText += '|' + dateParts[2];\n }\n if (expiringParts.length > 1) expiringDescription = expiringParts[1];\n }\n\n const updatedDoc: ClipperDocumentInfo = {\n ...this.lastDocument() ?? {},\n id,\n documentId: id,\n title1: title1 ? SystemUtils.urlDecode(title1).replaceAll('\\\\\"', '\"') : undefined,\n title2: title2 ? SystemUtils.urlDecode(title2).replaceAll('\\\\\"', '\"') : undefined,\n tags,\n model,\n module: moduleId,\n moduleName,\n date: new Date(date),\n number,\n author,\n origin,\n originDescription,\n bag,\n validityInfo,\n primaryId,\n primaryModel,\n hasPrimary: !!primaryId && (model === ClipperModel.AggiornamentoNormativo || model === ClipperModel.NormativaVigente),\n primaryDescription,\n secondaryId,\n isTrial,\n expiringDate,\n expiringInfo: expiringInfoText,\n expiringDescription,\n };\n\n this.lastDocument.set(updatedDoc);\n this.title.set(updatedDoc.title1 ?? updatedDoc.title2 ?? null);\n this.busy.set(false);\n\n // Broadcast the navigation event so other components can react\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_NAVIGATED, {\n document: SystemUtils.clone(updatedDoc),\n });\n\n // Fetch and store the last update timestamp asynchronously\n this.clipperService.documents.metadata(id).subscribe(r => {\n if (r.success) {\n this.lastDocument.update(doc => doc ? { ...doc, lastUpdate: r.value.item1 } : doc);\n }\n });\n }\n\n /**\n * Navigates back in the iframe's browsing history.\n */\n protected back(): void {\n const f = document.getElementById('clipper-document-iframe') as any;\n f?.contentWindow.postMessage('{\"type\": \"back\"}', '*');\n }\n\n /**\n * Navigates forward in the iframe's browsing history.\n */\n protected forward(): void {\n const f = document.getElementById('clipper-document-iframe') as any;\n f?.contentWindow.postMessage('{\"type\": \"forward\"}', '*');\n }\n\n /**\n * Moves focus to the next highlighted relevant hit inside the document.\n */\n protected nextRelevant(): void {\n const current = this.relevants();\n let i = current.hit + 1;\n if (i > current.hits) i = 0;\n const f = document.getElementById('clipper-document-iframe') as any;\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"next\"}', '*');\n this.relevants.update(r => ({ ...r, hit: i }));\n }\n\n /**\n * Moves focus to the previous highlighted relevant hit inside the document.\n */\n protected previousRelevant(): void {\n const current = this.relevants();\n let i = current.hit - 1;\n if (i < 0) i = current.hits;\n const f = document.getElementById('clipper-document-iframe') as any;\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"previous\"}', '*');\n this.relevants.update(r => ({ ...r, hit: i }));\n }\n\n /**\n * Scrolls to a specific relevant anchor inside the document, or opens it in a new tab.\n * @param item - The anchor item to navigate to.\n */\n protected gotoRelevant(item: ClipperDocumentAnchorInfo): void {\n if (item.type === 20) {\n window.open(\n this.clipperService.serviceUri +\n '/documents/render/item/?theme=' + this.dialogData.theme + '&id=' + item.documentId,\n '_blank'\n );\n } else {\n const f = document.getElementById('clipper-document-iframe') as any;\n f?.contentWindow.postMessage('{\"type\": \"relevant\", \"value\": \"' + item.uri + '\"}', '*');\n }\n }\n\n\n\n\n /**\n * Fetches and renders full-text relevant anchors for the current document and query.\n */\n private updateRelevants(): void {\n const query = this.lastQuery;\n if (!query || query.length === 0 || query === ' ') {\n this.handleRelevantsPaneVisibility();\n return;\n }\n const doc = this.lastDocument();\n const docId = doc?.documentId ?? doc?.id;\n if (!docId) return;\n\n const params = new ClipperSearchParams();\n params.id = docId;\n params.text = query;\n params.count = 1;\n\n this.clipperService.documents.query(params).subscribe(r => {\n if (!r.success) {\n this.dialogService.error(r.message);\n } else if (r.value?.items && r.value.items.length > 0) {\n const anchors = r.value.items[0].anchors;\n let minScore = 10;\n let maxScore = 0;\n anchors.forEach(n => {\n if (n.score < minScore) minScore = n.score;\n if (n.score > maxScore) maxScore = n.score;\n });\n const range = maxScore - minScore;\n anchors.forEach(n => {\n const score = range > 0 ? (n.score - minScore) / range : 0;\n n.score = score;\n n.veryRelevant = score > 0.7;\n });\n this.relevants.update(r => ({ ...r, items: anchors }));\n this.hasRelevants.set(anchors.length > 0);\n }\n this.handleRelevantsPaneVisibility();\n });\n }\n\n /**\n * Updates the relevant anchors list from chunk-based hit data received from the iframe.\n * @param anchors - Array of chunk hit data to convert into anchor items.\n */\n private updateRelevants2(anchors?: ClipperDocumentRelevantChunkHit[]): void {\n if (!anchors?.length) return;\n const items: ClipperDocumentAnchorInfo[] = anchors.map(a => ({\n score: ClipperSearchUtils.getRankFromChar(a.score),\n veryRelevant: a.score.toUpperCase() === 'A',\n title: a.text,\n uri: a.uri ?? '__CHUNK_' + a.index,\n }));\n this.relevants.update(r => ({ ...r, items }));\n this.hasRelevants.set(items.length > 0);\n this.handleRelevantsPaneVisibility();\n }\n\n /**\n * Opens the document structure index dialog and scrolls to or opens the selected section.\n * @param documentId - The id of the document whose index to display.\n */\n protected index(documentId: string): void {\n const d = this.dialogService.open(ClipperDocumentIndexComponent, {\n ariaLabel: 'indice documento',\n autoFocus: 'dialog',\n restoreFocus: false,\n disableClose: true,\n closeOnNavigation: false,\n data: {\n documentId: documentId,\n excludedTypes: null,\n multiple: false\n },\n minWidth: '375px',\n maxWidth: '600px',\n width: '100%',\n });\n d.componentInstance.done\n .subscribe((r: ClipperDocumentIndexDialogResult) => {\n const item = r.data.length > 0 ? r.data[0] : null;\n if (item) {\n if (item.documentId === documentId) {\n const f = document.getElementById('clipper-document-iframe') as any;\n f?.contentWindow.postMessage('{\"type\": \"goto\", \"value\":\"' + item.uri + '\"}', '*');\n } else {\n this.openDocument(item.documentId + '#' + item.uri);\n }\n }\n d.close();\n });\n }\n\n /**\n * Extracts the value of a named query-string parameter from a URL.\n * @param url - The URL string to search.\n * @param name - The parameter name to look for. Defaults to 'id'.\n * @returns The extracted parameter value.\n */\n private getId(url: string, name: string = 'id'): string {\n const start = url.lastIndexOf(name + '=') + name.length + 1;\n const end = url.indexOf('&', start);\n return url.substring(start, end);\n }\n\n /**\n * Previews or downloads a file identified by a render URL.\n * Opens a preview dialog when the file supports embedding, otherwise triggers a browser download.\n * @param url - The file render URL to preview.\n */\n private previewFile(url: string): void {\n if (!url || url.length === 0) return;\n const id = this.getId(url);\n if (!id || id.length === 0) return;\n this.clipperService.session.newOTP(id).subscribe(r => {\n if (!r.success) {\n this.dialogService.error(r.message);\n } else if (!r.value.canPreview) {\n location.href = url;\n } else {\n this.dialogService.open(FilePreviewComponent, {\n panelClass: 'preview-panel',\n ariaLabel: 'anteprima',\n autoFocus: 'dialog',\n restoreFocus: false,\n disableClose: true,\n data: { url, embed: r.value.canEmbed },\n minWidth: '375px',\n maxWidth: '900px',\n width: '100%',\n height: '100%'\n });\n }\n });\n }\n\n /**\n * Loads and displays the editorial comment associated with the current document.\n */\n protected showComment(): void {\n const doc = this.lastDocument();\n if (doc?.bag?.[7] !== 'T') return;\n this.clipperService.documents.comment(doc.documentId).subscribe(r => {\n if (!r.success) {\n if (r.message === \"Il tuo abbonamento non consente di visualizzare i commenti alle norme.\")\n this.dialogService.error(\"Il servizio di <b>commenti alle norme</b> non è compreso nel tuo abbonamento, per maggiori informazioni rivolgersi all'agente commerciale di riferimento o inviare una mail a <a href='mailto:sales@arsedizioni.it' target='_blank'>sales@arsedizioni.it</a>.\", null, \"Attenzione\");\n else\n this.dialogService.error(r.message);\n } else {\n if (r.value && r.value.length > 1) {\n this.dialogService.info(\n r.value.replace(/<\\/p><br>\\r\\n/g, '</p>\\r\\n'),\n \"Commento\",\n \"Chiudi\",\n 700);\n } else\n this.dialogService.info(\"Commento non più disponibile o in fase di revisione.\");\n }\n });\n }\n\n\n /**\n * Opens a document, either inline or in a new browser tab.\n * @param documentId - The id of the document to open.\n * @param query - Optional free-text query for highlight.\n * @param queryChunks - Optional chunk offsets for semantic highlight.\n * @param newWindow - When true, opens the document in a new browser tab.\n */\n override open(documentId: string, query?: string, queryChunks?: string, newWindow?: boolean): void {\n if (!newWindow) {\n if (this.opening) this.opening.emit(documentId);\n else this.openDocument(documentId, query, queryChunks);\n } else {\n window.open((this.clipperService.appUri ?? '') + '/documento/' + documentId, '_blank');\n }\n }\n\n /**\n * Opens a document inline via the {@link ClipperDocumentViewerService}.\n * @param documentId - The id of the document to open.\n * @param query - Optional free-text query for highlight.\n * @param queryChunks - Optional chunk offsets for semantic highlight.\n */\n private openDocument(documentId: string, query?: string, queryChunks?: string): void {\n if (!documentId) return;\n this.documentUtils.openDocument(\n documentId,\n query,\n queryChunks,\n this.dialogData.selectionMode,\n this.dialogData.selectableModules,\n this.dialogData.theme,\n this.dialogData.canHandleTooManyResults\n );\n }\n\n /**\n * Opens the references panel for the given document.\n * @param documentId - The id of the document whose references to display.\n * @param mode - The reference query mode. Defaults to ReferencesIn.\n * @param model - Optional document model filter.\n * @param anchor - Optional anchor id to highlight.\n * @param anchorTitle - Optional anchor title to display.\n * @param update - When true, triggers a refresh of the references list. Defaults to true.\n */\n override openReferences(\n documentId: string,\n mode: ClipperQueryReferencesMode = ClipperQueryReferencesMode.ReferencesIn,\n model: number | null = null,\n anchor: string | null = null,\n anchorTitle: string | null = null,\n update: boolean = true\n ): void {\n import('../references/references.component').then(({ ClipperReferencesComponent }) => {\n this.dialogService.open(ClipperReferencesComponent, {\n ariaLabel: 'riferimenti legati al documento',\n autoFocus: 'dialog',\n restoreFocus: false,\n disableClose: true,\n closeOnNavigation: false,\n data: {\n documentId: documentId ?? this.lastDocument()?.documentId,\n mode,\n model,\n anchor,\n anchorTitle,\n update,\n canHandleTooManyResults: this.dialogData.canHandleTooManyResults\n },\n minWidth: '375px',\n maxWidth: '1200px',\n width: '100%',\n height: '100%',\n }).afterClosed()\n .subscribe((r: ClipperReferenceDialogResult) => {\n if (r?.documentId) {\n this.navigate(r.documentId);\n }\n });\n });\n }\n\n /**\n * Opens the report viewer for the given document when supported by its model.\n * @param item - The document whose report to display.\n */\n protected displayReport(item: ClipperDocumentInfo): void {\n if (!item) return;\n if (item.model != ClipperModel.NormativaVigente && item.model != ClipperModel.Scadenze) {\n this.dialogService.info(\"Questa funzionalità non è disponibile per questo tipo di documento.\");\n return;\n }\n this.openReport(item.id, item.title1 ? item.title1 : item.title2);\n }\n\n /**\n * Determines whether the current document satisfies the dialog's selection constraints.\n * @returns True when the document can be selected and confirmed.\n */\n protected canSelect(): boolean {\n const doc = this.lastDocument();\n const selectionMode = this.dialogData.selectionMode ?? 0;\n const selectableModules = this.dialogData.selectableModules;\n if (!doc || selectionMode === 0) return false;\n if (!selectableModules?.length) {\n return doc.model === ClipperModel.NormativaVigente || doc.model === ClipperModel.AggiornamentoNormativo;\n }\n return selectableModules.findIndex(x => x === ClipperUtils.getClipperModuleFromModel(doc)) !== -1;\n }\n\n /**\n * Broadcasts the current document as a selection message and closes the dialog.\n */\n protected select(): void {\n const doc = this.lastDocument();\n if (doc) {\n this.broadcastService.sendMessage(ClipperMessages.DOCUMENT_SELECTED_INNER, doc);\n this.close();\n }\n }\n\n}\n\n","<div class=\"clipper-document-fixed\">\r\n <div style=\"height:6px\">\r\n @if (busy()) {\r\n <mat-progress-bar style=\"z-index:11\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div>\r\n <div fxLayout=\"row\" fxLayoutGap=\"20px\" fxLayoutAlign=\"start start\" fxFill>\r\n <div fxFlex=\"*\" class=\"title-container\">\r\n <div class=\"title bold\">{{title()}}</div>\r\n @if (lastDocument()?.tags) {\r\n <div style=\"padding-top: 5px;\">\r\n <div class=\"x-small bold uppercase\">\r\n TAG: <span class=\"accent\">{{lastDocument()?.tags}}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (lastDocument()?.lastUpdate) {\r\n <div style=\"padding-top: 5px;\">\r\n <div class=\"x-small bold uppercase\">\r\n AGGIORNATO A:\r\n <span class=\"accent\">{{lastDocument()?.lastUpdate}}</span>\r\n </div>\r\n </div>\r\n }\r\n @if (lastDocument()?.expiringDescription || lastDocument()?.validityInfo) {\r\n <div style=\"padding-top: 5px;\">\r\n @if (lastDocument()?.expiringDescription) {\r\n <div class=\"x-small error bold uppercase\">\r\n {{lastDocument()?.expiringDescription}}</div>\r\n }\r\n @if (lastDocument()?.validityInfo) {\r\n <div class=\"x-small error bold uppercase\"><b>Attenzione!</b>\r\n {{lastDocument()?.validityInfo}}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if (canSelect()) {\r\n <div fxFlex=\"170px\" fxFlex.lt-md=\"58px\">\r\n <button fxHide.lt-md fxFlexAlign=\"center\" type=\"button\" mat-flat-button (click)=\"select()\"\r\n class=\"clipper-selection-button\" style=\"margin-top: 8px;\">\r\n <span class=\"small\">Usa selezione</span>\r\n </button>\r\n <button fxHide.gt-sm fxFlexAlign=\"center\" type=\"button\" mat-icon-button (click)=\"select()\"\r\n class=\"clipper-selection-icon-button\" matTooltip=\"Usa selezione\" aria-label=\"'Usa la selezione'\"\r\n style=\"margin-top: 4px;\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n <div fxFlex=\"170px\" fxFlex.lt-md=\"48px\" fxLayoutAlign=\"end\">\r\n <div class=\"dialog-close\">\r\n <button fxHide.lt-md fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Indietro\"\r\n aria-label=\"Indietro\" (click)=\"back()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n <button fxHide.lt-md fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Avanti\" aria-label=\"Avanti\"\r\n (click)=\"forward()\">\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" aria-label=\"Chiudi\"\r\n (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div fxLayout=\"row wrap \" fxFill fxLayoutAlign=\"space-between center\" style=\"padding: 10px 10px 10px 15px;\">\r\n <div fxFlex.xs=\"100\">\r\n @if (lastDocument()?.model === 9) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra indice'\"\r\n (click)=\"index(lastDocument()?.documentId)\">\r\n Indice\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && (lastDocument()?.bag[1] ==='T' || lastDocument()?.bag[3] ==='T')) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button matTooltip=\"Collegamenti\"\r\n [attr.aria-label]=\"'Collegamenti al documento'\" [matMenuTriggerFor]=\"menuLinks\">\r\n Collegamenti\r\n </button>\r\n }\r\n <mat-menu #menuLinks=\"matMenu\">\r\n @if (lastDocument()?.bag && lastDocument()?.bag[1] ==='T') {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra documenti richiamati'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 1)\">\r\n Documenti richiamati\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[3] ==='T') {\r\n <button mat-menu-item [attr.aria-label]=\"'Mostra documenti che richiamano'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 2)\">\r\n Documenti che richiamano\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[2] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra juris'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra modifiche subite'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 3)\">\r\n Modifiche subite\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] !=='T' && lastDocument()?.bag[6] ==='T') {\r\n <button fxHide fxShow.lt-md mat-menu-item [attr.aria-label]=\"'Mostra modifiche apportate'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 5)\">\r\n Modifiche apportate\r\n </button>\r\n }\r\n </mat-menu>\r\n @if (lastDocument()?.hasPrimary) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra documento primario'\"\r\n (click)=\"navigate(lastDocument()?.primaryId)\">\r\n {{lastDocument()?.primaryDescription}}\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[2] ==='T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button [attr.aria-label]=\"'Mostra juris'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 4)\">\r\n Juris\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button [attr.aria-label]=\"'Mostra modifiche subite'\"\r\n (click)=\"openReferences(lastDocument()?.documentId, 3)\">\r\n Modifiche subite\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[4] !== 'T' && lastDocument()?.bag[6] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" fxHide.lt-md mat-button\r\n [attr.aria-label]=\"'Mostra modifiche apportate'\" (click)=\"openReferences(lastDocument()?.documentId, 5)\">\r\n Modifiche apportate\r\n </button>\r\n }\r\n @if (lastDocument()?.secondaryId) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra documento secondario'\"\r\n (click)=\"navigate(lastDocument()?.secondaryId)\">\r\n Testo storico\r\n </button>\r\n }\r\n @if (lastDocument()?.bag && lastDocument()?.bag[7] === 'T') {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button [attr.aria-label]=\"'Mostra commento'\"\r\n (click)=\"showComment()\">\r\n Commento\r\n </button>\r\n }\r\n </div>\r\n <div fxFlex.xs=\"100\" fxLayoutAlign=\"end\">\r\n <div fxFlexAlign=\"center\">\r\n @if (relevants().hits) {\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\">\r\n <div fxFlexAlign=\"center\" class=\"small item-greyed\" style=\"margin-left:20px; margin-right: 5px\"\r\n matTooltip=\"Parole evidenziate\">{{relevants().hit}}\r\n di {{relevants().hits}}</div>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button [attr.aria-label]=\"'Vai alla parola precedente'\"\r\n (click)=\"previousRelevant()\" matTooltip=\"Parola precedente\">\r\n <mat-icon>chevron_left</mat-icon>\r\n </button>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button [attr.aria-label]=\"'Vai alla prossima parola'\"\r\n (click)=\"nextRelevant()\" matTooltip=\"Prossima parola\">\r\n <mat-icon>chevron_right</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-icon-button matTooltip=\"Azioni sul documento\"\r\n [attr.aria-label]=\"'Azioni da eseguire sul documento'\" [matMenuTriggerFor]=\"menuActions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #menuActions=\"matMenu\">\r\n <ng-template matMenuContent let-item=\"lastDocument\">\r\n <clipper-document-menu [parent]=\"this\" [item]=\"lastDocument()\" [canOpenDocument]=\"false\" [canPrint]=\"true\"\r\n [canFind]=\"true\" [isReadable]=\"false\" [isLawInForce]=\"lastDocument()?.model === 9\"\r\n selectionSource=\"none\" [canUseAIAssistant]=\"user?.hasAIAssistant ?? false\">\r\n </clipper-document-menu>\r\n </ng-template>\r\n </mat-menu>\r\n @if (hasRelevants() && relevants().items && relevantsPane && (!relevantsPane.opened || relevantsPaneClosed())) {\r\n <div fxFlexAlign=\"center\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Rilevanza\" aria-label=\"'Rilevanza'\"\r\n (click)=\"toggleRelevantsPane()\">\r\n <mat-icon>right_panel_open</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<mat-dialog-content id=\"clipper-document-scrollable\">\r\n <mat-drawer-container class=\"fill\" [hasBackdrop]=\"relevantsPaneHasBackdrop()\">\r\n <mat-drawer #relevantsPane position=\"end\" class=\"drawer-small drawer-with-loader\" opened=\"false\">\r\n @if (relevantsBusy()) {\r\n <div class=\"overlay\"></div>\r\n }\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"6px\">\r\n @if (relevantsBusy()) {\r\n <mat-progress-bar style=\"z-index: 11;\" mode=\"indeterminate\">\r\n </mat-progress-bar>\r\n }\r\n </div>\r\n <div fxFlex=\"78px\" class=\"title-container-with-loader\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxFill>\r\n <div class=\"title\">Rilevanza</div>\r\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\r\n <button mat-icon-button (click)=\"toggleRelevantsPane()\"\r\n matTooltip=\"Nascondi\"><mat-icon>right_panel_close</mat-icon></button>\r\n </div>\r\n </div>\r\n </div>\r\n <div fxFlex=\"*\" class=\"relevants-container scroll-auto\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div>\r\n <p>Parti del documento più significative per la ricerca di <span\r\n class='word-hit-chunk'>{{lastQuery}}</span>\r\n </p>\r\n </div>\r\n <div fxFlex=\"*\">\r\n <nav class=\"relevants-items\">\r\n <ul>\r\n @for (item of relevants().items; track $index) {\r\n <li class=\"small\" (click)=\"gotoRelevant(item)\" [attr.aria-label]=\"item.title\"\r\n [class.bright]=\"item.score > 0.75\" [class.accent]=\"item.score > 0.75\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start start\" fxLayoutGap=\"10px\" fxFill>\r\n <div fxFlex=\"*\">\r\n {{item.title}}\r\n </div>\r\n <div fxLayoutAlign=\"end\">\r\n @if (item.score > 0.7) {\r\n <mat-icon style='font-size:x-small; height: 10px; width:10px'\r\n [matTooltip]=\"item.score > 0.75 ? 'Molto rilevante' : 'Più rilevante'\">thumb_up_alt</mat-icon>\r\n }\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </nav>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <div class=\"fill scroll-hidden\">\r\n <iframe #docIframe id=\"clipper-document-iframe\" class=\"iframe\"></iframe>\r\n </div>\r\n </mat-drawer-container>\r\n</mat-dialog-content>"],"mappings":"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"}