@zambon-dev/shared 1.2.0 → 2.0.0

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/CHANGELOG.md CHANGED
@@ -23,6 +23,88 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
23
23
 
24
24
  ### ⚠ Breaking Changes / Migration
25
25
 
26
+ ## [2.0.0] - 2026-07-30
27
+
28
+ ### Added
29
+
30
+ - **Storybook: `Shared/App Showcase` story** — a full-height, navigable demo of the complete
31
+ application shell, backed by in-memory mock data. Clicking the sidebar entries (Dashboard,
32
+ General ▸ Customers/Units, Security ▸ Users) opens tabs that render working list-views and
33
+ detail-views through the real hosts (`DefaultTabViewComponent` /
34
+ `DefaultDetailsTabViewComponent`, `TabViewList` / `FormView`, and the `framework-button-*`
35
+ ribbon buttons). It covers:
36
+ - a branded top bar (logo, app name, subtitle, environment badge and a working notifications
37
+ bell) and a versioned sidebar footer;
38
+ - a mocked audit/history view, reachable from the detail views' Views button;
39
+ - `framework-button-filters` (via a `FiltersBase` component per entity) and
40
+ `framework-button-export` on every list: the mock dataset honours `IListParameters.filters`, so
41
+ filtering visibly narrows the grid, and exporting downloads a real CSV of the filtered rows;
42
+ - a **child list of addresses** on the Customers detail view, edited through `lib-multi-editor` —
43
+ `ChildList` and `MultiEditorModal` together, with the accordion gated on `hasEntityID` (a child
44
+ collection needs a persisted parent), the Edit button opening the multi-editor rather than
45
+ entering form edit mode, and add/remove/edit applied as one batch. The Customers grid's City
46
+ column is **derived** from the customer's first address, so editing an address is reflected in
47
+ the parent list and its filter with nothing to keep in sync;
48
+ - mocked request latency, so loading states are observable;
49
+ - full `en`/`pt` translation, so the language selector switches the entire showcase.
50
+
51
+ Development-only: it lives entirely in `app-showcase.stories.ts`, which is excluded from the
52
+ package build.
53
+
54
+ ### Fixed
55
+
56
+ - **Audit history models now match the JSON the audit endpoints actually return.**
57
+ `IServicesHistoryList` and `IOperationsHistoryList` declared an `ID` property, and
58
+ `IOperationsHistoryList` declared `entityId`. Neither key is ever sent. The audit endpoints
59
+ (`POST /{controller}/{entityID}/Audit` and `.../Audit/{serviceHistoryID}`) serialize under
60
+ ASP.NET Core's default camelCase policy, which lowercases only a *leading* run of capitals — so the
61
+ backend's `ID` goes out as `id` and its `EntityID` goes out as `entityID`. Typing a row against
62
+ `.ID` or `.entityId` therefore compiled fine and read `undefined` at run time. See
63
+ **⚠ Breaking Changes / Migration** below.
64
+
65
+ This was also a latent trap for anything supplying its own audit rows: the grid resolves row
66
+ identity through `compareProperty`, which is `'id'`, so a row carrying only `ID` could never be
67
+ selected — clicking a service entry left the operations grid empty. Rows shaped like the real
68
+ payload work unchanged; `@shared`'s own runtime behaviour is not affected by this release.
69
+
70
+ - **The top bar's notifications bell is no longer pushed off-centre by its unread badge.** The badge
71
+ is an absolutely-positioned overlay, so it adds no width — but it is still a DOM sibling after the
72
+ bell icon, which defeated the `.btn i:not(:last-child)` margin guard in the global button styles.
73
+ That left 8px of dead space to the icon's right and widened the button from 38px to 46px, but only
74
+ while an unread count was showing, so it came and went with the count. The margin is now cleared
75
+ for that button specifically; the shared guard, which is correct for icon-plus-label buttons, is
76
+ unchanged.
77
+
78
+ - **Lint: `shared-` component/directive selector prefix is now accepted.**
79
+ `libs/shared/eslint.config.mjs` still carried the scaffolded `prefix: 'lib'`, so the library's own
80
+ `shared-`-prefixed components (`shared-main-layout`, `shared-login-layout`) failed
81
+ `@angular-eslint/component-selector`. Both selector rules now accept `['lib', 'shared']`.
82
+
83
+ ### ⚠ Breaking Changes / Migration
84
+
85
+ Two properties on the audit history models were renamed to the keys the backend actually sends. Both
86
+ models are exported from the package root, so anything typed against the old names will now fail to
87
+ compile. Nothing in `@shared` changes behaviour at run time — the fix is to the declared types.
88
+
89
+ | Model | Before | After |
90
+ |-------|--------|-------|
91
+ | `IServicesHistoryList` | `ID: number` | `id: number` |
92
+ | `IOperationsHistoryList` | `ID: number` | `id: number` |
93
+ | `IOperationsHistoryList` | `entityId?: number` | `entityID?: number` |
94
+
95
+ To upgrade:
96
+
97
+ 1. Rename `.ID` to `.id` wherever you read or construct an `IServicesHistoryList` or
98
+ `IOperationsHistoryList`. If the compiler now reports the property as missing, that code was
99
+ reading `undefined` before — it never matched the payload.
100
+ 2. Rename `.entityId` to `.entityID` on `IOperationsHistoryList`. The capitals are deliberate and
101
+ match the backend's `EntityID`; do not "correct" them back.
102
+ 3. If you supply audit rows yourself — a test double, a Storybook mock, a hand-rolled
103
+ `ServicesHistoryService` / `OperationsHistoryService` — emit `id`, not `ID`. Rows keyed only on
104
+ `ID` were never selectable, so a service row's selection could not reach the operations grid.
105
+ 4. If you worked around that by overriding `compareProperty` to `'ID'` in a `ServicesHistoryDataset`
106
+ or `OperationsHistoryDataset` subclass, remove the override. The inherited `'id'` is now correct.
107
+
26
108
  ## [1.2.0] - 2026-07-28
27
109
 
28
110
  ### Added
@@ -109,7 +191,8 @@ URL) in `AppConfig`, and implement a hub that pushes the notification list to cl
109
191
  available via [GitHub Releases](https://github.com/RicardoZambon/ZLibraries/releases) and the
110
192
  `shared-v*` tags.
111
193
 
112
- [Unreleased]: https://github.com/RicardoZambon/ZLibraries/compare/shared-v1.2.0...HEAD
194
+ [Unreleased]: https://github.com/RicardoZambon/ZLibraries/compare/shared-v2.0.0...HEAD
195
+ [2.0.0]: https://github.com/RicardoZambon/ZLibraries/releases/tag/shared-v2.0.0
113
196
  [1.2.0]: https://github.com/RicardoZambon/ZLibraries/releases/tag/shared-v1.2.0
114
197
  [1.1.0]: https://github.com/RicardoZambon/ZLibraries/releases/tag/shared-v1.1.0
115
198
  [1.0.2]: https://github.com/RicardoZambon/ZLibraries/releases/tag/shared-v1.0.2
@@ -337,14 +337,14 @@ class NotificationsComponent {
337
337
  }
338
338
  }
339
339
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: NotificationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
340
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.6", type: NotificationsComponent, isStandalone: true, selector: "shared-notifications", host: { listeners: { "window:click": "documentClick($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button class=\"btn gray-300 notifications-toggle\" type=\"button\" (click)=\"onDropdownClick()\"\n [attr.aria-label]=\"'TopBar-Notifications-Title' | translate\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n </button>\n\n @if (showDropdown) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button type=\"button\" class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\" (click)=\"onNotificationClick(item)\">\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n", styles: ["@reference \"tailwindcss\";.notifications{position:relative}.notifications .notifications-badge{position:absolute;top:-.25rem;right:-.25rem;height:1rem;min-width:1rem;border-radius:9999px;padding-left:.25rem;padding-right:.25rem;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;line-height:1;--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.notifications .notifications-empty{padding:1.5rem .75rem;text-align:center;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.notifications .notifications-list{max-height:20rem;overflow-y:auto}.notifications .notifications-list .notifications-item{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(245 245 244 / var(--tw-border-opacity, 1))}.notifications .notifications-list .notifications-item:last-child{border-bottom-width:0px}.notifications .notifications-list .notifications-item.unread{background-color:#e6f4ff99}.notifications .notifications-list .notifications-item .notifications-item-body{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column}.notifications .notifications-list .notifications-item .notifications-item-btn{display:flex;width:100%;cursor:pointer;align-items:flex-start;gap:.625rem;padding:.5rem .75rem;text-align:left}.notifications .notifications-list .notifications-item .notifications-item-btn:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 249 / var(--tw-bg-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-cta{margin-top:.25rem;flex-shrink:0;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-description{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-icon{margin-top:.125rem;display:flex;height:1.5rem;width:1.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(245 245 244 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(87 83 78 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-title{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(41 37 36 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all{font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(0 107 182 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all:hover{--tw-text-opacity: 1;color:rgb(0 87 148 / var(--tw-text-opacity, 1))}.notifications .notifications-panel{position:absolute;right:0;top:100%;z-index:50;margin-top:.25rem;width:20rem;max-width:90vw;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 0 4px 0 rgba(0,0,0,.2), 0 3px 20px 0 rgba(0,0,0,.19);--tw-shadow-colored: 0 0 4px 0 var(--tw-shadow-color), 0 3px 20px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.notifications .notifications-toggle{position:relative}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
340
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.6", type: NotificationsComponent, isStandalone: true, selector: "shared-notifications", host: { listeners: { "window:click": "documentClick($event)" } }, viewQueries: [{ propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button class=\"btn gray-300 notifications-toggle\" type=\"button\" (click)=\"onDropdownClick()\"\n [attr.aria-label]=\"'TopBar-Notifications-Title' | translate\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n </button>\n\n @if (showDropdown) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button type=\"button\" class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\" (click)=\"onNotificationClick(item)\">\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n", styles: ["@reference \"tailwindcss\";.notifications{position:relative}.notifications .notifications-badge{position:absolute;top:-.25rem;right:-.25rem;height:1rem;min-width:1rem;border-radius:9999px;padding-left:.25rem;padding-right:.25rem;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;line-height:1;--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.notifications .notifications-empty{padding:1.5rem .75rem;text-align:center;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.notifications .notifications-list{max-height:20rem;overflow-y:auto}.notifications .notifications-list .notifications-item{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(245 245 244 / var(--tw-border-opacity, 1))}.notifications .notifications-list .notifications-item:last-child{border-bottom-width:0px}.notifications .notifications-list .notifications-item.unread{background-color:#e6f4ff99}.notifications .notifications-list .notifications-item .notifications-item-body{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column}.notifications .notifications-list .notifications-item .notifications-item-btn{display:flex;width:100%;cursor:pointer;align-items:flex-start;gap:.625rem;padding:.5rem .75rem;text-align:left}.notifications .notifications-list .notifications-item .notifications-item-btn:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 249 / var(--tw-bg-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-cta{margin-top:.25rem;flex-shrink:0;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-description{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-icon{margin-top:.125rem;display:flex;height:1.5rem;width:1.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(245 245 244 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(87 83 78 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-title{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(41 37 36 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all{font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(0 107 182 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all:hover{--tw-text-opacity: 1;color:rgb(0 87 148 / var(--tw-text-opacity, 1))}.notifications .notifications-panel{position:absolute;right:0;top:100%;z-index:50;margin-top:.25rem;width:20rem;max-width:90vw;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 0 4px 0 rgba(0,0,0,.2), 0 3px 20px 0 rgba(0,0,0,.19);--tw-shadow-colored: 0 0 4px 0 var(--tw-shadow-color), 0 3px 20px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.notifications .notifications-toggle{position:relative}.notifications .notifications-toggle i{margin-right:0}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
341
341
  }
342
342
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: NotificationsComponent, decorators: [{
343
343
  type: Component,
344
344
  args: [{ selector: 'shared-notifications', imports: [
345
345
  AsyncPipe,
346
346
  TranslatePipe,
347
- ], template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button class=\"btn gray-300 notifications-toggle\" type=\"button\" (click)=\"onDropdownClick()\"\n [attr.aria-label]=\"'TopBar-Notifications-Title' | translate\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n </button>\n\n @if (showDropdown) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button type=\"button\" class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\" (click)=\"onNotificationClick(item)\">\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n", styles: ["@reference \"tailwindcss\";.notifications{position:relative}.notifications .notifications-badge{position:absolute;top:-.25rem;right:-.25rem;height:1rem;min-width:1rem;border-radius:9999px;padding-left:.25rem;padding-right:.25rem;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;line-height:1;--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.notifications .notifications-empty{padding:1.5rem .75rem;text-align:center;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.notifications .notifications-list{max-height:20rem;overflow-y:auto}.notifications .notifications-list .notifications-item{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(245 245 244 / var(--tw-border-opacity, 1))}.notifications .notifications-list .notifications-item:last-child{border-bottom-width:0px}.notifications .notifications-list .notifications-item.unread{background-color:#e6f4ff99}.notifications .notifications-list .notifications-item .notifications-item-body{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column}.notifications .notifications-list .notifications-item .notifications-item-btn{display:flex;width:100%;cursor:pointer;align-items:flex-start;gap:.625rem;padding:.5rem .75rem;text-align:left}.notifications .notifications-list .notifications-item .notifications-item-btn:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 249 / var(--tw-bg-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-cta{margin-top:.25rem;flex-shrink:0;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-description{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-icon{margin-top:.125rem;display:flex;height:1.5rem;width:1.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(245 245 244 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(87 83 78 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-title{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(41 37 36 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all{font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(0 107 182 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all:hover{--tw-text-opacity: 1;color:rgb(0 87 148 / var(--tw-text-opacity, 1))}.notifications .notifications-panel{position:absolute;right:0;top:100%;z-index:50;margin-top:.25rem;width:20rem;max-width:90vw;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 0 4px 0 rgba(0,0,0,.2), 0 3px 20px 0 rgba(0,0,0,.19);--tw-shadow-colored: 0 0 4px 0 var(--tw-shadow-color), 0 3px 20px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.notifications .notifications-toggle{position:relative}\n"] }]
347
+ ], template: "@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button class=\"btn gray-300 notifications-toggle\" type=\"button\" (click)=\"onDropdownClick()\"\n [attr.aria-label]=\"'TopBar-Notifications-Title' | translate\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n </button>\n\n @if (showDropdown) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button type=\"button\" class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\" (click)=\"onNotificationClick(item)\">\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n", styles: ["@reference \"tailwindcss\";.notifications{position:relative}.notifications .notifications-badge{position:absolute;top:-.25rem;right:-.25rem;height:1rem;min-width:1rem;border-radius:9999px;padding-left:.25rem;padding-right:.25rem;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;line-height:1;--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.notifications .notifications-empty{padding:1.5rem .75rem;text-align:center;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:600}.notifications .notifications-list{max-height:20rem;overflow-y:auto}.notifications .notifications-list .notifications-item{border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(245 245 244 / var(--tw-border-opacity, 1))}.notifications .notifications-list .notifications-item:last-child{border-bottom-width:0px}.notifications .notifications-list .notifications-item.unread{background-color:#e6f4ff99}.notifications .notifications-list .notifications-item .notifications-item-body{display:flex;min-width:0px;flex:1 1 0%;flex-direction:column}.notifications .notifications-list .notifications-item .notifications-item-btn{display:flex;width:100%;cursor:pointer;align-items:flex-start;gap:.625rem;padding:.5rem .75rem;text-align:left}.notifications .notifications-list .notifications-item .notifications-item-btn:hover{--tw-bg-opacity: 1;background-color:rgb(250 250 249 / var(--tw-bg-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-cta{margin-top:.25rem;flex-shrink:0;font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(168 162 158 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-description{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(120 113 108 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-icon{margin-top:.125rem;display:flex;height:1.5rem;width:1.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(245 245 244 / var(--tw-bg-opacity, 1));font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(87 83 78 / var(--tw-text-opacity, 1))}.notifications .notifications-list .notifications-item .notifications-item-title{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(41 37 36 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all{font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(0 107 182 / var(--tw-text-opacity, 1))}.notifications .notifications-mark-all:hover{--tw-text-opacity: 1;color:rgb(0 87 148 / var(--tw-text-opacity, 1))}.notifications .notifications-panel{position:absolute;right:0;top:100%;z-index:50;margin-top:.25rem;width:20rem;max-width:90vw;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(231 229 228 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 0 4px 0 rgba(0,0,0,.2), 0 3px 20px 0 rgba(0,0,0,.19);--tw-shadow-colored: 0 0 4px 0 var(--tw-shadow-color), 0 3px 20px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.notifications .notifications-toggle{position:relative}.notifications .notifications-toggle i{margin-right:0}\n"] }]
348
348
  }], propDecorators: { dropdown: [{
349
349
  type: ViewChild,
350
350
  args: ['dropdown']
@@ -1 +1 @@
1
- {"version":3,"file":"zambon-dev-shared.mjs","sources":["../../../../libs/shared/src/lib/layouts/login-layout/login-layout.component.ts","../../../../libs/shared/src/lib/layouts/login-layout/login-layout.component.html","../../../../libs/shared/src/lib/services/authentication.service.ts","../../../../libs/shared/src/lib/services/notifications.service.ts","../../../../libs/shared/src/lib/services/operations-history.service.ts","../../../../libs/shared/src/lib/services/services-history.service.ts","../../../../libs/shared/src/lib/layouts/top-bar/brand/brand.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/brand/brand.component.html","../../../../libs/shared/src/lib/layouts/top-bar/environment-badge/environment-badge.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/environment-badge/environment-badge.component.html","../../../../libs/shared/src/lib/layouts/top-bar/notifications/notifications.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/notifications/notifications.component.html","../../../../libs/shared/src/lib/auth/components/language-selector/language-selector.component.ts","../../../../libs/shared/src/lib/auth/components/language-selector/language-selector.component.html","../../../../libs/shared/src/lib/layouts/top-bar/user-profile/user-profile.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/user-profile/user-profile.component.html","../../../../libs/shared/src/lib/layouts/top-bar/top-bar.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/top-bar.component.html","../../../../libs/shared/src/lib/layouts/main-layout/main-layout.component.ts","../../../../libs/shared/src/lib/layouts/main-layout/main-layout.component.html","../../../../libs/shared/src/lib/auth/components/login/login.component.ts","../../../../libs/shared/src/lib/auth/components/login/login.component.html","../../../../libs/shared/src/lib/auth/auth.module.ts","../../../../libs/shared/src/lib/auth/guards/auth-guard.ts","../../../../libs/shared/src/lib/auth/interceptors/auth-interceptors.ts","../../../../libs/shared/src/lib/components/filters-base.ts","../../../../libs/shared/src/lib/datasets/operations-history.dataset.ts","../../../../libs/shared/src/lib/datasets/services-history.dataset.ts","../../../../libs/shared/src/lib/features/operations-history/operations-history-modal/operations-history-modal.component.ts","../../../../libs/shared/src/lib/features/operations-history/operations-history-modal/operations-history-modal.component.html","../../../../libs/shared/src/lib/features/operations-history/operations-history-child-list/operations-history-child-list.component.ts","../../../../libs/shared/src/lib/features/operations-history/operations-history-child-list/operations-history-child-list.component.html","../../../../libs/shared/src/lib/pipes/bypass-html-sanitizer.pipe.ts","../../../../libs/shared/src/lib/pipes/enum-text.pipe.ts","../../../../libs/shared/src/lib/pipes/utc-date.pipe.ts","../../../../libs/shared/src/lib/features/services-history/services-history-child-list/services-history-child-list.component.ts","../../../../libs/shared/src/lib/features/services-history/services-history-child-list/services-history-child-list.component.html","../../../../libs/shared/src/lib/features/services-history/services-history-view/services-history-view.component.ts","../../../../libs/shared/src/lib/features/services-history/services-history-view/services-history-view.component.html","../../../../libs/shared/src/lib/i18n/shared-i18n.ts","../../../../libs/shared/src/zambon-dev-shared.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\n@Component({\n selector: 'shared-login-layout',\n templateUrl: './login-layout.component.html',\n styleUrls: ['./login-layout.component.scss'],\n imports: [\n RouterModule,\n ]\n})\nexport class LoginLayoutComponent {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"background\"></div>\n\n<div class=\"container\">\n <router-outlet></router-outlet>\n</div>","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { JwtHelperService } from '@auth0/angular-jwt';\nimport { APP_CONFIG, AppConfig, AuthService, TabService } from '@zambon-dev/framework';\nimport { Observable, catchError, interval, map, mergeMap, tap } from 'rxjs';\nimport { IAuthResponse, ICurrentUserInfo } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthenticationService extends AuthService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public adminAction: string = 'AdministrativeMaster';\n\n private config: AppConfig = inject(APP_CONFIG);\n\n private readonly BASE_URL: string = `${this.config.BASE_URL}/Authentication`;\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super(inject(JwtHelperService), inject(TabService));\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public authenticate(model: { username: string, password: string, rememberMe: boolean }): Observable<void> {\n return this.http\n .post<IAuthResponse>(`${this.BASE_URL}/SignIn`, model)\n .pipe(\n map((res: IAuthResponse) => {\n this.setStorage('username', res.username, model.rememberMe);\n this.setStorage('token', res.token, model.rememberMe);\n this.setStorage('refreshToken', res.refreshToken, model.rememberMe);\n this.setStorage('userInfo', window.btoa(JSON.stringify(res as ICurrentUserInfo)), model.rememberMe);\n }),\n catchError((error: HttpErrorResponse) =>\n interval(1000)\n .pipe(\n mergeMap(() => {\n switch(error.status) {\n case 401:\n throw 'InvalidUsernamePassword';\n default:\n throw 'InternalServerError';\n }\n })\n )\n )\n );\n }\n\n public getActions(): Observable<string[]> {\n return this.http.post<string[]>(`${this.BASE_URL}/GetActions`, {});\n }\n\n public getUserInfo(): ICurrentUserInfo | null {\n const userInfo: string | null = this.userInfo;\n if (userInfo) {\n return JSON.parse(window.atob(userInfo)) as ICurrentUserInfo;\n }\n return null;\n }\n\n public tryRefreshToken(): Observable<string> {\n return this.http\n .post<IAuthResponse>(`${this.BASE_URL}/RefreshToken`, {\n username: this.username ?? '',\n refreshToken: this.refreshToken ?? ''\n })\n .pipe(\n tap((res: IAuthResponse) => {\n this.setStorage('token', res.token);\n this.setStorage('refreshToken', res.refreshToken);\n this.setStorage('userInfo', window.btoa(JSON.stringify(res as ICurrentUserInfo)));\n }),\n map((res: IAuthResponse) => res.token ?? '')\n );\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { inject, Injectable } from '@angular/core';\nimport { HubConnection, HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';\nimport { APP_CONFIG, AppConfig, AuthService } from '@zambon-dev/framework';\nimport { BehaviorSubject, map, Observable } from 'rxjs';\nimport { INotification } from '../models';\n\n/**\n * Streams top-bar notifications from a SignalR hub.\n *\n * The hub is configured via `AppConfig.notificationsEnabled` and `AppConfig.notificationsUrl`.\n * When enabled, {@link start} opens a connection (authenticated with the current JWT) and\n * listens for the server to push the notification list via the `ReceiveNotifications` client\n * method. Consuming apps do not interact with this service directly — the top bar drives it.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationsService {\n //#region Variables\n private authService: AuthService = inject(AuthService);\n private config: AppConfig = inject(APP_CONFIG);\n\n private connection?: HubConnection;\n private notifications$: BehaviorSubject<INotification[]> = new BehaviorSubject<INotification[]>([]);\n //#endregion\n\n //#region Properties\n /** Whether the notifications feature is enabled (toggled on and given a hub URL). */\n public get isEnabled(): boolean {\n return this.config.notificationsEnabled && this.config.notificationsUrl.length > 0;\n }\n //#endregion\n\n //#region Public methods\n /** Emits the current list of notifications. */\n public getNotifications(): Observable<INotification[]> {\n return this.notifications$.asObservable();\n }\n\n /** Emits the number of unread notifications. */\n public getUnreadCount(): Observable<number> {\n return this.notifications$.pipe(\n map((notifications: INotification[]) => notifications.filter((n: INotification) => !n.isRead).length),\n );\n }\n\n /** Marks every notification as read and notifies the hub. */\n public markAllAsRead(): void {\n this.notifications$.next(this.notifications$.value.map((n: INotification) => ({ ...n, isRead: true })));\n\n if (this.connection?.state === HubConnectionState.Connected) {\n this.connection.invoke('MarkAllAsRead').catch((error: unknown) => {\n console.error('Failed to mark notifications as read on the hub.', error);\n });\n }\n }\n\n /** Marks a single notification as read (optimistically; the server reconciles on the next push). */\n public markAsRead(notification: INotification): void {\n this.notifications$.next(\n this.notifications$.value.map((n: INotification) => (n === notification ? { ...n, isRead: true } : n)),\n );\n }\n\n /** Opens the SignalR connection and starts receiving notifications. Idempotent and a no-op when disabled. */\n public start(): void {\n if (!this.isEnabled || !!this.connection) {\n return;\n }\n\n this.connection = new HubConnectionBuilder()\n .withUrl(this.config.notificationsUrl, {\n accessTokenFactory: () => this.authService.token ?? '',\n })\n .withAutomaticReconnect()\n .build();\n\n this.connection.on('ReceiveNotifications', (notifications: INotification[]) => {\n this.notifications$.next(notifications ?? []);\n });\n\n this.connection.start().catch((error: unknown) => {\n console.error('Failed to connect to the notifications hub.', error);\n });\n }\n\n /** Closes the SignalR connection. */\n public async stop(): Promise<void> {\n if (this.connection) {\n await this.connection.stop();\n this.connection = undefined;\n }\n }\n //#endregion\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\nimport { IListParameters } from '@zambon-dev/library';\nimport { Observable } from 'rxjs';\nimport { IOperationsHistoryList } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OperationsHistoryService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public list(controllerName: string, entityID: number, serviceHistoryID: number, parameters: IListParameters): Observable<IOperationsHistoryList[]> {\n return this.http.post<IOperationsHistoryList[]>(`${this.config.BASE_URL}/${controllerName}/${entityID}/Audit/${serviceHistoryID}`, parameters);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\nimport { IListParameters } from '@zambon-dev/library';\nimport { Observable } from 'rxjs';\nimport { IServicesHistoryList } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ServicesHistoryService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public list(controllerName: string, entityID: number, parameters: IListParameters): Observable<IServicesHistoryList[]> {\n return this.http.post<IServicesHistoryList[]>(`${this.config.BASE_URL}/${controllerName}/${entityID}/Audit`, parameters);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { Component, inject } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\n\n@Component({\n selector: 'shared-brand',\n templateUrl: './brand.component.html',\n styleUrls: ['./brand.component.scss'],\n})\nexport class BrandComponent {\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n //#endregion\n\n //#region Properties\n protected get appName(): string {\n return this.config.appName;\n }\n\n protected get companyName(): string {\n return this.config.companyName;\n }\n\n protected get logoUrl(): string | undefined {\n return this.config.logoUrl;\n }\n //#endregion\n}\n","<div class=\"brand\">\n @if (logoUrl) {\n <img class=\"brand-logo\" [src]=\"logoUrl\" [alt]=\"appName\" />\n }\n\n <div class=\"brand-text\">\n <span class=\"brand-app\">{{ appName }}</span>\n @if (companyName) {\n <span class=\"brand-company\">{{ companyName }}</span>\n }\n </div>\n</div>\n","import { Component, inject } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\n\n@Component({\n selector: 'shared-environment-badge',\n templateUrl: './environment-badge.component.html',\n styleUrls: ['./environment-badge.component.scss'],\n})\nexport class EnvironmentBadgeComponent {\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n //#endregion\n\n //#region Properties\n /** CSS modifier class for the current environment, falling back to a neutral style. */\n protected get badgeClass(): string {\n const colorByEnvironment: Record<string, string> = {\n DEV: 'env-dev',\n QA: 'env-qa',\n STG: 'env-stg',\n };\n return colorByEnvironment[this.environment] ?? 'env-neutral';\n }\n\n /** Normalized environment key (uppercase, trimmed). */\n protected get environment(): string {\n return (this.config.environment ?? '').trim().toUpperCase();\n }\n\n /** The badge is hidden in production and when no environment is configured. */\n protected get isVisible(): boolean {\n return this.environment.length > 0 && this.environment !== 'PROD';\n }\n //#endregion\n}\n","@if (isVisible) {\n <span class=\"env-badge {{ badgeClass }}\">\n <span class=\"env-dot\"></span>\n <span class=\"env-label\">{{ environment }}</span>\n </span>\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, ElementRef, HostListener, inject, OnInit, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable } from 'rxjs';\nimport { INotification } from '../../../models';\nimport { NotificationsService } from '../../../services';\n\n@Component({\n selector: 'shared-notifications',\n templateUrl: './notifications.component.html',\n styleUrls: ['./notifications.component.scss'],\n imports: [\n AsyncPipe,\n TranslatePipe,\n ],\n})\nexport class NotificationsComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('dropdown') public dropdown!: ElementRef<HTMLDivElement>;\n //#endregion\n\n //#region Variables\n private notificationsService: NotificationsService = inject(NotificationsService);\n private router: Router = inject(Router);\n\n protected notifications$: Observable<INotification[]> = this.notificationsService.getNotifications();\n protected showDropdown = false;\n protected unreadCount$: Observable<number> = this.notificationsService.getUnreadCount();\n //#endregion\n\n //#region Properties\n /** Whether the notifications feature is enabled; when false the bell is not rendered. */\n public get isEnabled(): boolean {\n return this.notificationsService.isEnabled;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngOnInit(): void {\n this.notificationsService.start();\n }\n //#endregion\n\n //#region Event handlers\n public onDropdownClick(): void {\n this.showDropdown = !this.showDropdown;\n }\n\n public onMarkAllAsRead(): void {\n this.notificationsService.markAllAsRead();\n }\n\n public onNotificationClick(notification: INotification): void {\n this.notificationsService.markAsRead(notification);\n this.showDropdown = false;\n\n const url: string | undefined = notification.callToActionUrl;\n if (!url) {\n return;\n }\n\n if (/^https?:\\/\\//i.test(url)) {\n window.open(url, '_blank', 'noopener');\n } else {\n this.router.navigateByUrl(url);\n }\n }\n //#endregion\n\n //#region Private methods\n @HostListener('window:click', ['$event'])\n private documentClick(event: MouseEvent): void {\n if (this.showDropdown) {\n let target: HTMLElement = <HTMLElement>event.target;\n while (target !== null && target.tagName?.toUpperCase() !== 'BODY') {\n if (target === this.dropdown.nativeElement) {\n return;\n }\n target = <HTMLElement>target.parentElement;\n }\n this.showDropdown = false;\n }\n }\n //#endregion\n}\n","@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button class=\"btn gray-300 notifications-toggle\" type=\"button\" (click)=\"onDropdownClick()\"\n [attr.aria-label]=\"'TopBar-Notifications-Title' | translate\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n </button>\n\n @if (showDropdown) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button type=\"button\" class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\" (click)=\"onNotificationClick(item)\">\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n","import { Component, ElementRef, HostListener, inject, Input, ViewChild } from '@angular/core';\nimport { TranslatePipe, TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'shared-language-selector',\n templateUrl: './language-selector.component.html',\n styleUrls: ['./language-selector.component.scss'],\n imports: [\n TranslatePipe,\n ]\n})\nexport class LanguageSelectorComponent {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('dropdown') public dropdown!: ElementRef<HTMLDivElement>;\n\n /** When true, the toggle shows the current language's flag (light-gray button) instead of text. */\n @Input() public showFlag = false;\n\n @Input() public title: string = 'LanguageSelector-Title';\n //#endregion\n\n //#region Variables\n private translate: TranslateService = inject(TranslateService);\n\n protected languages: string[] = this.translate.getLangs();\n protected showDropdown: boolean = false;\n //#endregion\n\n //#region Properties\n public get selectedLanguage(): string {\n return this.translate.currentLang;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n public onDropdownClick(): void {\n this.showDropdown = !this.showDropdown;\n }\n\n public onSelectLanguage(language: string): void {\n localStorage.setItem('language', language);\n this.translate.use(language);\n this.showDropdown = false;\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n @HostListener('window:click', ['$event'])\n private documentClick(event: MouseEvent): void {\n if (this.showDropdown) {\n let target: HTMLElement = <HTMLElement>event.target;\n while (target !== null && target.tagName?.toUpperCase() !== 'BODY') {\n if (target === this.dropdown.nativeElement) {\n return;\n }\n target = <HTMLElement>target.parentElement;\n }\n this.showDropdown = false;\n }\n }\n //#endregion\n}\n","<div #dropdown class=\"dropdown right\" [class.show]=\"showDropdown\">\n <button class=\"btn\" type=\"button\" (click)=\"onDropdownClick()\"\n [class.gray-300]=\"showFlag\" [class.lang-flag-toggle]=\"showFlag\"\n [attr.aria-label]=\"showFlag ? (title | translate) : null\">\n @if (showFlag) {\n <span class=\"flag flag-{{ selectedLanguage }}\"></span>\n } @else {\n {{ title | translate }}\n }\n </button>\n\n <ul>\n @for (lang of languages; track lang) {\n <li>\n <button type=\"button\" class=\"dropdown-item\" [class.selected]=\"lang === selectedLanguage\"\n (click)=\"onSelectLanguage(lang)\">\n <span class=\"flag flag-{{ lang }}\"></span>\n <span class=\"dropdown-label\">{{ 'Language-' + lang | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</div>\n","import { Component, inject, OnInit } from '@angular/core';\nimport { ICurrentUserInfo } from '../../../models';\nimport { AuthenticationService } from '../../../services';\n\n@Component({\n selector: 'shared-user-profile',\n templateUrl: './user-profile.component.html',\n styleUrls: ['./user-profile.component.scss'],\n})\nexport class UserProfileComponent implements OnInit {\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n\n protected user: ICurrentUserInfo | null = null;\n //#endregion\n\n //#region Properties\n /** Up to two uppercase initials derived from the user's name, used when no picture is set. */\n protected get initials(): string {\n const parts: string[] = this.name.trim().split(/\\s+/).filter((p: string) => p.length > 0);\n if (parts.length === 0) {\n return '';\n }\n\n const first: string = parts[0].charAt(0);\n const last: string = parts.length > 1 ? parts[parts.length - 1].charAt(0) : '';\n return (first + last).toUpperCase();\n }\n\n protected get name(): string {\n return this.user?.name ?? '';\n }\n\n protected get pictureUrl(): string | undefined {\n return this.user?.pictureUrl;\n }\n\n protected get position(): string {\n return this.user?.position ?? '';\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngOnInit(): void {\n this.user = this.authenticationService.getUserInfo();\n }\n //#endregion\n}\n","<div class=\"user-profile\">\n <div class=\"user-text\">\n <span class=\"user-name\">{{ name }}</span>\n @if (position) {\n <span class=\"user-position\">{{ position }}</span>\n }\n </div>\n\n <div class=\"user-avatar\">\n @if (pictureUrl) {\n <img class=\"user-avatar-img\" [src]=\"pictureUrl\" [alt]=\"name\" />\n } @else {\n <span class=\"user-avatar-initials\">{{ initials }}</span>\n }\n </div>\n</div>\n","import { Component, EventEmitter, Output } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { LanguageSelectorComponent } from '../../auth/components/language-selector/language-selector.component';\nimport { BrandComponent } from './brand/brand.component';\nimport { EnvironmentBadgeComponent } from './environment-badge/environment-badge.component';\nimport { NotificationsComponent } from './notifications/notifications.component';\nimport { UserProfileComponent } from './user-profile/user-profile.component';\n\n@Component({\n selector: 'shared-top-bar',\n templateUrl: './top-bar.component.html',\n styleUrls: ['./top-bar.component.scss'],\n imports: [\n BrandComponent,\n EnvironmentBadgeComponent,\n LanguageSelectorComponent,\n NotificationsComponent,\n TranslatePipe,\n UserProfileComponent,\n ],\n})\nexport class TopBarComponent {\n //#region ViewChilds, Inputs, Outputs\n /** Emitted when the logout button is clicked. */\n @Output() public logout: EventEmitter<void> = new EventEmitter<void>();\n //#endregion\n\n //#region Event handlers\n public onLogoutClick(): void {\n this.logout.emit();\n }\n //#endregion\n}\n","<div class=\"top-bar\">\n <div class=\"top-bar-section top-bar-start\">\n <shared-brand></shared-brand>\n <shared-environment-badge></shared-environment-badge>\n </div>\n\n <div class=\"top-bar-section top-bar-end\">\n <shared-notifications></shared-notifications>\n <shared-language-selector [showFlag]=\"true\"></shared-language-selector>\n\n <!-- Theme switch slot (deferred — see 2026-07-23-top-bar-update-design.md) -->\n\n <shared-user-profile></shared-user-profile>\n\n <button class=\"btn gray-300 top-bar-logout\" type=\"button\" (click)=\"onLogoutClick()\"\n [attr.aria-label]=\"'Main-Logout' | translate\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n </button>\n </div>\n</div>\n","import { Component, inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { Router, RouterModule } from '@angular/router';\nimport { APP_CONFIG, ITab, Tab, TabsComponent, TabService } from '@zambon-dev/framework';\nimport { ModalComponent, SidebarComponent, SidebarMenu, SidebarService } from '@zambon-dev/library';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport { AuthenticationService } from '../../services';\nimport { TopBarComponent } from '../top-bar';\n\n@Component({\n selector: 'shared-main-layout',\n templateUrl: './main-layout.component.html',\n styleUrls: ['./main-layout.component.scss'],\n imports: [\n ModalComponent,\n RouterModule,\n SidebarComponent,\n TabsComponent,\n TopBarComponent,\n TranslatePipe,\n ]\n})\nexport class MainLayoutComponent implements OnInit, OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('logoutModal') private logoutModal!: ModalComponent;\n //#endregion\n\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private destroy$: Subject<boolean> = new Subject<boolean>();\n private router: Router = inject(Router);\n private sidebarService: SidebarService = inject(SidebarService);\n private tabService: TabService = inject(TabService);\n\n /** Application version (from AppConfig) projected into the sidebar footer. */\n protected appVersion: string = inject(APP_CONFIG).version;\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n public ngOnInit(): void {\n const url: string = this.router.url;\n\n if (url !== '/' && !this.tabService.isUrlOpen(url)) {\n this.sidebarService.getMenuFromUrl(url)\n .pipe(take(1))\n .subscribe((item: SidebarMenu) => {\n if (!!item) {\n this.tabService.updateTabTitle(url, item.label);\n }\n });\n }\n\n this.sidebarService.menuUrlSelected\n .pipe(takeUntil(this.destroy$))\n .subscribe((item: SidebarMenu) => {\n const tab: ITab = new Tab({\n title: item.label,\n url: item.url,\n });\n this.tabService.openTab(tab);\n });\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public onLogoutClick(): void {\n this.logoutModal.toggleModal();\n }\n\n public onLogoutConfirm(): void {\n this.authenticationService.signOut();\n this.router.navigate(['/login']);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"main-container\">\n <div class=\"sidebar-region\">\n <lib-sidebar>\n @if (appVersion) {\n <span>v{{ appVersion }}</span>\n }\n </lib-sidebar>\n </div>\n\n <shared-top-bar class=\"toolbar\" (logout)=\"onLogoutClick()\"></shared-top-bar>\n\n <div class=\"content\">\n <framework-tabs>\n <router-outlet></router-outlet>\n </framework-tabs>\n </div>\n</div>\n\n<lib-modal #logoutModal position=\"top\" size=\"xl\" [closeButtonText]=\"'Main-Logout-Modal-Message-Cancel' | translate\">\n <div body>\n <h5>{{ 'Main-Logout-Modal-Message' | translate }}</h5>\n </div>\n <div footer>\n <button type=\"button\" class=\"btn red-600\" (click)=\"onLogoutConfirm()\">{{ 'Main-Logout-Modal-Message-Confirm' | translate }}</button>\n </div>\n</lib-modal>","import { NgIf } from '@angular/common';\nimport { Component, ElementRef, inject, OnInit, ViewChild } from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router, RouterModule } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { finalize, tap } from 'rxjs';\nimport { AuthenticationService } from '../../../services';\nimport { LanguageSelectorComponent } from '../language-selector/language-selector.component';\n\n@Component({\n selector: 'shared-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n imports: [\n LanguageSelectorComponent,\n NgIf,\n ReactiveFormsModule,\n RouterModule,\n TranslatePipe,\n ]\n})\nexport class LoginComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('username') public username!: ElementRef<HTMLInputElement>;\n //#endregion\n\n //#region Variables\n protected form!: FormGroup;\n protected formState: {\n error: string | null,\n loading: boolean,\n success: boolean,\n } = {\n error: null,\n loading: false,\n success: false\n };\n\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private formBuilder: FormBuilder = inject(FormBuilder);\n private router: Router = inject(Router);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n\n public ngOnInit(): void {\n this.form = this.formBuilder.group({\n password: ['', Validators.required],\n rememberMe: [false, { nonNullable: true }],\n username: ['', Validators.required],\n });\n }\n //#endregion\n\n //#region Event handlers\n public onSubmit(): void {\n this.form.markAllAsTouched();\n\n if (this.form.valid) {\n this.form.disable();\n \n this.formState.loading = true;\n this.formState.error = null;\n\n this.authenticationService.authenticate({\n username: this.form.get('username')?.value.toString() ?? '',\n password: this.form.get('password')?.value.toString() ?? '',\n rememberMe: this.form.get('rememberMe')?.value ?? false\n })\n .pipe(\n tap(() => { \n this.formState.success = true\n }),\n finalize(() => this.formState.loading = false)\n )\n .subscribe({\n next: () => {\n const params: URLSearchParams = new URLSearchParams(window.location.search);\n \n this.router.navigate([params.get('returnUrl') ?? '/']);\n },\n error: (e: string) => {\n this.form.enable();\n\n this.form.controls['password'].setValue('');\n this.form.controls['password'].markAsUntouched();\n \n this.username.nativeElement.focus();\n\n switch(e) {\n case 'InvalidUsernamePassword':\n this.formState.error = 'invalid';\n break;\n default:\n this.formState.error = 'internalServerError';\n break;\n }\n }\n });\n }\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"content\">\n <div class=\"login\">\n <div class=\"logo-container\">\n <div class=\"logo\">\n <img src=\"/logo-login.png\" alt=\"Logo\" />\n </div>\n </div>\n \n <h3 class=\"title\">{{ 'Login-Title' | translate }}</h3>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n\n <div class=\"validations\" [class.hidden]=\"!formState.error\">\n \n <div *ngIf=\"formState.error === 'invalid'\">\n {{'Login-Errors-Invalid' | translate}}\n </div>\n \n <div *ngIf=\"formState.error === 'internalServerError'\">{{'Login-Errors-InternalServerError' | translate}}</div>\n </div>\n\n <div class=\"input-group inline\">\n <input type=\"text\" #username id=\"username\" formControlName=\"username\" class=\"form-input peer\" [placeholder]=\"'Login-Username' | translate\" autofocus />\n\n <div class=\"input-group-text\">\n <label for=\"username\">\n <i class=\"fas fa-user fa-fw\"></i>\n </label>\n </div>\n\n <div class=\"validations\">\n <span *ngIf=\"form.get('username')?.hasError('required')\">{{ 'Login-Username-Required' | translate }}</span>\n </div>\n </div>\n \n <div class=\"input-group inline\">\n <input type=\"password\" id=\"password\" formControlName=\"password\" class=\"form-input\" [placeholder]=\"'Login-Password' | translate\" />\n\n <div class=\"input-group-text\">\n <label for=\"password\">\n <i class=\"fas fa-key fa-fw\"></i>\n </label>\n </div>\n \n <div class=\"validations\">\n <span *ngIf=\"form.get('password')?.hasError('required')\">{{ 'Login-Password-Required' | translate }}</span>\n </div>\n </div>\n \n <div class=\"options\">\n <div>\n <input class=\"form-input\" id=\"rememberMe\" formControlName=\"rememberMe\" type=\"checkbox\">\n <label for=\"rememberMe\">{{ 'Login-RememberMe' | translate }}</label>\n </div>\n \n <shared-language-selector></shared-language-selector>\n </div>\n \n <div class=\"buttons\">\n <button type=\"submit\" class=\"btn\"\n [class.loading]=\"formState.loading && !formState.success && !formState.error\"\n [class.error]=\"formState.error\"\n [class.success]=\"formState.success\">\n <i *ngIf=\"!formState.loading\" class=\"fas fa-sign-in-alt fa-fw\"></i>\n {{ 'Login-SignIn' | translate }}\n </button>\n </div>\n </form>\n </div>\n\n <div class=\"footer\">\n <span [innerHTML]=\"'Login-Copyright' | translate\"></span>\n <span class=\"design\">{{ 'Login-DesignBy' | translate }}</span>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { LoginLayoutComponent } from '../layouts';\nimport { LoginComponent } from './components';\n\n\nconst routes: Routes = [\n { path: '', component: LoginLayoutComponent, children: [\n { path: '', redirectTo: 'login', pathMatch: 'full' },\n { path: 'login', component: LoginComponent },\n ] },\n];\n\n@NgModule({\n imports: [\n RouterModule.forChild(routes),\n ]\n})\nexport class SharedAuthModule {}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthenticationService } from '../../services';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthGuard implements CanActivate {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private router: Router = inject(Router);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public canActivate(_: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n if (!this.authenticationService.isAuthenticated) {\n this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });\n return false;\n }\n return true;\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { JwtInterceptor } from '@auth0/angular-jwt';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\nimport { catchError, Observable, shareReplay, switchMap, tap } from 'rxjs';\nimport { AuthenticationService } from '../../services';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private config: AppConfig = inject(APP_CONFIG);\n private jwtInterceptor: JwtInterceptor = inject(JwtInterceptor);\n private refreshToken$?: Observable<string>;\n private router: Router = inject(Router);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (\n request.url.indexOf(this.config.BASE_URL) >= 0 &&\n !this.jwtInterceptor.isDisallowedRoute(request) &&\n this.authenticationService.isTokenExpired\n ) {\n if (!this.refreshToken$) {\n this.refreshToken$ = this.authenticationService.tryRefreshToken()\n .pipe(\n shareReplay(),\n tap(() => {\n this.refreshToken$ = undefined;\n })\n );\n }\n\n return this.refreshToken$!\n .pipe(\n switchMap((token: string) => {\n return next.handle(\n request.clone({ setHeaders: { authorization: `Bearer ${token}` } })\n );\n }),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401) {\n this.authenticationService.signOut();\n this.router.navigate(['/login']);\n }\n throw err;\n })\n );\n }\n return next.handle(request);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { Component, inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { ButtonFiltersComponent } from '@zambon-dev/framework';\nimport { Subject } from 'rxjs';\n\n@Component({ template: '' })\nexport abstract class FiltersBase implements OnInit, OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild(ButtonFiltersComponent) protected buttonFilters?: ButtonFiltersComponent;\n //#endregion\n\n //#region Variables\n protected destroy$: Subject<boolean> = new Subject<boolean>();\n protected filterForm!: FormGroup;\n protected formBuilder: FormBuilder = inject(FormBuilder);\n //#endregion\n\n //#region Properties\n //#endregion\n \n //#region Constructor and Angular life cycle methods\n\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n public ngOnInit(): void {\n this.filterForm = this.formSetup();\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public setFilters(filters: { [key: string ] : any }): void {\n this.filterForm.patchValue(filters);\n\n setTimeout(() => {\n if (this.buttonFilters) {\n this.buttonFilters.setFilters(filters);\n }\n });\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n\n //#region Abstract methods\n protected abstract formSetup(): FormGroup<any>;\n //#endregion\n}\n","import { inject, Injectable } from '@angular/core';\nimport { DataGridDataset, IGridColumn, IListParameters } from '@zambon-dev/library';\nimport { Observable, of } from 'rxjs';\nimport { IOperationsHistoryList } from '../models';\nimport { OperationsHistoryService } from '../services';\n\n@Injectable()\nexport class OperationsHistoryDataset extends DataGridDataset {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public override columns: IGridColumn[] = [\n { field: '', headerName: '' },\n ];\n public controllerName?: string;\n\n protected operationsHistoryService: OperationsHistoryService = inject(OperationsHistoryService);\n\n private _serviceID?: number | undefined;\n //#endregion\n\n //#region Properties\n public set serviceId(value: number | undefined) {\n if (this._serviceID !== value) {\n this._serviceID = value;\n this.refresh();\n }\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.configs.hideColumnHeaders = true;\n this.configs.showMessageOnEmpty = false;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public getData(params: IListParameters): Observable<IOperationsHistoryList[]> {\n this.configs.showMessageOnEmpty = !!this._serviceID;\n\n return !!this.parentEntityId && !!this.controllerName && !!this._serviceID\n ? this.operationsHistoryService.list(this.controllerName, this.parentEntityId, this._serviceID, params)\n : of<IOperationsHistoryList[]>([]);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { inject, Injectable } from '@angular/core';\nimport { DataGridDataset, IGridColumn, IListParameters } from '@zambon-dev/library';\nimport { Observable, of } from 'rxjs';\nimport { IServicesHistoryList } from '../models';\nimport { ServicesHistoryService } from '../services';\n\n@Injectable()\nexport class ServicesHistoryDataset extends DataGridDataset {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public override columns: IGridColumn[] = [\n { field: '', headerName: '' },\n ];\n\n public controllerName?: string;\n\n protected servicesHistoryService: ServicesHistoryService = inject(ServicesHistoryService);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.configs.hideColumnHeaders = true;\n this.configs.rowHeight = 52;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public getData(params: IListParameters): Observable<IServicesHistoryList[]> {\n return !!this.parentEntityId && !!this.controllerName\n ? this.servicesHistoryService.list(this.controllerName, this.parentEntityId, params)\n : of<IServicesHistoryList[]>([]);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { JsonPipe } from '@angular/common';\nimport { Component, Input, ViewChild } from '@angular/core';\nimport { ModalBase } from '@zambon-dev/framework';\nimport { ModalComponent } from '@zambon-dev/library';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'shared-operations-history-modal',\n templateUrl: './operations-history-modal.component.html',\n styleUrls: ['./operations-history-modal.component.scss'],\n imports: [\n JsonPipe,\n ModalComponent,\n TranslatePipe,\n ],\n})\nexport class OperationsHistoryModalComponent extends ModalBase {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild(ModalComponent) private modal!: ModalComponent;\n\n @Input() public newValues?: string;\n\n @Input() public oldValues?: string;\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n public get isModalShown(): boolean {\n return this.modal.isShown;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public toggle(): void {\n this.modal.toggleModal();\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<lib-modal size=\"6xl\" [title]=\"'OperationsHistory-Modal-Title' | translate\">\n <div body>\n <pre>{{ oldValues | json }}</pre>\n <pre>{{ newValues | json }}</pre>\n </div>\n</lib-modal>","import { AfterViewInit, Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport { ChildList } from '@zambon-dev/framework';\nimport { DataGridComponent, DataGridDataset } from '@zambon-dev/library';\nimport { OperationsHistoryDataset } from '../../../datasets';\nimport { IOperationsHistoryList } from '../../../models';\nimport { OperationsHistoryModalComponent } from '../operations-history-modal/operations-history-modal.component';\n\n@Component({\n selector: 'shared-operations-history-child-list',\n templateUrl: './operations-history-child-list.component.html',\n styleUrls: ['./operations-history-child-list.component.scss'],\n imports: [\n DataGridComponent,\n OperationsHistoryModalComponent,\n ],\n providers: [{ provide: DataGridDataset, useClass: OperationsHistoryDataset }]\n})\nexport class OperationsHistoryChildListComponent extends ChildList<any> implements AfterViewInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild(OperationsHistoryModalComponent) private modal!: OperationsHistoryModalComponent;\n @ViewChild('operationTemplate') private operationTemplate!: TemplateRef<any>;\n\n @Input() public set controllerName(value: string) {\n (<OperationsHistoryDataset>this.dataGridDataset).controllerName = value;\n }\n\n @Input() public set serviceID(value: number | undefined) {\n (<OperationsHistoryDataset>this.dataGridDataset).serviceId = value;\n }\n //#endregion\n\n //#region Variables\n public selectedNewValues: any | null = null;\n public selectedOldValues: any | null = null;\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngAfterViewInit(): void {\n this.dataGridDataset.columns[0].template = this.operationTemplate;\n }\n //#endregion\n\n //#region Event handlers\n public openModal(): void {\n if (!this.modal.isModalShown) {\n this.modal.toggle();\n }\n }\n //#endregion\n\n //#region Public methods\n public override selectedRowChanged(): void {\n super.selectedRowChanged();\n\n if (this.dataGridDataset.hasSelectedRows) {\n const key: string = this.dataGridDataset.selectedRowKeys[0];\n \n const data: IOperationsHistoryList = this.dataGridDataset.getRowData(key);\n this.selectedOldValues = JSON.parse(data.oldValues?.trim() ?? '');\n this.selectedNewValues = JSON.parse(data.newValues?.trim() ?? '');\n }\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<lib-data-grid [lazyLoadRows]=\"true\">\n</lib-data-grid>\n\n<ng-template #operationTemplate let-rowData=\"rowData\">\n <div class=\"operation-content\" (click)=\"openModal()\">\n <span class=\"operation\"\n [class.added]=\"rowData.operationType === 'Added'\"\n [class.deleted]=\"rowData.operationType === 'Deleted'\"\n [class.modified]=\"rowData.operationType === 'Modified'\"\n [class.unchanged]=\"rowData.operationType === 'Unchanged'\">\n {{ rowData.operationType }}\n </span>\n {{ rowData.entityName }}\n </div>\n</ng-template>\n\n<shared-operations-history-modal\n[newValues]=\"selectedNewValues\"\n[oldValues]=\"selectedOldValues\">\n</shared-operations-history-modal>","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * Pipe that bypasses Angular's built-in HTML sanitization.\n *\n * **WARNING: This pipe introduces XSS (Cross-Site Scripting) risk.**\n * It marks the provided HTML string as trusted, meaning Angular will\n * render it without any sanitization. Malicious content such as\n * `<script>` tags, inline event handlers (`onerror`, `onclick`, etc.),\n * and `javascript:` URLs will be executed in the user's browser.\n *\n * ### Safe usage\n * - Server-rendered HTML from **trusted, internal APIs** that never\n * include user-generated content (e.g., admin-authored rich text\n * that is sanitized server-side before storage).\n * - Static HTML snippets defined in application code.\n *\n * ### Unsafe usage (DO NOT use for these)\n * - Any value that originates from user input (form fields, query\n * params, URL fragments, file uploads).\n * - Third-party API responses whose content you do not control.\n * - Database fields that may contain unsanitized user submissions.\n *\n * @example\n * // Safe — trusted server content\n * <div [innerHTML]=\"trustedServerHtml | bypassHtmlSanitizer\"></div>\n *\n * // UNSAFE — user-provided content (use Angular’s default sanitization instead)\n * <div [innerHTML]=\"comment.body | bypassHtmlSanitizer\"></div> // ❌ XSS risk\n * <div [innerHTML]=\"comment.body\"></div> // ✅ Angular sanitizes automatically\n */\n@Pipe({\n name: 'bypassHtmlSanitizer'\n})\nexport class BypassHtmlSanitizerPipe implements PipeTransform {\n private sanitizer: DomSanitizer = inject(DomSanitizer);\n\n public transform(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'enumLabel'\n})\nexport class EnumLabelPipe implements PipeTransform {\n public transform(value?: number, enumType?: any): string {\n if (value === undefined || enumType === undefined) {\n return '';\n }\n\n const keys: string[] = Object.keys(enumType).filter((key: string) => !isNaN(Number(enumType[key])));\n const values: number[] = keys.map((key: string) => enumType[key]);\n\n const index: number = values.indexOf(value);\n if (index >= 0) {\n return keys[index];\n }\n return '';\n }\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'utcDate'\n})\nexport class UtcDatePipe implements PipeTransform {\n transform(value?: Date): Date | null {\n if (!value) {\n return null;\n }\n\n const newDate: Date = new Date(value);\n\n let utcHour: number = newDate.getUTCHours();\n if (utcHour < newDate.getHours()) {\n utcHour += 24;\n }\n\n newDate.setHours(\n newDate.getHours() + newDate.getHours() - utcHour,\n newDate.getMinutes(),\n newDate.getSeconds()\n );\n\n return newDate;\n }\n}","import { DatePipe } from '@angular/common';\nimport { AfterViewInit, Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport { ChildList } from '@zambon-dev/framework';\nimport { DataGridComponent, DataGridDataset } from '@zambon-dev/library';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ServicesHistoryDataset } from '../../../datasets';\nimport { UtcDatePipe } from '../../../pipes';\n\n@Component({\n selector: 'shared-services-history-child-list',\n templateUrl: './services-history-child-list.component.html',\n styleUrls: ['./services-history-child-list.component.scss'],\n imports: [\n DataGridComponent,\n DatePipe,\n UtcDatePipe,\n TranslatePipe,\n ],\n providers: [{ provide: DataGridDataset, useClass: ServicesHistoryDataset }]\n})\nexport class ServicesHistoryChildListComponent extends ChildList<any> implements AfterViewInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('serviceTemplate') private serviceTemplate!: TemplateRef<any>;\n\n @Input() public set controllerName(value: string) {\n (<ServicesHistoryDataset>this.dataGridDataset).controllerName = value;\n } \n //#endregion\n\n //#region Variables\n public selectedServiceID?: number;\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngAfterViewInit(): void {\n this.dataGridDataset.columns[0].template = this.serviceTemplate;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public override selectedRowChanged(): void {\n super.selectedRowChanged();\n\n if (this.dataGridDataset.hasSelectedRows) {\n const selectedKey: string = this.dataGridDataset.selectedRowKeys[0];;\n this.selectedServiceID = this.dataGridDataset.getRowID(selectedKey);\n }\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<lib-data-grid [lazyLoadRows]=\"true\">\n</lib-data-grid>\n\n<ng-template #serviceTemplate let-rowData=\"rowData\">\n <div class=\"service-content\">\n <div class=\"icon\">\n <i class=\"fa-solid fa-circle fa-lg\"></i>\n </div>\n <div class=\"information\">\n <div class=\"service-name\">\n {{ rowData.name }}\n </div>\n <div class=\"details\">\n <span class=\"datetime\"><i class=\"fa-solid fa-clock\"></i> {{ rowData.changedOn | utcDate | date: ('Format-DateTime' | translate) }}</span>\n <span class=\"user\"><i class=\"fa-solid fa-user\"></i> {{ rowData.changedByName }}</span>\n </div>\n </div>\n </div>\n</ng-template>","import { Component, inject, Input } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { ViewBase } from '@zambon-dev/framework';\nimport { DataProviderService } from '@zambon-dev/library';\nimport { take } from 'rxjs';\nimport { OperationsHistoryChildListComponent } from '../../operations-history';\nimport { ServicesHistoryChildListComponent } from '../services-history-child-list/services-history-child-list.component';\n\n@Component({\n selector: 'shared-services-history-view',\n templateUrl: './services-history-view.component.html',\n styleUrls: ['./services-history-view.component.scss'],\n imports: [\n OperationsHistoryChildListComponent,\n ServicesHistoryChildListComponent,\n ]\n})\nexport class ServicesHistoryViewComponent extends ViewBase {\n //#region ViewChilds, Inputs, Outputs\n @Input({ required: true }) public controllerName!: string;\n\n @Input() public entityID?: number;\n //#endregion\n\n //#region Variables\n private activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n private dataProviderService: DataProviderService<any> | null = inject(DataProviderService, { optional: true });\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n if (this.activatedRoute.snapshot.data['controllerName']) {\n this.controllerName = this.activatedRoute.snapshot.data['controllerName'];\n }\n\n if (this.dataProviderService) {\n this.dataProviderService.getModel$()\n .pipe(take(1))\n .subscribe((model: any) => {\n this.entityID = model.id;\n });\n }\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"history-container\">\n <div class=\"service-history-container\">\n <shared-services-history-child-list #service\n [controllerName]=\"controllerName\">\n </shared-services-history-child-list>\n </div>\n\n <div class=\"operations-history-container\">\n <shared-operations-history-child-list\n [controllerName]=\"controllerName\"\n [serviceID]=\"service.selectedServiceID\">\n </shared-operations-history-child-list>\n </div>\n</div>","import { HttpBackend } from '@angular/common/http';\nimport { EnvironmentProviders, Provider } from '@angular/core';\nimport { provideTranslateService, TranslateLoader } from '@ngx-translate/core';\nimport { MultiTranslateHttpLoader, TranslationResource } from 'ngx-translate-multi-http-loader';\n\nexport interface AngularAssetPattern {\n glob: string;\n input: string;\n output: string;\n}\n\nexport const ZAMBON_SHARED_I18N_ASSET_PATH = 'assets/i18n/zambon-dev/shared';\n\nexport const ZAMBON_SHARED_I18N_ASSET: AngularAssetPattern = {\n glob: '**/*.json',\n input: 'node_modules/@zambon-dev/shared/i18n',\n output: ZAMBON_SHARED_I18N_ASSET_PATH,\n};\n\nexport const ZAMBON_SHARED_I18N_RESOURCES: TranslationResource[] = [\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/language-selector/`, suffix: '.json' },\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/login/`, suffix: '.json' },\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/operations-history/`, suffix: '.json' },\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/top-bar/`, suffix: '.json' },\n];\n\nexport interface ZambonSharedTranslateConfig {\n defaultLanguage?: string;\n appResources?: (string | TranslationResource)[];\n}\n\nexport function createZambonSharedTranslateLoader(\n httpBackend: HttpBackend,\n appResources: (string | TranslationResource)[] = [],\n): MultiTranslateHttpLoader {\n return new MultiTranslateHttpLoader(httpBackend, [\n ...ZAMBON_SHARED_I18N_RESOURCES,\n ...appResources,\n ]);\n}\n\nexport function provideZambonSharedTranslateLoader(\n appResources: (string | TranslationResource)[] = [],\n): Provider {\n return {\n provide: TranslateLoader,\n useFactory: (httpBackend: HttpBackend) => createZambonSharedTranslateLoader(httpBackend, appResources),\n deps: [HttpBackend],\n };\n}\n\nexport function provideZambonSharedTranslateService(\n config: ZambonSharedTranslateConfig = {},\n): EnvironmentProviders {\n return provideTranslateService({\n defaultLanguage: config.defaultLanguage,\n loader: provideZambonSharedTranslateLoader(config.appResources),\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"zambon-dev-shared.mjs","sources":["../../../../libs/shared/src/lib/layouts/login-layout/login-layout.component.ts","../../../../libs/shared/src/lib/layouts/login-layout/login-layout.component.html","../../../../libs/shared/src/lib/services/authentication.service.ts","../../../../libs/shared/src/lib/services/notifications.service.ts","../../../../libs/shared/src/lib/services/operations-history.service.ts","../../../../libs/shared/src/lib/services/services-history.service.ts","../../../../libs/shared/src/lib/layouts/top-bar/brand/brand.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/brand/brand.component.html","../../../../libs/shared/src/lib/layouts/top-bar/environment-badge/environment-badge.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/environment-badge/environment-badge.component.html","../../../../libs/shared/src/lib/layouts/top-bar/notifications/notifications.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/notifications/notifications.component.html","../../../../libs/shared/src/lib/auth/components/language-selector/language-selector.component.ts","../../../../libs/shared/src/lib/auth/components/language-selector/language-selector.component.html","../../../../libs/shared/src/lib/layouts/top-bar/user-profile/user-profile.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/user-profile/user-profile.component.html","../../../../libs/shared/src/lib/layouts/top-bar/top-bar.component.ts","../../../../libs/shared/src/lib/layouts/top-bar/top-bar.component.html","../../../../libs/shared/src/lib/layouts/main-layout/main-layout.component.ts","../../../../libs/shared/src/lib/layouts/main-layout/main-layout.component.html","../../../../libs/shared/src/lib/auth/components/login/login.component.ts","../../../../libs/shared/src/lib/auth/components/login/login.component.html","../../../../libs/shared/src/lib/auth/auth.module.ts","../../../../libs/shared/src/lib/auth/guards/auth-guard.ts","../../../../libs/shared/src/lib/auth/interceptors/auth-interceptors.ts","../../../../libs/shared/src/lib/components/filters-base.ts","../../../../libs/shared/src/lib/datasets/operations-history.dataset.ts","../../../../libs/shared/src/lib/datasets/services-history.dataset.ts","../../../../libs/shared/src/lib/features/operations-history/operations-history-modal/operations-history-modal.component.ts","../../../../libs/shared/src/lib/features/operations-history/operations-history-modal/operations-history-modal.component.html","../../../../libs/shared/src/lib/features/operations-history/operations-history-child-list/operations-history-child-list.component.ts","../../../../libs/shared/src/lib/features/operations-history/operations-history-child-list/operations-history-child-list.component.html","../../../../libs/shared/src/lib/pipes/bypass-html-sanitizer.pipe.ts","../../../../libs/shared/src/lib/pipes/enum-text.pipe.ts","../../../../libs/shared/src/lib/pipes/utc-date.pipe.ts","../../../../libs/shared/src/lib/features/services-history/services-history-child-list/services-history-child-list.component.ts","../../../../libs/shared/src/lib/features/services-history/services-history-child-list/services-history-child-list.component.html","../../../../libs/shared/src/lib/features/services-history/services-history-view/services-history-view.component.ts","../../../../libs/shared/src/lib/features/services-history/services-history-view/services-history-view.component.html","../../../../libs/shared/src/lib/i18n/shared-i18n.ts","../../../../libs/shared/src/zambon-dev-shared.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\n@Component({\n selector: 'shared-login-layout',\n templateUrl: './login-layout.component.html',\n styleUrls: ['./login-layout.component.scss'],\n imports: [\n RouterModule,\n ]\n})\nexport class LoginLayoutComponent {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"background\"></div>\n\n<div class=\"container\">\n <router-outlet></router-outlet>\n</div>","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { JwtHelperService } from '@auth0/angular-jwt';\nimport { APP_CONFIG, AppConfig, AuthService, TabService } from '@zambon-dev/framework';\nimport { Observable, catchError, interval, map, mergeMap, tap } from 'rxjs';\nimport { IAuthResponse, ICurrentUserInfo } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthenticationService extends AuthService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public adminAction: string = 'AdministrativeMaster';\n\n private config: AppConfig = inject(APP_CONFIG);\n\n private readonly BASE_URL: string = `${this.config.BASE_URL}/Authentication`;\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super(inject(JwtHelperService), inject(TabService));\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public authenticate(model: { username: string, password: string, rememberMe: boolean }): Observable<void> {\n return this.http\n .post<IAuthResponse>(`${this.BASE_URL}/SignIn`, model)\n .pipe(\n map((res: IAuthResponse) => {\n this.setStorage('username', res.username, model.rememberMe);\n this.setStorage('token', res.token, model.rememberMe);\n this.setStorage('refreshToken', res.refreshToken, model.rememberMe);\n this.setStorage('userInfo', window.btoa(JSON.stringify(res as ICurrentUserInfo)), model.rememberMe);\n }),\n catchError((error: HttpErrorResponse) =>\n interval(1000)\n .pipe(\n mergeMap(() => {\n switch(error.status) {\n case 401:\n throw 'InvalidUsernamePassword';\n default:\n throw 'InternalServerError';\n }\n })\n )\n )\n );\n }\n\n public getActions(): Observable<string[]> {\n return this.http.post<string[]>(`${this.BASE_URL}/GetActions`, {});\n }\n\n public getUserInfo(): ICurrentUserInfo | null {\n const userInfo: string | null = this.userInfo;\n if (userInfo) {\n return JSON.parse(window.atob(userInfo)) as ICurrentUserInfo;\n }\n return null;\n }\n\n public tryRefreshToken(): Observable<string> {\n return this.http\n .post<IAuthResponse>(`${this.BASE_URL}/RefreshToken`, {\n username: this.username ?? '',\n refreshToken: this.refreshToken ?? ''\n })\n .pipe(\n tap((res: IAuthResponse) => {\n this.setStorage('token', res.token);\n this.setStorage('refreshToken', res.refreshToken);\n this.setStorage('userInfo', window.btoa(JSON.stringify(res as ICurrentUserInfo)));\n }),\n map((res: IAuthResponse) => res.token ?? '')\n );\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { inject, Injectable } from '@angular/core';\nimport { HubConnection, HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';\nimport { APP_CONFIG, AppConfig, AuthService } from '@zambon-dev/framework';\nimport { BehaviorSubject, map, Observable } from 'rxjs';\nimport { INotification } from '../models';\n\n/**\n * Streams top-bar notifications from a SignalR hub.\n *\n * The hub is configured via `AppConfig.notificationsEnabled` and `AppConfig.notificationsUrl`.\n * When enabled, {@link start} opens a connection (authenticated with the current JWT) and\n * listens for the server to push the notification list via the `ReceiveNotifications` client\n * method. Consuming apps do not interact with this service directly — the top bar drives it.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationsService {\n //#region Variables\n private authService: AuthService = inject(AuthService);\n private config: AppConfig = inject(APP_CONFIG);\n\n private connection?: HubConnection;\n private notifications$: BehaviorSubject<INotification[]> = new BehaviorSubject<INotification[]>([]);\n //#endregion\n\n //#region Properties\n /** Whether the notifications feature is enabled (toggled on and given a hub URL). */\n public get isEnabled(): boolean {\n return this.config.notificationsEnabled && this.config.notificationsUrl.length > 0;\n }\n //#endregion\n\n //#region Public methods\n /** Emits the current list of notifications. */\n public getNotifications(): Observable<INotification[]> {\n return this.notifications$.asObservable();\n }\n\n /** Emits the number of unread notifications. */\n public getUnreadCount(): Observable<number> {\n return this.notifications$.pipe(\n map((notifications: INotification[]) => notifications.filter((n: INotification) => !n.isRead).length),\n );\n }\n\n /** Marks every notification as read and notifies the hub. */\n public markAllAsRead(): void {\n this.notifications$.next(this.notifications$.value.map((n: INotification) => ({ ...n, isRead: true })));\n\n if (this.connection?.state === HubConnectionState.Connected) {\n this.connection.invoke('MarkAllAsRead').catch((error: unknown) => {\n console.error('Failed to mark notifications as read on the hub.', error);\n });\n }\n }\n\n /** Marks a single notification as read (optimistically; the server reconciles on the next push). */\n public markAsRead(notification: INotification): void {\n this.notifications$.next(\n this.notifications$.value.map((n: INotification) => (n === notification ? { ...n, isRead: true } : n)),\n );\n }\n\n /** Opens the SignalR connection and starts receiving notifications. Idempotent and a no-op when disabled. */\n public start(): void {\n if (!this.isEnabled || !!this.connection) {\n return;\n }\n\n this.connection = new HubConnectionBuilder()\n .withUrl(this.config.notificationsUrl, {\n accessTokenFactory: () => this.authService.token ?? '',\n })\n .withAutomaticReconnect()\n .build();\n\n this.connection.on('ReceiveNotifications', (notifications: INotification[]) => {\n this.notifications$.next(notifications ?? []);\n });\n\n this.connection.start().catch((error: unknown) => {\n console.error('Failed to connect to the notifications hub.', error);\n });\n }\n\n /** Closes the SignalR connection. */\n public async stop(): Promise<void> {\n if (this.connection) {\n await this.connection.stop();\n this.connection = undefined;\n }\n }\n //#endregion\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\nimport { IListParameters } from '@zambon-dev/library';\nimport { Observable } from 'rxjs';\nimport { IOperationsHistoryList } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class OperationsHistoryService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public list(controllerName: string, entityID: number, serviceHistoryID: number, parameters: IListParameters): Observable<IOperationsHistoryList[]> {\n return this.http.post<IOperationsHistoryList[]>(`${this.config.BASE_URL}/${controllerName}/${entityID}/Audit/${serviceHistoryID}`, parameters);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\nimport { IListParameters } from '@zambon-dev/library';\nimport { Observable } from 'rxjs';\nimport { IServicesHistoryList } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ServicesHistoryService {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n private http: HttpClient = inject(HttpClient);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public list(controllerName: string, entityID: number, parameters: IListParameters): Observable<IServicesHistoryList[]> {\n return this.http.post<IServicesHistoryList[]>(`${this.config.BASE_URL}/${controllerName}/${entityID}/Audit`, parameters);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { Component, inject } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\n\n@Component({\n selector: 'shared-brand',\n templateUrl: './brand.component.html',\n styleUrls: ['./brand.component.scss'],\n})\nexport class BrandComponent {\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n //#endregion\n\n //#region Properties\n protected get appName(): string {\n return this.config.appName;\n }\n\n protected get companyName(): string {\n return this.config.companyName;\n }\n\n protected get logoUrl(): string | undefined {\n return this.config.logoUrl;\n }\n //#endregion\n}\n","<div class=\"brand\">\n @if (logoUrl) {\n <img class=\"brand-logo\" [src]=\"logoUrl\" [alt]=\"appName\" />\n }\n\n <div class=\"brand-text\">\n <span class=\"brand-app\">{{ appName }}</span>\n @if (companyName) {\n <span class=\"brand-company\">{{ companyName }}</span>\n }\n </div>\n</div>\n","import { Component, inject } from '@angular/core';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\n\n@Component({\n selector: 'shared-environment-badge',\n templateUrl: './environment-badge.component.html',\n styleUrls: ['./environment-badge.component.scss'],\n})\nexport class EnvironmentBadgeComponent {\n //#region Variables\n private config: AppConfig = inject(APP_CONFIG);\n //#endregion\n\n //#region Properties\n /** CSS modifier class for the current environment, falling back to a neutral style. */\n protected get badgeClass(): string {\n const colorByEnvironment: Record<string, string> = {\n DEV: 'env-dev',\n QA: 'env-qa',\n STG: 'env-stg',\n };\n return colorByEnvironment[this.environment] ?? 'env-neutral';\n }\n\n /** Normalized environment key (uppercase, trimmed). */\n protected get environment(): string {\n return (this.config.environment ?? '').trim().toUpperCase();\n }\n\n /** The badge is hidden in production and when no environment is configured. */\n protected get isVisible(): boolean {\n return this.environment.length > 0 && this.environment !== 'PROD';\n }\n //#endregion\n}\n","@if (isVisible) {\n <span class=\"env-badge {{ badgeClass }}\">\n <span class=\"env-dot\"></span>\n <span class=\"env-label\">{{ environment }}</span>\n </span>\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, ElementRef, HostListener, inject, OnInit, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Observable } from 'rxjs';\nimport { INotification } from '../../../models';\nimport { NotificationsService } from '../../../services';\n\n@Component({\n selector: 'shared-notifications',\n templateUrl: './notifications.component.html',\n styleUrls: ['./notifications.component.scss'],\n imports: [\n AsyncPipe,\n TranslatePipe,\n ],\n})\nexport class NotificationsComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('dropdown') public dropdown!: ElementRef<HTMLDivElement>;\n //#endregion\n\n //#region Variables\n private notificationsService: NotificationsService = inject(NotificationsService);\n private router: Router = inject(Router);\n\n protected notifications$: Observable<INotification[]> = this.notificationsService.getNotifications();\n protected showDropdown = false;\n protected unreadCount$: Observable<number> = this.notificationsService.getUnreadCount();\n //#endregion\n\n //#region Properties\n /** Whether the notifications feature is enabled; when false the bell is not rendered. */\n public get isEnabled(): boolean {\n return this.notificationsService.isEnabled;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngOnInit(): void {\n this.notificationsService.start();\n }\n //#endregion\n\n //#region Event handlers\n public onDropdownClick(): void {\n this.showDropdown = !this.showDropdown;\n }\n\n public onMarkAllAsRead(): void {\n this.notificationsService.markAllAsRead();\n }\n\n public onNotificationClick(notification: INotification): void {\n this.notificationsService.markAsRead(notification);\n this.showDropdown = false;\n\n const url: string | undefined = notification.callToActionUrl;\n if (!url) {\n return;\n }\n\n if (/^https?:\\/\\//i.test(url)) {\n window.open(url, '_blank', 'noopener');\n } else {\n this.router.navigateByUrl(url);\n }\n }\n //#endregion\n\n //#region Private methods\n @HostListener('window:click', ['$event'])\n private documentClick(event: MouseEvent): void {\n if (this.showDropdown) {\n let target: HTMLElement = <HTMLElement>event.target;\n while (target !== null && target.tagName?.toUpperCase() !== 'BODY') {\n if (target === this.dropdown.nativeElement) {\n return;\n }\n target = <HTMLElement>target.parentElement;\n }\n this.showDropdown = false;\n }\n }\n //#endregion\n}\n","@if (isEnabled) {\n <div #dropdown class=\"notifications\">\n <button class=\"btn gray-300 notifications-toggle\" type=\"button\" (click)=\"onDropdownClick()\"\n [attr.aria-label]=\"'TopBar-Notifications-Title' | translate\">\n <i class=\"fa-solid fa-bell\"></i>\n @if (unreadCount$ | async; as count) {\n <span class=\"notifications-badge\">{{ count }}</span>\n }\n </button>\n\n @if (showDropdown) {\n <div class=\"notifications-panel\">\n @let items = (notifications$ | async) ?? [];\n\n <div class=\"notifications-header\">\n <span>{{ 'TopBar-Notifications-Title' | translate }}</span>\n @if (items.length > 0) {\n <button type=\"button\" class=\"notifications-mark-all\" (click)=\"onMarkAllAsRead()\">\n {{ 'TopBar-Notifications-MarkAllRead' | translate }}\n </button>\n }\n </div>\n\n @if (items.length > 0) {\n <ul class=\"notifications-list\">\n @for (item of items; track $index) {\n <li class=\"notifications-item\" [class.unread]=\"!item.isRead\">\n <button type=\"button\" class=\"notifications-item-btn\"\n [class.has-cta]=\"!!item.callToActionUrl\" (click)=\"onNotificationClick(item)\">\n <span class=\"notifications-item-icon\"><i class=\"{{ item.icon }}\"></i></span>\n <span class=\"notifications-item-body\">\n <span class=\"notifications-item-title\">{{ item.title }}</span>\n <span class=\"notifications-item-description\">{{ item.description }}</span>\n </span>\n @if (item.callToActionUrl) {\n <i class=\"notifications-item-cta fa-solid fa-chevron-right\"></i>\n }\n </button>\n </li>\n }\n </ul>\n } @else {\n <div class=\"notifications-empty\">{{ 'TopBar-Notifications-Empty' | translate }}</div>\n }\n </div>\n }\n </div>\n}\n","import { Component, ElementRef, HostListener, inject, Input, ViewChild } from '@angular/core';\nimport { TranslatePipe, TranslateService } from '@ngx-translate/core';\n\n@Component({\n selector: 'shared-language-selector',\n templateUrl: './language-selector.component.html',\n styleUrls: ['./language-selector.component.scss'],\n imports: [\n TranslatePipe,\n ]\n})\nexport class LanguageSelectorComponent {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('dropdown') public dropdown!: ElementRef<HTMLDivElement>;\n\n /** When true, the toggle shows the current language's flag (light-gray button) instead of text. */\n @Input() public showFlag = false;\n\n @Input() public title: string = 'LanguageSelector-Title';\n //#endregion\n\n //#region Variables\n private translate: TranslateService = inject(TranslateService);\n\n protected languages: string[] = this.translate.getLangs();\n protected showDropdown: boolean = false;\n //#endregion\n\n //#region Properties\n public get selectedLanguage(): string {\n return this.translate.currentLang;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n public onDropdownClick(): void {\n this.showDropdown = !this.showDropdown;\n }\n\n public onSelectLanguage(language: string): void {\n localStorage.setItem('language', language);\n this.translate.use(language);\n this.showDropdown = false;\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n @HostListener('window:click', ['$event'])\n private documentClick(event: MouseEvent): void {\n if (this.showDropdown) {\n let target: HTMLElement = <HTMLElement>event.target;\n while (target !== null && target.tagName?.toUpperCase() !== 'BODY') {\n if (target === this.dropdown.nativeElement) {\n return;\n }\n target = <HTMLElement>target.parentElement;\n }\n this.showDropdown = false;\n }\n }\n //#endregion\n}\n","<div #dropdown class=\"dropdown right\" [class.show]=\"showDropdown\">\n <button class=\"btn\" type=\"button\" (click)=\"onDropdownClick()\"\n [class.gray-300]=\"showFlag\" [class.lang-flag-toggle]=\"showFlag\"\n [attr.aria-label]=\"showFlag ? (title | translate) : null\">\n @if (showFlag) {\n <span class=\"flag flag-{{ selectedLanguage }}\"></span>\n } @else {\n {{ title | translate }}\n }\n </button>\n\n <ul>\n @for (lang of languages; track lang) {\n <li>\n <button type=\"button\" class=\"dropdown-item\" [class.selected]=\"lang === selectedLanguage\"\n (click)=\"onSelectLanguage(lang)\">\n <span class=\"flag flag-{{ lang }}\"></span>\n <span class=\"dropdown-label\">{{ 'Language-' + lang | translate }}</span>\n </button>\n </li>\n }\n </ul>\n</div>\n","import { Component, inject, OnInit } from '@angular/core';\nimport { ICurrentUserInfo } from '../../../models';\nimport { AuthenticationService } from '../../../services';\n\n@Component({\n selector: 'shared-user-profile',\n templateUrl: './user-profile.component.html',\n styleUrls: ['./user-profile.component.scss'],\n})\nexport class UserProfileComponent implements OnInit {\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n\n protected user: ICurrentUserInfo | null = null;\n //#endregion\n\n //#region Properties\n /** Up to two uppercase initials derived from the user's name, used when no picture is set. */\n protected get initials(): string {\n const parts: string[] = this.name.trim().split(/\\s+/).filter((p: string) => p.length > 0);\n if (parts.length === 0) {\n return '';\n }\n\n const first: string = parts[0].charAt(0);\n const last: string = parts.length > 1 ? parts[parts.length - 1].charAt(0) : '';\n return (first + last).toUpperCase();\n }\n\n protected get name(): string {\n return this.user?.name ?? '';\n }\n\n protected get pictureUrl(): string | undefined {\n return this.user?.pictureUrl;\n }\n\n protected get position(): string {\n return this.user?.position ?? '';\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngOnInit(): void {\n this.user = this.authenticationService.getUserInfo();\n }\n //#endregion\n}\n","<div class=\"user-profile\">\n <div class=\"user-text\">\n <span class=\"user-name\">{{ name }}</span>\n @if (position) {\n <span class=\"user-position\">{{ position }}</span>\n }\n </div>\n\n <div class=\"user-avatar\">\n @if (pictureUrl) {\n <img class=\"user-avatar-img\" [src]=\"pictureUrl\" [alt]=\"name\" />\n } @else {\n <span class=\"user-avatar-initials\">{{ initials }}</span>\n }\n </div>\n</div>\n","import { Component, EventEmitter, Output } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { LanguageSelectorComponent } from '../../auth/components/language-selector/language-selector.component';\nimport { BrandComponent } from './brand/brand.component';\nimport { EnvironmentBadgeComponent } from './environment-badge/environment-badge.component';\nimport { NotificationsComponent } from './notifications/notifications.component';\nimport { UserProfileComponent } from './user-profile/user-profile.component';\n\n@Component({\n selector: 'shared-top-bar',\n templateUrl: './top-bar.component.html',\n styleUrls: ['./top-bar.component.scss'],\n imports: [\n BrandComponent,\n EnvironmentBadgeComponent,\n LanguageSelectorComponent,\n NotificationsComponent,\n TranslatePipe,\n UserProfileComponent,\n ],\n})\nexport class TopBarComponent {\n //#region ViewChilds, Inputs, Outputs\n /** Emitted when the logout button is clicked. */\n @Output() public logout: EventEmitter<void> = new EventEmitter<void>();\n //#endregion\n\n //#region Event handlers\n public onLogoutClick(): void {\n this.logout.emit();\n }\n //#endregion\n}\n","<div class=\"top-bar\">\n <div class=\"top-bar-section top-bar-start\">\n <shared-brand></shared-brand>\n <shared-environment-badge></shared-environment-badge>\n </div>\n\n <div class=\"top-bar-section top-bar-end\">\n <shared-notifications></shared-notifications>\n <shared-language-selector [showFlag]=\"true\"></shared-language-selector>\n\n <!-- Theme switch slot (deferred — see 2026-07-23-top-bar-update-design.md) -->\n\n <shared-user-profile></shared-user-profile>\n\n <button class=\"btn gray-300 top-bar-logout\" type=\"button\" (click)=\"onLogoutClick()\"\n [attr.aria-label]=\"'Main-Logout' | translate\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n </button>\n </div>\n</div>\n","import { Component, inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { Router, RouterModule } from '@angular/router';\nimport { APP_CONFIG, ITab, Tab, TabsComponent, TabService } from '@zambon-dev/framework';\nimport { ModalComponent, SidebarComponent, SidebarMenu, SidebarService } from '@zambon-dev/library';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subject, take, takeUntil } from 'rxjs';\nimport { AuthenticationService } from '../../services';\nimport { TopBarComponent } from '../top-bar';\n\n@Component({\n selector: 'shared-main-layout',\n templateUrl: './main-layout.component.html',\n styleUrls: ['./main-layout.component.scss'],\n imports: [\n ModalComponent,\n RouterModule,\n SidebarComponent,\n TabsComponent,\n TopBarComponent,\n TranslatePipe,\n ]\n})\nexport class MainLayoutComponent implements OnInit, OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('logoutModal') private logoutModal!: ModalComponent;\n //#endregion\n\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private destroy$: Subject<boolean> = new Subject<boolean>();\n private router: Router = inject(Router);\n private sidebarService: SidebarService = inject(SidebarService);\n private tabService: TabService = inject(TabService);\n\n /** Application version (from AppConfig) projected into the sidebar footer. */\n protected appVersion: string = inject(APP_CONFIG).version;\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n public ngOnInit(): void {\n const url: string = this.router.url;\n\n if (url !== '/' && !this.tabService.isUrlOpen(url)) {\n this.sidebarService.getMenuFromUrl(url)\n .pipe(take(1))\n .subscribe((item: SidebarMenu) => {\n if (!!item) {\n this.tabService.updateTabTitle(url, item.label);\n }\n });\n }\n\n this.sidebarService.menuUrlSelected\n .pipe(takeUntil(this.destroy$))\n .subscribe((item: SidebarMenu) => {\n const tab: ITab = new Tab({\n title: item.label,\n url: item.url,\n });\n this.tabService.openTab(tab);\n });\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public onLogoutClick(): void {\n this.logoutModal.toggleModal();\n }\n\n public onLogoutConfirm(): void {\n this.authenticationService.signOut();\n this.router.navigate(['/login']);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"main-container\">\n <div class=\"sidebar-region\">\n <lib-sidebar>\n @if (appVersion) {\n <span>v{{ appVersion }}</span>\n }\n </lib-sidebar>\n </div>\n\n <shared-top-bar class=\"toolbar\" (logout)=\"onLogoutClick()\"></shared-top-bar>\n\n <div class=\"content\">\n <framework-tabs>\n <router-outlet></router-outlet>\n </framework-tabs>\n </div>\n</div>\n\n<lib-modal #logoutModal position=\"top\" size=\"xl\" [closeButtonText]=\"'Main-Logout-Modal-Message-Cancel' | translate\">\n <div body>\n <h5>{{ 'Main-Logout-Modal-Message' | translate }}</h5>\n </div>\n <div footer>\n <button type=\"button\" class=\"btn red-600\" (click)=\"onLogoutConfirm()\">{{ 'Main-Logout-Modal-Message-Confirm' | translate }}</button>\n </div>\n</lib-modal>","import { NgIf } from '@angular/common';\nimport { Component, ElementRef, inject, OnInit, ViewChild } from '@angular/core';\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { Router, RouterModule } from '@angular/router';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { finalize, tap } from 'rxjs';\nimport { AuthenticationService } from '../../../services';\nimport { LanguageSelectorComponent } from '../language-selector/language-selector.component';\n\n@Component({\n selector: 'shared-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.scss'],\n imports: [\n LanguageSelectorComponent,\n NgIf,\n ReactiveFormsModule,\n RouterModule,\n TranslatePipe,\n ]\n})\nexport class LoginComponent implements OnInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('username') public username!: ElementRef<HTMLInputElement>;\n //#endregion\n\n //#region Variables\n protected form!: FormGroup;\n protected formState: {\n error: string | null,\n loading: boolean,\n success: boolean,\n } = {\n error: null,\n loading: false,\n success: false\n };\n\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private formBuilder: FormBuilder = inject(FormBuilder);\n private router: Router = inject(Router);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n\n public ngOnInit(): void {\n this.form = this.formBuilder.group({\n password: ['', Validators.required],\n rememberMe: [false, { nonNullable: true }],\n username: ['', Validators.required],\n });\n }\n //#endregion\n\n //#region Event handlers\n public onSubmit(): void {\n this.form.markAllAsTouched();\n\n if (this.form.valid) {\n this.form.disable();\n \n this.formState.loading = true;\n this.formState.error = null;\n\n this.authenticationService.authenticate({\n username: this.form.get('username')?.value.toString() ?? '',\n password: this.form.get('password')?.value.toString() ?? '',\n rememberMe: this.form.get('rememberMe')?.value ?? false\n })\n .pipe(\n tap(() => { \n this.formState.success = true\n }),\n finalize(() => this.formState.loading = false)\n )\n .subscribe({\n next: () => {\n const params: URLSearchParams = new URLSearchParams(window.location.search);\n \n this.router.navigate([params.get('returnUrl') ?? '/']);\n },\n error: (e: string) => {\n this.form.enable();\n\n this.form.controls['password'].setValue('');\n this.form.controls['password'].markAsUntouched();\n \n this.username.nativeElement.focus();\n\n switch(e) {\n case 'InvalidUsernamePassword':\n this.formState.error = 'invalid';\n break;\n default:\n this.formState.error = 'internalServerError';\n break;\n }\n }\n });\n }\n }\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"content\">\n <div class=\"login\">\n <div class=\"logo-container\">\n <div class=\"logo\">\n <img src=\"/logo-login.png\" alt=\"Logo\" />\n </div>\n </div>\n \n <h3 class=\"title\">{{ 'Login-Title' | translate }}</h3>\n\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n\n <div class=\"validations\" [class.hidden]=\"!formState.error\">\n \n <div *ngIf=\"formState.error === 'invalid'\">\n {{'Login-Errors-Invalid' | translate}}\n </div>\n \n <div *ngIf=\"formState.error === 'internalServerError'\">{{'Login-Errors-InternalServerError' | translate}}</div>\n </div>\n\n <div class=\"input-group inline\">\n <input type=\"text\" #username id=\"username\" formControlName=\"username\" class=\"form-input peer\" [placeholder]=\"'Login-Username' | translate\" autofocus />\n\n <div class=\"input-group-text\">\n <label for=\"username\">\n <i class=\"fas fa-user fa-fw\"></i>\n </label>\n </div>\n\n <div class=\"validations\">\n <span *ngIf=\"form.get('username')?.hasError('required')\">{{ 'Login-Username-Required' | translate }}</span>\n </div>\n </div>\n \n <div class=\"input-group inline\">\n <input type=\"password\" id=\"password\" formControlName=\"password\" class=\"form-input\" [placeholder]=\"'Login-Password' | translate\" />\n\n <div class=\"input-group-text\">\n <label for=\"password\">\n <i class=\"fas fa-key fa-fw\"></i>\n </label>\n </div>\n \n <div class=\"validations\">\n <span *ngIf=\"form.get('password')?.hasError('required')\">{{ 'Login-Password-Required' | translate }}</span>\n </div>\n </div>\n \n <div class=\"options\">\n <div>\n <input class=\"form-input\" id=\"rememberMe\" formControlName=\"rememberMe\" type=\"checkbox\">\n <label for=\"rememberMe\">{{ 'Login-RememberMe' | translate }}</label>\n </div>\n \n <shared-language-selector></shared-language-selector>\n </div>\n \n <div class=\"buttons\">\n <button type=\"submit\" class=\"btn\"\n [class.loading]=\"formState.loading && !formState.success && !formState.error\"\n [class.error]=\"formState.error\"\n [class.success]=\"formState.success\">\n <i *ngIf=\"!formState.loading\" class=\"fas fa-sign-in-alt fa-fw\"></i>\n {{ 'Login-SignIn' | translate }}\n </button>\n </div>\n </form>\n </div>\n\n <div class=\"footer\">\n <span [innerHTML]=\"'Login-Copyright' | translate\"></span>\n <span class=\"design\">{{ 'Login-DesignBy' | translate }}</span>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { LoginLayoutComponent } from '../layouts';\nimport { LoginComponent } from './components';\n\n\nconst routes: Routes = [\n { path: '', component: LoginLayoutComponent, children: [\n { path: '', redirectTo: 'login', pathMatch: 'full' },\n { path: 'login', component: LoginComponent },\n ] },\n];\n\n@NgModule({\n imports: [\n RouterModule.forChild(routes),\n ]\n})\nexport class SharedAuthModule {}\n","import { inject, Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';\nimport { AuthenticationService } from '../../services';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthGuard implements CanActivate {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private router: Router = inject(Router);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public canActivate(_: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n if (!this.authenticationService.isAuthenticated) {\n this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });\n return false;\n }\n return true;\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { JwtInterceptor } from '@auth0/angular-jwt';\nimport { APP_CONFIG, AppConfig } from '@zambon-dev/framework';\nimport { catchError, Observable, shareReplay, switchMap, tap } from 'rxjs';\nimport { AuthenticationService } from '../../services';\n\n@Injectable()\nexport class AuthInterceptor implements HttpInterceptor {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n private authenticationService: AuthenticationService = inject(AuthenticationService);\n private config: AppConfig = inject(APP_CONFIG);\n private jwtInterceptor: JwtInterceptor = inject(JwtInterceptor);\n private refreshToken$?: Observable<string>;\n private router: Router = inject(Router);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (\n request.url.indexOf(this.config.BASE_URL) >= 0 &&\n !this.jwtInterceptor.isDisallowedRoute(request) &&\n this.authenticationService.isTokenExpired\n ) {\n if (!this.refreshToken$) {\n this.refreshToken$ = this.authenticationService.tryRefreshToken()\n .pipe(\n shareReplay(),\n tap(() => {\n this.refreshToken$ = undefined;\n })\n );\n }\n\n return this.refreshToken$!\n .pipe(\n switchMap((token: string) => {\n return next.handle(\n request.clone({ setHeaders: { authorization: `Bearer ${token}` } })\n );\n }),\n catchError((err: HttpErrorResponse) => {\n if (err.status === 401) {\n this.authenticationService.signOut();\n this.router.navigate(['/login']);\n }\n throw err;\n })\n );\n }\n return next.handle(request);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { Component, inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { ButtonFiltersComponent } from '@zambon-dev/framework';\nimport { Subject } from 'rxjs';\n\n@Component({ template: '' })\nexport abstract class FiltersBase implements OnInit, OnDestroy {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild(ButtonFiltersComponent) protected buttonFilters?: ButtonFiltersComponent;\n //#endregion\n\n //#region Variables\n protected destroy$: Subject<boolean> = new Subject<boolean>();\n protected filterForm!: FormGroup;\n protected formBuilder: FormBuilder = inject(FormBuilder);\n //#endregion\n\n //#region Properties\n //#endregion\n \n //#region Constructor and Angular life cycle methods\n\n public ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.complete();\n }\n\n public ngOnInit(): void {\n this.filterForm = this.formSetup();\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public setFilters(filters: { [key: string ] : any }): void {\n this.filterForm.patchValue(filters);\n\n setTimeout(() => {\n if (this.buttonFilters) {\n this.buttonFilters.setFilters(filters);\n }\n });\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n\n //#region Abstract methods\n protected abstract formSetup(): FormGroup<any>;\n //#endregion\n}\n","import { inject, Injectable } from '@angular/core';\nimport { DataGridDataset, IGridColumn, IListParameters } from '@zambon-dev/library';\nimport { Observable, of } from 'rxjs';\nimport { IOperationsHistoryList } from '../models';\nimport { OperationsHistoryService } from '../services';\n\n@Injectable()\nexport class OperationsHistoryDataset extends DataGridDataset {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public override columns: IGridColumn[] = [\n { field: '', headerName: '' },\n ];\n public controllerName?: string;\n\n protected operationsHistoryService: OperationsHistoryService = inject(OperationsHistoryService);\n\n private _serviceID?: number | undefined;\n //#endregion\n\n //#region Properties\n public set serviceId(value: number | undefined) {\n if (this._serviceID !== value) {\n this._serviceID = value;\n this.refresh();\n }\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.configs.hideColumnHeaders = true;\n this.configs.showMessageOnEmpty = false;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public getData(params: IListParameters): Observable<IOperationsHistoryList[]> {\n this.configs.showMessageOnEmpty = !!this._serviceID;\n\n return !!this.parentEntityId && !!this.controllerName && !!this._serviceID\n ? this.operationsHistoryService.list(this.controllerName, this.parentEntityId, this._serviceID, params)\n : of<IOperationsHistoryList[]>([]);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { inject, Injectable } from '@angular/core';\nimport { DataGridDataset, IGridColumn, IListParameters } from '@zambon-dev/library';\nimport { Observable, of } from 'rxjs';\nimport { IServicesHistoryList } from '../models';\nimport { ServicesHistoryService } from '../services';\n\n@Injectable()\nexport class ServicesHistoryDataset extends DataGridDataset {\n //#region ViewChilds, Inputs, Outputs\n //#endregion\n\n //#region Variables\n public override columns: IGridColumn[] = [\n { field: '', headerName: '' },\n ];\n\n public controllerName?: string;\n\n protected servicesHistoryService: ServicesHistoryService = inject(ServicesHistoryService);\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n this.configs.hideColumnHeaders = true;\n this.configs.rowHeight = 52;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public getData(params: IListParameters): Observable<IServicesHistoryList[]> {\n return !!this.parentEntityId && !!this.controllerName\n ? this.servicesHistoryService.list(this.controllerName, this.parentEntityId, params)\n : of<IServicesHistoryList[]>([]);\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","import { JsonPipe } from '@angular/common';\nimport { Component, Input, ViewChild } from '@angular/core';\nimport { ModalBase } from '@zambon-dev/framework';\nimport { ModalComponent } from '@zambon-dev/library';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'shared-operations-history-modal',\n templateUrl: './operations-history-modal.component.html',\n styleUrls: ['./operations-history-modal.component.scss'],\n imports: [\n JsonPipe,\n ModalComponent,\n TranslatePipe,\n ],\n})\nexport class OperationsHistoryModalComponent extends ModalBase {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild(ModalComponent) private modal!: ModalComponent;\n\n @Input() public newValues?: string;\n\n @Input() public oldValues?: string;\n //#endregion\n\n //#region Variables\n //#endregion\n\n //#region Properties\n public get isModalShown(): boolean {\n return this.modal.isShown;\n }\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public toggle(): void {\n this.modal.toggleModal();\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<lib-modal size=\"6xl\" [title]=\"'OperationsHistory-Modal-Title' | translate\">\n <div body>\n <pre>{{ oldValues | json }}</pre>\n <pre>{{ newValues | json }}</pre>\n </div>\n</lib-modal>","import { AfterViewInit, Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport { ChildList } from '@zambon-dev/framework';\nimport { DataGridComponent, DataGridDataset } from '@zambon-dev/library';\nimport { OperationsHistoryDataset } from '../../../datasets';\nimport { IOperationsHistoryList } from '../../../models';\nimport { OperationsHistoryModalComponent } from '../operations-history-modal/operations-history-modal.component';\n\n@Component({\n selector: 'shared-operations-history-child-list',\n templateUrl: './operations-history-child-list.component.html',\n styleUrls: ['./operations-history-child-list.component.scss'],\n imports: [\n DataGridComponent,\n OperationsHistoryModalComponent,\n ],\n providers: [{ provide: DataGridDataset, useClass: OperationsHistoryDataset }]\n})\nexport class OperationsHistoryChildListComponent extends ChildList<any> implements AfterViewInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild(OperationsHistoryModalComponent) private modal!: OperationsHistoryModalComponent;\n @ViewChild('operationTemplate') private operationTemplate!: TemplateRef<any>;\n\n @Input() public set controllerName(value: string) {\n (<OperationsHistoryDataset>this.dataGridDataset).controllerName = value;\n }\n\n @Input() public set serviceID(value: number | undefined) {\n (<OperationsHistoryDataset>this.dataGridDataset).serviceId = value;\n }\n //#endregion\n\n //#region Variables\n public selectedNewValues: any | null = null;\n public selectedOldValues: any | null = null;\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngAfterViewInit(): void {\n this.dataGridDataset.columns[0].template = this.operationTemplate;\n }\n //#endregion\n\n //#region Event handlers\n public openModal(): void {\n if (!this.modal.isModalShown) {\n this.modal.toggle();\n }\n }\n //#endregion\n\n //#region Public methods\n public override selectedRowChanged(): void {\n super.selectedRowChanged();\n\n if (this.dataGridDataset.hasSelectedRows) {\n const key: string = this.dataGridDataset.selectedRowKeys[0];\n \n const data: IOperationsHistoryList = this.dataGridDataset.getRowData(key);\n this.selectedOldValues = JSON.parse(data.oldValues?.trim() ?? '');\n this.selectedNewValues = JSON.parse(data.newValues?.trim() ?? '');\n }\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<lib-data-grid [lazyLoadRows]=\"true\">\n</lib-data-grid>\n\n<ng-template #operationTemplate let-rowData=\"rowData\">\n <div class=\"operation-content\" (click)=\"openModal()\">\n <span class=\"operation\"\n [class.added]=\"rowData.operationType === 'Added'\"\n [class.deleted]=\"rowData.operationType === 'Deleted'\"\n [class.modified]=\"rowData.operationType === 'Modified'\"\n [class.unchanged]=\"rowData.operationType === 'Unchanged'\">\n {{ rowData.operationType }}\n </span>\n {{ rowData.entityName }}\n </div>\n</ng-template>\n\n<shared-operations-history-modal\n[newValues]=\"selectedNewValues\"\n[oldValues]=\"selectedOldValues\">\n</shared-operations-history-modal>","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * Pipe that bypasses Angular's built-in HTML sanitization.\n *\n * **WARNING: This pipe introduces XSS (Cross-Site Scripting) risk.**\n * It marks the provided HTML string as trusted, meaning Angular will\n * render it without any sanitization. Malicious content such as\n * `<script>` tags, inline event handlers (`onerror`, `onclick`, etc.),\n * and `javascript:` URLs will be executed in the user's browser.\n *\n * ### Safe usage\n * - Server-rendered HTML from **trusted, internal APIs** that never\n * include user-generated content (e.g., admin-authored rich text\n * that is sanitized server-side before storage).\n * - Static HTML snippets defined in application code.\n *\n * ### Unsafe usage (DO NOT use for these)\n * - Any value that originates from user input (form fields, query\n * params, URL fragments, file uploads).\n * - Third-party API responses whose content you do not control.\n * - Database fields that may contain unsanitized user submissions.\n *\n * @example\n * // Safe — trusted server content\n * <div [innerHTML]=\"trustedServerHtml | bypassHtmlSanitizer\"></div>\n *\n * // UNSAFE — user-provided content (use Angular’s default sanitization instead)\n * <div [innerHTML]=\"comment.body | bypassHtmlSanitizer\"></div> // ❌ XSS risk\n * <div [innerHTML]=\"comment.body\"></div> // ✅ Angular sanitizes automatically\n */\n@Pipe({\n name: 'bypassHtmlSanitizer'\n})\nexport class BypassHtmlSanitizerPipe implements PipeTransform {\n private sanitizer: DomSanitizer = inject(DomSanitizer);\n\n public transform(html: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'enumLabel'\n})\nexport class EnumLabelPipe implements PipeTransform {\n public transform(value?: number, enumType?: any): string {\n if (value === undefined || enumType === undefined) {\n return '';\n }\n\n const keys: string[] = Object.keys(enumType).filter((key: string) => !isNaN(Number(enumType[key])));\n const values: number[] = keys.map((key: string) => enumType[key]);\n\n const index: number = values.indexOf(value);\n if (index >= 0) {\n return keys[index];\n }\n return '';\n }\n}","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'utcDate'\n})\nexport class UtcDatePipe implements PipeTransform {\n transform(value?: Date): Date | null {\n if (!value) {\n return null;\n }\n\n const newDate: Date = new Date(value);\n\n let utcHour: number = newDate.getUTCHours();\n if (utcHour < newDate.getHours()) {\n utcHour += 24;\n }\n\n newDate.setHours(\n newDate.getHours() + newDate.getHours() - utcHour,\n newDate.getMinutes(),\n newDate.getSeconds()\n );\n\n return newDate;\n }\n}","import { DatePipe } from '@angular/common';\nimport { AfterViewInit, Component, Input, TemplateRef, ViewChild } from '@angular/core';\nimport { ChildList } from '@zambon-dev/framework';\nimport { DataGridComponent, DataGridDataset } from '@zambon-dev/library';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ServicesHistoryDataset } from '../../../datasets';\nimport { UtcDatePipe } from '../../../pipes';\n\n@Component({\n selector: 'shared-services-history-child-list',\n templateUrl: './services-history-child-list.component.html',\n styleUrls: ['./services-history-child-list.component.scss'],\n imports: [\n DataGridComponent,\n DatePipe,\n UtcDatePipe,\n TranslatePipe,\n ],\n providers: [{ provide: DataGridDataset, useClass: ServicesHistoryDataset }]\n})\nexport class ServicesHistoryChildListComponent extends ChildList<any> implements AfterViewInit {\n //#region ViewChilds, Inputs, Outputs\n @ViewChild('serviceTemplate') private serviceTemplate!: TemplateRef<any>;\n\n @Input() public set controllerName(value: string) {\n (<ServicesHistoryDataset>this.dataGridDataset).controllerName = value;\n } \n //#endregion\n\n //#region Variables\n public selectedServiceID?: number;\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n public ngAfterViewInit(): void {\n this.dataGridDataset.columns[0].template = this.serviceTemplate;\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n public override selectedRowChanged(): void {\n super.selectedRowChanged();\n\n if (this.dataGridDataset.hasSelectedRows) {\n const selectedKey: string = this.dataGridDataset.selectedRowKeys[0];;\n this.selectedServiceID = this.dataGridDataset.getRowID(selectedKey);\n }\n }\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<lib-data-grid [lazyLoadRows]=\"true\">\n</lib-data-grid>\n\n<ng-template #serviceTemplate let-rowData=\"rowData\">\n <div class=\"service-content\">\n <div class=\"icon\">\n <i class=\"fa-solid fa-circle fa-lg\"></i>\n </div>\n <div class=\"information\">\n <div class=\"service-name\">\n {{ rowData.name }}\n </div>\n <div class=\"details\">\n <span class=\"datetime\"><i class=\"fa-solid fa-clock\"></i> {{ rowData.changedOn | utcDate | date: ('Format-DateTime' | translate) }}</span>\n <span class=\"user\"><i class=\"fa-solid fa-user\"></i> {{ rowData.changedByName }}</span>\n </div>\n </div>\n </div>\n</ng-template>","import { Component, inject, Input } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { ViewBase } from '@zambon-dev/framework';\nimport { DataProviderService } from '@zambon-dev/library';\nimport { take } from 'rxjs';\nimport { OperationsHistoryChildListComponent } from '../../operations-history';\nimport { ServicesHistoryChildListComponent } from '../services-history-child-list/services-history-child-list.component';\n\n@Component({\n selector: 'shared-services-history-view',\n templateUrl: './services-history-view.component.html',\n styleUrls: ['./services-history-view.component.scss'],\n imports: [\n OperationsHistoryChildListComponent,\n ServicesHistoryChildListComponent,\n ]\n})\nexport class ServicesHistoryViewComponent extends ViewBase {\n //#region ViewChilds, Inputs, Outputs\n @Input({ required: true }) public controllerName!: string;\n\n @Input() public entityID?: number;\n //#endregion\n\n //#region Variables\n private activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n private dataProviderService: DataProviderService<any> | null = inject(DataProviderService, { optional: true });\n //#endregion\n\n //#region Properties\n //#endregion\n\n //#region Constructor and Angular life cycle methods\n constructor() {\n super();\n\n if (this.activatedRoute.snapshot.data['controllerName']) {\n this.controllerName = this.activatedRoute.snapshot.data['controllerName'];\n }\n\n if (this.dataProviderService) {\n this.dataProviderService.getModel$()\n .pipe(take(1))\n .subscribe((model: any) => {\n this.entityID = model.id;\n });\n }\n }\n //#endregion\n\n //#region Event handlers\n //#endregion\n\n //#region Public methods\n //#endregion\n\n //#region Private methods\n //#endregion\n}","<div class=\"history-container\">\n <div class=\"service-history-container\">\n <shared-services-history-child-list #service\n [controllerName]=\"controllerName\">\n </shared-services-history-child-list>\n </div>\n\n <div class=\"operations-history-container\">\n <shared-operations-history-child-list\n [controllerName]=\"controllerName\"\n [serviceID]=\"service.selectedServiceID\">\n </shared-operations-history-child-list>\n </div>\n</div>","import { HttpBackend } from '@angular/common/http';\nimport { EnvironmentProviders, Provider } from '@angular/core';\nimport { provideTranslateService, TranslateLoader } from '@ngx-translate/core';\nimport { MultiTranslateHttpLoader, TranslationResource } from 'ngx-translate-multi-http-loader';\n\nexport interface AngularAssetPattern {\n glob: string;\n input: string;\n output: string;\n}\n\nexport const ZAMBON_SHARED_I18N_ASSET_PATH = 'assets/i18n/zambon-dev/shared';\n\nexport const ZAMBON_SHARED_I18N_ASSET: AngularAssetPattern = {\n glob: '**/*.json',\n input: 'node_modules/@zambon-dev/shared/i18n',\n output: ZAMBON_SHARED_I18N_ASSET_PATH,\n};\n\nexport const ZAMBON_SHARED_I18N_RESOURCES: TranslationResource[] = [\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/language-selector/`, suffix: '.json' },\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/login/`, suffix: '.json' },\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/operations-history/`, suffix: '.json' },\n { prefix: `/${ZAMBON_SHARED_I18N_ASSET_PATH}/top-bar/`, suffix: '.json' },\n];\n\nexport interface ZambonSharedTranslateConfig {\n defaultLanguage?: string;\n appResources?: (string | TranslationResource)[];\n}\n\nexport function createZambonSharedTranslateLoader(\n httpBackend: HttpBackend,\n appResources: (string | TranslationResource)[] = [],\n): MultiTranslateHttpLoader {\n return new MultiTranslateHttpLoader(httpBackend, [\n ...ZAMBON_SHARED_I18N_RESOURCES,\n ...appResources,\n ]);\n}\n\nexport function provideZambonSharedTranslateLoader(\n appResources: (string | TranslationResource)[] = [],\n): Provider {\n return {\n provide: TranslateLoader,\n useFactory: (httpBackend: HttpBackend) => createZambonSharedTranslateLoader(httpBackend, appResources),\n deps: [HttpBackend],\n };\n}\n\nexport function provideZambonSharedTranslateService(\n config: ZambonSharedTranslateConfig = {},\n): EnvironmentProviders {\n return provideTranslateService({\n defaultLanguage: config.defaultLanguage,\n loader: provideZambonSharedTranslateLoader(config.appResources),\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  export interface IOperationsHistoryList {
2
- entityId?: number;
2
+ /** Capitalised `ID` is intentional: the backend property is `EntityID`, and the camelCase
3
+ * serialization policy only lowercases a leading run of capitals — so the trailing ones survive. */
4
+ entityID?: number;
3
5
  entityName?: string;
4
- ID: number;
6
+ id: number;
5
7
  newValues?: string;
6
8
  oldValues?: string;
7
9
  operationType?: string;
@@ -1,6 +1,6 @@
1
1
  export interface IServicesHistoryList {
2
2
  changedByName: string;
3
3
  changedOn: Date;
4
- ID: number;
4
+ id: number;
5
5
  name: string;
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zambon-dev/shared",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "Shared Angular services, utilities, and styles for Zambon applications.",
5
5
  "keywords": [
6
6
  "angular",