@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.
- package/dist/index.js +76 -20
- package/dist/index.js.map +1 -1
- package/dist/src/utils/textMatcher.d.ts +2 -2
- package/dist/step-ag-grid.esm.js +77 -21
- package/dist/step-ag-grid.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/components/gridForm/GridFormMultiSelect.tsx +83 -21
- package/src/components/gridPopoverEdit/GridPopoverEditDropDown.ts +2 -2
- package/src/stories/grid/GridPopoutEditMultiSelect.stories.tsx +2 -2
- package/src/utils/textMatcher.ts +11 -8
|
@@ -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
|
|
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;
|
package/dist/step-ag-grid.esm.js
CHANGED
|
@@ -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
|
|
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(
|
|
3531
|
-
|
|
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
|
-
|
|
3597
|
-
|
|
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) {
|
|
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.
|
|
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(
|
|
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 (
|
|
3654
|
-
|
|
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: "
|
|
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
|
|
4030
|
-
className: "GridPopoverEditDropDown-
|
|
4085
|
+
// Defaults to large size container
|
|
4086
|
+
className: "GridPopoverEditDropDown-containerLarge" }, props.editorParams) }));
|
|
4031
4087
|
};
|
|
4032
4088
|
|
|
4033
4089
|
var GridFormMessage = function (props) {
|