@cccteam/ccc-lib 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Binary file
Binary file
@@ -120,10 +120,10 @@ class AuthService {
120
120
  loginRoute() {
121
121
  return routes.login(this.apiUrl);
122
122
  }
123
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthService, deps: [{ token: i1.HttpClient }, { token: API_URL }], target: i0.ɵɵFactoryTarget.Injectable });
124
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthService, providedIn: 'root' });
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AuthService, deps: [{ token: i1.HttpClient }, { token: API_URL }], target: i0.ɵɵFactoryTarget.Injectable });
124
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AuthService, providedIn: 'root' });
125
125
  }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthService, decorators: [{
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AuthService, decorators: [{
127
127
  type: Injectable,
128
128
  args: [{
129
129
  providedIn: 'root',
@@ -254,8 +254,8 @@ let AuthState = class AuthState {
254
254
  }));
255
255
  return ctx.getState();
256
256
  }
257
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
258
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthState });
257
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AuthState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
258
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AuthState });
259
259
  };
260
260
  __decorate([
261
261
  Action([AppAction.CheckUserSession, AuthenticationGuardAction.CheckUserSession])
@@ -286,7 +286,7 @@ AuthState = AuthState_1 = __decorate([
286
286
  defaults: initState$1,
287
287
  })
288
288
  ], AuthState);
289
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AuthState, decorators: [{
289
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AuthState, decorators: [{
290
290
  type: Injectable
291
291
  }], ctorParameters: () => [], propDecorators: { checkUserSession: [], logout: [], setRedirectUrl: [] } });
292
292
 
@@ -315,10 +315,10 @@ class HasPermissionDirective {
315
315
  }
316
316
  });
317
317
  }
318
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: HasPermissionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
319
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: HasPermissionDirective, isStandalone: true, selector: "[cccHasPermission]", inputs: { cccHasPermission: "cccHasPermission" }, ngImport: i0 });
318
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: HasPermissionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
319
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.3", type: HasPermissionDirective, isStandalone: true, selector: "[cccHasPermission]", inputs: { cccHasPermission: "cccHasPermission" }, ngImport: i0 });
320
320
  }
321
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: HasPermissionDirective, decorators: [{
321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: HasPermissionDirective, decorators: [{
322
322
  type: Directive,
323
323
  args: [{
324
324
  selector: '[cccHasPermission]',
@@ -381,17 +381,17 @@ class CccInputFieldComponent {
381
381
  return false;
382
382
  });
383
383
  }
384
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CccInputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
385
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.7", type: CccInputFieldComponent, isStandalone: true, selector: "ccc-input-field", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null }, domain: { classPropertyName: "domain", publicName: "domain", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
384
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: CccInputFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
385
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.3", type: CccInputFieldComponent, isStandalone: true, selector: "ccc-input-field", inputs: { className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null }, domain: { classPropertyName: "domain", publicName: "domain", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
386
386
  <mat-form-field [class]="className()">
387
387
  <mat-label>{{ name() }}</mat-label>
388
388
  <input matInput [disabled]="mode() === inputMode.Edit && canEdit()" [value]="value()" />
389
389
  </mat-form-field>
390
- `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }] });
390
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }] });
391
391
  }
392
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CccInputFieldComponent, decorators: [{
392
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: CccInputFieldComponent, decorators: [{
393
393
  type: Component,
394
- args: [{ selector: 'ccc-input-field', standalone: true, imports: [MatFormFieldModule, MatInputModule], template: `
394
+ args: [{ selector: 'ccc-input-field', imports: [MatFormFieldModule, MatInputModule], template: `
395
395
  <mat-form-field [class]="className()">
396
396
  <mat-label>{{ name() }}</mat-label>
397
397
  <input matInput [disabled]="mode() === inputMode.Edit && canEdit()" [value]="value()" />
@@ -519,10 +519,10 @@ class NotificationService {
519
519
  updateNotification(updatedNotification) {
520
520
  this._notifications.update((current) => current.map((notification) => notification.id === updatedNotification.id ? { ...notification, ...updatedNotification } : notification));
521
521
  }
522
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
523
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, providedIn: 'root' });
522
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: NotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
523
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: NotificationService, providedIn: 'root' });
524
524
  }
525
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: NotificationService, decorators: [{
525
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: NotificationService, decorators: [{
526
526
  type: Injectable,
527
527
  args: [{
528
528
  providedIn: 'root',
@@ -546,12 +546,12 @@ class AlertComponent {
546
546
  this.errors.dismissGlobalNotification(this.error);
547
547
  }
548
548
  }
549
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
550
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: AlertComponent, isStandalone: true, selector: "ccc-alert", inputs: { error: "error" }, outputs: { dismiss: "dismiss" }, ngImport: i0, template: "<div class=\"alert\" [ngClass]=\"error.level\">\n <div class=\"message\">\n <span>{{ error.message }}</span>\n </div>\n <div class=\"alert-end\">\n @if (error.link) {\n <span [routerLink]=\"error.link\" class=\"link\">View</span>\n }\n <button (click)=\"dismissAlert()\" mat-icon-button aria-label=\"Close Alert\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".alert{margin:auto;border:1px solid;max-width:450px;border-radius:5px;background-color:#d3d3d3;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.message{padding-left:15px;max-width:400px;display:flex;justify-content:space-between}.alert-end{display:flex;flex-direction:row;align-items:center;gap:5px}.link{cursor:pointer}.link:hover{text-decoration:underline}.warn{border-color:red;background-color:#fff5f4}.accent{border-color:#dfb51d;background-color:#fff8e0}.success{border-color:#4caf50;background-color:#f0fff0}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
549
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
550
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AlertComponent, isStandalone: true, selector: "ccc-alert", inputs: { error: "error" }, outputs: { dismiss: "dismiss" }, ngImport: i0, template: "<div class=\"alert\" [ngClass]=\"error.level\">\n <div class=\"message\">\n <span>{{ error.message }}</span>\n </div>\n <div class=\"alert-end\">\n @if (error.link) {\n <span [routerLink]=\"error.link\" class=\"link\">View</span>\n }\n <button (click)=\"dismissAlert()\" mat-icon-button aria-label=\"Close Alert\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".alert{margin:auto;border:1px solid;max-width:450px;border-radius:5px;background-color:#d3d3d3;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.message{padding-left:15px;max-width:400px;display:flex;justify-content:space-between}.alert-end{display:flex;flex-direction:row;align-items:center;gap:5px}.link{cursor:pointer}.link:hover{text-decoration:underline}.warn{border-color:red;background-color:#fff5f4}.accent{border-color:#dfb51d;background-color:#fff8e0}.success{border-color:#4caf50;background-color:#f0fff0}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
551
551
  }
552
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AlertComponent, decorators: [{
552
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AlertComponent, decorators: [{
553
553
  type: Component,
554
- args: [{ selector: 'ccc-alert', standalone: true, imports: [MatIconModule, MatButtonModule, CommonModule, RouterModule], template: "<div class=\"alert\" [ngClass]=\"error.level\">\n <div class=\"message\">\n <span>{{ error.message }}</span>\n </div>\n <div class=\"alert-end\">\n @if (error.link) {\n <span [routerLink]=\"error.link\" class=\"link\">View</span>\n }\n <button (click)=\"dismissAlert()\" mat-icon-button aria-label=\"Close Alert\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".alert{margin:auto;border:1px solid;max-width:450px;border-radius:5px;background-color:#d3d3d3;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.message{padding-left:15px;max-width:400px;display:flex;justify-content:space-between}.alert-end{display:flex;flex-direction:row;align-items:center;gap:5px}.link{cursor:pointer}.link:hover{text-decoration:underline}.warn{border-color:red;background-color:#fff5f4}.accent{border-color:#dfb51d;background-color:#fff8e0}.success{border-color:#4caf50;background-color:#f0fff0}\n"] }]
554
+ args: [{ selector: 'ccc-alert', imports: [MatIconModule, MatButtonModule, CommonModule, RouterModule], template: "<div class=\"alert\" [ngClass]=\"error.level\">\n <div class=\"message\">\n <span>{{ error.message }}</span>\n </div>\n <div class=\"alert-end\">\n @if (error.link) {\n <span [routerLink]=\"error.link\" class=\"link\">View</span>\n }\n <button (click)=\"dismissAlert()\" mat-icon-button aria-label=\"Close Alert\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".alert{margin:auto;border:1px solid;max-width:450px;border-radius:5px;background-color:#d3d3d3;display:flex;flex-direction:row;align-items:center;justify-content:space-between}.message{padding-left:15px;max-width:400px;display:flex;justify-content:space-between}.alert-end{display:flex;flex-direction:row;align-items:center;gap:5px}.link{cursor:pointer}.link:hover{text-decoration:underline}.warn{border-color:red;background-color:#fff5f4}.accent{border-color:#dfb51d;background-color:#fff8e0}.success{border-color:#4caf50;background-color:#f0fff0}\n"] }]
555
555
  }], propDecorators: { error: [{
556
556
  type: Input,
557
557
  args: [{ required: true }]
@@ -608,8 +608,8 @@ let CoreState = class CoreState {
608
608
  sidenavOpened: !ctx.getState().sidenavOpened,
609
609
  }));
610
610
  }
611
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CoreState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
612
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CoreState });
611
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: CoreState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
612
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: CoreState });
613
613
  };
614
614
  __decorate([
615
615
  Action([AppAction.SetNavIdentifier])
@@ -641,7 +641,7 @@ CoreState = __decorate([
641
641
  defaults: initState,
642
642
  })
643
643
  ], CoreState);
644
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CoreState, decorators: [{
644
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: CoreState, decorators: [{
645
645
  type: Injectable
646
646
  }], propDecorators: { setNavIdentifier: [], publishError: [], beginActivity: [], endActivity: [], toggleSidenav: [] } });
647
647
 
@@ -674,12 +674,12 @@ class SidenavComponent {
674
674
  }
675
675
  return this.navGroups[identifier];
676
676
  }
677
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: SidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
678
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: SidenavComponent, isStandalone: true, selector: "ccc-sidenav", inputs: { navGroups: "navGroups" }, ngImport: i0, template: "<div class=\"nav-container\">\n <nav>\n @for (navItem of currentNav; track navItem.label) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItem }\"></ng-container>\n }\n </nav>\n</div>\n<ng-template #typeRendererTemplate let-navItem=\"navItem\">\n @switch (navItem.type) {\n @case ('header') {\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('link') {\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('expandable') {\n <ng-container\n [ngTemplateOutlet]=\"expandableTemplate\"\n [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n }\n</ng-template>\n<ng-template #headerTemplate let-navItem=\"navItem\">\n <div class=\"link-header\">{{ navItem.label }}</div>\n</ng-template>\n<ng-template #linkTemplate let-navItem=\"navItem\">\n <a [routerLink]=\"navItem.routerLink\" *cccHasPermission=\"navItem.permission\">\n <div class=\"nav-item\" routerLinkActive=\"active-link\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.icon }}\n </mat-icon>\n </div>\n <div class=\"text\">\n {{ navItem.label | titlecase }}\n </div>\n </div>\n </div>\n </a>\n</ng-template>\n<ng-template #expandableTemplate let-navItem=\"navItem\">\n <div class=\"nav-item\" aria-hidden=\"true\" (click)=\"navItem.isExpanded = !navItem.isExpanded\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.isExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n <div class=\"text\">{{ navItem.label }}</div>\n </div>\n </div>\n @if (navItem.isExpanded) {\n <div class=\"expandable-links\">\n @for (navItemChild of navItem.children; track navItemChild) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItemChild }\"> </ng-container>\n }\n </div>\n }\n</ng-template>\n", styles: [".nav-container{padding:0;height:100%}nav{max-width:100%;margin:0 10px}.nav-item{width:100%;height:48px;font-size:18px;display:flex;flex-direction:column;justify-content:center;color:#003b49;padding:0 15px;position:relative}.nav-item:hover{background-color:#0000000a;transition:background-color .1s ease}.nav-item:active{background-color:#0000001a;transition:background-color .1s ease}.link-header{color:#003b49;text-transform:uppercase;font-weight:700;font-size:12px;margin:20px 0 0 5px}.link-button{display:flex;flex-direction:row;width:100%}.link-button .icon{min-width:20px;margin-right:10px;display:flex;flex-direction:column;justify-content:center}.link-button .text{margin-right:10px;text-align:left;display:flex;flex-direction:row;justify-content:left;text-decoration:capitalize}.expandable-links{display:flex;flex-direction:column;width:100%;padding-left:30px}a:active,a:link,a:visited{color:#003b49!important}a{text-decoration:none}.active-link:before{content:\"\";position:absolute;left:3px;width:5px;height:38px;background-color:#003b49}.active-link{background-color:#0000000a;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "directive", type: HasPermissionDirective, selector: "[cccHasPermission]", inputs: ["cccHasPermission"] }] });
677
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: SidenavComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
678
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: SidenavComponent, isStandalone: true, selector: "ccc-sidenav", inputs: { navGroups: "navGroups" }, ngImport: i0, template: "<div class=\"nav-container\">\n <nav>\n @for (navItem of currentNav; track navItem.label) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItem }\"></ng-container>\n }\n </nav>\n</div>\n<ng-template #typeRendererTemplate let-navItem=\"navItem\">\n @switch (navItem.type) {\n @case ('header') {\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('link') {\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('expandable') {\n <ng-container\n [ngTemplateOutlet]=\"expandableTemplate\"\n [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n }\n</ng-template>\n<ng-template #headerTemplate let-navItem=\"navItem\">\n <div class=\"link-header\">{{ navItem.label }}</div>\n</ng-template>\n<ng-template #linkTemplate let-navItem=\"navItem\">\n <a [routerLink]=\"navItem.routerLink\" *cccHasPermission=\"navItem.permission\">\n <div class=\"nav-item\" routerLinkActive=\"active-link\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.icon }}\n </mat-icon>\n </div>\n <div class=\"text\">\n {{ navItem.label | titlecase }}\n </div>\n </div>\n </div>\n </a>\n</ng-template>\n<ng-template #expandableTemplate let-navItem=\"navItem\">\n <div class=\"nav-item\" aria-hidden=\"true\" (click)=\"navItem.isExpanded = !navItem.isExpanded\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.isExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n <div class=\"text\">{{ navItem.label }}</div>\n </div>\n </div>\n @if (navItem.isExpanded) {\n <div class=\"expandable-links\">\n @for (navItemChild of navItem.children; track navItemChild) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItemChild }\"> </ng-container>\n }\n </div>\n }\n</ng-template>\n", styles: [".nav-container{padding:0;height:100%}nav{max-width:100%;margin:0 10px}.nav-item{width:100%;height:48px;font-size:18px;display:flex;flex-direction:column;justify-content:center;color:#003b49;padding:0 15px;position:relative}.nav-item:hover{background-color:#0000000a;transition:background-color .1s ease}.nav-item:active{background-color:#0000001a;transition:background-color .1s ease}.link-header{color:#003b49;text-transform:uppercase;font-weight:700;font-size:12px;margin:20px 0 0 5px}.link-button{display:flex;flex-direction:row;width:100%}.link-button .icon{min-width:20px;margin-right:10px;display:flex;flex-direction:column;justify-content:center}.link-button .text{margin-right:10px;text-align:left;display:flex;flex-direction:row;justify-content:left;text-decoration:capitalize}.expandable-links{display:flex;flex-direction:column;width:100%;padding-left:30px}a:active,a:link,a:visited{color:#003b49!important}a{text-decoration:none}.active-link:before{content:\"\";position:absolute;left:3px;width:5px;height:38px;background-color:#003b49}.active-link{background-color:#0000000a;position:relative}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i3.TitleCasePipe, name: "titlecase" }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatSidenavModule }, { kind: "directive", type: HasPermissionDirective, selector: "[cccHasPermission]", inputs: ["cccHasPermission"] }] });
679
679
  }
680
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: SidenavComponent, decorators: [{
680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: SidenavComponent, decorators: [{
681
681
  type: Component,
682
- args: [{ selector: 'ccc-sidenav', standalone: true, imports: [
682
+ args: [{ selector: 'ccc-sidenav', imports: [
683
683
  MatIconModule,
684
684
  RouterModule,
685
685
  CommonModule,
@@ -719,10 +719,10 @@ class ApiInterceptor {
719
719
  this.store.dispatch(new ApiInterceptorAction.EndActivity(request.method + ' ' + request.url));
720
720
  }));
721
721
  }
722
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ApiInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
723
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ApiInterceptor });
722
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: ApiInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
723
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: ApiInterceptor });
724
724
  }
725
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ApiInterceptor, decorators: [{
725
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: ApiInterceptor, decorators: [{
726
726
  type: Injectable
727
727
  }] });
728
728
 
@@ -1 +1 @@
1
- {"version":3,"file":"cccteam-ccc-lib.mjs","sources":["../../../projects/ccc-lib/src/lib/types/base/tokens.ts","../../../projects/ccc-lib/src/lib/ui/state/core.actions.ts","../../../projects/ccc-lib/src/lib/auth/services/request-options.ts","../../../projects/ccc-lib/src/lib/auth/services/auth.service.ts","../../../projects/ccc-lib/src/lib/auth/state/auth.actions.ts","../../../projects/ccc-lib/src/lib/auth/state/auth.state.ts","../../../projects/ccc-lib/src/lib/auth/directives/has-permission.directive.ts","../../../projects/ccc-lib/src/lib/types/permissions.ts","../../../projects/ccc-lib/src/lib/auth/forms/ccc-field/ccc-field.component.ts","../../../projects/ccc-lib/src/lib/auth/forms/form-helpers.ts","../../../projects/ccc-lib/src/lib/auth/guards/authentication.guard.ts","../../../projects/ccc-lib/src/lib/auth/guards/authorization.guard.ts","../../../projects/ccc-lib/src/lib/types/notification-message.ts","../../../projects/ccc-lib/src/lib/ui/services/notification.service.ts","../../../projects/ccc-lib/src/lib/ui/components/alert/alert.component.ts","../../../projects/ccc-lib/src/lib/ui/components/alert/alert.component.html","../../../projects/ccc-lib/src/lib/ui/state/core.state.ts","../../../projects/ccc-lib/src/lib/ui/components/sidenav/sidenav.component.ts","../../../projects/ccc-lib/src/lib/ui/components/sidenav/sidenav.component.html","../../../projects/ccc-lib/src/lib/ui/interceptor/api.interceptor.ts","../../../projects/ccc-lib/src/public-api.ts","../../../projects/ccc-lib/src/cccteam-ccc-lib.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { Domain, Permission, Resource } from '../permissions';\n\nexport const BASE_URL = new InjectionToken<string>('BASE_URL');\nexport const API_URL = new InjectionToken<string>('API_URL');\nexport const PERMISSION_REQUIRED = new InjectionToken<(resource: Resource, permission: Permission) => boolean>(\n 'PERMISSION_REQUIRED',\n);\n\nexport const AVAILABLE_PERMISSIONS = new InjectionToken<{\n Create: Permission;\n Delete: Permission;\n List: Permission;\n Read: Permission;\n Update: Permission;\n}>('AVAILABLE_PERMISSIONS');\nexport const AVAILABLE_DOMAINS = new InjectionToken<Record<string, Domain>[]>('AVAILABLE_DOMAINS');\n","/* eslint-disable @typescript-eslint/no-namespace */\n// no-namespace rule is disabled because action hygiene prevents import pollution\n\nimport { CreateNotificationMessage } from '../../types/notification-message';\n\nexport namespace ApiInterceptorAction {\n export class BeginActivity {\n static readonly type = '[ApiInterceptor] Add Loading Activity';\n constructor(public process: string) {}\n }\n export class EndActivity {\n static readonly type = '[ApiInterceptor] Remove Loading Activity';\n constructor(public process: string) {}\n }\n export class PublishError {\n static readonly type = '[ApiInterceptor] Publish Error';\n constructor(public message: CreateNotificationMessage) {}\n }\n export class SetRedirectUrl {\n static readonly type = '[ApiInterceptor] Set Redirect Url';\n constructor(public redirectUrl: string) {}\n }\n}\n\nexport namespace HeaderAction {\n export class ToggleSidenav {\n static readonly type = '[Header] Toggle Sidenav';\n }\n\n export class Logout {\n static readonly type = '[Header] User Logout';\n }\n}\n","import { HttpContext, HttpContextToken } from '@angular/common/http';\n\nexport interface CustomHttpRequestOptions {\n suppressGlobalError: boolean;\n}\n\nexport const CUSTOM_HTTP_REQUEST_OPTIONS = new HttpContextToken<CustomHttpRequestOptions>(() => ({\n suppressGlobalError: false,\n}));\n\nexport function errorOptions(suppressGlobalError: boolean | undefined): { context: HttpContext } {\n return {\n context: new HttpContext().set(CUSTOM_HTTP_REQUEST_OPTIONS, {\n suppressGlobalError: suppressGlobalError ?? false,\n }),\n };\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport { API_URL } from '../../types/base/tokens';\nimport { SessionInfo } from '../../types/session-info';\nimport { errorOptions } from './request-options';\n\nconst routes = {\n login: (rootUrl: string): string => `${rootUrl}/user/login`,\n session: (rootUrl: string): string => `${rootUrl}/user/session`,\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n constructor(\n private http: HttpClient,\n @Inject(API_URL) private apiUrl: string,\n ) {}\n\n /**\n * Logs a user out.\n *\n * @returns Observable with a boolean indicating whether they were logged out.\n */\n logout(): Observable<boolean> {\n return this.http.delete(routes.session(this.apiUrl), errorOptions(false)).pipe(map(() => true));\n }\n\n /**\n * Checks a user's session with the server.\n *\n * @returns Observable with the user session info\n */\n checkUserSession(): Observable<SessionInfo | null> {\n return this.http.get<SessionInfo>(routes.session(this.apiUrl), errorOptions(false));\n }\n\n loginRoute(): string {\n return routes.login(this.apiUrl);\n }\n}\n","/* eslint-disable @typescript-eslint/no-namespace */\n// no-namespace rule is disabled because action hygiene prevents import pollution\n\nimport { CreateNotificationMessage } from '../../types/notification-message';\n\nexport namespace AuthenticationGuardAction {\n export class SetRedirectUrl {\n static readonly type = '[AuthenticationGuard] Set Redirect Url And Navigate To Login Page';\n constructor(public redirectUrl: string) {}\n }\n\n export class CheckUserSession {\n static readonly type = '[AuthenticationGuard] Check User Session';\n }\n}\n\nexport namespace LoginAction {\n export class Logout {\n static readonly type = '[Login] Auto Logout';\n }\n\n export class SetRedirectUrl {\n static readonly type = '[Login] Set Redirect Url';\n constructor(public redirectUrl: string) {}\n }\n\n export class PublishError {\n static readonly type = '[Login] Publish Error';\n constructor(public message: CreateNotificationMessage) {}\n }\n}\n\nexport namespace AppAction {\n export class CheckUserSession {\n static readonly type = '[App] Check User Session';\n }\n\n export class SetRedirectUrl {\n static readonly type = '[App] Set Redirect Url';\n constructor(public redirectUrl: string) {}\n }\n\n export class SetNavIdentifier {\n static readonly type = '[App] Set Nav Identifier';\n constructor(public identifier: string) {}\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { patch } from '@ngxs/store/operators';\nimport { cloneDeep } from 'lodash-es';\nimport { Observable, tap } from 'rxjs';\nimport { PERMISSION_REQUIRED } from '../../types/base/tokens';\nimport { Permission, PermissionScope, Resource } from '../../types/permissions';\nimport { SessionInfo } from '../../types/session-info';\nimport { ApiInterceptorAction } from '../../ui/state/core.actions';\nimport { AuthService } from '../services/auth.service';\nimport { AppAction, AuthenticationGuardAction, LoginAction } from './auth.actions';\n\nexport interface AuthStateModel {\n authenticated: boolean;\n redirectUrl: string;\n sessionInfo: SessionInfo | null;\n}\n\nexport const initState: AuthStateModel = {\n authenticated: false,\n redirectUrl: '',\n sessionInfo: null,\n};\n\n@State<AuthStateModel>({\n name: 'authState',\n defaults: initState,\n})\n@Injectable()\nexport class AuthState {\n private authService = inject(AuthService);\n private static permissionFn: (resource: Resource, permission: Permission) => boolean;\n\n constructor() {\n AuthState.initializePermissionFn();\n }\n\n private static initializePermissionFn(): void {\n if (!AuthState.permissionFn) {\n AuthState.permissionFn = inject(PERMISSION_REQUIRED);\n }\n }\n\n @Selector()\n static hasPermission(state: AuthStateModel): (scope?: PermissionScope) => boolean {\n return (scope?: PermissionScope) => {\n if (!scope) return true;\n const resourcePermissions = state?.sessionInfo?.permissions?.[scope.domain]?.[scope.resource];\n return Array.isArray(resourcePermissions) && resourcePermissions.includes(scope.permission);\n };\n }\n\n static requiresPermission(resource: Resource, permission: Permission): boolean {\n if (!AuthState.permissionFn) {\n throw new Error(\n `AuthState has not been initialized. Ensure AuthState is provided in your module or instantiated at least once.`,\n );\n }\n return AuthState.permissionFn(resource, permission);\n }\n\n @Selector()\n static isAuthenticated(state: AuthStateModel): boolean {\n return state?.authenticated;\n }\n\n @Selector()\n static redirectUrl(state: AuthStateModel): string {\n return state?.redirectUrl;\n }\n\n @Action([AppAction.CheckUserSession, AuthenticationGuardAction.CheckUserSession])\n checkUserSession(ctx: StateContext<AuthStateModel>): Observable<SessionInfo | null> {\n return this.authService.checkUserSession().pipe(\n tap((result) =>\n ctx.setState(\n patch({\n authenticated: !!result?.authenticated,\n sessionInfo: result,\n }),\n ),\n ),\n );\n }\n\n @Action([LoginAction.Logout])\n logout(ctx: StateContext<AuthStateModel>): Observable<boolean> {\n const localStateCopy = cloneDeep(initState);\n localStateCopy.redirectUrl = ctx.getState().redirectUrl;\n return this.authService.logout().pipe(\n tap(() => {\n ctx.setState(localStateCopy);\n }),\n );\n }\n\n @Action([\n AppAction.SetRedirectUrl,\n LoginAction.SetRedirectUrl,\n AuthenticationGuardAction.SetRedirectUrl,\n ApiInterceptorAction.SetRedirectUrl,\n ])\n setRedirectUrl(ctx: StateContext<AuthStateModel>, action: { redirectUrl: string }): AuthStateModel {\n ctx.setState(\n patch({\n redirectUrl: action.redirectUrl,\n }),\n );\n return ctx.getState();\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Store } from '@ngxs/store';\nimport { Subject, catchError, combineLatest, map, of } from 'rxjs';\nimport { PermissionScope } from '../../types/permissions';\nimport { AuthState } from '../state/auth.state';\n\n@Directive({\n selector: '[cccHasPermission]',\n standalone: true,\n})\nexport class HasPermissionDirective {\n private templateRef = inject(TemplateRef<unknown>);\n private viewContainer = inject(ViewContainerRef);\n private store = inject(Store);\n\n private scope = new Subject<PermissionScope>();\n\n @Input()\n set cccHasPermission(scope: PermissionScope) {\n this.scope.next(scope);\n }\n\n constructor() {\n combineLatest({\n permissionFn: this.store.select(AuthState.hasPermission),\n scope: this.scope.asObservable(),\n })\n .pipe(\n takeUntilDestroyed(),\n map(({ permissionFn, scope }) => (scope !== undefined ? permissionFn(scope) : true)),\n catchError(() => of(false)),\n )\n .subscribe((result) => {\n if (result) {\n if (!this.viewContainer.get(0)) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n }\n } else {\n this.viewContainer.clear();\n }\n });\n }\n}\n","type Brand<K, T> = K & { __brand: T };\n\nexport type Permission = Brand<string, 'Permission'>;\nexport type Resource = Brand<string, 'Resource'>;\nexport type Domain = Brand<string, 'Domain'>;\nexport type DomainPermissions = Record<Domain, Record<Resource, Record<Permission, Permissions>>>;\n\nexport interface PermissionScope {\n resource: Resource;\n permission: Permission;\n domain: Domain;\n}\n\nexport const ReadPermission = 'Read' as Permission;\nexport const UpdatePermission = 'Update' as Permission;\n","import { Component, computed, inject, input, OnInit, signal, Signal } from '@angular/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Store } from '@ngxs/store';\nimport { Domain, ReadPermission, Resource, UpdatePermission } from '../../../types/permissions';\nimport { AuthState } from '../../state/auth.state';\n\nexport enum InputMode {\n Read = 'read',\n Edit = 'edit',\n}\n\n@Component({\n selector: 'ccc-input-field',\n standalone: true,\n imports: [MatFormFieldModule, MatInputModule],\n template: `\n <mat-form-field [class]=\"className()\">\n <mat-label>{{ name() }}</mat-label>\n <input matInput [disabled]=\"mode() === inputMode.Edit && canEdit()\" [value]=\"value()\" />\n </mat-form-field>\n `,\n styleUrl: './ccc-field.component.scss',\n})\nexport class CccInputFieldComponent implements OnInit {\n store = inject(Store);\n className = input();\n mode = input.required<InputMode>();\n resource = input.required<Resource>();\n domain = input.required<Domain>();\n value = input.required();\n name = input.required<string>();\n\n inputMode = InputMode;\n\n canEdit: Signal<boolean> = signal(false);\n canEditSelector = false;\n\n canRead: Signal<boolean> = signal(false);\n canReadSelector = false;\n\n ngOnInit(): void {\n this.canEditSelector = this.store.selectSnapshot(AuthState.hasPermission)({\n resource: this.resource(),\n permission: ReadPermission,\n domain: this.domain(),\n });\n this.canReadSelector = this.store.selectSnapshot(AuthState.hasPermission)({\n resource: this.resource(),\n permission: UpdatePermission,\n domain: this.domain(),\n });\n\n this.canRead = computed(() => {\n const res = this.resource();\n if (!res) {\n return false;\n }\n if (AuthState.requiresPermission(this.resource(), ReadPermission)) {\n return this.canReadSelector;\n }\n return false;\n });\n\n this.canEdit = computed(() => {\n const res = this.resource();\n if (!res) {\n return false;\n }\n if (AuthState.requiresPermission(this.resource(), UpdatePermission)) {\n return this.canEditSelector;\n }\n return false;\n });\n }\n}\n","import { FormArray, FormGroup } from '@angular/forms';\nimport { isEqual } from 'lodash-es';\n\n/**\n * Accepts a FormGroup and compares it to an object to return the dirty form values\n * as a sparse object\n * @param form - FormGroup\n * @param compareData - object to compare form values against\n * @returns Partial<T>\n * @example sparseFormData<UserCreate>(this.userForm, initUser)\n */\nexport function sparseFormData<T>(form: FormGroup, compareData: T): T {\n const sparseFormData: T = {} as T;\n\n for (const [key, control] of Object.entries(form.controls)) {\n const controlValue = control.value;\n const compareValue = compareData[key as keyof T];\n\n if (!isEqual(controlValue, compareValue)) {\n sparseFormData[key as keyof T] = controlValue as T[keyof T];\n }\n }\n\n return sparseFormData;\n}\n\n/**\n * Accepts a FormArray and removes empty strings\n * @param formArray - FormArray\n * @returns FormArray\n */\nexport function cleanStringFormArray(formArray: FormArray): FormArray {\n for (let i = formArray.controls.length - 1; i >= 0; i--) {\n if (formArray.at(i).value === '') {\n formArray.removeAt(i);\n }\n }\n return formArray;\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\nimport { Store } from '@ngxs/store';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { BASE_URL } from '../../types/base/tokens';\nimport { AuthService } from '../services/auth.service';\nimport { AuthenticationGuardAction } from '../state/auth.actions';\nimport { AuthState } from '../state/auth.state';\n\nexport const AuthenticationGuard = (\n route: ActivatedRouteSnapshot,\n routerState: RouterStateSnapshot,\n): Observable<boolean> => {\n const store = inject(Store);\n const authService = inject(AuthService);\n\n const baseUrl = inject(BASE_URL);\n\n const authenticate = (): void => {\n const url = routerState.url;\n const absoluteUrl = baseUrl + (!url.toString().startsWith('/') ? '/' + url : url);\n const encodedUrl = encodeURIComponent(absoluteUrl);\n window.location.href = `${authService.loginRoute()}?returnUrl=${encodedUrl}`;\n };\n\n return store.select(AuthState.isAuthenticated).pipe(\n switchMap((authenticated) => {\n if (authenticated) {\n return of(authenticated);\n }\n // Handle uninitialized state (ie Browser reload)\n return store.dispatch(AuthenticationGuardAction.CheckUserSession).pipe(\n switchMap(() => {\n return store.select(AuthState.isAuthenticated);\n }),\n );\n }),\n map((authenticated) => {\n if (authenticated) {\n return true;\n }\n\n authenticate();\n\n return false;\n }),\n catchError(() => {\n authenticate();\n\n return of(false);\n }),\n );\n};\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { Store } from '@ngxs/store';\nimport { map, Observable } from 'rxjs';\nimport { AuthState } from '../state/auth.state';\n\nexport const AuthorizationGuard = (route: ActivatedRouteSnapshot): Observable<boolean> => {\n const store = inject(Store);\n const router = inject(Router);\n return store.select(AuthState.hasPermission).pipe(\n map((permissionFn) => permissionFn(route.data['scope'])),\n map((hasPermission) => {\n if (hasPermission) {\n return true;\n }\n router.navigate(['/']);\n return false;\n }),\n );\n};\n","export enum AlertLevel {\n ERROR = 'warn',\n INFO = 'accent',\n SUCCESS = 'success',\n}\n\nexport interface CreateNotificationMessage {\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n\nexport interface NotificationMessage {\n id: number;\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n","import { Injectable, signal } from '@angular/core';\nimport { CreateNotificationMessage, NotificationMessage } from '../../types/notification-message';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n private notificationId = 0;\n private _notifications = signal<NotificationMessage[]>([]);\n notifications = this._notifications.asReadonly();\n\n /**\n * Adds a new global notification.\n * @param notification The notification message to add.\n * @returns The unique ID assigned to the notification.\n */\n addGlobalNotification(notification: CreateNotificationMessage): number {\n const newNotification: NotificationMessage = {\n ...notification,\n id: this.notificationId++,\n };\n this._notifications.update((current) => [...current, newNotification]);\n return newNotification.id;\n }\n\n /**\n * Dismisses a global notification by its ID.\n * @param notificationId The ID of the notification to dismiss.\n */\n dismissGlobalNotificationById(notificationId: number): void {\n this._notifications.update((current) => current.filter((notification) => notification.id !== notificationId));\n }\n\n /**\n * Dismisses a specific global notification.\n * @param notification The notification to dismiss.\n */\n dismissGlobalNotification(notification: NotificationMessage): void {\n this.dismissGlobalNotificationById(notification.id);\n }\n\n /**\n * Updates an existing notification.\n * @param updatedNotification The notification with updated information.\n */\n updateNotification(updatedNotification: NotificationMessage): void {\n this._notifications.update((current) =>\n current.map((notification) =>\n notification.id === updatedNotification.id ? { ...notification, ...updatedNotification } : notification,\n ),\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterModule } from '@angular/router';\nimport { NotificationMessage } from '../../../types/notification-message';\nimport { NotificationService } from '../../services/notification.service';\n\n@Component({\n selector: 'ccc-alert',\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.scss'],\n standalone: true,\n imports: [MatIconModule, MatButtonModule, CommonModule, RouterModule],\n})\nexport class AlertComponent implements OnInit {\n @Input({ required: true }) error!: NotificationMessage;\n @Output() dismiss = new EventEmitter();\n\n errors = inject(NotificationService);\n ngOnInit(): void {\n if (this.error.duration === undefined) {\n this.error.duration = 30000;\n }\n\n setTimeout(() => {\n this.dismissAlert();\n }, this.error.duration);\n }\n\n dismissAlert(): void {\n if (this.error.id !== undefined) {\n this.errors.dismissGlobalNotification(this.error);\n }\n }\n}\n","<div class=\"alert\" [ngClass]=\"error.level\">\n <div class=\"message\">\n <span>{{ error.message }}</span>\n </div>\n <div class=\"alert-end\">\n @if (error.link) {\n <span [routerLink]=\"error.link\" class=\"link\">View</span>\n }\n <button (click)=\"dismissAlert()\" mat-icon-button aria-label=\"Close Alert\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { patch } from '@ngxs/store/operators';\nimport { AppAction, LoginAction } from '../../auth/state/auth.actions';\nimport { CreateNotificationMessage } from '../../types/notification-message';\nimport { NotificationService } from '../services/notification.service';\nimport { ApiInterceptorAction, HeaderAction } from './core.actions';\n\ninterface CoreStateModel {\n loading: string[];\n sidenavOpened: boolean;\n currentSidenavIdentifier: string;\n}\n\nconst initState: CoreStateModel = {\n loading: [],\n sidenavOpened: true,\n currentSidenavIdentifier: '',\n};\n\n@State<CoreStateModel>({\n name: 'coreState',\n defaults: initState,\n})\n@Injectable()\nexport class CoreState {\n private notifications = inject(NotificationService);\n\n @Selector()\n static sidenavOpened(state: CoreStateModel): boolean {\n return state?.sidenavOpened;\n }\n\n @Selector()\n static isLoading(state: CoreStateModel): boolean {\n return state.loading.length > 0;\n }\n\n @Selector()\n static currentSidenavIdentifier(state: CoreStateModel): string {\n return state.currentSidenavIdentifier;\n }\n\n @Action([AppAction.SetNavIdentifier])\n setNavIdentifier(ctx: StateContext<CoreStateModel>, action: AppAction.SetNavIdentifier): void {\n ctx.setState(\n patch({\n currentSidenavIdentifier: action.identifier,\n }),\n );\n }\n\n @Action([ApiInterceptorAction.PublishError, LoginAction.PublishError])\n publishError(ctx: StateContext<CoreStateModel>, action: { message: CreateNotificationMessage }): void {\n this.notifications.addGlobalNotification(action.message);\n }\n\n @Action([ApiInterceptorAction.BeginActivity])\n beginActivity(ctx: StateContext<CoreStateModel>, action: { process: string }): CoreStateModel {\n const state = ctx.getState();\n ctx.patchState({\n loading: [action.process, ...state.loading],\n });\n return ctx.getState();\n }\n\n @Action([ApiInterceptorAction.EndActivity])\n endActivity(ctx: StateContext<CoreStateModel>, action: { process: string }): CoreStateModel | null {\n const loading = ctx.getState().loading;\n // There can be multiple activities running with the same process signature\n const index = loading.findIndex((activity) => activity === action.process);\n if (index !== -1) {\n const newLoading = [...loading.slice(0, index), ...loading.slice(index + 1)];\n ctx.patchState({\n loading: newLoading,\n });\n return ctx.getState();\n }\n return null;\n }\n\n @Action([HeaderAction.ToggleSidenav])\n toggleSidenav(ctx: StateContext<CoreStateModel>): void {\n ctx.setState(\n patch({\n sidenavOpened: !ctx.getState().sidenavOpened,\n }),\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, inject, Input, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { RouterModule } from '@angular/router';\nimport { Store } from '@ngxs/store';\n\nimport { Observable, tap } from 'rxjs';\nimport { HasPermissionDirective } from '../../../auth/directives/has-permission.directive';\nimport { PermissionScope } from '../../../types/permissions';\nimport { CoreState } from '../../state/core.state';\n\nexport interface NavItem {\n type: 'link' | 'header' | 'expandable';\n routerLink?: string[];\n label: string;\n icon?: string;\n permission?: PermissionScope;\n children?: NavItem[];\n isExpanded?: boolean;\n attentionCount?: Observable<number>;\n}\n\nexport type NavGroups = Record<string, NavItem[]>;\n\n@Component({\n selector: 'ccc-sidenav',\n templateUrl: './sidenav.component.html',\n styleUrls: ['./sidenav.component.scss'],\n standalone: true,\n imports: [\n MatIconModule,\n RouterModule,\n CommonModule,\n MatExpansionModule,\n MatButtonModule,\n MatSidenavModule,\n HasPermissionDirective,\n ],\n})\nexport class SidenavComponent implements OnInit {\n private store = inject(Store);\n private destroyRef = inject(DestroyRef);\n\n @Input() navGroups?: NavGroups;\n currentNav: NavItem[] = [];\n\n ngOnInit(): void {\n this.store\n .select(CoreState.currentSidenavIdentifier)\n .pipe(\n tap((identifier) => {\n this.currentNav = this.updateNavItems(identifier);\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n /**\n * Updates the currentNav based on the identifier\n * @param identifier\n * @returns NavItem[]\n * @memberof SidenavComponent\n */\n updateNavItems(identifier: string): NavItem[] {\n if (!this.navGroups) {\n return [];\n }\n if (!this.navGroups[identifier]) {\n // pick the first one if the identifier is not found so we don't break the UI\n identifier = Object.keys(this.navGroups)[0];\n }\n return this.navGroups[identifier];\n }\n}\n","<div class=\"nav-container\">\n <nav>\n @for (navItem of currentNav; track navItem.label) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItem }\"></ng-container>\n }\n </nav>\n</div>\n<ng-template #typeRendererTemplate let-navItem=\"navItem\">\n @switch (navItem.type) {\n @case ('header') {\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('link') {\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('expandable') {\n <ng-container\n [ngTemplateOutlet]=\"expandableTemplate\"\n [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n }\n</ng-template>\n<ng-template #headerTemplate let-navItem=\"navItem\">\n <div class=\"link-header\">{{ navItem.label }}</div>\n</ng-template>\n<ng-template #linkTemplate let-navItem=\"navItem\">\n <a [routerLink]=\"navItem.routerLink\" *cccHasPermission=\"navItem.permission\">\n <div class=\"nav-item\" routerLinkActive=\"active-link\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.icon }}\n </mat-icon>\n </div>\n <div class=\"text\">\n {{ navItem.label | titlecase }}\n </div>\n </div>\n </div>\n </a>\n</ng-template>\n<ng-template #expandableTemplate let-navItem=\"navItem\">\n <div class=\"nav-item\" aria-hidden=\"true\" (click)=\"navItem.isExpanded = !navItem.isExpanded\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.isExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n <div class=\"text\">{{ navItem.label }}</div>\n </div>\n </div>\n @if (navItem.isExpanded) {\n <div class=\"expandable-links\">\n @for (navItemChild of navItem.children; track navItemChild) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItemChild }\"> </ng-container>\n }\n </div>\n }\n</ng-template>\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { inject, Injectable, NgZone } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Store } from '@ngxs/store';\nimport { catchError, finalize, Observable, throwError } from 'rxjs';\nimport { CUSTOM_HTTP_REQUEST_OPTIONS } from '../../auth/services/request-options';\nimport { BASE_URL } from '../../types/base/tokens';\nimport { AlertLevel } from '../../types/notification-message';\nimport { ApiInterceptorAction } from '../state/core.actions';\n\n@Injectable()\nexport class ApiInterceptor implements HttpInterceptor {\n private store = inject(Store);\n private router = inject(Router);\n private ngZone = inject(NgZone);\n private baseUrl = inject(BASE_URL);\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n this.store.dispatch(new ApiInterceptorAction.BeginActivity(request.method + ' ' + request.url));\n\n return next.handle(request).pipe(\n catchError((error: HttpErrorResponse): Observable<HttpEvent<unknown>> => {\n if (error.status === 401) {\n this.ngZone.run(() => {\n this.store.dispatch(new ApiInterceptorAction.SetRedirectUrl(this.baseUrl + this.router.url));\n this.router.navigate(['/login']);\n });\n }\n if (!request.context.get(CUSTOM_HTTP_REQUEST_OPTIONS).suppressGlobalError) {\n const message = error.error?.message ?? error.message ?? error.error;\n this.store.dispatch(\n new ApiInterceptorAction.PublishError({\n message: message,\n level: AlertLevel.ERROR,\n link: '',\n }),\n );\n }\n\n return throwError(() => error);\n }),\n finalize(() => {\n this.store.dispatch(new ApiInterceptorAction.EndActivity(request.method + ' ' + request.url));\n }),\n );\n }\n}\n","/*\n * Public API Surface of ccc-lib\n */\n\n// Auth directives\nexport * from './lib/auth/directives/has-permission.directive';\n\n// Auth forms\nexport * from './lib/auth/forms/ccc-field/ccc-field.component';\nexport * from './lib/auth/forms/form-helpers';\n\n// Auth guards\nexport * from './lib/auth/guards/authentication.guard';\nexport * from './lib/auth/guards/authorization.guard';\n\n// Auth services\nexport * from './lib/auth/services/auth.service';\nexport * from './lib/auth/services/request-options';\n\n// Auth state\nexport * from './lib/auth/state/auth.actions';\nexport * from './lib/auth/state/auth.state';\n\n// Types tokens\nexport * from './lib/types/base/tokens';\n\n// Types\nexport * from './lib/types/notification-message';\nexport * from './lib/types/permissions';\nexport * from './lib/types/session-info';\n\n// Ui components\nexport * from './lib/ui/components/alert/alert.component';\nexport * from './lib/ui/components/sidenav/sidenav.component';\n\n// Ui interceptor\nexport * from './lib/ui/interceptor/api.interceptor';\n\n// Ui services\nexport * from './lib/ui/services/notification.service';\n\n// Ui state\nexport * from './lib/ui/state/core.actions';\nexport * from './lib/ui/state/core.state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["initState","map","catchError","i2","i4"],"mappings":"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"}
1
+ {"version":3,"file":"cccteam-ccc-lib.mjs","sources":["../../../projects/ccc-lib/src/lib/types/base/tokens.ts","../../../projects/ccc-lib/src/lib/ui/state/core.actions.ts","../../../projects/ccc-lib/src/lib/auth/services/request-options.ts","../../../projects/ccc-lib/src/lib/auth/services/auth.service.ts","../../../projects/ccc-lib/src/lib/auth/state/auth.actions.ts","../../../projects/ccc-lib/src/lib/auth/state/auth.state.ts","../../../projects/ccc-lib/src/lib/auth/directives/has-permission.directive.ts","../../../projects/ccc-lib/src/lib/types/permissions.ts","../../../projects/ccc-lib/src/lib/auth/forms/ccc-field/ccc-field.component.ts","../../../projects/ccc-lib/src/lib/auth/forms/form-helpers.ts","../../../projects/ccc-lib/src/lib/auth/guards/authentication.guard.ts","../../../projects/ccc-lib/src/lib/auth/guards/authorization.guard.ts","../../../projects/ccc-lib/src/lib/types/notification-message.ts","../../../projects/ccc-lib/src/lib/ui/services/notification.service.ts","../../../projects/ccc-lib/src/lib/ui/components/alert/alert.component.ts","../../../projects/ccc-lib/src/lib/ui/components/alert/alert.component.html","../../../projects/ccc-lib/src/lib/ui/state/core.state.ts","../../../projects/ccc-lib/src/lib/ui/components/sidenav/sidenav.component.ts","../../../projects/ccc-lib/src/lib/ui/components/sidenav/sidenav.component.html","../../../projects/ccc-lib/src/lib/ui/interceptor/api.interceptor.ts","../../../projects/ccc-lib/src/public-api.ts","../../../projects/ccc-lib/src/cccteam-ccc-lib.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { Domain, Permission, Resource } from '../permissions';\n\nexport const BASE_URL = new InjectionToken<string>('BASE_URL');\nexport const API_URL = new InjectionToken<string>('API_URL');\nexport const PERMISSION_REQUIRED = new InjectionToken<(resource: Resource, permission: Permission) => boolean>(\n 'PERMISSION_REQUIRED',\n);\n\nexport const AVAILABLE_PERMISSIONS = new InjectionToken<{\n Create: Permission;\n Delete: Permission;\n List: Permission;\n Read: Permission;\n Update: Permission;\n}>('AVAILABLE_PERMISSIONS');\nexport const AVAILABLE_DOMAINS = new InjectionToken<Record<string, Domain>[]>('AVAILABLE_DOMAINS');\n","/* eslint-disable @typescript-eslint/no-namespace */\n// no-namespace rule is disabled because action hygiene prevents import pollution\n\nimport { CreateNotificationMessage } from '../../types/notification-message';\n\nexport namespace ApiInterceptorAction {\n export class BeginActivity {\n static readonly type = '[ApiInterceptor] Add Loading Activity';\n constructor(public process: string) {}\n }\n export class EndActivity {\n static readonly type = '[ApiInterceptor] Remove Loading Activity';\n constructor(public process: string) {}\n }\n export class PublishError {\n static readonly type = '[ApiInterceptor] Publish Error';\n constructor(public message: CreateNotificationMessage) {}\n }\n export class SetRedirectUrl {\n static readonly type = '[ApiInterceptor] Set Redirect Url';\n constructor(public redirectUrl: string) {}\n }\n}\n\nexport namespace HeaderAction {\n export class ToggleSidenav {\n static readonly type = '[Header] Toggle Sidenav';\n }\n\n export class Logout {\n static readonly type = '[Header] User Logout';\n }\n}\n","import { HttpContext, HttpContextToken } from '@angular/common/http';\n\nexport interface CustomHttpRequestOptions {\n suppressGlobalError: boolean;\n}\n\nexport const CUSTOM_HTTP_REQUEST_OPTIONS = new HttpContextToken<CustomHttpRequestOptions>(() => ({\n suppressGlobalError: false,\n}));\n\nexport function errorOptions(suppressGlobalError: boolean | undefined): { context: HttpContext } {\n return {\n context: new HttpContext().set(CUSTOM_HTTP_REQUEST_OPTIONS, {\n suppressGlobalError: suppressGlobalError ?? false,\n }),\n };\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport { API_URL } from '../../types/base/tokens';\nimport { SessionInfo } from '../../types/session-info';\nimport { errorOptions } from './request-options';\n\nconst routes = {\n login: (rootUrl: string): string => `${rootUrl}/user/login`,\n session: (rootUrl: string): string => `${rootUrl}/user/session`,\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthService {\n constructor(\n private http: HttpClient,\n @Inject(API_URL) private apiUrl: string,\n ) {}\n\n /**\n * Logs a user out.\n *\n * @returns Observable with a boolean indicating whether they were logged out.\n */\n logout(): Observable<boolean> {\n return this.http.delete(routes.session(this.apiUrl), errorOptions(false)).pipe(map(() => true));\n }\n\n /**\n * Checks a user's session with the server.\n *\n * @returns Observable with the user session info\n */\n checkUserSession(): Observable<SessionInfo | null> {\n return this.http.get<SessionInfo>(routes.session(this.apiUrl), errorOptions(false));\n }\n\n loginRoute(): string {\n return routes.login(this.apiUrl);\n }\n}\n","/* eslint-disable @typescript-eslint/no-namespace */\n// no-namespace rule is disabled because action hygiene prevents import pollution\n\nimport { CreateNotificationMessage } from '../../types/notification-message';\n\nexport namespace AuthenticationGuardAction {\n export class SetRedirectUrl {\n static readonly type = '[AuthenticationGuard] Set Redirect Url And Navigate To Login Page';\n constructor(public redirectUrl: string) {}\n }\n\n export class CheckUserSession {\n static readonly type = '[AuthenticationGuard] Check User Session';\n }\n}\n\nexport namespace LoginAction {\n export class Logout {\n static readonly type = '[Login] Auto Logout';\n }\n\n export class SetRedirectUrl {\n static readonly type = '[Login] Set Redirect Url';\n constructor(public redirectUrl: string) {}\n }\n\n export class PublishError {\n static readonly type = '[Login] Publish Error';\n constructor(public message: CreateNotificationMessage) {}\n }\n}\n\nexport namespace AppAction {\n export class CheckUserSession {\n static readonly type = '[App] Check User Session';\n }\n\n export class SetRedirectUrl {\n static readonly type = '[App] Set Redirect Url';\n constructor(public redirectUrl: string) {}\n }\n\n export class SetNavIdentifier {\n static readonly type = '[App] Set Nav Identifier';\n constructor(public identifier: string) {}\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { patch } from '@ngxs/store/operators';\nimport { cloneDeep } from 'lodash-es';\nimport { Observable, tap } from 'rxjs';\nimport { PERMISSION_REQUIRED } from '../../types/base/tokens';\nimport { Permission, PermissionScope, Resource } from '../../types/permissions';\nimport { SessionInfo } from '../../types/session-info';\nimport { ApiInterceptorAction } from '../../ui/state/core.actions';\nimport { AuthService } from '../services/auth.service';\nimport { AppAction, AuthenticationGuardAction, LoginAction } from './auth.actions';\n\nexport interface AuthStateModel {\n authenticated: boolean;\n redirectUrl: string;\n sessionInfo: SessionInfo | null;\n}\n\nexport const initState: AuthStateModel = {\n authenticated: false,\n redirectUrl: '',\n sessionInfo: null,\n};\n\n@State<AuthStateModel>({\n name: 'authState',\n defaults: initState,\n})\n@Injectable()\nexport class AuthState {\n private authService = inject(AuthService);\n private static permissionFn: (resource: Resource, permission: Permission) => boolean;\n\n constructor() {\n AuthState.initializePermissionFn();\n }\n\n private static initializePermissionFn(): void {\n if (!AuthState.permissionFn) {\n AuthState.permissionFn = inject(PERMISSION_REQUIRED);\n }\n }\n\n @Selector()\n static hasPermission(state: AuthStateModel): (scope?: PermissionScope) => boolean {\n return (scope?: PermissionScope) => {\n if (!scope) return true;\n const resourcePermissions = state?.sessionInfo?.permissions?.[scope.domain]?.[scope.resource];\n return Array.isArray(resourcePermissions) && resourcePermissions.includes(scope.permission);\n };\n }\n\n static requiresPermission(resource: Resource, permission: Permission): boolean {\n if (!AuthState.permissionFn) {\n throw new Error(\n `AuthState has not been initialized. Ensure AuthState is provided in your module or instantiated at least once.`,\n );\n }\n return AuthState.permissionFn(resource, permission);\n }\n\n @Selector()\n static isAuthenticated(state: AuthStateModel): boolean {\n return state?.authenticated;\n }\n\n @Selector()\n static redirectUrl(state: AuthStateModel): string {\n return state?.redirectUrl;\n }\n\n @Action([AppAction.CheckUserSession, AuthenticationGuardAction.CheckUserSession])\n checkUserSession(ctx: StateContext<AuthStateModel>): Observable<SessionInfo | null> {\n return this.authService.checkUserSession().pipe(\n tap((result) =>\n ctx.setState(\n patch({\n authenticated: !!result?.authenticated,\n sessionInfo: result,\n }),\n ),\n ),\n );\n }\n\n @Action([LoginAction.Logout])\n logout(ctx: StateContext<AuthStateModel>): Observable<boolean> {\n const localStateCopy = cloneDeep(initState);\n localStateCopy.redirectUrl = ctx.getState().redirectUrl;\n return this.authService.logout().pipe(\n tap(() => {\n ctx.setState(localStateCopy);\n }),\n );\n }\n\n @Action([\n AppAction.SetRedirectUrl,\n LoginAction.SetRedirectUrl,\n AuthenticationGuardAction.SetRedirectUrl,\n ApiInterceptorAction.SetRedirectUrl,\n ])\n setRedirectUrl(ctx: StateContext<AuthStateModel>, action: { redirectUrl: string }): AuthStateModel {\n ctx.setState(\n patch({\n redirectUrl: action.redirectUrl,\n }),\n );\n return ctx.getState();\n }\n}\n","import { Directive, Input, TemplateRef, ViewContainerRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Store } from '@ngxs/store';\nimport { Subject, catchError, combineLatest, map, of } from 'rxjs';\nimport { PermissionScope } from '../../types/permissions';\nimport { AuthState } from '../state/auth.state';\n\n@Directive({\n selector: '[cccHasPermission]',\n standalone: true,\n})\nexport class HasPermissionDirective {\n private templateRef = inject(TemplateRef<unknown>);\n private viewContainer = inject(ViewContainerRef);\n private store = inject(Store);\n\n private scope = new Subject<PermissionScope>();\n\n @Input()\n set cccHasPermission(scope: PermissionScope) {\n this.scope.next(scope);\n }\n\n constructor() {\n combineLatest({\n permissionFn: this.store.select(AuthState.hasPermission),\n scope: this.scope.asObservable(),\n })\n .pipe(\n takeUntilDestroyed(),\n map(({ permissionFn, scope }) => (scope !== undefined ? permissionFn(scope) : true)),\n catchError(() => of(false)),\n )\n .subscribe((result) => {\n if (result) {\n if (!this.viewContainer.get(0)) {\n this.viewContainer.createEmbeddedView(this.templateRef);\n }\n } else {\n this.viewContainer.clear();\n }\n });\n }\n}\n","type Brand<K, T> = K & { __brand: T };\n\nexport type Permission = Brand<string, 'Permission'>;\nexport type Resource = Brand<string, 'Resource'>;\nexport type Domain = Brand<string, 'Domain'>;\nexport type DomainPermissions = Record<Domain, Record<Resource, Record<Permission, Permissions>>>;\n\nexport interface PermissionScope {\n resource: Resource;\n permission: Permission;\n domain: Domain;\n}\n\nexport const ReadPermission = 'Read' as Permission;\nexport const UpdatePermission = 'Update' as Permission;\n","import { Component, computed, inject, input, OnInit, signal, Signal } from '@angular/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { Store } from '@ngxs/store';\nimport { Domain, ReadPermission, Resource, UpdatePermission } from '../../../types/permissions';\nimport { AuthState } from '../../state/auth.state';\n\nexport enum InputMode {\n Read = 'read',\n Edit = 'edit',\n}\n\n@Component({\n selector: 'ccc-input-field',\n imports: [MatFormFieldModule, MatInputModule],\n template: `\n <mat-form-field [class]=\"className()\">\n <mat-label>{{ name() }}</mat-label>\n <input matInput [disabled]=\"mode() === inputMode.Edit && canEdit()\" [value]=\"value()\" />\n </mat-form-field>\n `,\n styleUrl: './ccc-field.component.scss'\n})\nexport class CccInputFieldComponent implements OnInit {\n store = inject(Store);\n className = input();\n mode = input.required<InputMode>();\n resource = input.required<Resource>();\n domain = input.required<Domain>();\n value = input.required();\n name = input.required<string>();\n\n inputMode = InputMode;\n\n canEdit: Signal<boolean> = signal(false);\n canEditSelector = false;\n\n canRead: Signal<boolean> = signal(false);\n canReadSelector = false;\n\n ngOnInit(): void {\n this.canEditSelector = this.store.selectSnapshot(AuthState.hasPermission)({\n resource: this.resource(),\n permission: ReadPermission,\n domain: this.domain(),\n });\n this.canReadSelector = this.store.selectSnapshot(AuthState.hasPermission)({\n resource: this.resource(),\n permission: UpdatePermission,\n domain: this.domain(),\n });\n\n this.canRead = computed(() => {\n const res = this.resource();\n if (!res) {\n return false;\n }\n if (AuthState.requiresPermission(this.resource(), ReadPermission)) {\n return this.canReadSelector;\n }\n return false;\n });\n\n this.canEdit = computed(() => {\n const res = this.resource();\n if (!res) {\n return false;\n }\n if (AuthState.requiresPermission(this.resource(), UpdatePermission)) {\n return this.canEditSelector;\n }\n return false;\n });\n }\n}\n","import { FormArray, FormGroup } from '@angular/forms';\nimport { isEqual } from 'lodash-es';\n\n/**\n * Accepts a FormGroup and compares it to an object to return the dirty form values\n * as a sparse object\n * @param form - FormGroup\n * @param compareData - object to compare form values against\n * @returns Partial<T>\n * @example sparseFormData<UserCreate>(this.userForm, initUser)\n */\nexport function sparseFormData<T>(form: FormGroup, compareData: T): T {\n const sparseFormData: T = {} as T;\n\n for (const [key, control] of Object.entries(form.controls)) {\n const controlValue = control.value;\n const compareValue = compareData[key as keyof T];\n\n if (!isEqual(controlValue, compareValue)) {\n sparseFormData[key as keyof T] = controlValue as T[keyof T];\n }\n }\n\n return sparseFormData;\n}\n\n/**\n * Accepts a FormArray and removes empty strings\n * @param formArray - FormArray\n * @returns FormArray\n */\nexport function cleanStringFormArray(formArray: FormArray): FormArray {\n for (let i = formArray.controls.length - 1; i >= 0; i--) {\n if (formArray.at(i).value === '') {\n formArray.removeAt(i);\n }\n }\n return formArray;\n}\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\nimport { Store } from '@ngxs/store';\nimport { Observable, of } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { BASE_URL } from '../../types/base/tokens';\nimport { AuthService } from '../services/auth.service';\nimport { AuthenticationGuardAction } from '../state/auth.actions';\nimport { AuthState } from '../state/auth.state';\n\nexport const AuthenticationGuard = (\n route: ActivatedRouteSnapshot,\n routerState: RouterStateSnapshot,\n): Observable<boolean> => {\n const store = inject(Store);\n const authService = inject(AuthService);\n\n const baseUrl = inject(BASE_URL);\n\n const authenticate = (): void => {\n const url = routerState.url;\n const absoluteUrl = baseUrl + (!url.toString().startsWith('/') ? '/' + url : url);\n const encodedUrl = encodeURIComponent(absoluteUrl);\n window.location.href = `${authService.loginRoute()}?returnUrl=${encodedUrl}`;\n };\n\n return store.select(AuthState.isAuthenticated).pipe(\n switchMap((authenticated) => {\n if (authenticated) {\n return of(authenticated);\n }\n // Handle uninitialized state (ie Browser reload)\n return store.dispatch(AuthenticationGuardAction.CheckUserSession).pipe(\n switchMap(() => {\n return store.select(AuthState.isAuthenticated);\n }),\n );\n }),\n map((authenticated) => {\n if (authenticated) {\n return true;\n }\n\n authenticate();\n\n return false;\n }),\n catchError(() => {\n authenticate();\n\n return of(false);\n }),\n );\n};\n","import { inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, Router } from '@angular/router';\nimport { Store } from '@ngxs/store';\nimport { map, Observable } from 'rxjs';\nimport { AuthState } from '../state/auth.state';\n\nexport const AuthorizationGuard = (route: ActivatedRouteSnapshot): Observable<boolean> => {\n const store = inject(Store);\n const router = inject(Router);\n return store.select(AuthState.hasPermission).pipe(\n map((permissionFn) => permissionFn(route.data['scope'])),\n map((hasPermission) => {\n if (hasPermission) {\n return true;\n }\n router.navigate(['/']);\n return false;\n }),\n );\n};\n","export enum AlertLevel {\n ERROR = 'warn',\n INFO = 'accent',\n SUCCESS = 'success',\n}\n\nexport interface CreateNotificationMessage {\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n\nexport interface NotificationMessage {\n id: number;\n duration?: number;\n message: string;\n link: string;\n level: AlertLevel;\n}\n","import { Injectable, signal } from '@angular/core';\nimport { CreateNotificationMessage, NotificationMessage } from '../../types/notification-message';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n private notificationId = 0;\n private _notifications = signal<NotificationMessage[]>([]);\n notifications = this._notifications.asReadonly();\n\n /**\n * Adds a new global notification.\n * @param notification The notification message to add.\n * @returns The unique ID assigned to the notification.\n */\n addGlobalNotification(notification: CreateNotificationMessage): number {\n const newNotification: NotificationMessage = {\n ...notification,\n id: this.notificationId++,\n };\n this._notifications.update((current) => [...current, newNotification]);\n return newNotification.id;\n }\n\n /**\n * Dismisses a global notification by its ID.\n * @param notificationId The ID of the notification to dismiss.\n */\n dismissGlobalNotificationById(notificationId: number): void {\n this._notifications.update((current) => current.filter((notification) => notification.id !== notificationId));\n }\n\n /**\n * Dismisses a specific global notification.\n * @param notification The notification to dismiss.\n */\n dismissGlobalNotification(notification: NotificationMessage): void {\n this.dismissGlobalNotificationById(notification.id);\n }\n\n /**\n * Updates an existing notification.\n * @param updatedNotification The notification with updated information.\n */\n updateNotification(updatedNotification: NotificationMessage): void {\n this._notifications.update((current) =>\n current.map((notification) =>\n notification.id === updatedNotification.id ? { ...notification, ...updatedNotification } : notification,\n ),\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterModule } from '@angular/router';\nimport { NotificationMessage } from '../../../types/notification-message';\nimport { NotificationService } from '../../services/notification.service';\n\n@Component({\n selector: 'ccc-alert',\n templateUrl: './alert.component.html',\n styleUrls: ['./alert.component.scss'],\n imports: [MatIconModule, MatButtonModule, CommonModule, RouterModule]\n})\nexport class AlertComponent implements OnInit {\n @Input({ required: true }) error!: NotificationMessage;\n @Output() dismiss = new EventEmitter();\n\n errors = inject(NotificationService);\n ngOnInit(): void {\n if (this.error.duration === undefined) {\n this.error.duration = 30000;\n }\n\n setTimeout(() => {\n this.dismissAlert();\n }, this.error.duration);\n }\n\n dismissAlert(): void {\n if (this.error.id !== undefined) {\n this.errors.dismissGlobalNotification(this.error);\n }\n }\n}\n","<div class=\"alert\" [ngClass]=\"error.level\">\n <div class=\"message\">\n <span>{{ error.message }}</span>\n </div>\n <div class=\"alert-end\">\n @if (error.link) {\n <span [routerLink]=\"error.link\" class=\"link\">View</span>\n }\n <button (click)=\"dismissAlert()\" mat-icon-button aria-label=\"Close Alert\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n</div>\n","import { Injectable, inject } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { patch } from '@ngxs/store/operators';\nimport { AppAction, LoginAction } from '../../auth/state/auth.actions';\nimport { CreateNotificationMessage } from '../../types/notification-message';\nimport { NotificationService } from '../services/notification.service';\nimport { ApiInterceptorAction, HeaderAction } from './core.actions';\n\ninterface CoreStateModel {\n loading: string[];\n sidenavOpened: boolean;\n currentSidenavIdentifier: string;\n}\n\nconst initState: CoreStateModel = {\n loading: [],\n sidenavOpened: true,\n currentSidenavIdentifier: '',\n};\n\n@State<CoreStateModel>({\n name: 'coreState',\n defaults: initState,\n})\n@Injectable()\nexport class CoreState {\n private notifications = inject(NotificationService);\n\n @Selector()\n static sidenavOpened(state: CoreStateModel): boolean {\n return state?.sidenavOpened;\n }\n\n @Selector()\n static isLoading(state: CoreStateModel): boolean {\n return state.loading.length > 0;\n }\n\n @Selector()\n static currentSidenavIdentifier(state: CoreStateModel): string {\n return state.currentSidenavIdentifier;\n }\n\n @Action([AppAction.SetNavIdentifier])\n setNavIdentifier(ctx: StateContext<CoreStateModel>, action: AppAction.SetNavIdentifier): void {\n ctx.setState(\n patch({\n currentSidenavIdentifier: action.identifier,\n }),\n );\n }\n\n @Action([ApiInterceptorAction.PublishError, LoginAction.PublishError])\n publishError(ctx: StateContext<CoreStateModel>, action: { message: CreateNotificationMessage }): void {\n this.notifications.addGlobalNotification(action.message);\n }\n\n @Action([ApiInterceptorAction.BeginActivity])\n beginActivity(ctx: StateContext<CoreStateModel>, action: { process: string }): CoreStateModel {\n const state = ctx.getState();\n ctx.patchState({\n loading: [action.process, ...state.loading],\n });\n return ctx.getState();\n }\n\n @Action([ApiInterceptorAction.EndActivity])\n endActivity(ctx: StateContext<CoreStateModel>, action: { process: string }): CoreStateModel | null {\n const loading = ctx.getState().loading;\n // There can be multiple activities running with the same process signature\n const index = loading.findIndex((activity) => activity === action.process);\n if (index !== -1) {\n const newLoading = [...loading.slice(0, index), ...loading.slice(index + 1)];\n ctx.patchState({\n loading: newLoading,\n });\n return ctx.getState();\n }\n return null;\n }\n\n @Action([HeaderAction.ToggleSidenav])\n toggleSidenav(ctx: StateContext<CoreStateModel>): void {\n ctx.setState(\n patch({\n sidenavOpened: !ctx.getState().sidenavOpened,\n }),\n );\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, inject, Input, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { RouterModule } from '@angular/router';\nimport { Store } from '@ngxs/store';\n\nimport { Observable, tap } from 'rxjs';\nimport { HasPermissionDirective } from '../../../auth/directives/has-permission.directive';\nimport { PermissionScope } from '../../../types/permissions';\nimport { CoreState } from '../../state/core.state';\n\nexport interface NavItem {\n type: 'link' | 'header' | 'expandable';\n routerLink?: string[];\n label: string;\n icon?: string;\n permission?: PermissionScope;\n children?: NavItem[];\n isExpanded?: boolean;\n attentionCount?: Observable<number>;\n}\n\nexport type NavGroups = Record<string, NavItem[]>;\n\n@Component({\n selector: 'ccc-sidenav',\n templateUrl: './sidenav.component.html',\n styleUrls: ['./sidenav.component.scss'],\n imports: [\n MatIconModule,\n RouterModule,\n CommonModule,\n MatExpansionModule,\n MatButtonModule,\n MatSidenavModule,\n HasPermissionDirective,\n ]\n})\nexport class SidenavComponent implements OnInit {\n private store = inject(Store);\n private destroyRef = inject(DestroyRef);\n\n @Input() navGroups?: NavGroups;\n currentNav: NavItem[] = [];\n\n ngOnInit(): void {\n this.store\n .select(CoreState.currentSidenavIdentifier)\n .pipe(\n tap((identifier) => {\n this.currentNav = this.updateNavItems(identifier);\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n /**\n * Updates the currentNav based on the identifier\n * @param identifier\n * @returns NavItem[]\n * @memberof SidenavComponent\n */\n updateNavItems(identifier: string): NavItem[] {\n if (!this.navGroups) {\n return [];\n }\n if (!this.navGroups[identifier]) {\n // pick the first one if the identifier is not found so we don't break the UI\n identifier = Object.keys(this.navGroups)[0];\n }\n return this.navGroups[identifier];\n }\n}\n","<div class=\"nav-container\">\n <nav>\n @for (navItem of currentNav; track navItem.label) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItem }\"></ng-container>\n }\n </nav>\n</div>\n<ng-template #typeRendererTemplate let-navItem=\"navItem\">\n @switch (navItem.type) {\n @case ('header') {\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('link') {\n <ng-container [ngTemplateOutlet]=\"linkTemplate\" [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n @case ('expandable') {\n <ng-container\n [ngTemplateOutlet]=\"expandableTemplate\"\n [ngTemplateOutletContext]=\"{ navItem: navItem }\"></ng-container>\n }\n }\n</ng-template>\n<ng-template #headerTemplate let-navItem=\"navItem\">\n <div class=\"link-header\">{{ navItem.label }}</div>\n</ng-template>\n<ng-template #linkTemplate let-navItem=\"navItem\">\n <a [routerLink]=\"navItem.routerLink\" *cccHasPermission=\"navItem.permission\">\n <div class=\"nav-item\" routerLinkActive=\"active-link\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.icon }}\n </mat-icon>\n </div>\n <div class=\"text\">\n {{ navItem.label | titlecase }}\n </div>\n </div>\n </div>\n </a>\n</ng-template>\n<ng-template #expandableTemplate let-navItem=\"navItem\">\n <div class=\"nav-item\" aria-hidden=\"true\" (click)=\"navItem.isExpanded = !navItem.isExpanded\">\n <div class=\"link-button\">\n <div class=\"icon\">\n <mat-icon class=\"material-icons-outlined\" [inline]=\"true\">\n {{ navItem.isExpanded ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n <div class=\"text\">{{ navItem.label }}</div>\n </div>\n </div>\n @if (navItem.isExpanded) {\n <div class=\"expandable-links\">\n @for (navItemChild of navItem.children; track navItemChild) {\n <ng-container *ngTemplateOutlet=\"typeRendererTemplate; context: { navItem: navItemChild }\"> </ng-container>\n }\n </div>\n }\n</ng-template>\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\nimport { inject, Injectable, NgZone } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Store } from '@ngxs/store';\nimport { catchError, finalize, Observable, throwError } from 'rxjs';\nimport { CUSTOM_HTTP_REQUEST_OPTIONS } from '../../auth/services/request-options';\nimport { BASE_URL } from '../../types/base/tokens';\nimport { AlertLevel } from '../../types/notification-message';\nimport { ApiInterceptorAction } from '../state/core.actions';\n\n@Injectable()\nexport class ApiInterceptor implements HttpInterceptor {\n private store = inject(Store);\n private router = inject(Router);\n private ngZone = inject(NgZone);\n private baseUrl = inject(BASE_URL);\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n this.store.dispatch(new ApiInterceptorAction.BeginActivity(request.method + ' ' + request.url));\n\n return next.handle(request).pipe(\n catchError((error: HttpErrorResponse): Observable<HttpEvent<unknown>> => {\n if (error.status === 401) {\n this.ngZone.run(() => {\n this.store.dispatch(new ApiInterceptorAction.SetRedirectUrl(this.baseUrl + this.router.url));\n this.router.navigate(['/login']);\n });\n }\n if (!request.context.get(CUSTOM_HTTP_REQUEST_OPTIONS).suppressGlobalError) {\n const message = error.error?.message ?? error.message ?? error.error;\n this.store.dispatch(\n new ApiInterceptorAction.PublishError({\n message: message,\n level: AlertLevel.ERROR,\n link: '',\n }),\n );\n }\n\n return throwError(() => error);\n }),\n finalize(() => {\n this.store.dispatch(new ApiInterceptorAction.EndActivity(request.method + ' ' + request.url));\n }),\n );\n }\n}\n","/*\n * Public API Surface of ccc-lib\n */\n\n// Auth directives\nexport * from './lib/auth/directives/has-permission.directive';\n\n// Auth forms\nexport * from './lib/auth/forms/ccc-field/ccc-field.component';\nexport * from './lib/auth/forms/form-helpers';\n\n// Auth guards\nexport * from './lib/auth/guards/authentication.guard';\nexport * from './lib/auth/guards/authorization.guard';\n\n// Auth services\nexport * from './lib/auth/services/auth.service';\nexport * from './lib/auth/services/request-options';\n\n// Auth state\nexport * from './lib/auth/state/auth.actions';\nexport * from './lib/auth/state/auth.state';\n\n// Types tokens\nexport * from './lib/types/base/tokens';\n\n// Types\nexport * from './lib/types/notification-message';\nexport * from './lib/types/permissions';\nexport * from './lib/types/session-info';\n\n// Ui components\nexport * from './lib/ui/components/alert/alert.component';\nexport * from './lib/ui/components/sidenav/sidenav.component';\n\n// Ui interceptor\nexport * from './lib/ui/interceptor/api.interceptor';\n\n// Ui services\nexport * from './lib/ui/services/notification.service';\n\n// Ui state\nexport * from './lib/ui/state/core.actions';\nexport * from './lib/ui/state/core.state';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["initState","map","catchError","i2","i4"],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@cccteam/ccc-lib",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git://github.com/cccteam/ccc-lib.git"
7
7
  },
8
8
  "peerDependencies": {
9
- "@angular/common": "^18.2.0",
10
- "@angular/core": "^18.2.0"
9
+ "@angular/common": "^19.0.2",
10
+ "@angular/core": "^19.0.2"
11
11
  },
12
12
  "dependencies": {
13
13
  "tslib": "^2.3.0"
@@ -21,9 +21,7 @@
21
21
  },
22
22
  ".": {
23
23
  "types": "./index.d.ts",
24
- "esm2022": "./esm2022/cccteam-ccc-lib.mjs",
25
- "esm": "./esm2022/cccteam-ccc-lib.mjs",
26
24
  "default": "./fesm2022/cccteam-ccc-lib.mjs"
27
25
  }
28
26
  }
29
- }
27
+ }
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2NjdGVhbS1jY2MtbGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvY2NjdGVhbS1jY2MtbGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -1,44 +0,0 @@
1
- import { Directive, Input, TemplateRef, ViewContainerRef, inject } from '@angular/core';
2
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { Store } from '@ngxs/store';
4
- import { Subject, catchError, combineLatest, map, of } from 'rxjs';
5
- import { AuthState } from '../state/auth.state';
6
- import * as i0 from "@angular/core";
7
- export class HasPermissionDirective {
8
- templateRef = inject((TemplateRef));
9
- viewContainer = inject(ViewContainerRef);
10
- store = inject(Store);
11
- scope = new Subject();
12
- set cccHasPermission(scope) {
13
- this.scope.next(scope);
14
- }
15
- constructor() {
16
- combineLatest({
17
- permissionFn: this.store.select(AuthState.hasPermission),
18
- scope: this.scope.asObservable(),
19
- })
20
- .pipe(takeUntilDestroyed(), map(({ permissionFn, scope }) => (scope !== undefined ? permissionFn(scope) : true)), catchError(() => of(false)))
21
- .subscribe((result) => {
22
- if (result) {
23
- if (!this.viewContainer.get(0)) {
24
- this.viewContainer.createEmbeddedView(this.templateRef);
25
- }
26
- }
27
- else {
28
- this.viewContainer.clear();
29
- }
30
- });
31
- }
32
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: HasPermissionDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
33
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: HasPermissionDirective, isStandalone: true, selector: "[cccHasPermission]", inputs: { cccHasPermission: "cccHasPermission" }, ngImport: i0 });
34
- }
35
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: HasPermissionDirective, decorators: [{
36
- type: Directive,
37
- args: [{
38
- selector: '[cccHasPermission]',
39
- standalone: true,
40
- }]
41
- }], ctorParameters: () => [], propDecorators: { cccHasPermission: [{
42
- type: Input
43
- }] } });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLXBlcm1pc3Npb24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2NjLWxpYi9zcmMvbGliL2F1dGgvZGlyZWN0aXZlcy9oYXMtcGVybWlzc2lvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFNaEQsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUEsV0FBb0IsQ0FBQSxDQUFDLENBQUM7SUFDM0MsYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFdEIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFtQixDQUFDO0lBRS9DLElBQ0ksZ0JBQWdCLENBQUMsS0FBc0I7UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEO1FBQ0UsYUFBYSxDQUFDO1lBQ1osWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDeEQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFO1NBQ2pDLENBQUM7YUFDQyxJQUFJLENBQ0gsa0JBQWtCLEVBQUUsRUFDcEIsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUNwRixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzVCO2FBQ0EsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFELENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO3VHQS9CVSxzQkFBc0I7MkZBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFKbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7d0RBU0ssZ0JBQWdCO3NCQURuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgU3RvcmUgfSBmcm9tICdAbmd4cy9zdG9yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBjYXRjaEVycm9yLCBjb21iaW5lTGF0ZXN0LCBtYXAsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2NvcGUgfSBmcm9tICcuLi8uLi90eXBlcy9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBBdXRoU3RhdGUgfSBmcm9tICcuLi9zdGF0ZS9hdXRoLnN0YXRlJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NjY0hhc1Blcm1pc3Npb25dJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgSGFzUGVybWlzc2lvbkRpcmVjdGl2ZSB7XG4gIHByaXZhdGUgdGVtcGxhdGVSZWYgPSBpbmplY3QoVGVtcGxhdGVSZWY8dW5rbm93bj4pO1xuICBwcml2YXRlIHZpZXdDb250YWluZXIgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG4gIHByaXZhdGUgc3RvcmUgPSBpbmplY3QoU3RvcmUpO1xuXG4gIHByaXZhdGUgc2NvcGUgPSBuZXcgU3ViamVjdDxQZXJtaXNzaW9uU2NvcGU+KCk7XG5cbiAgQElucHV0KClcbiAgc2V0IGNjY0hhc1Blcm1pc3Npb24oc2NvcGU6IFBlcm1pc3Npb25TY29wZSkge1xuICAgIHRoaXMuc2NvcGUubmV4dChzY29wZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb21iaW5lTGF0ZXN0KHtcbiAgICAgIHBlcm1pc3Npb25GbjogdGhpcy5zdG9yZS5zZWxlY3QoQXV0aFN0YXRlLmhhc1Blcm1pc3Npb24pLFxuICAgICAgc2NvcGU6IHRoaXMuc2NvcGUuYXNPYnNlcnZhYmxlKCksXG4gICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgbWFwKCh7IHBlcm1pc3Npb25Gbiwgc2NvcGUgfSkgPT4gKHNjb3BlICE9PSB1bmRlZmluZWQgPyBwZXJtaXNzaW9uRm4oc2NvcGUpIDogdHJ1ZSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGZhbHNlKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIGlmICghdGhpcy52aWV3Q29udGFpbmVyLmdldCgwKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG59XG4iXX0=