@ansible/ansible-ui-framework 0.0.190
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE +21 -0
- package/cjs/framework/BulkActionDialog.js +217 -0
- package/cjs/framework/BulkProgressDialog.js +240 -0
- package/cjs/framework/FilterDrawer.js +64 -0
- package/cjs/framework/PageBody.js +47 -0
- package/cjs/framework/PageCatalog.js +178 -0
- package/cjs/framework/PageCells.js +141 -0
- package/cjs/framework/PageColumnModal.js +130 -0
- package/cjs/framework/PageDataList.js +61 -0
- package/cjs/framework/PageDialog.js +28 -0
- package/cjs/framework/PageForm.js +376 -0
- package/cjs/framework/PageFramework.js +11 -0
- package/cjs/framework/PageHeader.js +96 -0
- package/cjs/framework/PageLayout.js +41 -0
- package/cjs/framework/PagePagination.js +28 -0
- package/cjs/framework/PageTable.js +205 -0
- package/cjs/framework/PageTabs.js +82 -0
- package/cjs/framework/PageToolbar.js +209 -0
- package/cjs/framework/Settings.js +122 -0
- package/cjs/framework/TypedActions.js +303 -0
- package/cjs/framework/components/BulkSelector.js +89 -0
- package/cjs/framework/components/Collapse.js +22 -0
- package/cjs/framework/components/DetailInfo.js +23 -0
- package/cjs/framework/components/Details.js +88 -0
- package/cjs/framework/components/Dotted.js +19 -0
- package/cjs/framework/components/DropdownControlled.js +28 -0
- package/cjs/framework/components/ErrorBoundary.js +45 -0
- package/cjs/framework/components/Grid.js +64 -0
- package/cjs/framework/components/Help.js +24 -0
- package/cjs/framework/components/IconWrapper.js +55 -0
- package/cjs/framework/components/LoadingPage.js +14 -0
- package/cjs/framework/components/Masonry.js +113 -0
- package/cjs/framework/components/Scrollable.js +87 -0
- package/cjs/framework/components/SingleSelect.js +70 -0
- package/cjs/framework/components/patternfly-colors.js +32 -0
- package/cjs/framework/components/useBreakPoint.js +145 -0
- package/cjs/framework/components/useOpen.js +36 -0
- package/cjs/framework/components/useWindowLocation.js +70 -0
- package/cjs/framework/index.js +39 -0
- package/cjs/framework/useFrameworkTranslations.js +38 -0
- package/cjs/framework/useSelectDialog.js +81 -0
- package/cjs/framework/useSelectMultipleDialog.js +62 -0
- package/cjs/framework/useTableItems.js +485 -0
- package/cjs/framework/useView.js +155 -0
- package/cjs/framework/utils/compare.js +59 -0
- package/cjs/framework/utils/download-file.js +23 -0
- package/cjs/framework/utils/random-string.js +17 -0
- package/cjs/frontend/controller/access/organizations/Organization.js +2 -0
- package/mjs/framework/BulkActionDialog.d.ts +25 -0
- package/mjs/framework/BulkActionDialog.js +104 -0
- package/mjs/framework/BulkProgressDialog.d.ts +20 -0
- package/mjs/framework/BulkProgressDialog.js +131 -0
- package/mjs/framework/FilterDrawer.d.ts +8 -0
- package/mjs/framework/FilterDrawer.js +24 -0
- package/mjs/framework/PageBody.d.ts +4 -0
- package/mjs/framework/PageBody.js +29 -0
- package/mjs/framework/PageCatalog.d.ts +113 -0
- package/mjs/framework/PageCatalog.js +140 -0
- package/mjs/framework/PageCells.d.ts +35 -0
- package/mjs/framework/PageCells.js +102 -0
- package/mjs/framework/PageColumnModal.d.ts +7 -0
- package/mjs/framework/PageColumnModal.js +64 -0
- package/mjs/framework/PageDataList.d.ts +46 -0
- package/mjs/framework/PageDataList.js +45 -0
- package/mjs/framework/PageDialog.d.ts +10 -0
- package/mjs/framework/PageDialog.js +12 -0
- package/mjs/framework/PageForm.d.ts +147 -0
- package/mjs/framework/PageForm.js +316 -0
- package/mjs/framework/PageFramework.d.ts +4 -0
- package/mjs/framework/PageFramework.js +7 -0
- package/mjs/framework/PageHeader.d.ts +45 -0
- package/mjs/framework/PageHeader.js +80 -0
- package/mjs/framework/PageLayout.d.ts +15 -0
- package/mjs/framework/PageLayout.js +23 -0
- package/mjs/framework/PagePagination.d.ts +10 -0
- package/mjs/framework/PagePagination.js +22 -0
- package/mjs/framework/PageTable.d.ts +68 -0
- package/mjs/framework/PageTable.js +170 -0
- package/mjs/framework/PageTabs.d.ts +15 -0
- package/mjs/framework/PageTabs.js +45 -0
- package/mjs/framework/PageToolbar.d.ts +57 -0
- package/mjs/framework/PageToolbar.js +148 -0
- package/mjs/framework/Settings.d.ts +19 -0
- package/mjs/framework/Settings.js +87 -0
- package/mjs/framework/TypedActions.d.ts +80 -0
- package/mjs/framework/TypedActions.js +251 -0
- package/mjs/framework/components/BulkSelector.d.ts +11 -0
- package/mjs/framework/components/BulkSelector.js +56 -0
- package/mjs/framework/components/Collapse.d.ts +5 -0
- package/mjs/framework/components/Collapse.js +7 -0
- package/mjs/framework/components/DetailInfo.d.ts +5 -0
- package/mjs/framework/components/DetailInfo.js +8 -0
- package/mjs/framework/components/Details.d.ts +38 -0
- package/mjs/framework/components/Details.js +68 -0
- package/mjs/framework/components/Dotted.d.ts +4 -0
- package/mjs/framework/components/Dotted.js +4 -0
- package/mjs/framework/components/DropdownControlled.d.ts +4 -0
- package/mjs/framework/components/DropdownControlled.js +8 -0
- package/mjs/framework/components/ErrorBoundary.d.ts +15 -0
- package/mjs/framework/components/ErrorBoundary.js +25 -0
- package/mjs/framework/components/Grid.d.ts +6 -0
- package/mjs/framework/components/Grid.js +27 -0
- package/mjs/framework/components/Help.d.ts +5 -0
- package/mjs/framework/components/Help.js +9 -0
- package/mjs/framework/components/IconWrapper.d.ts +8 -0
- package/mjs/framework/components/IconWrapper.js +40 -0
- package/mjs/framework/components/LoadingPage.d.ts +6 -0
- package/mjs/framework/components/LoadingPage.js +9 -0
- package/mjs/framework/components/Masonry.d.ts +6 -0
- package/mjs/framework/components/Masonry.js +69 -0
- package/mjs/framework/components/Scrollable.d.ts +7 -0
- package/mjs/framework/components/Scrollable.js +60 -0
- package/mjs/framework/components/SingleSelect.d.ts +18 -0
- package/mjs/framework/components/SingleSelect.js +37 -0
- package/mjs/framework/components/patternfly-colors.d.ts +13 -0
- package/mjs/framework/components/patternfly-colors.js +28 -0
- package/mjs/framework/components/useBreakPoint.d.ts +5 -0
- package/mjs/framework/components/useBreakPoint.js +118 -0
- package/mjs/framework/components/useOpen.d.ts +4 -0
- package/mjs/framework/components/useOpen.js +16 -0
- package/mjs/framework/components/useWindowLocation.d.ts +6 -0
- package/mjs/framework/components/useWindowLocation.js +48 -0
- package/mjs/framework/index.d.ts +23 -0
- package/mjs/framework/index.js +23 -0
- package/mjs/framework/useFrameworkTranslations.d.ts +17 -0
- package/mjs/framework/useFrameworkTranslations.js +22 -0
- package/mjs/framework/useSelectDialog.d.ts +30 -0
- package/mjs/framework/useSelectDialog.js +49 -0
- package/mjs/framework/useSelectMultipleDialog.d.ts +21 -0
- package/mjs/framework/useSelectMultipleDialog.js +29 -0
- package/mjs/framework/useTableItems.d.ts +76 -0
- package/mjs/framework/useTableItems.js +371 -0
- package/mjs/framework/useView.d.ts +15 -0
- package/mjs/framework/useView.js +108 -0
- package/mjs/framework/utils/compare.d.ts +3 -0
- package/mjs/framework/utils/compare.js +53 -0
- package/mjs/framework/utils/download-file.d.ts +2 -0
- package/mjs/framework/utils/download-file.js +18 -0
- package/mjs/framework/utils/random-string.d.ts +1 -0
- package/mjs/framework/utils/random-string.js +12 -0
- package/mjs/frontend/controller/access/organizations/Organization.d.ts +44 -0
- package/mjs/frontend/controller/access/organizations/Organization.js +1 -0
- package/package.json +39 -0
@@ -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,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,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;
|