@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.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) => list.map((item) => {
343
- const childrenWalked = Array.isArray(item?.children) && item.children.length ? walk(item.children) : item?.children;
344
- const moduleName = moduleNameOf(item);
345
- const extra = moduleName ? byModule[moduleName] : void 0;
346
- if (extra && extra.length) {
347
- return { ...item, children: [...extra, ...childrenWalked || []] };
348
- }
349
- if (childrenWalked !== item?.children) return { ...item, children: childrenWalked };
350
- return item;
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 hasChildren = item.children && item.children.length > 0;
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 hasChildren = item.children && item.children.length > 0;
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) => items.map((item) => ({
1557
- key: item.key,
1558
- label: item.label || item.name || item.key,
1559
- icon: item.icon,
1560
- onClick: item.children?.length ? void 0 : () => {
1561
- go({ to: item.route });
1562
- onClose();
1563
- },
1564
- children: item.children?.length ? transformItems(item.children) : void 0
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(`${API_URL4}/auth/change-password`, {
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
- return relations.find(
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.key === "eid") {
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.key === "eid" && record?._label) {
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.key === "eid" && strValue.startsWith("__catrange__:")) {
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.key === "eid" && record?._label) {
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.key === "eid" || (field.type !== "number" || field.reference));
12711
- }, [relatedModel.fields]);
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.key !== "eid" && field.type === "number" && !field.reference);
12714
- }, [relatedModel.fields]);
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.key === "eid") return;
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.key === "eid" && recordRow?._label) return recordRow._label;
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.key === "eid" && recordRow?._label) return recordRow._label;
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.isPk && field.key !== "eid").map((field) => ({ label: field.label, value: field.key })),
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.key === "eid") return "count";
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: rel.otherKey || "Related",
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
- if (!id) return "-";
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: String(id)
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.key === "eid" && recordRow?._label) {
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.reference && !["eid", "eid_from", "eid_to"].includes(field.key) ? "right" : void 0,
15132
+ align: field.type === "number" && !isReferenceField(field) && !isPkField(field, relatedModel) ? "right" : void 0,
15094
15133
  render: (value, row) => {
15095
- if (allowInlineEdit && field.key !== "eid") {
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.key === "eid" && row._label) return row._label;
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.key === "eid" && record?._label) return record._label;
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.key === "eid" || (field.type !== "number" || field.reference));
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.key !== "eid" && field.type === "number" && !field.reference);
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.key === "eid" && record?._label) return record._label;
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.isPk && field.key !== "eid").map((field) => ({ label: field.label, value: field.key })),
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 (["eid", "eid_from", "eid_to"].includes(field.key)) return "count";
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 isPkField = model.fields?.find((f) => f.isPk)?.key;
18258
- const pkValue = explicitPk ?? (isPkField ? record[isPkField] : void 0) ?? record.eid ?? record.id ?? null;
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.reference && !["eid", "eid_from", "eid_to"].includes(field.key) ? "right" : void 0,
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.key === "eid" && record._label) return record._label;
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: {