@juicemantics/veloiq-ui 0.6.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 +87 -47
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +87 -47
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1019,7 +1019,7 @@ var CommandCenterPortal = ({
|
|
|
1019
1019
|
}, [query, parsedCommand, search, clear]);
|
|
1020
1020
|
const allModelChildren = React5.useMemo(
|
|
1021
1021
|
() => menuItems.flatMap(
|
|
1022
|
-
(m) => (m.children || []).map((c) => ({ ...c, moduleLabel: String(m.label || m.name || "") }))
|
|
1022
|
+
(m) => (m.children || []).filter((c) => !c.meta?.hide).map((c) => ({ ...c, moduleLabel: String(m.label || m.name || "") }))
|
|
1023
1023
|
),
|
|
1024
1024
|
[menuItems]
|
|
1025
1025
|
);
|
|
@@ -1037,8 +1037,8 @@ var CommandCenterPortal = ({
|
|
|
1037
1037
|
}, [allModelChildren]);
|
|
1038
1038
|
const modules = React5.useMemo(() => {
|
|
1039
1039
|
const q2 = parsedCommand ? parsedCommand.modelQuery : query.toLowerCase().trim();
|
|
1040
|
-
const
|
|
1041
|
-
const sorted = navConfig.length > 0 ? sortItemsByNavConfig(
|
|
1040
|
+
const visibleModules = menuItems.filter((item) => item.children && item.children.length > 0).map((item) => ({ ...item, children: (item.children || []).filter((c) => !c.meta?.hide) })).filter((item) => item.children && item.children.length > 0);
|
|
1041
|
+
const sorted = navConfig.length > 0 ? sortItemsByNavConfig(visibleModules, navConfig) : visibleModules;
|
|
1042
1042
|
if (!q2) return sorted;
|
|
1043
1043
|
return sorted.map((module) => {
|
|
1044
1044
|
const moduleMatch = (module.label || "").toLowerCase().includes(q2);
|
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
12738
|
-
}, [relatedModel
|
|
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
|
|
12741
|
-
}, [relatedModel
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
|
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
|
|
15136
|
+
align: field.type === "number" && !isReferenceField(field) && !isPkField(field, relatedModel) ? "right" : void 0,
|
|
15121
15137
|
render: (value, row) => {
|
|
15122
|
-
if (allowInlineEdit && field
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
18285
|
-
const pkValue = explicitPk ?? (
|
|
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
|
|
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
|
|
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);
|
|
@@ -20157,18 +20173,38 @@ var DynamicList = ({ model: modelProp, allModels, filter, relationConfig, isEmbe
|
|
|
20157
20173
|
|
|
20158
20174
|
// src/components/MultiPane/paneUtils.ts
|
|
20159
20175
|
function parsePanes(searchParams) {
|
|
20160
|
-
|
|
20161
|
-
|
|
20162
|
-
|
|
20163
|
-
|
|
20164
|
-
|
|
20165
|
-
|
|
20166
|
-
|
|
20167
|
-
|
|
20176
|
+
const standard = searchParams.getAll("pane");
|
|
20177
|
+
if (standard.length > 0) {
|
|
20178
|
+
return standard.map((param) => {
|
|
20179
|
+
const colonIdx = param.indexOf(":");
|
|
20180
|
+
if (colonIdx < 1) return null;
|
|
20181
|
+
const resource = param.slice(0, colonIdx);
|
|
20182
|
+
const id = param.slice(colonIdx + 1);
|
|
20183
|
+
if (!resource || !id) return null;
|
|
20184
|
+
return { resource, id };
|
|
20185
|
+
}).filter((p) => p !== null);
|
|
20186
|
+
}
|
|
20187
|
+
const legacy = [];
|
|
20188
|
+
for (const [key, value] of searchParams.entries()) {
|
|
20189
|
+
if (/^pane(?:\[\d*\])?$/.test(key)) {
|
|
20190
|
+
const colonIdx = value.indexOf(":");
|
|
20191
|
+
if (colonIdx < 1) continue;
|
|
20192
|
+
const resource = value.slice(0, colonIdx);
|
|
20193
|
+
const id = value.slice(colonIdx + 1);
|
|
20194
|
+
if (resource && id) {
|
|
20195
|
+
legacy.push({ resource, id });
|
|
20196
|
+
}
|
|
20197
|
+
}
|
|
20198
|
+
}
|
|
20199
|
+
return legacy;
|
|
20168
20200
|
}
|
|
20169
20201
|
function applyPanesToSearchParams(existing, panes) {
|
|
20170
20202
|
const next = new URLSearchParams(existing);
|
|
20171
|
-
|
|
20203
|
+
for (const [key] of existing.entries()) {
|
|
20204
|
+
if (key === "pane" || /^pane\[\d+\]$/.test(key)) {
|
|
20205
|
+
next.delete(key);
|
|
20206
|
+
}
|
|
20207
|
+
}
|
|
20172
20208
|
panes.forEach((p) => next.append("pane", `${p.resource}:${p.id}`));
|
|
20173
20209
|
return next;
|
|
20174
20210
|
}
|
|
@@ -20321,11 +20357,15 @@ var MultiPaneLayout = ({ children }) => {
|
|
|
20321
20357
|
React5.useEffect(() => {
|
|
20322
20358
|
const newCount = panes.length;
|
|
20323
20359
|
const prevCount = prevPaneCountRef.current;
|
|
20324
|
-
|
|
20325
|
-
if (newCount <= prevCount || !pendingLayoutRef.current || !groupRef.current) {
|
|
20360
|
+
if (!pendingLayoutRef.current || !groupRef.current) {
|
|
20326
20361
|
pendingLayoutRef.current = null;
|
|
20327
20362
|
return;
|
|
20328
20363
|
}
|
|
20364
|
+
if (newCount <= prevCount) {
|
|
20365
|
+
pendingLayoutRef.current = null;
|
|
20366
|
+
return;
|
|
20367
|
+
}
|
|
20368
|
+
prevPaneCountRef.current = newCount;
|
|
20329
20369
|
const prevLayout = pendingLayoutRef.current;
|
|
20330
20370
|
pendingLayoutRef.current = null;
|
|
20331
20371
|
const donorId = prevCount === 0 ? LIST_PANEL_ID : detailPanelId(prevCount - 1);
|
|
@@ -21780,7 +21820,7 @@ function generateResources(models, moduleName, options = {}) {
|
|
|
21780
21820
|
};
|
|
21781
21821
|
const children = (models || []).map((model) => {
|
|
21782
21822
|
const resource = model.resource || model.name;
|
|
21783
|
-
const isRelation = hideRelations && (resource.toLowerCase().endsWith("_relation") || resource.toLowerCase().endsWith("_rela") || Array.isArray(model.fields) && model.fields.some((f) => f?.key === "eid_from") && model.fields.some((f) => f?.key === "eid_to"));
|
|
21823
|
+
const isRelation = hideRelations && (resource.toLowerCase().endsWith("_relation") || resource.toLowerCase().endsWith("_rela") || (Array.isArray(model.fields) && model.fields.some((f) => f?.key === "eid_from") && model.fields.some((f) => f?.key === "eid_to") || model.fields.length > 0 && model.fields.every((f) => !!f?.reference)));
|
|
21784
21824
|
return {
|
|
21785
21825
|
name: resource,
|
|
21786
21826
|
list: `/${resource}`,
|