@ansible/ansible-ui-framework 0.0.190

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/cjs/framework/BulkActionDialog.js +217 -0
  3. package/cjs/framework/BulkProgressDialog.js +240 -0
  4. package/cjs/framework/FilterDrawer.js +64 -0
  5. package/cjs/framework/PageBody.js +47 -0
  6. package/cjs/framework/PageCatalog.js +178 -0
  7. package/cjs/framework/PageCells.js +141 -0
  8. package/cjs/framework/PageColumnModal.js +130 -0
  9. package/cjs/framework/PageDataList.js +61 -0
  10. package/cjs/framework/PageDialog.js +28 -0
  11. package/cjs/framework/PageForm.js +376 -0
  12. package/cjs/framework/PageFramework.js +11 -0
  13. package/cjs/framework/PageHeader.js +96 -0
  14. package/cjs/framework/PageLayout.js +41 -0
  15. package/cjs/framework/PagePagination.js +28 -0
  16. package/cjs/framework/PageTable.js +205 -0
  17. package/cjs/framework/PageTabs.js +82 -0
  18. package/cjs/framework/PageToolbar.js +209 -0
  19. package/cjs/framework/Settings.js +122 -0
  20. package/cjs/framework/TypedActions.js +303 -0
  21. package/cjs/framework/components/BulkSelector.js +89 -0
  22. package/cjs/framework/components/Collapse.js +22 -0
  23. package/cjs/framework/components/DetailInfo.js +23 -0
  24. package/cjs/framework/components/Details.js +88 -0
  25. package/cjs/framework/components/Dotted.js +19 -0
  26. package/cjs/framework/components/DropdownControlled.js +28 -0
  27. package/cjs/framework/components/ErrorBoundary.js +45 -0
  28. package/cjs/framework/components/Grid.js +64 -0
  29. package/cjs/framework/components/Help.js +24 -0
  30. package/cjs/framework/components/IconWrapper.js +55 -0
  31. package/cjs/framework/components/LoadingPage.js +14 -0
  32. package/cjs/framework/components/Masonry.js +113 -0
  33. package/cjs/framework/components/Scrollable.js +87 -0
  34. package/cjs/framework/components/SingleSelect.js +70 -0
  35. package/cjs/framework/components/patternfly-colors.js +32 -0
  36. package/cjs/framework/components/useBreakPoint.js +145 -0
  37. package/cjs/framework/components/useOpen.js +36 -0
  38. package/cjs/framework/components/useWindowLocation.js +70 -0
  39. package/cjs/framework/index.js +39 -0
  40. package/cjs/framework/useFrameworkTranslations.js +38 -0
  41. package/cjs/framework/useSelectDialog.js +81 -0
  42. package/cjs/framework/useSelectMultipleDialog.js +62 -0
  43. package/cjs/framework/useTableItems.js +485 -0
  44. package/cjs/framework/useView.js +155 -0
  45. package/cjs/framework/utils/compare.js +59 -0
  46. package/cjs/framework/utils/download-file.js +23 -0
  47. package/cjs/framework/utils/random-string.js +17 -0
  48. package/cjs/frontend/controller/access/organizations/Organization.js +2 -0
  49. package/mjs/framework/BulkActionDialog.d.ts +25 -0
  50. package/mjs/framework/BulkActionDialog.js +104 -0
  51. package/mjs/framework/BulkProgressDialog.d.ts +20 -0
  52. package/mjs/framework/BulkProgressDialog.js +131 -0
  53. package/mjs/framework/FilterDrawer.d.ts +8 -0
  54. package/mjs/framework/FilterDrawer.js +24 -0
  55. package/mjs/framework/PageBody.d.ts +4 -0
  56. package/mjs/framework/PageBody.js +29 -0
  57. package/mjs/framework/PageCatalog.d.ts +113 -0
  58. package/mjs/framework/PageCatalog.js +140 -0
  59. package/mjs/framework/PageCells.d.ts +35 -0
  60. package/mjs/framework/PageCells.js +102 -0
  61. package/mjs/framework/PageColumnModal.d.ts +7 -0
  62. package/mjs/framework/PageColumnModal.js +64 -0
  63. package/mjs/framework/PageDataList.d.ts +46 -0
  64. package/mjs/framework/PageDataList.js +45 -0
  65. package/mjs/framework/PageDialog.d.ts +10 -0
  66. package/mjs/framework/PageDialog.js +12 -0
  67. package/mjs/framework/PageForm.d.ts +147 -0
  68. package/mjs/framework/PageForm.js +316 -0
  69. package/mjs/framework/PageFramework.d.ts +4 -0
  70. package/mjs/framework/PageFramework.js +7 -0
  71. package/mjs/framework/PageHeader.d.ts +45 -0
  72. package/mjs/framework/PageHeader.js +80 -0
  73. package/mjs/framework/PageLayout.d.ts +15 -0
  74. package/mjs/framework/PageLayout.js +23 -0
  75. package/mjs/framework/PagePagination.d.ts +10 -0
  76. package/mjs/framework/PagePagination.js +22 -0
  77. package/mjs/framework/PageTable.d.ts +68 -0
  78. package/mjs/framework/PageTable.js +170 -0
  79. package/mjs/framework/PageTabs.d.ts +15 -0
  80. package/mjs/framework/PageTabs.js +45 -0
  81. package/mjs/framework/PageToolbar.d.ts +57 -0
  82. package/mjs/framework/PageToolbar.js +148 -0
  83. package/mjs/framework/Settings.d.ts +19 -0
  84. package/mjs/framework/Settings.js +87 -0
  85. package/mjs/framework/TypedActions.d.ts +80 -0
  86. package/mjs/framework/TypedActions.js +251 -0
  87. package/mjs/framework/components/BulkSelector.d.ts +11 -0
  88. package/mjs/framework/components/BulkSelector.js +56 -0
  89. package/mjs/framework/components/Collapse.d.ts +5 -0
  90. package/mjs/framework/components/Collapse.js +7 -0
  91. package/mjs/framework/components/DetailInfo.d.ts +5 -0
  92. package/mjs/framework/components/DetailInfo.js +8 -0
  93. package/mjs/framework/components/Details.d.ts +38 -0
  94. package/mjs/framework/components/Details.js +68 -0
  95. package/mjs/framework/components/Dotted.d.ts +4 -0
  96. package/mjs/framework/components/Dotted.js +4 -0
  97. package/mjs/framework/components/DropdownControlled.d.ts +4 -0
  98. package/mjs/framework/components/DropdownControlled.js +8 -0
  99. package/mjs/framework/components/ErrorBoundary.d.ts +15 -0
  100. package/mjs/framework/components/ErrorBoundary.js +25 -0
  101. package/mjs/framework/components/Grid.d.ts +6 -0
  102. package/mjs/framework/components/Grid.js +27 -0
  103. package/mjs/framework/components/Help.d.ts +5 -0
  104. package/mjs/framework/components/Help.js +9 -0
  105. package/mjs/framework/components/IconWrapper.d.ts +8 -0
  106. package/mjs/framework/components/IconWrapper.js +40 -0
  107. package/mjs/framework/components/LoadingPage.d.ts +6 -0
  108. package/mjs/framework/components/LoadingPage.js +9 -0
  109. package/mjs/framework/components/Masonry.d.ts +6 -0
  110. package/mjs/framework/components/Masonry.js +69 -0
  111. package/mjs/framework/components/Scrollable.d.ts +7 -0
  112. package/mjs/framework/components/Scrollable.js +60 -0
  113. package/mjs/framework/components/SingleSelect.d.ts +18 -0
  114. package/mjs/framework/components/SingleSelect.js +37 -0
  115. package/mjs/framework/components/patternfly-colors.d.ts +13 -0
  116. package/mjs/framework/components/patternfly-colors.js +28 -0
  117. package/mjs/framework/components/useBreakPoint.d.ts +5 -0
  118. package/mjs/framework/components/useBreakPoint.js +118 -0
  119. package/mjs/framework/components/useOpen.d.ts +4 -0
  120. package/mjs/framework/components/useOpen.js +16 -0
  121. package/mjs/framework/components/useWindowLocation.d.ts +6 -0
  122. package/mjs/framework/components/useWindowLocation.js +48 -0
  123. package/mjs/framework/index.d.ts +23 -0
  124. package/mjs/framework/index.js +23 -0
  125. package/mjs/framework/useFrameworkTranslations.d.ts +17 -0
  126. package/mjs/framework/useFrameworkTranslations.js +22 -0
  127. package/mjs/framework/useSelectDialog.d.ts +30 -0
  128. package/mjs/framework/useSelectDialog.js +49 -0
  129. package/mjs/framework/useSelectMultipleDialog.d.ts +21 -0
  130. package/mjs/framework/useSelectMultipleDialog.js +29 -0
  131. package/mjs/framework/useTableItems.d.ts +76 -0
  132. package/mjs/framework/useTableItems.js +371 -0
  133. package/mjs/framework/useView.d.ts +15 -0
  134. package/mjs/framework/useView.js +108 -0
  135. package/mjs/framework/utils/compare.d.ts +3 -0
  136. package/mjs/framework/utils/compare.js +53 -0
  137. package/mjs/framework/utils/download-file.d.ts +2 -0
  138. package/mjs/framework/utils/download-file.js +18 -0
  139. package/mjs/framework/utils/random-string.d.ts +1 -0
  140. package/mjs/framework/utils/random-string.js +12 -0
  141. package/mjs/frontend/controller/access/organizations/Organization.d.ts +44 -0
  142. package/mjs/frontend/controller/access/organizations/Organization.js +1 -0
  143. package/package.json +39 -0
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function Masonry(props: {
3
+ minSize: number;
4
+ maxColumns?: number;
5
+ children?: ReactNode;
6
+ }): JSX.Element;
@@ -0,0 +1,69 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Grid, GridItem, Stack } from '@patternfly/react-core';
3
+ import useResizeObserver from '@react-hook/resize-observer';
4
+ import { Children, useLayoutEffect, useMemo, useRef, useState, } from 'react';
5
+ export function Masonry(props) {
6
+ const target = useRef(null);
7
+ const [columns, setColumns] = useState(1);
8
+ useResizeObserver(target, (entry) => {
9
+ setColumns(Math.min(props.maxColumns ?? 12, Math.max(Math.floor(entry.contentRect.width / props.minSize), 1)));
10
+ });
11
+ const [span, setSpan] = useState(12);
12
+ const [sizes, setSizes] = useState({});
13
+ useLayoutEffect(() => {
14
+ switch (columns) {
15
+ case 1:
16
+ setSpan(12);
17
+ break;
18
+ case 2:
19
+ setSpan(6);
20
+ break;
21
+ case 3:
22
+ setSpan(4);
23
+ break;
24
+ case 4:
25
+ setSpan(3);
26
+ break;
27
+ case 5:
28
+ setSpan(2);
29
+ break;
30
+ case 6:
31
+ setSpan(2);
32
+ break;
33
+ default:
34
+ setSpan(1);
35
+ break;
36
+ }
37
+ }, [columns]);
38
+ const realColumns = 12 / span;
39
+ const itemColumns = useMemo(() => {
40
+ const itemColumns = new Array(realColumns).fill(0).map(() => []);
41
+ const columnHeights = new Array(realColumns).fill(0);
42
+ Children.forEach(props.children, (child, index) => {
43
+ const smallest = Math.min(...columnHeights);
44
+ const columnIndex = columnHeights.findIndex((column) => column === smallest);
45
+ if (columnIndex !== undefined && columnIndex !== -1) {
46
+ itemColumns[columnIndex].push(_jsx(MasonryItem, { index: index, sizes: sizes, setSizes: setSizes, children: child }, index));
47
+ const height = sizes[index];
48
+ if (height !== undefined) {
49
+ columnHeights[columnIndex] += height + 16;
50
+ }
51
+ }
52
+ });
53
+ return itemColumns;
54
+ }, [props.children, realColumns, sizes]);
55
+ return (_jsx("div", { ref: target, children: _jsx(Grid, { hasGutter: true, style: { maxWidth: realColumns * props.minSize }, children: itemColumns.map((column, index) => (_jsx(GridItem, { span: span, children: _jsx(Stack, { hasGutter: true, children: column }) }, index))) }) }));
56
+ }
57
+ function MasonryItem(props) {
58
+ const target = useRef(null);
59
+ useResizeObserver(target, (entry) => {
60
+ props.setSizes((sizes) => {
61
+ if (props.sizes[props.index] !== entry.contentRect.height) {
62
+ sizes = { ...sizes };
63
+ sizes[props.index] = entry.contentRect.height;
64
+ }
65
+ return sizes;
66
+ });
67
+ });
68
+ return _jsx("div", { ref: target, children: props.children });
69
+ }
@@ -0,0 +1,7 @@
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ export declare function Scrollable(props: {
3
+ children?: ReactNode;
4
+ borderTop?: boolean;
5
+ borderBottom?: boolean;
6
+ style?: CSSProperties;
7
+ }): JSX.Element;
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import useResizeObserver from '@react-hook/resize-observer';
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ export function Scrollable(props) {
5
+ const divEl = useRef(null);
6
+ const [topShadow, setTopShadow] = useState(0);
7
+ const [bottomShadow, setBottomShadow] = useState(0);
8
+ const update = useCallback(() => {
9
+ /* istanbul ignore else */
10
+ if (divEl.current) {
11
+ setTopShadow(Math.min(1, divEl.current.scrollTop / 8));
12
+ const scrollBottom = divEl.current.scrollHeight - divEl.current.scrollTop - divEl.current.clientHeight - 1;
13
+ setBottomShadow(Math.max(0, Math.min(1, scrollBottom / 8)));
14
+ }
15
+ }, []);
16
+ useEffect(() => update(), [update, props.children]);
17
+ useResizeObserver(divEl, () => {
18
+ update();
19
+ });
20
+ const shadowOpacityTop = 0.2 * topShadow;
21
+ const shadowOpacityBottom = 0.2 * bottomShadow;
22
+ // const [theme] = useTheme()
23
+ // if (theme === ThemeE.Dark) {
24
+ // shadowOpacityTop *= 6
25
+ // shadowOpacityBottom *= 6
26
+ // }
27
+ /* istanbul ignore next */
28
+ const borderTop = props.borderTop ? 'thin solid rgba(0, 0, 0, 0.12)' : '';
29
+ /* istanbul ignore next */
30
+ const borderBottom = props.borderBottom ? 'thin solid rgba(0, 0, 0, 0.12)' : '';
31
+ return (_jsxs("div", { style: {
32
+ ...props.style,
33
+ display: 'flex',
34
+ flexDirection: 'column',
35
+ flexGrow: 1,
36
+ overflowY: 'hidden',
37
+ position: 'relative',
38
+ }, children: [_jsx("div", { ref: divEl, style: {
39
+ display: 'flex',
40
+ flexDirection: 'column',
41
+ flexGrow: 1,
42
+ overflowY: 'auto',
43
+ borderTop,
44
+ borderBottom,
45
+ }, onScroll: update, children: props.children }),
46
+ /* istanbul ignore next */ shadowOpacityTop > 0 && (_jsx("div", { style: {
47
+ position: 'absolute',
48
+ top: 0,
49
+ height: '10px',
50
+ width: '100%',
51
+ background: `linear-gradient(rgba(0,0,0,${shadowOpacityTop}), rgba(0,0,0,0))`,
52
+ } })),
53
+ /* istanbul ignore next */ shadowOpacityBottom > 0 && (_jsx("div", { style: {
54
+ position: 'absolute',
55
+ bottom: 0,
56
+ height: '10px',
57
+ width: '100%',
58
+ background: `linear-gradient(rgba(0,0,0,0), rgba(0,0,0,${shadowOpacityBottom}))`,
59
+ } }))] }));
60
+ }
@@ -0,0 +1,18 @@
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ export declare function SingleSelect(props: {
3
+ id?: string;
4
+ label: string;
5
+ value: string;
6
+ onChange: (value: string) => void;
7
+ children: ReactNode;
8
+ style?: CSSProperties;
9
+ open?: boolean;
10
+ setOpen?: (open: boolean) => void;
11
+ }): JSX.Element;
12
+ export declare function SingleSelect2(props: {
13
+ id?: string;
14
+ children: ReactNode;
15
+ value?: string;
16
+ onChange: (value: string) => void;
17
+ label?: string;
18
+ }): JSX.Element;
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { FormGroup, Select } from '@patternfly/react-core';
3
+ import { useCallback, useState } from 'react';
4
+ import { useOpen } from './useOpen';
5
+ export function SingleSelect(props) {
6
+ const { onChange } = props;
7
+ const [open, setOpen, onToggle] = useOpen(props);
8
+ const onSelect = useCallback((_e, v) => {
9
+ if (typeof v === 'string') {
10
+ onChange(v);
11
+ }
12
+ else {
13
+ onChange(v.toString());
14
+ }
15
+ setOpen(false);
16
+ }, [onChange, setOpen]);
17
+ const id = props.id ?? props.label.toLocaleLowerCase().split(' ').join('-');
18
+ return (_jsx(FormGroup, { label: props.label, fieldId: id, style: props.style, children: _jsx(Select, { id: id, selections: props.value, isOpen: open, onToggle: onToggle, onSelect: onSelect, children: props.children }) }));
19
+ }
20
+ export function SingleSelect2(props) {
21
+ const { onChange } = props;
22
+ const { id } = props;
23
+ const [open, setOpen] = useState(false);
24
+ const onToggle = useCallback(() => {
25
+ setOpen((open) => !open);
26
+ }, []);
27
+ const onSelect = useCallback((_e, v) => {
28
+ if (typeof v === 'string') {
29
+ onChange(v);
30
+ }
31
+ else {
32
+ onChange(v.toString());
33
+ }
34
+ setOpen(false);
35
+ }, [onChange]);
36
+ return (_jsx(Select, { id: id, selections: props.value, isOpen: open, onToggle: onToggle, onSelect: onSelect, children: props.children }));
37
+ }
@@ -0,0 +1,13 @@
1
+ export declare enum PatternFlyColor {
2
+ Green = "green",
3
+ Blue = "blue",
4
+ Red = "red",
5
+ Yellow = "yellow",
6
+ Grey = "grey"
7
+ }
8
+ export declare function getPatternflyColor(color: PatternFlyColor): "var(--pf-global--success-color--100)" | "var(--pf-global--danger-color--100)" | "var(--pf-global--warning-color--100)" | "var(--pf-global--info-color--100)" | "var(--pf-global--disabled-color--100)" | undefined;
9
+ export declare const pfSuccess = "var(--pf-global--success-color--100)";
10
+ export declare const pfDanger = "var(--pf-global--danger-color--100)";
11
+ export declare const pfWarning = "var(--pf-global--warning-color--100)";
12
+ export declare const pfInfo = "var(--pf-global--info-color--100)";
13
+ export declare const pfDisabled = "var(--pf-global--disabled-color--100)";
@@ -0,0 +1,28 @@
1
+ export var PatternFlyColor;
2
+ (function (PatternFlyColor) {
3
+ PatternFlyColor["Green"] = "green";
4
+ PatternFlyColor["Blue"] = "blue";
5
+ PatternFlyColor["Red"] = "red";
6
+ PatternFlyColor["Yellow"] = "yellow";
7
+ PatternFlyColor["Grey"] = "grey";
8
+ })(PatternFlyColor || (PatternFlyColor = {}));
9
+ export function getPatternflyColor(color) {
10
+ switch (color) {
11
+ case 'green':
12
+ return pfSuccess;
13
+ case 'red':
14
+ return pfDanger;
15
+ case 'yellow':
16
+ return pfWarning;
17
+ case 'blue':
18
+ return pfInfo;
19
+ case 'grey':
20
+ return pfDisabled;
21
+ }
22
+ return undefined;
23
+ }
24
+ export const pfSuccess = 'var(--pf-global--success-color--100)';
25
+ export const pfDanger = 'var(--pf-global--danger-color--100)';
26
+ export const pfWarning = 'var(--pf-global--warning-color--100)';
27
+ export const pfInfo = 'var(--pf-global--info-color--100)';
28
+ export const pfDisabled = 'var(--pf-global--disabled-color--100)';
@@ -0,0 +1,5 @@
1
+ export declare type WindowSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
2
+ export declare function useWindowSize(): WindowSize;
3
+ /** Returns true if the window size is equal to or larger than the indicated size. */
4
+ export declare function useBreakpoint(size: WindowSize): boolean;
5
+ export declare function useOrientation(): 'landscape' | 'portrait';
@@ -0,0 +1,118 @@
1
+ import xl2Breakpoint from '@patternfly/react-tokens/dist/esm/global_breakpoint_2xl';
2
+ import lgBreakpoint from '@patternfly/react-tokens/dist/esm/global_breakpoint_lg';
3
+ import mdBreakpoint from '@patternfly/react-tokens/dist/esm/global_breakpoint_md';
4
+ import smBreakpoint from '@patternfly/react-tokens/dist/esm/global_breakpoint_sm';
5
+ import xlBreakpoint from '@patternfly/react-tokens/dist/esm/global_breakpoint_xl';
6
+ import xsBreakpoint from '@patternfly/react-tokens/dist/esm/global_breakpoint_xs';
7
+ import { useCallback, useEffect, useState } from 'react';
8
+ const breakpoints = {
9
+ xs: Number(xsBreakpoint.value.replace('px', '')),
10
+ sm: Number(smBreakpoint.value.replace('px', '')),
11
+ md: Number(mdBreakpoint.value.replace('px', '')),
12
+ lg: Number(lgBreakpoint.value.replace('px', '')),
13
+ xl: Number(xlBreakpoint.value.replace('px', '')),
14
+ xxl: Number(xl2Breakpoint.value.replace('px', '')),
15
+ };
16
+ export function useWindowSize() {
17
+ const [windowSize, setWindowSize] = useState(() => {
18
+ if (window.innerWidth <= breakpoints.sm)
19
+ return 'xs';
20
+ else if (window.innerWidth <= breakpoints.md)
21
+ return 'sm';
22
+ else if (window.innerWidth <= breakpoints.lg)
23
+ return 'md';
24
+ else if (window.innerWidth <= breakpoints.xl)
25
+ return 'lg';
26
+ else if (window.innerWidth <= breakpoints.xxl)
27
+ return 'xl';
28
+ else
29
+ return 'xxl';
30
+ });
31
+ const handleResize = useCallback(() => {
32
+ if (window.innerWidth <= breakpoints.sm)
33
+ setWindowSize('xs');
34
+ else if (window.innerWidth <= breakpoints.md)
35
+ setWindowSize('sm');
36
+ else if (window.innerWidth <= breakpoints.lg)
37
+ setWindowSize('md');
38
+ else if (window.innerWidth <= breakpoints.xl)
39
+ setWindowSize('lg');
40
+ else if (window.innerWidth <= breakpoints.xxl)
41
+ setWindowSize('xl');
42
+ else
43
+ setWindowSize('xxl');
44
+ }, []);
45
+ useEffect(() => {
46
+ const handler = handleResize;
47
+ window.addEventListener('resize', handler);
48
+ return () => window.removeEventListener('resize', handler);
49
+ }, [handleResize]);
50
+ useEffect(() => handleResize(), [handleResize]);
51
+ return windowSize;
52
+ }
53
+ /** Returns true if the window size is equal to or larger than the indicated size. */
54
+ export function useBreakpoint(size) {
55
+ const windowSize = useWindowSize();
56
+ switch (size) {
57
+ case 'xs':
58
+ return true;
59
+ case 'sm':
60
+ switch (windowSize) {
61
+ case 'sm':
62
+ case 'md':
63
+ case 'lg':
64
+ case 'xl':
65
+ case 'xxl':
66
+ return true;
67
+ default:
68
+ return false;
69
+ }
70
+ case 'md':
71
+ switch (windowSize) {
72
+ case 'md':
73
+ case 'lg':
74
+ case 'xl':
75
+ case 'xxl':
76
+ return true;
77
+ default:
78
+ return false;
79
+ }
80
+ case 'lg':
81
+ switch (windowSize) {
82
+ case 'lg':
83
+ case 'xl':
84
+ case 'xxl':
85
+ return true;
86
+ default:
87
+ return false;
88
+ }
89
+ case 'xl':
90
+ switch (windowSize) {
91
+ case 'xl':
92
+ case 'xxl':
93
+ return true;
94
+ default:
95
+ return false;
96
+ }
97
+ case 'xxl':
98
+ switch (windowSize) {
99
+ case 'xxl':
100
+ return true;
101
+ default:
102
+ return false;
103
+ }
104
+ }
105
+ }
106
+ export function useOrientation() {
107
+ const [orientation, setOrientation] = useState(() => window.innerWidth > window.innerHeight ? 'landscape' : 'portrait');
108
+ const handleResize = useCallback(() => {
109
+ setOrientation(window.innerWidth > window.innerHeight ? 'landscape' : 'portrait');
110
+ }, []);
111
+ useEffect(() => {
112
+ const handler = handleResize;
113
+ window.addEventListener('resize', handler);
114
+ return () => window.removeEventListener('resize', handler);
115
+ }, [handleResize]);
116
+ useEffect(() => handleResize(), [handleResize]);
117
+ return orientation;
118
+ }
@@ -0,0 +1,4 @@
1
+ export declare function useOpen(props: {
2
+ open?: boolean;
3
+ setOpen?: (open: boolean) => void;
4
+ }): [boolean, (open: boolean) => void, () => void];
@@ -0,0 +1,16 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ export function useOpen(props) {
3
+ const [open, setOpenState] = useState(() => props.open ?? false);
4
+ useEffect(() => {
5
+ if (props.open !== undefined) {
6
+ setOpenState(props.open);
7
+ }
8
+ }, [props.open, setOpenState]);
9
+ const setOpen = useCallback((open) => {
10
+ props.setOpen ? props.setOpen(open) : setOpenState(open);
11
+ }, [props]);
12
+ const onToggle = useCallback(() => {
13
+ setOpen(!open);
14
+ }, [open, setOpen]);
15
+ return [open, setOpen, onToggle];
16
+ }
@@ -0,0 +1,6 @@
1
+ export declare function useWindowHistory(): {
2
+ location: void | Location;
3
+ push: (url?: string | URL | null) => void;
4
+ update: (url?: string | URL | null) => void;
5
+ };
6
+ export declare function useSearchParams(): [URLSearchParams, (setSearchParams: URLSearchParams) => void];
@@ -0,0 +1,48 @@
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ function useIsMounted() {
3
+ const [isMounted, setIsMounted] = useState(true);
4
+ useEffect(() => () => {
5
+ setIsMounted(false);
6
+ }, []);
7
+ return isMounted;
8
+ }
9
+ export function useWindowHistory() {
10
+ const isMounted = useIsMounted();
11
+ const [location, setLocation] = useState(isMounted ? window.location : undefined);
12
+ const setWindowLocation = useCallback(() => {
13
+ setLocation(window.location);
14
+ }, []);
15
+ useEffect(() => {
16
+ if (!isMounted)
17
+ return;
18
+ if (!location) {
19
+ setWindowLocation();
20
+ }
21
+ window.addEventListener('popstate', setWindowLocation);
22
+ return () => {
23
+ window.removeEventListener('popstate', setWindowLocation);
24
+ };
25
+ }, [isMounted, location, setWindowLocation]);
26
+ const push = useCallback((url) => {
27
+ window.history.replaceState(null, '', url);
28
+ setWindowLocation();
29
+ }, [setWindowLocation]);
30
+ const update = useCallback((url) => {
31
+ window.history.replaceState(null, '', url);
32
+ setWindowLocation();
33
+ }, [setWindowLocation]);
34
+ return { location, push, update };
35
+ }
36
+ export function useSearchParams() {
37
+ const history = useWindowHistory();
38
+ const pathname = history.location?.pathname || '/';
39
+ const searchParams = useMemo(() => new URLSearchParams(history.location?.search ?? '/'), [history.location?.search]);
40
+ const setSearchParams = useCallback((searchParams) => {
41
+ const newSearch = searchParams.toString();
42
+ if (newSearch)
43
+ history.update('?' + newSearch);
44
+ else
45
+ history.update(pathname); // retain the existing pathname
46
+ }, [history, pathname]);
47
+ return [searchParams, setSearchParams];
48
+ }
@@ -0,0 +1,23 @@
1
+ export * from './BulkActionDialog';
2
+ export * from './components/BulkSelector';
3
+ export * from './components/Collapse';
4
+ export * from './components/Details';
5
+ export * from './components/Help';
6
+ export * from './components/patternfly-colors';
7
+ export * from './components/useBreakPoint';
8
+ export * from './PageBody';
9
+ export * from './PageCatalog';
10
+ export * from './PageCells';
11
+ export * from './PageDataList';
12
+ export * from './PageDialog';
13
+ export * from './PageForm';
14
+ export * from './PageFramework';
15
+ export * from './PageHeader';
16
+ export * from './PageLayout';
17
+ export * from './PageTable';
18
+ export * from './PageTabs';
19
+ export * from './PageToolbar';
20
+ export * from './TypedActions';
21
+ export * from './useSelectDialog';
22
+ export * from './useTableItems';
23
+ export * from './utils/compare';
@@ -0,0 +1,23 @@
1
+ export * from './BulkActionDialog';
2
+ export * from './components/BulkSelector';
3
+ export * from './components/Collapse';
4
+ export * from './components/Details';
5
+ export * from './components/Help';
6
+ export * from './components/patternfly-colors';
7
+ export * from './components/useBreakPoint';
8
+ export * from './PageBody';
9
+ export * from './PageCatalog';
10
+ export * from './PageCells';
11
+ export * from './PageDataList';
12
+ export * from './PageDialog';
13
+ export * from './PageForm';
14
+ export * from './PageFramework';
15
+ export * from './PageHeader';
16
+ export * from './PageLayout';
17
+ export * from './PageTable';
18
+ export * from './PageTabs';
19
+ export * from './PageToolbar';
20
+ export * from './TypedActions';
21
+ export * from './useSelectDialog';
22
+ export * from './useTableItems';
23
+ export * from './utils/compare';
@@ -0,0 +1,17 @@
1
+ import { Dispatch, ReactNode, SetStateAction } from 'react';
2
+ export interface IFrameworkTranslations {
3
+ errorText: string;
4
+ cancelText: string;
5
+ closeText: string;
6
+ confirmText: string;
7
+ pendingText: string;
8
+ submitText: string;
9
+ submittingText: string;
10
+ successText: string;
11
+ processingText: string;
12
+ noItemsFound: string;
13
+ }
14
+ export declare function FrameworkTranslationsProvider(props: {
15
+ children: ReactNode;
16
+ }): JSX.Element;
17
+ export declare function useFrameworkTranslations(): [translations: IFrameworkTranslations, setTranslations: Dispatch<SetStateAction<IFrameworkTranslations>>];
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useState } from 'react';
3
+ const defaultTranslations = {
4
+ errorText: 'Error',
5
+ cancelText: 'Cancel',
6
+ closeText: 'Close',
7
+ confirmText: 'Confirm',
8
+ pendingText: 'Pending',
9
+ submitText: 'Submit',
10
+ submittingText: 'Submitting',
11
+ successText: 'Success',
12
+ processingText: 'Processing',
13
+ noItemsFound: 'No items found',
14
+ };
15
+ const FrameworkTranslationsContext = createContext([defaultTranslations, () => alert('Use FrameworkTranslationsProvider')]);
16
+ export function FrameworkTranslationsProvider(props) {
17
+ const state = useState(defaultTranslations);
18
+ return (_jsx(FrameworkTranslationsContext.Provider, { value: state, children: props.children }));
19
+ }
20
+ export function useFrameworkTranslations() {
21
+ return useContext(FrameworkTranslationsContext);
22
+ }
@@ -0,0 +1,30 @@
1
+ /// <reference types="react" />
2
+ import { ITableColumn } from './PageTable';
3
+ import { IToolbarFilter } from './PageToolbar';
4
+ import { ISelected } from './useTableItems';
5
+ import { IView } from './useView';
6
+ interface ISelectDialogOptions<T extends object> {
7
+ view: IView & ISelected<T> & {
8
+ itemCount?: number;
9
+ pageItems: T[] | undefined;
10
+ };
11
+ tableColumns: ITableColumn<T>[];
12
+ toolbarFilters: IToolbarFilter[];
13
+ confirm: string;
14
+ cancel: string;
15
+ selected: string;
16
+ }
17
+ export declare function useSelectDialog<T extends {
18
+ id: number;
19
+ }>(options: ISelectDialogOptions<T>): (onSelect?: ((item: T) => void) | undefined, title?: string) => void;
20
+ export declare type SelectDialogProps<T extends object> = {
21
+ title: string;
22
+ open: boolean;
23
+ setOpen: (open: boolean) => void;
24
+ onSelect: (item: T) => void;
25
+ keyFn: (item: T) => string | number;
26
+ } & ISelectDialogOptions<T>;
27
+ export declare function SelectDialog<T extends {
28
+ id: number;
29
+ }>(props: SelectDialogProps<T>): JSX.Element;
30
+ export {};
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Modal, ModalBoxBody, ModalVariant, Skeleton, Split, SplitItem, } from '@patternfly/react-core';
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import { Collapse } from './components/Collapse';
5
+ import { usePageDialog } from './PageDialog';
6
+ import { PageTable } from './PageTable';
7
+ export function useSelectDialog(options) {
8
+ const { view, tableColumns, toolbarFilters, confirm, cancel, selected } = options;
9
+ const [title, setTitle] = useState('');
10
+ const [onSelect, setOnSelect] = useState();
11
+ const openSetting = useCallback((onSelect, title) => {
12
+ setTitle(title ?? '');
13
+ setOnSelect(() => onSelect);
14
+ }, []);
15
+ const [_, setDialog] = usePageDialog();
16
+ useEffect(() => {
17
+ if (onSelect !== undefined) {
18
+ setDialog(_jsx(SelectDialog, { title: title, open: true, setOpen: () => setOnSelect(undefined), onSelect: onSelect, view: view, tableColumns: tableColumns, toolbarFilters: toolbarFilters, confirm: confirm, cancel: cancel, selected: selected, keyFn: view.keyFn }));
19
+ }
20
+ else {
21
+ setDialog(undefined);
22
+ view.unselectAll();
23
+ }
24
+ }, [cancel, confirm, onSelect, selected, setDialog, tableColumns, title, toolbarFilters, view]);
25
+ return openSetting;
26
+ }
27
+ export function SelectDialog(props) {
28
+ const { title, open, setOpen, onSelect, view, tableColumns, toolbarFilters, confirm, cancel, selected, } = props;
29
+ const onClose = () => setOpen(false);
30
+ return (_jsxs(Modal, { title: title, isOpen: open, onClose: onClose, variant: ModalVariant.medium, tabIndex: 0, actions: [
31
+ _jsx(Button, { variant: "primary", onClick: () => {
32
+ if (view.selectedItems.length > 0) {
33
+ onSelect(view.selectedItems[0]);
34
+ }
35
+ onClose();
36
+ }, isAriaDisabled: view.selectedItems.length === 0, children: confirm }, "confirm"),
37
+ _jsx(Button, { variant: "link", onClick: onClose, children: cancel }, "cancel"),
38
+ ], hasNoBodyWrapper: true, children: [_jsx(ModalBoxBody, { style: { overflow: 'hidden' }, children: _jsxs(Split, { hasGutter: true, children: [_jsx(SplitItem, { style: { opacity: view.selectedItems.length === 0 ? 0 : undefined }, children: selected }), _jsxs("b", { children: [view.selectedItems.map((item) => {
39
+ if (tableColumns && tableColumns.length > 0) {
40
+ return _jsx("span", { children: tableColumns[0].cell(item) }, props.keyFn(item));
41
+ }
42
+ return _jsx(_Fragment, {});
43
+ }), _jsx(_Fragment, {})] })] }) }), _jsx(Collapse, { open: view.itemCount === undefined, children: _jsx(Skeleton, { height: "80px" }) }), _jsx(Collapse, { open: view.itemCount !== undefined, children: _jsx("div", { style: {
44
+ display: 'flex',
45
+ flexDirection: 'column',
46
+ maxHeight: 400,
47
+ overflow: 'hidden',
48
+ }, children: _jsx(PageTable, { tableColumns: tableColumns, toolbarFilters: toolbarFilters, emptyStateTitle: "No organizations found", errorStateTitle: "Error loading organizations", ...view, onSelect: () => null }) }) })] }));
49
+ }
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { ITableColumn } from './PageTable';
3
+ import { IToolbarFilter } from './PageToolbar';
4
+ import { ISelected } from './useTableItems';
5
+ import { IView } from './useView';
6
+ export declare type SelectMultipleDialogProps<T extends object> = {
7
+ title: string;
8
+ view: IView & ISelected<T> & {
9
+ itemCount?: number;
10
+ pageItems: T[] | undefined;
11
+ };
12
+ tableColumns: ITableColumn<T>[];
13
+ toolbarFilters: IToolbarFilter[];
14
+ onSelect: (items: T[]) => void;
15
+ confirmText?: string;
16
+ cancelText?: string;
17
+ emptyStateTitle?: string;
18
+ errorStateTitle?: string;
19
+ };
20
+ export declare function SelectMultipleDialog<T extends object>(props: SelectMultipleDialogProps<T>): JSX.Element;
21
+ export declare function useSelectMultipleDialog<T extends object>(): (props: SelectMultipleDialogProps<T>) => void;