@linzjs/step-ag-grid 1.5.3 → 1.5.4

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.d.ts CHANGED
@@ -24,13 +24,13 @@ export { GridPopoverMessage } from "./src/components/gridPopoverEdit/GridPopover
24
24
  export { GridPopoverTextArea } from "./src/components/gridPopoverEdit/GridPopoverTextArea";
25
25
  export { GridPopoverTextInput } from "./src/components/gridPopoverEdit/GridPopoverTextInput";
26
26
  export { GridHeaderSelect } from "./src/components/gridHeader/GridHeaderSelect";
27
- export { GridFormEditBearing } from "./src/components/gridForm/GridFormEditBearing";
28
- export { GridFormDropDown } from "./src/components/gridForm/GridFormDropDown";
29
- export { GridFormMessage } from "./src/components/gridForm/GridFormMessage";
30
- export { GridFormMultiSelect } from "./src/components/gridForm/GridFormMultiSelect";
31
- export { GridFormPopoutMenu } from "./src/components/gridForm/GridFormPopoutMenu";
32
- export { GridFormTextArea } from "./src/components/gridForm/GridFormTextArea";
33
- export { GridFormTextInput } from "./src/components/gridForm/GridFormTextInput";
27
+ export * from "./src/components/gridForm/GridFormEditBearing";
28
+ export * from "./src/components/gridForm/GridFormDropDown";
29
+ export * from "./src/components/gridForm/GridFormMessage";
30
+ export * from "./src/components/gridForm/GridFormMultiSelect";
31
+ export * from "./src/components/gridForm/GridFormPopoutMenu";
32
+ export * from "./src/components/gridForm/GridFormTextArea";
33
+ export * from "./src/components/gridForm/GridFormTextInput";
34
34
  export { TextAreaInput } from "./src/lui/TextAreaInput";
35
35
  export { TextInputFormatted } from "./src/lui/TextInputFormatted";
36
36
  export { GridSubComponentTextArea } from "./src/components/GridSubComponentTextArea";
package/dist/index.js CHANGED
@@ -1740,6 +1740,9 @@ var GridContext = react.createContext({
1740
1740
  ensureSelectedRowIsVisible: function () {
1741
1741
  console.error("no context provider for ensureSelectedRowIsVisible");
1742
1742
  },
1743
+ sizeColumnsToFit: function () {
1744
+ console.error("no context provider for sizeColumnsToFit");
1745
+ },
1743
1746
  editingCells: function () {
1744
1747
  console.error("no context provider for editingCells");
1745
1748
  return false;
@@ -1950,6 +1953,14 @@ var GridContextProvider = function (props) {
1950
1953
  gridApi.ensureNodeVisible(lodashEs.last(selectedNodes));
1951
1954
  });
1952
1955
  };
1956
+ /**
1957
+ * Resize columns to fit container
1958
+ */
1959
+ var sizeColumnsToFit = function () {
1960
+ gridApiOp(function (gridApi) {
1961
+ gridApi.sizeColumnsToFit();
1962
+ });
1963
+ };
1953
1964
  var stopEditing = function () { return gridApiOp(function (gridApi) { return gridApi.stopEditing(); }); };
1954
1965
  var updatingCells = function (props, fnUpdate, setSaving) { return __awaiter(void 0, void 0, void 0, function () {
1955
1966
  return __generator(this, function (_a) {
@@ -2016,6 +2027,7 @@ var GridContextProvider = function (props) {
2016
2027
  editingCells: editingCells,
2017
2028
  ensureRowVisible: ensureRowVisible,
2018
2029
  ensureSelectedRowIsVisible: ensureSelectedRowIsVisible,
2030
+ sizeColumnsToFit: sizeColumnsToFit,
2019
2031
  stopEditing: stopEditing,
2020
2032
  updatingCells: updatingCells
2021
2033
  } }, { children: props.children })));
@@ -2201,7 +2213,7 @@ var GridHeaderSelect = function (_a) {
2201
2213
  */
2202
2214
  var Grid = function (params) {
2203
2215
  var _a;
2204
- var _b = react.useContext(GridContext), gridReady = _b.gridReady, setGridApi = _b.setGridApi, setQuickFilter = _b.setQuickFilter, ensureRowVisible = _b.ensureRowVisible, selectRowsById = _b.selectRowsById, ensureSelectedRowIsVisible = _b.ensureSelectedRowIsVisible;
2216
+ var _b = react.useContext(GridContext), gridReady = _b.gridReady, setGridApi = _b.setGridApi, setQuickFilter = _b.setQuickFilter, ensureRowVisible = _b.ensureRowVisible, selectRowsById = _b.selectRowsById, ensureSelectedRowIsVisible = _b.ensureSelectedRowIsVisible, sizeColumnsToFit = _b.sizeColumnsToFit;
2205
2217
  var checkUpdating = react.useContext(UpdatingContext).checkUpdating;
2206
2218
  var _c = react.useState(""), internalQuickFilter = _c[0], setInternalQuickFilter = _c[1];
2207
2219
  var lastSelectedIds = react.useRef([]);
@@ -2300,14 +2312,6 @@ var Grid = function (params) {
2300
2312
  var _a;
2301
2313
  return (jsxRuntime.jsx("span", __assign({ className: "ag-overlay-no-rows-center" }, { children: (_a = params.noRowsOverlayText) !== null && _a !== void 0 ? _a : "There are currently no rows" })));
2302
2314
  }, [params.noRowsOverlayText]);
2303
- var sizeColumnsToFit = react.useCallback(function (event) {
2304
- // @ts-ignore (gridBodyCtrl is private)
2305
- if (event.api.gridBodyCtrl == undefined) {
2306
- return;
2307
- // this is here because ag grid was throwing api undefined error when closing POPPED OUT panel
2308
- }
2309
- event.api.sizeColumnsToFit();
2310
- }, []);
2311
2315
  var refreshSelectedRows = react.useCallback(function (event) {
2312
2316
  // Force-refresh all selected rows to re-run class function, to update selection highlighting
2313
2317
  event.api.refreshCells({
@@ -2353,6 +2357,12 @@ var Grid = function (params) {
2353
2357
  var cell = event.api.getFocusedCell();
2354
2358
  cell && event.api.setFocusedCell(cell.rowIndex, cell.column);
2355
2359
  }, [refreshSelectedRows]);
2360
+ // When rows added or removed then resize columns
2361
+ react.useEffect(function () {
2362
+ if (columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.length) {
2363
+ sizeColumnsToFit();
2364
+ }
2365
+ }, [columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.length, sizeColumnsToFit]);
2356
2366
  return (jsxRuntime.jsxs("div", __assign({ "data-testid": params.dataTestId, className: clsx("Grid-container", "ag-theme-alpine", staleGrid && "Grid-sortIsStale") }, { children: [params.quickFilter && (jsxRuntime.jsx("div", __assign({ className: "Grid-quickFilter" }, { children: jsxRuntime.jsx("input", { "aria-label": "Search", className: "lui-margin-top-xxs lui-margin-bottom-xxs Grid-quickFilterBox", type: "text", placeholder: (_a = params.quickFilterPlaceholder) !== null && _a !== void 0 ? _a : "Search...", value: internalQuickFilter, onChange: function (event) {
2357
2367
  setInternalQuickFilter(event.target.value);
2358
2368
  } }) }))), jsxRuntime.jsx(agGridReact.AgGridReact, { getRowId: function (params) { return "".concat(params.data.id); }, suppressRowClickSelection: true, rowSelection: "multiple", suppressBrowserResizeObserver: true, colResizeDefault: "shift", onFirstDataRendered: sizeColumnsToFit, onGridSizeChanged: sizeColumnsToFit, suppressClickEdit: true, onCellKeyDown: onCellKeyDown, onCellClicked: onCellClicked, onCellDoubleClicked: onCellDoubleClick, onCellEditingStarted: refreshSelectedRows, onCellEditingStopped: onCellEditingStopped, domLayout: params.domLayout, columnDefs: columnDefs, rowData: params.rowData, noRowsOverlayComponent: noRowsOverlayComponent, onGridReady: onGridReady, onSortChanged: ensureSelectedRowIsVisible, postSortRows: postSortRows, onSelectionChanged: synchroniseExternalStateToGridSelection })] })));
@@ -2557,8 +2567,175 @@ var GridRenderPopoutMenuCell = function (props) {
2557
2567
  var css_248z$3 = "@charset \"UTF-8\";\n.szh-menu {\n margin: 0;\n padding: 0;\n list-style: none;\n box-sizing: border-box;\n width: max-content;\n z-index: 100;\n border: 1px solid rgba(0, 0, 0, 0.1);\n background-color: #fff;\n}\n.szh-menu:focus {\n outline: none;\n}\n.szh-menu__arrow {\n box-sizing: border-box;\n width: 0.75rem;\n height: 0.75rem;\n background-color: #fff;\n border: 1px solid transparent;\n border-left-color: rgba(0, 0, 0, 0.1);\n border-top-color: rgba(0, 0, 0, 0.1);\n z-index: -1;\n}\n.szh-menu__arrow--dir-left {\n right: -0.375rem;\n transform: translateY(-50%) rotate(135deg);\n}\n.szh-menu__arrow--dir-right {\n left: -0.375rem;\n transform: translateY(-50%) rotate(-45deg);\n}\n.szh-menu__arrow--dir-top {\n bottom: -0.375rem;\n transform: translateX(-50%) rotate(-135deg);\n}\n.szh-menu__arrow--dir-bottom {\n top: -0.375rem;\n transform: translateX(-50%) rotate(45deg);\n}\n.szh-menu__item {\n cursor: pointer;\n}\n.szh-menu__item:focus {\n outline: none;\n}\n.szh-menu__item--hover {\n background-color: #ebebeb;\n}\n.szh-menu__item--focusable {\n cursor: default;\n background-color: inherit;\n}\n.szh-menu__item--disabled {\n cursor: default;\n color: #aaa;\n}\n.szh-menu__group {\n box-sizing: border-box;\n}\n.szh-menu__radio-group {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n.szh-menu__divider {\n height: 1px;\n margin: 0.5rem 0;\n background-color: rgba(0, 0, 0, 0.12);\n}\n\n.szh-menu-button {\n box-sizing: border-box;\n}\n\n.szh-menu {\n user-select: none;\n color: #212529;\n border: none;\n border-radius: 0.25rem;\n box-shadow: 0 3px 7px rgba(0, 0, 0, 0.133), 0 0.6px 2px rgba(0, 0, 0, 0.1);\n min-width: 10rem;\n padding: 0.5rem 0;\n}\n.szh-menu__item {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0.375rem 1.5rem;\n}\n.szh-menu-container--itemTransition .szh-menu__item {\n transition-property: background-color, color;\n transition-duration: 0.15s;\n transition-timing-function: ease-in-out;\n}\n.szh-menu__item--type-radio {\n padding-left: 2.2rem;\n}\n.szh-menu__item--type-radio::before {\n content: \"○\";\n position: absolute;\n left: 0.8rem;\n top: 0.55rem;\n font-size: 0.8rem;\n}\n.szh-menu__item--type-radio.szh-menu__item--checked::before {\n content: \"●\";\n}\n.szh-menu__item--type-checkbox {\n padding-left: 2.2rem;\n}\n.szh-menu__item--type-checkbox::before {\n position: absolute;\n left: 0.8rem;\n}\n.szh-menu__item--type-checkbox.szh-menu__item--checked::before {\n content: \"✔\";\n}\n.szh-menu__submenu > .szh-menu__item {\n padding-right: 2.5rem;\n}\n.szh-menu__submenu > .szh-menu__item::after {\n content: \"❯\";\n position: absolute;\n right: 1rem;\n}\n.szh-menu__header {\n color: #888;\n font-size: 0.8rem;\n padding: 0.2rem 1.5rem;\n text-transform: uppercase;\n}";
2558
2568
  styleInject(css_248z$3);
2559
2569
 
2560
- var MenuSeparatorString$1 = "_____MENU_SEPARATOR_____";
2561
- Object.freeze({ value: MenuSeparatorString$1 });
2570
+ var MenuSeparatorString = "_____MENU_SEPARATOR_____";
2571
+ var MenuSeparator = Object.freeze({ value: MenuSeparatorString });
2572
+ var GridFormDropDown = function (props) {
2573
+ var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2574
+ var formProps = props.formProps;
2575
+ var _a = react.useContext(GridContext), updatingCells = _a.updatingCells, stopEditing = _a.stopEditing;
2576
+ var _b = react.useState(""), filter = _b[0], setFilter = _b[1];
2577
+ var _c = react.useState([]), filteredValues = _c[0], setFilteredValues = _c[1];
2578
+ var optionsInitialising = react.useRef(false);
2579
+ var _d = react.useState(null), options = _d[0], setOptions = _d[1];
2580
+ var selectItemHandler = react.useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2581
+ var field;
2582
+ return __generator(this, function (_a) {
2583
+ switch (_a.label) {
2584
+ case 0:
2585
+ field = props.field;
2586
+ return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2587
+ var hasChanged;
2588
+ return __generator(this, function (_a) {
2589
+ switch (_a.label) {
2590
+ case 0:
2591
+ hasChanged = selectedRows.some(function (row) { return row[field] !== value; });
2592
+ if (!hasChanged) return [3 /*break*/, 3];
2593
+ if (!formProps.onSelectedItem) return [3 /*break*/, 2];
2594
+ return [4 /*yield*/, formProps.onSelectedItem({ selectedRows: selectedRows, value: value })];
2595
+ case 1:
2596
+ _a.sent();
2597
+ return [3 /*break*/, 3];
2598
+ case 2:
2599
+ selectedRows.forEach(function (row) { return (row[field] = value); });
2600
+ _a.label = 3;
2601
+ case 3: return [2 /*return*/, true];
2602
+ }
2603
+ });
2604
+ }); })];
2605
+ case 1: return [2 /*return*/, _a.sent()];
2606
+ }
2607
+ });
2608
+ }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2609
+ var selectFilterHandler = react.useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2610
+ var field;
2611
+ return __generator(this, function (_a) {
2612
+ switch (_a.label) {
2613
+ case 0:
2614
+ field = props.field;
2615
+ return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2616
+ return __generator(this, function (_a) {
2617
+ switch (_a.label) {
2618
+ case 0:
2619
+ if (!formProps.onSelectFilter) return [3 /*break*/, 2];
2620
+ return [4 /*yield*/, formProps.onSelectFilter({ selectedRows: selectedRows, value: value })];
2621
+ case 1:
2622
+ _a.sent();
2623
+ _a.label = 2;
2624
+ case 2: return [2 /*return*/, true];
2625
+ }
2626
+ });
2627
+ }); })];
2628
+ case 1: return [2 /*return*/, _a.sent()];
2629
+ }
2630
+ });
2631
+ }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2632
+ // Load up options list if it's async function
2633
+ react.useEffect(function () {
2634
+ var _a;
2635
+ if (options || optionsInitialising.current)
2636
+ return;
2637
+ optionsInitialising.current = true;
2638
+ var optionsConf = (_a = formProps.options) !== null && _a !== void 0 ? _a : [];
2639
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
2640
+ var optionsList;
2641
+ return __generator(this, function (_a) {
2642
+ switch (_a.label) {
2643
+ case 0:
2644
+ if (!(typeof optionsConf == "function")) return [3 /*break*/, 2];
2645
+ return [4 /*yield*/, optionsConf(props.selectedRows, filter)];
2646
+ case 1:
2647
+ optionsConf = _a.sent();
2648
+ _a.label = 2;
2649
+ case 2:
2650
+ optionsList = optionsConf === null || optionsConf === void 0 ? void 0 : optionsConf.map(function (item) {
2651
+ if (item == null || typeof item == "string" || typeof item == "number") {
2652
+ item = { value: item, label: item, disabled: false };
2653
+ }
2654
+ return item;
2655
+ });
2656
+ if (formProps.filtered) {
2657
+ // This is needed otherwise when filter input is rendered and sets autofocus
2658
+ // the mouse up of the double click edit triggers the cell to cancel editing
2659
+ lodashEs.delay(function () { return setOptions(optionsList); }, 100);
2660
+ }
2661
+ else {
2662
+ setOptions(optionsList);
2663
+ }
2664
+ optionsInitialising.current = false;
2665
+ return [2 /*return*/];
2666
+ }
2667
+ });
2668
+ }); })();
2669
+ }, [filter, options, formProps.filtered, formProps.options, props.selectedRows]);
2670
+ // Local filtering
2671
+ react.useEffect(function () {
2672
+ if (formProps.filtered == "local") {
2673
+ if (options == null)
2674
+ return;
2675
+ setFilteredValues(options
2676
+ .map(function (option) {
2677
+ if (option.label != null && typeof option.label !== "string") {
2678
+ console.error("Cannot filter non-string labels", option);
2679
+ return undefined;
2680
+ }
2681
+ var str = option.label || "";
2682
+ return str.toLowerCase().indexOf(filter) === -1 ? option.value : undefined;
2683
+ })
2684
+ .filter(function (r) { return r !== undefined; }));
2685
+ }
2686
+ }, [formProps.filtered, filter, options]);
2687
+ var researchOnFilterChange = debounce__default["default"](react.useCallback(function () {
2688
+ setOptions(null);
2689
+ }, []), 500);
2690
+ var previousFilter = react.useRef(filter);
2691
+ // Reload filtering
2692
+ react.useEffect(function () {
2693
+ if (previousFilter.current != filter && formProps.filtered == "reload") {
2694
+ previousFilter.current = filter;
2695
+ formProps.optionsRequestCancel && formProps.optionsRequestCancel();
2696
+ researchOnFilterChange().then();
2697
+ }
2698
+ }, [filter, formProps, props, researchOnFilterChange]);
2699
+ var onFilterKeyDown = react.useCallback(function (e) { return __awaiter(void 0, void 0, void 0, function () {
2700
+ var activeOptions;
2701
+ return __generator(this, function (_a) {
2702
+ switch (_a.label) {
2703
+ case 0:
2704
+ if (!options)
2705
+ return [2 /*return*/];
2706
+ if (!(e.key == "Enter" || e.key == "Tab")) return [3 /*break*/, 5];
2707
+ activeOptions = options.filter(function (option) { return !filteredValues.includes(option.value); });
2708
+ if (!(activeOptions.length == 1)) return [3 /*break*/, 2];
2709
+ return [4 /*yield*/, selectItemHandler(activeOptions[0].value)];
2710
+ case 1:
2711
+ _a.sent();
2712
+ stopEditing();
2713
+ return [3 /*break*/, 5];
2714
+ case 2:
2715
+ if (!formProps.onSelectFilter) return [3 /*break*/, 4];
2716
+ return [4 /*yield*/, selectFilterHandler(filter)];
2717
+ case 3:
2718
+ _a.sent();
2719
+ stopEditing();
2720
+ return [3 /*break*/, 5];
2721
+ case 4:
2722
+ e.preventDefault();
2723
+ e.stopPropagation();
2724
+ _a.label = 5;
2725
+ case 5: return [2 /*return*/];
2726
+ }
2727
+ });
2728
+ }); }, [filteredValues, options, selectItemHandler, selectFilterHandler, stopEditing, filter, formProps]);
2729
+ return popoverWrapper(jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [formProps.filtered && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_a) {
2730
+ var _b;
2731
+ var ref = _a.ref;
2732
+ return (jsxRuntime.jsx("div", __assign({ style: { display: "flex", width: "100%" } }, { children: jsxRuntime.jsx("input", { autoFocus: true, className: "free-text-input", style: { border: "0px" }, ref: ref, type: "text", placeholder: (_b = formProps.filterPlaceholder) !== null && _b !== void 0 ? _b : "Placeholder", "data-testid": "filteredMenu-free-text-input", defaultValue: filter, onChange: function (e) { return setFilter(e.target.value.toLowerCase()); }, onKeyDown: function (e) { return onFilterKeyDown(e); } }) })));
2733
+ } })), jsxRuntime.jsx(MenuDivider, {}, "$$divider_filter")] })), jsxRuntime.jsx(ComponentLoadingWrapper, __assign({ loading: !options }, { children: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [options && options.length == (filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.length) && jsxRuntime.jsx(MenuItem, { children: "[Empty]" }), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2734
+ var _a;
2735
+ return item.value === MenuSeparatorString ? (jsxRuntime.jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (jsxRuntime.jsx(MenuItem, __assign({ disabled: !!item.disabled, title: item.disabled && typeof item.disabled !== "boolean" ? item.disabled : "", value: item.value, onClick: function () { return selectItemHandler(item.value); } }, { children: (_a = item.label) !== null && _a !== void 0 ? _a : (item.value == null ? "<".concat(item.value, ">") : "".concat(item.value)) }), "".concat(props.field, "-").concat(index)));
2736
+ })] }) }))] }));
2737
+ };
2738
+
2562
2739
  var GridFormMultiSelect = function (props) {
2563
2740
  var formProps = props.formProps;
2564
2741
  var _a = react.useState(""), filter = _a[0], setFilter = _a[1];
@@ -2641,7 +2818,7 @@ var GridFormMultiSelect = function (props) {
2641
2818
  return (jsxRuntime.jsx("div", __assign({ style: { display: "flex", width: "100%" } }, { children: jsxRuntime.jsx("input", { autoFocus: true, className: "free-text-input", style: { border: "0px" }, ref: ref, type: "text", placeholder: (_b = formProps.filterPlaceholder) !== null && _b !== void 0 ? _b : "Placeholder", "data-testid": "filteredMenu-free-text-input", defaultValue: "", onChange: function (e) { return setFilter(e.target.value.toLowerCase()); } }) })));
2642
2819
  } }), "filter"), jsxRuntime.jsx(MenuDivider, {}, "$$divider_filter")] })), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2643
2820
  var _a;
2644
- return item.value === MenuSeparatorString$1 ? (jsxRuntime.jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (jsxRuntime.jsxs(react.Fragment, { children: [jsxRuntime.jsx(MenuItem, __assign({ onClick: function (e) {
2821
+ return item.value === MenuSeparatorString ? (jsxRuntime.jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (jsxRuntime.jsxs(react.Fragment, { children: [jsxRuntime.jsx(MenuItem, __assign({ onClick: function (e) {
2645
2822
  e.keepOpen = true;
2646
2823
  if (selectedValues.includes(item.value)) {
2647
2824
  setSelectedValues(selectedValues.filter(function (value) { return value != item.value; }));
@@ -2695,7 +2872,7 @@ var css_248z$2 = "/**\n @deprecated\n */\n/**\n @deprecated\n */\n/**\n @depr
2695
2872
  styleInject(css_248z$2);
2696
2873
 
2697
2874
  /** Menu configuration types **/
2698
- var MenuSeparator = Object.freeze({ __isMenuSeparator__: true });
2875
+ var PopoutMenuSeparator = Object.freeze({ __isMenuSeparator__: true });
2699
2876
  /**
2700
2877
  * NOTE: If the popout menu doesn't appear on single click when also selecting row it's because
2701
2878
  * you need a useMemo around your columnDefs
@@ -2758,11 +2935,11 @@ var GridFormPopoutMenu = function (props) {
2758
2935
  }); }, [props.field, props.selectedRows, updatingCells]);
2759
2936
  var selectedRowCount = props.selectedRows.length;
2760
2937
  var filteredOptions = options === null || options === void 0 ? void 0 : options.filter(function (menuOption) {
2761
- return menuOption.label === MenuSeparator || selectedRowCount === 1 || menuOption.supportsMultiEdit;
2938
+ return menuOption.label === PopoutMenuSeparator || selectedRowCount === 1 || menuOption.supportsMultiEdit;
2762
2939
  });
2763
2940
  var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2764
2941
  return popoverWrapper(jsxRuntime.jsx(ComponentLoadingWrapper, __assign({ loading: !filteredOptions }, { children: jsxRuntime.jsx("div", __assign({ className: "Grid-popoverContainerList" }, { children: options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2765
- return item.label === MenuSeparator ? (jsxRuntime.jsx(MenuDivider, {}, "$$divider_".concat(index))) : (!item.hidden && (jsxRuntime.jsx(MenuItem, __assign({ onClick: function () { return actionClick(item); }, disabled: !!item.disabled || !(filteredOptions === null || filteredOptions === void 0 ? void 0 : filteredOptions.includes(item)), title: item.disabled && typeof item.disabled !== "boolean" ? item.disabled : "" }, { children: item.label }), "".concat(item.label))));
2942
+ return item.label === PopoutMenuSeparator ? (jsxRuntime.jsx(MenuDivider, {}, "$$divider_".concat(index))) : (!item.hidden && (jsxRuntime.jsx(MenuItem, __assign({ onClick: function () { return actionClick(item); }, disabled: !!item.disabled || !(filteredOptions === null || filteredOptions === void 0 ? void 0 : filteredOptions.includes(item)), title: item.disabled && typeof item.disabled !== "boolean" ? item.disabled : "" }, { children: item.label }), "".concat(item.label))));
2766
2943
  }) })) })));
2767
2944
  };
2768
2945
 
@@ -2944,175 +3121,6 @@ var GridPopoverEditBearingCorrection = function (colDef) {
2944
3121
  } }, init.cellEditorParams) });
2945
3122
  };
2946
3123
 
2947
- var MenuSeparatorString = "_____MENU_SEPARATOR_____";
2948
- Object.freeze({ value: MenuSeparatorString });
2949
- var GridFormDropDown = function (props) {
2950
- var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2951
- var formProps = props.formProps;
2952
- var _a = react.useContext(GridContext), updatingCells = _a.updatingCells, stopEditing = _a.stopEditing;
2953
- var _b = react.useState(""), filter = _b[0], setFilter = _b[1];
2954
- var _c = react.useState([]), filteredValues = _c[0], setFilteredValues = _c[1];
2955
- var optionsInitialising = react.useRef(false);
2956
- var _d = react.useState(null), options = _d[0], setOptions = _d[1];
2957
- var selectItemHandler = react.useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2958
- var field;
2959
- return __generator(this, function (_a) {
2960
- switch (_a.label) {
2961
- case 0:
2962
- field = props.field;
2963
- return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2964
- var hasChanged;
2965
- return __generator(this, function (_a) {
2966
- switch (_a.label) {
2967
- case 0:
2968
- hasChanged = selectedRows.some(function (row) { return row[field] !== value; });
2969
- if (!hasChanged) return [3 /*break*/, 3];
2970
- if (!formProps.onSelectedItem) return [3 /*break*/, 2];
2971
- return [4 /*yield*/, formProps.onSelectedItem({ selectedRows: selectedRows, value: value })];
2972
- case 1:
2973
- _a.sent();
2974
- return [3 /*break*/, 3];
2975
- case 2:
2976
- selectedRows.forEach(function (row) { return (row[field] = value); });
2977
- _a.label = 3;
2978
- case 3: return [2 /*return*/, true];
2979
- }
2980
- });
2981
- }); })];
2982
- case 1: return [2 /*return*/, _a.sent()];
2983
- }
2984
- });
2985
- }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2986
- var selectFilterHandler = react.useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2987
- var field;
2988
- return __generator(this, function (_a) {
2989
- switch (_a.label) {
2990
- case 0:
2991
- field = props.field;
2992
- return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2993
- return __generator(this, function (_a) {
2994
- switch (_a.label) {
2995
- case 0:
2996
- if (!formProps.onSelectFilter) return [3 /*break*/, 2];
2997
- return [4 /*yield*/, formProps.onSelectFilter({ selectedRows: selectedRows, value: value })];
2998
- case 1:
2999
- _a.sent();
3000
- _a.label = 2;
3001
- case 2: return [2 /*return*/, true];
3002
- }
3003
- });
3004
- }); })];
3005
- case 1: return [2 /*return*/, _a.sent()];
3006
- }
3007
- });
3008
- }); }, [formProps, props.field, props.selectedRows, updatingCells]);
3009
- // Load up options list if it's async function
3010
- react.useEffect(function () {
3011
- var _a;
3012
- if (options || optionsInitialising.current)
3013
- return;
3014
- optionsInitialising.current = true;
3015
- var optionsConf = (_a = formProps.options) !== null && _a !== void 0 ? _a : [];
3016
- (function () { return __awaiter(void 0, void 0, void 0, function () {
3017
- var optionsList;
3018
- return __generator(this, function (_a) {
3019
- switch (_a.label) {
3020
- case 0:
3021
- if (!(typeof optionsConf == "function")) return [3 /*break*/, 2];
3022
- return [4 /*yield*/, optionsConf(props.selectedRows, filter)];
3023
- case 1:
3024
- optionsConf = _a.sent();
3025
- _a.label = 2;
3026
- case 2:
3027
- optionsList = optionsConf === null || optionsConf === void 0 ? void 0 : optionsConf.map(function (item) {
3028
- if (item == null || typeof item == "string" || typeof item == "number") {
3029
- item = { value: item, label: item, disabled: false };
3030
- }
3031
- return item;
3032
- });
3033
- if (formProps.filtered) {
3034
- // This is needed otherwise when filter input is rendered and sets autofocus
3035
- // the mouse up of the double click edit triggers the cell to cancel editing
3036
- lodashEs.delay(function () { return setOptions(optionsList); }, 100);
3037
- }
3038
- else {
3039
- setOptions(optionsList);
3040
- }
3041
- optionsInitialising.current = false;
3042
- return [2 /*return*/];
3043
- }
3044
- });
3045
- }); })();
3046
- }, [filter, options, formProps.filtered, formProps.options, props.selectedRows]);
3047
- // Local filtering
3048
- react.useEffect(function () {
3049
- if (formProps.filtered == "local") {
3050
- if (options == null)
3051
- return;
3052
- setFilteredValues(options
3053
- .map(function (option) {
3054
- if (option.label != null && typeof option.label !== "string") {
3055
- console.error("Cannot filter non-string labels", option);
3056
- return undefined;
3057
- }
3058
- var str = option.label || "";
3059
- return str.toLowerCase().indexOf(filter) === -1 ? option.value : undefined;
3060
- })
3061
- .filter(function (r) { return r !== undefined; }));
3062
- }
3063
- }, [formProps.filtered, filter, options]);
3064
- var researchOnFilterChange = debounce__default["default"](react.useCallback(function () {
3065
- setOptions(null);
3066
- }, []), 500);
3067
- var previousFilter = react.useRef(filter);
3068
- // Reload filtering
3069
- react.useEffect(function () {
3070
- if (previousFilter.current != filter && formProps.filtered == "reload") {
3071
- previousFilter.current = filter;
3072
- formProps.optionsRequestCancel && formProps.optionsRequestCancel();
3073
- researchOnFilterChange().then();
3074
- }
3075
- }, [filter, formProps, props, researchOnFilterChange]);
3076
- var onFilterKeyDown = react.useCallback(function (e) { return __awaiter(void 0, void 0, void 0, function () {
3077
- var activeOptions;
3078
- return __generator(this, function (_a) {
3079
- switch (_a.label) {
3080
- case 0:
3081
- if (!options)
3082
- return [2 /*return*/];
3083
- if (!(e.key == "Enter" || e.key == "Tab")) return [3 /*break*/, 5];
3084
- activeOptions = options.filter(function (option) { return !filteredValues.includes(option.value); });
3085
- if (!(activeOptions.length == 1)) return [3 /*break*/, 2];
3086
- return [4 /*yield*/, selectItemHandler(activeOptions[0].value)];
3087
- case 1:
3088
- _a.sent();
3089
- stopEditing();
3090
- return [3 /*break*/, 5];
3091
- case 2:
3092
- if (!formProps.onSelectFilter) return [3 /*break*/, 4];
3093
- return [4 /*yield*/, selectFilterHandler(filter)];
3094
- case 3:
3095
- _a.sent();
3096
- stopEditing();
3097
- return [3 /*break*/, 5];
3098
- case 4:
3099
- e.preventDefault();
3100
- e.stopPropagation();
3101
- _a.label = 5;
3102
- case 5: return [2 /*return*/];
3103
- }
3104
- });
3105
- }); }, [filteredValues, options, selectItemHandler, selectFilterHandler, stopEditing, filter, formProps]);
3106
- return popoverWrapper(jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [formProps.filtered && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_a) {
3107
- var _b;
3108
- var ref = _a.ref;
3109
- return (jsxRuntime.jsx("div", __assign({ style: { display: "flex", width: "100%" } }, { children: jsxRuntime.jsx("input", { autoFocus: true, className: "free-text-input", style: { border: "0px" }, ref: ref, type: "text", placeholder: (_b = formProps.filterPlaceholder) !== null && _b !== void 0 ? _b : "Placeholder", "data-testid": "filteredMenu-free-text-input", defaultValue: filter, onChange: function (e) { return setFilter(e.target.value.toLowerCase()); }, onKeyDown: function (e) { return onFilterKeyDown(e); } }) })));
3110
- } })), jsxRuntime.jsx(MenuDivider, {}, "$$divider_filter")] })), jsxRuntime.jsx(ComponentLoadingWrapper, __assign({ loading: !options }, { children: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [options && options.length == (filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.length) && jsxRuntime.jsx(MenuItem, { children: "[Empty]" }), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
3111
- var _a;
3112
- return item.value === MenuSeparatorString ? (jsxRuntime.jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (jsxRuntime.jsx(MenuItem, __assign({ disabled: !!item.disabled, title: item.disabled && typeof item.disabled !== "boolean" ? item.disabled : "", value: item.value, onClick: function () { return selectItemHandler(item.value); } }, { children: (_a = item.label) !== null && _a !== void 0 ? _a : (item.value == null ? "<".concat(item.value, ">") : "".concat(item.value)) }), "".concat(props.field, "-").concat(index)));
3113
- })] }) }))] }));
3114
- };
3115
-
3116
3124
  var GridPopoverEditDropDown = function (colDef) {
3117
3125
  var _a;
3118
3126
  return GridCell(__assign(__assign({ initialWidth: 65, maxWidth: 150, cellClass: ((_a = colDef.cellEditor) === null || _a === void 0 ? void 0 : _a.multiEdit) ? GenericMultiEditCellClass : undefined }, colDef), ((colDef === null || colDef === void 0 ? void 0 : colDef.cellEditorParams) && {
@@ -3224,7 +3232,7 @@ var GridFormTextInput = function (props) {
3224
3232
  return "Text must be no longer than ".concat(formProps.maxlength, " characters");
3225
3233
  }
3226
3234
  if (formProps.validate) {
3227
- return formProps.validate(trimmedValue);
3235
+ return formProps.validate(trimmedValue, props.data);
3228
3236
  }
3229
3237
  return null;
3230
3238
  }, [formProps, value]);
@@ -3315,6 +3323,9 @@ exports.MenuGroup = MenuGroup;
3315
3323
  exports.MenuHeader = MenuHeader;
3316
3324
  exports.MenuItem = MenuItem;
3317
3325
  exports.MenuRadioGroup = MenuRadioGroup;
3326
+ exports.MenuSeparator = MenuSeparator;
3327
+ exports.MenuSeparatorString = MenuSeparatorString;
3328
+ exports.PopoutMenuSeparator = PopoutMenuSeparator;
3318
3329
  exports.SubMenu = SubMenu;
3319
3330
  exports.TextAreaInput = TextAreaInput;
3320
3331
  exports.TextInputFormatted = TextInputFormatted;