@bootkit/ng0 0.0.0-alpha.45 → 0.0.0-alpha.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/common/index.d.ts CHANGED
@@ -22,7 +22,14 @@ interface ClaimObject {
22
22
  *
23
23
  */
24
24
  type ClaimLike = string | ClaimObject;
25
- type ShowCondition = ClaimObject | 'set' | 'unset';
25
+ /**
26
+ * Represents a condition to check against a user.
27
+ * It can be a ClaimLike or a boolean value.
28
+ * - If it's a ClaimLike, it checks if the user has the specified claim(s).
29
+ * - If it's true, it checks if there is a logged-in user.
30
+ * - If it's false, it checks if there is no logged-in user.
31
+ */
32
+ type UserCondition = ClaimLike | boolean;
26
33
 
27
34
  type Placement = 'start' | 'end' | 'top' | 'bottom';
28
35
  type Alignment = 'start' | 'center' | 'end';
@@ -46,9 +53,13 @@ interface MenuItemBase {
46
53
  type?: string;
47
54
  id?: any;
48
55
  show?: boolean;
56
+ /**
57
+ * @deprecated use 'user' instead
58
+ */
49
59
  claim?: ClaimLike;
50
60
  cssClass?: string;
51
61
  data?: any;
62
+ user?: UserCondition;
52
63
  }
53
64
  interface NodeMenuItem extends MenuItemBase {
54
65
  type?: 'node';
@@ -57,7 +68,7 @@ interface NodeMenuItem extends MenuItemBase {
57
68
  icon?: string;
58
69
  expanded?: boolean;
59
70
  children?: MenuItem[];
60
- parent?: NodeMenuItem;
71
+ parent?: MenuItem;
61
72
  routerLink?: string | string[];
62
73
  routerLinkActiveOptions?: {
63
74
  exact: boolean;
@@ -298,4 +309,4 @@ declare class IfDirective {
298
309
  }
299
310
 
300
311
  export { CssClassAttribute, IdGeneratorAttribute, IfDirective, RTL, TrackByAttribute, comparerAttribute, defaultComparer, defaultEqualityComparer, defaultFilter, defaultValueWriter, deleteEntries, equalityComparerAttribute, filterPredicateAttribute, flipPlacement, formatString, getEnumValues, noopFilter, numberArray, sequentialIdGenerator, toObservable, trackByIndex, trackByItem, valueWriterAttribute };
301
- export type { Alignment, ClaimLike, ClaimObject, Comparer, ComparerLike, CssClass, CssClassGetter, CssClassLike, DividerMenuItem, EqualityComparer, EqualityComparerLike, FilterPredicate, FilterPredicateLike, HeaderMenuItem, IdGenerator, IdGeneratorLike, MenuItem, MenuItemBase, NodeMenuItem, Placement, ShowCondition, TrackByLike, ValueWriter, ValueWriterLike };
312
+ export type { Alignment, ClaimLike, ClaimObject, Comparer, ComparerLike, CssClass, CssClassGetter, CssClassLike, DividerMenuItem, EqualityComparer, EqualityComparerLike, FilterPredicate, FilterPredicateLike, HeaderMenuItem, IdGenerator, IdGeneratorLike, MenuItem, MenuItemBase, NodeMenuItem, Placement, TrackByLike, UserCondition, ValueWriter, ValueWriterLike };
@@ -84,7 +84,6 @@ declare class VerticalMenuComponent implements AfterContentInit {
84
84
  */
85
85
  readonly items: i0.InputSignal<MenuItem[]>;
86
86
  ngAfterContentInit(): void;
87
- protected _onActiveChange(item: MenuItem, isActive: boolean): void;
88
87
  static ɵfac: i0.ɵɵFactoryDeclaration<VerticalMenuComponent, never>;
89
88
  static ɵcmp: i0.ɵɵComponentDeclaration<VerticalMenuComponent, "ng0-vmenu, ng0-vertical-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; }, {}, ["_itemTemplate"], ["*"], true, never>;
90
89
  }
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, inject, signal, Injectable, input, EventEmitter, Output, ContentChildren, ViewEncapsulation, TemplateRef, Directive, ContentChild, NgModule } from '@angular/core';
2
+ import { Component, inject, signal, Injectable, input, EventEmitter, Output, ContentChildren, ViewEncapsulation, TemplateRef, Directive, ContentChild, ChangeDetectionStrategy, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i2 from '@angular/router';
6
6
  import { RouterModule } from '@angular/router';
7
7
  import { CollapseComponent } from '@bootkit/ng0/components/collapse';
8
- import { UserStore } from '@bootkit/ng0/security';
8
+ import { UserStore, UserDirective } from '@bootkit/ng0/security';
9
9
 
10
10
  class VerticalMenuDividerComponent {
11
11
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: VerticalMenuDividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -90,7 +90,7 @@ class VerticalMenuItemComponent {
90
90
  this._menuItemState.routeActivated.set(isActive);
91
91
  }
92
92
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: VerticalMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
93
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.11", type: VerticalMenuItemComponent, isStandalone: true, selector: "ng0-vmenu-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, tag: { classPropertyName: "tag", publicName: "tag", isSignal: true, isRequired: false, transformFunction: null }, tagCssClass: { classPropertyName: "tagCssClass", publicName: "tagCssClass", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "class.ng0-has-children": "hasChildren()", "class.ng0-expanded": "isExpanded()", "class.ng0-has-active-route": "hasActiveRoute()" } }, providers: [VerticalMenuItemState], queries: [{ propertyName: "_children", predicate: VerticalMenuItemComponent }], ngImport: i0, template: "@let itemTemplate = _menuState.itemTemplate();\n\n<div class=\"ng0-vmenu-item-content\" (click)=\"_onContentClick($event)\">\n @if(hasChildren()) {\n <div class=\"ng0-vmenu-item-expander\"\n [class.ng0-expanded]=\"isExpanded()\"\n >\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n <span class=\"ng0-vmenu-item-text\">\n {{text()}}\n </span>\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n\n <div class=\"ng0-vmenu-item-end\">\n <div class=\"ng0-vmenu-item-expand-icon\">\n \u276F\n </div>\n </div>\n\n }\n\n </div>\n }@else {\n <a class=\"ng0-vmenu-item-link\"\n [routerLink]=\"link()\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n routerLinkActive=\"ng0-active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (isActiveChange)=\"_onRouteChange($event)\">\n\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n {{text()}}\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n }\n </a>\n }\n</div>\n\n<ng-content></ng-content>", styles: ["ng0-vmenu-item{display:block}.ng0-vmenu-item-content{border-radius:.3rem;transition:background-color .2s}.ng0-vmenu-item-content:hover:not(:has(a.ng0-active)){background-color:var(--bs-light)}.ng0-vmenu-item-expander,.ng0-vmenu-item-link{padding:.2rem .8rem;display:flex;align-items:baseline;cursor:pointer;color:inherit}.ng0-vmenu-item-expander.ng0-expanded .ng0-vmenu-item-expand-icon{transform:rotate(90deg)}.ng0-vmenu-item-link{text-decoration:none}.ng0-vmenu-item-link.active{color:var(--bs-primary)}.ng0-vmenu-item-text{flex-grow:1}.ng0-vmenu-item-expand-icon{transition:transform var(--ng0-collapse-transition-duration)}ng0-vmenu-item.ng0-active .ng0-vmenu-item-content,ng0-vmenu-item.ng0-has-active-route .ng0-vmenu-item-content{font-weight:500}.ng0-vmenu-item-link.ng0-active{color:var(--bs-primary)}.ng0-vmenu-item-end{margin-inline-start:auto}.ng0-vmenu-item-tag{margin-inline-start:1rem;padding:0 .4rem;border-radius:.4rem;font-size:small;font-weight:400;color:var(--bs-light);background-color:var(--bs-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], encapsulation: i0.ViewEncapsulation.None });
93
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.11", type: VerticalMenuItemComponent, isStandalone: true, selector: "ng0-vmenu-item", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, tag: { classPropertyName: "tag", publicName: "tag", isSignal: true, isRequired: false, transformFunction: null }, tagCssClass: { classPropertyName: "tagCssClass", publicName: "tagCssClass", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, link: { classPropertyName: "link", publicName: "link", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null }, href: { classPropertyName: "href", publicName: "href", isSignal: true, isRequired: false, transformFunction: null }, target: { classPropertyName: "target", publicName: "target", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "class.ng0-has-children": "hasChildren()", "class.ng0-expanded": "isExpanded()", "class.ng0-has-active-route": "hasActiveRoute()" } }, providers: [VerticalMenuItemState], queries: [{ propertyName: "_children", predicate: VerticalMenuItemComponent }], ngImport: i0, template: "@let itemTemplate = _menuState.itemTemplate();\n\n<div class=\"ng0-vmenu-item-content\" (click)=\"_onContentClick($event)\">\n @if(hasChildren()) {\n <div class=\"ng0-vmenu-item-expander\"\n [class.ng0-expanded]=\"isExpanded()\"\n >\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n <span class=\"ng0-vmenu-item-text\">\n {{text()}}\n </span>\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n\n <div class=\"ng0-vmenu-item-end\">\n <div class=\"ng0-vmenu-item-expand-icon\">\n \u276F\n </div>\n </div>\n\n }\n\n </div>\n }@else {\n <a class=\"ng0-vmenu-item-link\"\n [routerLink]=\"link()\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n routerLinkActive=\"ng0-active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (isActiveChange)=\"_onRouteChange($event)\">\n\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n {{text()}}\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n }\n </a>\n }\n</div>\n\n<ng-content></ng-content>", styles: ["ng0-vmenu-item{display:block}.ng0-vmenu-item-content{border-radius:.3rem;transition:background-color .2s}.ng0-vmenu-item-content:hover:not(:has(a.ng0-active)){background-color:var(--bs-light)}.ng0-vmenu-item-expander,.ng0-vmenu-item-link{padding:.2rem .8rem;display:flex;align-items:baseline;cursor:pointer;color:inherit}.ng0-vmenu-item-expander.ng0-expanded .ng0-vmenu-item-expand-icon{transform:rotate(90deg)}.ng0-vmenu-item-link{text-decoration:none}.ng0-vmenu-item-link.active{color:var(--bs-primary)}.ng0-vmenu-item-expand-icon{transition:transform var(--ng0-collapse-transition-duration)}ng0-vmenu-item.ng0-active .ng0-vmenu-item-content,ng0-vmenu-item.ng0-has-active-route .ng0-vmenu-item-content{font-weight:500}.ng0-vmenu-item-link.ng0-active{color:var(--bs-primary)}.ng0-vmenu-item-end{margin-inline-start:auto}.ng0-vmenu-item-tag{margin-inline-start:1rem;padding:0 .4rem;border-radius:.4rem;font-size:small;font-weight:400;color:var(--bs-light);background-color:var(--bs-secondary)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], encapsulation: i0.ViewEncapsulation.None });
94
94
  }
95
95
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: VerticalMenuItemComponent, decorators: [{
96
96
  type: Component,
@@ -98,7 +98,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImpo
98
98
  '[class.ng0-has-children]': 'hasChildren()',
99
99
  '[class.ng0-expanded]': 'isExpanded()',
100
100
  '[class.ng0-has-active-route]': 'hasActiveRoute()'
101
- }, template: "@let itemTemplate = _menuState.itemTemplate();\n\n<div class=\"ng0-vmenu-item-content\" (click)=\"_onContentClick($event)\">\n @if(hasChildren()) {\n <div class=\"ng0-vmenu-item-expander\"\n [class.ng0-expanded]=\"isExpanded()\"\n >\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n <span class=\"ng0-vmenu-item-text\">\n {{text()}}\n </span>\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n\n <div class=\"ng0-vmenu-item-end\">\n <div class=\"ng0-vmenu-item-expand-icon\">\n \u276F\n </div>\n </div>\n\n }\n\n </div>\n }@else {\n <a class=\"ng0-vmenu-item-link\"\n [routerLink]=\"link()\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n routerLinkActive=\"ng0-active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (isActiveChange)=\"_onRouteChange($event)\">\n\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n {{text()}}\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n }\n </a>\n }\n</div>\n\n<ng-content></ng-content>", styles: ["ng0-vmenu-item{display:block}.ng0-vmenu-item-content{border-radius:.3rem;transition:background-color .2s}.ng0-vmenu-item-content:hover:not(:has(a.ng0-active)){background-color:var(--bs-light)}.ng0-vmenu-item-expander,.ng0-vmenu-item-link{padding:.2rem .8rem;display:flex;align-items:baseline;cursor:pointer;color:inherit}.ng0-vmenu-item-expander.ng0-expanded .ng0-vmenu-item-expand-icon{transform:rotate(90deg)}.ng0-vmenu-item-link{text-decoration:none}.ng0-vmenu-item-link.active{color:var(--bs-primary)}.ng0-vmenu-item-text{flex-grow:1}.ng0-vmenu-item-expand-icon{transition:transform var(--ng0-collapse-transition-duration)}ng0-vmenu-item.ng0-active .ng0-vmenu-item-content,ng0-vmenu-item.ng0-has-active-route .ng0-vmenu-item-content{font-weight:500}.ng0-vmenu-item-link.ng0-active{color:var(--bs-primary)}.ng0-vmenu-item-end{margin-inline-start:auto}.ng0-vmenu-item-tag{margin-inline-start:1rem;padding:0 .4rem;border-radius:.4rem;font-size:small;font-weight:400;color:var(--bs-light);background-color:var(--bs-secondary)}\n"] }]
101
+ }, template: "@let itemTemplate = _menuState.itemTemplate();\n\n<div class=\"ng0-vmenu-item-content\" (click)=\"_onContentClick($event)\">\n @if(hasChildren()) {\n <div class=\"ng0-vmenu-item-expander\"\n [class.ng0-expanded]=\"isExpanded()\"\n >\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n <span class=\"ng0-vmenu-item-text\">\n {{text()}}\n </span>\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n\n <div class=\"ng0-vmenu-item-end\">\n <div class=\"ng0-vmenu-item-expand-icon\">\n \u276F\n </div>\n </div>\n\n }\n\n </div>\n }@else {\n <a class=\"ng0-vmenu-item-link\"\n [routerLink]=\"link()\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n routerLinkActive=\"ng0-active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (isActiveChange)=\"_onRouteChange($event)\">\n\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n {{text()}}\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n }\n </a>\n }\n</div>\n\n<ng-content></ng-content>", styles: ["ng0-vmenu-item{display:block}.ng0-vmenu-item-content{border-radius:.3rem;transition:background-color .2s}.ng0-vmenu-item-content:hover:not(:has(a.ng0-active)){background-color:var(--bs-light)}.ng0-vmenu-item-expander,.ng0-vmenu-item-link{padding:.2rem .8rem;display:flex;align-items:baseline;cursor:pointer;color:inherit}.ng0-vmenu-item-expander.ng0-expanded .ng0-vmenu-item-expand-icon{transform:rotate(90deg)}.ng0-vmenu-item-link{text-decoration:none}.ng0-vmenu-item-link.active{color:var(--bs-primary)}.ng0-vmenu-item-expand-icon{transition:transform var(--ng0-collapse-transition-duration)}ng0-vmenu-item.ng0-active .ng0-vmenu-item-content,ng0-vmenu-item.ng0-has-active-route .ng0-vmenu-item-content{font-weight:500}.ng0-vmenu-item-link.ng0-active{color:var(--bs-primary)}.ng0-vmenu-item-end{margin-inline-start:auto}.ng0-vmenu-item-tag{margin-inline-start:1rem;padding:0 .4rem;border-radius:.4rem;font-size:small;font-weight:400;color:var(--bs-light);background-color:var(--bs-secondary)}\n"] }]
102
102
  }], propDecorators: { _children: [{
103
103
  type: ContentChildren,
104
104
  args: [VerticalMenuItemComponent]
@@ -155,24 +155,20 @@ class VerticalMenuComponent {
155
155
  ngAfterContentInit() {
156
156
  this._state.itemTemplate.set(this._itemTemplate?.templateRef);
157
157
  }
158
- _onActiveChange(item, isActive) {
159
- // item.active = isActive;
160
- // if (item.parent)
161
- // item.parent.active = isActive;
162
- }
163
158
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: VerticalMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
164
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.11", type: VerticalMenuComponent, isStandalone: true, selector: "ng0-vmenu, ng0-vertical-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, providers: [VerticalMenuState], queries: [{ propertyName: "_itemTemplate", first: true, predicate: VerticalMenuItemTemplateDirective, descendants: true }], ngImport: i0, template: "<!-- @let user = _userStore.user(); -->\n\n<ng-content></ng-content>\n\n<ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: items()}\"></ng-container>\n\n<ng-template #menuItemTemplate let-items>\n @for (item of items; track $index) {\n @let itemType = item.type || 'node';\n\n <!-- @if ((!item.claim) || (user && user.hasClaim(item.claim))) { -->\n\n @switch (itemType) {\n @case('divider') {\n <ng0-vmenu-divider></ng0-vmenu-divider>\n }\n @case('header') {\n <ng0-vmenu-header>{{item.text}}</ng0-vmenu-header>\n }\n @case('node') {\n <ng0-vmenu-item\n [text]=\"item.text\"\n [tag]=\"item.tag\"\n [tagCssClass]=\"item.tagCssClass\"\n [link]=\"item.routerLink\"\n [routerLinkActiveOptions]=\"item.routerLinkActiveOptions ?? {exact: true}\"\n [href]=\"item.href\"\n [icon]=\"item.icon\"\n [target]=\"item.target\"\n [ngClass]=\"item.cssClass\">\n @if(item.children?.length) {\n <ng0-vmenu-item-children>\n <ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: item.children }\">\n </ng-container>\n </ng0-vmenu-item-children>\n }\n </ng0-vmenu-item>\n }\n }\n <!-- } -->\n }\n</ng-template>", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: VerticalMenuItemComponent, selector: "ng0-vmenu-item", inputs: ["text", "tag", "tagCssClass", "icon", "link", "routerLinkActiveOptions", "href", "target"], outputs: ["itemClick"] }, { kind: "component", type: VerticalMenuDividerComponent, selector: "ng0-vmenu-divider" }, { kind: "component", type: VerticalMenuHeaderComponent, selector: "ng0-vmenu-header" }, { kind: "component", type: VerticalMenuItemChildrenComponent, selector: "ng0-vmenu-item-children", exportAs: ["ng0VmenuItemChildren"] }] });
159
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.11", type: VerticalMenuComponent, isStandalone: true, selector: "ng0-vmenu, ng0-vertical-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null } }, providers: [VerticalMenuState], queries: [{ propertyName: "_itemTemplate", first: true, predicate: VerticalMenuItemTemplateDirective, descendants: true }], ngImport: i0, template: "<ng-content></ng-content>\n\n<ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: items()}\"></ng-container>\n\n<ng-template #menuItemTemplate let-items>\n @for (item of items; track $index) {\n @let itemType = item.type || 'node';\n\n <ng-container *ng0User=\"item.user\">\n @switch (itemType) {\n @case('divider') {\n <ng0-vmenu-divider></ng0-vmenu-divider>\n }\n @case('header') {\n <ng0-vmenu-header>{{item.text}}</ng0-vmenu-header>\n }\n @case('node') {\n <ng0-vmenu-item\n [text]=\"item.text\"\n [tag]=\"item.tag\"\n [tagCssClass]=\"item.tagCssClass\"\n [link]=\"item.routerLink\"\n [routerLinkActiveOptions]=\"item.routerLinkActiveOptions ?? {exact: true}\"\n [href]=\"item.href\"\n [icon]=\"item.icon\"\n [target]=\"item.target\"\n [ngClass]=\"item.cssClass\">\n @if(item.children?.length) {\n <ng0-vmenu-item-children>\n <ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: item.children }\">\n </ng-container>\n </ng0-vmenu-item-children>\n }\n </ng0-vmenu-item>\n }\n }\n </ng-container>\n }\n</ng-template>\n\n\n<style>\n :host {\n display: block;\n }\n</style>", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: UserDirective, selector: "[ng0User]", inputs: ["ng0User"], exportAs: ["ng0User"] }, { kind: "component", type: VerticalMenuItemComponent, selector: "ng0-vmenu-item", inputs: ["text", "tag", "tagCssClass", "icon", "link", "routerLinkActiveOptions", "href", "target"], outputs: ["itemClick"] }, { kind: "component", type: VerticalMenuDividerComponent, selector: "ng0-vmenu-divider" }, { kind: "component", type: VerticalMenuHeaderComponent, selector: "ng0-vmenu-header" }, { kind: "component", type: VerticalMenuItemChildrenComponent, selector: "ng0-vmenu-item-children", exportAs: ["ng0VmenuItemChildren"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
165
160
  }
166
161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: VerticalMenuComponent, decorators: [{
167
162
  type: Component,
168
- args: [{ selector: 'ng0-vmenu, ng0-vertical-menu', standalone: true, providers: [VerticalMenuState], imports: [
163
+ args: [{ selector: 'ng0-vmenu, ng0-vertical-menu', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, providers: [VerticalMenuState], imports: [
169
164
  CommonModule,
170
165
  RouterModule,
166
+ UserDirective,
171
167
  VerticalMenuItemComponent,
172
168
  VerticalMenuDividerComponent,
173
169
  VerticalMenuHeaderComponent,
174
170
  VerticalMenuItemChildrenComponent
175
- ], template: "<!-- @let user = _userStore.user(); -->\n\n<ng-content></ng-content>\n\n<ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: items()}\"></ng-container>\n\n<ng-template #menuItemTemplate let-items>\n @for (item of items; track $index) {\n @let itemType = item.type || 'node';\n\n <!-- @if ((!item.claim) || (user && user.hasClaim(item.claim))) { -->\n\n @switch (itemType) {\n @case('divider') {\n <ng0-vmenu-divider></ng0-vmenu-divider>\n }\n @case('header') {\n <ng0-vmenu-header>{{item.text}}</ng0-vmenu-header>\n }\n @case('node') {\n <ng0-vmenu-item\n [text]=\"item.text\"\n [tag]=\"item.tag\"\n [tagCssClass]=\"item.tagCssClass\"\n [link]=\"item.routerLink\"\n [routerLinkActiveOptions]=\"item.routerLinkActiveOptions ?? {exact: true}\"\n [href]=\"item.href\"\n [icon]=\"item.icon\"\n [target]=\"item.target\"\n [ngClass]=\"item.cssClass\">\n @if(item.children?.length) {\n <ng0-vmenu-item-children>\n <ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: item.children }\">\n </ng-container>\n </ng0-vmenu-item-children>\n }\n </ng0-vmenu-item>\n }\n }\n <!-- } -->\n }\n</ng-template>", styles: [":host{display:block}\n"] }]
171
+ ], template: "<ng-content></ng-content>\n\n<ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: items()}\"></ng-container>\n\n<ng-template #menuItemTemplate let-items>\n @for (item of items; track $index) {\n @let itemType = item.type || 'node';\n\n <ng-container *ng0User=\"item.user\">\n @switch (itemType) {\n @case('divider') {\n <ng0-vmenu-divider></ng0-vmenu-divider>\n }\n @case('header') {\n <ng0-vmenu-header>{{item.text}}</ng0-vmenu-header>\n }\n @case('node') {\n <ng0-vmenu-item\n [text]=\"item.text\"\n [tag]=\"item.tag\"\n [tagCssClass]=\"item.tagCssClass\"\n [link]=\"item.routerLink\"\n [routerLinkActiveOptions]=\"item.routerLinkActiveOptions ?? {exact: true}\"\n [href]=\"item.href\"\n [icon]=\"item.icon\"\n [target]=\"item.target\"\n [ngClass]=\"item.cssClass\">\n @if(item.children?.length) {\n <ng0-vmenu-item-children>\n <ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: item.children }\">\n </ng-container>\n </ng0-vmenu-item-children>\n }\n </ng0-vmenu-item>\n }\n }\n </ng-container>\n }\n</ng-template>\n\n\n<style>\n :host {\n display: block;\n }\n</style>" }]
176
172
  }], propDecorators: { _itemTemplate: [{
177
173
  type: ContentChild,
178
174
  args: [VerticalMenuItemTemplateDirective]
@@ -1 +1 @@
1
- {"version":3,"file":"bootkit-ng0-components-vertical-menu.mjs","sources":["../../../projects/ng0/components/vertical-menu/divider.component.ts","../../../projects/ng0/components/vertical-menu/header.component.ts","../../../projects/ng0/components/vertical-menu/item-state.ts","../../../projects/ng0/components/vertical-menu/vertical-menu-state.ts","../../../projects/ng0/components/vertical-menu/item.component.ts","../../../projects/ng0/components/vertical-menu/item.component.html","../../../projects/ng0/components/vertical-menu/item-children.component.ts","../../../projects/ng0/components/vertical-menu/item-children.component.html","../../../projects/ng0/components/vertical-menu/item-template.directive.ts","../../../projects/ng0/components/vertical-menu/vertical-menu.component.ts","../../../projects/ng0/components/vertical-menu/vertical-menu.component.html","../../../projects/ng0/components/vertical-menu/vertical-menu.module.ts","../../../projects/ng0/components/vertical-menu/bootkit-ng0-components-vertical-menu.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ng0-vmenu-divider',\n template: '',\n standalone: true,\n styles: `:host {display: block; height: 1px; background-color: var(--bs-border-color); margin: 1rem 0; }`\n})\nexport class VerticalMenuDividerComponent {\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ng0-vmenu-header',\n standalone: true,\n template: `<ng-content></ng-content>`,\n styles: `:host {display: block; }`\n})\nexport class VerticalMenuHeaderComponent {\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\n\n@Injectable()\nexport class VerticalMenuItemState {\n public parent? = inject(VerticalMenuItemState, { optional: true, skipSelf: true });\n public readonly routeActivated = signal(false);\n public readonly hasChildren = signal(false);\n public readonly childStates = signal<VerticalMenuItemState[]>([]);\n public readonly expanded = signal(false);\n\n public hasActiveRoute(): boolean {\n return this.routeActivated() || this.childStates().some(x => x.hasActiveRoute());\n }\n}\n\n","import { Injectable, signal, TemplateRef } from '@angular/core';\n\n@Injectable()\nexport class VerticalMenuState {\n public readonly itemTemplate = signal<TemplateRef<any> | undefined>(undefined);\n\n}\n\n","import { booleanAttribute, Component, ContentChildren, EventEmitter, inject, input, Output, QueryList, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IsActiveMatchOptions, RouterModule } from '@angular/router';\nimport { VerticalMenuItemState } from './item-state';\nimport { VerticalMenuState } from './vertical-menu-state';\n\n@Component({\n selector: 'ng0-vmenu-item',\n templateUrl: './item.component.html',\n styleUrl: './item.component.scss',\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [CommonModule, RouterModule],\n providers: [VerticalMenuItemState],\n host: {\n '[class.ng0-has-children]': 'hasChildren()',\n '[class.ng0-expanded]': 'isExpanded()',\n '[class.ng0-has-active-route]': 'hasActiveRoute()'\n }\n})\nexport class VerticalMenuItemComponent {\n protected _menuItemState = inject(VerticalMenuItemState);\n protected _menuState = inject(VerticalMenuState);\n @ContentChildren(VerticalMenuItemComponent) protected _children!: QueryList<VerticalMenuItemComponent>;\n\n public readonly text = input<string>();\n public readonly tag = input<string>();\n public readonly tagCssClass = input<string | string[]>();\n public readonly icon = input<string>();\n\n /**\n * Router link\n */\n public readonly link = input<string | string[]>();\n public readonly routerLinkActiveOptions = input<{ exact: boolean } | IsActiveMatchOptions>({ exact: true });\n public readonly href = input<string>();\n public readonly target = input<'_blank' | '_parent' | '_self' | '_top'>('_blank');\n\n @Output() public readonly itemClick = new EventEmitter<PointerEvent>();\n\n ngOnInit(): void {\n if (this._menuItemState.parent) {\n this._menuItemState.parent.childStates().push(this._menuItemState);\n }\n }\n\n public hasActiveRoute(): boolean {\n return this._menuItemState.hasActiveRoute();\n }\n\n public hasChildren(): boolean {\n return this._menuItemState.hasChildren();\n }\n\n public isExpanded(): boolean {\n return this._menuItemState.expanded();\n }\n\n protected _onContentClick(e: PointerEvent) {\n if (this.hasChildren()) {\n this._menuItemState.expanded.update(x => !x);\n }\n\n this.itemClick.emit(e);\n }\n\n protected _onRouteChange(isActive: boolean) {\n this._menuItemState.routeActivated.set(isActive);\n }\n}\n\n","@let itemTemplate = _menuState.itemTemplate();\n\n<div class=\"ng0-vmenu-item-content\" (click)=\"_onContentClick($event)\">\n @if(hasChildren()) {\n <div class=\"ng0-vmenu-item-expander\"\n [class.ng0-expanded]=\"isExpanded()\"\n >\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n <span class=\"ng0-vmenu-item-text\">\n {{text()}}\n </span>\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n\n <div class=\"ng0-vmenu-item-end\">\n <div class=\"ng0-vmenu-item-expand-icon\">\n ❯\n </div>\n </div>\n\n }\n\n </div>\n }@else {\n <a class=\"ng0-vmenu-item-link\"\n [routerLink]=\"link()\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n routerLinkActive=\"ng0-active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (isActiveChange)=\"_onRouteChange($event)\">\n\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n {{text()}}\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n }\n </a>\n }\n</div>\n\n<ng-content></ng-content>","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CollapseComponent } from '@bootkit/ng0/components/collapse';\nimport { VerticalMenuItemState } from './item-state';\n\n@Component({\n selector: 'ng0-vmenu-item-children',\n templateUrl: './item-children.component.html',\n exportAs: 'ng0VmenuItemChildren',\n standalone: true,\n imports: [CommonModule, CollapseComponent],\n host: {\n '[class.ng0-expanded]': 'isExpanded()'\n }\n})\nexport class VerticalMenuItemChildrenComponent implements OnInit {\n private _menuItemState = inject(VerticalMenuItemState);\n\n ngOnInit(): void {\n this._menuItemState.hasChildren.set(true);\n }\n\n public isExpanded() {\n return this._menuItemState.expanded();\n }\n\n public expand() {\n return this._menuItemState.expanded.set(true);\n }\n\n public collapse() {\n return this._menuItemState.expanded.set(false);\n }\n}\n","<ng0-collapse [collapsed]=\"!isExpanded()\">\n <ng-content></ng-content>\n</ng0-collapse>\n\n<style>\n :host {\n display: block;\n padding-inline-start: .5rem;\n }\n</style>","import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[ng0VerticalMenuItemTemplate]',\n exportAs: 'ng0VerticalMenuItemTemplate',\n standalone: true\n})\nexport class VerticalMenuItemTemplateDirective {\n public readonly templateRef = inject(TemplateRef);\n}\n","import { AfterContentInit, Component, ContentChild, inject, input } from '@angular/core';\nimport { MenuItem } from '@bootkit/ng0/common';\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\nimport { User, UserStore } from '@bootkit/ng0/security';\nimport { VerticalMenuItemComponent } from './item.component';\nimport { RouterModule } from '@angular/router';\nimport { VerticalMenuDividerComponent } from './divider.component';\nimport { VerticalMenuHeaderComponent } from './header.component';\nimport { VerticalMenuState } from './vertical-menu-state';\nimport { VerticalMenuItemTemplateDirective } from './item-template.directive';\nimport { VerticalMenuItemChildrenComponent } from './item-children.component';\n\n@Component({\n selector: 'ng0-vmenu, ng0-vertical-menu',\n templateUrl: './vertical-menu.component.html',\n standalone: true,\n styles: `:host {display: block}`,\n providers: [VerticalMenuState],\n imports: [\n CommonModule,\n RouterModule,\n VerticalMenuItemComponent,\n VerticalMenuDividerComponent,\n VerticalMenuHeaderComponent,\n VerticalMenuItemChildrenComponent\n],\n})\nexport class VerticalMenuComponent implements AfterContentInit {\n protected readonly _userStore = inject<UserStore<User>>(UserStore);\n protected readonly _state = inject(VerticalMenuState);\n @ContentChild(VerticalMenuItemTemplateDirective) protected _itemTemplate?: VerticalMenuItemTemplateDirective;\n\n /**\n * Menu items\n */\n public readonly items = input<MenuItem[]>([]);\n\n ngAfterContentInit(): void {\n this._state.itemTemplate.set(this._itemTemplate?.templateRef);\n }\n\n protected _onActiveChange(item: MenuItem, isActive: boolean) {\n // item.active = isActive;\n // if (item.parent)\n // item.parent.active = isActive;\n }\n}\n\n","<!-- @let user = _userStore.user(); -->\n\n<ng-content></ng-content>\n\n<ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: items()}\"></ng-container>\n\n<ng-template #menuItemTemplate let-items>\n @for (item of items; track $index) {\n @let itemType = item.type || 'node';\n\n <!-- @if ((!item.claim) || (user && user.hasClaim(item.claim))) { -->\n\n @switch (itemType) {\n @case('divider') {\n <ng0-vmenu-divider></ng0-vmenu-divider>\n }\n @case('header') {\n <ng0-vmenu-header>{{item.text}}</ng0-vmenu-header>\n }\n @case('node') {\n <ng0-vmenu-item\n [text]=\"item.text\"\n [tag]=\"item.tag\"\n [tagCssClass]=\"item.tagCssClass\"\n [link]=\"item.routerLink\"\n [routerLinkActiveOptions]=\"item.routerLinkActiveOptions ?? {exact: true}\"\n [href]=\"item.href\"\n [icon]=\"item.icon\"\n [target]=\"item.target\"\n [ngClass]=\"item.cssClass\">\n @if(item.children?.length) {\n <ng0-vmenu-item-children>\n <ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: item.children }\">\n </ng-container>\n </ng0-vmenu-item-children>\n }\n </ng0-vmenu-item>\n }\n }\n <!-- } -->\n }\n</ng-template>","import { NgModule } from '@angular/core';\nimport { VerticalMenuItemComponent } from './item.component';\nimport { VerticalMenuComponent } from './vertical-menu.component';\nimport { VerticalMenuDividerComponent } from './divider.component';\nimport { VerticalMenuHeaderComponent } from './header.component';\nimport { VerticalMenuItemChildrenComponent } from './item-children.component';\nimport { VerticalMenuItemTemplateDirective } from './item-template.directive';\n\nconst items = [\n VerticalMenuComponent,\n VerticalMenuItemComponent,\n VerticalMenuItemChildrenComponent,\n VerticalMenuDividerComponent,\n VerticalMenuHeaderComponent,\n VerticalMenuItemTemplateDirective\n];\n\n@NgModule({\n imports: items,\n exports: items\n})\nexport class VerticalMenuModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bootkit-ng0-components-vertical-menu.mjs","sources":["../../../projects/ng0/components/vertical-menu/divider.component.ts","../../../projects/ng0/components/vertical-menu/header.component.ts","../../../projects/ng0/components/vertical-menu/item-state.ts","../../../projects/ng0/components/vertical-menu/vertical-menu-state.ts","../../../projects/ng0/components/vertical-menu/item.component.ts","../../../projects/ng0/components/vertical-menu/item.component.html","../../../projects/ng0/components/vertical-menu/item-children.component.ts","../../../projects/ng0/components/vertical-menu/item-children.component.html","../../../projects/ng0/components/vertical-menu/item-template.directive.ts","../../../projects/ng0/components/vertical-menu/vertical-menu.component.ts","../../../projects/ng0/components/vertical-menu/vertical-menu.component.html","../../../projects/ng0/components/vertical-menu/vertical-menu.module.ts","../../../projects/ng0/components/vertical-menu/bootkit-ng0-components-vertical-menu.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ng0-vmenu-divider',\n template: '',\n standalone: true,\n styles: `:host {display: block; height: 1px; background-color: var(--bs-border-color); margin: 1rem 0; }`\n})\nexport class VerticalMenuDividerComponent {\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ng0-vmenu-header',\n standalone: true,\n template: `<ng-content></ng-content>`,\n styles: `:host {display: block; }`\n})\nexport class VerticalMenuHeaderComponent {\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\n\n@Injectable()\nexport class VerticalMenuItemState {\n public parent? = inject(VerticalMenuItemState, { optional: true, skipSelf: true });\n public readonly routeActivated = signal(false);\n public readonly hasChildren = signal(false);\n public readonly childStates = signal<VerticalMenuItemState[]>([]);\n public readonly expanded = signal(false);\n\n public hasActiveRoute(): boolean {\n return this.routeActivated() || this.childStates().some(x => x.hasActiveRoute());\n }\n}\n\n","import { Injectable, signal, TemplateRef } from '@angular/core';\n\n@Injectable()\nexport class VerticalMenuState {\n public readonly itemTemplate = signal<TemplateRef<any> | undefined>(undefined);\n\n}\n\n","import { booleanAttribute, Component, ContentChildren, EventEmitter, inject, input, Output, QueryList, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IsActiveMatchOptions, RouterModule } from '@angular/router';\nimport { VerticalMenuItemState } from './item-state';\nimport { VerticalMenuState } from './vertical-menu-state';\n\n@Component({\n selector: 'ng0-vmenu-item',\n templateUrl: './item.component.html',\n styleUrl: './item.component.scss',\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [CommonModule, RouterModule],\n providers: [VerticalMenuItemState],\n host: {\n '[class.ng0-has-children]': 'hasChildren()',\n '[class.ng0-expanded]': 'isExpanded()',\n '[class.ng0-has-active-route]': 'hasActiveRoute()'\n }\n})\nexport class VerticalMenuItemComponent {\n protected _menuItemState = inject(VerticalMenuItemState);\n protected _menuState = inject(VerticalMenuState);\n @ContentChildren(VerticalMenuItemComponent) protected _children!: QueryList<VerticalMenuItemComponent>;\n\n public readonly text = input<string>();\n public readonly tag = input<string>();\n public readonly tagCssClass = input<string | string[]>();\n public readonly icon = input<string>();\n\n /**\n * Router link\n */\n public readonly link = input<string | string[]>();\n public readonly routerLinkActiveOptions = input<{ exact: boolean } | IsActiveMatchOptions>({ exact: true });\n public readonly href = input<string>();\n public readonly target = input<'_blank' | '_parent' | '_self' | '_top'>('_blank');\n\n @Output() public readonly itemClick = new EventEmitter<PointerEvent>();\n\n ngOnInit(): void {\n if (this._menuItemState.parent) {\n this._menuItemState.parent.childStates().push(this._menuItemState);\n }\n }\n\n public hasActiveRoute(): boolean {\n return this._menuItemState.hasActiveRoute();\n }\n\n public hasChildren(): boolean {\n return this._menuItemState.hasChildren();\n }\n\n public isExpanded(): boolean {\n return this._menuItemState.expanded();\n }\n\n protected _onContentClick(e: PointerEvent) {\n if (this.hasChildren()) {\n this._menuItemState.expanded.update(x => !x);\n }\n\n this.itemClick.emit(e);\n }\n\n protected _onRouteChange(isActive: boolean) {\n this._menuItemState.routeActivated.set(isActive);\n }\n}\n\n","@let itemTemplate = _menuState.itemTemplate();\n\n<div class=\"ng0-vmenu-item-content\" (click)=\"_onContentClick($event)\">\n @if(hasChildren()) {\n <div class=\"ng0-vmenu-item-expander\"\n [class.ng0-expanded]=\"isExpanded()\"\n >\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n <span class=\"ng0-vmenu-item-text\">\n {{text()}}\n </span>\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n\n <div class=\"ng0-vmenu-item-end\">\n <div class=\"ng0-vmenu-item-expand-icon\">\n ❯\n </div>\n </div>\n\n }\n\n </div>\n }@else {\n <a class=\"ng0-vmenu-item-link\"\n [routerLink]=\"link()\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n routerLinkActive=\"ng0-active\"\n [routerLinkActiveOptions]=\"routerLinkActiveOptions()\"\n (isActiveChange)=\"_onRouteChange($event)\">\n\n @if(itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: this }\"></ng-container>\n }@else {\n @if(icon()) {\n <i class=\"ng0-vmenu-item-icon\" [ngClass]=\"icon()\"></i>\n }\n\n {{text()}}\n\n @if(tag()) {\n <span class=\"ng0-vmenu-item-tag\" [ngClass]=\"tagCssClass()\">{{tag()}}</span>\n }\n }\n </a>\n }\n</div>\n\n<ng-content></ng-content>","import { Component, inject, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CollapseComponent } from '@bootkit/ng0/components/collapse';\nimport { VerticalMenuItemState } from './item-state';\n\n@Component({\n selector: 'ng0-vmenu-item-children',\n templateUrl: './item-children.component.html',\n exportAs: 'ng0VmenuItemChildren',\n standalone: true,\n imports: [CommonModule, CollapseComponent],\n host: {\n '[class.ng0-expanded]': 'isExpanded()'\n }\n})\nexport class VerticalMenuItemChildrenComponent implements OnInit {\n private _menuItemState = inject(VerticalMenuItemState);\n\n ngOnInit(): void {\n this._menuItemState.hasChildren.set(true);\n }\n\n public isExpanded() {\n return this._menuItemState.expanded();\n }\n\n public expand() {\n return this._menuItemState.expanded.set(true);\n }\n\n public collapse() {\n return this._menuItemState.expanded.set(false);\n }\n}\n","<ng0-collapse [collapsed]=\"!isExpanded()\">\n <ng-content></ng-content>\n</ng0-collapse>\n\n<style>\n :host {\n display: block;\n padding-inline-start: .5rem;\n }\n</style>","import { Directive, inject, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: '[ng0VerticalMenuItemTemplate]',\n exportAs: 'ng0VerticalMenuItemTemplate',\n standalone: true\n})\nexport class VerticalMenuItemTemplateDirective {\n public readonly templateRef = inject(TemplateRef);\n}\n","import { AfterContentInit, ChangeDetectionStrategy, Component, ContentChild, inject, input } from '@angular/core';\nimport { MenuItem } from '@bootkit/ng0/common';\nimport { CommonModule } from '@angular/common';\nimport { User, UserDirective, UserStore } from '@bootkit/ng0/security';\nimport { VerticalMenuItemComponent } from './item.component';\nimport { RouterModule } from '@angular/router';\nimport { VerticalMenuDividerComponent } from './divider.component';\nimport { VerticalMenuHeaderComponent } from './header.component';\nimport { VerticalMenuState } from './vertical-menu-state';\nimport { VerticalMenuItemTemplateDirective } from './item-template.directive';\nimport { VerticalMenuItemChildrenComponent } from './item-children.component';\n\n@Component({\n selector: 'ng0-vmenu, ng0-vertical-menu',\n templateUrl: './vertical-menu.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n providers: [VerticalMenuState],\n imports: [\n CommonModule,\n RouterModule,\n UserDirective,\n VerticalMenuItemComponent,\n VerticalMenuDividerComponent,\n VerticalMenuHeaderComponent,\n VerticalMenuItemChildrenComponent\n ],\n})\nexport class VerticalMenuComponent implements AfterContentInit {\n protected readonly _userStore = inject<UserStore<User>>(UserStore);\n protected readonly _state = inject(VerticalMenuState);\n @ContentChild(VerticalMenuItemTemplateDirective) protected _itemTemplate?: VerticalMenuItemTemplateDirective;\n\n /**\n * Menu items \n */\n public readonly items = input<MenuItem[]>([]);\n\n ngAfterContentInit(): void {\n this._state.itemTemplate.set(this._itemTemplate?.templateRef);\n }\n}\n\n","<ng-content></ng-content>\n\n<ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: items()}\"></ng-container>\n\n<ng-template #menuItemTemplate let-items>\n @for (item of items; track $index) {\n @let itemType = item.type || 'node';\n\n <ng-container *ng0User=\"item.user\">\n @switch (itemType) {\n @case('divider') {\n <ng0-vmenu-divider></ng0-vmenu-divider>\n }\n @case('header') {\n <ng0-vmenu-header>{{item.text}}</ng0-vmenu-header>\n }\n @case('node') {\n <ng0-vmenu-item\n [text]=\"item.text\"\n [tag]=\"item.tag\"\n [tagCssClass]=\"item.tagCssClass\"\n [link]=\"item.routerLink\"\n [routerLinkActiveOptions]=\"item.routerLinkActiveOptions ?? {exact: true}\"\n [href]=\"item.href\"\n [icon]=\"item.icon\"\n [target]=\"item.target\"\n [ngClass]=\"item.cssClass\">\n @if(item.children?.length) {\n <ng0-vmenu-item-children>\n <ng-container *ngTemplateOutlet=\"menuItemTemplate; context: { $implicit: item.children }\">\n </ng-container>\n </ng0-vmenu-item-children>\n }\n </ng0-vmenu-item>\n }\n }\n </ng-container>\n }\n</ng-template>\n\n\n<style>\n :host {\n display: block;\n }\n</style>","import { NgModule } from '@angular/core';\nimport { VerticalMenuItemComponent } from './item.component';\nimport { VerticalMenuComponent } from './vertical-menu.component';\nimport { VerticalMenuDividerComponent } from './divider.component';\nimport { VerticalMenuHeaderComponent } from './header.component';\nimport { VerticalMenuItemChildrenComponent } from './item-children.component';\nimport { VerticalMenuItemTemplateDirective } from './item-template.directive';\n\nconst items = [\n VerticalMenuComponent,\n VerticalMenuItemComponent,\n VerticalMenuItemChildrenComponent,\n VerticalMenuDividerComponent,\n VerticalMenuHeaderComponent,\n VerticalMenuItemTemplateDirective\n];\n\n@NgModule({\n imports: items,\n exports: items\n})\nexport class VerticalMenuModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -7,6 +7,22 @@ class User {
7
7
  constructor(claims) {
8
8
  this.claims.set(claims);
9
9
  }
10
+ addClaim(claim) {
11
+ let currentClaims = this.claims();
12
+ if (currentClaims.includes(claim)) {
13
+ return false;
14
+ }
15
+ this.claims.set([...currentClaims, claim]);
16
+ return true;
17
+ }
18
+ removeClaim(claim) {
19
+ let currentClaims = this.claims();
20
+ if (!currentClaims.includes(claim)) {
21
+ return false;
22
+ }
23
+ this.claims.set(currentClaims.filter(x => x !== claim));
24
+ return true;
25
+ }
10
26
  hasAllClaims(claims) {
11
27
  return claims.every(x => this.claims().some(y => x === y));
12
28
  }
@@ -34,18 +50,33 @@ class User {
34
50
  }
35
51
  }
36
52
 
53
+ /**
54
+ * Service to manage the current user state.
55
+ */
37
56
  class UserStore {
38
57
  user = signal(undefined, ...(ngDevMode ? [{ debugName: "user" }] : []));
39
- checkShowCondition(condition) {
58
+ /**
59
+ * Check if the given condition is met by the current user.
60
+ * If there is no user, only 'false' condition is met.
61
+ * If there is a user, 'true' conditions and claims will be checked.
62
+ * @param condition The user condition to check
63
+ * @returns Whether the condition is met
64
+ */
65
+ checkCondition(condition) {
40
66
  let user = this.user();
41
67
  if (user) {
42
- if (condition == 'set') {
68
+ if (condition === true) {
43
69
  return true;
44
70
  }
45
- return user.hasClaim(condition);
71
+ else if (condition === false) {
72
+ return false;
73
+ }
74
+ else {
75
+ return user.hasClaim(condition);
76
+ }
46
77
  }
47
78
  else {
48
- return condition == 'unset';
79
+ return condition === false;
49
80
  }
50
81
  }
51
82
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: UserStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -56,6 +87,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImpo
56
87
  args: [{ providedIn: 'root' }]
57
88
  }] });
58
89
 
90
+ /**
91
+ * @deprecated use *ng0User instead
92
+ */
59
93
  class ClaimDirective {
60
94
  _viewCreated = false;
61
95
  _templateRef = inject((TemplateRef));
@@ -92,6 +126,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImpo
92
126
  }]
93
127
  }], ctorParameters: () => [], propDecorators: { claim: [{ type: i0.Input, args: [{ isSignal: true, alias: "ng0Claim", required: false }] }] } });
94
128
 
129
+ /**
130
+ * @deprecated use *ng0User directive instead
131
+ */
95
132
  class GuestUserDirective {
96
133
  _created = false;
97
134
  constructor(templateRef, viewContainer, userStore) {
@@ -138,11 +175,93 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImpo
138
175
  }]
139
176
  }] });
140
177
 
178
+ /**
179
+ * Directive to conditionally display content based on user claims or conditions.
180
+ * If there is no condition provided, the content is always shown.
181
+ * If a condition is provided, it checks against the current user.
182
+ * @example
183
+ * ```html
184
+ * <ng-container *ng0User="true">
185
+ * This content is shown only if there is a logged-in user, regardless of claims.
186
+ * </ng-container>
187
+ * <ng-container *ng0User="false">
188
+ * This content is shown only if there is no logged-in user.
189
+ * </ng-container>
190
+ * <ng-container *ng0User="'admin'">
191
+ * This content is shown only if the user has the 'admin' claim.
192
+ * </ng-container>
193
+ * <ng-container *ng0User="{ all: ['read', 'write'] }">
194
+ * This content is shown only if the user has both 'read' and 'write' claims.
195
+ * </ng-container>
196
+ * <ng-container *ng0User="{ any: ['editor', 'contributor'] }">
197
+ * This content is shown if the user has either 'editor' or 'contributor' claims.
198
+ * </ng-container>
199
+ * <ng-container *ng0User="null">
200
+ * This content is always shown, regardless of user state.
201
+ * </ng-container>
202
+ * ```
203
+ */
204
+ class UserDirective {
205
+ _viewCreated = false;
206
+ _templateRef = inject((TemplateRef));
207
+ _viewContainer = inject(ViewContainerRef);
208
+ _userStore = inject(UserStore);
209
+ /**
210
+ * Show condition to check
211
+ *
212
+ */
213
+ condition = input('', ...(ngDevMode ? [{ debugName: "condition", alias: 'ng0User' }] : [{ alias: 'ng0User' }]));
214
+ constructor() {
215
+ effect(() => {
216
+ let condition = this.condition();
217
+ let user = this._userStore.user();
218
+ let show;
219
+ if (condition === null || condition === undefined) {
220
+ show = true;
221
+ }
222
+ else {
223
+ if (user) {
224
+ if (condition === true) {
225
+ show = true;
226
+ }
227
+ else if (condition === false) {
228
+ show = false;
229
+ }
230
+ else {
231
+ show = user.hasClaim(condition);
232
+ }
233
+ }
234
+ else {
235
+ show = condition === false;
236
+ }
237
+ }
238
+ if (show && !this._viewCreated) {
239
+ this._viewContainer.createEmbeddedView(this._templateRef);
240
+ this._viewCreated = true;
241
+ }
242
+ else if (!show && this._viewCreated) {
243
+ this._viewContainer.clear();
244
+ this._viewCreated = false;
245
+ }
246
+ });
247
+ }
248
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: UserDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
249
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.11", type: UserDirective, isStandalone: true, selector: "[ng0User]", inputs: { condition: { classPropertyName: "condition", publicName: "ng0User", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["ng0User"], ngImport: i0 });
250
+ }
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.11", ngImport: i0, type: UserDirective, decorators: [{
252
+ type: Directive,
253
+ args: [{
254
+ selector: '[ng0User]',
255
+ exportAs: 'ng0User',
256
+ standalone: true
257
+ }]
258
+ }], ctorParameters: () => [], propDecorators: { condition: [{ type: i0.Input, args: [{ isSignal: true, alias: "ng0User", required: false }] }] } });
259
+
141
260
  // export * from './types';
142
261
 
143
262
  /**
144
263
  * Generated bundle index. Do not edit.
145
264
  */
146
265
 
147
- export { ClaimDirective, GuestUserDirective, SecurityModule, User, UserStore };
266
+ export { ClaimDirective, GuestUserDirective, SecurityModule, User, UserDirective, UserStore };
148
267
  //# sourceMappingURL=bootkit-ng0-security.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootkit-ng0-security.mjs","sources":["../../../projects/ng0/security/user.ts","../../../projects/ng0/security/user-store.ts","../../../projects/ng0/security/claim.directive.ts","../../../projects/ng0/security/guest-user.directive.ts","../../../projects/ng0/security/security.module.ts","../../../projects/ng0/security/public-api.ts","../../../projects/ng0/security/bootkit-ng0-security.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { ClaimLike, ClaimObject } from '@bootkit/ng0/common';\n\n/** User */\nexport class User {\n public readonly claims = signal<string[]>([]);\n\n constructor(claims: string[]) {\n this.claims.set(claims);\n }\n\n public hasAllClaims(claims: string[]): boolean {\n return claims.every(x => this.claims().some(y => x === y));\n }\n\n public hasAnyClaim(claims: string[]): boolean {\n return claims.length == 0 || claims.some(x => this.claims().some(y => x === y));\n }\n\n public hasClaim(claim: ClaimLike): boolean {\n var type = typeof claim;\n if (type === 'string') {\n return this.claims().some(x => x === claim);\n }\n\n if (type === 'object') {\n const claimObject = claim as ClaimObject;\n if (claimObject?.any && claimObject?.all) {\n throw Error('Setting \"any\" and \"all\" at the same time is not valid.');\n }\n\n if (Array.isArray(claimObject?.any)) {\n return this.hasAnyClaim(claimObject.any);\n }\n if (Array.isArray(claimObject?.all)) {\n return this.hasAllClaims(claimObject.all);\n }\n }\n\n throw Error(`Invalid claim to check: ${JSON.stringify(claim)}`);\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { User } from './user';\nimport { ShowCondition } from '@bootkit/ng0/common';\n\n@Injectable({ providedIn: 'root' })\nexport class UserStore<U extends User = User> {\n public readonly user = signal<U | null | undefined>(undefined);\n\n checkShowCondition(condition: ShowCondition): boolean {\n let user = this.user();\n\n if (user) {\n if (condition == 'set') {\n return true;\n }\n\n return user.hasClaim(condition);\n } else {\n return condition == 'unset';\n }\n }\n}","import { Directive, TemplateRef, ViewContainerRef, input, effect, inject } from '@angular/core';\nimport { UserStore } from './user-store';\nimport { ClaimLike } from '@bootkit/ng0/common';\n\n@Directive({\n selector: '[ng0Claim]',\n exportAs: 'ng0Claim',\n standalone: true\n})\nexport class ClaimDirective {\n private _viewCreated = false;\n private _templateRef = inject(TemplateRef<any>);\n private _viewContainer = inject(ViewContainerRef);\n private _userStore = inject(UserStore);\n\n /**\n * Claim to check\n */\n public readonly claim = input<ClaimLike | null | undefined>('', { alias: 'ng0Claim' });\n\n constructor() {\n effect(() => {\n let claim = this.claim();\n let user = this._userStore.user();\n let show = !user ? false : (claim == undefined ? true : user.hasClaim(claim))\n\n if (show && !this._viewCreated) {\n this._viewContainer.createEmbeddedView(this._templateRef);\n this._viewCreated = true;\n } else if (!show && this._viewCreated) {\n this._viewContainer.clear();\n this._viewCreated = false;\n }\n })\n }\n}\n","import { Directive, TemplateRef, ViewContainerRef, effect } from '@angular/core';\nimport { UserStore } from './user-store';\n\n@Directive({\n selector: '[ng0GuestUser]',\n exportAs: 'ng0GuestUser',\n standalone: true\n})\nexport class GuestUserDirective {\n private _created = false;\n\n constructor(\n templateRef: TemplateRef<any>,\n viewContainer: ViewContainerRef,\n userStore: UserStore,\n ) {\n effect(() => {\n let show = userStore.user() == undefined\n\n if (show && !this._created) {\n viewContainer.createEmbeddedView(templateRef);\n this._created = true;\n } else if (!show && this._created) {\n viewContainer.clear();\n this._created = false;\n }\n })\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ClaimDirective } from './claim.directive';\nimport { GuestUserDirective } from './guest-user.directive';\n\nconst items = [\n ClaimDirective,\n GuestUserDirective\n]\n\n@NgModule({\n imports: items,\n exports: items\n})\nexport class SecurityModule { }\n","// export * from './types';\nexport * from './user';\nexport * from './user-store';\nexport * from './claim.directive';\nexport * from './guest-user.directive';\nexport * from './security.module';\n ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UserStore"],"mappings":"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"}
1
+ {"version":3,"file":"bootkit-ng0-security.mjs","sources":["../../../projects/ng0/security/user.ts","../../../projects/ng0/security/user-store.ts","../../../projects/ng0/security/claim.directive.ts","../../../projects/ng0/security/guest-user.directive.ts","../../../projects/ng0/security/security.module.ts","../../../projects/ng0/security/user.directive.ts","../../../projects/ng0/security/public-api.ts","../../../projects/ng0/security/bootkit-ng0-security.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { ClaimLike, ClaimObject } from '@bootkit/ng0/common';\n\n/** User */\nexport class User {\n public readonly claims = signal<string[]>([]);\n\n constructor(claims: string[]) {\n this.claims.set(claims);\n }\n\n public addClaim(claim: string): boolean {\n let currentClaims = this.claims();\n if (currentClaims.includes(claim)) {\n return false;\n }\n this.claims.set([...currentClaims, claim]);\n return true;\n }\n\n public removeClaim(claim: string): boolean {\n let currentClaims = this.claims();\n if (!currentClaims.includes(claim)) {\n return false;\n }\n this.claims.set(currentClaims.filter(x => x !== claim));\n return true;\n }\n\n public hasAllClaims(claims: string[]): boolean {\n return claims.every(x => this.claims().some(y => x === y));\n }\n\n public hasAnyClaim(claims: string[]): boolean {\n return claims.length == 0 || claims.some(x => this.claims().some(y => x === y));\n }\n\n public hasClaim(claim: ClaimLike): boolean {\n var type = typeof claim;\n if (type === 'string') {\n return this.claims().some(x => x === claim);\n }\n\n if (type === 'object') {\n const claimObject = claim as ClaimObject;\n if (claimObject?.any && claimObject?.all) {\n throw Error('Setting \"any\" and \"all\" at the same time is not valid.');\n }\n\n if (Array.isArray(claimObject?.any)) {\n return this.hasAnyClaim(claimObject.any);\n }\n if (Array.isArray(claimObject?.all)) {\n return this.hasAllClaims(claimObject.all);\n }\n }\n\n throw Error(`Invalid claim to check: ${JSON.stringify(claim)}`);\n }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { User } from './user';\nimport { UserCondition } from '@bootkit/ng0/common';\n\n/**\n * Service to manage the current user state.\n */\n@Injectable({ providedIn: 'root' })\nexport class UserStore<U extends User = User> {\n public readonly user = signal<U | null | undefined>(undefined);\n\n /**\n * Check if the given condition is met by the current user.\n * If there is no user, only 'false' condition is met.\n * If there is a user, 'true' conditions and claims will be checked.\n * @param condition The user condition to check\n * @returns Whether the condition is met\n */\n checkCondition(condition: UserCondition): boolean {\n let user = this.user();\n\n if (user) {\n if (condition === true) {\n return true;\n } else if (condition === false) {\n return false;\n } else {\n return user.hasClaim(condition);\n }\n } else {\n return condition === false;\n }\n }\n}","import { Directive, TemplateRef, ViewContainerRef, input, effect, inject } from '@angular/core';\nimport { UserStore } from './user-store';\nimport { ClaimLike } from '@bootkit/ng0/common';\n\n/**\n * @deprecated use *ng0User instead\n */\n@Directive({\n selector: '[ng0Claim]',\n exportAs: 'ng0Claim',\n standalone: true\n})\nexport class ClaimDirective {\n private _viewCreated = false;\n private _templateRef = inject(TemplateRef<any>);\n private _viewContainer = inject(ViewContainerRef);\n private _userStore = inject(UserStore);\n\n /**\n * Claim to check\n */\n public readonly claim = input<ClaimLike | null | undefined>('', { alias: 'ng0Claim' });\n\n constructor() {\n effect(() => {\n let claim = this.claim();\n let user = this._userStore.user();\n let show = !user ? false : (claim == undefined ? true : user.hasClaim(claim))\n\n if (show && !this._viewCreated) {\n this._viewContainer.createEmbeddedView(this._templateRef);\n this._viewCreated = true;\n } else if (!show && this._viewCreated) {\n this._viewContainer.clear();\n this._viewCreated = false;\n }\n })\n }\n}\n","import { Directive, TemplateRef, ViewContainerRef, effect } from '@angular/core';\nimport { UserStore } from './user-store';\n\n/**\n * @deprecated use *ng0User directive instead\n */\n@Directive({\n selector: '[ng0GuestUser]',\n exportAs: 'ng0GuestUser',\n standalone: true\n})\nexport class GuestUserDirective {\n private _created = false;\n\n constructor(\n templateRef: TemplateRef<any>,\n viewContainer: ViewContainerRef,\n userStore: UserStore,\n ) {\n effect(() => {\n let show = userStore.user() == undefined\n\n if (show && !this._created) {\n viewContainer.createEmbeddedView(templateRef);\n this._created = true;\n } else if (!show && this._created) {\n viewContainer.clear();\n this._created = false;\n }\n })\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ClaimDirective } from './claim.directive';\nimport { GuestUserDirective } from './guest-user.directive';\n\nconst items = [\n ClaimDirective,\n GuestUserDirective\n]\n\n@NgModule({\n imports: items,\n exports: items\n})\nexport class SecurityModule { }\n","import { Directive, TemplateRef, ViewContainerRef, input, effect, inject } from '@angular/core';\nimport { UserStore } from './user-store';\nimport { UserCondition } from '@bootkit/ng0/common';\nimport { User } from './user';\n\n/**\n * Directive to conditionally display content based on user claims or conditions.\n * If there is no condition provided, the content is always shown.\n * If a condition is provided, it checks against the current user.\n * @example\n * ```html\n * <ng-container *ng0User=\"true\">\n * This content is shown only if there is a logged-in user, regardless of claims.\n * </ng-container>\n * <ng-container *ng0User=\"false\">\n * This content is shown only if there is no logged-in user.\n * </ng-container>\n * <ng-container *ng0User=\"'admin'\">\n * This content is shown only if the user has the 'admin' claim.\n * </ng-container>\n * <ng-container *ng0User=\"{ all: ['read', 'write'] }\">\n * This content is shown only if the user has both 'read' and 'write' claims.\n * </ng-container>\n * <ng-container *ng0User=\"{ any: ['editor', 'contributor'] }\">\n * This content is shown if the user has either 'editor' or 'contributor' claims.\n * </ng-container>\n * <ng-container *ng0User=\"null\">\n * This content is always shown, regardless of user state.\n * </ng-container>\n * ```\n */\n@Directive({\n selector: '[ng0User]',\n exportAs: 'ng0User',\n standalone: true\n})\nexport class UserDirective {\n private _viewCreated = false;\n private readonly _templateRef = inject(TemplateRef<any>);\n private readonly _viewContainer = inject(ViewContainerRef);\n private readonly _userStore = inject<UserStore<User>>(UserStore);\n\n /**\n * Show condition to check\n * \n */\n public readonly condition = input<UserCondition | null | undefined>('', { alias: 'ng0User' });\n\n constructor() {\n effect(() => {\n let condition = this.condition();\n let user = this._userStore.user();\n let show: boolean;\n\n if (condition === null || condition === undefined) {\n show = true;\n } else {\n if (user) {\n if (condition === true) {\n show = true;\n } else if (condition === false) {\n show = false;\n } else {\n show = user.hasClaim(condition);\n }\n } else {\n show = condition === false;\n }\n }\n\n if (show && !this._viewCreated) {\n this._viewContainer.createEmbeddedView(this._templateRef);\n this._viewCreated = true;\n } else if (!show && this._viewCreated) {\n this._viewContainer.clear();\n this._viewCreated = false;\n }\n })\n }\n}\n","// export * from './types';\nexport * from './user';\nexport * from './user-store';\nexport * from './claim.directive';\nexport * from './guest-user.directive';\nexport * from './security.module';\nexport * from './user.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.UserStore"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bootkit/ng0",
3
- "version": "0.0.0-alpha.45",
3
+ "version": "0.0.0-alpha.47",
4
4
  "description": "Angular+Bootstrap Component Library",
5
5
  "homepage": "https://bootkitlib.github.io/",
6
6
  "author": "BootKit",
@@ -35,14 +35,14 @@
35
35
  "types": "./index.d.ts",
36
36
  "default": "./fesm2022/bootkit-ng0.mjs"
37
37
  },
38
- "./common": {
39
- "types": "./common/index.d.ts",
40
- "default": "./fesm2022/bootkit-ng0-common.mjs"
41
- },
42
38
  "./data": {
43
39
  "types": "./data/index.d.ts",
44
40
  "default": "./fesm2022/bootkit-ng0-data.mjs"
45
41
  },
42
+ "./common": {
43
+ "types": "./common/index.d.ts",
44
+ "default": "./fesm2022/bootkit-ng0-common.mjs"
45
+ },
46
46
  "./date": {
47
47
  "types": "./date/index.d.ts",
48
48
  "default": "./fesm2022/bootkit-ng0-date.mjs"
@@ -1,23 +1,38 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { TemplateRef, ViewContainerRef } from '@angular/core';
3
- import { ClaimLike, ShowCondition } from '@bootkit/ng0/common';
3
+ import { ClaimLike, UserCondition } from '@bootkit/ng0/common';
4
4
 
5
5
  /** User */
6
6
  declare class User {
7
7
  readonly claims: i0.WritableSignal<string[]>;
8
8
  constructor(claims: string[]);
9
+ addClaim(claim: string): boolean;
10
+ removeClaim(claim: string): boolean;
9
11
  hasAllClaims(claims: string[]): boolean;
10
12
  hasAnyClaim(claims: string[]): boolean;
11
13
  hasClaim(claim: ClaimLike): boolean;
12
14
  }
13
15
 
16
+ /**
17
+ * Service to manage the current user state.
18
+ */
14
19
  declare class UserStore<U extends User = User> {
15
20
  readonly user: i0.WritableSignal<U | null | undefined>;
16
- checkShowCondition(condition: ShowCondition): boolean;
21
+ /**
22
+ * Check if the given condition is met by the current user.
23
+ * If there is no user, only 'false' condition is met.
24
+ * If there is a user, 'true' conditions and claims will be checked.
25
+ * @param condition The user condition to check
26
+ * @returns Whether the condition is met
27
+ */
28
+ checkCondition(condition: UserCondition): boolean;
17
29
  static ɵfac: i0.ɵɵFactoryDeclaration<UserStore<any>, never>;
18
30
  static ɵprov: i0.ɵɵInjectableDeclaration<UserStore<any>>;
19
31
  }
20
32
 
33
+ /**
34
+ * @deprecated use *ng0User instead
35
+ */
21
36
  declare class ClaimDirective {
22
37
  private _viewCreated;
23
38
  private _templateRef;
@@ -32,6 +47,9 @@ declare class ClaimDirective {
32
47
  static ɵdir: i0.ɵɵDirectiveDeclaration<ClaimDirective, "[ng0Claim]", ["ng0Claim"], { "claim": { "alias": "ng0Claim"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
48
  }
34
49
 
50
+ /**
51
+ * @deprecated use *ng0User directive instead
52
+ */
35
53
  declare class GuestUserDirective {
36
54
  private _created;
37
55
  constructor(templateRef: TemplateRef<any>, viewContainer: ViewContainerRef, userStore: UserStore);
@@ -45,4 +63,45 @@ declare class SecurityModule {
45
63
  static ɵinj: i0.ɵɵInjectorDeclaration<SecurityModule>;
46
64
  }
47
65
 
48
- export { ClaimDirective, GuestUserDirective, SecurityModule, User, UserStore };
66
+ /**
67
+ * Directive to conditionally display content based on user claims or conditions.
68
+ * If there is no condition provided, the content is always shown.
69
+ * If a condition is provided, it checks against the current user.
70
+ * @example
71
+ * ```html
72
+ * <ng-container *ng0User="true">
73
+ * This content is shown only if there is a logged-in user, regardless of claims.
74
+ * </ng-container>
75
+ * <ng-container *ng0User="false">
76
+ * This content is shown only if there is no logged-in user.
77
+ * </ng-container>
78
+ * <ng-container *ng0User="'admin'">
79
+ * This content is shown only if the user has the 'admin' claim.
80
+ * </ng-container>
81
+ * <ng-container *ng0User="{ all: ['read', 'write'] }">
82
+ * This content is shown only if the user has both 'read' and 'write' claims.
83
+ * </ng-container>
84
+ * <ng-container *ng0User="{ any: ['editor', 'contributor'] }">
85
+ * This content is shown if the user has either 'editor' or 'contributor' claims.
86
+ * </ng-container>
87
+ * <ng-container *ng0User="null">
88
+ * This content is always shown, regardless of user state.
89
+ * </ng-container>
90
+ * ```
91
+ */
92
+ declare class UserDirective {
93
+ private _viewCreated;
94
+ private readonly _templateRef;
95
+ private readonly _viewContainer;
96
+ private readonly _userStore;
97
+ /**
98
+ * Show condition to check
99
+ *
100
+ */
101
+ readonly condition: i0.InputSignal<UserCondition | null | undefined>;
102
+ constructor();
103
+ static ɵfac: i0.ɵɵFactoryDeclaration<UserDirective, never>;
104
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UserDirective, "[ng0User]", ["ng0User"], { "condition": { "alias": "ng0User"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
105
+ }
106
+
107
+ export { ClaimDirective, GuestUserDirective, SecurityModule, User, UserDirective, UserStore };