@juicemantics/veloiq-ui 0.7.0 → 0.8.3
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/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +109 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +109 -66
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -19,7 +19,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
19
19
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
20
20
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
21
21
|
var ColorModeContext = createContext({ mode: "light", setMode: () => {
|
|
22
|
-
} });
|
|
22
|
+
}, schemaVersion: 0 });
|
|
23
23
|
|
|
24
24
|
// src/utils/modelTone.ts
|
|
25
25
|
var MODEL_TONES_LIGHT = [
|
|
@@ -58,6 +58,16 @@ var _modulesColorSchema = typeof localStorage !== "undefined" && localStorage.ge
|
|
|
58
58
|
var _modelsColorSchema = typeof localStorage !== "undefined" && localStorage.getItem("jm_modelsColorSchema") || "plain-color";
|
|
59
59
|
var _customPlainToneLight = null;
|
|
60
60
|
var _customPlainToneDark = null;
|
|
61
|
+
var _colorSchemaListeners = [];
|
|
62
|
+
var onColorSchemaChange = (listener) => {
|
|
63
|
+
_colorSchemaListeners.push(listener);
|
|
64
|
+
return () => {
|
|
65
|
+
_colorSchemaListeners = _colorSchemaListeners.filter((l) => l !== listener);
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
var _notifyColorSchemaListeners = () => {
|
|
69
|
+
for (const l of [..._colorSchemaListeners]) l();
|
|
70
|
+
};
|
|
61
71
|
var hexToRgb = (hex) => {
|
|
62
72
|
const match = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
63
73
|
if (!match) return null;
|
|
@@ -192,6 +202,7 @@ var setColorSchemas = (schemas) => {
|
|
|
192
202
|
}
|
|
193
203
|
}
|
|
194
204
|
}
|
|
205
|
+
_notifyColorSchemaListeners();
|
|
195
206
|
};
|
|
196
207
|
var hashString = (input) => {
|
|
197
208
|
let hash = 0;
|
|
@@ -221,7 +232,7 @@ var getModelTone = (modelLike, darkMode) => {
|
|
|
221
232
|
return tones[hashString(seed) % tones.length];
|
|
222
233
|
};
|
|
223
234
|
var useModelTone = (modelLike) => {
|
|
224
|
-
const { mode } = useContext(ColorModeContext);
|
|
235
|
+
const { mode, schemaVersion } = useContext(ColorModeContext);
|
|
225
236
|
return getModelTone(modelLike, mode === "dark");
|
|
226
237
|
};
|
|
227
238
|
var getContrastingTextColor = (background) => isDarkColor(background) ? "#f8fafc" : "#0f172a";
|
|
@@ -276,6 +287,7 @@ function getNavEntry(navConfig, key) {
|
|
|
276
287
|
return navConfig.find((e) => e.key === key);
|
|
277
288
|
}
|
|
278
289
|
function sortItemsByNavConfig(items, navConfig) {
|
|
290
|
+
if (!Array.isArray(items)) return [];
|
|
279
291
|
return [...items].sort((a, b) => {
|
|
280
292
|
const aSeq = getNavEntry(navConfig, a.key ?? a.name ?? "")?.sequence ?? 999;
|
|
281
293
|
const bSeq = getNavEntry(navConfig, b.key ?? b.name ?? "")?.sequence ?? 999;
|
|
@@ -331,6 +343,7 @@ function useJourneyMenuItems() {
|
|
|
331
343
|
return byModule;
|
|
332
344
|
}
|
|
333
345
|
function injectJourneyMenuItems(items, byModule) {
|
|
346
|
+
if (!Array.isArray(items)) return [];
|
|
334
347
|
if (!byModule || Object.keys(byModule).length === 0) return items;
|
|
335
348
|
const moduleNameOf = (item) => {
|
|
336
349
|
let key = String(item?.key ?? item?.name ?? "");
|
|
@@ -339,16 +352,20 @@ function injectJourneyMenuItems(items, byModule) {
|
|
|
339
352
|
if (byModule[key]) return key;
|
|
340
353
|
return null;
|
|
341
354
|
};
|
|
342
|
-
const walk = (list) =>
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
355
|
+
const walk = (list) => {
|
|
356
|
+
if (!Array.isArray(list)) return [];
|
|
357
|
+
return list.map((item) => {
|
|
358
|
+
const safeChildren = Array.isArray(item?.children) ? item.children : [];
|
|
359
|
+
const childrenWalked = safeChildren.length ? walk(safeChildren) : safeChildren;
|
|
360
|
+
const moduleName = moduleNameOf(item);
|
|
361
|
+
const extra = moduleName ? byModule[moduleName] : void 0;
|
|
362
|
+
if (extra && extra.length) {
|
|
363
|
+
return { ...item, children: [...extra, ...Array.isArray(childrenWalked) ? childrenWalked : []] };
|
|
364
|
+
}
|
|
365
|
+
if (childrenWalked !== item?.children) return { ...item, children: Array.isArray(childrenWalked) ? childrenWalked : item?.children };
|
|
366
|
+
return item;
|
|
367
|
+
});
|
|
368
|
+
};
|
|
352
369
|
return walk(items);
|
|
353
370
|
}
|
|
354
371
|
var HorizontalMenu = ({ navConfig = [] }) => {
|
|
@@ -395,8 +412,10 @@ var HorizontalMenu = ({ navConfig = [] }) => {
|
|
|
395
412
|
);
|
|
396
413
|
};
|
|
397
414
|
const transformItems = (items2, depth = 0) => {
|
|
415
|
+
if (!Array.isArray(items2)) return [];
|
|
398
416
|
return items2.map((item) => {
|
|
399
|
-
const
|
|
417
|
+
const safeChildren = Array.isArray(item?.children) ? item.children : [];
|
|
418
|
+
const hasChildren = safeChildren.length > 0;
|
|
400
419
|
return {
|
|
401
420
|
key: item.key,
|
|
402
421
|
label: renderLabel(item, depth, hasChildren),
|
|
@@ -467,8 +486,10 @@ var CustomSider = ({ collapsed, logo, appTitle, navConfig = [] }) => {
|
|
|
467
486
|
);
|
|
468
487
|
};
|
|
469
488
|
const transformItems = (items2, depth = 0) => {
|
|
489
|
+
if (!Array.isArray(items2)) return [];
|
|
470
490
|
return items2.map((item) => {
|
|
471
|
-
const
|
|
491
|
+
const safeChildren = Array.isArray(item?.children) ? item.children : [];
|
|
492
|
+
const hasChildren = safeChildren.length > 0;
|
|
472
493
|
return {
|
|
473
494
|
key: item.key,
|
|
474
495
|
label: renderLabel(item, depth, hasChildren),
|
|
@@ -497,7 +518,7 @@ var CustomSider = ({ collapsed, logo, appTitle, navConfig = [] }) => {
|
|
|
497
518
|
theme: mode === "dark" ? "dark" : "light",
|
|
498
519
|
style: {
|
|
499
520
|
borderRight: `1px solid ${token.colorBorderSecondary}`,
|
|
500
|
-
background: token.colorBgContainer,
|
|
521
|
+
background: mode === "dark" ? token.colorBgContainer : token.colorBgLayout,
|
|
501
522
|
height: "100vh",
|
|
502
523
|
position: "sticky",
|
|
503
524
|
top: 0,
|
|
@@ -1542,7 +1563,6 @@ function useNavModules() {
|
|
|
1542
1563
|
const navConfig = useNavConfig();
|
|
1543
1564
|
return (navConfig || []).filter((e) => e.type === "module" && String(e.key || "").startsWith("module:")).map((e) => ({ value: String(e.key).slice("module:".length), label: e.label || String(e.key).slice("module:".length) }));
|
|
1544
1565
|
}
|
|
1545
|
-
var API_URL4 = "/api";
|
|
1546
1566
|
var DefaultLogo = ({ logo, appTitle, collapsed, isHeader = false, hideTitle = false }) => {
|
|
1547
1567
|
const logoEl = typeof logo === "string" ? /* @__PURE__ */ jsx("img", { src: logo, alt: appTitle || "App", style: { height: isHeader ? "32px" : "40px", width: "auto", marginRight: collapsed || hideTitle ? 0 : 10 } }) : logo ? /* @__PURE__ */ jsx("span", { style: { marginRight: collapsed || hideTitle ? 0 : 10, display: "flex", alignItems: "center" }, children: logo }) : null;
|
|
1548
1568
|
return /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: collapsed ? "center" : "flex-start", padding: isHeader ? 0 : "10px 0" }, children: [
|
|
@@ -1553,16 +1573,19 @@ var DefaultLogo = ({ logo, appTitle, collapsed, isHeader = false, hideTitle = fa
|
|
|
1553
1573
|
var MobileMenuContent = ({ onClose }) => {
|
|
1554
1574
|
const { menuItems, selectedKey } = useMenu();
|
|
1555
1575
|
const go = useGo();
|
|
1556
|
-
const transformItems = (items) =>
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1576
|
+
const transformItems = (items) => {
|
|
1577
|
+
if (!Array.isArray(items)) return [];
|
|
1578
|
+
return items.map((item) => ({
|
|
1579
|
+
key: item.key,
|
|
1580
|
+
label: item.label || item.name || item.key,
|
|
1581
|
+
icon: item.icon,
|
|
1582
|
+
onClick: item.children?.length ? void 0 : () => {
|
|
1583
|
+
go({ to: item.route });
|
|
1584
|
+
onClose();
|
|
1585
|
+
},
|
|
1586
|
+
children: item.children?.length ? transformItems(item.children) : void 0
|
|
1587
|
+
}));
|
|
1588
|
+
};
|
|
1566
1589
|
return /* @__PURE__ */ jsx(
|
|
1567
1590
|
Menu,
|
|
1568
1591
|
{
|
|
@@ -1615,7 +1638,7 @@ var LayoutWrapper = ({
|
|
|
1615
1638
|
const handleChangePassword = async (values) => {
|
|
1616
1639
|
setPwdLoading(true);
|
|
1617
1640
|
try {
|
|
1618
|
-
const res = await authenticatedFetch(
|
|
1641
|
+
const res = await authenticatedFetch(`/auth/change-password`, {
|
|
1619
1642
|
method: "PUT",
|
|
1620
1643
|
headers: { "Content-Type": "application/json" },
|
|
1621
1644
|
body: JSON.stringify(values)
|
|
@@ -3992,6 +4015,12 @@ var getRecordId = (record, fields) => {
|
|
|
3992
4015
|
}
|
|
3993
4016
|
return record.eid ?? record.id;
|
|
3994
4017
|
};
|
|
4018
|
+
var isPkField = (field, model) => {
|
|
4019
|
+
if (field.isPk === true) return true;
|
|
4020
|
+
if (model?.pkField != null && field.key === model.pkField) return true;
|
|
4021
|
+
return false;
|
|
4022
|
+
};
|
|
4023
|
+
var isReferenceField = (field) => !!field.reference;
|
|
3995
4024
|
var getListViewFields = (model, filterField) => {
|
|
3996
4025
|
const baseFields = filterField ? model.fields.filter((field) => field.key !== filterField) : model.fields;
|
|
3997
4026
|
return baseFields.slice(0, 6);
|
|
@@ -4462,9 +4491,14 @@ var resolveRelationFromConfig = (relations, item) => {
|
|
|
4462
4491
|
(rel) => (rel.relationName || "").toLowerCase() === target || (rel.resource || "").toLowerCase() === target || (rel.label || "").toLowerCase() === target
|
|
4463
4492
|
);
|
|
4464
4493
|
if (exact) return exact;
|
|
4465
|
-
|
|
4494
|
+
const byVariant = relations.find(
|
|
4466
4495
|
(rel) => targetVariants.has((rel.relationName || "").toLowerCase()) || targetVariants.has((rel.resource || "").toLowerCase()) || targetVariants.has((rel.label || "").toLowerCase())
|
|
4467
4496
|
);
|
|
4497
|
+
if (byVariant) return byVariant;
|
|
4498
|
+
const relPathBase = (rel) => String(rel.resourcePath || "").toLowerCase().replace(/_relation$/, "");
|
|
4499
|
+
return relations.find(
|
|
4500
|
+
(rel) => relPathBase(rel) === target || targetVariants.has(relPathBase(rel))
|
|
4501
|
+
);
|
|
4468
4502
|
};
|
|
4469
4503
|
var buildConfiguredRelationKeys = (rows) => {
|
|
4470
4504
|
const keys = /* @__PURE__ */ new Set();
|
|
@@ -8433,7 +8467,7 @@ function buildColumnFilterOptions({
|
|
|
8433
8467
|
}) {
|
|
8434
8468
|
const filtersMap = /* @__PURE__ */ new Map();
|
|
8435
8469
|
for (const field of fields) {
|
|
8436
|
-
if (field
|
|
8470
|
+
if (isPkField(field)) {
|
|
8437
8471
|
const labelValues = [];
|
|
8438
8472
|
for (const record of data) {
|
|
8439
8473
|
const lbl = record?._label;
|
|
@@ -8540,7 +8574,7 @@ function buildColumnFilterOptions({
|
|
|
8540
8574
|
for (const record of data) {
|
|
8541
8575
|
let value = record?.[field.key];
|
|
8542
8576
|
let label = value;
|
|
8543
|
-
if (field
|
|
8577
|
+
if (isPkField(field) && record?._label) {
|
|
8544
8578
|
value = record.eid;
|
|
8545
8579
|
label = record._label;
|
|
8546
8580
|
}
|
|
@@ -8581,7 +8615,7 @@ function matchesColumnFilterValue(field, record, value) {
|
|
|
8581
8615
|
const recordVal = String(record?.[field.key] ?? "");
|
|
8582
8616
|
return recordVal.localeCompare(lo) >= 0 && recordVal.localeCompare(hi) <= 0;
|
|
8583
8617
|
}
|
|
8584
|
-
if (field
|
|
8618
|
+
if (isPkField(field) && strValue.startsWith("__catrange__:")) {
|
|
8585
8619
|
const sub = strValue.substring("__catrange__:".length);
|
|
8586
8620
|
const sepIdx = sub.indexOf(":");
|
|
8587
8621
|
const lo = decodeURIComponent(sub.substring(0, sepIdx));
|
|
@@ -8589,7 +8623,7 @@ function matchesColumnFilterValue(field, record, value) {
|
|
|
8589
8623
|
const recordLabel = String(record?._label ?? "");
|
|
8590
8624
|
return recordLabel.localeCompare(lo) >= 0 && recordLabel.localeCompare(hi) <= 0;
|
|
8591
8625
|
}
|
|
8592
|
-
if (field
|
|
8626
|
+
if (isPkField(field) && record?._label) {
|
|
8593
8627
|
return String(record._label) === strValue || String(record.eid) === strValue;
|
|
8594
8628
|
}
|
|
8595
8629
|
return String(record?.[field.key]) === strValue;
|
|
@@ -12707,11 +12741,11 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
12707
12741
|
}
|
|
12708
12742
|
}, [apiUrl, categoryField1, categoryField2, chartType, selectedSeriesKeys, summaryFn, rankingMode, rankingFieldKey, rankingN, crosstabFilterFields, relatedModel.name, relatedModel.resource, allModels]);
|
|
12709
12743
|
const categoricalFields = useMemo(() => {
|
|
12710
|
-
return relatedModel.fields.filter((field) => field
|
|
12711
|
-
}, [relatedModel
|
|
12744
|
+
return relatedModel.fields.filter((field) => isPkField(field, relatedModel) || (field.type !== "number" || field.reference));
|
|
12745
|
+
}, [relatedModel]);
|
|
12712
12746
|
const numericFields = useMemo(() => {
|
|
12713
|
-
return relatedModel.fields.filter((field) => field
|
|
12714
|
-
}, [relatedModel
|
|
12747
|
+
return relatedModel.fields.filter((field) => !isPkField(field, relatedModel) && field.type === "number" && !field.reference);
|
|
12748
|
+
}, [relatedModel]);
|
|
12715
12749
|
const resetLayoutDefaults = useCallback(() => {
|
|
12716
12750
|
setListVisible(true);
|
|
12717
12751
|
setAnalyzeOpen(false);
|
|
@@ -13280,7 +13314,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
13280
13314
|
if (!rowValues) return;
|
|
13281
13315
|
const payload = {};
|
|
13282
13316
|
relatedModel.fields.forEach((field) => {
|
|
13283
|
-
if (field
|
|
13317
|
+
if (isPkField(field, relatedModel)) return;
|
|
13284
13318
|
if (!Object.prototype.hasOwnProperty.call(rowValues, field.key)) return;
|
|
13285
13319
|
const newVal = normalizeFieldValue(field, rowValues[field.key]);
|
|
13286
13320
|
const oldVal = normalizeFieldValue(field, row?.[field.key]);
|
|
@@ -13381,7 +13415,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
13381
13415
|
const getSortValue = useCallback((field, recordRow) => {
|
|
13382
13416
|
const raw = recordRow?.[field.key];
|
|
13383
13417
|
if (raw === void 0 || raw === null) return null;
|
|
13384
|
-
if (field
|
|
13418
|
+
if (isPkField(field, relatedModel) && recordRow?._label) return recordRow._label;
|
|
13385
13419
|
if (field.reference) {
|
|
13386
13420
|
const cacheKey = `${field.reference}:${raw}`;
|
|
13387
13421
|
return labelCache[cacheKey] ?? raw;
|
|
@@ -13657,7 +13691,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
13657
13691
|
if (!field) return _34("All");
|
|
13658
13692
|
const raw = recordRow?.[field.key];
|
|
13659
13693
|
if (raw === void 0 || raw === null) return "-";
|
|
13660
|
-
if (field
|
|
13694
|
+
if (isPkField(field, relatedModel) && recordRow?._label) return recordRow._label;
|
|
13661
13695
|
if (field.reference) {
|
|
13662
13696
|
const cacheKey = `${field.reference}:${raw}`;
|
|
13663
13697
|
return labelCache[cacheKey] || String(raw);
|
|
@@ -13677,7 +13711,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
13677
13711
|
return parts.filter(Boolean).join(" \u2022 ");
|
|
13678
13712
|
}, [categoryField1, categoryField2, relatedModel.fields, relatedModel.label, relatedModel.name]);
|
|
13679
13713
|
const chartData = useMemo(() => {
|
|
13680
|
-
const data = columnFilteredRows
|
|
13714
|
+
const data = Array.isArray(columnFilteredRows) ? columnFilteredRows : [];
|
|
13681
13715
|
const cat1Field = categoryField1 ? relatedModel.fields.find((field) => field.key === categoryField1) : void 0;
|
|
13682
13716
|
const cat2Field = categoryField2 ? relatedModel.fields.find((field) => field.key === categoryField2) : void 0;
|
|
13683
13717
|
const groupMap = /* @__PURE__ */ new Map();
|
|
@@ -13938,7 +13972,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
13938
13972
|
setSelectedSeriesKeys(value);
|
|
13939
13973
|
},
|
|
13940
13974
|
style: { width: "100%" },
|
|
13941
|
-
options: relatedModel.fields.filter((field) => !field
|
|
13975
|
+
options: relatedModel.fields.filter((field) => !isPkField(field, relatedModel)).map((field) => ({ label: field.label, value: field.key })),
|
|
13942
13976
|
placeholder: _34("All numeric fields"),
|
|
13943
13977
|
maxTagCount: "responsive"
|
|
13944
13978
|
}
|
|
@@ -14205,9 +14239,9 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
14205
14239
|
}, [columnFilteredRows, displayFields, labelCache]);
|
|
14206
14240
|
const isTotalsDetailsVariant = viewVariant === "totals-details";
|
|
14207
14241
|
const getDefaultTotalsSummaryFn = useCallback((field) => {
|
|
14208
|
-
if (field
|
|
14242
|
+
if (isPkField(field, relatedModel)) return "count";
|
|
14209
14243
|
return "sum";
|
|
14210
|
-
}, []);
|
|
14244
|
+
}, [relatedModel]);
|
|
14211
14245
|
const resolveTotalsSummaryFn = useCallback((field) => {
|
|
14212
14246
|
return totalsSummaryFunctions[field.key] || getDefaultTotalsSummaryFn(field);
|
|
14213
14247
|
}, [getDefaultTotalsSummaryFn, totalsSummaryFunctions]);
|
|
@@ -15041,10 +15075,15 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
15041
15075
|
allowInlineEdit && /* @__PURE__ */ jsx(
|
|
15042
15076
|
Table.Column,
|
|
15043
15077
|
{
|
|
15044
|
-
title:
|
|
15078
|
+
title: relatedModel.label || relatedModel.name,
|
|
15079
|
+
sorter: { compare: (a, b) => getRecordDisplayLabel(a).localeCompare(getRecordDisplayLabel(b)) },
|
|
15080
|
+
filters: Array.from(new Set((filteredRows || []).map((r) => getRecordDisplayLabel(r)))).map((label) => ({ text: label, value: label })),
|
|
15081
|
+
filterSearch: true,
|
|
15082
|
+
onFilter: (value, row) => getRecordDisplayLabel(row) === String(value),
|
|
15045
15083
|
render: (_unused, row) => {
|
|
15046
15084
|
const id = row?.eid ?? row?.id;
|
|
15047
|
-
|
|
15085
|
+
const label = getRecordDisplayLabel(row);
|
|
15086
|
+
if (!id) return label;
|
|
15048
15087
|
return /* @__PURE__ */ jsx(
|
|
15049
15088
|
"a",
|
|
15050
15089
|
{
|
|
@@ -15059,7 +15098,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
15059
15098
|
}
|
|
15060
15099
|
},
|
|
15061
15100
|
style: { cursor: "pointer", color: "inherit", textDecoration: "none" },
|
|
15062
|
-
children:
|
|
15101
|
+
children: label
|
|
15063
15102
|
}
|
|
15064
15103
|
);
|
|
15065
15104
|
}
|
|
@@ -15084,15 +15123,15 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
15084
15123
|
}
|
|
15085
15124
|
}),
|
|
15086
15125
|
onFilter: (value, recordRow) => {
|
|
15087
|
-
if (field
|
|
15126
|
+
if (isPkField(field, relatedModel) && recordRow?._label) {
|
|
15088
15127
|
return String(recordRow._label) === String(value) || String(recordRow.eid) === String(value);
|
|
15089
15128
|
}
|
|
15090
15129
|
const recordValue = recordRow?.[field.key];
|
|
15091
15130
|
return String(recordValue) === String(value);
|
|
15092
15131
|
},
|
|
15093
|
-
align: field.type === "number" && !field
|
|
15132
|
+
align: field.type === "number" && !isReferenceField(field) && !isPkField(field, relatedModel) ? "right" : void 0,
|
|
15094
15133
|
render: (value, row) => {
|
|
15095
|
-
if (allowInlineEdit && field
|
|
15134
|
+
if (allowInlineEdit && !isPkField(field, relatedModel)) {
|
|
15096
15135
|
const rowId = row?.eid ?? row?.id ?? row?.__relationKey;
|
|
15097
15136
|
return /* @__PURE__ */ jsx(
|
|
15098
15137
|
Form.Item,
|
|
@@ -15114,7 +15153,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
|
|
|
15114
15153
|
const cacheKey = `${field.reference}:${value}`;
|
|
15115
15154
|
return labelCache[cacheKey] || value;
|
|
15116
15155
|
}
|
|
15117
|
-
if (field
|
|
15156
|
+
if (isPkField(field, relatedModel) && row._label) return row._label;
|
|
15118
15157
|
if (field.type === "boolean") return /* @__PURE__ */ jsx(Checkbox, { checked: value, disabled: true });
|
|
15119
15158
|
if (field.type === "number" && !field.reference) {
|
|
15120
15159
|
const formatted = formatNumberValue(value);
|
|
@@ -16649,7 +16688,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
16649
16688
|
const getSortValue = useCallback((field, record) => {
|
|
16650
16689
|
const raw = record?.[field.key];
|
|
16651
16690
|
if (raw === void 0 || raw === null) return null;
|
|
16652
|
-
if (field
|
|
16691
|
+
if (isPkField(field, model) && record?._label) return record._label;
|
|
16653
16692
|
if (field.reference) {
|
|
16654
16693
|
const cacheKey = `${field.reference}:${raw}`;
|
|
16655
16694
|
return labelCache[cacheKey] ?? raw;
|
|
@@ -16828,7 +16867,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
16828
16867
|
}, [allRowsData, useLocalSearch, localSearch, model.fields, labelCache]);
|
|
16829
16868
|
const isClientFiltering = allRowsLoaded && !allRowsError;
|
|
16830
16869
|
const filteredDataSource = useMemo(() => {
|
|
16831
|
-
if (!isClientFiltering) return tableProps.dataSource
|
|
16870
|
+
if (!isClientFiltering) return Array.isArray(tableProps.dataSource) ? tableProps.dataSource : [];
|
|
16832
16871
|
const baseRows = allRows || [];
|
|
16833
16872
|
return applyFilterRules(applyGlobalSearch(baseRows));
|
|
16834
16873
|
}, [allRows, applyFilterRules, applyGlobalSearch, isClientFiltering, tableProps.dataSource]);
|
|
@@ -16847,7 +16886,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
16847
16886
|
setGalleryPage(1);
|
|
16848
16887
|
}, [localSearch, filterRules, resolvedListViewType]);
|
|
16849
16888
|
const columnFilters = useMemo(() => {
|
|
16850
|
-
const data = allRowsData.length > 0 ? allRowsData : tableProps.dataSource
|
|
16889
|
+
const data = allRowsData.length > 0 ? allRowsData : Array.isArray(tableProps.dataSource) ? tableProps.dataSource : [];
|
|
16851
16890
|
const rangeCount = viewSettings?.maxDistinctColumnFilterValuesToRanges ?? 20;
|
|
16852
16891
|
return buildColumnFilterOptions({ fields: displayFields, data, rangeCount });
|
|
16853
16892
|
}, [allRowsData, displayFields, tableProps.dataSource, viewSettings]);
|
|
@@ -16934,10 +16973,10 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
16934
16973
|
};
|
|
16935
16974
|
}, [handleTablePageChange, isClientFiltering, pageSize, tableProps.pagination]);
|
|
16936
16975
|
const categoricalFields = useMemo(() => {
|
|
16937
|
-
return model.fields.filter((field) => field
|
|
16976
|
+
return model.fields.filter((field) => isPkField(field, model) || (field.type !== "number" || field.reference));
|
|
16938
16977
|
}, [model.fields]);
|
|
16939
16978
|
const numericFields = useMemo(() => {
|
|
16940
|
-
return model.fields.filter((field) => field
|
|
16979
|
+
return model.fields.filter((field) => !isPkField(field, model) && field.type === "number" && !field.reference);
|
|
16941
16980
|
}, [model.fields]);
|
|
16942
16981
|
const hasActiveRangeColumnFilter = useMemo(() => {
|
|
16943
16982
|
return Object.values(columnFiltersSelected).some(
|
|
@@ -17536,7 +17575,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
17536
17575
|
if (!field) return _36("All");
|
|
17537
17576
|
const raw = record?.[field.key];
|
|
17538
17577
|
if (raw === void 0 || raw === null) return "-";
|
|
17539
|
-
if (field
|
|
17578
|
+
if (isPkField(field, model) && record?._label) return record._label;
|
|
17540
17579
|
if (field.reference) {
|
|
17541
17580
|
const cacheKey = `${field.reference}:${raw}`;
|
|
17542
17581
|
return labelCache[cacheKey] || String(raw);
|
|
@@ -17551,7 +17590,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
17551
17590
|
return String(raw);
|
|
17552
17591
|
}, [labelCache]);
|
|
17553
17592
|
const chartData = useMemo(() => {
|
|
17554
|
-
const data = columnFilteredDataSource
|
|
17593
|
+
const data = Array.isArray(columnFilteredDataSource) ? columnFilteredDataSource : [];
|
|
17555
17594
|
const cat1Field = categoryField1 ? model.fields.find((field) => field.key === categoryField1) : void 0;
|
|
17556
17595
|
const cat2Field = categoryField2 ? model.fields.find((field) => field.key === categoryField2) : void 0;
|
|
17557
17596
|
const groupMap = /* @__PURE__ */ new Map();
|
|
@@ -17733,7 +17772,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
17733
17772
|
}, [isCrosstabView, categoryField1, categoryField2, crosstabFilterFields, allRowsData, columnFilteredDataSource, model.fields, allModels, apiUrl, handleReferenceLabel]);
|
|
17734
17773
|
const crosstabFilterOptions = useMemo(() => {
|
|
17735
17774
|
if (crosstabFilterFields.length === 0) return /* @__PURE__ */ new Map();
|
|
17736
|
-
const data = allRowsData.length > 0 ? allRowsData : tableProps.dataSource
|
|
17775
|
+
const data = allRowsData.length > 0 ? allRowsData : Array.isArray(tableProps.dataSource) ? tableProps.dataSource : [];
|
|
17737
17776
|
const rangeCount = viewSettings?.maxDistinctColumnFilterValuesToRanges ?? 20;
|
|
17738
17777
|
const fields = crosstabFilterFields.map((k) => model.fields.find((f) => f.key === k)).filter((f) => Boolean(f));
|
|
17739
17778
|
return buildColumnFilterOptions({ fields, data, rangeCount });
|
|
@@ -17806,7 +17845,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
17806
17845
|
setSelectedSeriesKeys(value);
|
|
17807
17846
|
},
|
|
17808
17847
|
style: { width: "100%" },
|
|
17809
|
-
options: model.fields.filter((field) => !field
|
|
17848
|
+
options: model.fields.filter((field) => !isPkField(field, model)).map((field) => ({ label: field.label, value: field.key })),
|
|
17810
17849
|
placeholder: _36("All numeric fields"),
|
|
17811
17850
|
maxTagCount: "responsive"
|
|
17812
17851
|
}
|
|
@@ -17957,7 +17996,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
17957
17996
|
});
|
|
17958
17997
|
}, [isTotalsDetailsView, allRows, displayFields, labelCache]);
|
|
17959
17998
|
const getDefaultTotalsSummaryFn = useCallback((field) => {
|
|
17960
|
-
if (
|
|
17999
|
+
if (isPkField(field, model) || isReferenceField(field)) return "count";
|
|
17961
18000
|
return "sum";
|
|
17962
18001
|
}, []);
|
|
17963
18002
|
const resolveTotalsSummaryFn = useCallback((field) => {
|
|
@@ -18254,8 +18293,8 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
18254
18293
|
}
|
|
18255
18294
|
const resourceName = model.isNamedQuery && model.primaryResource ? model.primaryResource : model.resource || model.name;
|
|
18256
18295
|
const explicitPk = model.pkField ? record[model.pkField] : void 0;
|
|
18257
|
-
const
|
|
18258
|
-
const pkValue = explicitPk ?? (
|
|
18296
|
+
const isPkField2 = model.fields?.find((f) => f.isPk)?.key;
|
|
18297
|
+
const pkValue = explicitPk ?? (isPkField2 ? record[isPkField2] : void 0) ?? record.eid ?? record.id ?? null;
|
|
18259
18298
|
if (pkValue != null) {
|
|
18260
18299
|
return { resource: resourceName, id: pkValue, isLinkRow: false };
|
|
18261
18300
|
}
|
|
@@ -18400,7 +18439,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
18400
18439
|
getRowKeyRef.current = getRowKey;
|
|
18401
18440
|
const handleBulkRowSelectionChange = useCallback(
|
|
18402
18441
|
(newKeys, newRowsOnPage) => {
|
|
18403
|
-
const currentPageData = isClientFiltering ? filteredDataSource : tableProps.dataSource
|
|
18442
|
+
const currentPageData = isClientFiltering ? filteredDataSource : Array.isArray(tableProps.dataSource) ? tableProps.dataSource : [];
|
|
18404
18443
|
const currentPageKeys = new Set(currentPageData.map((r) => String(getRowKeyRef.current(r))));
|
|
18405
18444
|
const newKeySet = new Set(newKeys.map((k) => String(k)));
|
|
18406
18445
|
newRowsOnPage.forEach((row) => {
|
|
@@ -19652,7 +19691,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
19652
19691
|
dataIndex: field.key,
|
|
19653
19692
|
title: field.label,
|
|
19654
19693
|
sorter: { compare: (a, b) => compareSortValues(field, a, b), multiple: getSortPriority(columnSort, field.key) },
|
|
19655
|
-
align: field.type === "number" && !field
|
|
19694
|
+
align: field.type === "number" && !isReferenceField(field) && !isPkField(field, model) ? "right" : void 0,
|
|
19656
19695
|
filters: columnFilters.get(field.key),
|
|
19657
19696
|
filteredValue: columnFiltersSelected[field.key] || null,
|
|
19658
19697
|
sortOrder: columnSort.find((item) => item.fieldKey === field.key)?.order ?? null,
|
|
@@ -19687,7 +19726,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
19687
19726
|
}
|
|
19688
19727
|
);
|
|
19689
19728
|
}
|
|
19690
|
-
if (field
|
|
19729
|
+
if (isPkField(field, model) && record._label) return record._label;
|
|
19691
19730
|
if (field.type === "boolean") return /* @__PURE__ */ jsx(Checkbox, { checked: value, disabled: true });
|
|
19692
19731
|
if (field.type === "number" && !field.reference) {
|
|
19693
19732
|
const formatted = formatNumberValue(value);
|
|
@@ -20839,6 +20878,10 @@ var ColorModeContextProvider = ({
|
|
|
20839
20878
|
colorModeFromLocalStorage === "dark" || colorModeFromLocalStorage === "light" ? colorModeFromLocalStorage : systemPreference
|
|
20840
20879
|
);
|
|
20841
20880
|
const initializedFromServer = useRef(false);
|
|
20881
|
+
const [schemaVersion, setSchemaVersion] = useState(0);
|
|
20882
|
+
useEffect(() => {
|
|
20883
|
+
return onColorSchemaChange(() => setSchemaVersion((v) => v + 1));
|
|
20884
|
+
}, []);
|
|
20842
20885
|
useEffect(() => {
|
|
20843
20886
|
let cancelled = false;
|
|
20844
20887
|
const load = async () => {
|
|
@@ -20880,7 +20923,7 @@ var ColorModeContextProvider = ({
|
|
|
20880
20923
|
void saveToServer(newMode);
|
|
20881
20924
|
}, [saveToServer]);
|
|
20882
20925
|
const { darkAlgorithm, defaultAlgorithm } = theme;
|
|
20883
|
-
return /* @__PURE__ */ jsx(ColorModeContext.Provider, { value: { mode, setMode: setColorMode }, children: /* @__PURE__ */ jsx(
|
|
20926
|
+
return /* @__PURE__ */ jsx(ColorModeContext.Provider, { value: { mode, setMode: setColorMode, schemaVersion }, children: /* @__PURE__ */ jsx(
|
|
20884
20927
|
ConfigProvider,
|
|
20885
20928
|
{
|
|
20886
20929
|
theme: {
|