@linzjs/step-ag-grid 11.0.0 → 12.0.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.css CHANGED
@@ -324,6 +324,12 @@
324
324
  flex-direction: column;
325
325
  }
326
326
 
327
+ .Grid-wrapper {
328
+ display: flex;
329
+ flex-direction: column;
330
+ flex: 1;
331
+ }
332
+
327
333
  .Grid-sortIsStale span.ag-icon.ag-icon-desc::after {
328
334
  content: "*";
329
335
  }
@@ -331,10 +337,13 @@
331
337
  content: "*";
332
338
  }
333
339
 
334
- .Grid-quickFilter {
340
+ .Grid-container-filters {
335
341
  width: 100%;
336
342
  margin-bottom: 16px;
337
343
  flex: 0;
344
+ display: flex;
345
+ flex-direction: row;
346
+ grid-column-gap: 1em;
338
347
  }
339
348
 
340
349
  .Grid-quickFilterBox {
@@ -8,16 +8,12 @@ export interface GridProps {
8
8
  readOnly?: boolean;
9
9
  selectable?: boolean;
10
10
  ["data-testid"]?: string;
11
- quickFilter?: boolean;
12
- quickFilterPlaceholder?: string;
13
- quickFilterValue?: string;
14
11
  domLayout?: GridOptions["domLayout"];
15
12
  externalSelectedItems?: any[];
16
13
  setExternalSelectedItems?: (items: any[]) => void;
17
14
  defaultColDef?: GridOptions["defaultColDef"];
18
15
  columnDefs: ColDef[];
19
16
  rowData: GridOptions["rowData"];
20
- noRowsOverlayText?: string;
21
17
  postSortRows?: GridOptions["postSortRows"];
22
18
  animateRows?: boolean;
23
19
  rowClassRules?: GridOptions["rowClassRules"];
@@ -0,0 +1,2 @@
1
+ import { GridFilterExternal } from "../contexts/GridContext";
2
+ export declare const useGridFilter: (filter: GridFilterExternal) => void;
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from "react";
2
+ export interface GridWrapperProps {
3
+ children: ReactNode;
4
+ maxHeight?: number | string;
5
+ }
6
+ export declare const GridWrapper: ({ children, maxHeight }: GridWrapperProps) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ export interface GridFilterQuickProps {
2
+ quickFilterPlaceholder?: string;
3
+ defaultValue?: string;
4
+ }
5
+ export declare const GridFilterQuick: ({ quickFilterPlaceholder, defaultValue }: GridFilterQuickProps) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from "react";
2
+ export interface GridFiltersProps {
3
+ children: ReactNode;
4
+ }
5
+ export declare const GridFilters: ({ children }: GridFiltersProps) => JSX.Element;
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { GridApi, RowNode } from "ag-grid-community";
3
3
  import { GridBaseRow } from "../components/Grid";
4
+ export type GridFilterExternal = (data: any, rowNode: RowNode) => boolean;
4
5
  export interface GridContextType {
5
6
  gridReady: boolean;
6
7
  setGridApi: (gridApi: GridApi | undefined) => void;
@@ -28,5 +29,9 @@ export interface GridContextType {
28
29
  externallySelectedItemsAreInSync: boolean;
29
30
  setExternallySelectedItemsAreInSync: (inSync: boolean) => void;
30
31
  waitForExternallySelectedItemsToBeInSync: () => Promise<void>;
32
+ addExternalFilter: (filter: GridFilterExternal) => void;
33
+ removeExternalFilter: (filter: GridFilterExternal) => void;
34
+ isExternalFilterPresent: () => boolean;
35
+ doesExternalFilterPass: (node: RowNode) => boolean;
31
36
  }
32
37
  export declare const GridContext: import("react").Context<GridContextType>;
@@ -1,7 +1,7 @@
1
1
  import * as require$$0$1 from 'react';
2
2
  import require$$0__default, { 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, difference, delay, sortBy, defer as defer$1, last, castArray, remove, flatten, xorBy, partition, pick, groupBy, fromPairs, toPairs, omit, isEqual } from 'lodash-es';
4
+ import { findIndex, debounce, negate, isEmpty, difference, delay, sortBy, defer as defer$1, last, remove, castArray, flatten, xorBy, partition, pick, groupBy, fromPairs, toPairs, omit, isEqual } from 'lodash-es';
5
5
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
6
6
  import require$$4 from 'react-dom/server';
7
7
  import { LuiMiniSpinner, LuiIcon, LuiCheckboxInput, LuiButton } from '@linzjs/lui';
@@ -2061,7 +2061,21 @@ var GridContext = createContext({
2061
2061
  console.error("no context provider for waitForExternallySelectedItemsToBeInSync");
2062
2062
  return [2 /*return*/];
2063
2063
  });
2064
- }); }
2064
+ }); },
2065
+ addExternalFilter: function () {
2066
+ console.error("no context provider for addExternalFilter");
2067
+ },
2068
+ removeExternalFilter: function () {
2069
+ console.error("no context provider for removeExternalFilter");
2070
+ },
2071
+ isExternalFilterPresent: function () {
2072
+ console.error("no context provider for isExternalFilterPresent");
2073
+ return false;
2074
+ },
2075
+ doesExternalFilterPass: function () {
2076
+ console.error("no context provider for doesExternalFilterPass");
2077
+ return true;
2078
+ }
2065
2079
  });
2066
2080
 
2067
2081
  var GridUpdatingContext = createContext({
@@ -2087,13 +2101,25 @@ var GridContextProvider = function (props) {
2087
2101
  var modifyUpdating = useContext(GridUpdatingContext).modifyUpdating;
2088
2102
  var _a = useState(), gridApi = _a[0], _setGridApi = _a[1];
2089
2103
  var _b = useState(false), gridReady = _b[0], setGridReady = _b[1];
2104
+ var _c = useState(""), quickFilter = _c[0], setQuickFilter = _c[1];
2090
2105
  var idsBeforeUpdate = useRef([]);
2091
2106
  var prePopupFocusedCell = useRef();
2092
- var _c = useState(false), externallySelectedItemsAreInSync = _c[0], setExternallySelectedItemsAreInSync = _c[1];
2107
+ var _d = useState(false), externallySelectedItemsAreInSync = _d[0], setExternallySelectedItemsAreInSync = _d[1];
2108
+ var externalFilters = useRef([]);
2109
+ /**
2110
+ * Set quick filter directly on grid, based on previously save quickFilter state.
2111
+ */
2112
+ useEffect(function () {
2113
+ gridApi === null || gridApi === void 0 ? void 0 : gridApi.setQuickFilter(quickFilter);
2114
+ }, [gridApi, quickFilter]);
2115
+ /**
2116
+ * Set the grid api when the grid is ready.
2117
+ */
2093
2118
  var setGridApi = useCallback(function (gridApi) {
2094
2119
  _setGridApi(gridApi);
2120
+ gridApi === null || gridApi === void 0 ? void 0 : gridApi.setQuickFilter(quickFilter);
2095
2121
  setGridReady(!!gridApi);
2096
- }, []);
2122
+ }, [quickFilter]);
2097
2123
  /**
2098
2124
  * Wraps things that require gridApi in common handling, for when gridApi not present.
2099
2125
  *
@@ -2113,12 +2139,6 @@ var GridContextProvider = function (props) {
2113
2139
  var _a;
2114
2140
  prePopupFocusedCell.current = (_a = gridApi === null || gridApi === void 0 ? void 0 : gridApi.getFocusedCell()) !== null && _a !== void 0 ? _a : undefined;
2115
2141
  }, [gridApi]);
2116
- /**
2117
- * Set the quick filter value to grid.
2118
- */
2119
- var setQuickFilter = useCallback(function (quickFilter) {
2120
- gridApiOp(function (gridApi) { return gridApi.setQuickFilter(quickFilter); });
2121
- }, [gridApiOp]);
2122
2142
  /**
2123
2143
  * Get all row id's in grid.
2124
2144
  */
@@ -2399,6 +2419,23 @@ var GridContextProvider = function (props) {
2399
2419
  }
2400
2420
  });
2401
2421
  }); }, [externallySelectedItemsAreInSync]);
2422
+ var onFilterChanged = useMemo(function () {
2423
+ return debounce(function () {
2424
+ gridApi && gridApi.onFilterChanged();
2425
+ }, 200);
2426
+ }, [gridApi]);
2427
+ var addExternalFilter = function (filter) {
2428
+ externalFilters.current.push(filter);
2429
+ onFilterChanged();
2430
+ };
2431
+ var removeExternalFilter = function (filter) {
2432
+ remove(externalFilters.current, function (v) { return v === filter; });
2433
+ onFilterChanged();
2434
+ };
2435
+ var isExternalFilterPresent = function () { return externalFilters.current.length > 0; };
2436
+ var doesExternalFilterPass = function (node) {
2437
+ return externalFilters.current.every(function (filter) { return filter(node.data, node); });
2438
+ };
2402
2439
  return (jsx(GridContext.Provider, __assign$9({ value: {
2403
2440
  gridReady: gridReady,
2404
2441
  prePopupOps: prePopupOps,
@@ -2422,7 +2459,11 @@ var GridContextProvider = function (props) {
2422
2459
  redrawRows: redrawRows,
2423
2460
  externallySelectedItemsAreInSync: externallySelectedItemsAreInSync,
2424
2461
  setExternallySelectedItemsAreInSync: setExternallySelectedItemsAreInSync,
2425
- waitForExternallySelectedItemsToBeInSync: waitForExternallySelectedItemsToBeInSync
2462
+ waitForExternallySelectedItemsToBeInSync: waitForExternallySelectedItemsToBeInSync,
2463
+ addExternalFilter: addExternalFilter,
2464
+ removeExternalFilter: removeExternalFilter,
2465
+ isExternalFilterPresent: isExternalFilterPresent,
2466
+ doesExternalFilterPass: doesExternalFilterPass
2426
2467
  } }, { children: props.children })));
2427
2468
  };
2428
2469
 
@@ -58641,10 +58682,9 @@ var GridHeaderSelect = function (_a) {
58641
58682
  * Wrapper for AgGrid to add commonly used functionality.
58642
58683
  */
58643
58684
  var Grid = function (params) {
58644
- var _a, _b, _c;
58645
- var _d = useContext(GridContext), gridReady = _d.gridReady, setGridApi = _d.setGridApi, prePopupOps = _d.prePopupOps, setQuickFilter = _d.setQuickFilter, ensureRowVisible = _d.ensureRowVisible, selectRowsById = _d.selectRowsById, focusByRowById = _d.focusByRowById, ensureSelectedRowIsVisible = _d.ensureSelectedRowIsVisible, sizeColumnsToFit = _d.sizeColumnsToFit, externallySelectedItemsAreInSync = _d.externallySelectedItemsAreInSync, setExternallySelectedItemsAreInSync = _d.setExternallySelectedItemsAreInSync;
58685
+ var _a, _b, _c, _d;
58686
+ var _e = useContext(GridContext), gridReady = _e.gridReady, setGridApi = _e.setGridApi, prePopupOps = _e.prePopupOps, ensureRowVisible = _e.ensureRowVisible, selectRowsById = _e.selectRowsById, focusByRowById = _e.focusByRowById, ensureSelectedRowIsVisible = _e.ensureSelectedRowIsVisible, sizeColumnsToFit = _e.sizeColumnsToFit, externallySelectedItemsAreInSync = _e.externallySelectedItemsAreInSync, setExternallySelectedItemsAreInSync = _e.setExternallySelectedItemsAreInSync, isExternalFilterPresent = _e.isExternalFilterPresent, doesExternalFilterPass = _e.doesExternalFilterPass;
58646
58687
  var checkUpdating = useContext(GridUpdatingContext).checkUpdating;
58647
- var _e = useState(""), internalQuickFilter = _e[0], setInternalQuickFilter = _e[1];
58648
58688
  var lastSelectedIds = useRef([]);
58649
58689
  var _f = useState(false), staleGrid = _f[0], setStaleGrid = _f[1];
58650
58690
  var postSortRows = usePostSortRowsHook({ setStaleGrid: setStaleGrid });
@@ -58724,26 +58764,6 @@ var Grid = function (params) {
58724
58764
  selectRowsById(selectedIds);
58725
58765
  setExternallySelectedItemsAreInSync(true);
58726
58766
  }, [gridReady, params.externalSelectedItems, ensureRowVisible, selectRowsById, setExternallySelectedItemsAreInSync]);
58727
- /**
58728
- * Synchronise quick filter to grid
58729
- */
58730
- var updateQuickFilter = useCallback(function () {
58731
- if (!gridReady)
58732
- return;
58733
- if (params.quickFilter) {
58734
- setQuickFilter(internalQuickFilter);
58735
- return;
58736
- }
58737
- if (params.quickFilterValue == null)
58738
- return;
58739
- setQuickFilter(params.quickFilterValue);
58740
- }, [gridReady, internalQuickFilter, params.quickFilter, params.quickFilterValue, setQuickFilter]);
58741
- /**
58742
- * Synchronise quick filter to grid
58743
- */
58744
- useEffect(function () {
58745
- updateQuickFilter();
58746
- }, [updateQuickFilter]);
58747
58767
  var combineEditables = function () {
58748
58768
  var editables = [];
58749
58769
  for (var _i = 0; _i < arguments.length; _i++) {
@@ -58780,7 +58800,7 @@ var Grid = function (params) {
58780
58800
  maxWidth: 42,
58781
58801
  suppressSizeToFit: true,
58782
58802
  checkboxSelection: true,
58783
- headerComponent: GridHeaderSelect,
58803
+ headerComponent: params.rowSelection === "multiple" ? GridHeaderSelect : null,
58784
58804
  suppressHeaderKeyboardEvent: function (e) {
58785
58805
  if ((e.event.key === "Enter" || e.event.key === " ") && !e.event.repeat) {
58786
58806
  var selectedNodeCount = e.api.getSelectedRows().length;
@@ -58798,18 +58818,26 @@ var Grid = function (params) {
58798
58818
  }
58799
58819
  ], adjustColDefs, true) : adjustColDefs;
58800
58820
  }, [
58801
- clickSelectorCheckboxWhenContainingCellClicked,
58802
58821
  params.columnDefs,
58803
58822
  params.selectable,
58823
+ params.rowSelection,
58804
58824
  params.readOnly,
58805
- params.defaultColDef,
58825
+ (_a = params.defaultColDef) === null || _a === void 0 ? void 0 : _a.editable,
58826
+ clickSelectorCheckboxWhenContainingCellClicked,
58806
58827
  ]);
58807
58828
  var onGridReady = useCallback(function (event) {
58808
58829
  setGridApi(event.api);
58809
58830
  synchroniseExternallySelectedItemsToGrid();
58810
- updateQuickFilter();
58811
- }, [setGridApi, synchroniseExternallySelectedItemsToGrid, updateQuickFilter]);
58812
- var noRowsOverlayComponent = useCallback(function () { var _a; return jsx("span", { children: (_a = params.noRowsOverlayText) !== null && _a !== void 0 ? _a : "There are currently no rows" }); }, [params.noRowsOverlayText]);
58831
+ }, [setGridApi, synchroniseExternallySelectedItemsToGrid]);
58832
+ var noRowsOverlayComponent = useCallback(function (event) {
58833
+ var _a, _b;
58834
+ var hasData = ((_b = (_a = params.rowData) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 0;
58835
+ var hasFilteredData = event.api.getDisplayedRowCount() > 0;
58836
+ return (jsx("span", { children: !hasData ? "There are currently no rows" : !hasFilteredData ? "All rows have been filtered" : "" }));
58837
+ }, [(_b = params.rowData) === null || _b === void 0 ? void 0 : _b.length]);
58838
+ var onModelUpdated = useCallback(function (event) {
58839
+ event.api.getDisplayedRowCount() === 0 ? event.api.showNoRowsOverlay() : event.api.hideOverlay();
58840
+ }, []);
58813
58841
  var refreshSelectedRows = useCallback(function (event) {
58814
58842
  // Force-refresh all selected rows to re-run class function, to update selection highlighting
58815
58843
  event.api.refreshCells({
@@ -58870,9 +58898,7 @@ var Grid = function (params) {
58870
58898
  sizeColumnsToFit();
58871
58899
  }
58872
58900
  }, [columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.length, sizeColumnsToFit]);
58873
- return (jsxs("div", __assign$9({ "data-testid": params["data-testid"], className: clsx("Grid-container", "ag-theme-alpine", staleGrid && "Grid-sortIsStale", gridReady && params.rowData && "Grid-ready") }, { children: [params.quickFilter && (jsx("div", __assign$9({ 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) {
58874
- setInternalQuickFilter(event.target.value);
58875
- } }) }))), jsx("div", __assign$9({ style: { flex: 1 } }, { children: jsx(AgGridReact, { animateRows: params.animateRows, rowClassRules: params.rowClassRules, getRowId: function (params) { return "".concat(params.data.id); }, suppressRowClickSelection: true, rowSelection: (_b = params.rowSelection) !== null && _b !== void 0 ? _b : "multiple", suppressBrowserResizeObserver: true, colResizeDefault: "shift", onFirstDataRendered: sizeColumnsToFit, onGridSizeChanged: sizeColumnsToFit, suppressClickEdit: true, onCellKeyPress: onCellKeyPress, onCellClicked: onCellClicked, onCellDoubleClicked: onCellDoubleClick, onCellEditingStarted: refreshSelectedRows, domLayout: params.domLayout, columnDefs: columnDefs, rowData: params.rowData, noRowsOverlayComponent: noRowsOverlayComponent, onGridReady: onGridReady, onSortChanged: ensureSelectedRowIsVisible, postSortRows: (_c = params.postSortRows) !== null && _c !== void 0 ? _c : postSortRows, onSelectionChanged: synchroniseExternalStateToGridSelection, onColumnMoved: params.onColumnMoved, alwaysShowVerticalScroll: params.alwaysShowVerticalScroll }) }))] })));
58901
+ return (jsx("div", __assign$9({ "data-testid": params["data-testid"], className: clsx("Grid-container", "ag-theme-alpine", staleGrid && "Grid-sortIsStale", gridReady && params.rowData && "Grid-ready") }, { children: jsx("div", __assign$9({ style: { flex: 1 } }, { children: jsx(AgGridReact, { animateRows: params.animateRows, rowClassRules: params.rowClassRules, getRowId: function (params) { return "".concat(params.data.id); }, suppressRowClickSelection: true, rowSelection: (_c = params.rowSelection) !== null && _c !== void 0 ? _c : "multiple", suppressBrowserResizeObserver: true, colResizeDefault: "shift", onFirstDataRendered: sizeColumnsToFit, onGridSizeChanged: sizeColumnsToFit, suppressClickEdit: true, onCellKeyPress: onCellKeyPress, onCellClicked: onCellClicked, onCellDoubleClicked: onCellDoubleClick, onCellEditingStarted: refreshSelectedRows, domLayout: params.domLayout, columnDefs: columnDefs, rowData: params.rowData, noRowsOverlayComponent: noRowsOverlayComponent, onModelUpdated: onModelUpdated, onGridReady: onGridReady, onSortChanged: ensureSelectedRowIsVisible, postSortRows: (_d = params.postSortRows) !== null && _d !== void 0 ? _d : postSortRows, onSelectionChanged: synchroniseExternalStateToGridSelection, onColumnMoved: params.onColumnMoved, alwaysShowVerticalScroll: params.alwaysShowVerticalScroll, isExternalFilterPresent: isExternalFilterPresent, doesExternalFilterPass: doesExternalFilterPass }) })) })));
58876
58902
  };
58877
58903
 
58878
58904
  var GridCellMultiSelectClassRules = {