@juicemantics/veloiq-ui 0.7.0 → 0.8.0

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.js CHANGED
@@ -4019,6 +4019,12 @@ var getRecordId = (record, fields) => {
4019
4019
  }
4020
4020
  return record.eid ?? record.id;
4021
4021
  };
4022
+ var isPkField = (field, model) => {
4023
+ if (field.isPk === true) return true;
4024
+ if (model?.pkField != null && field.key === model.pkField) return true;
4025
+ return false;
4026
+ };
4027
+ var isReferenceField = (field) => !!field.reference;
4022
4028
  var getListViewFields = (model, filterField) => {
4023
4029
  const baseFields = filterField ? model.fields.filter((field) => field.key !== filterField) : model.fields;
4024
4030
  return baseFields.slice(0, 6);
@@ -4489,9 +4495,14 @@ var resolveRelationFromConfig = (relations, item) => {
4489
4495
  (rel) => (rel.relationName || "").toLowerCase() === target || (rel.resource || "").toLowerCase() === target || (rel.label || "").toLowerCase() === target
4490
4496
  );
4491
4497
  if (exact) return exact;
4492
- return relations.find(
4498
+ const byVariant = relations.find(
4493
4499
  (rel) => targetVariants.has((rel.relationName || "").toLowerCase()) || targetVariants.has((rel.resource || "").toLowerCase()) || targetVariants.has((rel.label || "").toLowerCase())
4494
4500
  );
4501
+ if (byVariant) return byVariant;
4502
+ const relPathBase = (rel) => String(rel.resourcePath || "").toLowerCase().replace(/_relation$/, "");
4503
+ return relations.find(
4504
+ (rel) => relPathBase(rel) === target || targetVariants.has(relPathBase(rel))
4505
+ );
4495
4506
  };
4496
4507
  var buildConfiguredRelationKeys = (rows) => {
4497
4508
  const keys = /* @__PURE__ */ new Set();
@@ -8460,7 +8471,7 @@ function buildColumnFilterOptions({
8460
8471
  }) {
8461
8472
  const filtersMap = /* @__PURE__ */ new Map();
8462
8473
  for (const field of fields) {
8463
- if (field.key === "eid") {
8474
+ if (isPkField(field)) {
8464
8475
  const labelValues = [];
8465
8476
  for (const record of data) {
8466
8477
  const lbl = record?._label;
@@ -8567,7 +8578,7 @@ function buildColumnFilterOptions({
8567
8578
  for (const record of data) {
8568
8579
  let value = record?.[field.key];
8569
8580
  let label = value;
8570
- if (field.key === "eid" && record?._label) {
8581
+ if (isPkField(field) && record?._label) {
8571
8582
  value = record.eid;
8572
8583
  label = record._label;
8573
8584
  }
@@ -8608,7 +8619,7 @@ function matchesColumnFilterValue(field, record, value) {
8608
8619
  const recordVal = String(record?.[field.key] ?? "");
8609
8620
  return recordVal.localeCompare(lo) >= 0 && recordVal.localeCompare(hi) <= 0;
8610
8621
  }
8611
- if (field.key === "eid" && strValue.startsWith("__catrange__:")) {
8622
+ if (isPkField(field) && strValue.startsWith("__catrange__:")) {
8612
8623
  const sub = strValue.substring("__catrange__:".length);
8613
8624
  const sepIdx = sub.indexOf(":");
8614
8625
  const lo = decodeURIComponent(sub.substring(0, sepIdx));
@@ -8616,7 +8627,7 @@ function matchesColumnFilterValue(field, record, value) {
8616
8627
  const recordLabel = String(record?._label ?? "");
8617
8628
  return recordLabel.localeCompare(lo) >= 0 && recordLabel.localeCompare(hi) <= 0;
8618
8629
  }
8619
- if (field.key === "eid" && record?._label) {
8630
+ if (isPkField(field) && record?._label) {
8620
8631
  return String(record._label) === strValue || String(record.eid) === strValue;
8621
8632
  }
8622
8633
  return String(record?.[field.key]) === strValue;
@@ -12734,11 +12745,11 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
12734
12745
  }
12735
12746
  }, [apiUrl, categoryField1, categoryField2, chartType, selectedSeriesKeys, summaryFn, rankingMode, rankingFieldKey, rankingN, crosstabFilterFields, relatedModel.name, relatedModel.resource, allModels]);
12736
12747
  const categoricalFields = React5.useMemo(() => {
12737
- return relatedModel.fields.filter((field) => field.key === "eid" || (field.type !== "number" || field.reference));
12738
- }, [relatedModel.fields]);
12748
+ return relatedModel.fields.filter((field) => isPkField(field, relatedModel) || (field.type !== "number" || field.reference));
12749
+ }, [relatedModel]);
12739
12750
  const numericFields = React5.useMemo(() => {
12740
- return relatedModel.fields.filter((field) => field.key !== "eid" && field.type === "number" && !field.reference);
12741
- }, [relatedModel.fields]);
12751
+ return relatedModel.fields.filter((field) => !isPkField(field, relatedModel) && field.type === "number" && !field.reference);
12752
+ }, [relatedModel]);
12742
12753
  const resetLayoutDefaults = React5.useCallback(() => {
12743
12754
  setListVisible(true);
12744
12755
  setAnalyzeOpen(false);
@@ -13307,7 +13318,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
13307
13318
  if (!rowValues) return;
13308
13319
  const payload = {};
13309
13320
  relatedModel.fields.forEach((field) => {
13310
- if (field.key === "eid") return;
13321
+ if (isPkField(field, relatedModel)) return;
13311
13322
  if (!Object.prototype.hasOwnProperty.call(rowValues, field.key)) return;
13312
13323
  const newVal = normalizeFieldValue(field, rowValues[field.key]);
13313
13324
  const oldVal = normalizeFieldValue(field, row?.[field.key]);
@@ -13408,7 +13419,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
13408
13419
  const getSortValue = React5.useCallback((field, recordRow) => {
13409
13420
  const raw = recordRow?.[field.key];
13410
13421
  if (raw === void 0 || raw === null) return null;
13411
- if (field.key === "eid" && recordRow?._label) return recordRow._label;
13422
+ if (isPkField(field, relatedModel) && recordRow?._label) return recordRow._label;
13412
13423
  if (field.reference) {
13413
13424
  const cacheKey = `${field.reference}:${raw}`;
13414
13425
  return labelCache[cacheKey] ?? raw;
@@ -13684,7 +13695,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
13684
13695
  if (!field) return _34("All");
13685
13696
  const raw = recordRow?.[field.key];
13686
13697
  if (raw === void 0 || raw === null) return "-";
13687
- if (field.key === "eid" && recordRow?._label) return recordRow._label;
13698
+ if (isPkField(field, relatedModel) && recordRow?._label) return recordRow._label;
13688
13699
  if (field.reference) {
13689
13700
  const cacheKey = `${field.reference}:${raw}`;
13690
13701
  return labelCache[cacheKey] || String(raw);
@@ -13965,7 +13976,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
13965
13976
  setSelectedSeriesKeys(value);
13966
13977
  },
13967
13978
  style: { width: "100%" },
13968
- options: relatedModel.fields.filter((field) => !field.isPk && field.key !== "eid").map((field) => ({ label: field.label, value: field.key })),
13979
+ options: relatedModel.fields.filter((field) => !isPkField(field, relatedModel)).map((field) => ({ label: field.label, value: field.key })),
13969
13980
  placeholder: _34("All numeric fields"),
13970
13981
  maxTagCount: "responsive"
13971
13982
  }
@@ -14232,9 +14243,9 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
14232
14243
  }, [columnFilteredRows, displayFields, labelCache]);
14233
14244
  const isTotalsDetailsVariant = viewVariant === "totals-details";
14234
14245
  const getDefaultTotalsSummaryFn = React5.useCallback((field) => {
14235
- if (field.key === "eid") return "count";
14246
+ if (isPkField(field, relatedModel)) return "count";
14236
14247
  return "sum";
14237
- }, []);
14248
+ }, [relatedModel]);
14238
14249
  const resolveTotalsSummaryFn = React5.useCallback((field) => {
14239
14250
  return totalsSummaryFunctions[field.key] || getDefaultTotalsSummaryFn(field);
14240
14251
  }, [getDefaultTotalsSummaryFn, totalsSummaryFunctions]);
@@ -15068,10 +15079,15 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
15068
15079
  allowInlineEdit && /* @__PURE__ */ jsxRuntime.jsx(
15069
15080
  antd.Table.Column,
15070
15081
  {
15071
- title: rel.otherKey || "Related",
15082
+ title: relatedModel.label || relatedModel.name,
15083
+ sorter: { compare: (a, b) => getRecordDisplayLabel(a).localeCompare(getRecordDisplayLabel(b)) },
15084
+ filters: Array.from(new Set((filteredRows || []).map((r) => getRecordDisplayLabel(r)))).map((label) => ({ text: label, value: label })),
15085
+ filterSearch: true,
15086
+ onFilter: (value, row) => getRecordDisplayLabel(row) === String(value),
15072
15087
  render: (_unused, row) => {
15073
15088
  const id = row?.eid ?? row?.id;
15074
- if (!id) return "-";
15089
+ const label = getRecordDisplayLabel(row);
15090
+ if (!id) return label;
15075
15091
  return /* @__PURE__ */ jsxRuntime.jsx(
15076
15092
  "a",
15077
15093
  {
@@ -15086,7 +15102,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
15086
15102
  }
15087
15103
  },
15088
15104
  style: { cursor: "pointer", color: "inherit", textDecoration: "none" },
15089
- children: String(id)
15105
+ children: label
15090
15106
  }
15091
15107
  );
15092
15108
  }
@@ -15111,15 +15127,15 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
15111
15127
  }
15112
15128
  }),
15113
15129
  onFilter: (value, recordRow) => {
15114
- if (field.key === "eid" && recordRow?._label) {
15130
+ if (isPkField(field, relatedModel) && recordRow?._label) {
15115
15131
  return String(recordRow._label) === String(value) || String(recordRow.eid) === String(value);
15116
15132
  }
15117
15133
  const recordValue = recordRow?.[field.key];
15118
15134
  return String(recordValue) === String(value);
15119
15135
  },
15120
- align: field.type === "number" && !field.reference && !["eid", "eid_from", "eid_to"].includes(field.key) ? "right" : void 0,
15136
+ align: field.type === "number" && !isReferenceField(field) && !isPkField(field, relatedModel) ? "right" : void 0,
15121
15137
  render: (value, row) => {
15122
- if (allowInlineEdit && field.key !== "eid") {
15138
+ if (allowInlineEdit && !isPkField(field, relatedModel)) {
15123
15139
  const rowId = row?.eid ?? row?.id ?? row?.__relationKey;
15124
15140
  return /* @__PURE__ */ jsxRuntime.jsx(
15125
15141
  antd.Form.Item,
@@ -15141,7 +15157,7 @@ var RelatedObjectsTable = ({ rel, record, relatedModel, parentModel, showActions
15141
15157
  const cacheKey = `${field.reference}:${value}`;
15142
15158
  return labelCache[cacheKey] || value;
15143
15159
  }
15144
- if (field.key === "eid" && row._label) return row._label;
15160
+ if (isPkField(field, relatedModel) && row._label) return row._label;
15145
15161
  if (field.type === "boolean") return /* @__PURE__ */ jsxRuntime.jsx(antd.Checkbox, { checked: value, disabled: true });
15146
15162
  if (field.type === "number" && !field.reference) {
15147
15163
  const formatted = formatNumberValue(value);
@@ -16676,7 +16692,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
16676
16692
  const getSortValue = React5.useCallback((field, record) => {
16677
16693
  const raw = record?.[field.key];
16678
16694
  if (raw === void 0 || raw === null) return null;
16679
- if (field.key === "eid" && record?._label) return record._label;
16695
+ if (isPkField(field, model) && record?._label) return record._label;
16680
16696
  if (field.reference) {
16681
16697
  const cacheKey = `${field.reference}:${raw}`;
16682
16698
  return labelCache[cacheKey] ?? raw;
@@ -16961,10 +16977,10 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
16961
16977
  };
16962
16978
  }, [handleTablePageChange, isClientFiltering, pageSize, tableProps.pagination]);
16963
16979
  const categoricalFields = React5.useMemo(() => {
16964
- return model.fields.filter((field) => field.key === "eid" || (field.type !== "number" || field.reference));
16980
+ return model.fields.filter((field) => isPkField(field, model) || (field.type !== "number" || field.reference));
16965
16981
  }, [model.fields]);
16966
16982
  const numericFields = React5.useMemo(() => {
16967
- return model.fields.filter((field) => field.key !== "eid" && field.type === "number" && !field.reference);
16983
+ return model.fields.filter((field) => !isPkField(field, model) && field.type === "number" && !field.reference);
16968
16984
  }, [model.fields]);
16969
16985
  const hasActiveRangeColumnFilter = React5.useMemo(() => {
16970
16986
  return Object.values(columnFiltersSelected).some(
@@ -17563,7 +17579,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
17563
17579
  if (!field) return _36("All");
17564
17580
  const raw = record?.[field.key];
17565
17581
  if (raw === void 0 || raw === null) return "-";
17566
- if (field.key === "eid" && record?._label) return record._label;
17582
+ if (isPkField(field, model) && record?._label) return record._label;
17567
17583
  if (field.reference) {
17568
17584
  const cacheKey = `${field.reference}:${raw}`;
17569
17585
  return labelCache[cacheKey] || String(raw);
@@ -17833,7 +17849,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
17833
17849
  setSelectedSeriesKeys(value);
17834
17850
  },
17835
17851
  style: { width: "100%" },
17836
- options: model.fields.filter((field) => !field.isPk && field.key !== "eid").map((field) => ({ label: field.label, value: field.key })),
17852
+ options: model.fields.filter((field) => !isPkField(field, model)).map((field) => ({ label: field.label, value: field.key })),
17837
17853
  placeholder: _36("All numeric fields"),
17838
17854
  maxTagCount: "responsive"
17839
17855
  }
@@ -17984,7 +18000,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
17984
18000
  });
17985
18001
  }, [isTotalsDetailsView, allRows, displayFields, labelCache]);
17986
18002
  const getDefaultTotalsSummaryFn = React5.useCallback((field) => {
17987
- if (["eid", "eid_from", "eid_to"].includes(field.key)) return "count";
18003
+ if (isPkField(field, model) || isReferenceField(field)) return "count";
17988
18004
  return "sum";
17989
18005
  }, []);
17990
18006
  const resolveTotalsSummaryFn = React5.useCallback((field) => {
@@ -18281,8 +18297,8 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
18281
18297
  }
18282
18298
  const resourceName = model.isNamedQuery && model.primaryResource ? model.primaryResource : model.resource || model.name;
18283
18299
  const explicitPk = model.pkField ? record[model.pkField] : void 0;
18284
- const isPkField = model.fields?.find((f) => f.isPk)?.key;
18285
- const pkValue = explicitPk ?? (isPkField ? record[isPkField] : void 0) ?? record.eid ?? record.id ?? null;
18300
+ const isPkField2 = model.fields?.find((f) => f.isPk)?.key;
18301
+ const pkValue = explicitPk ?? (isPkField2 ? record[isPkField2] : void 0) ?? record.eid ?? record.id ?? null;
18286
18302
  if (pkValue != null) {
18287
18303
  return { resource: resourceName, id: pkValue, isLinkRow: false };
18288
18304
  }
@@ -19679,7 +19695,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
19679
19695
  dataIndex: field.key,
19680
19696
  title: field.label,
19681
19697
  sorter: { compare: (a, b) => compareSortValues(field, a, b), multiple: getSortPriority(columnSort, field.key) },
19682
- align: field.type === "number" && !field.reference && !["eid", "eid_from", "eid_to"].includes(field.key) ? "right" : void 0,
19698
+ align: field.type === "number" && !isReferenceField(field) && !isPkField(field, model) ? "right" : void 0,
19683
19699
  filters: columnFilters.get(field.key),
19684
19700
  filteredValue: columnFiltersSelected[field.key] || null,
19685
19701
  sortOrder: columnSort.find((item) => item.fieldKey === field.key)?.order ?? null,
@@ -19714,7 +19730,7 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
19714
19730
  }
19715
19731
  );
19716
19732
  }
19717
- if (field.key === "eid" && record._label) return record._label;
19733
+ if (isPkField(field, model) && record._label) return record._label;
19718
19734
  if (field.type === "boolean") return /* @__PURE__ */ jsxRuntime.jsx(antd.Checkbox, { checked: value, disabled: true });
19719
19735
  if (field.type === "number" && !field.reference) {
19720
19736
  const formatted = formatNumberValue(value);