aril 0.0.5 → 0.0.7

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 (151) hide show
  1. package/aril-0.0.7.tgz +0 -0
  2. package/esm2022/http/lib/enums.mjs +2 -1
  3. package/esm2022/http/lib/interfaces.mjs +1 -1
  4. package/esm2022/http/src/httpClient.mjs +1 -1
  5. package/esm2022/http/src/serviceBase.mjs +5 -5
  6. package/esm2022/http/src/serviceStateMethods.mjs +5 -2
  7. package/esm2022/theme/layout/app/breadcrumb/app.breadcrumb.component.mjs +41 -0
  8. package/esm2022/theme/layout/app/config/app.config.component.mjs +134 -0
  9. package/esm2022/theme/layout/app/layout/app.layout.component.mjs +131 -0
  10. package/esm2022/theme/layout/app/menu/app.menu.component.mjs +399 -0
  11. package/esm2022/theme/layout/app/profileSidebar/app.profilesidebar.component.mjs +25 -0
  12. package/esm2022/theme/layout/app/sidebar/app.sidebar.component.mjs +41 -0
  13. package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +29 -0
  14. package/esm2022/theme/layout/aril-theme-layout.mjs +5 -0
  15. package/esm2022/theme/layout/index.mjs +2 -0
  16. package/esm2022/theme/layout/service/app.layout.service.mjs +132 -0
  17. package/esm2022/theme/layout/service/app.menu.service.mjs +27 -0
  18. package/esm2022/theme/layout/service/menuchangeevent.mjs +2 -0
  19. package/esm2022/ui/badge/src/badge.component.mjs +1 -1
  20. package/esm2022/ui/button/src/button.component.mjs +1 -1
  21. package/esm2022/ui/button/src/split-button.component.mjs +1 -1
  22. package/esm2022/ui/calendar/src/calendar.component.mjs +1 -1
  23. package/esm2022/ui/checkbox/src/check-box.component.mjs +3 -3
  24. package/esm2022/ui/checkbox/src/tri-state-checkbox.component.mjs +3 -3
  25. package/esm2022/ui/dxField/src/dx-field.component.mjs +3 -3
  26. package/esm2022/ui/field/src/field.component.mjs +1 -1
  27. package/esm2022/ui/fileUpload/src/file-upload.component.mjs +6 -4
  28. package/esm2022/ui/form/index.mjs +20 -2
  29. package/esm2022/ui/form/src/form-submit-button.component.mjs +4 -3
  30. package/esm2022/ui/form/src/form.component.mjs +3 -3
  31. package/esm2022/ui/lib/src/form/form-error-message.component.mjs +1 -1
  32. package/esm2022/ui/lib/src/form/form-error-message.directive.mjs +1 -1
  33. package/esm2022/ui/lib/src/input/baseInput.mjs +1 -1
  34. package/esm2022/ui/lib/src/input/common-input-validators.service.mjs +1 -1
  35. package/esm2022/ui/lib/src/input/dx-input-error-message.pipe.mjs +1 -1
  36. package/esm2022/ui/mask/src/mask.component.mjs +3 -3
  37. package/esm2022/ui/number/src/number.component.mjs +2 -2
  38. package/esm2022/ui/overlayPanel/src/overlay-panel.component.mjs +1 -1
  39. package/esm2022/ui/panel/src/panel.component.mjs +4 -5
  40. package/esm2022/ui/password/src/password.component.mjs +1 -1
  41. package/esm2022/ui/radioButton/src/radio-button.component.mjs +1 -1
  42. package/esm2022/ui/selectBox/src/select-box.component.mjs +4 -7
  43. package/esm2022/ui/switch/src/switch.component.mjs +1 -1
  44. package/esm2022/ui/table/index.mjs +26 -2
  45. package/esm2022/ui/table/src/table-column.component.mjs +6 -4
  46. package/esm2022/ui/table/src/table.component.mjs +24 -42
  47. package/esm2022/ui/tagBox/src/tag-box.component.mjs +4 -7
  48. package/esm2022/ui/text/src/text.component.mjs +1 -1
  49. package/esm2022/ui/textArea/src/text-area.component.mjs +5 -1
  50. package/esm2022/ui/tree/src/tree.component.mjs +29 -44
  51. package/esm2022/ui/treeTable/src/tree-table.component.mjs +39 -43
  52. package/esm2022/ui/value/src/value.component.mjs +3 -3
  53. package/fesm2022/aril-http.mjs +7 -4
  54. package/fesm2022/aril-http.mjs.map +1 -1
  55. package/fesm2022/aril-theme-layout.mjs +918 -0
  56. package/fesm2022/aril-theme-layout.mjs.map +1 -0
  57. package/fesm2022/aril-ui-badge.mjs.map +1 -1
  58. package/fesm2022/aril-ui-button.mjs.map +1 -1
  59. package/fesm2022/aril-ui-calendar.mjs.map +1 -1
  60. package/fesm2022/aril-ui-checkbox.mjs +4 -4
  61. package/fesm2022/aril-ui-checkbox.mjs.map +1 -1
  62. package/fesm2022/aril-ui-dxField.mjs +2 -2
  63. package/fesm2022/aril-ui-dxField.mjs.map +1 -1
  64. package/fesm2022/aril-ui-field.mjs.map +1 -1
  65. package/fesm2022/aril-ui-fileUpload.mjs +5 -3
  66. package/fesm2022/aril-ui-fileUpload.mjs.map +1 -1
  67. package/fesm2022/aril-ui-form.mjs +22 -8
  68. package/fesm2022/aril-ui-form.mjs.map +1 -1
  69. package/fesm2022/aril-ui-lib.mjs.map +1 -1
  70. package/fesm2022/aril-ui-mask.mjs +3 -3
  71. package/fesm2022/aril-ui-mask.mjs.map +1 -1
  72. package/fesm2022/aril-ui-number.mjs +2 -2
  73. package/fesm2022/aril-ui-number.mjs.map +1 -1
  74. package/fesm2022/aril-ui-overlayPanel.mjs.map +1 -1
  75. package/fesm2022/aril-ui-panel.mjs +2 -3
  76. package/fesm2022/aril-ui-panel.mjs.map +1 -1
  77. package/fesm2022/aril-ui-password.mjs.map +1 -1
  78. package/fesm2022/aril-ui-radioButton.mjs.map +1 -1
  79. package/fesm2022/aril-ui-selectBox.mjs +3 -6
  80. package/fesm2022/aril-ui-selectBox.mjs.map +1 -1
  81. package/fesm2022/aril-ui-switch.mjs.map +1 -1
  82. package/fesm2022/aril-ui-table.mjs +45 -42
  83. package/fesm2022/aril-ui-table.mjs.map +1 -1
  84. package/fesm2022/aril-ui-tagBox.mjs +3 -6
  85. package/fesm2022/aril-ui-tagBox.mjs.map +1 -1
  86. package/fesm2022/aril-ui-text.mjs.map +1 -1
  87. package/fesm2022/aril-ui-textArea.mjs +4 -0
  88. package/fesm2022/aril-ui-textArea.mjs.map +1 -1
  89. package/fesm2022/aril-ui-tree.mjs +28 -43
  90. package/fesm2022/aril-ui-tree.mjs.map +1 -1
  91. package/fesm2022/aril-ui-treeTable.mjs +38 -42
  92. package/fesm2022/aril-ui-treeTable.mjs.map +1 -1
  93. package/fesm2022/aril-ui-value.mjs +2 -2
  94. package/fesm2022/aril-ui-value.mjs.map +1 -1
  95. package/http/lib/enums.d.ts +1 -0
  96. package/http/lib/interfaces.d.ts +2 -0
  97. package/http/src/serviceStateMethods.d.ts +2 -1
  98. package/package.json +13 -13
  99. package/theme/layout/app/breadcrumb/app.breadcrumb.component.d.ts +16 -0
  100. package/theme/layout/app/breadcrumb/app.breadcrumb.component.html +10 -0
  101. package/theme/layout/app/breadcrumb/app.breadcrumb.component.ts +52 -0
  102. package/theme/layout/app/config/app.config.component.d.ts +36 -0
  103. package/theme/layout/app/config/app.config.component.html +191 -0
  104. package/theme/layout/app/config/app.config.component.ts +152 -0
  105. package/theme/layout/app/layout/app.layout.component.d.ts +51 -0
  106. package/theme/layout/app/layout/app.layout.component.html +13 -0
  107. package/theme/layout/app/layout/app.layout.component.ts +183 -0
  108. package/theme/layout/app/menu/app.menu.component.d.ts +44 -0
  109. package/theme/layout/app/menu/app.menu.component.html +9 -0
  110. package/theme/layout/app/menu/app.menu.component.ts +317 -0
  111. package/theme/layout/app/profileSidebar/app.profilesidebar.component.d.ts +10 -0
  112. package/theme/layout/app/profileSidebar/app.profilesidebar.component.html +165 -0
  113. package/theme/layout/app/profileSidebar/app.profilesidebar.component.ts +25 -0
  114. package/theme/layout/app/sidebar/app.sidebar.component.d.ts +15 -0
  115. package/theme/layout/app/sidebar/app.sidebar.component.html +67 -0
  116. package/theme/layout/app/sidebar/app.sidebar.component.ts +40 -0
  117. package/theme/layout/app/topbar/app.topbar.component.d.ts +13 -0
  118. package/theme/layout/app/topbar/app.topbar.component.html +41 -0
  119. package/theme/layout/app/topbar/app.topbar.component.ts +29 -0
  120. package/theme/layout/index.d.ts +1 -0
  121. package/theme/layout/index.ts +1 -0
  122. package/theme/layout/ng-package.json +6 -0
  123. package/theme/layout/service/app.layout.service.d.ts +51 -0
  124. package/theme/layout/service/app.layout.service.ts +197 -0
  125. package/theme/layout/service/app.menu.service.d.ts +14 -0
  126. package/theme/layout/service/app.menu.service.ts +28 -0
  127. package/theme/layout/service/menuchangeevent.d.ts +4 -0
  128. package/theme/layout/service/menuchangeevent.ts +4 -0
  129. package/ui/calendar/src/calendar.component.d.ts +1 -1
  130. package/ui/fileUpload/src/file-upload.component.d.ts +1 -1
  131. package/ui/form/index.d.ts +9 -0
  132. package/ui/form/src/form-submit-button.component.d.ts +1 -1
  133. package/ui/form/src/form.component.d.ts +1 -1
  134. package/ui/panel/src/panel.component.d.ts +1 -1
  135. package/ui/selectBox/src/select-box.component.d.ts +1 -3
  136. package/ui/table/index.d.ts +14 -0
  137. package/ui/table/src/table-column.component.d.ts +5 -4
  138. package/ui/table/src/table.component.d.ts +7 -15
  139. package/ui/tagBox/src/tag-box.component.d.ts +1 -3
  140. package/ui/text/src/text.component.d.ts +1 -1
  141. package/ui/textArea/src/text-area.component.d.ts +1 -1
  142. package/ui/tree/src/tree.component.d.ts +13 -18
  143. package/ui/treeTable/src/tree-table.component.d.ts +14 -18
  144. package/ui/value/src/value.component.d.ts +2 -2
  145. package/esm2022/ui/confirmPopup/aril-ui-confirmPopup.mjs +0 -5
  146. package/esm2022/ui/confirmPopup/index.mjs +0 -2
  147. package/esm2022/ui/confirmPopup/src/confirm-popup.component.mjs +0 -28
  148. package/fesm2022/aril-ui-confirmPopup.mjs +0 -35
  149. package/fesm2022/aril-ui-confirmPopup.mjs.map +0 -1
  150. package/ui/confirmPopup/index.d.ts +0 -1
  151. package/ui/confirmPopup/src/confirm-popup.component.d.ts +0 -9
@@ -0,0 +1,36 @@
1
+ import { OnInit } from '@angular/core';
2
+ import { MenuService } from '../../service/app.menu.service';
3
+ import { ColorScheme, LayoutService, MenuColorScheme, MenuMode } from '../../service/app.layout.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class AppConfigComponent implements OnInit {
6
+ layoutService: LayoutService;
7
+ menuService: MenuService;
8
+ minimal: boolean;
9
+ componentThemes: any[];
10
+ scales: number[];
11
+ constructor(layoutService: LayoutService, menuService: MenuService);
12
+ get visible(): boolean;
13
+ set visible(_val: boolean);
14
+ get scale(): number;
15
+ set scale(_val: number);
16
+ get menuMode(): MenuMode;
17
+ set menuMode(_val: MenuMode);
18
+ get colorScheme(): ColorScheme;
19
+ set colorScheme(_val: ColorScheme);
20
+ get inputStyle(): string;
21
+ set inputStyle(_val: string);
22
+ get ripple(): boolean;
23
+ set ripple(_val: boolean);
24
+ get menuTheme(): MenuColorScheme;
25
+ set menuTheme(_val: MenuColorScheme);
26
+ get theme(): string;
27
+ set theme(_val: string);
28
+ ngOnInit(): void;
29
+ onConfigButtonClick(): void;
30
+ changeColorScheme(colorScheme: ColorScheme): void;
31
+ changeTheme(theme: string): void;
32
+ decrementScale(): void;
33
+ incrementScale(): void;
34
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppConfigComponent, never>;
35
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppConfigComponent, "app-config", never, { "minimal": { "alias": "minimal"; "required": false; }; }, {}, never, never, true, never>;
36
+ }
@@ -0,0 +1,191 @@
1
+ <button
2
+ class="layout-config-button p-link"
3
+ type="button"
4
+ (click)="onConfigButtonClick()">
5
+ <i class="pi pi-cog"></i>
6
+ </button>
7
+
8
+ <p-sidebar
9
+ [(visible)]="visible"
10
+ position="right"
11
+ [transitionOptions]="'.3s cubic-bezier(0, 0, 0.2, 1)'"
12
+ styleClass="layout-config-sidebar w-18rem">
13
+ <h5>Themes</h5>
14
+ <div class="flex flex-wrap row-gap-3">
15
+ @for (theme of componentThemes; track theme) {
16
+ <div class="w-3">
17
+ <button
18
+ type="button"
19
+ class="cursor-pointer p-link w-2rem h-2rem border-circle flex-shrink-0 flex align-items-center justify-content-center"
20
+ (click)="changeTheme(theme.name)"
21
+ [ngStyle]="{ 'background-color': theme.color }">
22
+ @if (theme.name == this.layoutService.config().theme) {
23
+ <i class="pi pi-check text-white"></i>
24
+ }
25
+ </button>
26
+ </div>
27
+ }
28
+ </div>
29
+
30
+ <h5>Scale</h5>
31
+ <div class="flex align-items-center">
32
+ <button
33
+ icon="pi pi-minus"
34
+ type="button"
35
+ pButton
36
+ (click)="decrementScale()"
37
+ class="p-button-text p-button-rounded w-2rem h-2rem mr-2"
38
+ [disabled]="scale === scales[0]"></button>
39
+ <div class="flex gap-2 align-items-center">
40
+ @for (s of scales; track s) {
41
+ <i
42
+ class="pi pi-circle-fill text-300"
43
+ [ngClass]="{ 'text-primary-500': s === scale }"></i>
44
+ }
45
+ </div>
46
+ <button
47
+ icon="pi pi-plus"
48
+ type="button"
49
+ pButton
50
+ (click)="incrementScale()"
51
+ class="p-button-text p-button-rounded w-2rem h-2rem ml-2"
52
+ [disabled]="scale === scales[scales.length - 1]"></button>
53
+ </div>
54
+
55
+ @if (!minimal) {
56
+ <h5>Menu Type</h5>
57
+ <div class="flex flex-wrap row-gap-3">
58
+ <div class="flex align-items-center gap-2 w-6">
59
+ <p-radioButton
60
+ name="menuMode"
61
+ value="static"
62
+ [(ngModel)]="menuMode"
63
+ inputId="mode1"></p-radioButton>
64
+ <label for="mode1">Static</label>
65
+ </div>
66
+ <div class="flex align-items-center gap-2 w-6">
67
+ <p-radioButton
68
+ name="menuMode"
69
+ value="overlay"
70
+ [(ngModel)]="menuMode"
71
+ inputId="mode2"></p-radioButton>
72
+ <label for="mode2">Overlay</label>
73
+ </div>
74
+ <div class="flex align-items-center gap-2 w-6">
75
+ <p-radioButton
76
+ name="menuMode"
77
+ value="slim"
78
+ [(ngModel)]="menuMode"
79
+ inputId="mode3"></p-radioButton>
80
+ <label for="mode3">Slim</label>
81
+ </div>
82
+ <div class="flex align-items-center gap-2 w-6">
83
+ <p-radioButton
84
+ name="menuMode"
85
+ value="slim-plus"
86
+ [(ngModel)]="menuMode"
87
+ inputId="mode4"></p-radioButton>
88
+ <label for="mode3">Slim +</label>
89
+ </div>
90
+ <div class="flex align-items-center gap-2 w-6">
91
+ <p-radioButton
92
+ name="menuMode"
93
+ value="reveal"
94
+ [(ngModel)]="menuMode"
95
+ inputId="mode6"></p-radioButton>
96
+ <label for="mode5">Reveal</label>
97
+ </div>
98
+ <div class="flex align-items-center gap-2 w-6">
99
+ <p-radioButton
100
+ name="menuMode"
101
+ value="drawer"
102
+ [(ngModel)]="menuMode"
103
+ inputId="mode7"></p-radioButton>
104
+ <label for="mode6">Drawer</label>
105
+ </div>
106
+ <div class="flex align-items-center gap-2 w-6">
107
+ <p-radioButton
108
+ name="menuMode"
109
+ value="horizontal"
110
+ [(ngModel)]="menuMode"
111
+ inputId="mode5"></p-radioButton>
112
+ <label for="mode4">Horizontal</label>
113
+ </div>
114
+ </div>
115
+ <h5>Menu Theme</h5>
116
+ <div class="field-radiobutton">
117
+ <p-radioButton
118
+ name="menuTheme"
119
+ value="colorScheme"
120
+ [(ngModel)]="menuTheme"
121
+ inputId="menutheme-colorscheme"></p-radioButton>
122
+ <label for="menutheme-colorscheme">Color Scheme</label>
123
+ </div>
124
+ <div class="field-radiobutton">
125
+ <p-radioButton
126
+ name="menuTheme"
127
+ value="primaryColor"
128
+ [(ngModel)]="menuTheme"
129
+ inputId="menutheme-primarycolor"></p-radioButton>
130
+ <label for="menutheme-primarycolor">Primary Color</label>
131
+ </div>
132
+ <div class="field-radiobutton">
133
+ <p-radioButton
134
+ name="menuTheme"
135
+ value="transparent"
136
+ [(ngModel)]="menuTheme"
137
+ inputId="menutheme-transparent"></p-radioButton>
138
+ <label for="menutheme-transparent">Transparent</label>
139
+ </div>
140
+ }
141
+
142
+ <h5>Color Scheme</h5>
143
+ <div class="field-radiobutton">
144
+ <p-radioButton
145
+ name="colorScheme"
146
+ value="light"
147
+ [(ngModel)]="colorScheme"
148
+ inputId="mode-light"></p-radioButton>
149
+ <label for="mode-light">Light</label>
150
+ </div>
151
+ <div class="field-radiobutton">
152
+ <p-radioButton
153
+ name="colorScheme"
154
+ value="dim"
155
+ [(ngModel)]="colorScheme"
156
+ inputId="mode-dim"></p-radioButton>
157
+ <label for="mode-dim">Dim</label>
158
+ </div>
159
+ <div class="field-radiobutton">
160
+ <p-radioButton
161
+ name="colorScheme"
162
+ value="dark"
163
+ [(ngModel)]="colorScheme"
164
+ inputId="mode-dark"></p-radioButton>
165
+ <label for="mode-dark">Dark</label>
166
+ </div>
167
+
168
+ @if (!minimal) {
169
+ <h5>Input Style</h5>
170
+ <div class="flex">
171
+ <div class="field-radiobutton flex-1">
172
+ <p-radioButton
173
+ name="inputStyle"
174
+ value="outlined"
175
+ [(ngModel)]="inputStyle"
176
+ inputId="outlined_input"></p-radioButton>
177
+ <label for="outlined_input">Outlined</label>
178
+ </div>
179
+ <div class="field-radiobutton flex-1">
180
+ <p-radioButton
181
+ name="inputStyle"
182
+ value="filled"
183
+ [(ngModel)]="inputStyle"
184
+ inputId="filled_input"></p-radioButton>
185
+ <label for="filled_input">Filled</label>
186
+ </div>
187
+ </div>
188
+ <h5>Ripple Effect</h5>
189
+ <p-inputSwitch [(ngModel)]="ripple"></p-inputSwitch>
190
+ }
191
+ </p-sidebar>
@@ -0,0 +1,152 @@
1
+ import { Component, Input, OnInit } from '@angular/core';
2
+ import { NgClass, NgStyle } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+
5
+ import { SidebarModule } from 'primeng/sidebar';
6
+ import { RadioButtonModule } from 'primeng/radiobutton';
7
+ import { ButtonModule } from 'primeng/button';
8
+ import { InputSwitchModule } from 'primeng/inputswitch';
9
+
10
+ import { MenuService } from '../../service/app.menu.service';
11
+ import {
12
+ ColorScheme,
13
+ LayoutService,
14
+ MenuColorScheme,
15
+ MenuMode,
16
+ } from '../../service/app.layout.service';
17
+
18
+ @Component({
19
+ standalone: true,
20
+ selector: 'app-config',
21
+ imports: [FormsModule, SidebarModule, RadioButtonModule, ButtonModule, InputSwitchModule, NgStyle, NgClass],
22
+ templateUrl: './app.config.component.html',
23
+ })
24
+ export class AppConfigComponent implements OnInit {
25
+ @Input() minimal: boolean = false;
26
+
27
+ componentThemes: any[] = [];
28
+
29
+ scales: number[] = [12, 13, 14, 15, 16];
30
+
31
+ constructor(
32
+ public layoutService: LayoutService,
33
+ public menuService: MenuService
34
+ ) { }
35
+
36
+ get visible(): boolean {
37
+ return this.layoutService.state.configSidebarVisible;
38
+ }
39
+ set visible(_val: boolean) {
40
+ this.layoutService.state.configSidebarVisible = _val;
41
+ }
42
+
43
+ get scale(): number {
44
+ return this.layoutService.config().scale;
45
+ }
46
+ set scale(_val: number) {
47
+ this.layoutService.config.update((config) => ({
48
+ ...config,
49
+ scale: _val,
50
+ }));
51
+ }
52
+
53
+ get menuMode(): MenuMode {
54
+ return this.layoutService.config().menuMode;
55
+ }
56
+ set menuMode(_val: MenuMode) {
57
+ this.layoutService.config.update((config) => ({
58
+ ...config,
59
+ menuMode: _val,
60
+ }));
61
+ if (
62
+ this.layoutService.isSlimPlus() ||
63
+ this.layoutService.isSlim() ||
64
+ this.layoutService.isHorizontal()
65
+ ) {
66
+ this.menuService.reset();
67
+ }
68
+ }
69
+
70
+ get colorScheme(): ColorScheme {
71
+ return this.layoutService.config().colorScheme;
72
+ }
73
+ set colorScheme(_val: ColorScheme) {
74
+ this.layoutService.config.update((config) => ({
75
+ ...config,
76
+ colorScheme: _val,
77
+ }));
78
+ }
79
+
80
+ get inputStyle(): string {
81
+ return this.layoutService.config().inputStyle;
82
+ }
83
+ set inputStyle(_val: string) {
84
+ this.layoutService.config.update((config) => ({
85
+ ...config,
86
+ inputStyle: _val,
87
+ }));
88
+ }
89
+
90
+ get ripple(): boolean {
91
+ return this.layoutService.config().ripple;
92
+ }
93
+ set ripple(_val: boolean) {
94
+ this.layoutService.config.update((config) => ({
95
+ ...config,
96
+ ripple: _val,
97
+ }));
98
+ }
99
+
100
+ get menuTheme(): MenuColorScheme {
101
+ return this.layoutService.config().menuTheme;
102
+ }
103
+ set menuTheme(_val: MenuColorScheme) {
104
+ this.layoutService.config.update((config) => ({
105
+ ...config,
106
+ menuTheme: _val,
107
+ }));
108
+ }
109
+
110
+ get theme(): string {
111
+ return this.layoutService.config().theme;
112
+ }
113
+ set theme(_val: string) {
114
+ this.layoutService.config.update((config) => ({
115
+ ...config,
116
+ theme: _val,
117
+ }));
118
+ }
119
+
120
+ ngOnInit() {
121
+ this.componentThemes = [
122
+ { name: 'indigo', color: '#6366F1' },
123
+ { name: 'blue', color: '#3B82F6' },
124
+ { name: 'purple', color: '#8B5CF6' },
125
+ { name: 'teal', color: '#14B8A6' },
126
+ { name: 'cyan', color: '#06b6d4' },
127
+ { name: 'green', color: '#10b981' },
128
+ { name: 'orange', color: '#f59e0b' },
129
+ { name: 'pink', color: '#d946ef' },
130
+ ];
131
+ }
132
+
133
+ onConfigButtonClick() {
134
+ this.layoutService.showConfigSidebar();
135
+ }
136
+
137
+ changeColorScheme(colorScheme: ColorScheme) {
138
+ this.colorScheme = colorScheme;
139
+ }
140
+
141
+ changeTheme(theme: string) {
142
+ this.theme = theme;
143
+ }
144
+
145
+ decrementScale() {
146
+ this.scale--;
147
+ }
148
+
149
+ incrementScale() {
150
+ this.scale++;
151
+ }
152
+ }
@@ -0,0 +1,51 @@
1
+ import { OnDestroy, Renderer2 } from '@angular/core';
2
+ import { ActivatedRoute, Router } from '@angular/router';
3
+ import { MenuItem } from 'primeng/api';
4
+ import { Subscription } from 'rxjs';
5
+ import { MenuService } from '../../service/app.menu.service';
6
+ import { AppSidebarComponent } from '../sidebar/app.sidebar.component';
7
+ import { AppTopbarComponent } from '../topbar/app.topbar.component';
8
+ import { LayoutService } from '../../service/app.layout.service';
9
+ import * as i0 from "@angular/core";
10
+ export declare class AppLayoutComponent implements OnDestroy {
11
+ private menuService;
12
+ layoutService: LayoutService;
13
+ renderer: Renderer2;
14
+ router: Router;
15
+ private route;
16
+ sidebarItems: import("@angular/core").InputSignal<MenuItem[], MenuItem[]>;
17
+ overlayMenuOpenSubscription: Subscription;
18
+ menuOutsideClickListener: any;
19
+ menuScrollListener: any;
20
+ appSidebar: AppSidebarComponent;
21
+ appTopbar: AppTopbarComponent;
22
+ constructor(menuService: MenuService, layoutService: LayoutService, renderer: Renderer2, router: Router, route: ActivatedRoute);
23
+ blockBodyScroll(): void;
24
+ unblockBodyScroll(): void;
25
+ hideMenu(): void;
26
+ get containerClass(): {
27
+ 'layout-light': boolean;
28
+ 'layout-dim': boolean;
29
+ 'layout-dark': boolean;
30
+ 'layout-colorscheme-menu': boolean;
31
+ 'layout-primarycolor-menu': boolean;
32
+ 'layout-transparent-menu': boolean;
33
+ 'layout-overlay': boolean;
34
+ 'layout-static': boolean;
35
+ 'layout-slim': boolean;
36
+ 'layout-slim-plus': boolean;
37
+ 'layout-horizontal': boolean;
38
+ 'layout-reveal': boolean;
39
+ 'layout-drawer': boolean;
40
+ 'layout-static-inactive': boolean;
41
+ 'layout-overlay-active': boolean;
42
+ 'layout-mobile-active': boolean;
43
+ 'p-input-filled': boolean;
44
+ 'p-ripple-disabled': boolean;
45
+ 'layout-sidebar-active': boolean;
46
+ 'layout-sidebar-anchored': boolean;
47
+ };
48
+ ngOnDestroy(): void;
49
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppLayoutComponent, never>;
50
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppLayoutComponent, "app-layout", never, { "sidebarItems": { "alias": "sidebarItems"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
51
+ }
@@ -0,0 +1,13 @@
1
+ <div class="layout-container" [ngClass]="containerClass">
2
+ <app-sidebar></app-sidebar>
3
+ <div class="layout-content-wrapper">
4
+ <app-topbar></app-topbar>
5
+ <!-- <app-breadcrumb class="content-breadcrumb"></app-breadcrumb> -->
6
+ <div class="layout-content">
7
+ <router-outlet></router-outlet>
8
+ </div>
9
+ </div>
10
+ <app-profilemenu></app-profilemenu>
11
+ <app-config></app-config>
12
+ <div class="layout-mask"></div>
13
+ </div>
@@ -0,0 +1,183 @@
1
+ import { NgClass } from '@angular/common';
2
+ import { Component, OnDestroy, Renderer2, ViewChild, effect, input } from '@angular/core';
3
+ import { ActivatedRoute, NavigationEnd, Router, RouterOutlet } from '@angular/router';
4
+
5
+ import { MenuItem } from 'primeng/api';
6
+ import { filter, Subscription } from 'rxjs';
7
+
8
+ import { MenuService } from '../../service/app.menu.service';
9
+ import { AppSidebarComponent } from '../sidebar/app.sidebar.component';
10
+ import { AppTopbarComponent } from '../topbar/app.topbar.component';
11
+ import { AppBreadcrumbComponent } from '../breadcrumb/app.breadcrumb.component';
12
+ import { AppProfileSidebarComponent } from '../profileSidebar/app.profilesidebar.component';
13
+ import { LayoutService } from '../../service/app.layout.service';
14
+ import { AppConfigComponent } from '../config/app.config.component';
15
+
16
+ @Component({
17
+ standalone: true,
18
+ selector: 'app-layout',
19
+ imports: [NgClass, RouterOutlet, AppSidebarComponent, AppTopbarComponent, AppBreadcrumbComponent, AppProfileSidebarComponent, AppConfigComponent],
20
+ templateUrl: './app.layout.component.html'
21
+ })
22
+ export class AppLayoutComponent implements OnDestroy {
23
+ sidebarItems = input<MenuItem[]>([]);
24
+
25
+ overlayMenuOpenSubscription: Subscription;
26
+
27
+ menuOutsideClickListener: any;
28
+
29
+ menuScrollListener: any;
30
+
31
+ @ViewChild(AppSidebarComponent) appSidebar!: AppSidebarComponent;
32
+
33
+ @ViewChild(AppTopbarComponent) appTopbar!: AppTopbarComponent;
34
+
35
+ constructor(
36
+ private menuService: MenuService,
37
+ public layoutService: LayoutService,
38
+ public renderer: Renderer2,
39
+ public router: Router,
40
+ private route: ActivatedRoute
41
+ ) {
42
+ this.overlayMenuOpenSubscription = this.layoutService.overlayOpen$.subscribe(() => {
43
+ if (!this.menuOutsideClickListener) {
44
+ this.menuOutsideClickListener = this.renderer.listen(
45
+ 'document',
46
+ 'click',
47
+ (event) => {
48
+ const isOutsideClicked = !(
49
+ this.appSidebar.el.nativeElement.isSameNode(
50
+ event.target
51
+ ) ||
52
+ this.appSidebar.el.nativeElement.contains(
53
+ event.target
54
+ ) ||
55
+ this.appTopbar.menuButton.nativeElement.isSameNode(
56
+ event.target
57
+ ) ||
58
+ this.appTopbar.menuButton.nativeElement.contains(
59
+ event.target
60
+ )
61
+ );
62
+ if (isOutsideClicked) {
63
+ this.hideMenu();
64
+ }
65
+ }
66
+ );
67
+ }
68
+
69
+ if (
70
+ (this.layoutService.isHorizontal() || this.layoutService.isSlim() || this.layoutService.isSlimPlus()) && !this.menuScrollListener) {
71
+ this.menuScrollListener = this.renderer.listen(
72
+ this.appSidebar.menuContainer.nativeElement,
73
+ 'scroll',
74
+ (event) => {
75
+ if (this.layoutService.isDesktop()) {
76
+ this.hideMenu();
77
+ }
78
+ }
79
+ );
80
+ }
81
+
82
+ if (this.layoutService.state.staticMenuMobileActive) {
83
+ this.blockBodyScroll();
84
+ }
85
+ });
86
+
87
+ this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
88
+ this.hideMenu();
89
+ });
90
+
91
+ effect(() => {
92
+ this.menuService.menuItems.set(this.sidebarItems());
93
+ }, { allowSignalWrites: true });
94
+ }
95
+
96
+ blockBodyScroll(): void {
97
+ if (document.body.classList) {
98
+ document.body.classList.add('blocked-scroll');
99
+ } else {
100
+ document.body.className += ' blocked-scroll';
101
+ }
102
+ }
103
+
104
+ unblockBodyScroll(): void {
105
+ if (document.body.classList) {
106
+ document.body.classList.remove('blocked-scroll');
107
+ } else {
108
+ document.body.className = document.body.className.replace(
109
+ new RegExp(
110
+ '(^|\\b)' +
111
+ 'blocked-scroll'.split(' ').join('|') +
112
+ '(\\b|$)',
113
+ 'gi'
114
+ ),
115
+ ' '
116
+ );
117
+ }
118
+ }
119
+
120
+ hideMenu() {
121
+ this.layoutService.state.overlayMenuActive = false;
122
+ this.layoutService.state.staticMenuMobileActive = false;
123
+ this.layoutService.state.menuHoverActive = false;
124
+ this.menuService.reset();
125
+
126
+ if (this.menuOutsideClickListener) {
127
+ this.menuOutsideClickListener();
128
+ this.menuOutsideClickListener = null;
129
+ }
130
+
131
+ if (this.menuScrollListener) {
132
+ this.menuScrollListener();
133
+ this.menuScrollListener = null;
134
+ }
135
+
136
+ this.unblockBodyScroll();
137
+ }
138
+
139
+ get containerClass() {
140
+ return {
141
+ 'layout-light': this.layoutService.config().colorScheme === 'light',
142
+ 'layout-dim': this.layoutService.config().colorScheme === 'dim',
143
+ 'layout-dark': this.layoutService.config().colorScheme === 'dark',
144
+ 'layout-colorscheme-menu':
145
+ this.layoutService.config().menuTheme === 'colorScheme',
146
+ 'layout-primarycolor-menu':
147
+ this.layoutService.config().menuTheme === 'primaryColor',
148
+ 'layout-transparent-menu':
149
+ this.layoutService.config().menuTheme === 'transparent',
150
+ 'layout-overlay':
151
+ this.layoutService.config().menuMode === 'overlay',
152
+ 'layout-static': this.layoutService.config().menuMode === 'static',
153
+ 'layout-slim': this.layoutService.config().menuMode === 'slim',
154
+ 'layout-slim-plus':
155
+ this.layoutService.config().menuMode === 'slim-plus',
156
+ 'layout-horizontal':
157
+ this.layoutService.config().menuMode === 'horizontal',
158
+ 'layout-reveal': this.layoutService.config().menuMode === 'reveal',
159
+ 'layout-drawer': this.layoutService.config().menuMode === 'drawer',
160
+ 'layout-static-inactive':
161
+ this.layoutService.state.staticMenuDesktopInactive &&
162
+ this.layoutService.config().menuMode === 'static',
163
+ 'layout-overlay-active': this.layoutService.state.overlayMenuActive,
164
+ 'layout-mobile-active':
165
+ this.layoutService.state.staticMenuMobileActive,
166
+ 'p-input-filled':
167
+ this.layoutService.config().inputStyle === 'filled',
168
+ 'p-ripple-disabled': !this.layoutService.config().ripple,
169
+ 'layout-sidebar-active': this.layoutService.state.sidebarActive,
170
+ 'layout-sidebar-anchored': this.layoutService.state.anchored,
171
+ };
172
+ }
173
+
174
+ ngOnDestroy() {
175
+ if (this.overlayMenuOpenSubscription) {
176
+ this.overlayMenuOpenSubscription.unsubscribe();
177
+ }
178
+
179
+ if (this.menuOutsideClickListener) {
180
+ this.menuOutsideClickListener();
181
+ }
182
+ }
183
+ }
@@ -0,0 +1,44 @@
1
+ import { ChangeDetectorRef, ElementRef, OnDestroy, OnInit } from '@angular/core';
2
+ import { Router } from '@angular/router';
3
+ import { AnimationEvent } from '@angular/animations';
4
+ import { MenuItem } from 'primeng/api';
5
+ import { Subscription } from 'rxjs';
6
+ import { MenuService } from '../../service/app.menu.service';
7
+ import { LayoutService } from '../../service/app.layout.service';
8
+ import * as i0 from "@angular/core";
9
+ export declare class AppMenuItemComponent implements OnInit, OnDestroy {
10
+ layoutService: LayoutService;
11
+ private cd;
12
+ router: Router;
13
+ private menuService;
14
+ item: MenuItem;
15
+ index: number;
16
+ root: boolean;
17
+ parentKey: string;
18
+ submenu: ElementRef;
19
+ active: boolean;
20
+ menuSourceSubscription: Subscription;
21
+ menuResetSubscription: Subscription;
22
+ key: string;
23
+ constructor(layoutService: LayoutService, cd: ChangeDetectorRef, router: Router, menuService: MenuService);
24
+ ngOnInit(): void;
25
+ ngAfterViewChecked(): void;
26
+ updateActiveStateFromRoute(): void;
27
+ onSubmenuAnimated(event: AnimationEvent): void;
28
+ calculatePosition(overlay: HTMLElement, target: HTMLElement): void;
29
+ itemClick(event: Event): void;
30
+ onMouseEnter(): void;
31
+ get submenuAnimation(): "collapsed" | "expanded" | "hidden" | "visible";
32
+ get isHorizontal(): boolean;
33
+ get isSlim(): boolean;
34
+ get isSlimPlus(): boolean;
35
+ get activeClass(): boolean;
36
+ ngOnDestroy(): void;
37
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppMenuItemComponent, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppMenuItemComponent, "[app-menuitem]", never, { "item": { "alias": "item"; "required": false; }; "index": { "alias": "index"; "required": false; }; "root": { "alias": "root"; "required": false; }; "parentKey": { "alias": "parentKey"; "required": false; }; }, {}, never, never, true, never>;
39
+ }
40
+ export declare class AppMenuComponent {
41
+ menuService: MenuService;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppMenuComponent, never>;
43
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppMenuComponent, "app-menu", never, {}, {}, never, never, true, never>;
44
+ }
@@ -0,0 +1,9 @@
1
+ <ul class="layout-menu">
2
+ @for (item of menuService.menuItems(); track $index) {
3
+ @if (item.separator) {
4
+ <li class="menu-separator"></li>
5
+ } @else {
6
+ <li app-menuitem [item]="item" [index]="$index" [root]="true"></li>
7
+ }
8
+ }
9
+ </ul>