@linzjs/step-ag-grid 1.5.2 → 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.
@@ -1732,6 +1732,9 @@ var GridContext = createContext({
1732
1732
  ensureSelectedRowIsVisible: function () {
1733
1733
  console.error("no context provider for ensureSelectedRowIsVisible");
1734
1734
  },
1735
+ sizeColumnsToFit: function () {
1736
+ console.error("no context provider for sizeColumnsToFit");
1737
+ },
1735
1738
  editingCells: function () {
1736
1739
  console.error("no context provider for editingCells");
1737
1740
  return false;
@@ -1942,6 +1945,14 @@ var GridContextProvider = function (props) {
1942
1945
  gridApi.ensureNodeVisible(last(selectedNodes));
1943
1946
  });
1944
1947
  };
1948
+ /**
1949
+ * Resize columns to fit container
1950
+ */
1951
+ var sizeColumnsToFit = function () {
1952
+ gridApiOp(function (gridApi) {
1953
+ gridApi.sizeColumnsToFit();
1954
+ });
1955
+ };
1945
1956
  var stopEditing = function () { return gridApiOp(function (gridApi) { return gridApi.stopEditing(); }); };
1946
1957
  var updatingCells = function (props, fnUpdate, setSaving) { return __awaiter(void 0, void 0, void 0, function () {
1947
1958
  return __generator(this, function (_a) {
@@ -2008,6 +2019,7 @@ var GridContextProvider = function (props) {
2008
2019
  editingCells: editingCells,
2009
2020
  ensureRowVisible: ensureRowVisible,
2010
2021
  ensureSelectedRowIsVisible: ensureSelectedRowIsVisible,
2022
+ sizeColumnsToFit: sizeColumnsToFit,
2011
2023
  stopEditing: stopEditing,
2012
2024
  updatingCells: updatingCells
2013
2025
  } }, { children: props.children })));
@@ -2193,7 +2205,7 @@ var GridHeaderSelect = function (_a) {
2193
2205
  */
2194
2206
  var Grid = function (params) {
2195
2207
  var _a;
2196
- var _b = useContext(GridContext), gridReady = _b.gridReady, setGridApi = _b.setGridApi, setQuickFilter = _b.setQuickFilter, ensureRowVisible = _b.ensureRowVisible, selectRowsById = _b.selectRowsById, ensureSelectedRowIsVisible = _b.ensureSelectedRowIsVisible;
2208
+ var _b = useContext(GridContext), gridReady = _b.gridReady, setGridApi = _b.setGridApi, setQuickFilter = _b.setQuickFilter, ensureRowVisible = _b.ensureRowVisible, selectRowsById = _b.selectRowsById, ensureSelectedRowIsVisible = _b.ensureSelectedRowIsVisible, sizeColumnsToFit = _b.sizeColumnsToFit;
2197
2209
  var checkUpdating = useContext(UpdatingContext).checkUpdating;
2198
2210
  var _c = useState(""), internalQuickFilter = _c[0], setInternalQuickFilter = _c[1];
2199
2211
  var lastSelectedIds = useRef([]);
@@ -2292,14 +2304,6 @@ var Grid = function (params) {
2292
2304
  var _a;
2293
2305
  return (jsx("span", __assign({ className: "ag-overlay-no-rows-center" }, { children: (_a = params.noRowsOverlayText) !== null && _a !== void 0 ? _a : "There are currently no rows" })));
2294
2306
  }, [params.noRowsOverlayText]);
2295
- var sizeColumnsToFit = useCallback(function (event) {
2296
- // @ts-ignore (gridBodyCtrl is private)
2297
- if (event.api.gridBodyCtrl == undefined) {
2298
- return;
2299
- // this is here because ag grid was throwing api undefined error when closing POPPED OUT panel
2300
- }
2301
- event.api.sizeColumnsToFit();
2302
- }, []);
2303
2307
  var refreshSelectedRows = useCallback(function (event) {
2304
2308
  // Force-refresh all selected rows to re-run class function, to update selection highlighting
2305
2309
  event.api.refreshCells({
@@ -2345,6 +2349,12 @@ var Grid = function (params) {
2345
2349
  var cell = event.api.getFocusedCell();
2346
2350
  cell && event.api.setFocusedCell(cell.rowIndex, cell.column);
2347
2351
  }, [refreshSelectedRows]);
2352
+ // When rows added or removed then resize columns
2353
+ useEffect(function () {
2354
+ if (columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.length) {
2355
+ sizeColumnsToFit();
2356
+ }
2357
+ }, [columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.length, sizeColumnsToFit]);
2348
2358
  return (jsxs("div", __assign({ "data-testid": params.dataTestId, className: clsx("Grid-container", "ag-theme-alpine", staleGrid && "Grid-sortIsStale") }, { children: [params.quickFilter && (jsx("div", __assign({ className: "Grid-quickFilter" }, { children: 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) {
2349
2359
  setInternalQuickFilter(event.target.value);
2350
2360
  } }) }))), jsx(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 })] })));
@@ -2422,9 +2432,11 @@ var GridCell = function (props) {
2422
2432
  })), {
2423
2433
  // Default value formatter, otherwise react freaks out on objects
2424
2434
  valueFormatter: function (params) {
2425
- var types = ["number", "undefined", "boolean", "string"];
2435
+ if (params.value == null)
2436
+ return "-";
2437
+ var types = ["number", "boolean", "string"];
2426
2438
  if (types.includes(typeof params.value))
2427
- return params.value;
2439
+ return "".concat(params.value);
2428
2440
  else
2429
2441
  return JSON.stringify(params.value);
2430
2442
  } }), props), { cellRenderer: GridCellRenderer, cellRendererParams: __assign({ originalCellRenderer: props.cellRenderer }, props.cellRendererParams) });
@@ -2457,7 +2469,7 @@ var GenericCellEditorComponentFr = function (props, _) {
2457
2469
  }); }, [field, saving, selectedRows, updatingCells]);
2458
2470
  if (cellEditorParams == null)
2459
2471
  return jsx(Fragment$1, {});
2460
- return (jsxs(Fragment$1, { children: [jsx("div", { children: colDef.cellRenderer ? jsx(colDef.cellRenderer, __assign({}, props, { saving: saving })) : props.value }), (cellEditorParams === null || cellEditorParams === void 0 ? void 0 : cellEditorParams.form) && (jsx(cellEditorParams.form, { cellEditorParams: props, updateValue: updateValue, saving: saving, formProps: formProps, value: value, field: field, selectedRows: selectedRows }))] }));
2472
+ return (jsxs(Fragment$1, { children: [jsx("div", { children: colDef.cellRenderer ? jsx(colDef.cellRenderer, __assign({}, props, { saving: saving })) : props.value }), (cellEditorParams === null || cellEditorParams === void 0 ? void 0 : cellEditorParams.form) && (jsx(cellEditorParams.form, { cellEditorParams: props, updateValue: updateValue, saving: saving, formProps: formProps, data: data, value: value, field: field, selectedRows: selectedRows }))] }));
2461
2473
  };
2462
2474
  var GenericCellEditorComponent = forwardRef(GenericCellEditorComponentFr);
2463
2475
 
@@ -2547,8 +2559,175 @@ var GridRenderPopoutMenuCell = function (props) {
2547
2559
  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}";
2548
2560
  styleInject(css_248z$3);
2549
2561
 
2550
- var MenuSeparatorString$1 = "_____MENU_SEPARATOR_____";
2551
- Object.freeze({ value: MenuSeparatorString$1 });
2562
+ var MenuSeparatorString = "_____MENU_SEPARATOR_____";
2563
+ var MenuSeparator = Object.freeze({ value: MenuSeparatorString });
2564
+ var GridFormDropDown = function (props) {
2565
+ var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2566
+ var formProps = props.formProps;
2567
+ var _a = useContext(GridContext), updatingCells = _a.updatingCells, stopEditing = _a.stopEditing;
2568
+ var _b = useState(""), filter = _b[0], setFilter = _b[1];
2569
+ var _c = useState([]), filteredValues = _c[0], setFilteredValues = _c[1];
2570
+ var optionsInitialising = useRef(false);
2571
+ var _d = useState(null), options = _d[0], setOptions = _d[1];
2572
+ var selectItemHandler = useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2573
+ var field;
2574
+ return __generator(this, function (_a) {
2575
+ switch (_a.label) {
2576
+ case 0:
2577
+ field = props.field;
2578
+ return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2579
+ var hasChanged;
2580
+ return __generator(this, function (_a) {
2581
+ switch (_a.label) {
2582
+ case 0:
2583
+ hasChanged = selectedRows.some(function (row) { return row[field] !== value; });
2584
+ if (!hasChanged) return [3 /*break*/, 3];
2585
+ if (!formProps.onSelectedItem) return [3 /*break*/, 2];
2586
+ return [4 /*yield*/, formProps.onSelectedItem({ selectedRows: selectedRows, value: value })];
2587
+ case 1:
2588
+ _a.sent();
2589
+ return [3 /*break*/, 3];
2590
+ case 2:
2591
+ selectedRows.forEach(function (row) { return (row[field] = value); });
2592
+ _a.label = 3;
2593
+ case 3: return [2 /*return*/, true];
2594
+ }
2595
+ });
2596
+ }); })];
2597
+ case 1: return [2 /*return*/, _a.sent()];
2598
+ }
2599
+ });
2600
+ }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2601
+ var selectFilterHandler = useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2602
+ var field;
2603
+ return __generator(this, function (_a) {
2604
+ switch (_a.label) {
2605
+ case 0:
2606
+ field = props.field;
2607
+ return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2608
+ return __generator(this, function (_a) {
2609
+ switch (_a.label) {
2610
+ case 0:
2611
+ if (!formProps.onSelectFilter) return [3 /*break*/, 2];
2612
+ return [4 /*yield*/, formProps.onSelectFilter({ selectedRows: selectedRows, value: value })];
2613
+ case 1:
2614
+ _a.sent();
2615
+ _a.label = 2;
2616
+ case 2: return [2 /*return*/, true];
2617
+ }
2618
+ });
2619
+ }); })];
2620
+ case 1: return [2 /*return*/, _a.sent()];
2621
+ }
2622
+ });
2623
+ }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2624
+ // Load up options list if it's async function
2625
+ useEffect(function () {
2626
+ var _a;
2627
+ if (options || optionsInitialising.current)
2628
+ return;
2629
+ optionsInitialising.current = true;
2630
+ var optionsConf = (_a = formProps.options) !== null && _a !== void 0 ? _a : [];
2631
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
2632
+ var optionsList;
2633
+ return __generator(this, function (_a) {
2634
+ switch (_a.label) {
2635
+ case 0:
2636
+ if (!(typeof optionsConf == "function")) return [3 /*break*/, 2];
2637
+ return [4 /*yield*/, optionsConf(props.selectedRows, filter)];
2638
+ case 1:
2639
+ optionsConf = _a.sent();
2640
+ _a.label = 2;
2641
+ case 2:
2642
+ optionsList = optionsConf === null || optionsConf === void 0 ? void 0 : optionsConf.map(function (item) {
2643
+ if (item == null || typeof item == "string" || typeof item == "number") {
2644
+ item = { value: item, label: item, disabled: false };
2645
+ }
2646
+ return item;
2647
+ });
2648
+ if (formProps.filtered) {
2649
+ // This is needed otherwise when filter input is rendered and sets autofocus
2650
+ // the mouse up of the double click edit triggers the cell to cancel editing
2651
+ delay(function () { return setOptions(optionsList); }, 100);
2652
+ }
2653
+ else {
2654
+ setOptions(optionsList);
2655
+ }
2656
+ optionsInitialising.current = false;
2657
+ return [2 /*return*/];
2658
+ }
2659
+ });
2660
+ }); })();
2661
+ }, [filter, options, formProps.filtered, formProps.options, props.selectedRows]);
2662
+ // Local filtering
2663
+ useEffect(function () {
2664
+ if (formProps.filtered == "local") {
2665
+ if (options == null)
2666
+ return;
2667
+ setFilteredValues(options
2668
+ .map(function (option) {
2669
+ if (option.label != null && typeof option.label !== "string") {
2670
+ console.error("Cannot filter non-string labels", option);
2671
+ return undefined;
2672
+ }
2673
+ var str = option.label || "";
2674
+ return str.toLowerCase().indexOf(filter) === -1 ? option.value : undefined;
2675
+ })
2676
+ .filter(function (r) { return r !== undefined; }));
2677
+ }
2678
+ }, [formProps.filtered, filter, options]);
2679
+ var researchOnFilterChange = debounce(useCallback(function () {
2680
+ setOptions(null);
2681
+ }, []), 500);
2682
+ var previousFilter = useRef(filter);
2683
+ // Reload filtering
2684
+ useEffect(function () {
2685
+ if (previousFilter.current != filter && formProps.filtered == "reload") {
2686
+ previousFilter.current = filter;
2687
+ formProps.optionsRequestCancel && formProps.optionsRequestCancel();
2688
+ researchOnFilterChange().then();
2689
+ }
2690
+ }, [filter, formProps, props, researchOnFilterChange]);
2691
+ var onFilterKeyDown = useCallback(function (e) { return __awaiter(void 0, void 0, void 0, function () {
2692
+ var activeOptions;
2693
+ return __generator(this, function (_a) {
2694
+ switch (_a.label) {
2695
+ case 0:
2696
+ if (!options)
2697
+ return [2 /*return*/];
2698
+ if (!(e.key == "Enter" || e.key == "Tab")) return [3 /*break*/, 5];
2699
+ activeOptions = options.filter(function (option) { return !filteredValues.includes(option.value); });
2700
+ if (!(activeOptions.length == 1)) return [3 /*break*/, 2];
2701
+ return [4 /*yield*/, selectItemHandler(activeOptions[0].value)];
2702
+ case 1:
2703
+ _a.sent();
2704
+ stopEditing();
2705
+ return [3 /*break*/, 5];
2706
+ case 2:
2707
+ if (!formProps.onSelectFilter) return [3 /*break*/, 4];
2708
+ return [4 /*yield*/, selectFilterHandler(filter)];
2709
+ case 3:
2710
+ _a.sent();
2711
+ stopEditing();
2712
+ return [3 /*break*/, 5];
2713
+ case 4:
2714
+ e.preventDefault();
2715
+ e.stopPropagation();
2716
+ _a.label = 5;
2717
+ case 5: return [2 /*return*/];
2718
+ }
2719
+ });
2720
+ }); }, [filteredValues, options, selectItemHandler, selectFilterHandler, stopEditing, filter, formProps]);
2721
+ return popoverWrapper(jsxs(Fragment$1, { children: [formProps.filtered && (jsxs(Fragment$1, { children: [jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_a) {
2722
+ var _b;
2723
+ var ref = _a.ref;
2724
+ return (jsx("div", __assign({ style: { display: "flex", width: "100%" } }, { children: 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); } }) })));
2725
+ } })), jsx(MenuDivider, {}, "$$divider_filter")] })), jsx(ComponentLoadingWrapper, __assign({ loading: !options }, { children: jsxs(Fragment$1, { children: [options && options.length == (filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.length) && jsx(MenuItem, { children: "[Empty]" }), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2726
+ var _a;
2727
+ return item.value === MenuSeparatorString ? (jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (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)));
2728
+ })] }) }))] }));
2729
+ };
2730
+
2552
2731
  var GridFormMultiSelect = function (props) {
2553
2732
  var formProps = props.formProps;
2554
2733
  var _a = useState(""), filter = _a[0], setFilter = _a[1];
@@ -2631,7 +2810,7 @@ var GridFormMultiSelect = function (props) {
2631
2810
  return (jsx("div", __assign({ style: { display: "flex", width: "100%" } }, { children: 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()); } }) })));
2632
2811
  } }), "filter"), jsx(MenuDivider, {}, "$$divider_filter")] })), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2633
2812
  var _a;
2634
- return item.value === MenuSeparatorString$1 ? (jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (jsxs(Fragment, { children: [jsx(MenuItem, __assign({ onClick: function (e) {
2813
+ return item.value === MenuSeparatorString ? (jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (jsxs(Fragment, { children: [jsx(MenuItem, __assign({ onClick: function (e) {
2635
2814
  e.keepOpen = true;
2636
2815
  if (selectedValues.includes(item.value)) {
2637
2816
  setSelectedValues(selectedValues.filter(function (value) { return value != item.value; }));
@@ -2685,7 +2864,7 @@ var css_248z$2 = "/**\n @deprecated\n */\n/**\n @deprecated\n */\n/**\n @depr
2685
2864
  styleInject(css_248z$2);
2686
2865
 
2687
2866
  /** Menu configuration types **/
2688
- var MenuSeparator = Object.freeze({ __isMenuSeparator__: true });
2867
+ var PopoutMenuSeparator = Object.freeze({ __isMenuSeparator__: true });
2689
2868
  /**
2690
2869
  * NOTE: If the popout menu doesn't appear on single click when also selecting row it's because
2691
2870
  * you need a useMemo around your columnDefs
@@ -2748,11 +2927,11 @@ var GridFormPopoutMenu = function (props) {
2748
2927
  }); }, [props.field, props.selectedRows, updatingCells]);
2749
2928
  var selectedRowCount = props.selectedRows.length;
2750
2929
  var filteredOptions = options === null || options === void 0 ? void 0 : options.filter(function (menuOption) {
2751
- return menuOption.label === MenuSeparator || selectedRowCount === 1 || menuOption.supportsMultiEdit;
2930
+ return menuOption.label === PopoutMenuSeparator || selectedRowCount === 1 || menuOption.supportsMultiEdit;
2752
2931
  });
2753
2932
  var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2754
2933
  return popoverWrapper(jsx(ComponentLoadingWrapper, __assign({ loading: !filteredOptions }, { children: jsx("div", __assign({ className: "Grid-popoverContainerList" }, { children: options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2755
- return item.label === MenuSeparator ? (jsx(MenuDivider, {}, "$$divider_".concat(index))) : (!item.hidden && (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))));
2934
+ return item.label === PopoutMenuSeparator ? (jsx(MenuDivider, {}, "$$divider_".concat(index))) : (!item.hidden && (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))));
2756
2935
  }) })) })));
2757
2936
  };
2758
2937
 
@@ -2854,7 +3033,7 @@ var css_248z = ".LuiTextInput {\n margin-bottom: 0;\n}\n\n.LuiTextInput-formatt
2854
3033
  styleInject(css_248z);
2855
3034
 
2856
3035
  var TextInputFormatted = function (props) {
2857
- return (jsxs("div", __assign({ className: clsx("LuiTextInput Grid-popoverContainer", props.error && "hasError", props.warning && "hasWarning", props.className) }, { children: [jsxs("span", __assign({ className: "LuiTextInput-inputWrapper" }, { children: [jsx("input", __assign({ type: "text", className: "LuiTextInput-input", min: "0", value: props.value, onChange: props.onChange }, props.inputProps)), jsx("span", __assign({ className: "LuiTextInput-formatted" }, { children: props.formatted })), props.icon] })), props.error && (jsxs("span", __assign({ className: "LuiTextInput-error" }, { children: [jsx(LuiIcon, { alt: "error", name: "ic_error", className: "LuiTextInput-error-icon", size: "sm", status: "error" }), props.error] }))), props.warning && (jsxs("span", __assign({ className: "LuiTextInput-warning" }, { children: [jsx(LuiIcon, { alt: "warning", name: "ic_warning", className: "LuiTextInput-warning-icon", size: "sm", status: "warning" }), props.warning] })))] })));
3036
+ return (jsxs("div", __assign({ className: clsx("LuiTextInput Grid-popoverContainer", props.error && "hasError", props.warning && "hasWarning", props.className) }, { children: [jsxs("span", __assign({ className: "LuiTextInput-inputWrapper" }, { children: [jsx("input", __assign({ type: "text", className: "LuiTextInput-input", min: "0", value: props.value, onChange: props.onChange }, props.inputProps)), jsx("span", __assign({ className: "LuiTextInput-formatted" }, { children: props.formatted }))] })), props.error && (jsxs("span", __assign({ className: "LuiTextInput-error" }, { children: [jsx(LuiIcon, { alt: "error", name: "ic_error", className: "LuiTextInput-error-icon", size: "sm", status: "error" }), props.error] }))), props.warning && (jsxs("span", __assign({ className: "LuiTextInput-warning" }, { children: [jsx(LuiIcon, { alt: "warning", name: "ic_warning", className: "LuiTextInput-warning-icon", size: "sm", status: "warning" }), props.warning] })))] })));
2858
3037
  };
2859
3038
 
2860
3039
  var GridFormEditBearing = function (props) {
@@ -2934,175 +3113,6 @@ var GridPopoverEditBearingCorrection = function (colDef) {
2934
3113
  } }, init.cellEditorParams) });
2935
3114
  };
2936
3115
 
2937
- var MenuSeparatorString = "_____MENU_SEPARATOR_____";
2938
- Object.freeze({ value: MenuSeparatorString });
2939
- var GridFormDropDown = function (props) {
2940
- var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2941
- var formProps = props.formProps;
2942
- var _a = useContext(GridContext), updatingCells = _a.updatingCells, stopEditing = _a.stopEditing;
2943
- var _b = useState(""), filter = _b[0], setFilter = _b[1];
2944
- var _c = useState([]), filteredValues = _c[0], setFilteredValues = _c[1];
2945
- var optionsInitialising = useRef(false);
2946
- var _d = useState(null), options = _d[0], setOptions = _d[1];
2947
- var selectItemHandler = useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2948
- var field;
2949
- return __generator(this, function (_a) {
2950
- switch (_a.label) {
2951
- case 0:
2952
- field = props.field;
2953
- return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2954
- var hasChanged;
2955
- return __generator(this, function (_a) {
2956
- switch (_a.label) {
2957
- case 0:
2958
- hasChanged = selectedRows.some(function (row) { return row[field] !== value; });
2959
- if (!hasChanged) return [3 /*break*/, 3];
2960
- if (!formProps.onSelectedItem) return [3 /*break*/, 2];
2961
- return [4 /*yield*/, formProps.onSelectedItem({ selectedRows: selectedRows, value: value })];
2962
- case 1:
2963
- _a.sent();
2964
- return [3 /*break*/, 3];
2965
- case 2:
2966
- selectedRows.forEach(function (row) { return (row[field] = value); });
2967
- _a.label = 3;
2968
- case 3: return [2 /*return*/, true];
2969
- }
2970
- });
2971
- }); })];
2972
- case 1: return [2 /*return*/, _a.sent()];
2973
- }
2974
- });
2975
- }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2976
- var selectFilterHandler = useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2977
- var field;
2978
- return __generator(this, function (_a) {
2979
- switch (_a.label) {
2980
- case 0:
2981
- field = props.field;
2982
- return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2983
- return __generator(this, function (_a) {
2984
- switch (_a.label) {
2985
- case 0:
2986
- if (!formProps.onSelectFilter) return [3 /*break*/, 2];
2987
- return [4 /*yield*/, formProps.onSelectFilter({ selectedRows: selectedRows, value: value })];
2988
- case 1:
2989
- _a.sent();
2990
- _a.label = 2;
2991
- case 2: return [2 /*return*/, true];
2992
- }
2993
- });
2994
- }); })];
2995
- case 1: return [2 /*return*/, _a.sent()];
2996
- }
2997
- });
2998
- }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2999
- // Load up options list if it's async function
3000
- useEffect(function () {
3001
- var _a;
3002
- if (options || optionsInitialising.current)
3003
- return;
3004
- optionsInitialising.current = true;
3005
- var optionsConf = (_a = formProps.options) !== null && _a !== void 0 ? _a : [];
3006
- (function () { return __awaiter(void 0, void 0, void 0, function () {
3007
- var optionsList;
3008
- return __generator(this, function (_a) {
3009
- switch (_a.label) {
3010
- case 0:
3011
- if (!(typeof optionsConf == "function")) return [3 /*break*/, 2];
3012
- return [4 /*yield*/, optionsConf(props.selectedRows, filter)];
3013
- case 1:
3014
- optionsConf = _a.sent();
3015
- _a.label = 2;
3016
- case 2:
3017
- optionsList = optionsConf === null || optionsConf === void 0 ? void 0 : optionsConf.map(function (item) {
3018
- if (item == null || typeof item == "string" || typeof item == "number") {
3019
- item = { value: item, label: item, disabled: false };
3020
- }
3021
- return item;
3022
- });
3023
- if (formProps.filtered) {
3024
- // This is needed otherwise when filter input is rendered and sets autofocus
3025
- // the mouse up of the double click edit triggers the cell to cancel editing
3026
- delay(function () { return setOptions(optionsList); }, 100);
3027
- }
3028
- else {
3029
- setOptions(optionsList);
3030
- }
3031
- optionsInitialising.current = false;
3032
- return [2 /*return*/];
3033
- }
3034
- });
3035
- }); })();
3036
- }, [filter, options, formProps.filtered, formProps.options, props.selectedRows]);
3037
- // Local filtering
3038
- useEffect(function () {
3039
- if (formProps.filtered == "local") {
3040
- if (options == null)
3041
- return;
3042
- setFilteredValues(options
3043
- .map(function (option) {
3044
- if (option.label != null && typeof option.label !== "string") {
3045
- console.error("Cannot filter non-string labels", option);
3046
- return undefined;
3047
- }
3048
- var str = option.label || "";
3049
- return str.toLowerCase().indexOf(filter) === -1 ? option.value : undefined;
3050
- })
3051
- .filter(function (r) { return r !== undefined; }));
3052
- }
3053
- }, [formProps.filtered, filter, options]);
3054
- var researchOnFilterChange = debounce(useCallback(function () {
3055
- setOptions(null);
3056
- }, []), 500);
3057
- var previousFilter = useRef(filter);
3058
- // Reload filtering
3059
- useEffect(function () {
3060
- if (previousFilter.current != filter && formProps.filtered == "reload") {
3061
- previousFilter.current = filter;
3062
- formProps.optionsRequestCancel && formProps.optionsRequestCancel();
3063
- researchOnFilterChange().then();
3064
- }
3065
- }, [filter, formProps, props, researchOnFilterChange]);
3066
- var onFilterKeyDown = useCallback(function (e) { return __awaiter(void 0, void 0, void 0, function () {
3067
- var activeOptions;
3068
- return __generator(this, function (_a) {
3069
- switch (_a.label) {
3070
- case 0:
3071
- if (!options)
3072
- return [2 /*return*/];
3073
- if (!(e.key == "Enter" || e.key == "Tab")) return [3 /*break*/, 5];
3074
- activeOptions = options.filter(function (option) { return !filteredValues.includes(option.value); });
3075
- if (!(activeOptions.length == 1)) return [3 /*break*/, 2];
3076
- return [4 /*yield*/, selectItemHandler(activeOptions[0].value)];
3077
- case 1:
3078
- _a.sent();
3079
- stopEditing();
3080
- return [3 /*break*/, 5];
3081
- case 2:
3082
- if (!formProps.onSelectFilter) return [3 /*break*/, 4];
3083
- return [4 /*yield*/, selectFilterHandler(filter)];
3084
- case 3:
3085
- _a.sent();
3086
- stopEditing();
3087
- return [3 /*break*/, 5];
3088
- case 4:
3089
- e.preventDefault();
3090
- e.stopPropagation();
3091
- _a.label = 5;
3092
- case 5: return [2 /*return*/];
3093
- }
3094
- });
3095
- }); }, [filteredValues, options, selectItemHandler, selectFilterHandler, stopEditing, filter, formProps]);
3096
- return popoverWrapper(jsxs(Fragment$1, { children: [formProps.filtered && (jsxs(Fragment$1, { children: [jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_a) {
3097
- var _b;
3098
- var ref = _a.ref;
3099
- return (jsx("div", __assign({ style: { display: "flex", width: "100%" } }, { children: 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); } }) })));
3100
- } })), jsx(MenuDivider, {}, "$$divider_filter")] })), jsx(ComponentLoadingWrapper, __assign({ loading: !options }, { children: jsxs(Fragment$1, { children: [options && options.length == (filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.length) && jsx(MenuItem, { children: "[Empty]" }), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
3101
- var _a;
3102
- return item.value === MenuSeparatorString ? (jsx(MenuDivider, {}, "$$divider_".concat(index))) : filteredValues.includes(item.value) ? null : (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)));
3103
- })] }) }))] }));
3104
- };
3105
-
3106
3116
  var GridPopoverEditDropDown = function (colDef) {
3107
3117
  var _a;
3108
3118
  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) && {
@@ -3201,32 +3211,35 @@ var GridPopoverTextArea = function (colDef) {
3201
3211
  };
3202
3212
 
3203
3213
  var GridFormTextInput = function (props) {
3204
- var _a, _b;
3214
+ var _a;
3205
3215
  var formProps = props.formProps;
3206
- var _c = useState((_a = props.value) !== null && _a !== void 0 ? _a : ""), value = _c[0], setValue = _c[1];
3216
+ var initValue = props.value == null ? "" : "".concat(props.value);
3217
+ var _b = useState(initValue), value = _b[0], setValue = _b[1];
3207
3218
  var invalid = useCallback(function () {
3208
- if (formProps.required && value.length == 0) {
3219
+ var trimmedValue = value.trim();
3220
+ if (formProps.required && trimmedValue.length == 0) {
3209
3221
  return "Some text is required";
3210
3222
  }
3211
- if (formProps.maxlength && value.length > formProps.maxlength) {
3223
+ if (formProps.maxlength && trimmedValue.length > formProps.maxlength) {
3212
3224
  return "Text must be no longer than ".concat(formProps.maxlength, " characters");
3213
3225
  }
3214
3226
  if (formProps.validate) {
3215
- return formProps.validate(value);
3227
+ return formProps.validate(trimmedValue, props.data);
3216
3228
  }
3217
3229
  return null;
3218
3230
  }, [formProps, value]);
3219
3231
  var save = useCallback(function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
3220
- var field;
3232
+ var trimmedValue, field;
3221
3233
  return __generator(this, function (_a) {
3222
3234
  switch (_a.label) {
3223
3235
  case 0:
3224
3236
  if (invalid())
3225
3237
  return [2 /*return*/, false];
3226
- if (props.value === (value !== null && value !== void 0 ? value : ""))
3238
+ trimmedValue = value.trim();
3239
+ if (initValue === trimmedValue)
3227
3240
  return [2 /*return*/, true];
3228
3241
  if (!formProps.onSave) return [3 /*break*/, 2];
3229
- return [4 /*yield*/, formProps.onSave(selectedRows, value)];
3242
+ return [4 /*yield*/, formProps.onSave(selectedRows, trimmedValue)];
3230
3243
  case 1: return [2 /*return*/, _a.sent()];
3231
3244
  case 2:
3232
3245
  field = props.field;
@@ -3234,13 +3247,13 @@ var GridFormTextInput = function (props) {
3234
3247
  console.error("ColDef has no field set");
3235
3248
  return [2 /*return*/, false];
3236
3249
  }
3237
- selectedRows.forEach(function (row) { return (row[field] = value); });
3250
+ selectedRows.forEach(function (row) { return (row[field] = trimmedValue); });
3238
3251
  return [2 /*return*/, true];
3239
3252
  }
3240
3253
  });
3241
- }); }, [invalid, props.value, props.field, value, formProps]);
3242
- var _d = useGridPopoverHook(props, save), popoverWrapper = _d.popoverWrapper, triggerSave = _d.triggerSave;
3243
- return popoverWrapper(jsx("div", __assign({ style: { display: "flex", flexDirection: "row", width: (_b = formProps.width) !== null && _b !== void 0 ? _b : 240 }, className: "FormTest" }, { children: jsx(TextInputFormatted, { value: value, onChange: function (e) { return setValue(e.target.value); }, error: invalid(), formatted: "", inputProps: {
3254
+ }); }, [invalid, value, initValue, formProps, props.field]);
3255
+ var _c = useGridPopoverHook(props, save), popoverWrapper = _c.popoverWrapper, triggerSave = _c.triggerSave;
3256
+ return popoverWrapper(jsx("div", __assign({ style: { display: "flex", flexDirection: "row", width: (_a = formProps.width) !== null && _a !== void 0 ? _a : 240 }, className: "FormTest" }, { children: jsx(TextInputFormatted, { value: value, onChange: function (e) { return setValue(e.target.value); }, error: invalid(), formatted: formProps.units, inputProps: {
3244
3257
  style: { width: "100%" },
3245
3258
  placeholder: formProps.placeholder,
3246
3259
  onKeyDown: function (e) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
@@ -3263,5 +3276,5 @@ var GridSubComponentTextArea = function (props) {
3263
3276
  return (jsx("div", __assign({ className: "FreeTextInput LuiDeprecatedForms" }, { children: jsx("textarea", { autoFocus: true, maxLength: 10000, spellCheck: true, className: "free-text-input", onChange: function (e) { return setValue(e.target.value); }, defaultValue: value }) })));
3264
3277
  };
3265
3278
 
3266
- export { ComponentLoadingWrapper, ControlledMenu, FocusableItem, GenericMultiEditCellClass, Grid, GridCell, GridContext, GridContextProvider, GridFormDropDown, GridFormEditBearing, GridFormMessage, GridFormMultiSelect, GridFormPopoutMenu, GridFormTextArea, GridFormTextInput, GridHeaderSelect, GridIcon, GridLoadableCell, GridPopoutEditMultiSelect, GridPopoverEditBearing, GridPopoverEditBearingCorrection, GridPopoverEditDropDown, GridPopoverMenu, GridPopoverMessage, GridPopoverTextArea, GridPopoverTextInput, GridRenderPopoutMenuCell, GridRendererGenericCell, GridSubComponentTextArea, Menu, MenuButton, MenuDivider, MenuGroup, MenuHeader, MenuItem, MenuRadioGroup, SubMenu, TextAreaInput, TextInputFormatted, UpdatingContext, UpdatingContextProvider, bearingCorrectionValueFormatter, bearingNumberParser, bearingStringValidator, bearingValueFormatter, convertDDToDMS, hasParentClass, isFloat, isNotEmpty, useGridPopoverHook, useMenuState, usePostSortRowsHook, wait };
3279
+ export { ComponentLoadingWrapper, ControlledMenu, FocusableItem, GenericCellEditorComponent, GenericCellEditorComponentFr, GenericMultiEditCellClass, Grid, GridCell, GridCellRenderer, GridContext, GridContextProvider, GridFormDropDown, GridFormEditBearing, GridFormMessage, GridFormMultiSelect, GridFormPopoutMenu, GridFormTextArea, GridFormTextInput, GridHeaderSelect, GridIcon, GridLoadableCell, GridPopoutEditMultiSelect, GridPopoverEditBearing, GridPopoverEditBearingCorrection, GridPopoverEditDropDown, GridPopoverMenu, GridPopoverMessage, GridPopoverTextArea, GridPopoverTextInput, GridRenderPopoutMenuCell, GridRendererGenericCell, GridSubComponentTextArea, Menu, MenuButton, MenuDivider, MenuGroup, MenuHeader, MenuItem, MenuRadioGroup, MenuSeparator, MenuSeparatorString, PopoutMenuSeparator, SubMenu, TextAreaInput, TextInputFormatted, UpdatingContext, UpdatingContextProvider, bearingCorrectionValueFormatter, bearingNumberParser, bearingStringValidator, bearingValueFormatter, convertDDToDMS, hasParentClass, isFloat, isNotEmpty, useGridPopoverHook, useMenuState, usePostSortRowsHook, wait };
3267
3280
  //# sourceMappingURL=step-ag-grid.esm.js.map