@wavemaker-ai/react-runtime 1.0.0-rc.330 → 1.0.0-rc.334

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 (171) hide show
  1. package/actions/notification-action.js +3 -3
  2. package/actions/toast.js +2 -1
  3. package/components/advanced/carousel/index.d.ts +1 -0
  4. package/components/advanced/carousel/template.d.ts +1 -0
  5. package/components/advanced/login/index.d.ts +1 -0
  6. package/components/advanced/marquee/index.d.ts +1 -0
  7. package/components/basic/anchor/index.d.ts +1 -0
  8. package/components/basic/anchor/index.js +3 -5
  9. package/components/basic/audio/index.d.ts +1 -0
  10. package/components/basic/html/index.d.ts +1 -0
  11. package/components/basic/icon/index.d.ts +1 -0
  12. package/components/basic/iframe/index.d.ts +1 -0
  13. package/components/basic/label/index.d.ts +1 -0
  14. package/components/basic/message/index.js +1 -0
  15. package/components/basic/picture/index.d.ts +1 -0
  16. package/components/basic/progress-bar/index.d.ts +1 -0
  17. package/components/basic/progress-circle/index.d.ts +1 -0
  18. package/components/basic/richtexteditor/index.d.ts +2 -0
  19. package/components/basic/search/index.js +9 -11
  20. package/components/basic/search/providers.d.ts +1 -1
  21. package/components/basic/search/providers.js +6 -3
  22. package/components/basic/spinner/index.d.ts +1 -0
  23. package/components/basic/tile/index.d.ts +1 -0
  24. package/components/basic/tree/index.d.ts +1 -0
  25. package/components/basic/video/index.d.ts +1 -0
  26. package/components/chart/index.d.ts +1 -0
  27. package/components/container/accordion/accordion-pane/index.d.ts +1 -0
  28. package/components/container/accordion/index.d.ts +1 -0
  29. package/components/container/index.d.ts +4 -0
  30. package/components/container/index.js +33 -9
  31. package/components/container/layout-grid/grid-column/index.d.ts +1 -0
  32. package/components/container/layout-grid/grid-row/index.d.ts +1 -0
  33. package/components/container/layout-grid/index.d.ts +1 -0
  34. package/components/container/layout-grid/index.js +2 -1
  35. package/components/container/linear-layout/index.d.ts +1 -0
  36. package/components/container/linear-layout/index.js +0 -1
  37. package/components/container/linear-layout/linear-layout-item/index.d.ts +1 -0
  38. package/components/container/panel/index.d.ts +1 -0
  39. package/components/container/props.d.ts +1 -0
  40. package/components/container/repeat-template/index.d.ts +1 -0
  41. package/components/container/repeat-template/index.js +1 -1
  42. package/components/container/tabs/index.d.ts +1 -0
  43. package/components/container/tabs/index.js +8 -6
  44. package/components/container/tabs/tab-pane/index.d.ts +1 -0
  45. package/components/container/tabs/tab-pane/index.js +2 -2
  46. package/components/container/wizard/index.d.ts +2 -0
  47. package/components/container/wizard/index.js +56 -40
  48. package/components/container/wizard/wizard-step/index.d.ts +1 -0
  49. package/components/data/card/card-actions/index.d.ts +1 -0
  50. package/components/data/card/card-content/index.d.ts +1 -0
  51. package/components/data/card/card-footer/index.d.ts +1 -0
  52. package/components/data/card/index.d.ts +1 -0
  53. package/components/data/form/base-form/hooks/useFormOperations.d.ts +1 -1
  54. package/components/data/form/base-form/hooks/useFormOperations.js +14 -17
  55. package/components/data/form/base-form/index.js +22 -23
  56. package/components/data/form/base-form/props.d.ts +1 -0
  57. package/components/data/form/base-form/utils.js +5 -4
  58. package/components/data/form/form-action/index.d.ts +4 -2
  59. package/components/data/form/form-action/index.js +2 -2
  60. package/components/data/form/form-context.d.ts +12 -13
  61. package/components/data/form/form-context.js +4 -6
  62. package/components/data/form/form-controller/withFormController.js +20 -7
  63. package/components/data/form/form-field/index.js +40 -15
  64. package/components/data/form/form-field/props.d.ts +7 -2
  65. package/components/data/list/components/ListItems.js +1 -3
  66. package/components/data/list/index.d.ts +2 -0
  67. package/components/data/list/index.js +6 -11
  68. package/components/data/pagination/hooks/usePagination.js +8 -8
  69. package/components/data/table/components/RowExpansionButton.js +5 -1
  70. package/components/data/table/components/TableBody.js +4 -1
  71. package/components/data/table/components/TableDataRow.js +1 -1
  72. package/components/data/table/components/TableHeader.js +3 -1
  73. package/components/data/table/hooks/useFormWidget.js +2 -2
  74. package/components/data/table/hooks/usePanelStructure.js +6 -1
  75. package/components/data/table/hooks/useResponsiveColumns.d.ts +1 -0
  76. package/components/data/table/hooks/useRowHandlers.js +3 -3
  77. package/components/data/table/hooks/useRowSelection.js +22 -13
  78. package/components/data/table/hooks/useTableColumns.js +5 -5
  79. package/components/data/table/hooks/useTableData.js +10 -2
  80. package/components/data/table/index.d.ts +2 -0
  81. package/components/data/table/index.js +15 -14
  82. package/components/data/table/live-table/index.d.ts +1 -0
  83. package/components/data/table/props.d.ts +9 -8
  84. package/components/data/table/table-action/index.d.ts +1 -0
  85. package/components/data/table/table-column/index.d.ts +1 -0
  86. package/components/data/table/table-row/index.d.ts +1 -0
  87. package/components/data/table/table-row-action/index.d.ts +1 -0
  88. package/components/data/table/utils/buildSelectionColumns.js +45 -50
  89. package/components/data/table/utils/crud-handlers.js +3 -1
  90. package/components/data/table/utils/expansionColumn.js +1 -1
  91. package/components/data/table/utils/index.d.ts +10 -3
  92. package/components/data/table/utils/index.js +20 -9
  93. package/components/data/table/utils/selectionUtils.d.ts +14 -0
  94. package/components/data/table/utils/selectionUtils.js +33 -1
  95. package/components/dialogs/alert-dialog/index.d.ts +2 -0
  96. package/components/dialogs/confirm-dialog/index.d.ts +2 -0
  97. package/components/dialogs/dialog/index.d.ts +2 -0
  98. package/components/dialogs/dialog-actions/index.d.ts +1 -0
  99. package/components/dialogs/dialog-actions/index.js +11 -2
  100. package/components/dialogs/dialog-body/index.d.ts +1 -0
  101. package/components/dialogs/dialog-content/index.d.ts +1 -0
  102. package/components/dialogs/dialog-header/index.d.ts +1 -0
  103. package/components/dialogs/iframe-dialog/index.d.ts +2 -0
  104. package/components/dialogs/login-dialog/index.d.ts +2 -0
  105. package/components/dialogs/page-dialog/index.d.ts +2 -0
  106. package/components/dialogs/withDialogWrapper.js +12 -2
  107. package/components/form/button/index.d.ts +1 -0
  108. package/components/form/button-group/index.d.ts +1 -0
  109. package/components/input/calendar/index.d.ts +2 -0
  110. package/components/input/chips/index.d.ts +2 -0
  111. package/components/input/color-picker/index.d.ts +2 -0
  112. package/components/input/composite/index.d.ts +1 -0
  113. package/components/input/composite/index.js +32 -6
  114. package/components/input/default/checkbox/index.d.ts +2 -0
  115. package/components/input/default/checkboxset/index.d.ts +2 -0
  116. package/components/input/default/radioset/index.d.ts +2 -0
  117. package/components/input/default/switch/index.d.ts +2 -0
  118. package/components/input/epoch/date/index.d.ts +1 -0
  119. package/components/input/epoch/date/index.js +2 -1
  120. package/components/input/epoch/date/utils.js +4 -2
  121. package/components/input/epoch/datetime/index.d.ts +1 -0
  122. package/components/input/epoch/datetime/index.js +5 -3
  123. package/components/input/epoch/datetime/props.d.ts +2 -2
  124. package/components/input/epoch/time/index.d.ts +1 -0
  125. package/components/input/epoch/time/utils.d.ts +1 -1
  126. package/components/input/epoch/time/utils.js +2 -2
  127. package/components/input/fileupload/index.d.ts +1 -0
  128. package/components/input/fileupload/index.js +2 -1
  129. package/components/input/fileupload/useFileUpload.js +19 -24
  130. package/components/input/number/index.d.ts +2 -0
  131. package/components/input/rating/index.d.ts +2 -0
  132. package/components/input/select/index.js +6 -3
  133. package/components/input/slider/index.d.ts +2 -0
  134. package/components/input/text/index.d.ts +2 -0
  135. package/components/input/text/index.js +9 -2
  136. package/components/input/textarea/index.d.ts +2 -0
  137. package/components/input/upload/index.d.ts +2 -0
  138. package/components/navbar/index.d.ts +1 -0
  139. package/components/navbar/nav-item/index.d.ts +1 -0
  140. package/components/navigation/breadcrumb/index.d.ts +1 -0
  141. package/components/navigation/menu/index.d.ts +1 -0
  142. package/components/navigation/menu/index.js +13 -9
  143. package/components/navigation/menu/props.d.ts +1 -0
  144. package/components/navigation/popover/index.d.ts +2 -1
  145. package/components/navigation/popover/index.js +16 -4
  146. package/components/navigation/popover/props.d.ts +1 -1
  147. package/components/page/partial/index.d.ts +1 -0
  148. package/context/PopoverContext.d.ts +5 -0
  149. package/context/PopoverContext.js +5 -0
  150. package/context/WidgetProvider.js +9 -2
  151. package/core/proxy-service.d.ts +18 -1
  152. package/core/proxy-service.js +84 -14
  153. package/higherOrder/BaseApp.js +2 -1
  154. package/higherOrder/BaseDateTime.js +8 -1
  155. package/higherOrder/BasePage.js +9 -11
  156. package/higherOrder/props.d.ts +1 -0
  157. package/higherOrder/useActivePageReactivity.js +1 -4
  158. package/higherOrder/withBaseWrapper.js +6 -6
  159. package/package-lock.json +203 -185
  160. package/package.json +3 -3
  161. package/runtime-dynamic/components/PageWrapper.js +1 -1
  162. package/runtime-dynamic/components/PrefabPreview.js +1 -1
  163. package/runtime-dynamic/components/partial-content.js +17 -1
  164. package/runtime-dynamic/factories/build-base-page-like-component.js +11 -7
  165. package/runtime-dynamic/factories/dynamic-component.js +1 -7
  166. package/runtime-dynamic/routes.js +17 -8
  167. package/utils/page-params-util.js +22 -1
  168. package/utils/partial-host-util.d.ts +40 -0
  169. package/utils/partial-host-util.js +41 -0
  170. package/variables/model-variable.d.ts +2 -0
  171. package/variables/model-variable.js +14 -0
@@ -45,7 +45,7 @@ import {
45
45
  import { distributeColumnWidths } from "../utils/columnWidthDistribution";
46
46
  import { useResponsiveColumns } from "./useResponsiveColumns";
47
47
  import WmTableRowAction from "../table-row-action";
48
- const handleActionSelection = (rowId, rowData, handlers) => {
48
+ const handleActionSelection = (rowId, rowData, handlers, event) => {
49
49
  const {
50
50
  useMultiSelect,
51
51
  handleMultiSelection,
@@ -55,9 +55,9 @@ const handleActionSelection = (rowId, rowData, handlers) => {
55
55
  } = handlers;
56
56
  if (useMultiSelect && handleMultiSelection && isRowSelected) {
57
57
  const currentlySelected = isRowSelected(rowId);
58
- handleMultiSelection(rowId, rowData, !currentlySelected);
58
+ handleMultiSelection(rowId, rowData, !currentlySelected, event);
59
59
  } else if (useRadioSelect && handleRadioSelection) {
60
- handleRadioSelection(rowId, rowData);
60
+ handleRadioSelection(rowId, rowData, event);
61
61
  }
62
62
  };
63
63
  const createActionClickHandler = (rowData, rowId, handlers, actionOnClick) => {
@@ -65,7 +65,7 @@ const createActionClickHandler = (rowData, rowId, handlers, actionOnClick) => {
65
65
  if (handlers.handleRowClick && event) {
66
66
  handlers.handleRowClick(event, rowData, rowId);
67
67
  }
68
- handleActionSelection(rowId, rowData, handlers);
68
+ handleActionSelection(rowId, rowData, handlers, event);
69
69
  actionOnClick == null ? void 0 : actionOnClick(event, widget, newVal);
70
70
  };
71
71
  };
@@ -123,7 +123,7 @@ const EditingActionButtons = React.memo(
123
123
  const isDeleteButton = button.key === "delete-edit";
124
124
  if (isDeleteButton && event) {
125
125
  (_a = selectionHandlers.handleRowClick) == null ? void 0 : _a.call(selectionHandlers, event, rowData, rowId);
126
- handleActionSelection(rowId, rowData, selectionHandlers);
126
+ handleActionSelection(rowId, rowData, selectionHandlers, event);
127
127
  }
128
128
  switch (button.key) {
129
129
  case "save-edit":
@@ -59,8 +59,13 @@ const useTableData = ({
59
59
  widgetName
60
60
  }) => {
61
61
  const rowIdCacheRef = useRef([]);
62
+ const rawDatasetRef = useRef(void 0);
63
+ const processedDatasetRef = useRef([]);
62
64
  const processedDataset = useMemo(() => {
63
65
  const extracted = extractDataArray(dataset);
66
+ if (isEqual(rawDatasetRef.current, extracted)) {
67
+ return processedDatasetRef.current;
68
+ }
64
69
  const cachedIds = rowIdCacheRef.current;
65
70
  const prestamped = extracted.map((item, i) => {
66
71
  if (!item || typeof item !== "object" || item._wmTableRowId || item.id || item.ID || item.Id || !cachedIds[i]) {
@@ -70,8 +75,11 @@ const useTableData = ({
70
75
  });
71
76
  const withIds = addUniqueRowIds(prestamped);
72
77
  rowIdCacheRef.current = withIds.map((r) => r == null ? void 0 : r._wmTableRowId);
73
- return removeEmptyRecords(withIds);
74
- }, [dataset]);
78
+ const result = removeEmptyRecords(withIds);
79
+ rawDatasetRef.current = extracted;
80
+ processedDatasetRef.current = result;
81
+ return result;
82
+ }, [dataset, dataset == null ? void 0 : dataset.length]);
75
83
  const [internalDataset, setInternalDataset] = useState(processedDataset);
76
84
  useEffect(() => {
77
85
  if (!isEqual(internalDataset, processedDataset)) {
@@ -102,6 +102,7 @@ declare const WmTableStandalone: React.ComponentType<{
102
102
  width?: number | string;
103
103
  height?: number | string;
104
104
  className?: string;
105
+ class?: string;
105
106
  conditionalstyle?: React.CSSProperties;
106
107
  conditionalclass?: string;
107
108
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -245,6 +246,7 @@ declare const WmTable: React.ComponentType<{
245
246
  width?: number | string;
246
247
  height?: number | string;
247
248
  className?: string;
249
+ class?: string;
248
250
  conditionalstyle?: React.CSSProperties;
249
251
  conditionalclass?: string;
250
252
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -638,9 +638,10 @@ const WmTableComponent = memo(
638
638
  if (onSort && newSorting.length > 0) {
639
639
  const sortData = {
640
640
  field: newSorting[0].id,
641
- direction: newSorting[0].desc ? "desc" : "asc"
641
+ direction: newSorting[0].desc ? "desc" : "asc",
642
+ sortDirection: newSorting[0].desc ? "desc" : "asc"
642
643
  };
643
- onSort(null, (_a2 = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _a2[name], sortData);
644
+ onSort(null, (_a2 = viewParent == null ? void 0 : viewParent.Widgets) == null ? void 0 : _a2[name], sortData);
644
645
  }
645
646
  },
646
647
  [sorting, name]
@@ -778,8 +779,8 @@ const WmTableComponent = memo(
778
779
  if (name && (listener == null ? void 0 : listener.Widgets[name]) && tableContainerRef.current) {
779
780
  listener.Widgets[name].nativeElement = tableContainerRef.current;
780
781
  }
781
- const data = internalDataset;
782
- onDatarender((_a2 = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _a2[name], { $data: data, data });
782
+ const data = internalDataset && internalDataset.length > 0 ? internalDataset : table.getRowModel().rows.map((row) => row.original) || [];
783
+ onDatarender((_a2 = viewParent == null ? void 0 : viewParent.Widgets) == null ? void 0 : _a2[name], data);
783
784
  }, [onDatarender, name]);
784
785
  columnsStateRef.current = columns;
785
786
  const columnsForTable = useMemo(() => {
@@ -944,7 +945,7 @@ const WmTableComponent = memo(
944
945
  listener,
945
946
  name
946
947
  });
947
- const { showPanelHeading, showPagination } = usePanelStructure({
948
+ const { showPanelHeading, showPagination, showFooter } = usePanelStructure({
948
949
  title,
949
950
  subheading,
950
951
  iconclass,
@@ -1026,7 +1027,8 @@ const WmTableComponent = memo(
1026
1027
  const firstSort = sorting[0];
1027
1028
  return {
1028
1029
  field: firstSort.id,
1029
- direction: firstSort.desc ? "desc" : "asc"
1030
+ direction: firstSort.desc ? "desc" : "asc",
1031
+ sortDirection: firstSort.desc ? "desc" : "asc"
1030
1032
  };
1031
1033
  }
1032
1034
  return void 0;
@@ -1118,8 +1120,8 @@ const WmTableComponent = memo(
1118
1120
  });
1119
1121
  if (onBeforedatarender) {
1120
1122
  onBeforedatarender(
1121
- (_a2 = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _a2[name],
1122
- // widget reference
1123
+ (_a2 = viewParent == null ? void 0 : viewParent.Widgets) == null ? void 0 : _a2[name],
1124
+ // widget reference (reactive proxy, not raw listener)
1123
1125
  data,
1124
1126
  // data
1125
1127
  columnsProxy
@@ -1133,10 +1135,9 @@ const WmTableComponent = memo(
1133
1135
  } else {
1134
1136
  queueOnDatarenderAfterPaint();
1135
1137
  }
1136
- const nextRows = internalDataset.map(
1137
- (r) => typeof r === "object" && r !== null ? __spreadValues({}, r) : r
1138
+ setInternalDataset(
1139
+ (prev) => prev.map((r) => typeof r === "object" && r !== null ? __spreadValues({}, r) : r)
1138
1140
  );
1139
- setInternalDataset(nextRows);
1140
1141
  } else if (onDatarender) {
1141
1142
  queueOnDatarenderAfterPaint();
1142
1143
  }
@@ -1275,7 +1276,7 @@ const WmTableComponent = memo(
1275
1276
  const rowIndex = internalDataset.findIndex(
1276
1277
  (r) => r._wmTableRowId === row._wmTableRowId || r.id !== void 0 && r.id === row.id
1277
1278
  );
1278
- const result = await onBeforerowdelete(event, (_a2 = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _a2[name], cleanedRow, {
1279
+ const result = await onBeforerowdelete(event, (_a2 = viewParent == null ? void 0 : viewParent.Widgets) == null ? void 0 : _a2[name], cleanedRow, {
1279
1280
  rowIndex,
1280
1281
  data: cleanedRow
1281
1282
  });
@@ -1339,7 +1340,7 @@ const WmTableComponent = memo(
1339
1340
  showToast("Failed to refresh table data", "Error");
1340
1341
  }
1341
1342
  if (onError) {
1342
- onError(null, (_b2 = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _b2[name], error, "refresh");
1343
+ onError(null, (_b2 = viewParent == null ? void 0 : viewParent.Widgets) == null ? void 0 : _b2[name], error, "refresh");
1343
1344
  }
1344
1345
  }
1345
1346
  },
@@ -1601,7 +1602,7 @@ const WmTableComponent = memo(
1601
1602
  }
1602
1603
  ) }) })
1603
1604
  ] }),
1604
- /* @__PURE__ */ jsxs(Box, { className: "panel-footer clearfix", children: [
1605
+ showFooter && /* @__PURE__ */ jsxs(Box, { className: "panel-footer clearfix", children: [
1605
1606
  showPagination && /* @__PURE__ */ jsx(Box, { className: "app-datagrid-paginator", children: /* @__PURE__ */ jsx(
1606
1607
  WmPagination,
1607
1608
  {
@@ -35,6 +35,7 @@ declare const _default: React.ComponentType<{
35
35
  width?: number | string;
36
36
  height?: number | string;
37
37
  className?: string;
38
+ class?: string;
38
39
  conditionalstyle?: React.CSSProperties;
39
40
  conditionalclass?: string;
40
41
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -942,9 +942,9 @@ export interface BuildSelectionColumnsProps {
942
942
  useMultiSelect: boolean;
943
943
  /** @deprecated Header now reads from table.getIsAllRowsSelected() — no longer used internally. */
944
944
  selectedRowIds?: string[];
945
- handleRadioSelection: (rowId: string, rowData?: any) => void;
946
- handleMultiSelection: (rowId: string, rowData: any, isSelected: boolean) => void;
947
- handleSelectAll: (isSelected: boolean) => void;
945
+ handleRadioSelection: (rowId: string, rowData?: any, event?: any) => void;
946
+ handleMultiSelection: (rowId: string, rowData: any, isSelected: boolean, event?: any) => void;
947
+ handleSelectAll: (isSelected: boolean, event?: any) => void;
948
948
  /** @deprecated Header now reads from table.getIsAllRowsSelected() — no longer used internally. */
949
949
  internalDataset?: any[];
950
950
  radioselecttitle?: string;
@@ -1056,8 +1056,8 @@ export interface UseTableColumnsProps {
1056
1056
  cellState?: CellStateReturn;
1057
1057
  isResizing?: boolean;
1058
1058
  handleRowClick?: (event: React.MouseEvent, rowData: any, rowId: string) => void;
1059
- handleRadioSelection?: (rowId: string, rowData: any) => void;
1060
- handleMultiSelection?: (rowId: string, rowData: any, checked: boolean) => void;
1059
+ handleRadioSelection?: (rowId: string, rowData: any, event?: any) => void;
1060
+ handleMultiSelection?: (rowId: string, rowData: any, checked: boolean, event?: any) => void;
1061
1061
  useRadioSelect?: boolean;
1062
1062
  useMultiSelect?: boolean;
1063
1063
  isRowSelected?: (rowId: string) => boolean;
@@ -1095,6 +1095,7 @@ export interface UsePanelStructureProps {
1095
1095
  export interface UsePanelStructureReturn {
1096
1096
  showPanelHeading: boolean;
1097
1097
  showPagination: boolean;
1098
+ showFooter: boolean;
1098
1099
  }
1099
1100
  export interface UseRowSelectionProps {
1100
1101
  radioselect?: boolean;
@@ -1121,9 +1122,9 @@ export interface UseRowSelectionReturn {
1121
1122
  selectedRowIds: string[];
1122
1123
  useMultiSelect: boolean;
1123
1124
  useRadioSelect: boolean;
1124
- handleRadioSelection: (rowId: string, rowData?: any) => void;
1125
- handleMultiSelection: (rowId: string, rowData: any, isSelected: boolean) => void;
1126
- handleSelectAll: (isSelected: boolean) => void;
1125
+ handleRadioSelection: (rowId: string, rowData?: any, event?: any) => void;
1126
+ handleMultiSelection: (rowId: string, rowData: any, isSelected: boolean, event?: any) => void;
1127
+ handleSelectAll: (isSelected: boolean, event?: any) => void;
1127
1128
  handleRowSelectionClick: (event: MouseEvent, rowId: string, rowData: any) => boolean;
1128
1129
  isRowSelected: (rowId: string) => boolean;
1129
1130
  isInteractiveElement: (event: MouseEvent) => boolean;
@@ -21,6 +21,7 @@ declare const _default: React.ComponentType<{
21
21
  width?: number | string;
22
22
  height?: number | string;
23
23
  className?: string;
24
+ class?: string;
24
25
  conditionalstyle?: React.CSSProperties;
25
26
  conditionalclass?: string;
26
27
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -21,6 +21,7 @@ declare const _default: React.ComponentType<{
21
21
  width?: number | string;
22
22
  height?: number | string;
23
23
  className?: string;
24
+ class?: string;
24
25
  conditionalstyle?: React.CSSProperties;
25
26
  conditionalclass?: string;
26
27
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -21,6 +21,7 @@ declare const _default: React.ComponentType<{
21
21
  width?: number | string;
22
22
  height?: number | string;
23
23
  className?: string;
24
+ class?: string;
24
25
  conditionalstyle?: React.CSSProperties;
25
26
  conditionalclass?: string;
26
27
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -29,6 +29,7 @@ export declare const WmTableRowAction: React.FC<{
29
29
  margin?: string;
30
30
  width?: number | string;
31
31
  height?: number | string;
32
+ class?: string;
32
33
  conditionalstyle?: React.CSSProperties;
33
34
  conditionalclass?: string;
34
35
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { Box, Radio, Checkbox, FormControlLabel, Tooltip } from "@mui/material";
2
+ import { Box, Tooltip } from "@mui/material";
3
3
  import { TABLE_MESSAGES } from "./constants";
4
4
  const getSelectionMeta = (ctx) => {
5
5
  var _a, _b, _c, _d;
@@ -10,27 +10,22 @@ function RadioSelectCell(ctx) {
10
10
  const rowId = row.id;
11
11
  const isSelected = row.getIsSelected();
12
12
  const { handleRadioSelection, radioselecttitle, radioselectarialabel, tableName } = getSelectionMeta(ctx);
13
- return /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx(Tooltip, { title: radioselecttitle != null ? radioselecttitle : "", placement: "top", children: /* @__PURE__ */ jsx(Box, { className: "radio app-radio", children: /* @__PURE__ */ jsx(
14
- FormControlLabel,
15
- {
16
- control: /* @__PURE__ */ jsx(
17
- Radio,
18
- {
19
- checked: isSelected,
20
- onChange: () => handleRadioSelection == null ? void 0 : handleRadioSelection(rowId, row.original),
21
- value: rowId,
22
- name: `wmRadioselect-${tableName != null ? tableName : "table"}`,
23
- inputProps: {
24
- "aria-label": radioselectarialabel
25
- },
26
- rowselectinput: "",
27
- size: "small"
28
- }
29
- ),
30
- label: "",
31
- className: "caption"
32
- }
33
- ) }) }) });
13
+ return /* @__PURE__ */ jsx(Box, { sx: { display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsx(Tooltip, { title: radioselecttitle != null ? radioselecttitle : "", placement: "top", children: /* @__PURE__ */ jsx(Box, { className: "radio app-radio", children: /* @__PURE__ */ jsxs(Box, { component: "label", children: [
14
+ /* @__PURE__ */ jsx(
15
+ Box,
16
+ {
17
+ component: "input",
18
+ type: "radio",
19
+ checked: isSelected,
20
+ onChange: (e) => handleRadioSelection == null ? void 0 : handleRadioSelection(rowId, row.original, e),
21
+ value: rowId,
22
+ name: `wmRadioselect-${tableName != null ? tableName : "table"}`,
23
+ "aria-label": radioselectarialabel,
24
+ rowselectinput: ""
25
+ }
26
+ ),
27
+ /* @__PURE__ */ jsx(Box, { component: "span", className: "caption" })
28
+ ] }) }) }) });
34
29
  }
35
30
  RadioSelectCell.displayName = "RadioSelectCell";
36
31
  function MultiSelectCell(ctx) {
@@ -39,24 +34,23 @@ function MultiSelectCell(ctx) {
39
34
  const isSelected = row.getIsSelected();
40
35
  const { handleMultiSelection, multiselecttitle, multiselectarialabel } = getSelectionMeta(ctx);
41
36
  return /* @__PURE__ */ jsxs(Box, { sx: { display: "flex" }, children: [
42
- /* @__PURE__ */ jsx(Tooltip, { title: multiselecttitle != null ? multiselecttitle : "", placement: "top", children: /* @__PURE__ */ jsx(Box, { className: "app-checkbox checkbox", children: /* @__PURE__ */ jsx(
43
- Checkbox,
44
- {
45
- checked: isSelected,
46
- onChange: (e) => handleMultiSelection == null ? void 0 : handleMultiSelection(rowId, row.original, e.target.checked),
47
- value: rowId,
48
- name: "gridMultiSelect",
49
- inputProps: {
50
- "aria-label": multiselectarialabel,
37
+ /* @__PURE__ */ jsx(Tooltip, { title: multiselecttitle != null ? multiselecttitle : "", placement: "top", children: /* @__PURE__ */ jsx(Box, { className: "app-checkbox checkbox", children: /* @__PURE__ */ jsxs(Box, { component: "label", className: isSelected ? "" : "unchecked", children: [
38
+ /* @__PURE__ */ jsx(Box, { component: "span", className: "sr-only", "aria-live": "assertive", children: "Select row" }),
39
+ /* @__PURE__ */ jsx(
40
+ Box,
41
+ {
42
+ component: "input",
43
+ type: "checkbox",
51
44
  role: "checkbox",
52
- "aria-live": "assertive"
53
- },
54
- size: "small",
55
- sx: {
56
- padding: 0
45
+ checked: isSelected,
46
+ onChange: (e) => handleMultiSelection == null ? void 0 : handleMultiSelection(rowId, row.original, e.target.checked, e),
47
+ value: rowId,
48
+ name: "gridMultiSelect",
49
+ "aria-label": multiselectarialabel
57
50
  }
58
- }
59
- ) }) }),
51
+ ),
52
+ /* @__PURE__ */ jsx(Box, { component: "span", className: "caption" })
53
+ ] }) }) }),
60
54
  isSelected ? /* @__PURE__ */ jsx("span", { className: "sr-only", "aria-live": "assertive", children: "Row Selected" }) : /* @__PURE__ */ jsx("span", { className: "sr-only", "aria-live": "assertive", children: "Row Deselected" })
61
55
  ] });
62
56
  }
@@ -65,20 +59,21 @@ function MultiSelectHeader({ table, column }) {
65
59
  var _a, _b;
66
60
  const isAllSelected = table.getIsAllRowsSelected();
67
61
  const { handleSelectAll } = (_b = (_a = column.columnDef.meta) == null ? void 0 : _a.selection) != null ? _b : {};
68
- return /* @__PURE__ */ jsx(Box, { sx: { display: "flex", width: "100%" }, children: /* @__PURE__ */ jsx(Box, { className: "app-checkbox checkbox", children: /* @__PURE__ */ jsx(
69
- Checkbox,
70
- {
71
- checked: isAllSelected,
72
- onChange: (e) => handleSelectAll == null ? void 0 : handleSelectAll(e.target.checked),
73
- size: "small",
74
- inputProps: {
62
+ return /* @__PURE__ */ jsx(Box, { sx: { display: "flex", width: "100%" }, children: /* @__PURE__ */ jsx(Box, { className: "app-checkbox checkbox", children: /* @__PURE__ */ jsxs(Box, { component: "label", className: isAllSelected ? "" : "unchecked", children: [
63
+ /* @__PURE__ */ jsx(
64
+ Box,
65
+ {
66
+ component: "input",
67
+ type: "checkbox",
68
+ role: "checkbox",
69
+ checked: isAllSelected,
70
+ onChange: (e) => handleSelectAll == null ? void 0 : handleSelectAll(e.target.checked, e),
71
+ name: "gridMultiSelectAll",
75
72
  "aria-label": "Select all rows"
76
- },
77
- sx: {
78
- padding: 0
79
73
  }
80
- }
81
- ) }) });
74
+ ),
75
+ /* @__PURE__ */ jsx(Box, { component: "span", className: "caption" })
76
+ ] }) }) });
82
77
  }
83
78
  MultiSelectHeader.displayName = "MultiSelectHeader";
84
79
  const buildSelectionColumns = ({
@@ -23,6 +23,7 @@ import findIndex from "lodash-es/findIndex";
23
23
  import slice from "lodash-es/slice";
24
24
  import forEach from "lodash-es/forEach";
25
25
  import some from "lodash-es/some";
26
+ import { addUniqueRowIds } from "./index";
26
27
  import { DataSource } from "../../types";
27
28
  const getDatasourceInfo = async (datasource) => {
28
29
  var _a, _b;
@@ -56,7 +57,8 @@ const createCompleteRecord = (editingData, wmTableColumns, serverResponse) => {
56
57
  completeRecord[column.field] = (_b = (_a = editingData[column.field]) != null ? _a : column.defaultvalue) != null ? _b : "";
57
58
  }
58
59
  });
59
- return __spreadProps(__spreadValues(__spreadValues({}, completeRecord), serverResponse), { _wmTableRowId: uniqueId("new_row_") });
60
+ const record = __spreadProps(__spreadValues(__spreadValues({}, completeRecord), serverResponse), { _wmTableRowId: uniqueId("new_row_") });
61
+ return addUniqueRowIds([record])[0];
60
62
  };
61
63
  const hasValidData = (record) => some(record, (value) => value !== void 0 && value !== null && value !== "");
62
64
  const updateDataset = (isNewRow, rowId, editingData, wmTableColumns, serverResponse, options) => {
@@ -47,7 +47,7 @@ function buildExpansionColSpec(columnwidth) {
47
47
  return {
48
48
  key: "row-expansion",
49
49
  width: w,
50
- style: { width: w }
50
+ style: { width: w, minWidth: w, maxWidth: w }
51
51
  };
52
52
  }
53
53
  export {
@@ -51,9 +51,16 @@ export declare const parseTableActions: (children: React.ReactNode) => WmTableAc
51
51
  export declare const getRowExpansionConfig: (config: WmTableRowProps | null, rowId: string, rowData?: any) => WmTableRowProps | null;
52
52
  /**
53
53
  * Whether the expansion column should be reserved in the table layout.
54
- * When tableRowProps gates show per row (e.g. hierarchy children.length), hide the
55
- * column entirely if no current row would show an expand control — avoids empty
56
- * row-expansion-cell spacers for leaf-only datasets.
54
+ *
55
+ * This is a STRUCTURAL check, matching Angular's datatable: the row-expansion
56
+ * column is part of the table layout whenever a row-expansion config exists and
57
+ * is not statically disabled. Per-row `show` (e.g. a hierarchy `children.length`
58
+ * gate via `tableRowProps`) only controls whether the toggle *button* renders
59
+ * inside the cell — see RowExpansionButton — never whether the column exists.
60
+ *
61
+ * Collapsing the column when no current row happens to be expandable would
62
+ * desynchronise header/body/colgroup cell counts and shift every data column by
63
+ * one for leaf-only datasets (e.g. nested child tables in a hierarchy).
57
64
  */
58
65
  export declare const isRowExpansionVisible: (config: WmTableRowProps | null | undefined, dataset: any[] | undefined) => boolean;
59
66
  export declare const parseTableRowExpansion: (children: React.ReactNode) => WmTableRowProps | null;
@@ -70,12 +70,26 @@ const hashString = (str, index) => {
70
70
  }
71
71
  return `row_${Math.abs(hash)}_${index}`;
72
72
  };
73
+ const safeStringify = (value) => {
74
+ const seen = /* @__PURE__ */ new WeakSet();
75
+ try {
76
+ return JSON.stringify(value, (_key, val) => {
77
+ if (typeof val === "object" && val !== null) {
78
+ if (seen.has(val)) return "[Circular]";
79
+ seen.add(val);
80
+ }
81
+ return val;
82
+ });
83
+ } catch (e) {
84
+ return String(value);
85
+ }
86
+ };
73
87
  const generateDeterministicHash = (obj, index) => {
74
88
  const hashSource = index.toString() + (isObject(obj) ? transform(
75
89
  omit(obj, "_wmTableRowId"),
76
90
  (result, value, key) => {
77
91
  if (!isNil(value)) {
78
- result.push(`${key}:${isObject(value) ? JSON.stringify(value) : String(value)}`);
92
+ result.push(`${key}:${isObject(value) ? safeStringify(value) : String(value)}`);
79
93
  }
80
94
  },
81
95
  []
@@ -355,12 +369,7 @@ const isRowExpansionVisible = (config, dataset) => {
355
369
  if (!config) return false;
356
370
  if (typeof config.tableRowProps === "function") {
357
371
  if (!Array.isArray(dataset) || dataset.length === 0) return false;
358
- return dataset.some((row) => {
359
- var _a;
360
- const overrides = ((_a = config.tableRowProps) == null ? void 0 : _a.call(config, row)) || {};
361
- const show = overrides.show !== void 0 ? overrides.show : config.show;
362
- return show !== false;
363
- });
372
+ return true;
364
373
  }
365
374
  return config.show !== false;
366
375
  };
@@ -490,9 +499,11 @@ const shouldShowPagination = ({
490
499
  datasource,
491
500
  showrecordcount = false
492
501
  }) => {
493
- var _a;
502
+ var _a, _b, _c;
494
503
  if (!shownavigation) return false;
495
- if (((_a = datasource == null ? void 0 : datasource.pagination) == null ? void 0 : _a.totalElements) > 0) return true;
504
+ const hasRecords = size(internalDataset) > 0 || ((_a = datasource == null ? void 0 : datasource.pagination) == null ? void 0 : _a.totalElements) > 0 || Boolean((_b = datasource == null ? void 0 : datasource.pagination) == null ? void 0 : _b.next);
505
+ if (!hasRecords) return false;
506
+ if (((_c = datasource == null ? void 0 : datasource.pagination) == null ? void 0 : _c.totalElements) > pagesize) return true;
496
507
  if (allowpagesizechange) return true;
497
508
  if (showrecordcount) return true;
498
509
  return onDemandLoad || size(internalDataset) > pagesize;
@@ -7,10 +7,24 @@ export declare const hasInteractiveClass: (element: HTMLElement) => boolean;
7
7
  * Check if an element has interactive attributes
8
8
  */
9
9
  export declare const hasInteractiveAttributes: (element: HTMLElement) => boolean;
10
+ /** The name datatable.js and the React table use for a row's multiselect checkbox. */
11
+ export declare const MULTI_SELECT_INPUT_NAME = "gridMultiSelect";
12
+ /**
13
+ * True when the clicked row's selection checkbox has been renamed away from
14
+ * `gridMultiSelect`.
15
+ *
16
+ * Mirrors the Angular datatable, whose toggleRowSelection only ever acts on
17
+ * `input[name="gridMultiSelect"]`, so application code that renames the input
18
+ * (e.g. to "gridMultiSelectDisable") opts that row out of click selection.
19
+ * Rows without a selection checkbox are never treated as renamed.
20
+ */
21
+ export declare const isSelectionCheckboxRenamed: (event: React.MouseEvent) => boolean;
10
22
  /**
11
23
  * Check if element or its ancestors are interactive
12
24
  */
13
25
  export declare const isInteractiveElement: (event: React.MouseEvent) => boolean;
26
+ export declare const toNativeEvent: (event: any) => any;
27
+ export declare const createSelectionEventStub: () => any;
14
28
  /**
15
29
  * Widget passed to user callbacks must come from the page proxy (viewParent), which
16
30
  * listener.onChange updates synchronously. listener.Widgets lags one React commit behind.
@@ -33,6 +33,14 @@ const hasInteractiveAttributes = (element) => {
33
33
  }
34
34
  return false;
35
35
  };
36
+ const MULTI_SELECT_INPUT_NAME = "gridMultiSelect";
37
+ const isSelectionCheckboxRenamed = (event) => {
38
+ var _a, _b;
39
+ const target = event == null ? void 0 : event.target;
40
+ const row = (_a = target == null ? void 0 : target.closest) == null ? void 0 : _a.call(target, "tr");
41
+ const checkbox = (_b = row == null ? void 0 : row.querySelector) == null ? void 0 : _b.call(row, 'input[type="checkbox"]');
42
+ return !!checkbox && checkbox.getAttribute("name") !== MULTI_SELECT_INPUT_NAME;
43
+ };
36
44
  const isInteractiveElement = (event) => {
37
45
  const target = event.target;
38
46
  if (INTERACTIVE_TAG_NAMES.includes(target.tagName)) {
@@ -47,6 +55,26 @@ const isInteractiveElement = (event) => {
47
55
  }
48
56
  return false;
49
57
  };
58
+ const toNativeEvent = (event) => {
59
+ var _a;
60
+ return (_a = event == null ? void 0 : event.nativeEvent) != null ? _a : event;
61
+ };
62
+ const createSelectionEventStub = () => ({
63
+ target: {
64
+ closest: () => null,
65
+ matches: () => false,
66
+ querySelector: () => null
67
+ },
68
+ currentTarget: null,
69
+ preventDefault: () => {
70
+ },
71
+ stopPropagation: () => {
72
+ },
73
+ stopImmediatePropagation: () => {
74
+ },
75
+ isDefaultPrevented: () => false,
76
+ isPropagationStopped: () => false
77
+ });
50
78
  const getWidgetForCallback = (listener, viewParent, widgetKey) => {
51
79
  var _a, _b, _c;
52
80
  return (_c = (_a = viewParent == null ? void 0 : viewParent.Widgets) == null ? void 0 : _a[widgetKey]) != null ? _c : (_b = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _b[widgetKey];
@@ -106,11 +134,15 @@ const selectionStateHelpers = {
106
134
  }
107
135
  };
108
136
  export {
137
+ MULTI_SELECT_INPUT_NAME,
138
+ createSelectionEventStub,
109
139
  getRowIdsFromDataset,
110
140
  getWidgetForCallback,
111
141
  hasInteractiveAttributes,
112
142
  hasInteractiveClass,
113
143
  isInteractiveElement,
144
+ isSelectionCheckboxRenamed,
114
145
  rowExistsInDataset,
115
- selectionStateHelpers
146
+ selectionStateHelpers,
147
+ toNativeEvent
116
148
  };
@@ -29,6 +29,7 @@ declare const WmAlertDialogStandalone: {
29
29
  width?: number | string;
30
30
  height?: number | string;
31
31
  className?: string;
32
+ class?: string;
32
33
  conditionalstyle?: React.CSSProperties;
33
34
  conditionalclass?: string;
34
35
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -115,6 +116,7 @@ declare const _default: {
115
116
  width?: number | string;
116
117
  height?: number | string;
117
118
  className?: string;
119
+ class?: string;
118
120
  conditionalstyle?: React.CSSProperties;
119
121
  conditionalclass?: string;
120
122
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -30,6 +30,7 @@ declare const WmConfirmDialogStandalone: {
30
30
  width?: number | string;
31
31
  height?: number | string;
32
32
  className?: string;
33
+ class?: string;
33
34
  conditionalstyle?: React.CSSProperties;
34
35
  conditionalclass?: string;
35
36
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -117,6 +118,7 @@ declare const _default: {
117
118
  width?: number | string;
118
119
  height?: number | string;
119
120
  className?: string;
121
+ class?: string;
120
122
  conditionalstyle?: React.CSSProperties;
121
123
  conditionalclass?: string;
122
124
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -34,6 +34,7 @@ declare const WmDialogStandalone: {
34
34
  width?: number | string;
35
35
  height?: number | string;
36
36
  className?: string;
37
+ class?: string;
37
38
  conditionalstyle?: import("react").CSSProperties;
38
39
  conditionalclass?: string;
39
40
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -127,6 +128,7 @@ declare const _default: {
127
128
  width?: number | string;
128
129
  height?: number | string;
129
130
  className?: string;
131
+ class?: string;
130
132
  conditionalstyle?: import("react").CSSProperties;
131
133
  conditionalclass?: string;
132
134
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];
@@ -24,6 +24,7 @@ declare const _default: import("react").ComponentType<{
24
24
  width?: number | string;
25
25
  height?: number | string;
26
26
  className?: string;
27
+ class?: string;
27
28
  conditionalstyle?: import("react").CSSProperties;
28
29
  conditionalclass?: string;
29
30
  showindevice?: ("xs" | "sm" | "md" | "lg" | "all")[];