@arsedizioni/ars-utils 22.1.4 → 22.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +97 -10
  2. package/clipper.ui/clipper.scss +564 -0
  3. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +1 -1
  4. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  5. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +7 -3
  6. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  7. package/fesm2022/arsedizioni-ars-utils-core.date.mjs +609 -0
  8. package/fesm2022/arsedizioni-ars-utils-core.date.mjs.map +1 -0
  9. package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs +591 -0
  10. package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs.map +1 -0
  11. package/fesm2022/arsedizioni-ars-utils-core.mjs +270 -1449
  12. package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
  13. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +1 -1
  14. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
  15. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +1 -1
  16. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  17. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +14 -3080
  18. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  19. package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs +962 -0
  20. package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs.map +1 -0
  21. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +506 -0
  22. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs.map +1 -0
  23. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs +763 -0
  24. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs.map +1 -0
  25. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +184 -0
  26. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs.map +1 -0
  27. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +825 -0
  28. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs.map +1 -0
  29. package/fesm2022/arsedizioni-ars-utils-ui.files.mjs +708 -0
  30. package/fesm2022/arsedizioni-ars-utils-ui.files.mjs.map +1 -0
  31. package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs +426 -0
  32. package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs.map +1 -0
  33. package/fesm2022/arsedizioni-ars-utils-ui.help.mjs +531 -0
  34. package/fesm2022/arsedizioni-ars-utils-ui.help.mjs.map +1 -0
  35. package/fesm2022/arsedizioni-ars-utils-ui.mjs +62 -2222
  36. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  37. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +1049 -0
  38. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs.map +1 -0
  39. package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs +263 -0
  40. package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs.map +1 -0
  41. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +4 -3
  42. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
  43. package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs +246 -0
  44. package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs.map +1 -0
  45. package/fesm2022/arsedizioni-ars-utils.mjs +13 -12
  46. package/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
  47. package/help/package.json +4 -0
  48. package/package.json +72 -14
  49. package/support.ui/package.json +4 -0
  50. package/tinymce/package.json +4 -0
  51. package/types/arsedizioni-ars-utils-clipper.common.d.ts +1 -2
  52. package/types/arsedizioni-ars-utils-clipper.ui.d.ts +3 -1
  53. package/types/arsedizioni-ars-utils-core.d.ts +684 -1004
  54. package/types/arsedizioni-ars-utils-core.date.d.ts +304 -0
  55. package/types/arsedizioni-ars-utils-core.markdown.d.ts +159 -0
  56. package/types/arsedizioni-ars-utils-ui.application.d.ts +10 -1377
  57. package/types/arsedizioni-ars-utils-ui.controls.d.ts +413 -0
  58. package/types/arsedizioni-ars-utils-ui.d.ts +198 -1206
  59. package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts +224 -0
  60. package/types/arsedizioni-ars-utils-ui.dialogs.d.ts +376 -0
  61. package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts +47 -0
  62. package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts +309 -0
  63. package/types/arsedizioni-ars-utils-ui.files.d.ts +271 -0
  64. package/types/arsedizioni-ars-utils-ui.filters.d.ts +163 -0
  65. package/types/arsedizioni-ars-utils-ui.help.d.ts +220 -0
  66. package/types/arsedizioni-ars-utils-ui.navigation.d.ts +650 -0
  67. package/types/arsedizioni-ars-utils-ui.notifications.d.ts +73 -0
  68. package/types/arsedizioni-ars-utils-ui.tinymce.d.ts +63 -0
  69. package/types/arsedizioni-ars-utils.d.ts +4 -10
  70. package/ui.tinymce/README.md +12 -0
  71. package/ui.tinymce/langs/it.js +466 -0
  72. package/types/arsedizioni-ars-utils-core.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"arsedizioni-ars-utils-ui.oauth.mjs","sources":["../../../projects/ars-utils/ui.oauth/ui/components/login/login-oauth.component.ts","../../../projects/ars-utils/ui.oauth/ui/components/login/login-oauth.component.html","../../../projects/ars-utils/ui.oauth/ui/components/login-ok/ms/login-oauth-ok-ms.component.ts","../../../projects/ars-utils/ui.oauth/ui/components/login-ok/ms/login-oauth-ok-ms.component.html","../../../projects/ars-utils/ui.oauth/public_api.ts","../../../projects/ars-utils/ui.oauth/arsedizioni-ars-utils-ui.oauth.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, NgZone, afterNextRender, inject, input, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { EnvironmentService, LoginOAuthResult, LoginOAuthType } from '@arsedizioni/ars-utils/core';\nimport { DialogService } from '@arsedizioni/ars-utils/ui';\nimport { MSAL_GUARD_CONFIG, MSAL_INSTANCE, MSAL_INTERCEPTOR_CONFIG, MsalBroadcastService, MsalGuardConfiguration, MsalInterceptorConfiguration, MsalService } from '@azure/msal-angular';\nimport { AuthenticationResult, BrowserCacheLocation, EventMessage, EventType, IPublicClientApplication, InteractionType, PublicClientApplication } from '@azure/msal-browser';\nimport { filter } from 'rxjs';\n\n/** Default Azure app registration — overridable via EnvironmentService. */\nconst DEFAULT_MS_CLIENT_ID = '6b2c080f-6ab0-4511-a9df-0bce69db5833';\nconst MS_AUTH_SCOPE = `api://${DEFAULT_MS_CLIENT_ID}/AngularSPAAuthScope`;\n\nexport function MSALInstanceFactory(environment: EnvironmentService): IPublicClientApplication {\n return new PublicClientApplication({\n auth: {\n clientId: (environment as any).msalClientId ?? DEFAULT_MS_CLIENT_ID,\n authority: (environment as any).msalAuthority ?? 'https://login.microsoftonline.com/common',\n redirectUri: environment.appLoginRedirectUri,\n },\n cache: {\n cacheLocation: BrowserCacheLocation.LocalStorage\n }\n });\n}\n\nexport function MSALInterceptorConfigFactory(environment: EnvironmentService): MsalInterceptorConfiguration {\n\n return {\n interactionType: InteractionType.Popup,\n protectedResourceMap: new Map([\n [environment.appServiceLoginUri, [MS_AUTH_SCOPE]],\n [\"https://graph.microsoft.com/v2.0/me\", [\"user.read\"]],\n ])\n };\n}\n\nexport function MSALGuardConfigFactory(): MsalGuardConfiguration {\n return {\n interactionType: InteractionType.Popup,\n authRequest: {\n scopes: [\"user.read\"]\n }\n };\n}\n\n@Component({\n selector: 'login-oauth',\n templateUrl: './login-oauth.component.html',\n styleUrls: ['./login-oauth.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: MSAL_INSTANCE,\n deps: [EnvironmentService],\n useFactory: MSALInstanceFactory\n },\n {\n provide: MSAL_GUARD_CONFIG,\n useFactory: MSALGuardConfigFactory\n },\n {\n provide: MSAL_INTERCEPTOR_CONFIG,\n deps: [EnvironmentService],\n useFactory: MSALInterceptorConfigFactory\n },\n MsalService,\n MsalBroadcastService],\n imports: [\n MatButtonModule\n ]\n})\nexport class LoginOAuthComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly msalBroadcastService = inject(MsalBroadcastService);\n private readonly msaLService = inject(MsalService);\n private readonly dialogService = inject(DialogService);\n private readonly ngZone = inject(NgZone);\n /** Emitted when OAuth authentication succeeds. */\n readonly success = output<LoginOAuthResult>();\n /** Whether to show the introductory info panel. */\n readonly showInfo = input<boolean>(true);\n /** Application name displayed in the info panel. */\n readonly applicationName = input<string>();\n /** Whether to trigger `initialize()` automatically on mount. */\n readonly autoInitialize = input<boolean>(false);\n /** Whether the Microsoft login button is shown. */\n readonly allowMicrosoft = input<boolean>(true);\n /** Whether the Google login button is shown. */\n readonly allowGoogle = input<boolean>(true);\n /** Google OAuth client id. Override per deployment. */\n readonly googleClientId = input<string>('71204983077-ag31h3bgt2udcbfr9nn84r9rni2k3snp.apps.googleusercontent.com');\n /** MSAL access-token scope requested after login. */\n readonly msalScope = input<string>(MS_AUTH_SCOPE);\n protected readonly oauthReady = signal<boolean>(false);\n protected readonly oauthMicrosoftReady = signal<boolean>(false);\n protected readonly oauthGoogleReady = signal<boolean>(false);\n /** Hidden GSI button proxy, created once the Google library is ready. */\n private googleButtonWrapper?: { click: () => void };\n\n constructor() {\n\n this.msalBroadcastService.msalSubject$\n .pipe(\n filter((msg: EventMessage) =>\n msg.eventType === EventType.LOGOUT_FAILURE ||\n msg.eventType === EventType.ACQUIRE_TOKEN_FAILURE),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((r: EventMessage) => {\n if (r?.payload) {\n const error = r.payload as any;\n this.dialogService.error(error?.message ?? 'Errore di autenticazione Microsoft');\n }\n });\n\n afterNextRender(() => {\n if (this.autoInitialize()) {\n this.initialize();\n }\n });\n\n }\n\n /**\n * Initialize OAuth providers (Microsoft MSAL and Google GSI).\n * Safe to call multiple times — already-initialized providers are skipped.\n * Must be public so the host component can trigger it manually when `autoInitialize` is false.\n */\n initialize() {\n this.oauthReady.set(true);\n\n // Initialize the Microsoft stack only when allowed and not already done.\n if (this.allowMicrosoft() && !this.oauthMicrosoftReady()) {\n this.msaLService.initialize()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.oauthMicrosoftReady.set(true),\n error: (error: any) =>\n this.dialogService.error(error?.message ?? 'Errore di inizializzazione Microsoft'),\n });\n }\n\n // Load the Google GSI script only when allowed and not already done.\n if (this.allowGoogle() && !this.oauthGoogleReady()) {\n // @ts-ignore — define the callback BEFORE the script loads so GSI can find it\n window.onGoogleLibraryLoad = () => {\n // @ts-ignore\n google.accounts.id.initialize({\n client_id: this.googleClientId(),\n cancel_on_tap_outside: true,\n auto_select: false,\n callback: (r: any) => {\n this.ngZone.run(() => {\n this.success.emit({ type: LoginOAuthType.Google, token: r.credential });\n });\n }\n });\n\n this.googleButtonWrapper = createFakeGoogleWrapper();\n this.ngZone.run(() => this.oauthGoogleReady.set(true));\n };\n\n // Reuse the script tag if a previous instance already added it.\n const existing = document.querySelector<HTMLScriptElement>('script[data-gsi=\"ars\"]');\n if (existing) {\n // @ts-ignore — library already present: run the callback directly\n if (window.google?.accounts?.id) window.onGoogleLibraryLoad();\n } else {\n const script = document.createElement('script');\n script.src = 'https://accounts.google.com/gsi/client';\n script.async = true;\n script.defer = true;\n script.dataset['gsi'] = 'ars';\n script.onerror = () => this.ngZone.run(() =>\n this.dialogService.error('Impossibile caricare il servizio di accesso Google.'));\n // Append and LEAVE it in the DOM so the browser actually fetches it.\n document.body.appendChild(script);\n }\n }\n }\n\n /**\n * Trigger a Microsoft (MSAL) login popup and acquire an access token on success.\n */\n protected loginMSAL() {\n // Clear any in-progress interaction flag that may have been left by a previous incomplete popup\n sessionStorage.removeItem('msal.interaction.status');\n\n this.msaLService.loginPopup()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (r: AuthenticationResult) => {\n try {\n this.msaLService.instance.setActiveAccount(r.account);\n this.msaLService.acquireTokenSilent({\n scopes: [this.msalScope()],\n account: r.account\n }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (tokenResult: AuthenticationResult) => {\n this.success.emit({ type: LoginOAuthType.Microsoft, token: tokenResult.accessToken });\n },\n error: (error: any) => {\n this.dialogService.error(error.message);\n }\n });\n } catch (error: any) {\n this.dialogService.error(error.message);\n }\n },\n error: (error: any) => {\n this.dialogService.error(error.message);\n }\n });\n }\n\n /**\n * Trigger the hidden Google GSI button to open the Google sign-in flow.\n */\n protected loginGoogle() {\n // Use the wrapper click to avoid an \"Illegal invocation\" exception.\n // Guard: the button only exists once the GSI library has loaded.\n if (!this.googleButtonWrapper) {\n this.dialogService.error('Il servizio di accesso Google non è ancora pronto.');\n return;\n }\n this.googleButtonWrapper.click();\n }\n}\n\nconst createFakeGoogleWrapper = (): { click: () => void } => {\n const googleLoginWrapper = document.createElement(\"div\");\n googleLoginWrapper.style.display = \"none\";\n googleLoginWrapper.classList.add(\"custom-google-button\");\n document.body.appendChild(googleLoginWrapper);\n\n // Render the (invisible) GSI button inside our wrapper.\n // @ts-ignore\n window.google.accounts.id.renderButton(googleLoginWrapper, {\n type: \"icon\",\n width: \"200\",\n });\n\n const googleLoginWrapperButton =\n googleLoginWrapper.querySelector<HTMLElement>(\"div[role=button]\");\n\n return {\n click: () => googleLoginWrapperButton?.click(),\n };\n};\n\n","<div class=\"login-oauth\">\r\n @if(showInfo()) {\r\n <div class=\"message\">\r\n <p>Questa sezione consente di accedere al servizio utilizzando un provider OAuth2.</p>\r\n @if(applicationName()) {\r\n <p>La email utilizzata deve essere collegata ad un utente valido di {{applicationName()}} e dei servizi ad esso\r\n connessi.</p>\r\n }\r\n </div>\r\n }\r\n @if (allowMicrosoft()) {\r\n <div class=\"button\">\r\n <button mat-flat-button (click)=\"loginMSAL()\" aria-label=\"Effettua accesso\"\r\n [disabled]=\"!oauthMicrosoftReady()\" style=\"width: 100%;\">\r\n Accedi con Microsoft</button>\r\n </div>\r\n }\r\n @if (allowGoogle()) {\r\n <div class=\"button\">\r\n <button mat-flat-button (click)=\"loginGoogle()\" style=\"width: 100%;\"\r\n aria-label=\"Effettua accesso\" [disabled]=\"!oauthGoogleReady()\">\r\n Accedi con Google</button>\r\n </div>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { broadcastResponseToMainFrame } from '@azure/msal-browser/redirect-bridge';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n\n@Component({\n selector: 'app-login-oauth-ok-ms',\n styleUrls: ['./login-oauth-ok-ms.component.scss'],\n templateUrl: './login-oauth-ok-ms.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FlexLayoutModule, MatProgressBarModule]\n})\nexport class LoginOAuthOkMSComponent {\n\n /** Message displayed while the popup is completing authentication. */\n readonly message = input<string>('Accesso in corso...');\n\n constructor() {\n // MSAL v5 popup flow: parse the auth response from the URL and send\n // it back to the opener window via BroadcastChannel, then close the popup.\n // The promise can reject (e.g. COOP misconfiguration); log instead of\n // leaving an unhandled rejection that silently strands the popup.\n broadcastResponseToMainFrame().catch((error: unknown) => {\n console.error('Errore durante la comunicazione della risposta di autenticazione:', error);\n });\n }\n}\n","<div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFill>\r\n <div class=\"login-auto fade-in\">\r\n <div class=\"message\">\r\n Autenticazione in corso...\r\n </div>\r\n <mat-progress-bar mode=\"indeterminate\" ></mat-progress-bar>\r\n </div>\r\n</div>\r\n","/*\r\n * Public API Surface of scm-utils\r\n */\r\nexport * from './ui/components/index';\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-ui.oauth.mjs","sources":["../../../projects/ars-utils/ui.oauth/login/login-oauth.component.ts","../../../projects/ars-utils/ui.oauth/login/login-oauth.component.html","../../../projects/ars-utils/ui.oauth/login-ok-ms/login-oauth-ok-ms.component.ts","../../../projects/ars-utils/ui.oauth/login-ok-ms/login-oauth-ok-ms.component.html","../../../projects/ars-utils/ui.oauth/public_api.ts","../../../projects/ars-utils/ui.oauth/arsedizioni-ars-utils-ui.oauth.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, DestroyRef, NgZone, afterNextRender, inject, input, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { EnvironmentService, LoginOAuthResult, LoginOAuthType } from '@arsedizioni/ars-utils/core';\nimport { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';\nimport { MSAL_GUARD_CONFIG, MSAL_INSTANCE, MSAL_INTERCEPTOR_CONFIG, MsalBroadcastService, MsalGuardConfiguration, MsalInterceptorConfiguration, MsalService } from '@azure/msal-angular';\nimport { AuthenticationResult, BrowserCacheLocation, EventMessage, EventType, IPublicClientApplication, InteractionType, PublicClientApplication } from '@azure/msal-browser';\nimport { filter } from 'rxjs';\n\n/** Default Azure app registration — overridable via EnvironmentService. */\nconst DEFAULT_MS_CLIENT_ID = '6b2c080f-6ab0-4511-a9df-0bce69db5833';\nconst MS_AUTH_SCOPE = `api://${DEFAULT_MS_CLIENT_ID}/AngularSPAAuthScope`;\n\nexport function MSALInstanceFactory(environment: EnvironmentService): IPublicClientApplication {\n return new PublicClientApplication({\n auth: {\n clientId: (environment as any).msalClientId ?? DEFAULT_MS_CLIENT_ID,\n authority: (environment as any).msalAuthority ?? 'https://login.microsoftonline.com/common',\n redirectUri: environment.appLoginRedirectUri,\n },\n cache: {\n cacheLocation: BrowserCacheLocation.LocalStorage\n }\n });\n}\n\nexport function MSALInterceptorConfigFactory(environment: EnvironmentService): MsalInterceptorConfiguration {\n\n return {\n interactionType: InteractionType.Popup,\n protectedResourceMap: new Map([\n [environment.appServiceLoginUri, [MS_AUTH_SCOPE]],\n [\"https://graph.microsoft.com/v2.0/me\", [\"user.read\"]],\n ])\n };\n}\n\nexport function MSALGuardConfigFactory(): MsalGuardConfiguration {\n return {\n interactionType: InteractionType.Popup,\n authRequest: {\n scopes: [\"user.read\"]\n }\n };\n}\n\n@Component({\n selector: 'login-oauth',\n templateUrl: './login-oauth.component.html',\n styleUrls: ['./login-oauth.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: MSAL_INSTANCE,\n deps: [EnvironmentService],\n useFactory: MSALInstanceFactory\n },\n {\n provide: MSAL_GUARD_CONFIG,\n useFactory: MSALGuardConfigFactory\n },\n {\n provide: MSAL_INTERCEPTOR_CONFIG,\n deps: [EnvironmentService],\n useFactory: MSALInterceptorConfigFactory\n },\n MsalService,\n MsalBroadcastService],\n imports: [\n MatButtonModule\n ]\n})\nexport class LoginOAuthComponent {\n private readonly destroyRef = inject(DestroyRef);\n private readonly msalBroadcastService = inject(MsalBroadcastService);\n private readonly msaLService = inject(MsalService);\n private readonly dialogService = inject(DialogService);\n private readonly ngZone = inject(NgZone);\n /** Emitted when OAuth authentication succeeds. */\n readonly success = output<LoginOAuthResult>();\n /** Whether to show the introductory info panel. */\n readonly showInfo = input<boolean>(true);\n /** Application name displayed in the info panel. */\n readonly applicationName = input<string>();\n /** Whether to trigger `initialize()` automatically on mount. */\n readonly autoInitialize = input<boolean>(false);\n /** Whether the Microsoft login button is shown. */\n readonly allowMicrosoft = input<boolean>(true);\n /** Whether the Google login button is shown. */\n readonly allowGoogle = input<boolean>(true);\n /** Google OAuth client id. Override per deployment. */\n readonly googleClientId = input<string>('71204983077-ag31h3bgt2udcbfr9nn84r9rni2k3snp.apps.googleusercontent.com');\n /** MSAL access-token scope requested after login. */\n readonly msalScope = input<string>(MS_AUTH_SCOPE);\n protected readonly oauthReady = signal<boolean>(false);\n protected readonly oauthMicrosoftReady = signal<boolean>(false);\n protected readonly oauthGoogleReady = signal<boolean>(false);\n /** Hidden GSI button proxy, created once the Google library is ready. */\n private googleButtonWrapper?: { click: () => void };\n\n constructor() {\n\n this.msalBroadcastService.msalSubject$\n .pipe(\n filter((msg: EventMessage) =>\n msg.eventType === EventType.LOGOUT_FAILURE ||\n msg.eventType === EventType.ACQUIRE_TOKEN_FAILURE),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((r: EventMessage) => {\n if (r?.payload) {\n const error = r.payload as any;\n this.dialogService.error(error?.message ?? 'Errore di autenticazione Microsoft');\n }\n });\n\n afterNextRender(() => {\n if (this.autoInitialize()) {\n this.initialize();\n }\n });\n\n }\n\n /**\n * Initialize OAuth providers (Microsoft MSAL and Google GSI).\n * Safe to call multiple times — already-initialized providers are skipped.\n * Must be public so the host component can trigger it manually when `autoInitialize` is false.\n */\n initialize() {\n this.oauthReady.set(true);\n\n // Initialize the Microsoft stack only when allowed and not already done.\n if (this.allowMicrosoft() && !this.oauthMicrosoftReady()) {\n this.msaLService.initialize()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => this.oauthMicrosoftReady.set(true),\n error: (error: any) =>\n this.dialogService.error(error?.message ?? 'Errore di inizializzazione Microsoft'),\n });\n }\n\n // Load the Google GSI script only when allowed and not already done.\n if (this.allowGoogle() && !this.oauthGoogleReady()) {\n // @ts-ignore — define the callback BEFORE the script loads so GSI can find it\n window.onGoogleLibraryLoad = () => {\n // @ts-ignore\n google.accounts.id.initialize({\n client_id: this.googleClientId(),\n cancel_on_tap_outside: true,\n auto_select: false,\n callback: (r: any) => {\n this.ngZone.run(() => {\n this.success.emit({ type: LoginOAuthType.Google, token: r.credential });\n });\n }\n });\n\n this.googleButtonWrapper = createFakeGoogleWrapper();\n this.ngZone.run(() => this.oauthGoogleReady.set(true));\n };\n\n // Reuse the script tag if a previous instance already added it.\n const existing = document.querySelector<HTMLScriptElement>('script[data-gsi=\"ars\"]');\n if (existing) {\n // @ts-ignore — library already present: run the callback directly\n if (window.google?.accounts?.id) window.onGoogleLibraryLoad();\n } else {\n const script = document.createElement('script');\n script.src = 'https://accounts.google.com/gsi/client';\n script.async = true;\n script.defer = true;\n script.dataset['gsi'] = 'ars';\n script.onerror = () => this.ngZone.run(() =>\n this.dialogService.error('Impossibile caricare il servizio di accesso Google.'));\n // Append and LEAVE it in the DOM so the browser actually fetches it.\n document.body.appendChild(script);\n }\n }\n }\n\n /**\n * Trigger a Microsoft (MSAL) login popup and acquire an access token on success.\n */\n protected loginMSAL() {\n // Clear any in-progress interaction flag that may have been left by a previous incomplete popup\n sessionStorage.removeItem('msal.interaction.status');\n\n this.msaLService.loginPopup()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (r: AuthenticationResult) => {\n try {\n this.msaLService.instance.setActiveAccount(r.account);\n this.msaLService.acquireTokenSilent({\n scopes: [this.msalScope()],\n account: r.account\n }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({\n next: (tokenResult: AuthenticationResult) => {\n this.success.emit({ type: LoginOAuthType.Microsoft, token: tokenResult.accessToken });\n },\n error: (error: any) => {\n this.dialogService.error(error.message);\n }\n });\n } catch (error: any) {\n this.dialogService.error(error.message);\n }\n },\n error: (error: any) => {\n this.dialogService.error(error.message);\n }\n });\n }\n\n /**\n * Trigger the hidden Google GSI button to open the Google sign-in flow.\n */\n protected loginGoogle() {\n // Use the wrapper click to avoid an \"Illegal invocation\" exception.\n // Guard: the button only exists once the GSI library has loaded.\n if (!this.googleButtonWrapper) {\n this.dialogService.error('Il servizio di accesso Google non è ancora pronto.');\n return;\n }\n this.googleButtonWrapper.click();\n }\n}\n\nconst createFakeGoogleWrapper = (): { click: () => void } => {\n const googleLoginWrapper = document.createElement(\"div\");\n googleLoginWrapper.style.display = \"none\";\n googleLoginWrapper.classList.add(\"custom-google-button\");\n document.body.appendChild(googleLoginWrapper);\n\n // Render the (invisible) GSI button inside our wrapper.\n // @ts-ignore\n window.google.accounts.id.renderButton(googleLoginWrapper, {\n type: \"icon\",\n width: \"200\",\n });\n\n const googleLoginWrapperButton =\n googleLoginWrapper.querySelector<HTMLElement>(\"div[role=button]\");\n\n return {\n click: () => googleLoginWrapperButton?.click(),\n };\n};\n\n","<div class=\"login-oauth\">\r\n @if(showInfo()) {\r\n <div class=\"message\">\r\n <p>Questa sezione consente di accedere al servizio utilizzando un provider OAuth2.</p>\r\n @if(applicationName()) {\r\n <p>La email utilizzata deve essere collegata ad un utente valido di {{applicationName()}} e dei servizi ad esso\r\n connessi.</p>\r\n }\r\n </div>\r\n }\r\n @if (allowMicrosoft()) {\r\n <div class=\"button\">\r\n <button mat-flat-button (click)=\"loginMSAL()\" aria-label=\"Effettua accesso\"\r\n [disabled]=\"!oauthMicrosoftReady()\" style=\"width: 100%;\">\r\n Accedi con Microsoft</button>\r\n </div>\r\n }\r\n @if (allowGoogle()) {\r\n <div class=\"button\">\r\n <button mat-flat-button (click)=\"loginGoogle()\" style=\"width: 100%;\"\r\n aria-label=\"Effettua accesso\" [disabled]=\"!oauthGoogleReady()\">\r\n Accedi con Google</button>\r\n </div>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { broadcastResponseToMainFrame } from '@azure/msal-browser/redirect-bridge';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\n\n\n@Component({\n selector: 'app-login-oauth-ok-ms',\n styleUrls: ['./login-oauth-ok-ms.component.scss'],\n templateUrl: './login-oauth-ok-ms.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FlexLayoutModule, MatProgressBarModule]\n})\nexport class LoginOAuthOkMSComponent {\n\n /** Message displayed while the popup is completing authentication. */\n readonly message = input<string>('Accesso in corso...');\n\n constructor() {\n // MSAL v5 popup flow: parse the auth response from the URL and send\n // it back to the opener window via BroadcastChannel, then close the popup.\n // The promise can reject (e.g. COOP misconfiguration); log instead of\n // leaving an unhandled rejection that silently strands the popup.\n broadcastResponseToMainFrame().catch((error: unknown) => {\n console.error('Errore durante la comunicazione della risposta di autenticazione:', error);\n });\n }\n}\n","<div fxLayout=\"column\" fxLayoutAlign=\"center center\" fxFill>\r\n <div class=\"login-auto fade-in\">\r\n <div class=\"message\">\r\n Autenticazione in corso...\r\n </div>\r\n <mat-progress-bar mode=\"indeterminate\" ></mat-progress-bar>\r\n </div>\r\n</div>\r\n","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.oauth\n */\nexport * from './login/login-oauth.component';\nexport * from './login-ok-ms/login-oauth-ok-ms.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ import * as i0 from '@angular/core';
2
+ import { output, inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { MatDialogRef, MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';
4
+ import { SystemUtils } from '@arsedizioni/ars-utils/core';
5
+ import * as i3 from '@angular/material/button';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import * as i2 from '@arsedizioni/ars-utils/ui';
8
+ import { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';
9
+ import * as i1 from '@angular/forms';
10
+ import { FormsModule } from '@angular/forms';
11
+ import { EditorComponent } from '@tinymce/tinymce-angular';
12
+
13
+ class TinymceUtils {
14
+ /**
15
+ * Returns `true` when the user agent currently prefers a dark color scheme.
16
+ * Evaluated on demand (not frozen at module load) and SSR-safe.
17
+ */
18
+ static prefersDark() {
19
+ return typeof window !== 'undefined'
20
+ && typeof window.matchMedia === 'function'
21
+ && window.matchMedia('(prefers-color-scheme: dark)').matches;
22
+ }
23
+ /** URL of the TinyMCE script hosted on the Tiny Cloud CDN. */
24
+ static { this.CDN_URL = 'https://cdn.tiny.cloud/1/5lnoc6ohmpjau6zyzgqyhyf52cueoennkcs8v1yfoak57ku9/tinymce/7/tinymce.min.js'; }
25
+ /** URL of the locally bundled TinyMCE script. */
26
+ static { this.LOCAL_URL = '/assets/tinymce/tinymce.min.js'; }
27
+ /**
28
+ * Full-featured TinyMCE base configuration with all standard plugins and toolbar.
29
+ */
30
+ static { this.TinymceConfig = {
31
+ base_url: 'assets/tinymce',
32
+ suffix: '.min',
33
+ license_key: 'gpl', // per evitare il warning riportarla direttamente nell'html: <editor licenseKey="gpl" ...></editor>
34
+ language: 'it',
35
+ language_url: "assets/tinymce/langs/it.js",
36
+ height: 500,
37
+ width: '100%',
38
+ min_height: 250,
39
+ ui_mode: 'split',
40
+ onboarding: false,
41
+ branding: false,
42
+ convert_urls: false,
43
+ quickbars_insert_toolbar: false,
44
+ quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',
45
+ fullpage_default_doctype: '<!DOCTYPE html>',
46
+ fullpage_default_encoding: 'UTF-8',
47
+ fullpage_default_font_family: '\'Helvetica Neue\', sans-serif', // '\'Times New Roman\', Georgia, Serif',
48
+ fullpage_default_xml_pi: false,
49
+ fullpage_hide_in_source_view: false,
50
+ browser_spellcheck: true,
51
+ spellchecker_language: 'it_IT',
52
+ save_enablewhendirty: true,
53
+ custom_undo_redo_levels: 50,
54
+ nonbreaking_force_tab: true, // inserisce 3 &nbsp; per ogni pressione di TAB
55
+ nonbreaking_wrap: false,
56
+ help_tabs: ['shortcuts', 'keyboardnav', 'versions'],
57
+ 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',
58
+ menubar: false,
59
+ skin: TinymceUtils.prefersDark() ? "oxide-dark" : "oxide",
60
+ content_css: TinymceUtils.prefersDark() ? "dark" : "default",
61
+ toolbar: [
62
+ 'fullscreen | undo redo searchreplace | code openCodeMirrorButton preview fullpage | link image media insertMediaButton charmap nonbreaking | table tableprops tabledelete',
63
+ 'bold italic superscript subscript forecolor backcolor | alignleft aligncenter alignright alignjustify | removeformat | bullist numlist checklist'
64
+ ],
65
+ style_formats: [
66
+ {
67
+ title: 'Immagini float', items: [
68
+ {
69
+ title: 'Immagine a SX',
70
+ selector: 'img',
71
+ styles: { float: 'left', margin: '0 10px 0 10px' }
72
+ },
73
+ {
74
+ title: 'Immagine a DX',
75
+ selector: 'img',
76
+ styles: { float: 'right', margin: '0 10px 0 10px' }
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ title: 'Formati', items: [
82
+ { title: 'Grassetto', format: 'bold' },
83
+ { title: 'Corsivo', format: 'italic' },
84
+ { title: 'Sottolineato', format: 'underline' },
85
+ { title: 'Barrato', format: 'strikethrough' },
86
+ { title: 'Superscript', format: 'superscript' },
87
+ { title: 'Subscript', format: 'subscript' },
88
+ { title: 'Codice', format: 'code' }
89
+ ]
90
+ }
91
+ ],
92
+ formats: {
93
+ underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },
94
+ strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }
95
+ },
96
+ insertdatetime_formats: ['%d/%m/%Y', '%d %b %Y', '%A, %d %B %Y'],
97
+ link_default_target: '_blank',
98
+ link_title: true,
99
+ link_assume_external_targets: 'https',
100
+ link_class_list: [
101
+ { title: 'Nessuno', value: '' },
102
+ { title: 'Rilevante', value: 'relevant' },
103
+ ],
104
+ link_context_toolbar: true,
105
+ link_quicklink: true,
106
+ rel_list: false,
107
+ image_advtab: true,
108
+ paste_data_images: true,
109
+ image_caption: true,
110
+ image_title: true,
111
+ automatic_uploads: true,
112
+ images_reuse_filename: true,
113
+ images_upload_credentials: true,
114
+ file_picker_types: 'file image',
115
+ }; }
116
+ /**
117
+ * Compact TinyMCE configuration with autoresize, bottom toolbar, and grouped toolbar buttons.
118
+ * Extends `TinymceConfig` with reduced height and a simplified toolbar.
119
+ */
120
+ static { this.TinymceCompactConfig = Object.assign(structuredClone(this.TinymceConfig), {
121
+ height: 200,
122
+ width: '100%',
123
+ suffix: '.min',
124
+ license_key: 'gpl',
125
+ ui_mode: 'split',
126
+ min_height: 200,
127
+ max_height: 500,
128
+ quickbars_insert_toolbar: 'quickimage hr',
129
+ quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',
130
+ plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',
131
+ statusbar: false,
132
+ menubar: false,
133
+ contextmenu: false,
134
+ toolbar_location: 'bottom',
135
+ toolbar: ['undo redo | quickimage | formatgroup paragraphgroup '],
136
+ toolbar_groups: {
137
+ formatgroup: {
138
+ icon: 'format',
139
+ tooltip: 'Formatting',
140
+ items: 'bold italic underline superscript subscript | forecolor backcolor | removeformat'
141
+ },
142
+ paragraphgroup: {
143
+ icon: 'paragraph',
144
+ tooltip: 'Paragraph format',
145
+ items: 'h1 h2 h3 | bullist numlist | alignleft aligncenter alignright alignjustify | indent outdent'
146
+ },
147
+ insertgroup: {
148
+ icon: 'plus',
149
+ tooltip: 'Insert',
150
+ items: 'quickimage media | link charmap nonbreaking | table tableprops tabledelete'
151
+ }
152
+ },
153
+ formats: {
154
+ underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },
155
+ strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }
156
+ },
157
+ link_default_target: '_blank',
158
+ link_title: true,
159
+ link_assume_external_targets: 'https',
160
+ link_class_list: [],
161
+ }); }
162
+ /**
163
+ * Extended compact TinyMCE configuration that adds fullscreen support and an insert group.
164
+ * Extends `TinymceCompactConfig`.
165
+ */
166
+ static { this.TinymceCompactExtendedConfig = Object.assign(structuredClone(this.TinymceCompactConfig), {
167
+ license_key: 'gpl',
168
+ ui_mode: 'split',
169
+ plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime fullscreen link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',
170
+ toolbar: ['undo redo | quickimage insertgroup | formatgroup paragraphgroup | code | fullscreen '],
171
+ }); }
172
+ /**
173
+ * Inject the TinyMCE script tag into the document head if it is not already present.
174
+ * @param useCDN - When `true`, loads from the Tiny Cloud CDN; otherwise uses the local asset.
175
+ */
176
+ static loadTinyMCEScript(useCDN) {
177
+ if (typeof document === 'undefined')
178
+ return; // SSR: no-op
179
+ const url = useCDN === true ? this.CDN_URL : this.LOCAL_URL;
180
+ if (!document.querySelector(`script[src="${url}"]`)) {
181
+ const script = document.createElement('script');
182
+ script.src = url;
183
+ script.referrerPolicy = 'origin';
184
+ script.onerror = () => console.error(`Impossibile caricare lo script TinyMCE da: ${url}`);
185
+ document.head.appendChild(script);
186
+ }
187
+ }
188
+ }
189
+
190
+ class FullScreenEditorComponent {
191
+ constructor() {
192
+ /** Emitted with the edited text when the user saves. */
193
+ this.saving = output();
194
+ this.dialogRef = inject((MatDialogRef));
195
+ /** Dialog configuration, injected and exposed as a signal. */
196
+ this.dialogData = signal((() => {
197
+ const data = inject(MAT_DIALOG_DATA) ?? {};
198
+ return { ...data, text: data.text ?? '' };
199
+ })(), /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "dialogData" }] : /* istanbul ignore next */ []));
201
+ /** Whether the editor is in read-only mode. */
202
+ this.disabled = signal(false, /* @ts-ignore */
203
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
204
+ /** Current editor content, kept as a plain field for [(ngModel)] two-way binding. */
205
+ this.text = '';
206
+ /** TinyMCE editor configuration. */
207
+ this.tinymceConfig = {};
208
+ const data = this.dialogData();
209
+ this.text = data.text;
210
+ if (data.configuration) {
211
+ this.tinymceConfig = { ...data.configuration, license_key: 'gpl' };
212
+ }
213
+ else {
214
+ this.tinymceConfig = SystemUtils.clone(TinymceUtils.TinymceCompactExtendedConfig);
215
+ }
216
+ this.tinymceConfig['toolbar'] = ['undo redo | formatgroup paragraphgroup insertgroup | code openCodeMirrorButton'];
217
+ this.disabled.set(data.disabled ?? false);
218
+ }
219
+ /**
220
+ * Save the current editor content and close the dialog.
221
+ */
222
+ ok() {
223
+ this.saving.emit(this.text ?? '');
224
+ setTimeout(() => {
225
+ this.dialogRef.close();
226
+ }, 500);
227
+ }
228
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: FullScreenEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
229
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.3", type: FullScreenEditorComponent, isStandalone: true, selector: "ng-component", outputs: { saving: "saving" }, ngImport: i0, template: "<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", styles: [".mat-mdc-dialog-content{height:calc(100% - 52px)!important;max-height:calc(100% - 52px)!important}::ng-deep .full-screen-editor>.tox-tinymce{height:100%!important}\n"], dependencies: [{ kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: EditorComponent, selector: "editor", inputs: ["cloudChannel", "apiKey", "licenseKey", "init", "id", "initialValue", "outputFormat", "inline", "tagName", "plugins", "toolbar", "modelEvents", "allowedEvents", "ignoreEvents", "readonly", "disabled"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "ngmodule", type: FlexLayoutModule }, { kind: "directive", type: i2.FxLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg] ", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i2.FxFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg] ", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i2.FxLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg] ", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i2.FxLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg] ", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i2.FxFlexFillDirective, selector: " [fxFlexFill], [fxFill], [fxFlexFill.xs], [fxFlexFill.sm], [fxFlexFill.md], [fxFlexFill.lg], [fxFlexFill.xl], [fxFlexFill.lt-sm], [fxFlexFill.lt-md], [fxFlexFill.lt-lg], [fxFlexFill.lt-xl], [fxFlexFill.gt-xs], [fxFlexFill.gt-sm], [fxFlexFill.gt-md], [fxFlexFill.gt-lg] ", inputs: ["fxFlexFill", "fxFill", "fxFlexFill.xs", "fxFlexFill.sm", "fxFlexFill.md", "fxFlexFill.lg", "fxFlexFill.xl", "fxFlexFill.lt-sm", "fxFlexFill.lt-md", "fxFlexFill.lt-lg", "fxFlexFill.lt-xl", "fxFlexFill.gt-xs", "fxFlexFill.gt-sm", "fxFlexFill.gt-md", "fxFlexFill.gt-lg"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
230
+ }
231
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: FullScreenEditorComponent, decorators: [{
232
+ type: Component,
233
+ args: [{ standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatDialogContent, EditorComponent, FormsModule, MatDialogActions, FlexLayoutModule,
234
+ MatButtonModule, MatDialogClose], template: "<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", styles: [".mat-mdc-dialog-content{height:calc(100% - 52px)!important;max-height:calc(100% - 52px)!important}::ng-deep .full-screen-editor>.tox-tinymce{height:100%!important}\n"] }]
235
+ }], ctorParameters: () => [], propDecorators: { saving: [{ type: i0.Output, args: ["saving"] }] } });
236
+
237
+ /*
238
+ * Public API Surface of @arsedizioni/ars-utils/ui.tinymce
239
+ */
240
+
241
+ /**
242
+ * Generated bundle index. Do not edit.
243
+ */
244
+
245
+ export { FullScreenEditorComponent, TinymceUtils };
246
+ //# sourceMappingURL=arsedizioni-ars-utils-ui.tinymce.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arsedizioni-ars-utils-ui.tinymce.mjs","sources":["../../../projects/ars-utils/ui.tinymce/utils.ts","../../../projects/ars-utils/ui.tinymce/full-screen-editor/full-screen-editor.component.ts","../../../projects/ars-utils/ui.tinymce/full-screen-editor/full-screen-editor.component.html","../../../projects/ars-utils/ui.tinymce/public_api.ts","../../../projects/ars-utils/ui.tinymce/arsedizioni-ars-utils-ui.tinymce.ts"],"sourcesContent":["export class TinymceUtils {\n /**\n * Returns `true` when the user agent currently prefers a dark color scheme.\n * Evaluated on demand (not frozen at module load) and SSR-safe.\n */\n private static prefersDark(): boolean {\n return typeof window !== 'undefined'\n && typeof window.matchMedia === 'function'\n && window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n\n /** URL of the TinyMCE script hosted on the Tiny Cloud CDN. */\n static readonly CDN_URL = 'https://cdn.tiny.cloud/1/5lnoc6ohmpjau6zyzgqyhyf52cueoennkcs8v1yfoak57ku9/tinymce/7/tinymce.min.js';\n /** URL of the locally bundled TinyMCE script. */\n static readonly LOCAL_URL = '/assets/tinymce/tinymce.min.js';\n\n /**\n * Full-featured TinyMCE base configuration with all standard plugins and toolbar.\n */\n static TinymceConfig: Record<string, any> = {\n base_url: 'assets/tinymce',\n suffix: '.min',\n license_key: 'gpl', // per evitare il warning riportarla direttamente nell'html: <editor licenseKey=\"gpl\" ...></editor>\n language: 'it',\n language_url: \"assets/tinymce/langs/it.js\",\n height: 500,\n width: '100%',\n min_height: 250,\n ui_mode: 'split',\n onboarding: false,\n branding: false,\n convert_urls: false,\n quickbars_insert_toolbar: false,\n quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',\n fullpage_default_doctype: '<!DOCTYPE html>',\n fullpage_default_encoding: 'UTF-8',\n fullpage_default_font_family: '\\'Helvetica Neue\\', sans-serif', // '\\'Times New Roman\\', Georgia, Serif',\n fullpage_default_xml_pi: false,\n fullpage_hide_in_source_view: false,\n browser_spellcheck: true,\n spellchecker_language: 'it_IT',\n save_enablewhendirty: true,\n custom_undo_redo_levels: 50,\n nonbreaking_force_tab: true, // inserisce 3 &nbsp; per ogni pressione di TAB\n nonbreaking_wrap: false,\n help_tabs: ['shortcuts', 'keyboardnav', 'versions'],\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',\n menubar: false,\n skin: TinymceUtils.prefersDark() ? \"oxide-dark\" : \"oxide\",\n content_css: TinymceUtils.prefersDark() ? \"dark\" : \"default\",\n toolbar: [\n 'fullscreen | undo redo searchreplace | code openCodeMirrorButton preview fullpage | link image media insertMediaButton charmap nonbreaking | table tableprops tabledelete',\n 'bold italic superscript subscript forecolor backcolor | alignleft aligncenter alignright alignjustify | removeformat | bullist numlist checklist'\n ],\n style_formats: [\n {\n title: 'Immagini float', items: [\n {\n title: 'Immagine a SX',\n selector: 'img',\n styles: { float: 'left', margin: '0 10px 0 10px' }\n },\n {\n title: 'Immagine a DX',\n selector: 'img',\n styles: { float: 'right', margin: '0 10px 0 10px' }\n }\n ]\n },\n {\n title: 'Formati', items: [\n { title: 'Grassetto', format: 'bold' },\n { title: 'Corsivo', format: 'italic' },\n { title: 'Sottolineato', format: 'underline' },\n { title: 'Barrato', format: 'strikethrough' },\n { title: 'Superscript', format: 'superscript' },\n { title: 'Subscript', format: 'subscript' },\n { title: 'Codice', format: 'code' }\n ]\n }],\n formats: {\n underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },\n strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }\n },\n insertdatetime_formats: ['%d/%m/%Y', '%d %b %Y', '%A, %d %B %Y'],\n link_default_target: '_blank',\n link_title: true,\n link_assume_external_targets: 'https',\n link_class_list: [\n { title: 'Nessuno', value: '' },\n { title: 'Rilevante', value: 'relevant' },\n ],\n link_context_toolbar: true,\n link_quicklink: true,\n rel_list: false,\n image_advtab: true,\n paste_data_images: true,\n image_caption: true,\n image_title: true,\n automatic_uploads: true,\n images_reuse_filename: true,\n images_upload_credentials: true,\n file_picker_types: 'file image',\n };\n\n /**\n * Compact TinyMCE configuration with autoresize, bottom toolbar, and grouped toolbar buttons.\n * Extends `TinymceConfig` with reduced height and a simplified toolbar.\n */\n static TinymceCompactConfig: Record<string, any> = Object.assign(structuredClone(this.TinymceConfig), {\n height: 200,\n width: '100%',\n suffix: '.min',\n license_key: 'gpl',\n ui_mode: 'split',\n min_height: 200,\n max_height: 500,\n quickbars_insert_toolbar: 'quickimage hr',\n quickbars_selection_toolbar: 'removeformat | bold italic | superscript subscript | quicklink h2 h3 blockquote',\n plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',\n statusbar: false,\n menubar: false,\n contextmenu: false,\n toolbar_location: 'bottom',\n toolbar: ['undo redo | quickimage | formatgroup paragraphgroup '],\n toolbar_groups: {\n formatgroup: {\n icon: 'format',\n tooltip: 'Formatting',\n items: 'bold italic underline superscript subscript | forecolor backcolor | removeformat'\n },\n paragraphgroup: {\n icon: 'paragraph',\n tooltip: 'Paragraph format',\n items: 'h1 h2 h3 | bullist numlist | alignleft aligncenter alignright alignjustify | indent outdent'\n },\n insertgroup: {\n icon: 'plus',\n tooltip: 'Insert',\n items: 'quickimage media | link charmap nonbreaking | table tableprops tabledelete'\n }\n },\n formats: {\n underline: { inline: 'span', styles: { 'text-decoration': 'underline' }, exact: true },\n strikethrough: { inline: 'span', styles: { 'text-decoration': 'line-through' }, exact: true }\n },\n link_default_target: '_blank',\n link_title: true,\n link_assume_external_targets: 'https',\n link_class_list: [],\n });\n\n /**\n * Extended compact TinyMCE configuration that adds fullscreen support and an insert group.\n * Extends `TinymceCompactConfig`.\n */\n static TinymceCompactExtendedConfig: Record<string, any> = Object.assign(structuredClone(this.TinymceCompactConfig), {\n license_key: 'gpl',\n ui_mode: 'split',\n plugins: 'advlist anchor autolink autosave autoresize charmap code image insertdatetime fullscreen link lists media table nonbreaking preview quickbars searchreplace visualblocks visualchars',\n toolbar: ['undo redo | quickimage insertgroup | formatgroup paragraphgroup | code | fullscreen '],\n });\n\n\n /**\n * Inject the TinyMCE script tag into the document head if it is not already present.\n * @param useCDN - When `true`, loads from the Tiny Cloud CDN; otherwise uses the local asset.\n */\n static loadTinyMCEScript(useCDN?: boolean): void {\n if (typeof document === 'undefined') return; // SSR: no-op\n const url = useCDN === true ? this.CDN_URL : this.LOCAL_URL;\n if (!document.querySelector(`script[src=\"${url}\"]`)) {\n const script = document.createElement('script');\n script.src = url;\n script.referrerPolicy = 'origin';\n script.onerror = () =>\n console.error(`Impossibile caricare lo script TinyMCE da: ${url}`);\n document.head.appendChild(script);\n }\n }\n}","import { ChangeDetectionStrategy, Component, inject, output, signal } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogContent, MatDialogActions, MatDialogClose } from '@angular/material/dialog';\nimport { SystemUtils } from '@arsedizioni/ars-utils/core';\nimport { TinymceUtils } from '../utils';\nimport { MatButtonModule } from '@angular/material/button';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { FormsModule } from '@angular/forms';\nimport { EditorComponent } from '@tinymce/tinymce-angular';\n\nexport interface FullScreenEditorDialogData {\n text: string;\n configuration: Record<string, any>;\n infoButtonLabel?: string;\n onShowInfo?: Function,\n disabled?: boolean;\n}\n\n@Component({\n templateUrl: './full-screen-editor.component.html',\n styleUrls: ['./full-screen-editor.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatDialogContent, EditorComponent, FormsModule, MatDialogActions, FlexLayoutModule,\n MatButtonModule, MatDialogClose]\n})\nexport class FullScreenEditorComponent {\n\n /** Emitted with the edited text when the user saves. */\n readonly saving = output<string>();\n private readonly dialogRef = inject(MatDialogRef<FullScreenEditorComponent>);\n /** Dialog configuration, injected and exposed as a signal. */\n protected readonly dialogData = signal<FullScreenEditorDialogData>((() => {\n const data: FullScreenEditorDialogData = inject(MAT_DIALOG_DATA) ?? {};\n return { ...data, text: data.text ?? '' };\n })());\n /** Whether the editor is in read-only mode. */\n protected readonly disabled = signal<boolean>(false);\n /** Current editor content, kept as a plain field for [(ngModel)] two-way binding. */\n protected text = '';\n /** TinyMCE editor configuration. */\n protected tinymceConfig: Record<string, any> = {};\n\n constructor() {\n const data = this.dialogData();\n this.text = data.text;\n if (data.configuration) {\n this.tinymceConfig = { ...data.configuration, license_key: 'gpl' };\n } else {\n this.tinymceConfig = SystemUtils.clone(TinymceUtils.TinymceCompactExtendedConfig);\n }\n this.tinymceConfig['toolbar'] = ['undo redo | formatgroup paragraphgroup insertgroup | code openCodeMirrorButton'];\n this.disabled.set(data.disabled ?? false);\n }\n\n\n /**\n * Save the current editor content and close the dialog.\n */\n protected ok(): void {\n this.saving.emit(this.text ?? '');\n setTimeout(() => {\n this.dialogRef.close();\n }, 500);\n }\n}\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","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.tinymce\n */\nexport * from './utils';\nexport * from './full-screen-editor/full-screen-editor.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -1,19 +1,20 @@
1
- export * from '@arsedizioni/ars-utils/core';
2
- export * from '@arsedizioni/ars-utils/ui';
3
- export * from '@arsedizioni/ars-utils/ui.application';
4
- export * from '@arsedizioni/ars-utils/support.common';
5
- export * from '@arsedizioni/ars-utils/support.ui';
6
- export * from '@arsedizioni/ars-utils/help';
7
- export * from '@arsedizioni/ars-utils/clipper.common';
8
- export * from '@arsedizioni/ars-utils/clipper.ui';
9
- export * from '@arsedizioni/ars-utils/tinymce';
10
- export * from '@arsedizioni/ars-utils/evolution.common';
11
-
12
1
  /*
13
- * Public API Surface of ars-utils
2
+ * Public API Surface of @arsedizioni/ars-utils
3
+ *
4
+ * Questo entry point NON ri-esporta gli altri: un barrel unico vanificherebbe
5
+ * il code splitting, perche' basterebbe un import per agganciare il grafo di
6
+ * tutta la libreria. Importare sempre dall'entry point specifico, es.:
7
+ *
8
+ * import { SystemUtils } from '@arsedizioni/ars-utils/core';
9
+ * import { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';
10
+ * import { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';
14
11
  */
12
+ /** Version of the library, aligned with the supported Angular major. */
13
+ const ARS_UTILS_VERSION = '22.1.5';
15
14
 
16
15
  /**
17
16
  * Generated bundle index. Do not edit.
18
17
  */
18
+
19
+ export { ARS_UTILS_VERSION };
19
20
  //# sourceMappingURL=arsedizioni-ars-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"arsedizioni-ars-utils.mjs","sources":["../../../projects/ars-utils/public_api.ts","../../../projects/ars-utils/arsedizioni-ars-utils.ts"],"sourcesContent":["/*\r\n * Public API Surface of ars-utils\r\n */\r\nexport * from '@arsedizioni/ars-utils/core';\r\nexport * from '@arsedizioni/ars-utils/ui';\r\nexport * from '@arsedizioni/ars-utils/ui.application';\r\nexport * from '@arsedizioni/ars-utils/support.common';\r\nexport * from '@arsedizioni/ars-utils/support.ui';\r\nexport * from '@arsedizioni/ars-utils/help';\r\nexport * from '@arsedizioni/ars-utils/clipper.common';\r\nexport * from '@arsedizioni/ars-utils/clipper.ui';\r\nexport * from '@arsedizioni/ars-utils/tinymce';\r\nexport * from '@arsedizioni/ars-utils/evolution.common';\r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;;;;;AAAA;;AAEG;;ACFH;;AAEG"}
1
+ {"version":3,"file":"arsedizioni-ars-utils.mjs","sources":["../../../projects/ars-utils/public_api.ts","../../../projects/ars-utils/arsedizioni-ars-utils.ts"],"sourcesContent":["/*\n * Public API Surface of @arsedizioni/ars-utils\n *\n * Questo entry point NON ri-esporta gli altri: un barrel unico vanificherebbe\n * il code splitting, perche' basterebbe un import per agganciare il grafo di\n * tutta la libreria. Importare sempre dall'entry point specifico, es.:\n *\n * import { SystemUtils } from '@arsedizioni/ars-utils/core';\n * import { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\n * import { DialogService } from '@arsedizioni/ars-utils/ui.dialogs';\n */\n\n/** Version of the library, aligned with the supported Angular major. */\nexport const ARS_UTILS_VERSION = '22.1.5';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"AAAA;;;;;;;;;;AAUG;AAEH;AACO,MAAM,iBAAiB,GAAG;;ACbjC;;AAEG;;;;"}
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/arsedizioni-ars-utils-help.mjs",
3
+ "typings": "../types/arsedizioni-ars-utils-help.d.ts"
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arsedizioni/ars-utils",
3
- "version": "22.1.4",
3
+ "version": "22.5.1",
4
4
  "author": {
5
5
  "email": "software@arsedizioni.it",
6
6
  "name": "Fabio Buscaroli, Alberto Doria"
@@ -17,7 +17,25 @@
17
17
  },
18
18
  "peerDependencies": {
19
19
  "date-fns": "^4",
20
- "file-saver": "^2"
20
+ "file-saver": "^2",
21
+ "@azure/msal-angular": "^6",
22
+ "@azure/msal-browser": "^5",
23
+ "@tinymce/tinymce-angular": "^9",
24
+ "tinymce": "^8"
25
+ },
26
+ "peerDependenciesMeta": {
27
+ "@azure/msal-angular": {
28
+ "optional": true
29
+ },
30
+ "@azure/msal-browser": {
31
+ "optional": true
32
+ },
33
+ "@tinymce/tinymce-angular": {
34
+ "optional": true
35
+ },
36
+ "tinymce": {
37
+ "optional": true
38
+ }
21
39
  },
22
40
  "dependencies": {
23
41
  "tslib": "^2.8.0"
@@ -44,26 +62,22 @@
44
62
  "types": "./types/arsedizioni-ars-utils-core.d.ts",
45
63
  "default": "./fesm2022/arsedizioni-ars-utils-core.mjs"
46
64
  },
65
+ "./core.date": {
66
+ "types": "./types/arsedizioni-ars-utils-core.date.d.ts",
67
+ "default": "./fesm2022/arsedizioni-ars-utils-core.date.mjs"
68
+ },
69
+ "./core.markdown": {
70
+ "types": "./types/arsedizioni-ars-utils-core.markdown.d.ts",
71
+ "default": "./fesm2022/arsedizioni-ars-utils-core.markdown.mjs"
72
+ },
47
73
  "./evolution.common": {
48
74
  "types": "./types/arsedizioni-ars-utils-evolution.common.d.ts",
49
75
  "default": "./fesm2022/arsedizioni-ars-utils-evolution.common.mjs"
50
76
  },
51
- "./help": {
52
- "types": "./types/arsedizioni-ars-utils-help.d.ts",
53
- "default": "./fesm2022/arsedizioni-ars-utils-help.mjs"
54
- },
55
77
  "./support.common": {
56
78
  "types": "./types/arsedizioni-ars-utils-support.common.d.ts",
57
79
  "default": "./fesm2022/arsedizioni-ars-utils-support.common.mjs"
58
80
  },
59
- "./support.ui": {
60
- "types": "./types/arsedizioni-ars-utils-support.ui.d.ts",
61
- "default": "./fesm2022/arsedizioni-ars-utils-support.ui.mjs"
62
- },
63
- "./tinymce": {
64
- "types": "./types/arsedizioni-ars-utils-tinymce.d.ts",
65
- "default": "./fesm2022/arsedizioni-ars-utils-tinymce.mjs"
66
- },
67
81
  "./ui": {
68
82
  "types": "./types/arsedizioni-ars-utils-ui.d.ts",
69
83
  "default": "./fesm2022/arsedizioni-ars-utils-ui.mjs"
@@ -72,9 +86,53 @@
72
86
  "types": "./types/arsedizioni-ars-utils-ui.application.d.ts",
73
87
  "default": "./fesm2022/arsedizioni-ars-utils-ui.application.mjs"
74
88
  },
89
+ "./ui.controls": {
90
+ "types": "./types/arsedizioni-ars-utils-ui.controls.d.ts",
91
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.controls.mjs"
92
+ },
93
+ "./ui.dialogs": {
94
+ "types": "./types/arsedizioni-ars-utils-ui.dialogs.d.ts",
95
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs"
96
+ },
97
+ "./ui.dialogs.auth": {
98
+ "types": "./types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts",
99
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs"
100
+ },
101
+ "./ui.dialogs.prompt": {
102
+ "types": "./types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts",
103
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs"
104
+ },
105
+ "./ui.dialogs.select": {
106
+ "types": "./types/arsedizioni-ars-utils-ui.dialogs.select.d.ts",
107
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs"
108
+ },
109
+ "./ui.files": {
110
+ "types": "./types/arsedizioni-ars-utils-ui.files.d.ts",
111
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.files.mjs"
112
+ },
113
+ "./ui.filters": {
114
+ "types": "./types/arsedizioni-ars-utils-ui.filters.d.ts",
115
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.filters.mjs"
116
+ },
117
+ "./ui.help": {
118
+ "types": "./types/arsedizioni-ars-utils-ui.help.d.ts",
119
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.help.mjs"
120
+ },
121
+ "./ui.navigation": {
122
+ "types": "./types/arsedizioni-ars-utils-ui.navigation.d.ts",
123
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.navigation.mjs"
124
+ },
125
+ "./ui.notifications": {
126
+ "types": "./types/arsedizioni-ars-utils-ui.notifications.d.ts",
127
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.notifications.mjs"
128
+ },
75
129
  "./ui.oauth": {
76
130
  "types": "./types/arsedizioni-ars-utils-ui.oauth.d.ts",
77
131
  "default": "./fesm2022/arsedizioni-ars-utils-ui.oauth.mjs"
132
+ },
133
+ "./ui.tinymce": {
134
+ "types": "./types/arsedizioni-ars-utils-ui.tinymce.d.ts",
135
+ "default": "./fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs"
78
136
  }
79
137
  },
80
138
  "sideEffects": false,
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/arsedizioni-ars-utils-support.ui.mjs",
3
+ "typings": "../types/arsedizioni-ars-utils-support.ui.d.ts"
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "module": "../fesm2022/arsedizioni-ars-utils-tinymce.mjs",
3
+ "typings": "../types/arsedizioni-ars-utils-tinymce.d.ts"
4
+ }
@@ -1,11 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Signal, WritableSignal } from '@angular/core';
3
3
  import { NameValueItem, Folder, QueryModel, QueryResultModel, LoginOAuthType, LoginResult, ApiResult, UpdateResultModel, FolderTree } from '@arsedizioni/ars-utils/core';
4
- import { SendToDialogResult } from '@arsedizioni/ars-utils/ui.application';
4
+ import { SendToDialogResult, ResetPasswordDialogResult, RecoverPasswordDialogResult } from '@arsedizioni/ars-utils/ui';
5
5
  import * as _angular_common_http from '@angular/common/http';
6
6
  import { HttpInterceptorFn } from '@angular/common/http';
7
7
  import * as rxjs from 'rxjs';
8
- import { ResetPasswordDialogResult, RecoverPasswordDialogResult } from '@arsedizioni/ars-utils/ui';
9
8
 
10
9
  declare const ClipperMessages: {
11
10
  /**