@smallpearl/ngx-helper 0.29.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +230 -0
  2. package/core/index.d.ts +2 -0
  3. package/core/src/ngx-helper.d.ts +7 -0
  4. package/core/src/version.d.ts +1 -0
  5. package/entity-field/index.d.ts +2 -0
  6. package/entity-field/src/entity-field-spec.d.ts +69 -0
  7. package/entity-field/src/provider.d.ts +27 -0
  8. package/fesm2022/smallpearl-ngx-helper-core.mjs +23 -0
  9. package/fesm2022/smallpearl-ngx-helper-core.mjs.map +1 -0
  10. package/fesm2022/smallpearl-ngx-helper-entity-field.mjs +112 -0
  11. package/fesm2022/smallpearl-ngx-helper-entity-field.mjs.map +1 -0
  12. package/fesm2022/smallpearl-ngx-helper-forms.mjs +112 -0
  13. package/fesm2022/smallpearl-ngx-helper-forms.mjs.map +1 -0
  14. package/fesm2022/smallpearl-ngx-helper-hover-dropdown.mjs +108 -0
  15. package/fesm2022/smallpearl-ngx-helper-hover-dropdown.mjs.map +1 -0
  16. package/fesm2022/smallpearl-ngx-helper-locale.mjs +296 -0
  17. package/fesm2022/smallpearl-ngx-helper-locale.mjs.map +1 -0
  18. package/fesm2022/smallpearl-ngx-helper-mat-busy-wheel.mjs +504 -0
  19. package/fesm2022/smallpearl-ngx-helper-mat-busy-wheel.mjs.map +1 -0
  20. package/fesm2022/smallpearl-ngx-helper-mat-context-menu.mjs +184 -0
  21. package/fesm2022/smallpearl-ngx-helper-mat-context-menu.mjs.map +1 -0
  22. package/fesm2022/smallpearl-ngx-helper-mat-entity-crud.mjs +1486 -0
  23. package/fesm2022/smallpearl-ngx-helper-mat-entity-crud.mjs.map +1 -0
  24. package/fesm2022/smallpearl-ngx-helper-mat-entity-list.mjs +800 -0
  25. package/fesm2022/smallpearl-ngx-helper-mat-entity-list.mjs.map +1 -0
  26. package/fesm2022/smallpearl-ngx-helper-mat-file-input.mjs +328 -0
  27. package/fesm2022/smallpearl-ngx-helper-mat-file-input.mjs.map +1 -0
  28. package/fesm2022/smallpearl-ngx-helper-mat-form-error.mjs +468 -0
  29. package/fesm2022/smallpearl-ngx-helper-mat-form-error.mjs.map +1 -0
  30. package/fesm2022/smallpearl-ngx-helper-mat-select-entity.mjs +854 -0
  31. package/fesm2022/smallpearl-ngx-helper-mat-select-entity.mjs.map +1 -0
  32. package/fesm2022/smallpearl-ngx-helper-mat-side-menu-layout.mjs +930 -0
  33. package/fesm2022/smallpearl-ngx-helper-mat-side-menu-layout.mjs.map +1 -0
  34. package/fesm2022/smallpearl-ngx-helper-mat-tel-input.mjs +926 -0
  35. package/fesm2022/smallpearl-ngx-helper-mat-tel-input.mjs.map +1 -0
  36. package/fesm2022/smallpearl-ngx-helper-sideload.mjs +111 -0
  37. package/fesm2022/smallpearl-ngx-helper-sideload.mjs.map +1 -0
  38. package/fesm2022/smallpearl-ngx-helper-stationary-with-line-items.mjs +384 -0
  39. package/fesm2022/smallpearl-ngx-helper-stationary-with-line-items.mjs.map +1 -0
  40. package/fesm2022/smallpearl-ngx-helper.mjs +13 -0
  41. package/fesm2022/smallpearl-ngx-helper.mjs.map +1 -0
  42. package/forms/index.d.ts +1 -0
  43. package/forms/src/validation-error-handler.d.ts +52 -0
  44. package/hover-dropdown/index.d.ts +1 -0
  45. package/hover-dropdown/src/hover-dropdown.directive.d.ts +41 -0
  46. package/index.d.ts +5 -0
  47. package/locale/index.d.ts +5 -0
  48. package/locale/src/currency.pipe.d.ts +14 -0
  49. package/locale/src/date.pipe.d.ts +14 -0
  50. package/locale/src/format-currency.d.ts +1 -0
  51. package/locale/src/format-date.d.ts +2 -0
  52. package/locale/src/is-empty.d.ts +1 -0
  53. package/locale/src/providers.d.ts +20 -0
  54. package/mat-busy-wheel/index.d.ts +4 -0
  55. package/mat-busy-wheel/src/busy-wheel-op.d.ts +65 -0
  56. package/mat-busy-wheel/src/busy-wheel.component.d.ts +12 -0
  57. package/mat-busy-wheel/src/busy-wheel.service.d.ts +42 -0
  58. package/mat-busy-wheel/src/host-busy-wheel.directive.d.ts +35 -0
  59. package/mat-context-menu/index.d.ts +1 -0
  60. package/mat-context-menu/src/mat-context-menu.component.d.ts +54 -0
  61. package/mat-entity-crud/index.d.ts +5 -0
  62. package/mat-entity-crud/src/default-config.d.ts +9 -0
  63. package/mat-entity-crud/src/form-view-host.component.d.ts +34 -0
  64. package/mat-entity-crud/src/mat-entity-crud-form-base.d.ts +95 -0
  65. package/mat-entity-crud/src/mat-entity-crud-internal-types.d.ts +66 -0
  66. package/mat-entity-crud/src/mat-entity-crud-types.d.ts +141 -0
  67. package/mat-entity-crud/src/mat-entity-crud.component.d.ts +267 -0
  68. package/mat-entity-crud/src/preview-host.component.d.ts +19 -0
  69. package/mat-entity-crud/src/preview-pane.component.d.ts +27 -0
  70. package/mat-entity-crud/src/providers.d.ts +3 -0
  71. package/mat-entity-list/index.d.ts +3 -0
  72. package/mat-entity-list/src/config.d.ts +6 -0
  73. package/mat-entity-list/src/mat-entity-list-types.d.ts +53 -0
  74. package/mat-entity-list/src/mat-entity-list.component.d.ts +209 -0
  75. package/mat-entity-list/src/providers.d.ts +3 -0
  76. package/mat-file-input/README.md +63 -0
  77. package/mat-file-input/index.d.ts +1 -0
  78. package/mat-file-input/src/mat-file-input.component.d.ts +58 -0
  79. package/mat-form-error/README.md +306 -0
  80. package/mat-form-error/index.d.ts +6 -0
  81. package/mat-form-error/src/locales/en.d.ts +4 -0
  82. package/mat-form-error/src/locales/hu.d.ts +4 -0
  83. package/mat-form-error/src/locales/index.d.ts +3 -0
  84. package/mat-form-error/src/locales/pt-br.d.ts +4 -0
  85. package/mat-form-error/src/ngx-error-list.component.d.ts +9 -0
  86. package/mat-form-error/src/ngx-mat-error-control.d.ts +17 -0
  87. package/mat-form-error/src/ngx-mat-error-def.directive.d.ts +30 -0
  88. package/mat-form-error/src/ngx-mat-errors-for-date-range-picker.directive.d.ts +8 -0
  89. package/mat-form-error/src/ngx-mat-errors.component.d.ts +23 -0
  90. package/mat-form-error/src/types.d.ts +68 -0
  91. package/mat-form-error/src/utils/coerce-to-observable.d.ts +3 -0
  92. package/mat-form-error/src/utils/distinct-until-error-changed.d.ts +2 -0
  93. package/mat-form-error/src/utils/find-error-for-control.d.ts +9 -0
  94. package/mat-form-error/src/utils/get-abstract-controls.d.ts +3 -0
  95. package/mat-form-error/src/utils/get-control-with-error.d.ts +3 -0
  96. package/mat-select-entity/index.d.ts +2 -0
  97. package/mat-select-entity/src/mat-select-entity.component.d.ts +207 -0
  98. package/mat-select-entity/src/providers.d.ts +9 -0
  99. package/mat-side-menu-layout/index.d.ts +6 -0
  100. package/mat-side-menu-layout/src/layout.service.d.ts +23 -0
  101. package/mat-side-menu-layout/src/mat-menu-layout.component.d.ts +39 -0
  102. package/mat-side-menu-layout/src/mat-menu-layout.module.d.ts +18 -0
  103. package/mat-side-menu-layout/src/mat-menu-list-item.component.d.ts +36 -0
  104. package/mat-side-menu-layout/src/mat-menu-pane.component.d.ts +66 -0
  105. package/mat-side-menu-layout/src/nav-item.d.ts +10 -0
  106. package/mat-tel-input/README.md +18 -0
  107. package/mat-tel-input/index.d.ts +2 -0
  108. package/mat-tel-input/src/country-codes.d.ts +5 -0
  109. package/mat-tel-input/src/mat-telephone.component.d.ts +129 -0
  110. package/mat-tel-input/src/providers.d.ts +38 -0
  111. package/ngx-helper.d.ts +2 -0
  112. package/package.json +114 -0
  113. package/public-api.d.ts +1 -0
  114. package/sideload/index.d.ts +1 -0
  115. package/sideload/src/sideload.d.ts +17 -0
  116. package/stationary-with-line-items/index.d.ts +1 -0
  117. package/stationary-with-line-items/src/stationary-with-line-items.component.d.ts +74 -0
@@ -0,0 +1,930 @@
1
+ import * as i1 from '@angular/cdk/layout';
2
+ import { Breakpoints } from '@angular/cdk/layout';
3
+ import * as i0 from '@angular/core';
4
+ import { Injectable, Component, ChangeDetectionStrategy, Input, HostBinding, ViewChildren, viewChildren, effect, runInInjectionContext, ViewChild, NgModule } from '@angular/core';
5
+ import * as i1$1 from '@angular/router';
6
+ import { NavigationEnd, RouterOutlet } from '@angular/router';
7
+ import { Subject, BehaviorSubject, takeUntil, tap, filter } from 'rxjs';
8
+ import { trigger, state, style, transition, animate } from '@angular/animations';
9
+ import * as i2 from '@angular/material/dialog';
10
+ import { MatDialogModule } from '@angular/material/dialog';
11
+ import * as i3 from '@angular/common';
12
+ import { CommonModule } from '@angular/common';
13
+ import * as i4 from '@angular/material/icon';
14
+ import { MatIconModule } from '@angular/material/icon';
15
+ import * as i5 from '@angular/material/list';
16
+ import { MatListModule } from '@angular/material/list';
17
+ import * as i4$1 from '@angular/material/sidenav';
18
+ import { MatSidenavModule } from '@angular/material/sidenav';
19
+ import * as i5$1 from '@angular/material/toolbar';
20
+ import { MatToolbarModule } from '@angular/material/toolbar';
21
+ import * as i7 from '@angular/material/button';
22
+ import { MatButtonModule } from '@angular/material/button';
23
+ import { MatMenuModule } from '@angular/material/menu';
24
+
25
+ class LayoutService {
26
+ breakpointObserver;
27
+ marginTop = 64;
28
+ toolbarHeight = 64;
29
+ smallScreen = false;
30
+ destroy = new Subject();
31
+ _previousUrl = '';
32
+ layoutChanged = new BehaviorSubject({
33
+ smallScreen: false,
34
+ toolbarHeight: 64,
35
+ });
36
+ constructor(breakpointObserver, router) {
37
+ this.breakpointObserver = breakpointObserver;
38
+ this.breakpointObserver
39
+ .observe([
40
+ Breakpoints.XSmall,
41
+ Breakpoints.Small,
42
+ Breakpoints.Medium,
43
+ Breakpoints.Large,
44
+ Breakpoints.XLarge,
45
+ ])
46
+ .pipe(takeUntil(this.destroy))
47
+ .subscribe((result) => {
48
+ let smallScreen = this.smallScreen;
49
+ let marginTop = this.marginTop;
50
+ for (const query of Object.keys(result.breakpoints)) {
51
+ if (result.breakpoints[query]) {
52
+ if (query == Breakpoints.XSmall) {
53
+ smallScreen = true;
54
+ marginTop = 56;
55
+ // } else if (query === Breakpoints.Small) {
56
+ // smallScreen = true;
57
+ // marginTop = 56;
58
+ }
59
+ else {
60
+ smallScreen = false;
61
+ }
62
+ }
63
+ }
64
+ if (this.smallScreen != smallScreen || this.marginTop != marginTop) {
65
+ this.smallScreen = smallScreen;
66
+ this.toolbarHeight = this.marginTop = marginTop;
67
+ const newLayout = {
68
+ smallScreen: smallScreen,
69
+ toolbarHeight: marginTop,
70
+ };
71
+ this.layoutChanged.next(newLayout);
72
+ }
73
+ });
74
+ // router.events
75
+ // .pipe(
76
+ // filter(
77
+ // (e: RouterEvent) =>
78
+ // e instanceof NavigationStart && (router.url.startsWith('/community') || router.url.startsWith('/company'))
79
+ // ),
80
+ // tap(() => {
81
+ // // console.log(`URL: ${this.router.url}`);
82
+ // this._previousUrl = router.url;
83
+ // })
84
+ // )
85
+ // .subscribe();
86
+ }
87
+ ngOnDestroy() {
88
+ this.destroy.next();
89
+ }
90
+ get previousUrl() {
91
+ return this._previousUrl;
92
+ }
93
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: LayoutService, deps: [{ token: i1.BreakpointObserver }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
94
+ /** @nocollapse */ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: LayoutService, providedIn: 'any' });
95
+ }
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: LayoutService, decorators: [{
97
+ type: Injectable,
98
+ args: [{ providedIn: 'any' }]
99
+ }], ctorParameters: () => [{ type: i1.BreakpointObserver }, { type: i1$1.Router }] });
100
+
101
+ class SPMatMenuListItemComponent {
102
+ route;
103
+ router;
104
+ dialog;
105
+ cdr;
106
+ expanded = false;
107
+ highlighted = false;
108
+ ariaExpanded = this.expanded;
109
+ // The NavItem associated with this item.
110
+ item;
111
+ // This is an implementation property that is used to control with offset
112
+ // of the menu item from the start of the screen to indicate that an item
113
+ // is a child of a parent menu item.
114
+ depth;
115
+ // The parent of this menu item. Set only for child items. Will be undefined
116
+ // for top level menu items
117
+ parent;
118
+ showIcon = true;
119
+ // All child MenuListItemComponents so that we can check each one if
120
+ // the current url ends with the child component's NavItem.route.
121
+ // If it does then we have to mark this component as expanded.
122
+ children;
123
+ constructor(route, router, dialog, cdr) {
124
+ this.route = route;
125
+ this.router = router;
126
+ this.dialog = dialog;
127
+ this.cdr = cdr;
128
+ if (this.depth === undefined) {
129
+ this.depth = 1;
130
+ }
131
+ }
132
+ ngOnInit() { }
133
+ ngOnDestroy() { }
134
+ // Return highlighted status
135
+ get isHighlighted() {
136
+ return this.highlighted;
137
+ }
138
+ toggleHighlight(highlight) {
139
+ if (highlight != this.highlighted) {
140
+ this.highlighted = highlight;
141
+ this.cdr.detectChanges();
142
+ }
143
+ }
144
+ /**
145
+ * Expand a parent container menu item.
146
+ */
147
+ expand() {
148
+ if (!this.item?.route && !this.expanded) {
149
+ this.expanded = this.ariaExpanded = true;
150
+ this.cdr.detectChanges();
151
+ if (this.parent) {
152
+ this.parent.expand();
153
+ }
154
+ }
155
+ }
156
+ /**
157
+ * Collapse an expanded parent container menu item.
158
+ */
159
+ collapse() {
160
+ if (!this.item?.route && this.expanded) {
161
+ this.expanded = this.ariaExpanded = false;
162
+ this.cdr.detectChanges();
163
+ }
164
+ }
165
+ checkChildrenForHighlight(lastUrlSegment) {
166
+ let childHighlighted = false;
167
+ this.children.forEach((childItem) => {
168
+ if (childItem.item.route === lastUrlSegment) {
169
+ childItem.toggleHighlight(true);
170
+ childHighlighted = true;
171
+ }
172
+ else {
173
+ childItem.toggleHighlight(false);
174
+ if (childItem.item?.children) {
175
+ if (childItem.checkChildrenForHighlight(lastUrlSegment)) {
176
+ childHighlighted = true;
177
+ }
178
+ }
179
+ childItem.expand(); // open the childItem
180
+ }
181
+ });
182
+ return childHighlighted; // Return highlighted state so that caller can
183
+ // expand itself.
184
+ }
185
+ // Item selection handler
186
+ onItemSelected(ev, item) {
187
+ this.dialog.closeAll();
188
+ // Leaf menu item, navigate the router to the item's route.
189
+ if (!item.children) {
190
+ if (item?.backButton && item?.backHref) {
191
+ // Idiotic way to implement Back button! This will conflict
192
+ // with the browser history as the current satellite app
193
+ // page would become the previous page to backHref page! A complex
194
+ // mechanism to navigate back accurately, by popping all the
195
+ // intermediate pages is beyond our scope for now.
196
+ this.router.navigateByUrl(item.backHref);
197
+ }
198
+ else if (item.route) {
199
+ this.router.navigate([item.route], {
200
+ relativeTo: this.route,
201
+ state: {
202
+ backHref: window.location.pathname,
203
+ },
204
+ });
205
+ }
206
+ }
207
+ else {
208
+ // Sub menu items, toogle the item to show/hide the child menu items.
209
+ ev.preventDefault();
210
+ ev.stopImmediatePropagation();
211
+ this.expanded = !this.expanded;
212
+ this.cdr.detectChanges();
213
+ }
214
+ }
215
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuListItemComponent, deps: [{ token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: i2.MatDialog }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
216
+ /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: SPMatMenuListItemComponent, isStandalone: false, selector: "ngx-mat-menu-list-item", inputs: { highlighted: "highlighted", item: "item", depth: "depth", parent: "parent", showIcon: "showIcon" }, host: { properties: { "attr.aria-expanded": "this.ariaExpanded" } }, viewQueries: [{ propertyName: "children", predicate: SPMatMenuListItemComponent, descendants: true }], ngImport: i0, template: `
217
+ <a
218
+ *ngIf="item.children || item.route; else divider"
219
+ mat-list-item
220
+ [ngStyle]="{ 'padding-left': depth * 8 + 'px' }"
221
+ [disabled]="item.disabled"
222
+ [attr.routerLink]="!item.children ? item.route : null"
223
+ class="menu-list-item pl-8"
224
+ [ngClass]="{
225
+ highlighted: this.highlighted,
226
+ 'not-highlighted': !this.highlighted,
227
+ }"
228
+ routerLinkActive="is-active"
229
+ (click)="onItemSelected($event, item)"
230
+ >
231
+ <mat-icon
232
+ *ngIf="
233
+ (item.icon && showIcon && !item.iconType) || item.iconType == 'mat'
234
+ "
235
+ class="menu-item-color"
236
+ matListItemIcon
237
+ >{{ item.icon }}</mat-icon
238
+ >
239
+ <i
240
+ *ngIf="item.icon && showIcon && item.iconType != 'mat'"
241
+ [class]="'menu-item-color ' + item.icon"
242
+ ></i>
243
+ <span class="menu-item-color">{{ item.text }}</span>
244
+ <span class="twistie-separator"></span>
245
+ <span *ngIf="item.children && item.children.length">
246
+ <mat-icon
247
+ class="menu-twistie menu-item-color"
248
+ [@indicatorRotate]="expanded ? 'expanded' : 'collapsed'"
249
+ >
250
+ expand_more
251
+ </mat-icon>
252
+ </span>
253
+ </a>
254
+ <div>
255
+ <ngx-mat-menu-list-item
256
+ class="menu-child"
257
+ [showIcon]="showIcon"
258
+ [ngStyle]="{ display: expanded ? 'inherit' : 'none' }"
259
+ *ngFor="let child of item.children"
260
+ [item]="child"
261
+ [parent]="this"
262
+ [depth]="depth + 1"
263
+ ></ngx-mat-menu-list-item>
264
+ </div>
265
+ <ng-template #divider>
266
+ <div class="menu-divider"></div>
267
+ </ng-template>
268
+ `, isInline: true, styles: [".menu-list-item{margin-right:8px!important}.pl-8{padding-left:8px}.twistie-separator{flex:1 1 0%}.routeIcon{margin-right:10px;font-size:16pt}.menu-item-text{font-size:10pt}.menu-twistie{font-size:10pt;height:12px;width:12px}mat-icon{margin-left:8px!important;margin-right:8px!important}.menu-item-color{background-color:var(--sp-mat-menu-menu-item-bg-color)!important;color:var(--sp-mat-menu-menu-item-fg-color)!important}.highlighted,.highlighted .menu-item-color{background-color:var( --sp-mat-menu-highlighted-menu-item-bg-color )!important;color:var(--sp-mat-menu-highlighted-menu-item-fg-color)!important}.mdc-list-item{padding-right:0}.menu-divider{height:1em}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i5.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "component", type: SPMatMenuListItemComponent, selector: "ngx-mat-menu-list-item", inputs: ["highlighted", "item", "depth", "parent", "showIcon"] }], animations: [
269
+ trigger('indicatorRotate', [
270
+ state('collapsed', style({ transform: 'rotate(0deg)' })),
271
+ state('expanded', style({ transform: 'rotate(180deg)' })),
272
+ transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4,0.0,0.2,1)')),
273
+ ]),
274
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
275
+ }
276
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuListItemComponent, decorators: [{
277
+ type: Component,
278
+ args: [{ selector: 'ngx-mat-menu-list-item', template: `
279
+ <a
280
+ *ngIf="item.children || item.route; else divider"
281
+ mat-list-item
282
+ [ngStyle]="{ 'padding-left': depth * 8 + 'px' }"
283
+ [disabled]="item.disabled"
284
+ [attr.routerLink]="!item.children ? item.route : null"
285
+ class="menu-list-item pl-8"
286
+ [ngClass]="{
287
+ highlighted: this.highlighted,
288
+ 'not-highlighted': !this.highlighted,
289
+ }"
290
+ routerLinkActive="is-active"
291
+ (click)="onItemSelected($event, item)"
292
+ >
293
+ <mat-icon
294
+ *ngIf="
295
+ (item.icon && showIcon && !item.iconType) || item.iconType == 'mat'
296
+ "
297
+ class="menu-item-color"
298
+ matListItemIcon
299
+ >{{ item.icon }}</mat-icon
300
+ >
301
+ <i
302
+ *ngIf="item.icon && showIcon && item.iconType != 'mat'"
303
+ [class]="'menu-item-color ' + item.icon"
304
+ ></i>
305
+ <span class="menu-item-color">{{ item.text }}</span>
306
+ <span class="twistie-separator"></span>
307
+ <span *ngIf="item.children && item.children.length">
308
+ <mat-icon
309
+ class="menu-twistie menu-item-color"
310
+ [@indicatorRotate]="expanded ? 'expanded' : 'collapsed'"
311
+ >
312
+ expand_more
313
+ </mat-icon>
314
+ </span>
315
+ </a>
316
+ <div>
317
+ <ngx-mat-menu-list-item
318
+ class="menu-child"
319
+ [showIcon]="showIcon"
320
+ [ngStyle]="{ display: expanded ? 'inherit' : 'none' }"
321
+ *ngFor="let child of item.children"
322
+ [item]="child"
323
+ [parent]="this"
324
+ [depth]="depth + 1"
325
+ ></ngx-mat-menu-list-item>
326
+ </div>
327
+ <ng-template #divider>
328
+ <div class="menu-divider"></div>
329
+ </ng-template>
330
+ `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [
331
+ trigger('indicatorRotate', [
332
+ state('collapsed', style({ transform: 'rotate(0deg)' })),
333
+ state('expanded', style({ transform: 'rotate(180deg)' })),
334
+ transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4,0.0,0.2,1)')),
335
+ ]),
336
+ ], standalone: false, styles: [".menu-list-item{margin-right:8px!important}.pl-8{padding-left:8px}.twistie-separator{flex:1 1 0%}.routeIcon{margin-right:10px;font-size:16pt}.menu-item-text{font-size:10pt}.menu-twistie{font-size:10pt;height:12px;width:12px}mat-icon{margin-left:8px!important;margin-right:8px!important}.menu-item-color{background-color:var(--sp-mat-menu-menu-item-bg-color)!important;color:var(--sp-mat-menu-menu-item-fg-color)!important}.highlighted,.highlighted .menu-item-color{background-color:var( --sp-mat-menu-highlighted-menu-item-bg-color )!important;color:var(--sp-mat-menu-highlighted-menu-item-fg-color)!important}.mdc-list-item{padding-right:0}.menu-divider{height:1em}\n"] }]
337
+ }], ctorParameters: () => [{ type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: i2.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { highlighted: [{
338
+ type: Input
339
+ }], ariaExpanded: [{
340
+ type: HostBinding,
341
+ args: ['attr.aria-expanded']
342
+ }], item: [{
343
+ type: Input
344
+ }], depth: [{
345
+ type: Input
346
+ }], parent: [{
347
+ type: Input
348
+ }], showIcon: [{
349
+ type: Input
350
+ }], children: [{
351
+ type: ViewChildren,
352
+ args: [SPMatMenuListItemComponent]
353
+ }] } });
354
+
355
+ class SPMatMenuPaneComponent {
356
+ cdr;
357
+ layoutService;
358
+ router;
359
+ injector;
360
+ menuTitle = '';
361
+ showBackButton = false;
362
+ defaultBackButtonHref = '';
363
+ backButtonText = 'BACK';
364
+ menuItems = [];
365
+ brandingText = 'BRAND';
366
+ brandingImage = '';
367
+ matSideNav;
368
+ appVersion = '0.0';
369
+ menuPaneFooterContent;
370
+ showIcons = true;
371
+ baseUrl = '';
372
+ layout;
373
+ backButtonNavItem;
374
+ destroy = new Subject();
375
+ menuItemComps = viewChildren(SPMatMenuListItemComponent);
376
+ // So that if menuItems is specified via an async pipe, we can highlight the
377
+ // current URL after the menuItems are loaded.
378
+ menuItemComps$ = effect(() => {
379
+ const components = this.menuItemComps();
380
+ runInInjectionContext(this.injector, () => {
381
+ this.highlightUrlMenuItem(this.router.routerState.snapshot.url);
382
+ });
383
+ });
384
+ constructor(cdr, layoutService, router, injector) {
385
+ this.cdr = cdr;
386
+ this.layoutService = layoutService;
387
+ this.router = router;
388
+ this.injector = injector;
389
+ }
390
+ ngOnInit() {
391
+ this.layoutService.layoutChanged
392
+ .pipe(takeUntil(this.destroy), tap((newLayout) => {
393
+ // console.log(
394
+ // 'Layout changed - new toolbar height:',
395
+ // newLayout.toolbarHeight
396
+ // );
397
+ this.layout = newLayout;
398
+ this.cdr.detectChanges();
399
+ }))
400
+ .subscribe();
401
+ if (this.showBackButton) {
402
+ this.backButtonNavItem = {
403
+ route: this.layoutService.previousUrl
404
+ ? this.layoutService.previousUrl
405
+ : this.defaultBackButtonHref,
406
+ text: this.backButtonText,
407
+ icon: 'arrow_back',
408
+ backButton: true,
409
+ backHref: window.history.state ? window.history.state['backHref'] : '#',
410
+ };
411
+ this.cdr.detectChanges();
412
+ }
413
+ this.router.events
414
+ .pipe(takeUntil(this.destroy), filter((e) => e instanceof NavigationEnd), tap((e) => {
415
+ if (this.matSideNav && this.layout.smallScreen) {
416
+ this.matSideNav.close();
417
+ }
418
+ const ne = e;
419
+ this.highlightUrlMenuItem(ne.urlAfterRedirects);
420
+ }))
421
+ .subscribe();
422
+ }
423
+ ngOnDestroy() {
424
+ this.destroy.next();
425
+ }
426
+ ngOnChanges(changes) {
427
+ if (changes['backButtonText']) {
428
+ if (this.backButtonNavItem) {
429
+ this.backButtonNavItem = {
430
+ ...this.backButtonNavItem,
431
+ text: this.backButtonText,
432
+ };
433
+ this.cdr.detectChanges();
434
+ }
435
+ }
436
+ }
437
+ ngAfterViewInit() {
438
+ this.highlightUrlMenuItem(this.router.routerState.snapshot.url);
439
+ }
440
+ /**
441
+ * Highlights the menu item for the specified URL.
442
+ *
443
+ * @param url the full url of the current navigation
444
+ *
445
+ * The way this function works is like this.
446
+ *
447
+ * It first finds the NavItem matching the given URL in url arg. It does
448
+ * this by removing the baseUrl from the url and then comparing the
449
+ * NavItem.route attached to each SPMatMenuListItemComponent. This is done
450
+ * recursively covering all NavItem.children. When a matching NavItem is
451
+ * found, the function goes on to find the SPMatMenuListItemComponent which
452
+ * has this NavItem attached to it. This too is done recursively to find
453
+ * the innermost NavItem with matching URL.
454
+ *
455
+ * When a matching SPMatMenuListItemComponent is found, it first deselects
456
+ * the previous SPMatMenuListItemComponent selection and then goes on to
457
+ * select the newly matched SPMatMenuListItemComponent. If the
458
+ * SPMatMenuListItemComponent is a child of a parent NavItem, the parent
459
+ * NavItem is expanded. Similarly when deselecting the current selection,
460
+ * if it belongs to a parent NavItem and the parent is not shared by the
461
+ * currently matched SPMatMenuListItemComponent, it collapses the parent
462
+ * of the previously selected SPMatMenuListItemComponent. (Quite a mouthful
463
+ * of a sentence, but it's exactly how it works.)
464
+ */
465
+ highlightUrlMenuItem(url) {
466
+ // Remove baseUrl from our url-to-SPMatMenuListItem matching logic
467
+ const baseUrl = this.baseUrl.startsWith('/') ? this.baseUrl.substring(1) : this.baseUrl;
468
+ const baseUrlIndex = url.search(baseUrl);
469
+ if (baseUrlIndex != -1) {
470
+ url = url.substring(baseUrlIndex + baseUrl.length);
471
+ }
472
+ // Filter out empty strings so that we avoid a pointless iteration of the
473
+ // menuItemComps() array.
474
+ const urlParts = url.split('/').filter(u => !!u);
475
+ url = urlParts.join('/');
476
+ // console.log(`highlightCurrentUrlMenuItem - baseUrl: ${this.baseUrl} url: ${url}, urlParts: ${urlParts}`);
477
+ let highlightedItemFound = false;
478
+ // Function to find the NavItem for for the given url. Returns a NavItem
479
+ // if a matching NavItem is found, undefined otherwise.
480
+ const findNavItemForUrl = (baseUrl, navItem) => {
481
+ let matchingItem = undefined;
482
+ if (navItem.children) {
483
+ for (let index = 0; !matchingItem && index < navItem.children.length; index++) {
484
+ matchingItem = findNavItemForUrl(baseUrl + (navItem?.route ?? ''), navItem.children[index]);
485
+ }
486
+ }
487
+ else if (navItem.route) {
488
+ if (url === navItem.route) {
489
+ matchingItem = navItem;
490
+ }
491
+ }
492
+ return matchingItem;
493
+ };
494
+ let matchingNavItem = undefined;
495
+ for (let index = 0; !matchingNavItem && index < this.menuItemComps().length; index++) {
496
+ const element = this.menuItemComps()[index];
497
+ if (element?.item) {
498
+ matchingNavItem = findNavItemForUrl(url, element?.item);
499
+ }
500
+ }
501
+ // Function to find the SPMatMenuListItemComponent for the given NavItem.
502
+ // Returns SPMatMenuListItemComponent if a match is found, undefined
503
+ // otherwise.
504
+ const findMenuItemCompForNavItem = (menuItemComp, target) => {
505
+ let matchingMenuItemComp = undefined;
506
+ if (menuItemComp.item === target) {
507
+ matchingMenuItemComp = menuItemComp;
508
+ }
509
+ else if (menuItemComp.item?.children) {
510
+ for (let index = 0; !matchingMenuItemComp && index < menuItemComp.children.length; index++) {
511
+ matchingMenuItemComp = findMenuItemCompForNavItem(menuItemComp.children.get(index), target);
512
+ }
513
+ }
514
+ return matchingMenuItemComp;
515
+ };
516
+ let matchingMenuItemComp = undefined;
517
+ if (matchingNavItem) {
518
+ for (let index = 0; !matchingMenuItemComp && index < this.menuItemComps().length; index++) {
519
+ const element = this.menuItemComps()[index];
520
+ matchingMenuItemComp = findMenuItemCompForNavItem(this.menuItemComps()[index], matchingNavItem);
521
+ }
522
+ }
523
+ if (matchingMenuItemComp) {
524
+ this.highlightMenuItemComp(matchingMenuItemComp);
525
+ }
526
+ // old logic, which is a little confusing and depends on state stored
527
+ // in SPMatMenuListItemComponent.
528
+ /*
529
+ for (let index = 0; !highlightedItemFound && index < urlParts.length; index++) {
530
+ const lastUrlSegment = urlParts[index];
531
+ this.menuItemComps().find(menuItemComp => {
532
+ const route = menuItemComp.item?.route;
533
+ if (route === lastUrlSegment) {
534
+ if (!menuItemComp.item?.children) {
535
+ menuItemComp.toggleHighlight(true);
536
+ highlightedItemFound = true;
537
+ } else if (menuItemComp.checkChildrenForHighlight(lastUrlSegment)) {
538
+ menuItemComp.expand();
539
+ highlightedItemFound = true;
540
+ }
541
+ } else {
542
+ menuItemComp.toggleHighlight(false);
543
+ if (menuItemComp.item?.children) {
544
+ if (menuItemComp.checkChildrenForHighlight(lastUrlSegment)) {
545
+ menuItemComp.expand();
546
+ highlightedItemFound = true
547
+ };
548
+ }
549
+ }
550
+ });
551
+ }
552
+ */
553
+ }
554
+ // To keep track of current highlighted SPMatMenuListItemComponent.
555
+ _curHighlitedMenuItemComp;
556
+ highlightMenuItemComp(menuItemComp) {
557
+ // Deslect currently highliged SPMatMenuListItemComponent if it's different
558
+ // from the menuItemComp arg.
559
+ const lastHighlitedMenuItemComp = this._curHighlitedMenuItemComp;
560
+ if (this._curHighlitedMenuItemComp && this._curHighlitedMenuItemComp !== menuItemComp) {
561
+ this._curHighlitedMenuItemComp.toggleHighlight(false);
562
+ this._curHighlitedMenuItemComp = undefined;
563
+ }
564
+ menuItemComp.toggleHighlight(true);
565
+ if (lastHighlitedMenuItemComp && lastHighlitedMenuItemComp?.parent) {
566
+ lastHighlitedMenuItemComp.parent.collapse();
567
+ }
568
+ if (menuItemComp.parent) {
569
+ menuItemComp.parent.expand();
570
+ }
571
+ this._curHighlitedMenuItemComp = menuItemComp;
572
+ }
573
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuPaneComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: LayoutService }, { token: i1$1.Router }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
574
+ /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.1.6", type: SPMatMenuPaneComponent, isStandalone: false, selector: "ngx-mat-menu-pane", inputs: { menuTitle: "menuTitle", showBackButton: "showBackButton", defaultBackButtonHref: "defaultBackButtonHref", backButtonText: "backButtonText", menuItems: "menuItems", brandingText: "brandingText", brandingImage: "brandingImage", matSideNav: "matSideNav", appVersion: "appVersion", menuPaneFooterContent: "menuPaneFooterContent", showIcons: "showIcons", baseUrl: "baseUrl" }, viewQueries: [{ propertyName: "menuItemComps", predicate: SPMatMenuListItemComponent, descendants: true, isSignal: true }], usesOnChanges: true, ngImport: i0, template: `
575
+ <div class="menu-pane-wrapper">
576
+ <div class="sidenav-branding mat-toolbar-single-row">
577
+ <div class="branding branding-logo">
578
+ <img *ngIf="brandingImage" [src]="brandingImage" />
579
+ </div>
580
+ <h4 class="mat-typography branding branding-text">
581
+ {{ brandingText }}
582
+ </h4>
583
+ </div>
584
+ <div class="sidenav-menu">
585
+ <div *ngIf="menuTitle" class="mat-body title">{{ menuTitle }}</div>
586
+ <mat-nav-list>
587
+ <ngx-mat-menu-list-item
588
+ *ngIf="backButtonNavItem"
589
+ [item]="backButtonNavItem"
590
+ ></ngx-mat-menu-list-item>
591
+ <ngx-mat-menu-list-item
592
+ *ngFor="let item of menuItems"
593
+ [item]="item"
594
+ [showIcon]="showIcons"
595
+ ></ngx-mat-menu-list-item>
596
+ </mat-nav-list>
597
+ </div>
598
+ <div class="sidenav-version" *ngIf="menuPaneFooterContent">
599
+ <ng-container *ngTemplateOutlet="menuPaneFooterContent"> </ng-container>
600
+ </div>
601
+ </div>
602
+ `, isInline: true, styles: [".app-is-mobile .app-toolbar{position:fixed;z-index:2}h1.app-name{margin:auto auto auto 0}.sidenav-container{flex:1}.app-is-mobile .sidenav-container{display:inherit}.spacer{flex:1 1 auto}.menu-pane-wrapper{display:flex;flex-direction:column;height:100%}.sidenav-branding{border-bottom:1px solid var(--sp-mat-menu-border-color);display:flex;flex-direction:row;align-items:center;justify-content:center;padding:0 12px}.sidenav-menu{flex:1;overflow-x:hidden}.sidenav-menu .title{text-align:center;padding:.5em .1em 0;font-weight:bolder;font-size:1.1em}.sidenav-version{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:48px;border-top:1px solid var(--sp-mat-menu-border-color);font-size:smaller}.sidenav-version a{color:var(--vendor-foreground-color)!important}.branding{height:100%;display:flex;flex-direction:column;justify-content:center}.branding-logo img{width:32px;height:32px}.branding-text{overflow:auto;text-overflow:ellipsis;white-space:nowrap;font-size:1.1em;font-weight:bolder;margin:0 4px}.sidenav-content{padding:12px;height:calc(100% - 56px);overflow:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: SPMatMenuListItemComponent, selector: "ngx-mat-menu-list-item", inputs: ["highlighted", "item", "depth", "parent", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
603
+ }
604
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuPaneComponent, decorators: [{
605
+ type: Component,
606
+ args: [{ selector: 'ngx-mat-menu-pane', template: `
607
+ <div class="menu-pane-wrapper">
608
+ <div class="sidenav-branding mat-toolbar-single-row">
609
+ <div class="branding branding-logo">
610
+ <img *ngIf="brandingImage" [src]="brandingImage" />
611
+ </div>
612
+ <h4 class="mat-typography branding branding-text">
613
+ {{ brandingText }}
614
+ </h4>
615
+ </div>
616
+ <div class="sidenav-menu">
617
+ <div *ngIf="menuTitle" class="mat-body title">{{ menuTitle }}</div>
618
+ <mat-nav-list>
619
+ <ngx-mat-menu-list-item
620
+ *ngIf="backButtonNavItem"
621
+ [item]="backButtonNavItem"
622
+ ></ngx-mat-menu-list-item>
623
+ <ngx-mat-menu-list-item
624
+ *ngFor="let item of menuItems"
625
+ [item]="item"
626
+ [showIcon]="showIcons"
627
+ ></ngx-mat-menu-list-item>
628
+ </mat-nav-list>
629
+ </div>
630
+ <div class="sidenav-version" *ngIf="menuPaneFooterContent">
631
+ <ng-container *ngTemplateOutlet="menuPaneFooterContent"> </ng-container>
632
+ </div>
633
+ </div>
634
+ `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".app-is-mobile .app-toolbar{position:fixed;z-index:2}h1.app-name{margin:auto auto auto 0}.sidenav-container{flex:1}.app-is-mobile .sidenav-container{display:inherit}.spacer{flex:1 1 auto}.menu-pane-wrapper{display:flex;flex-direction:column;height:100%}.sidenav-branding{border-bottom:1px solid var(--sp-mat-menu-border-color);display:flex;flex-direction:row;align-items:center;justify-content:center;padding:0 12px}.sidenav-menu{flex:1;overflow-x:hidden}.sidenav-menu .title{text-align:center;padding:.5em .1em 0;font-weight:bolder;font-size:1.1em}.sidenav-version{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:48px;border-top:1px solid var(--sp-mat-menu-border-color);font-size:smaller}.sidenav-version a{color:var(--vendor-foreground-color)!important}.branding{height:100%;display:flex;flex-direction:column;justify-content:center}.branding-logo img{width:32px;height:32px}.branding-text{overflow:auto;text-overflow:ellipsis;white-space:nowrap;font-size:1.1em;font-weight:bolder;margin:0 4px}.sidenav-content{padding:12px;height:calc(100% - 56px);overflow:auto}\n"] }]
635
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: LayoutService }, { type: i1$1.Router }, { type: i0.Injector }], propDecorators: { menuTitle: [{
636
+ type: Input
637
+ }], showBackButton: [{
638
+ type: Input
639
+ }], defaultBackButtonHref: [{
640
+ type: Input
641
+ }], backButtonText: [{
642
+ type: Input
643
+ }], menuItems: [{
644
+ type: Input
645
+ }], brandingText: [{
646
+ type: Input
647
+ }], brandingImage: [{
648
+ type: Input
649
+ }], matSideNav: [{
650
+ type: Input
651
+ }], appVersion: [{
652
+ type: Input
653
+ }], menuPaneFooterContent: [{
654
+ type: Input
655
+ }], showIcons: [{
656
+ type: Input
657
+ }], baseUrl: [{
658
+ type: Input
659
+ }] } });
660
+
661
+ class SPMatMenuLayoutComponent {
662
+ layoutService;
663
+ cdr;
664
+ menuNav;
665
+ layout;
666
+ destroy = new Subject();
667
+ containerHeight = 500;
668
+ topBottomPadding = 6;
669
+ baseUrl = '';
670
+ showBackButton = false;
671
+ defaultBackButtonHref = '';
672
+ backButtonText = 'BACK';
673
+ brandingImage = '';
674
+ brandingText = '';
675
+ appTitle = '';
676
+ menuTitle = '';
677
+ menuItems = [];
678
+ // Template Partials for configurable portions of the layout
679
+ menuPaneFooterContent;
680
+ toolbarEndContent;
681
+ infoPaneContent;
682
+ toolbarTitleContent;
683
+ // Width of the info pane on the right (or left for LTR) of the screen.
684
+ infoPaneMinWidth = 250;
685
+ infoPaneMaxWidth = 400;
686
+ contentContainerClass = '';
687
+ showIcons = true;
688
+ // Allows querying infoPane to activate it or to set its attributes
689
+ infoPane;
690
+ constructor(layoutService, cdr) {
691
+ this.layoutService = layoutService;
692
+ this.cdr = cdr;
693
+ }
694
+ ngOnInit() {
695
+ this.layoutService.layoutChanged
696
+ .pipe(takeUntil(this.destroy), tap((newLayout) => {
697
+ this.layout = newLayout;
698
+ this.containerHeight =
699
+ window.innerHeight -
700
+ (newLayout.toolbarHeight + this.topBottomPadding * 2);
701
+ this.cdr.detectChanges();
702
+ }))
703
+ .subscribe();
704
+ }
705
+ ngOnDestroy() {
706
+ this.destroy.next();
707
+ this.destroy.complete();
708
+ }
709
+ onToggleMenuPane() {
710
+ if (this.menuNav) {
711
+ this.menuNav.toggle();
712
+ }
713
+ }
714
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutComponent, deps: [{ token: LayoutService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
715
+ /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: SPMatMenuLayoutComponent, isStandalone: false, selector: "sp-mat-menu-layout", inputs: { baseUrl: "baseUrl", showBackButton: "showBackButton", defaultBackButtonHref: "defaultBackButtonHref", backButtonText: "backButtonText", brandingImage: "brandingImage", brandingText: "brandingText", appTitle: "appTitle", menuTitle: "menuTitle", menuItems: "menuItems", menuPaneFooterContent: "menuPaneFooterContent", toolbarEndContent: "toolbarEndContent", infoPaneContent: "infoPaneContent", toolbarTitleContent: "toolbarTitleContent", infoPaneMinWidth: "infoPaneMinWidth", infoPaneMaxWidth: "infoPaneMaxWidth", contentContainerClass: "contentContainerClass", showIcons: "showIcons" }, viewQueries: [{ propertyName: "menuNav", first: true, predicate: ["menuNav"], descendants: true }, { propertyName: "infoPane", first: true, predicate: ["infoPane"], descendants: true }], ngImport: i0, template: `
716
+ <mat-sidenav-container class="layout-container">
717
+ <mat-sidenav
718
+ class="layout-menu-pane"
719
+ opened
720
+ #menuNav
721
+ [mode]="layout.smallScreen ? 'over' : 'side'"
722
+ [opened]="!layout.smallScreen"
723
+ [fixedInViewport]="layout.smallScreen"
724
+ >
725
+ <div class="layout-menu-container">
726
+ <ngx-mat-menu-pane
727
+ [baseUrl]="baseUrl"
728
+ [showBackButton]="showBackButton"
729
+ [showIcons]="showIcons"
730
+ [defaultBackButtonHref]="defaultBackButtonHref"
731
+ [backButtonText]="backButtonText"
732
+ [brandingImage]="brandingImage"
733
+ [brandingText]="brandingText"
734
+ [menuItems]="menuItems"
735
+ [matSideNav]="menuNav"
736
+ [menuPaneFooterContent]="menuPaneFooterContent"
737
+ [menuTitle]="menuTitle"
738
+ class="h-100"
739
+ ></ngx-mat-menu-pane>
740
+ </div>
741
+ </mat-sidenav>
742
+
743
+ <mat-sidenav
744
+ [ngStyle]="{
745
+ 'min-width.px': infoPaneMinWidth,
746
+ 'max-width.px': infoPaneMaxWidth
747
+ }"
748
+ #infoPane
749
+ closed
750
+ mode="over"
751
+ position="end"
752
+ >
753
+ <ng-container *ngTemplateOutlet="infoPaneContent"></ng-container>
754
+ </mat-sidenav>
755
+
756
+ <mat-sidenav-content class="layout-content">
757
+ <mat-toolbar class="layout-content-toolbar">
758
+ <button mat-icon-button (click)="onToggleMenuPane()">
759
+ <mat-icon>menu</mat-icon>
760
+ </button>
761
+ <ng-template #defaultToolbarTitle>
762
+ <h4>{{ appTitle }}</h4>
763
+ </ng-template>
764
+ <ng-container
765
+ *ngTemplateOutlet="
766
+ toolbarTitleContent ? toolbarTitleContent : defaultToolbarTitle
767
+ "
768
+ ></ng-container>
769
+ <span class="spacer"></span>
770
+ <ng-container *ngTemplateOutlet="toolbarEndContent"></ng-container>
771
+ </mat-toolbar>
772
+ <div class="layout-content-content" [class]="contentContainerClass">
773
+ <router-outlet></router-outlet>
774
+ </div>
775
+ </mat-sidenav-content>
776
+ </mat-sidenav-container>
777
+ `, isInline: true, styles: [".layout-menu-pane{background-color:var(--sp-mat-menu-bg-color)!important;color:var(--sp-mat-menu-fg-color)!important}.layout-container{position:absolute;inset:0}.layout-menu-container{height:100%;max-width:var(--sp-mat-menu-sidemenu-max-width, 50%);min-width:var(--sp-mat-menu-sidemenu-min-width, 250px);text-wrap:nowrap;overflow-x:scroll;overflow-y:scroll}.layout-content{height:100vh;display:flex;flex-direction:column}.layout-content-toolbar{border-bottom:1px solid var(--sp-mat-menu-toolbar-border-color);flex-grow:0;background-color:var(--sp-mat-menu-toolbar-bg-color);color:var(--sp-mat-menu-toolbar-fg-color);padding:0;min-height:var(--mat-toolbar-standard-height);max-height:var(--mat-toolbar-standard-height)}.layout-content-content{flex-grow:1;overflow:hidden}.h-100{height:100%}.spacer{flex:1 1 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1$1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i4$1.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i4$1.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i4$1.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i5$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: SPMatMenuPaneComponent, selector: "ngx-mat-menu-pane", inputs: ["menuTitle", "showBackButton", "defaultBackButtonHref", "backButtonText", "menuItems", "brandingText", "brandingImage", "matSideNav", "appVersion", "menuPaneFooterContent", "showIcons", "baseUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
778
+ }
779
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutComponent, decorators: [{
780
+ type: Component,
781
+ args: [{ selector: 'sp-mat-menu-layout', template: `
782
+ <mat-sidenav-container class="layout-container">
783
+ <mat-sidenav
784
+ class="layout-menu-pane"
785
+ opened
786
+ #menuNav
787
+ [mode]="layout.smallScreen ? 'over' : 'side'"
788
+ [opened]="!layout.smallScreen"
789
+ [fixedInViewport]="layout.smallScreen"
790
+ >
791
+ <div class="layout-menu-container">
792
+ <ngx-mat-menu-pane
793
+ [baseUrl]="baseUrl"
794
+ [showBackButton]="showBackButton"
795
+ [showIcons]="showIcons"
796
+ [defaultBackButtonHref]="defaultBackButtonHref"
797
+ [backButtonText]="backButtonText"
798
+ [brandingImage]="brandingImage"
799
+ [brandingText]="brandingText"
800
+ [menuItems]="menuItems"
801
+ [matSideNav]="menuNav"
802
+ [menuPaneFooterContent]="menuPaneFooterContent"
803
+ [menuTitle]="menuTitle"
804
+ class="h-100"
805
+ ></ngx-mat-menu-pane>
806
+ </div>
807
+ </mat-sidenav>
808
+
809
+ <mat-sidenav
810
+ [ngStyle]="{
811
+ 'min-width.px': infoPaneMinWidth,
812
+ 'max-width.px': infoPaneMaxWidth
813
+ }"
814
+ #infoPane
815
+ closed
816
+ mode="over"
817
+ position="end"
818
+ >
819
+ <ng-container *ngTemplateOutlet="infoPaneContent"></ng-container>
820
+ </mat-sidenav>
821
+
822
+ <mat-sidenav-content class="layout-content">
823
+ <mat-toolbar class="layout-content-toolbar">
824
+ <button mat-icon-button (click)="onToggleMenuPane()">
825
+ <mat-icon>menu</mat-icon>
826
+ </button>
827
+ <ng-template #defaultToolbarTitle>
828
+ <h4>{{ appTitle }}</h4>
829
+ </ng-template>
830
+ <ng-container
831
+ *ngTemplateOutlet="
832
+ toolbarTitleContent ? toolbarTitleContent : defaultToolbarTitle
833
+ "
834
+ ></ng-container>
835
+ <span class="spacer"></span>
836
+ <ng-container *ngTemplateOutlet="toolbarEndContent"></ng-container>
837
+ </mat-toolbar>
838
+ <div class="layout-content-content" [class]="contentContainerClass">
839
+ <router-outlet></router-outlet>
840
+ </div>
841
+ </mat-sidenav-content>
842
+ </mat-sidenav-container>
843
+ `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".layout-menu-pane{background-color:var(--sp-mat-menu-bg-color)!important;color:var(--sp-mat-menu-fg-color)!important}.layout-container{position:absolute;inset:0}.layout-menu-container{height:100%;max-width:var(--sp-mat-menu-sidemenu-max-width, 50%);min-width:var(--sp-mat-menu-sidemenu-min-width, 250px);text-wrap:nowrap;overflow-x:scroll;overflow-y:scroll}.layout-content{height:100vh;display:flex;flex-direction:column}.layout-content-toolbar{border-bottom:1px solid var(--sp-mat-menu-toolbar-border-color);flex-grow:0;background-color:var(--sp-mat-menu-toolbar-bg-color);color:var(--sp-mat-menu-toolbar-fg-color);padding:0;min-height:var(--mat-toolbar-standard-height);max-height:var(--mat-toolbar-standard-height)}.layout-content-content{flex-grow:1;overflow:hidden}.h-100{height:100%}.spacer{flex:1 1 auto}\n"] }]
844
+ }], ctorParameters: () => [{ type: LayoutService }, { type: i0.ChangeDetectorRef }], propDecorators: { menuNav: [{
845
+ type: ViewChild,
846
+ args: ['menuNav']
847
+ }], baseUrl: [{
848
+ type: Input
849
+ }], showBackButton: [{
850
+ type: Input
851
+ }], defaultBackButtonHref: [{
852
+ type: Input
853
+ }], backButtonText: [{
854
+ type: Input
855
+ }], brandingImage: [{
856
+ type: Input
857
+ }], brandingText: [{
858
+ type: Input
859
+ }], appTitle: [{
860
+ type: Input
861
+ }], menuTitle: [{
862
+ type: Input
863
+ }], menuItems: [{
864
+ type: Input
865
+ }], menuPaneFooterContent: [{
866
+ type: Input
867
+ }], toolbarEndContent: [{
868
+ type: Input
869
+ }], infoPaneContent: [{
870
+ type: Input
871
+ }], toolbarTitleContent: [{
872
+ type: Input
873
+ }], infoPaneMinWidth: [{
874
+ type: Input
875
+ }], infoPaneMaxWidth: [{
876
+ type: Input
877
+ }], contentContainerClass: [{
878
+ type: Input
879
+ }], showIcons: [{
880
+ type: Input
881
+ }], infoPane: [{
882
+ type: ViewChild,
883
+ args: ['infoPane']
884
+ }] } });
885
+
886
+ class SPMatMenuLayoutModule {
887
+ /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
888
+ /** @nocollapse */ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutModule, declarations: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent], imports: [CommonModule,
889
+ RouterOutlet,
890
+ MatSidenavModule,
891
+ MatToolbarModule,
892
+ MatIconModule,
893
+ MatButtonModule,
894
+ MatMenuModule,
895
+ MatDialogModule,
896
+ MatListModule], exports: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent] });
897
+ /** @nocollapse */ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutModule, imports: [CommonModule,
898
+ MatSidenavModule,
899
+ MatToolbarModule,
900
+ MatIconModule,
901
+ MatButtonModule,
902
+ MatMenuModule,
903
+ MatDialogModule,
904
+ MatListModule] });
905
+ }
906
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutModule, decorators: [{
907
+ type: NgModule,
908
+ args: [{
909
+ declarations: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent],
910
+ imports: [
911
+ CommonModule,
912
+ RouterOutlet,
913
+ MatSidenavModule,
914
+ MatToolbarModule,
915
+ MatIconModule,
916
+ MatButtonModule,
917
+ MatMenuModule,
918
+ MatDialogModule,
919
+ MatListModule
920
+ ],
921
+ exports: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent],
922
+ }]
923
+ }] });
924
+
925
+ /**
926
+ * Generated bundle index. Do not edit.
927
+ */
928
+
929
+ export { LayoutService, SPMatMenuLayoutComponent, SPMatMenuLayoutModule, SPMatMenuListItemComponent, SPMatMenuPaneComponent };
930
+ //# sourceMappingURL=smallpearl-ngx-helper-mat-side-menu-layout.mjs.map