@linzjs/step-ag-grid 7.1.0 → 7.2.0

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.js CHANGED
@@ -2825,20 +2825,17 @@ var Grid = function (params) {
2825
2825
  }, [columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.length, sizeColumnsToFit]);
2826
2826
  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) {
2827
2827
  setInternalQuickFilter(event.target.value);
2828
- } }) }))), 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, onCellKeyPress: onCellKeyPress, onCellClicked: onCellClicked, onCellDoubleClicked: onCellDoubleClick, onCellEditingStarted: refreshSelectedRows, onCellEditingStopped: onCellEditingStopped, domLayout: params.domLayout, columnDefs: columnDefs, rowData: params.rowData, noRowsOverlayComponent: noRowsOverlayComponent, onGridReady: onGridReady, onSortChanged: ensureSelectedRowIsVisible, postSortRows: (_b = params.postSortRows) !== null && _b !== void 0 ? _b : postSortRows, onSelectionChanged: synchroniseExternalStateToGridSelection })] })));
2828
+ } }) }))), jsxRuntime.jsx(agGridReact.AgGridReact, { animateRows: params.animateRows, rowClassRules: params.rowClassRules, defaultColDef: params.defaultColDef, getRowId: function (params) { return "".concat(params.data.id); }, suppressRowClickSelection: true, rowSelection: "multiple", suppressBrowserResizeObserver: true, colResizeDefault: "shift", onFirstDataRendered: sizeColumnsToFit, onGridSizeChanged: sizeColumnsToFit, suppressClickEdit: true, onCellKeyPress: onCellKeyPress, onCellClicked: onCellClicked, onCellDoubleClicked: onCellDoubleClick, onCellEditingStarted: refreshSelectedRows, onCellEditingStopped: onCellEditingStopped, domLayout: params.domLayout, columnDefs: columnDefs, rowData: params.rowData, noRowsOverlayComponent: noRowsOverlayComponent, onGridReady: onGridReady, onSortChanged: ensureSelectedRowIsVisible, postSortRows: (_b = params.postSortRows) !== null && _b !== void 0 ? _b : postSortRows, onSelectionChanged: synchroniseExternalStateToGridSelection })] })));
2829
2829
  };
2830
2830
 
2831
- var GenericMultiEditCellClass = function (props) {
2832
- var api = props.api;
2833
- if (api == null)
2834
- return "";
2835
- var rowSelected = api
2836
- .getSelectedNodes()
2837
- .map(function (row) { return row.id; })
2838
- .includes(props.node.id);
2839
- return rowSelected && api.getEditingCells().some(function (cell) { return cell.column.getColDef() === props.colDef; })
2840
- ? "ag-selected-for-edit"
2841
- : "";
2831
+ var GridCellMultiSelectClassRules = {
2832
+ "ag-selected-for-edit": function (_a) {
2833
+ var api = _a.api, node = _a.node, colDef = _a.colDef;
2834
+ return api
2835
+ .getSelectedNodes()
2836
+ .map(function (row) { return row.id; })
2837
+ .includes(node.id) && api.getEditingCells().some(function (cell) { return cell.column.getColDef() === colDef; });
2838
+ }
2842
2839
  };
2843
2840
 
2844
2841
  function styleInject(css, ref) {
@@ -2916,7 +2913,7 @@ var GridCellRenderer = function (props) {
2916
2913
  var GridCell = function (props, custom) {
2917
2914
  var _a;
2918
2915
  return __assign(__assign(__assign(__assign(__assign(__assign({ colId: props.field, sortable: !!((props === null || props === void 0 ? void 0 : props.field) || (props === null || props === void 0 ? void 0 : props.valueGetter)), resizable: true }, ((custom === null || custom === void 0 ? void 0 : custom.editor) && {
2919
- cellClass: (custom === null || custom === void 0 ? void 0 : custom.multiEdit) ? GenericMultiEditCellClass : undefined,
2916
+ cellClassRules: GridCellMultiSelectClassRules,
2920
2917
  editable: (_a = props.editable) !== null && _a !== void 0 ? _a : true,
2921
2918
  cellEditor: GenericCellEditorComponentWrapper(custom)
2922
2919
  })), { suppressKeyboardEvent: function (e) {
@@ -3537,8 +3534,8 @@ function isMatch(inputs, patterns, options) {
3537
3534
  * "*L" => *L
3538
3535
  * "A B" => A* and B*
3539
3536
  * "A B, C" => (A* and B*) or C*
3540
- *
3541
- * Returns ture if there's a text match.
3537
+ * "!A" => all values must not match A
3538
+ * Returns true if there's a text match.
3542
3539
  */
3543
3540
  var textMatch = function (text, filter) {
3544
3541
  if (text == null)
@@ -3547,12 +3544,15 @@ var textMatch = function (text, filter) {
3547
3544
  .split(",")
3548
3545
  .map(function (sf) { return sf.trim(); })
3549
3546
  .filter(function (sf) { return sf; });
3547
+ var _a = lodashEs.partition(superFilters, function (superFilters) { return superFilters.startsWith("!"); }), negativeFilters = _a[0], positiveFilters = _a[1];
3550
3548
  var values = text.replaceAll(",", " ").trim().split(/\s+/);
3551
- return (lodashEs.isEmpty(superFilters) || // Not filtered
3552
- superFilters.some(function (superFilter) {
3549
+ return ((lodashEs.isEmpty(positiveFilters) || // Not filtered
3550
+ positiveFilters.some(function (superFilter) {
3553
3551
  var subFilters = superFilter.split(/\s+/).map(function (s) { return s.replaceAll(/([!?])/g, "\\$1"); });
3554
3552
  return subFilters.every(function (subFilter) { return values.some(function (value) { return isMatch(value, subFilter); }); });
3555
- }));
3553
+ })) &&
3554
+ (lodashEs.isEmpty(negativeFilters) ||
3555
+ negativeFilters.every(function (superFilter) { return values.every(function (value) { return isMatch(value, superFilter); }); })));
3556
3556
  };
3557
3557
 
3558
3558
  var GridFormMultiSelect = function (props) {
@@ -3614,8 +3614,32 @@ var GridFormMultiSelect = function (props) {
3614
3614
  * Groups options into their header groups
3615
3615
  */
3616
3616
  var headerGroups = React.useMemo(function () {
3617
- return options &&
3618
- lodashEs.groupBy(options.filter(function (o) { return textMatch(o.label, filter) && o.value; }), "filter");
3617
+ if (!options)
3618
+ return undefined;
3619
+ var result = lodashEs.groupBy(options.filter(function (o) { return textMatch(o.label, filter) && o.value; }), "filter");
3620
+ // remove leading/trailing/duplicate dividers
3621
+ return lodashEs.fromPairs(lodashEs.toPairs(result).map(function (_a) {
3622
+ var key = _a[0], arr = _a[1];
3623
+ var lastWasDivider = true;
3624
+ return [
3625
+ key,
3626
+ arr
3627
+ .map(function (row, index) {
3628
+ if (row.value === MenuSeparatorString) {
3629
+ if (lastWasDivider)
3630
+ return null;
3631
+ if (index === arr.length - 1)
3632
+ return null;
3633
+ lastWasDivider = true;
3634
+ }
3635
+ else {
3636
+ lastWasDivider = false;
3637
+ }
3638
+ return row;
3639
+ })
3640
+ .filter(function (r) { return r; }),
3641
+ ];
3642
+ }));
3619
3643
  }, [filter, options]);
3620
3644
  var headers = React.useMemo(function () { var _a; return (_a = props.headers) !== null && _a !== void 0 ? _a : [{ header: "" }]; }, [props.headers]);
3621
3645
  var _e = useGridPopoverHook({
@@ -3623,7 +3647,7 @@ var GridFormMultiSelect = function (props) {
3623
3647
  invalid: invalid,
3624
3648
  save: save
3625
3649
  }), popoverWrapper = _e.popoverWrapper, triggerSave = _e.triggerSave;
3626
- return popoverWrapper(jsxRuntime.jsx(ComponentLoadingWrapper, __assign({ loading: !options, className: "GridFormMultiSelect-container" }, { children: options && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [props.filtered && (jsxRuntime.jsx(FilterInput, __assign({}, { headerGroups: headerGroups, options: options, setOptions: setOptions, filter: filter, setFilter: setFilter }, { filterHelpText: props.filterHelpText, onSelectFilter: props.onSelectFilter, filterPlaceholder: props.filterPlaceholder }))), headerGroups && (jsxRuntime.jsx("div", __assign({ className: "GridFormMultiSelect-options" }, { children: headers.map(function (header) {
3650
+ return popoverWrapper(jsxRuntime.jsx(ComponentLoadingWrapper, __assign({ loading: !options, className: "GridFormMultiSelect-container" }, { children: options && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [props.filtered && (jsxRuntime.jsx(FilterInput, __assign({}, { headerGroups: headerGroups, options: options, setOptions: setOptions, filter: filter, setFilter: setFilter, triggerSave: triggerSave }, { filterHelpText: props.filterHelpText, onSelectFilter: props.onSelectFilter, filterPlaceholder: props.filterPlaceholder }))), headerGroups && (jsxRuntime.jsx("div", __assign({ className: "GridFormMultiSelect-options" }, { children: headers.map(function (header) {
3627
3651
  var subOptions = headerGroups["".concat(header.filter)];
3628
3652
  return (!lodashEs.isEmpty(subOptions) && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.header && jsxRuntime.jsx(MenuHeader, { children: header.header }), subOptions.map(function (item, index) {
3629
3653
  return item.value === MenuSeparatorString ? (jsxRuntime.jsx(MenuDivider, {}, "div_".concat(index))) : (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx(MenuRadioItem, { item: item, options: options, setOptions: setOptions }), item.checked && item.subComponent && (jsxRuntime.jsx(MenuSubComponent, __assign({}, { item: item, options: options, setOptions: setOptions, data: data, triggerSave: triggerSave }, { subComponentIsValid: subComponentIsValidRef.current })))] }, "val_".concat(item.value)));
@@ -3631,14 +3655,19 @@ var GridFormMultiSelect = function (props) {
3631
3655
  }) })))] })) })));
3632
3656
  };
3633
3657
  var FilterInput = function (props) {
3634
- var options = props.options, setOptions = props.setOptions, onSelectFilter = props.onSelectFilter, filter = props.filter, setFilter = props.setFilter, headerGroups = props.headerGroups, filterPlaceholder = props.filterPlaceholder, filterHelpText = props.filterHelpText;
3658
+ var options = props.options, setOptions = props.setOptions, onSelectFilter = props.onSelectFilter, filter = props.filter, setFilter = props.setFilter, headerGroups = props.headerGroups, filterPlaceholder = props.filterPlaceholder, filterHelpText = props.filterHelpText, triggerSave = props.triggerSave;
3659
+ var enterHasBeenPressed = React.useRef(false);
3660
+ var lastKeyWasEnter = React.useRef(false);
3635
3661
  var toggleSelectAllVisible = React.useCallback(function () {
3636
3662
  if (!options || !headerGroups)
3637
3663
  return;
3638
3664
  if (lodashEs.isEmpty(filter.trim())) {
3639
3665
  // Toggle off if any items are checked otherwise on
3640
3666
  var anyChecked_1 = options.some(function (o) { return o.checked; });
3641
- options.forEach(function (o) { return (o.checked = !anyChecked_1); });
3667
+ options.forEach(function (o) {
3668
+ if (o.label !== undefined)
3669
+ o.checked = !anyChecked_1;
3670
+ });
3642
3671
  }
3643
3672
  else {
3644
3673
  // Toggle on if any filtered items are checked otherwise off
@@ -3647,7 +3676,7 @@ var FilterInput = function (props) {
3647
3676
  });
3648
3677
  Object.values(headerGroups).forEach(function (headerOptions) {
3649
3678
  headerOptions.forEach(function (o) {
3650
- if (o.checked !== undefined)
3679
+ if (o.label !== undefined)
3651
3680
  o.checked = anyChecked_2;
3652
3681
  });
3653
3682
  });
@@ -3657,28 +3686,52 @@ var FilterInput = function (props) {
3657
3686
  var addCustomFilterValue = React.useCallback(function () {
3658
3687
  if (!options || !onSelectFilter)
3659
3688
  return;
3689
+ var filterTrimmed = filter.trim();
3690
+ if (lodashEs.isEmpty(filterTrimmed)) {
3691
+ triggerSave().then();
3692
+ return;
3693
+ }
3660
3694
  var preFilterOptions = JSON.stringify(options);
3661
- onSelectFilter(filter.trim(), options);
3695
+ onSelectFilter(filterTrimmed, options);
3662
3696
  // Detect if options list changed and update
3663
3697
  if (preFilterOptions === JSON.stringify(options))
3664
3698
  return;
3665
3699
  setOptions(__spreadArray([], options, true));
3666
3700
  setFilter("");
3667
- }, [filter, onSelectFilter, options, setFilter, setOptions]);
3701
+ }, [filter, onSelectFilter, options, setFilter, setOptions, triggerSave]);
3702
+ var handleKeyDown = React.useCallback(function (e) {
3703
+ if (e.key === "Enter") {
3704
+ enterHasBeenPressed.current = true;
3705
+ }
3706
+ }, []);
3668
3707
  var handleKeyUp = React.useCallback(function (e) {
3669
3708
  if (e.key === "Enter") {
3670
3709
  e.stopPropagation();
3671
3710
  e.preventDefault();
3672
3711
  if (e.ctrlKey)
3673
3712
  toggleSelectAllVisible();
3674
- else if (onSelectFilter)
3675
- addCustomFilterValue();
3713
+ else if (enterHasBeenPressed.current) {
3714
+ var filterTrimmed = filter.trim();
3715
+ if (lodashEs.isEmpty(filterTrimmed)) {
3716
+ triggerSave().then();
3717
+ return;
3718
+ }
3719
+ onSelectFilter && addCustomFilterValue();
3720
+ }
3721
+ lastKeyWasEnter.current = true;
3722
+ }
3723
+ else if (e.key === "Control") {
3724
+ lastKeyWasEnter.current && setFilter("");
3725
+ lastKeyWasEnter.current = false;
3726
+ }
3727
+ else {
3728
+ lastKeyWasEnter.current = false;
3676
3729
  }
3677
- }, [addCustomFilterValue, onSelectFilter, toggleSelectAllVisible]);
3678
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_) { return (jsxRuntime.jsxs("div", __assign({ style: { width: "100%" }, className: "GridFormMultiSelect-filter" }, { children: [jsxRuntime.jsx("input", { className: "LuiTextInput-input", type: "text", placeholder: filterPlaceholder !== null && filterPlaceholder !== void 0 ? filterPlaceholder : "Placeholder", "data-testid": "filteredMenu-free-text-input", value: filter, "data-disableenterautosave": true, "data-allowtabtosave": true, onChange: function (e) { return setFilter(e.target.value); }, onKeyUp: handleKeyUp }), filterHelpText && (jsxRuntime.jsx(FormError, { error: null, helpText: typeof filterHelpText === "function" ? filterHelpText(filter.trim(), options) : filterHelpText }))] }))); } }), "filter"), jsxRuntime.jsx(MenuDivider, {}, "$$divider_filter"), headerGroups && !lodashEs.toPairs(headerGroups).some(function (_a) {
3730
+ }, [addCustomFilterValue, filter, onSelectFilter, setFilter, toggleSelectAllVisible, triggerSave]);
3731
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_) { return (jsxRuntime.jsxs("div", __assign({ style: { width: "100%" }, className: "GridFormMultiSelect-filter" }, { children: [jsxRuntime.jsx("input", { className: "LuiTextInput-input", type: "text", placeholder: filterPlaceholder !== null && filterPlaceholder !== void 0 ? filterPlaceholder : "Placeholder", "data-testid": "filteredMenu-free-text-input", value: filter, "data-disableenterautosave": true, "data-allowtabtosave": true, onChange: function (e) { return setFilter(e.target.value); }, onKeyDown: handleKeyDown, onKeyUp: handleKeyUp }), filterHelpText && (jsxRuntime.jsx(FormError, { error: null, helpText: typeof filterHelpText === "function" ? filterHelpText(filter.trim(), options) : filterHelpText }))] }))); } }), "filter"), jsxRuntime.jsx(MenuDivider, {}, "$$divider_filter"), headerGroups && !lodashEs.toPairs(headerGroups).some(function (_a) {
3679
3732
  _a[0]; var options = _a[1];
3680
3733
  return !lodashEs.isEmpty(options);
3681
- }) && (jsxRuntime.jsx("div", __assign({ className: "szh-menu__item" }, { children: "[No items match the filter]" })))] }));
3734
+ }) && (jsxRuntime.jsx("div", __assign({ className: "szh-menu__item GridPopoverEditDropDown-noOptions" }, { children: "No Options" })))] }));
3682
3735
  };
3683
3736
  var MenuRadioItem = function (props) {
3684
3737
  var _a, _b;
@@ -3693,7 +3746,7 @@ var MenuRadioItem = function (props) {
3693
3746
  e.keepOpen = true;
3694
3747
  toggleValue(item);
3695
3748
  }
3696
- } }, { children: jsxRuntime.jsx(lui.LuiCheckboxInput, { isChecked: (_a = item.checked) !== null && _a !== void 0 ? _a : false, value: "".concat(item.value), label: (_b = item.label) !== null && _b !== void 0 ? _b : (item.value == null ? "<".concat(item.value, ">") : "".concat(item.value)), inputProps: {
3749
+ } }, { children: jsxRuntime.jsx(lui.LuiCheckboxInput, { isChecked: (_a = item.checked) !== null && _a !== void 0 ? _a : false, value: "".concat(item.value), label: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [item.warning && jsxRuntime.jsx(GridIcon, { icon: "ic_warning", title: item.warning }), (_b = item.label) !== null && _b !== void 0 ? _b : (item.value == null ? "<".concat(item.value, ">") : "".concat(item.value))] }), inputProps: {
3697
3750
  onClick: function (e) {
3698
3751
  // Click is handled by MenuItem onClick
3699
3752
  e.preventDefault();
@@ -3873,7 +3926,7 @@ var GridFormPopoverMenu = function (props) {
3873
3926
  * Popout burger menu
3874
3927
  */
3875
3928
  var GridPopoverMenu = function (colDef, custom) {
3876
- return GridCell(__assign(__assign({ maxWidth: 40, editable: colDef.editable != null ? colDef.editable : true, cellStyle: { justifyContent: "flex-end" }, cellRenderer: GridRenderPopoutMenuCell, cellClass: (custom === null || custom === void 0 ? void 0 : custom.multiEdit) ? GenericMultiEditCellClass : undefined }, colDef), { cellRendererParams: {
3929
+ return GridCell(__assign(__assign({ maxWidth: 40, editable: colDef.editable != null ? colDef.editable : true, cellStyle: { justifyContent: "center" }, cellRenderer: GridRenderPopoutMenuCell }, colDef), { cellRendererParams: {
3877
3930
  // Menus open on single click, this parameter is picked up in Grid.tsx
3878
3931
  singleClickEdit: true
3879
3932
  } }), __assign({ editor: GridFormPopoverMenu }, custom));
@@ -4047,8 +4100,8 @@ var GridPopoverEditBearingCorrection = function (colDef, props) {
4047
4100
 
4048
4101
  var GridPopoverEditDropDown = function (colDef, props) {
4049
4102
  return GridCell(colDef, __assign(__assign({ editor: GridFormDropDown }, props), { editorParams: __assign({
4050
- // Defaults to medium size container
4051
- className: "GridPopoverEditDropDown-containerMedium" }, props.editorParams) }));
4103
+ // Defaults to large size container
4104
+ className: "GridPopoverEditDropDown-containerLarge" }, props.editorParams) }));
4052
4105
  };
4053
4106
 
4054
4107
  var GridFormMessage = function (props) {
@@ -24585,9 +24638,9 @@ exports.ComponentLoadingWrapper = ComponentLoadingWrapper;
24585
24638
  exports.ControlledMenu = ControlledMenu;
24586
24639
  exports.FocusableItem = FocusableItem;
24587
24640
  exports.GenericCellEditorComponentWrapper = GenericCellEditorComponentWrapper;
24588
- exports.GenericMultiEditCellClass = GenericMultiEditCellClass;
24589
24641
  exports.Grid = Grid;
24590
24642
  exports.GridCell = GridCell;
24643
+ exports.GridCellMultiSelectClassRules = GridCellMultiSelectClassRules;
24591
24644
  exports.GridCellRenderer = GridCellRenderer;
24592
24645
  exports.GridContext = GridContext;
24593
24646
  exports.GridContextProvider = GridContextProvider;