@ansible/ansible-ui-framework 0.0.258 → 0.0.260

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. package/{mjs → cjs}/BulkActionDialog.d.ts +0 -0
  2. package/{mjs → cjs}/BulkProgressDialog.d.ts +0 -0
  3. package/{mjs → cjs}/FilterDrawer.d.ts +0 -0
  4. package/{mjs → cjs}/PageAlertToaster.d.ts +0 -0
  5. package/{mjs → cjs}/PageBody.d.ts +0 -0
  6. package/{mjs → cjs}/PageCells.d.ts +0 -0
  7. package/{mjs → cjs}/PageColumnModal.d.ts +0 -0
  8. package/{mjs → cjs}/PageDataList.d.ts +0 -0
  9. package/{mjs → cjs}/PageDialog.d.ts +0 -0
  10. package/{mjs → cjs}/PageForm.d.ts +0 -0
  11. package/{mjs → cjs}/PageFramework.d.ts +0 -0
  12. package/{mjs → cjs}/PageHeader.d.ts +0 -0
  13. package/{mjs → cjs}/PageLayout.d.ts +0 -0
  14. package/{mjs → cjs}/PagePagination.d.ts +0 -0
  15. package/{mjs → cjs}/PageTable.d.ts +0 -0
  16. package/{mjs → cjs}/PageTableCard.d.ts +0 -0
  17. package/{mjs → cjs}/PageTableCards.d.ts +0 -0
  18. package/{mjs → cjs}/PageTableDetails.d.ts +0 -0
  19. package/{mjs → cjs}/PageTableList.d.ts +0 -0
  20. package/{mjs → cjs}/PageTableViewType.d.ts +0 -0
  21. package/{mjs → cjs}/PageTabs.d.ts +0 -0
  22. package/{mjs → cjs}/PageToolbar.d.ts +0 -0
  23. package/{mjs → cjs}/Settings.d.ts +0 -0
  24. package/{mjs → cjs}/TypedActions/TypedActions.d.ts +0 -0
  25. package/{mjs → cjs}/TypedActions/TypedActionsButtons.d.ts +0 -0
  26. package/{mjs → cjs}/TypedActions/index.d.ts +0 -0
  27. package/{mjs → cjs}/components/BulkSelector.d.ts +0 -0
  28. package/{mjs → cjs}/components/Collapse.d.ts +0 -0
  29. package/{mjs → cjs}/components/DetailInfo.d.ts +0 -0
  30. package/{mjs → cjs}/components/Details.d.ts +0 -0
  31. package/{mjs → cjs}/components/Dotted.d.ts +0 -0
  32. package/{mjs → cjs}/components/DropdownControlled.d.ts +0 -0
  33. package/{mjs → cjs}/components/ErrorBoundary.d.ts +0 -0
  34. package/{mjs → cjs}/components/Grid.d.ts +0 -0
  35. package/{mjs → cjs}/components/Help.d.ts +0 -0
  36. package/{mjs → cjs}/components/IconWrapper.d.ts +0 -0
  37. package/{mjs → cjs}/components/LoadingPage.d.ts +0 -0
  38. package/{mjs → cjs}/components/Masonry.d.ts +0 -0
  39. package/{mjs → cjs}/components/Scrollable.d.ts +0 -0
  40. package/{mjs → cjs}/components/SingleSelect.d.ts +0 -0
  41. package/{mjs → cjs}/components/patternfly-colors.d.ts +0 -0
  42. package/{mjs → cjs}/components/useBreakPoint.d.ts +0 -0
  43. package/{mjs → cjs}/components/useOpen.d.ts +0 -0
  44. package/{mjs → cjs}/components/useWindowLocation.d.ts +0 -0
  45. package/{mjs → cjs}/index.d.ts +1 -0
  46. package/cjs/index.js +1 -0
  47. package/{mjs → cjs}/useFrameworkTranslations.d.ts +0 -0
  48. package/{mjs → cjs}/useInMemoryView.d.ts +0 -0
  49. package/{mjs → cjs}/useSelectDialog.d.ts +0 -0
  50. package/{mjs → cjs}/useSelectMultipleDialog.d.ts +0 -0
  51. package/{mjs → cjs}/useTableItems.d.ts +0 -0
  52. package/{mjs → cjs}/useView.d.ts +0 -0
  53. package/{mjs → cjs}/utils/compare.d.ts +0 -0
  54. package/{mjs → cjs}/utils/download-file.d.ts +0 -0
  55. package/{mjs → cjs}/utils/random-string.d.ts +0 -0
  56. package/package.json +3 -11
  57. package/mjs/BulkActionDialog.js +0 -104
  58. package/mjs/BulkProgressDialog.js +0 -131
  59. package/mjs/FilterDrawer.js +0 -24
  60. package/mjs/PageAlertToaster.js +0 -48
  61. package/mjs/PageBody.js +0 -29
  62. package/mjs/PageCells.js +0 -102
  63. package/mjs/PageColumnModal.js +0 -64
  64. package/mjs/PageDataList.js +0 -44
  65. package/mjs/PageDialog.js +0 -12
  66. package/mjs/PageForm.js +0 -316
  67. package/mjs/PageFramework.js +0 -8
  68. package/mjs/PageHeader.js +0 -86
  69. package/mjs/PageLayout.js +0 -23
  70. package/mjs/PagePagination.js +0 -22
  71. package/mjs/PageTable.js +0 -191
  72. package/mjs/PageTableCard.js +0 -69
  73. package/mjs/PageTableCards.js +0 -23
  74. package/mjs/PageTableDetails.js +0 -11
  75. package/mjs/PageTableList.js +0 -62
  76. package/mjs/PageTableViewType.js +0 -6
  77. package/mjs/PageTabs.js +0 -45
  78. package/mjs/PageToolbar.js +0 -172
  79. package/mjs/Settings.js +0 -87
  80. package/mjs/TypedActions/TypedActions.js +0 -190
  81. package/mjs/TypedActions/TypedActionsButtons.js +0 -87
  82. package/mjs/TypedActions/index.js +0 -2
  83. package/mjs/components/BulkSelector.js +0 -56
  84. package/mjs/components/Collapse.js +0 -7
  85. package/mjs/components/DetailInfo.js +0 -8
  86. package/mjs/components/Details.js +0 -68
  87. package/mjs/components/Dotted.js +0 -4
  88. package/mjs/components/DropdownControlled.js +0 -8
  89. package/mjs/components/ErrorBoundary.js +0 -25
  90. package/mjs/components/Grid.js +0 -27
  91. package/mjs/components/Help.js +0 -9
  92. package/mjs/components/IconWrapper.js +0 -40
  93. package/mjs/components/LoadingPage.js +0 -9
  94. package/mjs/components/Masonry.js +0 -69
  95. package/mjs/components/Scrollable.js +0 -60
  96. package/mjs/components/SingleSelect.js +0 -37
  97. package/mjs/components/patternfly-colors.js +0 -38
  98. package/mjs/components/useBreakPoint.js +0 -118
  99. package/mjs/components/useOpen.js +0 -16
  100. package/mjs/components/useWindowLocation.js +0 -48
  101. package/mjs/index.js +0 -23
  102. package/mjs/useFrameworkTranslations.js +0 -22
  103. package/mjs/useInMemoryView.js +0 -60
  104. package/mjs/useSelectDialog.js +0 -49
  105. package/mjs/useSelectMultipleDialog.js +0 -29
  106. package/mjs/useTableItems.js +0 -378
  107. package/mjs/useView.js +0 -108
  108. package/mjs/utils/compare.js +0 -53
  109. package/mjs/utils/download-file.js +0 -18
  110. package/mjs/utils/random-string.js +0 -12
@@ -1,378 +0,0 @@
1
- import debounce from 'debounce';
2
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
- export function useTableItems(items, keyFn, defaults) {
4
- const { selectedItems, selectItem, unselectItem, isSelected, selectItems, unselectAll, allSelected, } = useSelected(items, keyFn);
5
- const { sorted, sort, setSort } = useSorted(items);
6
- const { filtered, setFilterFn } = useFiltered(sorted, keyFn);
7
- const { searched, search, setSearch, setSearchFn } = useSearched(filtered, keyFn, defaults?.search);
8
- const { paged, page, setPage, perPage, setPerPage } = usePaged(searched);
9
- const selectPage = useCallback(() => selectItems(paged), [paged, selectItems]);
10
- const selectAll = useCallback(() => selectItems(searched), [searched, selectItems]);
11
- return useMemo(() => ({
12
- allSelected,
13
- filtered,
14
- isSelected,
15
- page,
16
- paged,
17
- perPage,
18
- search,
19
- searched,
20
- selectAll,
21
- selectItem,
22
- selectPage,
23
- selectedItems,
24
- setFilterFn,
25
- setPage,
26
- setPerPage,
27
- setSearch,
28
- setSearchFn,
29
- setSort,
30
- sort,
31
- sorted,
32
- unselectAll,
33
- unselectItem,
34
- }), [
35
- allSelected,
36
- filtered,
37
- isSelected,
38
- page,
39
- paged,
40
- perPage,
41
- search,
42
- searched,
43
- selectAll,
44
- selectItem,
45
- selectPage,
46
- selectedItems,
47
- setFilterFn,
48
- setPage,
49
- setPerPage,
50
- setSearch,
51
- setSearchFn,
52
- setSort,
53
- sort,
54
- sorted,
55
- unselectAll,
56
- unselectItem,
57
- ]);
58
- }
59
- export function useSelected(items, keyFn) {
60
- const [selectedMap, setSelectedMap] = useState({});
61
- useEffect(() => {
62
- setSelectedMap((selectedMap) => {
63
- let changed = false;
64
- items.forEach((item) => {
65
- const key = keyFn(item);
66
- if (selectedMap[key] && selectedMap[key] !== item) {
67
- changed = true;
68
- selectedMap[key] = item;
69
- }
70
- });
71
- return changed ? { ...selectedMap } : selectedMap;
72
- });
73
- }, [items, keyFn]);
74
- const selectItem = useCallback((item) => {
75
- setSelectedMap((selectedMap) => {
76
- const itemKey = keyFn(item);
77
- const existing = selectedMap[itemKey];
78
- if (existing !== item) {
79
- selectedMap = { ...selectedMap };
80
- selectedMap[itemKey] = item;
81
- }
82
- return selectedMap;
83
- });
84
- }, [keyFn]);
85
- const unselectItem = useCallback((item) => {
86
- setSelectedMap((selectedMap) => {
87
- const itemKey = keyFn(item);
88
- const existing = selectedMap[itemKey];
89
- if (existing) {
90
- selectedMap = { ...selectedMap };
91
- delete selectedMap[itemKey];
92
- }
93
- return selectedMap;
94
- });
95
- }, [keyFn]);
96
- const isSelected = useCallback((item) => {
97
- const itemKey = keyFn(item);
98
- return selectedMap[itemKey] !== undefined;
99
- }, [keyFn, selectedMap]);
100
- const selectItems = useCallback((items) => {
101
- setSelectedMap((selectedMap) => {
102
- selectedMap = { ...selectedMap };
103
- for (const item of items) {
104
- const itemKey = keyFn(item);
105
- selectedMap[itemKey] = item;
106
- }
107
- return selectedMap;
108
- });
109
- }, [keyFn]);
110
- const selectAll = useCallback(() => selectItems(items), [items, selectItems]);
111
- const unselectItems = useCallback((items) => {
112
- for (const item of items) {
113
- unselectItem(item);
114
- }
115
- }, [unselectItem]);
116
- const unselectAll = useCallback(() => {
117
- setSelectedMap((selectedMap) => {
118
- if (Object.keys(selectedMap).length > 0) {
119
- return {};
120
- }
121
- return selectedMap;
122
- });
123
- }, []);
124
- const selectedItems = useMemo(() => Object.values(selectedMap), [selectedMap]);
125
- const allSelected = useMemo(() => selectedItems.length === items.length, [items.length, selectedItems.length]);
126
- return useMemo(() => ({
127
- selectedItems,
128
- selectItem,
129
- unselectItem,
130
- isSelected,
131
- selectItems,
132
- selectAll,
133
- unselectAll,
134
- allSelected,
135
- keyFn,
136
- unselectItems,
137
- }), [
138
- allSelected,
139
- isSelected,
140
- keyFn,
141
- selectAll,
142
- selectItem,
143
- selectItems,
144
- selectedItems,
145
- unselectAll,
146
- unselectItem,
147
- unselectItems,
148
- ]);
149
- }
150
- export function useSelectedInMemory(items, keyFn) {
151
- const [selectedMap, setSelectedMap] = useState({});
152
- useEffect(() => {
153
- setSelectedMap((selectedMap) => {
154
- let changed = false;
155
- const itemsKeys = items.reduce((itemsKeys, item) => {
156
- const key = keyFn(item);
157
- itemsKeys[key] = item;
158
- if (selectedMap[key] && selectedMap[key] !== item) {
159
- changed = true;
160
- selectedMap[key] = item;
161
- }
162
- return itemsKeys;
163
- }, {});
164
- const removeKeyMap = {};
165
- for (const key in selectedMap) {
166
- if (!itemsKeys[key]) {
167
- removeKeyMap[key] = true;
168
- }
169
- }
170
- const removeKeys = Object.keys(removeKeyMap);
171
- if (removeKeys.length) {
172
- changed = true;
173
- for (const key of removeKeys) {
174
- delete selectedMap[key];
175
- }
176
- }
177
- return changed ? { ...selectedMap } : selectedMap;
178
- });
179
- }, [items, keyFn]);
180
- const selectItem = useCallback((item) => {
181
- setSelectedMap((selectedMap) => {
182
- const itemKey = keyFn(item);
183
- const existing = selectedMap[itemKey];
184
- if (existing !== item) {
185
- selectedMap = { ...selectedMap };
186
- selectedMap[itemKey] = item;
187
- }
188
- return selectedMap;
189
- });
190
- }, [keyFn]);
191
- const unselectItem = useCallback((item) => {
192
- setSelectedMap((selectedMap) => {
193
- const itemKey = keyFn(item);
194
- const existing = selectedMap[itemKey];
195
- if (existing) {
196
- selectedMap = { ...selectedMap };
197
- delete selectedMap[itemKey];
198
- }
199
- return selectedMap;
200
- });
201
- }, [keyFn]);
202
- const unselectItems = useCallback((items) => {
203
- for (const item of items) {
204
- unselectItem(item);
205
- }
206
- }, [unselectItem]);
207
- const isSelected = useCallback((item) => {
208
- const itemKey = keyFn(item);
209
- return selectedMap[itemKey] !== undefined;
210
- }, [keyFn, selectedMap]);
211
- const selectItems = useCallback((items) => {
212
- setSelectedMap((selectedMap) => {
213
- selectedMap = { ...selectedMap };
214
- for (const item of items) {
215
- const itemKey = keyFn(item);
216
- selectedMap[itemKey] = item;
217
- }
218
- return selectedMap;
219
- });
220
- }, [keyFn]);
221
- const selectAll = useCallback(() => {
222
- selectItems(items);
223
- }, [items, selectItems]);
224
- const unselectAll = useCallback(() => {
225
- setSelectedMap((selectedMap) => {
226
- if (Object.keys(selectedMap).length > 0) {
227
- return {};
228
- }
229
- return selectedMap;
230
- });
231
- }, []);
232
- const selectedItems = useMemo(() => Object.values(selectedMap), [selectedMap]);
233
- const allSelected = useMemo(() => selectedItems.length === items.length, [items.length, selectedItems.length]);
234
- return useMemo(() => ({
235
- selectedItems,
236
- selectItem,
237
- unselectItem,
238
- isSelected,
239
- selectItems,
240
- selectAll,
241
- unselectAll,
242
- allSelected,
243
- keyFn,
244
- unselectItems,
245
- }), [
246
- allSelected,
247
- isSelected,
248
- keyFn,
249
- selectAll,
250
- selectItem,
251
- selectItems,
252
- selectedItems,
253
- unselectAll,
254
- unselectItem,
255
- unselectItems,
256
- ]);
257
- }
258
- export function useSorted(items) {
259
- const [sort, setSort] = useState();
260
- const { direction, sortFn } = sort ?? {};
261
- const sorted = useMemo(() => {
262
- if (sortFn) {
263
- if (direction === 'asc') {
264
- return [...items.sort(sortFn)];
265
- }
266
- else {
267
- return [...items.sort(sortFn).reverse()];
268
- }
269
- }
270
- else {
271
- return items;
272
- }
273
- }, [direction, items, sortFn]);
274
- return useMemo(() => ({ sorted, sort, setSort }), [sort, sorted]);
275
- }
276
- export function useFiltered(items, keyFn) {
277
- const filterMapRef = useRef({
278
- map: {},
279
- });
280
- const [filterFn, setFilterFnState] = useState();
281
- const setFilterFn = useCallback((filterFn) => setFilterFnState(() => filterFn), []);
282
- const [filtered, setFiltered] = useState([]);
283
- useEffect(() => {
284
- filterMapRef.current.map = {};
285
- }, [filterFn]);
286
- const cachedFilterFn = useCallback((item) => {
287
- const key = keyFn(item);
288
- let cached = filterMapRef.current.map[key];
289
- if (!cached) {
290
- cached = { item, passes: filterFn ? filterFn(item) : true };
291
- filterMapRef.current.map[key] = cached;
292
- }
293
- else if (cached.item !== item) {
294
- cached.item = item;
295
- cached.passes = filterFn ? filterFn(item) : true;
296
- }
297
- return cached.passes;
298
- }, [filterFn, keyFn]);
299
- useEffect(() => {
300
- if (filterFn) {
301
- setFiltered(items.filter(cachedFilterFn));
302
- }
303
- else {
304
- setFiltered(items);
305
- }
306
- }, [items, filterFn, cachedFilterFn]);
307
- return useMemo(function memoFiltered() {
308
- return { filtered, setFilterFn };
309
- }, [filtered, setFilterFn]);
310
- }
311
- function useSearched(items, keyFn, defaultSearch) {
312
- const searchMapRef = useRef({
313
- map: {},
314
- });
315
- const [searchFn, setSearchFnState] = useState();
316
- const setSearchFn = useCallback((searchFn) => setSearchFnState(() => searchFn), []);
317
- const [searched, setSearched] = useState([]);
318
- const [search, setSearchState] = useState(defaultSearch ?? '');
319
- // eslint-disable-next-line react-hooks/exhaustive-deps
320
- const setSearch = useCallback(debounce((search) => setSearchState(search), 200), []);
321
- useEffect(() => {
322
- searchMapRef.current.map = {};
323
- }, [search, searchFn]);
324
- const cachedSearchFn = useCallback((item) => {
325
- const key = keyFn(item);
326
- let cached = searchMapRef.current.map[key];
327
- if (!cached) {
328
- cached = { item, score: searchFn ? searchFn(item, search) : 0 };
329
- searchMapRef.current.map[key] = cached;
330
- }
331
- else if (cached.item !== item) {
332
- cached.item = item;
333
- cached.score = searchFn ? searchFn(item, search) : 0;
334
- }
335
- return cached;
336
- }, [keyFn, searchFn, search]);
337
- useEffect(() => {
338
- if (searchFn && search) {
339
- setSearched(items
340
- .map(cachedSearchFn)
341
- .filter((cached) => cached.score < 0.5)
342
- .sort((l, r) => l.score - r.score)
343
- .map((cached) => cached.item));
344
- }
345
- else {
346
- setSearched(items);
347
- }
348
- }, [search, items, searchFn, cachedSearchFn]);
349
- return useMemo(function memoFiltered() {
350
- return { searched, search, setSearch, setSearchFn };
351
- }, [searched, search, setSearch, setSearchFn]);
352
- }
353
- export function usePaged(source) {
354
- const [paged, setPaged] = useState([]);
355
- const [page, setPage] = useState(1);
356
- const [perPage, setPerPage] = useState(10);
357
- useEffect(() => {
358
- setPaged((paged) => {
359
- const newPaged = source.slice((page - 1) * perPage, page * perPage);
360
- if (paged.length !== newPaged.length) {
361
- return newPaged;
362
- }
363
- let index = 0;
364
- for (const item of newPaged) {
365
- if (paged[index++] !== item) {
366
- return newPaged;
367
- }
368
- }
369
- return paged;
370
- });
371
- }, [page, perPage, source]);
372
- useEffect(() => {
373
- if (page > Math.ceil(source.length / perPage)) {
374
- setPage(1);
375
- }
376
- }, [page, perPage, source.length]);
377
- return useMemo(() => ({ paged, page, setPage, perPage, setPerPage }), [page, paged, perPage]);
378
- }
package/mjs/useView.js DELETED
@@ -1,108 +0,0 @@
1
- import { useCallback, useEffect, useMemo, useState } from 'react';
2
- import { useSearchParams } from 'react-router-dom';
3
- export function useView(view, disableQueryString) {
4
- const [searchParams, setSearchParams] = useSearchParams();
5
- const [page, setPage] = useState(() => {
6
- if (!disableQueryString) {
7
- const queryPage = searchParams.get('page');
8
- if (queryPage) {
9
- const page = Number(queryPage);
10
- if (Number.isInteger(page)) {
11
- return page;
12
- }
13
- }
14
- }
15
- return view?.page ?? 1;
16
- });
17
- const [perPage, setPerPage] = useState(() => {
18
- if (!disableQueryString) {
19
- const queryPerPage = searchParams.get('perPage');
20
- if (queryPerPage) {
21
- const perPage = Number(queryPerPage);
22
- if (Number.isInteger(perPage)) {
23
- return perPage;
24
- }
25
- }
26
- }
27
- const localPerPage = localStorage.getItem('perPage');
28
- if (localPerPage) {
29
- const perPage = Number(localPerPage);
30
- if (Number.isInteger(perPage)) {
31
- return perPage;
32
- }
33
- }
34
- return view?.perPage ?? 10;
35
- });
36
- const [sort, setSort] = useState(() => {
37
- if (!disableQueryString) {
38
- const querySort = searchParams.get('sort');
39
- if (querySort) {
40
- if (querySort.startsWith('-'))
41
- return querySort.slice(1);
42
- return querySort;
43
- }
44
- }
45
- return view?.sort ?? '';
46
- });
47
- const [sortDirection, setSortDirection] = useState(() => {
48
- if (!disableQueryString) {
49
- const querySort = searchParams.get('sort');
50
- if (querySort) {
51
- if (querySort.startsWith('-'))
52
- return 'desc';
53
- return 'asc';
54
- }
55
- }
56
- return view?.sortDirection ?? 'asc';
57
- });
58
- const [filters, setFilters] = useState(() => {
59
- const filters = {};
60
- for (const key of searchParams.keys()) {
61
- switch (key) {
62
- case 'sort':
63
- case 'page':
64
- case 'perPage':
65
- break;
66
- default: {
67
- const value = searchParams.get(key);
68
- if (value) {
69
- const values = value.split(',');
70
- filters[key] = values;
71
- }
72
- }
73
- }
74
- }
75
- if (Object.keys(filters))
76
- return filters;
77
- return view?.filters ?? {};
78
- });
79
- const clearAllFilters = useCallback(() => setFilters({}), [setFilters]);
80
- useEffect(() => {
81
- if (disableQueryString)
82
- return;
83
- const newSearchParams = new URLSearchParams();
84
- sortDirection === 'asc'
85
- ? newSearchParams.set('sort', sort)
86
- : newSearchParams.set('sort', `-${sort}`);
87
- newSearchParams.set('page', page.toString());
88
- newSearchParams.set('perPage', perPage.toString());
89
- for (const filter in filters) {
90
- newSearchParams.set(filter, filters[filter].join(','));
91
- }
92
- localStorage.setItem('perPage', perPage.toString());
93
- setSearchParams(newSearchParams, { replace: true });
94
- }, [sort, sortDirection, setSearchParams, disableQueryString, page, perPage, filters]);
95
- return useMemo(() => ({
96
- page,
97
- setPage,
98
- perPage,
99
- setPerPage,
100
- sort,
101
- setSort,
102
- sortDirection,
103
- setSortDirection,
104
- filters,
105
- setFilters,
106
- clearAllFilters,
107
- }), [clearAllFilters, filters, page, perPage, sort, sortDirection]);
108
- }
@@ -1,53 +0,0 @@
1
- /* istanbul ignore file */
2
- export function compareUnknowns(a, b) {
3
- /* istanbul ignore next */
4
- if (a == undefined && b == undefined)
5
- return 0;
6
- /* istanbul ignore next */
7
- if (a == undefined)
8
- return 1;
9
- /* istanbul ignore next */
10
- if (b == undefined)
11
- return -1;
12
- /* istanbul ignore else */
13
- if (typeof a === 'string') {
14
- /* istanbul ignore else */
15
- if (typeof b === 'string') {
16
- return compareStrings(a, b);
17
- }
18
- else if (typeof b === 'number') {
19
- return compareStrings(a, b.toString());
20
- }
21
- }
22
- else if (typeof a === 'number') {
23
- /* istanbul ignore else */
24
- if (typeof b === 'number') {
25
- return compareNumbers(a, b);
26
- }
27
- else if (typeof b === 'string') {
28
- return compareStrings(a.toString(), b);
29
- }
30
- }
31
- /* istanbul ignore next */
32
- return 0;
33
- }
34
- /* istanbul ignore next */
35
- export function compareStrings(a, b) {
36
- if (a == undefined && b == undefined)
37
- return 0;
38
- if (a == undefined)
39
- return 1;
40
- if (b == undefined)
41
- return -1;
42
- return a < b ? -1 : a > b ? 1 : 0;
43
- }
44
- /* istanbul ignore next */
45
- export function compareNumbers(a, b) {
46
- if (a == undefined && b == undefined)
47
- return 0;
48
- if (a == undefined)
49
- return 1;
50
- if (b == undefined)
51
- return -1;
52
- return a < b ? -1 : a > b ? 1 : 0;
53
- }
@@ -1,18 +0,0 @@
1
- export function downloadTextFile(name, content) {
2
- const file = new Blob(content.split('/n'), { type: 'text/plain' });
3
- const element = document.createElement('a');
4
- element.href = URL.createObjectURL(file);
5
- element.download = name + '.txt';
6
- document.body.appendChild(element);
7
- element.click();
8
- document.body.removeChild(element);
9
- }
10
- export function downloadCvsFile(name, content) {
11
- const file = new Blob(content, { type: 'text/csv' });
12
- const element = document.createElement('a');
13
- element.href = URL.createObjectURL(file);
14
- element.download = name + '.csv';
15
- document.body.appendChild(element);
16
- element.click();
17
- document.body.removeChild(element);
18
- }
@@ -1,12 +0,0 @@
1
- /* istanbul ignore file */
2
- const randomCharacters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
3
- export function randomString(length, base = randomCharacters.length) {
4
- if (base > randomCharacters.length || base <= 0)
5
- base = randomCharacters.length;
6
- let text = '';
7
- for (let i = 0; i < length; i++) {
8
- const index = Math.floor(Math.random() * base) % base;
9
- text += randomCharacters.charAt(index);
10
- }
11
- return text;
12
- }