@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 +14 -3
- package/components/vertical-menu/index.d.ts +0 -1
- package/fesm2022/bootkit-ng0-components-vertical-menu.mjs +8 -12
- package/fesm2022/bootkit-ng0-components-vertical-menu.mjs.map +1 -1
- package/fesm2022/bootkit-ng0-security.mjs +124 -5
- package/fesm2022/bootkit-ng0-security.mjs.map +1 -1
- package/package.json +5 -5
- package/security/index.d.ts +62 -3
package/common/index.d.ts
CHANGED
|
@@ -22,7 +22,14 @@ interface ClaimObject {
|
|
|
22
22
|
*
|
|
23
23
|
*/
|
|
24
24
|
type ClaimLike = string | ClaimObject;
|
|
25
|
-
|
|
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?:
|
|
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,
|
|
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-
|
|
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-
|
|
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: "
|
|
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: "
|
|
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
|
-
|
|
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
|
|
68
|
+
if (condition === true) {
|
|
43
69
|
return true;
|
|
44
70
|
}
|
|
45
|
-
|
|
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
|
|
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.
|
|
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"
|
package/security/index.d.ts
CHANGED
|
@@ -1,23 +1,38 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { TemplateRef, ViewContainerRef } from '@angular/core';
|
|
3
|
-
import { ClaimLike,
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|