@ansible/ansible-ui-framework 0.0.190

Sign up to get free protection for your applications and to get access to all the features.
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;