@linzjs/step-ag-grid 7.1.0 → 7.1.1

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.
@@ -7,7 +7,7 @@
7
7
  * "*L" => *L
8
8
  * "A B" => A* and B*
9
9
  * "A B, C" => (A* and B*) or C*
10
- *
11
- * Returns ture if there's a text match.
10
+ * "!A" => all values must not match A
11
+ * Returns true if there's a text match.
12
12
  */
13
13
  export declare const textMatch: (text: string | undefined | null, filter: string) => boolean;
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { useMemo, useLayoutEffect, useEffect, createContext, memo, forwardRef, useRef, useContext, useState, useCallback, useReducer, cloneElement, useImperativeHandle, Fragment } from 'react';
3
3
  import ReactDOM, { unstable_batchedUpdates, flushSync, createPortal } from 'react-dom';
4
- import { findIndex, debounce, negate, isEmpty, delay, sortBy, last, difference, castArray, remove, flatten, xorBy, pick, groupBy, toPairs, omit } from 'lodash-es';
4
+ import { findIndex, debounce, negate, isEmpty, delay, sortBy, last, difference, castArray, remove, flatten, xorBy, partition, pick, groupBy, fromPairs, toPairs, omit } from 'lodash-es';
5
5
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
6
6
  import { AgGridReact } from 'ag-grid-react';
7
7
  import { LuiMiniSpinner, LuiIcon, LuiCheckboxInput, LuiButton } from '@linzjs/lui';
@@ -3516,8 +3516,8 @@ function isMatch(inputs, patterns, options) {
3516
3516
  * "*L" => *L
3517
3517
  * "A B" => A* and B*
3518
3518
  * "A B, C" => (A* and B*) or C*
3519
- *
3520
- * Returns ture if there's a text match.
3519
+ * "!A" => all values must not match A
3520
+ * Returns true if there's a text match.
3521
3521
  */
3522
3522
  var textMatch = function (text, filter) {
3523
3523
  if (text == null)
@@ -3526,12 +3526,15 @@ var textMatch = function (text, filter) {
3526
3526
  .split(",")
3527
3527
  .map(function (sf) { return sf.trim(); })
3528
3528
  .filter(function (sf) { return sf; });
3529
+ var _a = partition(superFilters, function (superFilters) { return superFilters.startsWith("!"); }), negativeFilters = _a[0], positiveFilters = _a[1];
3529
3530
  var values = text.replaceAll(",", " ").trim().split(/\s+/);
3530
- return (isEmpty(superFilters) || // Not filtered
3531
- superFilters.some(function (superFilter) {
3531
+ return ((isEmpty(positiveFilters) || // Not filtered
3532
+ positiveFilters.some(function (superFilter) {
3532
3533
  var subFilters = superFilter.split(/\s+/).map(function (s) { return s.replaceAll(/([!?])/g, "\\$1"); });
3533
3534
  return subFilters.every(function (subFilter) { return values.some(function (value) { return isMatch(value, subFilter); }); });
3534
- }));
3535
+ })) &&
3536
+ (isEmpty(negativeFilters) ||
3537
+ negativeFilters.every(function (superFilter) { return values.every(function (value) { return isMatch(value, superFilter); }); })));
3535
3538
  };
3536
3539
 
3537
3540
  var GridFormMultiSelect = function (props) {
@@ -3593,8 +3596,32 @@ var GridFormMultiSelect = function (props) {
3593
3596
  * Groups options into their header groups
3594
3597
  */
3595
3598
  var headerGroups = useMemo(function () {
3596
- return options &&
3597
- groupBy(options.filter(function (o) { return textMatch(o.label, filter) && o.value; }), "filter");
3599
+ if (!options)
3600
+ return undefined;
3601
+ var result = groupBy(options.filter(function (o) { return textMatch(o.label, filter) && o.value; }), "filter");
3602
+ // remove leading/trailing/duplicate dividers
3603
+ return fromPairs(toPairs(result).map(function (_a) {
3604
+ var key = _a[0], arr = _a[1];
3605
+ var lastWasDivider = true;
3606
+ return [
3607
+ key,
3608
+ arr
3609
+ .map(function (row, index) {
3610
+ if (row.value === MenuSeparatorString) {
3611
+ if (lastWasDivider)
3612
+ return null;
3613
+ if (index === arr.length - 1)
3614
+ return null;
3615
+ lastWasDivider = true;
3616
+ }
3617
+ else {
3618
+ lastWasDivider = false;
3619
+ }
3620
+ return row;
3621
+ })
3622
+ .filter(function (r) { return r; }),
3623
+ ];
3624
+ }));
3598
3625
  }, [filter, options]);
3599
3626
  var headers = useMemo(function () { var _a; return (_a = props.headers) !== null && _a !== void 0 ? _a : [{ header: "" }]; }, [props.headers]);
3600
3627
  var _e = useGridPopoverHook({
@@ -3602,7 +3629,7 @@ var GridFormMultiSelect = function (props) {
3602
3629
  invalid: invalid,
3603
3630
  save: save
3604
3631
  }), popoverWrapper = _e.popoverWrapper, triggerSave = _e.triggerSave;
3605
- return popoverWrapper(jsx(ComponentLoadingWrapper, __assign({ loading: !options, className: "GridFormMultiSelect-container" }, { children: options && (jsxs(Fragment$1, { children: [props.filtered && (jsx(FilterInput, __assign({}, { headerGroups: headerGroups, options: options, setOptions: setOptions, filter: filter, setFilter: setFilter }, { filterHelpText: props.filterHelpText, onSelectFilter: props.onSelectFilter, filterPlaceholder: props.filterPlaceholder }))), headerGroups && (jsx("div", __assign({ className: "GridFormMultiSelect-options" }, { children: headers.map(function (header) {
3632
+ return popoverWrapper(jsx(ComponentLoadingWrapper, __assign({ loading: !options, className: "GridFormMultiSelect-container" }, { children: options && (jsxs(Fragment$1, { children: [props.filtered && (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 && (jsx("div", __assign({ className: "GridFormMultiSelect-options" }, { children: headers.map(function (header) {
3606
3633
  var subOptions = headerGroups["".concat(header.filter)];
3607
3634
  return (!isEmpty(subOptions) && (jsxs(Fragment$1, { children: [header.header && jsx(MenuHeader, { children: header.header }), subOptions.map(function (item, index) {
3608
3635
  return item.value === MenuSeparatorString ? (jsx(MenuDivider, {}, "div_".concat(index))) : (jsxs(Fragment, { children: [jsx(MenuRadioItem, { item: item, options: options, setOptions: setOptions }), item.checked && item.subComponent && (jsx(MenuSubComponent, __assign({}, { item: item, options: options, setOptions: setOptions, data: data, triggerSave: triggerSave }, { subComponentIsValid: subComponentIsValidRef.current })))] }, "val_".concat(item.value)));
@@ -3610,14 +3637,19 @@ var GridFormMultiSelect = function (props) {
3610
3637
  }) })))] })) })));
3611
3638
  };
3612
3639
  var FilterInput = function (props) {
3613
- 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;
3640
+ 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;
3641
+ var enterHasBeenPressed = useRef(false);
3642
+ var lastKeyWasEnter = useRef(false);
3614
3643
  var toggleSelectAllVisible = useCallback(function () {
3615
3644
  if (!options || !headerGroups)
3616
3645
  return;
3617
3646
  if (isEmpty(filter.trim())) {
3618
3647
  // Toggle off if any items are checked otherwise on
3619
3648
  var anyChecked_1 = options.some(function (o) { return o.checked; });
3620
- options.forEach(function (o) { return (o.checked = !anyChecked_1); });
3649
+ options.forEach(function (o) {
3650
+ if (o.label !== undefined)
3651
+ o.checked = !anyChecked_1;
3652
+ });
3621
3653
  }
3622
3654
  else {
3623
3655
  // Toggle on if any filtered items are checked otherwise off
@@ -3626,7 +3658,7 @@ var FilterInput = function (props) {
3626
3658
  });
3627
3659
  Object.values(headerGroups).forEach(function (headerOptions) {
3628
3660
  headerOptions.forEach(function (o) {
3629
- if (o.checked !== undefined)
3661
+ if (o.label !== undefined)
3630
3662
  o.checked = anyChecked_2;
3631
3663
  });
3632
3664
  });
@@ -3636,28 +3668,52 @@ var FilterInput = function (props) {
3636
3668
  var addCustomFilterValue = useCallback(function () {
3637
3669
  if (!options || !onSelectFilter)
3638
3670
  return;
3671
+ var filterTrimmed = filter.trim();
3672
+ if (isEmpty(filterTrimmed)) {
3673
+ triggerSave().then();
3674
+ return;
3675
+ }
3639
3676
  var preFilterOptions = JSON.stringify(options);
3640
- onSelectFilter(filter.trim(), options);
3677
+ onSelectFilter(filterTrimmed, options);
3641
3678
  // Detect if options list changed and update
3642
3679
  if (preFilterOptions === JSON.stringify(options))
3643
3680
  return;
3644
3681
  setOptions(__spreadArray([], options, true));
3645
3682
  setFilter("");
3646
- }, [filter, onSelectFilter, options, setFilter, setOptions]);
3683
+ }, [filter, onSelectFilter, options, setFilter, setOptions, triggerSave]);
3684
+ var handleKeyDown = useCallback(function (e) {
3685
+ if (e.key === "Enter") {
3686
+ enterHasBeenPressed.current = true;
3687
+ }
3688
+ }, []);
3647
3689
  var handleKeyUp = useCallback(function (e) {
3648
3690
  if (e.key === "Enter") {
3649
3691
  e.stopPropagation();
3650
3692
  e.preventDefault();
3651
3693
  if (e.ctrlKey)
3652
3694
  toggleSelectAllVisible();
3653
- else if (onSelectFilter)
3654
- addCustomFilterValue();
3695
+ else if (enterHasBeenPressed.current) {
3696
+ var filterTrimmed = filter.trim();
3697
+ if (isEmpty(filterTrimmed)) {
3698
+ triggerSave().then();
3699
+ return;
3700
+ }
3701
+ onSelectFilter && addCustomFilterValue();
3702
+ }
3703
+ lastKeyWasEnter.current = true;
3704
+ }
3705
+ else if (e.key === "Control") {
3706
+ lastKeyWasEnter.current && setFilter("");
3707
+ lastKeyWasEnter.current = false;
3708
+ }
3709
+ else {
3710
+ lastKeyWasEnter.current = false;
3655
3711
  }
3656
- }, [addCustomFilterValue, onSelectFilter, toggleSelectAllVisible]);
3657
- return (jsxs(Fragment$1, { children: [jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_) { return (jsxs("div", __assign({ style: { width: "100%" }, className: "GridFormMultiSelect-filter" }, { children: [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 && (jsx(FormError, { error: null, helpText: typeof filterHelpText === "function" ? filterHelpText(filter.trim(), options) : filterHelpText }))] }))); } }), "filter"), jsx(MenuDivider, {}, "$$divider_filter"), headerGroups && !toPairs(headerGroups).some(function (_a) {
3712
+ }, [addCustomFilterValue, filter, onSelectFilter, setFilter, toggleSelectAllVisible, triggerSave]);
3713
+ return (jsxs(Fragment$1, { children: [jsx(FocusableItem, __assign({ className: "filter-item" }, { children: function (_) { return (jsxs("div", __assign({ style: { width: "100%" }, className: "GridFormMultiSelect-filter" }, { children: [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 && (jsx(FormError, { error: null, helpText: typeof filterHelpText === "function" ? filterHelpText(filter.trim(), options) : filterHelpText }))] }))); } }), "filter"), jsx(MenuDivider, {}, "$$divider_filter"), headerGroups && !toPairs(headerGroups).some(function (_a) {
3658
3714
  _a[0]; var options = _a[1];
3659
3715
  return !isEmpty(options);
3660
- }) && (jsx("div", __assign({ className: "szh-menu__item" }, { children: "[No items match the filter]" })))] }));
3716
+ }) && (jsx("div", __assign({ className: "szh-menu__item GridPopoverEditDropDown-noOptions" }, { children: "No Options" })))] }));
3661
3717
  };
3662
3718
  var MenuRadioItem = function (props) {
3663
3719
  var _a, _b;
@@ -4026,8 +4082,8 @@ var GridPopoverEditBearingCorrection = function (colDef, props) {
4026
4082
 
4027
4083
  var GridPopoverEditDropDown = function (colDef, props) {
4028
4084
  return GridCell(colDef, __assign(__assign({ editor: GridFormDropDown }, props), { editorParams: __assign({
4029
- // Defaults to medium size container
4030
- className: "GridPopoverEditDropDown-containerMedium" }, props.editorParams) }));
4085
+ // Defaults to large size container
4086
+ className: "GridPopoverEditDropDown-containerLarge" }, props.editorParams) }));
4031
4087
  };
4032
4088
 
4033
4089
  var GridFormMessage = function (props) {