@open-mercato/ui 0.9.1-develop.7499.1.fcec456e4e → 0.9.1-develop.7513.1.ae2715553f

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.
Files changed (33) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/backend/CrudForm.js +56 -36
  3. package/dist/backend/CrudForm.js.map +2 -2
  4. package/dist/backend/DataTable.js +40 -14
  5. package/dist/backend/DataTable.js.map +2 -2
  6. package/dist/backend/columns/ColumnChooserPanel.js +4 -3
  7. package/dist/backend/columns/ColumnChooserPanel.js.map +2 -2
  8. package/dist/backend/crud/injectedFieldGroups.js +50 -0
  9. package/dist/backend/crud/injectedFieldGroups.js.map +7 -0
  10. package/dist/backend/filters/FilterFieldPicker.js +3 -2
  11. package/dist/backend/filters/FilterFieldPicker.js.map +2 -2
  12. package/dist/backend/utils/api.js +25 -4
  13. package/dist/backend/utils/api.js.map +2 -2
  14. package/dist/backend/utils/groupLabels.js +16 -0
  15. package/dist/backend/utils/groupLabels.js.map +7 -0
  16. package/dist/theme/QueryProvider.js +7 -1
  17. package/dist/theme/QueryProvider.js.map +2 -2
  18. package/package.json +3 -3
  19. package/src/backend/CrudForm.tsx +68 -45
  20. package/src/backend/DataTable.tsx +54 -14
  21. package/src/backend/__tests__/CrudForm.fieldInjection.test.tsx +85 -4
  22. package/src/backend/__tests__/DataTable.injectedColumnPlacement.test.tsx +146 -0
  23. package/src/backend/columns/ColumnChooserPanel.tsx +4 -3
  24. package/src/backend/columns/__tests__/ColumnChooserPanel.groupLabels.test.tsx +72 -0
  25. package/src/backend/crud/__tests__/injectedFieldGroups.test.ts +90 -0
  26. package/src/backend/crud/injectedFieldGroups.ts +75 -0
  27. package/src/backend/filters/FilterFieldPicker.tsx +3 -2
  28. package/src/backend/filters/__tests__/FilterFieldPicker.groupLabels.test.tsx +77 -0
  29. package/src/backend/utils/__tests__/api.test.ts +67 -0
  30. package/src/backend/utils/api.ts +33 -4
  31. package/src/backend/utils/groupLabels.ts +26 -0
  32. package/src/theme/QueryProvider.tsx +7 -1
  33. package/src/theme/__tests__/QueryProvider.i18n.test.tsx +40 -0
@@ -52,7 +52,7 @@ import { surfaceRecordConflict } from "./conflicts/index.js";
52
52
  import { ComponentReplacementHandles } from "@open-mercato/shared/modules/widgets/component-registry";
53
53
  import { useRegisteredComponent } from "./injection/useRegisteredComponent.js";
54
54
  import { dataTableExtensionSpotId, extensionSpotChildId } from "@open-mercato/shared/modules/widgets/extension-points";
55
- import { insertByInjectionPlacement } from "@open-mercato/shared/modules/widgets/injection-position";
55
+ import { insertByInjectionPlacement, InjectionPosition } from "@open-mercato/shared/modules/widgets/injection-position";
56
56
  import { useVirtualizer } from "@tanstack/react-virtual";
57
57
  import { getDefaultOperator, isAdvancedFilterState, flatToTree } from "@open-mercato/shared/lib/query/advanced-filter";
58
58
  import {
@@ -111,6 +111,37 @@ function withDataTableNamespaces(mappedRow, sourceItem) {
111
111
  ...namespaced
112
112
  };
113
113
  }
114
+ function reconcileColumnOrder(prev, ids, placements = /* @__PURE__ */ new Map()) {
115
+ const allowed = new Set(ids);
116
+ const result = prev.filter((id) => allowed.has(id));
117
+ const known = new Set(result);
118
+ ids.forEach((id, index) => {
119
+ if (known.has(id)) return;
120
+ const placement = placements.get(id);
121
+ const anchorIndex = placement?.relativeTo ? result.indexOf(placement.relativeTo) : -1;
122
+ if (anchorIndex !== -1 && (placement?.position === InjectionPosition.Before || placement?.position === InjectionPosition.After)) {
123
+ result.splice(placement.position === InjectionPosition.Before ? anchorIndex : anchorIndex + 1, 0, id);
124
+ known.add(id);
125
+ return;
126
+ }
127
+ const hasKnownSuccessor = ids.slice(index + 1).some((candidate) => known.has(candidate));
128
+ if (!hasKnownSuccessor) {
129
+ result.push(id);
130
+ } else {
131
+ let insertAt = 0;
132
+ for (let cursor = index - 1; cursor >= 0; cursor -= 1) {
133
+ const predecessorIndex = result.indexOf(ids[cursor]);
134
+ if (predecessorIndex !== -1) {
135
+ insertAt = predecessorIndex + 1;
136
+ break;
137
+ }
138
+ }
139
+ result.splice(insertAt, 0, id);
140
+ }
141
+ known.add(id);
142
+ });
143
+ return result;
144
+ }
114
145
  function resolveDataTableRowId(row, index) {
115
146
  if (row && typeof row === "object") {
116
147
  const candidate = row.id;
@@ -1291,23 +1322,18 @@ function DataTableImpl({
1291
1322
  [baseInjectionContext, hasInjectedBulkActions, rowSelection]
1292
1323
  );
1293
1324
  React.useEffect(() => {
1294
- const ids = table.getAllLeafColumns().map((column) => column.id);
1325
+ const ids = table.getAllColumns().flatMap((column) => column.getLeafColumns()).map((column) => column.id);
1295
1326
  if (!ids.length) return;
1327
+ const placements = new Map(
1328
+ injectedColumnDefs.map(({ def, placement }) => [def.id ?? "", placement])
1329
+ );
1296
1330
  setColumnOrder((prev) => {
1297
1331
  if (!prev.length) return ids;
1298
- const allowed = ids;
1299
- const filtered = prev.filter((id) => allowed.includes(id));
1300
- const seen = new Set(filtered);
1301
- for (const id of allowed) {
1302
- if (!seen.has(id)) {
1303
- filtered.push(id);
1304
- seen.add(id);
1305
- }
1306
- }
1307
- const changed = filtered.length !== prev.length || filtered.some((id, index) => id !== prev[index]);
1308
- return changed ? filtered : prev;
1332
+ const next = reconcileColumnOrder(prev, ids, placements);
1333
+ const changed = next.length !== prev.length || next.some((id, index) => id !== prev[index]);
1334
+ return changed ? next : prev;
1309
1335
  });
1310
- }, [table, mergedColumns]);
1336
+ }, [table, mergedColumns, injectedColumnDefs]);
1311
1337
  const visibilityDecidedColumnIds = React.useRef(
1312
1338
  new Set(Object.keys(mergedInitialSettings?.columnVisibility ?? {}))
1313
1339
  );