@acorex-platform/framework-client 0.0.37 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-framework-client-auth.mjs +212 -44
- package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs → acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs} +31 -1
- package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-common.mjs +848 -76
- package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-core.mjs +273 -96
- package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +292 -11
- package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-Bp2cNCPO.mjs → acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-BqPaHKPM.mjs} +10 -6
- package/fesm2022/acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-BqPaHKPM.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-components-property-viewer-inline-code-editor.component-CcpUTEVQ.mjs +66 -0
- package/fesm2022/acorex-platform-framework-client-layout-components-property-viewer-inline-code-editor.component-CcpUTEVQ.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-components-resource-appointment-board.component-DCkpgsFH.mjs +195 -0
- package/fesm2022/acorex-platform-framework-client-layout-components-resource-appointment-board.component-DCkpgsFH.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs +3987 -1020
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-designer.mjs +1179 -304
- package/fesm2022/acorex-platform-framework-client-layout-designer.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-C74cBc-K.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-Dc_NpBx6.mjs} +1697 -323
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-Dc_NpBx6.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-B6nG9dIS.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-Cx-n7ZuA.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-B6nG9dIS.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-Cx-n7ZuA.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-DLQA_Q2Y.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-BONV249y.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-DLQA_Q2Y.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-BONV249y.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-B4wC1iqZ.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-uTG2nFly.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-B4wC1iqZ.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-uTG2nFly.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs +3 -3
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +3854 -3278
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CDpzvn6z.mjs +33191 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-CDpzvn6z.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BkrPu1wO.mjs} +8 -5
- package/fesm2022/acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BkrPu1wO.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-value.util-Cb7R1qLO.mjs +45 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-value.util-Cb7R1qLO.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-column.component-BL621E1r.mjs +68 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-column.component-BL621E1r.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-edit.component-CVsPKhNl.mjs +88 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-edit.component-CVsPKhNl.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-view.component-BEq4O4al.mjs +71 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-view.component-BEq4O4al.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-WpiEHusZ.mjs +81 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-WpiEHusZ.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs → acorex-platform-framework-client-layout-widgets-page-widget-designer.component-Cadl6guA.mjs} +41 -23
- package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-Cadl6guA.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cw3NhWL8.mjs} +3 -3
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-Cw3NhWL8.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-column.component-Clb27Loe.mjs +71 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-column.component-Clb27Loe.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-edit.component-l7q8A-D3.mjs +111 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-edit.component-l7q8A-D3.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-view.component-Cc1AH09b.mjs +77 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-view.component-Cc1AH09b.mjs.map +1 -0
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-BCLxS3rS.mjs} +3 -3
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-BCLxS3rS.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BEa-vD6O.mjs} +21 -8
- package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BEa-vD6O.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-C2PGoC7r.mjs +124 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-C2PGoC7r.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-DDDoPoQa.mjs +345 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-DDDoPoQa.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -31985
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-realtime.mjs +2 -1
- package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-runtime.mjs +47 -3
- package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-DBUwSzvg.mjs → acorex-platform-framework-client-themes-default-entity-master-single-view.component-CHLsBvBE.mjs} +2 -2
- package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-DBUwSzvg.mjs.map → acorex-platform-framework-client-themes-default-entity-master-single-view.component-CHLsBvBE.mjs.map} +1 -1
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs +373 -70
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs → acorex-platform-framework-client-themes-shared-settings.provider-DIkjSTU7.mjs} +102 -1
- package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-DIkjSTU7.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +174 -22
- package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -1
- package/package.json +2 -2
- package/realtime/README.md +1 -1
- package/types/acorex-platform-framework-client-auth.d.ts +18 -1
- package/types/acorex-platform-framework-client-common.d.ts +209 -8
- package/types/acorex-platform-framework-client-core.d.ts +166 -121
- package/types/acorex-platform-framework-client-layout-builder.d.ts +29 -0
- package/types/acorex-platform-framework-client-layout-components.d.ts +699 -146
- package/types/acorex-platform-framework-client-layout-designer.d.ts +192 -14
- package/types/acorex-platform-framework-client-layout-entity.d.ts +159 -91
- package/types/acorex-platform-framework-client-layout-views.d.ts +16 -0
- package/types/acorex-platform-framework-client-layout-widget-core.d.ts +140 -37
- package/types/acorex-platform-framework-client-layout-widgets.d.ts +235 -117
- package/types/acorex-platform-framework-client-realtime.d.ts +16 -3
- package/types/acorex-platform-framework-client-runtime.d.ts +8 -0
- package/types/acorex-platform-framework-client-themes-default.d.ts +62 -11
- package/types/acorex-platform-framework-client-themes-shared.d.ts +25 -2
- package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-Bp2cNCPO.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs +0 -77
- package/fesm2022/acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-C74cBc-K.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs.map +0 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, Injectable, Injector, signal, ApplicationRef, DestroyRef, makeEnvironmentProviders, NgModule, computed, input, ChangeDetectionStrategy, ViewEncapsulation, Component, output, effect, viewChild, afterNextRender, untracked, ErrorHandler, EventEmitter, Input, Output, Directive, Inject, runInInjectionContext, model, linkedSignal } from '@angular/core';
|
|
3
|
-
import * as
|
|
3
|
+
import * as i5 from '@angular/router';
|
|
4
4
|
import { Router, NavigationEnd, NavigationStart, ROUTES, RedirectCommand, UrlTree, RouterModule } from '@angular/router';
|
|
5
5
|
import { AXPSessionService, AXPSessionStatus, AXPUnauthenticatedError, AXPAuthGuard, commandMessageTextForError } from '@acorex-platform/framework-client/auth';
|
|
6
6
|
export { commandMessageTextForError } from '@acorex-platform/framework-client/auth';
|
|
7
7
|
import { combineLatest, map, distinctUntilChanged, Subject, ReplaySubject, firstValueFrom, filter, take, timer, timeout, switchMap, from, of } from 'rxjs';
|
|
8
|
-
import { unwrapValueProperty, isLocaleStringMap, coerceUnknownToDate, coerceUnknownToFiniteNumber, coerceUnknownToBoolean, coerceUnknownToTrimmedString, AXPPlatformScope, runtimeQueryPayloadData, runtimeCommandPayloadData, AXPRegionalSetting, AXPWidgetsCatalog, axpResolveUserNotificationDelivery, resolveMultiLanguageString, coerceUnknownToMultiLanguageString, AXPKeyboardShortcutPriority, AXP_PLATFORM_ERROR_CODES, AXPRequestError, mapUnknownToAXPErrorBody, AXPSystemActionType, runtimeQueryCollectionData, createRandomUuid } from '@acorex-platform/framework-shared/core';
|
|
9
|
-
import * as
|
|
10
|
-
import { AXPDebugService, AXPBroadcastEventService, AXP_SETTINGS_DEFINITION_DIALOG_OPENER, objectKeyValueTransforms, AXPDataGenerator, AXPKeyboardShortcutRegistry, normalizeKeyboardShortcuts, AXPDeviceService, chordToKbdItemKeys, hasForegroundOverlayLayer, AXPExpressionEvaluatorService, AXPContextEvalFactory, AXPModuleManifestModule, AXPComponentSlotModule, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_LOGO_IMAGE_SRC_RESOLVER, AXPHookService } from '@acorex-platform/framework-client/core';
|
|
8
|
+
import { unwrapValueProperty, isLocaleStringMap, coerceUnknownToDate, coerceUnknownToFiniteNumber, coerceUnknownToBoolean, coerceUnknownToTrimmedString, AXPPlatformScope, runtimeQueryPayloadData, runtimeCommandPayloadData, AXPRegionalSetting, AXPWidgetsCatalog, axpResolveUserNotificationDelivery, resolveMultiLanguageString, coerceUnknownToMultiLanguageString, AXPKeyboardShortcutPriority, AXP_PLATFORM_ERROR_CODES, AXPRequestError, mapUnknownToAXPErrorBody, AXPSystemActionType, runtimeQueryCollectionData, createRandomUuid, runtimeCommandFailure, runtimeCommandSuccessObject, runtimeQuerySuccessObject } from '@acorex-platform/framework-shared/core';
|
|
9
|
+
import * as i4$2 from '@acorex-platform/framework-client/core';
|
|
10
|
+
import { AXPDebugService, AXPBroadcastEventService, AXP_SETTINGS_DEFINITION_DIALOG_OPENER, objectKeyValueTransforms, AXPDataGenerator, AXPKeyboardShortcutRegistry, normalizeKeyboardShortcuts, AXPDeviceService, provideAppStartUpTask, AXP_APP_STARTUP_PRIORITY, chordToKbdItemKeys, hasForegroundOverlayLayer, AXPExpressionEvaluatorService, AXPContextEvalFactory, AXPModuleManifestModule, AXPComponentSlotModule, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_LOGO_IMAGE_SRC_RESOLVER, AXPHookService, AXPPageContextRegistry } from '@acorex-platform/framework-client/core';
|
|
11
11
|
export { AXPDebugService } from '@acorex-platform/framework-client/core';
|
|
12
|
-
import { merge, sortBy, isString, toString, isPlainObject, defaultTo, isEmpty, cloneDeep, get, isNumber, isNil, isObject, omit, uniq } from 'lodash-es';
|
|
13
|
-
import { AXPQueryService, AXPCommandService, provideCommandSetups } from '@acorex-platform/framework-client/runtime';
|
|
12
|
+
import { merge, sortBy, isString, toString, isPlainObject, mergeWith, defaultTo, isEmpty, isEqual, cloneDeep, get, isNumber, isNil, isObject, omit, uniq } from 'lodash-es';
|
|
13
|
+
import { AXPQueryService, AXPCommandService, provideCommandSetups, provideQuerySetups } from '@acorex-platform/framework-client/runtime';
|
|
14
14
|
import Dexie from 'dexie';
|
|
15
15
|
import { AXDialogService } from '@acorex/components/dialog';
|
|
16
16
|
import * as i6 from '@acorex/core/translation';
|
|
@@ -23,15 +23,15 @@ import * as i4$1 from '@acorex/components/badge';
|
|
|
23
23
|
import { AXBadgeModule } from '@acorex/components/badge';
|
|
24
24
|
import * as i2 from '@acorex/components/decorators';
|
|
25
25
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
26
|
-
import * as i3$
|
|
26
|
+
import * as i3$2 from '@acorex/components/popover';
|
|
27
27
|
import { AXPopoverComponent, AXPopoverModule } from '@acorex/components/popover';
|
|
28
28
|
import * as i1 from '@acorex/components/button';
|
|
29
29
|
import { AXButtonModule } from '@acorex/components/button';
|
|
30
|
-
import * as i2$
|
|
30
|
+
import * as i2$1 from '@acorex/components/tabs';
|
|
31
31
|
import { AXTabsModule } from '@acorex/components/tabs';
|
|
32
32
|
import * as i3 from '@acorex/components/progress-bar';
|
|
33
33
|
import { AXProgressBarModule } from '@acorex/components/progress-bar';
|
|
34
|
-
import * as
|
|
34
|
+
import * as i3$1 from '@acorex/core/format';
|
|
35
35
|
import { AXFormatModule, AXFormatService } from '@acorex/core/format';
|
|
36
36
|
import { AXNotificationService, AXNotificationModule } from '@acorex/components/notification';
|
|
37
37
|
import { filter as filter$1 } from 'rxjs/operators';
|
|
@@ -51,13 +51,13 @@ import * as i6$1 from '@acorex/components/color-box';
|
|
|
51
51
|
import { AXColorBoxModule } from '@acorex/components/color-box';
|
|
52
52
|
import * as i3$3 from '@acorex/components/label';
|
|
53
53
|
import { AXLabelModule } from '@acorex/components/label';
|
|
54
|
-
import * as i2$
|
|
54
|
+
import * as i2$2 from '@acorex/components/number-box';
|
|
55
55
|
import { AXNumberBoxModule } from '@acorex/components/number-box';
|
|
56
56
|
import { AXBasePageComponent } from '@acorex/components/page';
|
|
57
57
|
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
58
58
|
import * as i1$2 from '@angular/forms';
|
|
59
59
|
import { FormsModule } from '@angular/forms';
|
|
60
|
-
import { defineCommand, AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM } from '@acorex-platform/framework-shared/runtime';
|
|
60
|
+
import { defineCommand, AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM, defineQuery, AXP_QUERY_DEFINITION_CATEGORY_PLATFORM } from '@acorex-platform/framework-shared/runtime';
|
|
61
61
|
|
|
62
62
|
//#region ---- Output kind & segment ----
|
|
63
63
|
/** Default structured retry count when `structuredRetries` is omitted on structured kinds. */
|
|
@@ -414,6 +414,8 @@ var AXPCommonSettings;
|
|
|
414
414
|
*/
|
|
415
415
|
AXPCommonSettings["AllowWorkingOffline"] = "Common:Setting:Offline.AllowWorkingOffline";
|
|
416
416
|
AXPCommonSettings["ShowRowIndexColumn"] = "Common:Setting:Entity.ShowRowIndexColumn";
|
|
417
|
+
/** When true, the entity master-list table derives header bands from entity sections (property groups). */
|
|
418
|
+
AXPCommonSettings["EntityMultiLevelHeaders"] = "Common:Setting:Entity.MultiLevelHeaders";
|
|
417
419
|
AXPCommonSettings["EntityListPersistenceMode"] = "Common:Setting:Entity.ListPersistenceMode";
|
|
418
420
|
/** User default for entity master-list presentation (`table` | `card` | `row`). */
|
|
419
421
|
AXPCommonSettings["EntityListDisplayMode"] = "Common:Setting:Entity.ListDisplayMode";
|
|
@@ -430,6 +432,11 @@ var AXPCommonSettings;
|
|
|
430
432
|
const AXPFileChooserSettings = {
|
|
431
433
|
CompressImages: 'Common:Setting:FileChooser.CompressImages',
|
|
432
434
|
PromptZipOnMultiple: 'Common:Setting:FileChooser.PromptZipOnMultiple',
|
|
435
|
+
/**
|
|
436
|
+
* When false (default), profile photos and file prompts use the device picker.
|
|
437
|
+
* When true, users choose a source (device, Drive, Gravatar, …).
|
|
438
|
+
*/
|
|
439
|
+
EnableSourcePicker: 'Common:Setting:FileChooser.EnableSourcePicker',
|
|
433
440
|
};
|
|
434
441
|
/** Defaults used before platform settings finish loading and by the setting definitions. */
|
|
435
442
|
const AXP_RUNTIME_QUERY_CACHE_DEFAULTS = {
|
|
@@ -1351,6 +1358,18 @@ function hydrateSettingsValuesFromIndexedDb(values, policy) {
|
|
|
1351
1358
|
}
|
|
1352
1359
|
//#endregion
|
|
1353
1360
|
|
|
1361
|
+
/**
|
|
1362
|
+
* lodash `merge` keeps destination array items when the source array is shorter or empty.
|
|
1363
|
+
* Settings patches replace whole keys (e.g. cleared list filters `[]`) and must overwrite arrays.
|
|
1364
|
+
*/
|
|
1365
|
+
function mergeSettingsPatch(...sources) {
|
|
1366
|
+
return mergeWith({}, ...sources.filter((source) => !!source), (objValue, srcValue) => {
|
|
1367
|
+
if (Array.isArray(srcValue)) {
|
|
1368
|
+
return srcValue;
|
|
1369
|
+
}
|
|
1370
|
+
return undefined;
|
|
1371
|
+
});
|
|
1372
|
+
}
|
|
1354
1373
|
//#region ---- Scoped settings provider (User bidirectional; Platform one-way cache) ----
|
|
1355
1374
|
class AXPIndexedDbSettingValueProvider {
|
|
1356
1375
|
constructor(_scope, injector) {
|
|
@@ -1653,8 +1672,8 @@ class AXPIndexedDbSettingValueProvider {
|
|
|
1653
1672
|
if (!this.snapshot) {
|
|
1654
1673
|
return;
|
|
1655
1674
|
}
|
|
1656
|
-
this.snapshot.values =
|
|
1657
|
-
this.snapshot.dirty =
|
|
1675
|
+
this.snapshot.values = mergeSettingsPatch(this.snapshot.values, patch);
|
|
1676
|
+
this.snapshot.dirty = mergeSettingsPatch(this.snapshot.dirty, patch);
|
|
1658
1677
|
this.snapshot.syncStatus = isEmpty(this.snapshot.dirty) ? 'idle' : 'pending_retry';
|
|
1659
1678
|
}
|
|
1660
1679
|
/** Updates cached values without queuing a server Patch (platform one-way cache). */
|
|
@@ -1662,7 +1681,7 @@ class AXPIndexedDbSettingValueProvider {
|
|
|
1662
1681
|
if (!this.snapshot) {
|
|
1663
1682
|
return;
|
|
1664
1683
|
}
|
|
1665
|
-
this.snapshot.values =
|
|
1684
|
+
this.snapshot.values = mergeSettingsPatch(this.snapshot.values, patch);
|
|
1666
1685
|
}
|
|
1667
1686
|
clearLocalDirty(snapshot) {
|
|
1668
1687
|
snapshot.dirty = {};
|
|
@@ -1759,20 +1778,16 @@ class AXPIndexedDbSettingValueProvider {
|
|
|
1759
1778
|
return;
|
|
1760
1779
|
}
|
|
1761
1780
|
try {
|
|
1762
|
-
|
|
1781
|
+
const since = this.resolveFetchSince(snapshot);
|
|
1763
1782
|
traceSettingsServerApiCall('GET', this._scope, {
|
|
1764
1783
|
snapshotId: this.snapshotId,
|
|
1765
1784
|
since,
|
|
1766
1785
|
reason: this.requireServerSync ? 'require-server-revalidate' : 'background-revalidate',
|
|
1767
1786
|
});
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
if (!result.changed && isEmpty(result.values) && since) {
|
|
1773
|
-
since = null;
|
|
1774
|
-
result = await this.bulkSync.fetch(this._scope, null);
|
|
1775
|
-
}
|
|
1787
|
+
// `{ changed: false, values: {} }` is the normal not-modified response.
|
|
1788
|
+
// Do not fall back to a full fetch — that reapplies every key as a change
|
|
1789
|
+
// and remounts locale/theme/lookup widgets on tab focus.
|
|
1790
|
+
const result = await this.bulkSync.fetch(this._scope, since);
|
|
1776
1791
|
if (generation !== this.syncGeneration || this.snapshot !== snapshot) {
|
|
1777
1792
|
return;
|
|
1778
1793
|
}
|
|
@@ -1784,12 +1799,15 @@ class AXPIndexedDbSettingValueProvider {
|
|
|
1784
1799
|
if (key in snapshot.dirty) {
|
|
1785
1800
|
continue;
|
|
1786
1801
|
}
|
|
1802
|
+
if (isEqual(snapshot.values[key], value)) {
|
|
1803
|
+
continue;
|
|
1804
|
+
}
|
|
1787
1805
|
servicePatch[key] = value;
|
|
1788
1806
|
}
|
|
1789
1807
|
// Full server payloads replace local values (dirty wins for bidirectional User scope).
|
|
1790
1808
|
snapshot.values = stripAccidentalNestedSettingParents(this.requireServerSync
|
|
1791
|
-
?
|
|
1792
|
-
:
|
|
1809
|
+
? mergeSettingsPatch(result.values, isOneWaySettingsIndexedDbCache(this._scope) ? {} : snapshot.dirty)
|
|
1810
|
+
: mergeSettingsPatch(result.values, snapshot.dirty));
|
|
1793
1811
|
if (result.updatedAt) {
|
|
1794
1812
|
snapshot.serverUpdatedAt = result.updatedAt;
|
|
1795
1813
|
}
|
|
@@ -5067,7 +5085,7 @@ class AXPBackgroundOperationItemComponent {
|
|
|
5067
5085
|
return value === 'cancel' || value === 'pause' || value === 'resume' || value === 'retry' || value === 'dismiss';
|
|
5068
5086
|
}
|
|
5069
5087
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBackgroundOperationItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5070
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBackgroundOperationItemComponent, isStandalone: true, selector: "axp-background-operation-item", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, tabKey: { classPropertyName: "tabKey", publicName: "tabKey", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionCompleted: "actionCompleted", itemClicked: "itemClicked" }, ngImport: i0, template: "<article class=\"operation-item\" [class]=\"statusClass()\">\n <ax-icon class=\"operation-item__status-icon\" [class]=\"statusClass()\">\n <i [class]=\"statusIcon()\"></i>\n </ax-icon>\n\n <div class=\"operation-item__content\">\n <div class=\"operation-item__headline\">\n <h3 class=\"operation-item__title\">{{ data().title }}</h3>\n </div>\n\n @if (isCompletedTab()) {\n @if (showCompletedSummaryLine()) {\n <!-- ----- Status merged with finished time and duration ----- -->\n <p class=\"operation-item__status-text\">\n @if (statusTextKey(); as key) {\n <span>{{ key | translate: { params: statusTextParams() } | async }}</span>\n } @else if (plainStatusText()) {\n <span>{{ plainStatusText() }}</span>\n }\n @if (timingDatetime(); as finishedAt) {\n @if (statusTextKey() || plainStatusText()) {\n <span class=\"operation-item__status-separator\" aria-hidden=\"true\"> \u00B7 </span>\n }\n <!--->\n <!-- ----- Locale-aware finished datetime via format pipe ----- -->\n @if ((finishedAt | format: 'datetime' : 'short' | async); as datetime) {\n <span>{{\n '@general:background-operation.timing.finished-at'\n | translate: { params: { datetime } }\n | async\n }}</span>\n }\n <!--->\n <!-- ----- Compact duration when available ----- -->\n @if (timingDuration(); as duration) {\n <span class=\"operation-item__status-separator\" aria-hidden=\"true\"> \u00B7 </span>\n <span>{{\n '@general:background-operation.timing.duration'\n | translate: { params: { duration } }\n | async\n }}</span>\n }\n }\n </p>\n }\n } @else {\n @if (statusTextKey(); as key) {\n <p class=\"operation-item__status-text\">\n {{ key | translate: { params: statusTextParams() } | async }}\n </p>\n } @else if (plainStatusText()) {\n <p class=\"operation-item__status-text\">\n {{ plainStatusText() }}\n </p>\n }\n }\n\n @if (showStepLine()) {\n <span class=\"operation-item__step\">\n {{ '@general:background-operation.step' | translate | async }}\n {{ data().currentStep }}\n </span>\n }\n\n @if (timingDatetime(); as startedAt) {\n <!--->\n <!-- ----- Started time and estimate for in-progress tasks ----- -->\n @if (isInProgressTab()) {\n <div class=\"operation-item__timing\">\n <!-- ----- Locale-aware started datetime via format pipe ----- -->\n @if ((startedAt | format: 'datetime' : 'short' | async); as datetime) {\n <span>\n {{\n '@general:background-operation.timing.started-at'\n | translate: { params: { datetime } }\n | async\n }}\n </span>\n }\n <!--->\n <!-- ----- ETA when the task type supports estimates ----- -->\n @if (showEstimateLine()) {\n <span>\n {{\n '@general:background-operation.timing.estimate'\n | translate: { params: { estimate: timingDuration()! } }\n | async\n }}\n </span>\n }\n </div>\n }\n }\n\n @if (showCompletedActionRow()) {\n <div class=\"ax-xs operation-item__footer-actions\">\n @if (cta(); as primaryCta) {\n <!-- ----- Handler-defined CTA on completed tab ----- -->\n <ax-button\n class=\"operation-item__action-btn\"\n look=\"solid\"\n [color]=\"primaryCta.color ?? 'primary'\"\n [text]=\"ctaDisplayText()\"\n [disabled]=\"isCtaDisabled(primaryCta)\"\n (onClick)=\"onCtaClick(primaryCta)\"\n >\n @if (primaryCta.icon) {\n <ax-prefix>\n <ax-icon><i [class]=\"primaryCta.icon\"></i></ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n @if (showDismissButton()) {\n <!-- ----- Close / dismiss completed rows ----- -->\n <ax-button\n class=\"operation-item__action-btn\"\n look=\"solid\"\n color=\"default\"\n [text]=\"(actionLabelKey('dismiss') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('dismiss') || isActionLoading('dismiss')\"\n (onClick)=\"onAction('dismiss')\"\n ></ax-button>\n }\n </div>\n }\n\n @if (showProgressBar()) {\n <div class=\"operation-item__progress-row\">\n @if (showProgressPercent()) {\n <span class=\"operation-item__progress-label\">\n {{\n '@general:background-operation.progress-percent'\n | translate: { params: { percent: progressValue() } }\n | async\n }}\n </span>\n }\n <ax-progress-bar\n class=\"operation-item__progress\"\n [progress]=\"progressValue()\"\n [mode]=\"progressMode()\"\n [color]=\"progressColor()\"\n [style.height.px]=\"4\"\n ></ax-progress-bar>\n </div>\n }\n\n @if (showError()) {\n @if (errorMessageKey(); as errorKey) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ errorKey | translate | async }}\n </p>\n } @else if (plainErrorMessage()) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ plainErrorMessage() }}\n </p>\n }\n }\n </div>\n\n @if (showDate() || showActionColumn()) {\n <div class=\"operation-item__aside\">\n @if (showDate()) {\n <span class=\"operation-item__time\">{{ displayTime() | format: 'timeleft' | async }}</span>\n }\n @if (showActionColumn()) {\n <div class=\"operation-item__actions\" (click)=\"$event.stopPropagation()\">\n @if (isInProgressTab()) {\n @if (showCancelButton()) {\n <!-- ----- Cancel for in-progress cancellable tasks ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"danger\"\n [text]=\"(actionLabelKey('cancel') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('cancel') || isActionLoading('cancel')\"\n (onClick)=\"onAction('cancel')\"\n ></ax-button>\n }\n @if (showPauseButton()) {\n <!-- ----- Pause when supported and no cancel is shown ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"default\"\n [text]=\"(actionLabelKey('pause') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('pause') || isActionLoading('pause')\"\n (onClick)=\"onAction('pause')\"\n ></ax-button>\n }\n @if (showResumeButton()) {\n <!-- ----- Resume for paused tasks ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"primary\"\n [text]=\"(actionLabelKey('resume') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('resume') || isActionLoading('resume')\"\n (onClick)=\"onAction('resume')\"\n ></ax-button>\n }\n }\n </div>\n }\n </div>\n }\n</article>\n", styles: ["@layer properties;axp-background-operation-item{display:block;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgb(var(--ax-sys-color-border-lightest-surface))}axp-background-operation-item:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0px}.operation-item{position:relative;display:flex;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .15s;transition-duration:.15s}.operation-item.--failed{background:rgb(var(--ax-sys-color-danger-lightest-surface) / .35)}.operation-item__status-icon{margin-top:calc(var(--spacing, .25rem) * .5);display:flex;width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:1px;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1;color:rgb(var(--ax-sys-color-on-surface-variant));border-color:rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-lightest-surface))}.operation-item__status-icon.--running{color:rgb(var(--ax-sys-color-primary-500));border-color:rgb(var(--ax-sys-color-border-primary-light-surface));background:rgb(var(--ax-sys-color-primary-lightest-surface))}.operation-item__status-icon.--paused{color:rgb(var(--ax-sys-color-warning-500));border-color:rgb(var(--ax-sys-color-border-warning-light-surface));background:rgb(var(--ax-sys-color-warning-lightest-surface))}.operation-item__status-icon.--completed{color:rgb(var(--ax-sys-color-success-500));border-color:rgb(var(--ax-sys-color-border-success-light-surface));background:rgb(var(--ax-sys-color-success-lightest-surface))}.operation-item__status-icon.--failed{color:rgb(var(--ax-sys-color-danger-500));border-color:rgb(var(--ax-sys-color-border-danger-light-surface));background:rgb(var(--ax-sys-color-danger-lightest-surface))}.operation-item__content{display:flex;min-width:0px;flex:1;flex-direction:column;gap:var(--spacing, .25rem);text-align:start}.operation-item__headline{min-width:0px}.operation-item__title{margin:0;min-width:0px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgb(var(--ax-sys-color-on-surface))}.operation-item__aside{position:relative;flex-shrink:0;align-self:stretch;min-width:3.5rem}.operation-item__time{position:relative;z-index:1;padding-top:calc(var(--spacing, .25rem) * .5);text-align:end;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));white-space:nowrap;color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__status-text{margin:0;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;text-align:start;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__step{display:inline-block;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__timing{display:flex;flex-wrap:wrap;column-gap:calc(var(--spacing, .25rem) * 2);row-gap:calc(var(--spacing, .25rem) * .5);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__progress-row{margin-top:var(--spacing, .25rem);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.operation-item__progress-label{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__progress{min-width:0px;flex:1}.operation-item__error{margin:0;border-radius:var(--radius-md, .375rem);padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:var(--spacing, .25rem);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);background:rgb(var(--ax-sys-color-danger-lighter-surface));color:rgb(var(--ax-sys-color-on-danger-lighter-surface))}.operation-item__status-separator{white-space:pre}.operation-item__footer-actions{margin-top:var(--spacing, .25rem);display:flex;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.operation-item__actions{position:absolute;top:50%;right:0;display:flex;--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);flex-direction:column;align-items:flex-end;gap:var(--spacing, .25rem)}.operation-item__action-btn{white-space:nowrap}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-duration{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-duration: initial;--tw-leading: initial;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXProgressBarModule }, { kind: "component", type: i3.AXProgressBarComponent, selector: "ax-progress-bar", inputs: ["color", "mode", "progress", "height"], outputs: ["ValueChange", "sizeChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXFormatPipe, name: "format" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5088
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBackgroundOperationItemComponent, isStandalone: true, selector: "axp-background-operation-item", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, tabKey: { classPropertyName: "tabKey", publicName: "tabKey", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionCompleted: "actionCompleted", itemClicked: "itemClicked" }, ngImport: i0, template: "<article class=\"operation-item\" [class]=\"statusClass()\">\n <ax-icon class=\"operation-item__status-icon\" [class]=\"statusClass()\">\n <i [class]=\"statusIcon()\"></i>\n </ax-icon>\n\n <div class=\"operation-item__content\">\n <div class=\"operation-item__headline\">\n <h3 class=\"operation-item__title\">{{ data().title }}</h3>\n </div>\n\n @if (isCompletedTab()) {\n @if (showCompletedSummaryLine()) {\n <!-- ----- Status merged with finished time and duration ----- -->\n <p class=\"operation-item__status-text\">\n @if (statusTextKey(); as key) {\n <span>{{ key | translate: { params: statusTextParams() } | async }}</span>\n } @else if (plainStatusText()) {\n <span>{{ plainStatusText() }}</span>\n }\n @if (timingDatetime(); as finishedAt) {\n @if (statusTextKey() || plainStatusText()) {\n <span class=\"operation-item__status-separator\" aria-hidden=\"true\"> \u00B7 </span>\n }\n <!--->\n <!-- ----- Locale-aware finished datetime via format pipe ----- -->\n @if ((finishedAt | format: 'datetime' : 'short' | async); as datetime) {\n <span>{{\n '@general:background-operation.timing.finished-at'\n | translate: { params: { datetime } }\n | async\n }}</span>\n }\n <!--->\n <!-- ----- Compact duration when available ----- -->\n @if (timingDuration(); as duration) {\n <span class=\"operation-item__status-separator\" aria-hidden=\"true\"> \u00B7 </span>\n <span>{{\n '@general:background-operation.timing.duration'\n | translate: { params: { duration } }\n | async\n }}</span>\n }\n }\n </p>\n }\n } @else {\n @if (statusTextKey(); as key) {\n <p class=\"operation-item__status-text\">\n {{ key | translate: { params: statusTextParams() } | async }}\n </p>\n } @else if (plainStatusText()) {\n <p class=\"operation-item__status-text\">\n {{ plainStatusText() }}\n </p>\n }\n }\n\n @if (showStepLine()) {\n <span class=\"operation-item__step\">\n {{ '@general:background-operation.step' | translate | async }}\n {{ data().currentStep }}\n </span>\n }\n\n @if (timingDatetime(); as startedAt) {\n <!--->\n <!-- ----- Started time and estimate for in-progress tasks ----- -->\n @if (isInProgressTab()) {\n <div class=\"operation-item__timing\">\n <!-- ----- Locale-aware started datetime via format pipe ----- -->\n @if ((startedAt | format: 'datetime' : 'short' | async); as datetime) {\n <span>\n {{\n '@general:background-operation.timing.started-at'\n | translate: { params: { datetime } }\n | async\n }}\n </span>\n }\n <!--->\n <!-- ----- ETA when the task type supports estimates ----- -->\n @if (showEstimateLine()) {\n <span>\n {{\n '@general:background-operation.timing.estimate'\n | translate: { params: { estimate: timingDuration()! } }\n | async\n }}\n </span>\n }\n </div>\n }\n }\n\n @if (showCompletedActionRow()) {\n <div class=\"ax-xs operation-item__footer-actions\">\n @if (cta(); as primaryCta) {\n <!-- ----- Handler-defined CTA on completed tab ----- -->\n <ax-button\n class=\"operation-item__action-btn\"\n look=\"solid\"\n [color]=\"primaryCta.color ?? 'primary'\"\n [text]=\"ctaDisplayText()\"\n [disabled]=\"isCtaDisabled(primaryCta)\"\n (onClick)=\"onCtaClick(primaryCta)\"\n >\n @if (primaryCta.icon) {\n <ax-prefix>\n <ax-icon><i [class]=\"primaryCta.icon\"></i></ax-icon>\n </ax-prefix>\n }\n </ax-button>\n }\n @if (showDismissButton()) {\n <!-- ----- Close / dismiss completed rows ----- -->\n <ax-button\n class=\"operation-item__action-btn\"\n look=\"solid\"\n color=\"default\"\n [text]=\"(actionLabelKey('dismiss') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('dismiss') || isActionLoading('dismiss')\"\n (onClick)=\"onAction('dismiss')\"\n ></ax-button>\n }\n </div>\n }\n\n @if (showProgressBar()) {\n <div class=\"operation-item__progress-row\">\n @if (showProgressPercent()) {\n <span class=\"operation-item__progress-label\">\n {{\n '@general:background-operation.progress-percent'\n | translate: { params: { percent: progressValue() } }\n | async\n }}\n </span>\n }\n <ax-progress-bar\n class=\"operation-item__progress\"\n [progress]=\"progressValue()\"\n [mode]=\"progressMode()\"\n [color]=\"progressColor()\"\n [style.height.px]=\"4\"\n ></ax-progress-bar>\n </div>\n }\n\n @if (showError()) {\n @if (errorMessageKey(); as errorKey) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ errorKey | translate | async }}\n </p>\n } @else if (plainErrorMessage()) {\n <p class=\"operation-item__error\" role=\"alert\">\n {{ plainErrorMessage() }}\n </p>\n }\n }\n </div>\n\n @if (showDate() || showActionColumn()) {\n <div class=\"operation-item__aside\">\n @if (showDate()) {\n <span class=\"operation-item__time\">{{ displayTime() | format: 'timeleft' | async }}</span>\n }\n @if (showActionColumn()) {\n <div class=\"operation-item__actions\" (click)=\"$event.stopPropagation()\">\n @if (isInProgressTab()) {\n @if (showCancelButton()) {\n <!-- ----- Cancel for in-progress cancellable tasks ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"danger\"\n [text]=\"(actionLabelKey('cancel') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('cancel') || isActionLoading('cancel')\"\n (onClick)=\"onAction('cancel')\"\n ></ax-button>\n }\n @if (showPauseButton()) {\n <!-- ----- Pause when supported and no cancel is shown ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"default\"\n [text]=\"(actionLabelKey('pause') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('pause') || isActionLoading('pause')\"\n (onClick)=\"onAction('pause')\"\n ></ax-button>\n }\n @if (showResumeButton()) {\n <!-- ----- Resume for paused tasks ----- -->\n <ax-button\n class=\"ax-xs operation-item__action-btn\"\n look=\"outline\"\n color=\"primary\"\n [text]=\"(actionLabelKey('resume') | translate | async) ?? ''\"\n [disabled]=\"isActionDisabled('resume') || isActionLoading('resume')\"\n (onClick)=\"onAction('resume')\"\n ></ax-button>\n }\n }\n </div>\n }\n </div>\n }\n</article>\n", styles: ["@layer properties;axp-background-operation-item{display:block;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgb(var(--ax-sys-color-border-lightest-surface))}axp-background-operation-item:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0px}.operation-item{position:relative;display:flex;align-items:flex-start;gap:calc(var(--spacing, .25rem) * 3);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s));--tw-duration: .15s;transition-duration:.15s}.operation-item.--failed{background:rgb(var(--ax-sys-color-danger-lightest-surface) / .35)}.operation-item__status-icon{margin-top:calc(var(--spacing, .25rem) * .5);display:flex;width:calc(var(--spacing, .25rem) * 12);height:calc(var(--spacing, .25rem) * 12);flex-shrink:0;align-items:center;justify-content:center;border-radius:calc(infinity * 1px);border-style:var(--tw-border-style);border-width:1px;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: 1;line-height:1;color:rgb(var(--ax-sys-color-on-surface-variant));border-color:rgb(var(--ax-sys-color-border-light-surface));background:rgb(var(--ax-sys-color-lightest-surface))}.operation-item__status-icon.--running{color:rgb(var(--ax-sys-color-primary-500));border-color:rgb(var(--ax-sys-color-border-primary-light-surface));background:rgb(var(--ax-sys-color-primary-lightest-surface))}.operation-item__status-icon.--paused{color:rgb(var(--ax-sys-color-warning-500));border-color:rgb(var(--ax-sys-color-border-warning-light-surface));background:rgb(var(--ax-sys-color-warning-lightest-surface))}.operation-item__status-icon.--completed{color:rgb(var(--ax-sys-color-success-500));border-color:rgb(var(--ax-sys-color-border-success-light-surface));background:rgb(var(--ax-sys-color-success-lightest-surface))}.operation-item__status-icon.--failed{color:rgb(var(--ax-sys-color-danger-500));border-color:rgb(var(--ax-sys-color-border-danger-light-surface));background:rgb(var(--ax-sys-color-danger-lightest-surface))}.operation-item__content{display:flex;min-width:0px;flex:1;flex-direction:column;gap:var(--spacing, .25rem);text-align:start}.operation-item__headline{min-width:0px}.operation-item__title{margin:0;min-width:0px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);color:rgb(var(--ax-sys-color-on-surface))}.operation-item__aside{position:relative;flex-shrink:0;align-self:stretch;min-width:3.5rem}.operation-item__time{position:relative;z-index:1;padding-top:calc(var(--spacing, .25rem) * .5);text-align:end;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));white-space:nowrap;color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__status-text{margin:0;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;text-align:start;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__step{display:inline-block;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__timing{display:flex;flex-wrap:wrap;column-gap:calc(var(--spacing, .25rem) * 2);row-gap:calc(var(--spacing, .25rem) * .5);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__progress-row{margin-top:var(--spacing, .25rem);display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.operation-item__progress-label{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:rgb(var(--ax-sys-color-on-surface-variant))}.operation-item__progress{min-width:0px;flex:1}.operation-item__error{margin:0;border-radius:var(--radius-md, .375rem);padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:var(--spacing, .25rem);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-leading: var(--leading-relaxed, 1.625);line-height:var(--leading-relaxed, 1.625);background:rgb(var(--ax-sys-color-danger-lighter-surface));color:rgb(var(--ax-sys-color-on-danger-lighter-surface))}.operation-item__status-separator{white-space:pre}.operation-item__footer-actions{margin-top:var(--spacing, .25rem);display:flex;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.operation-item__actions{position:absolute;top:50%;right:0;display:flex;--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);flex-direction:column;align-items:flex-end;gap:var(--spacing, .25rem)}.operation-item__action-btn{white-space:nowrap}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-duration{syntax: \"*\"; inherits: false;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-duration: initial;--tw-leading: initial;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial;--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXProgressBarModule }, { kind: "component", type: i3.AXProgressBarComponent, selector: "ax-progress-bar", inputs: ["color", "mode", "progress", "height"], outputs: ["ValueChange", "sizeChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXFormatPipe, name: "format" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5071
5089
|
}
|
|
5072
5090
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBackgroundOperationItemComponent, decorators: [{
|
|
5073
5091
|
type: Component,
|
|
@@ -5234,7 +5252,7 @@ class AXPBackgroundOperationPanelComponent {
|
|
|
5234
5252
|
}
|
|
5235
5253
|
}
|
|
5236
5254
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBackgroundOperationPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5237
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBackgroundOperationPanelComponent, isStandalone: true, selector: "axp-background-operation-panel", outputs: { onActiveCountChange: "onActiveCountChange", onClosePopover: "onClosePopover" }, viewQueries: [{ propertyName: "tabsHost", first: true, predicate: ["tabsHost"], descendants: true, isSignal: true }], ngImport: i0, template: "<header class=\"operation-panel__header\">\n <h2 class=\"operation-panel__title\">\n {{ '@general:background-operation.panel.title' | translate | async }}\n </h2>\n @if (showCancelAllButton()) {\n <!-- ----- Cancel all cancellable in-progress tasks ----- -->\n <ax-button\n class=\"ax-xs operation-panel__header-action\"\n look=\"blank\"\n color=\"danger\"\n [text]=\"('@general:background-operation.actions.cancel-all' | translate | async) ?? ''\"\n [disabled]=\"bulkActionPending() || operationService.loading()\"\n (onClick)=\"onCancelAll()\"\n ></ax-button>\n }\n @if (showDismissAllButton()) {\n <!-- ----- Dismiss all dismissible completed tasks ----- -->\n <ax-button\n class=\"ax-xs operation-panel__header-action\"\n look=\"blank\"\n color=\"default\"\n [text]=\"('@general:background-operation.actions.dismiss-all' | translate | async) ?? ''\"\n [disabled]=\"bulkActionPending() || operationService.loading()\"\n (onClick)=\"onDismissAll()\"\n ></ax-button>\n }\n <ax-button class=\"ax-xs operation-panel__header-action\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"onClosePopover.emit()\">\n <ax-icon><i class=\"fa-light fa-xmark \" aria-hidden=\"true\"></i></ax-icon>\n </ax-button>\n</header>\n\n<ax-tabs\n #tabsHost\n [content]=\"tabContent\"\n [look]=\"'with-line'\"\n location=\"bottom\"\n (onActiveTabChanged)=\"handleTabChange($event)\"\n>\n @for (tab of tabItems(); track tab.key) {\n <ax-tab-item [text]=\"(tab.labelKey | translate | async) ?? ''\" [active]=\"activeTab() === tab.key\">\n <ax-suffix>\n @if (tab.count > 0) {\n <ax-badge [color]=\"activeTab() === tab.key ? 'primary' : 'ghost'\" [text]=\"tab.count.toString()\"></ax-badge>\n }\n </ax-suffix>\n <ax-content>\n <div class=\"operation-panel__list\">\n @if (getOperations(tab.key).length === 0) {\n @if (emptyStateForTab(tab.key); as emptyState) {\n <axp-state-message [icon]=\"emptyState.icon\" [title]=\"emptyState.titleKey\" [description]=\"emptyState.descriptionKey\" />\n }\n } @else {\n @for (operation of getOperations(tab.key); track operation.id) {\n <axp-background-operation-item [data]=\"operation\" [tabKey]=\"tab.key\" (actionCompleted)=\"onItemActionCompleted()\" (itemClicked)=\"onClosePopover.emit()\"></axp-background-operation-item>\n }\n }\n </div>\n </ax-content>\n </ax-tab-item>\n }\n</ax-tabs>\n\n<ng-template [axTabContent] #tabContent=\"axTabContent\"></ng-template>\n", styles: ["@layer properties;axp-background-operation-panel{display:block;min-height:calc(var(--spacing, .25rem) * 80);width:100%;border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:2px;border-color:rgba(var(--ax-sys-color-primary-500));background-color:rgba(var(--ax-sys-color-lightest-surface))}@media(width>=48rem){axp-background-operation-panel{width:32rem}}axp-background-operation-panel ax-tabs{padding-inline:calc(var(--spacing, .25rem) * 2)}axp-background-operation-panel .operation-panel__header{display:flex;align-items:center;justify-content:space-between;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;background-color:var(--color-primary);color:var(--color-on-primary);border-color:var(--color-border-primary);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}axp-background-operation-panel .operation-panel__title{margin:0;min-width:0px;flex:1;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}axp-background-operation-panel .operation-panel__header-action{flex-shrink:0}axp-background-operation-panel .operation-panel__header-action .ax-blank-interactive{color:var(--color-white, #fff)!important}axp-background-operation-panel .operation-panel__header-action .ax-blank-interactive:hover{color:rgba(var(--ax-sys-color-primary-500))!important}axp-background-operation-panel .operation-panel__list{display:flex;max-height:50vh;flex-direction:column;overflow-y:auto}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i2$
|
|
5255
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBackgroundOperationPanelComponent, isStandalone: true, selector: "axp-background-operation-panel", outputs: { onActiveCountChange: "onActiveCountChange", onClosePopover: "onClosePopover" }, viewQueries: [{ propertyName: "tabsHost", first: true, predicate: ["tabsHost"], descendants: true, isSignal: true }], ngImport: i0, template: "<header class=\"operation-panel__header\">\n <h2 class=\"operation-panel__title\">\n {{ '@general:background-operation.panel.title' | translate | async }}\n </h2>\n @if (showCancelAllButton()) {\n <!-- ----- Cancel all cancellable in-progress tasks ----- -->\n <ax-button\n class=\"ax-xs operation-panel__header-action\"\n look=\"blank\"\n color=\"danger\"\n [text]=\"('@general:background-operation.actions.cancel-all' | translate | async) ?? ''\"\n [disabled]=\"bulkActionPending() || operationService.loading()\"\n (onClick)=\"onCancelAll()\"\n ></ax-button>\n }\n @if (showDismissAllButton()) {\n <!-- ----- Dismiss all dismissible completed tasks ----- -->\n <ax-button\n class=\"ax-xs operation-panel__header-action\"\n look=\"blank\"\n color=\"default\"\n [text]=\"('@general:background-operation.actions.dismiss-all' | translate | async) ?? ''\"\n [disabled]=\"bulkActionPending() || operationService.loading()\"\n (onClick)=\"onDismissAll()\"\n ></ax-button>\n }\n <ax-button class=\"ax-xs operation-panel__header-action\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"onClosePopover.emit()\">\n <ax-icon><i class=\"fa-light fa-xmark \" aria-hidden=\"true\"></i></ax-icon>\n </ax-button>\n</header>\n\n<ax-tabs\n #tabsHost\n [content]=\"tabContent\"\n [look]=\"'with-line'\"\n location=\"bottom\"\n (onActiveTabChanged)=\"handleTabChange($event)\"\n>\n @for (tab of tabItems(); track tab.key) {\n <ax-tab-item [text]=\"(tab.labelKey | translate | async) ?? ''\" [active]=\"activeTab() === tab.key\">\n <ax-suffix>\n @if (tab.count > 0) {\n <ax-badge [color]=\"activeTab() === tab.key ? 'primary' : 'ghost'\" [text]=\"tab.count.toString()\"></ax-badge>\n }\n </ax-suffix>\n <ax-content>\n <div class=\"operation-panel__list\">\n @if (getOperations(tab.key).length === 0) {\n @if (emptyStateForTab(tab.key); as emptyState) {\n <axp-state-message [icon]=\"emptyState.icon\" [title]=\"emptyState.titleKey\" [description]=\"emptyState.descriptionKey\" />\n }\n } @else {\n @for (operation of getOperations(tab.key); track operation.id) {\n <axp-background-operation-item [data]=\"operation\" [tabKey]=\"tab.key\" (actionCompleted)=\"onItemActionCompleted()\" (itemClicked)=\"onClosePopover.emit()\"></axp-background-operation-item>\n }\n }\n </div>\n </ax-content>\n </ax-tab-item>\n }\n</ax-tabs>\n\n<ng-template [axTabContent] #tabContent=\"axTabContent\"></ng-template>\n", styles: ["@layer properties;axp-background-operation-panel{display:block;min-height:calc(var(--spacing, .25rem) * 80);width:100%;border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:2px;border-color:rgba(var(--ax-sys-color-primary-500));background-color:rgba(var(--ax-sys-color-lightest-surface))}@media(width>=48rem){axp-background-operation-panel{width:32rem}}axp-background-operation-panel ax-tabs{padding-inline:calc(var(--spacing, .25rem) * 2)}axp-background-operation-panel .operation-panel__header{display:flex;align-items:center;justify-content:space-between;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;background-color:var(--color-primary);color:var(--color-on-primary);border-color:var(--color-border-primary);padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}axp-background-operation-panel .operation-panel__title{margin:0;min-width:0px;flex:1;font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}axp-background-operation-panel .operation-panel__header-action{flex-shrink:0}axp-background-operation-panel .operation-panel__header-action .ax-blank-interactive{color:var(--color-white, #fff)!important}axp-background-operation-panel .operation-panel__header-action .ax-blank-interactive:hover{color:rgba(var(--ax-sys-color-primary-500))!important}axp-background-operation-panel .operation-panel__list{display:flex;max-height:50vh;flex-direction:column;overflow-y:auto}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i2$1.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "reorderable", "reorderDelay", "renderMode", "stacked", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged", "onTabsReordered"] }, { kind: "component", type: i2$1.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "directive", type: i2$1.AXTabContentDirective, selector: "[axTabContent]", inputs: ["axTabContent"], exportAs: ["axTabContent"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i4$1.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "component", type: AXPBackgroundOperationItemComponent, selector: "axp-background-operation-item", inputs: ["data", "tabKey"], outputs: ["actionCompleted", "itemClicked"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5238
5256
|
}
|
|
5239
5257
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBackgroundOperationPanelComponent, decorators: [{
|
|
5240
5258
|
type: Component,
|
|
@@ -5311,7 +5329,7 @@ class AXPBackgroundOperationSlotComponent {
|
|
|
5311
5329
|
this.popover()?.close();
|
|
5312
5330
|
}
|
|
5313
5331
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBackgroundOperationSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5314
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBackgroundOperationSlotComponent, isStandalone: true, selector: "axp-background-operation-slot", viewQueries: [{ propertyName: "popover", first: true, predicate: AXPopoverComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (showSlot()) {\n <!-- ----- Footer tray trigger ----- -->\n <button type=\"button\" class=\"operation-slot__trigger\" #operationTrigger (click)=\"onTriggerClick(panel)\">\n @if (badgeDisplay()) {\n <!-- ----- Count badge ----- -->\n <ax-badge class=\"operation-slot__badge\" [class.--xs]=\"badgeDisplay().length > 2\" color=\"danger\" [text]=\"badgeDisplay()\"></ax-badge>\n }\n @if (slotShowsFailureOnly()) {\n <!-- ----- Failed tasks ----- -->\n <ax-icon class=\"operation-slot__icon\">\n <i class=\"fa-light fa-circle-exclamation\"></i>\n </ax-icon>\n }\n <!--->\n <!-- ----- In-progress spinner (no icon for completed) ----- -->\n @else if (!slotShowsRetainedOnly()) {\n <ax-icon class=\"operation-slot__icon\">\n <i class=\"fa-light fa-spinner fa-spin\"></i>\n </ax-icon>\n }\n <span class=\"operation-slot__text\">\n {{ slotLabelKey() | translate | async }}\n </span>\n </button>\n\n <ax-popover\n [target]=\"operationTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n (onOpened)=\"onPopoverOpened(panel)\"\n >\n <axp-background-operation-panel\n #panel\n (onClosePopover)=\"closePopover()\"\n ></axp-background-operation-panel>\n </ax-popover>\n}\n", styles: ["@layer properties;axp-background-operation-slot{display:inline-flex}.operation-slot__trigger{display:inline-flex;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:var(--spacing, .25rem);color:var(--color-text-default);--ax-sys-size: ax-sm;--ax-sys-size-base: calc(var(--ax-sys-size-md) - var(--ax-sys-size-step));--spacing: calc(var(--ax-sys-spacing-base) - .25 * var(--ax-sys-padding-step));--ax-sys-border-radius: var(--ax-sys-border-radius-base);--text-xs: calc(var(--ax-sys-text-xs-base) * 11 / 12);--text-sm: calc(var(--ax-sys-text-sm-base) * 6 / 7);--text-base: calc(var(--ax-sys-body-font-size) * .875);--text-lg: calc(var(--ax-sys-text-lg-base) * 8 / 9);--text-xl: calc(var(--ax-sys-text-xl-base) * .9);--leading-3: calc(var(--ax-sys-leading-3-base) * 7 / 6);--leading-4: var(--ax-sys-leading-4-base);--leading-5: calc(var(--ax-sys-leading-5-base) * .9);--leading-6: calc(var(--ax-sys-leading-6-base) * 11 / 12)}@media(hover:hover){.operation-slot__trigger:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}.operation-slot__icon{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}.operation-slot__text{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.operation-slot__badge{flex-shrink:0}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i4$1.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$
|
|
5332
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPBackgroundOperationSlotComponent, isStandalone: true, selector: "axp-background-operation-slot", viewQueries: [{ propertyName: "popover", first: true, predicate: AXPopoverComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (showSlot()) {\n <!-- ----- Footer tray trigger ----- -->\n <button type=\"button\" class=\"operation-slot__trigger\" #operationTrigger (click)=\"onTriggerClick(panel)\">\n @if (badgeDisplay()) {\n <!-- ----- Count badge ----- -->\n <ax-badge class=\"operation-slot__badge\" [class.--xs]=\"badgeDisplay().length > 2\" color=\"danger\" [text]=\"badgeDisplay()\"></ax-badge>\n }\n @if (slotShowsFailureOnly()) {\n <!-- ----- Failed tasks ----- -->\n <ax-icon class=\"operation-slot__icon\">\n <i class=\"fa-light fa-circle-exclamation\"></i>\n </ax-icon>\n }\n <!--->\n <!-- ----- In-progress spinner (no icon for completed) ----- -->\n @else if (!slotShowsRetainedOnly()) {\n <ax-icon class=\"operation-slot__icon\">\n <i class=\"fa-light fa-spinner fa-spin\"></i>\n </ax-icon>\n }\n <span class=\"operation-slot__text\">\n {{ slotLabelKey() | translate | async }}\n </span>\n </button>\n\n <ax-popover\n [target]=\"operationTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n (onOpened)=\"onPopoverOpened(panel)\"\n >\n <axp-background-operation-panel\n #panel\n (onClosePopover)=\"closePopover()\"\n ></axp-background-operation-panel>\n </ax-popover>\n}\n", styles: ["@layer properties;axp-background-operation-slot{display:inline-flex}.operation-slot__trigger{display:inline-flex;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:var(--spacing, .25rem);color:var(--color-text-default);--ax-sys-size: ax-sm;--ax-sys-size-base: calc(var(--ax-sys-size-md) - var(--ax-sys-size-step));--spacing: calc(var(--ax-sys-spacing-base) - .25 * var(--ax-sys-padding-step));--ax-sys-border-radius: var(--ax-sys-border-radius-base);--text-xs: calc(var(--ax-sys-text-xs-base) * 11 / 12);--text-sm: calc(var(--ax-sys-text-sm-base) * 6 / 7);--text-base: calc(var(--ax-sys-body-font-size) * .875);--text-lg: calc(var(--ax-sys-text-lg-base) * 8 / 9);--text-xl: calc(var(--ax-sys-text-xl-base) * .9);--leading-3: calc(var(--ax-sys-leading-3-base) * 7 / 6);--leading-4: var(--ax-sys-leading-4-base);--leading-5: calc(var(--ax-sys-leading-5-base) * .9);--leading-6: calc(var(--ax-sys-leading-6-base) * 11 / 12)}@media(hover:hover){.operation-slot__trigger:hover{background-color:rgba(var(--ax-sys-color-light-surface))}}.operation-slot__icon{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)))}.operation-slot__text{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.operation-slot__badge{flex-shrink:0}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i4$1.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPBackgroundOperationPanelComponent, selector: "axp-background-operation-panel", outputs: ["onActiveCountChange", "onClosePopover"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
5315
5333
|
}
|
|
5316
5334
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBackgroundOperationSlotComponent, decorators: [{
|
|
5317
5335
|
type: Component,
|
|
@@ -5656,13 +5674,99 @@ function axpReplaceEntityListRouteQueryParams(router, queryParams) {
|
|
|
5656
5674
|
}
|
|
5657
5675
|
//#endregion
|
|
5658
5676
|
|
|
5677
|
+
//#region ----- Constants -----
|
|
5678
|
+
/** Query param that distinguishes two menus pointing at the same entity list. */
|
|
5679
|
+
const ENTITY_LIST_INSTANCE_QUERY_PARAM = 'list';
|
|
5680
|
+
/** Used when the list is opened without a menu (command, deep link). */
|
|
5681
|
+
const ENTITY_LIST_DEFAULT_INSTANCE_ID = 'default';
|
|
5682
|
+
//#endregion
|
|
5683
|
+
//#region ----- Instance id -----
|
|
5684
|
+
function axpNormalizeEntityListInstanceId(value) {
|
|
5685
|
+
if (typeof value !== 'string') {
|
|
5686
|
+
return ENTITY_LIST_DEFAULT_INSTANCE_ID;
|
|
5687
|
+
}
|
|
5688
|
+
const trimmed = value.trim();
|
|
5689
|
+
return trimmed.length > 0 ? trimmed : ENTITY_LIST_DEFAULT_INSTANCE_ID;
|
|
5690
|
+
}
|
|
5691
|
+
function axpGetEntityListInstanceIdFromQueryString(queryString) {
|
|
5692
|
+
const params = new URLSearchParams(queryString.startsWith('?') ? queryString.slice(1) : queryString);
|
|
5693
|
+
return axpNormalizeEntityListInstanceId(params.get(ENTITY_LIST_INSTANCE_QUERY_PARAM));
|
|
5694
|
+
}
|
|
5695
|
+
function axpGetEntityListInstanceIdFromParamMap(queryParamMap) {
|
|
5696
|
+
return axpNormalizeEntityListInstanceId(queryParamMap.get(ENTITY_LIST_INSTANCE_QUERY_PARAM));
|
|
5697
|
+
}
|
|
5698
|
+
function axpGetEntityListInstanceIdFromPath(path) {
|
|
5699
|
+
const queryString = path.split('#')[0].split('?')[1] ?? '';
|
|
5700
|
+
return axpGetEntityListInstanceIdFromQueryString(queryString);
|
|
5701
|
+
}
|
|
5702
|
+
//#endregion
|
|
5703
|
+
//#region ----- Menu / URL stamping -----
|
|
5704
|
+
/**
|
|
5705
|
+
* Appends `list={instanceId}` to an entity-list path when missing.
|
|
5706
|
+
* Named menu entries get a stable identity so Angular reuses the list route
|
|
5707
|
+
* while filter persistence can still isolate each menu.
|
|
5708
|
+
*/
|
|
5709
|
+
function axpEnsureEntityListInstanceQueryParam(path, instanceId) {
|
|
5710
|
+
if (!path || !instanceId || !axpIsEntityListPath(path)) {
|
|
5711
|
+
return path;
|
|
5712
|
+
}
|
|
5713
|
+
const normalized = axpNormalizeEntityListInstanceId(instanceId);
|
|
5714
|
+
if (normalized === ENTITY_LIST_DEFAULT_INSTANCE_ID) {
|
|
5715
|
+
return path;
|
|
5716
|
+
}
|
|
5717
|
+
const { segments, queryParams, fragment } = axpParseAppPath(path);
|
|
5718
|
+
if (queryParams?.[ENTITY_LIST_INSTANCE_QUERY_PARAM]) {
|
|
5719
|
+
return path;
|
|
5720
|
+
}
|
|
5721
|
+
const nextQuery = new URLSearchParams({
|
|
5722
|
+
...(queryParams ?? {}),
|
|
5723
|
+
[ENTITY_LIST_INSTANCE_QUERY_PARAM]: normalized,
|
|
5724
|
+
});
|
|
5725
|
+
const base = `/${segments.join('/')}`;
|
|
5726
|
+
const withQuery = `${base}?${nextQuery.toString()}`;
|
|
5727
|
+
return fragment ? `${withQuery}#${fragment}` : withQuery;
|
|
5728
|
+
}
|
|
5729
|
+
//#endregion
|
|
5730
|
+
|
|
5731
|
+
//#region ----- Menu instance identity -----
|
|
5732
|
+
/** Prefers the stamped `list` query param, then the menu item name. */
|
|
5733
|
+
function axpMenuItemListInstanceId(item) {
|
|
5734
|
+
if (item.path) {
|
|
5735
|
+
const fromPath = axpGetEntityListInstanceIdFromPath(item.path);
|
|
5736
|
+
if (fromPath !== ENTITY_LIST_DEFAULT_INSTANCE_ID) {
|
|
5737
|
+
return fromPath;
|
|
5738
|
+
}
|
|
5739
|
+
}
|
|
5740
|
+
return axpNormalizeEntityListInstanceId(item.name);
|
|
5741
|
+
}
|
|
5742
|
+
/** Stamps `?list={menu.name}` onto entity-list menu paths so each menu is a distinct list instance. */
|
|
5743
|
+
function axpStampEntityListMenuInstancePaths(items) {
|
|
5744
|
+
const walk = (list) => {
|
|
5745
|
+
let listChanged = false;
|
|
5746
|
+
const next = list.map((item) => {
|
|
5747
|
+
const children = item.children?.length ? walk(item.children) : item.children;
|
|
5748
|
+
const path = item.path && item.name ? axpEnsureEntityListInstanceQueryParam(item.path, item.name) : item.path;
|
|
5749
|
+
if (path === item.path && children === item.children) {
|
|
5750
|
+
return item;
|
|
5751
|
+
}
|
|
5752
|
+
listChanged = true;
|
|
5753
|
+
return { ...item, path, children };
|
|
5754
|
+
});
|
|
5755
|
+
return listChanged ? next : list;
|
|
5756
|
+
};
|
|
5757
|
+
return walk(items);
|
|
5758
|
+
}
|
|
5759
|
+
//#endregion
|
|
5760
|
+
|
|
5659
5761
|
const DEFAULT_TRAILING_SEGMENTS = ['list', 'view', 'edit', 'create'];
|
|
5660
5762
|
/**
|
|
5661
5763
|
* Query params that represent page UI state (not navigation identity).
|
|
5662
5764
|
* Ignored when deciding whether a menu item matches the current route, so items stay
|
|
5663
5765
|
* highlighted while the page mutates view/layout (e.g. task board, entity list view).
|
|
5766
|
+
* `list` is the menu-instance id: it must not block detail highlighting, but
|
|
5767
|
+
* {@link axpFindMenuItemByRoute} still prefers the menu whose name matches it.
|
|
5664
5768
|
*/
|
|
5665
|
-
const MENU_UI_QUERY_KEYS = new Set(['view', 'layout']);
|
|
5769
|
+
const MENU_UI_QUERY_KEYS = new Set(['view', 'layout', 'list']);
|
|
5666
5770
|
//#region ---- Entity Route Helpers ----
|
|
5667
5771
|
/**
|
|
5668
5772
|
* Parses `/{app}/m/{module}/e/{entity}/...` routes into a stable entity key.
|
|
@@ -5809,7 +5913,7 @@ function axpMenuPathsMatch(itemPath, currentPath, trailingSegmentsToIgnore = DEF
|
|
|
5809
5913
|
const isPartialMatch = effectiveMenuLength < pathLength;
|
|
5810
5914
|
const isExactMatch = effectiveMenuLength === pathLength;
|
|
5811
5915
|
// Only non-UI query params on the menu path must match the current URL.
|
|
5812
|
-
// UI-only params (`view`, `layout`) are ignored so pages can mutate them freely.
|
|
5916
|
+
// UI-only params (`view`, `layout`, `list`) are ignored so pages can mutate them freely.
|
|
5813
5917
|
// Extra current-URL params (filters, etc.) do not break the match.
|
|
5814
5918
|
const itemNavigationParams = axpMenuDeclaredNavigationParams(itemQueryString);
|
|
5815
5919
|
const declaredPairs = [];
|
|
@@ -5833,6 +5937,10 @@ function axpFindMenuItemByRoute(items, currentPath, trailingSegmentsToIgnore = D
|
|
|
5833
5937
|
let bestMatch = null;
|
|
5834
5938
|
let bestEffectiveLength = -1;
|
|
5835
5939
|
let bestQuerySpecificity = -1;
|
|
5940
|
+
let bestInstanceMatch = false;
|
|
5941
|
+
const currentQueryString = currentPath.split('#')[0].split('?')[1] ?? '';
|
|
5942
|
+
const currentInstanceId = axpGetEntityListInstanceIdFromQueryString(currentQueryString);
|
|
5943
|
+
const hasListInstance = currentInstanceId !== ENTITY_LIST_DEFAULT_INSTANCE_ID;
|
|
5836
5944
|
const visit = (menuItems, ancestors) => {
|
|
5837
5945
|
for (const item of menuItems) {
|
|
5838
5946
|
if (item.children?.length) {
|
|
@@ -5858,10 +5966,17 @@ function axpFindMenuItemByRoute(items, currentPath, trailingSegmentsToIgnore = D
|
|
|
5858
5966
|
effectiveMenuLength = menuEntity.entityEndIndex;
|
|
5859
5967
|
}
|
|
5860
5968
|
const querySpecificity = axpMenuQueryParamSpecificity(item.path, currentPath);
|
|
5861
|
-
|
|
5862
|
-
|
|
5969
|
+
const instanceMatch = hasListInstance && axpMenuItemListInstanceId(item) === currentInstanceId;
|
|
5970
|
+
const isBetter = effectiveMenuLength > bestEffectiveLength ||
|
|
5971
|
+
(effectiveMenuLength === bestEffectiveLength && querySpecificity > bestQuerySpecificity) ||
|
|
5972
|
+
(effectiveMenuLength === bestEffectiveLength &&
|
|
5973
|
+
querySpecificity === bestQuerySpecificity &&
|
|
5974
|
+
instanceMatch &&
|
|
5975
|
+
!bestInstanceMatch);
|
|
5976
|
+
if (isBetter) {
|
|
5863
5977
|
bestEffectiveLength = effectiveMenuLength;
|
|
5864
5978
|
bestQuerySpecificity = querySpecificity;
|
|
5979
|
+
bestInstanceMatch = instanceMatch;
|
|
5865
5980
|
bestMatch = { item, ancestors, isPartialMatch: matchResult.isPartial };
|
|
5866
5981
|
}
|
|
5867
5982
|
}
|
|
@@ -6965,7 +7080,7 @@ withState((router = inject(Router)) => {
|
|
|
6965
7080
|
withMethods((store, router = inject(Router), commandService = inject(AXPCommandService)) => {
|
|
6966
7081
|
return {
|
|
6967
7082
|
setMenuItems(items) {
|
|
6968
|
-
patchState(store, { items: items });
|
|
7083
|
+
patchState(store, { items: axpStampEntityListMenuInstancePaths(items) });
|
|
6969
7084
|
},
|
|
6970
7085
|
/**
|
|
6971
7086
|
* Patches a single menu item by `name` without rebuilding the full menu tree.
|
|
@@ -6975,7 +7090,10 @@ withMethods((store, router = inject(Router), commandService = inject(AXPCommandS
|
|
|
6975
7090
|
if (!name) {
|
|
6976
7091
|
return false;
|
|
6977
7092
|
}
|
|
6978
|
-
const
|
|
7093
|
+
const stampedUpdates = typeof updates.path === 'string'
|
|
7094
|
+
? { ...updates, path: axpEnsureEntityListInstanceQueryParam(updates.path, name) }
|
|
7095
|
+
: updates;
|
|
7096
|
+
const { items, changed } = axpUpdateMenuItemByName(store.items(), name, stampedUpdates);
|
|
6979
7097
|
if (!changed) {
|
|
6980
7098
|
return false;
|
|
6981
7099
|
}
|
|
@@ -6993,7 +7111,10 @@ withMethods((store, router = inject(Router), commandService = inject(AXPCommandS
|
|
|
6993
7111
|
},
|
|
6994
7112
|
executeCommand(item) {
|
|
6995
7113
|
if (item.path) {
|
|
6996
|
-
|
|
7114
|
+
const path = item.name
|
|
7115
|
+
? axpEnsureEntityListInstanceQueryParam(item.path, item.name)
|
|
7116
|
+
: item.path;
|
|
7117
|
+
void commandService.execute('navigate', { path });
|
|
6997
7118
|
patchState(store, { selectedMenuItem: { item, isFullMatch: true } });
|
|
6998
7119
|
}
|
|
6999
7120
|
if (item.command) {
|
|
@@ -7026,8 +7147,9 @@ withMethods((store, router = inject(Router), commandService = inject(AXPCommandS
|
|
|
7026
7147
|
let sessionStatusSubscription;
|
|
7027
7148
|
let reloadGeneration = 0;
|
|
7028
7149
|
const applyMenuItems = (items) => {
|
|
7029
|
-
|
|
7030
|
-
|
|
7150
|
+
const stampedItems = axpStampEntityListMenuInstancePaths(items);
|
|
7151
|
+
patchState(store, { items: stampedItems });
|
|
7152
|
+
menuKeyboardShortcuts.sync(stampedItems);
|
|
7031
7153
|
store.selectMenuItemByRoute(router.url);
|
|
7032
7154
|
};
|
|
7033
7155
|
const rebuildMenu = async (generation) => {
|
|
@@ -7413,6 +7535,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
7413
7535
|
}]
|
|
7414
7536
|
}] });
|
|
7415
7537
|
|
|
7538
|
+
//#region ----- Command sub-flow navigation (session) -----
|
|
7539
|
+
const SUPPRESS_TAB_RESTORE_KEY = 'axp:command-subflow-suppress-tab-restore';
|
|
7540
|
+
const RETURN_URL_KEY = 'axp:command-subflow-return-url';
|
|
7541
|
+
/** Marks an in-flight command sub-flow (file picker, crop, dialog) so tab restore must not hijack the route. */
|
|
7542
|
+
function axpBeginCommandSubFlowNavigation(returnUrl) {
|
|
7543
|
+
const trimmed = returnUrl.trim();
|
|
7544
|
+
if (!trimmed.length) {
|
|
7545
|
+
return;
|
|
7546
|
+
}
|
|
7547
|
+
try {
|
|
7548
|
+
sessionStorage.setItem(SUPPRESS_TAB_RESTORE_KEY, '1');
|
|
7549
|
+
sessionStorage.setItem(RETURN_URL_KEY, trimmed);
|
|
7550
|
+
}
|
|
7551
|
+
catch {
|
|
7552
|
+
// sessionStorage may be unavailable
|
|
7553
|
+
}
|
|
7554
|
+
}
|
|
7555
|
+
function axpIsCommandSubFlowNavigationSuspended() {
|
|
7556
|
+
try {
|
|
7557
|
+
return sessionStorage.getItem(SUPPRESS_TAB_RESTORE_KEY) === '1';
|
|
7558
|
+
}
|
|
7559
|
+
catch {
|
|
7560
|
+
return false;
|
|
7561
|
+
}
|
|
7562
|
+
}
|
|
7563
|
+
function axpPeekCommandSubFlowReturnUrl() {
|
|
7564
|
+
try {
|
|
7565
|
+
const stored = sessionStorage.getItem(RETURN_URL_KEY);
|
|
7566
|
+
return stored?.trim().length ? stored : null;
|
|
7567
|
+
}
|
|
7568
|
+
catch {
|
|
7569
|
+
return null;
|
|
7570
|
+
}
|
|
7571
|
+
}
|
|
7572
|
+
function axpEndCommandSubFlowNavigation() {
|
|
7573
|
+
try {
|
|
7574
|
+
sessionStorage.removeItem(SUPPRESS_TAB_RESTORE_KEY);
|
|
7575
|
+
sessionStorage.removeItem(RETURN_URL_KEY);
|
|
7576
|
+
}
|
|
7577
|
+
catch {
|
|
7578
|
+
// sessionStorage may be unavailable
|
|
7579
|
+
}
|
|
7580
|
+
}
|
|
7581
|
+
//#endregion
|
|
7582
|
+
|
|
7416
7583
|
//#region ---- Tab Route Policy ----
|
|
7417
7584
|
const EXCLUDED_PATH_PREFIXES = ['/auth', '/error'];
|
|
7418
7585
|
const EXCLUDED_PATH_PATTERNS = [
|
|
@@ -7877,6 +8044,9 @@ class AXPTabNavigationService {
|
|
|
7877
8044
|
}
|
|
7878
8045
|
bindSessionChanges() {
|
|
7879
8046
|
this.sessionService.user$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
8047
|
+
if (axpIsCommandSubFlowNavigationSuspended()) {
|
|
8048
|
+
return;
|
|
8049
|
+
}
|
|
7880
8050
|
void this.restoreSessionIfNeeded();
|
|
7881
8051
|
});
|
|
7882
8052
|
}
|
|
@@ -8156,6 +8326,9 @@ class AXPTabNavigationService {
|
|
|
8156
8326
|
if (this.effectiveMode() === 'simple') {
|
|
8157
8327
|
return;
|
|
8158
8328
|
}
|
|
8329
|
+
if (axpIsCommandSubFlowNavigationSuspended()) {
|
|
8330
|
+
return;
|
|
8331
|
+
}
|
|
8159
8332
|
const storageKey = this.sessionStorageKey();
|
|
8160
8333
|
if (!storageKey) {
|
|
8161
8334
|
await this.ensureHomeTab();
|
|
@@ -8176,7 +8349,10 @@ class AXPTabNavigationService {
|
|
|
8176
8349
|
const activeKey = parsed.activeTabKey ?? this.tabs()[this.tabs().length - 1]?.key ?? AXP_HOME_TAB_KEY;
|
|
8177
8350
|
this.activeTabKey.set(activeKey);
|
|
8178
8351
|
const activeTab = this.tabs().find((tab) => tab.key === activeKey);
|
|
8179
|
-
|
|
8352
|
+
const currentUrl = normalizeRouterUrl(this.router.url);
|
|
8353
|
+
if (activeTab &&
|
|
8354
|
+
currentUrl !== normalizeRouterUrl(activeTab.url) &&
|
|
8355
|
+
axpIsTabEligibleUrl(currentUrl)) {
|
|
8180
8356
|
this.suppressNavigationSync = true;
|
|
8181
8357
|
try {
|
|
8182
8358
|
await this.router.navigateByUrl(activeTab.url);
|
|
@@ -8340,6 +8516,368 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
8340
8516
|
}]
|
|
8341
8517
|
}], ctorParameters: () => [] });
|
|
8342
8518
|
|
|
8519
|
+
//#region ----- Imports -----
|
|
8520
|
+
//#endregion
|
|
8521
|
+
//#region ----- Constants -----
|
|
8522
|
+
const AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS = 100;
|
|
8523
|
+
const AXP_LOCAL_ENTITY_BROADCAST_CHANNEL = 'axp-local-entity';
|
|
8524
|
+
const AXP_LOCAL_ENTITY_OUTBOX_LOCK = 'axp-local-entity-outbox';
|
|
8525
|
+
//#endregion
|
|
8526
|
+
//#region ----- Dexie DB -----
|
|
8527
|
+
class AXPLocalEntityIndexedDb extends Dexie {
|
|
8528
|
+
constructor() {
|
|
8529
|
+
super('ACoreXLocalEntity');
|
|
8530
|
+
this.version(1).stores({
|
|
8531
|
+
items: 'storageId, entityKey, userKey, [entityKey+userKey], sortAt',
|
|
8532
|
+
meta: 'id, entityKey, userKey, [entityKey+userKey]',
|
|
8533
|
+
});
|
|
8534
|
+
this.version(2).stores({
|
|
8535
|
+
items: 'storageId, entityKey, userKey, [entityKey+userKey], sortAt',
|
|
8536
|
+
meta: 'id, entityKey, userKey, [entityKey+userKey]',
|
|
8537
|
+
outbox: 'id, entityKey, userKey, [entityKey+userKey], queuedAt',
|
|
8538
|
+
});
|
|
8539
|
+
}
|
|
8540
|
+
}
|
|
8541
|
+
const axpLocalEntityIndexedDb = new AXPLocalEntityIndexedDb();
|
|
8542
|
+
function buildLocalEntityStorageId(entityKey, userKey, id) {
|
|
8543
|
+
return `${entityKey}|${userKey}|${id}`;
|
|
8544
|
+
}
|
|
8545
|
+
function buildLocalEntityMetaId(entityKey, userKey) {
|
|
8546
|
+
return `${entityKey}|${userKey}`;
|
|
8547
|
+
}
|
|
8548
|
+
//#endregion
|
|
8549
|
+
|
|
8550
|
+
//#region ----- Network failure detection -----
|
|
8551
|
+
/**
|
|
8552
|
+
* True when a failed HTTP/runtime call is likely a connectivity problem
|
|
8553
|
+
* (queue for outbox) rather than a business error (revert local).
|
|
8554
|
+
*/
|
|
8555
|
+
function axpIsLikelyNetworkFailure(error) {
|
|
8556
|
+
if (typeof navigator !== 'undefined' && navigator.onLine === false) {
|
|
8557
|
+
return true;
|
|
8558
|
+
}
|
|
8559
|
+
if (error instanceof TypeError) {
|
|
8560
|
+
return true;
|
|
8561
|
+
}
|
|
8562
|
+
const status = readErrorStatus(error);
|
|
8563
|
+
if (status === 0 || status === 502 || status === 503 || status === 504) {
|
|
8564
|
+
return true;
|
|
8565
|
+
}
|
|
8566
|
+
const message = error instanceof Error ? error.message : String(error ?? '');
|
|
8567
|
+
return /failed to fetch|networkerror|err_internet|err_network|offline|timeout|econnrefused|enetunreach/i.test(message);
|
|
8568
|
+
}
|
|
8569
|
+
function readErrorStatus(error) {
|
|
8570
|
+
if (error == null || typeof error !== 'object') {
|
|
8571
|
+
return null;
|
|
8572
|
+
}
|
|
8573
|
+
const row = error;
|
|
8574
|
+
const status = row.status ?? row.statusCode;
|
|
8575
|
+
return typeof status === 'number' && Number.isFinite(status) ? status : null;
|
|
8576
|
+
}
|
|
8577
|
+
//#endregion
|
|
8578
|
+
|
|
8579
|
+
//#region ----- Imports -----
|
|
8580
|
+
//#endregion
|
|
8581
|
+
//#region ----- Outbox -----
|
|
8582
|
+
/**
|
|
8583
|
+
* Durable mutation queue for {@link AXPLocalEntityEngine} offline-write entities.
|
|
8584
|
+
* Features register a flush handler per entityKey; replay is HTTP, not socket.
|
|
8585
|
+
*/
|
|
8586
|
+
class AXPLocalEntityOutboxService {
|
|
8587
|
+
constructor() {
|
|
8588
|
+
this.sessionService = inject(AXPSessionService);
|
|
8589
|
+
this.destroyRef = inject(DestroyRef);
|
|
8590
|
+
this.originId = typeof crypto !== 'undefined' && 'randomUUID' in crypto
|
|
8591
|
+
? crypto.randomUUID()
|
|
8592
|
+
: `outbox-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
8593
|
+
this.handlers = new Map();
|
|
8594
|
+
this.userKeySignal = signal(null, /* @ts-ignore */
|
|
8595
|
+
...(ngDevMode ? [{ debugName: "userKeySignal" }] : /* istanbul ignore next */ []));
|
|
8596
|
+
this.pendingOps = signal([], /* @ts-ignore */
|
|
8597
|
+
...(ngDevMode ? [{ debugName: "pendingOps" }] : /* istanbul ignore next */ []));
|
|
8598
|
+
this.flushInFlight = null;
|
|
8599
|
+
this.broadcast = null;
|
|
8600
|
+
this.pendingCount = computed(() => this.pendingOps().length, /* @ts-ignore */
|
|
8601
|
+
...(ngDevMode ? [{ debugName: "pendingCount" }] : /* istanbul ignore next */ []));
|
|
8602
|
+
this.bindBroadcastChannel();
|
|
8603
|
+
this.bindSessionContext();
|
|
8604
|
+
this.destroyRef.onDestroy(() => {
|
|
8605
|
+
this.broadcast?.close();
|
|
8606
|
+
this.broadcast = null;
|
|
8607
|
+
});
|
|
8608
|
+
}
|
|
8609
|
+
register(entityKey, handler) {
|
|
8610
|
+
this.handlers.set(entityKey, handler);
|
|
8611
|
+
}
|
|
8612
|
+
unregister(entityKey) {
|
|
8613
|
+
this.handlers.delete(entityKey);
|
|
8614
|
+
}
|
|
8615
|
+
pendingFor(entityKey) {
|
|
8616
|
+
return this.pendingOps().filter((op) => op.entityKey === entityKey);
|
|
8617
|
+
}
|
|
8618
|
+
async enqueue(input) {
|
|
8619
|
+
const userKey = this.resolveUserKey();
|
|
8620
|
+
const entityKey = input.entityKey?.trim();
|
|
8621
|
+
const action = input.action?.trim();
|
|
8622
|
+
if (!userKey || !entityKey || !action) {
|
|
8623
|
+
return;
|
|
8624
|
+
}
|
|
8625
|
+
const recordIds = [...new Set((input.recordIds ?? []).map((id) => id?.trim()).filter(Boolean))];
|
|
8626
|
+
const existing = await this.loadUserOps(userKey);
|
|
8627
|
+
const duplicate = existing.find((op) => op.entityKey === entityKey &&
|
|
8628
|
+
op.action === action &&
|
|
8629
|
+
sameIdSet(op.recordIds, recordIds) &&
|
|
8630
|
+
stablePayload(op.payload) === stablePayload(input.payload));
|
|
8631
|
+
if (duplicate) {
|
|
8632
|
+
return;
|
|
8633
|
+
}
|
|
8634
|
+
const op = {
|
|
8635
|
+
id: createOutboxId(),
|
|
8636
|
+
entityKey,
|
|
8637
|
+
userKey,
|
|
8638
|
+
action,
|
|
8639
|
+
recordIds,
|
|
8640
|
+
payload: input.payload,
|
|
8641
|
+
queuedAt: new Date().toISOString(),
|
|
8642
|
+
attempts: 0,
|
|
8643
|
+
lastError: null,
|
|
8644
|
+
};
|
|
8645
|
+
await axpLocalEntityIndexedDb.outbox.put(op);
|
|
8646
|
+
await this.refreshPending();
|
|
8647
|
+
this.publish();
|
|
8648
|
+
}
|
|
8649
|
+
async flushAll() {
|
|
8650
|
+
if (this.flushInFlight) {
|
|
8651
|
+
return this.flushInFlight;
|
|
8652
|
+
}
|
|
8653
|
+
this.flushInFlight = this.withFlushLock(() => this.flushUnlocked()).finally(() => {
|
|
8654
|
+
this.flushInFlight = null;
|
|
8655
|
+
});
|
|
8656
|
+
return this.flushInFlight;
|
|
8657
|
+
}
|
|
8658
|
+
async clearCurrentUser() {
|
|
8659
|
+
const userKey = this.resolveUserKey();
|
|
8660
|
+
if (!userKey) {
|
|
8661
|
+
this.pendingOps.set([]);
|
|
8662
|
+
return;
|
|
8663
|
+
}
|
|
8664
|
+
const keys = await axpLocalEntityIndexedDb.outbox.where('userKey').equals(userKey).primaryKeys();
|
|
8665
|
+
if (keys.length > 0) {
|
|
8666
|
+
await axpLocalEntityIndexedDb.outbox.bulkDelete(keys);
|
|
8667
|
+
}
|
|
8668
|
+
this.pendingOps.set([]);
|
|
8669
|
+
this.publish();
|
|
8670
|
+
}
|
|
8671
|
+
//#region ----- Private -----
|
|
8672
|
+
async flushUnlocked() {
|
|
8673
|
+
const userKey = this.resolveUserKey();
|
|
8674
|
+
if (!userKey) {
|
|
8675
|
+
return;
|
|
8676
|
+
}
|
|
8677
|
+
const ops = (await this.loadUserOps(userKey)).sort((left, right) => left.queuedAt.localeCompare(right.queuedAt));
|
|
8678
|
+
for (const op of ops) {
|
|
8679
|
+
const handler = this.handlers.get(op.entityKey);
|
|
8680
|
+
if (!handler) {
|
|
8681
|
+
continue;
|
|
8682
|
+
}
|
|
8683
|
+
try {
|
|
8684
|
+
await handler.flush(op);
|
|
8685
|
+
await axpLocalEntityIndexedDb.outbox.delete(op.id);
|
|
8686
|
+
}
|
|
8687
|
+
catch (error) {
|
|
8688
|
+
if (axpIsLikelyNetworkFailure(error)) {
|
|
8689
|
+
await axpLocalEntityIndexedDb.outbox.put({
|
|
8690
|
+
...op,
|
|
8691
|
+
attempts: op.attempts + 1,
|
|
8692
|
+
lastError: error instanceof Error ? error.message : String(error ?? 'network'),
|
|
8693
|
+
});
|
|
8694
|
+
break;
|
|
8695
|
+
}
|
|
8696
|
+
await axpLocalEntityIndexedDb.outbox.delete(op.id);
|
|
8697
|
+
await this.refreshPending();
|
|
8698
|
+
try {
|
|
8699
|
+
await handler.revert?.(op);
|
|
8700
|
+
}
|
|
8701
|
+
catch {
|
|
8702
|
+
// The failed op is already dropped so it cannot loop forever.
|
|
8703
|
+
}
|
|
8704
|
+
}
|
|
8705
|
+
}
|
|
8706
|
+
await this.refreshPending();
|
|
8707
|
+
this.publish();
|
|
8708
|
+
}
|
|
8709
|
+
async withFlushLock(run) {
|
|
8710
|
+
const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;
|
|
8711
|
+
if (!locks?.request) {
|
|
8712
|
+
return run();
|
|
8713
|
+
}
|
|
8714
|
+
await locks.request(AXP_LOCAL_ENTITY_OUTBOX_LOCK, () => run());
|
|
8715
|
+
}
|
|
8716
|
+
resolveUserKey() {
|
|
8717
|
+
const tenantId = this.sessionService.tenant?.id?.trim();
|
|
8718
|
+
const userId = this.sessionService.user?.id?.trim();
|
|
8719
|
+
if (!tenantId || !userId) {
|
|
8720
|
+
return null;
|
|
8721
|
+
}
|
|
8722
|
+
return `${tenantId}:${userId}`;
|
|
8723
|
+
}
|
|
8724
|
+
async loadUserOps(userKey) {
|
|
8725
|
+
return axpLocalEntityIndexedDb.outbox.where('userKey').equals(userKey).toArray();
|
|
8726
|
+
}
|
|
8727
|
+
async refreshPending() {
|
|
8728
|
+
const userKey = this.resolveUserKey();
|
|
8729
|
+
if (!userKey) {
|
|
8730
|
+
this.pendingOps.set([]);
|
|
8731
|
+
return;
|
|
8732
|
+
}
|
|
8733
|
+
const ops = await this.loadUserOps(userKey);
|
|
8734
|
+
ops.sort((left, right) => left.queuedAt.localeCompare(right.queuedAt));
|
|
8735
|
+
this.pendingOps.set(ops);
|
|
8736
|
+
}
|
|
8737
|
+
bindSessionContext() {
|
|
8738
|
+
combineLatest([this.sessionService.user$, this.sessionService.tenant$])
|
|
8739
|
+
.pipe(map(([user, tenant]) => (user?.id && tenant?.id ? `${tenant.id}:${user.id}` : null)), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))
|
|
8740
|
+
.subscribe((userKey) => {
|
|
8741
|
+
this.userKeySignal.set(userKey);
|
|
8742
|
+
void this.refreshPending();
|
|
8743
|
+
});
|
|
8744
|
+
}
|
|
8745
|
+
bindBroadcastChannel() {
|
|
8746
|
+
if (typeof BroadcastChannel === 'undefined') {
|
|
8747
|
+
return;
|
|
8748
|
+
}
|
|
8749
|
+
this.broadcast = new BroadcastChannel(AXP_LOCAL_ENTITY_BROADCAST_CHANNEL);
|
|
8750
|
+
this.broadcast.onmessage = (event) => {
|
|
8751
|
+
const message = event.data;
|
|
8752
|
+
if (!message || message.type !== 'outbox-changed' || message.originId === this.originId) {
|
|
8753
|
+
return;
|
|
8754
|
+
}
|
|
8755
|
+
if (message.userKey !== this.resolveUserKey()) {
|
|
8756
|
+
return;
|
|
8757
|
+
}
|
|
8758
|
+
void this.refreshPending();
|
|
8759
|
+
};
|
|
8760
|
+
}
|
|
8761
|
+
publish() {
|
|
8762
|
+
const userKey = this.resolveUserKey();
|
|
8763
|
+
if (!userKey) {
|
|
8764
|
+
return;
|
|
8765
|
+
}
|
|
8766
|
+
try {
|
|
8767
|
+
this.broadcast?.postMessage({
|
|
8768
|
+
type: 'outbox-changed',
|
|
8769
|
+
userKey,
|
|
8770
|
+
originId: this.originId,
|
|
8771
|
+
});
|
|
8772
|
+
}
|
|
8773
|
+
catch {
|
|
8774
|
+
// BroadcastChannel can fail in restricted contexts; local tab still works.
|
|
8775
|
+
}
|
|
8776
|
+
}
|
|
8777
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLocalEntityOutboxService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
8778
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLocalEntityOutboxService, providedIn: 'root' }); }
|
|
8779
|
+
}
|
|
8780
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLocalEntityOutboxService, decorators: [{
|
|
8781
|
+
type: Injectable,
|
|
8782
|
+
args: [{ providedIn: 'root' }]
|
|
8783
|
+
}], ctorParameters: () => [] });
|
|
8784
|
+
//#endregion
|
|
8785
|
+
//#region ----- Helpers -----
|
|
8786
|
+
function createOutboxId() {
|
|
8787
|
+
if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {
|
|
8788
|
+
return crypto.randomUUID();
|
|
8789
|
+
}
|
|
8790
|
+
return `outbox-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
8791
|
+
}
|
|
8792
|
+
function sameIdSet(left, right) {
|
|
8793
|
+
if (left.length !== right.length) {
|
|
8794
|
+
return false;
|
|
8795
|
+
}
|
|
8796
|
+
const expected = [...left].sort();
|
|
8797
|
+
const actual = [...right].sort();
|
|
8798
|
+
return expected.every((id, index) => id === actual[index]);
|
|
8799
|
+
}
|
|
8800
|
+
function stablePayload(payload) {
|
|
8801
|
+
if (!payload) {
|
|
8802
|
+
return '';
|
|
8803
|
+
}
|
|
8804
|
+
try {
|
|
8805
|
+
return JSON.stringify(payload);
|
|
8806
|
+
}
|
|
8807
|
+
catch {
|
|
8808
|
+
return '';
|
|
8809
|
+
}
|
|
8810
|
+
}
|
|
8811
|
+
|
|
8812
|
+
//#region ----- Imports -----
|
|
8813
|
+
//#endregion
|
|
8814
|
+
//#region ----- Offline runtime -----
|
|
8815
|
+
/**
|
|
8816
|
+
* Flushes the local-entity outbox when the device comes back online.
|
|
8817
|
+
* Features still own HTTP replay handlers; this only drives reconnect.
|
|
8818
|
+
*/
|
|
8819
|
+
class AXPLocalEntityOfflineRuntime {
|
|
8820
|
+
constructor() {
|
|
8821
|
+
this.connectivity = inject(AXPNetworkConnectivityService);
|
|
8822
|
+
this.outbox = inject(AXPLocalEntityOutboxService);
|
|
8823
|
+
this.destroyRef = inject(DestroyRef);
|
|
8824
|
+
this.started = false;
|
|
8825
|
+
this.wasOnline = true;
|
|
8826
|
+
}
|
|
8827
|
+
start() {
|
|
8828
|
+
if (this.started) {
|
|
8829
|
+
return;
|
|
8830
|
+
}
|
|
8831
|
+
this.started = true;
|
|
8832
|
+
this.wasOnline = this.connectivity.online;
|
|
8833
|
+
const onOnline = () => this.handleConnectivity(true);
|
|
8834
|
+
const onOffline = () => this.handleConnectivity(false);
|
|
8835
|
+
if (typeof window !== 'undefined') {
|
|
8836
|
+
window.addEventListener('online', onOnline);
|
|
8837
|
+
window.addEventListener('offline', onOffline);
|
|
8838
|
+
this.destroyRef.onDestroy(() => {
|
|
8839
|
+
window.removeEventListener('online', onOnline);
|
|
8840
|
+
window.removeEventListener('offline', onOffline);
|
|
8841
|
+
});
|
|
8842
|
+
}
|
|
8843
|
+
if (this.connectivity.online && this.outbox.pendingCount() > 0) {
|
|
8844
|
+
void this.outbox.flushAll();
|
|
8845
|
+
}
|
|
8846
|
+
}
|
|
8847
|
+
handleConnectivity(online) {
|
|
8848
|
+
if (online && !this.wasOnline) {
|
|
8849
|
+
void this.outbox.flushAll();
|
|
8850
|
+
}
|
|
8851
|
+
this.wasOnline = online;
|
|
8852
|
+
}
|
|
8853
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLocalEntityOfflineRuntime, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
8854
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLocalEntityOfflineRuntime, providedIn: 'root' }); }
|
|
8855
|
+
}
|
|
8856
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLocalEntityOfflineRuntime, decorators: [{
|
|
8857
|
+
type: Injectable,
|
|
8858
|
+
args: [{ providedIn: 'root' }]
|
|
8859
|
+
}] });
|
|
8860
|
+
|
|
8861
|
+
//#region ----- Imports -----
|
|
8862
|
+
//#endregion
|
|
8863
|
+
//#region ----- Providers -----
|
|
8864
|
+
/** Registers outbox flush-on-reconnect after realtime handlers exist. */
|
|
8865
|
+
function provideLocalEntityOfflineRuntime() {
|
|
8866
|
+
return [
|
|
8867
|
+
provideAppStartUpTask(() => {
|
|
8868
|
+
const runtime = inject(AXPLocalEntityOfflineRuntime);
|
|
8869
|
+
return {
|
|
8870
|
+
name: 'local-entity-offline-runtime',
|
|
8871
|
+
priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,
|
|
8872
|
+
run: async () => {
|
|
8873
|
+
runtime.start();
|
|
8874
|
+
},
|
|
8875
|
+
};
|
|
8876
|
+
}),
|
|
8877
|
+
];
|
|
8878
|
+
}
|
|
8879
|
+
//#endregion
|
|
8880
|
+
|
|
8343
8881
|
class AXPDataProvider {
|
|
8344
8882
|
}
|
|
8345
8883
|
|
|
@@ -9410,6 +9948,17 @@ class AXPMenuRouteAccessService {
|
|
|
9410
9948
|
if (this.hasDeclaredRoutePolicy(route)) {
|
|
9411
9949
|
return this.evaluateDeclaredRoutePolicy(route);
|
|
9412
9950
|
}
|
|
9951
|
+
return this.canAccessUrl(url);
|
|
9952
|
+
}
|
|
9953
|
+
/**
|
|
9954
|
+
* Menu-policy check for a URL (no route snapshot). Used by Open Details before navigate.
|
|
9955
|
+
* No matching menu item → allowed (lookup targets that are not in the menu).
|
|
9956
|
+
*/
|
|
9957
|
+
async canAccessUrl(url) {
|
|
9958
|
+
const normalizedUrl = this.normalizeUrl(url);
|
|
9959
|
+
if (SKIP_ROUTE_PATHS.has(normalizedUrl) || SKIP_ROUTE_PREFIXES.some((prefix) => normalizedUrl.startsWith(prefix))) {
|
|
9960
|
+
return true;
|
|
9961
|
+
}
|
|
9413
9962
|
// Avoid building/caching a shell-less menu tree before session is Authorized.
|
|
9414
9963
|
if (!this.sessionService.isAuthorized) {
|
|
9415
9964
|
return true;
|
|
@@ -9419,10 +9968,7 @@ class AXPMenuRouteAccessService {
|
|
|
9419
9968
|
if (!menuMatch) {
|
|
9420
9969
|
return true;
|
|
9421
9970
|
}
|
|
9422
|
-
|
|
9423
|
-
return true;
|
|
9424
|
-
}
|
|
9425
|
-
return false;
|
|
9971
|
+
return this.menuVisibility.isMenuBranchVisible(menuMatch.item, menuMatch.ancestors);
|
|
9426
9972
|
}
|
|
9427
9973
|
//#endregion
|
|
9428
9974
|
//#region ---- Utility Methods ----
|
|
@@ -9493,6 +10039,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
9493
10039
|
}] });
|
|
9494
10040
|
|
|
9495
10041
|
const APP_CHOOSER_ROUTE = '/auth/account/app-chooser';
|
|
10042
|
+
/** In-app navigations (e.g. Open Details) stay put instead of redirecting to 401. */
|
|
10043
|
+
function axpShouldStayOnCurrentPage(router, targetUrl) {
|
|
10044
|
+
const currentPath = router.url.split('#')[0]?.split('?')[0] ?? '';
|
|
10045
|
+
const targetPath = targetUrl.split('#')[0]?.split('?')[0] ?? '';
|
|
10046
|
+
if (!currentPath || currentPath === '/' || currentPath === targetPath) {
|
|
10047
|
+
return false;
|
|
10048
|
+
}
|
|
10049
|
+
return !currentPath.startsWith('/auth') && !currentPath.startsWith('/error');
|
|
10050
|
+
}
|
|
9496
10051
|
/**
|
|
9497
10052
|
|
|
9498
10053
|
* Blocks navigation when the target route is not accessible for the current user.
|
|
@@ -9519,6 +10074,9 @@ const AXPMenuRouteGuard = (route, state) => {
|
|
|
9519
10074
|
if (isAllowed instanceof UrlTree) {
|
|
9520
10075
|
return isAllowed;
|
|
9521
10076
|
}
|
|
10077
|
+
if (axpShouldStayOnCurrentPage(router, state.url)) {
|
|
10078
|
+
return false;
|
|
10079
|
+
}
|
|
9522
10080
|
return router.parseUrl(AXP_UNAUTHORIZED_ROUTE);
|
|
9523
10081
|
}));
|
|
9524
10082
|
};
|
|
@@ -10498,19 +11056,20 @@ class AXPCommonModule {
|
|
|
10498
11056
|
/**
|
|
10499
11057
|
* @ignore
|
|
10500
11058
|
*/
|
|
10501
|
-
constructor(instances, _keyboardShortcutsHelp, formatterRegistry) {
|
|
11059
|
+
constructor(instances, _keyboardShortcutsHelp, _browserTitle, formatterRegistry) {
|
|
10502
11060
|
formatterRegistry.register(AXPTranslateFormatter);
|
|
10503
11061
|
instances.forEach((f) => {
|
|
10504
11062
|
f();
|
|
10505
11063
|
});
|
|
10506
11064
|
}
|
|
10507
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCommonModule, deps: [{ token: 'AXPCommonModuleFactory' }, { token: AXPKeyboardShortcutsHelpService }, { token:
|
|
10508
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPCommonModule, imports: [
|
|
11065
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCommonModule, deps: [{ token: 'AXPCommonModuleFactory' }, { token: AXPKeyboardShortcutsHelpService }, { token: AXPBrowserTitleService }, { token: i3$1.AXFormatterRegistryService }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
11066
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPCommonModule, imports: [i4$2.AXPComponentSlotModule, AXPopupModule,
|
|
10509
11067
|
AXDateTimeModule,
|
|
10510
11068
|
AXToastModule,
|
|
10511
11069
|
AXNotificationModule,
|
|
10512
|
-
AXPModuleManifestModule,
|
|
11070
|
+
AXPModuleManifestModule, i5.RouterModule], exports: [RouterModule] }); }
|
|
10513
11071
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCommonModule, providers: [
|
|
11072
|
+
...provideLocalEntityOfflineRuntime(),
|
|
10514
11073
|
provideAXPUserNotificationService(),
|
|
10515
11074
|
{
|
|
10516
11075
|
provide: ErrorHandler,
|
|
@@ -10576,7 +11135,7 @@ class AXPCommonModule {
|
|
|
10576
11135
|
provide: AXP_SETTING_DEFINITION_PROVIDER,
|
|
10577
11136
|
useFactory: async () => {
|
|
10578
11137
|
const injector = inject(Injector);
|
|
10579
|
-
const provider = (await import('./acorex-platform-framework-client-common-common-settings.provider-
|
|
11138
|
+
const provider = (await import('./acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs')).AXPCommonSettingProvider;
|
|
10580
11139
|
return new provider(injector);
|
|
10581
11140
|
},
|
|
10582
11141
|
multi: true,
|
|
@@ -10586,6 +11145,16 @@ class AXPCommonModule {
|
|
|
10586
11145
|
key: 'navigate',
|
|
10587
11146
|
command: () => Promise.resolve().then(function () { return navigate_command; }).then((c) => c.AXPNavigateCommand),
|
|
10588
11147
|
},
|
|
11148
|
+
{
|
|
11149
|
+
key: 'Page:RunAction',
|
|
11150
|
+
command: () => Promise.resolve().then(function () { return pageRunAction_command; }).then((c) => c.AXPPageRunActionCommand),
|
|
11151
|
+
},
|
|
11152
|
+
]),
|
|
11153
|
+
provideQuerySetups([
|
|
11154
|
+
{
|
|
11155
|
+
key: 'Page:GetContext',
|
|
11156
|
+
loader: () => Promise.resolve().then(function () { return pageGetContext_query; }).then((c) => c.AXPPageGetContextQuery),
|
|
11157
|
+
},
|
|
10589
11158
|
]),
|
|
10590
11159
|
], imports: [AXPComponentSlotModule.forChild({
|
|
10591
11160
|
'root-footer-end': [
|
|
@@ -10623,6 +11192,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
10623
11192
|
],
|
|
10624
11193
|
exports: [RouterModule],
|
|
10625
11194
|
providers: [
|
|
11195
|
+
...provideLocalEntityOfflineRuntime(),
|
|
10626
11196
|
provideAXPUserNotificationService(),
|
|
10627
11197
|
{
|
|
10628
11198
|
provide: ErrorHandler,
|
|
@@ -10688,7 +11258,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
10688
11258
|
provide: AXP_SETTING_DEFINITION_PROVIDER,
|
|
10689
11259
|
useFactory: async () => {
|
|
10690
11260
|
const injector = inject(Injector);
|
|
10691
|
-
const provider = (await import('./acorex-platform-framework-client-common-common-settings.provider-
|
|
11261
|
+
const provider = (await import('./acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs')).AXPCommonSettingProvider;
|
|
10692
11262
|
return new provider(injector);
|
|
10693
11263
|
},
|
|
10694
11264
|
multi: true,
|
|
@@ -10698,13 +11268,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
10698
11268
|
key: 'navigate',
|
|
10699
11269
|
command: () => Promise.resolve().then(function () { return navigate_command; }).then((c) => c.AXPNavigateCommand),
|
|
10700
11270
|
},
|
|
11271
|
+
{
|
|
11272
|
+
key: 'Page:RunAction',
|
|
11273
|
+
command: () => Promise.resolve().then(function () { return pageRunAction_command; }).then((c) => c.AXPPageRunActionCommand),
|
|
11274
|
+
},
|
|
11275
|
+
]),
|
|
11276
|
+
provideQuerySetups([
|
|
11277
|
+
{
|
|
11278
|
+
key: 'Page:GetContext',
|
|
11279
|
+
loader: () => Promise.resolve().then(function () { return pageGetContext_query; }).then((c) => c.AXPPageGetContextQuery),
|
|
11280
|
+
},
|
|
10701
11281
|
]),
|
|
10702
11282
|
],
|
|
10703
11283
|
}]
|
|
10704
11284
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
10705
11285
|
type: Inject,
|
|
10706
11286
|
args: ['AXPCommonModuleFactory']
|
|
10707
|
-
}] }, { type: AXPKeyboardShortcutsHelpService }, { type:
|
|
11287
|
+
}] }, { type: AXPKeyboardShortcutsHelpService }, { type: AXPBrowserTitleService }, { type: i3$1.AXFormatterRegistryService }] });
|
|
10708
11288
|
|
|
10709
11289
|
/**
|
|
10710
11290
|
* Resolves post-create list behavior from user settings and optional action overrides.
|
|
@@ -11379,30 +11959,8 @@ const AXP_INTEGRATION_CONNECTION_LIFECYCLE = new InjectionToken('AXP_INTEGRATION
|
|
|
11379
11959
|
//#endregion
|
|
11380
11960
|
|
|
11381
11961
|
//#region ----- Types -----
|
|
11382
|
-
|
|
11383
|
-
|
|
11384
|
-
//#region ----- Imports -----
|
|
11385
|
-
//#endregion
|
|
11386
|
-
//#region ----- Constants -----
|
|
11387
|
-
const AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS = 100;
|
|
11388
|
-
const AXP_LOCAL_ENTITY_BROADCAST_CHANNEL = 'axp-local-entity';
|
|
11389
|
-
//#endregion
|
|
11390
|
-
//#region ----- Dexie DB -----
|
|
11391
|
-
class AXPLocalEntityIndexedDb extends Dexie {
|
|
11392
|
-
constructor() {
|
|
11393
|
-
super('ACoreXLocalEntity');
|
|
11394
|
-
this.version(1).stores({
|
|
11395
|
-
items: 'storageId, entityKey, userKey, [entityKey+userKey], sortAt',
|
|
11396
|
-
meta: 'id, entityKey, userKey, [entityKey+userKey]',
|
|
11397
|
-
});
|
|
11398
|
-
}
|
|
11399
|
-
}
|
|
11400
|
-
const axpLocalEntityIndexedDb = new AXPLocalEntityIndexedDb();
|
|
11401
|
-
function buildLocalEntityStorageId(entityKey, userKey, id) {
|
|
11402
|
-
return `${entityKey}|${userKey}|${id}`;
|
|
11403
|
-
}
|
|
11404
|
-
function buildLocalEntityMetaId(entityKey, userKey) {
|
|
11405
|
-
return `${entityKey}|${userKey}`;
|
|
11962
|
+
function axpLocalEntitySupportsOfflineWrite(mode) {
|
|
11963
|
+
return mode === 'offline-write';
|
|
11406
11964
|
}
|
|
11407
11965
|
//#endregion
|
|
11408
11966
|
|
|
@@ -11858,12 +12416,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
11858
12416
|
}], ctorParameters: () => [] });
|
|
11859
12417
|
//#endregion
|
|
11860
12418
|
//#region ----- Policy normalize -----
|
|
12419
|
+
function normalizeMode(mode) {
|
|
12420
|
+
if (mode === 'cache' || mode === 'offline-read' || mode === 'offline-write' || mode === 'local-first') {
|
|
12421
|
+
return mode;
|
|
12422
|
+
}
|
|
12423
|
+
return 'local-first';
|
|
12424
|
+
}
|
|
11861
12425
|
function normalizePolicy(policy) {
|
|
11862
12426
|
const maxItems = typeof policy?.maxItems === 'number' && policy.maxItems > 0
|
|
11863
12427
|
? Math.floor(policy.maxItems)
|
|
11864
12428
|
: AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS;
|
|
11865
12429
|
return {
|
|
11866
|
-
mode: policy?.mode
|
|
12430
|
+
mode: normalizeMode(policy?.mode),
|
|
11867
12431
|
maxItems,
|
|
11868
12432
|
role: policy?.role,
|
|
11869
12433
|
sortField: typeof policy?.sortField === 'string' && policy.sortField.trim() ? policy.sortField.trim() : undefined,
|
|
@@ -12654,7 +13218,7 @@ class AXMOrgChartPrintPage extends AXBasePageComponent {
|
|
|
12654
13218
|
<ax-icon class="fa-solid fa-print"> </ax-icon>
|
|
12655
13219
|
</ax-button>
|
|
12656
13220
|
</ax-suffix>
|
|
12657
|
-
</ax-footer>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i2$
|
|
13221
|
+
</ax-footer>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i2$2.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3$3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXColorBoxModule }, { kind: "component", type: i6$1.AXColorBoxComponent, selector: "ax-color-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "showBadge", "showValue", "showClearButton", "showIcon"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
12658
13222
|
}
|
|
12659
13223
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMOrgChartPrintPage, decorators: [{
|
|
12660
13224
|
type: Component,
|
|
@@ -12963,9 +13527,217 @@ const axpNavigateCommandDefinition = defineCommand({
|
|
|
12963
13527
|
categories: [AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM],
|
|
12964
13528
|
});
|
|
12965
13529
|
|
|
13530
|
+
//#region ----- Imports -----
|
|
13531
|
+
//#endregion
|
|
13532
|
+
//#region ----- Helpers -----
|
|
13533
|
+
function coerceArgs(raw) {
|
|
13534
|
+
if (!raw) {
|
|
13535
|
+
return {};
|
|
13536
|
+
}
|
|
13537
|
+
if (typeof raw === 'string') {
|
|
13538
|
+
try {
|
|
13539
|
+
const parsed = JSON.parse(raw);
|
|
13540
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
13541
|
+
return parsed;
|
|
13542
|
+
}
|
|
13543
|
+
}
|
|
13544
|
+
catch {
|
|
13545
|
+
return {};
|
|
13546
|
+
}
|
|
13547
|
+
return {};
|
|
13548
|
+
}
|
|
13549
|
+
if (typeof raw === 'object' && !Array.isArray(raw)) {
|
|
13550
|
+
return raw;
|
|
13551
|
+
}
|
|
13552
|
+
return {};
|
|
13553
|
+
}
|
|
13554
|
+
function resolveArgs(input) {
|
|
13555
|
+
const fromArgs = coerceArgs(input.args);
|
|
13556
|
+
const rest = {};
|
|
13557
|
+
for (const [key, value] of Object.entries(input)) {
|
|
13558
|
+
if (key === 'actionId' || key === 'args') {
|
|
13559
|
+
continue;
|
|
13560
|
+
}
|
|
13561
|
+
if (value !== undefined) {
|
|
13562
|
+
rest[key] = value;
|
|
13563
|
+
}
|
|
13564
|
+
}
|
|
13565
|
+
return { ...rest, ...fromArgs };
|
|
13566
|
+
}
|
|
13567
|
+
function readActionId(input) {
|
|
13568
|
+
if (typeof input.actionId === 'string' && input.actionId.trim()) {
|
|
13569
|
+
return input.actionId.trim();
|
|
13570
|
+
}
|
|
13571
|
+
const nested = resolveArgs(input)['actionId'];
|
|
13572
|
+
return typeof nested === 'string' ? nested.trim() : '';
|
|
13573
|
+
}
|
|
13574
|
+
//#endregion
|
|
13575
|
+
//#region ----- Command -----
|
|
13576
|
+
class AXPPageRunActionCommand {
|
|
13577
|
+
constructor() {
|
|
13578
|
+
//#region ----- Services & Dependencies -----
|
|
13579
|
+
this.pageContext = inject(AXPPageContextRegistry);
|
|
13580
|
+
}
|
|
13581
|
+
//#endregion
|
|
13582
|
+
//#region ----- Command Execution -----
|
|
13583
|
+
async execute(input = {}) {
|
|
13584
|
+
const actionId = readActionId(input);
|
|
13585
|
+
if (!actionId) {
|
|
13586
|
+
const snapshot = this.pageContext.getSnapshot();
|
|
13587
|
+
return runtimeCommandFailure('actionId is required for Page:RunAction.', { details: { snapshot } });
|
|
13588
|
+
}
|
|
13589
|
+
const result = await this.pageContext.runAction(actionId, resolveArgs(input));
|
|
13590
|
+
if (!result.success) {
|
|
13591
|
+
return runtimeCommandFailure(result.message ?? 'Page action failed.', {
|
|
13592
|
+
details: { snapshot: result.snapshot },
|
|
13593
|
+
});
|
|
13594
|
+
}
|
|
13595
|
+
return runtimeCommandSuccessObject({ snapshot: result.snapshot });
|
|
13596
|
+
}
|
|
13597
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPageRunActionCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13598
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPageRunActionCommand, providedIn: 'root' }); }
|
|
13599
|
+
}
|
|
13600
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPageRunActionCommand, decorators: [{
|
|
13601
|
+
type: Injectable,
|
|
13602
|
+
args: [{ providedIn: 'root' }]
|
|
13603
|
+
}] });
|
|
13604
|
+
|
|
13605
|
+
var pageRunAction_command = /*#__PURE__*/Object.freeze({
|
|
13606
|
+
__proto__: null,
|
|
13607
|
+
AXPPageRunActionCommand: AXPPageRunActionCommand
|
|
13608
|
+
});
|
|
13609
|
+
|
|
13610
|
+
/**
|
|
13611
|
+
* Build-time only. Do not import from Angular modules.
|
|
13612
|
+
* Source: page-run-action.command.ts — AXPPageRunActionCommand.execute
|
|
13613
|
+
*/
|
|
13614
|
+
const axpPageRunActionCommandDefinition = defineCommand({
|
|
13615
|
+
key: 'Page:RunAction',
|
|
13616
|
+
title: 'Run page action',
|
|
13617
|
+
description: 'Runs an advertised action on the currently visible page (set-view, set-filter, remove-filter, clear-filters, set-search, apply-layout). ' +
|
|
13618
|
+
'Call Page:GetContext first and only use actionId values from snapshot.actions. Returns the new snapshot immediately; status may be loading. ' +
|
|
13619
|
+
'Do not use Entity:Query:Default or Entity:OpenList to change the open list chrome.',
|
|
13620
|
+
executionMode: 'frontend',
|
|
13621
|
+
inputs: [
|
|
13622
|
+
{
|
|
13623
|
+
name: 'actionId',
|
|
13624
|
+
title: 'Action id',
|
|
13625
|
+
description: 'Must match an id from Page:GetContext snapshot.actions (e.g. set-view, set-filter, apply-layout).',
|
|
13626
|
+
interface: { name: 'text-editor' },
|
|
13627
|
+
validations: [{ rule: 'required' }],
|
|
13628
|
+
},
|
|
13629
|
+
{
|
|
13630
|
+
name: 'args',
|
|
13631
|
+
title: 'Action args',
|
|
13632
|
+
description: 'Object of params advertised on that action (viewName, field, operatorType, value, text, json).',
|
|
13633
|
+
interface: { name: 'json' },
|
|
13634
|
+
},
|
|
13635
|
+
],
|
|
13636
|
+
outcomes: {
|
|
13637
|
+
mode: 'static',
|
|
13638
|
+
values: ['success', 'failure'],
|
|
13639
|
+
},
|
|
13640
|
+
ai: {
|
|
13641
|
+
shortDescription: 'Drive the visible page (list chrome or layout designer) and return the updated snapshot.',
|
|
13642
|
+
tags: ['page', 'ui', 'filter', 'list', 'frontend'],
|
|
13643
|
+
usage: {
|
|
13644
|
+
whenToUse: [
|
|
13645
|
+
'User asked to change the current list tab, visible filter, search box, or the open layout designer canvas.',
|
|
13646
|
+
],
|
|
13647
|
+
avoidWhen: [
|
|
13648
|
+
'Changing stored rows — use Entity:Update:Default / Entity:Edit / Entity:Delete:Default.',
|
|
13649
|
+
'Querying storage instead of the on-screen list — use Entity:Query:Default.',
|
|
13650
|
+
'Opening a different entity list — use Entity:OpenList.',
|
|
13651
|
+
],
|
|
13652
|
+
followUpTools: ['Page:GetContext'],
|
|
13653
|
+
},
|
|
13654
|
+
},
|
|
13655
|
+
capabilities: ['ai'],
|
|
13656
|
+
categories: [AXP_COMMAND_DEFINITION_CATEGORY_PLATFORM],
|
|
13657
|
+
});
|
|
13658
|
+
|
|
13659
|
+
//#region ----- Imports -----
|
|
13660
|
+
//#endregion
|
|
13661
|
+
//#region ----- Query -----
|
|
13662
|
+
class AXPPageGetContextQuery {
|
|
13663
|
+
constructor() {
|
|
13664
|
+
//#region ----- Services & Dependencies -----
|
|
13665
|
+
this.pageContext = inject(AXPPageContextRegistry);
|
|
13666
|
+
}
|
|
13667
|
+
//#endregion
|
|
13668
|
+
//#region ----- Query Execution -----
|
|
13669
|
+
async fetch(_input) {
|
|
13670
|
+
const snapshot = this.pageContext.getSnapshot();
|
|
13671
|
+
return runtimeQuerySuccessObject(snapshot);
|
|
13672
|
+
}
|
|
13673
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPageGetContextQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13674
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPageGetContextQuery, providedIn: 'root' }); }
|
|
13675
|
+
}
|
|
13676
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPageGetContextQuery, decorators: [{
|
|
13677
|
+
type: Injectable,
|
|
13678
|
+
args: [{ providedIn: 'root' }]
|
|
13679
|
+
}] });
|
|
13680
|
+
|
|
13681
|
+
var pageGetContext_query = /*#__PURE__*/Object.freeze({
|
|
13682
|
+
__proto__: null,
|
|
13683
|
+
AXPPageGetContextQuery: AXPPageGetContextQuery
|
|
13684
|
+
});
|
|
13685
|
+
|
|
13686
|
+
/**
|
|
13687
|
+
* Build-time only. Do not import from Angular modules.
|
|
13688
|
+
* Source: page-get-context.query.ts — AXPPageGetContextQuery.fetch
|
|
13689
|
+
*/
|
|
13690
|
+
const axpPageGetContextQueryDefinition = defineQuery({
|
|
13691
|
+
key: 'Page:GetContext',
|
|
13692
|
+
title: 'Get page context',
|
|
13693
|
+
description: 'Returns a live snapshot of the currently visible page plus advertised actions (entity list chrome, or layout-designer apply-layout). ' +
|
|
13694
|
+
'Use when the user means this screen. Do not use Entity:Query:Default to change what is on screen. ' +
|
|
13695
|
+
'When kind is none or actions is empty, the user is not on a driveable page — use list-entity-records / Entity:Query:Default for stored rows.',
|
|
13696
|
+
executionMode: 'frontend',
|
|
13697
|
+
kind: 'object',
|
|
13698
|
+
args: [],
|
|
13699
|
+
columns: [
|
|
13700
|
+
{
|
|
13701
|
+
name: 'kind',
|
|
13702
|
+
title: 'Kind',
|
|
13703
|
+
description: '`entity-list` when a master list is focused; `layout-designer` when the form/layout designer is focused; `none` otherwise.',
|
|
13704
|
+
interface: { name: 'text-editor' },
|
|
13705
|
+
},
|
|
13706
|
+
{
|
|
13707
|
+
name: 'status',
|
|
13708
|
+
title: 'Status',
|
|
13709
|
+
description: '`ready`, `loading` (grid still fetching), or `empty`.',
|
|
13710
|
+
interface: { name: 'text-editor' },
|
|
13711
|
+
},
|
|
13712
|
+
{
|
|
13713
|
+
name: 'actions',
|
|
13714
|
+
title: 'Actions',
|
|
13715
|
+
description: 'Advertised action ids for Page:RunAction. Only call ids from this array.',
|
|
13716
|
+
interface: { name: 'large-text-editor' },
|
|
13717
|
+
},
|
|
13718
|
+
],
|
|
13719
|
+
ai: {
|
|
13720
|
+
shortDescription: 'Live snapshot of the visible page plus advertised actions (list chrome or layout designer).',
|
|
13721
|
+
tags: ['page', 'ui', 'filter', 'list', 'frontend'],
|
|
13722
|
+
usage: {
|
|
13723
|
+
whenToUse: [
|
|
13724
|
+
'User refers to this list, this tab, visible filters, the search box, or the open layout designer canvas.',
|
|
13725
|
+
],
|
|
13726
|
+
avoidWhen: [
|
|
13727
|
+
'Listing or counting stored rows in storage — use Entity:Query:Default / list-entity-records.',
|
|
13728
|
+
'Where-is / how-to navigation — use PlatformManagement:ListPlatformNavigationForAi.',
|
|
13729
|
+
'Create / update / delete records — use Entity:* commands.',
|
|
13730
|
+
],
|
|
13731
|
+
followUpTools: ['Page:RunAction'],
|
|
13732
|
+
},
|
|
13733
|
+
},
|
|
13734
|
+
capabilities: ['ai'],
|
|
13735
|
+
categories: [AXP_QUERY_DEFINITION_CATEGORY_PLATFORM],
|
|
13736
|
+
});
|
|
13737
|
+
|
|
12966
13738
|
/**
|
|
12967
13739
|
* Generated bundle index. Do not edit.
|
|
12968
13740
|
*/
|
|
12969
13741
|
|
|
12970
|
-
export { ALL_DEFAULT_OPERATORS, AXPAcorexFileTypeBridgeProvider, AXPAcorexFileTypeModule, AXPAppVersionService, AXPBackgroundOperationCompletionService, AXPBackgroundOperationEntityStoreService, AXPBackgroundOperationHandler, AXPBackgroundOperationNotificationService, AXPBackgroundOperationProvider, AXPBackgroundOperationRootConfig, AXPBackgroundOperationService, AXPBackgroundOperationSlotComponent, AXPBrowserTitleService, AXPCleanNestedFilters, AXPClipBoardService, AXPCommonModule, AXPCommonSettings, AXPCustomOperatorService, AXPCustomOperatorServiceImpl, AXPDataProvider, AXPDefaultMultiLanguageConfigService, AXPErrorHandlerRegistryService, AXPExportService, AXPFileActionsService, AXPFileChooserSettings, AXPFileStorageEvaluatorScopeProvider, AXPFileStorageService, AXPFileTypeProviderService, AXPFilterOperatorMiddlewareService, AXPFilterOperatorMiddlewareServiceImpl, AXPFooterTextSlotComponent, AXPGlobalErrorHandler, AXPHomePageModule, AXPHomePageService, AXPIndexedDbSettingValueProvider, AXPIntegrationDomainProviderContext, AXPIntegrationDomainRegistryFacade, AXPIntegrationDomainRegistryService, AXPIntegrationOAuthService, AXPIntegrationProviderContext, AXPIntegrationProviderRegistryService, AXPIntegrationRuntimeService, AXPKeyboardShortcutsHelpComponent, AXPKeyboardShortcutsHelpService, AXPLocalEntityEngine, AXPLocalEntityIndexedDb, AXPLocalEntityRealtimeBridge, AXPLockService, AXPLogoImageSrcResolverService, AXPMenuKeyboardShortcutService, AXPMenuMiddlewareRegistry, AXPMenuProviderService, AXPMenuRouteAccessService, AXPMenuRouteGuard, AXPMenuSearchDefinitionProvider, AXPMenuSearchProvider, AXPMenuService, AXPMenuVisibilityService, AXPNavBarSlotComponent, AXPNavigateCommand, AXPNetworkConnectivityService, AXPNotFoundCatchAllRoute, AXPNotFoundError, AXPOutputContractTranscriptSegmentService, AXPPlatformBrandingService, AXPPlatformDefaultConfigs, AXPPlatformSettingsLoadState, AXPPlatformSettingsOfflineBootstrapService, AXPQueryEvaluatorScopeProvider, AXPQueryParamsEvaluatorScopeProvider, AXPRegionalCalendarService, AXPSearchCommandProvider, AXPSearchDefinitionActionBuilder, AXPSearchDefinitionBuilder, AXPSearchDefinitionProviderContext, AXPSearchDefinitionProviderService, AXPSearchService, AXPSettingDefaultValuesAggregatorService, AXPSettingDefinitionGroupBuilder, AXPSettingDefinitionProviderContext, AXPSettingDefinitionProviderService, AXPSettingDefinitionSectionBuilder, AXPSettingsBulkSyncService, AXPSettingsEvaluatorScopeProvider, AXPSettingsIndexedDb, AXPSettingsService, AXPStateMessageComponent, AXPStatusDefinitionProviderService, AXPStickyDirective, AXPTabNavigationService, AXPTabPreviewService, AXPTabRouteCacheRegistry, AXPTokenDefinitionService, AXPTokenEvaluatorScopeProvider, AXPTranslateFormatter, AXPUnsavedChangesConfirmService, AXPUnsavedChangesPopstateService, AXPUserNotificationService, AXPVersioningService, AXP_AGENT_OUTPUT_CONTRACT_DEFAULT_STRUCTURED_RETRIES, AXP_APP_VERSION_PROVIDER, AXP_BACKGROUND_OPERATION_ENTITY_STORAGE, AXP_BACKGROUND_OPERATION_HANDLERS, AXP_BACKGROUND_OPERATION_PROVIDERS, AXP_DOCUMENT_FILE_TYPE_PURPOSES, AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT, AXP_EXPERIENCE_SETTINGS_GROUP, AXP_EXPERIENCE_SETTINGS_SECTIONS, AXP_FILE_ACTION_PROVIDER, AXP_FILE_TYPE_INFO_PROVIDER, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_HOME_TAB_KEY, AXP_INTEGRATION_CONNECTION_ESTABLISHED, AXP_INTEGRATION_CONNECTION_LIFECYCLE, AXP_INTEGRATION_DOMAIN_PROVIDER, AXP_INTEGRATION_OAUTH_SERVICE, AXP_INTEGRATION_PROVIDER, AXP_INTEGRATION_RUNTIME_PROVIDER, AXP_INTEGRATION_SECRET_STORE, AXP_IN_APP_NOTIFICATION_SERVICE, AXP_LOCALE_MANAGEMENT_PORT, AXP_LOCAL_ENTITY_BROADCAST_CHANNEL, AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS, AXP_MENU_MIDDLEWARE, AXP_MENU_PROVIDER, AXP_NOT_FOUND_CATCH_ALL_ROUTE, AXP_NOT_FOUND_ROUTE, AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER, AXP_PLATFORM_BRANDING_SETTING_KEYS, AXP_PLATFORM_CONFIG_TOKEN, AXP_PROTECTED_ROUTE_GUARDS, AXP_ROOT_CONFIG_TOKEN, AXP_RUNTIME_QUERY_CACHE_DEFAULTS, AXP_SEARCH_DEFINITION_LAZY_RESOLVER, AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SETTINGS_CACHE_SYNC, AXP_SETTINGS_SYNC_DEBOUNCE_MS, AXP_SETTINGS_SYNC_KEYS, AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS, AXP_SETTINGS_SYNC_TTL_MS, AXP_SETTING_DEFAULT_VALUES_PROVIDERS, AXP_SETTING_DEFINITION_PROVIDER, AXP_SETTING_SCOPE_DESCENDANTS, AXP_SETTING_VALUE_PROVIDER, AXP_STATUS_PROVIDERS, AXP_TAB_BREADCRUMB_JOIN_SEPARATOR, AXP_TAB_ROUTE_DATA_KEY, AXP_TOKEN_DEFINITION_PROVIDER, AXP_UNAUTHORIZED_ROUTE, AXP_USER_NOTIFICATION_SERVICE, AXVChangeType, AX_FILE_TYPE_METADATA_SUPPORT_BY_FILE_VIEWER, BETWEEN_OPER, BOOLEAN_OPERATORS, CONTAINS_OPER, DATE_OPERATORS, DEFAULT_DATE_FILTER_PRESETS, DEFAULT_MULTILANGUAGE_FIELD_NAMES, ENDS_WITH_OPER, ENVIRONMENT, EQ_OPER, FILE_VIEWER_PREVIEW_EXTENSIONS, GTE_OPER, GT_OPER, IN_OPER, IS_EMPTY_OPER, IS_NOT_EMPTY_OPER, LTE_OPER, LT_OPER, MULTILANGUAGE_CAPABLE_WIDGET_TYPES, NOT_CONTAINS_OPER, NOT_EQ_OPER, NUMBER_OPERATORS, SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE, STARTS_WITH_OPER, STRING_OPERATORS, UploadFromComputerActionProvider, applyDateFilterPreset, axpBackgroundOperationCapabilities, axpBackgroundOperationDisplayTime, axpBackgroundOperationDurationMs, axpBackgroundOperationEntityName, axpBackgroundOperationEstimateEndDate, axpBackgroundOperationFailurePolicy, axpBackgroundOperationFromEntityModel, axpBackgroundOperationRemainingMs, axpBackgroundOperationStatusTextParams, axpBackgroundOperationToEntityModel, axpBuildBackgroundOperation, axpBuildTabKey, axpCoerceBackgroundOperationDate, axpCreateBackgroundOperationId, axpFallbackTabTitle, axpFindMenuItemByRoute, axpFormatBackgroundOperationDurationMs, axpGetEntityListReturnUrl, axpGetLeafRouteSnapshot, axpHasTabScope, axpInterpolateNavigatePath, axpIsActiveBackgroundOperationStatus, axpIsBackgroundOperationI18nText, axpIsCompletedBackgroundOperationStatus, axpIsCompletedPanelBackgroundOperation, axpIsEntityDetailsPath, axpIsEntityDetailsViewRoute, axpIsEntityListPath, axpIsEntityListRoute, axpIsEntityRecordNotFound, axpIsInProgressPanelBackgroundOperation, axpIsTabEligibleUrl, axpIsTrayVisibleBackgroundOperation, axpJoinTabTitleSegments, axpLocalEntityCanServeListLocally, axpLocalEntityHotListRequest, axpLocalEntityIndexedDb, axpLocalEntityRecordId, axpLocalEntitySortAt, axpLocalEntityToPayload, axpMenuPathsMatch, axpNavigateAppPath, axpNavigateCommandDefinition, axpParseAppPath, axpParseEntityDetailsRoute, axpParseEntityListRoute, axpPathFromSnapshot, axpPlatformSettingsAvailableGuard, axpRedirectToNotFound, axpRedirectToUnauthorized, axpReplaceEntityListRouteQueryParams, axpResolveNavigatePath, axpResolveTabKey, axpResolveTabKeyFromRouteConfig, axpResolveTabKeyFromSnapshot, axpResolveTabTitleParts, axpSaveEntityListReturnUrl, axpSettingsIndexedDb, backgroundOperationEntityFactory, buildFileStorageDownloadUrl, buildLocalEntityMetaId, buildLocalEntityStorageId, buildScopedSettingsSnapshotId, chooseSystemFiles, coerceAXPSettingRawValue, coerceAXPSettingRawValueByKind, configPlatform, createBackgroundOperationStore, createDefaultSettingValueProviders, createEmptyScopedSettingsSnapshot, createEntityCommandOptions, createEntityRowExpressionScope, createEntitySearchCommand, createFileTypeOpenContext, createIndexedDbSettingValueProviders, createMenuContext, createMenuMiddleware, createUnsavedChangesCanDeactivateGuard, downloadGraphicFromElement, evaluateEntityDisplayTemplate, extractFileExtension, extractHttpRequestErrorInfo, extractRequestErrorInfo, findManualPresetIdByOperation, formatEntityRowDisplayTitle, formatRequestError, hasFileTypeOpenHandler, hydrateSettingsValuesFromIndexedDb, inferSettingCoercionKind, isFileNameShownInViewer, isFileTypeShownInViewer, isFileViewerPreviewExtension, isOneWaySettingsIndexedDbCache, isSettingKeyCacheable, isSettingVisibleOnScope, isStoredImageFileId, normalizeAvailableLanguageCodes, normalizeDocumentFileTypePurposes, normalizeDocumentToFileListItem, normalizeOverridableAt, normalizePositiveNumberOption, normalizeRouterUrl, normalizeStoredImageRef, peelSettingValueKey, platformErrorI18nKey, primaryLanguageSubtag, printGraphicFromElement, projectSettingsValuesForIndexedDb, provideAXPUserNotificationService, provideDynamicHomePage, provideMenuMiddleware, purgeLegacyTenantScopedSettingsSnapshots, resolveDateFilterPresets, resolveEffectiveAvailableLanguageCodes, resolveEntityCreateListBehavior, resolveEntityModifyPopupTitle, resolveEntityRowDisplayText, resolveEntityRowDisplayTitle, resolveEntityRowDisplayTitleFromColumnContext, resolveEntitySearchTitleFallback, resolveExplorerFileDisplayName, resolveFileTypeDisplay, resolveFileViewerType, resolveGraphicElementSize, resolveGraphicPrintContent, resolveQueryMatchingDisplayText, resolveSearchDisplayTemplate, resolveSearchableText, resolveStoredImageDisplayUrl, searchInRecordValues, searchInSearchableValue, serializeSvgElement, shouldApplyDefaultMultiLanguageToEntityProperty, shouldApplyDefaultMultiLanguageToWidgetNode, shouldApplyDefaultMultiLanguageToWidgetProperty, shouldPersistSettingsInIndexedDb, stripAccidentalNestedSettingParents, throwIfCommandFailed, toAXPRequestError, toExecuteCommandFailureResult, traceSettingsAppStartupLoadComplete, traceSettingsAppStartupLoadStarted, traceSettingsClientTool, traceSettingsFlush, traceSettingsLocalPersist, traceSettingsPageLoadComplete, traceSettingsPageLoadStarted, traceSettingsPageRouteLoad, traceSettingsRetryScheduled, traceSettingsRevalidateFailed, traceSettingsServerApiCall, traceSettingsServiceLoadComplete, traceSettingsServiceLoadFailed, traceSettingsServiceLoadStarted, traceSettingsServiceReload, traceSettingsSyncFailed, triggerBrowserDownload, tryOpenFileByCatalogType, withDefaultMultiLanguageOnWidgetNodeTree, withDefaultMultiLanguageOnWidgetProperty };
|
|
13742
|
+
export { ALL_DEFAULT_OPERATORS, AXPAcorexFileTypeBridgeProvider, AXPAcorexFileTypeModule, AXPAppVersionService, AXPBackgroundOperationCompletionService, AXPBackgroundOperationEntityStoreService, AXPBackgroundOperationHandler, AXPBackgroundOperationNotificationService, AXPBackgroundOperationProvider, AXPBackgroundOperationRootConfig, AXPBackgroundOperationService, AXPBackgroundOperationSlotComponent, AXPBrowserTitleService, AXPCleanNestedFilters, AXPClipBoardService, AXPCommonModule, AXPCommonSettings, AXPCustomOperatorService, AXPCustomOperatorServiceImpl, AXPDataProvider, AXPDefaultMultiLanguageConfigService, AXPErrorHandlerRegistryService, AXPExportService, AXPFileActionsService, AXPFileChooserSettings, AXPFileStorageEvaluatorScopeProvider, AXPFileStorageService, AXPFileTypeProviderService, AXPFilterOperatorMiddlewareService, AXPFilterOperatorMiddlewareServiceImpl, AXPFooterTextSlotComponent, AXPGlobalErrorHandler, AXPHomePageModule, AXPHomePageService, AXPIndexedDbSettingValueProvider, AXPIntegrationDomainProviderContext, AXPIntegrationDomainRegistryFacade, AXPIntegrationDomainRegistryService, AXPIntegrationOAuthService, AXPIntegrationProviderContext, AXPIntegrationProviderRegistryService, AXPIntegrationRuntimeService, AXPKeyboardShortcutsHelpComponent, AXPKeyboardShortcutsHelpService, AXPLocalEntityEngine, AXPLocalEntityIndexedDb, AXPLocalEntityOfflineRuntime, AXPLocalEntityOutboxService, AXPLocalEntityRealtimeBridge, AXPLockService, AXPLogoImageSrcResolverService, AXPMenuKeyboardShortcutService, AXPMenuMiddlewareRegistry, AXPMenuProviderService, AXPMenuRouteAccessService, AXPMenuRouteGuard, AXPMenuSearchDefinitionProvider, AXPMenuSearchProvider, AXPMenuService, AXPMenuVisibilityService, AXPNavBarSlotComponent, AXPNavigateCommand, AXPNetworkConnectivityService, AXPNotFoundCatchAllRoute, AXPNotFoundError, AXPOutputContractTranscriptSegmentService, AXPPageGetContextQuery, AXPPageRunActionCommand, AXPPlatformBrandingService, AXPPlatformDefaultConfigs, AXPPlatformSettingsLoadState, AXPPlatformSettingsOfflineBootstrapService, AXPQueryEvaluatorScopeProvider, AXPQueryParamsEvaluatorScopeProvider, AXPRegionalCalendarService, AXPSearchCommandProvider, AXPSearchDefinitionActionBuilder, AXPSearchDefinitionBuilder, AXPSearchDefinitionProviderContext, AXPSearchDefinitionProviderService, AXPSearchService, AXPSettingDefaultValuesAggregatorService, AXPSettingDefinitionGroupBuilder, AXPSettingDefinitionProviderContext, AXPSettingDefinitionProviderService, AXPSettingDefinitionSectionBuilder, AXPSettingsBulkSyncService, AXPSettingsEvaluatorScopeProvider, AXPSettingsIndexedDb, AXPSettingsService, AXPStateMessageComponent, AXPStatusDefinitionProviderService, AXPStickyDirective, AXPTabNavigationService, AXPTabPreviewService, AXPTabRouteCacheRegistry, AXPTokenDefinitionService, AXPTokenEvaluatorScopeProvider, AXPTranslateFormatter, AXPUnsavedChangesConfirmService, AXPUnsavedChangesPopstateService, AXPUserNotificationService, AXPVersioningService, AXP_AGENT_OUTPUT_CONTRACT_DEFAULT_STRUCTURED_RETRIES, AXP_APP_VERSION_PROVIDER, AXP_BACKGROUND_OPERATION_ENTITY_STORAGE, AXP_BACKGROUND_OPERATION_HANDLERS, AXP_BACKGROUND_OPERATION_PROVIDERS, AXP_DOCUMENT_FILE_TYPE_PURPOSES, AXP_ENTITY_LIST_DISPLAY_MODE_DEFAULT, AXP_EXPERIENCE_SETTINGS_GROUP, AXP_EXPERIENCE_SETTINGS_SECTIONS, AXP_FILE_ACTION_PROVIDER, AXP_FILE_TYPE_INFO_PROVIDER, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_HOME_TAB_KEY, AXP_INTEGRATION_CONNECTION_ESTABLISHED, AXP_INTEGRATION_CONNECTION_LIFECYCLE, AXP_INTEGRATION_DOMAIN_PROVIDER, AXP_INTEGRATION_OAUTH_SERVICE, AXP_INTEGRATION_PROVIDER, AXP_INTEGRATION_RUNTIME_PROVIDER, AXP_INTEGRATION_SECRET_STORE, AXP_IN_APP_NOTIFICATION_SERVICE, AXP_LOCALE_MANAGEMENT_PORT, AXP_LOCAL_ENTITY_BROADCAST_CHANNEL, AXP_LOCAL_ENTITY_DEFAULT_MAX_ITEMS, AXP_LOCAL_ENTITY_OUTBOX_LOCK, AXP_MENU_MIDDLEWARE, AXP_MENU_PROVIDER, AXP_NOT_FOUND_CATCH_ALL_ROUTE, AXP_NOT_FOUND_ROUTE, AXP_OUTPUT_CONTRACT_TRANSCRIPT_SEGMENT_PROVIDER, AXP_PLATFORM_BRANDING_SETTING_KEYS, AXP_PLATFORM_CONFIG_TOKEN, AXP_PROTECTED_ROUTE_GUARDS, AXP_ROOT_CONFIG_TOKEN, AXP_RUNTIME_QUERY_CACHE_DEFAULTS, AXP_SEARCH_DEFINITION_LAZY_RESOLVER, AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SETTINGS_CACHE_SYNC, AXP_SETTINGS_SYNC_DEBOUNCE_MS, AXP_SETTINGS_SYNC_KEYS, AXP_SETTINGS_SYNC_RETRY_BACKOFF_MS, AXP_SETTINGS_SYNC_TTL_MS, AXP_SETTING_DEFAULT_VALUES_PROVIDERS, AXP_SETTING_DEFINITION_PROVIDER, AXP_SETTING_SCOPE_DESCENDANTS, AXP_SETTING_VALUE_PROVIDER, AXP_STATUS_PROVIDERS, AXP_TAB_BREADCRUMB_JOIN_SEPARATOR, AXP_TAB_ROUTE_DATA_KEY, AXP_TOKEN_DEFINITION_PROVIDER, AXP_UNAUTHORIZED_ROUTE, AXP_USER_NOTIFICATION_SERVICE, AXVChangeType, AX_FILE_TYPE_METADATA_SUPPORT_BY_FILE_VIEWER, BETWEEN_OPER, BOOLEAN_OPERATORS, CONTAINS_OPER, DATE_OPERATORS, DEFAULT_DATE_FILTER_PRESETS, DEFAULT_MULTILANGUAGE_FIELD_NAMES, ENDS_WITH_OPER, ENTITY_LIST_DEFAULT_INSTANCE_ID, ENTITY_LIST_INSTANCE_QUERY_PARAM, ENVIRONMENT, EQ_OPER, FILE_VIEWER_PREVIEW_EXTENSIONS, GTE_OPER, GT_OPER, IN_OPER, IS_EMPTY_OPER, IS_NOT_EMPTY_OPER, LTE_OPER, LT_OPER, MULTILANGUAGE_CAPABLE_WIDGET_TYPES, NOT_CONTAINS_OPER, NOT_EQ_OPER, NUMBER_OPERATORS, SETTINGS_TRACE_NS, SETTINGS_TRACE_TITLE, STARTS_WITH_OPER, STRING_OPERATORS, UploadFromComputerActionProvider, applyDateFilterPreset, axpBackgroundOperationCapabilities, axpBackgroundOperationDisplayTime, axpBackgroundOperationDurationMs, axpBackgroundOperationEntityName, axpBackgroundOperationEstimateEndDate, axpBackgroundOperationFailurePolicy, axpBackgroundOperationFromEntityModel, axpBackgroundOperationRemainingMs, axpBackgroundOperationStatusTextParams, axpBackgroundOperationToEntityModel, axpBeginCommandSubFlowNavigation, axpBuildBackgroundOperation, axpBuildTabKey, axpCoerceBackgroundOperationDate, axpCreateBackgroundOperationId, axpEndCommandSubFlowNavigation, axpEnsureEntityListInstanceQueryParam, axpFallbackTabTitle, axpFindMenuItemByRoute, axpFormatBackgroundOperationDurationMs, axpGetEntityListInstanceIdFromParamMap, axpGetEntityListInstanceIdFromPath, axpGetEntityListInstanceIdFromQueryString, axpGetEntityListReturnUrl, axpGetLeafRouteSnapshot, axpHasTabScope, axpInterpolateNavigatePath, axpIsActiveBackgroundOperationStatus, axpIsBackgroundOperationI18nText, axpIsCommandSubFlowNavigationSuspended, axpIsCompletedBackgroundOperationStatus, axpIsCompletedPanelBackgroundOperation, axpIsEntityDetailsPath, axpIsEntityDetailsViewRoute, axpIsEntityListPath, axpIsEntityListRoute, axpIsEntityRecordNotFound, axpIsInProgressPanelBackgroundOperation, axpIsLikelyNetworkFailure, axpIsTabEligibleUrl, axpIsTrayVisibleBackgroundOperation, axpJoinTabTitleSegments, axpLocalEntityCanServeListLocally, axpLocalEntityHotListRequest, axpLocalEntityIndexedDb, axpLocalEntityRecordId, axpLocalEntitySortAt, axpLocalEntitySupportsOfflineWrite, axpLocalEntityToPayload, axpMenuItemListInstanceId, axpMenuPathsMatch, axpNavigateAppPath, axpNavigateCommandDefinition, axpNormalizeEntityListInstanceId, axpPageGetContextQueryDefinition, axpPageRunActionCommandDefinition, axpParseAppPath, axpParseEntityDetailsRoute, axpParseEntityListRoute, axpPathFromSnapshot, axpPeekCommandSubFlowReturnUrl, axpPlatformSettingsAvailableGuard, axpRedirectToNotFound, axpRedirectToUnauthorized, axpReplaceEntityListRouteQueryParams, axpResolveNavigatePath, axpResolveTabKey, axpResolveTabKeyFromRouteConfig, axpResolveTabKeyFromSnapshot, axpResolveTabTitleParts, axpSaveEntityListReturnUrl, axpSettingsIndexedDb, axpStampEntityListMenuInstancePaths, backgroundOperationEntityFactory, buildFileStorageDownloadUrl, buildLocalEntityMetaId, buildLocalEntityStorageId, buildScopedSettingsSnapshotId, chooseSystemFiles, coerceAXPSettingRawValue, coerceAXPSettingRawValueByKind, configPlatform, createBackgroundOperationStore, createDefaultSettingValueProviders, createEmptyScopedSettingsSnapshot, createEntityCommandOptions, createEntityRowExpressionScope, createEntitySearchCommand, createFileTypeOpenContext, createIndexedDbSettingValueProviders, createMenuContext, createMenuMiddleware, createUnsavedChangesCanDeactivateGuard, downloadGraphicFromElement, evaluateEntityDisplayTemplate, extractFileExtension, extractHttpRequestErrorInfo, extractRequestErrorInfo, findManualPresetIdByOperation, formatEntityRowDisplayTitle, formatRequestError, hasFileTypeOpenHandler, hydrateSettingsValuesFromIndexedDb, inferSettingCoercionKind, isFileNameShownInViewer, isFileTypeShownInViewer, isFileViewerPreviewExtension, isOneWaySettingsIndexedDbCache, isSettingKeyCacheable, isSettingVisibleOnScope, isStoredImageFileId, normalizeAvailableLanguageCodes, normalizeDocumentFileTypePurposes, normalizeDocumentToFileListItem, normalizeOverridableAt, normalizePositiveNumberOption, normalizeRouterUrl, normalizeStoredImageRef, peelSettingValueKey, platformErrorI18nKey, primaryLanguageSubtag, printGraphicFromElement, projectSettingsValuesForIndexedDb, provideAXPUserNotificationService, provideDynamicHomePage, provideLocalEntityOfflineRuntime, provideMenuMiddleware, purgeLegacyTenantScopedSettingsSnapshots, resolveDateFilterPresets, resolveEffectiveAvailableLanguageCodes, resolveEntityCreateListBehavior, resolveEntityModifyPopupTitle, resolveEntityRowDisplayText, resolveEntityRowDisplayTitle, resolveEntityRowDisplayTitleFromColumnContext, resolveEntitySearchTitleFallback, resolveExplorerFileDisplayName, resolveFileTypeDisplay, resolveFileViewerType, resolveGraphicElementSize, resolveGraphicPrintContent, resolveQueryMatchingDisplayText, resolveSearchDisplayTemplate, resolveSearchableText, resolveStoredImageDisplayUrl, searchInRecordValues, searchInSearchableValue, serializeSvgElement, shouldApplyDefaultMultiLanguageToEntityProperty, shouldApplyDefaultMultiLanguageToWidgetNode, shouldApplyDefaultMultiLanguageToWidgetProperty, shouldPersistSettingsInIndexedDb, stripAccidentalNestedSettingParents, throwIfCommandFailed, toAXPRequestError, toExecuteCommandFailureResult, traceSettingsAppStartupLoadComplete, traceSettingsAppStartupLoadStarted, traceSettingsClientTool, traceSettingsFlush, traceSettingsLocalPersist, traceSettingsPageLoadComplete, traceSettingsPageLoadStarted, traceSettingsPageRouteLoad, traceSettingsRetryScheduled, traceSettingsRevalidateFailed, traceSettingsServerApiCall, traceSettingsServiceLoadComplete, traceSettingsServiceLoadFailed, traceSettingsServiceLoadStarted, traceSettingsServiceReload, traceSettingsSyncFailed, triggerBrowserDownload, tryOpenFileByCatalogType, withDefaultMultiLanguageOnWidgetNodeTree, withDefaultMultiLanguageOnWidgetProperty };
|
|
12971
13743
|
//# sourceMappingURL=acorex-platform-framework-client-common.mjs.map
|