@ansible/ansible-ui-framework 0.0.247 → 0.0.249

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.
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.TableDetails = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
17
+ /* eslint-disable @typescript-eslint/no-empty-function */
18
+ var react_core_1 = require("@patternfly/react-core");
19
+ var Details_1 = require("./components/Details");
20
+ function TableDetails(props) {
21
+ var item = props.item, columns = props.columns;
22
+ if (!item)
23
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
24
+ return ((0, jsx_runtime_1.jsx)(react_core_1.DescriptionList, __assign({ isCompact: true }, { children: columns.map(function (column) { return ((0, jsx_runtime_1.jsx)(Details_1.Detail, __assign({ label: column.hideLabel ? undefined : column.header }, { children: column.cell(item) }), column.id)); }) })));
25
+ }
26
+ exports.TableDetails = TableDetails;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __values = (this && this.__values) || function(o) {
14
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
15
+ if (m) return m.call(o);
16
+ if (o && typeof o.length === "number") return {
17
+ next: function () {
18
+ if (o && i >= o.length) o = void 0;
19
+ return { value: o && o[i++], done: !o };
20
+ }
21
+ };
22
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
23
+ };
24
+ var __importDefault = (this && this.__importDefault) || function (mod) {
25
+ return (mod && mod.__esModule) ? mod : { "default": mod };
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.useInMemoryView = void 0;
29
+ var get_value_1 = __importDefault(require("get-value"));
30
+ var react_1 = require("react");
31
+ var useTableItems_1 = require("./useTableItems");
32
+ var useView_1 = require("./useView");
33
+ var compare_1 = require("./utils/compare");
34
+ function useInMemoryView(options) {
35
+ var items = options.items, keyFn = options.keyFn, tableColumns = options.tableColumns, toolbarFilters = options.toolbarFilters, disableQueryString = options.disableQueryString;
36
+ var view = (0, useView_1.useView)({
37
+ sort: tableColumns && tableColumns.length ? tableColumns[0].sort : undefined,
38
+ }, disableQueryString);
39
+ var page = view.page, perPage = view.perPage, sort = view.sort, sortDirection = view.sortDirection, filters = view.filters;
40
+ var sorted = (0, useTableItems_1.useSorted)(items !== null && items !== void 0 ? items : []);
41
+ var setSort = sorted.setSort;
42
+ (0, react_1.useEffect)(function () {
43
+ return setSort({
44
+ id: sort,
45
+ sortFn: function (l, r) {
46
+ var lv = (0, get_value_1.default)(l, sort);
47
+ var rv = (0, get_value_1.default)(r, sort);
48
+ return (0, compare_1.compareUnknowns)(lv, rv);
49
+ },
50
+ direction: sortDirection,
51
+ });
52
+ }, [sort, sortDirection, setSort]);
53
+ var filtered = (0, useTableItems_1.useFiltered)(sorted.sorted, keyFn);
54
+ var setFilterFn = filtered.setFilterFn;
55
+ (0, react_1.useEffect)(function () {
56
+ if (Object.keys(filters).length === 0) {
57
+ setFilterFn(undefined);
58
+ }
59
+ else {
60
+ setFilterFn(function (item) {
61
+ var _loop_1 = function (key) {
62
+ var e_1, _a;
63
+ var toolbarFilter = toolbarFilters === null || toolbarFilters === void 0 ? void 0 : toolbarFilters.find(function (filter) { return filter.key === key; });
64
+ if (toolbarFilter) {
65
+ var value = (0, get_value_1.default)(item, toolbarFilter.query);
66
+ if (typeof value === 'string') {
67
+ try {
68
+ for (var _b = (e_1 = void 0, __values(filters[key])), _c = _b.next(); !_c.done; _c = _b.next()) {
69
+ var filterValue = _c.value;
70
+ if (value.toLowerCase().includes(filterValue.toLowerCase()))
71
+ return { value: true };
72
+ }
73
+ }
74
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
75
+ finally {
76
+ try {
77
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
78
+ }
79
+ finally { if (e_1) throw e_1.error; }
80
+ }
81
+ }
82
+ }
83
+ };
84
+ for (var key in filters) {
85
+ var state_1 = _loop_1(key);
86
+ if (typeof state_1 === "object")
87
+ return state_1.value;
88
+ }
89
+ return false;
90
+ });
91
+ }
92
+ }, [filters, setFilterFn, toolbarFilters]);
93
+ var paged = (0, useTableItems_1.usePaged)(filtered.filtered);
94
+ var setPage = paged.setPage, setPerPage = paged.setPerPage;
95
+ (0, react_1.useEffect)(function () { return setPage(page); }, [page, paged, setPage]);
96
+ (0, react_1.useEffect)(function () { return setPerPage(perPage); }, [perPage, paged, setPerPage]);
97
+ var selection = (0, useTableItems_1.useSelectedInMemory)(items !== null && items !== void 0 ? items : [], keyFn);
98
+ return (0, react_1.useMemo)(function () {
99
+ return __assign(__assign({ itemCount: items ? filtered.filtered.length : 0, pageItems: items ? paged.paged : undefined }, view), selection);
100
+ }, [filtered.filtered.length, items, paged.paged, selection, view]);
101
+ }
102
+ exports.useInMemoryView = useInMemoryView;
@@ -287,27 +287,43 @@ function useSelectedInMemory(items, keyFn) {
287
287
  return selectedMap;
288
288
  });
289
289
  }, [keyFn]);
290
+ var unselectItems = (0, react_1.useCallback)(function (items) {
291
+ var e_4, _a;
292
+ try {
293
+ for (var items_3 = __values(items), items_3_1 = items_3.next(); !items_3_1.done; items_3_1 = items_3.next()) {
294
+ var item = items_3_1.value;
295
+ unselectItem(item);
296
+ }
297
+ }
298
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
299
+ finally {
300
+ try {
301
+ if (items_3_1 && !items_3_1.done && (_a = items_3.return)) _a.call(items_3);
302
+ }
303
+ finally { if (e_4) throw e_4.error; }
304
+ }
305
+ }, [unselectItem]);
290
306
  var isSelected = (0, react_1.useCallback)(function (item) {
291
307
  var itemKey = keyFn(item);
292
308
  return selectedMap[itemKey] !== undefined;
293
309
  }, [keyFn, selectedMap]);
294
310
  var selectItems = (0, react_1.useCallback)(function (items) {
295
311
  setSelectedMap(function (selectedMap) {
296
- var e_4, _a;
312
+ var e_5, _a;
297
313
  selectedMap = __assign({}, selectedMap);
298
314
  try {
299
- for (var items_3 = __values(items), items_3_1 = items_3.next(); !items_3_1.done; items_3_1 = items_3.next()) {
300
- var item = items_3_1.value;
315
+ for (var items_4 = __values(items), items_4_1 = items_4.next(); !items_4_1.done; items_4_1 = items_4.next()) {
316
+ var item = items_4_1.value;
301
317
  var itemKey = keyFn(item);
302
318
  selectedMap[itemKey] = item;
303
319
  }
304
320
  }
305
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
321
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
306
322
  finally {
307
323
  try {
308
- if (items_3_1 && !items_3_1.done && (_a = items_3.return)) _a.call(items_3);
324
+ if (items_4_1 && !items_4_1.done && (_a = items_4.return)) _a.call(items_4);
309
325
  }
310
- finally { if (e_4) throw e_4.error; }
326
+ finally { if (e_5) throw e_5.error; }
311
327
  }
312
328
  return selectedMap;
313
329
  });
@@ -335,6 +351,7 @@ function useSelectedInMemory(items, keyFn) {
335
351
  unselectAll: unselectAll,
336
352
  allSelected: allSelected,
337
353
  keyFn: keyFn,
354
+ unselectItems: unselectItems,
338
355
  }); }, [
339
356
  allSelected,
340
357
  isSelected,
@@ -345,6 +362,7 @@ function useSelectedInMemory(items, keyFn) {
345
362
  selectedItems,
346
363
  unselectAll,
347
364
  unselectItem,
365
+ unselectItems,
348
366
  ]);
349
367
  }
350
368
  exports.useSelectedInMemory = useSelectedInMemory;
@@ -451,7 +469,7 @@ function usePaged(source) {
451
469
  var _c = __read((0, react_1.useState)(10), 2), perPage = _c[0], setPerPage = _c[1];
452
470
  (0, react_1.useEffect)(function () {
453
471
  setPaged(function (paged) {
454
- var e_5, _a;
472
+ var e_6, _a;
455
473
  var newPaged = source.slice((page - 1) * perPage, page * perPage);
456
474
  if (paged.length !== newPaged.length) {
457
475
  return newPaged;
@@ -465,12 +483,12 @@ function usePaged(source) {
465
483
  }
466
484
  }
467
485
  }
468
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
486
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
469
487
  finally {
470
488
  try {
471
489
  if (newPaged_1_1 && !newPaged_1_1.done && (_a = newPaged_1.return)) _a.call(newPaged_1);
472
490
  }
473
- finally { if (e_5) throw e_5.error; }
491
+ finally { if (e_6) throw e_6.error; }
474
492
  }
475
493
  return paged;
476
494
  });
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { ITableColumn } from './PageTable';
3
+ export declare function TableDetails<T extends object>(props: {
4
+ item: T | undefined;
5
+ columns: ITableColumn<T>[];
6
+ }): JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
3
+ /* eslint-disable @typescript-eslint/no-empty-function */
4
+ import { DescriptionList } from '@patternfly/react-core';
5
+ import { Detail } from './components/Details';
6
+ export function TableDetails(props) {
7
+ const { item, columns } = props;
8
+ if (!item)
9
+ return _jsx(_Fragment, {});
10
+ return (_jsx(DescriptionList, { isCompact: true, children: columns.map((column) => (_jsx(Detail, { label: column.hideLabel ? undefined : column.header, children: column.cell(item) }, column.id))) }));
11
+ }
@@ -0,0 +1,15 @@
1
+ import { ITableColumn } from './PageTable';
2
+ import { IToolbarFilter } from './PageToolbar';
3
+ import { ISelected } from './useTableItems';
4
+ import { IView } from './useView';
5
+ export declare type IInMemoryView<T extends object> = IView & ISelected<T> & {
6
+ itemCount: number | undefined;
7
+ pageItems: T[] | undefined;
8
+ };
9
+ export declare function useInMemoryView<T extends object>(options: {
10
+ items: T[] | undefined;
11
+ tableColumns?: ITableColumn<T>[];
12
+ toolbarFilters?: IToolbarFilter[];
13
+ disableQueryString?: boolean;
14
+ keyFn: (item: T) => string | number;
15
+ }): IInMemoryView<T>;
@@ -0,0 +1,60 @@
1
+ import getValue from 'get-value';
2
+ import { useEffect, useMemo } from 'react';
3
+ import { useFiltered, usePaged, useSelectedInMemory, useSorted } from './useTableItems';
4
+ import { useView } from './useView';
5
+ import { compareUnknowns } from './utils/compare';
6
+ export function useInMemoryView(options) {
7
+ const { items, keyFn, tableColumns, toolbarFilters, disableQueryString } = options;
8
+ const view = useView({
9
+ sort: tableColumns && tableColumns.length ? tableColumns[0].sort : undefined,
10
+ }, disableQueryString);
11
+ const { page, perPage, sort, sortDirection, filters } = view;
12
+ const sorted = useSorted(items ?? []);
13
+ const { setSort } = sorted;
14
+ useEffect(() => setSort({
15
+ id: sort,
16
+ sortFn: (l, r) => {
17
+ const lv = getValue(l, sort);
18
+ const rv = getValue(r, sort);
19
+ return compareUnknowns(lv, rv);
20
+ },
21
+ direction: sortDirection,
22
+ }), [sort, sortDirection, setSort]);
23
+ const filtered = useFiltered(sorted.sorted, keyFn);
24
+ const { setFilterFn } = filtered;
25
+ useEffect(() => {
26
+ if (Object.keys(filters).length === 0) {
27
+ setFilterFn(undefined);
28
+ }
29
+ else {
30
+ setFilterFn((item) => {
31
+ for (const key in filters) {
32
+ const toolbarFilter = toolbarFilters?.find((filter) => filter.key === key);
33
+ if (toolbarFilter) {
34
+ const value = getValue(item, toolbarFilter.query);
35
+ if (typeof value === 'string') {
36
+ for (const filterValue of filters[key]) {
37
+ if (value.toLowerCase().includes(filterValue.toLowerCase()))
38
+ return true;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return false;
44
+ });
45
+ }
46
+ }, [filters, setFilterFn, toolbarFilters]);
47
+ const paged = usePaged(filtered.filtered);
48
+ const { setPage, setPerPage } = paged;
49
+ useEffect(() => setPage(page), [page, paged, setPage]);
50
+ useEffect(() => setPerPage(perPage), [perPage, paged, setPerPage]);
51
+ const selection = useSelectedInMemory(items ?? [], keyFn);
52
+ return useMemo(() => {
53
+ return {
54
+ itemCount: items ? filtered.filtered.length : 0,
55
+ pageItems: items ? paged.paged : undefined,
56
+ ...view,
57
+ ...selection,
58
+ };
59
+ }, [filtered.filtered.length, items, paged.paged, selection, view]);
60
+ }
@@ -14,7 +14,7 @@ export declare function useTableItems<T extends object>(items: T[], keyFn: (item
14
14
  selectItem: (item: T) => void;
15
15
  selectPage: () => void;
16
16
  selectedItems: T[];
17
- setFilterFn: (filterFn: (item: T) => boolean) => void;
17
+ setFilterFn: (filterFn: ((item: T) => boolean) | undefined) => void;
18
18
  setPage: import("react").Dispatch<import("react").SetStateAction<number>>;
19
19
  setPerPage: import("react").Dispatch<import("react").SetStateAction<number>>;
20
20
  setSearch: ((search: string) => void) & {
@@ -52,6 +52,7 @@ export declare function useSelectedInMemory<T extends object>(items: T[], keyFn:
52
52
  unselectAll: () => void;
53
53
  allSelected: boolean;
54
54
  keyFn: (item: T) => string | number;
55
+ unselectItems: (items: T[]) => void;
55
56
  };
56
57
  export interface ISort<T extends object> {
57
58
  id: string;
@@ -65,7 +66,7 @@ export declare function useSorted<T extends object>(items: T[]): {
65
66
  };
66
67
  export declare function useFiltered<T extends object>(items: T[], keyFn: (item: T) => string | number): {
67
68
  filtered: T[];
68
- setFilterFn: (filterFn: (item: T) => boolean) => void;
69
+ setFilterFn: (filterFn: ((item: T) => boolean) | undefined) => void;
69
70
  };
70
71
  export declare function usePaged<T extends object>(source: T[]): {
71
72
  paged: T[];
@@ -199,6 +199,11 @@ export function useSelectedInMemory(items, keyFn) {
199
199
  return selectedMap;
200
200
  });
201
201
  }, [keyFn]);
202
+ const unselectItems = useCallback((items) => {
203
+ for (const item of items) {
204
+ unselectItem(item);
205
+ }
206
+ }, [unselectItem]);
202
207
  const isSelected = useCallback((item) => {
203
208
  const itemKey = keyFn(item);
204
209
  return selectedMap[itemKey] !== undefined;
@@ -236,6 +241,7 @@ export function useSelectedInMemory(items, keyFn) {
236
241
  unselectAll,
237
242
  allSelected,
238
243
  keyFn,
244
+ unselectItems,
239
245
  }), [
240
246
  allSelected,
241
247
  isSelected,
@@ -246,6 +252,7 @@ export function useSelectedInMemory(items, keyFn) {
246
252
  selectedItems,
247
253
  unselectAll,
248
254
  unselectItem,
255
+ unselectItems,
249
256
  ]);
250
257
  }
251
258
  export function useSorted(items) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ansible/ansible-ui-framework",
3
3
  "description": "Framework for building consistent responsive web applications using PatternFly.",
4
- "version": "0.0.247",
4
+ "version": "0.0.249",
5
5
  "author": "Red Hat",
6
6
  "license": "MIT",
7
7
  "repository": {