@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.
@@ -15,7 +15,7 @@ export interface GridProps {
15
15
  externalSelectedItems?: any[];
16
16
  setExternalSelectedItems?: (items: any[]) => void;
17
17
  onGridReady?: GridOptions["onGridReady"];
18
- defaultColDef: GridOptions["defaultColDef"];
18
+ defaultColDef?: GridOptions["defaultColDef"];
19
19
  columnDefs: GridOptions["columnDefs"];
20
20
  rowData: GridOptions["rowData"];
21
21
  noRowsOverlayText?: string;
@@ -2,16 +2,12 @@
2
2
  import "../../react-menu3/styles/index.scss";
3
3
  import { GridBaseRow } from "../Grid";
4
4
  import { GenericCellEditorParams, GridFormProps } from "../GridCell";
5
- interface FinalSelectOption<ValueType> {
5
+ interface MultiFinalSelectOption<ValueType> {
6
6
  value: ValueType;
7
7
  label?: JSX.Element | string;
8
8
  subComponent?: (props: any, ref: any) => any;
9
9
  }
10
- export declare const MenuSeparatorString = "_____MENU_SEPARATOR_____";
11
- export declare const MenuSeparator: Readonly<{
12
- value: "_____MENU_SEPARATOR_____";
13
- }>;
14
- export declare type SelectOption<ValueType> = ValueType | FinalSelectOption<ValueType>;
10
+ export declare type MultiSelectOption<ValueType> = ValueType | MultiFinalSelectOption<ValueType>;
15
11
  export interface MultiSelectResult<RowType> {
16
12
  selectedRows: RowType[];
17
13
  values: Record<string, any>;
@@ -20,7 +16,7 @@ export interface GridFormMultiSelectProps<RowType extends GridBaseRow, ValueType
20
16
  filtered?: boolean;
21
17
  filterPlaceholder?: string;
22
18
  onSave?: (props: MultiSelectResult<RowType>) => Promise<boolean>;
23
- options: SelectOption<ValueType>[] | ((selectedRows: RowType[]) => Promise<SelectOption<ValueType>[]> | SelectOption<ValueType>[]);
19
+ options: MultiSelectOption<ValueType>[] | ((selectedRows: RowType[]) => Promise<MultiSelectOption<ValueType>[]> | MultiSelectOption<ValueType>[]);
24
20
  initialSelectedValues?: (selectedRows: RowType[]) => any[];
25
21
  }
26
22
  export declare const GridFormMultiSelect: <RowType extends GridBaseRow, ValueType>(props: GridFormProps<RowType>) => JSX.Element;
@@ -5,7 +5,7 @@ export interface GridFormPopoutMenuProps<RowType extends GridBaseRow> extends Ge
5
5
  options: (selectedRows: RowType[]) => Promise<MenuOption<RowType>[]>;
6
6
  }
7
7
  /** Menu configuration types **/
8
- export declare const MenuSeparator: Readonly<{
8
+ export declare const PopoutMenuSeparator: Readonly<{
9
9
  __isMenuSeparator__: true;
10
10
  }>;
11
11
  interface MenuSeparatorType {
@@ -7,7 +7,7 @@ export interface GridFormTextInputProps<RowType extends GridBaseRow> extends Gen
7
7
  required?: boolean;
8
8
  maxlength?: number;
9
9
  width?: string | number;
10
- validate?: (value: string) => string | null;
10
+ validate?: (value: string, data: RowType) => string | null;
11
11
  onSave?: (selectedRows: RowType[], value: string) => Promise<boolean>;
12
12
  }
13
13
  export declare const GridFormTextInput: <RowType extends GridBaseRow>(props: GridFormProps<RowType>) => JSX.Element;
@@ -16,6 +16,7 @@ export interface GridContextType {
16
16
  flashRowsDiff: (updateFn: () => Promise<any>) => Promise<void>;
17
17
  ensureRowVisible: (id: number) => void;
18
18
  ensureSelectedRowIsVisible: () => void;
19
+ sizeColumnsToFit: () => void;
19
20
  stopEditing: () => void;
20
21
  updatingCells: (props: {
21
22
  selectedRows: GridBaseRow[];
@@ -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 })] })));
@@ -2549,8 +2559,175 @@ var GridRenderPopoutMenuCell = function (props) {
2549
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}";
2550
2560
  styleInject(css_248z$3);
2551
2561
 
2552
- var MenuSeparatorString$1 = "_____MENU_SEPARATOR_____";
2553
- 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
+
2554
2731
  var GridFormMultiSelect = function (props) {
2555
2732
  var formProps = props.formProps;
2556
2733
  var _a = useState(""), filter = _a[0], setFilter = _a[1];
@@ -2633,7 +2810,7 @@ var GridFormMultiSelect = function (props) {
2633
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()); } }) })));
2634
2811
  } }), "filter"), jsx(MenuDivider, {}, "$$divider_filter")] })), options === null || options === void 0 ? void 0 : options.map(function (item, index) {
2635
2812
  var _a;
2636
- 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) {
2637
2814
  e.keepOpen = true;
2638
2815
  if (selectedValues.includes(item.value)) {
2639
2816
  setSelectedValues(selectedValues.filter(function (value) { return value != item.value; }));
@@ -2687,7 +2864,7 @@ var css_248z$2 = "/**\n @deprecated\n */\n/**\n @deprecated\n */\n/**\n @depr
2687
2864
  styleInject(css_248z$2);
2688
2865
 
2689
2866
  /** Menu configuration types **/
2690
- var MenuSeparator = Object.freeze({ __isMenuSeparator__: true });
2867
+ var PopoutMenuSeparator = Object.freeze({ __isMenuSeparator__: true });
2691
2868
  /**
2692
2869
  * NOTE: If the popout menu doesn't appear on single click when also selecting row it's because
2693
2870
  * you need a useMemo around your columnDefs
@@ -2750,11 +2927,11 @@ var GridFormPopoutMenu = function (props) {
2750
2927
  }); }, [props.field, props.selectedRows, updatingCells]);
2751
2928
  var selectedRowCount = props.selectedRows.length;
2752
2929
  var filteredOptions = options === null || options === void 0 ? void 0 : options.filter(function (menuOption) {
2753
- return menuOption.label === MenuSeparator || selectedRowCount === 1 || menuOption.supportsMultiEdit;
2930
+ return menuOption.label === PopoutMenuSeparator || selectedRowCount === 1 || menuOption.supportsMultiEdit;
2754
2931
  });
2755
2932
  var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2756
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) {
2757
- 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))));
2758
2935
  }) })) })));
2759
2936
  };
2760
2937
 
@@ -2936,175 +3113,6 @@ var GridPopoverEditBearingCorrection = function (colDef) {
2936
3113
  } }, init.cellEditorParams) });
2937
3114
  };
2938
3115
 
2939
- var MenuSeparatorString = "_____MENU_SEPARATOR_____";
2940
- Object.freeze({ value: MenuSeparatorString });
2941
- var GridFormDropDown = function (props) {
2942
- var popoverWrapper = useGridPopoverHook(props).popoverWrapper;
2943
- var formProps = props.formProps;
2944
- var _a = useContext(GridContext), updatingCells = _a.updatingCells, stopEditing = _a.stopEditing;
2945
- var _b = useState(""), filter = _b[0], setFilter = _b[1];
2946
- var _c = useState([]), filteredValues = _c[0], setFilteredValues = _c[1];
2947
- var optionsInitialising = useRef(false);
2948
- var _d = useState(null), options = _d[0], setOptions = _d[1];
2949
- var selectItemHandler = useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2950
- var field;
2951
- return __generator(this, function (_a) {
2952
- switch (_a.label) {
2953
- case 0:
2954
- field = props.field;
2955
- return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2956
- var hasChanged;
2957
- return __generator(this, function (_a) {
2958
- switch (_a.label) {
2959
- case 0:
2960
- hasChanged = selectedRows.some(function (row) { return row[field] !== value; });
2961
- if (!hasChanged) return [3 /*break*/, 3];
2962
- if (!formProps.onSelectedItem) return [3 /*break*/, 2];
2963
- return [4 /*yield*/, formProps.onSelectedItem({ selectedRows: selectedRows, value: value })];
2964
- case 1:
2965
- _a.sent();
2966
- return [3 /*break*/, 3];
2967
- case 2:
2968
- selectedRows.forEach(function (row) { return (row[field] = value); });
2969
- _a.label = 3;
2970
- case 3: return [2 /*return*/, true];
2971
- }
2972
- });
2973
- }); })];
2974
- case 1: return [2 /*return*/, _a.sent()];
2975
- }
2976
- });
2977
- }); }, [formProps, props.field, props.selectedRows, updatingCells]);
2978
- var selectFilterHandler = useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
2979
- var field;
2980
- return __generator(this, function (_a) {
2981
- switch (_a.label) {
2982
- case 0:
2983
- field = props.field;
2984
- return [4 /*yield*/, updatingCells({ selectedRows: props.selectedRows, field: field }, function (selectedRows) { return __awaiter(void 0, void 0, void 0, function () {
2985
- return __generator(this, function (_a) {
2986
- switch (_a.label) {
2987
- case 0:
2988
- if (!formProps.onSelectFilter) return [3 /*break*/, 2];
2989
- return [4 /*yield*/, formProps.onSelectFilter({ selectedRows: selectedRows, value: value })];
2990
- case 1:
2991
- _a.sent();
2992
- _a.label = 2;
2993
- case 2: return [2 /*return*/, true];
2994
- }
2995
- });
2996
- }); })];
2997
- case 1: return [2 /*return*/, _a.sent()];
2998
- }
2999
- });
3000
- }); }, [formProps, props.field, props.selectedRows, updatingCells]);
3001
- // Load up options list if it's async function
3002
- useEffect(function () {
3003
- var _a;
3004
- if (options || optionsInitialising.current)
3005
- return;
3006
- optionsInitialising.current = true;
3007
- var optionsConf = (_a = formProps.options) !== null && _a !== void 0 ? _a : [];
3008
- (function () { return __awaiter(void 0, void 0, void 0, function () {
3009
- var optionsList;
3010
- return __generator(this, function (_a) {
3011
- switch (_a.label) {
3012
- case 0:
3013
- if (!(typeof optionsConf == "function")) return [3 /*break*/, 2];
3014
- return [4 /*yield*/, optionsConf(props.selectedRows, filter)];
3015
- case 1:
3016
- optionsConf = _a.sent();
3017
- _a.label = 2;
3018
- case 2:
3019
- optionsList = optionsConf === null || optionsConf === void 0 ? void 0 : optionsConf.map(function (item) {
3020
- if (item == null || typeof item == "string" || typeof item == "number") {
3021
- item = { value: item, label: item, disabled: false };
3022
- }
3023
- return item;
3024
- });
3025
- if (formProps.filtered) {
3026
- // This is needed otherwise when filter input is rendered and sets autofocus
3027
- // the mouse up of the double click edit triggers the cell to cancel editing
3028
- delay(function () { return setOptions(optionsList); }, 100);
3029
- }
3030
- else {
3031
- setOptions(optionsList);
3032
- }
3033
- optionsInitialising.current = false;
3034
- return [2 /*return*/];
3035
- }
3036
- });
3037
- }); })();
3038
- }, [filter, options, formProps.filtered, formProps.options, props.selectedRows]);
3039
- // Local filtering
3040
- useEffect(function () {
3041
- if (formProps.filtered == "local") {
3042
- if (options == null)
3043
- return;
3044
- setFilteredValues(options
3045
- .map(function (option) {
3046
- if (option.label != null && typeof option.label !== "string") {
3047
- console.error("Cannot filter non-string labels", option);
3048
- return undefined;
3049
- }
3050
- var str = option.label || "";
3051
- return str.toLowerCase().indexOf(filter) === -1 ? option.value : undefined;
3052
- })
3053
- .filter(function (r) { return r !== undefined; }));
3054
- }
3055
- }, [formProps.filtered, filter, options]);
3056
- var researchOnFilterChange = debounce(useCallback(function () {
3057
- setOptions(null);
3058
- }, []), 500);
3059
- var previousFilter = useRef(filter);
3060
- // Reload filtering
3061
- useEffect(function () {
3062
- if (previousFilter.current != filter && formProps.filtered == "reload") {
3063
- previousFilter.current = filter;
3064
- formProps.optionsRequestCancel && formProps.optionsRequestCancel();
3065
- researchOnFilterChange().then();
3066
- }
3067
- }, [filter, formProps, props, researchOnFilterChange]);
3068
- var onFilterKeyDown = useCallback(function (e) { return __awaiter(void 0, void 0, void 0, function () {
3069
- var activeOptions;
3070
- return __generator(this, function (_a) {
3071
- switch (_a.label) {
3072
- case 0:
3073
- if (!options)
3074
- return [2 /*return*/];
3075
- if (!(e.key == "Enter" || e.key == "Tab")) return [3 /*break*/, 5];
3076
- activeOptions = options.filter(function (option) { return !filteredValues.includes(option.value); });
3077
- if (!(activeOptions.length == 1)) return [3 /*break*/, 2];
3078
- return [4 /*yield*/, selectItemHandler(activeOptions[0].value)];
3079
- case 1:
3080
- _a.sent();
3081
- stopEditing();
3082
- return [3 /*break*/, 5];
3083
- case 2:
3084
- if (!formProps.onSelectFilter) return [3 /*break*/, 4];
3085
- return [4 /*yield*/, selectFilterHandler(filter)];
3086
- case 3:
3087
- _a.sent();
3088
- stopEditing();
3089
- return [3 /*break*/, 5];
3090
- case 4:
3091
- e.preventDefault();
3092
- e.stopPropagation();
3093
- _a.label = 5;
3094
- case 5: return [2 /*return*/];
3095
- }
3096
- });
3097
- }); }, [filteredValues, options, selectItemHandler, selectFilterHandler, stopEditing, filter, formProps]);
3098
- return popoverWrapper(jsxs(Fragment$1, { children: [formProps.filtered && (jsxs(Fragment$1, { children: [jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_a) {
3099
- var _b;
3100
- var ref = _a.ref;
3101
- 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); } }) })));
3102
- } })), 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) {
3103
- var _a;
3104
- 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)));
3105
- })] }) }))] }));
3106
- };
3107
-
3108
3116
  var GridPopoverEditDropDown = function (colDef) {
3109
3117
  var _a;
3110
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) && {
@@ -3216,7 +3224,7 @@ var GridFormTextInput = function (props) {
3216
3224
  return "Text must be no longer than ".concat(formProps.maxlength, " characters");
3217
3225
  }
3218
3226
  if (formProps.validate) {
3219
- return formProps.validate(trimmedValue);
3227
+ return formProps.validate(trimmedValue, props.data);
3220
3228
  }
3221
3229
  return null;
3222
3230
  }, [formProps, value]);
@@ -3268,5 +3276,5 @@ var GridSubComponentTextArea = function (props) {
3268
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 }) })));
3269
3277
  };
3270
3278
 
3271
- 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, 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 };
3272
3280
  //# sourceMappingURL=step-ag-grid.esm.js.map