@acorex/platform 21.0.0-next.89 → 21.0.0-next.91
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-auth.mjs +1 -1
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/acorex-platform-common-common-settings.provider-DilV4dql.mjs.map +1 -1
- package/fesm2022/acorex-platform-common.mjs +3 -10
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-contracts.mjs +1737 -27
- package/fesm2022/acorex-platform-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +28 -1712
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-domain-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-components.mjs +3 -3
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity-attachments-page.component-CwG6n_Yb.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity-contracts.mjs +27 -1
- package/fesm2022/acorex-platform-layout-entity-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity-file-list-popup.component--IeMZLIr.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +355 -122
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +77 -16
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +89 -11
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-CFyfix31.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-CZc2zFlg.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-BvFykMTH.mjs} +2 -2
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-BvFykMTH.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-XWRUVoL4.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-CntopmDS.mjs} +2 -2
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-XWRUVoL4.mjs.map → acorex-platform-layout-widgets-tabular-data-view-popup.component-CntopmDS.mjs.map} +1 -1
- package/fesm2022/acorex-platform-layout-widgets.mjs +5 -7
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-DrUwqKKA.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default.mjs +15 -5
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-settings.provider-UyKdkeyk.mjs → acorex-platform-themes-shared-settings.provider-DxtfyNGS.mjs} +2 -2
- package/fesm2022/acorex-platform-themes-shared-settings.provider-DxtfyNGS.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared.mjs +2 -2
- package/fesm2022/acorex-platform-workflow.mjs +2 -2
- package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-common.d.ts +3 -5
- package/types/acorex-platform-contracts.d.ts +863 -7
- package/types/acorex-platform-core.d.ts +65 -922
- package/types/acorex-platform-layout-builder.d.ts +3 -3
- package/types/acorex-platform-layout-components.d.ts +6 -6
- package/types/acorex-platform-layout-designer.d.ts +4 -5
- package/types/acorex-platform-layout-entity-contracts.d.ts +94 -3
- package/types/acorex-platform-layout-entity.d.ts +72 -103
- package/types/acorex-platform-layout-views.d.ts +19 -12
- package/types/acorex-platform-layout-widget-core.d.ts +89 -77
- package/types/acorex-platform-layout-widgets.d.ts +9 -8
- package/types/acorex-platform-themes-default.d.ts +4 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-CZc2zFlg.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-settings.provider-UyKdkeyk.mjs.map +0 -1
|
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { InjectionToken, inject, Injectable, Directive, computed, Injector, ChangeDetectionStrategy, Component, input, ElementRef, ViewContainerRef, signal, effect, runInInjectionContext, Optional, Inject, NgModule, EventEmitter, HostListener, Output, DestroyRef, untracked, provideAppInitializer, Pipe } from '@angular/core';
|
|
3
3
|
import { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
|
|
4
4
|
import { AXDataSource } from '@acorex/cdk/common';
|
|
5
|
-
import { AXPPlatformCoreDataSourceKeys,
|
|
6
|
-
import {
|
|
5
|
+
import { AXPPlatformCoreDataSourceKeys, isFormContextDirty, summarizeFormContextDirtyDiff, getSmart, isSelectionValueEqual, isFormValueEqual, setSmart, extractValue, getSystemActions, isLocaleStringMap } from '@acorex/platform/contracts';
|
|
6
|
+
import { cloneDeep, isEmpty, isEqual, has, unset, isPlainObject, get, sortBy, set, isUndefined, isNil, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
|
|
7
7
|
import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
|
|
8
8
|
import { AXFormatService } from '@acorex/core/format';
|
|
9
9
|
import * as i1 from '@acorex/components/skeleton';
|
|
@@ -805,704 +805,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
805
805
|
/** Trace namespace for form dirty-state diagnostics (lookup/select revert, discard, baseline). */
|
|
806
806
|
const FORM_DIRTY_TRACE_NS = 'FORM STATE';
|
|
807
807
|
|
|
808
|
-
//#region ---- Locale map shape ----
|
|
809
|
-
/** Per-locale string map (`{ 'en-US': '...', 'fa-IR': '...' }`). */
|
|
810
|
-
function isLocaleStringMap(value) {
|
|
811
|
-
if (!isPlainObject(value)) {
|
|
812
|
-
return false;
|
|
813
|
-
}
|
|
814
|
-
const entries = Object.values(value);
|
|
815
|
-
if (entries.length === 0) {
|
|
816
|
-
return false;
|
|
817
|
-
}
|
|
818
|
-
return entries.every((entry) => entry === null || entry === undefined || typeof entry === 'string');
|
|
819
|
-
}
|
|
820
|
-
/**
|
|
821
|
-
* Use locale-map read/write when the option is on or live/saved data is already a map.
|
|
822
|
-
* Auto-enables when API data is a map but the editor option was left off.
|
|
823
|
-
*/
|
|
824
|
-
function shouldUseLocaleMapShape(localeMapOptionEnabled, current, saved) {
|
|
825
|
-
return localeMapOptionEnabled || isLocaleStringMap(current) || isLocaleStringMap(saved);
|
|
826
|
-
}
|
|
827
|
-
/** Updates one locale entry; preserves sibling locales from current or saved map. */
|
|
828
|
-
function buildLocaleTextMapValue(current, saved, lang, input) {
|
|
829
|
-
const seed = isLocaleStringMap(current)
|
|
830
|
-
? { ...current }
|
|
831
|
-
: isLocaleStringMap(saved)
|
|
832
|
-
? { ...saved }
|
|
833
|
-
: {};
|
|
834
|
-
seed[lang] = input ?? '';
|
|
835
|
-
for (const key of Object.keys(seed)) {
|
|
836
|
-
if ((seed[key] ?? '').trim() === '') {
|
|
837
|
-
delete seed[key];
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
return Object.keys(seed).length === 0 ? null : seed;
|
|
841
|
-
}
|
|
842
|
-
//#endregion
|
|
843
|
-
|
|
844
|
-
function extractNestedFieldsWildcard(obj, basePath, fields) {
|
|
845
|
-
const result = {};
|
|
846
|
-
if (fields.length === 1 && fields[0] === '*') {
|
|
847
|
-
const fullObj = get(obj, basePath);
|
|
848
|
-
return isPlainObject(fullObj) ? fullObj : {};
|
|
849
|
-
}
|
|
850
|
-
for (const field of fields) {
|
|
851
|
-
const fullPath = basePath ? `${basePath}.${field}` : field;
|
|
852
|
-
const value = get(obj, fullPath);
|
|
853
|
-
set(result, field, value);
|
|
854
|
-
}
|
|
855
|
-
return result;
|
|
856
|
-
}
|
|
857
|
-
function setSmart(obj, smartPath, value) {
|
|
858
|
-
const pathParts = smartPath.split('.');
|
|
859
|
-
const lastPart = pathParts[pathParts.length - 1];
|
|
860
|
-
const fieldMatch = lastPart.match(/^\{(.+)\}$/);
|
|
861
|
-
if (!fieldMatch) {
|
|
862
|
-
// Fix: If value is undefined and we're setting a nested property,
|
|
863
|
-
// check if the parent object exists and if setting this would result in
|
|
864
|
-
// all properties being undefined. If so, set the parent to null instead.
|
|
865
|
-
if (isNil(value) && pathParts.length > 1) {
|
|
866
|
-
const parentPath = pathParts.slice(0, -1).join('.');
|
|
867
|
-
const parentObj = get(obj, parentPath);
|
|
868
|
-
// If parent is already null/undefined, don't recreate the object structure
|
|
869
|
-
if (isNil(parentObj)) {
|
|
870
|
-
return obj;
|
|
871
|
-
}
|
|
872
|
-
// Check if parent is a plain object (not array, not null)
|
|
873
|
-
if (isPlainObject(parentObj)) {
|
|
874
|
-
const existingKeys = Object.keys(parentObj);
|
|
875
|
-
// Check if all existing properties are null/undefined using lodash
|
|
876
|
-
const allNil = isEmpty(existingKeys) || existingKeys.every((key) => isNil(parentObj[key]));
|
|
877
|
-
if (allNil) {
|
|
878
|
-
// Set parent to null instead of creating/keeping an object with all undefined properties
|
|
879
|
-
set(obj, parentPath, null);
|
|
880
|
-
return obj;
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
}
|
|
884
|
-
set(obj, smartPath, value);
|
|
885
|
-
// After setting, check again if parent should be null using lodash
|
|
886
|
-
if (isNil(value) && pathParts.length > 1) {
|
|
887
|
-
const parentPath = pathParts.slice(0, -1).join('.');
|
|
888
|
-
const parentObj = get(obj, parentPath);
|
|
889
|
-
if (isPlainObject(parentObj)) {
|
|
890
|
-
// Use lodash to check if all properties are null/undefined
|
|
891
|
-
const allNil = Object.keys(parentObj).every((key) => isNil(parentObj[key]));
|
|
892
|
-
if (allNil) {
|
|
893
|
-
set(obj, parentPath, null);
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
|
-
return obj;
|
|
898
|
-
}
|
|
899
|
-
const fields = fieldMatch[1].split(',').map((f) => f.trim());
|
|
900
|
-
const basePath = pathParts.slice(0, -1).join('.');
|
|
901
|
-
const [arrayKey, ...restPath] = basePath.split('.');
|
|
902
|
-
// Make sure the array exists
|
|
903
|
-
if (!obj[arrayKey])
|
|
904
|
-
obj[arrayKey] = [];
|
|
905
|
-
// 🟡 Case A: value is array (normal set)
|
|
906
|
-
if (isArray(value)) {
|
|
907
|
-
for (let i = 0; i < value.length; i++) {
|
|
908
|
-
const item = value[i];
|
|
909
|
-
const targetItem = obj[arrayKey][i] ?? {};
|
|
910
|
-
const nested = {};
|
|
911
|
-
if (restPath.length > 0) {
|
|
912
|
-
const picked = extractNestedFieldsWildcard(item, restPath.join('.'), fields);
|
|
913
|
-
set(nested, restPath.join('.'), picked);
|
|
914
|
-
}
|
|
915
|
-
else {
|
|
916
|
-
const picked = extractNestedFieldsWildcard(item, '', fields);
|
|
917
|
-
Object.assign(nested, picked);
|
|
918
|
-
}
|
|
919
|
-
obj[arrayKey][i] = merge({}, targetItem, nested);
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
// 🟢 Case B: value is a single value → broadcast
|
|
923
|
-
else {
|
|
924
|
-
for (let i = 0; i < obj[arrayKey].length; i++) {
|
|
925
|
-
const targetItem = obj[arrayKey][i] ?? {};
|
|
926
|
-
const nested = {};
|
|
927
|
-
if (restPath.length > 0) {
|
|
928
|
-
for (const field of fields) {
|
|
929
|
-
set(nested, `${restPath.join('.')}.${field}`, value);
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
else {
|
|
933
|
-
for (const field of fields) {
|
|
934
|
-
set(nested, field, value);
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
obj[arrayKey][i] = merge({}, targetItem, nested);
|
|
938
|
-
}
|
|
939
|
-
}
|
|
940
|
-
return obj;
|
|
941
|
-
}
|
|
942
|
-
function extractFieldsFromPath(obj, basePath, fields) {
|
|
943
|
-
if (fields.length === 1 && fields[0] === '*') {
|
|
944
|
-
const fullObj = basePath ? get(obj, basePath) : obj;
|
|
945
|
-
return isPlainObject(fullObj) ? fullObj : {};
|
|
946
|
-
}
|
|
947
|
-
const result = {};
|
|
948
|
-
for (const field of fields) {
|
|
949
|
-
const fullPath = basePath ? `${basePath}.${field}` : field;
|
|
950
|
-
const val = get(obj, fullPath);
|
|
951
|
-
if (val !== undefined) {
|
|
952
|
-
result[field] = val;
|
|
953
|
-
}
|
|
954
|
-
}
|
|
955
|
-
return result;
|
|
956
|
-
}
|
|
957
|
-
function getSmart(obj, smartPath) {
|
|
958
|
-
const pathParts = smartPath.split('.');
|
|
959
|
-
const lastPart = pathParts[pathParts.length - 1];
|
|
960
|
-
const fieldMatch = lastPart.match(/^\{(.+)\}$/);
|
|
961
|
-
// Simple get (no fields)
|
|
962
|
-
if (!fieldMatch) {
|
|
963
|
-
return get(obj, smartPath);
|
|
964
|
-
}
|
|
965
|
-
const fields = fieldMatch[1].split(',').map((f) => f.trim());
|
|
966
|
-
const basePath = pathParts.slice(0, -1).join('.');
|
|
967
|
-
const items = get(obj, basePath);
|
|
968
|
-
if (!isArray(items))
|
|
969
|
-
return [];
|
|
970
|
-
const nestedPath = basePath.includes('.') ? basePath.split('.').slice(1).join('.') : '';
|
|
971
|
-
return items.map((item) => {
|
|
972
|
-
return extractFieldsFromPath(item, nestedPath, fields);
|
|
973
|
-
});
|
|
974
|
-
}
|
|
975
|
-
function extractValue(value, key = 'id') {
|
|
976
|
-
if (isNil(value)) {
|
|
977
|
-
return null;
|
|
978
|
-
}
|
|
979
|
-
return isObjectLike(value) ? get(value, key) : value;
|
|
980
|
-
}
|
|
981
|
-
function cleanDeep(obj) {
|
|
982
|
-
return transform(obj, (result, value, key) => {
|
|
983
|
-
if (isObjectLike(value)) {
|
|
984
|
-
const cleaned = cleanDeep(value);
|
|
985
|
-
if (!isEmpty(cleaned)) {
|
|
986
|
-
result[key] = cleaned;
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
else if (!isNil(value) && // not null or undefined
|
|
990
|
-
!(typeof value === 'string' && value.trim() === '') && // not empty string
|
|
991
|
-
!(Array.isArray(value) && value.length === 0) // not empty array
|
|
992
|
-
) {
|
|
993
|
-
result[key] = value;
|
|
994
|
-
}
|
|
995
|
-
});
|
|
996
|
-
}
|
|
997
|
-
function getDeepChanges(obj1, obj2) {
|
|
998
|
-
const changes = [];
|
|
999
|
-
function walk(o1, o2, currentPath = []) {
|
|
1000
|
-
// If both values are deeply equal, skip
|
|
1001
|
-
if (isEqual(o1, o2))
|
|
1002
|
-
return;
|
|
1003
|
-
const isObj1Nil = o1 === null || o1 === undefined;
|
|
1004
|
-
const isObj2Nil = o2 === null || o2 === undefined;
|
|
1005
|
-
// If obj1 is null/undefined and obj2 is not, treat entire obj2 as added
|
|
1006
|
-
if (isObj1Nil && !isObj2Nil) {
|
|
1007
|
-
if (isPlainObject(o2)) {
|
|
1008
|
-
for (const key of Object.keys(o2)) {
|
|
1009
|
-
walk(undefined, o2[key], [...currentPath, key]);
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
else if (Array.isArray(o2)) {
|
|
1013
|
-
changes.push({
|
|
1014
|
-
path: currentPath.join('.'),
|
|
1015
|
-
oldValue: undefined,
|
|
1016
|
-
newValue: o2,
|
|
1017
|
-
arrayDiff: {
|
|
1018
|
-
added: o2,
|
|
1019
|
-
removed: [],
|
|
1020
|
-
},
|
|
1021
|
-
});
|
|
1022
|
-
}
|
|
1023
|
-
else {
|
|
1024
|
-
changes.push({
|
|
1025
|
-
path: currentPath.join('.'),
|
|
1026
|
-
oldValue: undefined,
|
|
1027
|
-
newValue: o2,
|
|
1028
|
-
});
|
|
1029
|
-
}
|
|
1030
|
-
return;
|
|
1031
|
-
}
|
|
1032
|
-
// If obj2 is null/undefined and obj1 is not, treat entire obj1 as removed
|
|
1033
|
-
if (!isObj1Nil && isObj2Nil) {
|
|
1034
|
-
if (isPlainObject(o1)) {
|
|
1035
|
-
for (const key of Object.keys(o1)) {
|
|
1036
|
-
walk(o1[key], undefined, [...currentPath, key]);
|
|
1037
|
-
}
|
|
1038
|
-
}
|
|
1039
|
-
else if (Array.isArray(o1)) {
|
|
1040
|
-
changes.push({
|
|
1041
|
-
path: currentPath.join('.'),
|
|
1042
|
-
oldValue: o1,
|
|
1043
|
-
newValue: undefined,
|
|
1044
|
-
arrayDiff: {
|
|
1045
|
-
added: [],
|
|
1046
|
-
removed: o1,
|
|
1047
|
-
},
|
|
1048
|
-
});
|
|
1049
|
-
}
|
|
1050
|
-
else {
|
|
1051
|
-
changes.push({
|
|
1052
|
-
path: currentPath.join('.'),
|
|
1053
|
-
oldValue: o1,
|
|
1054
|
-
newValue: undefined,
|
|
1055
|
-
});
|
|
1056
|
-
}
|
|
1057
|
-
return;
|
|
1058
|
-
}
|
|
1059
|
-
// If both are arrays, compare items
|
|
1060
|
-
if (Array.isArray(o1) && Array.isArray(o2)) {
|
|
1061
|
-
if (!isEqual(o1, o2)) {
|
|
1062
|
-
const added = differenceWith(o2, o1, isEqual);
|
|
1063
|
-
const removed = differenceWith(o1, o2, isEqual);
|
|
1064
|
-
changes.push({
|
|
1065
|
-
path: currentPath.join('.'),
|
|
1066
|
-
oldValue: o1,
|
|
1067
|
-
newValue: o2,
|
|
1068
|
-
arrayDiff: {
|
|
1069
|
-
added,
|
|
1070
|
-
removed,
|
|
1071
|
-
},
|
|
1072
|
-
});
|
|
1073
|
-
}
|
|
1074
|
-
return;
|
|
1075
|
-
}
|
|
1076
|
-
// If both are plain objects, walk each key
|
|
1077
|
-
if (isPlainObject(o1) && isPlainObject(o2)) {
|
|
1078
|
-
const allKeys = union(Object.keys(o1), Object.keys(o2));
|
|
1079
|
-
for (const key of allKeys) {
|
|
1080
|
-
walk(o1[key], o2[key], [...currentPath, key]);
|
|
1081
|
-
}
|
|
1082
|
-
return;
|
|
1083
|
-
}
|
|
1084
|
-
// Primitive values or mismatched types
|
|
1085
|
-
changes.push({
|
|
1086
|
-
path: currentPath.join('.'),
|
|
1087
|
-
oldValue: o1,
|
|
1088
|
-
newValue: o2,
|
|
1089
|
-
});
|
|
1090
|
-
}
|
|
1091
|
-
walk(obj1, obj2);
|
|
1092
|
-
return changes;
|
|
1093
|
-
}
|
|
1094
|
-
// Method 1: Returns only changed paths
|
|
1095
|
-
function getChangedPaths(obj1, obj2) {
|
|
1096
|
-
return getDeepChanges(obj1, obj2).map((change) => change.path);
|
|
1097
|
-
}
|
|
1098
|
-
// Method 2: Returns full change entries
|
|
1099
|
-
function getDetailedChanges(obj1, obj2) {
|
|
1100
|
-
return getDeepChanges(obj1, obj2);
|
|
1101
|
-
}
|
|
1102
|
-
function getEnumValues(enumType) {
|
|
1103
|
-
return Object.entries(enumType).map(([key, value]) => ({ id: value, title: key }));
|
|
1104
|
-
}
|
|
1105
|
-
//#region ---- Form value equality (dirty / baseline) ----
|
|
1106
|
-
/** Whether a value uses the multi-language text widget shape (string or locale map). */
|
|
1107
|
-
function isMultiLanguageFormShape(value) {
|
|
1108
|
-
if (value === null || value === undefined) {
|
|
1109
|
-
return true;
|
|
1110
|
-
}
|
|
1111
|
-
if (typeof value === 'string') {
|
|
1112
|
-
return true;
|
|
1113
|
-
}
|
|
1114
|
-
return isLocaleStringMap(value);
|
|
1115
|
-
}
|
|
1116
|
-
/** Drops empty/whitespace locale entries from a multi-language map. */
|
|
1117
|
-
function normalizeLocaleStringMap(value) {
|
|
1118
|
-
const normalized = {};
|
|
1119
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
1120
|
-
if (typeof entry !== 'string') {
|
|
1121
|
-
continue;
|
|
1122
|
-
}
|
|
1123
|
-
const trimmed = entry.trim();
|
|
1124
|
-
if (trimmed !== '') {
|
|
1125
|
-
normalized[key] = trimmed;
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
return Object.keys(normalized).length === 0 ? null : normalized;
|
|
1129
|
-
}
|
|
1130
|
-
function compareMultiLanguageLocaleStrings(a, b) {
|
|
1131
|
-
const htmlEqual = compareHtmlFormValues(a, b);
|
|
1132
|
-
if (htmlEqual !== null) {
|
|
1133
|
-
return htmlEqual;
|
|
1134
|
-
}
|
|
1135
|
-
return a === b;
|
|
1136
|
-
}
|
|
1137
|
-
/**
|
|
1138
|
-
* Compares multi-language field values (plain string vs locale map) for dirty/baseline checks.
|
|
1139
|
-
* Returns `null` when either side is not a multi-language shape (caller uses generic normalization).
|
|
1140
|
-
*/
|
|
1141
|
-
function compareMultiLanguageFormValues(a, b) {
|
|
1142
|
-
if (!isMultiLanguageFormShape(a) || !isMultiLanguageFormShape(b)) {
|
|
1143
|
-
return null;
|
|
1144
|
-
}
|
|
1145
|
-
const normalizeScalar = (value) => {
|
|
1146
|
-
if (value === null || value === undefined) {
|
|
1147
|
-
return null;
|
|
1148
|
-
}
|
|
1149
|
-
if (typeof value === 'string') {
|
|
1150
|
-
const trimmed = value.trim();
|
|
1151
|
-
return trimmed === '' ? null : trimmed;
|
|
1152
|
-
}
|
|
1153
|
-
if (isLocaleStringMap(value)) {
|
|
1154
|
-
return normalizeLocaleStringMap(value);
|
|
1155
|
-
}
|
|
1156
|
-
return null;
|
|
1157
|
-
};
|
|
1158
|
-
const left = normalizeScalar(a);
|
|
1159
|
-
const right = normalizeScalar(b);
|
|
1160
|
-
if (left === null && right === null) {
|
|
1161
|
-
return true;
|
|
1162
|
-
}
|
|
1163
|
-
if (left === null || right === null) {
|
|
1164
|
-
return false;
|
|
1165
|
-
}
|
|
1166
|
-
if (typeof left === 'string' && typeof right === 'string') {
|
|
1167
|
-
return compareMultiLanguageLocaleStrings(left, right);
|
|
1168
|
-
}
|
|
1169
|
-
if (typeof left === 'string' && typeof right === 'object') {
|
|
1170
|
-
return Object.values(right).some((text) => typeof text === 'string' && compareMultiLanguageLocaleStrings(left, text));
|
|
1171
|
-
}
|
|
1172
|
-
if (typeof right === 'string' && typeof left === 'object') {
|
|
1173
|
-
return Object.values(left).some((text) => typeof text === 'string' && compareMultiLanguageLocaleStrings(right, text));
|
|
1174
|
-
}
|
|
1175
|
-
if (typeof left !== 'object' || typeof right !== 'object') {
|
|
1176
|
-
return false;
|
|
1177
|
-
}
|
|
1178
|
-
const leftMap = left;
|
|
1179
|
-
const rightMap = right;
|
|
1180
|
-
const leftKeys = Object.keys(leftMap).sort();
|
|
1181
|
-
const rightKeys = Object.keys(rightMap).sort();
|
|
1182
|
-
if (leftKeys.length !== rightKeys.length) {
|
|
1183
|
-
return false;
|
|
1184
|
-
}
|
|
1185
|
-
return leftKeys.every((key) => compareMultiLanguageLocaleStrings(leftMap[key], rightMap[key]));
|
|
1186
|
-
}
|
|
1187
|
-
/**
|
|
1188
|
-
* Lookup/select expose may write a resolved MLS string while the baseline keeps the locale map.
|
|
1189
|
-
* Restore baseline shape when the string matches any locale entry.
|
|
1190
|
-
*/
|
|
1191
|
-
function shouldRestoreSavedMultiLanguageShape(value, savedAtPath) {
|
|
1192
|
-
if (typeof value !== 'string' || !isLocaleStringMap(savedAtPath)) {
|
|
1193
|
-
return false;
|
|
1194
|
-
}
|
|
1195
|
-
const trimmed = value.trim();
|
|
1196
|
-
if (trimmed === '') {
|
|
1197
|
-
return false;
|
|
1198
|
-
}
|
|
1199
|
-
return Object.values(savedAtPath).some((entry) => typeof entry === 'string' && entry.trim() === trimmed);
|
|
1200
|
-
}
|
|
1201
|
-
/** Decode common HTML entities for rich-text baseline compare. */
|
|
1202
|
-
function decodeHtmlEntities(value) {
|
|
1203
|
-
return value
|
|
1204
|
-
.replace(/&#x([0-9a-f]+);/gi, (_, hex) => String.fromCharCode(parseInt(hex, 16)))
|
|
1205
|
-
.replace(/&#(\d+);/g, (_, dec) => String.fromCharCode(parseInt(dec, 10)))
|
|
1206
|
-
.replace(/&/g, '&')
|
|
1207
|
-
.replace(/</g, '<')
|
|
1208
|
-
.replace(/>/g, '>')
|
|
1209
|
-
.replace(/"/g, '"');
|
|
1210
|
-
}
|
|
1211
|
-
function looksLikeHtmlFormValue(value) {
|
|
1212
|
-
return /<[a-z][\s\S]*>/i.test(value.trim());
|
|
1213
|
-
}
|
|
1214
|
-
/** Normalizes rich-text HTML for semantic dirty/baseline compare (e.g. Quill `p`/`br` drift). */
|
|
1215
|
-
function normalizeRichTextHtmlForCompare(value) {
|
|
1216
|
-
const html = decodeHtmlEntities(value.trim());
|
|
1217
|
-
if (typeof document === 'undefined') {
|
|
1218
|
-
return html.replace(/\s+/g, ' ').trim();
|
|
1219
|
-
}
|
|
1220
|
-
const doc = new DOMParser().parseFromString(html, 'text/html');
|
|
1221
|
-
return (doc.body.textContent ?? '').replace(/\s+/g, ' ').trim();
|
|
1222
|
-
}
|
|
1223
|
-
/**
|
|
1224
|
-
* Compares rich-text HTML strings by visible text (ignores `p` vs `br` structure drift).
|
|
1225
|
-
* Returns `null` when either side is not HTML markup.
|
|
1226
|
-
*/
|
|
1227
|
-
function compareHtmlFormValues(a, b) {
|
|
1228
|
-
if (typeof a !== 'string' || typeof b !== 'string') {
|
|
1229
|
-
return null;
|
|
1230
|
-
}
|
|
1231
|
-
if (!looksLikeHtmlFormValue(a) || !looksLikeHtmlFormValue(b)) {
|
|
1232
|
-
return null;
|
|
1233
|
-
}
|
|
1234
|
-
return normalizeRichTextHtmlForCompare(a) === normalizeRichTextHtmlForCompare(b);
|
|
1235
|
-
}
|
|
1236
|
-
/** Lookup/select filter-mode payload: `{ value, displayText?, operation }`. */
|
|
1237
|
-
function isFilterFormShape(value) {
|
|
1238
|
-
if (!isPlainObject(value)) {
|
|
1239
|
-
return false;
|
|
1240
|
-
}
|
|
1241
|
-
const record = value;
|
|
1242
|
-
return 'value' in record && 'operation' in record;
|
|
1243
|
-
}
|
|
1244
|
-
/**
|
|
1245
|
-
* Compares filter-mode widget values by selection identity; ignores derived `displayText`.
|
|
1246
|
-
*/
|
|
1247
|
-
function compareFilterFormValues(a, b) {
|
|
1248
|
-
if (!isFilterFormShape(a) || !isFilterFormShape(b)) {
|
|
1249
|
-
return null;
|
|
1250
|
-
}
|
|
1251
|
-
const left = a;
|
|
1252
|
-
const right = b;
|
|
1253
|
-
if (!isFormValueEqual(left['value'], right['value'])) {
|
|
1254
|
-
return false;
|
|
1255
|
-
}
|
|
1256
|
-
const opLeft = get(left, 'operation.type');
|
|
1257
|
-
const opRight = get(right, 'operation.type');
|
|
1258
|
-
if (opLeft !== undefined || opRight !== undefined) {
|
|
1259
|
-
return opLeft === opRight;
|
|
1260
|
-
}
|
|
1261
|
-
return true;
|
|
1262
|
-
}
|
|
1263
|
-
function isReferenceScalar(value) {
|
|
1264
|
-
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
1265
|
-
}
|
|
1266
|
-
/** Scalar id or `{ id }` identity used by lookup/select widgets. */
|
|
1267
|
-
function getReferenceId(value) {
|
|
1268
|
-
if (isNil(value)) {
|
|
1269
|
-
return undefined;
|
|
1270
|
-
}
|
|
1271
|
-
if (isReferenceScalar(value)) {
|
|
1272
|
-
return value;
|
|
1273
|
-
}
|
|
1274
|
-
if (isPlainObject(value)) {
|
|
1275
|
-
const id = get(value, 'id');
|
|
1276
|
-
if (!isNil(id)) {
|
|
1277
|
-
return id;
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
return undefined;
|
|
1281
|
-
}
|
|
1282
|
-
/**
|
|
1283
|
-
* Compares scalar selection ids to full lookup/select items (`5` vs `{ id: 5, ... }`).
|
|
1284
|
-
* Does not apply when both sides are objects — those use structural compare so field edits stay dirty.
|
|
1285
|
-
*/
|
|
1286
|
-
function compareReferenceFormValues(a, b) {
|
|
1287
|
-
const refA = getReferenceId(a);
|
|
1288
|
-
const refB = getReferenceId(b);
|
|
1289
|
-
if (refA === undefined || refB === undefined) {
|
|
1290
|
-
return null;
|
|
1291
|
-
}
|
|
1292
|
-
const aIsScalar = isReferenceScalar(a);
|
|
1293
|
-
const bIsScalar = isReferenceScalar(b);
|
|
1294
|
-
if (!aIsScalar && !bIsScalar) {
|
|
1295
|
-
return null;
|
|
1296
|
-
}
|
|
1297
|
-
return isEqual(normalizeFormValue(refA), normalizeFormValue(refB));
|
|
1298
|
-
}
|
|
1299
|
-
/**
|
|
1300
|
-
* Semantic equality for lookup/select values when restoring saved baseline shape.
|
|
1301
|
-
* Compares by selection identity (id), including two full items with the same id.
|
|
1302
|
-
*/
|
|
1303
|
-
function isSelectionValueEqual(a, b) {
|
|
1304
|
-
const filterEqual = compareFilterFormValues(a, b);
|
|
1305
|
-
if (filterEqual !== null) {
|
|
1306
|
-
return filterEqual;
|
|
1307
|
-
}
|
|
1308
|
-
const refA = getReferenceId(a);
|
|
1309
|
-
const refB = getReferenceId(b);
|
|
1310
|
-
if (refA !== undefined && refB !== undefined) {
|
|
1311
|
-
return isEqual(normalizeFormValue(refA), normalizeFormValue(refB));
|
|
1312
|
-
}
|
|
1313
|
-
return isFormValueEqual(a, b);
|
|
1314
|
-
}
|
|
1315
|
-
/**
|
|
1316
|
-
* Stable sort key for order-insensitive array comparison (after normalization).
|
|
1317
|
-
*/
|
|
1318
|
-
function formValueSortKey(value) {
|
|
1319
|
-
if (value === null) {
|
|
1320
|
-
return '\0';
|
|
1321
|
-
}
|
|
1322
|
-
if (typeof value === 'number') {
|
|
1323
|
-
return `n:${value}`;
|
|
1324
|
-
}
|
|
1325
|
-
if (typeof value === 'boolean') {
|
|
1326
|
-
return `b:${value}`;
|
|
1327
|
-
}
|
|
1328
|
-
if (typeof value === 'string') {
|
|
1329
|
-
return `s:${value}`;
|
|
1330
|
-
}
|
|
1331
|
-
try {
|
|
1332
|
-
return `j:${JSON.stringify(value)}`;
|
|
1333
|
-
}
|
|
1334
|
-
catch {
|
|
1335
|
-
return `u:${String(value)}`;
|
|
1336
|
-
}
|
|
1337
|
-
}
|
|
1338
|
-
/**
|
|
1339
|
-
* Sorts normalized array items so order does not affect dirty checks.
|
|
1340
|
-
*/
|
|
1341
|
-
function sortNormalizedArrayItems(items) {
|
|
1342
|
-
return [...items].sort((a, b) => formValueSortKey(a).localeCompare(formValueSortKey(b)));
|
|
1343
|
-
}
|
|
1344
|
-
/**
|
|
1345
|
-
* Normalizes a form/context value for semantic baseline comparison.
|
|
1346
|
-
*
|
|
1347
|
-
* Rules:
|
|
1348
|
-
* - `null`, `undefined`, whitespace-only strings, and empty arrays → `null` (empty)
|
|
1349
|
-
* - Numeric strings → numbers (`"5"` and `5` match)
|
|
1350
|
-
* - Arrays → elements normalized; empty/all-empty → `null`; otherwise sorted (order ignored)
|
|
1351
|
-
* - Plain objects → keys sorted; `null`/empty nested values omitted
|
|
1352
|
-
* - `Date` → epoch milliseconds
|
|
1353
|
-
*/
|
|
1354
|
-
function normalizeFormValue(value) {
|
|
1355
|
-
if (value === undefined || value === null) {
|
|
1356
|
-
return null;
|
|
1357
|
-
}
|
|
1358
|
-
if (typeof value === 'string') {
|
|
1359
|
-
const trimmed = value.trim();
|
|
1360
|
-
if (trimmed === '') {
|
|
1361
|
-
return null;
|
|
1362
|
-
}
|
|
1363
|
-
if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
1364
|
-
const num = Number(trimmed);
|
|
1365
|
-
if (!Number.isNaN(num)) {
|
|
1366
|
-
return num;
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
return trimmed;
|
|
1370
|
-
}
|
|
1371
|
-
if (typeof value === 'number') {
|
|
1372
|
-
return Number.isNaN(value) ? null : value;
|
|
1373
|
-
}
|
|
1374
|
-
if (typeof value === 'boolean') {
|
|
1375
|
-
return value;
|
|
1376
|
-
}
|
|
1377
|
-
if (value instanceof Date) {
|
|
1378
|
-
return value.getTime();
|
|
1379
|
-
}
|
|
1380
|
-
if (isArray(value)) {
|
|
1381
|
-
const normalizedItems = value
|
|
1382
|
-
.map((item) => normalizeFormValue(item))
|
|
1383
|
-
.filter((item) => item !== null);
|
|
1384
|
-
if (normalizedItems.length === 0) {
|
|
1385
|
-
return null;
|
|
1386
|
-
}
|
|
1387
|
-
return sortNormalizedArrayItems(normalizedItems);
|
|
1388
|
-
}
|
|
1389
|
-
if (isPlainObject(value)) {
|
|
1390
|
-
const record = value;
|
|
1391
|
-
if (isLocaleStringMap(record)) {
|
|
1392
|
-
return normalizeLocaleStringMap(record);
|
|
1393
|
-
}
|
|
1394
|
-
const normalized = {};
|
|
1395
|
-
for (const key of Object.keys(record).sort()) {
|
|
1396
|
-
const next = normalizeFormValue(record[key]);
|
|
1397
|
-
if (next !== null) {
|
|
1398
|
-
normalized[key] = next;
|
|
1399
|
-
}
|
|
1400
|
-
}
|
|
1401
|
-
return normalized;
|
|
1402
|
-
}
|
|
1403
|
-
return value;
|
|
1404
|
-
}
|
|
1405
|
-
/**
|
|
1406
|
-
* Semantic equality for dirty-state and baseline checks.
|
|
1407
|
-
* Prefer over lodash `isEqual` when comparing user-edited form/context data to a saved baseline.
|
|
1408
|
-
*
|
|
1409
|
-
* Arrays: `[]`, `null`, and all-empty lists are equivalent; non-empty arrays compare as multisets (order ignored).
|
|
1410
|
-
*/
|
|
1411
|
-
function isFormValueEqual(a, b) {
|
|
1412
|
-
const multiLanguageEqual = compareMultiLanguageFormValues(a, b);
|
|
1413
|
-
if (multiLanguageEqual !== null) {
|
|
1414
|
-
return multiLanguageEqual;
|
|
1415
|
-
}
|
|
1416
|
-
const filterEqual = compareFilterFormValues(a, b);
|
|
1417
|
-
if (filterEqual !== null) {
|
|
1418
|
-
return filterEqual;
|
|
1419
|
-
}
|
|
1420
|
-
const referenceEqual = compareReferenceFormValues(a, b);
|
|
1421
|
-
if (referenceEqual !== null) {
|
|
1422
|
-
return referenceEqual;
|
|
1423
|
-
}
|
|
1424
|
-
if (isArray(a) && isArray(b)) {
|
|
1425
|
-
// Empty repeater rows normalize away; raw length must differ before multiset compare.
|
|
1426
|
-
if (a.length !== b.length) {
|
|
1427
|
-
return false;
|
|
1428
|
-
}
|
|
1429
|
-
return isEqual(normalizeFormValue(a), normalizeFormValue(b));
|
|
1430
|
-
}
|
|
1431
|
-
if (isPlainObject(a) && isPlainObject(b)) {
|
|
1432
|
-
const left = a;
|
|
1433
|
-
const right = b;
|
|
1434
|
-
const keys = new Set([...Object.keys(left), ...Object.keys(right)]);
|
|
1435
|
-
for (const key of keys) {
|
|
1436
|
-
if (!isFormValueEqual(left[key], right[key])) {
|
|
1437
|
-
return false;
|
|
1438
|
-
}
|
|
1439
|
-
}
|
|
1440
|
-
return true;
|
|
1441
|
-
}
|
|
1442
|
-
if (typeof a === 'string' && typeof b === 'string') {
|
|
1443
|
-
const htmlEqual = compareHtmlFormValues(a, b);
|
|
1444
|
-
if (htmlEqual !== null) {
|
|
1445
|
-
return htmlEqual;
|
|
1446
|
-
}
|
|
1447
|
-
}
|
|
1448
|
-
return isEqual(normalizeFormValue(a), normalizeFormValue(b));
|
|
1449
|
-
}
|
|
1450
|
-
/**
|
|
1451
|
-
* Returns whether `current` differs from the saved/clean `baseline` snapshot.
|
|
1452
|
-
*/
|
|
1453
|
-
function isFormContextDirty(current, baseline) {
|
|
1454
|
-
return !isFormValueEqual(current, baseline);
|
|
1455
|
-
}
|
|
1456
|
-
/**
|
|
1457
|
-
* Lists paths where live context differs from baseline (for dirty-state trace logs).
|
|
1458
|
-
*/
|
|
1459
|
-
function summarizeFormContextDirtyDiff(current, baseline, maxEntries = 12) {
|
|
1460
|
-
const diffs = [];
|
|
1461
|
-
const walk = (path, currentValue, baselineValue) => {
|
|
1462
|
-
if (diffs.length >= maxEntries) {
|
|
1463
|
-
return;
|
|
1464
|
-
}
|
|
1465
|
-
if (isFormValueEqual(currentValue, baselineValue)) {
|
|
1466
|
-
return;
|
|
1467
|
-
}
|
|
1468
|
-
const bothPlainObjects = isPlainObject(currentValue) &&
|
|
1469
|
-
isPlainObject(baselineValue) &&
|
|
1470
|
-
!isArray(currentValue) &&
|
|
1471
|
-
!isArray(baselineValue);
|
|
1472
|
-
if (bothPlainObjects) {
|
|
1473
|
-
const left = currentValue;
|
|
1474
|
-
const right = baselineValue;
|
|
1475
|
-
const keys = new Set([...Object.keys(left), ...Object.keys(right)]);
|
|
1476
|
-
for (const key of keys) {
|
|
1477
|
-
if (diffs.length >= maxEntries) {
|
|
1478
|
-
return;
|
|
1479
|
-
}
|
|
1480
|
-
const nextPath = path ? `${path}.${key}` : key;
|
|
1481
|
-
walk(nextPath, left[key], right[key]);
|
|
1482
|
-
}
|
|
1483
|
-
return;
|
|
1484
|
-
}
|
|
1485
|
-
diffs.push({
|
|
1486
|
-
path: path || '(root)',
|
|
1487
|
-
current: currentValue,
|
|
1488
|
-
baseline: baselineValue,
|
|
1489
|
-
selectionEqual: isSelectionValueEqual(currentValue, baselineValue),
|
|
1490
|
-
});
|
|
1491
|
-
};
|
|
1492
|
-
walk('', current, baseline);
|
|
1493
|
-
return diffs;
|
|
1494
|
-
}
|
|
1495
|
-
/**
|
|
1496
|
-
* Clones a context object for use as a dirty-tracking baseline.
|
|
1497
|
-
*/
|
|
1498
|
-
function captureFormContextBaseline(context) {
|
|
1499
|
-
return cloneDeep(context);
|
|
1500
|
-
}
|
|
1501
|
-
//#endregion
|
|
1502
|
-
|
|
1503
|
-
class AXPContextChangeEvent {
|
|
1504
|
-
}
|
|
1505
|
-
//#endregion
|
|
1506
808
|
//#region ---- Context signal store ----
|
|
1507
809
|
const AXPContextStore = signalStore(withState(() => ({
|
|
1508
810
|
data: {},
|
|
@@ -4462,39 +3764,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
4462
3764
|
}]
|
|
4463
3765
|
}], ctorParameters: () => [{ type: AXPAppStartUpService }, { type: i0.Injector }] });
|
|
4464
3766
|
|
|
4465
|
-
//#region ---- Imports ----
|
|
4466
|
-
//#endregion
|
|
4467
|
-
//#region ---- Compare & sort ----
|
|
4468
|
-
const DEFAULT_COLLATOR_OPTIONS = { sensitivity: 'base' };
|
|
4469
|
-
/**
|
|
4470
|
-
* Locale-aware comparison of {@link AXPMultiLanguageString} values (plain string, `@scope:key`, or locale map).
|
|
4471
|
-
* Resolves each side with {@link resolveMultiLanguageString} for `locale`, then compares with `String#localeCompare`.
|
|
4472
|
-
*/
|
|
4473
|
-
function compareMultiLanguageStrings(a, b, locale, collatorOptions = DEFAULT_COLLATOR_OPTIONS) {
|
|
4474
|
-
const sa = resolveMultiLanguageString(a ?? '', locale);
|
|
4475
|
-
const sb = resolveMultiLanguageString(b ?? '', locale);
|
|
4476
|
-
return sa.localeCompare(sb, locale, collatorOptions);
|
|
4477
|
-
}
|
|
4478
|
-
/**
|
|
4479
|
-
* Stable sort copy: orders items by resolved string for `getValue(item)` using the active `locale`.
|
|
4480
|
-
*/
|
|
4481
|
-
function sortByMultiLanguageString(items, getValue, locale, collatorOptions) {
|
|
4482
|
-
return [...items].sort((x, y) => compareMultiLanguageStrings(getValue(x), getValue(y), locale, collatorOptions));
|
|
4483
|
-
}
|
|
4484
|
-
/**
|
|
4485
|
-
* True when the resolved value contains `query` (case-insensitive) for `locale`.
|
|
4486
|
-
* Useful for search/filter flows over {@link AXPMultiLanguageString}.
|
|
4487
|
-
*/
|
|
4488
|
-
function searchInMultiLanguageString(value, query, locale) {
|
|
4489
|
-
const q = query.trim().toLocaleLowerCase(locale);
|
|
4490
|
-
if (!q) {
|
|
4491
|
-
return true;
|
|
4492
|
-
}
|
|
4493
|
-
const text = resolveMultiLanguageString(value ?? '', locale).toLocaleLowerCase(locale);
|
|
4494
|
-
return text.includes(q);
|
|
4495
|
-
}
|
|
4496
|
-
//#endregion
|
|
4497
|
-
|
|
4498
3767
|
//#region ---- Imports ----
|
|
4499
3768
|
//#endregion
|
|
4500
3769
|
//#region ---- Constants ----
|
|
@@ -4762,860 +4031,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
4762
4031
|
}]
|
|
4763
4032
|
}] });
|
|
4764
4033
|
|
|
4765
|
-
/**
|
|
4766
|
-
* Additional suggested generic actions for future consideration:
|
|
4767
|
-
*
|
|
4768
|
-
* Data & Content Actions:
|
|
4769
|
-
* - Search = 'search' - Search functionality
|
|
4770
|
-
* - Filter = 'filter' - Apply filters
|
|
4771
|
-
* - Sort = 'sort' - Sort data
|
|
4772
|
-
* - Group = 'group' - Group data
|
|
4773
|
-
* - Expand = 'expand' - Expand details
|
|
4774
|
-
* - Collapse = 'collapse' - Collapse details
|
|
4775
|
-
* - Pin = 'pin' - Pin to favorites
|
|
4776
|
-
* - Bookmark = 'bookmark' - Bookmark item
|
|
4777
|
-
* - Favorite = 'favorite' - Mark as favorite
|
|
4778
|
-
* - Star = 'star' - Star rating
|
|
4779
|
-
*
|
|
4780
|
-
* Workflow Actions:
|
|
4781
|
-
* - Start = 'start' - Start process/workflow
|
|
4782
|
-
* - Stop = 'stop' - Stop process
|
|
4783
|
-
* - Pause = 'pause' - Pause process
|
|
4784
|
-
* - Resume = 'resume' - Resume process
|
|
4785
|
-
* - Cancel = 'cancel' - Cancel operation
|
|
4786
|
-
* - Complete = 'complete' - Mark as complete
|
|
4787
|
-
* - Close = 'close' - Close item
|
|
4788
|
-
* - Reopen = 'reopen' - Reopen closed item
|
|
4789
|
-
* - Forward = 'forward' - Forward to next step
|
|
4790
|
-
* - Back = 'back' - Go back
|
|
4791
|
-
*
|
|
4792
|
-
* Communication Actions:
|
|
4793
|
-
* - Reply = 'reply' - Reply to message
|
|
4794
|
-
* - Forward = 'forward' - Forward message
|
|
4795
|
-
* - Notify = 'notify' - Send notification
|
|
4796
|
-
* - Invite = 'invite' - Invite user
|
|
4797
|
-
* - Join = 'join' - Join group/meeting
|
|
4798
|
-
* - Leave = 'leave' - Leave group/meeting
|
|
4799
|
-
*
|
|
4800
|
-
* Security Actions:
|
|
4801
|
-
* - Login = 'login' - User login
|
|
4802
|
-
* - Logout = 'logout' - User logout
|
|
4803
|
-
* - Block = 'block' - Block user/content
|
|
4804
|
-
* - Unblock = 'unblock' - Unblock user/content
|
|
4805
|
-
* - Ban = 'ban' - Ban user
|
|
4806
|
-
* - Unban = 'unban' - Unban user
|
|
4807
|
-
* - Verify = 'verify' - Verify identity
|
|
4808
|
-
* - Authenticate = 'authenticate' - Authenticate
|
|
4809
|
-
*
|
|
4810
|
-
* File & Media Actions:
|
|
4811
|
-
* - Open = 'open' - Open file
|
|
4812
|
-
* - Save = 'save' - Save file
|
|
4813
|
-
* - SaveAs = 'save-as' - Save as new file
|
|
4814
|
-
* - Attach = 'attach' - Attach file
|
|
4815
|
-
* - Detach = 'detach' - Detach file
|
|
4816
|
-
* - Compress = 'compress' - Compress files
|
|
4817
|
-
* - Extract = 'extract' - Extract archive
|
|
4818
|
-
* - Convert = 'convert' - Convert format
|
|
4819
|
-
* - Crop = 'crop' - Crop image
|
|
4820
|
-
* - Resize = 'resize' - Resize image
|
|
4821
|
-
*
|
|
4822
|
-
* System Actions:
|
|
4823
|
-
* - Sync = 'sync' - Synchronize data
|
|
4824
|
-
* - Backup = 'backup' - Create backup
|
|
4825
|
-
* - Restore = 'restore' - Restore from backup
|
|
4826
|
-
* - Reset = 'reset' - Reset to defaults
|
|
4827
|
-
* - Clear = 'clear' - Clear data
|
|
4828
|
-
* - Optimize = 'optimize' - Optimize performance
|
|
4829
|
-
* - Update = 'update' - Update system
|
|
4830
|
-
* - Install = 'install' - Install component
|
|
4831
|
-
* - Uninstall = 'uninstall' - Uninstall component
|
|
4832
|
-
* - Enable = 'enable' - Enable feature
|
|
4833
|
-
* - Disable = 'disable' - Disable feature
|
|
4834
|
-
*
|
|
4835
|
-
* Analytics & Monitoring:
|
|
4836
|
-
* - Monitor = 'monitor' - Monitor activity
|
|
4837
|
-
* - Track = 'track' - Track progress
|
|
4838
|
-
* - Analyze = 'analyze' - Analyze data
|
|
4839
|
-
* - Debug = 'debug' - Debug issue
|
|
4840
|
-
* - Log = 'log' - View logs
|
|
4841
|
-
* - Alert = 'alert' - Set alert
|
|
4842
|
-
* - Dashboard = 'dashboard' - View dashboard
|
|
4843
|
-
* - Metrics = 'metrics' - View metrics
|
|
4844
|
-
*
|
|
4845
|
-
* Collaboration Actions:
|
|
4846
|
-
* - Collaborate = 'collaborate' - Start collaboration
|
|
4847
|
-
* - Share = 'share' - Share content
|
|
4848
|
-
* - Comment = 'comment' - Add comment
|
|
4849
|
-
* - Like = 'like' - Like content
|
|
4850
|
-
* - Follow = 'follow' - Follow user/content
|
|
4851
|
-
* - Subscribe = 'subscribe' - Subscribe to updates
|
|
4852
|
-
* - Unsubscribe = 'unsubscribe' - Unsubscribe
|
|
4853
|
-
* - Rate = 'rate' - Rate content
|
|
4854
|
-
* - Review = 'review' - Review content
|
|
4855
|
-
* - Recommend = 'recommend' - Recommend content
|
|
4856
|
-
*/
|
|
4857
|
-
const i18n = (key) => `@general:actions.${key}`;
|
|
4858
|
-
const AXPSystemActions = Object.freeze({
|
|
4859
|
-
View: {
|
|
4860
|
-
key: AXPSystemActionType.View,
|
|
4861
|
-
title: i18n('view.title'),
|
|
4862
|
-
icon: 'fa-light fa-eye',
|
|
4863
|
-
color: 'primary',
|
|
4864
|
-
descriptions: {
|
|
4865
|
-
title: i18n('view.title'),
|
|
4866
|
-
tooltip: i18n('view.description'),
|
|
4867
|
-
permission: i18n('view.permission'),
|
|
4868
|
-
audit: i18n('view.audit')
|
|
4869
|
-
}
|
|
4870
|
-
},
|
|
4871
|
-
Create: {
|
|
4872
|
-
key: AXPSystemActionType.Create,
|
|
4873
|
-
title: i18n('create.title'),
|
|
4874
|
-
icon: 'fa-light fa-plus',
|
|
4875
|
-
color: 'primary',
|
|
4876
|
-
descriptions: {
|
|
4877
|
-
title: i18n('create.title'),
|
|
4878
|
-
tooltip: i18n('create.description'),
|
|
4879
|
-
permission: i18n('create.permission'),
|
|
4880
|
-
audit: i18n('create.audit')
|
|
4881
|
-
}
|
|
4882
|
-
},
|
|
4883
|
-
Edit: {
|
|
4884
|
-
key: AXPSystemActionType.Update,
|
|
4885
|
-
title: i18n('edit.title'),
|
|
4886
|
-
icon: 'fa-light fa-pen',
|
|
4887
|
-
color: 'default',
|
|
4888
|
-
descriptions: {
|
|
4889
|
-
title: i18n('edit.title'),
|
|
4890
|
-
tooltip: i18n('edit.description'),
|
|
4891
|
-
permission: i18n('edit.permission'),
|
|
4892
|
-
audit: i18n('edit.audit')
|
|
4893
|
-
}
|
|
4894
|
-
},
|
|
4895
|
-
Delete: {
|
|
4896
|
-
key: AXPSystemActionType.Delete,
|
|
4897
|
-
title: i18n('delete.title'),
|
|
4898
|
-
icon: 'fa-light fa-trash',
|
|
4899
|
-
color: 'danger',
|
|
4900
|
-
critical: true,
|
|
4901
|
-
descriptions: {
|
|
4902
|
-
title: i18n('delete.title'),
|
|
4903
|
-
tooltip: i18n('delete.description'),
|
|
4904
|
-
permission: i18n('delete.permission'),
|
|
4905
|
-
audit: i18n('delete.audit')
|
|
4906
|
-
}
|
|
4907
|
-
},
|
|
4908
|
-
Approve: {
|
|
4909
|
-
key: AXPSystemActionType.Approve,
|
|
4910
|
-
title: i18n('approve.title'),
|
|
4911
|
-
icon: 'fa-light fa-circle-check',
|
|
4912
|
-
color: 'success',
|
|
4913
|
-
critical: true,
|
|
4914
|
-
descriptions: {
|
|
4915
|
-
title: i18n('approve.title'),
|
|
4916
|
-
tooltip: i18n('approve.description'),
|
|
4917
|
-
permission: i18n('approve.permission'),
|
|
4918
|
-
audit: i18n('approve.audit')
|
|
4919
|
-
}
|
|
4920
|
-
},
|
|
4921
|
-
Submit: {
|
|
4922
|
-
key: AXPSystemActionType.Submit,
|
|
4923
|
-
title: i18n('submit.title'),
|
|
4924
|
-
icon: 'fa-light fa-paper-plane',
|
|
4925
|
-
color: 'primary',
|
|
4926
|
-
descriptions: {
|
|
4927
|
-
title: i18n('submit.title'),
|
|
4928
|
-
tooltip: i18n('submit.description'),
|
|
4929
|
-
permission: i18n('submit.permission'),
|
|
4930
|
-
audit: i18n('submit.audit')
|
|
4931
|
-
}
|
|
4932
|
-
},
|
|
4933
|
-
Reject: {
|
|
4934
|
-
key: AXPSystemActionType.Reject,
|
|
4935
|
-
title: i18n('reject.title'),
|
|
4936
|
-
icon: 'fa-light fa-ban',
|
|
4937
|
-
color: 'danger',
|
|
4938
|
-
critical: true,
|
|
4939
|
-
descriptions: {
|
|
4940
|
-
title: i18n('reject.title'),
|
|
4941
|
-
tooltip: i18n('reject.description'),
|
|
4942
|
-
permission: i18n('reject.permission'),
|
|
4943
|
-
audit: i18n('reject.audit')
|
|
4944
|
-
}
|
|
4945
|
-
},
|
|
4946
|
-
Export: {
|
|
4947
|
-
key: AXPSystemActionType.Export,
|
|
4948
|
-
title: i18n('export.title'),
|
|
4949
|
-
icon: 'fa-light fa-download',
|
|
4950
|
-
color: 'default',
|
|
4951
|
-
descriptions: {
|
|
4952
|
-
title: i18n('export.title'),
|
|
4953
|
-
tooltip: i18n('export.description'),
|
|
4954
|
-
permission: i18n('export.permission'),
|
|
4955
|
-
audit: i18n('export.audit')
|
|
4956
|
-
}
|
|
4957
|
-
},
|
|
4958
|
-
Import: {
|
|
4959
|
-
key: AXPSystemActionType.Import,
|
|
4960
|
-
title: i18n('import.title'),
|
|
4961
|
-
icon: 'fa-light fa-upload',
|
|
4962
|
-
color: 'default',
|
|
4963
|
-
descriptions: {
|
|
4964
|
-
title: i18n('import.title'),
|
|
4965
|
-
tooltip: i18n('import.description'),
|
|
4966
|
-
permission: i18n('import.permission'),
|
|
4967
|
-
audit: i18n('import.audit')
|
|
4968
|
-
}
|
|
4969
|
-
},
|
|
4970
|
-
Print: {
|
|
4971
|
-
key: AXPSystemActionType.Print,
|
|
4972
|
-
title: i18n('print.title'),
|
|
4973
|
-
icon: 'fa-light fa-print',
|
|
4974
|
-
color: 'default',
|
|
4975
|
-
descriptions: {
|
|
4976
|
-
title: i18n('print.title'),
|
|
4977
|
-
tooltip: i18n('print.description'),
|
|
4978
|
-
permission: i18n('print.permission'),
|
|
4979
|
-
audit: i18n('print.audit')
|
|
4980
|
-
}
|
|
4981
|
-
},
|
|
4982
|
-
Duplicate: {
|
|
4983
|
-
key: AXPSystemActionType.Duplicate,
|
|
4984
|
-
title: i18n('duplicate.title'),
|
|
4985
|
-
icon: 'fa-light fa-clone',
|
|
4986
|
-
color: 'warning',
|
|
4987
|
-
descriptions: {
|
|
4988
|
-
title: i18n('duplicate.title'),
|
|
4989
|
-
tooltip: i18n('duplicate.description'),
|
|
4990
|
-
permission: i18n('duplicate.permission'),
|
|
4991
|
-
audit: i18n('duplicate.audit')
|
|
4992
|
-
}
|
|
4993
|
-
},
|
|
4994
|
-
Archive: {
|
|
4995
|
-
key: AXPSystemActionType.Archive,
|
|
4996
|
-
title: i18n('archive.title'),
|
|
4997
|
-
icon: 'fa-light fa-box-archive',
|
|
4998
|
-
color: 'default',
|
|
4999
|
-
descriptions: {
|
|
5000
|
-
title: i18n('archive.title'),
|
|
5001
|
-
tooltip: i18n('archive.description'),
|
|
5002
|
-
permission: i18n('archive.permission'),
|
|
5003
|
-
audit: i18n('archive.audit')
|
|
5004
|
-
}
|
|
5005
|
-
},
|
|
5006
|
-
Restore: {
|
|
5007
|
-
key: AXPSystemActionType.Restore,
|
|
5008
|
-
title: i18n('restore.title'),
|
|
5009
|
-
icon: 'fa-light fa-arrow-rotate-left',
|
|
5010
|
-
color: 'default',
|
|
5011
|
-
descriptions: {
|
|
5012
|
-
title: i18n('restore.title'),
|
|
5013
|
-
tooltip: i18n('restore.description'),
|
|
5014
|
-
permission: i18n('restore.permission'),
|
|
5015
|
-
audit: i18n('restore.audit')
|
|
5016
|
-
}
|
|
5017
|
-
},
|
|
5018
|
-
Assign: {
|
|
5019
|
-
key: AXPSystemActionType.Assign,
|
|
5020
|
-
title: i18n('assign.title'),
|
|
5021
|
-
icon: 'fa-light fa-user-plus',
|
|
5022
|
-
color: 'primary',
|
|
5023
|
-
descriptions: {
|
|
5024
|
-
title: i18n('assign.title'),
|
|
5025
|
-
tooltip: i18n('assign.description'),
|
|
5026
|
-
permission: i18n('assign.permission'),
|
|
5027
|
-
audit: i18n('assign.audit')
|
|
5028
|
-
}
|
|
5029
|
-
},
|
|
5030
|
-
Lock: {
|
|
5031
|
-
key: AXPSystemActionType.Lock,
|
|
5032
|
-
title: i18n('lock.title'),
|
|
5033
|
-
icon: 'fa-light fa-lock',
|
|
5034
|
-
color: 'warning',
|
|
5035
|
-
descriptions: {
|
|
5036
|
-
title: i18n('lock.title'),
|
|
5037
|
-
tooltip: i18n('lock.description'),
|
|
5038
|
-
permission: i18n('lock.permission'),
|
|
5039
|
-
audit: i18n('lock.audit')
|
|
5040
|
-
}
|
|
5041
|
-
},
|
|
5042
|
-
Unlock: {
|
|
5043
|
-
key: AXPSystemActionType.Unlock,
|
|
5044
|
-
title: i18n('unlock.title'),
|
|
5045
|
-
icon: 'fa-light fa-unlock',
|
|
5046
|
-
color: 'success',
|
|
5047
|
-
descriptions: {
|
|
5048
|
-
title: i18n('unlock.title'),
|
|
5049
|
-
tooltip: i18n('unlock.description'),
|
|
5050
|
-
permission: i18n('unlock.permission'),
|
|
5051
|
-
audit: i18n('unlock.audit')
|
|
5052
|
-
}
|
|
5053
|
-
},
|
|
5054
|
-
Share: {
|
|
5055
|
-
key: AXPSystemActionType.Share,
|
|
5056
|
-
title: i18n('share.title'),
|
|
5057
|
-
icon: 'fa-light fa-share-nodes',
|
|
5058
|
-
color: 'info',
|
|
5059
|
-
descriptions: {
|
|
5060
|
-
title: i18n('share.title'),
|
|
5061
|
-
tooltip: i18n('share.description'),
|
|
5062
|
-
permission: i18n('share.permission'),
|
|
5063
|
-
audit: i18n('share.audit')
|
|
5064
|
-
}
|
|
5065
|
-
},
|
|
5066
|
-
Configure: {
|
|
5067
|
-
key: AXPSystemActionType.Configure,
|
|
5068
|
-
title: i18n('configure.title'),
|
|
5069
|
-
icon: 'fa-light fa-sliders',
|
|
5070
|
-
color: 'primary',
|
|
5071
|
-
descriptions: {
|
|
5072
|
-
title: i18n('configure.title'),
|
|
5073
|
-
tooltip: i18n('configure.description'),
|
|
5074
|
-
permission: i18n('configure.permission'),
|
|
5075
|
-
audit: i18n('configure.audit')
|
|
5076
|
-
}
|
|
5077
|
-
},
|
|
5078
|
-
Reorder: {
|
|
5079
|
-
key: AXPSystemActionType.Reorder,
|
|
5080
|
-
title: i18n('reorder.title'),
|
|
5081
|
-
icon: 'fa-light fa-arrow-down-up-across-line',
|
|
5082
|
-
color: 'default',
|
|
5083
|
-
descriptions: {
|
|
5084
|
-
title: i18n('reorder.title'),
|
|
5085
|
-
tooltip: i18n('reorder.description'),
|
|
5086
|
-
permission: i18n('reorder.permission'),
|
|
5087
|
-
audit: i18n('reorder.audit')
|
|
5088
|
-
}
|
|
5089
|
-
},
|
|
5090
|
-
Preview: {
|
|
5091
|
-
key: AXPSystemActionType.Preview,
|
|
5092
|
-
title: i18n('preview.title'),
|
|
5093
|
-
icon: 'fa-light fa-magnifying-glass',
|
|
5094
|
-
color: 'default',
|
|
5095
|
-
descriptions: {
|
|
5096
|
-
title: i18n('preview.title'),
|
|
5097
|
-
tooltip: i18n('preview.description'),
|
|
5098
|
-
permission: i18n('preview.permission'),
|
|
5099
|
-
audit: i18n('preview.audit')
|
|
5100
|
-
}
|
|
5101
|
-
},
|
|
5102
|
-
Publish: {
|
|
5103
|
-
key: AXPSystemActionType.Publish,
|
|
5104
|
-
title: i18n('publish.title'),
|
|
5105
|
-
icon: 'fa-light fa-globe',
|
|
5106
|
-
color: 'success',
|
|
5107
|
-
descriptions: {
|
|
5108
|
-
title: i18n('publish.title'),
|
|
5109
|
-
tooltip: i18n('publish.description'),
|
|
5110
|
-
permission: i18n('publish.permission'),
|
|
5111
|
-
audit: i18n('publish.audit')
|
|
5112
|
-
}
|
|
5113
|
-
},
|
|
5114
|
-
Unpublish: {
|
|
5115
|
-
key: AXPSystemActionType.Unpublish,
|
|
5116
|
-
title: i18n('unpublish.title'),
|
|
5117
|
-
icon: 'fa-light fa-globe-slash',
|
|
5118
|
-
color: 'danger',
|
|
5119
|
-
descriptions: {
|
|
5120
|
-
title: i18n('unpublish.title'),
|
|
5121
|
-
tooltip: i18n('unpublish.description'),
|
|
5122
|
-
permission: i18n('unpublish.permission'),
|
|
5123
|
-
audit: i18n('unpublish.audit')
|
|
5124
|
-
}
|
|
5125
|
-
},
|
|
5126
|
-
Upload: {
|
|
5127
|
-
key: AXPSystemActionType.Upload,
|
|
5128
|
-
title: i18n('upload.title'),
|
|
5129
|
-
icon: 'fa-light fa-upload',
|
|
5130
|
-
color: 'default',
|
|
5131
|
-
descriptions: {
|
|
5132
|
-
title: i18n('upload.title'),
|
|
5133
|
-
tooltip: i18n('upload.description'),
|
|
5134
|
-
permission: i18n('upload.permission'),
|
|
5135
|
-
audit: i18n('upload.audit')
|
|
5136
|
-
}
|
|
5137
|
-
},
|
|
5138
|
-
Download: {
|
|
5139
|
-
key: AXPSystemActionType.Download,
|
|
5140
|
-
title: i18n('download.title'),
|
|
5141
|
-
icon: 'fa-light fa-download',
|
|
5142
|
-
color: 'default',
|
|
5143
|
-
descriptions: {
|
|
5144
|
-
title: i18n('download.title'),
|
|
5145
|
-
tooltip: i18n('download.description'),
|
|
5146
|
-
permission: i18n('download.permission'),
|
|
5147
|
-
audit: i18n('download.audit')
|
|
5148
|
-
}
|
|
5149
|
-
},
|
|
5150
|
-
Copy: {
|
|
5151
|
-
key: AXPSystemActionType.Copy,
|
|
5152
|
-
title: i18n('copy.title'),
|
|
5153
|
-
icon: 'fa-light fa-copy',
|
|
5154
|
-
color: 'default',
|
|
5155
|
-
descriptions: {
|
|
5156
|
-
title: i18n('copy.title'),
|
|
5157
|
-
tooltip: i18n('copy.description'),
|
|
5158
|
-
permission: i18n('copy.permission'),
|
|
5159
|
-
audit: i18n('copy.audit')
|
|
5160
|
-
}
|
|
5161
|
-
},
|
|
5162
|
-
Move: {
|
|
5163
|
-
key: AXPSystemActionType.Move,
|
|
5164
|
-
title: i18n('move.title'),
|
|
5165
|
-
icon: 'fa-light fa-arrow-right-arrow-left',
|
|
5166
|
-
color: 'default',
|
|
5167
|
-
descriptions: {
|
|
5168
|
-
title: i18n('move.title'),
|
|
5169
|
-
tooltip: i18n('move.description'),
|
|
5170
|
-
permission: i18n('move.permission'),
|
|
5171
|
-
audit: i18n('move.audit')
|
|
5172
|
-
}
|
|
5173
|
-
},
|
|
5174
|
-
Rename: {
|
|
5175
|
-
key: AXPSystemActionType.Rename,
|
|
5176
|
-
title: i18n('rename.title'),
|
|
5177
|
-
icon: 'fa-light fa-pen',
|
|
5178
|
-
color: 'default',
|
|
5179
|
-
descriptions: {
|
|
5180
|
-
title: i18n('rename.title'),
|
|
5181
|
-
tooltip: i18n('rename.description'),
|
|
5182
|
-
permission: i18n('rename.permission'),
|
|
5183
|
-
audit: i18n('rename.audit')
|
|
5184
|
-
}
|
|
5185
|
-
},
|
|
5186
|
-
Manage: {
|
|
5187
|
-
key: AXPSystemActionType.Manage,
|
|
5188
|
-
title: i18n('manage.title'),
|
|
5189
|
-
icon: 'fa-light fa-gear',
|
|
5190
|
-
color: 'default',
|
|
5191
|
-
descriptions: {
|
|
5192
|
-
title: i18n('manage.title'),
|
|
5193
|
-
tooltip: i18n('manage.description'),
|
|
5194
|
-
permission: i18n('manage.permission'),
|
|
5195
|
-
audit: i18n('manage.audit')
|
|
5196
|
-
}
|
|
5197
|
-
},
|
|
5198
|
-
Info: {
|
|
5199
|
-
key: AXPSystemActionType.Info,
|
|
5200
|
-
title: i18n('info.title'),
|
|
5201
|
-
icon: 'fa-light fa-info',
|
|
5202
|
-
color: 'default',
|
|
5203
|
-
descriptions: {
|
|
5204
|
-
title: i18n('info.title'),
|
|
5205
|
-
tooltip: i18n('info.description'),
|
|
5206
|
-
permission: i18n('info.permission'),
|
|
5207
|
-
audit: i18n('info.audit')
|
|
5208
|
-
}
|
|
5209
|
-
},
|
|
5210
|
-
Confirm: {
|
|
5211
|
-
key: AXPSystemActionType.Confirm,
|
|
5212
|
-
title: i18n('confirm.title'),
|
|
5213
|
-
icon: 'fa-light fa-check',
|
|
5214
|
-
color: 'success',
|
|
5215
|
-
descriptions: {
|
|
5216
|
-
title: i18n('confirm.title'),
|
|
5217
|
-
tooltip: i18n('confirm.description'),
|
|
5218
|
-
permission: i18n('confirm.permission'),
|
|
5219
|
-
audit: i18n('confirm.audit')
|
|
5220
|
-
}
|
|
5221
|
-
},
|
|
5222
|
-
Design: {
|
|
5223
|
-
key: AXPSystemActionType.Design,
|
|
5224
|
-
title: i18n('design.title'),
|
|
5225
|
-
icon: 'fa-light fa-paintbrush',
|
|
5226
|
-
color: 'default',
|
|
5227
|
-
descriptions: {
|
|
5228
|
-
title: i18n('design.title'),
|
|
5229
|
-
tooltip: i18n('design.description'),
|
|
5230
|
-
permission: i18n('design.permission'),
|
|
5231
|
-
audit: i18n('design.audit')
|
|
5232
|
-
}
|
|
5233
|
-
},
|
|
5234
|
-
VersionHistory: {
|
|
5235
|
-
key: AXPSystemActionType.VersionHistory,
|
|
5236
|
-
title: i18n('version-history.title'),
|
|
5237
|
-
icon: 'fa-light fa-history',
|
|
5238
|
-
color: 'default',
|
|
5239
|
-
descriptions: {
|
|
5240
|
-
title: i18n('version-history.title'),
|
|
5241
|
-
tooltip: i18n('version-history.description'),
|
|
5242
|
-
permission: i18n('version-history.permission'),
|
|
5243
|
-
audit: i18n('version-history.audit')
|
|
5244
|
-
}
|
|
5245
|
-
},
|
|
5246
|
-
Compare: {
|
|
5247
|
-
key: AXPSystemActionType.Compare,
|
|
5248
|
-
title: i18n('compare.title'),
|
|
5249
|
-
icon: 'fa-light fa-code-compare',
|
|
5250
|
-
color: 'default',
|
|
5251
|
-
descriptions: {
|
|
5252
|
-
title: i18n('compare.title'),
|
|
5253
|
-
tooltip: i18n('compare.description'),
|
|
5254
|
-
permission: i18n('compare.permission'),
|
|
5255
|
-
audit: i18n('compare.audit')
|
|
5256
|
-
}
|
|
5257
|
-
},
|
|
5258
|
-
Comments: {
|
|
5259
|
-
key: AXPSystemActionType.Comments,
|
|
5260
|
-
title: i18n('comments.title'),
|
|
5261
|
-
icon: 'fa-light fa-comments',
|
|
5262
|
-
color: 'default',
|
|
5263
|
-
descriptions: {
|
|
5264
|
-
title: i18n('comments.title'),
|
|
5265
|
-
tooltip: i18n('comments.description'),
|
|
5266
|
-
permission: i18n('comments.permission'),
|
|
5267
|
-
audit: i18n('comments.audit')
|
|
5268
|
-
}
|
|
5269
|
-
},
|
|
5270
|
-
Sign: {
|
|
5271
|
-
key: AXPSystemActionType.Sign,
|
|
5272
|
-
title: i18n('sign.title'),
|
|
5273
|
-
icon: 'fa-light fa-signature',
|
|
5274
|
-
color: 'default',
|
|
5275
|
-
descriptions: {
|
|
5276
|
-
title: i18n('sign.title'),
|
|
5277
|
-
tooltip: i18n('sign.description'),
|
|
5278
|
-
permission: i18n('sign.permission'),
|
|
5279
|
-
audit: i18n('sign.audit')
|
|
5280
|
-
}
|
|
5281
|
-
},
|
|
5282
|
-
Setup: {
|
|
5283
|
-
key: AXPSystemActionType.Setup,
|
|
5284
|
-
title: i18n('setup.title'),
|
|
5285
|
-
icon: 'fa-light fa-cog',
|
|
5286
|
-
color: 'default',
|
|
5287
|
-
descriptions: {
|
|
5288
|
-
title: i18n('setup.title'),
|
|
5289
|
-
tooltip: i18n('setup.description'),
|
|
5290
|
-
permission: i18n('setup.permission'),
|
|
5291
|
-
audit: i18n('setup.audit')
|
|
5292
|
-
}
|
|
5293
|
-
},
|
|
5294
|
-
Send: {
|
|
5295
|
-
key: AXPSystemActionType.Send,
|
|
5296
|
-
title: i18n('send.title'),
|
|
5297
|
-
icon: 'fa-light fa-envelope',
|
|
5298
|
-
color: 'default',
|
|
5299
|
-
descriptions: {
|
|
5300
|
-
title: i18n('send.title'),
|
|
5301
|
-
tooltip: i18n('send.description'),
|
|
5302
|
-
permission: i18n('send.permission'),
|
|
5303
|
-
audit: i18n('send.audit')
|
|
5304
|
-
}
|
|
5305
|
-
},
|
|
5306
|
-
Report: {
|
|
5307
|
-
key: AXPSystemActionType.Report,
|
|
5308
|
-
title: i18n('report.title'),
|
|
5309
|
-
icon: 'fa-light fa-chart-line',
|
|
5310
|
-
color: 'default',
|
|
5311
|
-
descriptions: {
|
|
5312
|
-
title: i18n('report.title'),
|
|
5313
|
-
tooltip: i18n('report.description'),
|
|
5314
|
-
permission: i18n('report.permission'),
|
|
5315
|
-
audit: i18n('report.audit')
|
|
5316
|
-
}
|
|
5317
|
-
},
|
|
5318
|
-
Sent: {
|
|
5319
|
-
key: AXPSystemActionType.Sent,
|
|
5320
|
-
title: i18n('sent.title'),
|
|
5321
|
-
icon: 'fa-light fa-paper-plane',
|
|
5322
|
-
color: 'default',
|
|
5323
|
-
descriptions: {
|
|
5324
|
-
title: i18n('sent.title'),
|
|
5325
|
-
tooltip: i18n('sent.description'),
|
|
5326
|
-
permission: i18n('sent.permission'),
|
|
5327
|
-
audit: i18n('sent.audit')
|
|
5328
|
-
}
|
|
5329
|
-
},
|
|
5330
|
-
Review: {
|
|
5331
|
-
key: AXPSystemActionType.Review,
|
|
5332
|
-
title: i18n('review.title'),
|
|
5333
|
-
icon: 'fa-light fa-eye',
|
|
5334
|
-
color: 'default',
|
|
5335
|
-
descriptions: {
|
|
5336
|
-
title: i18n('review.title'),
|
|
5337
|
-
tooltip: i18n('review.description'),
|
|
5338
|
-
permission: i18n('review.permission'),
|
|
5339
|
-
audit: i18n('review.audit')
|
|
5340
|
-
}
|
|
5341
|
-
},
|
|
5342
|
-
Generate: {
|
|
5343
|
-
key: AXPSystemActionType.Generate,
|
|
5344
|
-
title: i18n('generate.title'),
|
|
5345
|
-
icon: 'fa-light fa-wand-magic-sparkles',
|
|
5346
|
-
color: 'primary',
|
|
5347
|
-
descriptions: {
|
|
5348
|
-
title: i18n('generate.title'),
|
|
5349
|
-
tooltip: i18n('generate.description'),
|
|
5350
|
-
permission: i18n('generate.permission'),
|
|
5351
|
-
audit: i18n('generate.audit')
|
|
5352
|
-
}
|
|
5353
|
-
},
|
|
5354
|
-
Refresh: {
|
|
5355
|
-
key: AXPSystemActionType.Refresh,
|
|
5356
|
-
title: i18n('refresh.title'),
|
|
5357
|
-
icon: 'fa-light fa-arrows-rotate',
|
|
5358
|
-
color: 'default',
|
|
5359
|
-
descriptions: {
|
|
5360
|
-
title: i18n('refresh.title'),
|
|
5361
|
-
tooltip: i18n('refresh.description'),
|
|
5362
|
-
permission: i18n('refresh.permission'),
|
|
5363
|
-
audit: i18n('refresh.audit')
|
|
5364
|
-
}
|
|
5365
|
-
},
|
|
5366
|
-
Reload: {
|
|
5367
|
-
key: AXPSystemActionType.Reload,
|
|
5368
|
-
title: i18n('reload.title'),
|
|
5369
|
-
icon: 'fa-light fa-arrows-rotate',
|
|
5370
|
-
color: 'default',
|
|
5371
|
-
descriptions: {
|
|
5372
|
-
title: i18n('reload.title'),
|
|
5373
|
-
tooltip: i18n('reload.description'),
|
|
5374
|
-
permission: i18n('reload.permission'),
|
|
5375
|
-
audit: i18n('reload.audit')
|
|
5376
|
-
}
|
|
5377
|
-
},
|
|
5378
|
-
Search: {
|
|
5379
|
-
key: AXPSystemActionType.Search,
|
|
5380
|
-
title: i18n('search.title'),
|
|
5381
|
-
icon: 'fa-light fa-magnifying-glass',
|
|
5382
|
-
color: 'default',
|
|
5383
|
-
descriptions: {
|
|
5384
|
-
title: i18n('search.title'),
|
|
5385
|
-
tooltip: i18n('search.description'),
|
|
5386
|
-
permission: i18n('search.permission'),
|
|
5387
|
-
audit: i18n('search.audit')
|
|
5388
|
-
}
|
|
5389
|
-
},
|
|
5390
|
-
Filter: {
|
|
5391
|
-
key: AXPSystemActionType.Filter,
|
|
5392
|
-
title: i18n('filter.title'),
|
|
5393
|
-
icon: 'fa-light fa-filter',
|
|
5394
|
-
color: 'default',
|
|
5395
|
-
descriptions: {
|
|
5396
|
-
title: i18n('filter.title'),
|
|
5397
|
-
tooltip: i18n('filter.description'),
|
|
5398
|
-
permission: i18n('filter.permission'),
|
|
5399
|
-
audit: i18n('filter.audit')
|
|
5400
|
-
}
|
|
5401
|
-
},
|
|
5402
|
-
Sort: {
|
|
5403
|
-
key: AXPSystemActionType.Sort,
|
|
5404
|
-
title: i18n('sort.title'),
|
|
5405
|
-
icon: 'fa-light fa-arrow-down-up-across-line',
|
|
5406
|
-
color: 'default',
|
|
5407
|
-
descriptions: {
|
|
5408
|
-
title: i18n('sort.title'),
|
|
5409
|
-
tooltip: i18n('sort.description'),
|
|
5410
|
-
permission: i18n('sort.permission'),
|
|
5411
|
-
audit: i18n('sort.audit')
|
|
5412
|
-
}
|
|
5413
|
-
},
|
|
5414
|
-
Start: {
|
|
5415
|
-
key: AXPSystemActionType.Start,
|
|
5416
|
-
title: i18n('start.title'),
|
|
5417
|
-
icon: 'fa-light fa-play',
|
|
5418
|
-
color: 'success',
|
|
5419
|
-
descriptions: {
|
|
5420
|
-
title: i18n('start.title'),
|
|
5421
|
-
tooltip: i18n('start.description'),
|
|
5422
|
-
permission: i18n('start.permission'),
|
|
5423
|
-
audit: i18n('start.audit')
|
|
5424
|
-
}
|
|
5425
|
-
},
|
|
5426
|
-
Stop: {
|
|
5427
|
-
key: AXPSystemActionType.Stop,
|
|
5428
|
-
title: i18n('stop.title'),
|
|
5429
|
-
icon: 'fa-light fa-stop',
|
|
5430
|
-
color: 'danger',
|
|
5431
|
-
critical: true,
|
|
5432
|
-
descriptions: {
|
|
5433
|
-
title: i18n('stop.title'),
|
|
5434
|
-
tooltip: i18n('stop.description'),
|
|
5435
|
-
permission: i18n('stop.permission'),
|
|
5436
|
-
audit: i18n('stop.audit')
|
|
5437
|
-
}
|
|
5438
|
-
},
|
|
5439
|
-
Pause: {
|
|
5440
|
-
key: AXPSystemActionType.Pause,
|
|
5441
|
-
title: i18n('pause.title'),
|
|
5442
|
-
icon: 'fa-light fa-pause',
|
|
5443
|
-
color: 'warning',
|
|
5444
|
-
descriptions: {
|
|
5445
|
-
title: i18n('pause.title'),
|
|
5446
|
-
tooltip: i18n('pause.description'),
|
|
5447
|
-
permission: i18n('pause.permission'),
|
|
5448
|
-
audit: i18n('pause.audit')
|
|
5449
|
-
}
|
|
5450
|
-
},
|
|
5451
|
-
Cancel: {
|
|
5452
|
-
key: AXPSystemActionType.Cancel,
|
|
5453
|
-
title: i18n('cancel.title'),
|
|
5454
|
-
icon: 'fa-light fa-xmark',
|
|
5455
|
-
critical: true,
|
|
5456
|
-
descriptions: {
|
|
5457
|
-
title: i18n('cancel.title'),
|
|
5458
|
-
tooltip: i18n('cancel.description'),
|
|
5459
|
-
permission: i18n('cancel.permission'),
|
|
5460
|
-
audit: i18n('cancel.audit')
|
|
5461
|
-
}
|
|
5462
|
-
},
|
|
5463
|
-
Close: {
|
|
5464
|
-
key: AXPSystemActionType.Close,
|
|
5465
|
-
title: i18n('close.title'),
|
|
5466
|
-
icon: 'fa-light fa-xmark',
|
|
5467
|
-
color: 'default',
|
|
5468
|
-
descriptions: {
|
|
5469
|
-
title: i18n('close.title'),
|
|
5470
|
-
tooltip: i18n('close.description'),
|
|
5471
|
-
permission: i18n('close.permission'),
|
|
5472
|
-
audit: i18n('close.audit')
|
|
5473
|
-
}
|
|
5474
|
-
},
|
|
5475
|
-
Complete: {
|
|
5476
|
-
key: AXPSystemActionType.Complete,
|
|
5477
|
-
title: i18n('complete.title'),
|
|
5478
|
-
icon: 'fa-light fa-check',
|
|
5479
|
-
color: 'success',
|
|
5480
|
-
descriptions: {
|
|
5481
|
-
title: i18n('complete.title'),
|
|
5482
|
-
tooltip: i18n('complete.description'),
|
|
5483
|
-
permission: i18n('complete.permission'),
|
|
5484
|
-
audit: i18n('complete.audit')
|
|
5485
|
-
}
|
|
5486
|
-
},
|
|
5487
|
-
Save: {
|
|
5488
|
-
key: AXPSystemActionType.Save,
|
|
5489
|
-
title: i18n('save.title'),
|
|
5490
|
-
icon: 'fa-light fa-floppy-disk',
|
|
5491
|
-
color: 'primary',
|
|
5492
|
-
descriptions: {
|
|
5493
|
-
title: i18n('save.title'),
|
|
5494
|
-
tooltip: i18n('save.description'),
|
|
5495
|
-
permission: i18n('save.permission'),
|
|
5496
|
-
audit: i18n('save.audit')
|
|
5497
|
-
}
|
|
5498
|
-
},
|
|
5499
|
-
SaveAs: {
|
|
5500
|
-
key: AXPSystemActionType.SaveAs,
|
|
5501
|
-
title: i18n('save-as.title'),
|
|
5502
|
-
icon: 'fa-light fa-floppy-disk',
|
|
5503
|
-
color: 'default',
|
|
5504
|
-
descriptions: {
|
|
5505
|
-
title: i18n('save-as.title'),
|
|
5506
|
-
tooltip: i18n('save-as.description'),
|
|
5507
|
-
permission: i18n('save-as.permission'),
|
|
5508
|
-
audit: i18n('save-as.audit')
|
|
5509
|
-
}
|
|
5510
|
-
},
|
|
5511
|
-
Sync: {
|
|
5512
|
-
key: AXPSystemActionType.Sync,
|
|
5513
|
-
title: i18n('sync.title'),
|
|
5514
|
-
icon: 'fa-light fa-arrows-rotate',
|
|
5515
|
-
color: 'default',
|
|
5516
|
-
descriptions: {
|
|
5517
|
-
title: i18n('sync.title'),
|
|
5518
|
-
tooltip: i18n('sync.description'),
|
|
5519
|
-
permission: i18n('sync.permission'),
|
|
5520
|
-
audit: i18n('sync.audit')
|
|
5521
|
-
}
|
|
5522
|
-
},
|
|
5523
|
-
Reset: {
|
|
5524
|
-
key: AXPSystemActionType.Reset,
|
|
5525
|
-
title: i18n('reset.title'),
|
|
5526
|
-
icon: 'fa-light fa-arrow-rotate-left',
|
|
5527
|
-
color: 'warning',
|
|
5528
|
-
critical: true,
|
|
5529
|
-
descriptions: {
|
|
5530
|
-
title: i18n('reset.title'),
|
|
5531
|
-
tooltip: i18n('reset.description'),
|
|
5532
|
-
permission: i18n('reset.permission'),
|
|
5533
|
-
audit: i18n('reset.audit')
|
|
5534
|
-
}
|
|
5535
|
-
},
|
|
5536
|
-
Clear: {
|
|
5537
|
-
key: AXPSystemActionType.Clear,
|
|
5538
|
-
title: i18n('clear.title'),
|
|
5539
|
-
icon: 'fa-light fa-eraser',
|
|
5540
|
-
color: 'default',
|
|
5541
|
-
descriptions: {
|
|
5542
|
-
title: i18n('clear.title'),
|
|
5543
|
-
tooltip: i18n('clear.description'),
|
|
5544
|
-
permission: i18n('clear.permission'),
|
|
5545
|
-
audit: i18n('clear.audit')
|
|
5546
|
-
}
|
|
5547
|
-
},
|
|
5548
|
-
Distribution: {
|
|
5549
|
-
key: AXPSystemActionType.Distribution,
|
|
5550
|
-
title: i18n('distribution.title'),
|
|
5551
|
-
icon: 'fa-light fa-share-nodes',
|
|
5552
|
-
color: 'default',
|
|
5553
|
-
descriptions: {
|
|
5554
|
-
title: i18n('distribution.title'),
|
|
5555
|
-
tooltip: i18n('distribution.description'),
|
|
5556
|
-
permission: i18n('distribution.permission'),
|
|
5557
|
-
audit: i18n('distribution.audit')
|
|
5558
|
-
}
|
|
5559
|
-
},
|
|
5560
|
-
});
|
|
5561
|
-
function getSystemActions(type) {
|
|
5562
|
-
return Object.values(AXPSystemActions).find(action => action.key === type);
|
|
5563
|
-
}
|
|
5564
|
-
/**
|
|
5565
|
-
* Resolves the visual appearance (color and icon) for entity actions
|
|
5566
|
-
* using the system actions from the core module.
|
|
5567
|
-
*/
|
|
5568
|
-
function resolveActionLook(actionType) {
|
|
5569
|
-
// Try to get system action first
|
|
5570
|
-
const systemActionType = actionType;
|
|
5571
|
-
if (systemActionType) {
|
|
5572
|
-
const systemAction = getSystemActions(systemActionType);
|
|
5573
|
-
if (systemAction) {
|
|
5574
|
-
return {
|
|
5575
|
-
color: (systemAction.color || 'default'),
|
|
5576
|
-
icon: systemAction.icon || ''
|
|
5577
|
-
};
|
|
5578
|
-
}
|
|
5579
|
-
}
|
|
5580
|
-
// Fallback for unknown actions
|
|
5581
|
-
return {
|
|
5582
|
-
color: 'default',
|
|
5583
|
-
icon: ''
|
|
5584
|
-
};
|
|
5585
|
-
}
|
|
5586
|
-
/**
|
|
5587
|
-
* Resolves the title, description, icon and color for button actions
|
|
5588
|
-
* using the system actions from the core module.
|
|
5589
|
-
* @param actionType
|
|
5590
|
-
* @returns
|
|
5591
|
-
*/
|
|
5592
|
-
function getActionButton(actionType) {
|
|
5593
|
-
const systemActionType = actionType;
|
|
5594
|
-
if (systemActionType) {
|
|
5595
|
-
const systemAction = getSystemActions(systemActionType);
|
|
5596
|
-
if (systemAction) {
|
|
5597
|
-
return {
|
|
5598
|
-
name: actionType,
|
|
5599
|
-
icon: systemAction.icon || '',
|
|
5600
|
-
color: systemAction.color || 'default',
|
|
5601
|
-
title: systemAction.title,
|
|
5602
|
-
description: systemAction.descriptions.title
|
|
5603
|
-
};
|
|
5604
|
-
}
|
|
5605
|
-
}
|
|
5606
|
-
// Fallback for unknown actions
|
|
5607
|
-
return {
|
|
5608
|
-
name: actionType,
|
|
5609
|
-
title: actionType,
|
|
5610
|
-
description: `Perform ${actionType} action`,
|
|
5611
|
-
icon: '',
|
|
5612
|
-
color: 'default'
|
|
5613
|
-
};
|
|
5614
|
-
}
|
|
5615
|
-
|
|
5616
|
-
//#region ---- Core-only data types (CDK-coupled) ----
|
|
5617
|
-
//#endregion
|
|
5618
|
-
|
|
5619
4034
|
function applySystemActionDefault(action, type) {
|
|
5620
4035
|
const systemAction = getSystemActions(type);
|
|
5621
4036
|
return {
|
|
@@ -5627,6 +4042,9 @@ function applySystemActionDefault(action, type) {
|
|
|
5627
4042
|
};
|
|
5628
4043
|
}
|
|
5629
4044
|
|
|
4045
|
+
//#region ---- Core-only data types (CDK-coupled) ----
|
|
4046
|
+
//#endregion
|
|
4047
|
+
|
|
5630
4048
|
class AXPImageUrlLogoConfig {
|
|
5631
4049
|
constructor(url, width, height) {
|
|
5632
4050
|
this.url = url;
|
|
@@ -5704,6 +4122,24 @@ function toFilterSearchText(value) {
|
|
|
5704
4122
|
}
|
|
5705
4123
|
return undefined;
|
|
5706
4124
|
}
|
|
4125
|
+
function toSortComparableValue(value, locale) {
|
|
4126
|
+
if (value == null) {
|
|
4127
|
+
return '';
|
|
4128
|
+
}
|
|
4129
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
4130
|
+
return value;
|
|
4131
|
+
}
|
|
4132
|
+
if (typeof value === 'string') {
|
|
4133
|
+
return value.toLocaleLowerCase(locale);
|
|
4134
|
+
}
|
|
4135
|
+
if (value instanceof Date) {
|
|
4136
|
+
return value.getTime();
|
|
4137
|
+
}
|
|
4138
|
+
if (isLocaleStringMap(value)) {
|
|
4139
|
+
return resolveMultiLanguageString(value, locale).toLocaleLowerCase(locale);
|
|
4140
|
+
}
|
|
4141
|
+
return String(value).toLocaleLowerCase(locale);
|
|
4142
|
+
}
|
|
5707
4143
|
function filterValuesAreEqual(itemRaw, condRaw) {
|
|
5708
4144
|
if (typeof condRaw === 'string' && isLocaleStringMap(itemRaw)) {
|
|
5709
4145
|
return Object.values(itemRaw).some((v) => v.toLowerCase() === condRaw.toLowerCase());
|
|
@@ -5922,11 +4358,11 @@ function applyFilterArray(dataArray, filters, logic = 'and') {
|
|
|
5922
4358
|
return dataArray;
|
|
5923
4359
|
}
|
|
5924
4360
|
}
|
|
5925
|
-
function applySortArray(dataArray, sorts) {
|
|
4361
|
+
function applySortArray(dataArray, sorts, locale = 'en-US') {
|
|
5926
4362
|
if (sorts && sorts.length > 0) {
|
|
5927
|
-
const
|
|
5928
|
-
const sortOrders = sorts.map((s) => s.dir);
|
|
5929
|
-
return orderBy(dataArray,
|
|
4363
|
+
const iteratees = sorts.map((s) => (item) => toSortComparableValue(get(item, s.field), locale));
|
|
4364
|
+
const sortOrders = sorts.map((s) => (s.dir === 'desc' ? 'desc' : 'asc'));
|
|
4365
|
+
return orderBy(dataArray, iteratees, sortOrders);
|
|
5930
4366
|
}
|
|
5931
4367
|
else
|
|
5932
4368
|
return dataArray;
|
|
@@ -6292,129 +4728,9 @@ function provideLazyProvider(token, loader, multi = true) {
|
|
|
6292
4728
|
};
|
|
6293
4729
|
}
|
|
6294
4730
|
|
|
6295
|
-
//#region ---- Unwrapping ----
|
|
6296
|
-
/**
|
|
6297
|
-
* If `raw` is a plain non-array object with a `value` property, returns `value`; otherwise returns `raw`.
|
|
6298
|
-
*/
|
|
6299
|
-
function unwrapValueProperty(raw) {
|
|
6300
|
-
if (raw && typeof raw === 'object' && !Array.isArray(raw) && !(raw instanceof Date) && 'value' in raw) {
|
|
6301
|
-
return raw.value;
|
|
6302
|
-
}
|
|
6303
|
-
return raw;
|
|
6304
|
-
}
|
|
6305
|
-
//#endregion
|
|
6306
|
-
//#region ---- Scalar coercion ----
|
|
6307
|
-
/**
|
|
6308
|
-
* Coerces to a trimmed string. Plain objects may carry `{ value }` from setting widgets or `{ id }` from select payloads using `valueField: 'id'`.
|
|
6309
|
-
*/
|
|
6310
|
-
function coerceUnknownToTrimmedString(raw) {
|
|
6311
|
-
if (typeof raw === 'string') {
|
|
6312
|
-
return raw.trim();
|
|
6313
|
-
}
|
|
6314
|
-
if (raw && typeof raw === 'object' && !Array.isArray(raw) && !(raw instanceof Date)) {
|
|
6315
|
-
const r = raw;
|
|
6316
|
-
if ('value' in r && r['value'] != null) {
|
|
6317
|
-
return String(r['value']).trim();
|
|
6318
|
-
}
|
|
6319
|
-
if ('id' in r && r['id'] != null) {
|
|
6320
|
-
return String(r['id']).trim();
|
|
6321
|
-
}
|
|
6322
|
-
}
|
|
6323
|
-
return '';
|
|
6324
|
-
}
|
|
6325
|
-
/**
|
|
6326
|
-
* Coerces to boolean: direct booleans pass through; wrapped `{ value: true | 'true' }` is respected; otherwise false.
|
|
6327
|
-
*/
|
|
6328
|
-
function coerceUnknownToBoolean(raw) {
|
|
6329
|
-
if (typeof raw === 'boolean') {
|
|
6330
|
-
return raw;
|
|
6331
|
-
}
|
|
6332
|
-
if (raw && typeof raw === 'object' && 'value' in raw) {
|
|
6333
|
-
const v = raw.value;
|
|
6334
|
-
return v === true || v === 'true';
|
|
6335
|
-
}
|
|
6336
|
-
return false;
|
|
6337
|
-
}
|
|
6338
|
-
/** Parses a finite number after optional `{ value }` unwrap; non-finite or empty string yields NaN. */
|
|
6339
|
-
function coerceUnknownToFiniteNumber(raw) {
|
|
6340
|
-
const v = unwrapValueProperty(raw);
|
|
6341
|
-
if (v === null || v === undefined) {
|
|
6342
|
-
return NaN;
|
|
6343
|
-
}
|
|
6344
|
-
if (typeof v === 'number') {
|
|
6345
|
-
return Number.isFinite(v) ? v : NaN;
|
|
6346
|
-
}
|
|
6347
|
-
if (typeof v === 'boolean') {
|
|
6348
|
-
return v ? 1 : 0;
|
|
6349
|
-
}
|
|
6350
|
-
if (typeof v === 'string') {
|
|
6351
|
-
const t = v.trim();
|
|
6352
|
-
if (t === '') {
|
|
6353
|
-
return NaN;
|
|
6354
|
-
}
|
|
6355
|
-
const n = Number(t);
|
|
6356
|
-
return Number.isFinite(n) ? n : NaN;
|
|
6357
|
-
}
|
|
6358
|
-
return NaN;
|
|
6359
|
-
}
|
|
6360
|
-
/** Parses a Date after optional `{ value }` unwrap; invalid input yields Invalid Date. */
|
|
6361
|
-
function coerceUnknownToDate(raw) {
|
|
6362
|
-
const v = unwrapValueProperty(raw);
|
|
6363
|
-
if (v === null || v === undefined) {
|
|
6364
|
-
return new Date(NaN);
|
|
6365
|
-
}
|
|
6366
|
-
if (v instanceof Date) {
|
|
6367
|
-
return new Date(v.getTime());
|
|
6368
|
-
}
|
|
6369
|
-
if (typeof v === 'number' && Number.isFinite(v)) {
|
|
6370
|
-
return new Date(v);
|
|
6371
|
-
}
|
|
6372
|
-
if (typeof v === 'string') {
|
|
6373
|
-
const t = v.trim();
|
|
6374
|
-
if (t === '') {
|
|
6375
|
-
return new Date(NaN);
|
|
6376
|
-
}
|
|
6377
|
-
return new Date(t);
|
|
6378
|
-
}
|
|
6379
|
-
return new Date(NaN);
|
|
6380
|
-
}
|
|
6381
|
-
//#endregion
|
|
6382
|
-
|
|
6383
|
-
function extractTextFromHtml(value) {
|
|
6384
|
-
const div = document.createElement('div');
|
|
6385
|
-
div.innerHTML = value;
|
|
6386
|
-
return div.textContent || div.innerText || '';
|
|
6387
|
-
}
|
|
6388
|
-
/**
|
|
6389
|
-
* True when the string likely contains HTML markup (e.g. `<p>`, `<ul>`), as opposed to plain text.
|
|
6390
|
-
* Used to choose innerHTML vs text interpolation for multilingual fields.
|
|
6391
|
-
*/
|
|
6392
|
-
function containsHtmlMarkup(value) {
|
|
6393
|
-
if (value == null) {
|
|
6394
|
-
return false;
|
|
6395
|
-
}
|
|
6396
|
-
const t = value.trim();
|
|
6397
|
-
if (!t) {
|
|
6398
|
-
return false;
|
|
6399
|
-
}
|
|
6400
|
-
return /<\/?[a-z][\s\S]*?>/i.test(t);
|
|
6401
|
-
}
|
|
6402
|
-
/**
|
|
6403
|
-
* Generate kebab-case group name from title
|
|
6404
|
-
*/
|
|
6405
|
-
function generateKebabCase(title) {
|
|
6406
|
-
return title
|
|
6407
|
-
.toLowerCase()
|
|
6408
|
-
.trim()
|
|
6409
|
-
.replace(/[^a-z0-9\s-]/g, '') // Remove special characters
|
|
6410
|
-
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
6411
|
-
.replace(/-+/g, '-') // Replace multiple hyphens with single
|
|
6412
|
-
.replace(/^-+|-+$/g, ''); // Remove leading/trailing hyphens
|
|
6413
|
-
}
|
|
6414
|
-
|
|
6415
4731
|
/**
|
|
6416
4732
|
* Generated bundle index. Do not edit.
|
|
6417
4733
|
*/
|
|
6418
4734
|
|
|
6419
|
-
export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPCatalogScopeDefinitionProviderService, AXPCatalogScopeDefinitionsDataSourceDefinition, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPContentCheckerDirective,
|
|
4735
|
+
export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPCatalogScopeDefinitionProviderService, AXPCatalogScopeDefinitionsDataSourceDefinition, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPContentCheckerDirective, AXPContextDefinitionProviderService, AXPContextEvalFactory, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDebugService, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPIdleSchedulerService, AXPImageUrlLogoConfig, AXPKeyboardShortcutPriority, AXPKeyboardShortcutRegistry, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPModuleManifestsDataSourceDefinition, AXPScreenSize, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_CATALOG_SCOPE_DEFINITION_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_COLUMN_WIDTH_PROVIDER, AXP_CONTEXT_DEFINITION_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXP_SESSION_SERVICE, AXP_TAG_PROVIDER, AX_OVERLAY_CONTAINER_SELECTOR, AX_OVERLAY_PANE_SELECTOR, DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS, DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS, FORM_DIRTY_TRACE_NS, OVERLAY_DETAILS_VIEW_TRACE_NS, OVERLAY_LAYOUT_TRACE_NS, OVERLAY_ROOT_LAYOUT_TRACE_NS, OVERLAY_WIDGET_SETTLE_TRACE_NS, applyContextEvalPipes, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, chordToKbdItemKeys, contextEvalWithPipes, createProviderWithInjectionContext, defaultColumnWidthProvider, findOverlayContainerAncestor, formatKeyboardShortcutChord, formatKeyboardShortcutChords, getNestedVisibleOverlayPanes, getPrimaryKeyboardShortcutChord, getTopVisibleOverlayContainer, getVisibleAnchoredOverlayPanes, getVisibleOverlayContainers, hasForegroundOverlayLayer, isDialogShortcutAllowedInEditableField, isHorizontalDirectionalShortcutKey, isKeyboardTargetInsideEditableField, isMacPlatform, isVisibleOverlayElement, matchesDialogActionShortcut, matchesKeyboardShortcutChord, mirrorHorizontalDirectionalKey, normalizeContextEvalPipes, normalizeDialogActionShortcutChord, normalizeExpressionTemplate, normalizeKeyboardShortcut, normalizeKeyboardShortcuts, objectKeyValueTransforms, parseDialogActionShortcut, parseKeyboardShortcutChord, provideLazyProvider, registerPopupFooterKeyboardShortcuts, resolveConfiguredFooterActionShortcuts, resolveDialogActionShortcuts, resolveDisplayShortcutChord, resolveEffectiveDirectionBehavior, resolveSemanticDirectionalKey, setupPopupFooterKeyboardShortcuts, shouldDeferEscapeToOpenOverlay, shouldTriggerDialogActionShortcut };
|
|
6420
4736
|
//# sourceMappingURL=acorex-platform-core.mjs.map
|