@acorex/platform 21.0.0-next.70 → 21.0.0-next.71

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 (32) hide show
  1. package/fesm2022/acorex-platform-common.mjs +11 -0
  2. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-core.mjs +332 -76
  4. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-layout-builder.mjs +563 -44
  6. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-layout-components.mjs +83 -67
  8. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-layout-entity.mjs +543 -237
  10. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-views.mjs +319 -66
  12. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-widget-core.mjs +54 -6
  14. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-widgets.mjs +198 -91
  16. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-themes-default.mjs +13 -14
  18. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-themes-shared.mjs +50 -30
  20. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  21. package/package.json +1 -1
  22. package/types/acorex-platform-common.d.ts +11 -0
  23. package/types/acorex-platform-core.d.ts +137 -47
  24. package/types/acorex-platform-layout-builder.d.ts +90 -13
  25. package/types/acorex-platform-layout-components.d.ts +21 -17
  26. package/types/acorex-platform-layout-entity.d.ts +63 -10
  27. package/types/acorex-platform-layout-views.d.ts +68 -6
  28. package/types/acorex-platform-layout-widget-core.d.ts +43 -8
  29. package/types/acorex-platform-layout-widgets.d.ts +21 -6
  30. package/types/acorex-platform-themes-default.d.ts +24 -4
  31. package/types/acorex-platform-themes-shared.d.ts +6 -0
  32. package/types/acorex-platform-workflow.d.ts +1 -1
@@ -7,10 +7,10 @@ import { AXDropdownModule } from '@acorex/components/dropdown';
7
7
  import * as i1 from '@angular/common';
8
8
  import { CommonModule } from '@angular/common';
9
9
  import * as i0 from '@angular/core';
10
- import { computed, inject, ChangeDetectionStrategy, Component, InjectionToken, Injectable, Input, signal, effect, Injector, NgModule } from '@angular/core';
10
+ import { computed, inject, effect, ChangeDetectionStrategy, Component, InjectionToken, Injectable, Input, signal, Injector, NgModule } from '@angular/core';
11
11
  import { AXPSettingsService, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex/platform/common';
12
12
  import * as i1$3 from '@acorex/platform/core';
13
- import { AXPScreenSize, AXPPlatformScope, AXPComponentSlotModule } from '@acorex/platform/core';
13
+ import { AXPScreenSize, AXPDeviceService, AXPPlatformScope, AXPComponentSlotModule } from '@acorex/platform/core';
14
14
  import { HttpClient } from '@angular/common/http';
15
15
  import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
16
16
  import { timer, firstValueFrom, filter } from 'rxjs';
@@ -116,6 +116,8 @@ withState(() => {
116
116
  sideMenuState: (getInitialScreenSize() === AXPScreenSize.Large
117
117
  ? AXPSideMenuState.Opened
118
118
  : AXPSideMenuState.Closed),
119
+ /** Ephemeral overlay drawer state on small/medium viewports; never persisted. */
120
+ overlaySideMenuOpen: false,
119
121
  sideMenuWidth: AXP_SIDE_MENU_FULL_DEFAULT_WIDTH,
120
122
  sideMenuCompactWidth: AXP_SIDE_MENU_COMPACT_WIDTH,
121
123
  menuVerticalMode: AXPMenuVerticalMode.Full,
@@ -126,27 +128,36 @@ withState(() => {
126
128
  return state;
127
129
  }),
128
130
  // Computed Signals
129
- withComputed(({ currentMode: currentTheme, systemThemeMode: systemTheme, sideMenuState, overlayLoading, navigationLoading, menuOrientation, menuVerticalMode, sideMenuWidth, sideMenuCompactWidth, isPrinting, }) => ({
130
- isDarkMode: computed(() => {
131
- if (isPrinting()) {
132
- return false;
131
+ withComputed(({ currentMode: currentTheme, systemThemeMode: systemTheme, sideMenuState, overlaySideMenuOpen, overlayLoading, navigationLoading, menuOrientation, menuVerticalMode, sideMenuWidth, sideMenuCompactWidth, isPrinting, }, deviceService = inject(AXPDeviceService)) => {
132
+ const effectiveMenuVerticalMode = computed(() => {
133
+ if (!deviceService.isLarge()) {
134
+ return AXPMenuVerticalMode.Full;
133
135
  }
134
- return (currentTheme() === AXPThemeMode.Dark ||
135
- (currentTheme() === AXPThemeMode.System && systemTheme() === AXPThemeMode.Dark));
136
- }),
137
- isLightMode: computed(() => currentTheme() === AXPThemeMode.Light ||
138
- (currentTheme() === AXPThemeMode.System && systemTheme() === AXPThemeMode.Light)),
139
- isSystemMode: computed(() => currentTheme() === AXPThemeMode.System),
140
- isSideMenuOpen: computed(() => sideMenuState() === AXPSideMenuState.Opened),
141
- isOverlayLoading: computed(() => overlayLoading()),
142
- isNavigationLoading: computed(() => navigationLoading()),
143
- isMenuHorizontal: computed(() => menuOrientation() === AXPMenuOrientation.Horizontal),
144
- sideMenuDrawerWidth: computed(() => normalizeMenuVerticalMode(menuVerticalMode(), AXPMenuVerticalMode.Full) === AXPMenuVerticalMode.Compact
145
- ? sideMenuCompactWidth()
146
- : sideMenuWidth()),
147
- })),
136
+ return normalizeMenuVerticalMode(menuVerticalMode(), AXPMenuVerticalMode.Full);
137
+ }, ...(ngDevMode ? [{ debugName: "effectiveMenuVerticalMode" }] : /* istanbul ignore next */ []));
138
+ return {
139
+ isDarkMode: computed(() => {
140
+ if (isPrinting()) {
141
+ return false;
142
+ }
143
+ return (currentTheme() === AXPThemeMode.Dark ||
144
+ (currentTheme() === AXPThemeMode.System && systemTheme() === AXPThemeMode.Dark));
145
+ }),
146
+ isLightMode: computed(() => currentTheme() === AXPThemeMode.Light ||
147
+ (currentTheme() === AXPThemeMode.System && systemTheme() === AXPThemeMode.Light)),
148
+ isSystemMode: computed(() => currentTheme() === AXPThemeMode.System),
149
+ isSideMenuOpen: computed(() => deviceService.isLarge()
150
+ ? sideMenuState() === AXPSideMenuState.Opened
151
+ : overlaySideMenuOpen()),
152
+ isOverlayLoading: computed(() => overlayLoading()),
153
+ isNavigationLoading: computed(() => navigationLoading()),
154
+ isMenuHorizontal: computed(() => menuOrientation() === AXPMenuOrientation.Horizontal),
155
+ effectiveMenuVerticalMode,
156
+ sideMenuDrawerWidth: computed(() => effectiveMenuVerticalMode() === AXPMenuVerticalMode.Compact ? sideMenuCompactWidth() : sideMenuWidth()),
157
+ };
158
+ }),
148
159
  // Methods for State Management
149
- withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSettingsService)) => {
160
+ withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSettingsService), deviceService = inject(AXPDeviceService)) => {
150
161
  const _applySettings = async () => {
151
162
  // Initialize theme and side menu setting from storage
152
163
  const settingThemeMode = (await settingsService.get(AXPThemeLayoutSetting.Mode)) ?? AXPThemeMode.Light;
@@ -273,6 +284,15 @@ withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSetti
273
284
  }
274
285
  };
275
286
  const minimumDisplayTime = 500; // milliseconds
287
+ const setSideMenuOpen = (opened) => {
288
+ if (!deviceService.isLarge()) {
289
+ patchState(store, { overlaySideMenuOpen: opened });
290
+ return;
291
+ }
292
+ const sideMenuState = opened ? AXPSideMenuState.Opened : AXPSideMenuState.Closed;
293
+ patchState(store, { sideMenuState });
294
+ settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuStatus, sideMenuState);
295
+ };
276
296
  return {
277
297
  // Change theme and update HTML class
278
298
  changeThemeMode(theme) {
@@ -282,13 +302,11 @@ withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSetti
282
302
  },
283
303
  // Open side menu
284
304
  openSideMenu() {
285
- patchState(store, { sideMenuState: AXPSideMenuState.Opened });
286
- settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuStatus, AXPSideMenuState.Opened);
305
+ setSideMenuOpen(true);
287
306
  },
288
307
  // Close side menu
289
308
  closeSideMenu() {
290
- patchState(store, { sideMenuState: AXPSideMenuState.Closed });
291
- settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuStatus, AXPSideMenuState.Closed);
309
+ setSideMenuOpen(false);
292
310
  },
293
311
  // Set side menu width in full vertical mode
294
312
  setSideMenuWidth(width) {
@@ -313,9 +331,7 @@ withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSetti
313
331
  },
314
332
  // Toggle side menu state
315
333
  toggleSideMenu() {
316
- const newSideMenuState = store.sideMenuState() === AXPSideMenuState.Opened ? AXPSideMenuState.Closed : AXPSideMenuState.Opened;
317
- patchState(store, { sideMenuState: newSideMenuState });
318
- settingsService.scope(AXPPlatformScope.User).set(AXPThemeLayoutSetting.SideMenuStatus, newSideMenuState);
334
+ setSideMenuOpen(!store.isSideMenuOpen());
319
335
  },
320
336
  // Set navigation loading state with a task counter
321
337
  setNavigationLoading(value, delay) {
@@ -348,9 +364,13 @@ withMethods((store, http = inject(HttpClient), settingsService = inject(AXPSetti
348
364
  };
349
365
  }),
350
366
  // Lifecycle Hooks
351
- withHooks((store, settingsService = inject(AXPSettingsService)) => ({
367
+ withHooks((store, settingsService = inject(AXPSettingsService), deviceService = inject(AXPDeviceService)) => ({
352
368
  onInit() {
353
- //
369
+ effect(() => {
370
+ if (!deviceService.isLarge()) {
371
+ patchState(store, { overlaySideMenuOpen: false });
372
+ }
373
+ });
354
374
  settingsService.onChanged
355
375
  .pipe(filter((c) => [AXPPlatformScope.Platform, AXPPlatformScope.Tenant, AXPPlatformScope.User].includes(c.scope)))
356
376
  .subscribe(async (changes) => {