@openedx/paragon 22.16.0 → 22.16.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.
@@ -1,6 +1,7 @@
1
- import { useContext } from 'react';
1
+ import { useContext, useEffect } from 'react';
2
2
  import DataTableContext from './DataTableContext';
3
- import { clearSelectionAction } from './selection/data/actions';
3
+ import { clearSelectionAction, setSelectedRowsAction, toggleIsEntireTableSelected } from './selection/data/actions';
4
+ import { getRowIds, getUnselectedPageRows } from './selection/data/helpers';
4
5
  export const useRows = () => {
5
6
  const {
6
7
  getTableProps,
@@ -46,4 +47,49 @@ export const useSelectionActions = (_ref, controlledTableSelections) => {
46
47
  clearSelection
47
48
  };
48
49
  };
50
+
51
+ /**
52
+ * Provides business logic around managing selection state, notably for controlled
53
+ * selections with API-driven data.
54
+ *
55
+ */
56
+ export const useDataTableSelections = _ref2 => {
57
+ let {
58
+ selections,
59
+ selectionsDispatch,
60
+ itemCount,
61
+ selectedRows,
62
+ page,
63
+ isAllPageRowsSelected
64
+ } = _ref2;
65
+ // If "Select all" is explicitly opted in by the user, ensure that all unselected rows are selected
66
+ // when the user navigates to a new page.
67
+ useEffect(() => {
68
+ if (selections.isSelectAllEnabled && (itemCount > selectedRows.length || !isAllPageRowsSelected)) {
69
+ const selectedRowIds = getRowIds(selectedRows);
70
+ const unselectedPageRows = getUnselectedPageRows(selectedRowIds, page);
71
+ if (unselectedPageRows.length) {
72
+ selectionsDispatch(setSelectedRowsAction(unselectedPageRows, itemCount));
73
+ }
74
+ }
75
+ }, [selectedRows, itemCount, page, selectionsDispatch, selections.isSelectAllEnabled, isAllPageRowsSelected]);
76
+
77
+ // When `selections.isSelectAllEnabled` is true, ensure `selections.isEntireTableSelected` is true.
78
+ useEffect(() => {
79
+ if (selections.isSelectAllEnabled && !selections.isEntireTableSelected) {
80
+ selectionsDispatch(toggleIsEntireTableSelected());
81
+ }
82
+ }, [selectionsDispatch, selections.isEntireTableSelected, selections.isSelectAllEnabled]);
83
+
84
+ // When `selections.isSelectAllEnabled` differs from `selections.isEntireTableSelected` and
85
+ // `isAllPageRowsSelected` matches `selections.isSelectAllEnabled`, toggle `selections.isEntireTableSelected`.
86
+ useEffect(() => {
87
+ if (!selections.isSelectAllEnabled && selections.isEntireTableSelected && !isAllPageRowsSelected) {
88
+ selectionsDispatch(toggleIsEntireTableSelected());
89
+ }
90
+ if (selections.isSelectAllEnabled && !selections.isEntireTableSelected && isAllPageRowsSelected) {
91
+ selectionsDispatch(toggleIsEntireTableSelected());
92
+ }
93
+ }, [selectionsDispatch, isAllPageRowsSelected, selections.isEntireTableSelected, selections.isSelectAllEnabled]);
94
+ };
49
95
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","names":["useContext","DataTableContext","clearSelectionAction","useRows","getTableProps","prepareRow","page","rows","headerGroups","getTableBodyProps","displayRows","useSelectionActions","_ref","controlledTableSelections","toggleAllRowsSelected","selectedRows","isEntireTableSelected","dispatch","clearSelection","length"],"sources":["../../src/DataTable/hooks.jsx"],"sourcesContent":["import { useContext } from 'react';\nimport DataTableContext from './DataTableContext';\nimport { clearSelectionAction } from './selection/data/actions';\n\nexport const useRows = () => {\n const {\n getTableProps, prepareRow, page, rows, headerGroups, getTableBodyProps,\n } = useContext(DataTableContext);\n\n const displayRows = page || rows;\n\n return {\n getTableProps, prepareRow, displayRows, headerGroups, getTableBodyProps,\n };\n};\n\n/**\n * Hook that provides selection state functionality\n * @param {Object} param0 Table instance\n * @param {Array} controlledTableSelections Selection Object and dispatch function\n * @returns\n */\nexport const useSelectionActions = (\n { toggleAllRowsSelected },\n controlledTableSelections,\n) => {\n const [{ selectedRows, isEntireTableSelected }, dispatch] = controlledTableSelections;\n\n const clearSelection = () => {\n // if using controlled selection component DataTable.ControlledSelectionStatus\n if (selectedRows.length > 0 || isEntireTableSelected) {\n dispatch(clearSelectionAction());\n } else {\n toggleAllRowsSelected(false);\n }\n };\n\n return {\n clearSelection,\n };\n};\n"],"mappings":"AAAA,SAASA,UAAU,QAAQ,OAAO;AAClC,OAAOC,gBAAgB,MAAM,oBAAoB;AACjD,SAASC,oBAAoB,QAAQ,0BAA0B;AAE/D,OAAO,MAAMC,OAAO,GAAGA,CAAA,KAAM;EAC3B,MAAM;IACJC,aAAa;IAAEC,UAAU;IAAEC,IAAI;IAAEC,IAAI;IAAEC,YAAY;IAAEC;EACvD,CAAC,GAAGT,UAAU,CAACC,gBAAgB,CAAC;EAEhC,MAAMS,WAAW,GAAGJ,IAAI,IAAIC,IAAI;EAEhC,OAAO;IACLH,aAAa;IAAEC,UAAU;IAAEK,WAAW;IAAEF,YAAY;IAAEC;EACxD,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,mBAAmB,GAAGA,CAAAC,IAAA,EAEjCC,yBAAyB,KACtB;EAAA,IAFH;IAAEC;EAAsB,CAAC,GAAAF,IAAA;EAGzB,MAAM,CAAC;IAAEG,YAAY;IAAEC;EAAsB,CAAC,EAAEC,QAAQ,CAAC,GAAGJ,yBAAyB;EAErF,MAAMK,cAAc,GAAGA,CAAA,KAAM;IAC3B;IACA,IAAIH,YAAY,CAACI,MAAM,GAAG,CAAC,IAAIH,qBAAqB,EAAE;MACpDC,QAAQ,CAACf,oBAAoB,CAAC,CAAC,CAAC;IAClC,CAAC,MAAM;MACLY,qBAAqB,CAAC,KAAK,CAAC;IAC9B;EACF,CAAC;EAED,OAAO;IACLI;EACF,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"hooks.js","names":["useContext","useEffect","DataTableContext","clearSelectionAction","setSelectedRowsAction","toggleIsEntireTableSelected","getRowIds","getUnselectedPageRows","useRows","getTableProps","prepareRow","page","rows","headerGroups","getTableBodyProps","displayRows","useSelectionActions","_ref","controlledTableSelections","toggleAllRowsSelected","selectedRows","isEntireTableSelected","dispatch","clearSelection","length","useDataTableSelections","_ref2","selections","selectionsDispatch","itemCount","isAllPageRowsSelected","isSelectAllEnabled","selectedRowIds","unselectedPageRows"],"sources":["../../src/DataTable/hooks.jsx"],"sourcesContent":["import { useContext, useEffect } from 'react';\nimport DataTableContext from './DataTableContext';\nimport { clearSelectionAction, setSelectedRowsAction, toggleIsEntireTableSelected } from './selection/data/actions';\nimport { getRowIds, getUnselectedPageRows } from './selection/data/helpers';\n\nexport const useRows = () => {\n const {\n getTableProps, prepareRow, page, rows, headerGroups, getTableBodyProps,\n } = useContext(DataTableContext);\n\n const displayRows = page || rows;\n\n return {\n getTableProps, prepareRow, displayRows, headerGroups, getTableBodyProps,\n };\n};\n\n/**\n * Hook that provides selection state functionality\n * @param {Object} param0 Table instance\n * @param {Array} controlledTableSelections Selection Object and dispatch function\n * @returns\n */\nexport const useSelectionActions = (\n { toggleAllRowsSelected },\n controlledTableSelections,\n) => {\n const [{ selectedRows, isEntireTableSelected }, dispatch] = controlledTableSelections;\n\n const clearSelection = () => {\n // if using controlled selection component DataTable.ControlledSelectionStatus\n if (selectedRows.length > 0 || isEntireTableSelected) {\n dispatch(clearSelectionAction());\n } else {\n toggleAllRowsSelected(false);\n }\n };\n\n return {\n clearSelection,\n };\n};\n\n/**\n * Provides business logic around managing selection state, notably for controlled\n * selections with API-driven data.\n *\n */\nexport const useDataTableSelections = ({\n selections,\n selectionsDispatch,\n itemCount,\n selectedRows,\n page,\n isAllPageRowsSelected,\n}) => {\n // If \"Select all\" is explicitly opted in by the user, ensure that all unselected rows are selected\n // when the user navigates to a new page.\n useEffect(\n () => {\n if (selections.isSelectAllEnabled && (itemCount > selectedRows.length || !isAllPageRowsSelected)) {\n const selectedRowIds = getRowIds(selectedRows);\n const unselectedPageRows = getUnselectedPageRows(selectedRowIds, page);\n if (unselectedPageRows.length) {\n selectionsDispatch(setSelectedRowsAction(unselectedPageRows, itemCount));\n }\n }\n },\n [selectedRows, itemCount, page, selectionsDispatch, selections.isSelectAllEnabled, isAllPageRowsSelected],\n );\n\n // When `selections.isSelectAllEnabled` is true, ensure `selections.isEntireTableSelected` is true.\n useEffect(() => {\n if (selections.isSelectAllEnabled && !selections.isEntireTableSelected) {\n selectionsDispatch(toggleIsEntireTableSelected());\n }\n }, [selectionsDispatch, selections.isEntireTableSelected, selections.isSelectAllEnabled]);\n\n // When `selections.isSelectAllEnabled` differs from `selections.isEntireTableSelected` and\n // `isAllPageRowsSelected` matches `selections.isSelectAllEnabled`, toggle `selections.isEntireTableSelected`.\n useEffect(() => {\n if (!selections.isSelectAllEnabled && selections.isEntireTableSelected && !isAllPageRowsSelected) {\n selectionsDispatch(toggleIsEntireTableSelected());\n }\n if (selections.isSelectAllEnabled && !selections.isEntireTableSelected && isAllPageRowsSelected) {\n selectionsDispatch(toggleIsEntireTableSelected());\n }\n }, [\n selectionsDispatch,\n isAllPageRowsSelected,\n selections.isEntireTableSelected,\n selections.isSelectAllEnabled,\n ]);\n};\n"],"mappings":"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","ignoreList":[]}
@@ -29,7 +29,7 @@ import ControlledSelectHeader from './selection/ControlledSelectHeader';
29
29
  import DataTableLayout from './DataTableLayout';
30
30
  import ExpandAll from './ExpandAll';
31
31
  import ExpandRow from './ExpandRow';
32
- import { useSelectionActions } from './hooks';
32
+ import { useDataTableSelections, useSelectionActions } from './hooks';
33
33
  import selectionsReducer, { initialState as initialSelectionsState } from './selection/data/reducer';
34
34
  function DataTable(_ref) {
35
35
  let {
@@ -87,12 +87,13 @@ function DataTable(_ref) {
87
87
  selectedRowIds: {}
88
88
  };
89
89
  }
90
- /* Note: We override the `toggleRowSelected` action from react-table
91
- because we need to preserve the order of the selected rows.
92
- While `selectedRowIds` is an object that contains the selected rows as key-value pairs,
93
- it does not maintain the order of selection. Therefore, we have added the `selectedRowsOrdered` property
94
- to keep track of the order in which the rows were selected.
95
- */
90
+ /**
91
+ * Note: We override the `toggleRowSelected` action from react-table
92
+ * because we need to preserve the order of the selected rows.
93
+ * while `selectedRowIds` is an object that contains the selected rows as key-value pairs,
94
+ * it does not maintain the order of selection. Therefore, we have added the `selectedRowsOrdered` property
95
+ * to keep track of the order in which the rows were selected.
96
+ */
96
97
  case 'toggleRowSelected':
97
98
  {
98
99
  const rowIndex = parseInt(action.id, 10);
@@ -193,6 +194,14 @@ function DataTable(_ref) {
193
194
  }
194
195
  }, [tableStateSelectedRowIds, onSelectedRowsChanged]);
195
196
  const selectionActions = useSelectionActions(instance, controlledTableSelections);
197
+ useDataTableSelections({
198
+ selections,
199
+ selectionsDispatch,
200
+ itemCount,
201
+ selectedRows,
202
+ page: instance.page,
203
+ isAllPageRowsSelected: instance.isAllPageRowsSelected
204
+ });
196
205
  const enhancedInstance = {
197
206
  ...instance,
198
207
  manualFilters,
@@ -322,7 +331,7 @@ DataTable.propTypes = {
322
331
  Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node])
323
332
  })),
324
333
  /** Function that will fetch table data. Called when page size, page index or filters change.
325
- * Meant to be used with manual filters and pagination */
334
+ * Meant to be used with manual filters and pagination */
326
335
  fetchData: PropTypes.func,
327
336
  /** Initial state passed to react-table's documentation https://github.com/TanStack/table/blob/v7/docs/src/pages/docs/api/useTable.md */
328
337
  initialState: PropTypes.shape({
@@ -334,7 +343,7 @@ DataTable.propTypes = {
334
343
  selectedRowsOrdered: PropTypes.arrayOf(PropTypes.number)
335
344
  }),
336
345
  /** Table options passed to react-table's useTable hook. Will override some options passed in to DataTable, such
337
- as: data, columns, defaultColumn, manualFilters, manualPagination, manualSortBy, and initialState */
346
+ as: data, columns, defaultColumn, manualFilters, manualPagination, manualSortBy, and initialState */
338
347
  initialTableOptions: PropTypes.shape({}),
339
348
  /** Actions to be performed on the table. Called with the table instance. Not displayed if rows are selected. */
340
349
  itemCount: PropTypes.number.isRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["React","useEffect","useMemo","useReducer","PropTypes","useTable","useMountedLayoutEffect","classNames","Table","getVisibleColumns","requiredWhen","requiredWhenNot","getTableArgs","TableControlBar","EmptyTableContent","TableFooter","BulkActions","DropdownFilters","FilterStatus","RowStatus","SelectionStatus","ControlledSelectionStatus","SmartStatus","TableFilters","TableHeaderCell","TableCell","TableHeaderRow","TablePagination","TablePaginationMinimal","DataTableContext","TableActions","ControlledSelect","ControlledSelectHeader","DataTableLayout","ExpandAll","ExpandRow","useSelectionActions","selectionsReducer","initialState","initialSelectionsState","DataTable","_ref","columns","data","defaultColumnValues","additionalColumns","isSelectable","isPaginated","manualPagination","pageCount","itemCount","isFilterable","manualFilters","fetchData","isSortable","manualSortBy","isExpandable","renderRowSubComponent","bulkActions","tableActions","numBreakoutFilters","initialTableOptions","EmptyTableComponent","manualSelectColumn","showFiltersInSidebar","dataViewToggleOptions","disableElevation","isLoading","children","onSelectedRowsChanged","maxSelectedRows","onMaxSelectedRows","props","defaultColumn","tableOptions","updatedTableOptions","stateReducer","newState","action","previousState","type","value","selectedRowIds","rowIndex","parseInt","id","selectedRowsOrdered","newSelectedRowsOrdered","filter","item","selections","selectionsDispatch","tableArgs","push","hooks","visibleColumns","selectionProps","selectedRows","length","selectedRowsById","forEach","row","useControlledState","state","selectedFlatRows","controlledTableSelections","instance","pageSize","tableStatePageSize","pageIndex","tableStatePageIndex","sortBy","tableStateSortBy","filters","tableStateFilters","tableStateSelectedRowIds","selectionActions","enhancedInstance","createElement","Provider","className","Fragment","content","defaultProps","undefined","SelectionStatusComponent","FilterStatusComponent","RowStatusComponent","isDataViewToggleEnabled","onDataViewToggle","defaultActiveStateValue","togglePlacement","propTypes","arrayOf","shape","Header","oneOfType","elementType","node","isRequired","accessor","string","Cell","Filter","filterChoices","name","number","bool","disableSortBy","func","buttonText","handleClick","variant","disabled","element","oneOf","EmptyTable"],"sources":["../../src/DataTable/index.jsx"],"sourcesContent":["import React, {\n useEffect, useMemo, useReducer,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useTable, useMountedLayoutEffect } from 'react-table';\n\nimport classNames from 'classnames';\nimport Table from './Table';\nimport getVisibleColumns from './utils/getVisibleColumns';\nimport { requiredWhen, requiredWhenNot } from '../utils/propTypes';\nimport getTableArgs from './utils/getTableArgs';\nimport TableControlBar from './TableControlBar';\nimport EmptyTableContent from './EmptyTable';\nimport TableFooter from './TableFooter';\nimport BulkActions from './BulkActions';\nimport DropdownFilters from './DropdownFilters';\nimport FilterStatus from './FilterStatus';\nimport RowStatus from './RowStatus';\nimport SelectionStatus from './selection/SelectionStatus';\nimport ControlledSelectionStatus from './selection/ControlledSelectionStatus';\nimport SmartStatus from './SmartStatus';\nimport TableFilters from './TableFilters';\nimport TableHeaderCell from './TableHeaderCell';\nimport TableCell from './TableCell';\nimport TableHeaderRow from './TableHeaderRow';\nimport TablePagination from './TablePagination';\nimport TablePaginationMinimal from './TablePaginationMinimal';\nimport DataTableContext from './DataTableContext';\nimport TableActions from './TableActions';\nimport ControlledSelect from './selection/ControlledSelect';\nimport ControlledSelectHeader from './selection/ControlledSelectHeader';\nimport DataTableLayout from './DataTableLayout';\nimport ExpandAll from './ExpandAll';\nimport ExpandRow from './ExpandRow';\n\nimport { useSelectionActions } from './hooks';\nimport selectionsReducer, { initialState as initialSelectionsState } from './selection/data/reducer';\n\nfunction DataTable({\n columns, data, defaultColumnValues, additionalColumns, isSelectable,\n isPaginated, manualPagination, pageCount, itemCount,\n isFilterable, manualFilters, fetchData, initialState,\n isSortable, manualSortBy,\n isExpandable, renderRowSubComponent,\n bulkActions, tableActions, numBreakoutFilters,\n initialTableOptions,\n EmptyTableComponent,\n manualSelectColumn,\n showFiltersInSidebar,\n dataViewToggleOptions,\n disableElevation,\n isLoading,\n children,\n onSelectedRowsChanged,\n maxSelectedRows,\n onMaxSelectedRows,\n ...props\n}) {\n const defaultColumn = useMemo(\n () => (defaultColumnValues),\n [defaultColumnValues],\n );\n const tableOptions = useMemo(() => {\n const updatedTableOptions = {\n stateReducer: (newState, action, previousState) => {\n switch (action.type) {\n // Note: we override the `toggleAllRowsSelected` action\n // from react-table because it only clears the selections on the\n // currently visible page; it does not clear the `selectedRowIds`\n // as we would expect for selections on different pages. Instead, we\n // force `selectedRowIds` to be cleared when `toggleAllRowsSelected(false)`\n // is called.\n case 'toggleAllRowsSelected': {\n if (action.value) {\n return newState;\n }\n return {\n ...newState,\n selectedRowIds: {},\n };\n }\n /* Note: We override the `toggleRowSelected` action from react-table\n because we need to preserve the order of the selected rows.\n While `selectedRowIds` is an object that contains the selected rows as key-value pairs,\n it does not maintain the order of selection. Therefore, we have added the `selectedRowsOrdered` property\n to keep track of the order in which the rows were selected.\n */\n case 'toggleRowSelected': {\n const rowIndex = parseInt(action.id, 10);\n const { selectedRowsOrdered = [] } = previousState;\n\n let newSelectedRowsOrdered;\n if (action.value) {\n newSelectedRowsOrdered = [...selectedRowsOrdered, rowIndex];\n } else {\n newSelectedRowsOrdered = selectedRowsOrdered.filter((item) => item !== rowIndex);\n }\n\n return {\n ...newState,\n selectedRowsOrdered: newSelectedRowsOrdered,\n };\n }\n default:\n return newState;\n }\n },\n ...initialTableOptions,\n };\n return {\n columns,\n data,\n defaultColumn,\n manualFilters,\n manualPagination,\n manualSortBy,\n initialState,\n ...updatedTableOptions,\n };\n }, [initialTableOptions, columns, data, defaultColumn, manualFilters, manualPagination, manualSortBy, initialState]);\n\n const [selections, selectionsDispatch] = useReducer(selectionsReducer, initialSelectionsState);\n\n if (isPaginated && manualPagination) {\n // pageCount is required when pagination is manual, if it's not there passing -1 as per react-table docs\n tableOptions.pageCount = pageCount || -1;\n }\n\n // NB: Table args *must* be in a particular order\n const tableArgs = getTableArgs({\n tableOptions, isFilterable, isSelectable, isPaginated, isSortable, isExpandable,\n });\n // adds selection column and action columns as necessary\n tableArgs.push(hooks => {\n hooks.visibleColumns.push(\n visibleColumns => getVisibleColumns(isSelectable, visibleColumns, additionalColumns, manualSelectColumn),\n );\n });\n\n // Pass any controlled selections from context to the appropriate ``useTable`` arguments to maintain\n // correct selection states on rows, both from a data perspective and in the UI.\n const selectionProps = {};\n const { selectedRows } = selections;\n if (selectedRows.length > 0) {\n const selectedRowsById = {};\n selectedRows.forEach((row) => {\n selectedRowsById[row.id] = true;\n });\n tableArgs.push(hooks => {\n hooks.useControlledState.push(\n (state) => ({ ...state, selectedRowIds: selectedRowsById }),\n );\n });\n selectionProps.selectedFlatRows = selectedRows;\n }\n const controlledTableSelections = [selections, selectionsDispatch];\n\n // Use the state and functions returned from useTable to build your UI\n const instance = useTable(...tableArgs);\n\n const {\n pageSize: tableStatePageSize,\n pageIndex: tableStatePageIndex,\n sortBy: tableStateSortBy,\n filters: tableStateFilters,\n selectedRowIds: tableStateSelectedRowIds,\n } = instance.state;\n\n useEffect(() => {\n if (fetchData) {\n fetchData({\n pageSize: tableStatePageSize,\n pageIndex: tableStatePageIndex,\n sortBy: tableStateSortBy,\n filters: tableStateFilters,\n });\n }\n }, [fetchData, tableStatePageSize, tableStatePageIndex, tableStateSortBy, tableStateFilters]);\n\n useMountedLayoutEffect(() => {\n if (onSelectedRowsChanged) {\n onSelectedRowsChanged(tableStateSelectedRowIds);\n }\n }, [tableStateSelectedRowIds, onSelectedRowsChanged]);\n\n const selectionActions = useSelectionActions(instance, controlledTableSelections);\n\n const enhancedInstance = {\n ...instance,\n manualFilters,\n itemCount,\n numBreakoutFilters,\n bulkActions,\n tableActions,\n controlledTableSelections,\n showFiltersInSidebar,\n dataViewToggleOptions,\n renderRowSubComponent,\n disableElevation,\n isLoading,\n isSelectable,\n isPaginated,\n manualSelectColumn,\n maxSelectedRows,\n onMaxSelectedRows,\n ...selectionProps,\n ...selectionActions,\n ...props,\n };\n\n return (\n <DataTableContext.Provider value={enhancedInstance}>\n <DataTableLayout>\n <div className={classNames('pgn__data-table-wrapper', {\n 'hide-shadow': !!disableElevation,\n })}\n >\n {children || (\n <>\n <TableControlBar />\n <Table />\n <EmptyTableComponent content=\"No results found\" />\n <TableFooter />\n </>\n )}\n </div>\n </DataTableLayout>\n </DataTableContext.Provider>\n );\n}\n\nDataTable.defaultProps = {\n additionalColumns: [],\n defaultColumnValues: {},\n isFilterable: false,\n isPaginated: false,\n isSelectable: false,\n isSortable: false,\n manualFilters: false,\n manualPagination: false,\n manualSortBy: false,\n fetchData: null,\n initialState: {},\n initialTableOptions: {},\n EmptyTableComponent: EmptyTableContent,\n children: null,\n bulkActions: [],\n tableActions: [],\n numBreakoutFilters: 1,\n manualSelectColumn: undefined,\n SelectionStatusComponent: SelectionStatus,\n FilterStatusComponent: FilterStatus,\n RowStatusComponent: RowStatus,\n showFiltersInSidebar: false,\n dataViewToggleOptions: {\n isDataViewToggleEnabled: false,\n onDataViewToggle: () => {},\n defaultActiveStateValue: 'card',\n togglePlacement: 'left',\n },\n disableElevation: false,\n renderRowSubComponent: undefined,\n isExpandable: false,\n isLoading: false,\n onSelectedRowsChanged: undefined,\n maxSelectedRows: undefined,\n onMaxSelectedRows: undefined,\n};\n\nDataTable.propTypes = {\n /** Definition of table columns */\n columns: PropTypes.arrayOf(PropTypes.shape({\n /** User visible column name */\n Header: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]).isRequired,\n /** String used to access the correct cell data for this column */\n accessor: requiredWhenNot(PropTypes.string, 'Cell'),\n /** Specifies a function that receives `row` as argument and returns cell content */\n Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n /** Specifies filter component */\n Filter: PropTypes.elementType,\n /** Specifies filter type */\n filter: PropTypes.string,\n /** Specifies filter choices */\n filterChoices: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string,\n number: PropTypes.number,\n value: PropTypes.string,\n })),\n })).isRequired,\n /** Data to be displayed in the table */\n data: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n /** table rows can be selected */\n isSelectable: PropTypes.bool,\n /** Alternate column for selecting rows. See react table useSort docs for more information */\n manualSelectColumn: PropTypes.shape({\n id: PropTypes.string.isRequired,\n Header: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]).isRequired,\n Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n disableSortBy: PropTypes.bool.isRequired,\n }),\n /** Table columns can be sorted */\n isSortable: PropTypes.bool,\n /** Indicates that sorting will be done via backend API. A fetchData function must be provided */\n manualSortBy: PropTypes.bool,\n /** Paginate the table */\n isPaginated: PropTypes.bool,\n /** Indicates that pagination will be done manually. A fetchData function must be provided */\n manualPagination: PropTypes.bool,\n // eslint-disable-next-line react/require-default-props\n pageCount: requiredWhen(PropTypes.number, 'manualPagination'),\n /** Table rows can be filtered, using a default filter in the default column values, or in the column definition */\n isFilterable: PropTypes.bool,\n /** Indicates that filtering will be done via a backend API. A fetchData function must be provided */\n manualFilters: PropTypes.bool,\n\n /** defaults that will be set on each column. Will be overridden by individual column values */\n defaultColumnValues: PropTypes.shape({\n /** A default filter component for the column */\n Filter: PropTypes.elementType,\n }),\n /** Actions or other additional non-data columns can be added here */\n additionalColumns: PropTypes.arrayOf(PropTypes.shape({\n /** id must be unique from other columns ids */\n id: PropTypes.string.isRequired,\n /** column header that will be displayed to the user */\n Header: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n /** Component that renders in the added column. It will receive the row as a prop */\n Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n })),\n /** Function that will fetch table data. Called when page size, page index or filters change.\n * Meant to be used with manual filters and pagination */\n fetchData: PropTypes.func,\n /** Initial state passed to react-table's documentation https://github.com/TanStack/table/blob/v7/docs/src/pages/docs/api/useTable.md */\n initialState: PropTypes.shape({\n pageSize: requiredWhen(PropTypes.number, 'isPaginated'),\n pageIndex: requiredWhen(PropTypes.number, 'isPaginated'),\n filters: requiredWhen(PropTypes.arrayOf(PropTypes.shape()), 'manualFilters'),\n sortBy: requiredWhen(PropTypes.arrayOf(PropTypes.shape()), 'manualSortBy'),\n selectedRowIds: PropTypes.shape(),\n selectedRowsOrdered: PropTypes.arrayOf(PropTypes.number),\n }),\n /** Table options passed to react-table's useTable hook. Will override some options passed in to DataTable, such\n as: data, columns, defaultColumn, manualFilters, manualPagination, manualSortBy, and initialState */\n initialTableOptions: PropTypes.shape({}),\n /** Actions to be performed on the table. Called with the table instance. Not displayed if rows are selected. */\n itemCount: PropTypes.number.isRequired,\n /** Actions to be performed on selected rows of the table. Called with the selected rows.\n * Only displayed if rows are selected. */\n bulkActions: PropTypes.oneOfType([\n PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.shape({\n /** Bulk action button text */\n buttonText: PropTypes.string.isRequired,\n /** handleClick will be passed the selected rows */\n handleClick: PropTypes.func.isRequired,\n /** classnames for button class */\n className: PropTypes.string,\n /** optional button variant; only relevant for the first two buttons */\n variant: PropTypes.string,\n /** disables button */\n disabled: PropTypes.bool,\n }),\n /** function passed selected items, should return action object */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n ),\n /** Function for rendering custom components */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n /** Function for rendering custom components, called with the table instance */\n tableActions: PropTypes.oneOfType([\n PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.shape({\n /** Bulk action button text */\n buttonText: PropTypes.string.isRequired,\n /** handleClick will be passed the selected rows */\n handleClick: PropTypes.func.isRequired,\n /** classnames for button class */\n className: PropTypes.string,\n /** optional button variant; only relevant for the first two buttons */\n variant: PropTypes.string,\n /** disables button */\n disabled: PropTypes.bool,\n }),\n /** function passed table instance, should return action object */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n ),\n /** Function for rendering custom components */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n /** Number between one and four filters that can be shown on the top row. */\n numBreakoutFilters: PropTypes.oneOf([1, 2, 3, 4]),\n /** Component to be displayed when the table is empty */\n EmptyTableComponent: PropTypes.elementType,\n /** Component to be displayed for row status, ie, 10 of 20 rows. Displayed by default in the TableControlBar */\n RowStatusComponent: PropTypes.elementType,\n /** Component to be displayed for selection status. Displayed when there are selected rows and no active filters */\n SelectionStatusComponent: PropTypes.elementType,\n /** Component to be displayed for filter status. Displayed when there are active filters. */\n FilterStatusComponent: PropTypes.elementType,\n /** If children are not provided a table with control bar and footer will be rendered */\n children: PropTypes.node,\n /** If true filters will be shown on sidebar instead */\n showFiltersInSidebar: PropTypes.bool,\n /** options for data view toggle */\n dataViewToggleOptions: PropTypes.shape({\n /** Whether to show a toggle button group which allows view switching between card and table views */\n isDataViewToggleEnabled: PropTypes.bool,\n /** Callback invoked when the toggle buttons are clicked, with value of selected button passed in */\n onDataViewToggle: PropTypes.func,\n /** default value for toggle active state */\n defaultActiveStateValue: PropTypes.string,\n /** placement of toggle 'bottom' will push it to the bottom row in\n * actions section. Only 'left' and 'bottom' are supported */\n togglePlacement: PropTypes.string,\n }),\n /** Remove the default box shadow on the component */\n disableElevation: PropTypes.bool,\n /** A function that will render contents of expanded row, accepts `row` as a prop. */\n renderRowSubComponent: PropTypes.func,\n /** Indicates whether table supports expandable rows. */\n isExpandable: PropTypes.bool,\n /** Indicates whether the table should show loading states. */\n isLoading: PropTypes.bool,\n /** Callback function called when row selections change. */\n onSelectedRowsChanged: PropTypes.func,\n /** Indicates the max of rows selectable in the table. Requires isSelectable prop */\n maxSelectedRows: PropTypes.number,\n /** Callback after selected max rows. Requires isSelectable and maxSelectedRows props */\n onMaxSelectedRows: PropTypes.func,\n};\n\nDataTable.BulkActions = BulkActions;\nDataTable.EmptyTable = EmptyTableContent;\nDataTable.DropdownFilters = DropdownFilters;\nDataTable.FilterStatus = FilterStatus;\nDataTable.RowStatus = RowStatus;\nDataTable.SelectionStatus = SelectionStatus;\nDataTable.SmartStatus = SmartStatus;\nDataTable.Table = Table;\nDataTable.TableCell = TableCell;\nDataTable.TableControlBar = TableControlBar;\nDataTable.TableFilters = TableFilters;\nDataTable.TableFooter = TableFooter;\nDataTable.TableHeaderCell = TableHeaderCell;\nDataTable.TableHeaderRow = TableHeaderRow;\nDataTable.TablePagination = TablePagination;\nDataTable.TablePaginationMinimal = TablePaginationMinimal;\nDataTable.TableActions = TableActions;\nDataTable.ControlledSelectionStatus = ControlledSelectionStatus;\nDataTable.ControlledSelect = ControlledSelect;\nDataTable.ControlledSelectHeader = ControlledSelectHeader;\nDataTable.ExpandAll = ExpandAll;\nDataTable.ExpandRow = ExpandRow;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["React","useEffect","useMemo","useReducer","PropTypes","useTable","useMountedLayoutEffect","classNames","Table","getVisibleColumns","requiredWhen","requiredWhenNot","getTableArgs","TableControlBar","EmptyTableContent","TableFooter","BulkActions","DropdownFilters","FilterStatus","RowStatus","SelectionStatus","ControlledSelectionStatus","SmartStatus","TableFilters","TableHeaderCell","TableCell","TableHeaderRow","TablePagination","TablePaginationMinimal","DataTableContext","TableActions","ControlledSelect","ControlledSelectHeader","DataTableLayout","ExpandAll","ExpandRow","useDataTableSelections","useSelectionActions","selectionsReducer","initialState","initialSelectionsState","DataTable","_ref","columns","data","defaultColumnValues","additionalColumns","isSelectable","isPaginated","manualPagination","pageCount","itemCount","isFilterable","manualFilters","fetchData","isSortable","manualSortBy","isExpandable","renderRowSubComponent","bulkActions","tableActions","numBreakoutFilters","initialTableOptions","EmptyTableComponent","manualSelectColumn","showFiltersInSidebar","dataViewToggleOptions","disableElevation","isLoading","children","onSelectedRowsChanged","maxSelectedRows","onMaxSelectedRows","props","defaultColumn","tableOptions","updatedTableOptions","stateReducer","newState","action","previousState","type","value","selectedRowIds","rowIndex","parseInt","id","selectedRowsOrdered","newSelectedRowsOrdered","filter","item","selections","selectionsDispatch","tableArgs","push","hooks","visibleColumns","selectionProps","selectedRows","length","selectedRowsById","forEach","row","useControlledState","state","selectedFlatRows","controlledTableSelections","instance","pageSize","tableStatePageSize","pageIndex","tableStatePageIndex","sortBy","tableStateSortBy","filters","tableStateFilters","tableStateSelectedRowIds","selectionActions","page","isAllPageRowsSelected","enhancedInstance","createElement","Provider","className","Fragment","content","defaultProps","undefined","SelectionStatusComponent","FilterStatusComponent","RowStatusComponent","isDataViewToggleEnabled","onDataViewToggle","defaultActiveStateValue","togglePlacement","propTypes","arrayOf","shape","Header","oneOfType","elementType","node","isRequired","accessor","string","Cell","Filter","filterChoices","name","number","bool","disableSortBy","func","buttonText","handleClick","variant","disabled","element","oneOf","EmptyTable"],"sources":["../../src/DataTable/index.jsx"],"sourcesContent":["import React, {\n useEffect, useMemo, useReducer,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useTable, useMountedLayoutEffect } from 'react-table';\n\nimport classNames from 'classnames';\nimport Table from './Table';\nimport getVisibleColumns from './utils/getVisibleColumns';\nimport { requiredWhen, requiredWhenNot } from '../utils/propTypes';\nimport getTableArgs from './utils/getTableArgs';\nimport TableControlBar from './TableControlBar';\nimport EmptyTableContent from './EmptyTable';\nimport TableFooter from './TableFooter';\nimport BulkActions from './BulkActions';\nimport DropdownFilters from './DropdownFilters';\nimport FilterStatus from './FilterStatus';\nimport RowStatus from './RowStatus';\nimport SelectionStatus from './selection/SelectionStatus';\nimport ControlledSelectionStatus from './selection/ControlledSelectionStatus';\nimport SmartStatus from './SmartStatus';\nimport TableFilters from './TableFilters';\nimport TableHeaderCell from './TableHeaderCell';\nimport TableCell from './TableCell';\nimport TableHeaderRow from './TableHeaderRow';\nimport TablePagination from './TablePagination';\nimport TablePaginationMinimal from './TablePaginationMinimal';\nimport DataTableContext from './DataTableContext';\nimport TableActions from './TableActions';\nimport ControlledSelect from './selection/ControlledSelect';\nimport ControlledSelectHeader from './selection/ControlledSelectHeader';\nimport DataTableLayout from './DataTableLayout';\nimport ExpandAll from './ExpandAll';\nimport ExpandRow from './ExpandRow';\n\nimport { useDataTableSelections, useSelectionActions } from './hooks';\nimport selectionsReducer, {\n initialState as initialSelectionsState,\n} from './selection/data/reducer';\n\nfunction DataTable({\n columns, data, defaultColumnValues, additionalColumns, isSelectable,\n isPaginated, manualPagination, pageCount, itemCount,\n isFilterable, manualFilters, fetchData, initialState,\n isSortable, manualSortBy,\n isExpandable, renderRowSubComponent,\n bulkActions, tableActions, numBreakoutFilters,\n initialTableOptions,\n EmptyTableComponent,\n manualSelectColumn,\n showFiltersInSidebar,\n dataViewToggleOptions,\n disableElevation,\n isLoading,\n children,\n onSelectedRowsChanged,\n maxSelectedRows,\n onMaxSelectedRows,\n ...props\n}) {\n const defaultColumn = useMemo(\n () => (defaultColumnValues),\n [defaultColumnValues],\n );\n const tableOptions = useMemo(() => {\n const updatedTableOptions = {\n stateReducer: (newState, action, previousState) => {\n switch (action.type) {\n // Note: we override the `toggleAllRowsSelected` action\n // from react-table because it only clears the selections on the\n // currently visible page; it does not clear the `selectedRowIds`\n // as we would expect for selections on different pages. Instead, we\n // force `selectedRowIds` to be cleared when `toggleAllRowsSelected(false)`\n // is called.\n case 'toggleAllRowsSelected': {\n if (action.value) {\n return newState;\n }\n return {\n ...newState,\n selectedRowIds: {},\n };\n }\n /**\n * Note: We override the `toggleRowSelected` action from react-table\n * because we need to preserve the order of the selected rows.\n * while `selectedRowIds` is an object that contains the selected rows as key-value pairs,\n * it does not maintain the order of selection. Therefore, we have added the `selectedRowsOrdered` property\n * to keep track of the order in which the rows were selected.\n */\n case 'toggleRowSelected': {\n const rowIndex = parseInt(action.id, 10);\n const { selectedRowsOrdered = [] } = previousState;\n\n let newSelectedRowsOrdered;\n if (action.value) {\n newSelectedRowsOrdered = [...selectedRowsOrdered, rowIndex];\n } else {\n newSelectedRowsOrdered = selectedRowsOrdered.filter((item) => item !== rowIndex);\n }\n\n return {\n ...newState,\n selectedRowsOrdered: newSelectedRowsOrdered,\n };\n }\n default:\n return newState;\n }\n },\n ...initialTableOptions,\n };\n return {\n columns,\n data,\n defaultColumn,\n manualFilters,\n manualPagination,\n manualSortBy,\n initialState,\n ...updatedTableOptions,\n };\n }, [initialTableOptions, columns, data, defaultColumn, manualFilters, manualPagination, manualSortBy, initialState]);\n\n const [selections, selectionsDispatch] = useReducer(selectionsReducer, initialSelectionsState);\n\n if (isPaginated && manualPagination) {\n // pageCount is required when pagination is manual, if it's not there passing -1 as per react-table docs\n tableOptions.pageCount = pageCount || -1;\n }\n\n // NB: Table args *must* be in a particular order\n const tableArgs = getTableArgs({\n tableOptions, isFilterable, isSelectable, isPaginated, isSortable, isExpandable,\n });\n // adds selection column and action columns as necessary\n tableArgs.push(hooks => {\n hooks.visibleColumns.push(\n visibleColumns => getVisibleColumns(isSelectable, visibleColumns, additionalColumns, manualSelectColumn),\n );\n });\n\n // Pass any controlled selections from context to the appropriate ``useTable`` arguments to maintain\n // correct selection states on rows, both from a data perspective and in the UI.\n const selectionProps = {};\n const { selectedRows } = selections;\n if (selectedRows.length > 0) {\n const selectedRowsById = {};\n selectedRows.forEach((row) => {\n selectedRowsById[row.id] = true;\n });\n tableArgs.push(hooks => {\n hooks.useControlledState.push(\n (state) => ({ ...state, selectedRowIds: selectedRowsById }),\n );\n });\n selectionProps.selectedFlatRows = selectedRows;\n }\n const controlledTableSelections = [selections, selectionsDispatch];\n\n // Use the state and functions returned from useTable to build your UI\n const instance = useTable(...tableArgs);\n\n const {\n pageSize: tableStatePageSize,\n pageIndex: tableStatePageIndex,\n sortBy: tableStateSortBy,\n filters: tableStateFilters,\n selectedRowIds: tableStateSelectedRowIds,\n } = instance.state;\n\n useEffect(() => {\n if (fetchData) {\n fetchData({\n pageSize: tableStatePageSize,\n pageIndex: tableStatePageIndex,\n sortBy: tableStateSortBy,\n filters: tableStateFilters,\n });\n }\n }, [fetchData, tableStatePageSize, tableStatePageIndex, tableStateSortBy, tableStateFilters]);\n\n useMountedLayoutEffect(() => {\n if (onSelectedRowsChanged) {\n onSelectedRowsChanged(tableStateSelectedRowIds);\n }\n }, [tableStateSelectedRowIds, onSelectedRowsChanged]);\n\n const selectionActions = useSelectionActions(instance, controlledTableSelections);\n\n useDataTableSelections({\n selections,\n selectionsDispatch,\n itemCount,\n selectedRows,\n page: instance.page,\n isAllPageRowsSelected: instance.isAllPageRowsSelected,\n });\n\n const enhancedInstance = {\n ...instance,\n manualFilters,\n itemCount,\n numBreakoutFilters,\n bulkActions,\n tableActions,\n controlledTableSelections,\n showFiltersInSidebar,\n dataViewToggleOptions,\n renderRowSubComponent,\n disableElevation,\n isLoading,\n isSelectable,\n isPaginated,\n manualSelectColumn,\n maxSelectedRows,\n onMaxSelectedRows,\n ...selectionProps,\n ...selectionActions,\n ...props,\n };\n\n return (\n <DataTableContext.Provider value={enhancedInstance}>\n <DataTableLayout>\n <div className={classNames('pgn__data-table-wrapper', {\n 'hide-shadow': !!disableElevation,\n })}\n >\n {children || (\n <>\n <TableControlBar />\n <Table />\n <EmptyTableComponent content=\"No results found\" />\n <TableFooter />\n </>\n )}\n </div>\n </DataTableLayout>\n </DataTableContext.Provider>\n );\n}\n\nDataTable.defaultProps = {\n additionalColumns: [],\n defaultColumnValues: {},\n isFilterable: false,\n isPaginated: false,\n isSelectable: false,\n isSortable: false,\n manualFilters: false,\n manualPagination: false,\n manualSortBy: false,\n fetchData: null,\n initialState: {},\n initialTableOptions: {},\n EmptyTableComponent: EmptyTableContent,\n children: null,\n bulkActions: [],\n tableActions: [],\n numBreakoutFilters: 1,\n manualSelectColumn: undefined,\n SelectionStatusComponent: SelectionStatus,\n FilterStatusComponent: FilterStatus,\n RowStatusComponent: RowStatus,\n showFiltersInSidebar: false,\n dataViewToggleOptions: {\n isDataViewToggleEnabled: false,\n onDataViewToggle: () => {},\n defaultActiveStateValue: 'card',\n togglePlacement: 'left',\n },\n disableElevation: false,\n renderRowSubComponent: undefined,\n isExpandable: false,\n isLoading: false,\n onSelectedRowsChanged: undefined,\n maxSelectedRows: undefined,\n onMaxSelectedRows: undefined,\n};\n\nDataTable.propTypes = {\n /** Definition of table columns */\n columns: PropTypes.arrayOf(PropTypes.shape({\n /** User visible column name */\n Header: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]).isRequired,\n /** String used to access the correct cell data for this column */\n accessor: requiredWhenNot(PropTypes.string, 'Cell'),\n /** Specifies a function that receives `row` as argument and returns cell content */\n Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n /** Specifies filter component */\n Filter: PropTypes.elementType,\n /** Specifies filter type */\n filter: PropTypes.string,\n /** Specifies filter choices */\n filterChoices: PropTypes.arrayOf(PropTypes.shape({\n name: PropTypes.string,\n number: PropTypes.number,\n value: PropTypes.string,\n })),\n })).isRequired,\n /** Data to be displayed in the table */\n data: PropTypes.arrayOf(PropTypes.shape({})).isRequired,\n /** table rows can be selected */\n isSelectable: PropTypes.bool,\n /** Alternate column for selecting rows. See react table useSort docs for more information */\n manualSelectColumn: PropTypes.shape({\n id: PropTypes.string.isRequired,\n Header: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]).isRequired,\n Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n disableSortBy: PropTypes.bool.isRequired,\n }),\n /** Table columns can be sorted */\n isSortable: PropTypes.bool,\n /** Indicates that sorting will be done via backend API. A fetchData function must be provided */\n manualSortBy: PropTypes.bool,\n /** Paginate the table */\n isPaginated: PropTypes.bool,\n /** Indicates that pagination will be done manually. A fetchData function must be provided */\n manualPagination: PropTypes.bool,\n // eslint-disable-next-line react/require-default-props\n pageCount: requiredWhen(PropTypes.number, 'manualPagination'),\n /** Table rows can be filtered, using a default filter in the default column values, or in the column definition */\n isFilterable: PropTypes.bool,\n /** Indicates that filtering will be done via a backend API. A fetchData function must be provided */\n manualFilters: PropTypes.bool,\n\n /** defaults that will be set on each column. Will be overridden by individual column values */\n defaultColumnValues: PropTypes.shape({\n /** A default filter component for the column */\n Filter: PropTypes.elementType,\n }),\n /** Actions or other additional non-data columns can be added here */\n additionalColumns: PropTypes.arrayOf(PropTypes.shape({\n /** id must be unique from other columns ids */\n id: PropTypes.string.isRequired,\n /** column header that will be displayed to the user */\n Header: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n /** Component that renders in the added column. It will receive the row as a prop */\n Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),\n })),\n /** Function that will fetch table data. Called when page size, page index or filters change.\n * Meant to be used with manual filters and pagination */\n fetchData: PropTypes.func,\n /** Initial state passed to react-table's documentation https://github.com/TanStack/table/blob/v7/docs/src/pages/docs/api/useTable.md */\n initialState: PropTypes.shape({\n pageSize: requiredWhen(PropTypes.number, 'isPaginated'),\n pageIndex: requiredWhen(PropTypes.number, 'isPaginated'),\n filters: requiredWhen(PropTypes.arrayOf(PropTypes.shape()), 'manualFilters'),\n sortBy: requiredWhen(PropTypes.arrayOf(PropTypes.shape()), 'manualSortBy'),\n selectedRowIds: PropTypes.shape(),\n selectedRowsOrdered: PropTypes.arrayOf(PropTypes.number),\n }),\n /** Table options passed to react-table's useTable hook. Will override some options passed in to DataTable, such\n as: data, columns, defaultColumn, manualFilters, manualPagination, manualSortBy, and initialState */\n initialTableOptions: PropTypes.shape({}),\n /** Actions to be performed on the table. Called with the table instance. Not displayed if rows are selected. */\n itemCount: PropTypes.number.isRequired,\n /** Actions to be performed on selected rows of the table. Called with the selected rows.\n * Only displayed if rows are selected. */\n bulkActions: PropTypes.oneOfType([\n PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.shape({\n /** Bulk action button text */\n buttonText: PropTypes.string.isRequired,\n /** handleClick will be passed the selected rows */\n handleClick: PropTypes.func.isRequired,\n /** classnames for button class */\n className: PropTypes.string,\n /** optional button variant; only relevant for the first two buttons */\n variant: PropTypes.string,\n /** disables button */\n disabled: PropTypes.bool,\n }),\n /** function passed selected items, should return action object */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n ),\n /** Function for rendering custom components */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n /** Function for rendering custom components, called with the table instance */\n tableActions: PropTypes.oneOfType([\n PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.shape({\n /** Bulk action button text */\n buttonText: PropTypes.string.isRequired,\n /** handleClick will be passed the selected rows */\n handleClick: PropTypes.func.isRequired,\n /** classnames for button class */\n className: PropTypes.string,\n /** optional button variant; only relevant for the first two buttons */\n variant: PropTypes.string,\n /** disables button */\n disabled: PropTypes.bool,\n }),\n /** function passed table instance, should return action object */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n ),\n /** Function for rendering custom components */\n PropTypes.func,\n /** A custom component representing an action */\n PropTypes.element,\n ]),\n /** Number between one and four filters that can be shown on the top row. */\n numBreakoutFilters: PropTypes.oneOf([1, 2, 3, 4]),\n /** Component to be displayed when the table is empty */\n EmptyTableComponent: PropTypes.elementType,\n /** Component to be displayed for row status, ie, 10 of 20 rows. Displayed by default in the TableControlBar */\n RowStatusComponent: PropTypes.elementType,\n /** Component to be displayed for selection status. Displayed when there are selected rows and no active filters */\n SelectionStatusComponent: PropTypes.elementType,\n /** Component to be displayed for filter status. Displayed when there are active filters. */\n FilterStatusComponent: PropTypes.elementType,\n /** If children are not provided a table with control bar and footer will be rendered */\n children: PropTypes.node,\n /** If true filters will be shown on sidebar instead */\n showFiltersInSidebar: PropTypes.bool,\n /** options for data view toggle */\n dataViewToggleOptions: PropTypes.shape({\n /** Whether to show a toggle button group which allows view switching between card and table views */\n isDataViewToggleEnabled: PropTypes.bool,\n /** Callback invoked when the toggle buttons are clicked, with value of selected button passed in */\n onDataViewToggle: PropTypes.func,\n /** default value for toggle active state */\n defaultActiveStateValue: PropTypes.string,\n /** placement of toggle 'bottom' will push it to the bottom row in\n * actions section. Only 'left' and 'bottom' are supported */\n togglePlacement: PropTypes.string,\n }),\n /** Remove the default box shadow on the component */\n disableElevation: PropTypes.bool,\n /** A function that will render contents of expanded row, accepts `row` as a prop. */\n renderRowSubComponent: PropTypes.func,\n /** Indicates whether table supports expandable rows. */\n isExpandable: PropTypes.bool,\n /** Indicates whether the table should show loading states. */\n isLoading: PropTypes.bool,\n /** Callback function called when row selections change. */\n onSelectedRowsChanged: PropTypes.func,\n /** Indicates the max of rows selectable in the table. Requires isSelectable prop */\n maxSelectedRows: PropTypes.number,\n /** Callback after selected max rows. Requires isSelectable and maxSelectedRows props */\n onMaxSelectedRows: PropTypes.func,\n};\n\nDataTable.BulkActions = BulkActions;\nDataTable.EmptyTable = EmptyTableContent;\nDataTable.DropdownFilters = DropdownFilters;\nDataTable.FilterStatus = FilterStatus;\nDataTable.RowStatus = RowStatus;\nDataTable.SelectionStatus = SelectionStatus;\nDataTable.SmartStatus = SmartStatus;\nDataTable.Table = Table;\nDataTable.TableCell = TableCell;\nDataTable.TableControlBar = TableControlBar;\nDataTable.TableFilters = TableFilters;\nDataTable.TableFooter = TableFooter;\nDataTable.TableHeaderCell = TableHeaderCell;\nDataTable.TableHeaderRow = TableHeaderRow;\nDataTable.TablePagination = TablePagination;\nDataTable.TablePaginationMinimal = TablePaginationMinimal;\nDataTable.TableActions = TableActions;\nDataTable.ControlledSelectionStatus = ControlledSelectionStatus;\nDataTable.ControlledSelect = ControlledSelect;\nDataTable.ControlledSelectHeader = ControlledSelectHeader;\nDataTable.ExpandAll = ExpandAll;\nDataTable.ExpandRow = ExpandRow;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
@@ -1,9 +1,8 @@
1
- import React, { useContext, useEffect } from 'react';
1
+ import React, { useContext } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import DataTableContext from '../DataTableContext';
4
4
  import BaseSelectionStatus from './BaseSelectionStatus';
5
- import { clearSelectionAction, setSelectAllRowsAllPagesAction, setSelectedRowsAction } from './data/actions';
6
- import { getUnselectedPageRows, getRowIds } from './data/helpers';
5
+ import { clearSelectionAction, setSelectAllRowsAllPagesAction } from './data/actions';
7
6
  function ControlledSelectionStatus(_ref) {
8
7
  let {
9
8
  className,
@@ -14,27 +13,18 @@ function ControlledSelectionStatus(_ref) {
14
13
  page,
15
14
  controlledTableSelections: [{
16
15
  selectedRows,
17
- isEntireTableSelected
18
- }, dispatch]
16
+ isSelectAllEnabled
17
+ }, selectionsDispatch]
19
18
  } = useContext(DataTableContext);
20
- useEffect(() => {
21
- if (isEntireTableSelected) {
22
- const selectedRowIds = getRowIds(selectedRows);
23
- const unselectedPageRows = getUnselectedPageRows(selectedRowIds, page);
24
- if (unselectedPageRows.length) {
25
- dispatch(setSelectedRowsAction(unselectedPageRows, itemCount));
26
- }
27
- }
28
- }, [isEntireTableSelected, selectedRows, itemCount, page, dispatch]);
29
- const numSelectedRows = isEntireTableSelected ? itemCount : selectedRows.length;
19
+ const numSelectedRows = itemCount === selectedRows.length || isSelectAllEnabled ? itemCount : selectedRows.length;
30
20
  const numSelectedRowsOnPage = (page || []).filter(r => r.isSelected).length;
31
21
  const selectionStatusProps = {
32
22
  className,
33
23
  numSelectedRows,
34
24
  numSelectedRowsOnPage,
35
25
  clearSelectionText,
36
- onSelectAll: () => dispatch(setSelectAllRowsAllPagesAction()),
37
- onClear: () => dispatch(clearSelectionAction())
26
+ onSelectAll: () => selectionsDispatch(setSelectAllRowsAllPagesAction()),
27
+ onClear: () => selectionsDispatch(clearSelectionAction())
38
28
  };
39
29
  return /*#__PURE__*/React.createElement(BaseSelectionStatus, {
40
30
  ...selectionStatusProps
@@ -1 +1 @@
1
- {"version":3,"file":"ControlledSelectionStatus.js","names":["React","useContext","useEffect","PropTypes","DataTableContext","BaseSelectionStatus","clearSelectionAction","setSelectAllRowsAllPagesAction","setSelectedRowsAction","getUnselectedPageRows","getRowIds","ControlledSelectionStatus","_ref","className","clearSelectionText","itemCount","page","controlledTableSelections","selectedRows","isEntireTableSelected","dispatch","selectedRowIds","unselectedPageRows","length","numSelectedRows","numSelectedRowsOnPage","filter","r","isSelected","selectionStatusProps","onSelectAll","onClear","createElement","defaultProps","undefined","propTypes","string","oneOfType","element"],"sources":["../../../src/DataTable/selection/ControlledSelectionStatus.jsx"],"sourcesContent":["import React, { useContext, useEffect } from 'react';\nimport PropTypes from 'prop-types';\n\nimport DataTableContext from '../DataTableContext';\nimport BaseSelectionStatus from './BaseSelectionStatus';\n\nimport {\n clearSelectionAction,\n setSelectAllRowsAllPagesAction,\n setSelectedRowsAction,\n} from './data/actions';\nimport {\n getUnselectedPageRows,\n getRowIds,\n} from './data/helpers';\n\nfunction ControlledSelectionStatus({ className, clearSelectionText }) {\n const {\n itemCount,\n page,\n controlledTableSelections: [{ selectedRows, isEntireTableSelected }, dispatch],\n } = useContext(DataTableContext);\n\n useEffect(\n () => {\n if (isEntireTableSelected) {\n const selectedRowIds = getRowIds(selectedRows);\n const unselectedPageRows = getUnselectedPageRows(selectedRowIds, page);\n if (unselectedPageRows.length) {\n dispatch(setSelectedRowsAction(unselectedPageRows, itemCount));\n }\n }\n },\n [isEntireTableSelected, selectedRows, itemCount, page, dispatch],\n );\n\n const numSelectedRows = isEntireTableSelected ? itemCount : selectedRows.length;\n const numSelectedRowsOnPage = (page || []).filter(r => r.isSelected).length;\n\n const selectionStatusProps = {\n className,\n numSelectedRows,\n numSelectedRowsOnPage,\n clearSelectionText,\n onSelectAll: () => dispatch(setSelectAllRowsAllPagesAction()),\n onClear: () => dispatch(clearSelectionAction()),\n };\n return <BaseSelectionStatus {...selectionStatusProps} />;\n}\n\nControlledSelectionStatus.defaultProps = {\n className: undefined,\n clearSelectionText: undefined,\n};\n\nControlledSelectionStatus.propTypes = {\n /** A class name to append to the base element */\n className: PropTypes.string,\n /** A text that appears on the `Clear selection` button, defaults to 'Clear Selection' */\n clearSelectionText: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n};\n\nexport default ControlledSelectionStatus;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,SAAS,QAAQ,OAAO;AACpD,OAAOC,SAAS,MAAM,YAAY;AAElC,OAAOC,gBAAgB,MAAM,qBAAqB;AAClD,OAAOC,mBAAmB,MAAM,uBAAuB;AAEvD,SACEC,oBAAoB,EACpBC,8BAA8B,EAC9BC,qBAAqB,QAChB,gBAAgB;AACvB,SACEC,qBAAqB,EACrBC,SAAS,QACJ,gBAAgB;AAEvB,SAASC,yBAAyBA,CAAAC,IAAA,EAAoC;EAAA,IAAnC;IAAEC,SAAS;IAAEC;EAAmB,CAAC,GAAAF,IAAA;EAClE,MAAM;IACJG,SAAS;IACTC,IAAI;IACJC,yBAAyB,EAAE,CAAC;MAAEC,YAAY;MAAEC;IAAsB,CAAC,EAAEC,QAAQ;EAC/E,CAAC,GAAGnB,UAAU,CAACG,gBAAgB,CAAC;EAEhCF,SAAS,CACP,MAAM;IACJ,IAAIiB,qBAAqB,EAAE;MACzB,MAAME,cAAc,GAAGX,SAAS,CAACQ,YAAY,CAAC;MAC9C,MAAMI,kBAAkB,GAAGb,qBAAqB,CAACY,cAAc,EAAEL,IAAI,CAAC;MACtE,IAAIM,kBAAkB,CAACC,MAAM,EAAE;QAC7BH,QAAQ,CAACZ,qBAAqB,CAACc,kBAAkB,EAAEP,SAAS,CAAC,CAAC;MAChE;IACF;EACF,CAAC,EACD,CAACI,qBAAqB,EAAED,YAAY,EAAEH,SAAS,EAAEC,IAAI,EAAEI,QAAQ,CACjE,CAAC;EAED,MAAMI,eAAe,GAAGL,qBAAqB,GAAGJ,SAAS,GAAGG,YAAY,CAACK,MAAM;EAC/E,MAAME,qBAAqB,GAAG,CAACT,IAAI,IAAI,EAAE,EAAEU,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,UAAU,CAAC,CAACL,MAAM;EAE3E,MAAMM,oBAAoB,GAAG;IAC3BhB,SAAS;IACTW,eAAe;IACfC,qBAAqB;IACrBX,kBAAkB;IAClBgB,WAAW,EAAEA,CAAA,KAAMV,QAAQ,CAACb,8BAA8B,CAAC,CAAC,CAAC;IAC7DwB,OAAO,EAAEA,CAAA,KAAMX,QAAQ,CAACd,oBAAoB,CAAC,CAAC;EAChD,CAAC;EACD,oBAAON,KAAA,CAAAgC,aAAA,CAAC3B,mBAAmB;IAAA,GAAKwB;EAAoB,CAAG,CAAC;AAC1D;AAEAlB,yBAAyB,CAACsB,YAAY,GAAG;EACvCpB,SAAS,EAAEqB,SAAS;EACpBpB,kBAAkB,EAAEoB;AACtB,CAAC;AAEDvB,yBAAyB,CAACwB,SAAS,GAAG;EACpC;EACAtB,SAAS,EAAEV,SAAS,CAACiC,MAAM;EAC3B;EACAtB,kBAAkB,EAAEX,SAAS,CAACkC,SAAS,CAAC,CAAClC,SAAS,CAACiC,MAAM,EAAEjC,SAAS,CAACmC,OAAO,CAAC;AAC/E,CAAC;AAED,eAAe3B,yBAAyB","ignoreList":[]}
1
+ {"version":3,"file":"ControlledSelectionStatus.js","names":["React","useContext","PropTypes","DataTableContext","BaseSelectionStatus","clearSelectionAction","setSelectAllRowsAllPagesAction","ControlledSelectionStatus","_ref","className","clearSelectionText","itemCount","page","controlledTableSelections","selectedRows","isSelectAllEnabled","selectionsDispatch","numSelectedRows","length","numSelectedRowsOnPage","filter","r","isSelected","selectionStatusProps","onSelectAll","onClear","createElement","defaultProps","undefined","propTypes","string","oneOfType","element"],"sources":["../../../src/DataTable/selection/ControlledSelectionStatus.jsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\n\nimport DataTableContext from '../DataTableContext';\nimport BaseSelectionStatus from './BaseSelectionStatus';\n\nimport {\n clearSelectionAction,\n setSelectAllRowsAllPagesAction,\n} from './data/actions';\n\nfunction ControlledSelectionStatus({ className, clearSelectionText }) {\n const {\n itemCount,\n page,\n controlledTableSelections: [\n { selectedRows, isSelectAllEnabled },\n selectionsDispatch,\n ],\n } = useContext(DataTableContext);\n\n const numSelectedRows = itemCount === selectedRows.length || isSelectAllEnabled ? itemCount : selectedRows.length;\n const numSelectedRowsOnPage = (page || []).filter(r => r.isSelected).length;\n\n const selectionStatusProps = {\n className,\n numSelectedRows,\n numSelectedRowsOnPage,\n clearSelectionText,\n onSelectAll: () => selectionsDispatch(setSelectAllRowsAllPagesAction()),\n onClear: () => selectionsDispatch(clearSelectionAction()),\n };\n return <BaseSelectionStatus {...selectionStatusProps} />;\n}\n\nControlledSelectionStatus.defaultProps = {\n className: undefined,\n clearSelectionText: undefined,\n};\n\nControlledSelectionStatus.propTypes = {\n /** A class name to append to the base element */\n className: PropTypes.string,\n /** A text that appears on the `Clear selection` button, defaults to 'Clear Selection' */\n clearSelectionText: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n};\n\nexport default ControlledSelectionStatus;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,OAAOC,SAAS,MAAM,YAAY;AAElC,OAAOC,gBAAgB,MAAM,qBAAqB;AAClD,OAAOC,mBAAmB,MAAM,uBAAuB;AAEvD,SACEC,oBAAoB,EACpBC,8BAA8B,QACzB,gBAAgB;AAEvB,SAASC,yBAAyBA,CAAAC,IAAA,EAAoC;EAAA,IAAnC;IAAEC,SAAS;IAAEC;EAAmB,CAAC,GAAAF,IAAA;EAClE,MAAM;IACJG,SAAS;IACTC,IAAI;IACJC,yBAAyB,EAAE,CACzB;MAAEC,YAAY;MAAEC;IAAmB,CAAC,EACpCC,kBAAkB;EAEtB,CAAC,GAAGf,UAAU,CAACE,gBAAgB,CAAC;EAEhC,MAAMc,eAAe,GAAGN,SAAS,KAAKG,YAAY,CAACI,MAAM,IAAIH,kBAAkB,GAAGJ,SAAS,GAAGG,YAAY,CAACI,MAAM;EACjH,MAAMC,qBAAqB,GAAG,CAACP,IAAI,IAAI,EAAE,EAAEQ,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,UAAU,CAAC,CAACJ,MAAM;EAE3E,MAAMK,oBAAoB,GAAG;IAC3Bd,SAAS;IACTQ,eAAe;IACfE,qBAAqB;IACrBT,kBAAkB;IAClBc,WAAW,EAAEA,CAAA,KAAMR,kBAAkB,CAACV,8BAA8B,CAAC,CAAC,CAAC;IACvEmB,OAAO,EAAEA,CAAA,KAAMT,kBAAkB,CAACX,oBAAoB,CAAC,CAAC;EAC1D,CAAC;EACD,oBAAOL,KAAA,CAAA0B,aAAA,CAACtB,mBAAmB;IAAA,GAAKmB;EAAoB,CAAG,CAAC;AAC1D;AAEAhB,yBAAyB,CAACoB,YAAY,GAAG;EACvClB,SAAS,EAAEmB,SAAS;EACpBlB,kBAAkB,EAAEkB;AACtB,CAAC;AAEDrB,yBAAyB,CAACsB,SAAS,GAAG;EACpC;EACApB,SAAS,EAAEP,SAAS,CAAC4B,MAAM;EAC3B;EACApB,kBAAkB,EAAER,SAAS,CAAC6B,SAAS,CAAC,CAAC7B,SAAS,CAAC4B,MAAM,EAAE5B,SAAS,CAAC8B,OAAO,CAAC;AAC/E,CAAC;AAED,eAAezB,yBAAyB","ignoreList":[]}
@@ -33,3 +33,8 @@ export const clearPageSelectionAction = (rowIds) => ({
33
33
  type: CLEAR_PAGE_SELECTION,
34
34
  rowIds,
35
35
  });
36
+
37
+ export const TOGGLE_IS_ENTIRE_TABLE_SELECTED = 'TOGGLE IS ENTIRE TABLE SELECTED';
38
+ export const toggleIsEntireTableSelected = () => ({
39
+ type: TOGGLE_IS_ENTIRE_TABLE_SELECTED,
40
+ });
@@ -6,11 +6,13 @@ import {
6
6
  CLEAR_SELECTION,
7
7
  CLEAR_PAGE_SELECTION,
8
8
  SET_SELECT_ALL_ROWS_ALL_PAGES,
9
+ TOGGLE_IS_ENTIRE_TABLE_SELECTED,
9
10
  } from './actions';
10
11
 
11
12
  export const initialState = {
12
13
  selectedRows: [],
13
14
  isEntireTableSelected: false,
15
+ isSelectAllEnabled: false,
14
16
  };
15
17
 
16
18
  const selectionsReducer = (state = initialState, action = {}) => {
@@ -21,7 +23,7 @@ const selectionsReducer = (state = initialState, action = {}) => {
21
23
  ...state,
22
24
  selectedRows,
23
25
  };
24
- if (selectedRows.length === action.itemCount) {
26
+ if (state.isSelectAllEnabled || selectedRows.length === action.itemCount) {
25
27
  updatedState.isEntireTableSelected = true;
26
28
  }
27
29
  return updatedState;
@@ -30,16 +32,19 @@ const selectionsReducer = (state = initialState, action = {}) => {
30
32
  return {
31
33
  ...state,
32
34
  isEntireTableSelected: true,
35
+ isSelectAllEnabled: true,
33
36
  };
34
37
  case DELETE_ROW:
35
38
  return {
36
39
  selectedRows: state.selectedRows.filter((row) => row.id !== action.rowId),
37
40
  isEntireTableSelected: false,
41
+ isSelectAllEnabled: false,
38
42
  };
39
43
  case ADD_ROW: {
40
44
  const selectedRows = uniqBy([...state.selectedRows, action.row], row => row.id);
41
45
  const isEntireTableSelected = selectedRows.length === action.itemCount;
42
46
  return {
47
+ ...state,
43
48
  selectedRows,
44
49
  isEntireTableSelected,
45
50
  };
@@ -50,6 +55,12 @@ const selectionsReducer = (state = initialState, action = {}) => {
50
55
  return {
51
56
  isEntireTableSelected: false,
52
57
  selectedRows: state.selectedRows.filter(row => !action.rowIds.includes(row.id)),
58
+ isSelectAllEnabled: false,
59
+ };
60
+ case TOGGLE_IS_ENTIRE_TABLE_SELECTED:
61
+ return {
62
+ ...state,
63
+ isEntireTableSelected: !state.isEntireTableSelected,
53
64
  };
54
65
  default:
55
66
  return state;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/paragon",
3
- "version": "22.16.0",
3
+ "version": "22.16.1",
4
4
  "description": "Accessible, responsive UI component library based on Bootstrap.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -167,76 +167,104 @@ To enable proper selection behavior with backend pagination (i.e., when ``isSele
167
167
 
168
168
  ```jsx live
169
169
  () => {
170
- const PAGINATED_DATA = [
171
- [
172
- {
173
- id: '2baf70d1-42bb-4437-b551-e5fed5a87abe',
174
- title: 'Castle in the Sky',
175
- director: 'Hayao Miyazaki',
176
- producer: 'Isao Takahata',
177
- release_date: 1986,
178
- rt_score: 95,
179
- }, {
180
- id: '12cfb892-aac0-4c5b-94af-521852e46d6a',
181
- title: 'Grave of the Fireflies',
182
- director: 'Isao Takahata',
183
- producer: 'Toru Hara',
184
- release_date: 1988,
185
- rt_score: 97,
186
- },
187
- {
188
- id: '58611129-2dbc-4a81-a72f-77ddfc1b1b49',
189
- title: 'My Neighbor Totoro',
190
- director: 'Hayao Miyazaki',
191
- producer: 'Hayao Miyazaki',
192
- release_date: 1988,
193
- rt_score: 93,
194
- },
195
- ],
196
- [
197
- {
198
- id: 'ea660b10-85c4-4ae3-8a5f-41cea3648e3e',
199
- title: 'Kiki\'s Delivery Service',
200
- director: 'Hayao Miyazaki',
201
- producer: 'Hayao Miyazaki',
202
- release_date: 1989,
203
- rt_score: 96,
204
- },
205
- {
206
- id: '4e236f34-b981-41c3-8c65-f8c9000b94e7',
207
- title: 'Only Yesterday',
208
- director: 'Isao Takahata',
209
- producer: 'Toshio Suzuki',
210
- release_date: 1991,
211
- rt_score: 100,
212
- },
213
- {
214
- id: 'ebbb6b7c-945c-41ee-a792-de0e43191bd8',
215
- title: 'Porco Rosso',
216
- director: 'Hayao Miyazaki',
217
- producer: 'Toshio Suzuki',
218
- release_date: 1992,
219
- rt_score: 94,
220
- },
221
- ],
222
- [
223
- {
224
- id: '1b67aa9a-2e4a-45af-ac98-64d6ad15b16c',
225
- title: 'Pom Poko',
226
- director: 'Isao Takahata',
227
- producer: 'Toshio Suzuki',
228
- release_date: 1994,
229
- rt_score: 78,
230
- },
231
- ],
170
+ const DEFAULT_PAGE_SIZE = 3;
171
+ const DATA = [
172
+ {
173
+ id: '2baf70d1-42bb-4437-b551-e5fed5a87abe',
174
+ title: 'Castle in the Sky',
175
+ director: 'Hayao Miyazaki',
176
+ producer: 'Isao Takahata',
177
+ release_date: 1986,
178
+ rt_score: 95,
179
+ },
180
+ {
181
+ id: '12cfb892-aac0-4c5b-94af-521852e46d6a',
182
+ title: 'Grave of the Fireflies',
183
+ director: 'Isao Takahata',
184
+ producer: 'Toru Hara',
185
+ release_date: 1988,
186
+ rt_score: 97,
187
+ },
188
+ {
189
+ id: '58611129-2dbc-4a81-a72f-77ddfc1b1b49',
190
+ title: 'My Neighbor Totoro',
191
+ director: 'Hayao Miyazaki',
192
+ producer: 'Hayao Miyazaki',
193
+ release_date: 1988,
194
+ rt_score: 93,
195
+ },
196
+ {
197
+ id: 'ea660b10-85c4-4ae3-8a5f-41cea3648e3e',
198
+ title: 'Kiki\'s Delivery Service',
199
+ director: 'Hayao Miyazaki',
200
+ producer: 'Hayao Miyazaki',
201
+ release_date: 1989,
202
+ rt_score: 96,
203
+ },
204
+ {
205
+ id: '4e236f34-b981-41c3-8c65-f8c9000b94e7',
206
+ title: 'Only Yesterday',
207
+ director: 'Isao Takahata',
208
+ producer: 'Toshio Suzuki',
209
+ release_date: 1991,
210
+ rt_score: 100,
211
+ },
212
+ {
213
+ id: 'ebbb6b7c-945c-41ee-a792-de0e43191bd8',
214
+ title: 'Porco Rosso',
215
+ director: 'Hayao Miyazaki',
216
+ producer: 'Toshio Suzuki',
217
+ release_date: 1992,
218
+ rt_score: 94,
219
+ },
220
+ {
221
+ id: '1b67aa9a-2e4a-45af-ac98-64d6ad15b16c',
222
+ title: 'Pom Poko',
223
+ director: 'Isao Takahata',
224
+ producer: 'Toshio Suzuki',
225
+ release_date: 1994,
226
+ rt_score: 78,
227
+ },
232
228
  ];
233
- const [data, setData] = useState(PAGINATED_DATA[0]);
234
- const fetchData = useCallback(
235
- (args) => {
229
+
230
+ function paginateData(data, pageSize = DEFAULT_PAGE_SIZE) {
231
+ if (pageSize <= 0) {
232
+ throw new Error('Invalid page size');
233
+ }
234
+ const pages = [];
235
+ for (let i = 0; i < data.length; i += pageSize) {
236
+ pages.push(data.slice(i, i + pageSize));
237
+ }
238
+ return pages;
239
+ }
240
+
241
+ function filterData(data, filters) {
242
+ return data.filter((item) => filters.every(filter => (
243
+ String(item[filter.id]).toLowerCase().includes(String(filter.value).toLowerCase())
244
+ )));
245
+ }
246
+
247
+ const useDebouncedFetchData = (setData, setTotalItems, setTotalPages, setIsLoading) => useCallback(
248
+ debounce((args) => {
249
+ if (!args) { return; }
250
+ setIsLoading(true);
251
+
236
252
  setTimeout(() => {
237
- setData(PAGINATED_DATA[args.pageIndex]);
253
+ // Filter the data based on the current filters
254
+ const filteredData = filterData(DATA, args.filters);
255
+
256
+ // Paginate the filtered data
257
+ const paginatedData = paginateData(filteredData, args.pageSize);
258
+ const currentPageData = paginatedData[args.pageIndex] || [];
259
+
260
+ // Update the state with the paginated data, total items, and total pages
261
+ setData(currentPageData);
262
+ setTotalItems(filteredData.length);
263
+ setTotalPages(paginatedData.length);
264
+
265
+ setIsLoading(false);
238
266
  }, 1000);
239
- },
267
+ }, 300),
240
268
  [],
241
269
  );
242
270
 
@@ -247,12 +275,18 @@ To enable proper selection behavior with backend pagination (i.e., when ``isSele
247
275
  disableSortBy: true,
248
276
  };
249
277
 
278
+ const [isLoading, setIsLoading] = useState(true);
279
+ const [data, setData] = useState([]);
280
+ const [totalItems, setTotalItems] = useState(0);
281
+ const [totalPages, setTotalPages] = useState(1);
282
+
283
+ const fetchData = useDebouncedFetchData(setData, setTotalItems, setTotalPages, setIsLoading);
284
+
250
285
  const DownloadCSVAction = ({ as: Component, selectedFlatRows, ...rest }) => (
251
286
  <Component onClick={() => console.log('Download CSV', selectedFlatRows, rest)}>
252
287
  Download CSV
253
288
  </Component>
254
289
  );
255
-
256
290
  const ClearAction = ({ as: Component, tableInstance }) => (
257
291
  <Component
258
292
  variant="danger"
@@ -264,9 +298,14 @@ To enable proper selection behavior with backend pagination (i.e., when ``isSele
264
298
  Clear Selection
265
299
  </Component>
266
300
  );
267
-
301
+
268
302
  return (
269
303
  <DataTable
304
+ isLoading={isLoading}
305
+ bulkActions={[
306
+ <DownloadCSVAction />,
307
+ <ClearAction />,
308
+ ]}
270
309
  isSelectable
271
310
  manualSelectColumn={selectColumn}
272
311
  SelectionStatusComponent={DataTable.ControlledSelectionStatus}
@@ -275,17 +314,15 @@ To enable proper selection behavior with backend pagination (i.e., when ``isSele
275
314
  defaultColumnValues={{ Filter: TextFilter }}
276
315
  isPaginated
277
316
  manualPagination
278
- isSortable
279
- manualSortBy
280
317
  initialState={{
281
318
  pageSize: 3,
282
- pageIndex: 0
319
+ pageIndex: 0,
283
320
  }}
284
321
  initialTableOptions={{
285
322
  getRowId: row => row.id,
286
323
  }}
287
- itemCount={7}
288
- pageCount={3}
324
+ itemCount={totalItems}
325
+ pageCount={totalPages}
289
326
  fetchData={fetchData}
290
327
  data={data}
291
328
  columns={[
@@ -302,10 +339,6 @@ To enable proper selection behavior with backend pagination (i.e., when ``isSele
302
339
  accessor: 'release_date',
303
340
  },
304
341
  ]}
305
- bulkActions={[
306
- <DownloadCSVAction />,
307
- <ClearAction />,
308
- ]}
309
342
  />
310
343
  );
311
344
  }
@@ -1,6 +1,7 @@
1
- import { useContext } from 'react';
1
+ import { useContext, useEffect } from 'react';
2
2
  import DataTableContext from './DataTableContext';
3
- import { clearSelectionAction } from './selection/data/actions';
3
+ import { clearSelectionAction, setSelectedRowsAction, toggleIsEntireTableSelected } from './selection/data/actions';
4
+ import { getRowIds, getUnselectedPageRows } from './selection/data/helpers';
4
5
 
5
6
  export const useRows = () => {
6
7
  const {
@@ -39,3 +40,55 @@ export const useSelectionActions = (
39
40
  clearSelection,
40
41
  };
41
42
  };
43
+
44
+ /**
45
+ * Provides business logic around managing selection state, notably for controlled
46
+ * selections with API-driven data.
47
+ *
48
+ */
49
+ export const useDataTableSelections = ({
50
+ selections,
51
+ selectionsDispatch,
52
+ itemCount,
53
+ selectedRows,
54
+ page,
55
+ isAllPageRowsSelected,
56
+ }) => {
57
+ // If "Select all" is explicitly opted in by the user, ensure that all unselected rows are selected
58
+ // when the user navigates to a new page.
59
+ useEffect(
60
+ () => {
61
+ if (selections.isSelectAllEnabled && (itemCount > selectedRows.length || !isAllPageRowsSelected)) {
62
+ const selectedRowIds = getRowIds(selectedRows);
63
+ const unselectedPageRows = getUnselectedPageRows(selectedRowIds, page);
64
+ if (unselectedPageRows.length) {
65
+ selectionsDispatch(setSelectedRowsAction(unselectedPageRows, itemCount));
66
+ }
67
+ }
68
+ },
69
+ [selectedRows, itemCount, page, selectionsDispatch, selections.isSelectAllEnabled, isAllPageRowsSelected],
70
+ );
71
+
72
+ // When `selections.isSelectAllEnabled` is true, ensure `selections.isEntireTableSelected` is true.
73
+ useEffect(() => {
74
+ if (selections.isSelectAllEnabled && !selections.isEntireTableSelected) {
75
+ selectionsDispatch(toggleIsEntireTableSelected());
76
+ }
77
+ }, [selectionsDispatch, selections.isEntireTableSelected, selections.isSelectAllEnabled]);
78
+
79
+ // When `selections.isSelectAllEnabled` differs from `selections.isEntireTableSelected` and
80
+ // `isAllPageRowsSelected` matches `selections.isSelectAllEnabled`, toggle `selections.isEntireTableSelected`.
81
+ useEffect(() => {
82
+ if (!selections.isSelectAllEnabled && selections.isEntireTableSelected && !isAllPageRowsSelected) {
83
+ selectionsDispatch(toggleIsEntireTableSelected());
84
+ }
85
+ if (selections.isSelectAllEnabled && !selections.isEntireTableSelected && isAllPageRowsSelected) {
86
+ selectionsDispatch(toggleIsEntireTableSelected());
87
+ }
88
+ }, [
89
+ selectionsDispatch,
90
+ isAllPageRowsSelected,
91
+ selections.isEntireTableSelected,
92
+ selections.isSelectAllEnabled,
93
+ ]);
94
+ };
@@ -33,8 +33,10 @@ import DataTableLayout from './DataTableLayout';
33
33
  import ExpandAll from './ExpandAll';
34
34
  import ExpandRow from './ExpandRow';
35
35
 
36
- import { useSelectionActions } from './hooks';
37
- import selectionsReducer, { initialState as initialSelectionsState } from './selection/data/reducer';
36
+ import { useDataTableSelections, useSelectionActions } from './hooks';
37
+ import selectionsReducer, {
38
+ initialState as initialSelectionsState,
39
+ } from './selection/data/reducer';
38
40
 
39
41
  function DataTable({
40
42
  columns, data, defaultColumnValues, additionalColumns, isSelectable,
@@ -79,12 +81,13 @@ function DataTable({
79
81
  selectedRowIds: {},
80
82
  };
81
83
  }
82
- /* Note: We override the `toggleRowSelected` action from react-table
83
- because we need to preserve the order of the selected rows.
84
- While `selectedRowIds` is an object that contains the selected rows as key-value pairs,
85
- it does not maintain the order of selection. Therefore, we have added the `selectedRowsOrdered` property
86
- to keep track of the order in which the rows were selected.
87
- */
84
+ /**
85
+ * Note: We override the `toggleRowSelected` action from react-table
86
+ * because we need to preserve the order of the selected rows.
87
+ * while `selectedRowIds` is an object that contains the selected rows as key-value pairs,
88
+ * it does not maintain the order of selection. Therefore, we have added the `selectedRowsOrdered` property
89
+ * to keep track of the order in which the rows were selected.
90
+ */
88
91
  case 'toggleRowSelected': {
89
92
  const rowIndex = parseInt(action.id, 10);
90
93
  const { selectedRowsOrdered = [] } = previousState;
@@ -185,6 +188,15 @@ function DataTable({
185
188
 
186
189
  const selectionActions = useSelectionActions(instance, controlledTableSelections);
187
190
 
191
+ useDataTableSelections({
192
+ selections,
193
+ selectionsDispatch,
194
+ itemCount,
195
+ selectedRows,
196
+ page: instance.page,
197
+ isAllPageRowsSelected: instance.isAllPageRowsSelected,
198
+ });
199
+
188
200
  const enhancedInstance = {
189
201
  ...instance,
190
202
  manualFilters,
@@ -216,12 +228,12 @@ function DataTable({
216
228
  })}
217
229
  >
218
230
  {children || (
219
- <>
220
- <TableControlBar />
221
- <Table />
222
- <EmptyTableComponent content="No results found" />
223
- <TableFooter />
224
- </>
231
+ <>
232
+ <TableControlBar />
233
+ <Table />
234
+ <EmptyTableComponent content="No results found" />
235
+ <TableFooter />
236
+ </>
225
237
  )}
226
238
  </div>
227
239
  </DataTableLayout>
@@ -328,7 +340,7 @@ DataTable.propTypes = {
328
340
  Cell: PropTypes.oneOfType([PropTypes.elementType, PropTypes.node]),
329
341
  })),
330
342
  /** Function that will fetch table data. Called when page size, page index or filters change.
331
- * Meant to be used with manual filters and pagination */
343
+ * Meant to be used with manual filters and pagination */
332
344
  fetchData: PropTypes.func,
333
345
  /** Initial state passed to react-table's documentation https://github.com/TanStack/table/blob/v7/docs/src/pages/docs/api/useTable.md */
334
346
  initialState: PropTypes.shape({
@@ -340,7 +352,7 @@ DataTable.propTypes = {
340
352
  selectedRowsOrdered: PropTypes.arrayOf(PropTypes.number),
341
353
  }),
342
354
  /** Table options passed to react-table's useTable hook. Will override some options passed in to DataTable, such
343
- as: data, columns, defaultColumn, manualFilters, manualPagination, manualSortBy, and initialState */
355
+ as: data, columns, defaultColumn, manualFilters, manualPagination, manualSortBy, and initialState */
344
356
  initialTableOptions: PropTypes.shape({}),
345
357
  /** Actions to be performed on the table. Called with the table instance. Not displayed if rows are selected. */
346
358
  itemCount: PropTypes.number.isRequired,
@@ -1,4 +1,4 @@
1
- import React, { useContext, useEffect } from 'react';
1
+ import React, { useContext } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
 
4
4
  import DataTableContext from '../DataTableContext';
@@ -7,34 +7,19 @@ import BaseSelectionStatus from './BaseSelectionStatus';
7
7
  import {
8
8
  clearSelectionAction,
9
9
  setSelectAllRowsAllPagesAction,
10
- setSelectedRowsAction,
11
10
  } from './data/actions';
12
- import {
13
- getUnselectedPageRows,
14
- getRowIds,
15
- } from './data/helpers';
16
11
 
17
12
  function ControlledSelectionStatus({ className, clearSelectionText }) {
18
13
  const {
19
14
  itemCount,
20
15
  page,
21
- controlledTableSelections: [{ selectedRows, isEntireTableSelected }, dispatch],
16
+ controlledTableSelections: [
17
+ { selectedRows, isSelectAllEnabled },
18
+ selectionsDispatch,
19
+ ],
22
20
  } = useContext(DataTableContext);
23
21
 
24
- useEffect(
25
- () => {
26
- if (isEntireTableSelected) {
27
- const selectedRowIds = getRowIds(selectedRows);
28
- const unselectedPageRows = getUnselectedPageRows(selectedRowIds, page);
29
- if (unselectedPageRows.length) {
30
- dispatch(setSelectedRowsAction(unselectedPageRows, itemCount));
31
- }
32
- }
33
- },
34
- [isEntireTableSelected, selectedRows, itemCount, page, dispatch],
35
- );
36
-
37
- const numSelectedRows = isEntireTableSelected ? itemCount : selectedRows.length;
22
+ const numSelectedRows = itemCount === selectedRows.length || isSelectAllEnabled ? itemCount : selectedRows.length;
38
23
  const numSelectedRowsOnPage = (page || []).filter(r => r.isSelected).length;
39
24
 
40
25
  const selectionStatusProps = {
@@ -42,8 +27,8 @@ function ControlledSelectionStatus({ className, clearSelectionText }) {
42
27
  numSelectedRows,
43
28
  numSelectedRowsOnPage,
44
29
  clearSelectionText,
45
- onSelectAll: () => dispatch(setSelectAllRowsAllPagesAction()),
46
- onClear: () => dispatch(clearSelectionAction()),
30
+ onSelectAll: () => selectionsDispatch(setSelectAllRowsAllPagesAction()),
31
+ onClear: () => selectionsDispatch(clearSelectionAction()),
47
32
  };
48
33
  return <BaseSelectionStatus {...selectionStatusProps} />;
49
34
  }
@@ -33,3 +33,8 @@ export const clearPageSelectionAction = (rowIds) => ({
33
33
  type: CLEAR_PAGE_SELECTION,
34
34
  rowIds,
35
35
  });
36
+
37
+ export const TOGGLE_IS_ENTIRE_TABLE_SELECTED = 'TOGGLE IS ENTIRE TABLE SELECTED';
38
+ export const toggleIsEntireTableSelected = () => ({
39
+ type: TOGGLE_IS_ENTIRE_TABLE_SELECTED,
40
+ });
@@ -6,11 +6,13 @@ import {
6
6
  CLEAR_SELECTION,
7
7
  CLEAR_PAGE_SELECTION,
8
8
  SET_SELECT_ALL_ROWS_ALL_PAGES,
9
+ TOGGLE_IS_ENTIRE_TABLE_SELECTED,
9
10
  } from './actions';
10
11
 
11
12
  export const initialState = {
12
13
  selectedRows: [],
13
14
  isEntireTableSelected: false,
15
+ isSelectAllEnabled: false,
14
16
  };
15
17
 
16
18
  const selectionsReducer = (state = initialState, action = {}) => {
@@ -21,7 +23,7 @@ const selectionsReducer = (state = initialState, action = {}) => {
21
23
  ...state,
22
24
  selectedRows,
23
25
  };
24
- if (selectedRows.length === action.itemCount) {
26
+ if (state.isSelectAllEnabled || selectedRows.length === action.itemCount) {
25
27
  updatedState.isEntireTableSelected = true;
26
28
  }
27
29
  return updatedState;
@@ -30,16 +32,19 @@ const selectionsReducer = (state = initialState, action = {}) => {
30
32
  return {
31
33
  ...state,
32
34
  isEntireTableSelected: true,
35
+ isSelectAllEnabled: true,
33
36
  };
34
37
  case DELETE_ROW:
35
38
  return {
36
39
  selectedRows: state.selectedRows.filter((row) => row.id !== action.rowId),
37
40
  isEntireTableSelected: false,
41
+ isSelectAllEnabled: false,
38
42
  };
39
43
  case ADD_ROW: {
40
44
  const selectedRows = uniqBy([...state.selectedRows, action.row], row => row.id);
41
45
  const isEntireTableSelected = selectedRows.length === action.itemCount;
42
46
  return {
47
+ ...state,
43
48
  selectedRows,
44
49
  isEntireTableSelected,
45
50
  };
@@ -50,6 +55,12 @@ const selectionsReducer = (state = initialState, action = {}) => {
50
55
  return {
51
56
  isEntireTableSelected: false,
52
57
  selectedRows: state.selectedRows.filter(row => !action.rowIds.includes(row.id)),
58
+ isSelectAllEnabled: false,
59
+ };
60
+ case TOGGLE_IS_ENTIRE_TABLE_SELECTED:
61
+ return {
62
+ ...state,
63
+ isEntireTableSelected: !state.isEntireTableSelected,
53
64
  };
54
65
  default:
55
66
  return state;
@@ -4,7 +4,10 @@ import { IntlProvider } from 'react-intl';
4
4
  import userEvent from '@testing-library/user-event';
5
5
 
6
6
  import ControlledSelectionStatus from '../ControlledSelectionStatus';
7
- import { clearSelectionAction, setSelectAllRowsAllPagesAction, setSelectedRowsAction } from '../data/actions';
7
+ import {
8
+ clearSelectionAction,
9
+ setSelectAllRowsAllPagesAction,
10
+ } from '../data/actions';
8
11
  import DataTableContext from '../../DataTableContext';
9
12
  import {
10
13
  SELECT_ALL_TEST_ID,
@@ -88,28 +91,6 @@ describe('<ControlledSelectionStatus />', () => {
88
91
  const selectAllButton = screen.queryByTestId(SELECT_ALL_TEST_ID);
89
92
  expect(selectAllButton).not.toBeInTheDocument();
90
93
  });
91
-
92
- it('selects any unselected page rows', () => {
93
- const selectedRows = Array(instance.itemCount).map((item, index) => ({ id: index + 1 }));
94
- const dispatchSpy = jest.fn();
95
- render(
96
- <ControlledSelectionStatusWrapper
97
- value={{
98
- ...instance,
99
- controlledTableSelections: [
100
- {
101
- selectedRows,
102
- isEntireTableSelected: true,
103
- },
104
- dispatchSpy,
105
- ],
106
- }}
107
- />,
108
- );
109
- expect(dispatchSpy).toHaveBeenCalledTimes(1);
110
- const action = setSelectedRowsAction(instance.page, instance.itemCount);
111
- expect(dispatchSpy).toHaveBeenCalledWith(action);
112
- });
113
94
  });
114
95
 
115
96
  describe('individual rows selected', () => {
@@ -25,6 +25,7 @@ describe('DataTable selections reducer', () => {
25
25
  const action = setSelectedRowsAction(rows, itemCount);
26
26
  const updatedState = selectionsReducer(defaultInitialState, action);
27
27
  expect(updatedState).toEqual({
28
+ ...defaultInitialState,
28
29
  isEntireTableSelected: true,
29
30
  selectedRows: rows,
30
31
  });
@@ -38,6 +39,7 @@ describe('DataTable selections reducer', () => {
38
39
  const updatedState = selectionsReducer(initialState, action);
39
40
  expect(updatedState).toEqual({
40
41
  isEntireTableSelected: true,
42
+ isSelectAllEnabled: true,
41
43
  selectedRows: initialState.selectedRows,
42
44
  });
43
45
  });
@@ -70,6 +72,7 @@ describe('DataTable selections reducer', () => {
70
72
  const action = addSelectedRowAction(row, itemCount);
71
73
  const updatedState = selectionsReducer(defaultInitialState, action);
72
74
  expect(updatedState).toEqual({
75
+ ...defaultInitialState,
73
76
  selectedRows: [row],
74
77
  isEntireTableSelected: true,
75
78
  });
@@ -88,6 +91,7 @@ describe('DataTable selections reducer', () => {
88
91
  const rows = [{ id: 1 }, { id: 2 }, { id: 3 }];
89
92
  const initialState = {
90
93
  ...defaultInitialState,
94
+ isSelectAllEnabled: false,
91
95
  selectedRows: rows,
92
96
  };
93
97
  const action = clearPageSelectionAction([1, 2]);
@@ -1,5 +1,5 @@
1
1
  import React, { useContext } from 'react';
2
- import { render, screen } from '@testing-library/react';
2
+ import { render, screen, waitFor } from '@testing-library/react';
3
3
  import userEvent from '@testing-library/user-event';
4
4
  import * as reactTable from 'react-table';
5
5
  import { IntlProvider } from 'react-intl';
@@ -212,7 +212,6 @@ describe('<DataTable />', () => {
212
212
  pageCount: 3,
213
213
  fetchData: jest.fn(),
214
214
  };
215
-
216
215
  render(<DataTableWrapper {...propsWithSelection} />);
217
216
  const filtersButton = screen.getByRole('button', { name: 'Filters' });
218
217
 
@@ -228,6 +227,10 @@ describe('<DataTable />', () => {
228
227
  // A filtered array is returned from the backend,
229
228
  // and the element counter displays its length.
230
229
  expect(selectAllButton).toHaveTextContent('Select all 7');
230
+
231
+ await userEvent.click(selectAllButton);
232
+
233
+ expect(screen.getByText('All 7 selected')).toBeInTheDocument();
231
234
  });
232
235
 
233
236
  describe('[legacy] controlled table selections', () => {
@@ -242,7 +245,7 @@ describe('<DataTable />', () => {
242
245
 
243
246
  const contextValue = JSON.parse(contextDiv.getAttribute('data-contextvalue'));
244
247
  expect(contextValue.controlledTableSelections).toEqual([
245
- { selectedRows: [], isEntireTableSelected: false },
248
+ { selectedRows: [], isEntireTableSelected: false, isSelectAllEnabled: false },
246
249
  null,
247
250
  ]);
248
251
  });
@@ -312,5 +315,98 @@ describe('<DataTable />', () => {
312
315
  expect(mockOnSelectedRowsChange).toHaveBeenCalledTimes(1);
313
316
  expect(mockOnSelectedRowsChange).toHaveBeenCalledWith({});
314
317
  });
318
+ it('Selects all rows across all pages with ControlledSelectionStatus component', async () => {
319
+ const selectColumn = {
320
+ id: 'selection',
321
+ Header: DataTable.ControlledSelectHeader,
322
+ Cell: DataTable.ControlledSelect,
323
+ disableSortBy: true,
324
+ };
325
+ const propsWithSelection = {
326
+ ...props,
327
+ isPaginated: true,
328
+ isSelectable: true,
329
+ manualSelectColumn: selectColumn,
330
+ SelectionStatusComponent: DataTable.ControlledSelectionStatus,
331
+ initialState: {
332
+ pageIndex: 0,
333
+ pageSize: 2,
334
+ selectedRowIds: {
335
+ 1: true,
336
+ },
337
+ },
338
+ };
339
+ render(<DataTableWrapper {...propsWithSelection} />);
340
+ const selectAllButton = screen.getByTestId('test_selection_state_select_all_button');
341
+
342
+ await userEvent.click(selectAllButton);
343
+
344
+ expect(screen.getByText('All 7 selected')).toBeInTheDocument();
345
+ });
346
+
347
+ it('Select all item rows with ControlledSelectionStatus Component', async () => {
348
+ const selectColumn = {
349
+ id: 'selection',
350
+ Header: DataTable.ControlledSelectHeader,
351
+ Cell: DataTable.ControlledSelect,
352
+ disableSortBy: true,
353
+ };
354
+ const propsWithSelection = {
355
+ ...props,
356
+ isPaginated: true,
357
+ isSelectable: true,
358
+ manualSelectColumn: selectColumn,
359
+ SelectionStatusComponent: DataTable.ControlledSelectionStatus,
360
+ initialState: {
361
+ pageIndex: 0,
362
+ pageSize: 10,
363
+ },
364
+ };
365
+ render(<DataTableWrapper {...propsWithSelection} />);
366
+ const selectAllRowsButton = screen.getByTitle('Toggle All Current Page Rows Selected');
367
+
368
+ await userEvent.click(selectAllRowsButton);
369
+
370
+ expect(screen.getByText('All 7 selected')).toBeInTheDocument();
371
+ });
372
+
373
+ it('Select all item rows individually with ControlledSelectionStatus Component', async () => {
374
+ const selectColumn = {
375
+ id: 'selection',
376
+ Header: DataTable.ControlledSelectHeader,
377
+ Cell: DataTable.ControlledSelect,
378
+ disableSortBy: true,
379
+ };
380
+ const propsWithSelection = {
381
+ ...props,
382
+ isPaginated: true,
383
+ isSelectable: true,
384
+ manualSelectColumn: selectColumn,
385
+ SelectionStatusComponent: DataTable.ControlledSelectionStatus,
386
+ initialState: {
387
+ pageIndex: 0,
388
+ pageSize: 4,
389
+ },
390
+ };
391
+ render(<DataTableWrapper {...propsWithSelection} />);
392
+
393
+ const selectAllRows = () => {
394
+ const selectRowsButtons = screen.getAllByTitle('Toggle Row Selected');
395
+ selectRowsButtons.forEach(async (button) => {
396
+ await userEvent.click(button);
397
+ });
398
+ };
399
+ // Select all page 1
400
+ selectAllRows();
401
+
402
+ // Paginate to page 2
403
+ const nextPageButton2 = screen.getByLabelText('Next, Page 2');
404
+ await userEvent.click(nextPageButton2);
405
+
406
+ // Select all page 2
407
+ selectAllRows();
408
+
409
+ await waitFor(() => expect(screen.getByText('All 7 selected')).toBeInTheDocument());
410
+ });
315
411
  });
316
412
  });