@axinom/mosaic-ui 0.48.0-rc.2 → 0.48.0-rc.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axinom/mosaic-ui",
3
- "version": "0.48.0-rc.2",
3
+ "version": "0.48.0-rc.4",
4
4
  "description": "UI components for building Axinom Mosaic applications",
5
5
  "author": "Axinom",
6
6
  "license": "PROPRIETARY",
@@ -32,7 +32,7 @@
32
32
  "build-storybook": "storybook build"
33
33
  },
34
34
  "dependencies": {
35
- "@axinom/mosaic-core": "^0.4.21-rc.2",
35
+ "@axinom/mosaic-core": "^0.4.21-rc.4",
36
36
  "@faker-js/faker": "^7.4.0",
37
37
  "@popperjs/core": "^2.11.8",
38
38
  "clsx": "^1.1.0",
@@ -105,5 +105,5 @@
105
105
  "publishConfig": {
106
106
  "access": "public"
107
107
  },
108
- "gitHead": "4918cf4edaf640b1ef1c26aa983bc6a41d691c83"
108
+ "gitHead": "6737982a21ba7ab40c2f337722cb7e1e41a53185"
109
109
  }
@@ -195,7 +195,7 @@ export const Explorer = React.forwardRef(function Explorer<T extends Data>(
195
195
  dataProvider,
196
196
  loadingTriggerOffset,
197
197
 
198
- enableSelectAll,
198
+ enableSelectAll = true,
199
199
  modalMode = false,
200
200
  className = '',
201
201
 
@@ -254,6 +254,7 @@ export const Explorer = React.forwardRef(function Explorer<T extends Data>(
254
254
  data,
255
255
  isLoading,
256
256
  resultCount,
257
+ hasMoreData,
257
258
  onReloadData,
258
259
  onRequestMoreData,
259
260
  onFiltersChange,
@@ -463,6 +464,7 @@ export const Explorer = React.forwardRef(function Explorer<T extends Data>(
463
464
  showActionButton={Boolean(generateItemLink) || Boolean(onItemClicked)} // or hard code to `true`?
464
465
  selectionMode={mode}
465
466
  enableSelectAll={enableSelectAll}
467
+ enableSelectAllDeselect={enableSelectAll && !hasMoreData}
466
468
  loadingTriggerOffset={loadingTriggerOffset}
467
469
  defaultSortOrder={sortOrder}
468
470
  generateItemLink={generateItemLink}
@@ -22,6 +22,7 @@ import { StationMessage } from './useStationMessage';
22
22
  interface DataProviderReturnType<T> {
23
23
  readonly isLoading: boolean;
24
24
  readonly resultCount: ResultCounts;
25
+ readonly hasMoreData: boolean;
25
26
  readonly onReloadData: () => void;
26
27
  readonly onSortChanged: (sort: SortData<T>) => void;
27
28
  readonly onFiltersChange: (filters: FilterValues<T>) => void;
@@ -184,6 +185,7 @@ export function useDataProvider<T extends Data>({
184
185
  onFiltersChange,
185
186
  onRequestMoreData,
186
187
  data,
188
+ hasMoreData: hasMoreData.current,
187
189
  } as const;
188
190
  }
189
191
 
@@ -71,8 +71,10 @@ export interface ListProps<T extends Data> {
71
71
  * If 'Multi' is selected, a checkbox will be rendered for the header and each row of data
72
72
  */
73
73
  selectionMode?: ListSelectMode;
74
- /** In multiselect mode, whether the Select All button will be displayed. When Select All button is clicked the onItemClicked button will return a filter query instead of an array of items. (default: true) */
74
+ /** In multiselect mode, whether the Select All button will be displayed. When Select All button is clicked the onItemClicked button will return SELECT_ALL instead of an array of items. (default: true) */
75
75
  enableSelectAll?: boolean;
76
+ /** Sets whether deselection should be allowed in multiselect mode when select all is enabled. This would allow the user to deselect items after select all checkbox is checked. Once an item is deselected, the list will switch to a SINGLE_ITEMS selection mode. */
77
+ enableSelectAllDeselect?: boolean;
76
78
  /**
77
79
  * Defines whether an action button will be rendered (default: true)
78
80
  * Will not render if selectMode is not 'None'
@@ -131,6 +133,7 @@ const ListRenderer = <T extends Data>(
131
133
  defaultSortOrder,
132
134
  selectionMode = ListSelectMode.None,
133
135
  enableSelectAll = true,
136
+ enableSelectAllDeselect = false,
134
137
  onItemClicked = noop,
135
138
  onItemSelected = noop,
136
139
  onRequestMoreData = noop,
@@ -172,13 +175,20 @@ const ListRenderer = <T extends Data>(
172
175
  const itemSelectionHandler = useCallback(
173
176
  (items: ListItem<T>[]) => {
174
177
  const selectedData: T[] = items.map(({ data }) => data);
178
+ if (enableSelectAllDeselect) {
179
+ if (items.length === listItems.length) {
180
+ isAllItemsChecked.current = true;
181
+ } else {
182
+ isAllItemsChecked.current = false;
183
+ }
184
+ }
175
185
  onItemSelected &&
176
186
  onItemSelected({
177
187
  mode: 'SINGLE_ITEMS',
178
188
  items: selectedData,
179
189
  });
180
190
  },
181
- [onItemSelected],
191
+ [enableSelectAllDeselect, listItems.length, onItemSelected],
182
192
  );
183
193
 
184
194
  const headerCheckboxHandler = useCallback(
@@ -206,12 +216,15 @@ const ListRenderer = <T extends Data>(
206
216
  [onItemSelected],
207
217
  );
208
218
 
209
- const itemSelectedHandler = (selected: boolean, index: number): void => {
210
- const items = [...listItems];
211
- items[index].selected = selected;
212
- setListItems(items);
213
- itemSelectionHandler(items.filter((item) => item.selected === true));
214
- };
219
+ const itemSelectedHandler = useCallback(
220
+ (selected: boolean, index: number): void => {
221
+ const items = [...listItems];
222
+ items[index].selected = selected;
223
+ setListItems(items);
224
+ itemSelectionHandler(items.filter((item) => item.selected === true));
225
+ },
226
+ [itemSelectionHandler, listItems],
227
+ );
215
228
 
216
229
  const onTriggeredHandler = (): void => {
217
230
  if (!isLoading && !isError) {
@@ -277,7 +290,9 @@ const ListRenderer = <T extends Data>(
277
290
  itemSelected={item.selected}
278
291
  isTrigger={isTrigger<T>(index, listItems, loadingTriggerOffset)}
279
292
  isRowDisabled={
280
- isAllItemsChecked.current && selectionMode === ListSelectMode.Multi
293
+ isAllItemsChecked.current &&
294
+ !enableSelectAllDeselect &&
295
+ selectionMode === ListSelectMode.Multi
281
296
  }
282
297
  columnSizes={columnSizes}
283
298
  columnGap={columnGap}