@coveord/plasma-mantine 55.5.1 → 55.6.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 (28) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/.turbo/turbo-test.log +49 -49
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/cjs/components/table/index.d.ts +1 -1
  5. package/dist/cjs/components/table/index.d.ts.map +1 -1
  6. package/dist/cjs/components/table/index.js.map +1 -1
  7. package/dist/cjs/components/table/use-table.d.ts.map +1 -1
  8. package/dist/cjs/components/table/use-table.js +177 -162
  9. package/dist/cjs/components/table/use-table.js.map +1 -1
  10. package/dist/cjs/components/table/use-url-synced-state.d.ts +8 -4
  11. package/dist/cjs/components/table/use-url-synced-state.d.ts.map +1 -1
  12. package/dist/cjs/components/table/use-url-synced-state.js +94 -67
  13. package/dist/cjs/components/table/use-url-synced-state.js.map +1 -1
  14. package/dist/esm/components/table/index.d.ts +1 -1
  15. package/dist/esm/components/table/index.d.ts.map +1 -1
  16. package/dist/esm/components/table/index.js.map +1 -1
  17. package/dist/esm/components/table/use-table.d.ts.map +1 -1
  18. package/dist/esm/components/table/use-table.js +116 -95
  19. package/dist/esm/components/table/use-table.js.map +1 -1
  20. package/dist/esm/components/table/use-url-synced-state.d.ts +8 -4
  21. package/dist/esm/components/table/use-url-synced-state.d.ts.map +1 -1
  22. package/dist/esm/components/table/use-url-synced-state.js +59 -44
  23. package/dist/esm/components/table/use-url-synced-state.js.map +1 -1
  24. package/package.json +1 -1
  25. package/src/components/table/__tests__/use-url-synced-state.unit.spec.ts +2 -1
  26. package/src/components/table/index.ts +1 -1
  27. package/src/components/table/use-table.ts +109 -79
  28. package/src/components/table/use-url-synced-state.ts +79 -64
@@ -12,36 +12,13 @@ var _instanceof = require("@swc/helpers/_/_instanceof");
12
12
  var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array");
13
13
  var _react = require("react");
14
14
  /**
15
- * Iterates over the `SearchParamEntry` values, and applies them to `target`, optionally filtering values.
15
+ * Get the index of the ? in a URL that denotes the start of the "search".
16
+ * Performs a nested search for '#/', to detect hash router urls and take the params of the hash in that case.
16
17
  *
17
- * @param target The target to write values to, can be a Map (for the initial values) or `URLSearchParams`.
18
- * @param entries The entries to apply (as returned by the serializer).
19
- * @param filter Optional filter that allows to treat non-empty values as empty (e.g. to not set default values).
20
- */ var applyValues = function(target, entries, filter) {
21
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
22
- try {
23
- for(var _iterator = entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
24
- var entry = _step.value;
25
- if (entry[1] && filter(entry)) {
26
- target.set(entry[0], entry[1]);
27
- } else {
28
- target.delete(entry[0]);
29
- }
30
- }
31
- } catch (err) {
32
- _didIteratorError = true;
33
- _iteratorError = err;
34
- } finally{
35
- try {
36
- if (!_iteratorNormalCompletion && _iterator.return != null) {
37
- _iterator.return();
38
- }
39
- } finally{
40
- if (_didIteratorError) {
41
- throw _iteratorError;
42
- }
43
- }
44
- }
18
+ * @param url The URL to search.
19
+ * @returns The location of the question mark, or `-1` if not found.
20
+ */ var indexOfSearch = function(url) {
21
+ return url.indexOf('?', url.indexOf('#/') + 1);
45
22
  };
46
23
  /**
47
24
  * Read the **current** search params from `window.location`, with support for detecting React's HashRouter.
@@ -50,53 +27,103 @@ var _react = require("react");
50
27
  * @returns The `URLSearchParams` instance, and a function that can be used to get an updated href.
51
28
  */ var getSearchParams = function() {
52
29
  var href = window.location.href;
53
- // Search for '#/' to detect hash router urls
54
- var searchStart = href.indexOf('?', href.indexOf('#/') + 1);
55
- var params = new URLSearchParams(searchStart < 0 ? '' : href.substring(searchStart));
56
- return [
57
- params,
58
- function() {
59
- var result = searchStart < 0 ? href : href.substring(0, searchStart);
60
- if (params.size > 0) {
61
- result = result.concat('?', params.toString());
62
- }
63
- return result;
64
- }
65
- ];
30
+ var searchStart = indexOfSearch(href);
31
+ return new URLSearchParams(searchStart < 0 ? undefined : href.substring(searchStart));
32
+ };
33
+ /**
34
+ * Apply the search params to the current location, using `replaceState` (no navigation history).
35
+ * Note that only parameters in the `params` argument will be set, any other current params will be removed.
36
+ *
37
+ * @param params The parameters to apply.
38
+ */ var applySearchParams = function(params) {
39
+ var currentHref = window.location.href;
40
+ var index = indexOfSearch(currentHref);
41
+ var nextHref = index < 0 ? currentHref : currentHref.substring(0, index);
42
+ if (params.size > 0) {
43
+ nextHref = nextHref.concat('?', params.toString());
44
+ }
45
+ if (nextHref !== currentHref) {
46
+ window.history.replaceState(null, '', nextHref);
47
+ }
48
+ };
49
+ var getInitialState = function(options) {
50
+ return _instanceof._(options.initialState, Function) ? options.initialState() : options.initialState;
66
51
  };
67
52
  var useUrlSyncedState = function(options) {
68
53
  var sync = options.sync !== false;
69
- var initialState = (0, _react.useMemo)(function() {
70
- return sync ? options.deserializer(getSearchParams()[0]) : options.initialState;
71
- }, [
72
- options.initialState,
73
- options.sync
74
- ]);
75
- var _useState = _sliced_to_array._((0, _react.useState)(initialState), 2), state = _useState[0], setState = _useState[1];
76
- // Capture the initial state as a map, to compare values and not set them if they match.
54
+ var _useState = _sliced_to_array._((0, _react.useState)(function() {
55
+ var initialState = getInitialState(options);
56
+ return sync ? options.deserializer(getSearchParams(), initialState) : initialState;
57
+ }), 2), state = _useState[0], setState = _useState[1];
58
+ // Capture the initial state as a map (first render only!), to compare values and see if they should be set to the params.
77
59
  var initialStateSerialized = (0, _react.useMemo)(function() {
78
- var v = new Map();
79
- applyValues(v, options.serializer(options.initialState), function(_) {
80
- return true;
81
- });
82
- return v;
83
- }, [
84
- initialState,
85
- options.serializer
86
- ]);
60
+ var stateMap = new Map();
61
+ var initialize = null;
62
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
63
+ try {
64
+ for(var _iterator = options.serializer(getInitialState(options))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
65
+ var _step_value = _sliced_to_array._(_step.value, 3), key = _step_value[0], value = _step_value[1], alwaysEmit = _step_value[2];
66
+ stateMap.set(key, value);
67
+ if (alwaysEmit && value) {
68
+ initialize !== null && initialize !== void 0 ? initialize : initialize = getSearchParams();
69
+ initialize.set(key, value);
70
+ }
71
+ }
72
+ } catch (err) {
73
+ _didIteratorError = true;
74
+ _iteratorError = err;
75
+ } finally{
76
+ try {
77
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
78
+ _iterator.return();
79
+ }
80
+ } finally{
81
+ if (_didIteratorError) {
82
+ throw _iteratorError;
83
+ }
84
+ }
85
+ }
86
+ if (initialize) {
87
+ applySearchParams(initialize);
88
+ }
89
+ return stateMap;
90
+ }, []);
87
91
  var enhancedSetState = (0, _react.useMemo)(function() {
88
- return sync ? function(updater) {
92
+ if (!sync) {
93
+ return setState;
94
+ }
95
+ return function(updater) {
89
96
  setState(function(old) {
90
- var _getSearchParams = _sliced_to_array._(getSearchParams(), 2), search = _getSearchParams[0], getUrl = _getSearchParams[1];
91
97
  var newValue = _instanceof._(updater, Function) ? updater(old) : updater;
92
- applyValues(search, options.serializer(newValue), function(param) {
93
- var _param = _sliced_to_array._(param, 2), key = _param[0], value = _param[1];
94
- return initialStateSerialized.get(key) !== value;
95
- });
96
- window.history.replaceState(null, '', getUrl());
98
+ var search = getSearchParams();
99
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
100
+ try {
101
+ for(var _iterator = options.serializer(newValue)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
102
+ var _step_value = _sliced_to_array._(_step.value, 3), key = _step_value[0], value = _step_value[1], alwaysEmit = _step_value[2];
103
+ if (value && (alwaysEmit || !Object.is(initialStateSerialized.get(key), value))) {
104
+ search.set(key, value);
105
+ } else {
106
+ search.delete(key);
107
+ }
108
+ }
109
+ } catch (err) {
110
+ _didIteratorError = true;
111
+ _iteratorError = err;
112
+ } finally{
113
+ try {
114
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
115
+ _iterator.return();
116
+ }
117
+ } finally{
118
+ if (_didIteratorError) {
119
+ throw _iteratorError;
120
+ }
121
+ }
122
+ }
123
+ applySearchParams(search);
97
124
  return newValue;
98
125
  });
99
- } : setState;
126
+ };
100
127
  }, [
101
128
  sync
102
129
  ]);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/table/use-url-synced-state.ts"],"sourcesContent":["import {Dispatch, SetStateAction, useMemo, useState} from 'react';\n\n/**\n * A search param entry defines the key (index 0) and value (index 1) of a search parameter.\n */\nexport type SearchParamEntry = [string, string | null | undefined];\n\n/**\n * Iterates over the `SearchParamEntry` values, and applies them to `target`, optionally filtering values.\n *\n * @param target The target to write values to, can be a Map (for the initial values) or `URLSearchParams`.\n * @param entries The entries to apply (as returned by the serializer).\n * @param filter Optional filter that allows to treat non-empty values as empty (e.g. to not set default values).\n */\nconst applyValues = (\n target: Map<string, string> | URLSearchParams,\n entries: Iterable<SearchParamEntry>,\n filter: (entry: Readonly<SearchParamEntry>) => boolean,\n): void => {\n for (const entry of entries) {\n if (entry[1] && filter(entry)) {\n target.set(entry[0], entry[1]);\n } else {\n target.delete(entry[0]);\n }\n }\n};\n\n/**\n * Read the **current** search params from `window.location`, with support for detecting React's HashRouter.\n * Also returns a method that will yield the href (string) value, after any changes made on the params object.\n *\n * @returns The `URLSearchParams` instance, and a function that can be used to get an updated href.\n */\nconst getSearchParams = (): [URLSearchParams, () => string] => {\n const href = window.location.href;\n // Search for '#/' to detect hash router urls\n const searchStart = href.indexOf('?', href.indexOf('#/') + 1);\n const params = new URLSearchParams(searchStart < 0 ? '' : href.substring(searchStart));\n return [\n params,\n () => {\n let result = searchStart < 0 ? href : href.substring(0, searchStart);\n if (params.size > 0) {\n result = result.concat('?', params.toString());\n }\n return result;\n },\n ];\n};\n\nexport interface UseUrlSyncedStateOptions<T> {\n /**\n * The initial state to use, if there would be no search params to deserialize from.\n * These values are also treated as defaults, and if the current state matches the initialState,\n * no value will be written to the search params.\n */\n initialState: T extends object ? Readonly<T> : T;\n /**\n * The serializer function is used to determine how the state is translated to url search parameters.\n * Called each time the state changes.\n * Note that the serializer should always return entries for keys it controls, also if the current value is \"unset\" (`null` or empty).\n * This ensures params get removed from the search when they are being unset.\n *\n * @param stateValue The new state value to serialize.\n * @returns An iterable of `[key, value]` to set as url search parameters.\n * @example (filterValue) => [['filter', filterValue]] // ?filter=filterValue\n */\n serializer: (stateValue: T) => Iterable<SearchParamEntry>;\n /**\n * The deserializer function is used to determine how the url parameters influence the initial state.\n * May return a partial state, values that are not deserialed are taken from the `initialState`.\n * Called only once when initializing the state.\n * @param params All the search parameters of the current url.\n * @returns The initial state based on the current url.\n * @example (params) => params.get('filter') ?? '',\n */\n deserializer: (params: URLSearchParams) => T;\n /**\n * Whether the state should be synced with the url, defaults to `true`.\n * When set to `false`, the hook behaves just like a regular `useState` hook from react.\n */\n sync?: boolean;\n}\n\nexport const useUrlSyncedState = <T>(options: UseUrlSyncedStateOptions<T>) => {\n const sync = options.sync !== false;\n const initialState = useMemo(\n () => (sync ? options.deserializer(getSearchParams()[0]) : options.initialState),\n [options.initialState, options.sync],\n );\n const [state, setState] = useState<T>(initialState);\n // Capture the initial state as a map, to compare values and not set them if they match.\n const initialStateSerialized = useMemo(() => {\n const v = new Map<string, string>();\n applyValues(v, options.serializer(options.initialState), (_) => true);\n return v;\n }, [initialState, options.serializer]);\n const enhancedSetState = useMemo<Dispatch<SetStateAction<T>>>(\n () =>\n sync\n ? (updater: SetStateAction<T>) => {\n setState((old) => {\n const [search, getUrl] = getSearchParams();\n const newValue = updater instanceof Function ? updater(old) : updater;\n applyValues(\n search,\n options.serializer(newValue),\n ([key, value]) => initialStateSerialized.get(key) !== value,\n );\n window.history.replaceState(null, '', getUrl());\n return newValue;\n });\n }\n : setState,\n [sync],\n );\n\n return [state, enhancedSetState] as const;\n};\n"],"names":["useUrlSyncedState","applyValues","target","entries","filter","entry","set","delete","getSearchParams","href","window","location","searchStart","indexOf","params","URLSearchParams","substring","result","size","concat","toString","options","sync","initialState","useMemo","deserializer","useState","state","setState","initialStateSerialized","v","Map","serializer","_","enhancedSetState","updater","old","search","getUrl","newValue","Function","key","value","get","history","replaceState"],"mappings":";;;;+BAqFaA;;;eAAAA;;;;;qBArF6C;AAO1D;;;;;;CAMC,GACD,IAAMC,cAAc,SAChBC,QACAC,SACAC;QAEK,kCAAA,2BAAA;;QAAL,QAAK,YAAeD,4BAAf,SAAA,6BAAA,QAAA,yBAAA,iCAAwB;YAAxB,IAAME,QAAN;YACD,IAAIA,KAAK,CAAC,EAAE,IAAID,OAAOC,QAAQ;gBAC3BH,OAAOI,GAAG,CAACD,KAAK,CAAC,EAAE,EAAEA,KAAK,CAAC,EAAE;YACjC,OAAO;gBACHH,OAAOK,MAAM,CAACF,KAAK,CAAC,EAAE;YAC1B;QACJ;;QANK;QAAA;;;iBAAA,6BAAA;gBAAA;;;gBAAA;sBAAA;;;;AAOT;AAEA;;;;;CAKC,GACD,IAAMG,kBAAkB;IACpB,IAAMC,OAAOC,OAAOC,QAAQ,CAACF,IAAI;IACjC,6CAA6C;IAC7C,IAAMG,cAAcH,KAAKI,OAAO,CAAC,KAAKJ,KAAKI,OAAO,CAAC,QAAQ;IAC3D,IAAMC,SAAS,IAAIC,gBAAgBH,cAAc,IAAI,KAAKH,KAAKO,SAAS,CAACJ;IACzE,OAAO;QACHE;QACA;YACI,IAAIG,SAASL,cAAc,IAAIH,OAAOA,KAAKO,SAAS,CAAC,GAAGJ;YACxD,IAAIE,OAAOI,IAAI,GAAG,GAAG;gBACjBD,SAASA,OAAOE,MAAM,CAAC,KAAKL,OAAOM,QAAQ;YAC/C;YACA,OAAOH;QACX;KACH;AACL;AAoCO,IAAMjB,oBAAoB,SAAIqB;IACjC,IAAMC,OAAOD,QAAQC,IAAI,KAAK;IAC9B,IAAMC,eAAeC,IAAAA,cAAO,EACxB;eAAOF,OAAOD,QAAQI,YAAY,CAACjB,iBAAiB,CAAC,EAAE,IAAIa,QAAQE,YAAY;OAC/E;QAACF,QAAQE,YAAY;QAAEF,QAAQC,IAAI;KAAC;IAExC,IAA0BI,+BAAAA,IAAAA,eAAQ,EAAIH,mBAA/BI,QAAmBD,cAAZE,WAAYF;IAC1B,wFAAwF;IACxF,IAAMG,yBAAyBL,IAAAA,cAAO,EAAC;QACnC,IAAMM,IAAI,IAAIC;QACd9B,YAAY6B,GAAGT,QAAQW,UAAU,CAACX,QAAQE,YAAY,GAAG,SAACU;mBAAM;;QAChE,OAAOH;IACX,GAAG;QAACP;QAAcF,QAAQW,UAAU;KAAC;IACrC,IAAME,mBAAmBV,IAAAA,cAAO,EAC5B;eACIF,OACM,SAACa;YACGP,SAAS,SAACQ;gBACN,IAAyB5B,sCAAAA,uBAAlB6B,SAAkB7B,qBAAV8B,SAAU9B;gBACzB,IAAM+B,WAAWJ,AAAO,aAAYK,CAAnBL,SAAmBK,YAAWL,QAAQC,OAAOD;gBAC9DlC,YACIoC,QACAhB,QAAQW,UAAU,CAACO,WACnB;+DAAEE,iBAAKC;2BAAWb,uBAAuBc,GAAG,CAACF,SAASC;;gBAE1DhC,OAAOkC,OAAO,CAACC,YAAY,CAAC,MAAM,IAAIP;gBACtC,OAAOC;YACX;QACJ,IACAX;OACV;QAACN;KAAK;IAGV,OAAO;QAACK;QAAOO;KAAiB;AACpC"}
1
+ {"version":3,"sources":["../../../../src/components/table/use-url-synced-state.ts"],"sourcesContent":["import {Dispatch, SetStateAction, useMemo, useState} from 'react';\n\n/**\n * A search param entry defines the encoded value of a search parameter as `[key, value, alwaysEmit?]`.\n * The third entry is an optional boolean that defaults to `false`.\n * Setting `alwaysEmit` to `true` means any non-nullish value is always written to the search params,\n * even if it matches the initial value. It is also written on initialization.\n */\nexport type SearchParamEntry = [string, string | null | undefined, boolean?];\n\n/**\n * Get the index of the ? in a URL that denotes the start of the \"search\".\n * Performs a nested search for '#/', to detect hash router urls and take the params of the hash in that case.\n *\n * @param url The URL to search.\n * @returns The location of the question mark, or `-1` if not found.\n */\nconst indexOfSearch = (url: string): number => url.indexOf('?', url.indexOf('#/') + 1);\n\n/**\n * Read the **current** search params from `window.location`, with support for detecting React's HashRouter.\n * Also returns a method that will yield the href (string) value, after any changes made on the params object.\n *\n * @returns The `URLSearchParams` instance, and a function that can be used to get an updated href.\n */\nconst getSearchParams = (): URLSearchParams => {\n const href = window.location.href;\n const searchStart = indexOfSearch(href);\n return new URLSearchParams(searchStart < 0 ? undefined : href.substring(searchStart));\n};\n\n/**\n * Apply the search params to the current location, using `replaceState` (no navigation history).\n * Note that only parameters in the `params` argument will be set, any other current params will be removed.\n *\n * @param params The parameters to apply.\n */\nconst applySearchParams = (params: URLSearchParams): void => {\n const currentHref = window.location.href;\n const index = indexOfSearch(currentHref);\n let nextHref = index < 0 ? currentHref : currentHref.substring(0, index);\n if (params.size > 0) {\n nextHref = nextHref.concat('?', params.toString());\n }\n if (nextHref !== currentHref) {\n window.history.replaceState(null, '', nextHref);\n }\n};\n\nexport interface UseUrlSyncedStateOptions<T> {\n /**\n * The initial state to use, if there would be no search params to deserialize from.\n * These values are also treated as defaults, and if the current state matches the initialState,\n * no value will be written to the search params.\n */\n initialState: T | (() => T);\n /**\n * The serializer function is used to determine how the state is translated to url search parameters.\n * Called each time the state changes.\n * Note that the serializer should always return entries for keys it controls, also if the current value is \"unset\" (`null` or empty).\n * This ensures params get removed from the search when they are being unset.\n *\n * @param stateValue The new state value to serialize.\n * @returns An iterable of `[key, value]` to set as url search parameters.\n * @example (filterValue) => [['filter', filterValue]] // ?filter=filterValue\n */\n serializer: (stateValue: T) => Iterable<SearchParamEntry>;\n /**\n * The deserializer function is used to determine how the url parameters influence the initial state.\n * May return a partial state, values that are not deserialed are taken from the `initialState`.\n * Called only once when initializing the state.\n * @param params All the search parameters of the current url.\n * @param initialState The initialState, can be used to take defaults from.\n * @returns The initial state based on the current url.\n * @example (params) => params.get('filter') ?? '',\n */\n deserializer: (params: URLSearchParams, initialState: T) => T;\n /**\n * Whether the state should be synced with the url, defaults to `true`.\n * When set to `false`, the hook behaves just like a regular `useState` hook from react.\n */\n sync?: boolean;\n}\n\nconst getInitialState = <T>(options: UseUrlSyncedStateOptions<T>): T =>\n options.initialState instanceof Function ? options.initialState() : options.initialState;\n\nexport const useUrlSyncedState = <T>(options: UseUrlSyncedStateOptions<T>) => {\n const sync = options.sync !== false;\n const [state, setState] = useState<T>(() => {\n const initialState = getInitialState(options);\n return sync ? options.deserializer(getSearchParams(), initialState) : initialState;\n });\n // Capture the initial state as a map (first render only!), to compare values and see if they should be set to the params.\n const initialStateSerialized = useMemo(() => {\n const stateMap = new Map<string, string>();\n let initialize: URLSearchParams | null = null;\n for (const [key, value, alwaysEmit] of options.serializer(getInitialState(options))) {\n stateMap.set(key, value);\n if (alwaysEmit && value) {\n initialize ??= getSearchParams();\n initialize.set(key, value);\n }\n }\n if (initialize) {\n applySearchParams(initialize);\n }\n return stateMap;\n }, []);\n\n const enhancedSetState = useMemo<Dispatch<SetStateAction<T>>>(() => {\n if (!sync) {\n return setState;\n }\n return (updater: SetStateAction<T>) => {\n setState((old) => {\n const newValue = updater instanceof Function ? updater(old) : updater;\n\n const search = getSearchParams();\n for (const [key, value, alwaysEmit] of options.serializer(newValue)) {\n if (value && (alwaysEmit || !Object.is(initialStateSerialized.get(key), value))) {\n search.set(key, value);\n } else {\n search.delete(key);\n }\n }\n applySearchParams(search);\n\n return newValue;\n });\n };\n }, [sync]);\n\n return [state, enhancedSetState] as const;\n};\n"],"names":["useUrlSyncedState","indexOfSearch","url","indexOf","getSearchParams","href","window","location","searchStart","URLSearchParams","undefined","substring","applySearchParams","params","currentHref","index","nextHref","size","concat","toString","history","replaceState","getInitialState","options","Function","initialState","sync","useState","deserializer","state","setState","initialStateSerialized","useMemo","stateMap","Map","initialize","serializer","key","value","alwaysEmit","set","enhancedSetState","updater","old","newValue","search","Object","is","get","delete"],"mappings":"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"}
@@ -4,5 +4,5 @@ export { type TablePredicateProps } from './table-predicate/TablePredicate';
4
4
  export { type TableAction, type TableLayout, type TableLayoutProps, type TableProps } from './Table.types';
5
5
  export { useTableContext } from './TableContext';
6
6
  export { useTable, type TableState, type TableStore, type UseTableOptions } from './use-table';
7
- export { useUrlSyncedState } from './use-url-synced-state';
7
+ export { useUrlSyncedState, type UseUrlSyncedStateOptions, type SearchParamEntry } from './use-url-synced-state';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,IAAI,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACpE,cAAc,SAAS,CAAC;AACxB,OAAO,EAAC,KAAK,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AACzG,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAC,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,IAAI,eAAe,EAAC,MAAM,uBAAuB,CAAC;AACpE,cAAc,SAAS,CAAC;AACxB,OAAO,EAAC,KAAK,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAC,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AACzG,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,eAAe,EAAC,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAC,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,KAAK,gBAAgB,EAAC,MAAM,wBAAwB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/table/index.ts"],"sourcesContent":["export {flexRender as renderTableCell} from '@tanstack/react-table';\nexport * from './Table';\nexport {type TablePredicateProps} from './table-predicate/TablePredicate';\nexport {type TableAction, type TableLayout, type TableLayoutProps, type TableProps} from './Table.types';\nexport {useTableContext} from './TableContext';\nexport {useTable, type TableState, type TableStore, type UseTableOptions} from './use-table';\nexport {useUrlSyncedState} from './use-url-synced-state';\n"],"names":["flexRender","renderTableCell","useTableContext","useTable","useUrlSyncedState"],"mappings":"AAAA,SAAQA,cAAcC,eAAe,QAAO,wBAAwB;AACpE,cAAc,UAAU;AAGxB,SAAQC,eAAe,QAAO,iBAAiB;AAC/C,SAAQC,QAAQ,QAA+D,cAAc;AAC7F,SAAQC,iBAAiB,QAAO,yBAAyB"}
1
+ {"version":3,"sources":["../../../../src/components/table/index.ts"],"sourcesContent":["export {flexRender as renderTableCell} from '@tanstack/react-table';\nexport * from './Table';\nexport {type TablePredicateProps} from './table-predicate/TablePredicate';\nexport {type TableAction, type TableLayout, type TableLayoutProps, type TableProps} from './Table.types';\nexport {useTableContext} from './TableContext';\nexport {useTable, type TableState, type TableStore, type UseTableOptions} from './use-table';\nexport {useUrlSyncedState, type UseUrlSyncedStateOptions, type SearchParamEntry} from './use-url-synced-state';\n"],"names":["flexRender","renderTableCell","useTableContext","useTable","useUrlSyncedState"],"mappings":"AAAA,SAAQA,cAAcC,eAAe,QAAO,wBAAwB;AACpE,cAAc,UAAU;AAGxB,SAAQC,eAAe,QAAO,iBAAiB;AAC/C,SAAQC,QAAQ,QAA+D,cAAc;AAC7F,SAAQC,iBAAiB,QAA6D,yBAAyB"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.d.ts","sourceRoot":"","sources":["../../../../src/components/table/use-table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-table.d.ts","sourceRoot":"","sources":["../../../../src/components/table/use-table.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,114 @@ const defaultState = {
25
25
  rowSelection: {},
26
26
  columnVisibility: {}
27
27
  };
28
+ const serialization = (input)=>Object.freeze(input);
29
+ const PAGINATION_SERIALIZATION = serialization({
30
+ serializer: ({ pageIndex, pageSize })=>[
31
+ [
32
+ 'page',
33
+ (pageIndex + 1).toString()
34
+ ],
35
+ [
36
+ 'pageSize',
37
+ pageSize.toString()
38
+ ]
39
+ ],
40
+ deserializer: (params, initialState)=>defaultsDeep({
41
+ pageIndex: params.get('page') ? Math.max(1, parseInt(params.get('page'), 10)) - 1 : undefined,
42
+ pageSize: params.get('pageSize') ? parseInt(params.get('pageSize'), 10) : undefined
43
+ }, initialState)
44
+ });
45
+ const SORTING_SERIALIZATION = serialization({
46
+ serializer: (sorting)=>[
47
+ [
48
+ 'sortBy',
49
+ sorting.map(({ id, desc })=>`${id}.${desc ? 'desc' : 'asc'}`).join(',')
50
+ ]
51
+ ],
52
+ deserializer: (params, initialState)=>{
53
+ if (!params.has('sortBy')) {
54
+ return initialState;
55
+ }
56
+ const sorts = params.get('sortBy')?.split(',') ?? [];
57
+ return sorts.map((sort)=>{
58
+ const [id, order] = sort.split('.');
59
+ return {
60
+ id,
61
+ desc: order === 'desc'
62
+ };
63
+ });
64
+ }
65
+ });
66
+ const GLOBAL_FILTER_SERIALIZATION = serialization({
67
+ serializer: (filter)=>[
68
+ [
69
+ 'filter',
70
+ filter
71
+ ]
72
+ ],
73
+ deserializer: (params, initialState)=>params.get('filter') ?? initialState
74
+ });
75
+ const PREDICATES_SERIALIZATION = serialization({
76
+ serializer: (predicates)=>Object.entries(predicates),
77
+ deserializer: (params, initialState)=>Object.keys(initialState).reduce((acc, predicateKey)=>{
78
+ acc[predicateKey] = params.get(predicateKey) ?? initialState[predicateKey];
79
+ return acc;
80
+ }, {})
81
+ });
82
+ const LAYOUT_SERIALIZATION = serialization({
83
+ serializer: (_layout)=>[
84
+ [
85
+ 'layout',
86
+ _layout
87
+ ]
88
+ ],
89
+ deserializer: (params, initialState)=>params.get('layout') ?? initialState
90
+ });
91
+ const DATE_RANGE_SERIALIZATION = serialization({
92
+ serializer: ([from, to])=>[
93
+ [
94
+ 'from',
95
+ from?.toISOString() ?? '',
96
+ true
97
+ ],
98
+ [
99
+ 'to',
100
+ to?.toISOString() ?? '',
101
+ true
102
+ ]
103
+ ],
104
+ deserializer: (params, initial)=>[
105
+ params.get('from') ? new Date(params.get('from')) : initial[0],
106
+ params.get('to') ? new Date(params.get('to')) : initial[1]
107
+ ]
108
+ });
109
+ const COLUMN_VISIBILITY_SERIALIZATION = serialization({
110
+ serializer: (columns)=>[
111
+ [
112
+ 'show',
113
+ Object.entries(columns).filter(([, visible])=>visible === true).map(([columnName])=>columnName).join(',')
114
+ ],
115
+ [
116
+ 'hide',
117
+ Object.entries(columns).filter(([, visible])=>visible === false).map(([columnName])=>columnName).join(',')
118
+ ]
119
+ ],
120
+ deserializer: (params, initial)=>{
121
+ if (!params.has('show') && !params.has('hide')) {
122
+ return initial;
123
+ }
124
+ const visible = params.get('show')?.split(',') ?? [];
125
+ const invisible = params.get('hide')?.split(',') ?? [];
126
+ const columns = {};
127
+ visible.forEach((column)=>{
128
+ columns[column] = true;
129
+ });
130
+ invisible.forEach((column)=>{
131
+ columns[column] = false;
132
+ });
133
+ return columns;
134
+ }
135
+ });
28
136
  export const useTable = (userOptions = {})=>{
29
137
  const options = defaultsDeep({}, userOptions, defaultOptions);
30
138
  const initialState = defaultsDeep({}, options.initialState, defaultState);
@@ -32,127 +140,40 @@ export const useTable = (userOptions = {})=>{
32
140
  * The `useUrlSyncedState` hook defaults to synchronize, but the table wants to default to not synchronize,
33
141
  * so always pass the sync option as a resolved boolean value.
34
142
  */ const sync = !!options.syncWithUrl;
35
- // synced with url
143
+ // (Optionally) synced with url
36
144
  const [pagination, setPagination] = useUrlSyncedState({
145
+ ...PAGINATION_SERIALIZATION,
37
146
  initialState: initialState.pagination,
38
- serializer: ({ pageIndex, pageSize })=>[
39
- [
40
- 'page',
41
- (pageIndex + 1).toString()
42
- ],
43
- [
44
- 'pageSize',
45
- pageSize.toString()
46
- ]
47
- ],
48
- deserializer: (params)=>defaultsDeep({
49
- pageIndex: params.get('page') ? parseInt(params.get('page'), 10) - 1 : undefined,
50
- pageSize: params.get('pageSize') ? parseInt(params.get('pageSize'), 10) : undefined
51
- }, initialState.pagination),
52
147
  sync
53
148
  });
54
149
  const [sorting, setSorting] = useUrlSyncedState({
150
+ ...SORTING_SERIALIZATION,
55
151
  initialState: initialState.sorting,
56
- serializer: (_sorting)=>[
57
- [
58
- 'sortBy',
59
- _sorting.map(({ id, desc })=>`${id}.${desc ? 'desc' : 'asc'}`).join(',')
60
- ]
61
- ],
62
- deserializer: (params)=>{
63
- if (!params.has('sortBy')) {
64
- return initialState.sorting;
65
- }
66
- const sorts = params.get('sortBy')?.split(',') ?? [];
67
- return sorts.map((sort)=>{
68
- const [id, order] = sort.split('.');
69
- return {
70
- id,
71
- desc: order === 'desc'
72
- };
73
- });
74
- },
75
152
  sync
76
153
  });
77
154
  const [globalFilter, setGlobalFilter] = useUrlSyncedState({
155
+ ...GLOBAL_FILTER_SERIALIZATION,
78
156
  initialState: initialState.globalFilter,
79
- serializer: (filter)=>[
80
- [
81
- 'filter',
82
- filter
83
- ]
84
- ],
85
- deserializer: (params)=>params.get('filter') ?? initialState.globalFilter,
86
157
  sync
87
158
  });
88
159
  const [predicates, setPredicates] = useUrlSyncedState({
160
+ ...PREDICATES_SERIALIZATION,
89
161
  initialState: initialState.predicates,
90
- serializer: (_predicates)=>Object.entries(_predicates).map(([key, value])=>[
91
- key,
92
- value
93
- ]),
94
- deserializer: (params)=>Object.keys(initialState.predicates).reduce((acc, predicateKey)=>{
95
- acc[predicateKey] = params.get(predicateKey) ?? initialState.predicates[predicateKey];
96
- return acc;
97
- }, {}),
98
162
  sync
99
163
  });
100
164
  const [layout, setLayout] = useUrlSyncedState({
165
+ ...LAYOUT_SERIALIZATION,
101
166
  initialState: initialState.layout,
102
- serializer: (_layout)=>[
103
- [
104
- 'layout',
105
- _layout
106
- ]
107
- ],
108
- deserializer: (params)=>params.get('layout') ?? initialState.layout,
109
167
  sync
110
168
  });
111
169
  const [dateRange, setDateRange] = useUrlSyncedState({
170
+ ...DATE_RANGE_SERIALIZATION,
112
171
  initialState: initialState.dateRange,
113
- serializer: ([from, to])=>[
114
- [
115
- 'from',
116
- from?.toISOString() ?? ''
117
- ],
118
- [
119
- 'to',
120
- to?.toISOString() ?? ''
121
- ]
122
- ],
123
- deserializer: (params)=>[
124
- params.get('from') ? new Date(params.get('from')) : initialState.dateRange[0],
125
- params.get('to') ? new Date(params.get('to')) : initialState.dateRange[1]
126
- ],
127
172
  sync
128
173
  });
129
174
  const [columnVisibility, setColumnVisibility] = useUrlSyncedState({
175
+ ...COLUMN_VISIBILITY_SERIALIZATION,
130
176
  initialState: initialState.columnVisibility,
131
- serializer: (columns)=>[
132
- [
133
- 'show',
134
- Object.entries(columns).filter(([, visible])=>visible === true).map(([columnName])=>columnName).join(',')
135
- ],
136
- [
137
- 'hide',
138
- Object.entries(columns).filter(([, visible])=>visible === false).map(([columnName])=>columnName).join(',')
139
- ]
140
- ],
141
- deserializer: (params)=>{
142
- if (!params.has('show') && !params.has('hide')) {
143
- return initialState.columnVisibility;
144
- }
145
- const visible = params.get('show')?.split(',') ?? [];
146
- const invisible = params.get('hide')?.split(',') ?? [];
147
- const columns = {};
148
- visible.forEach((column)=>{
149
- columns[column] = true;
150
- });
151
- invisible.forEach((column)=>{
152
- columns[column] = false;
153
- });
154
- return columns;
155
- },
156
177
  sync
157
178
  });
158
179
  // unsynced