@coveord/plasma-mantine 55.3.3 → 55.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +48 -45
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.d.ts.map +1 -1
  5. package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.js +21 -3
  6. package/dist/cjs/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
  7. package/dist/cjs/components/table/use-table.d.ts +10 -4
  8. package/dist/cjs/components/table/use-table.d.ts.map +1 -1
  9. package/dist/cjs/components/table/use-table.js +184 -12
  10. package/dist/cjs/components/table/use-table.js.map +1 -1
  11. package/dist/cjs/components/table/use-url-synced-state.d.ts +29 -0
  12. package/dist/cjs/components/table/use-url-synced-state.d.ts.map +1 -0
  13. package/dist/cjs/components/table/use-url-synced-state.js +58 -0
  14. package/dist/cjs/components/table/use-url-synced-state.js.map +1 -0
  15. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.d.ts.map +1 -1
  16. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js +15 -2
  17. package/dist/esm/components/date-range-picker/DateRangePickerInlineCalendar.js.map +1 -1
  18. package/dist/esm/components/table/use-table.d.ts +10 -4
  19. package/dist/esm/components/table/use-table.d.ts.map +1 -1
  20. package/dist/esm/components/table/use-table.js +127 -8
  21. package/dist/esm/components/table/use-table.js.map +1 -1
  22. package/dist/esm/components/table/use-url-synced-state.d.ts +29 -0
  23. package/dist/esm/components/table/use-url-synced-state.d.ts.map +1 -0
  24. package/dist/esm/components/table/use-url-synced-state.js +41 -0
  25. package/dist/esm/components/table/use-url-synced-state.js.map +1 -0
  26. package/package.json +8 -8
  27. package/src/components/date-range-picker/DateRangePickerInlineCalendar.tsx +15 -1
  28. package/src/components/date-range-picker/__tests__/DateRangePickerInlineCalendar.spec.tsx +6 -4
  29. package/src/components/table/__tests__/TableColumnsSelector.spec.tsx +51 -0
  30. package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +53 -1
  31. package/src/components/table/__tests__/TableFilter.spec.tsx +43 -0
  32. package/src/components/table/__tests__/TablePagination.spec.tsx +54 -0
  33. package/src/components/table/__tests__/TablePerPage.spec.tsx +55 -0
  34. package/src/components/table/__tests__/TablePredicate.spec.tsx +69 -0
  35. package/src/components/table/__tests__/Th.spec.tsx +35 -0
  36. package/src/components/table/__tests__/use-url-synced-state.unit.spec.ts +113 -0
  37. package/src/components/table/use-table.ts +120 -15
  38. package/src/components/table/use-url-synced-state.ts +70 -0
@@ -0,0 +1,70 @@
1
+ import {useMemo, useState} from 'react';
2
+
3
+ const setSearchParam = (key: string, value: string, initial: string) => {
4
+ const url = new URL(window.location.href);
5
+ if (value === '' || value === initial) {
6
+ url.searchParams.delete(key);
7
+ } else {
8
+ url.searchParams.set(key, value);
9
+ }
10
+ window.history.replaceState(null, '', url.toString());
11
+ };
12
+
13
+ const getSearchParams = (): URLSearchParams => {
14
+ const url = new URL(window.location.href);
15
+ return url.searchParams;
16
+ };
17
+
18
+ export interface UseUrlSyncedStateOptions<T> {
19
+ /**
20
+ * The initial state
21
+ */
22
+ initialState: T;
23
+ /**
24
+ * The serializer function is used to determine how the state is translated to url search parameters.
25
+ * Called each time the state changes.
26
+ * @param stateValue The new state value to serialize.
27
+ * @returns A list of [key, value] to set as url search parameters.
28
+ * @example (filterValue) => [['filter', filterValue]] // ?filter=filterValue
29
+ */
30
+ serializer: (stateValue: T) => Array<[string, string]>;
31
+ /**
32
+ * The deserializer function is used to determine how the url parameters influence the initial state.
33
+ * Called only once when initializing the state.
34
+ * @param params All the search parameters of the current url.
35
+ * @returns The initial state based on the current url.
36
+ * @example (params) => params.get('filter') ?? '',
37
+ */
38
+ deserializer: (params: URLSearchParams) => T;
39
+ /**
40
+ * Whether the state should be synced with the url.
41
+ * When set to false, the hook behaves just like a regular useState hook from react.
42
+ */
43
+ sync?: boolean;
44
+ }
45
+
46
+ export const useUrlSyncedState = <T>({initialState, serializer, deserializer, sync}: UseUrlSyncedStateOptions<T>) => {
47
+ const [state, setState] = useState<T>(sync ? deserializer(getSearchParams()) : initialState);
48
+ const enhancedSetState = useMemo(() => {
49
+ if (sync) {
50
+ const initialSerialized = serializer(initialState).reduce(
51
+ (acc, [key, value]) => {
52
+ acc[key] = value;
53
+ return acc;
54
+ },
55
+ {} as Record<string, string>,
56
+ );
57
+ return (updater: T | ((old: T) => T)) => {
58
+ setState((old) => {
59
+ const newValue = updater instanceof Function ? updater(old) : updater;
60
+ serializer(newValue).forEach(([key, value]) => setSearchParam(key, value, initialSerialized[key]));
61
+ return newValue;
62
+ });
63
+ };
64
+ }
65
+
66
+ return setState;
67
+ }, [sync]);
68
+
69
+ return [state, enhancedSetState] as const;
70
+ };