@ansible/ansible-ui-framework 0.0.428 → 0.0.448

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. package/README.md +1 -1
  2. package/cjs/PageActions/PageAction.d.ts +1 -1
  3. package/cjs/PageActions/PageSingleAction.js +1 -1
  4. package/cjs/PageCells/TextCell.d.ts +1 -1
  5. package/cjs/PageDetails/PageDetail.d.ts +6 -0
  6. package/cjs/PageDetails/PageDetail.js +27 -0
  7. package/cjs/PageDetails/PageDetails.d.ts +5 -0
  8. package/cjs/PageDetails/PageDetails.js +45 -0
  9. package/cjs/PageDetails/PageDetailsFromColumns.d.ts +6 -0
  10. package/cjs/{PageTable/PageTableDetails.js → PageDetails/PageDetailsFromColumns.js} +7 -6
  11. package/cjs/PageForm/Inputs/PageFormCheckbox.d.ts +9 -8
  12. package/cjs/PageForm/Inputs/PageFormCheckbox.js +8 -4
  13. package/cjs/PageForm/Inputs/PageFormFileUpload.js +1 -1
  14. package/cjs/PageForm/Inputs/PageFormSelect.js +1 -1
  15. package/cjs/PageForm/Inputs/PageFormSelectOption.d.ts +2 -0
  16. package/cjs/PageForm/Inputs/PageFormSelectOption.js +11 -1
  17. package/cjs/PageForm/Inputs/PageFormTextArea.js +1 -1
  18. package/cjs/PageForm/Inputs/PageFormTextInput.js +1 -1
  19. package/cjs/PageForm/PageForm.d.ts +2 -0
  20. package/cjs/PageForm/PageForm.js +10 -9
  21. package/cjs/PageForm/Utils/PageFormHidden.d.ts +6 -0
  22. package/cjs/PageForm/Utils/PageFormHidden.js +13 -0
  23. package/cjs/PageForm/Utils/PageFormSection.d.ts +5 -0
  24. package/cjs/PageForm/Utils/PageFormSection.js +20 -0
  25. package/cjs/PageForm/{Inputs → Utils}/PageFormWatch.d.ts +0 -0
  26. package/cjs/PageForm/{Inputs → Utils}/PageFormWatch.js +1 -2
  27. package/cjs/PageHeader.d.ts +9 -11
  28. package/cjs/PageHeader.js +9 -11
  29. package/cjs/PageTable/PageTable.d.ts +2 -7
  30. package/cjs/PageTable/PageTable.js +1 -7
  31. package/cjs/PageTable/PageTableCard.js +3 -3
  32. package/cjs/PageTabs.d.ts +2 -1
  33. package/cjs/PageTabs.js +6 -2
  34. package/cjs/index.d.ts +3 -3
  35. package/cjs/index.js +3 -3
  36. package/package.json +1 -1
  37. package/cjs/PageDataList.d.ts +0 -46
  38. package/cjs/PageDataList.js +0 -61
  39. package/cjs/PageForm/FormPage.d.ts +0 -17
  40. package/cjs/PageForm/FormPage.js +0 -73
  41. package/cjs/PageTable/PageTableDetails.d.ts +0 -6
  42. package/cjs/components/Details.d.ts +0 -36
  43. package/cjs/components/Details.js +0 -63
  44. package/docs/Components.md +0 -9
  45. package/docs/Framework.md +0 -19
  46. package/docs/Guides.md +0 -6
  47. package/docs/_config.yml +0 -2
  48. package/docs/assets/css/style.scss +0 -139
  49. package/docs/components/BulkActionDialog.md +0 -30
  50. package/docs/components/PageFramework.md +0 -11
  51. package/docs/components/PageHeader.md +0 -31
  52. package/docs/components/PageLayout.md +0 -18
  53. package/docs/components/PageTable.md +0 -17
  54. package/docs/guides/GettingStarted.md +0 -90
  55. package/docs/guides/PageTableGuide.md +0 -178
package/README.md CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  A framework for building applications using [PatternFly](https://www.patternfly.org), developed by the Ansible UI developers.
4
4
 
5
- [Documentation](https://laughing-spoon-f689339f.pages.github.io/)
5
+ [Documentation](https://github.com/ansible/ansible-ui/wiki/Ansible-UI-Framework)
@@ -26,7 +26,7 @@ export type IPageSingleAction<T extends object> = IPageActionCommon & {
26
26
  type: PageActionType.single;
27
27
  variant?: ButtonVariant;
28
28
  onClick: (item: T) => void;
29
- isDisabled?: (item: T) => string;
29
+ isDisabled?: (item: T) => string | undefined;
30
30
  isHidden?: (item: T) => boolean;
31
31
  };
32
32
  export type IPageDropdownAction<T extends object> = IPageActionCommon & {
@@ -30,6 +30,6 @@ function PageSingleAction(props) {
30
30
  if (props.iconOnly) {
31
31
  variant = react_core_1.ButtonVariant.plain;
32
32
  }
33
- return ((0, jsx_runtime_1.jsx)(Wrapper, { children: (0, jsx_runtime_1.jsx)(react_core_1.Tooltip, __assign({ content: tooltip, trigger: tooltip ? undefined : 'manual' }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Button, __assign({ variant: variant, icon: Icon ? ((0, jsx_runtime_1.jsx)("span", __assign({ style: { marginLeft: -4, paddingRight: 4 } }, { children: (0, jsx_runtime_1.jsx)(Icon, {}) }))) : undefined, isAriaDisabled: Boolean(isDisabled), onClick: function () { return selectedItem && action.onClick(selectedItem); }, isDanger: action.isDanger }, { children: props.iconOnly && Icon ? (0, jsx_runtime_1.jsx)(Icon, {}) : action.shortLabel ? action.shortLabel : action.label })) })) }));
33
+ return ((0, jsx_runtime_1.jsx)(Wrapper, { children: (0, jsx_runtime_1.jsx)(react_core_1.Tooltip, __assign({ content: tooltip, trigger: tooltip ? undefined : 'manual' }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Button, __assign({ id: props.action.label.toLowerCase().split(' ').join('-'), variant: variant, icon: Icon ? ((0, jsx_runtime_1.jsx)("span", __assign({ style: { marginLeft: -4, paddingRight: 4 } }, { children: (0, jsx_runtime_1.jsx)(Icon, {}) }))) : undefined, isAriaDisabled: Boolean(isDisabled), onClick: function () { return selectedItem && action.onClick(selectedItem); }, isDanger: action.isDanger }, { children: props.iconOnly && Icon ? (0, jsx_runtime_1.jsx)(Icon, {}) : action.shortLabel ? action.shortLabel : action.label })) })) }));
34
34
  }
35
35
  exports.PageSingleAction = PageSingleAction;
@@ -3,7 +3,7 @@ import { PFColor } from '../components/pfcolors';
3
3
  export interface TextCellProps {
4
4
  icon?: ReactNode;
5
5
  iconSize?: 'sm' | 'md' | 'lg';
6
- text?: string;
6
+ text?: string | null;
7
7
  to?: string;
8
8
  onClick?: () => void;
9
9
  color?: PFColor;
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function PageDetail(props: {
3
+ label?: string;
4
+ children?: ReactNode;
5
+ isEmpty?: boolean;
6
+ }): JSX.Element;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.PageDetail = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ var react_core_1 = require("@patternfly/react-core");
17
+ function PageDetail(props) {
18
+ var _a;
19
+ if (props.children === null || typeof props.children === 'undefined' || props.children === '') {
20
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
21
+ }
22
+ if (props.isEmpty) {
23
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
24
+ }
25
+ return ((0, jsx_runtime_1.jsxs)(react_core_1.DescriptionListGroup, { children: [props.label && (0, jsx_runtime_1.jsx)(react_core_1.DescriptionListTerm, { children: props.label }), (0, jsx_runtime_1.jsx)(react_core_1.DescriptionListDescription, __assign({ id: (_a = props.label) === null || _a === void 0 ? void 0 : _a.toLowerCase().split(' ').join('-') }, { children: props.children }))] }));
26
+ }
27
+ exports.PageDetail = PageDetail;
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function PageDetails(props: {
3
+ children?: ReactNode;
4
+ disablePadding?: boolean;
5
+ }): JSX.Element;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.PageDetails = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ var react_core_1 = require("@patternfly/react-core");
17
+ var Settings_1 = require("../Settings");
18
+ function PageDetails(props) {
19
+ var disablePadding = props.disablePadding;
20
+ var settings = (0, Settings_1.useSettings)();
21
+ var orientation = settings.formLayout;
22
+ var columns = settings.formColumns;
23
+ var isCompact = false;
24
+ return ((0, jsx_runtime_1.jsx)(react_core_1.PageSection, __assign({ padding: { default: 'noPadding' }, style: {
25
+ backgroundColor: settings.theme === 'dark'
26
+ ? 'var(--pf-global--BackgroundColor--300)'
27
+ : 'var(--pf-global--BackgroundColor--100)',
28
+ } }, { children: (0, jsx_runtime_1.jsx)(react_core_1.DescriptionList, __assign({ orientation: {
29
+ sm: orientation,
30
+ md: orientation,
31
+ lg: orientation,
32
+ xl: orientation,
33
+ '2xl': orientation,
34
+ }, columnModifier: columns === 'multiple'
35
+ ? {
36
+ default: '1Col',
37
+ sm: '1Col',
38
+ md: '2Col',
39
+ lg: '2Col',
40
+ xl: '3Col',
41
+ '2xl': '3Col',
42
+ }
43
+ : undefined, style: { maxWidth: 1200, padding: disablePadding ? undefined : 24 }, isCompact: isCompact }, { children: props.children })) })));
44
+ }
45
+ exports.PageDetails = PageDetails;
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { ITableColumn } from '../PageTable/PageTable';
3
+ export declare function PageDetailsFromColumns<T extends object>(props: {
4
+ item: T | undefined;
5
+ columns: ITableColumn<T>[];
6
+ }): JSX.Element;
@@ -11,16 +11,17 @@ var __assign = (this && this.__assign) || function () {
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.TableDetails = void 0;
14
+ exports.PageDetailsFromColumns = void 0;
15
15
  var jsx_runtime_1 = require("react/jsx-runtime");
16
16
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
17
17
  /* eslint-disable @typescript-eslint/no-empty-function */
18
- var Details_1 = require("../components/Details");
19
- var PageTable_1 = require("./PageTable");
20
- function TableDetails(props) {
18
+ var PageTable_1 = require("../PageTable/PageTable");
19
+ var PageDetail_1 = require("./PageDetail");
20
+ var PageDetails_1 = require("./PageDetails");
21
+ function PageDetailsFromColumns(props) {
21
22
  var item = props.item, columns = props.columns;
22
23
  if (!item)
23
24
  return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
24
- return ((0, jsx_runtime_1.jsx)(Details_1.DetailsList, { children: columns.map(function (column) { return ((0, jsx_runtime_1.jsx)(Details_1.Detail, __assign({ label: column.header }, { children: (0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: column, item: item }) }), column.id)); }) }));
25
+ return ((0, jsx_runtime_1.jsx)(PageDetails_1.PageDetails, { children: columns.map(function (column) { return ((0, jsx_runtime_1.jsx)(PageDetail_1.PageDetail, __assign({ label: column.header }, { children: (0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: column, item: item }) }), column.id)); }) }));
25
26
  }
26
- exports.TableDetails = TableDetails;
27
+ exports.PageDetailsFromColumns = PageDetailsFromColumns;
@@ -1,9 +1,10 @@
1
- import { ReactNode } from 'react';
2
- export declare function PageFormCheckbox(props: {
3
- label: string;
1
+ /// <reference types="react" />
2
+ import { CheckboxProps } from '@patternfly/react-core';
3
+ import { Validate } from 'react-hook-form';
4
+ export type PageFormCheckboxProps = {
5
+ id?: string;
4
6
  name: string;
5
- helperText?: string;
6
- required?: boolean;
7
- description?: ReactNode;
8
- body?: ReactNode;
9
- }): JSX.Element;
7
+ validate?: Validate<string> | Record<string, Validate<string>>;
8
+ } & Omit<CheckboxProps, 'id' | 'onChange' | 'value'>;
9
+ /** PatternFly Checkbox wrapper for use with react-hook-form */
10
+ export declare function PageFormCheckbox(props: PageFormCheckboxProps): JSX.Element;
@@ -15,10 +15,14 @@ exports.PageFormCheckbox = void 0;
15
15
  var jsx_runtime_1 = require("react/jsx-runtime");
16
16
  var react_core_1 = require("@patternfly/react-core");
17
17
  var react_hook_form_1 = require("react-hook-form");
18
+ /** PatternFly Checkbox wrapper for use with react-hook-form */
18
19
  function PageFormCheckbox(props) {
19
- var control = (0, react_hook_form_1.useFormContext)().control;
20
- var field = (0, react_hook_form_1.useController)({ control: control, name: props.name }).field;
21
- var id = props.name;
22
- return ((0, jsx_runtime_1.jsx)(react_core_1.Checkbox, __assign({ label: props.label, id: id, "aria-describedby": "".concat(id, "-helper"), description: props.description, body: field.value ? props.body : undefined }, field, { isChecked: !!field.value })));
20
+ var name = props.name, readOnly = props.readOnly, validate = props.validate;
21
+ var _a = (0, react_hook_form_1.useFormContext)(), control = _a.control, isSubmitting = _a.formState.isSubmitting;
22
+ return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: name, control: control, shouldUnregister: true, render: function (_a) {
23
+ var _b;
24
+ var _c = _a.field, onChange = _c.onChange, value = _c.value;
25
+ return ((0, jsx_runtime_1.jsx)(react_core_1.Checkbox, __assign({}, props, { id: (_b = props.id) !== null && _b !== void 0 ? _b : name.split('.').join('-'), isChecked: !!value, onChange: onChange, readOnly: readOnly || isSubmitting, minLength: undefined, maxLength: undefined, ref: undefined })));
26
+ }, rules: { validate: validate } }));
23
27
  }
24
28
  exports.PageFormCheckbox = PageFormCheckbox;
@@ -42,7 +42,7 @@ function PageFormFileUpload(props) {
42
42
  var handleFileReadStarted = function (_fileHandle) {
43
43
  setIsLoading(true);
44
44
  };
45
- return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: props.name, control: control, render: function (_a) {
45
+ return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: props.name, control: control, shouldUnregister: true, render: function (_a) {
46
46
  var _b = _a.field, onChange = _b.onChange, value = _b.value, error = _a.fieldState.error;
47
47
  var handleClear = function (_event) {
48
48
  setFilename('');
@@ -18,7 +18,7 @@ var FormGroupSelect_1 = require("./FormGroupSelect");
18
18
  /** PatternFly Select wrapper for use with react-hook-form */
19
19
  function PageFormSelect(props) {
20
20
  var _a = (0, react_hook_form_1.useFormContext)(), control = _a.control, isSubmitting = _a.formState.isSubmitting;
21
- return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: props.name, control: control, render: function (_a) {
21
+ return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: props.name, control: control, shouldUnregister: true, render: function (_a) {
22
22
  var _b = _a.field, onChange = _b.onChange, value = _b.value, error = _a.fieldState.error;
23
23
  return ((0, jsx_runtime_1.jsx)(FormGroupSelect_1.FormGroupSelect, __assign({}, props, { value: value, onSelect: function (_, value) { return onChange(value); }, helperTextInvalid: error === null || error === void 0 ? void 0 : error.message, isReadOnly: props.isReadOnly || isSubmitting })));
24
24
  } }));
@@ -1,7 +1,9 @@
1
1
  /// <reference types="react" />
2
+ import { Validate } from 'react-hook-form';
2
3
  import { FormGroupSelectOptionProps } from './FormGroupSelectOption';
3
4
  export type PageFormSelectOptionProps<T> = {
4
5
  name: string;
6
+ validate?: Validate<string> | Record<string, Validate<string>>;
5
7
  } & Omit<FormGroupSelectOptionProps<T>, 'onSelect' | 'value'>;
6
8
  /** Select wrapper for use with react-hook-form */
7
9
  export declare function PageFormSelectOption<T>(props: PageFormSelectOptionProps<T>): JSX.Element;
@@ -14,14 +14,24 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  exports.PageFormSelectOption = void 0;
15
15
  var jsx_runtime_1 = require("react/jsx-runtime");
16
16
  var react_hook_form_1 = require("react-hook-form");
17
+ var capitalize_1 = require("../../utils/capitalize");
17
18
  var FormGroupSelectOption_1 = require("./FormGroupSelectOption");
18
19
  /** Select wrapper for use with react-hook-form */
19
20
  function PageFormSelectOption(props) {
21
+ var label = props.label, isRequired = props.isRequired, validate = props.validate;
20
22
  var _a = (0, react_hook_form_1.useFormContext)(), control = _a.control, isSubmitting = _a.formState.isSubmitting;
21
- return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: props.name, control: control, render: function (_a) {
23
+ return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: props.name, control: control, shouldUnregister: true, render: function (_a) {
22
24
  var _b;
23
25
  var _c = _a.field, onChange = _c.onChange, value = _c.value, error = _a.fieldState.error;
24
26
  return ((0, jsx_runtime_1.jsx)(FormGroupSelectOption_1.FormGroupSelectOption, __assign({}, props, { id: (_b = props.id) !== null && _b !== void 0 ? _b : props.name, value: value, onSelect: function (_, value) { return onChange(value); }, helperTextInvalid: error === null || error === void 0 ? void 0 : error.message, isReadOnly: props.isReadOnly || isSubmitting })));
27
+ }, rules: {
28
+ required: typeof label === 'string' && typeof isRequired === 'boolean'
29
+ ? {
30
+ value: true,
31
+ message: "".concat((0, capitalize_1.capitalizeFirstLetter)(label.toLocaleLowerCase()), " is required."),
32
+ }
33
+ : isRequired,
34
+ validate: validate,
25
35
  } }));
26
36
  }
27
37
  exports.PageFormSelectOption = PageFormSelectOption;
@@ -20,7 +20,7 @@ var FormGroupTextArea_1 = require("./FormGroupTextArea");
20
20
  function PageFormTextArea(props) {
21
21
  var name = props.name, label = props.label, isReadOnly = props.isReadOnly, isRequired = props.isRequired, minLength = props.minLength, maxLength = props.maxLength, pattern = props.pattern, validate = props.validate;
22
22
  var _a = (0, react_hook_form_1.useFormContext)(), control = _a.control, isSubmitting = _a.formState.isSubmitting;
23
- return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: name, control: control, render: function (_a) {
23
+ return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: name, control: control, shouldUnregister: true, render: function (_a) {
24
24
  var _b;
25
25
  var _c = _a.field, onChange = _c.onChange, value = _c.value, error = _a.fieldState.error;
26
26
  return ((0, jsx_runtime_1.jsx)(FormGroupTextArea_1.FormGroupTextArea, __assign({}, props, { id: (_b = props.id) !== null && _b !== void 0 ? _b : name, value: value, onChange: onChange, helperTextInvalid: error === null || error === void 0 ? void 0 : error.message, isReadOnly: isReadOnly || isSubmitting, minLength: undefined, maxLength: undefined })));
@@ -22,7 +22,7 @@ var FormGroupTextInput_1 = require("./FormGroupTextInput");
22
22
  function PageFormTextInput(props) {
23
23
  var label = props.label, name = props.name, isReadOnly = props.isReadOnly, isRequired = props.isRequired, minLength = props.minLength, maxLength = props.maxLength, pattern = props.pattern, validate = props.validate, selectTitle = props.selectTitle;
24
24
  var _a = (0, react_hook_form_1.useFormContext)(), control = _a.control, setValue = _a.setValue, _b = _a.formState, isSubmitting = _b.isSubmitting, isValidating = _b.isValidating;
25
- return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: name, control: control, render: function (_a) {
25
+ return ((0, jsx_runtime_1.jsx)(react_hook_form_1.Controller, { name: name, control: control, shouldUnregister: true, render: function (_a) {
26
26
  var _b;
27
27
  var _c = _a.field, onChange = _c.onChange, value = _c.value, error = _a.fieldState.error;
28
28
  return ((0, jsx_runtime_1.jsx)(FormGroupTextInput_1.FormGroupTextInput, __assign({}, props, { id: (_b = props.id) !== null && _b !== void 0 ? _b : name.split('.').join('-'), value: value, onChange: onChange, helperTextInvalid: !(validate && isValidating) && (error === null || error === void 0 ? void 0 : error.message), isReadOnly: isReadOnly || isSubmitting, minLength: undefined, maxLength: undefined }, { children: selectTitle && ((0, jsx_runtime_1.jsx)(react_core_1.Button, __assign({ variant: "control", onClick: function () {
@@ -12,6 +12,8 @@ export declare function PageForm<T extends object>(props: {
12
12
  isVertical?: boolean;
13
13
  singleColumn?: boolean;
14
14
  disableScrolling?: boolean;
15
+ disableBody?: boolean;
16
+ disablePadding?: boolean;
15
17
  }): JSX.Element;
16
18
  export type PageFormSubmitHandler<T extends FieldValues> = (data: T, setError: (error: string) => void, setFieldError: (fieldName: FieldPath<T>, error: ErrorOption) => void) => Promise<unknown>;
17
19
  export declare function PageFormSubmitButton(props: {
@@ -71,12 +71,13 @@ var react_1 = require("react");
71
71
  var react_hook_form_1 = require("react-hook-form");
72
72
  var Scrollable_1 = require("../components/Scrollable");
73
73
  var useBreakPoint_1 = require("../components/useBreakPoint");
74
+ var PageBody_1 = require("../PageBody");
74
75
  var Settings_1 = require("../Settings");
75
76
  var useFrameworkTranslations_1 = require("../useFrameworkTranslations");
76
77
  function PageForm(props) {
77
78
  var _this = this;
78
79
  var _a;
79
- var schema = props.schema, defaultValue = props.defaultValue;
80
+ var schema = props.schema, defaultValue = props.defaultValue, disableBody = props.disableBody, disablePadding = props.disablePadding;
80
81
  var form = (0, react_hook_form_1.useForm)({
81
82
  defaultValues: defaultValue !== null && defaultValue !== void 0 ? defaultValue : {},
82
83
  resolver: schema
@@ -96,9 +97,7 @@ function PageForm(props) {
96
97
  var xl = multipleColumns ? (isHorizontal ? 6 : 6) : 12;
97
98
  var xl2 = multipleColumns ? (isHorizontal ? 4 : 4) : 12;
98
99
  var maxWidth = multipleColumns ? undefined : isHorizontal ? 960 : 800;
99
- return (
100
- // <PageBody>
101
- (0, jsx_runtime_1.jsx)(react_hook_form_1.FormProvider, __assign({}, form, { children: (0, jsx_runtime_1.jsxs)(react_core_1.Form
100
+ var Component = ((0, jsx_runtime_1.jsx)(react_hook_form_1.FormProvider, __assign({}, form, { children: (0, jsx_runtime_1.jsxs)(react_core_1.Form
102
101
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
103
102
  , __assign({
104
103
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
@@ -128,12 +127,14 @@ function PageForm(props) {
128
127
  flexGrow: 1,
129
128
  overflow: props.disableScrolling ? undefined : 'hidden',
130
129
  gap: 0,
131
- } }, { children: [props.disableScrolling ? ((0, jsx_runtime_1.jsx)("div", __assign({ style: { maxWidth: maxWidth, padding: 24 } }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Grid, __assign({ hasGutter: true, span: 12, sm: sm, md: md, lg: lg, xl: xl, xl2: xl2 }, { children: props.children })) }))) : ((0, jsx_runtime_1.jsx)(Scrollable_1.Scrollable, __assign({ style: { height: '100%', flexGrow: 1 } }, { children: (0, jsx_runtime_1.jsx)("div", __assign({ style: { maxWidth: maxWidth, padding: 24 } }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Grid, __assign({ hasGutter: true, span: 12, sm: sm, md: md, lg: lg, xl: xl, xl2: xl2 }, { children: props.children })) })) }))), error && ((0, jsx_runtime_1.jsx)(react_core_1.Alert, { variant: "danger", title: error !== null && error !== void 0 ? error : '', isInline: true, style: { paddingLeft: isMd && props.onCancel ? 190 : undefined } })), props.onCancel ? ((0, jsx_runtime_1.jsx)("div", __assign({ style: {
130
+ } }, { children: [props.disableScrolling ? ((0, jsx_runtime_1.jsx)("div", __assign({ style: { maxWidth: maxWidth, padding: disablePadding ? undefined : 24 } }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Grid, __assign({ hasGutter: true, span: 12, sm: sm, md: md, lg: lg, xl: xl, xl2: xl2 }, { children: props.children })) }))) : ((0, jsx_runtime_1.jsx)(Scrollable_1.Scrollable, __assign({ style: { height: '100%', flexGrow: 1 } }, { children: (0, jsx_runtime_1.jsx)("div", __assign({ style: { maxWidth: maxWidth, padding: disablePadding ? undefined : 24 } }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Grid, __assign({ hasGutter: true, span: 12, sm: sm, md: md, lg: lg, xl: xl, xl2: xl2 }, { children: props.children })) })) }))), error && ((0, jsx_runtime_1.jsx)(react_core_1.Alert, { variant: "danger", title: error !== null && error !== void 0 ? error : '', isInline: true, style: { paddingLeft: isMd && props.onCancel ? 190 : undefined } })), props.onCancel ? ((0, jsx_runtime_1.jsx)("div", __assign({ style: {
132
131
  backgroundColor: settings.theme === 'dark' ? 'var(--pf-global--BackgroundColor--400)' : undefined,
133
- padding: 24,
134
- } }, { children: (0, jsx_runtime_1.jsxs)(react_core_1.ActionGroup, __assign({ style: { marginTop: 0 } }, { children: [(0, jsx_runtime_1.jsx)(PageFormSubmitButton, { children: props.submitText }), props.onCancel && ((0, jsx_runtime_1.jsx)(PageFormCancelButton, __assign({ onCancel: props.onCancel }, { children: (_a = props.cancelText) !== null && _a !== void 0 ? _a : frameworkTranslations.cancelText })))] })) }))) : ((0, jsx_runtime_1.jsx)(PageFormSubmitButton, __assign({ style: { marginTop: 48 } }, { children: props.submitText })))] })) }))
135
- // </PageBody>
136
- );
132
+ padding: disablePadding ? undefined : 24,
133
+ } }, { children: (0, jsx_runtime_1.jsxs)(react_core_1.ActionGroup, __assign({ style: { marginTop: 0 } }, { children: [(0, jsx_runtime_1.jsx)(PageFormSubmitButton, { children: props.submitText }), props.onCancel && ((0, jsx_runtime_1.jsx)(PageFormCancelButton, __assign({ onCancel: props.onCancel }, { children: (_a = props.cancelText) !== null && _a !== void 0 ? _a : frameworkTranslations.cancelText })))] })) }))) : ((0, jsx_runtime_1.jsx)(PageFormSubmitButton, __assign({ style: { marginTop: 48 } }, { children: props.submitText })))] })) })));
134
+ if (!disableBody) {
135
+ Component = (0, jsx_runtime_1.jsx)(PageBody_1.PageBody, { children: Component });
136
+ }
137
+ return Component;
137
138
  }
138
139
  exports.PageForm = PageForm;
139
140
  function PageFormSubmitButton(props) {
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function PageFormHidden<T>(props: {
3
+ watch: string;
4
+ hidden: (value: T) => boolean;
5
+ children: ReactNode;
6
+ }): JSX.Element;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PageFormHidden = void 0;
4
+ var jsx_runtime_1 = require("react/jsx-runtime");
5
+ var react_hook_form_1 = require("react-hook-form");
6
+ function PageFormHidden(props) {
7
+ var value = (0, react_hook_form_1.useWatch)({ name: props.watch });
8
+ var hidden = props.hidden(value);
9
+ if (hidden)
10
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
11
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: props.children });
12
+ }
13
+ exports.PageFormHidden = PageFormHidden;
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+ export declare function PageFormSection(props: {
3
+ title: string;
4
+ children: ReactNode;
5
+ }): JSX.Element;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.PageFormSection = void 0;
15
+ var jsx_runtime_1 = require("react/jsx-runtime");
16
+ var react_core_1 = require("@patternfly/react-core");
17
+ function PageFormSection(props) {
18
+ return ((0, jsx_runtime_1.jsx)(react_core_1.FormSection, __assign({ title: props.title, style: { marginTop: 16 } }, { children: props.children })));
19
+ }
20
+ exports.PageFormSection = PageFormSection;
@@ -4,8 +4,7 @@ exports.PageFormWatch = void 0;
4
4
  var jsx_runtime_1 = require("react/jsx-runtime");
5
5
  var react_hook_form_1 = require("react-hook-form");
6
6
  function PageFormWatch(props) {
7
- var control = (0, react_hook_form_1.useFormContext)().control;
8
- var value = (0, react_hook_form_1.useWatch)({ control: control, name: props.watch });
7
+ var value = (0, react_hook_form_1.useWatch)({ name: props.watch });
9
8
  return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: props.children(value) });
10
9
  }
11
10
  exports.PageFormWatch = PageFormWatch;
@@ -31,16 +31,14 @@ export interface PageHeaderProps {
31
31
  * @param {ReactNode} headerActions - The actions for the page.
32
32
  *
33
33
  * @example
34
- * <Page>
35
- * <PageLayout>
36
- * <PageHeader
37
- * breadcrumbs={[{ label: 'Home', to: '/home' }, { label: 'Page title' }]}
38
- * title='Page title'
39
- * description='Page description'
40
- * headerActions={<TypedActions actions={actions} />}
41
- * />
42
- * <PageBody />...</PageBody>
43
- * </PageLayout>
44
- * <Page>
34
+ * <PageLayout>
35
+ * <PageHeader
36
+ * breadcrumbs={[{ label: 'Home', to: '/home' }, { label: 'Page title' }]}
37
+ * title='Page title'
38
+ * description='Page description'
39
+ * headerActions={<TypedActions actions={actions} />}
40
+ * />
41
+ * ...
42
+ * </PageLayout>
45
43
  */
46
44
  export declare function PageHeader(props: PageHeaderProps): JSX.Element;
package/cjs/PageHeader.js CHANGED
@@ -45,17 +45,15 @@ function Breadcrumbs(props) {
45
45
  * @param {ReactNode} headerActions - The actions for the page.
46
46
  *
47
47
  * @example
48
- * <Page>
49
- * <PageLayout>
50
- * <PageHeader
51
- * breadcrumbs={[{ label: 'Home', to: '/home' }, { label: 'Page title' }]}
52
- * title='Page title'
53
- * description='Page description'
54
- * headerActions={<TypedActions actions={actions} />}
55
- * />
56
- * <PageBody />...</PageBody>
57
- * </PageLayout>
58
- * <Page>
48
+ * <PageLayout>
49
+ * <PageHeader
50
+ * breadcrumbs={[{ label: 'Home', to: '/home' }, { label: 'Page title' }]}
51
+ * title='Page title'
52
+ * description='Page description'
53
+ * headerActions={<TypedActions actions={actions} />}
54
+ * />
55
+ * ...
56
+ * </PageLayout>
59
57
  */
60
58
  function PageHeader(props) {
61
59
  var navigation = props.navigation, breadcrumbs = props.breadcrumbs, title = props.title, description = props.description, controls = props.controls, headerActions = props.headerActions;
@@ -1,12 +1,7 @@
1
1
  import { Dispatch, ReactNode, SetStateAction } from 'react';
2
2
  import { IPageAction } from '../PageActions/PageAction';
3
- import { PageHeaderProps } from '../PageHeader';
4
3
  import { PageTableViewType } from './PageTableViewType';
5
4
  import { IToolbarFilter } from './PageToolbar';
6
- export type TablePageProps<T extends object> = PageHeaderProps & PageTableProps<T> & {
7
- error?: Error;
8
- };
9
- export declare function TablePage<T extends object>(props: TablePageProps<T>): JSX.Element;
10
5
  export type PageTableProps<T extends object> = {
11
6
  keyFn: (item: T) => string | number;
12
7
  itemCount?: number;
@@ -111,11 +106,11 @@ export interface ITableColumnTypeDateTime<T extends object> extends ITableColumn
111
106
  }
112
107
  export interface ITableColumnTypeDescription<T extends object> extends ITableColumnCommon<T> {
113
108
  type: 'description';
114
- value: CellFn<T, string | undefined>;
109
+ value: CellFn<T, string | undefined | null>;
115
110
  }
116
111
  export interface ITableColumnTypeText<T extends object> extends ITableColumnCommon<T> {
117
112
  type: 'text';
118
- value: CellFn<T, string | undefined>;
113
+ value: CellFn<T, string | null | undefined>;
119
114
  }
120
115
  export type ITableColumn<T extends object> = ITableColumnTypeReactNode<T> | ITableColumnTypeDateTime<T> | ITableColumnTypeLabels<T> | ITableColumnTypeCount<T> | ITableColumnTypeText<T> | ITableColumnTypeDescription<T>;
121
116
  export declare function TableColumnCell<T extends object>(props: {
@@ -30,7 +30,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
30
30
  return (mod && mod.__esModule) ? mod : { "default": mod };
31
31
  };
32
32
  Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.TableColumnCell = exports.TableColumnCardType = exports.TableColumnSomething = exports.PageTable = exports.TablePage = void 0;
33
+ exports.TableColumnCell = exports.TableColumnCardType = exports.TableColumnSomething = exports.PageTable = void 0;
34
34
  var jsx_runtime_1 = require("react/jsx-runtime");
35
35
  var react_core_1 = require("@patternfly/react-core");
36
36
  var react_icons_1 = require("@patternfly/react-icons");
@@ -46,18 +46,12 @@ var DateTimeCell_1 = require("../PageCells/DateTimeCell");
46
46
  var LabelsCell_1 = require("../PageCells/LabelsCell");
47
47
  var TextCell_1 = require("../PageCells/TextCell");
48
48
  var PageColumnModal_1 = require("../PageColumnModal");
49
- var PageHeader_1 = require("../PageHeader");
50
- var PageLayout_1 = require("../PageLayout");
51
49
  var Settings_1 = require("../Settings");
52
50
  var PagePagination_1 = require("./PagePagination");
53
51
  var PageTableCards_1 = require("./PageTableCards");
54
52
  var PageTableList_1 = require("./PageTableList");
55
53
  var PageTableViewType_1 = require("./PageTableViewType");
56
54
  var PageToolbar_1 = require("./PageToolbar");
57
- function TablePage(props) {
58
- return ((0, jsx_runtime_1.jsxs)(PageLayout_1.PageLayout, { children: [(0, jsx_runtime_1.jsx)(PageHeader_1.PageHeader, __assign({}, props)), (0, jsx_runtime_1.jsx)(PageTable, __assign({}, props))] }));
59
- }
60
- exports.TablePage = TablePage;
61
55
  /**
62
56
  * The PageTable component is used for adding a table to a page.
63
57
  *
@@ -28,9 +28,9 @@ var jsx_runtime_1 = require("react/jsx-runtime");
28
28
  /* eslint-disable @typescript-eslint/no-empty-function */
29
29
  var react_core_1 = require("@patternfly/react-core");
30
30
  var react_1 = require("react");
31
- var Details_1 = require("../components/Details");
32
31
  var IconWrapper_1 = require("../components/IconWrapper");
33
32
  var PageActions_1 = require("../PageActions/PageActions");
33
+ var PageDetail_1 = require("../PageDetails/PageDetail");
34
34
  var PageTable_1 = require("./PageTable");
35
35
  function PageTableCard(props) {
36
36
  var _a;
@@ -144,9 +144,9 @@ function useColumnsToTableCardFn(columns, keyFn) {
144
144
  icon: (_a = nameColumn === null || nameColumn === void 0 ? void 0 : nameColumn.icon) === null || _a === void 0 ? void 0 : _a.call(nameColumn, item),
145
145
  title: (0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: nameColumn, item: item }),
146
146
  subtitle: subtitleColumn && (!subtitleColumn.value || subtitleColumn.value(item)) && ((0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: subtitleColumn, item: item })),
147
- cardBody: ((0, jsx_runtime_1.jsx)(react_core_1.CardBody, { children: (0, jsx_runtime_1.jsxs)(react_core_1.DescriptionList, __assign({ isCompact: true }, { children: [hasDescription && ((0, jsx_runtime_1.jsx)(Details_1.Detail, { children: descriptionColumn.type === 'description' ? ((0, jsx_runtime_1.jsx)("div", { children: descriptionColumn.value(item) })) : ((0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: descriptionColumn, item: item })) }, descriptionColumn.id)), cardColumns
147
+ cardBody: ((0, jsx_runtime_1.jsx)(react_core_1.CardBody, { children: (0, jsx_runtime_1.jsxs)(react_core_1.DescriptionList, __assign({ isCompact: true }, { children: [hasDescription && ((0, jsx_runtime_1.jsx)(PageDetail_1.PageDetail, { children: descriptionColumn.type === 'description' ? ((0, jsx_runtime_1.jsx)("div", { children: descriptionColumn.value(item) })) : ((0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: descriptionColumn, item: item })) }, descriptionColumn.id)), cardColumns
148
148
  .filter(function (column) { return !column.value || column.value(item); })
149
- .map(function (column) { return ((0, jsx_runtime_1.jsx)(Details_1.Detail, __assign({ label: column.header }, { children: (0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: column, item: item }) }), column.id)); }), countColumns.length > 0 && ((0, jsx_runtime_1.jsx)(Details_1.Detail, { children: (0, jsx_runtime_1.jsx)("div", __assign({ style: { display: 'flex', gap: 16, marginTop: 8, flexWrap: 'wrap' } }, { children: countColumns.map(function (column, i) { return ((0, jsx_runtime_1.jsxs)("div", __assign({ style: { display: 'flex', gap: 6, alignItems: 'baseline' } }, { children: [(0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: column, item: item }), (0, jsx_runtime_1.jsx)("small", __assign({ style: { opacity: 0.7 } }, { children: column.header }))] }), i)); }) })) }))] })) })),
149
+ .map(function (column) { return ((0, jsx_runtime_1.jsx)(PageDetail_1.PageDetail, __assign({ label: column.header }, { children: (0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: column, item: item }) }), column.id)); }), countColumns.length > 0 && ((0, jsx_runtime_1.jsx)(PageDetail_1.PageDetail, { children: (0, jsx_runtime_1.jsx)("div", __assign({ style: { display: 'flex', gap: 16, marginTop: 8, flexWrap: 'wrap' } }, { children: countColumns.map(function (column, i) { return ((0, jsx_runtime_1.jsxs)("div", __assign({ style: { display: 'flex', gap: 6, alignItems: 'baseline' } }, { children: [(0, jsx_runtime_1.jsx)(PageTable_1.TableColumnCell, { column: column, item: item }), (0, jsx_runtime_1.jsx)("small", __assign({ style: { opacity: 0.7 } }, { children: column.header }))] }), i)); }) })) }))] })) })),
150
150
  labels: labelColumn && ((_b = labelColumn.value(item)) === null || _b === void 0 ? void 0 : _b.map(function (label) { return ({ label: label }); })),
151
151
  };
152
152
  if (!hasDescription && cardColumns.length === 0 && countColumns.length === 0) {
package/cjs/PageTabs.d.ts CHANGED
@@ -3,9 +3,10 @@ export declare function PageTabs(props: {
3
3
  children: ReactNode;
4
4
  preComponents?: ReactNode;
5
5
  postComponents?: ReactNode;
6
+ loading?: boolean;
6
7
  }): JSX.Element;
7
8
  export declare function PageTab(props: {
8
- title?: string;
9
+ label?: string;
9
10
  children: ReactNode;
10
11
  }): JSX.Element;
11
12
  export declare function PageTabsOld(props: {
package/cjs/PageTabs.js CHANGED
@@ -33,19 +33,23 @@ var react_core_1 = require("@patternfly/react-core");
33
33
  var react_1 = require("react");
34
34
  function PageTabs(props) {
35
35
  var _a;
36
+ var loading = props.loading;
36
37
  var _b = __read((0, react_1.useState)(0), 2), activeKey = _b[0], setActiveKey = _b[1];
37
38
  var onSelect = (0, react_1.useCallback)(function (_, key) { return setActiveKey(key); }, [setActiveKey]);
38
39
  var children = react_1.Children.toArray(props.children);
39
40
  var tabs = children.map(function (child, index) {
40
41
  if ((0, react_1.isValidElement)(child)) {
41
42
  if (child.type === PageTab) {
42
- var title = child.props.title;
43
- return ((0, jsx_runtime_1.jsx)(react_core_1.Tab, { title: title ? title : (0, jsx_runtime_1.jsx)(react_core_1.Skeleton, { width: "60px" }), eventKey: index }, title !== null && title !== void 0 ? title : index));
43
+ var label = child.props.label;
44
+ return ((0, jsx_runtime_1.jsx)(react_core_1.Tab, { title: label ? label : (0, jsx_runtime_1.jsx)(react_core_1.Skeleton, { width: "60px" }), eventKey: index }, label !== null && label !== void 0 ? label : index));
44
45
  }
45
46
  }
46
47
  return child;
47
48
  });
48
49
  var content = children[activeKey];
50
+ if (loading) {
51
+ return ((0, jsx_runtime_1.jsx)(PageTabs, { children: (0, jsx_runtime_1.jsx)(PageTab, { children: (0, jsx_runtime_1.jsx)(react_core_1.PageSection, __assign({ variant: "light" }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Skeleton, {}) })) }) }));
52
+ }
49
53
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_core_1.PageSection, __assign({ type: react_core_1.PageSectionTypes.tabs }, { children: (0, jsx_runtime_1.jsxs)(react_core_1.Flex, __assign({ spaceItems: { default: 'spaceItemsNone' } }, { children: [props.preComponents && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(react_core_1.FlexItem
50
54
  // style={{ paddingLeft: 16 }}
51
55
  , { children: props.preComponents }), (0, jsx_runtime_1.jsx)(react_core_1.Divider, { orientation: { default: 'vertical' }, component: "div" })] })), (0, jsx_runtime_1.jsx)(react_core_1.FlexItem, __assign({ grow: { default: 'grow' } }, { children: (0, jsx_runtime_1.jsx)(react_core_1.Tabs, __assign({ activeKey: activeKey, onSelect: onSelect, inset: props.preComponents
package/cjs/index.d.ts CHANGED
@@ -2,7 +2,6 @@ export * from './BulkActionDialog';
2
2
  export * from './BulkConfirmationDialog';
3
3
  export * from './components/BulkSelector';
4
4
  export * from './components/Collapse';
5
- export * from './components/Details';
6
5
  export * from './components/Help';
7
6
  export * from './components/icons/RunningIcon';
8
7
  export * from './components/pfcolors';
@@ -20,7 +19,9 @@ export * from './PageCells/DateTimeCell';
20
19
  export * from './PageCells/ElapsedTimeCell';
21
20
  export * from './PageCells/LabelsCell';
22
21
  export * from './PageCells/TextCell';
23
- export * from './PageDataList';
22
+ export * from './PageDetails/PageDetail';
23
+ export * from './PageDetails/PageDetails';
24
+ export * from './PageDetails/PageDetailsFromColumns';
24
25
  export * from './PageDialog';
25
26
  export * from './PageForm/Inputs/FormGroupSelect';
26
27
  export * from './PageForm/Inputs/FormGroupSelectOption';
@@ -31,7 +32,6 @@ export * from './PageHeader';
31
32
  export * from './PageLayout';
32
33
  export * from './PageTable/PageTable';
33
34
  export * from './PageTable/PageTableCards';
34
- export * from './PageTable/PageTableDetails';
35
35
  export * from './PageTable/PageToolbar';
36
36
  export * from './PageTable/useTableItems';
37
37
  export * from './PageTabs';