@arsedizioni/ars-utils 22.0.8 → 22.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +2 -11
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +6 -8
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.mjs +1700 -1797
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +3 -12
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-help.mjs +2 -11
- package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs +3 -12
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-tinymce.mjs +2 -12
- package/fesm2022/arsedizioni-ars-utils-tinymce.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +96 -123
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +6 -301
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +2 -11
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
- package/package.json +5 -1
- package/types/arsedizioni-ars-utils-clipper.common.d.ts +3 -8
- package/types/arsedizioni-ars-utils-clipper.ui.d.ts +1 -1
- package/types/arsedizioni-ars-utils-core.d.ts +506 -490
- package/types/arsedizioni-ars-utils-evolution.common.d.ts +4 -10
- package/types/arsedizioni-ars-utils-help.d.ts +34 -40
- package/types/arsedizioni-ars-utils-support.common.d.ts +4 -10
- package/types/arsedizioni-ars-utils-tinymce.d.ts +7 -13
- package/types/arsedizioni-ars-utils-ui.application.d.ts +46 -56
- package/types/arsedizioni-ars-utils-ui.d.ts +5 -98
- package/types/arsedizioni-ars-utils-ui.oauth.d.ts +2 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arsedizioni-ars-utils-help.mjs","sources":["../../../projects/ars-utils/help/components/help-viewer/help-viewer.component.ts","../../../projects/ars-utils/help/components/help-viewer/help-viewer.component.html","../../../projects/ars-utils/help/services/help.service.ts","../../../projects/ars-utils/help/help.module.ts","../../../projects/ars-utils/help/public_api.ts","../../../projects/ars-utils/help/arsedizioni-ars-utils-help.ts"],"sourcesContent":["import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, Injectable, OnDestroy, ViewEncapsulation, afterNextRender, computed, inject, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTree, MatTreeModule } from '@angular/material/tree';\r\nimport { SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { HelpService } from '../../services/help.service';\r\n\r\nexport interface HelpViewerDialogData {\r\n id?: string;\r\n}\r\n\r\nexport class IndexInfo {\r\n id: string;\r\n parent?: IndexInfo;\r\n name: string;\r\n itemsCount?: number;\r\n children?: IndexInfo[];\r\n}\r\n\r\nexport class IndexNode extends IndexInfo {\r\n expandable: boolean;\r\n level: number;\r\n\r\n constructor(item: IndexInfo, level: number) {\r\n super();\r\n\r\n // Flattened implementation\r\n this.expandable = !!item.children && item.children.length > 0;\r\n this.level = level;\r\n\r\n // Data\r\n this.id = item.id;\r\n this.name = item.name;\r\n this.itemsCount = item.itemsCount;\r\n this.parent = item.parent;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class IndexTreeDataSource implements OnDestroy {\r\n dataChange = new BehaviorSubject<IndexInfo[]>([]);\r\n\r\n get data(): IndexInfo[] {\r\n return this.dataChange.value;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.dataChange.unsubscribe();\r\n }\r\n\r\n /**\r\n * Initialises the data source with a flat list of root nodes.\r\n * @param data - Array of root `IndexInfo` items to display in the tree.\r\n */\r\n initialize(data: IndexInfo[]) {\r\n this.dataChange.next(data);\r\n }\r\n\r\n /**\r\n * Recursively searches the tree for a node with the given id.\r\n * @param node - The node to start from, or `null`/`undefined` to search from the root.\r\n * @param id - The id of the node to find.\r\n * @returns The matching `IndexInfo`, or `undefined` if not found.\r\n */\r\n findNode(node: IndexInfo | undefined | null, id: string): IndexInfo | undefined {\r\n let children: IndexInfo[] | undefined;\r\n if (node && node.id === id) return node;\r\n if (node) children = node.children;\r\n else children = this.data;\r\n if (children) {\r\n let _n: IndexInfo | undefined;\r\n children.some(n => {\r\n n.parent = node ?? undefined;\r\n _n = this.findNode(n, id);\r\n if (_n) return true;\r\n return false;\r\n });\r\n return _n;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Removes the node with the given id from the tree.\r\n * @param id - The id of the node to remove.\r\n */\r\n removeNode(id: string): void {\r\n const n = this.findNode(null, id);\r\n if (!n) return;\r\n if (n.parent) {\r\n const siblings = n.parent.children;\r\n if (siblings) {\r\n const p = siblings.findIndex(c => c.id === id);\r\n if (p !== -1) {\r\n siblings.splice(p, 1);\r\n if (n.parent.itemsCount !== undefined) {\r\n n.parent.itemsCount--;\r\n }\r\n }\r\n }\r\n } else {\r\n const p = this.data.findIndex(c => c.id === id);\r\n if (p !== -1) {\r\n this.data.splice(p, 1);\r\n }\r\n }\r\n this.dataChange.next(this.data);\r\n }\r\n\r\n /**\r\n * Inserts a new node at the beginning of its parent's children, or at the root.\r\n * @param node - The `IndexInfo` node to insert.\r\n */\r\n insertNode(node: IndexInfo): void {\r\n if (node.parent) {\r\n node.parent.children ??= [];\r\n node.parent.children.unshift(node);\r\n node.parent.itemsCount = (node.parent.itemsCount ?? 0) + 1;\r\n } else {\r\n this.data.unshift(node);\r\n }\r\n this.dataChange.next(this.data);\r\n }\r\n\r\n /**\r\n * Renames a node in the tree.\r\n * @param id - The id of the node to rename.\r\n * @param name - The new display name.\r\n */\r\n renameNode(id: string, name: string): void {\r\n const n = this.findNode(null, id);\r\n if (n) {\r\n n.name = name;\r\n this.dataChange.next(this.data);\r\n }\r\n }\r\n\r\n /**\r\n * Re-emits the current data to all subscribers, triggering a tree refresh.\r\n */\r\n update(): void {\r\n this.dataChange.next(this.data);\r\n }\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './help-viewer.component.html',\r\n styleUrls: ['./help-viewer.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [IndexTreeDataSource],\r\n standalone: true,\r\n imports: [FlexLayoutModule, MatButtonModule, MatTooltipModule, MatIconModule, MatProgressBarModule, MatDialogTitle, MatDialogContent,\r\n MatSidenavModule, MatTreeModule, SafeHtmlPipe]\r\n})\r\nexport class HelpViewerComponent {\r\n readonly indexPane = viewChild.required<MatSidenav>('indexPane');\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly dialogRef = inject(MatDialogRef<HelpViewerComponent>);\r\n protected readonly dialogData: HelpViewerDialogData = inject(MAT_DIALOG_DATA) ?? { id: '1' };\r\n private readonly dialogService = inject(DialogService);\r\n private readonly helpService = inject(HelpService);\r\n protected readonly breakpointObserver = inject(BreakpointObserver);\r\n protected readonly busy = signal<boolean>(false);\r\n protected readonly page = signal<string | null>(null);\r\n private indexId: string | undefined;\r\n private indexPaneClosed = false;\r\n protected indexNode: IndexInfo | undefined;\r\n private readonly history = signal<Array<{ id: string; position: number }>>([]);\r\n protected readonly canGoBack = computed(() => this.history().length > 1);\r\n\r\n private tree = inject(IndexTreeDataSource);\r\n readonly matTree = viewChild<MatTree<IndexNode>>(MatTree);\r\n /** Provides the level of a flat node to the tree component. */\r\n protected readonly levelAccessor = (node: IndexNode) => node.level;\r\n /** Flat list of all tree nodes used as the tree data source. */\r\n protected readonly flatNodes = signal<IndexNode[]>([]);\r\n private folders?: IndexInfo[];\r\n protected hasChild = (_: number, _node: IndexNode) => _node.expandable;\r\n\r\n constructor() {\r\n // Subscribe data change\r\n this.tree.dataChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(data => this.flatNodes.set(this.flattenNodes(data)));\r\n\r\n this.getToc();\r\n\r\n this.indexId = this.dialogData.id;\r\n if (this.indexId) {\r\n this.getChapter(this.indexId);\r\n }\r\n\r\n afterNextRender(() => {\r\n // Observe layout changes — must run after view init so indexPane is available\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.handleFilterPaneVisibility());\r\n\r\n this.indexPaneClosed = !this.indexPane().opened;\r\n });\r\n }\r\n\r\n\r\n /**\r\n* Handle filter pane visibility\r\n*/\r\n private handleFilterPaneVisibility() {\r\n const indexPane = this.indexPane();\r\n if (indexPane) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (indexPane.opened) {\r\n indexPane.close();\r\n }\r\n } else {\r\n if (!indexPane.opened && !this.indexPaneClosed) {\r\n indexPane.open();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Shows or hides the index pane when the user clicks the toggle button.\r\n * Also tracks the user's explicit intent so the pane is not auto-reopened.\r\n */\r\n protected toggleIndexPane() {\r\n this.indexPaneClosed = !this.indexPaneClosed;\r\n this.indexPane()?.toggle();\r\n }\r\n\r\n\r\n /**\r\n * Closes the help viewer dialog.\r\n */\r\n protected close(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n /**\r\n * Loads the table of contents from the help service and populates the tree.\r\n */\r\n protected getToc(): void {\r\n this.busy.set(true);\r\n this.helpService\r\n .getToc()\r\n .subscribe({\r\n next: r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.folders = r.value.children;\r\n if (this.folders.length > 0) {\r\n this.tree.initialize(this.folders);\r\n this.indexNode = this.folders[0];\r\n this.expandCurrentFolder(); \r\n }\r\n }\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Intercepts anchor clicks inside the help page and navigates to the referenced chapter.\r\n * @param e - The click `MouseEvent` from the page content area.\r\n * @returns `false` to prevent default browser navigation.\r\n */\r\n protected gotoChapter(e: MouseEvent): boolean {\r\n const el = e.target as HTMLElement | null;\r\n if (el?.nodeName !== 'A') return false;\r\n const tag = el.outerHTML;\r\n let id = '';\r\n let p = tag.indexOf('help-target=\"');\r\n if (p !== -1) {\r\n p += 13;\r\n while (p < tag.length && tag[p] !== '\"') {\r\n id += tag[p];\r\n p++;\r\n }\r\n }\r\n if (id) this.getChapter(id);\r\n return false;\r\n }\r\n\r\n /**\r\n * Searches the folder list for a node matching the given id.\r\n * @param id - The id of the folder to locate.\r\n * @returns The matching `IndexInfo`, or `undefined` if not found.\r\n */\r\n private findFolder(id: string): IndexInfo | undefined {\r\n let node = undefined;\r\n if (this.folders) {\r\n this.folders.some(n => {\r\n node = this.tree.findNode(n, id);\r\n if (node) return true;\r\n return false;\r\n });\r\n }\r\n return node;\r\n }\r\n\r\n /**\r\n * Expands the tree node that corresponds to the currently selected chapter,\r\n * and all its ancestor nodes.\r\n */\r\n private expandCurrentFolder(): void {\r\n if (this.indexNode) {\r\n const current = this.flatNodes().find(n => n.id === this.indexNode!.id);\r\n if (current) {\r\n this.matTree()?.expand(current);\r\n }\r\n if (this.indexNode.parent) {\r\n // Expand all ancestors\r\n let n: IndexInfo | undefined = this.indexNode.parent;\r\n while (n) {\r\n const ancestor = this.flatNodes().find(x => x.id === n!.id);\r\n if (ancestor) this.matTree()?.expand(ancestor);\r\n n = n.parent;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively flattens a nested IndexInfo tree into a depth-first ordered array of IndexNodes.\r\n * @param items - Root-level nodes to flatten.\r\n * @param level - Current depth level.\r\n */\r\n private flattenNodes(items: IndexInfo[], level = 0): IndexNode[] {\r\n const result: IndexNode[] = [];\r\n for (const node of items) {\r\n result.push(new IndexNode(node, level));\r\n if (node.children?.length) {\r\n result.push(...this.flattenNodes(node.children, level + 1));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Retrieves and displays a help chapter by id.\r\n * Optionally scrolls to an anchor or pixel offset after loading.\r\n * @param id - Chapter id, optionally followed by an anchor (`id#anchor`).\r\n * @param position - Pixel scroll offset to restore (default `0`, meaning top).\r\n */\r\n protected getChapter(id: string, position: number = 0): void {\r\n // Detect anchor if exists\r\n let anchor: string = undefined;\r\n const p = id.indexOf('#');\r\n if (p !== -1) {\r\n anchor = id.substring(p + 1);\r\n id = id.substring(0, p);\r\n }\r\n if (id !== '.') {\r\n this.busy.set(true);\r\n this.helpService.getChapter(id)\r\n .subscribe({\r\n next: r => {\r\n let found = false;\r\n if (!r.success) {\r\n this.dialogService.error(\"Capitolo non trovato.\");\r\n } else {\r\n if (!position)\r\n this.history.update(h => [...h, { id: this.indexId ?? '', position: this.getPosition() }]);\r\n this.indexId = id;\r\n this.page.set(r.value.data);\r\n found = (r.value.chapter?.name?.length ?? 0) > 0;\r\n if (found) {\r\n // Update folder\r\n this.indexNode = this.findFolder(id);\r\n this.expandCurrentFolder();\r\n // Handle positioning\r\n this.gotoPosition(anchor, position);\r\n }\r\n }\r\n\r\n if (!found) {\r\n this.getChapter(\"1\");\r\n }\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n }\r\n });\r\n } else {\r\n if (!position)\r\n this.history.update(h => [...h, { id: this.indexId ?? '', position: this.getPosition() }]);\r\n // Move on the same chapter\r\n this.gotoPosition(anchor, position);\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the help content to a named anchor or a numeric pixel offset.\r\n * @param anchor - Named anchor (`<a name=\"…\">`) to scroll to, if any.\r\n * @param position - Fallback pixel offset (default `0`).\r\n */\r\n protected gotoPosition(anchor: string | undefined, position: number = 0): void {\r\n setTimeout(() => {\r\n if (anchor) {\r\n const elms = document.getElementsByName(anchor.toUpperCase());\r\n if (elms && elms.length > 0) position = elms[0].offsetTop;\r\n }\r\n this.setPosition(position > 0 ? position - 1 : 0);\r\n }, 50);\r\n }\r\n\r\n /**\r\n * Returns the current vertical scroll offset of the help content scroller.\r\n * @returns The `scrollTop` value in pixels, or `0` if the element is not found.\r\n */\r\n protected getPosition(): number {\r\n let elem = document.getElementById('helpviewer-scroller');\r\n if (elem) {\r\n return elem.scrollTop;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Scrolls the help content scroller to the specified pixel offset.\r\n * @param position - The vertical pixel offset to scroll to.\r\n */\r\n protected setPosition(position: number): void {\r\n let elem = document.getElementById('helpviewer-scroller');\r\n if (elem) {\r\n elem.scrollTo(0, position);\r\n }\r\n }\r\n\r\n /**\r\n * Navigates back to the previous chapter in the browsing history.\r\n */\r\n protected back(): void {\r\n const entries = this.history();\r\n if (entries.length === 0) return;\r\n const n = entries[entries.length - 1];\r\n this.history.update(h => h.slice(0, -1));\r\n this.getChapter(n.id, n.position + 1);\r\n }\r\n\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"helpviewer-fixed\">\r\n <div style=\"height:6px\">\r\n @if (busy()) {\r\n <mat-progress-bar z-index=\"11\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div class=\"dialog-header\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"10px\" fxFill>\r\n <div class=\"dialog-menu\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Mostra menu\" [attr.aria-label]=\"'Mostra indice'\"\r\n (click)=\"toggleIndexPane()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n </div>\r\n <div fxFlex=\"*\">\r\n <div mat-dialog-title>Guida</div>\r\n </div>\r\n <div fxFlex=\"100px\" fxLayoutAlign=\"end\" class=\"dialog-close\">\r\n @if (canGoBack()) {\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Indietro\" (click)=\"back()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n }\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n<mat-dialog-content id=\"helpviewer-scrollable\">\r\n <mat-drawer-container class=\"fill\">\r\n <mat-drawer #indexPane mode=\"side\" [autoFocus]=\"false\" class=\"drawer-small drawer-transparent\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\">\r\n <mat-tree [dataSource]=\"flatNodes()\" [levelAccessor]=\"levelAccessor\" class=\"tree \" style=\"max-width:310px\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"20\" class=\"tree-node tree-node-simple tree-node-style\"\r\n (click)=\"getChapter(node.id);\" [class.tree-node-activated]=\"indexNode && indexNode.id === node.id\"\r\n [disabled]=\"busy()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"small uppercase\">\r\n <button type=\"button\" fxFlexAlign=\"center\" mat-icon-button disabled class=\"small-icon-button\"></button>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">{{node.name}}</div>\r\n </div>\r\n </mat-tree-node>\r\n <mat-tree-node #treeNodeRef=\"matTreeNode\" *matTreeNodeDef=\"let node;when: hasChild\" matTreeNodePadding [matTreeNodePaddingIndent]=\"20\"\r\n class=\"tree-node tree-node-simple tree-node-style\"\r\n [class.tree-node-activated]=\"indexNode && indexNode.id === node.id\" (click)=\"getChapter(node.id)\"\r\n [disabled]=\"busy()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"small uppercase\">\r\n <button type=\"button\" fxFlexAlign=\"center\" mat-icon-button matTreeNodeToggle\r\n [attr.aria-label]=\"'Apri/chiudi ' + node.name\" class=\"small-icon-button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{treeNodeRef.isExpanded ? 'expand_more' : 'chevron_right'}}\r\n </mat-icon>\r\n </button>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">{{node.name}}</div>\r\n </div>\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer-content id=\"helpviewer-scroller\">\r\n <div style=\"padding: 0 24px;\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div class=\"fill\" (click)=\"gotoChapter($event)\" [innerHtml]=\"(page() ?? '') | safeHtml\"></div>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n </mat-drawer-container>\r\n</mat-dialog-content>","import { Service, inject } from '@angular/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { ApiResult } from '@arsedizioni/ars-utils/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { HelpViewerComponent, IndexInfo } from '../components/help-viewer/help-viewer.component';\r\nimport { Chapter, ChapterBag } from '../definitions';\r\n\r\n@Service()\r\nexport class HelpService {\r\n\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly dialogService = inject(DialogService);\r\n private serviceUri: string | undefined;\r\n\r\n /**\r\n * Initialises the service with the back-end base URI.\r\n * Must be called once during application bootstrap before any other method.\r\n * @param serviceUri - Base URL of the help service (e.g. `'https://api.example.com'`).\r\n */\r\n initialize(serviceUri: string): void {\r\n this.serviceUri = serviceUri;\r\n }\r\n\r\n /**\r\n * Retrieves the HTML content and metadata of a help chapter.\r\n * @param id - The chapter id.\r\n * @param query - Optional search query to highlight within the chapter content.\r\n * @returns An observable that emits `ApiResult<ChapterBag>`.\r\n */\r\n getChapter(id: string, query: string | undefined = undefined) {\r\n return this.httpClient.get<ApiResult<ChapterBag>>(\r\n this.serviceUri +\r\n '/help/chapter/' +\r\n id +\r\n '/?query=' +\r\n (query ?? '')\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves metadata (title, path, etc.) for a help chapter without its content.\r\n * @param id - The chapter id.\r\n * @returns An observable that emits `ApiResult<Chapter>`.\r\n */\r\n getChapterInfo(id: string) {\r\n return this.httpClient.get<ApiResult<Chapter>>(\r\n this.serviceUri + '/help/chapter/info/' + id\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves a raw repository file by id.\r\n * @param id - The repository file id.\r\n * @returns An observable that emits `ApiResult<unknown>`.\r\n */\r\n getRepo(id: string) {\r\n return this.httpClient.get<ApiResult<unknown>>(\r\n this.serviceUri + '/help/repo/' + id\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves the table of contents as a hierarchical `IndexInfo` tree.\r\n * @returns An observable that emits `ApiResult<IndexInfo>`.\r\n */\r\n getToc() {\r\n return this.httpClient.get<ApiResult<IndexInfo>>(\r\n this.serviceUri + '/help/toc'\r\n );\r\n }\r\n\r\n /**\r\n * Opens the help viewer dialog, optionally pre-navigated to a specific chapter.\r\n * @param id - The chapter id to open (default: `'1'`, the root chapter).\r\n */\r\n show(id: string = '1'): void {\r\n this.dialogService.open(HelpViewerComponent, {\r\n ariaLabel: 'guida',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { id },\r\n minWidth: '375px',\r\n maxWidth: '1200px',\r\n width: '100%',\r\n height: '100%'\r\n });\r\n }\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule()\r\nexport class ArsHelpModule { }\r\n\r\nexport * from './services/help.service';\r\n","/*\r\n * Public API Surface \r\n */\r\nexport * from './help.module';\r\nexport * from './definitions';\r\nexport * from './components/help-viewer/help-viewer.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arsedizioni-ars-utils-help.mjs","sources":["../../../projects/ars-utils/help/components/help-viewer/help-viewer.component.ts","../../../projects/ars-utils/help/components/help-viewer/help-viewer.component.html","../../../projects/ars-utils/help/services/help.service.ts","../../../projects/ars-utils/help/public_api.ts","../../../projects/ars-utils/help/arsedizioni-ars-utils-help.ts"],"sourcesContent":["import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, Injectable, OnDestroy, ViewEncapsulation, afterNextRender, computed, inject, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogContent, MatDialogRef, MatDialogTitle } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTree, MatTreeModule } from '@angular/material/tree';\r\nimport { SafeHtmlPipe, SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { HelpService } from '../../services/help.service';\r\n\r\nexport interface HelpViewerDialogData {\r\n id?: string;\r\n}\r\n\r\nexport class IndexInfo {\r\n id: string;\r\n parent?: IndexInfo;\r\n name: string;\r\n itemsCount?: number;\r\n children?: IndexInfo[];\r\n}\r\n\r\nexport class IndexNode extends IndexInfo {\r\n expandable: boolean;\r\n level: number;\r\n\r\n constructor(item: IndexInfo, level: number) {\r\n super();\r\n\r\n // Flattened implementation\r\n this.expandable = !!item.children && item.children.length > 0;\r\n this.level = level;\r\n\r\n // Data\r\n this.id = item.id;\r\n this.name = item.name;\r\n this.itemsCount = item.itemsCount;\r\n this.parent = item.parent;\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class IndexTreeDataSource implements OnDestroy {\r\n dataChange = new BehaviorSubject<IndexInfo[]>([]);\r\n\r\n get data(): IndexInfo[] {\r\n return this.dataChange.value;\r\n }\r\n\r\n ngOnDestroy() {\r\n this.dataChange.unsubscribe();\r\n }\r\n\r\n /**\r\n * Initialises the data source with a flat list of root nodes.\r\n * @param data - Array of root `IndexInfo` items to display in the tree.\r\n */\r\n initialize(data: IndexInfo[]) {\r\n this.dataChange.next(data);\r\n }\r\n\r\n /**\r\n * Recursively searches the tree for a node with the given id.\r\n * @param node - The node to start from, or `null`/`undefined` to search from the root.\r\n * @param id - The id of the node to find.\r\n * @returns The matching `IndexInfo`, or `undefined` if not found.\r\n */\r\n findNode(node: IndexInfo | undefined | null, id: string): IndexInfo | undefined {\r\n let children: IndexInfo[] | undefined;\r\n if (node && node.id === id) return node;\r\n if (node) children = node.children;\r\n else children = this.data;\r\n if (children) {\r\n let _n: IndexInfo | undefined;\r\n children.some(n => {\r\n n.parent = node ?? undefined;\r\n _n = this.findNode(n, id);\r\n if (_n) return true;\r\n return false;\r\n });\r\n return _n;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Removes the node with the given id from the tree.\r\n * @param id - The id of the node to remove.\r\n */\r\n removeNode(id: string): void {\r\n const n = this.findNode(null, id);\r\n if (!n) return;\r\n if (n.parent) {\r\n const siblings = n.parent.children;\r\n if (siblings) {\r\n const p = siblings.findIndex(c => c.id === id);\r\n if (p !== -1) {\r\n siblings.splice(p, 1);\r\n if (n.parent.itemsCount !== undefined) {\r\n n.parent.itemsCount--;\r\n }\r\n }\r\n }\r\n } else {\r\n const p = this.data.findIndex(c => c.id === id);\r\n if (p !== -1) {\r\n this.data.splice(p, 1);\r\n }\r\n }\r\n this.dataChange.next(this.data);\r\n }\r\n\r\n /**\r\n * Inserts a new node at the beginning of its parent's children, or at the root.\r\n * @param node - The `IndexInfo` node to insert.\r\n */\r\n insertNode(node: IndexInfo): void {\r\n if (node.parent) {\r\n node.parent.children ??= [];\r\n node.parent.children.unshift(node);\r\n node.parent.itemsCount = (node.parent.itemsCount ?? 0) + 1;\r\n } else {\r\n this.data.unshift(node);\r\n }\r\n this.dataChange.next(this.data);\r\n }\r\n\r\n /**\r\n * Renames a node in the tree.\r\n * @param id - The id of the node to rename.\r\n * @param name - The new display name.\r\n */\r\n renameNode(id: string, name: string): void {\r\n const n = this.findNode(null, id);\r\n if (n) {\r\n n.name = name;\r\n this.dataChange.next(this.data);\r\n }\r\n }\r\n\r\n /**\r\n * Re-emits the current data to all subscribers, triggering a tree refresh.\r\n */\r\n update(): void {\r\n this.dataChange.next(this.data);\r\n }\r\n}\r\n\r\n@Component({\r\n host: { 'Bind': SystemUtils.generateUUID() },\r\n templateUrl: './help-viewer.component.html',\r\n styleUrls: ['./help-viewer.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [IndexTreeDataSource],\r\n standalone: true,\r\n imports: [FlexLayoutModule, MatButtonModule, MatTooltipModule, MatIconModule, MatProgressBarModule, MatDialogTitle, MatDialogContent,\r\n MatSidenavModule, MatTreeModule, SafeHtmlPipe]\r\n})\r\nexport class HelpViewerComponent {\r\n readonly indexPane = viewChild.required<MatSidenav>('indexPane');\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly dialogRef = inject(MatDialogRef<HelpViewerComponent>);\r\n protected readonly dialogData: HelpViewerDialogData = inject(MAT_DIALOG_DATA) ?? { id: '1' };\r\n private readonly dialogService = inject(DialogService);\r\n private readonly helpService = inject(HelpService);\r\n protected readonly breakpointObserver = inject(BreakpointObserver);\r\n protected readonly busy = signal<boolean>(false);\r\n protected readonly page = signal<string | null>(null);\r\n private indexId: string | undefined;\r\n private indexPaneClosed = false;\r\n protected indexNode: IndexInfo | undefined;\r\n private readonly history = signal<Array<{ id: string; position: number }>>([]);\r\n protected readonly canGoBack = computed(() => this.history().length > 1);\r\n\r\n private tree = inject(IndexTreeDataSource);\r\n readonly matTree = viewChild<MatTree<IndexNode>>(MatTree);\r\n /** Provides the level of a flat node to the tree component. */\r\n protected readonly levelAccessor = (node: IndexNode) => node.level;\r\n /** Flat list of all tree nodes used as the tree data source. */\r\n protected readonly flatNodes = signal<IndexNode[]>([]);\r\n private folders?: IndexInfo[];\r\n protected hasChild = (_: number, _node: IndexNode) => _node.expandable;\r\n\r\n constructor() {\r\n // Subscribe data change\r\n this.tree.dataChange\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(data => this.flatNodes.set(this.flattenNodes(data)));\r\n\r\n this.getToc();\r\n\r\n this.indexId = this.dialogData.id;\r\n if (this.indexId) {\r\n this.getChapter(this.indexId);\r\n }\r\n\r\n afterNextRender(() => {\r\n // Observe layout changes — must run after view init so indexPane is available\r\n this.breakpointObserver\r\n .observe([\r\n Breakpoints.XSmall,\r\n Breakpoints.Small,\r\n Breakpoints.Medium,\r\n Breakpoints.Large,\r\n Breakpoints.XLarge,\r\n ])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.handleFilterPaneVisibility());\r\n\r\n this.indexPaneClosed = !this.indexPane().opened;\r\n });\r\n }\r\n\r\n\r\n /**\r\n* Handle filter pane visibility\r\n*/\r\n private handleFilterPaneVisibility() {\r\n const indexPane = this.indexPane();\r\n if (indexPane) {\r\n if (this.breakpointObserver.isMatched(Breakpoints.XSmall) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Small) ||\r\n this.breakpointObserver.isMatched(Breakpoints.Medium)) {\r\n if (indexPane.opened) {\r\n indexPane.close();\r\n }\r\n } else {\r\n if (!indexPane.opened && !this.indexPaneClosed) {\r\n indexPane.open();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Shows or hides the index pane when the user clicks the toggle button.\r\n * Also tracks the user's explicit intent so the pane is not auto-reopened.\r\n */\r\n protected toggleIndexPane() {\r\n this.indexPaneClosed = !this.indexPaneClosed;\r\n this.indexPane()?.toggle();\r\n }\r\n\r\n\r\n /**\r\n * Closes the help viewer dialog.\r\n */\r\n protected close(): void {\r\n this.dialogRef.close();\r\n }\r\n\r\n /**\r\n * Loads the table of contents from the help service and populates the tree.\r\n */\r\n protected getToc(): void {\r\n this.busy.set(true);\r\n this.helpService\r\n .getToc()\r\n .subscribe({\r\n next: r => {\r\n if (!r.success) {\r\n this.dialogService.error(r.message);\r\n } else {\r\n this.folders = r.value.children;\r\n if (this.folders.length > 0) {\r\n this.tree.initialize(this.folders);\r\n this.indexNode = this.folders[0];\r\n this.expandCurrentFolder(); \r\n }\r\n }\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Intercepts anchor clicks inside the help page and navigates to the referenced chapter.\r\n * @param e - The click `MouseEvent` from the page content area.\r\n * @returns `false` to prevent default browser navigation.\r\n */\r\n protected gotoChapter(e: MouseEvent): boolean {\r\n const el = e.target as HTMLElement | null;\r\n if (el?.nodeName !== 'A') return false;\r\n const tag = el.outerHTML;\r\n let id = '';\r\n let p = tag.indexOf('help-target=\"');\r\n if (p !== -1) {\r\n p += 13;\r\n while (p < tag.length && tag[p] !== '\"') {\r\n id += tag[p];\r\n p++;\r\n }\r\n }\r\n if (id) this.getChapter(id);\r\n return false;\r\n }\r\n\r\n /**\r\n * Searches the folder list for a node matching the given id.\r\n * @param id - The id of the folder to locate.\r\n * @returns The matching `IndexInfo`, or `undefined` if not found.\r\n */\r\n private findFolder(id: string): IndexInfo | undefined {\r\n let node = undefined;\r\n if (this.folders) {\r\n this.folders.some(n => {\r\n node = this.tree.findNode(n, id);\r\n if (node) return true;\r\n return false;\r\n });\r\n }\r\n return node;\r\n }\r\n\r\n /**\r\n * Expands the tree node that corresponds to the currently selected chapter,\r\n * and all its ancestor nodes.\r\n */\r\n private expandCurrentFolder(): void {\r\n if (this.indexNode) {\r\n const current = this.flatNodes().find(n => n.id === this.indexNode!.id);\r\n if (current) {\r\n this.matTree()?.expand(current);\r\n }\r\n if (this.indexNode.parent) {\r\n // Expand all ancestors\r\n let n: IndexInfo | undefined = this.indexNode.parent;\r\n while (n) {\r\n const ancestor = this.flatNodes().find(x => x.id === n!.id);\r\n if (ancestor) this.matTree()?.expand(ancestor);\r\n n = n.parent;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively flattens a nested IndexInfo tree into a depth-first ordered array of IndexNodes.\r\n * @param items - Root-level nodes to flatten.\r\n * @param level - Current depth level.\r\n */\r\n private flattenNodes(items: IndexInfo[], level = 0): IndexNode[] {\r\n const result: IndexNode[] = [];\r\n for (const node of items) {\r\n result.push(new IndexNode(node, level));\r\n if (node.children?.length) {\r\n result.push(...this.flattenNodes(node.children, level + 1));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Retrieves and displays a help chapter by id.\r\n * Optionally scrolls to an anchor or pixel offset after loading.\r\n * @param id - Chapter id, optionally followed by an anchor (`id#anchor`).\r\n * @param position - Pixel scroll offset to restore (default `0`, meaning top).\r\n */\r\n protected getChapter(id: string, position: number = 0): void {\r\n // Detect anchor if exists\r\n let anchor: string = undefined;\r\n const p = id.indexOf('#');\r\n if (p !== -1) {\r\n anchor = id.substring(p + 1);\r\n id = id.substring(0, p);\r\n }\r\n if (id !== '.') {\r\n this.busy.set(true);\r\n this.helpService.getChapter(id)\r\n .subscribe({\r\n next: r => {\r\n let found = false;\r\n if (!r.success) {\r\n this.dialogService.error(\"Capitolo non trovato.\");\r\n } else {\r\n if (!position)\r\n this.history.update(h => [...h, { id: this.indexId ?? '', position: this.getPosition() }]);\r\n this.indexId = id;\r\n this.page.set(r.value.data);\r\n found = (r.value.chapter?.name?.length ?? 0) > 0;\r\n if (found) {\r\n // Update folder\r\n this.indexNode = this.findFolder(id);\r\n this.expandCurrentFolder();\r\n // Handle positioning\r\n this.gotoPosition(anchor, position);\r\n }\r\n }\r\n\r\n if (!found) {\r\n this.getChapter(\"1\");\r\n }\r\n },\r\n complete: () => {\r\n this.busy.set(false);\r\n }\r\n });\r\n } else {\r\n if (!position)\r\n this.history.update(h => [...h, { id: this.indexId ?? '', position: this.getPosition() }]);\r\n // Move on the same chapter\r\n this.gotoPosition(anchor, position);\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the help content to a named anchor or a numeric pixel offset.\r\n * @param anchor - Named anchor (`<a name=\"…\">`) to scroll to, if any.\r\n * @param position - Fallback pixel offset (default `0`).\r\n */\r\n protected gotoPosition(anchor: string | undefined, position: number = 0): void {\r\n setTimeout(() => {\r\n if (anchor) {\r\n const elms = document.getElementsByName(anchor.toUpperCase());\r\n if (elms && elms.length > 0) position = elms[0].offsetTop;\r\n }\r\n this.setPosition(position > 0 ? position - 1 : 0);\r\n }, 50);\r\n }\r\n\r\n /**\r\n * Returns the current vertical scroll offset of the help content scroller.\r\n * @returns The `scrollTop` value in pixels, or `0` if the element is not found.\r\n */\r\n protected getPosition(): number {\r\n let elem = document.getElementById('helpviewer-scroller');\r\n if (elem) {\r\n return elem.scrollTop;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Scrolls the help content scroller to the specified pixel offset.\r\n * @param position - The vertical pixel offset to scroll to.\r\n */\r\n protected setPosition(position: number): void {\r\n let elem = document.getElementById('helpviewer-scroller');\r\n if (elem) {\r\n elem.scrollTo(0, position);\r\n }\r\n }\r\n\r\n /**\r\n * Navigates back to the previous chapter in the browsing history.\r\n */\r\n protected back(): void {\r\n const entries = this.history();\r\n if (entries.length === 0) return;\r\n const n = entries[entries.length - 1];\r\n this.history.update(h => h.slice(0, -1));\r\n this.getChapter(n.id, n.position + 1);\r\n }\r\n\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"helpviewer-fixed\">\r\n <div style=\"height:6px\">\r\n @if (busy()) {\r\n <mat-progress-bar z-index=\"11\" mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div class=\"dialog-header\">\r\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"10px\" fxFill>\r\n <div class=\"dialog-menu\">\r\n <button type=\"button\" mat-icon-button matTooltip=\"Mostra menu\" [attr.aria-label]=\"'Mostra indice'\"\r\n (click)=\"toggleIndexPane()\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n </div>\r\n <div fxFlex=\"*\">\r\n <div mat-dialog-title>Guida</div>\r\n </div>\r\n <div fxFlex=\"100px\" fxLayoutAlign=\"end\" class=\"dialog-close\">\r\n @if (canGoBack()) {\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Indietro\" (click)=\"back()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n }\r\n <button fxFlexAlign=\"start\" type=\"button\" mat-icon-button matTooltip=\"Chiudi\" (click)=\"close()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n<mat-dialog-content id=\"helpviewer-scrollable\">\r\n <mat-drawer-container class=\"fill\">\r\n <mat-drawer #indexPane mode=\"side\" [autoFocus]=\"false\" class=\"drawer-small drawer-transparent\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div fxFlex=\"*\">\r\n <mat-tree [dataSource]=\"flatNodes()\" [levelAccessor]=\"levelAccessor\" class=\"tree \" style=\"max-width:310px\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding\r\n [matTreeNodePaddingIndent]=\"20\" class=\"tree-node tree-node-simple tree-node-style\"\r\n (click)=\"getChapter(node.id);\" [class.tree-node-activated]=\"indexNode && indexNode.id === node.id\"\r\n [disabled]=\"busy()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"small uppercase\">\r\n <button type=\"button\" fxFlexAlign=\"center\" mat-icon-button disabled class=\"small-icon-button\"></button>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">{{node.name}}</div>\r\n </div>\r\n </mat-tree-node>\r\n <mat-tree-node #treeNodeRef=\"matTreeNode\" *matTreeNodeDef=\"let node;when: hasChild\" matTreeNodePadding [matTreeNodePaddingIndent]=\"20\"\r\n class=\"tree-node tree-node-simple tree-node-style\"\r\n [class.tree-node-activated]=\"indexNode && indexNode.id === node.id\" (click)=\"getChapter(node.id)\"\r\n [disabled]=\"busy()\">\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxFill class=\"small uppercase\">\r\n <button type=\"button\" fxFlexAlign=\"center\" mat-icon-button matTreeNodeToggle\r\n [attr.aria-label]=\"'Apri/chiudi ' + node.name\" class=\"small-icon-button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{treeNodeRef.isExpanded ? 'expand_more' : 'chevron_right'}}\r\n </mat-icon>\r\n </button>\r\n <div fxFlex=\"*\" fxFlexAlign=\"center\">{{node.name}}</div>\r\n </div>\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n </mat-drawer>\r\n <mat-drawer-content id=\"helpviewer-scroller\">\r\n <div style=\"padding: 0 24px;\">\r\n <div fxLayout=\"column\" fxFill>\r\n <div class=\"fill\" (click)=\"gotoChapter($event)\" [innerHtml]=\"(page() ?? '') | safeHtml\"></div>\r\n </div>\r\n </div>\r\n </mat-drawer-content>\r\n </mat-drawer-container>\r\n</mat-dialog-content>","import { Service, inject } from '@angular/core';\r\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\r\nimport { ApiResult } from '@arsedizioni/ars-utils/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { HelpViewerComponent, IndexInfo } from '../components/help-viewer/help-viewer.component';\r\nimport { Chapter, ChapterBag } from '../definitions';\r\n\r\n@Service()\r\nexport class HelpService {\r\n\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly dialogService = inject(DialogService);\r\n private serviceUri: string | undefined;\r\n\r\n /**\r\n * Initialises the service with the back-end base URI.\r\n * Must be called once during application bootstrap before any other method.\r\n * @param serviceUri - Base URL of the help service (e.g. `'https://api.example.com'`).\r\n */\r\n initialize(serviceUri: string): void {\r\n this.serviceUri = serviceUri;\r\n }\r\n\r\n /**\r\n * Retrieves the HTML content and metadata of a help chapter.\r\n * @param id - The chapter id.\r\n * @param query - Optional search query to highlight within the chapter content.\r\n * @returns An observable that emits `ApiResult<ChapterBag>`.\r\n */\r\n getChapter(id: string, query: string | undefined = undefined) {\r\n return this.httpClient.get<ApiResult<ChapterBag>>(\r\n this.serviceUri +\r\n '/help/chapter/' +\r\n id +\r\n '/?query=' +\r\n (query ?? '')\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves metadata (title, path, etc.) for a help chapter without its content.\r\n * @param id - The chapter id.\r\n * @returns An observable that emits `ApiResult<Chapter>`.\r\n */\r\n getChapterInfo(id: string) {\r\n return this.httpClient.get<ApiResult<Chapter>>(\r\n this.serviceUri + '/help/chapter/info/' + id\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves a raw repository file by id.\r\n * @param id - The repository file id.\r\n * @returns An observable that emits `ApiResult<unknown>`.\r\n */\r\n getRepo(id: string) {\r\n return this.httpClient.get<ApiResult<unknown>>(\r\n this.serviceUri + '/help/repo/' + id\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves the table of contents as a hierarchical `IndexInfo` tree.\r\n * @returns An observable that emits `ApiResult<IndexInfo>`.\r\n */\r\n getToc() {\r\n return this.httpClient.get<ApiResult<IndexInfo>>(\r\n this.serviceUri + '/help/toc'\r\n );\r\n }\r\n\r\n /**\r\n * Opens the help viewer dialog, optionally pre-navigated to a specific chapter.\r\n * @param id - The chapter id to open (default: `'1'`, the root chapter).\r\n */\r\n show(id: string = '1'): void {\r\n this.dialogService.open(HelpViewerComponent, {\r\n ariaLabel: 'guida',\r\n autoFocus: false,\r\n restoreFocus: false,\r\n disableClose: true,\r\n data: { id },\r\n minWidth: '375px',\r\n maxWidth: '1200px',\r\n width: '100%',\r\n height: '100%'\r\n });\r\n }\r\n}\r\n\r\n","/*\r\n * Public API Surface \r\n */\r\nexport * from './definitions';\r\nexport * from './services/help.service';\r\nexport * from './components/help-viewer/help-viewer.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, signal, Injectable, NgModule } from '@angular/core';
|
|
3
1
|
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, signal, Injectable } from '@angular/core';
|
|
4
4
|
import { BroadcastService } from '@arsedizioni/ars-utils/core';
|
|
5
5
|
|
|
6
6
|
const SupportMessages = {
|
|
@@ -143,15 +143,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
143
143
|
}]
|
|
144
144
|
}] });
|
|
145
145
|
|
|
146
|
-
class ArsSupportCommonModule {
|
|
147
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ArsSupportCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
148
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.0", ngImport: i0, type: ArsSupportCommonModule }); }
|
|
149
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ArsSupportCommonModule }); }
|
|
150
|
-
}
|
|
151
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ArsSupportCommonModule, decorators: [{
|
|
152
|
-
type: NgModule
|
|
153
|
-
}] });
|
|
154
|
-
|
|
155
146
|
/*
|
|
156
147
|
* Public API Surface of ars-utils
|
|
157
148
|
*/
|
|
@@ -160,5 +151,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
160
151
|
* Generated bundle index. Do not edit.
|
|
161
152
|
*/
|
|
162
153
|
|
|
163
|
-
export {
|
|
154
|
+
export { SupportMessages, SupportProduct, SupportProductModule, SupportService };
|
|
164
155
|
//# sourceMappingURL=arsedizioni-ars-utils-support.common.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arsedizioni-ars-utils-support.common.mjs","sources":["../../../projects/ars-utils/support.common/common/messages.ts","../../../projects/ars-utils/support.common/common/definitions.ts","../../../projects/ars-utils/support.common/common/services/support.service.ts","../../../projects/ars-utils/support.common/common/common.module.ts","../../../projects/ars-utils/support.common/public_api.ts","../../../projects/ars-utils/support.common/arsedizioni-ars-utils-support.common.ts"],"sourcesContent":["export const SupportMessages = {\r\n /**\r\n * Messages\r\n */\r\n // Error\r\n ERROR: '§support-error',\r\n\r\n // Login\r\n LOGIN_CHANGED: '§support-login-changed',\r\n LOGIN_COMPLETED: '§support-login-completed',\r\n LOGOUT_COMPLETED: '§support-logout-completed',\r\n LOGIN_PENDING: '§support-login-pending',\r\n LOGIN_FAILED: '§support-login-failed', \r\n LOGOUT: '§support-logout',\r\n\r\n // Notifications\r\n NOTIFICATION_READ: '§support-notification-read',\r\n};\r\n","import { LoginResult } from '@arsedizioni/ars-utils/core';\r\nimport { LoginOAuthType } from '@arsedizioni/ars-utils/ui';\r\n\r\n\r\nexport interface SupportUserInfo {\r\n id: number;\r\n groups?: number;\r\n groupNames?: string;\r\n displayName?: string;\r\n dashboard?: string;\r\n sessionId?: string;\r\n email?: string;\r\n customerId?: number;\r\n companyName?: string;\r\n role: number;\r\n scopes?: string[];\r\n sla: number;\r\n isCommercial?: boolean;\r\n isAdministrator: boolean;\r\n isGuest: boolean;\r\n isUser: boolean;\r\n isOperator: boolean;\r\n isTemporary: boolean;\r\n}\r\n\r\n\r\nexport interface SupportLoginResult extends LoginResult<SupportUserInfo> {\r\n}\r\n\r\nexport interface SupportLoginInfo {\r\n context: SupportUserInfo;\r\n oauth?: LoginOAuthType;\r\n remember?: boolean;\r\n}\r\n\r\nexport interface SupportNotificationsSearchParams {\r\n any?: string;\r\n products?: number;\r\n productModules?: number;\r\n first?: number;\r\n count?: number;\r\n}\r\n\r\nexport interface SupportNotificationsSearchResult {\r\n interval?: string;\r\n items?: SupportNotificationInfo[];\r\n total?: number;\r\n}\r\n\r\nexport interface Notification {\r\n id: number;\r\n products: number;\r\n productModules?: number;\r\n publishingDate?: Date;\r\n title: string;\r\n text: string;\r\n state: number;\r\n created: Date;\r\n createdBy: string;\r\n lastUpdated?: Date;\r\n lastUpdatedBy?: string;\r\n productNames?: string;\r\n productModuleNames?: string;\r\n isPublished: boolean;\r\n isInternal: boolean;\r\n stateName: string;\r\n documents?: SupportDocumentInfo[];\r\n isRead: boolean;\r\n totalRead: number;\r\n}\r\n\r\nexport interface SupportDocumentInfo {\r\n id?: number;\r\n origin?: number;\r\n ownerId?: number;\r\n name?: string;\r\n description?: string;\r\n size?: number;\r\n binaryId?: number;\r\n url?: string;\r\n customerId?: number;\r\n created?: Date;\r\n createdBy?: string;\r\n lastUpdated?: Date;\r\n lastUpdatedBy?: string;\r\n isBinary?: boolean;\r\n}\r\n\r\nexport interface SupportNotificationInfo {\r\n id: number;\r\n products?: number;\r\n productModules?: number;\r\n publishingDate?: Date;\r\n title: string;\r\n text: string;\r\n state: number;\r\n created: Date;\r\n createdBy: string;\r\n lastUpdated?: Date;\r\n lastUpdatedBy?: string;\r\n productNames?: string;\r\n productModuleNames?: string;\r\n isPublished: boolean;\r\n isInternal: boolean;\r\n stateName: string;\r\n documents?: SupportDocumentInfo[];\r\n isRead: boolean;\r\n totalRead: number;\r\n isMenuOpen?: boolean;\r\n isOver?: boolean;\r\n\r\n}\r\n\r\nexport interface SupportNotificationsMarkParams {\r\n ids: number[];\r\n unmark: boolean;\r\n}\r\n\r\nexport enum SupportProduct {\r\n None = 0,\r\n Clipper = 1,\r\n Evolution = 1 << 1,\r\n DGInfo = 1 << 2\r\n}\r\n\r\nexport enum SupportProductModule {\r\n None = 0,\r\n EvoFormazione = 1,\r\n EvoDPI = 1 << 1,\r\n EvoSorveglianzaSanitaria = 1 << 2,\r\n EvoRegistroEScadenzario = 1 << 3,\r\n EvoAttrezzatureEImpianti = 1 << 4,\r\n EvoMonitoraggio = 1 << 5,\r\n EvoBollettino = 1 << 6,\r\n DgiADR = 1 << 7,\r\n DgiRID = 1 << 8,\r\n DgiIMDG = 1 << 9,\r\n DgiCLP = 1 << 10,\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, OnDestroy, inject, signal } from '@angular/core';\r\nimport { ApiResult, BroadcastMessageInfo, BroadcastService } from '@arsedizioni/ars-utils/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { SupportMessages } from '../messages';\r\nimport { SupportNotificationInfo, SupportNotificationsMarkParams, SupportNotificationsSearchParams, SupportNotificationsSearchResult, SupportProduct, SupportProductModule } from '../definitions';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SupportService implements OnDestroy {\r\n\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly broadcastService = inject(BroadcastService);\r\n private broadcastServiceSubscription?: Subscription;\r\n\r\n private _serviceUri: string | undefined;\r\n\r\n /** Base URI of the Support back-end service. */\r\n get serviceUri(): string | undefined {\r\n return this._serviceUri;\r\n }\r\n\r\n public products: SupportProduct = SupportProduct.None;\r\n public productModules: SupportProductModule = SupportProductModule.None;\r\n\r\n /** Number of unread notifications, or `undefined` when there are none. */\r\n public readonly unreadNotifications = signal<number | undefined>(undefined);\r\n\r\n ngOnDestroy(): void {\r\n this.broadcastServiceSubscription?.unsubscribe();\r\n }\r\n\r\n /**\r\n * Initialises the service with the back-end URI and the products/modules it should track.\r\n * Must be called once during application bootstrap before any other method.\r\n * @param serviceUri - Base URL of the support service.\r\n * @param products - Bitmask of `SupportProduct` values to scope notifications (default: `None`).\r\n * @param productModules - Bitmask of `SupportProductModule` values to scope notifications (default: `None`).\r\n */\r\n initialize(\r\n serviceUri: string,\r\n products: SupportProduct = SupportProduct.None,\r\n productModules: SupportProductModule = SupportProductModule.None\r\n ): void {\r\n this._serviceUri = serviceUri;\r\n this.products = products;\r\n this.productModules = productModules;\r\n\r\n if (!this.broadcastServiceSubscription) {\r\n this.broadcastServiceSubscription = this.broadcastService\r\n .getMessage()\r\n .subscribe((message: BroadcastMessageInfo) => {\r\n if (message.id === SupportMessages.NOTIFICATION_READ) {\r\n this.countUnreadNotifications();\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ── Notifications ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Fetches the count of unread notifications from the server and updates\r\n * the `unreadNotifications` signal. Sets `undefined` when the count is zero.\r\n */\r\n countUnreadNotifications(): void {\r\n this.httpClient\r\n .get<ApiResult<number>>(\r\n this._serviceUri +\r\n '/notifications/unread/?products=' + (this.products ?? 0) +\r\n '&modules=' + (this.productModules ?? 0)\r\n )\r\n .subscribe((r: ApiResult<number>) => {\r\n if (r.success) {\r\n this.unreadNotifications.set(r.value > 0 ? r.value : undefined);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Queries the notification list using the supplied filter parameters.\r\n * The `products` and `productModules` fields are automatically populated\r\n * from the service configuration before the request is sent.\r\n * @param params - Search parameters for the notification query.\r\n * @returns An observable that emits `ApiResult<SupportNotificationsSearchResult>`.\r\n */\r\n queryNotifications(params: SupportNotificationsSearchParams) {\r\n params.products = this.products ?? 0;\r\n params.productModules = this.productModules ?? 0;\r\n return this.httpClient.post<ApiResult<SupportNotificationsSearchResult>>(\r\n this._serviceUri + '/notifications',\r\n params\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves a single notification by id.\r\n * @param id - The notification id.\r\n * @returns An observable that emits `ApiResult<SupportNotificationInfo>`.\r\n */\r\n getNotification(id: number) {\r\n return this.httpClient.get<ApiResult<SupportNotificationInfo>>(\r\n this._serviceUri + '/notifications/' + id\r\n );\r\n }\r\n\r\n /**\r\n * Marks one or more notifications as read.\r\n * @param params - Parameters identifying the notifications to mark.\r\n * @returns An observable that emits `ApiResult<boolean>`.\r\n */\r\n markNotifications(params: SupportNotificationsMarkParams) {\r\n return this.httpClient.post<ApiResult<boolean>>(\r\n this._serviceUri + '/notifications/mark',\r\n params\r\n );\r\n }\r\n\r\n /**\r\n * Downloads a notification attachment as a binary blob.\r\n * @param documentId - The id of the document to download.\r\n * @returns An observable that emits the binary blob response.\r\n */\r\n downloadNotificationDocument(documentId: number) {\r\n return this.httpClient.get(\r\n this._serviceUri + '/documents/download/' + documentId,\r\n { responseType: 'blob' }\r\n );\r\n }\r\n}\r\n\r\n","import { NgModule } from '@angular/core';\r\n\r\n@NgModule()\r\nexport class ArsSupportCommonModule {}\r\n\r\n// Other exports\r\nexport * from './messages';\r\nexport * from './definitions';\r\nexport * from './services/support.service';\r\n","/*\r\n * Public API Surface of ars-utils\r\n */\r\nexport * from './common/common.module';\r\nexport * from './common/messages';\r\nexport * from './common/definitions';\r\nexport * from './common/services/support.service';\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arsedizioni-ars-utils-support.common.mjs","sources":["../../../projects/ars-utils/support.common/common/messages.ts","../../../projects/ars-utils/support.common/common/definitions.ts","../../../projects/ars-utils/support.common/common/services/support.service.ts","../../../projects/ars-utils/support.common/public_api.ts","../../../projects/ars-utils/support.common/arsedizioni-ars-utils-support.common.ts"],"sourcesContent":["export const SupportMessages = {\r\n /**\r\n * Messages\r\n */\r\n // Error\r\n ERROR: '§support-error',\r\n\r\n // Login\r\n LOGIN_CHANGED: '§support-login-changed',\r\n LOGIN_COMPLETED: '§support-login-completed',\r\n LOGOUT_COMPLETED: '§support-logout-completed',\r\n LOGIN_PENDING: '§support-login-pending',\r\n LOGIN_FAILED: '§support-login-failed', \r\n LOGOUT: '§support-logout',\r\n\r\n // Notifications\r\n NOTIFICATION_READ: '§support-notification-read',\r\n};\r\n","import { LoginResult } from '@arsedizioni/ars-utils/core';\r\nimport { LoginOAuthType } from '@arsedizioni/ars-utils/ui.oauth';\r\n\r\n\r\n\r\nexport interface SupportUserInfo {\r\n id: number;\r\n groups?: number;\r\n groupNames?: string;\r\n displayName?: string;\r\n dashboard?: string;\r\n sessionId?: string;\r\n email?: string;\r\n customerId?: number;\r\n companyName?: string;\r\n role: number;\r\n scopes?: string[];\r\n sla: number;\r\n isCommercial?: boolean;\r\n isAdministrator: boolean;\r\n isGuest: boolean;\r\n isUser: boolean;\r\n isOperator: boolean;\r\n isTemporary: boolean;\r\n}\r\n\r\n\r\nexport interface SupportLoginResult extends LoginResult<SupportUserInfo> {\r\n}\r\n\r\nexport interface SupportLoginInfo {\r\n context: SupportUserInfo;\r\n oauth?: LoginOAuthType;\r\n remember?: boolean;\r\n}\r\n\r\nexport interface SupportNotificationsSearchParams {\r\n any?: string;\r\n products?: number;\r\n productModules?: number;\r\n first?: number;\r\n count?: number;\r\n}\r\n\r\nexport interface SupportNotificationsSearchResult {\r\n interval?: string;\r\n items?: SupportNotificationInfo[];\r\n total?: number;\r\n}\r\n\r\nexport interface Notification {\r\n id: number;\r\n products: number;\r\n productModules?: number;\r\n publishingDate?: Date;\r\n title: string;\r\n text: string;\r\n state: number;\r\n created: Date;\r\n createdBy: string;\r\n lastUpdated?: Date;\r\n lastUpdatedBy?: string;\r\n productNames?: string;\r\n productModuleNames?: string;\r\n isPublished: boolean;\r\n isInternal: boolean;\r\n stateName: string;\r\n documents?: SupportDocumentInfo[];\r\n isRead: boolean;\r\n totalRead: number;\r\n}\r\n\r\nexport interface SupportDocumentInfo {\r\n id?: number;\r\n origin?: number;\r\n ownerId?: number;\r\n name?: string;\r\n description?: string;\r\n size?: number;\r\n binaryId?: number;\r\n url?: string;\r\n customerId?: number;\r\n created?: Date;\r\n createdBy?: string;\r\n lastUpdated?: Date;\r\n lastUpdatedBy?: string;\r\n isBinary?: boolean;\r\n}\r\n\r\nexport interface SupportNotificationInfo {\r\n id: number;\r\n products?: number;\r\n productModules?: number;\r\n publishingDate?: Date;\r\n title: string;\r\n text: string;\r\n state: number;\r\n created: Date;\r\n createdBy: string;\r\n lastUpdated?: Date;\r\n lastUpdatedBy?: string;\r\n productNames?: string;\r\n productModuleNames?: string;\r\n isPublished: boolean;\r\n isInternal: boolean;\r\n stateName: string;\r\n documents?: SupportDocumentInfo[];\r\n isRead: boolean;\r\n totalRead: number;\r\n isMenuOpen?: boolean;\r\n isOver?: boolean;\r\n\r\n}\r\n\r\nexport interface SupportNotificationsMarkParams {\r\n ids: number[];\r\n unmark: boolean;\r\n}\r\n\r\nexport enum SupportProduct {\r\n None = 0,\r\n Clipper = 1,\r\n Evolution = 1 << 1,\r\n DGInfo = 1 << 2\r\n}\r\n\r\nexport enum SupportProductModule {\r\n None = 0,\r\n EvoFormazione = 1,\r\n EvoDPI = 1 << 1,\r\n EvoSorveglianzaSanitaria = 1 << 2,\r\n EvoRegistroEScadenzario = 1 << 3,\r\n EvoAttrezzatureEImpianti = 1 << 4,\r\n EvoMonitoraggio = 1 << 5,\r\n EvoBollettino = 1 << 6,\r\n DgiADR = 1 << 7,\r\n DgiRID = 1 << 8,\r\n DgiIMDG = 1 << 9,\r\n DgiCLP = 1 << 10,\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, OnDestroy, inject, signal } from '@angular/core';\r\nimport { ApiResult, BroadcastMessageInfo, BroadcastService } from '@arsedizioni/ars-utils/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { SupportMessages } from '../messages';\r\nimport { SupportNotificationInfo, SupportNotificationsMarkParams, SupportNotificationsSearchParams, SupportNotificationsSearchResult, SupportProduct, SupportProductModule } from '../definitions';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SupportService implements OnDestroy {\r\n\r\n private readonly httpClient = inject(HttpClient);\r\n private readonly broadcastService = inject(BroadcastService);\r\n private broadcastServiceSubscription?: Subscription;\r\n\r\n private _serviceUri: string | undefined;\r\n\r\n /** Base URI of the Support back-end service. */\r\n get serviceUri(): string | undefined {\r\n return this._serviceUri;\r\n }\r\n\r\n public products: SupportProduct = SupportProduct.None;\r\n public productModules: SupportProductModule = SupportProductModule.None;\r\n\r\n /** Number of unread notifications, or `undefined` when there are none. */\r\n public readonly unreadNotifications = signal<number | undefined>(undefined);\r\n\r\n ngOnDestroy(): void {\r\n this.broadcastServiceSubscription?.unsubscribe();\r\n }\r\n\r\n /**\r\n * Initialises the service with the back-end URI and the products/modules it should track.\r\n * Must be called once during application bootstrap before any other method.\r\n * @param serviceUri - Base URL of the support service.\r\n * @param products - Bitmask of `SupportProduct` values to scope notifications (default: `None`).\r\n * @param productModules - Bitmask of `SupportProductModule` values to scope notifications (default: `None`).\r\n */\r\n initialize(\r\n serviceUri: string,\r\n products: SupportProduct = SupportProduct.None,\r\n productModules: SupportProductModule = SupportProductModule.None\r\n ): void {\r\n this._serviceUri = serviceUri;\r\n this.products = products;\r\n this.productModules = productModules;\r\n\r\n if (!this.broadcastServiceSubscription) {\r\n this.broadcastServiceSubscription = this.broadcastService\r\n .getMessage()\r\n .subscribe((message: BroadcastMessageInfo) => {\r\n if (message.id === SupportMessages.NOTIFICATION_READ) {\r\n this.countUnreadNotifications();\r\n }\r\n });\r\n }\r\n }\r\n\r\n // ── Notifications ──────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Fetches the count of unread notifications from the server and updates\r\n * the `unreadNotifications` signal. Sets `undefined` when the count is zero.\r\n */\r\n countUnreadNotifications(): void {\r\n this.httpClient\r\n .get<ApiResult<number>>(\r\n this._serviceUri +\r\n '/notifications/unread/?products=' + (this.products ?? 0) +\r\n '&modules=' + (this.productModules ?? 0)\r\n )\r\n .subscribe((r: ApiResult<number>) => {\r\n if (r.success) {\r\n this.unreadNotifications.set(r.value > 0 ? r.value : undefined);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Queries the notification list using the supplied filter parameters.\r\n * The `products` and `productModules` fields are automatically populated\r\n * from the service configuration before the request is sent.\r\n * @param params - Search parameters for the notification query.\r\n * @returns An observable that emits `ApiResult<SupportNotificationsSearchResult>`.\r\n */\r\n queryNotifications(params: SupportNotificationsSearchParams) {\r\n params.products = this.products ?? 0;\r\n params.productModules = this.productModules ?? 0;\r\n return this.httpClient.post<ApiResult<SupportNotificationsSearchResult>>(\r\n this._serviceUri + '/notifications',\r\n params\r\n );\r\n }\r\n\r\n /**\r\n * Retrieves a single notification by id.\r\n * @param id - The notification id.\r\n * @returns An observable that emits `ApiResult<SupportNotificationInfo>`.\r\n */\r\n getNotification(id: number) {\r\n return this.httpClient.get<ApiResult<SupportNotificationInfo>>(\r\n this._serviceUri + '/notifications/' + id\r\n );\r\n }\r\n\r\n /**\r\n * Marks one or more notifications as read.\r\n * @param params - Parameters identifying the notifications to mark.\r\n * @returns An observable that emits `ApiResult<boolean>`.\r\n */\r\n markNotifications(params: SupportNotificationsMarkParams) {\r\n return this.httpClient.post<ApiResult<boolean>>(\r\n this._serviceUri + '/notifications/mark',\r\n params\r\n );\r\n }\r\n\r\n /**\r\n * Downloads a notification attachment as a binary blob.\r\n * @param documentId - The id of the document to download.\r\n * @returns An observable that emits the binary blob response.\r\n */\r\n downloadNotificationDocument(documentId: number) {\r\n return this.httpClient.get(\r\n this._serviceUri + '/documents/download/' + documentId,\r\n { responseType: 'blob' }\r\n );\r\n }\r\n}\r\n\r\n","/*\r\n * Public API Surface of ars-utils\r\n */\r\nexport * from './common/messages';\r\nexport * from './common/definitions';\r\nexport * from './common/services/support.service';\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { output, inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';
|
|
4
4
|
import { SystemUtils } from '@arsedizioni/ars-utils/core';
|
|
5
5
|
import * as i3 from '@angular/material/button';
|
|
@@ -189,16 +189,6 @@ class TinymceUtils {
|
|
|
189
189
|
}
|
|
190
190
|
}
|
|
191
191
|
|
|
192
|
-
class ArsTinyMceModule {
|
|
193
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ArsTinyMceModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
194
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.0", ngImport: i0, type: ArsTinyMceModule }); }
|
|
195
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ArsTinyMceModule }); }
|
|
196
|
-
}
|
|
197
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: ArsTinyMceModule, decorators: [{
|
|
198
|
-
type: NgModule,
|
|
199
|
-
args: [{}]
|
|
200
|
-
}] });
|
|
201
|
-
|
|
202
192
|
class FullScreenEditorComponent {
|
|
203
193
|
constructor() {
|
|
204
194
|
/** Emitted with the edited text when the user saves. */
|
|
@@ -250,5 +240,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImpor
|
|
|
250
240
|
* Generated bundle index. Do not edit.
|
|
251
241
|
*/
|
|
252
242
|
|
|
253
|
-
export {
|
|
243
|
+
export { FullScreenEditorComponent, TinymceUtils };
|
|
254
244
|
//# sourceMappingURL=arsedizioni-ars-utils-tinymce.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arsedizioni-ars-utils-tinymce.mjs","sources":["../../../projects/ars-utils/tinymce/utils.ts","../../../projects/ars-utils/tinymce/tinymce.module.ts","../../../projects/ars-utils/tinymce/full-screen-editor/full-screen-editor.component.ts","../../../projects/ars-utils/tinymce/full-screen-editor/full-screen-editor.component.html","../../../projects/ars-utils/tinymce/public_api.ts","../../../projects/ars-utils/tinymce/arsedizioni-ars-utils-tinymce.ts"],"sourcesContent":["export class TinymceUtils {\r\n /** URL of the TinyMCE script hosted on the Tiny Cloud CDN. */\r\n static readonly CDN_URL = 'https://cdn.tiny.cloud/1/5lnoc6ohmpjau6zyzgqyhyf52cueoennkcs8v1yfoak57ku9/tinymce/7/tinymce.min.js';\r\n /** URL of the locally bundled TinyMCE script. */\r\n static readonly LOCAL_URL = '/assets/tinymce/tinymce.min.js';\r\n\r\n /**\r\n * Full-featured TinyMCE base configuration with all standard plugins and toolbar.\r\n */\r\n static TinymceConfig: Record<string, any> = {\r\n base_url: 'assets/tinymce',\r\n suffix: '.min',\r\n license_key: 'gpl', // per evitare il warning riportarla direttamente nell'html: <editor licenseKey=\"gpl\" ...></editor>\r\n language: 'it',\r\n language_url: \"assets/tinymce/langs/it.js\",\r\n height: 500,\r\n width: '100%',\r\n min_height: 250,\r\n ui_mode: 'split',\r\n onboarding: false,\r\n branding: false,\r\n convert_urls: false,\r\n quickbars_insert_toolbar: false,\r\n quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',\r\n fullpage_default_doctype: '<!DOCTYPE html>',\r\n fullpage_default_encoding: 'UTF-8',\r\n fullpage_default_font_family: '\\'Helvetica Neue\\', sans-serif', // '\\'Times New Roman\\', Georgia, Serif',\r\n fullpage_default_xml_pi: false,\r\n fullpage_hide_in_source_view: false,\r\n browser_spellcheck: true,\r\n spellchecker_language: 'it_IT',\r\n save_enablewhendirty: true,\r\n custom_undo_redo_levels: 50,\r\n nonbreaking_force_tab: true, // inserisce 3 per ogni pressione di TAB\r\n nonbreaking_wrap: false,\r\n help_tabs: ['shortcuts', 'keyboardnav', 'versions'],\r\n plugins: 'advlist anchor autolink autosave charmap code fullscreen help hr image insertdatetime link lists media table nonbreaking paste preview print quickbars searchreplace textpattern visualblocks visualchars',\r\n menubar: false,\r\n skin: window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"oxide-dark\" : \"oxide\",\r\n content_css: window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"default\",\r\n toolbar: [\r\n 'fullscreen | undo redo searchreplace | code openCodeMirrorButton preview fullpage | link image media insertMediaButton charmap nonbreaking | table tableprops tabledelete',\r\n 'bold italic superscript subscript forecolor backcolor | alignleft aligncenter alignright alignjustify | removeformat | bullist numlist checklist'\r\n ],\r\n style_formats: [\r\n {\r\n title: 'Immagini float', items: [\r\n {\r\n title: 'Immagine a SX',\r\n selector: 'img',\r\n styles: { float: 'left', margin: '0 10px 0 10px' }\r\n },\r\n {\r\n title: 'Immagine a DX',\r\n selector: 'img',\r\n styles: { float: 'right', margin: '0 10px 0 10px' }\r\n }\r\n ]\r\n },\r\n {\r\n title: 'Formati', items: [\r\n { title: 'Grassetto', format: 'bold' },\r\n { title: 'Corsivo', format: 'italic' },\r\n { title: 'Sottolineato', format: 'underline' },\r\n { title: 'Barrato', format: 'strikethrough' },\r\n { title: 'Superscript', format: 'superscript' },\r\n { title: 'Subscript', format: 'subscript' },\r\n { title: 'Codice', format: 'code' }\r\n ]\r\n }],\r\n formats: {\r\n underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },\r\n strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }\r\n },\r\n insertdatetime_formats: ['%d/%m/%Y', '%d %b %Y', '%A, %d %B %Y'],\r\n link_default_target: '_blank',\r\n link_title: true,\r\n link_assume_external_targets: 'https',\r\n link_class_list: [\r\n { title: 'Nessuno', value: '' },\r\n { title: 'Rilevante', value: 'relevant' },\r\n ],\r\n link_context_toolbar: true,\r\n link_list: [\r\n { title: 'Ars Edizioni', value: 'https://www.arsedizioni.it' },\r\n { title: 'Ars Edizioni - Corsi', value: 'https://www.arsedizioni.it/Events' },\r\n { title: 'Clipper', value: 'https://clipper.arsedizioni.it' },\r\n { title: 'Registro', value: 'https://registro.arsedizioni.it' },\r\n { title: 'Ars EVO', value: 'https://evolution.arsedizioni.it' },\r\n { title: 'DG Info', value: 'https://dginfo.arsedizioni.it' },\r\n { title: 'Lavoro e Ambiente', value: 'https://lavoroeambiente.arsedizioni.it' },\r\n { title: 'Sostanze Alimentari', value: 'https://sostanzealimentari.arsedizioni.it' },\r\n { title: 'OrangeNews', value: 'https://orangenews.arsedizioni.it' },\r\n { title: 'MyARS', value: 'https://my.arsedizioni.it' },\r\n { title: 'Canale Youtube Ars', value: 'https://www.youtube.com/user/ARSEDZ' },\r\n // { title: 'My page 2', value: 'https://about.tiny.cloud' }\r\n ],\r\n link_quicklink: true,\r\n rel_list: false,\r\n image_advtab: true,\r\n paste_data_images: true,\r\n image_caption: true,\r\n image_title: true,\r\n automatic_uploads: true,\r\n images_reuse_filename: true,\r\n images_upload_credentials: true,\r\n file_picker_types: 'file image',\r\n };\r\n\r\n /**\r\n * Compact TinyMCE configuration with autoresize, bottom toolbar, and grouped toolbar buttons.\r\n * Extends `TinymceConfig` with reduced height and a simplified toolbar.\r\n */\r\n static TinymceCompactConfig: Record<string, any> = Object.assign({}, this.TinymceConfig, {\r\n height: 200,\r\n width: '100%',\r\n suffix: '.min',\r\n license_key: 'gpl',\r\n ui_mode: 'split',\r\n min_height: 200,\r\n max_height: 500,\r\n quickbars_insert_toolbar: 'quickimage hr',\r\n quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',\r\n plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',\r\n statusbar: false,\r\n menubar: false,\r\n contextmenu: false,\r\n toolbar_location: 'bottom',\r\n toolbar: ['undo redo | quickimage | formatgroup paragraphgroup '],\r\n toolbar_groups: {\r\n formatgroup: {\r\n icon: 'format',\r\n tooltip: 'Formatting',\r\n items: 'bold italic underline superscript subscript | forecolor backcolor | removeformat'\r\n },\r\n paragraphgroup: {\r\n icon: 'paragraph',\r\n tooltip: 'Paragraph format',\r\n items: 'h1 h2 h3 | bullist numlist | alignleft aligncenter alignright alignjustify | indent outdent'\r\n },\r\n insertgroup: {\r\n icon: 'plus',\r\n tooltip: 'Insert',\r\n items: 'quickimage media | link charmap nonbreaking | table tableprops tabledelete'\r\n }\r\n },\r\n formats: {\r\n underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },\r\n strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }\r\n },\r\n link_default_target: '_blank',\r\n link_title: true,\r\n link_assume_external_targets: 'https',\r\n link_class_list: [],\r\n });\r\n\r\n /**\r\n * Extended compact TinyMCE configuration that adds fullscreen support and an insert group.\r\n * Extends `TinymceCompactConfig`.\r\n */\r\n static TinymceCompactExtendedConfig: Record<string, any> = Object.assign({}, this.TinymceCompactConfig, {\r\n license_key: 'gpl',\r\n ui_mode: 'split',\r\n plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime fullscreen link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',\r\n toolbar: ['undo redo | quickimage insertgroup | formatgroup paragraphgroup | code | fullscreen '],\r\n });\r\n\r\n\r\n /**\r\n * Inject the TinyMCE script tag into the document head if it is not already present.\r\n * @param useCDN - When `true`, loads from the Tiny Cloud CDN; otherwise uses the local asset.\r\n */\r\n static loadTinyMCEScript(useCDN?: boolean): void {\r\n const url = useCDN === true ? this.CDN_URL : this.LOCAL_URL;\r\n if (!document.querySelector(`script[src=\"${url}\"]`)) {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.referrerPolicy = 'origin';\r\n document.head.appendChild(script);\r\n }\r\n }\r\n}","import { NgModule } from '@angular/core';\r\n\r\n@NgModule({\r\n})\r\nexport class ArsTinyMceModule { }\r\n\r\nexport * from './utils';","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { TinymceUtils } from '../utils';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { EditorComponent } from '@tinymce/tinymce-angular';\r\n\r\nexport interface FullScreenEditorDialogData {\r\n text: string;\r\n configuration: Record<string, any>;\r\n infoButtonLabel?: string;\r\n onShowInfo?: Function,\r\n disabled?: boolean;\r\n useCDN?: boolean;\r\n}\r\n\r\n@Component({\r\n templateUrl: './full-screen-editor.component.html',\r\n styleUrls: ['./full-screen-editor.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDialogContent, EditorComponent, FormsModule, MatDialogActions, FlexModule, \r\n MatButtonModule, MatDialogClose]\r\n})\r\nexport class FullScreenEditorComponent {\r\n\r\n /** Emitted with the edited text when the user saves. */\r\n readonly saving = output<string>();\r\n private readonly dialogRef = inject(MatDialogRef<FullScreenEditorComponent>);\r\n /** Dialog configuration, injected and exposed as a signal. */\r\n protected readonly dialogData = signal<FullScreenEditorDialogData>((() => {\r\n const data: FullScreenEditorDialogData = inject(MAT_DIALOG_DATA) ?? {};\r\n return { ...data, text: data.text ?? '' };\r\n })());\r\n /** Whether the editor is in read-only mode. */\r\n protected readonly disabled = signal<boolean>(false);\r\n /** Current editor content, kept as a plain field for [(ngModel)] two-way binding. */\r\n protected text: string;\r\n /** TinyMCE editor configuration. */\r\n protected tinymceConfig: Record<string, any>;\r\n\r\n constructor() {\r\n const data = this.dialogData();\r\n this.text = data.text;\r\n if (data.configuration) {\r\n this.tinymceConfig = { ...data.configuration, license_key: 'gpl' };\r\n } else {\r\n this.tinymceConfig = SystemUtils.clone(TinymceUtils.TinymceCompactExtendedConfig);\r\n }\r\n this.tinymceConfig['toolbar'] = ['undo redo | formatgroup paragraphgroup insertgroup | code openCodeMirrorButton'];\r\n this.disabled.set(data.disabled ?? false);\r\n }\r\n\r\n\r\n /**\r\n * Save the current editor content and close the dialog.\r\n */\r\n protected ok(): void {\r\n this.saving.emit(this.text ?? '');\r\n setTimeout(() => {\r\n this.dialogRef.close();\r\n }, 500);\r\n }\r\n}\r\n","<mat-dialog-content style=\"padding: 10px 10px 0 10px\">\r\n <editor style=\"height: 100%;\" [init]=\"tinymceConfig\" class=\"full-screen-editor\" [disabled]=\"disabled()\"\r\n [(ngModel)]=\"text\" licenseKey=\"gpl\">\r\n </editor>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"50\">\r\n @if(dialogData().onShowInfo) {\r\n <button mat-stroked-button (click)=\"dialogData().onShowInfo()\">{{dialogData().infoButtonLabel ?? 'Informazioni'}}\r\n </button>\r\n }\r\n </div>\r\n <div fxFlex=\"50\" fxLayoutAlign=\"end\">\r\n @if (disabled()) {\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Chiudi</button>\r\n } @else {\r\n <button mat-flat-button (click)=\"ok()\">Salva</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n }\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","/*\r\n * Public API Surface of ars-utils-tinymce\r\n */\r\nexport * from './tinymce.module';\r\nexport * from './utils';\r\nexport * from './full-screen-editor/full-screen-editor.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arsedizioni-ars-utils-tinymce.mjs","sources":["../../../projects/ars-utils/tinymce/utils.ts","../../../projects/ars-utils/tinymce/full-screen-editor/full-screen-editor.component.ts","../../../projects/ars-utils/tinymce/full-screen-editor/full-screen-editor.component.html","../../../projects/ars-utils/tinymce/public_api.ts","../../../projects/ars-utils/tinymce/arsedizioni-ars-utils-tinymce.ts"],"sourcesContent":["export class TinymceUtils {\r\n /** URL of the TinyMCE script hosted on the Tiny Cloud CDN. */\r\n static readonly CDN_URL = 'https://cdn.tiny.cloud/1/5lnoc6ohmpjau6zyzgqyhyf52cueoennkcs8v1yfoak57ku9/tinymce/7/tinymce.min.js';\r\n /** URL of the locally bundled TinyMCE script. */\r\n static readonly LOCAL_URL = '/assets/tinymce/tinymce.min.js';\r\n\r\n /**\r\n * Full-featured TinyMCE base configuration with all standard plugins and toolbar.\r\n */\r\n static TinymceConfig: Record<string, any> = {\r\n base_url: 'assets/tinymce',\r\n suffix: '.min',\r\n license_key: 'gpl', // per evitare il warning riportarla direttamente nell'html: <editor licenseKey=\"gpl\" ...></editor>\r\n language: 'it',\r\n language_url: \"assets/tinymce/langs/it.js\",\r\n height: 500,\r\n width: '100%',\r\n min_height: 250,\r\n ui_mode: 'split',\r\n onboarding: false,\r\n branding: false,\r\n convert_urls: false,\r\n quickbars_insert_toolbar: false,\r\n quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',\r\n fullpage_default_doctype: '<!DOCTYPE html>',\r\n fullpage_default_encoding: 'UTF-8',\r\n fullpage_default_font_family: '\\'Helvetica Neue\\', sans-serif', // '\\'Times New Roman\\', Georgia, Serif',\r\n fullpage_default_xml_pi: false,\r\n fullpage_hide_in_source_view: false,\r\n browser_spellcheck: true,\r\n spellchecker_language: 'it_IT',\r\n save_enablewhendirty: true,\r\n custom_undo_redo_levels: 50,\r\n nonbreaking_force_tab: true, // inserisce 3 per ogni pressione di TAB\r\n nonbreaking_wrap: false,\r\n help_tabs: ['shortcuts', 'keyboardnav', 'versions'],\r\n plugins: 'advlist anchor autolink autosave charmap code fullscreen help hr image insertdatetime link lists media table nonbreaking paste preview print quickbars searchreplace textpattern visualblocks visualchars',\r\n menubar: false,\r\n skin: window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"oxide-dark\" : \"oxide\",\r\n content_css: window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"default\",\r\n toolbar: [\r\n 'fullscreen | undo redo searchreplace | code openCodeMirrorButton preview fullpage | link image media insertMediaButton charmap nonbreaking | table tableprops tabledelete',\r\n 'bold italic superscript subscript forecolor backcolor | alignleft aligncenter alignright alignjustify | removeformat | bullist numlist checklist'\r\n ],\r\n style_formats: [\r\n {\r\n title: 'Immagini float', items: [\r\n {\r\n title: 'Immagine a SX',\r\n selector: 'img',\r\n styles: { float: 'left', margin: '0 10px 0 10px' }\r\n },\r\n {\r\n title: 'Immagine a DX',\r\n selector: 'img',\r\n styles: { float: 'right', margin: '0 10px 0 10px' }\r\n }\r\n ]\r\n },\r\n {\r\n title: 'Formati', items: [\r\n { title: 'Grassetto', format: 'bold' },\r\n { title: 'Corsivo', format: 'italic' },\r\n { title: 'Sottolineato', format: 'underline' },\r\n { title: 'Barrato', format: 'strikethrough' },\r\n { title: 'Superscript', format: 'superscript' },\r\n { title: 'Subscript', format: 'subscript' },\r\n { title: 'Codice', format: 'code' }\r\n ]\r\n }],\r\n formats: {\r\n underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },\r\n strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }\r\n },\r\n insertdatetime_formats: ['%d/%m/%Y', '%d %b %Y', '%A, %d %B %Y'],\r\n link_default_target: '_blank',\r\n link_title: true,\r\n link_assume_external_targets: 'https',\r\n link_class_list: [\r\n { title: 'Nessuno', value: '' },\r\n { title: 'Rilevante', value: 'relevant' },\r\n ],\r\n link_context_toolbar: true,\r\n link_list: [\r\n { title: 'Ars Edizioni', value: 'https://www.arsedizioni.it' },\r\n { title: 'Ars Edizioni - Corsi', value: 'https://www.arsedizioni.it/Events' },\r\n { title: 'Clipper', value: 'https://clipper.arsedizioni.it' },\r\n { title: 'Registro', value: 'https://registro.arsedizioni.it' },\r\n { title: 'Ars EVO', value: 'https://evolution.arsedizioni.it' },\r\n { title: 'DG Info', value: 'https://dginfo.arsedizioni.it' },\r\n { title: 'Lavoro e Ambiente', value: 'https://lavoroeambiente.arsedizioni.it' },\r\n { title: 'Sostanze Alimentari', value: 'https://sostanzealimentari.arsedizioni.it' },\r\n { title: 'OrangeNews', value: 'https://orangenews.arsedizioni.it' },\r\n { title: 'MyARS', value: 'https://my.arsedizioni.it' },\r\n { title: 'Canale Youtube Ars', value: 'https://www.youtube.com/user/ARSEDZ' },\r\n // { title: 'My page 2', value: 'https://about.tiny.cloud' }\r\n ],\r\n link_quicklink: true,\r\n rel_list: false,\r\n image_advtab: true,\r\n paste_data_images: true,\r\n image_caption: true,\r\n image_title: true,\r\n automatic_uploads: true,\r\n images_reuse_filename: true,\r\n images_upload_credentials: true,\r\n file_picker_types: 'file image',\r\n };\r\n\r\n /**\r\n * Compact TinyMCE configuration with autoresize, bottom toolbar, and grouped toolbar buttons.\r\n * Extends `TinymceConfig` with reduced height and a simplified toolbar.\r\n */\r\n static TinymceCompactConfig: Record<string, any> = Object.assign({}, this.TinymceConfig, {\r\n height: 200,\r\n width: '100%',\r\n suffix: '.min',\r\n license_key: 'gpl',\r\n ui_mode: 'split',\r\n min_height: 200,\r\n max_height: 500,\r\n quickbars_insert_toolbar: 'quickimage hr',\r\n quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',\r\n plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',\r\n statusbar: false,\r\n menubar: false,\r\n contextmenu: false,\r\n toolbar_location: 'bottom',\r\n toolbar: ['undo redo | quickimage | formatgroup paragraphgroup '],\r\n toolbar_groups: {\r\n formatgroup: {\r\n icon: 'format',\r\n tooltip: 'Formatting',\r\n items: 'bold italic underline superscript subscript | forecolor backcolor | removeformat'\r\n },\r\n paragraphgroup: {\r\n icon: 'paragraph',\r\n tooltip: 'Paragraph format',\r\n items: 'h1 h2 h3 | bullist numlist | alignleft aligncenter alignright alignjustify | indent outdent'\r\n },\r\n insertgroup: {\r\n icon: 'plus',\r\n tooltip: 'Insert',\r\n items: 'quickimage media | link charmap nonbreaking | table tableprops tabledelete'\r\n }\r\n },\r\n formats: {\r\n underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },\r\n strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }\r\n },\r\n link_default_target: '_blank',\r\n link_title: true,\r\n link_assume_external_targets: 'https',\r\n link_class_list: [],\r\n });\r\n\r\n /**\r\n * Extended compact TinyMCE configuration that adds fullscreen support and an insert group.\r\n * Extends `TinymceCompactConfig`.\r\n */\r\n static TinymceCompactExtendedConfig: Record<string, any> = Object.assign({}, this.TinymceCompactConfig, {\r\n license_key: 'gpl',\r\n ui_mode: 'split',\r\n plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime fullscreen link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',\r\n toolbar: ['undo redo | quickimage insertgroup | formatgroup paragraphgroup | code | fullscreen '],\r\n });\r\n\r\n\r\n /**\r\n * Inject the TinyMCE script tag into the document head if it is not already present.\r\n * @param useCDN - When `true`, loads from the Tiny Cloud CDN; otherwise uses the local asset.\r\n */\r\n static loadTinyMCEScript(useCDN?: boolean): void {\r\n const url = useCDN === true ? this.CDN_URL : this.LOCAL_URL;\r\n if (!document.querySelector(`script[src=\"${url}\"]`)) {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.referrerPolicy = 'origin';\r\n document.head.appendChild(script);\r\n }\r\n }\r\n}","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\r\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\r\nimport { TinymceUtils } from '../utils';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FlexModule } from '@ngbracket/ngx-layout/flex';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { EditorComponent } from '@tinymce/tinymce-angular';\r\n\r\nexport interface FullScreenEditorDialogData {\r\n text: string;\r\n configuration: Record<string, any>;\r\n infoButtonLabel?: string;\r\n onShowInfo?: Function,\r\n disabled?: boolean;\r\n useCDN?: boolean;\r\n}\r\n\r\n@Component({\r\n templateUrl: './full-screen-editor.component.html',\r\n styleUrls: ['./full-screen-editor.component.scss'],\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatDialogContent, EditorComponent, FormsModule, MatDialogActions, FlexModule, \r\n MatButtonModule, MatDialogClose]\r\n})\r\nexport class FullScreenEditorComponent {\r\n\r\n /** Emitted with the edited text when the user saves. */\r\n readonly saving = output<string>();\r\n private readonly dialogRef = inject(MatDialogRef<FullScreenEditorComponent>);\r\n /** Dialog configuration, injected and exposed as a signal. */\r\n protected readonly dialogData = signal<FullScreenEditorDialogData>((() => {\r\n const data: FullScreenEditorDialogData = inject(MAT_DIALOG_DATA) ?? {};\r\n return { ...data, text: data.text ?? '' };\r\n })());\r\n /** Whether the editor is in read-only mode. */\r\n protected readonly disabled = signal<boolean>(false);\r\n /** Current editor content, kept as a plain field for [(ngModel)] two-way binding. */\r\n protected text: string;\r\n /** TinyMCE editor configuration. */\r\n protected tinymceConfig: Record<string, any>;\r\n\r\n constructor() {\r\n const data = this.dialogData();\r\n this.text = data.text;\r\n if (data.configuration) {\r\n this.tinymceConfig = { ...data.configuration, license_key: 'gpl' };\r\n } else {\r\n this.tinymceConfig = SystemUtils.clone(TinymceUtils.TinymceCompactExtendedConfig);\r\n }\r\n this.tinymceConfig['toolbar'] = ['undo redo | formatgroup paragraphgroup insertgroup | code openCodeMirrorButton'];\r\n this.disabled.set(data.disabled ?? false);\r\n }\r\n\r\n\r\n /**\r\n * Save the current editor content and close the dialog.\r\n */\r\n protected ok(): void {\r\n this.saving.emit(this.text ?? '');\r\n setTimeout(() => {\r\n this.dialogRef.close();\r\n }, 500);\r\n }\r\n}\r\n","<mat-dialog-content style=\"padding: 10px 10px 0 10px\">\r\n <editor style=\"height: 100%;\" [init]=\"tinymceConfig\" class=\"full-screen-editor\" [disabled]=\"disabled()\"\r\n [(ngModel)]=\"text\" licenseKey=\"gpl\">\r\n </editor>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\r\n <div fxFlex=\"50\">\r\n @if(dialogData().onShowInfo) {\r\n <button mat-stroked-button (click)=\"dialogData().onShowInfo()\">{{dialogData().infoButtonLabel ?? 'Informazioni'}}\r\n </button>\r\n }\r\n </div>\r\n <div fxFlex=\"50\" fxLayoutAlign=\"end\">\r\n @if (disabled()) {\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Chiudi</button>\r\n } @else {\r\n <button mat-flat-button (click)=\"ok()\">Salva</button>\r\n <button mat-stroked-button [mat-dialog-close]=\"true\">Annulla</button>\r\n }\r\n </div>\r\n </div>\r\n</mat-dialog-actions>\r\n","/*\r\n * Public API Surface of ars-utils-tinymce\r\n */\r\nexport * from './utils';\r\nexport * from './full-screen-editor/full-screen-editor.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|