@arsedizioni/ars-utils 22.7.6 → 22.7.7

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 (67) hide show
  1. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +18 -15
  2. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  3. package/fesm2022/{arsedizioni-ars-utils-clipper.ui-document.component-BKjGXtXa.mjs → arsedizioni-ars-utils-clipper.ui-document.component-vI7C4i2r.mjs} +29 -14
  4. package/fesm2022/arsedizioni-ars-utils-clipper.ui-document.component-vI7C4i2r.mjs.map +1 -0
  5. package/fesm2022/arsedizioni-ars-utils-clipper.ui-document.component-xjm4mdUv.mjs +1593 -0
  6. package/fesm2022/arsedizioni-ars-utils-clipper.ui-document.component-xjm4mdUv.mjs.map +1 -0
  7. package/fesm2022/arsedizioni-ars-utils-clipper.ui-references.component-CBuJnNIf.mjs +806 -0
  8. package/fesm2022/arsedizioni-ars-utils-clipper.ui-references.component-CBuJnNIf.mjs.map +1 -0
  9. package/fesm2022/{arsedizioni-ars-utils-clipper.ui-references.component-CEA_wJTS.mjs → arsedizioni-ars-utils-clipper.ui-references.component-DYojmfsw.mjs} +4 -4
  10. package/fesm2022/{arsedizioni-ars-utils-clipper.ui-references.component-CEA_wJTS.mjs.map → arsedizioni-ars-utils-clipper.ui-references.component-DYojmfsw.mjs.map} +1 -1
  11. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +351 -72
  12. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  13. package/fesm2022/arsedizioni-ars-utils-core.date.mjs +6 -6
  14. package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs +3 -3
  15. package/fesm2022/arsedizioni-ars-utils-core.mjs +48 -48
  16. package/fesm2022/arsedizioni-ars-utils-core.validators.mjs +42 -42
  17. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +15 -15
  18. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +9 -9
  19. package/fesm2022/arsedizioni-ars-utils-ui.controls.date.mjs +6 -6
  20. package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs +9 -9
  21. package/fesm2022/arsedizioni-ars-utils-ui.controls.tree.mjs +3 -3
  22. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +18 -18
  23. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs +12 -12
  24. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +9 -9
  25. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +15 -15
  26. package/fesm2022/arsedizioni-ars-utils-ui.files.mjs +12 -12
  27. package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs +3 -3
  28. package/fesm2022/arsedizioni-ars-utils-ui.help.mjs +9 -9
  29. package/fesm2022/arsedizioni-ars-utils-ui.mjs +61 -61
  30. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +3 -3
  31. package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs +6 -6
  32. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +6 -6
  33. package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs +3 -3
  34. package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs +9 -9
  35. package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs +9 -9
  36. package/package.json +1 -1
  37. package/types/arsedizioni-ars-utils-clipper.common.d.ts +34 -0
  38. package/types/arsedizioni-ars-utils-clipper.common.d.ts.map +1 -0
  39. package/types/arsedizioni-ars-utils-clipper.ui.d.ts +108 -3
  40. package/types/arsedizioni-ars-utils-clipper.ui.d.ts.map +1 -0
  41. package/types/arsedizioni-ars-utils-core.d.ts.map +1 -0
  42. package/types/arsedizioni-ars-utils-core.date.d.ts.map +1 -0
  43. package/types/arsedizioni-ars-utils-core.markdown.d.ts.map +1 -0
  44. package/types/arsedizioni-ars-utils-core.validators.d.ts.map +1 -0
  45. package/types/arsedizioni-ars-utils-evolution.common.d.ts.map +1 -0
  46. package/types/arsedizioni-ars-utils-support.common.d.ts.map +1 -0
  47. package/types/arsedizioni-ars-utils-ui.controls.d.ts +1 -1
  48. package/types/arsedizioni-ars-utils-ui.controls.d.ts.map +1 -0
  49. package/types/arsedizioni-ars-utils-ui.controls.date.d.ts.map +1 -0
  50. package/types/arsedizioni-ars-utils-ui.controls.tree.d.ts.map +1 -0
  51. package/types/arsedizioni-ars-utils-ui.d.ts.map +1 -0
  52. package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts.map +1 -0
  53. package/types/arsedizioni-ars-utils-ui.dialogs.d.ts.map +1 -0
  54. package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts.map +1 -0
  55. package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts.map +1 -0
  56. package/types/arsedizioni-ars-utils-ui.files.d.ts.map +1 -0
  57. package/types/arsedizioni-ars-utils-ui.filters.d.ts.map +1 -0
  58. package/types/arsedizioni-ars-utils-ui.help.d.ts.map +1 -0
  59. package/types/arsedizioni-ars-utils-ui.navigation.d.ts +1 -1
  60. package/types/arsedizioni-ars-utils-ui.navigation.d.ts.map +1 -0
  61. package/types/arsedizioni-ars-utils-ui.notifications.d.ts.map +1 -0
  62. package/types/arsedizioni-ars-utils-ui.oauth.d.ts.map +1 -0
  63. package/types/arsedizioni-ars-utils-ui.paginator.d.ts.map +1 -0
  64. package/types/arsedizioni-ars-utils-ui.shell.d.ts.map +1 -0
  65. package/types/arsedizioni-ars-utils-ui.tinymce.d.ts.map +1 -0
  66. package/types/arsedizioni-ars-utils.d.ts.map +1 -0
  67. package/fesm2022/arsedizioni-ars-utils-clipper.ui-document.component-BKjGXtXa.mjs.map +0 -1
@@ -418,15 +418,30 @@ var ClipperDocumentComponent = class ClipperDocumentComponent extends ClipperDoc
418
418
  });
419
419
  });
420
420
  }
421
+ get canOpenAnalysis() {
422
+ return (this.clipperService.user?.email ?? "").toLowerCase().includes("@arsedizioni.it");
423
+ }
421
424
  showComment() {
422
425
  const doc = this.lastDocument();
423
- if (doc?.bag?.[7] !== "T") return;
424
- this.clipperService.documents.comment(doc.documentId).subscribe((r) => {
425
- if (!r.success) {
426
- if (r.message === "Il tuo abbonamento non consente di visualizzare i commenti alle norme.") 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");
427
- else this.dialogService.error(r.message);
428
- } else if (r.value && r.value.length > 1) this.dialogService.info(r.value.replace(/<\/p><br>\r\n/g, "</p>\r\n"), "Commento", "Chiudi", 700);
429
- else this.dialogService.info("Commento non più disponibile o in fase di revisione.");
426
+ const hasComment = doc?.bag?.[7] === "T";
427
+ if (!doc || !hasComment && !(doc.bag?.[9] === "T" && this.canOpenAnalysis)) return;
428
+ const data = {
429
+ documentId: doc.documentId ?? "",
430
+ hasComment,
431
+ commentOnly: hasComment && !this.canOpenAnalysis
432
+ };
433
+ import("./arsedizioni-ars-utils-clipper.ui.mjs").then((n) => n.t).then(({ ClipperDocumentAnalysisComponent }) => {
434
+ this.dialogService.open(ClipperDocumentAnalysisComponent, {
435
+ ariaLabel: hasComment ? "commento al documento" : "sintesi del documento",
436
+ autoFocus: false,
437
+ restoreFocus: false,
438
+ closeOnNavigation: false,
439
+ data,
440
+ minWidth: "375px",
441
+ maxWidth: "900px",
442
+ width: "99%",
443
+ maxHeight: "90vh"
444
+ });
430
445
  });
431
446
  }
432
447
  open(documentId, query, queryChunks, newWindow) {
@@ -440,7 +455,7 @@ var ClipperDocumentComponent = class ClipperDocumentComponent extends ClipperDoc
440
455
  this.documentUtils.openDocument(documentId, query, queryChunks, this.dialogData.selectionMode, this.dialogData.selectableModules, this.dialogData.theme, this.dialogData.canHandleTooManyResults);
441
456
  }
442
457
  openReferences(documentId, mode = ClipperQueryReferencesMode.ReferencesIn, model = null, anchor = null, anchorTitle = null, update = true) {
443
- import("./arsedizioni-ars-utils-clipper.ui-references.component-CEA_wJTS.mjs").then(({ ClipperReferencesComponent }) => {
458
+ import("./arsedizioni-ars-utils-clipper.ui-references.component-DYojmfsw.mjs").then(({ ClipperReferencesComponent }) => {
444
459
  this.dialogService.open(ClipperReferencesComponent, {
445
460
  ariaLabel: "riferimenti legati al documento",
446
461
  autoFocus: "dialog",
@@ -491,7 +506,7 @@ var ClipperDocumentComponent = class ClipperDocumentComponent extends ClipperDoc
491
506
  static {
492
507
  this.ɵfac = i0.ɵɵngDeclareFactory({
493
508
  minVersion: "12.0.0",
494
- version: "22.2.2",
509
+ version: "22.2.3",
495
510
  ngImport: i0,
496
511
  type: ClipperDocumentComponent,
497
512
  deps: [],
@@ -501,7 +516,7 @@ var ClipperDocumentComponent = class ClipperDocumentComponent extends ClipperDoc
501
516
  static {
502
517
  this.ɵcmp = i0.ɵɵngDeclareComponent({
503
518
  minVersion: "17.0.0",
504
- version: "22.2.2",
519
+ version: "22.2.3",
505
520
  type: ClipperDocumentComponent,
506
521
  isStandalone: true,
507
522
  selector: "ng-component",
@@ -525,7 +540,7 @@ var ClipperDocumentComponent = class ClipperDocumentComponent extends ClipperDoc
525
540
  }],
526
541
  usesInheritance: true,
527
542
  ngImport: i0,
528
- template: "<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>",
543
+ template: "<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 <!-- The comment of the editors (bag[7]) or the analysis (bag[9]): the viewer shows either. The button says\r\n which: «Commento» when the editors wrote one, «Sintesi» when there is only the analysis - and then only\r\n for the people of Ars (canOpenAnalysis). -->\r\n @if (lastDocument()?.bag && (lastDocument()?.bag[7] === 'T' || (lastDocument()?.bag[9] === 'T' && canOpenAnalysis))) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button\r\n [attr.aria-label]=\"lastDocument()?.bag[7] === 'T' ? 'Mostra commento' : 'Mostra sintesi'\"\r\n (click)=\"showComment()\">\r\n {{ lastDocument()?.bag[7] === 'T' ? 'Commento' : 'Sintesi' }}\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>",
529
544
  styles: [".fill,.wide{min-width:100%!important;max-width:100%!important;width:100%!important}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-header{padding-bottom:20px}.dialog-toolbar{padding:0 5px 0 24px;height:48px;min-height:48px}.dialog-close{margin-right:5px;margin-top:0}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.center{text-align:center}.fill{min-height:100%!important;max-height:100%!important;height:100%!important}.scroll-auto{overflow:auto;height:100%}.scroll-hidden{overflow:hidden;height:100%}b{font-weight:700}.large{font-size:large!important;line-height:1.2!important}.smaller{font-size:smaller!important;line-height:1.2!important}.small{font-size:small!important;line-height:1.2!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:1.2!important}.bold{font-weight:700}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0;max-width:100%}@supports (-webkit-line-clamp: 2){.truncated{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@supports (-webkit-line-clamp: 2){.truncated span,.truncated div{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.clipped{min-width:0;max-width:100%}.clipped span,.clipped div{white-space:nowrap;overflow:hidden;text-overflow:clip}.accent{color:var(--ars-color-accent, #7894ae)!important}.primary{color:var(--ars-color-primary, #00a293)!important}.secondary{color:var(--ars-color-secondary, #4a635f)!important}.error{color:var(--ars-color-error, #ff5449)!important}.success{color:var(--ars-color-ok, #388E3C)!important}.warning{color:var(--ars-color-warning, #FFC107)!important}.text{color:var(--ars-color-text, #191c1b)!important}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75))}.drawer-content{padding-top:10px}.drawer .title-container,.drawer .title-container-with-loader,.drawer-small .title-container,.drawer-small .title-container-with-loader{padding-right:5px;padding-bottom:20px;padding-left:0}.drawer .title-container,.drawer-small .title-container{padding-top:20px}.drawer .title-container-with-loader,.drawer-small .title-container-with-loader{padding-top:14px}.drawer .title,.drawer-small .title{font-size:19.2px!important;font-weight:600;padding-left:15px;min-width:150px;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawer .accordion-panel,.drawer-small .accordion-panel{background-color:transparent!important}.drawer .accordion-header,.drawer-small .accordion-header{padding-left:10px;padding-right:10px;border-radius:var(--mat-expansion-container-shape)}.drawer .mat-expansion-panel-body,.drawer-small .mat-expansion-panel-body{padding-left:10px!important;padding-right:10px!important;padding-bottom:20px!important}@media screen and (min-width:0px)and (max-width:430px){.drawer,.drawer-small{border-radius:0!important;min-width:100%!important;max-width:100%!important}}@media screen and (min-width:431px){.drawer{min-width:420px!important;max-width:420px!important}.drawer .title{min-width:200px}.drawer .mat-expansion-panel-body{padding-left:15px!important;padding-right:15px!important;padding-bottom:20px!important}.drawer-small{min-width:360px!important;max-width:360px!important}}.drawer-with-loader{padding-top:0!important}.drawer-transparent{background-color:transparent}.fade-in{animation:fadein .5s linear}@keyframes fadein{0%{opacity:0}to{opacity:1}}.bright{filter:brightness(.7)!important}@media(prefers-color-scheme:dark){.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b,.bold{font-weight:600}.bright{filter:brightness(1.5)!important}}.clipper-logo{background-size:110px 48px;width:110px;height:48px}.clipper-selection-button{width:150px;font-size:small;font-weight:600}.clipper-selection-icon-button{background-color:var(--ars-color-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.clipper-selection-icon-button:hover{background-color:var(--ars-color-primary-hi, #12c0ae)}.unread{color:var(--app-color-unread, #f7931c)!important}.unread-bg{background-color:var(--app-color-unread, #f7931c)!important}.expired{color:var(--app-color-expired, #ff5449)!important}.expired-bg{background-color:var(--app-color-expired, #ff5449)!important}.expiring{color:var(--app-color-expiring, #FFC107)!important}.expiring-bg{background-color:var(--app-color-expiring, #FFC107)!important}.closed{color:var(--app-color-closed, #388E3C)!important}.closed-bg{background-color:var(--app-color-closed, #388E3C)!important}.error-bg{background-color:var(--ars-color-error, #ff5449)!important}.popular-bg{background-color:var(--app-color-closed, #388E3C)!important}.very-popular-bg{background-color:#4caf50}.item-selected{background-color:var(--ars-item-selected-background-color, #ced1d2);border-radius:0!important}.item-unread{font-weight:bolder}.items-group-title{color:var(--ars-color-secondary, #4a635f);font-size:large;font-weight:700;padding-left:25px;padding-bottom:10px;padding-top:10px}.items-group-title .group-spaced{padding:10px 0 0!important}.items-footer{padding:10px}.item{border-radius:12px;padding:10px 10px 10px 0;min-height:68px!important;margin-bottom:2px}.item:hover{background-color:var(--ars-item-hover-background-color, #eaecef)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%);mask-image:linear-gradient(to right,black 85%,transparent 100%)}@media screen and (min-width:0px)and (max-width:430px){.item:hover{background-color:var(--ars-item-hover-background-color)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 55%,transparent 100%);mask-image:linear-gradient(to right,black 55%,transparent 100%)}}.item-content .item-info-1,.item-content .info-1{font-size:x-small!important;font-weight:700!important;line-height:18px;text-transform:uppercase!important;color:var(--ars-color-accent, #7894ae)}.item-content .item-info-2,.item-content .info-2{font-size:x-small!important;font-weight:700!important;line-height:18px;text-transform:uppercase!important;color:var(--ars-color-accent-low, #456179)}.item-content .item-info-3,.item-content .info-3{font-size:x-small!important;font-weight:700!important;line-height:18px;text-transform:uppercase!important;color:var(--ars-color-error, #ff5449)}.item-content .item-title,.item-content .title{font-size:small!important;line-height:18px;text-decoration:none!important;font-weight:400;min-height:unset;min-width:unset;white-space:initial!important}@supports (-webkit-line-clamp: 3){.item-content .item-title,.item-content .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}}.item-content .details{margin-top:4px;font-size:x-small!important;font-weight:700;line-height:15px;color:var(--ars-color-accent-low, #456179);text-transform:uppercase!important;border-left:4px solid var(--ars-color-accent-low, #456179);padding-left:10px}.item-content .details .links{text-transform:none;text-decoration:none}.item-content .details .links a,.item-content .details .links span,.item-content .details .links div{margin-right:8px;font-weight:500!important;font-size:11px!important;color:var(--ars-color-text, #191c1b)}.item-content .details .links a{cursor:pointer!important;color:var(--ars-color-link, #03A9F4);font-size:11px!important;font-weight:500!important}.item-content a.link{color:var(--ars-color-link, #03A9F4);cursor:pointer!important;text-decoration:none!important}.tile:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.tile{cursor:pointer!important;padding:10px 13px!important;margin-bottom:20px!important}.tile .body{padding:4px 6px}.tile .image-mark{border-top:6px solid transparent;margin:0 8px}.tile .image-mark-unread{border-top-color:var(--app-color-unread, #f7931c);margin:0 8px}.tile .tile-image,.tile .image{height:125px;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.tile .tile-image img,.tile .image img{object-fit:cover;width:100%;height:100%}.tile .tile-image .tile-info-1,.tile .tile-image .info-1,.tile .image .tile-info-1,.tile .image .info-1{position:absolute;left:0;bottom:0;padding:4px 8px;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75));color:var(--ars-color-text, #191c1b);font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.tile .tile-image .tile-info-2,.tile .tile-image .info-2,.tile .image .tile-info-2,.tile .image .info-2{position:absolute;right:0;top:0;padding:4px 8px;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75));color:var(--ars-color-accent, #7894ae);font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.tile .tile-image .buttons,.tile .image .buttons{position:absolute;left:0;top:0;height:42px}.tile .tile-image .buttons .check,.tile .tile-image .buttons .read-button,.tile .image .buttons .check,.tile .image .buttons .read-button{background-color:var(--ars-color-primary, #00a293)!important;color:var(--ars-color-text-low, #e0e2e5)!important}.tile .tile-image .buttons .unread-button,.tile .image .buttons .unread-button{background-color:var(--app-color-unread, #f7931c)!important;color:var(--ars-color-text-low, #e0e2e5)!important}.tile .tile-image .buttons .check-selected,.tile .image .buttons .check-selected{background-color:var(--ars-color-primary-hi, #12c0ae)!important}.tile .tile-date,.tile .date{padding:8px 0 6px!important;font-weight:700!important;text-transform:uppercase!important}.tile .tile-date .date-day,.tile .date .date-day{color:var(--ars-color-accent, #7894ae)}.tile .tile-date .date-divider,.tile .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.tile .tile-time,.tile .time{font-size:small!important;font-weight:700!important}.tile .tile-title,.tile .title{text-decoration:none!important;font-size:16px!important;font-weight:600;min-height:50px!important;max-height:70px!important;min-width:100%;white-space:initial!important;overflow:hidden!important}@supports (-webkit-line-clamp: 3){.tile .tile-title,.tile .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}}.stripe:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.stripe{cursor:pointer!important;padding:5px 10px!important;margin-bottom:10px!important}.stripe .body{padding:5px 15px!important}.stripe .image-mark{min-height:100%!important;border-left:6px solid transparent;margin:8px 0}.stripe .image-mark-unread{min-height:100%!important;border-left-color:var(--ars-color-error, #ff5449)!important;margin:8px 0}.stripe .stripe-image,.stripe .image{width:150px!important;height:70px!important;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.stripe .stripe-image img,.stripe .image img{object-fit:cover;width:100%;height:100%}.stripe .stripe-info-1,.stripe .info-1{margin-top:8px;padding:4px 8px!important;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75))!important;color:var(--ars-color-text, #191c1b)!important;font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.stripe .stripe-info-2,.stripe .info-2{margin-top:8px;padding:4px 8px!important;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75))!important;color:var(--ars-color-accent, #7894ae)!important;font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.stripe .buttons{position:absolute;left:0;top:0;height:42px}.stripe .buttons .check,.stripe .buttons .read{background-color:var(--ars-color-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.stripe .buttons .check-selected{background-color:var(--ars-color-primary-hi, #12c0ae)}.stripe .stripe-date,.stripe .date{padding:0!important;font-weight:700!important;text-transform:uppercase!important}.stripe .stripe-date .date-day,.stripe .date .date-day{color:var(--ars-color-accent, #7894ae)}.stripe .stripe-date .date-divider,.stripe .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.stripe .stripe-time,.stripe .time{font-size:small!important;font-weight:700!important}.stripe .stripe-title,.stripe .title{text-decoration:none!important;font-size:16px!important;font-weight:600;min-width:100%;white-space:initial!important;overflow:hidden!important}@supports (-webkit-line-clamp: 3){.stripe .stripe-title,.stripe .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}}.badge,.badge-red{margin-left:10px;padding:1px 4px;border-radius:3px;font-size:x-small;font-weight:600;text-align:center;background-color:#427505;text-transform:uppercase;white-space:nowrap;color:#e0e2e5}.badge-red{background-color:#a80710}.busy-backdrop{background-color:#0000006b!important}.legend-container{display:flex;flex-direction:row;align-items:center;font-size:x-small;text-transform:uppercase;font-weight:500;margin-left:10px}.legend-container .legend{display:inline-block;height:8px;width:8px;margin-right:4px}.legend-container .legend:not(:first-of-type){margin-left:10px}@media screen and (max-width:431px){.legend-container{font-size:9px!important}}.special-date,.special-date-expired,.special-date-expiring{border:2px var(--ars-color-accent, #7894ae) solid!important;border-radius:100%!important}.special-date-expired{border:2px var(--ars-color-error, #ff5449) solid!important}.special-date-expiring{border:2px var(--ars-color-warning, #FFC107) solid!important}.word-hit-chunk,.word-hit{display:inline-block;font-size:inherit;background-color:var(--ars-word-hit-background-color, #FFEB3B);color:var(--ars-word-hit-color, #191c1b);padding:0 4px;margin:0 4px;border-radius:4px}.word-hit-chunk{background-color:var(--ars-word-chunk-hit-background-color, #8AFF59);color:var(--ars-word-hit-chunk-color, #191c1b)}::ng-deep .mat-mdc-menu-panel{min-width:320px!important;max-width:320px!important}.title-container{padding-left:20px;padding-top:14px}.title-container .title{font-size:large}@supports (-webkit-line-clamp: 2){.title-container .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.dialog-close{margin-right:10px;margin-top:4px}.iframe{width:100%;height:100%;border:0}.relevants-container{padding:0 20px 10px}.relevants-items{padding:0;margin:0}.relevants-items ul{list-style-type:none;padding:0;margin:0}.relevants-items ul li{font-size:small;padding:6px 12px;display:block;color:var(--ars-color-text, #191c1b)}.relevants-items ul li a{color:inherit;text-decoration:none;display:block}.relevants-items ul li:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:6px;cursor:pointer}.mat-mdc-dialog-content{max-height:unset!important;padding:0 0 16px!important}\n"],
530
545
  dependencies: [
531
546
  {
@@ -892,7 +907,7 @@ var ClipperDocumentComponent = class ClipperDocumentComponent extends ClipperDoc
892
907
  };
893
908
  i0.ɵɵngDeclareClassMetadata({
894
909
  minVersion: "12.0.0",
895
- version: "22.2.2",
910
+ version: "22.2.3",
896
911
  ngImport: i0,
897
912
  type: ClipperDocumentComponent,
898
913
  decorators: [{
@@ -913,7 +928,7 @@ i0.ɵɵngDeclareClassMetadata({
913
928
  MatSidenavModule,
914
929
  ClipperDocumentMenuComponent
915
930
  ],
916
- template: "<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>",
931
+ template: "<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 <!-- The comment of the editors (bag[7]) or the analysis (bag[9]): the viewer shows either. The button says\r\n which: «Commento» when the editors wrote one, «Sintesi» when there is only the analysis - and then only\r\n for the people of Ars (canOpenAnalysis). -->\r\n @if (lastDocument()?.bag && (lastDocument()?.bag[7] === 'T' || (lastDocument()?.bag[9] === 'T' && canOpenAnalysis))) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button\r\n [attr.aria-label]=\"lastDocument()?.bag[7] === 'T' ? 'Mostra commento' : 'Mostra sintesi'\"\r\n (click)=\"showComment()\">\r\n {{ lastDocument()?.bag[7] === 'T' ? 'Commento' : 'Sintesi' }}\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>",
917
932
  styles: [".fill,.wide{min-width:100%!important;max-width:100%!important;width:100%!important}.dialog-info{font-size:x-small;font-weight:700;text-align:right;padding:10px}.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #388E3C)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #a80710)}.dialog-header{padding-bottom:20px}.dialog-toolbar{padding:0 5px 0 24px;height:48px;min-height:48px}.dialog-close{margin-right:5px;margin-top:0}.dialog-menu{margin-left:10px;margin-top:10px}.dialog-title{padding:0 24px}.section-title{font-size:large;font-weight:600;padding-top:10px;padding-bottom:8px}.center{text-align:center}.fill{min-height:100%!important;max-height:100%!important;height:100%!important}.scroll-auto{overflow:auto;height:100%}.scroll-hidden{overflow:hidden;height:100%}b{font-weight:700}.large{font-size:large!important;line-height:1.2!important}.smaller{font-size:smaller!important;line-height:1.2!important}.small{font-size:small!important;line-height:1.2!important}.small-icon-button{width:1.5rem!important;height:1.5rem!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center}.small-icon-button .mat-mdc-button-touch-target{width:1.5rem!important;height:1.5rem!important}.x-small{font-size:x-small!important;line-height:1.2!important}.bold{font-weight:700}.uppercase{text-transform:uppercase!important}.lowercase{text-transform:lowercase!important}.truncated{min-width:0;max-width:100%}@supports (-webkit-line-clamp: 2){.truncated{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.truncated span,.truncated div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@supports (-webkit-line-clamp: 2){.truncated span,.truncated div{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.clipped{min-width:0;max-width:100%}.clipped span,.clipped div{white-space:nowrap;overflow:hidden;text-overflow:clip}.accent{color:var(--ars-color-accent, #7894ae)!important}.primary{color:var(--ars-color-primary, #00a293)!important}.secondary{color:var(--ars-color-secondary, #4a635f)!important}.error{color:var(--ars-color-error, #ff5449)!important}.success{color:var(--ars-color-ok, #388E3C)!important}.warning{color:var(--ars-color-warning, #FFC107)!important}.text{color:var(--ars-color-text, #191c1b)!important}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75))}.drawer-content{padding-top:10px}.drawer .title-container,.drawer .title-container-with-loader,.drawer-small .title-container,.drawer-small .title-container-with-loader{padding-right:5px;padding-bottom:20px;padding-left:0}.drawer .title-container,.drawer-small .title-container{padding-top:20px}.drawer .title-container-with-loader,.drawer-small .title-container-with-loader{padding-top:14px}.drawer .title,.drawer-small .title{font-size:19.2px!important;font-weight:600;padding-left:15px;min-width:150px;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.drawer .accordion-panel,.drawer-small .accordion-panel{background-color:transparent!important}.drawer .accordion-header,.drawer-small .accordion-header{padding-left:10px;padding-right:10px;border-radius:var(--mat-expansion-container-shape)}.drawer .mat-expansion-panel-body,.drawer-small .mat-expansion-panel-body{padding-left:10px!important;padding-right:10px!important;padding-bottom:20px!important}@media screen and (min-width:0px)and (max-width:430px){.drawer,.drawer-small{border-radius:0!important;min-width:100%!important;max-width:100%!important}}@media screen and (min-width:431px){.drawer{min-width:420px!important;max-width:420px!important}.drawer .title{min-width:200px}.drawer .mat-expansion-panel-body{padding-left:15px!important;padding-right:15px!important;padding-bottom:20px!important}.drawer-small{min-width:360px!important;max-width:360px!important}}.drawer-with-loader{padding-top:0!important}.drawer-transparent{background-color:transparent}.fade-in{animation:fadein .5s linear}@keyframes fadein{0%{opacity:0}to{opacity:1}}.bright{filter:brightness(.7)!important}@media(prefers-color-scheme:dark){.dialog-info-green,.dialog-info-ok{color:var(--ars-color-ok, #4CAF50)}.dialog-info-red,.dialog-info-error{color:var(--mat-form-field-error-text-color, #ff5449)}b,.bold{font-weight:600}.bright{filter:brightness(1.5)!important}}.clipper-logo{background-size:110px 48px;width:110px;height:48px}.clipper-selection-button{width:150px;font-size:small;font-weight:600}.clipper-selection-icon-button{background-color:var(--ars-color-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.clipper-selection-icon-button:hover{background-color:var(--ars-color-primary-hi, #12c0ae)}.unread{color:var(--app-color-unread, #f7931c)!important}.unread-bg{background-color:var(--app-color-unread, #f7931c)!important}.expired{color:var(--app-color-expired, #ff5449)!important}.expired-bg{background-color:var(--app-color-expired, #ff5449)!important}.expiring{color:var(--app-color-expiring, #FFC107)!important}.expiring-bg{background-color:var(--app-color-expiring, #FFC107)!important}.closed{color:var(--app-color-closed, #388E3C)!important}.closed-bg{background-color:var(--app-color-closed, #388E3C)!important}.error-bg{background-color:var(--ars-color-error, #ff5449)!important}.popular-bg{background-color:var(--app-color-closed, #388E3C)!important}.very-popular-bg{background-color:#4caf50}.item-selected{background-color:var(--ars-item-selected-background-color, #ced1d2);border-radius:0!important}.item-unread{font-weight:bolder}.items-group-title{color:var(--ars-color-secondary, #4a635f);font-size:large;font-weight:700;padding-left:25px;padding-bottom:10px;padding-top:10px}.items-group-title .group-spaced{padding:10px 0 0!important}.items-footer{padding:10px}.item{border-radius:12px;padding:10px 10px 10px 0;min-height:68px!important;margin-bottom:2px}.item:hover{background-color:var(--ars-item-hover-background-color, #eaecef)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 85%,transparent 100%);mask-image:linear-gradient(to right,black 85%,transparent 100%)}@media screen and (min-width:0px)and (max-width:430px){.item:hover{background-color:var(--ars-item-hover-background-color)}.item:hover .item-content{-webkit-mask-image:linear-gradient(to right,black 55%,transparent 100%);mask-image:linear-gradient(to right,black 55%,transparent 100%)}}.item-content .item-info-1,.item-content .info-1{font-size:x-small!important;font-weight:700!important;line-height:18px;text-transform:uppercase!important;color:var(--ars-color-accent, #7894ae)}.item-content .item-info-2,.item-content .info-2{font-size:x-small!important;font-weight:700!important;line-height:18px;text-transform:uppercase!important;color:var(--ars-color-accent-low, #456179)}.item-content .item-info-3,.item-content .info-3{font-size:x-small!important;font-weight:700!important;line-height:18px;text-transform:uppercase!important;color:var(--ars-color-error, #ff5449)}.item-content .item-title,.item-content .title{font-size:small!important;line-height:18px;text-decoration:none!important;font-weight:400;min-height:unset;min-width:unset;white-space:initial!important}@supports (-webkit-line-clamp: 3){.item-content .item-title,.item-content .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}}.item-content .details{margin-top:4px;font-size:x-small!important;font-weight:700;line-height:15px;color:var(--ars-color-accent-low, #456179);text-transform:uppercase!important;border-left:4px solid var(--ars-color-accent-low, #456179);padding-left:10px}.item-content .details .links{text-transform:none;text-decoration:none}.item-content .details .links a,.item-content .details .links span,.item-content .details .links div{margin-right:8px;font-weight:500!important;font-size:11px!important;color:var(--ars-color-text, #191c1b)}.item-content .details .links a{cursor:pointer!important;color:var(--ars-color-link, #03A9F4);font-size:11px!important;font-weight:500!important}.item-content a.link{color:var(--ars-color-link, #03A9F4);cursor:pointer!important;text-decoration:none!important}.tile:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.tile{cursor:pointer!important;padding:10px 13px!important;margin-bottom:20px!important}.tile .body{padding:4px 6px}.tile .image-mark{border-top:6px solid transparent;margin:0 8px}.tile .image-mark-unread{border-top-color:var(--app-color-unread, #f7931c);margin:0 8px}.tile .tile-image,.tile .image{height:125px;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.tile .tile-image img,.tile .image img{object-fit:cover;width:100%;height:100%}.tile .tile-image .tile-info-1,.tile .tile-image .info-1,.tile .image .tile-info-1,.tile .image .info-1{position:absolute;left:0;bottom:0;padding:4px 8px;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75));color:var(--ars-color-text, #191c1b);font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.tile .tile-image .tile-info-2,.tile .tile-image .info-2,.tile .image .tile-info-2,.tile .image .info-2{position:absolute;right:0;top:0;padding:4px 8px;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75));color:var(--ars-color-accent, #7894ae);font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.tile .tile-image .buttons,.tile .image .buttons{position:absolute;left:0;top:0;height:42px}.tile .tile-image .buttons .check,.tile .tile-image .buttons .read-button,.tile .image .buttons .check,.tile .image .buttons .read-button{background-color:var(--ars-color-primary, #00a293)!important;color:var(--ars-color-text-low, #e0e2e5)!important}.tile .tile-image .buttons .unread-button,.tile .image .buttons .unread-button{background-color:var(--app-color-unread, #f7931c)!important;color:var(--ars-color-text-low, #e0e2e5)!important}.tile .tile-image .buttons .check-selected,.tile .image .buttons .check-selected{background-color:var(--ars-color-primary-hi, #12c0ae)!important}.tile .tile-date,.tile .date{padding:8px 0 6px!important;font-weight:700!important;text-transform:uppercase!important}.tile .tile-date .date-day,.tile .date .date-day{color:var(--ars-color-accent, #7894ae)}.tile .tile-date .date-divider,.tile .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.tile .tile-time,.tile .time{font-size:small!important;font-weight:700!important}.tile .tile-title,.tile .title{text-decoration:none!important;font-size:16px!important;font-weight:600;min-height:50px!important;max-height:70px!important;min-width:100%;white-space:initial!important;overflow:hidden!important}@supports (-webkit-line-clamp: 3){.tile .tile-title,.tile .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}}.stripe:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:12px}.stripe{cursor:pointer!important;padding:5px 10px!important;margin-bottom:10px!important}.stripe .body{padding:5px 15px!important}.stripe .image-mark{min-height:100%!important;border-left:6px solid transparent;margin:8px 0}.stripe .image-mark-unread{min-height:100%!important;border-left-color:var(--ars-color-error, #ff5449)!important;margin:8px 0}.stripe .stripe-image,.stripe .image{width:150px!important;height:70px!important;position:relative;background-color:transparent;overflow:hidden;display:flex;justify-content:center;align-items:center;border-radius:8px}.stripe .stripe-image img,.stripe .image img{object-fit:cover;width:100%;height:100%}.stripe .stripe-info-1,.stripe .info-1{margin-top:8px;padding:4px 8px!important;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75))!important;color:var(--ars-color-text, #191c1b)!important;font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.stripe .stripe-info-2,.stripe .info-2{margin-top:8px;padding:4px 8px!important;background-color:var(--ars-color-overlay, rgba(255, 255, 255, .75))!important;color:var(--ars-color-accent, #7894ae)!important;font-size:small!important;font-weight:700!important;text-transform:uppercase!important}.stripe .buttons{position:absolute;left:0;top:0;height:42px}.stripe .buttons .check,.stripe .buttons .read{background-color:var(--ars-color-primary, #00a293);color:var(--ars-color-text-low, #e0e2e5)}.stripe .buttons .check-selected{background-color:var(--ars-color-primary-hi, #12c0ae)}.stripe .stripe-date,.stripe .date{padding:0!important;font-weight:700!important;text-transform:uppercase!important}.stripe .stripe-date .date-day,.stripe .date .date-day{color:var(--ars-color-accent, #7894ae)}.stripe .stripe-date .date-divider,.stripe .date .date-divider{width:1px;margin:0 8px;border-left:1px solid var(--ars-color-divider, #757d87)}.stripe .stripe-time,.stripe .time{font-size:small!important;font-weight:700!important}.stripe .stripe-title,.stripe .title{text-decoration:none!important;font-size:16px!important;font-weight:600;min-width:100%;white-space:initial!important;overflow:hidden!important}@supports (-webkit-line-clamp: 3){.stripe .stripe-title,.stripe .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}}.badge,.badge-red{margin-left:10px;padding:1px 4px;border-radius:3px;font-size:x-small;font-weight:600;text-align:center;background-color:#427505;text-transform:uppercase;white-space:nowrap;color:#e0e2e5}.badge-red{background-color:#a80710}.busy-backdrop{background-color:#0000006b!important}.legend-container{display:flex;flex-direction:row;align-items:center;font-size:x-small;text-transform:uppercase;font-weight:500;margin-left:10px}.legend-container .legend{display:inline-block;height:8px;width:8px;margin-right:4px}.legend-container .legend:not(:first-of-type){margin-left:10px}@media screen and (max-width:431px){.legend-container{font-size:9px!important}}.special-date,.special-date-expired,.special-date-expiring{border:2px var(--ars-color-accent, #7894ae) solid!important;border-radius:100%!important}.special-date-expired{border:2px var(--ars-color-error, #ff5449) solid!important}.special-date-expiring{border:2px var(--ars-color-warning, #FFC107) solid!important}.word-hit-chunk,.word-hit{display:inline-block;font-size:inherit;background-color:var(--ars-word-hit-background-color, #FFEB3B);color:var(--ars-word-hit-color, #191c1b);padding:0 4px;margin:0 4px;border-radius:4px}.word-hit-chunk{background-color:var(--ars-word-chunk-hit-background-color, #8AFF59);color:var(--ars-word-hit-chunk-color, #191c1b)}::ng-deep .mat-mdc-menu-panel{min-width:320px!important;max-width:320px!important}.title-container{padding-left:20px;padding-top:14px}.title-container .title{font-size:large}@supports (-webkit-line-clamp: 2){.title-container .title{overflow:hidden;text-overflow:ellipsis;white-space:initial;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}}.dialog-close{margin-right:10px;margin-top:4px}.iframe{width:100%;height:100%;border:0}.relevants-container{padding:0 20px 10px}.relevants-items{padding:0;margin:0}.relevants-items ul{list-style-type:none;padding:0;margin:0}.relevants-items ul li{font-size:small;padding:6px 12px;display:block;color:var(--ars-color-text, #191c1b)}.relevants-items ul li a{color:inherit;text-decoration:none;display:block}.relevants-items ul li:hover{background-color:var(--ars-item-hover-background-color, #eaecef);border-radius:6px;cursor:pointer}.mat-mdc-dialog-content{max-height:unset!important;padding:0 0 16px!important}\n"]
918
933
  }]
919
934
  }],
@@ -939,4 +954,4 @@ i0.ɵɵngDeclareClassMetadata({
939
954
  });
940
955
  export { ClipperDocumentComponent };
941
956
 
942
- //# sourceMappingURL=arsedizioni-ars-utils-clipper.ui-document.component-BKjGXtXa.mjs.map
957
+ //# sourceMappingURL=arsedizioni-ars-utils-clipper.ui-document.component-vI7C4i2r.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arsedizioni-ars-utils-clipper.ui-document.component-vI7C4i2r.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';\nimport type { ClipperDocumentAnalysisDialogData } from '../document-analysis/document-analysis.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 * Whether the analysis alone - no editors' comment (bag[7]), only the assistant's work (bag[9]) - may be opened,\n * and the tabs of the analysis shown: for now only by the people of Ars, an email at @arsedizioni.it. The editors'\n * comment is for every reader entitled to it, as always.\n */\n protected get canOpenAnalysis(): boolean {\n return (this.clipperService.user?.email ?? '').toLowerCase().includes('@arsedizioni.it');\n }\n\n /**\n * Opens the comment viewer of the current document: the editors' comment (bag[7]) or the analysis (bag[9]).\n * Outside Ars a commented document shows the editors' comment alone, without the tabs of the analysis.\n */\n protected showComment(): void {\n const doc = this.lastDocument();\n // bag[7]: the comment of the editors; bag[9]: an analysis in ArsCMS.DocumentAnalysis, opened alone only by Ars.\n const hasComment = doc?.bag?.[7] === 'T';\n if (!doc || (!hasComment && !(doc.bag?.[9] === 'T' && this.canOpenAnalysis))) return;\n const data: ClipperDocumentAnalysisDialogData = {\n documentId: doc.documentId ?? '',\n hasComment,\n commentOnly: hasComment && !this.canOpenAnalysis,\n };\n import('../document-analysis/document-analysis.component').then(({ ClipperDocumentAnalysisComponent }) => {\n this.dialogService.open(ClipperDocumentAnalysisComponent, {\n ariaLabel: hasComment ? 'commento al documento' : 'sintesi del documento',\n autoFocus: false,\n restoreFocus: false,\n closeOnNavigation: false,\n data,\n minWidth: '375px',\n maxWidth: '900px',\n width: '99%',\n maxHeight: '90vh',\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 <!-- The comment of the editors (bag[7]) or the analysis (bag[9]): the viewer shows either. The button says\r\n which: «Commento» when the editors wrote one, «Sintesi» when there is only the analysis - and then only\r\n for the people of Ars (canOpenAnalysis). -->\r\n @if (lastDocument()?.bag && (lastDocument()?.bag[7] === 'T' || (lastDocument()?.bag[9] === 'T' && canOpenAnalysis))) {\r\n <button fxFlexAlign=\"center\" type=\"button\" mat-button\r\n [attr.aria-label]=\"lastDocument()?.bag[7] === 'T' ? 'Mostra commento' : 'Mostra sintesi'\"\r\n (click)=\"showComment()\">\r\n {{ lastDocument()?.bag[7] === 'T' ? 'Commento' : 'Sintesi' }}\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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"}