@patternfly/quickstarts 5.0.0-prerelease.0 → 5.0.0-prerelease.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/ConsoleInternal/components/markdown-view.d.ts +19 -19
  2. package/dist/ConsoleInternal/components/utils/camel-case-wrap.d.ts +6 -6
  3. package/dist/ConsoleInternal/components/utils/index.d.ts +3 -3
  4. package/dist/ConsoleInternal/components/utils/router.d.ts +9 -9
  5. package/dist/ConsoleInternal/components/utils/status-box.d.ts +20 -20
  6. package/dist/ConsoleInternal/module/k8s/types.d.ts +42 -42
  7. package/dist/ConsoleShared/index.d.ts +1 -1
  8. package/dist/ConsoleShared/src/components/index.d.ts +7 -7
  9. package/dist/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.d.ts +13 -13
  10. package/dist/ConsoleShared/src/components/markdown-extensions/accordion-extension.d.ts +7 -7
  11. package/dist/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.d.ts +6 -6
  12. package/dist/ConsoleShared/src/components/markdown-extensions/admonition-extension.d.ts +7 -7
  13. package/dist/ConsoleShared/src/components/markdown-extensions/code-extension.d.ts +7 -7
  14. package/dist/ConsoleShared/src/components/markdown-extensions/const.d.ts +5 -5
  15. package/dist/ConsoleShared/src/components/markdown-extensions/index.d.ts +7 -7
  16. package/dist/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.d.ts +7 -7
  17. package/dist/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.d.ts +7 -7
  18. package/dist/ConsoleShared/src/components/markdown-extensions/utils.d.ts +1 -1
  19. package/dist/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.d.ts +7 -7
  20. package/dist/ConsoleShared/src/components/markdown-highlight-extension/highlight-consts.d.ts +4 -4
  21. package/dist/ConsoleShared/src/components/markdown-highlight-extension/index.d.ts +1 -1
  22. package/dist/ConsoleShared/src/components/modal/Modal.d.ts +9 -9
  23. package/dist/ConsoleShared/src/components/modal/index.d.ts +1 -1
  24. package/dist/ConsoleShared/src/components/popper/Portal.d.ts +8 -8
  25. package/dist/ConsoleShared/src/components/popper/SimplePopper.d.ts +6 -6
  26. package/dist/ConsoleShared/src/components/popper/index.d.ts +2 -2
  27. package/dist/ConsoleShared/src/components/spotlight/InteractiveSpotlight.d.ts +7 -7
  28. package/dist/ConsoleShared/src/components/spotlight/Spotlight.d.ts +7 -7
  29. package/dist/ConsoleShared/src/components/spotlight/StaticSpotlight.d.ts +7 -7
  30. package/dist/ConsoleShared/src/components/spotlight/index.d.ts +1 -1
  31. package/dist/ConsoleShared/src/components/status/GenericStatus.d.ts +12 -12
  32. package/dist/ConsoleShared/src/components/status/NotStartedIcon.d.ts +3 -3
  33. package/dist/ConsoleShared/src/components/status/PopoverStatus.d.ts +13 -13
  34. package/dist/ConsoleShared/src/components/status/Status.d.ts +11 -11
  35. package/dist/ConsoleShared/src/components/status/StatusIconAndText.d.ts +8 -8
  36. package/dist/ConsoleShared/src/components/status/icons.d.ts +9 -9
  37. package/dist/ConsoleShared/src/components/status/index.d.ts +1 -1
  38. package/dist/ConsoleShared/src/components/status/statuses.d.ts +5 -5
  39. package/dist/ConsoleShared/src/components/status/types.d.ts +9 -9
  40. package/dist/ConsoleShared/src/components/utils/FallbackImg.d.ts +9 -9
  41. package/dist/ConsoleShared/src/components/utils/index.d.ts +1 -1
  42. package/dist/ConsoleShared/src/constants/index.d.ts +1 -1
  43. package/dist/ConsoleShared/src/constants/ui.d.ts +1 -1
  44. package/dist/ConsoleShared/src/hooks/index.d.ts +6 -6
  45. package/dist/ConsoleShared/src/hooks/scroll.d.ts +8 -8
  46. package/dist/ConsoleShared/src/hooks/useBoundingClientRect.d.ts +3 -3
  47. package/dist/ConsoleShared/src/hooks/useEventListener.d.ts +1 -1
  48. package/dist/ConsoleShared/src/hooks/useForceRender.d.ts +4 -4
  49. package/dist/ConsoleShared/src/hooks/useResizeObserver.d.ts +1 -1
  50. package/dist/ConsoleShared/src/hooks/useScrollShadows.d.ts +7 -7
  51. package/dist/ConsoleShared/src/index.d.ts +4 -4
  52. package/dist/ConsoleShared/src/utils/index.d.ts +1 -1
  53. package/dist/ConsoleShared/src/utils/useCombineRefs.d.ts +2 -2
  54. package/dist/HelpTopicDrawer.d.ts +33 -33
  55. package/dist/HelpTopicPanelContent.d.ts +11 -11
  56. package/dist/QuickStartCatalogPage.d.ts +14 -14
  57. package/dist/QuickStartCloseModal.d.ts +8 -8
  58. package/dist/QuickStartController.d.ts +10 -10
  59. package/dist/QuickStartDrawer.d.ts +62 -62
  60. package/dist/QuickStartMarkdownView.d.ts +9 -9
  61. package/dist/QuickStartPanelContent.d.ts +15 -15
  62. package/dist/catalog/Catalog/QuickStartCatalogHeader.d.ts +6 -6
  63. package/dist/catalog/Catalog/QuickStartCatalogSection.d.ts +5 -5
  64. package/dist/catalog/Catalog/QuickStartCatalogToolbar.d.ts +5 -5
  65. package/dist/catalog/Catalog/index.d.ts +3 -3
  66. package/dist/catalog/QuickStartCatalog.d.ts +8 -8
  67. package/dist/catalog/QuickStartTile.d.ts +11 -11
  68. package/dist/catalog/QuickStartTileDescription.d.ts +8 -8
  69. package/dist/catalog/QuickStartTileFooter.d.ts +8 -8
  70. package/dist/catalog/QuickStartTileFooterExternal.d.ts +8 -8
  71. package/dist/catalog/QuickStartTileHeader.d.ts +12 -12
  72. package/dist/catalog/Toolbar/QuickStartCatalogFilter.d.ts +10 -10
  73. package/dist/catalog/Toolbar/QuickStartCatalogFilterItems.d.ts +31 -31
  74. package/dist/catalog/index.d.ts +9 -9
  75. package/dist/controller/QuickStartConclusion.d.ts +12 -12
  76. package/dist/controller/QuickStartContent.d.ts +14 -14
  77. package/dist/controller/QuickStartFooter.d.ts +14 -14
  78. package/dist/controller/QuickStartIntroduction.d.ts +12 -12
  79. package/dist/controller/QuickStartTaskHeader.d.ts +15 -15
  80. package/dist/controller/QuickStartTaskHeaderList.d.ts +10 -10
  81. package/dist/controller/QuickStartTaskReview.d.ts +10 -10
  82. package/dist/controller/QuickStartTasks.d.ts +12 -12
  83. package/dist/data/mocks/json/explore-pipeline-quickstart.d.ts +2 -2
  84. package/dist/data/mocks/json/explore-serverless-quickstart.d.ts +2 -2
  85. package/dist/data/mocks/json/monitor-sampleapp-quickstart.d.ts +2 -2
  86. package/dist/data/mocks/json/tour-icons.d.ts +2 -2
  87. package/dist/data/quick-start-test-data.d.ts +2 -2
  88. package/dist/data/test-utils.d.ts +8 -8
  89. package/dist/index.d.ts +16 -16
  90. package/dist/index.es.js +2286 -2286
  91. package/dist/index.es.js.map +1 -1
  92. package/dist/index.js +2286 -2286
  93. package/dist/index.js.map +1 -1
  94. package/dist/patternfly-nested.css +56 -38
  95. package/dist/quickstarts-base.css +17 -17
  96. package/dist/quickstarts-full.es.js +2307 -2290
  97. package/dist/quickstarts-full.es.js.map +1 -1
  98. package/dist/quickstarts-standalone.css +2 -2
  99. package/dist/quickstarts-standalone.min.css +2 -2
  100. package/dist/quickstarts.css +17 -17
  101. package/dist/quickstarts.min.css +1 -1
  102. package/dist/styles/patternfly-global-entry.d.ts +1 -1
  103. package/dist/styles/patternfly-nested-entry.d.ts +1 -1
  104. package/dist/styles/quickstarts-standalone-entry.d.ts +1 -1
  105. package/dist/styles/vendor-entry.d.ts +1 -1
  106. package/dist/utils/PluralResolver.d.ts +16 -16
  107. package/dist/utils/asciidoc-procedure-parser.d.ts +12 -12
  108. package/dist/utils/const.d.ts +6 -6
  109. package/dist/utils/help-topic-context.d.ts +23 -23
  110. package/dist/utils/help-topic-types.d.ts +13 -13
  111. package/dist/utils/quick-start-context.d.ts +81 -81
  112. package/dist/utils/quick-start-types.d.ts +60 -60
  113. package/dist/utils/quick-start-utils.d.ts +10 -10
  114. package/dist/utils/useLocalStorage.d.ts +1 -1
  115. package/package.json +10 -10
  116. package/src/styles/_dark-custom-override.scss +1 -1
@@ -5316,7 +5316,7 @@ const statusIcons = {
5316
5316
  const FormControlIcon = (_a) => {
5317
5317
  var { status, customIcon, className } = _a, props = __rest$1(_a, ["status", "customIcon", "className"]);
5318
5318
  const StatusIcon = status && statusIcons[status];
5319
- return (React.createElement("div", Object.assign({ className: css(formStyles$1.formControlIcon, status && formStyles$1.modifiers.status, className) }, props), customIcon || React.createElement(StatusIcon, null)));
5319
+ return (React.createElement("span", Object.assign({ className: css(formStyles$1.formControlIcon, status && formStyles$1.modifiers.status, className) }, props), customIcon || React.createElement(StatusIcon, null)));
5320
5320
  };
5321
5321
 
5322
5322
  var TextInputTypes;
@@ -5401,9 +5401,9 @@ class TextInputBase extends React.Component {
5401
5401
  /* eslint-disable @typescript-eslint/no-unused-vars */
5402
5402
  onChange, onFocus, onBlur, isLeftTruncated, isExpanded, readOnly, readOnlyVariant, isRequired, isDisabled, customIcon, ouiaId, ouiaSafe } = _a, props = __rest$1(_a, ["innerRef", "className", "type", "value", "placeholder", "validated", "onChange", "onFocus", "onBlur", "isLeftTruncated", "isExpanded", "readOnly", "readOnlyVariant", "isRequired", "isDisabled", "customIcon", "ouiaId", "ouiaSafe"]);
5403
5403
  const hasStatusIcon = ['success', 'error', 'warning'].includes(validated);
5404
- return (React.createElement("div", { className: css(formStyles$1.formControl, readOnlyVariant && formStyles$1.modifiers.readonly, readOnlyVariant === 'plain' && formStyles$1.modifiers.plain, isDisabled && formStyles$1.modifiers.disabled, isExpanded && formStyles$1.modifiers.expanded, customIcon && formStyles$1.modifiers.icon, hasStatusIcon && formStyles$1.modifiers[validated], className) },
5404
+ return (React.createElement("span", { className: css(formStyles$1.formControl, readOnlyVariant && formStyles$1.modifiers.readonly, readOnlyVariant === 'plain' && formStyles$1.modifiers.plain, isDisabled && formStyles$1.modifiers.disabled, isExpanded && formStyles$1.modifiers.expanded, customIcon && formStyles$1.modifiers.icon, hasStatusIcon && formStyles$1.modifiers[validated], className) },
5405
5405
  React.createElement("input", Object.assign({}, props, { onFocus: this.onFocus, onBlur: this.onBlur, onChange: this.handleChange, type: type, value: this.sanitizeInputValue(value), "aria-invalid": props['aria-invalid'] ? props['aria-invalid'] : validated === ValidatedOptions.error, required: isRequired, disabled: isDisabled, readOnly: !!readOnlyVariant || readOnly, ref: innerRef || this.inputRef, placeholder: placeholder }, getOUIAProps(TextInput.displayName, ouiaId !== undefined ? ouiaId : this.state.ouiaStateId, ouiaSafe))),
5406
- (customIcon || hasStatusIcon) && (React.createElement("div", { className: css(formStyles$1.formControlUtilities) },
5406
+ (customIcon || hasStatusIcon) && (React.createElement("span", { className: css(formStyles$1.formControlUtilities) },
5407
5407
  customIcon && React.createElement(FormControlIcon, { customIcon: customIcon }),
5408
5408
  hasStatusIcon && React.createElement(FormControlIcon, { status: validated })))));
5409
5409
  }
@@ -5471,6 +5471,7 @@ var menuStyles = {
5471
5471
  "nav": "pf-m-nav",
5472
5472
  "focus": "pf-m-focus",
5473
5473
  "disabled": "pf-m-disabled",
5474
+ "ariaDisabled": "pf-m-aria-disabled",
5474
5475
  "load": "pf-m-load",
5475
5476
  "loading": "pf-m-loading",
5476
5477
  "danger": "pf-m-danger",
@@ -5651,10 +5652,12 @@ class MenuBase extends React.Component {
5651
5652
  document.activeElement.parentElement === element ||
5652
5653
  document.activeElement.closest(`.${menuStyles.menuSearch}`) === element || // if element is a MenuSearch
5653
5654
  (document.activeElement.closest('ol') && document.activeElement.closest('ol').firstChild === element), getFocusableElement: (navigableElement) => {
5654
- var _a;
5655
+ var _a, _b;
5655
5656
  return ((navigableElement === null || navigableElement === void 0 ? void 0 : navigableElement.tagName) === 'DIV' && navigableElement.querySelector('input')) || // for MenuSearchInput
5656
5657
  (((_a = navigableElement.firstChild) === null || _a === void 0 ? void 0 : _a.tagName) === 'LABEL' &&
5657
5658
  navigableElement.querySelector('input')) || // for MenuItem checkboxes
5659
+ (((_b = navigableElement.firstChild) === null || _b === void 0 ? void 0 : _b.tagName) === 'DIV' &&
5660
+ navigableElement.querySelector('a, button, input')) || // For aria-disabled element that is rendered inside a div with "display: contents" styling
5658
5661
  navigableElement.firstChild;
5659
5662
  }, noHorizontalArrowHandling: document.activeElement &&
5660
5663
  (document.activeElement.classList.contains('pf-v5-c-breadcrumb__link') ||
@@ -5850,7 +5853,7 @@ const FlyoutContext = React.createContext({
5850
5853
  direction: 'right'
5851
5854
  });
5852
5855
  const MenuItemBase = (_a) => {
5853
- var { children, className, itemId = null, to, hasCheckbox = false, isActive = null, isFavorited = null, isLoadButton = false, isLoading = false, flyoutMenu, direction, description = null, onClick = () => { }, component = 'button', isDisabled = false, isExternalLink = false, isSelected = null, isFocused, isDanger = false, icon, actions, onShowFlyout, drilldownMenu, isOnPath, innerRef, id, 'aria-label': ariaLabel } = _a, props = __rest$1(_a, ["children", "className", "itemId", "to", "hasCheckbox", "isActive", "isFavorited", "isLoadButton", "isLoading", "flyoutMenu", "direction", "description", "onClick", "component", "isDisabled", "isExternalLink", "isSelected", "isFocused", "isDanger", "icon", "actions", "onShowFlyout", "drilldownMenu", "isOnPath", "innerRef", "id", 'aria-label']);
5856
+ var { children, className, itemId = null, to, hasCheckbox = false, isActive = null, isFavorited = null, isLoadButton = false, isLoading = false, flyoutMenu, direction, description = null, onClick = () => { }, component = 'button', isDisabled = false, isAriaDisabled = false, isExternalLink = false, isSelected = null, isFocused, isDanger = false, icon, actions, onShowFlyout, drilldownMenu, isOnPath, innerRef, id, 'aria-label': ariaLabel, tooltipProps } = _a, props = __rest$1(_a, ["children", "className", "itemId", "to", "hasCheckbox", "isActive", "isFavorited", "isLoadButton", "isLoading", "flyoutMenu", "direction", "description", "onClick", "component", "isDisabled", "isAriaDisabled", "isExternalLink", "isSelected", "isFocused", "isDanger", "icon", "actions", "onShowFlyout", "drilldownMenu", "isOnPath", "innerRef", "id", 'aria-label', "tooltipProps"]);
5854
5857
  const { menuId, parentMenu, onSelect, onActionClick, activeItemId, selected, drilldownItemPath, onDrillIn, onDrillOut, flyoutRef, setFlyoutRef, disableHover, role: menuRole } = React.useContext(MenuContext);
5855
5858
  let Component = (to ? 'a' : component);
5856
5859
  if (hasCheckbox && !to) {
@@ -5945,10 +5948,12 @@ const MenuItemBase = (_a) => {
5945
5948
  }
5946
5949
  };
5947
5950
  const onItemSelect = (event, onSelect) => {
5948
- // Trigger callback for Menu onSelect
5949
- onSelect && onSelect(event, itemId);
5950
- // Trigger callback for item onClick
5951
- onClick && onClick(event);
5951
+ if (!isAriaDisabled) {
5952
+ // Trigger callback for Menu onSelect
5953
+ onSelect && onSelect(event, itemId);
5954
+ // Trigger callback for item onClick
5955
+ onClick && onClick(event);
5956
+ }
5952
5957
  };
5953
5958
  const _isOnPath = (isOnPath && isOnPath) || (drilldownItemPath && drilldownItemPath.includes(itemId)) || false;
5954
5959
  let drill;
@@ -5967,7 +5972,7 @@ const MenuItemBase = (_a) => {
5967
5972
  if (Component === 'a') {
5968
5973
  additionalProps = {
5969
5974
  href: to,
5970
- 'aria-disabled': isDisabled ? true : null,
5975
+ 'aria-disabled': isDisabled || isAriaDisabled ? true : null,
5971
5976
  // prevent invalid 'disabled' attribute on <a> tags
5972
5977
  disabled: null,
5973
5978
  target: isExternalLink ? '_blank' : null
@@ -5975,7 +5980,8 @@ const MenuItemBase = (_a) => {
5975
5980
  }
5976
5981
  else if (Component === 'button') {
5977
5982
  additionalProps = {
5978
- type: 'button'
5983
+ type: 'button',
5984
+ 'aria-disabled': isAriaDisabled ? true : null
5979
5985
  };
5980
5986
  }
5981
5987
  if (isOnPath) {
@@ -6020,12 +6026,17 @@ const MenuItemBase = (_a) => {
6020
6026
  }
6021
6027
  };
6022
6028
  const isSelectMenu = menuRole === 'listbox';
6023
- return (React.createElement("li", Object.assign({ className: css(menuStyles.menuListItem, isDisabled && menuStyles.modifiers.disabled, _isOnPath && menuStyles.modifiers.currentPath, isLoadButton && menuStyles.modifiers.load, isLoading && menuStyles.modifiers.loading, isFocused && menuStyles.modifiers.focus, isDanger && menuStyles.modifiers.danger, className), onMouseOver: onMouseOver }, (flyoutMenu && { onKeyDown: handleFlyout }), { ref: ref, role: !hasCheckbox ? 'none' : 'menuitem' }, (hasCheckbox && { 'aria-label': ariaLabel }), props),
6029
+ const renderItem = (React.createElement(React.Fragment, null,
6024
6030
  React.createElement(GenerateId, null, (randomId) => (React.createElement(Component, Object.assign({ id: id, tabIndex: -1, className: css(menuStyles.menuItem, getIsSelected() && !hasCheckbox && menuStyles.modifiers.selected, className), "aria-current": getAriaCurrent() }, (!hasCheckbox && { disabled: isDisabled, 'aria-label': ariaLabel }), (!hasCheckbox && !flyoutMenu && { role: isSelectMenu ? 'option' : 'menuitem' }), (!hasCheckbox && !flyoutMenu && isSelectMenu && { 'aria-selected': getIsSelected() }), { ref: innerRef }, (!hasCheckbox && {
6025
6031
  onClick: (event) => {
6026
- onItemSelect(event, onSelect);
6027
- drill && drill(event);
6028
- flyoutMenu && handleFlyout(event);
6032
+ if (!isAriaDisabled) {
6033
+ onItemSelect(event, onSelect);
6034
+ drill && drill(event);
6035
+ flyoutMenu && handleFlyout(event);
6036
+ }
6037
+ else {
6038
+ event.preventDefault();
6039
+ }
6029
6040
  }
6030
6041
  }), (hasCheckbox && { htmlFor: randomId }), additionalProps),
6031
6042
  React.createElement("span", { className: css(menuStyles.menuItemMain) },
@@ -6033,7 +6044,7 @@ const MenuItemBase = (_a) => {
6033
6044
  React.createElement(AngleLeftIcon, { "aria-hidden": true }))),
6034
6045
  icon && React.createElement("span", { className: css(menuStyles.menuItemIcon) }, icon),
6035
6046
  hasCheckbox && (React.createElement("span", { className: css(menuStyles.menuItemCheck) },
6036
- React.createElement(Checkbox, { id: randomId, component: "span", isChecked: isSelected || false, onChange: (event) => onItemSelect(event, onSelect), isDisabled: isDisabled }))),
6047
+ React.createElement(Checkbox, { id: randomId, component: "span", isChecked: isSelected || false, onChange: (event) => onItemSelect(event, onSelect), isDisabled: isDisabled, "aria-disabled": isAriaDisabled }))),
6037
6048
  React.createElement("span", { className: css(menuStyles.menuItemText) }, children),
6038
6049
  isExternalLink && (React.createElement("span", { className: css(menuStyles.menuItemExternalIcon) },
6039
6050
  React.createElement(ExternalLinkAltIcon$1, { "aria-hidden": true }))),
@@ -6049,6 +6060,11 @@ const MenuItemBase = (_a) => {
6049
6060
  React.createElement(MenuItemContext.Provider, { value: { itemId, isDisabled } },
6050
6061
  actions,
6051
6062
  isFavorited !== null && (React.createElement(MenuItemAction, { icon: "favorites", isFavorited: isFavorited, "aria-label": isFavorited ? 'starred' : 'not starred', onClick: (event) => onActionClick(event, itemId), tabIndex: -1, actionId: "fav" })))));
6063
+ return (React.createElement("li", Object.assign({ className: css(menuStyles.menuListItem, isDisabled && menuStyles.modifiers.disabled, isAriaDisabled && menuStyles.modifiers.ariaDisabled, _isOnPath && menuStyles.modifiers.currentPath, isLoadButton && menuStyles.modifiers.load, isLoading && menuStyles.modifiers.loading, isFocused && menuStyles.modifiers.focus, isDanger && menuStyles.modifiers.danger, className), onMouseOver: () => {
6064
+ if (!isAriaDisabled) {
6065
+ onMouseOver();
6066
+ }
6067
+ } }, (flyoutMenu && !isAriaDisabled && { onKeyDown: handleFlyout }), { ref: ref, role: !hasCheckbox ? 'none' : 'menuitem' }, (hasCheckbox && { 'aria-label': ariaLabel }), props), tooltipProps ? (React.createElement(Tooltip, Object.assign({}, tooltipProps), renderItem)) : (renderItem)));
6052
6068
  };
6053
6069
  const MenuItem = React.forwardRef((props, ref) => (React.createElement(MenuItemBase, Object.assign({}, props, { innerRef: ref }))));
6054
6070
  MenuItem.displayName = 'MenuItem';
@@ -6131,6 +6147,7 @@ SelectOption.displayName = 'SelectOption';
6131
6147
 
6132
6148
  var styles$j = {
6133
6149
  "check": "pf-v5-c-check",
6150
+ "checkInput": "pf-v5-c-check__input",
6134
6151
  "menuToggle": "pf-v5-c-menu-toggle",
6135
6152
  "menuToggleButton": "pf-v5-c-menu-toggle__button",
6136
6153
  "menuToggleControls": "pf-v5-c-menu-toggle__controls",
@@ -6241,11 +6258,11 @@ class FormSelect extends React.Component {
6241
6258
  const selectedOption = React.Children.toArray(children).find((option) => option.props.value === value);
6242
6259
  const isSelectedPlaceholder = selectedOption && selectedOption.props.isPlaceholder;
6243
6260
  const hasStatusIcon = ['success', 'error', 'warning'].includes(validated);
6244
- return (React.createElement("div", { className: css(formStyles$1.formControl, isDisabled && formStyles$1.modifiers.disabled, isSelectedPlaceholder && formStyles$1.modifiers.placeholder, hasStatusIcon && formStyles$1.modifiers[validated], className) },
6261
+ return (React.createElement("span", { className: css(formStyles$1.formControl, isDisabled && formStyles$1.modifiers.disabled, isSelectedPlaceholder && formStyles$1.modifiers.placeholder, hasStatusIcon && formStyles$1.modifiers[validated], className) },
6245
6262
  React.createElement("select", Object.assign({}, props, { "aria-invalid": validated === ValidatedOptions.error }, getOUIAProps(FormSelect.displayName, ouiaId !== undefined ? ouiaId : this.state.ouiaStateId, ouiaSafe), { onChange: this.handleChange, disabled: isDisabled, required: isRequired, value: value }), children),
6246
- React.createElement("div", { className: css(formStyles$1.formControlUtilities) },
6263
+ React.createElement("span", { className: css(formStyles$1.formControlUtilities) },
6247
6264
  hasStatusIcon && React.createElement(FormControlIcon, { status: validated }),
6248
- React.createElement("div", { className: css(formStyles$1.formControlToggleIcon) },
6265
+ React.createElement("span", { className: css(formStyles$1.formControlToggleIcon) },
6249
6266
  React.createElement(CaretDownIcon, null)))));
6250
6267
  }
6251
6268
  }
@@ -6319,9 +6336,9 @@ class TextAreaBase extends React.Component {
6319
6336
  props = __rest$1(_a, ["className", "value", "validated", "isRequired", "isDisabled", "readOnlyVariant", "resizeOrientation", "innerRef", "disabled", "autoResize", "onChange"]);
6320
6337
  const orientation = `resize${capitalize(resizeOrientation)}`;
6321
6338
  const hasStatusIcon = ['success', 'error', 'warning'].includes(validated);
6322
- return (React.createElement("div", { className: css(formStyles$1.formControl, readOnlyVariant && formStyles$1.modifiers.readonly, readOnlyVariant === 'plain' && formStyles$1.modifiers.plain, resizeOrientation && formStyles$1.modifiers[orientation], isDisabled && formStyles$1.modifiers.disabled, hasStatusIcon && formStyles$1.modifiers[validated], className) },
6339
+ return (React.createElement("span", { className: css(formStyles$1.formControl, readOnlyVariant && formStyles$1.modifiers.readonly, readOnlyVariant === 'plain' && formStyles$1.modifiers.plain, resizeOrientation && formStyles$1.modifiers[orientation], isDisabled && formStyles$1.modifiers.disabled, hasStatusIcon && formStyles$1.modifiers[validated], className) },
6323
6340
  React.createElement("textarea", Object.assign({ onChange: this.handleChange }, (typeof this.props.defaultValue !== 'string' && { value }), { "aria-invalid": validated === ValidatedOptions.error, required: isRequired, disabled: isDisabled || disabled, readOnly: !!readOnlyVariant, ref: innerRef || this.inputRef }, props)),
6324
- hasStatusIcon && (React.createElement("div", { className: css(formStyles$1.formControlUtilities) },
6341
+ hasStatusIcon && (React.createElement("span", { className: css(formStyles$1.formControlUtilities) },
6325
6342
  React.createElement(FormControlIcon, { status: validated })))));
6326
6343
  }
6327
6344
  }
@@ -7001,7 +7018,7 @@ const Popover = (_a) => {
7001
7018
  React.createElement(PopoverBody, { id: `popover-${uniqueId}-body` }, typeof bodyContent === 'function' ? bodyContent(hide) : bodyContent),
7002
7019
  footerContent && (React.createElement(PopoverFooter, { id: `popover-${uniqueId}-footer` }, typeof footerContent === 'function' ? footerContent(hide) : footerContent)))));
7003
7020
  return (React.createElement(PopoverContext.Provider, { value: { headerComponent } },
7004
- React.createElement(Popper, { trigger: children, triggerRef: triggerRef, popper: content, popperRef: popoverRef, minWidth: "revert", appendTo: appendTo, isVisible: visible, positionModifiers: positionModifiers, distance: distance, placement: position, onTriggerClick: onTriggerClick, onDocumentClick: onDocumentClick, onDocumentKeyDown: onDocumentKeyDown, enableFlip: enableFlip, zIndex: zIndex, flipBehavior: flipBehavior })));
7021
+ React.createElement(Popper, { trigger: children, triggerRef: triggerRef, popper: content, popperRef: popoverRef, minWidth: minWidth, appendTo: appendTo, isVisible: visible, positionModifiers: positionModifiers, distance: distance, placement: position, onTriggerClick: onTriggerClick, onDocumentClick: onDocumentClick, onDocumentKeyDown: onDocumentKeyDown, enableFlip: enableFlip, zIndex: zIndex, flipBehavior: flipBehavior })));
7005
7022
  };
7006
7023
  Popover.displayName = 'Popover';
7007
7024
 
@@ -8686,7 +8703,7 @@ var ToolbarItemVariant;
8686
8703
  ToolbarItemVariant["expand-all"] = "expand-all";
8687
8704
  })(ToolbarItemVariant || (ToolbarItemVariant = {}));
8688
8705
  const ToolbarItem = (_a) => {
8689
- var { className, variant, visibility, spacer, widths, align, alignSelf, id, children, isAllExpanded, isOverflowContainer } = _a, props = __rest$1(_a, ["className", "variant", "visibility", "spacer", "widths", "align", "alignSelf", "id", "children", "isAllExpanded", "isOverflowContainer"]);
8706
+ var { className, variant, visibility, spacer, widths, align, alignSelf, alignItems, id, children, isAllExpanded, isOverflowContainer } = _a, props = __rest$1(_a, ["className", "variant", "visibility", "spacer", "widths", "align", "alignSelf", "alignItems", "id", "children", "isAllExpanded", "isOverflowContainer"]);
8690
8707
  if (variant === ToolbarItemVariant.separator) {
8691
8708
  return React.createElement(Divider, Object.assign({ className: css(styles$4.modifiers.vertical, className) }, props));
8692
8709
  }
@@ -8695,7 +8712,7 @@ const ToolbarItem = (_a) => {
8695
8712
  Object.entries(widths || {}).map(([breakpoint, value]) => (widthStyles[`--pf-v5-c-toolbar__item--Width${breakpoint !== 'default' ? `-on-${breakpoint}` : ''}`] = value));
8696
8713
  }
8697
8714
  return (React.createElement(PageContext.Consumer, null, ({ width, getBreakpoint }) => (React.createElement("div", Object.assign({ className: css(styles$4.toolbarItem, variant &&
8698
- styles$4.modifiers[toCamel(variant)], isAllExpanded && styles$4.modifiers.expanded, isOverflowContainer && styles$4.modifiers.overflowContainer, formatBreakpointMods(visibility, styles$4, '', getBreakpoint(width)), formatBreakpointMods(align, styles$4, '', getBreakpoint(width)), formatBreakpointMods(spacer, styles$4, '', getBreakpoint(width)), alignSelf === 'center' && styles$4.modifiers.alignSelfCenter, alignSelf === 'baseline' && styles$4.modifiers.alignSelfBaseline, className) }, (variant === 'label' && { 'aria-hidden': true }), { id: id }, props, (widths && { style: Object.assign(Object.assign({}, widthStyles), props.style) })), children))));
8715
+ styles$4.modifiers[toCamel(variant)], isAllExpanded && styles$4.modifiers.expanded, isOverflowContainer && styles$4.modifiers.overflowContainer, formatBreakpointMods(visibility, styles$4, '', getBreakpoint(width)), formatBreakpointMods(align, styles$4, '', getBreakpoint(width)), formatBreakpointMods(spacer, styles$4, '', getBreakpoint(width)), alignItems === 'start' && styles$4.modifiers.alignItemsStart, alignItems === 'center' && styles$4.modifiers.alignItemsCenter, alignItems === 'baseline' && styles$4.modifiers.alignItemsBaseline, alignSelf === 'start' && styles$4.modifiers.alignSelfStart, alignSelf === 'center' && styles$4.modifiers.alignSelfCenter, alignSelf === 'baseline' && styles$4.modifiers.alignSelfBaseline, className) }, (variant === 'label' && { 'aria-hidden': true }), { id: id }, props, (widths && { style: Object.assign(Object.assign({}, widthStyles), props.style) })), children))));
8699
8716
  };
8700
8717
  ToolbarItem.displayName = 'ToolbarItem';
8701
8718
 
@@ -8708,7 +8725,7 @@ var ToolbarGroupVariant;
8708
8725
  class ToolbarGroupWithRef extends React.Component {
8709
8726
  render() {
8710
8727
  const _a = this.props, { visibility, align, alignItems, alignSelf, spacer, spaceItems, className, variant, children, isOverflowContainer, innerRef } = _a, props = __rest$1(_a, ["visibility", "align", "alignItems", "alignSelf", "spacer", "spaceItems", "className", "variant", "children", "isOverflowContainer", "innerRef"]);
8711
- return (React.createElement(PageContext.Consumer, null, ({ width, getBreakpoint }) => (React.createElement("div", Object.assign({ className: css(styles$4.toolbarGroup, variant && styles$4.modifiers[toCamel(variant)], formatBreakpointMods(visibility, styles$4, '', getBreakpoint(width)), formatBreakpointMods(align, styles$4, '', getBreakpoint(width)), formatBreakpointMods(spacer, styles$4, '', getBreakpoint(width)), formatBreakpointMods(spaceItems, styles$4, '', getBreakpoint(width)), alignItems === 'center' && styles$4.modifiers.alignItemsCenter, alignItems === 'baseline' && styles$4.modifiers.alignItemsBaseline, alignSelf === 'center' && styles$4.modifiers.alignSelfCenter, alignSelf === 'baseline' && styles$4.modifiers.alignSelfBaseline, isOverflowContainer && styles$4.modifiers.overflowContainer, className) }, props, { ref: innerRef }), children))));
8728
+ return (React.createElement(PageContext.Consumer, null, ({ width, getBreakpoint }) => (React.createElement("div", Object.assign({ className: css(styles$4.toolbarGroup, variant && styles$4.modifiers[toCamel(variant)], formatBreakpointMods(visibility, styles$4, '', getBreakpoint(width)), formatBreakpointMods(align, styles$4, '', getBreakpoint(width)), formatBreakpointMods(spacer, styles$4, '', getBreakpoint(width)), formatBreakpointMods(spaceItems, styles$4, '', getBreakpoint(width)), alignItems === 'start' && styles$4.modifiers.alignItemsStart, alignItems === 'center' && styles$4.modifiers.alignItemsCenter, alignItems === 'baseline' && styles$4.modifiers.alignItemsBaseline, alignSelf === 'start' && styles$4.modifiers.alignSelfStart, alignSelf === 'center' && styles$4.modifiers.alignSelfCenter, alignSelf === 'baseline' && styles$4.modifiers.alignSelfBaseline, isOverflowContainer && styles$4.modifiers.overflowContainer, className) }, props, { ref: innerRef }), children))));
8712
8729
  }
8713
8730
  }
8714
8731
  const ToolbarGroup = React.forwardRef((props, ref) => (React.createElement(ToolbarGroupWithRef, Object.assign({}, props, { innerRef: ref }))));
@@ -8727,7 +8744,8 @@ class ToolbarChipGroupContent extends React.Component {
8727
8744
  collapseListedFilters =
8728
8745
  (canUseDOM ? window.innerWidth : 1200) < globalBreakpoints[collapseListedFiltersBreakpoint];
8729
8746
  }
8730
- return (React.createElement("div", Object.assign({ className: css(styles$4.toolbarContent, (numberOfFilters === 0 || isExpanded) && styles$4.modifiers.hidden, className) }, ((numberOfFilters === 0 || isExpanded) && { hidden: true }), { ref: chipGroupContentRef }, props),
8747
+ const isHidden = numberOfFilters === 0 || isExpanded;
8748
+ return (React.createElement("div", Object.assign({ className: css(styles$4.toolbarContent, !isHidden && !collapseListedFilters && styles$4.modifiers.chipContainer, isHidden && styles$4.modifiers.hidden, className) }, ((numberOfFilters === 0 || isExpanded) && { hidden: true }), { ref: chipGroupContentRef }, props),
8731
8749
  React.createElement(ToolbarGroup, Object.assign({ className: css(collapseListedFilters && styles$4.modifiers.hidden) }, (collapseListedFilters && { hidden: true }), (collapseListedFilters && { 'aria-hidden': true }))),
8732
8750
  collapseListedFilters && numberOfFilters > 0 && !isExpanded && (React.createElement(ToolbarGroup, null,
8733
8751
  React.createElement(ToolbarItem, null, numberOfFiltersText(numberOfFilters)))),
@@ -8849,17 +8867,16 @@ class ToolbarContent extends React.Component {
8849
8867
  this.chipContainerRef = React.createRef();
8850
8868
  }
8851
8869
  render() {
8852
- const _a = this.props, { className, children, isExpanded, toolbarId, visibility, alignItems, clearAllFilters, showClearFiltersButton, clearFiltersButtonText } = _a, props = __rest$1(_a, ["className", "children", "isExpanded", "toolbarId", "visibility", "alignItems", "clearAllFilters", "showClearFiltersButton", "clearFiltersButtonText"]);
8870
+ const _a = this.props, { className, children, isExpanded, toolbarId, visibility, alignItems, clearAllFilters, showClearFiltersButton, clearFiltersButtonText, alignSelf } = _a, props = __rest$1(_a, ["className", "children", "isExpanded", "toolbarId", "visibility", "alignItems", "clearAllFilters", "showClearFiltersButton", "clearFiltersButtonText", "alignSelf"]);
8853
8871
  return (React.createElement(PageContext.Consumer, null, ({ width, getBreakpoint }) => (React.createElement("div", Object.assign({ className: css(styles$4.toolbarContent, formatBreakpointMods(visibility, styles$4, '', getBreakpoint(width)), className) }, props),
8854
8872
  React.createElement(ToolbarContext.Consumer, null, ({ clearAllFilters: clearAllFiltersContext, clearFiltersButtonText: clearFiltersButtonContext, showClearFiltersButton: showClearFiltersButtonContext, toolbarId: toolbarIdContext }) => {
8855
- const expandableContentId = `${toolbarId ||
8856
- toolbarIdContext}-expandable-content-${ToolbarContent.currentId++}`;
8873
+ const expandableContentId = `${toolbarId || toolbarIdContext}-expandable-content-${ToolbarContent.currentId++}`;
8857
8874
  return (React.createElement(ToolbarContentContext.Provider, { value: {
8858
8875
  expandableContentRef: this.expandableContentRef,
8859
8876
  expandableContentId,
8860
8877
  chipContainerRef: this.chipContainerRef
8861
8878
  } },
8862
- React.createElement("div", { className: css(styles$4.toolbarContentSection, alignItems === 'center' && styles$4.modifiers.alignItemsCenter) }, children),
8879
+ React.createElement("div", { className: css(styles$4.toolbarContentSection, alignItems === 'center' && styles$4.modifiers.alignItemsCenter, alignItems === 'start' && styles$4.modifiers.alignItemsStart, alignItems === 'baseline' && styles$4.modifiers.alignItemsBaseline, alignSelf === 'center' && styles$4.modifiers.alignSelfCenter, alignSelf === 'start' && styles$4.modifiers.alignSelfStart, alignSelf === 'baseline' && styles$4.modifiers.alignSelfBaseline) }, children),
8863
8880
  React.createElement(ToolbarExpandableContent, { id: expandableContentId, isExpanded: isExpanded, expandableContentRef: this.expandableContentRef, chipContainerRef: this.chipContainerRef, clearAllFilters: clearAllFilters || clearAllFiltersContext, showClearFiltersButton: showClearFiltersButton || showClearFiltersButtonContext, clearFiltersButtonText: clearFiltersButtonText || clearFiltersButtonContext })));
8864
8881
  })))));
8865
8882
  }
@@ -9663,66 +9680,66 @@ m.Pop;a=b();var q=a[0],l=a[1],c=B$1(),e=B$1();null==q&&(q=0,f.replaceState(_exte
9663
9680
  y$1(_extends({pathname:"/",search:"",hash:"",state:null,key:D$1()},"string"===typeof a?F$2(a):a));"production"!==process.env.NODE_ENV?z$2("/"===b.pathname.charAt(0),"Relative pathnames are not supported in createMemoryHistory({ initialEntries }) (invalid entry: "+JSON.stringify(a)+")"):void 0;return b}),f=Math.min(Math.max(null==r?h.length-1:r,0),h.length-1),p=m.Pop,n=h[f],q=B$1(),l=B$1();return {get index(){return f},get action(){return p},get location(){return n},createHref:function(a){return "string"===typeof a?
9664
9681
  a:E$1(a)},push:v,replace:w,go:u,back:function(){u(-1);},forward:function(){u(1);},listen:function(a){return q.push(a)},block:function(a){return l.push(a)}}}
9665
9682
 
9666
- var QuickStartStatus;
9667
- (function (QuickStartStatus) {
9668
- QuickStartStatus["COMPLETE"] = "Complete";
9669
- QuickStartStatus["IN_PROGRESS"] = "In Progress";
9670
- QuickStartStatus["NOT_STARTED"] = "Not started";
9671
- })(QuickStartStatus || (QuickStartStatus = {}));
9672
- var QuickStartTaskStatus;
9673
- (function (QuickStartTaskStatus) {
9674
- QuickStartTaskStatus["INIT"] = "Initial";
9675
- QuickStartTaskStatus["VISITED"] = "Visited";
9676
- QuickStartTaskStatus["REVIEW"] = "Review";
9677
- QuickStartTaskStatus["SUCCESS"] = "Success";
9678
- QuickStartTaskStatus["FAILED"] = "Failed";
9683
+ var QuickStartStatus;
9684
+ (function (QuickStartStatus) {
9685
+ QuickStartStatus["COMPLETE"] = "Complete";
9686
+ QuickStartStatus["IN_PROGRESS"] = "In Progress";
9687
+ QuickStartStatus["NOT_STARTED"] = "Not started";
9688
+ })(QuickStartStatus || (QuickStartStatus = {}));
9689
+ var QuickStartTaskStatus;
9690
+ (function (QuickStartTaskStatus) {
9691
+ QuickStartTaskStatus["INIT"] = "Initial";
9692
+ QuickStartTaskStatus["VISITED"] = "Visited";
9693
+ QuickStartTaskStatus["REVIEW"] = "Review";
9694
+ QuickStartTaskStatus["SUCCESS"] = "Success";
9695
+ QuickStartTaskStatus["FAILED"] = "Failed";
9679
9696
  })(QuickStartTaskStatus || (QuickStartTaskStatus = {}));
9680
9697
 
9681
- const QUICKSTART_SEARCH_FILTER_KEY = 'keyword';
9682
- const QUICKSTART_STATUS_FILTER_KEY = 'status';
9683
- const QUICKSTART_ID_FILTER_KEY = 'quickstart';
9684
- const QUICKSTART_TASKS_INITIAL_STATES = [
9685
- QuickStartTaskStatus.INIT,
9686
- QuickStartTaskStatus.VISITED,
9687
- ];
9698
+ const QUICKSTART_SEARCH_FILTER_KEY = 'keyword';
9699
+ const QUICKSTART_STATUS_FILTER_KEY = 'status';
9700
+ const QUICKSTART_ID_FILTER_KEY = 'quickstart';
9701
+ const QUICKSTART_TASKS_INITIAL_STATES = [
9702
+ QuickStartTaskStatus.INIT,
9703
+ QuickStartTaskStatus.VISITED,
9704
+ ];
9688
9705
  const HELP_TOPIC_NAME_KEY = 'topic';
9689
9706
 
9690
- let createHistory;
9691
- try {
9692
- if (process.env.NODE_ENV === 'test') {
9693
- // Running in node. Can't use browser history
9694
- createHistory = createMemoryHistory;
9695
- }
9696
- else {
9697
- createHistory = createBrowserHistory;
9698
- }
9699
- }
9700
- catch (unused) {
9701
- createHistory = createBrowserHistory;
9702
- }
9703
- const history = createHistory();
9704
- const removeQueryArgument = (k) => {
9705
- const params = new URLSearchParams(window.location.search);
9706
- if (params.has(k)) {
9707
- params.delete(k);
9708
- const url = new URL(window.location.href);
9709
- history.replace(`${url.pathname}?${params.toString()}${url.hash}`);
9710
- }
9711
- };
9712
- const setQueryArgument = (k, v) => {
9713
- if (!v) {
9714
- return removeQueryArgument(k);
9715
- }
9716
- const params = new URLSearchParams(window.location.search);
9717
- if (params.get(k) !== v) {
9718
- params.set(k, v);
9719
- const url = new URL(window.location.href);
9720
- history.replace(`${url.pathname}?${params.toString()}${url.hash}`);
9721
- }
9722
- };
9723
- const clearFilterParams = () => {
9724
- removeQueryArgument(QUICKSTART_SEARCH_FILTER_KEY);
9725
- removeQueryArgument(QUICKSTART_STATUS_FILTER_KEY);
9707
+ let createHistory;
9708
+ try {
9709
+ if (process.env.NODE_ENV === 'test') {
9710
+ // Running in node. Can't use browser history
9711
+ createHistory = createMemoryHistory;
9712
+ }
9713
+ else {
9714
+ createHistory = createBrowserHistory;
9715
+ }
9716
+ }
9717
+ catch (unused) {
9718
+ createHistory = createBrowserHistory;
9719
+ }
9720
+ const history = createHistory();
9721
+ const removeQueryArgument = (k) => {
9722
+ const params = new URLSearchParams(window.location.search);
9723
+ if (params.has(k)) {
9724
+ params.delete(k);
9725
+ const url = new URL(window.location.href);
9726
+ history.replace(`${url.pathname}?${params.toString()}${url.hash}`);
9727
+ }
9728
+ };
9729
+ const setQueryArgument = (k, v) => {
9730
+ if (!v) {
9731
+ return removeQueryArgument(k);
9732
+ }
9733
+ const params = new URLSearchParams(window.location.search);
9734
+ if (params.get(k) !== v) {
9735
+ params.set(k, v);
9736
+ const url = new URL(window.location.href);
9737
+ history.replace(`${url.pathname}?${params.toString()}${url.hash}`);
9738
+ }
9739
+ };
9740
+ const clearFilterParams = () => {
9741
+ removeQueryArgument(QUICKSTART_SEARCH_FILTER_KEY);
9742
+ removeQueryArgument(QUICKSTART_STATUS_FILTER_KEY);
9726
9743
  };
9727
9744
 
9728
9745
  var Status$1 = "Status";
@@ -9786,667 +9803,667 @@ var en = {
9786
9803
  "{{type}} • {{duration, number}} minutes": "{{type}} • {{duration, number}} minutes"
9787
9804
  };
9788
9805
 
9789
- /* eslint-disable */
9790
- // https://github.com/i18next/i18next/blob/master/src/PluralResolver.js
9791
- const sets = [
9792
- {
9793
- lngs: [
9794
- 'ach',
9795
- 'ak',
9796
- 'am',
9797
- 'arn',
9798
- 'br',
9799
- 'fil',
9800
- 'gun',
9801
- 'ln',
9802
- 'mfe',
9803
- 'mg',
9804
- 'mi',
9805
- 'oc',
9806
- 'pt',
9807
- 'pt-BR',
9808
- 'tg',
9809
- 'tl',
9810
- 'ti',
9811
- 'tr',
9812
- 'uz',
9813
- 'wa',
9814
- ],
9815
- nr: [1, 2],
9816
- fc: 1,
9817
- },
9818
- {
9819
- lngs: [
9820
- 'af',
9821
- 'an',
9822
- 'ast',
9823
- 'az',
9824
- 'bg',
9825
- 'bn',
9826
- 'ca',
9827
- 'da',
9828
- 'de',
9829
- 'dev',
9830
- 'el',
9831
- 'en',
9832
- 'eo',
9833
- 'es',
9834
- 'et',
9835
- 'eu',
9836
- 'fi',
9837
- 'fo',
9838
- 'fur',
9839
- 'fy',
9840
- 'gl',
9841
- 'gu',
9842
- 'ha',
9843
- 'hi',
9844
- 'hu',
9845
- 'hy',
9846
- 'ia',
9847
- 'it',
9848
- 'kk',
9849
- 'kn',
9850
- 'ku',
9851
- 'lb',
9852
- 'mai',
9853
- 'ml',
9854
- 'mn',
9855
- 'mr',
9856
- 'nah',
9857
- 'nap',
9858
- 'nb',
9859
- 'ne',
9860
- 'nl',
9861
- 'nn',
9862
- 'no',
9863
- 'nso',
9864
- 'pa',
9865
- 'pap',
9866
- 'pms',
9867
- 'ps',
9868
- 'pt-PT',
9869
- 'rm',
9870
- 'sco',
9871
- 'se',
9872
- 'si',
9873
- 'so',
9874
- 'son',
9875
- 'sq',
9876
- 'sv',
9877
- 'sw',
9878
- 'ta',
9879
- 'te',
9880
- 'tk',
9881
- 'ur',
9882
- 'yo',
9883
- ],
9884
- nr: [1, 2],
9885
- fc: 2,
9886
- },
9887
- {
9888
- lngs: [
9889
- 'ay',
9890
- 'bo',
9891
- 'cgg',
9892
- 'fa',
9893
- 'ht',
9894
- 'id',
9895
- 'ja',
9896
- 'jbo',
9897
- 'ka',
9898
- 'km',
9899
- 'ko',
9900
- 'ky',
9901
- 'lo',
9902
- 'ms',
9903
- 'sah',
9904
- 'su',
9905
- 'th',
9906
- 'tt',
9907
- 'ug',
9908
- 'vi',
9909
- 'wo',
9910
- 'zh',
9911
- ],
9912
- nr: [1],
9913
- fc: 3,
9914
- },
9915
- { lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'], nr: [1, 2, 5], fc: 4 },
9916
- { lngs: ['ar'], nr: [0, 1, 2, 3, 11, 100], fc: 5 },
9917
- { lngs: ['cs', 'sk'], nr: [1, 2, 5], fc: 6 },
9918
- { lngs: ['csb', 'pl'], nr: [1, 2, 5], fc: 7 },
9919
- { lngs: ['cy'], nr: [1, 2, 3, 8], fc: 8 },
9920
- { lngs: ['fr'], nr: [1, 2], fc: 9 },
9921
- { lngs: ['ga'], nr: [1, 2, 3, 7, 11], fc: 10 },
9922
- { lngs: ['gd'], nr: [1, 2, 3, 20], fc: 11 },
9923
- { lngs: ['is'], nr: [1, 2], fc: 12 },
9924
- { lngs: ['jv'], nr: [0, 1], fc: 13 },
9925
- { lngs: ['kw'], nr: [1, 2, 3, 4], fc: 14 },
9926
- { lngs: ['lt'], nr: [1, 2, 10], fc: 15 },
9927
- { lngs: ['lv'], nr: [1, 2, 0], fc: 16 },
9928
- { lngs: ['mk'], nr: [1, 2], fc: 17 },
9929
- { lngs: ['mnk'], nr: [0, 1, 2], fc: 18 },
9930
- { lngs: ['mt'], nr: [1, 2, 11, 20], fc: 19 },
9931
- { lngs: ['or'], nr: [2, 1], fc: 2 },
9932
- { lngs: ['ro'], nr: [1, 2, 20], fc: 20 },
9933
- { lngs: ['sl'], nr: [5, 1, 2, 3], fc: 21 },
9934
- { lngs: ['he', 'iw'], nr: [1, 2, 20, 21], fc: 22 },
9935
- ];
9936
- const _rulesPluralsTypes = {
9937
- 1: function (n) {
9938
- return Number(n > 1);
9939
- },
9940
- 2: function (n) {
9941
- return Number(n != 1);
9942
- },
9943
- 3: function (n) {
9944
- return 0;
9945
- },
9946
- 4: function (n) {
9947
- return Number(n % 10 == 1 && n % 100 != 11
9948
- ? 0
9949
- : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)
9950
- ? 1
9951
- : 2);
9952
- },
9953
- 5: function (n) {
9954
- return Number(n == 0
9955
- ? 0
9956
- : n == 1
9957
- ? 1
9958
- : n == 2
9959
- ? 2
9960
- : n % 100 >= 3 && n % 100 <= 10
9961
- ? 3
9962
- : n % 100 >= 11
9963
- ? 4
9964
- : 5);
9965
- },
9966
- 6: function (n) {
9967
- return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);
9968
- },
9969
- 7: function (n) {
9970
- return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
9971
- },
9972
- 8: function (n) {
9973
- return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);
9974
- },
9975
- 9: function (n) {
9976
- return Number(n >= 2);
9977
- },
9978
- 10: function (n) {
9979
- return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);
9980
- },
9981
- 11: function (n) {
9982
- return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);
9983
- },
9984
- 12: function (n) {
9985
- return Number(n % 10 != 1 || n % 100 == 11);
9986
- },
9987
- 13: function (n) {
9988
- return Number(n !== 0);
9989
- },
9990
- 14: function (n) {
9991
- return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);
9992
- },
9993
- 15: function (n) {
9994
- return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
9995
- },
9996
- 16: function (n) {
9997
- return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);
9998
- },
9999
- 17: function (n) {
10000
- return Number(n == 1 || (n % 10 == 1 && n % 100 != 11) ? 0 : 1);
10001
- },
10002
- 18: function (n) {
10003
- return Number(n == 0 ? 0 : n == 1 ? 1 : 2);
10004
- },
10005
- 19: function (n) {
10006
- return Number(n == 1
10007
- ? 0
10008
- : n == 0 || (n % 100 > 1 && n % 100 < 11)
10009
- ? 1
10010
- : n % 100 > 10 && n % 100 < 20
10011
- ? 2
10012
- : 3);
10013
- },
10014
- 20: function (n) {
10015
- return Number(n == 1 ? 0 : n == 0 || (n % 100 > 0 && n % 100 < 20) ? 1 : 2);
10016
- },
10017
- 21: function (n) {
10018
- return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);
10019
- },
10020
- 22: function (n) {
10021
- return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3);
10022
- },
10023
- };
10024
- function createRules() {
10025
- const rules = {};
10026
- sets.forEach((set) => {
10027
- set.lngs.forEach((l) => {
10028
- rules[l] = {
10029
- numbers: set.nr,
10030
- plurals: _rulesPluralsTypes[set.fc],
10031
- };
10032
- });
10033
- });
10034
- return rules;
10035
- }
10036
- class PluralResolver {
10037
- constructor(options = {}) {
10038
- this.options = options;
10039
- this.rules = createRules();
10040
- }
10041
- addRule(lng, obj) {
10042
- this.rules[lng] = obj;
10043
- }
10044
- getRule(code) {
10045
- return this.rules[code];
10046
- }
10047
- needsPlural(code) {
10048
- const rule = this.getRule(code);
10049
- return rule && rule.numbers.length > 1;
10050
- }
10051
- getPluralFormsOfKey(code, key) {
10052
- return this.getSuffixes(code).map((suffix) => key + suffix);
10053
- }
10054
- getSuffixes(code) {
10055
- const rule = this.getRule(code);
10056
- if (!rule) {
10057
- return [];
10058
- }
10059
- return rule.numbers.map((number) => this.getSuffix(code, number));
10060
- }
10061
- getSuffix(code, count) {
10062
- const rule = this.getRule(code);
10063
- if (rule) {
10064
- // if (rule.numbers.length === 1) return ''; // only singular
10065
- const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));
10066
- let suffix = rule.numbers[idx];
10067
- // special treatment for lngs only having singular and plural
10068
- if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {
10069
- if (suffix === 2) {
10070
- suffix = 'plural';
10071
- }
10072
- else if (suffix === 1) {
10073
- suffix = '';
10074
- }
10075
- }
10076
- const returnSuffix = () => this.options.prepend && suffix.toString()
10077
- ? this.options.prepend + suffix.toString()
10078
- : suffix.toString();
10079
- // COMPATIBILITY JSON
10080
- // v1
10081
- if (this.options.compatibilityJSON === 'v1') {
10082
- if (suffix === 1) {
10083
- return '';
10084
- }
10085
- if (typeof suffix === 'number') {
10086
- return `_plural_${suffix.toString()}`;
10087
- }
10088
- return returnSuffix();
10089
- }
10090
- if ( /* v2 */this.options.compatibilityJSON === 'v2') {
10091
- return returnSuffix();
10092
- }
10093
- if (
10094
- /* v3 - gettext index */ this.options.simplifyPluralSuffix &&
10095
- rule.numbers.length === 2 &&
10096
- rule.numbers[0] === 1) {
10097
- return returnSuffix();
10098
- }
10099
- return this.options.prepend && idx.toString()
10100
- ? this.options.prepend + idx.toString()
10101
- : idx.toString();
10102
- }
10103
- // this.logger.warn(`no plural rule found for: ${code}`);
10104
- return '';
10105
- }
9806
+ /* eslint-disable */
9807
+ // https://github.com/i18next/i18next/blob/master/src/PluralResolver.js
9808
+ const sets = [
9809
+ {
9810
+ lngs: [
9811
+ 'ach',
9812
+ 'ak',
9813
+ 'am',
9814
+ 'arn',
9815
+ 'br',
9816
+ 'fil',
9817
+ 'gun',
9818
+ 'ln',
9819
+ 'mfe',
9820
+ 'mg',
9821
+ 'mi',
9822
+ 'oc',
9823
+ 'pt',
9824
+ 'pt-BR',
9825
+ 'tg',
9826
+ 'tl',
9827
+ 'ti',
9828
+ 'tr',
9829
+ 'uz',
9830
+ 'wa',
9831
+ ],
9832
+ nr: [1, 2],
9833
+ fc: 1,
9834
+ },
9835
+ {
9836
+ lngs: [
9837
+ 'af',
9838
+ 'an',
9839
+ 'ast',
9840
+ 'az',
9841
+ 'bg',
9842
+ 'bn',
9843
+ 'ca',
9844
+ 'da',
9845
+ 'de',
9846
+ 'dev',
9847
+ 'el',
9848
+ 'en',
9849
+ 'eo',
9850
+ 'es',
9851
+ 'et',
9852
+ 'eu',
9853
+ 'fi',
9854
+ 'fo',
9855
+ 'fur',
9856
+ 'fy',
9857
+ 'gl',
9858
+ 'gu',
9859
+ 'ha',
9860
+ 'hi',
9861
+ 'hu',
9862
+ 'hy',
9863
+ 'ia',
9864
+ 'it',
9865
+ 'kk',
9866
+ 'kn',
9867
+ 'ku',
9868
+ 'lb',
9869
+ 'mai',
9870
+ 'ml',
9871
+ 'mn',
9872
+ 'mr',
9873
+ 'nah',
9874
+ 'nap',
9875
+ 'nb',
9876
+ 'ne',
9877
+ 'nl',
9878
+ 'nn',
9879
+ 'no',
9880
+ 'nso',
9881
+ 'pa',
9882
+ 'pap',
9883
+ 'pms',
9884
+ 'ps',
9885
+ 'pt-PT',
9886
+ 'rm',
9887
+ 'sco',
9888
+ 'se',
9889
+ 'si',
9890
+ 'so',
9891
+ 'son',
9892
+ 'sq',
9893
+ 'sv',
9894
+ 'sw',
9895
+ 'ta',
9896
+ 'te',
9897
+ 'tk',
9898
+ 'ur',
9899
+ 'yo',
9900
+ ],
9901
+ nr: [1, 2],
9902
+ fc: 2,
9903
+ },
9904
+ {
9905
+ lngs: [
9906
+ 'ay',
9907
+ 'bo',
9908
+ 'cgg',
9909
+ 'fa',
9910
+ 'ht',
9911
+ 'id',
9912
+ 'ja',
9913
+ 'jbo',
9914
+ 'ka',
9915
+ 'km',
9916
+ 'ko',
9917
+ 'ky',
9918
+ 'lo',
9919
+ 'ms',
9920
+ 'sah',
9921
+ 'su',
9922
+ 'th',
9923
+ 'tt',
9924
+ 'ug',
9925
+ 'vi',
9926
+ 'wo',
9927
+ 'zh',
9928
+ ],
9929
+ nr: [1],
9930
+ fc: 3,
9931
+ },
9932
+ { lngs: ['be', 'bs', 'cnr', 'dz', 'hr', 'ru', 'sr', 'uk'], nr: [1, 2, 5], fc: 4 },
9933
+ { lngs: ['ar'], nr: [0, 1, 2, 3, 11, 100], fc: 5 },
9934
+ { lngs: ['cs', 'sk'], nr: [1, 2, 5], fc: 6 },
9935
+ { lngs: ['csb', 'pl'], nr: [1, 2, 5], fc: 7 },
9936
+ { lngs: ['cy'], nr: [1, 2, 3, 8], fc: 8 },
9937
+ { lngs: ['fr'], nr: [1, 2], fc: 9 },
9938
+ { lngs: ['ga'], nr: [1, 2, 3, 7, 11], fc: 10 },
9939
+ { lngs: ['gd'], nr: [1, 2, 3, 20], fc: 11 },
9940
+ { lngs: ['is'], nr: [1, 2], fc: 12 },
9941
+ { lngs: ['jv'], nr: [0, 1], fc: 13 },
9942
+ { lngs: ['kw'], nr: [1, 2, 3, 4], fc: 14 },
9943
+ { lngs: ['lt'], nr: [1, 2, 10], fc: 15 },
9944
+ { lngs: ['lv'], nr: [1, 2, 0], fc: 16 },
9945
+ { lngs: ['mk'], nr: [1, 2], fc: 17 },
9946
+ { lngs: ['mnk'], nr: [0, 1, 2], fc: 18 },
9947
+ { lngs: ['mt'], nr: [1, 2, 11, 20], fc: 19 },
9948
+ { lngs: ['or'], nr: [2, 1], fc: 2 },
9949
+ { lngs: ['ro'], nr: [1, 2, 20], fc: 20 },
9950
+ { lngs: ['sl'], nr: [5, 1, 2, 3], fc: 21 },
9951
+ { lngs: ['he', 'iw'], nr: [1, 2, 20, 21], fc: 22 },
9952
+ ];
9953
+ const _rulesPluralsTypes = {
9954
+ 1: function (n) {
9955
+ return Number(n > 1);
9956
+ },
9957
+ 2: function (n) {
9958
+ return Number(n != 1);
9959
+ },
9960
+ 3: function (n) {
9961
+ return 0;
9962
+ },
9963
+ 4: function (n) {
9964
+ return Number(n % 10 == 1 && n % 100 != 11
9965
+ ? 0
9966
+ : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)
9967
+ ? 1
9968
+ : 2);
9969
+ },
9970
+ 5: function (n) {
9971
+ return Number(n == 0
9972
+ ? 0
9973
+ : n == 1
9974
+ ? 1
9975
+ : n == 2
9976
+ ? 2
9977
+ : n % 100 >= 3 && n % 100 <= 10
9978
+ ? 3
9979
+ : n % 100 >= 11
9980
+ ? 4
9981
+ : 5);
9982
+ },
9983
+ 6: function (n) {
9984
+ return Number(n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2);
9985
+ },
9986
+ 7: function (n) {
9987
+ return Number(n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
9988
+ },
9989
+ 8: function (n) {
9990
+ return Number(n == 1 ? 0 : n == 2 ? 1 : n != 8 && n != 11 ? 2 : 3);
9991
+ },
9992
+ 9: function (n) {
9993
+ return Number(n >= 2);
9994
+ },
9995
+ 10: function (n) {
9996
+ return Number(n == 1 ? 0 : n == 2 ? 1 : n < 7 ? 2 : n < 11 ? 3 : 4);
9997
+ },
9998
+ 11: function (n) {
9999
+ return Number(n == 1 || n == 11 ? 0 : n == 2 || n == 12 ? 1 : n > 2 && n < 20 ? 2 : 3);
10000
+ },
10001
+ 12: function (n) {
10002
+ return Number(n % 10 != 1 || n % 100 == 11);
10003
+ },
10004
+ 13: function (n) {
10005
+ return Number(n !== 0);
10006
+ },
10007
+ 14: function (n) {
10008
+ return Number(n == 1 ? 0 : n == 2 ? 1 : n == 3 ? 2 : 3);
10009
+ },
10010
+ 15: function (n) {
10011
+ return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
10012
+ },
10013
+ 16: function (n) {
10014
+ return Number(n % 10 == 1 && n % 100 != 11 ? 0 : n !== 0 ? 1 : 2);
10015
+ },
10016
+ 17: function (n) {
10017
+ return Number(n == 1 || (n % 10 == 1 && n % 100 != 11) ? 0 : 1);
10018
+ },
10019
+ 18: function (n) {
10020
+ return Number(n == 0 ? 0 : n == 1 ? 1 : 2);
10021
+ },
10022
+ 19: function (n) {
10023
+ return Number(n == 1
10024
+ ? 0
10025
+ : n == 0 || (n % 100 > 1 && n % 100 < 11)
10026
+ ? 1
10027
+ : n % 100 > 10 && n % 100 < 20
10028
+ ? 2
10029
+ : 3);
10030
+ },
10031
+ 20: function (n) {
10032
+ return Number(n == 1 ? 0 : n == 0 || (n % 100 > 0 && n % 100 < 20) ? 1 : 2);
10033
+ },
10034
+ 21: function (n) {
10035
+ return Number(n % 100 == 1 ? 1 : n % 100 == 2 ? 2 : n % 100 == 3 || n % 100 == 4 ? 3 : 0);
10036
+ },
10037
+ 22: function (n) {
10038
+ return Number(n == 1 ? 0 : n == 2 ? 1 : (n < 0 || n > 10) && n % 10 == 0 ? 2 : 3);
10039
+ },
10040
+ };
10041
+ function createRules() {
10042
+ const rules = {};
10043
+ sets.forEach((set) => {
10044
+ set.lngs.forEach((l) => {
10045
+ rules[l] = {
10046
+ numbers: set.nr,
10047
+ plurals: _rulesPluralsTypes[set.fc],
10048
+ };
10049
+ });
10050
+ });
10051
+ return rules;
10052
+ }
10053
+ class PluralResolver {
10054
+ constructor(options = {}) {
10055
+ this.options = options;
10056
+ this.rules = createRules();
10057
+ }
10058
+ addRule(lng, obj) {
10059
+ this.rules[lng] = obj;
10060
+ }
10061
+ getRule(code) {
10062
+ return this.rules[code];
10063
+ }
10064
+ needsPlural(code) {
10065
+ const rule = this.getRule(code);
10066
+ return rule && rule.numbers.length > 1;
10067
+ }
10068
+ getPluralFormsOfKey(code, key) {
10069
+ return this.getSuffixes(code).map((suffix) => key + suffix);
10070
+ }
10071
+ getSuffixes(code) {
10072
+ const rule = this.getRule(code);
10073
+ if (!rule) {
10074
+ return [];
10075
+ }
10076
+ return rule.numbers.map((number) => this.getSuffix(code, number));
10077
+ }
10078
+ getSuffix(code, count) {
10079
+ const rule = this.getRule(code);
10080
+ if (rule) {
10081
+ // if (rule.numbers.length === 1) return ''; // only singular
10082
+ const idx = rule.noAbs ? rule.plurals(count) : rule.plurals(Math.abs(count));
10083
+ let suffix = rule.numbers[idx];
10084
+ // special treatment for lngs only having singular and plural
10085
+ if (this.options.simplifyPluralSuffix && rule.numbers.length === 2 && rule.numbers[0] === 1) {
10086
+ if (suffix === 2) {
10087
+ suffix = 'plural';
10088
+ }
10089
+ else if (suffix === 1) {
10090
+ suffix = '';
10091
+ }
10092
+ }
10093
+ const returnSuffix = () => this.options.prepend && suffix.toString()
10094
+ ? this.options.prepend + suffix.toString()
10095
+ : suffix.toString();
10096
+ // COMPATIBILITY JSON
10097
+ // v1
10098
+ if (this.options.compatibilityJSON === 'v1') {
10099
+ if (suffix === 1) {
10100
+ return '';
10101
+ }
10102
+ if (typeof suffix === 'number') {
10103
+ return `_plural_${suffix.toString()}`;
10104
+ }
10105
+ return returnSuffix();
10106
+ }
10107
+ if ( /* v2 */this.options.compatibilityJSON === 'v2') {
10108
+ return returnSuffix();
10109
+ }
10110
+ if (
10111
+ /* v3 - gettext index */ this.options.simplifyPluralSuffix &&
10112
+ rule.numbers.length === 2 &&
10113
+ rule.numbers[0] === 1) {
10114
+ return returnSuffix();
10115
+ }
10116
+ return this.options.prepend && idx.toString()
10117
+ ? this.options.prepend + idx.toString()
10118
+ : idx.toString();
10119
+ }
10120
+ // this.logger.warn(`no plural rule found for: ${code}`);
10121
+ return '';
10122
+ }
10106
10123
  }
10107
10124
 
10108
- const QUICK_START_NAME = 'console.openshift.io/name';
10109
- const getQuickStartByName = (name, quickStarts) => quickStarts.find((quickStart) => quickStart.metadata.name === name);
10110
- const getQuickStartStatus = (allQuickStartStates, quickStartID) => { var _a, _b; return (_b = (_a = allQuickStartStates === null || allQuickStartStates === void 0 ? void 0 : allQuickStartStates[quickStartID]) === null || _a === void 0 ? void 0 : _a.status) !== null && _b !== void 0 ? _b : QuickStartStatus.NOT_STARTED; };
10111
- const getTaskStatusKey = (taskNumber) => `taskStatus${taskNumber}`;
10112
- const getQuickStartStatusCount = (allQuickStartStates, quickStarts) => quickStarts.reduce((totals, item) => {
10113
- totals[getQuickStartStatus(allQuickStartStates, item.metadata.name)]++;
10114
- return totals;
10115
- }, {
10116
- [QuickStartStatus.IN_PROGRESS]: 0,
10117
- [QuickStartStatus.COMPLETE]: 0,
10118
- [QuickStartStatus.NOT_STARTED]: 0,
10119
- });
10120
- const getDisabledQuickStarts = () => {
10121
- var _a, _b;
10122
- let disabledQuickStarts = [];
10123
- const quickStartServerData = (_a = window.SERVER_FLAGS) === null || _a === void 0 ? void 0 : _a.quickStarts;
10124
- try {
10125
- if (quickStartServerData) {
10126
- disabledQuickStarts = (_b = JSON.parse(quickStartServerData).disabled) !== null && _b !== void 0 ? _b : [];
10127
- }
10128
- }
10129
- catch (e) {
10130
- // eslint-disable-next-line no-console
10131
- console.error('error while parsing SERVER_FLAG.quickStarts', e);
10132
- }
10133
- return disabledQuickStarts;
10134
- };
10135
- const isDisabledQuickStart = (quickstart, disabledQuickStarts) => {
10136
- var _a, _b;
10137
- const quickStartName = (_b = (_a = quickstart.metadata.annotations) === null || _a === void 0 ? void 0 : _a[QUICK_START_NAME]) !== null && _b !== void 0 ? _b : quickstart.metadata.name;
10138
- return disabledQuickStarts.includes(quickStartName);
10139
- };
10140
- const filterQuickStarts = (quickStarts, filterText, statusFilters, allQuickStartStates) => {
10141
- const searchText = filterText.toLowerCase();
10142
- return quickStarts.filter(({ metadata: { name }, spec: { displayName, prerequisites = [], description } }) => {
10143
- const matchesFilter = statusFilters.length > 0
10144
- ? statusFilters.includes(getQuickStartStatus(allQuickStartStates, name))
10145
- : true;
10146
- const matchesText = displayName.toLowerCase().includes(searchText) ||
10147
- description.toLowerCase().includes(searchText) ||
10148
- prerequisites.some((text) => text.toLowerCase().includes(searchText));
10149
- return matchesFilter && matchesText;
10150
- });
10151
- };
10152
- const camelize = (str) => str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
10153
- if (+match === 0) {
10154
- return '';
10155
- } // or if (/\s+/.test(match)) for white spaces
10156
- return index === 0 ? match.toLowerCase() : match.toUpperCase();
10125
+ const QUICK_START_NAME = 'console.openshift.io/name';
10126
+ const getQuickStartByName = (name, quickStarts) => quickStarts.find((quickStart) => quickStart.metadata.name === name);
10127
+ const getQuickStartStatus = (allQuickStartStates, quickStartID) => { var _a, _b; return (_b = (_a = allQuickStartStates === null || allQuickStartStates === void 0 ? void 0 : allQuickStartStates[quickStartID]) === null || _a === void 0 ? void 0 : _a.status) !== null && _b !== void 0 ? _b : QuickStartStatus.NOT_STARTED; };
10128
+ const getTaskStatusKey = (taskNumber) => `taskStatus${taskNumber}`;
10129
+ const getQuickStartStatusCount = (allQuickStartStates, quickStarts) => quickStarts.reduce((totals, item) => {
10130
+ totals[getQuickStartStatus(allQuickStartStates, item.metadata.name)]++;
10131
+ return totals;
10132
+ }, {
10133
+ [QuickStartStatus.IN_PROGRESS]: 0,
10134
+ [QuickStartStatus.COMPLETE]: 0,
10135
+ [QuickStartStatus.NOT_STARTED]: 0,
10136
+ });
10137
+ const getDisabledQuickStarts = () => {
10138
+ var _a, _b;
10139
+ let disabledQuickStarts = [];
10140
+ const quickStartServerData = (_a = window.SERVER_FLAGS) === null || _a === void 0 ? void 0 : _a.quickStarts;
10141
+ try {
10142
+ if (quickStartServerData) {
10143
+ disabledQuickStarts = (_b = JSON.parse(quickStartServerData).disabled) !== null && _b !== void 0 ? _b : [];
10144
+ }
10145
+ }
10146
+ catch (e) {
10147
+ // eslint-disable-next-line no-console
10148
+ console.error('error while parsing SERVER_FLAG.quickStarts', e);
10149
+ }
10150
+ return disabledQuickStarts;
10151
+ };
10152
+ const isDisabledQuickStart = (quickstart, disabledQuickStarts) => {
10153
+ var _a, _b;
10154
+ const quickStartName = (_b = (_a = quickstart.metadata.annotations) === null || _a === void 0 ? void 0 : _a[QUICK_START_NAME]) !== null && _b !== void 0 ? _b : quickstart.metadata.name;
10155
+ return disabledQuickStarts.includes(quickStartName);
10156
+ };
10157
+ const filterQuickStarts = (quickStarts, filterText, statusFilters, allQuickStartStates) => {
10158
+ const searchText = filterText.toLowerCase();
10159
+ return quickStarts.filter(({ metadata: { name }, spec: { displayName, prerequisites = [], description } }) => {
10160
+ const matchesFilter = statusFilters.length > 0
10161
+ ? statusFilters.includes(getQuickStartStatus(allQuickStartStates, name))
10162
+ : true;
10163
+ const matchesText = displayName.toLowerCase().includes(searchText) ||
10164
+ description.toLowerCase().includes(searchText) ||
10165
+ prerequisites.some((text) => text.toLowerCase().includes(searchText));
10166
+ return matchesFilter && matchesText;
10167
+ });
10168
+ };
10169
+ const camelize = (str) => str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
10170
+ if (+match === 0) {
10171
+ return '';
10172
+ } // or if (/\s+/.test(match)) for white spaces
10173
+ return index === 0 ? match.toLowerCase() : match.toUpperCase();
10157
10174
  });
10158
10175
 
10159
- const pluralResolver = new PluralResolver({ simplifyPluralSuffix: true });
10160
- const getDefaultQuickStartState = (totalTasks, initialStatus) => {
10161
- const defaultQuickStartState = {
10162
- status: initialStatus || QuickStartStatus.NOT_STARTED,
10163
- taskNumber: -1,
10164
- };
10165
- if (totalTasks) {
10166
- for (let i = 0; i < totalTasks; i++) {
10167
- defaultQuickStartState[getTaskStatusKey(i)] = QuickStartTaskStatus.INIT;
10168
- }
10169
- }
10170
- return defaultQuickStartState;
10171
- };
10172
- const QuickStartContextDefaults = {
10173
- allQuickStarts: [],
10174
- activeQuickStartID: '',
10175
- allQuickStartStates: {},
10176
- activeQuickStartState: {},
10177
- setAllQuickStarts: () => { },
10178
- resourceBundle: en,
10179
- getResource: (resource) => resource,
10180
- language: 'en',
10181
- useQueryParams: true,
10182
- filter: {
10183
- keyword: '',
10184
- status: {
10185
- statusTypes: {},
10186
- statusFilters: [],
10187
- },
10188
- },
10189
- setFilter: () => { },
10190
- footer: null,
10191
- useLegacyHeaderColors: false,
10192
- markdown: null,
10193
- loading: false,
10194
- alwaysShowTaskReview: true,
10195
- };
10196
- const QuickStartContext = createContext(QuickStartContextDefaults);
10197
- const getResource = (resource, options, resourceBundle, lng) => {
10198
- if (options && !isNaN(options.count)) {
10199
- const suffix = pluralResolver.getSuffix(lng, options.count);
10200
- if (suffix && resourceBundle[`${resource}_${suffix}`]) {
10201
- // needs plural
10202
- return resourceBundle[`${resource}_${suffix}`];
10203
- }
10204
- }
10205
- return (resourceBundle && resourceBundle[resource]) || resource;
10206
- };
10207
- const useValuesForQuickStartContext = (value = {}) => {
10208
- var _a, _b;
10209
- const combinedValue = Object.assign(Object.assign({}, QuickStartContextDefaults), value);
10210
- const { activeQuickStartID, setActiveQuickStartID, setAllQuickStartStates, useQueryParams, allQuickStartStates, allQuickStarts = [], footer, useLegacyHeaderColors, markdown, } = combinedValue;
10211
- const [quickStarts, setQuickStarts] = React__default.useState(combinedValue.allQuickStarts || []);
10212
- const [resourceBundle, setResourceBundle] = React__default.useState(Object.assign(Object.assign({}, en), combinedValue.resourceBundle));
10213
- const [language, setLanguage] = React__default.useState(combinedValue.language);
10214
- const changeResourceBundle = (bundle, lng) => {
10215
- lng && setLanguage(lng);
10216
- setResourceBundle(Object.assign(Object.assign({}, en), bundle));
10217
- };
10218
- const findResource = useCallback((resource, count) => getResource(resource, count !== undefined ? { count } : null, resourceBundle, language), [resourceBundle, language]);
10219
- const [loading, setLoading] = React__default.useState(combinedValue.loading);
10220
- const [alwaysShowTaskReview, setAlwaysShowTaskReview] = React__default.useState(combinedValue.alwaysShowTaskReview);
10221
- const initialSearchParams = new URLSearchParams(window.location.search);
10222
- const initialSearchQuery = initialSearchParams.get(QUICKSTART_SEARCH_FILTER_KEY) || '';
10223
- const initialStatusFilters = ((_a = initialSearchParams.get(QUICKSTART_STATUS_FILTER_KEY)) === null || _a === void 0 ? void 0 : _a.split(',')) || [];
10224
- const quickStartStatusCount = getQuickStartStatusCount(allQuickStartStates, allQuickStarts);
10225
- const [statusTypes, setStatusTypes] = React__default.useState({
10226
- [QuickStartStatus.COMPLETE]: findResource('Complete ({{statusCount, number}})').replace('{{statusCount, number}}', quickStartStatusCount[QuickStartStatus.COMPLETE]),
10227
- [QuickStartStatus.IN_PROGRESS]: findResource('In progress ({{statusCount, number}})').replace('{{statusCount, number}}', quickStartStatusCount[QuickStartStatus.IN_PROGRESS]),
10228
- [QuickStartStatus.NOT_STARTED]: findResource('Not started ({{statusCount, number}})').replace('{{statusCount, number}}', quickStartStatusCount[QuickStartStatus.NOT_STARTED]),
10229
- });
10230
- const [statusFilters, setStatusFilters] = React__default.useState(initialStatusFilters);
10231
- const [filterKeyword, setFilterKeyword] = React__default.useState(initialSearchQuery);
10232
- const setFilter = (type, val) => {
10233
- if (type === 'keyword') {
10234
- setFilterKeyword(val);
10235
- }
10236
- else if (type === 'status') {
10237
- setStatusFilters(val);
10238
- }
10239
- };
10240
- React__default.useEffect(() => {
10241
- const updatedQuickStartStatusCount = getQuickStartStatusCount(allQuickStartStates, quickStarts);
10242
- setStatusTypes({
10243
- [QuickStartStatus.COMPLETE]: findResource('Complete ({{statusCount, number}})').replace('{{statusCount, number}}', updatedQuickStartStatusCount[QuickStartStatus.COMPLETE]),
10244
- [QuickStartStatus.IN_PROGRESS]: findResource('In progress ({{statusCount, number}})').replace('{{statusCount, number}}', updatedQuickStartStatusCount[QuickStartStatus.IN_PROGRESS]),
10245
- [QuickStartStatus.NOT_STARTED]: findResource('Not started ({{statusCount, number}})').replace('{{statusCount, number}}', updatedQuickStartStatusCount[QuickStartStatus.NOT_STARTED]),
10246
- });
10247
- }, [allQuickStartStates, findResource, quickStarts]);
10248
- const updateAllQuickStarts = (qs) => {
10249
- setQuickStarts(qs);
10250
- };
10251
- const setActiveQuickStart = useCallback((quickStartId, totalTasks) => {
10252
- setActiveQuickStartID((id) => {
10253
- if (!quickStartId || id === quickStartId) {
10254
- useQueryParams && removeQueryArgument(QUICKSTART_ID_FILTER_KEY);
10255
- return '';
10256
- }
10257
- useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, quickStartId);
10258
- return quickStartId;
10259
- });
10260
- setAllQuickStartStates((qs) => !quickStartId || qs[quickStartId]
10261
- ? qs
10262
- : Object.assign(Object.assign({}, qs), { [quickStartId]: getDefaultQuickStartState(totalTasks) }));
10263
- }, [setActiveQuickStartID, setAllQuickStartStates, useQueryParams]);
10264
- const startQuickStart = useCallback((quickStartId, totalTasks) => {
10265
- setActiveQuickStartID((id) => {
10266
- if (!id || id !== quickStartId) {
10267
- useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, quickStartId);
10268
- return quickStartId;
10269
- }
10270
- useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, id);
10271
- return id;
10272
- });
10273
- setAllQuickStartStates((qs) => {
10274
- if (qs.hasOwnProperty(quickStartId)) {
10275
- return Object.assign(Object.assign({}, qs), { [quickStartId]: Object.assign(Object.assign({}, qs[quickStartId]), { status: QuickStartStatus.IN_PROGRESS }) });
10276
- }
10277
- return Object.assign(Object.assign({}, qs), { [quickStartId]: getDefaultQuickStartState(totalTasks, QuickStartStatus.IN_PROGRESS) });
10278
- });
10279
- }, [setActiveQuickStartID, setAllQuickStartStates, useQueryParams]);
10280
- const restartQuickStart = useCallback((quickStartId, totalTasks) => {
10281
- setActiveQuickStartID((id) => {
10282
- if (!id || id !== quickStartId) {
10283
- useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, quickStartId);
10284
- return quickStartId;
10285
- }
10286
- useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, id);
10287
- return id;
10288
- });
10289
- setAllQuickStartStates((qs) => (Object.assign(Object.assign({}, qs), { [quickStartId]: getDefaultQuickStartState(totalTasks, QuickStartStatus.NOT_STARTED) })));
10290
- }, [setActiveQuickStartID, setAllQuickStartStates, useQueryParams]);
10291
- // When alwaysShowTaskReview preference is enabled, skip visited step and go directly to review
10292
- const stepAfterInitial = alwaysShowTaskReview
10293
- ? QuickStartTaskStatus.REVIEW
10294
- : QuickStartTaskStatus.VISITED;
10295
- const nextStep = useCallback((totalTasks) => {
10296
- if (!activeQuickStartID) {
10297
- return;
10298
- }
10299
- setAllQuickStartStates((qs) => {
10300
- const quickStart = qs[activeQuickStartID];
10301
- const status = quickStart === null || quickStart === void 0 ? void 0 : quickStart.status;
10302
- const taskNumber = quickStart === null || quickStart === void 0 ? void 0 : quickStart.taskNumber;
10303
- const taskStatus = quickStart[getTaskStatusKey(taskNumber)];
10304
- let updatedStatus;
10305
- let updatedTaskNumber;
10306
- let updatedTaskStatus;
10307
- if (status === QuickStartStatus.NOT_STARTED) {
10308
- updatedStatus = QuickStartStatus.IN_PROGRESS;
10309
- }
10310
- else if (status === QuickStartStatus.IN_PROGRESS &&
10311
- !QUICKSTART_TASKS_INITIAL_STATES.includes(taskStatus) &&
10312
- taskNumber === totalTasks - 1) {
10313
- updatedStatus = QuickStartStatus.COMPLETE;
10314
- }
10315
- if (taskStatus === QuickStartTaskStatus.VISITED) {
10316
- updatedTaskStatus = QuickStartTaskStatus.REVIEW;
10317
- }
10318
- if (taskNumber < totalTasks && !updatedTaskStatus) {
10319
- updatedTaskNumber = taskNumber + 1;
10320
- }
10321
- const markInitialStepVisitedOrReview = updatedTaskNumber > -1 &&
10322
- quickStart[getTaskStatusKey(updatedTaskNumber)] === QuickStartTaskStatus.INIT
10323
- ? stepAfterInitial
10324
- : quickStart[getTaskStatusKey(updatedTaskNumber)];
10325
- const newState = Object.assign(Object.assign({}, qs), { [activeQuickStartID]: Object.assign(Object.assign(Object.assign(Object.assign({}, quickStart), (updatedStatus ? { status: updatedStatus } : {})), (updatedTaskNumber > -1
10326
- ? {
10327
- taskNumber: updatedTaskNumber,
10328
- [getTaskStatusKey(updatedTaskNumber)]: markInitialStepVisitedOrReview,
10329
- }
10330
- : {})), (updatedTaskStatus ? { [getTaskStatusKey(taskNumber)]: updatedTaskStatus } : {})) });
10331
- return newState;
10332
- });
10333
- }, [activeQuickStartID, setAllQuickStartStates, stepAfterInitial]);
10334
- const previousStep = useCallback(() => {
10335
- setAllQuickStartStates((qs) => {
10336
- const quickStart = qs[activeQuickStartID];
10337
- const taskNumber = quickStart === null || quickStart === void 0 ? void 0 : quickStart.taskNumber;
10338
- if (taskNumber < 0) {
10339
- return qs;
10340
- }
10341
- return Object.assign(Object.assign({}, qs), { [activeQuickStartID]: Object.assign(Object.assign({}, quickStart), { taskNumber: taskNumber - 1 }) });
10342
- });
10343
- }, [activeQuickStartID, setAllQuickStartStates]);
10344
- const setQuickStartTaskNumber = useCallback((quickStartId, taskNumber) => {
10345
- setAllQuickStartStates((qs) => {
10346
- const quickStart = qs[quickStartId];
10347
- const status = quickStart === null || quickStart === void 0 ? void 0 : quickStart.status;
10348
- let updatedStatus;
10349
- if (taskNumber > -1 && status === QuickStartStatus.NOT_STARTED) {
10350
- updatedStatus = QuickStartStatus.IN_PROGRESS;
10351
- }
10352
- let updatedTaskStatus = {};
10353
- for (let taskIndex = 0; taskIndex <= taskNumber; taskIndex++) {
10354
- const taskStatus = quickStart[getTaskStatusKey(taskIndex)];
10355
- const newTaskStatus = taskStatus === QuickStartTaskStatus.INIT ? stepAfterInitial : undefined;
10356
- if (newTaskStatus) {
10357
- updatedTaskStatus = Object.assign(Object.assign({}, updatedTaskStatus), { [getTaskStatusKey(taskIndex)]: newTaskStatus });
10358
- }
10359
- }
10360
- const updatedQuickStart = Object.assign(Object.assign(Object.assign(Object.assign({}, quickStart), (updatedStatus ? { status: updatedStatus } : {})), { taskNumber }), updatedTaskStatus);
10361
- return Object.assign(Object.assign({}, qs), { [quickStartId]: updatedQuickStart });
10362
- });
10363
- }, [setAllQuickStartStates, stepAfterInitial]);
10364
- const setQuickStartTaskStatus = useCallback((taskStatus) => {
10365
- const quickStart = allQuickStartStates[activeQuickStartID];
10366
- const { taskNumber } = quickStart;
10367
- const updatedQuickStart = Object.assign(Object.assign({}, quickStart), { [getTaskStatusKey(taskNumber)]: taskStatus });
10368
- setAllQuickStartStates((qs) => (Object.assign(Object.assign({}, qs), { [activeQuickStartID]: updatedQuickStart })));
10369
- }, [allQuickStartStates, activeQuickStartID, setAllQuickStartStates]);
10370
- const activeQuickStartState = (_b = allQuickStartStates === null || allQuickStartStates === void 0 ? void 0 : allQuickStartStates[activeQuickStartID]) !== null && _b !== void 0 ? _b : {};
10371
- const getQuickStartForId = useCallback((id) => allQuickStartStates[id], [
10372
- allQuickStartStates,
10373
- ]);
10374
- return {
10375
- allQuickStarts: quickStarts,
10376
- setAllQuickStarts: updateAllQuickStarts,
10377
- activeQuickStartID,
10378
- setActiveQuickStartID,
10379
- allQuickStartStates,
10380
- setAllQuickStartStates,
10381
- activeQuickStartState,
10382
- setActiveQuickStart: value.setActiveQuickStart || setActiveQuickStart,
10383
- startQuickStart: value.startQuickStart || startQuickStart,
10384
- restartQuickStart: value.restartQuickStart || restartQuickStart,
10385
- nextStep: value.nextStep || nextStep,
10386
- previousStep: value.previousStep || previousStep,
10387
- setQuickStartTaskNumber,
10388
- setQuickStartTaskStatus,
10389
- getQuickStartForId,
10390
- footer,
10391
- useLegacyHeaderColors,
10392
- useQueryParams,
10393
- markdown,
10394
- resourceBundle,
10395
- getResource: findResource,
10396
- setResourceBundle: changeResourceBundle,
10397
- language,
10398
- setLanguage,
10399
- // revisit if this should be in public context API
10400
- filter: {
10401
- keyword: filterKeyword,
10402
- status: {
10403
- statusTypes,
10404
- statusFilters,
10405
- },
10406
- },
10407
- setFilter,
10408
- loading,
10409
- setLoading,
10410
- alwaysShowTaskReview,
10411
- setAlwaysShowTaskReview,
10412
- };
10413
- };
10176
+ const pluralResolver = new PluralResolver({ simplifyPluralSuffix: true });
10177
+ const getDefaultQuickStartState = (totalTasks, initialStatus) => {
10178
+ const defaultQuickStartState = {
10179
+ status: initialStatus || QuickStartStatus.NOT_STARTED,
10180
+ taskNumber: -1,
10181
+ };
10182
+ if (totalTasks) {
10183
+ for (let i = 0; i < totalTasks; i++) {
10184
+ defaultQuickStartState[getTaskStatusKey(i)] = QuickStartTaskStatus.INIT;
10185
+ }
10186
+ }
10187
+ return defaultQuickStartState;
10188
+ };
10189
+ const QuickStartContextDefaults = {
10190
+ allQuickStarts: [],
10191
+ activeQuickStartID: '',
10192
+ allQuickStartStates: {},
10193
+ activeQuickStartState: {},
10194
+ setAllQuickStarts: () => { },
10195
+ resourceBundle: en,
10196
+ getResource: (resource) => resource,
10197
+ language: 'en',
10198
+ useQueryParams: true,
10199
+ filter: {
10200
+ keyword: '',
10201
+ status: {
10202
+ statusTypes: {},
10203
+ statusFilters: [],
10204
+ },
10205
+ },
10206
+ setFilter: () => { },
10207
+ footer: null,
10208
+ useLegacyHeaderColors: false,
10209
+ markdown: null,
10210
+ loading: false,
10211
+ alwaysShowTaskReview: true,
10212
+ };
10213
+ const QuickStartContext = createContext(QuickStartContextDefaults);
10214
+ const getResource = (resource, options, resourceBundle, lng) => {
10215
+ if (options && !isNaN(options.count)) {
10216
+ const suffix = pluralResolver.getSuffix(lng, options.count);
10217
+ if (suffix && resourceBundle[`${resource}_${suffix}`]) {
10218
+ // needs plural
10219
+ return resourceBundle[`${resource}_${suffix}`];
10220
+ }
10221
+ }
10222
+ return (resourceBundle && resourceBundle[resource]) || resource;
10223
+ };
10224
+ const useValuesForQuickStartContext = (value = {}) => {
10225
+ var _a, _b;
10226
+ const combinedValue = Object.assign(Object.assign({}, QuickStartContextDefaults), value);
10227
+ const { activeQuickStartID, setActiveQuickStartID, setAllQuickStartStates, useQueryParams, allQuickStartStates, allQuickStarts = [], footer, useLegacyHeaderColors, markdown, } = combinedValue;
10228
+ const [quickStarts, setQuickStarts] = React__default.useState(combinedValue.allQuickStarts || []);
10229
+ const [resourceBundle, setResourceBundle] = React__default.useState(Object.assign(Object.assign({}, en), combinedValue.resourceBundle));
10230
+ const [language, setLanguage] = React__default.useState(combinedValue.language);
10231
+ const changeResourceBundle = (bundle, lng) => {
10232
+ lng && setLanguage(lng);
10233
+ setResourceBundle(Object.assign(Object.assign({}, en), bundle));
10234
+ };
10235
+ const findResource = useCallback((resource, count) => getResource(resource, count !== undefined ? { count } : null, resourceBundle, language), [resourceBundle, language]);
10236
+ const [loading, setLoading] = React__default.useState(combinedValue.loading);
10237
+ const [alwaysShowTaskReview, setAlwaysShowTaskReview] = React__default.useState(combinedValue.alwaysShowTaskReview);
10238
+ const initialSearchParams = new URLSearchParams(window.location.search);
10239
+ const initialSearchQuery = initialSearchParams.get(QUICKSTART_SEARCH_FILTER_KEY) || '';
10240
+ const initialStatusFilters = ((_a = initialSearchParams.get(QUICKSTART_STATUS_FILTER_KEY)) === null || _a === void 0 ? void 0 : _a.split(',')) || [];
10241
+ const quickStartStatusCount = getQuickStartStatusCount(allQuickStartStates, allQuickStarts);
10242
+ const [statusTypes, setStatusTypes] = React__default.useState({
10243
+ [QuickStartStatus.COMPLETE]: findResource('Complete ({{statusCount, number}})').replace('{{statusCount, number}}', quickStartStatusCount[QuickStartStatus.COMPLETE]),
10244
+ [QuickStartStatus.IN_PROGRESS]: findResource('In progress ({{statusCount, number}})').replace('{{statusCount, number}}', quickStartStatusCount[QuickStartStatus.IN_PROGRESS]),
10245
+ [QuickStartStatus.NOT_STARTED]: findResource('Not started ({{statusCount, number}})').replace('{{statusCount, number}}', quickStartStatusCount[QuickStartStatus.NOT_STARTED]),
10246
+ });
10247
+ const [statusFilters, setStatusFilters] = React__default.useState(initialStatusFilters);
10248
+ const [filterKeyword, setFilterKeyword] = React__default.useState(initialSearchQuery);
10249
+ const setFilter = (type, val) => {
10250
+ if (type === 'keyword') {
10251
+ setFilterKeyword(val);
10252
+ }
10253
+ else if (type === 'status') {
10254
+ setStatusFilters(val);
10255
+ }
10256
+ };
10257
+ React__default.useEffect(() => {
10258
+ const updatedQuickStartStatusCount = getQuickStartStatusCount(allQuickStartStates, quickStarts);
10259
+ setStatusTypes({
10260
+ [QuickStartStatus.COMPLETE]: findResource('Complete ({{statusCount, number}})').replace('{{statusCount, number}}', updatedQuickStartStatusCount[QuickStartStatus.COMPLETE]),
10261
+ [QuickStartStatus.IN_PROGRESS]: findResource('In progress ({{statusCount, number}})').replace('{{statusCount, number}}', updatedQuickStartStatusCount[QuickStartStatus.IN_PROGRESS]),
10262
+ [QuickStartStatus.NOT_STARTED]: findResource('Not started ({{statusCount, number}})').replace('{{statusCount, number}}', updatedQuickStartStatusCount[QuickStartStatus.NOT_STARTED]),
10263
+ });
10264
+ }, [allQuickStartStates, findResource, quickStarts]);
10265
+ const updateAllQuickStarts = (qs) => {
10266
+ setQuickStarts(qs);
10267
+ };
10268
+ const setActiveQuickStart = useCallback((quickStartId, totalTasks) => {
10269
+ setActiveQuickStartID((id) => {
10270
+ if (!quickStartId || id === quickStartId) {
10271
+ useQueryParams && removeQueryArgument(QUICKSTART_ID_FILTER_KEY);
10272
+ return '';
10273
+ }
10274
+ useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, quickStartId);
10275
+ return quickStartId;
10276
+ });
10277
+ setAllQuickStartStates((qs) => !quickStartId || qs[quickStartId]
10278
+ ? qs
10279
+ : Object.assign(Object.assign({}, qs), { [quickStartId]: getDefaultQuickStartState(totalTasks) }));
10280
+ }, [setActiveQuickStartID, setAllQuickStartStates, useQueryParams]);
10281
+ const startQuickStart = useCallback((quickStartId, totalTasks) => {
10282
+ setActiveQuickStartID((id) => {
10283
+ if (!id || id !== quickStartId) {
10284
+ useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, quickStartId);
10285
+ return quickStartId;
10286
+ }
10287
+ useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, id);
10288
+ return id;
10289
+ });
10290
+ setAllQuickStartStates((qs) => {
10291
+ if (qs.hasOwnProperty(quickStartId)) {
10292
+ return Object.assign(Object.assign({}, qs), { [quickStartId]: Object.assign(Object.assign({}, qs[quickStartId]), { status: QuickStartStatus.IN_PROGRESS }) });
10293
+ }
10294
+ return Object.assign(Object.assign({}, qs), { [quickStartId]: getDefaultQuickStartState(totalTasks, QuickStartStatus.IN_PROGRESS) });
10295
+ });
10296
+ }, [setActiveQuickStartID, setAllQuickStartStates, useQueryParams]);
10297
+ const restartQuickStart = useCallback((quickStartId, totalTasks) => {
10298
+ setActiveQuickStartID((id) => {
10299
+ if (!id || id !== quickStartId) {
10300
+ useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, quickStartId);
10301
+ return quickStartId;
10302
+ }
10303
+ useQueryParams && setQueryArgument(QUICKSTART_ID_FILTER_KEY, id);
10304
+ return id;
10305
+ });
10306
+ setAllQuickStartStates((qs) => (Object.assign(Object.assign({}, qs), { [quickStartId]: getDefaultQuickStartState(totalTasks, QuickStartStatus.NOT_STARTED) })));
10307
+ }, [setActiveQuickStartID, setAllQuickStartStates, useQueryParams]);
10308
+ // When alwaysShowTaskReview preference is enabled, skip visited step and go directly to review
10309
+ const stepAfterInitial = alwaysShowTaskReview
10310
+ ? QuickStartTaskStatus.REVIEW
10311
+ : QuickStartTaskStatus.VISITED;
10312
+ const nextStep = useCallback((totalTasks) => {
10313
+ if (!activeQuickStartID) {
10314
+ return;
10315
+ }
10316
+ setAllQuickStartStates((qs) => {
10317
+ const quickStart = qs[activeQuickStartID];
10318
+ const status = quickStart === null || quickStart === void 0 ? void 0 : quickStart.status;
10319
+ const taskNumber = quickStart === null || quickStart === void 0 ? void 0 : quickStart.taskNumber;
10320
+ const taskStatus = quickStart[getTaskStatusKey(taskNumber)];
10321
+ let updatedStatus;
10322
+ let updatedTaskNumber;
10323
+ let updatedTaskStatus;
10324
+ if (status === QuickStartStatus.NOT_STARTED) {
10325
+ updatedStatus = QuickStartStatus.IN_PROGRESS;
10326
+ }
10327
+ else if (status === QuickStartStatus.IN_PROGRESS &&
10328
+ !QUICKSTART_TASKS_INITIAL_STATES.includes(taskStatus) &&
10329
+ taskNumber === totalTasks - 1) {
10330
+ updatedStatus = QuickStartStatus.COMPLETE;
10331
+ }
10332
+ if (taskStatus === QuickStartTaskStatus.VISITED) {
10333
+ updatedTaskStatus = QuickStartTaskStatus.REVIEW;
10334
+ }
10335
+ if (taskNumber < totalTasks && !updatedTaskStatus) {
10336
+ updatedTaskNumber = taskNumber + 1;
10337
+ }
10338
+ const markInitialStepVisitedOrReview = updatedTaskNumber > -1 &&
10339
+ quickStart[getTaskStatusKey(updatedTaskNumber)] === QuickStartTaskStatus.INIT
10340
+ ? stepAfterInitial
10341
+ : quickStart[getTaskStatusKey(updatedTaskNumber)];
10342
+ const newState = Object.assign(Object.assign({}, qs), { [activeQuickStartID]: Object.assign(Object.assign(Object.assign(Object.assign({}, quickStart), (updatedStatus ? { status: updatedStatus } : {})), (updatedTaskNumber > -1
10343
+ ? {
10344
+ taskNumber: updatedTaskNumber,
10345
+ [getTaskStatusKey(updatedTaskNumber)]: markInitialStepVisitedOrReview,
10346
+ }
10347
+ : {})), (updatedTaskStatus ? { [getTaskStatusKey(taskNumber)]: updatedTaskStatus } : {})) });
10348
+ return newState;
10349
+ });
10350
+ }, [activeQuickStartID, setAllQuickStartStates, stepAfterInitial]);
10351
+ const previousStep = useCallback(() => {
10352
+ setAllQuickStartStates((qs) => {
10353
+ const quickStart = qs[activeQuickStartID];
10354
+ const taskNumber = quickStart === null || quickStart === void 0 ? void 0 : quickStart.taskNumber;
10355
+ if (taskNumber < 0) {
10356
+ return qs;
10357
+ }
10358
+ return Object.assign(Object.assign({}, qs), { [activeQuickStartID]: Object.assign(Object.assign({}, quickStart), { taskNumber: taskNumber - 1 }) });
10359
+ });
10360
+ }, [activeQuickStartID, setAllQuickStartStates]);
10361
+ const setQuickStartTaskNumber = useCallback((quickStartId, taskNumber) => {
10362
+ setAllQuickStartStates((qs) => {
10363
+ const quickStart = qs[quickStartId];
10364
+ const status = quickStart === null || quickStart === void 0 ? void 0 : quickStart.status;
10365
+ let updatedStatus;
10366
+ if (taskNumber > -1 && status === QuickStartStatus.NOT_STARTED) {
10367
+ updatedStatus = QuickStartStatus.IN_PROGRESS;
10368
+ }
10369
+ let updatedTaskStatus = {};
10370
+ for (let taskIndex = 0; taskIndex <= taskNumber; taskIndex++) {
10371
+ const taskStatus = quickStart[getTaskStatusKey(taskIndex)];
10372
+ const newTaskStatus = taskStatus === QuickStartTaskStatus.INIT ? stepAfterInitial : undefined;
10373
+ if (newTaskStatus) {
10374
+ updatedTaskStatus = Object.assign(Object.assign({}, updatedTaskStatus), { [getTaskStatusKey(taskIndex)]: newTaskStatus });
10375
+ }
10376
+ }
10377
+ const updatedQuickStart = Object.assign(Object.assign(Object.assign(Object.assign({}, quickStart), (updatedStatus ? { status: updatedStatus } : {})), { taskNumber }), updatedTaskStatus);
10378
+ return Object.assign(Object.assign({}, qs), { [quickStartId]: updatedQuickStart });
10379
+ });
10380
+ }, [setAllQuickStartStates, stepAfterInitial]);
10381
+ const setQuickStartTaskStatus = useCallback((taskStatus) => {
10382
+ const quickStart = allQuickStartStates[activeQuickStartID];
10383
+ const { taskNumber } = quickStart;
10384
+ const updatedQuickStart = Object.assign(Object.assign({}, quickStart), { [getTaskStatusKey(taskNumber)]: taskStatus });
10385
+ setAllQuickStartStates((qs) => (Object.assign(Object.assign({}, qs), { [activeQuickStartID]: updatedQuickStart })));
10386
+ }, [allQuickStartStates, activeQuickStartID, setAllQuickStartStates]);
10387
+ const activeQuickStartState = (_b = allQuickStartStates === null || allQuickStartStates === void 0 ? void 0 : allQuickStartStates[activeQuickStartID]) !== null && _b !== void 0 ? _b : {};
10388
+ const getQuickStartForId = useCallback((id) => allQuickStartStates[id], [
10389
+ allQuickStartStates,
10390
+ ]);
10391
+ return {
10392
+ allQuickStarts: quickStarts,
10393
+ setAllQuickStarts: updateAllQuickStarts,
10394
+ activeQuickStartID,
10395
+ setActiveQuickStartID,
10396
+ allQuickStartStates,
10397
+ setAllQuickStartStates,
10398
+ activeQuickStartState,
10399
+ setActiveQuickStart: value.setActiveQuickStart || setActiveQuickStart,
10400
+ startQuickStart: value.startQuickStart || startQuickStart,
10401
+ restartQuickStart: value.restartQuickStart || restartQuickStart,
10402
+ nextStep: value.nextStep || nextStep,
10403
+ previousStep: value.previousStep || previousStep,
10404
+ setQuickStartTaskNumber,
10405
+ setQuickStartTaskStatus,
10406
+ getQuickStartForId,
10407
+ footer,
10408
+ useLegacyHeaderColors,
10409
+ useQueryParams,
10410
+ markdown,
10411
+ resourceBundle,
10412
+ getResource: findResource,
10413
+ setResourceBundle: changeResourceBundle,
10414
+ language,
10415
+ setLanguage,
10416
+ // revisit if this should be in public context API
10417
+ filter: {
10418
+ keyword: filterKeyword,
10419
+ status: {
10420
+ statusTypes,
10421
+ statusFilters,
10422
+ },
10423
+ },
10424
+ setFilter,
10425
+ loading,
10426
+ setLoading,
10427
+ alwaysShowTaskReview,
10428
+ setAlwaysShowTaskReview,
10429
+ };
10430
+ };
10414
10431
  const QuickStartContextProvider = ({ children, value }) => (React__default.createElement(QuickStartContext.Provider, { value: useValuesForQuickStartContext(value) }, children));
10415
10432
 
10416
- const Box = ({ children, className }) => (React.createElement("div", { className: css('pfext-status-box', className) }, children));
10417
- const Loading = ({ className }) => (React.createElement("div", { className: css('pfext-m-loader', className) },
10418
- React.createElement("div", { className: "pfext-m-loader-dot__one" }),
10419
- React.createElement("div", { className: "pfext-m-loader-dot__two" }),
10420
- React.createElement("div", { className: "pfext-m-loader-dot__three" })));
10421
- Loading.displayName = 'Loading';
10422
- const LoadingBox = ({ className, message }) => (React.createElement(Box, { className: css('pfext-status-box--loading', className) },
10423
- React.createElement(Loading, null),
10424
- message && React.createElement("div", { className: "pfext-status-box__loading-message" }, message)));
10425
- LoadingBox.displayName = 'LoadingBox';
10426
- const EmptyBox = ({ label }) => {
10427
- const { getResource } = React.useContext(QuickStartContext);
10428
- return (React.createElement(Box, null,
10429
- React.createElement("div", { "data-test": "empty-message", className: "text-center" }, label
10430
- ? getResource('No {{label}} found').replace('{{label}}', label)
10431
- : getResource('Not found'))));
10432
- };
10433
+ const Box = ({ children, className }) => (React.createElement("div", { className: css('pfext-status-box', className) }, children));
10434
+ const Loading = ({ className }) => (React.createElement("div", { className: css('pfext-m-loader', className) },
10435
+ React.createElement("div", { className: "pfext-m-loader-dot__one" }),
10436
+ React.createElement("div", { className: "pfext-m-loader-dot__two" }),
10437
+ React.createElement("div", { className: "pfext-m-loader-dot__three" })));
10438
+ Loading.displayName = 'Loading';
10439
+ const LoadingBox = ({ className, message }) => (React.createElement(Box, { className: css('pfext-status-box--loading', className) },
10440
+ React.createElement(Loading, null),
10441
+ message && React.createElement("div", { className: "pfext-status-box__loading-message" }, message)));
10442
+ LoadingBox.displayName = 'LoadingBox';
10443
+ const EmptyBox = ({ label }) => {
10444
+ const { getResource } = React.useContext(QuickStartContext);
10445
+ return (React.createElement(Box, null,
10446
+ React.createElement("div", { "data-test": "empty-message", className: "text-center" }, label
10447
+ ? getResource('No {{label}} found').replace('{{label}}', label)
10448
+ : getResource('Not found'))));
10449
+ };
10433
10450
  EmptyBox.displayName = 'EmptyBox';
10434
10451
 
10435
- const MEMO = {};
10436
- const CamelCaseWrap = ({ value, dataTest }) => {
10437
- if (!value) {
10438
- return '-';
10439
- }
10440
- if (MEMO[value]) {
10441
- return MEMO[value];
10442
- }
10443
- // Add word break points before capital letters (but keep consecutive capital letters together).
10444
- const words = value.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g);
10445
- const rendered = (React.createElement("span", { "data-test": dataTest }, words.map((word, i) => (React.createElement(React.Fragment, { key: i },
10446
- word,
10447
- i !== words.length - 1 && React.createElement("wbr", null))))));
10448
- MEMO[value] = rendered;
10449
- return rendered;
10452
+ const MEMO = {};
10453
+ const CamelCaseWrap = ({ value, dataTest }) => {
10454
+ if (!value) {
10455
+ return '-';
10456
+ }
10457
+ if (MEMO[value]) {
10458
+ return MEMO[value];
10459
+ }
10460
+ // Add word break points before capital letters (but keep consecutive capital letters together).
10461
+ const words = value.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g);
10462
+ const rendered = (React.createElement("span", { "data-test": dataTest }, words.map((word, i) => (React.createElement(React.Fragment, { key: i },
10463
+ word,
10464
+ i !== words.length - 1 && React.createElement("wbr", null))))));
10465
+ MEMO[value] = rendered;
10466
+ return rendered;
10450
10467
  };
10451
10468
 
10452
10469
  class CatalogTile extends React.Component {
@@ -10525,322 +10542,322 @@ exports["default"] = exports.RocketIcon;
10525
10542
 
10526
10543
  var RocketIcon = /*@__PURE__*/getDefaultExportFromCjs(rocketIcon);
10527
10544
 
10528
- const Modal = (_a) => {
10529
- var { isFullScreen = false, className } = _a, props = __rest(_a, ["isFullScreen", "className"]);
10530
- return (React.createElement(Modal$1, Object.assign({}, props, { className: css('pfext-modal', className), appendTo: () => (isFullScreen ? document.body : document.querySelector('#modal-container')) })));
10531
- };
10532
-
10533
- const getContainer = (container) => typeof container === 'function' ? container() : container;
10534
- const Portal = ({ children, container }) => {
10535
- const [containerNode, setContainerNode] = React.useState();
10536
- useIsomorphicLayoutEffect(() => {
10537
- setContainerNode(getContainer(container) || document.body);
10538
- }, [container]);
10539
- return containerNode ? ReactDOM.createPortal(children, containerNode) : null;
10540
- };
10541
-
10542
- const SimplePopper = ({ children }) => {
10543
- const openProp = true;
10544
- const nodeRef = React.useRef();
10545
- const popperRef = React.useRef(null);
10546
- const [isOpen, setOpenState] = React.useState(openProp);
10547
- const setOpen = React.useCallback((newOpen) => {
10548
- setOpenState(newOpen);
10549
- }, []);
10550
- React.useEffect(() => {
10551
- setOpen(openProp);
10552
- }, [openProp, setOpen]);
10553
- const onKeyDown = React.useCallback((e) => {
10554
- if (e.keyCode === 27) {
10555
- setOpen(false);
10556
- }
10557
- }, [setOpen]);
10558
- const onClickOutside = React.useCallback((e) => {
10559
- if (!nodeRef.current || (e.target instanceof Node && !nodeRef.current.contains(e.target))) {
10560
- setOpen(false);
10561
- }
10562
- }, [setOpen]);
10563
- const destroy = React.useCallback(() => {
10564
- if (popperRef.current) {
10565
- popperRef.current.destroy();
10566
- document.removeEventListener('keydown', onKeyDown, true);
10567
- document.removeEventListener('mousedown', onClickOutside, true);
10568
- document.removeEventListener('touchstart', onClickOutside, true);
10569
- }
10570
- }, [onClickOutside, onKeyDown]);
10571
- const initialize = React.useCallback(() => {
10572
- if (!nodeRef.current || !isOpen) {
10573
- return;
10574
- }
10575
- destroy();
10576
- }, [isOpen, destroy]);
10577
- const nodeRefCallback = React.useCallback((node) => {
10578
- nodeRef.current = node;
10579
- initialize();
10580
- }, [initialize]);
10581
- React.useEffect(() => {
10582
- initialize();
10583
- }, [initialize]);
10584
- React.useEffect(() => () => {
10585
- destroy();
10586
- }, [destroy]);
10587
- React.useEffect(() => {
10588
- if (!isOpen) {
10589
- destroy();
10590
- }
10591
- }, [destroy, isOpen]);
10592
- return isOpen ? (React.createElement(Portal, null,
10593
- React.createElement("div", { ref: nodeRefCallback, style: { zIndex: 9999, position: 'absolute', top: 0, left: 0 }, className: "pfext-quick-start__base" }, children))) : null;
10545
+ const Modal = (_a) => {
10546
+ var { isFullScreen = false, className } = _a, props = __rest(_a, ["isFullScreen", "className"]);
10547
+ return (React.createElement(Modal$1, Object.assign({}, props, { className: css('pfext-modal', className), appendTo: () => (isFullScreen ? document.body : document.querySelector('#modal-container')) })));
10548
+ };
10549
+
10550
+ const getContainer = (container) => typeof container === 'function' ? container() : container;
10551
+ const Portal = ({ children, container }) => {
10552
+ const [containerNode, setContainerNode] = React.useState();
10553
+ useIsomorphicLayoutEffect(() => {
10554
+ setContainerNode(getContainer(container) || document.body);
10555
+ }, [container]);
10556
+ return containerNode ? ReactDOM.createPortal(children, containerNode) : null;
10557
+ };
10558
+
10559
+ const SimplePopper = ({ children }) => {
10560
+ const openProp = true;
10561
+ const nodeRef = React.useRef();
10562
+ const popperRef = React.useRef(null);
10563
+ const [isOpen, setOpenState] = React.useState(openProp);
10564
+ const setOpen = React.useCallback((newOpen) => {
10565
+ setOpenState(newOpen);
10566
+ }, []);
10567
+ React.useEffect(() => {
10568
+ setOpen(openProp);
10569
+ }, [openProp, setOpen]);
10570
+ const onKeyDown = React.useCallback((e) => {
10571
+ if (e.keyCode === 27) {
10572
+ setOpen(false);
10573
+ }
10574
+ }, [setOpen]);
10575
+ const onClickOutside = React.useCallback((e) => {
10576
+ if (!nodeRef.current || (e.target instanceof Node && !nodeRef.current.contains(e.target))) {
10577
+ setOpen(false);
10578
+ }
10579
+ }, [setOpen]);
10580
+ const destroy = React.useCallback(() => {
10581
+ if (popperRef.current) {
10582
+ popperRef.current.destroy();
10583
+ document.removeEventListener('keydown', onKeyDown, true);
10584
+ document.removeEventListener('mousedown', onClickOutside, true);
10585
+ document.removeEventListener('touchstart', onClickOutside, true);
10586
+ }
10587
+ }, [onClickOutside, onKeyDown]);
10588
+ const initialize = React.useCallback(() => {
10589
+ if (!nodeRef.current || !isOpen) {
10590
+ return;
10591
+ }
10592
+ destroy();
10593
+ }, [isOpen, destroy]);
10594
+ const nodeRefCallback = React.useCallback((node) => {
10595
+ nodeRef.current = node;
10596
+ initialize();
10597
+ }, [initialize]);
10598
+ React.useEffect(() => {
10599
+ initialize();
10600
+ }, [initialize]);
10601
+ React.useEffect(() => () => {
10602
+ destroy();
10603
+ }, [destroy]);
10604
+ React.useEffect(() => {
10605
+ if (!isOpen) {
10606
+ destroy();
10607
+ }
10608
+ }, [destroy, isOpen]);
10609
+ return isOpen ? (React.createElement(Portal, null,
10610
+ React.createElement("div", { ref: nodeRefCallback, style: { zIndex: 9999, position: 'absolute', top: 0, left: 0 }, className: "pfext-quick-start__base" }, children))) : null;
10594
10611
  };
10595
10612
 
10596
- const isInViewport = (elementToCheck) => {
10597
- const rect = elementToCheck.getBoundingClientRect();
10598
- return (rect.top >= 0 &&
10599
- rect.left >= 0 &&
10600
- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
10601
- rect.right <= (window.innerWidth || document.documentElement.clientWidth));
10602
- };
10603
- const InteractiveSpotlight = ({ element }) => {
10604
- const { top, bottom, left, right, height, width } = element.getBoundingClientRect();
10605
- const style = {
10606
- height,
10607
- width,
10608
- top,
10609
- left,
10610
- bottom,
10611
- right,
10612
- };
10613
- const [clicked, setClicked] = React.useState(false);
10614
- React.useEffect(() => {
10615
- if (!clicked) {
10616
- if (!isInViewport(element)) {
10617
- element.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
10618
- }
10619
- const handleClick = () => setClicked(true);
10620
- document.addEventListener('click', handleClick);
10621
- return () => {
10622
- document.removeEventListener('click', handleClick);
10623
- };
10624
- }
10625
- return () => { };
10626
- }, [element, clicked]);
10627
- if (clicked) {
10628
- return null;
10629
- }
10630
- return (React.createElement(Portal, null,
10631
- React.createElement(SimplePopper, null,
10632
- React.createElement("div", { className: "pfext-spotlight pfext-spotlight__element-highlight-animate", style: style }))));
10613
+ const isInViewport = (elementToCheck) => {
10614
+ const rect = elementToCheck.getBoundingClientRect();
10615
+ return (rect.top >= 0 &&
10616
+ rect.left >= 0 &&
10617
+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
10618
+ rect.right <= (window.innerWidth || document.documentElement.clientWidth));
10619
+ };
10620
+ const InteractiveSpotlight = ({ element }) => {
10621
+ const { top, bottom, left, right, height, width } = element.getBoundingClientRect();
10622
+ const style = {
10623
+ height,
10624
+ width,
10625
+ top,
10626
+ left,
10627
+ bottom,
10628
+ right,
10629
+ };
10630
+ const [clicked, setClicked] = React.useState(false);
10631
+ React.useEffect(() => {
10632
+ if (!clicked) {
10633
+ if (!isInViewport(element)) {
10634
+ element.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
10635
+ }
10636
+ const handleClick = () => setClicked(true);
10637
+ document.addEventListener('click', handleClick);
10638
+ return () => {
10639
+ document.removeEventListener('click', handleClick);
10640
+ };
10641
+ }
10642
+ return () => { };
10643
+ }, [element, clicked]);
10644
+ if (clicked) {
10645
+ return null;
10646
+ }
10647
+ return (React.createElement(Portal, null,
10648
+ React.createElement(SimplePopper, null,
10649
+ React.createElement("div", { className: "pfext-spotlight pfext-spotlight__element-highlight-animate", style: style }))));
10633
10650
  };
10634
10651
 
10635
- var ScrollDirection;
10636
- (function (ScrollDirection) {
10637
- ScrollDirection["scrollingUp"] = "scrolling-up";
10638
- ScrollDirection["scrollingDown"] = "scrolling-down";
10639
- ScrollDirection["scrolledToBottom"] = "scrolled-to-bottom";
10640
- ScrollDirection["scrolledToTop"] = "scrolled-to-top";
10652
+ var ScrollDirection;
10653
+ (function (ScrollDirection) {
10654
+ ScrollDirection["scrollingUp"] = "scrolling-up";
10655
+ ScrollDirection["scrollingDown"] = "scrolling-down";
10656
+ ScrollDirection["scrolledToBottom"] = "scrolled-to-bottom";
10657
+ ScrollDirection["scrolledToTop"] = "scrolled-to-top";
10641
10658
  })(ScrollDirection || (ScrollDirection = {}));
10642
10659
 
10643
- const useResizeObserver = (callback, targetElement, observerOptions = undefined) => {
10644
- const element = React.useMemo(() => targetElement !== null && targetElement !== void 0 ? targetElement : document.querySelector('body'), [targetElement]);
10645
- React.useEffect(() => {
10646
- const observer = new ResizeObserver(callback);
10647
- observer.observe(element, observerOptions);
10648
- return () => {
10649
- observer.disconnect();
10650
- };
10651
- }, [callback, observerOptions, element]);
10652
- };
10653
-
10654
- var Shadows;
10655
- (function (Shadows) {
10656
- Shadows["none"] = "none";
10657
- Shadows["both"] = "both";
10658
- Shadows["top"] = "top";
10659
- Shadows["bottom"] = "bottom";
10660
- })(Shadows || (Shadows = {}));
10661
- const useScrollShadows = (node) => {
10662
- const [shadows, setShadows] = React.useState(Shadows.none);
10663
- const computeShadows = React.useCallback(() => {
10664
- if (node) {
10665
- const { scrollTop, clientHeight, scrollHeight } = node;
10666
- const top = scrollTop !== 0;
10667
- const bottom = scrollTop + clientHeight < scrollHeight;
10668
- if (top && bottom) {
10669
- setShadows(Shadows.both);
10670
- }
10671
- else if (top) {
10672
- setShadows(Shadows.top);
10673
- }
10674
- else if (bottom) {
10675
- setShadows(Shadows.bottom);
10676
- }
10677
- else {
10678
- setShadows(Shadows.none);
10679
- }
10680
- }
10681
- }, [node]);
10682
- // recompute when the scroll container changes in size
10683
- useResizeObserver(computeShadows, node);
10684
- React.useEffect(() => {
10685
- if (node) {
10686
- // compute initial shadows
10687
- computeShadows();
10688
- // listen for scroll events
10689
- node.addEventListener('scroll', computeShadows);
10690
- }
10691
- return () => {
10692
- if (node) {
10693
- node.removeEventListener('scroll', computeShadows);
10694
- }
10695
- };
10696
- }, [node, computeShadows]);
10697
- return shadows;
10660
+ const useResizeObserver = (callback, targetElement, observerOptions = undefined) => {
10661
+ const element = React.useMemo(() => targetElement !== null && targetElement !== void 0 ? targetElement : document.querySelector('body'), [targetElement]);
10662
+ React.useEffect(() => {
10663
+ const observer = new ResizeObserver(callback);
10664
+ observer.observe(element, observerOptions);
10665
+ return () => {
10666
+ observer.disconnect();
10667
+ };
10668
+ }, [callback, observerOptions, element]);
10669
+ };
10670
+
10671
+ var Shadows;
10672
+ (function (Shadows) {
10673
+ Shadows["none"] = "none";
10674
+ Shadows["both"] = "both";
10675
+ Shadows["top"] = "top";
10676
+ Shadows["bottom"] = "bottom";
10677
+ })(Shadows || (Shadows = {}));
10678
+ const useScrollShadows = (node) => {
10679
+ const [shadows, setShadows] = React.useState(Shadows.none);
10680
+ const computeShadows = React.useCallback(() => {
10681
+ if (node) {
10682
+ const { scrollTop, clientHeight, scrollHeight } = node;
10683
+ const top = scrollTop !== 0;
10684
+ const bottom = scrollTop + clientHeight < scrollHeight;
10685
+ if (top && bottom) {
10686
+ setShadows(Shadows.both);
10687
+ }
10688
+ else if (top) {
10689
+ setShadows(Shadows.top);
10690
+ }
10691
+ else if (bottom) {
10692
+ setShadows(Shadows.bottom);
10693
+ }
10694
+ else {
10695
+ setShadows(Shadows.none);
10696
+ }
10697
+ }
10698
+ }, [node]);
10699
+ // recompute when the scroll container changes in size
10700
+ useResizeObserver(computeShadows, node);
10701
+ React.useEffect(() => {
10702
+ if (node) {
10703
+ // compute initial shadows
10704
+ computeShadows();
10705
+ // listen for scroll events
10706
+ node.addEventListener('scroll', computeShadows);
10707
+ }
10708
+ return () => {
10709
+ if (node) {
10710
+ node.removeEventListener('scroll', computeShadows);
10711
+ }
10712
+ };
10713
+ }, [node, computeShadows]);
10714
+ return shadows;
10698
10715
  };
10699
10716
 
10700
- const useBoundingClientRect = (targetElement) => {
10701
- const [clientRect, setClientRect] = React.useState(() => targetElement ? targetElement.getBoundingClientRect() : null);
10702
- const observerCallback = React.useCallback(() => {
10703
- setClientRect(targetElement ? targetElement.getBoundingClientRect() : null);
10704
- }, [targetElement]);
10705
- useResizeObserver(observerCallback);
10706
- return clientRect;
10717
+ const useBoundingClientRect = (targetElement) => {
10718
+ const [clientRect, setClientRect] = React.useState(() => targetElement ? targetElement.getBoundingClientRect() : null);
10719
+ const observerCallback = React.useCallback(() => {
10720
+ setClientRect(targetElement ? targetElement.getBoundingClientRect() : null);
10721
+ }, [targetElement]);
10722
+ useResizeObserver(observerCallback);
10723
+ return clientRect;
10707
10724
  };
10708
10725
 
10709
- /**
10710
- * React hook that forces component render.
10711
- */
10726
+ /**
10727
+ * React hook that forces component render.
10728
+ */
10712
10729
  const useForceRender = () => React.useReducer((s) => !s, false)[1];
10713
10730
 
10714
- const useEventListener = (target, event, callback) => {
10715
- useEffect(() => {
10716
- target.addEventListener(event, callback);
10717
- return () => {
10718
- target.removeEventListener(event, callback);
10719
- };
10720
- }, [target, event, callback]);
10721
- };
10722
-
10723
- const StaticSpotlight = ({ element }) => {
10724
- const clientRect = useBoundingClientRect(element);
10725
- const style = clientRect
10726
- ? {
10727
- top: clientRect.top,
10728
- left: clientRect.left,
10729
- height: clientRect.height,
10730
- width: clientRect.width,
10731
- }
10732
- : {};
10733
- return clientRect ? (React.createElement(Portal, null,
10734
- React.createElement("div", { className: "pf-v5-c-backdrop pfext-spotlight__with-backdrop" },
10735
- React.createElement("div", { className: "pfext-spotlight pfext-spotlight__element-highlight-noanimate", style: style })))) : null;
10736
- };
10737
-
10738
- const Spotlight = ({ selector, interactive }) => {
10739
- // if target element is a hidden one return null
10740
- const element = React.useMemo(() => {
10741
- const highlightElement = document.querySelector(selector);
10742
- let hiddenElement = highlightElement;
10743
- while (hiddenElement) {
10744
- const ariaHidden = hiddenElement.getAttribute('aria-hidden');
10745
- if (ariaHidden === 'true') {
10746
- return null;
10747
- }
10748
- hiddenElement = hiddenElement.parentElement;
10749
- }
10750
- return highlightElement;
10751
- }, [selector]);
10752
- if (!element) {
10753
- return null;
10754
- }
10755
- return interactive ? (React.createElement(InteractiveSpotlight, { element: element })) : (React.createElement(StaticSpotlight, { element: element }));
10731
+ const useEventListener = (target, event, callback) => {
10732
+ useEffect(() => {
10733
+ target.addEventListener(event, callback);
10734
+ return () => {
10735
+ target.removeEventListener(event, callback);
10736
+ };
10737
+ }, [target, event, callback]);
10738
+ };
10739
+
10740
+ const StaticSpotlight = ({ element }) => {
10741
+ const clientRect = useBoundingClientRect(element);
10742
+ const style = clientRect
10743
+ ? {
10744
+ top: clientRect.top,
10745
+ left: clientRect.left,
10746
+ height: clientRect.height,
10747
+ width: clientRect.width,
10748
+ }
10749
+ : {};
10750
+ return clientRect ? (React.createElement(Portal, null,
10751
+ React.createElement("div", { className: "pf-v5-c-backdrop pfext-spotlight__with-backdrop" },
10752
+ React.createElement("div", { className: "pfext-spotlight pfext-spotlight__element-highlight-noanimate", style: style })))) : null;
10753
+ };
10754
+
10755
+ const Spotlight = ({ selector, interactive }) => {
10756
+ // if target element is a hidden one return null
10757
+ const element = React.useMemo(() => {
10758
+ const highlightElement = document.querySelector(selector);
10759
+ let hiddenElement = highlightElement;
10760
+ while (hiddenElement) {
10761
+ const ariaHidden = hiddenElement.getAttribute('aria-hidden');
10762
+ if (ariaHidden === 'true') {
10763
+ return null;
10764
+ }
10765
+ hiddenElement = hiddenElement.parentElement;
10766
+ }
10767
+ return highlightElement;
10768
+ }, [selector]);
10769
+ if (!element) {
10770
+ return null;
10771
+ }
10772
+ return interactive ? (React.createElement(InteractiveSpotlight, { element: element })) : (React.createElement(StaticSpotlight, { element: element }));
10773
+ };
10774
+
10775
+ const MarkdownHighlightExtension = ({ docContext, rootSelector, }) => {
10776
+ const [selector, setSelector] = React.useState(null);
10777
+ React.useEffect(() => {
10778
+ const elements = docContext.querySelectorAll(`${rootSelector} [data-highlight]`);
10779
+ let timeoutId;
10780
+ function startHighlight(e) {
10781
+ const highlightId = e.target.getAttribute('data-highlight');
10782
+ if (!highlightId) {
10783
+ return;
10784
+ }
10785
+ setSelector(null);
10786
+ timeoutId = setTimeout(() => {
10787
+ setSelector(`[data-quickstart-id="${highlightId}"]`);
10788
+ }, 0);
10789
+ }
10790
+ elements && elements.forEach((elm) => elm.addEventListener('click', startHighlight));
10791
+ return () => {
10792
+ clearTimeout(timeoutId);
10793
+ elements && elements.forEach((elm) => elm.removeEventListener('click', startHighlight));
10794
+ };
10795
+ }, [docContext, rootSelector]);
10796
+ React.useEffect(() => {
10797
+ const elements = docContext.querySelectorAll(`${rootSelector} [class^=data-highlight__]`);
10798
+ let timeoutId;
10799
+ function startHighlight(e) {
10800
+ e.preventDefault();
10801
+ const classes = e.target.getAttribute('class').split(' ');
10802
+ let highlightId;
10803
+ for (const className of classes) {
10804
+ if (className.startsWith('data-highlight__')) {
10805
+ highlightId = className.split('__')[1];
10806
+ break;
10807
+ }
10808
+ }
10809
+ if (!highlightId) {
10810
+ return;
10811
+ }
10812
+ setSelector(null);
10813
+ timeoutId = setTimeout(() => {
10814
+ setSelector(`[data-quickstart-id="${highlightId}"]`);
10815
+ }, 0);
10816
+ }
10817
+ elements && elements.forEach((elm) => elm.addEventListener('click', startHighlight));
10818
+ return () => {
10819
+ clearTimeout(timeoutId);
10820
+ elements && elements.forEach((elm) => elm.removeEventListener('click', startHighlight));
10821
+ };
10822
+ }, [docContext, rootSelector]);
10823
+ if (!selector) {
10824
+ return null;
10825
+ }
10826
+ return React.createElement(Spotlight, { selector: selector, interactive: true });
10756
10827
  };
10757
10828
 
10758
- const MarkdownHighlightExtension = ({ docContext, rootSelector, }) => {
10759
- const [selector, setSelector] = React.useState(null);
10760
- React.useEffect(() => {
10761
- const elements = docContext.querySelectorAll(`${rootSelector} [data-highlight]`);
10762
- let timeoutId;
10763
- function startHighlight(e) {
10764
- const highlightId = e.target.getAttribute('data-highlight');
10765
- if (!highlightId) {
10766
- return;
10767
- }
10768
- setSelector(null);
10769
- timeoutId = setTimeout(() => {
10770
- setSelector(`[data-quickstart-id="${highlightId}"]`);
10771
- }, 0);
10772
- }
10773
- elements && elements.forEach((elm) => elm.addEventListener('click', startHighlight));
10774
- return () => {
10775
- clearTimeout(timeoutId);
10776
- elements && elements.forEach((elm) => elm.removeEventListener('click', startHighlight));
10777
- };
10778
- }, [docContext, rootSelector]);
10779
- React.useEffect(() => {
10780
- const elements = docContext.querySelectorAll(`${rootSelector} [class^=data-highlight__]`);
10781
- let timeoutId;
10782
- function startHighlight(e) {
10783
- e.preventDefault();
10784
- const classes = e.target.getAttribute('class').split(' ');
10785
- let highlightId;
10786
- for (const className of classes) {
10787
- if (className.startsWith('data-highlight__')) {
10788
- highlightId = className.split('__')[1];
10789
- break;
10790
- }
10791
- }
10792
- if (!highlightId) {
10793
- return;
10794
- }
10795
- setSelector(null);
10796
- timeoutId = setTimeout(() => {
10797
- setSelector(`[data-quickstart-id="${highlightId}"]`);
10798
- }, 0);
10799
- }
10800
- elements && elements.forEach((elm) => elm.addEventListener('click', startHighlight));
10801
- return () => {
10802
- clearTimeout(timeoutId);
10803
- elements && elements.forEach((elm) => elm.removeEventListener('click', startHighlight));
10804
- };
10805
- }, [docContext, rootSelector]);
10806
- if (!selector) {
10807
- return null;
10808
- }
10809
- return React.createElement(Spotlight, { selector: selector, interactive: true });
10810
- };
10811
-
10812
- const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';
10813
- const MARKDOWN_SNIPPET_ID = 'data-snippet-id';
10814
- const ACCORDION_MARKDOWN_BUTTON_ID = `accordion-markdown-button-id`;
10829
+ const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';
10830
+ const MARKDOWN_SNIPPET_ID = 'data-snippet-id';
10831
+ const ACCORDION_MARKDOWN_BUTTON_ID = `accordion-markdown-button-id`;
10815
10832
  const ACCORDION_MARKDOWN_CONTENT_ID = `accordion-markdown-content-id`;
10816
10833
 
10817
- const CopyClipboard = ({ element, rootSelector, docContext, }) => {
10818
- const { getResource } = React.useContext(QuickStartContext);
10819
- const [showSuccessContent, setShowSuccessContent] = React.useState(false);
10820
- const textToCopy = React.useMemo(() => {
10821
- var _a;
10822
- const copyTextId = element.getAttribute(MARKDOWN_COPY_BUTTON_ID);
10823
- return (_a = docContext.querySelector(`${rootSelector} [${MARKDOWN_SNIPPET_ID}="${copyTextId}"]`)) === null || _a === void 0 ? void 0 : _a.innerText;
10824
- }, [element, docContext, rootSelector]);
10825
- useEventListener(element, 'click', React.useCallback(() => {
10826
- navigator.clipboard
10827
- .writeText(textToCopy.trim())
10828
- .then(() => {
10829
- setShowSuccessContent(true);
10830
- })
10831
- .catch(() => { });
10832
- }, [textToCopy]));
10833
- useEventListener(element, 'mouseleave', React.useCallback(() => {
10834
- setShowSuccessContent(false);
10835
- }, []));
10836
- return showSuccessContent ? (React.createElement(Tooltip, { key: "after-copy", isVisible: true, triggerRef: () => element, content: getResource('Successfully copied to clipboard!'), className: "pfext-quick-start__base" })) : (React.createElement(Tooltip, { key: "before-copy", triggerRef: () => element, content: getResource('Copy to clipboard'), className: "pfext-quick-start__base" }));
10837
- };
10838
- const MarkdownCopyClipboard = ({ docContext, rootSelector, }) => {
10839
- const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`);
10840
- return elements.length > 0 ? (React.createElement(React.Fragment, null, Array.from(elements).map((elm) => {
10841
- const attributeValue = elm.getAttribute(MARKDOWN_COPY_BUTTON_ID);
10842
- return (React.createElement(CopyClipboard, { key: attributeValue, element: elm, rootSelector: rootSelector, docContext: docContext }));
10843
- }))) : null;
10834
+ const CopyClipboard = ({ element, rootSelector, docContext, }) => {
10835
+ const { getResource } = React.useContext(QuickStartContext);
10836
+ const [showSuccessContent, setShowSuccessContent] = React.useState(false);
10837
+ const textToCopy = React.useMemo(() => {
10838
+ var _a;
10839
+ const copyTextId = element.getAttribute(MARKDOWN_COPY_BUTTON_ID);
10840
+ return (_a = docContext.querySelector(`${rootSelector} [${MARKDOWN_SNIPPET_ID}="${copyTextId}"]`)) === null || _a === void 0 ? void 0 : _a.innerText;
10841
+ }, [element, docContext, rootSelector]);
10842
+ useEventListener(element, 'click', React.useCallback(() => {
10843
+ navigator.clipboard
10844
+ .writeText(textToCopy.trim())
10845
+ .then(() => {
10846
+ setShowSuccessContent(true);
10847
+ })
10848
+ .catch(() => { });
10849
+ }, [textToCopy]));
10850
+ useEventListener(element, 'mouseleave', React.useCallback(() => {
10851
+ setShowSuccessContent(false);
10852
+ }, []));
10853
+ return showSuccessContent ? (React.createElement(Tooltip, { key: "after-copy", isVisible: true, triggerRef: () => element, content: getResource('Successfully copied to clipboard!'), className: "pfext-quick-start__base" })) : (React.createElement(Tooltip, { key: "before-copy", triggerRef: () => element, content: getResource('Copy to clipboard'), className: "pfext-quick-start__base" }));
10854
+ };
10855
+ const MarkdownCopyClipboard = ({ docContext, rootSelector, }) => {
10856
+ const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`);
10857
+ return elements.length > 0 ? (React.createElement(React.Fragment, null, Array.from(elements).map((elm) => {
10858
+ const attributeValue = elm.getAttribute(MARKDOWN_COPY_BUTTON_ID);
10859
+ return (React.createElement(CopyClipboard, { key: attributeValue, element: elm, rootSelector: rootSelector, docContext: docContext }));
10860
+ }))) : null;
10844
10861
  };
10845
10862
 
10846
10863
  const removeTemplateWhitespace = (template) => template.replace(/>(?:\s|\n)+</g, '><');
@@ -25234,15 +25251,15 @@ exports["default"] = exports.CopyIcon;
25234
25251
 
25235
25252
  var CopyIcon = /*@__PURE__*/getDefaultExportFromCjs(copyIcon);
25236
25253
 
25237
- const useInlineCopyClipboardShowdownExtension = () => {
25238
- const { getResource } = React.useContext(QuickStartContext);
25239
- return React.useMemo(() => ({
25240
- type: 'lang',
25241
- regex: /`([^`](.*?)[^`])`{{copy}}/g,
25242
- replace: (text, group, _, groupId) => {
25243
- if (!group || isNaN(groupId)) {
25244
- return text;
25245
- }
25254
+ const useInlineCopyClipboardShowdownExtension = () => {
25255
+ const { getResource } = React.useContext(QuickStartContext);
25256
+ return React.useMemo(() => ({
25257
+ type: 'lang',
25258
+ regex: /`([^`](.*?)[^`])`{{copy}}/g,
25259
+ replace: (text, group, _, groupId) => {
25260
+ if (!group || isNaN(groupId)) {
25261
+ return text;
25262
+ }
25246
25263
  return removeTemplateWhitespace(`<span class="pf-v5-c-clipboard-copy pf-m-inline">
25247
25264
  <span class="pf-v5-c-clipboard-copy__text" ${MARKDOWN_SNIPPET_ID}="${groupId}">${group}</span>
25248
25265
  <span class="pf-v5-c-clipboard-copy__actions">
@@ -25252,20 +25269,20 @@ const useInlineCopyClipboardShowdownExtension = () => {
25252
25269
  </button>
25253
25270
  </span>
25254
25271
  </span>
25255
- </span>`);
25256
- },
25257
- }), [getResource]);
25258
- };
25259
-
25260
- const useMultilineCopyClipboardShowdownExtension = () => {
25261
- const { getResource } = React.useContext(QuickStartContext);
25262
- return React.useMemo(() => ({
25263
- type: 'lang',
25264
- regex: /```[\n]\s*((((?!```).)*?\n)+)\s*```{{copy}}/g,
25265
- replace: (text, group, _1, _2, groupId) => {
25266
- if (!group || isNaN(groupId)) {
25267
- return text;
25268
- }
25272
+ </span>`);
25273
+ },
25274
+ }), [getResource]);
25275
+ };
25276
+
25277
+ const useMultilineCopyClipboardShowdownExtension = () => {
25278
+ const { getResource } = React.useContext(QuickStartContext);
25279
+ return React.useMemo(() => ({
25280
+ type: 'lang',
25281
+ regex: /```[\n]\s*((((?!```).)*?\n)+)\s*```{{copy}}/g,
25282
+ replace: (text, group, _1, _2, groupId) => {
25283
+ if (!group || isNaN(groupId)) {
25284
+ return text;
25285
+ }
25269
25286
  return `<div class="pf-v5-c-code-block">
25270
25287
  <div class="pf-v5-c-code-block__header">
25271
25288
  <div class="pf-v5-c-code-block__actions">
@@ -25282,9 +25299,9 @@ const useMultilineCopyClipboardShowdownExtension = () => {
25282
25299
  ${MARKDOWN_SNIPPET_ID}="${groupId}">${group.trim()}</code>
25283
25300
  </pre>
25284
25301
  </div>
25285
- </div>`;
25286
- },
25287
- }), [getResource]);
25302
+ </div>`;
25303
+ },
25304
+ }), [getResource]);
25288
25305
  };
25289
25306
 
25290
25307
  var lightbulbIcon = createCommonjsModule(function (module, exports) {
@@ -29741,133 +29758,133 @@ if (module.exports) {
29741
29758
 
29742
29759
  });
29743
29760
 
29744
- // eslint-disable-next-line @typescript-eslint/no-require-imports
29745
- const DOMPurify = require('dompurify');
29746
- const markdownConvert = (markdown, extensions) => {
29747
- const converter = new showdown.Converter({
29748
- tables: true,
29749
- openLinksInNewWindow: true,
29750
- strikethrough: true,
29751
- emoji: false,
29752
- });
29753
- if (extensions) {
29754
- converter.addExtension(extensions);
29755
- }
29756
- DOMPurify.addHook('beforeSanitizeElements', function (node) {
29757
- // nodeType 1 = element type
29758
- // transform anchor tags
29759
- if (node.nodeType === 1 && node.nodeName.toLowerCase() === 'a') {
29760
- node.setAttribute('rel', 'noopener noreferrer');
29761
- return node;
29762
- }
29763
- // add PF class to ul and ol lists
29764
- if (node.nodeType === 1 &&
29765
- (node.nodeName.toLowerCase() === 'ul' || node.nodeName.toLowerCase() === 'ol')) {
29766
- node.setAttribute('class', 'pf-v5-c-list');
29767
- return node;
29768
- }
29769
- });
29770
- // Add a hook to make all links open a new window
29771
- DOMPurify.addHook('afterSanitizeAttributes', function (node) {
29772
- // set all elements owning target to target=_blank
29773
- if ('target' in node) {
29774
- node.setAttribute('target', '_blank');
29775
- }
29776
- // set non-HTML/MathML links to xlink:show=new
29777
- if (!node.hasAttribute('target') &&
29778
- (node.hasAttribute('xlink:href') || node.hasAttribute('href'))) {
29779
- node.setAttribute('xlink:show', 'new');
29780
- }
29781
- });
29782
- return DOMPurify.sanitize(converter.makeHtml(markdown), {
29783
- USE_PROFILES: {
29784
- html: true,
29785
- svg: true,
29786
- },
29787
- });
29788
- };
29789
- const SyncMarkdownView = ({ content, emptyMsg, extensions, renderExtension, exactHeight, inline, className, }) => {
29790
- const { getResource } = React.useContext(QuickStartContext);
29791
- const markup = React.useMemo(() => markdownConvert(content || emptyMsg || getResource('Not available'), extensions), [content, emptyMsg, extensions, getResource]);
29792
- const innerProps = {
29793
- renderExtension: (extensions === null || extensions === void 0 ? void 0 : extensions.length) > 0 ? renderExtension : undefined,
29794
- exactHeight,
29795
- markup,
29796
- isEmpty: !content,
29797
- className,
29798
- };
29799
- return inline ? React.createElement(InlineMarkdownView, Object.assign({}, innerProps)) : React.createElement(IFrameMarkdownView, Object.assign({}, innerProps));
29800
- };
29801
- const uniqueId = (function () {
29802
- let num = 0;
29803
- return function (prefix) {
29804
- const prefixStr = String(prefix) || '';
29805
- num += 1;
29806
- return prefixStr + num;
29807
- };
29808
- })();
29809
- const RenderExtension = ({ renderExtension, selector, markup, docContext, }) => {
29810
- const forceRender = useForceRender();
29811
- const markupRef = React.useRef(null);
29812
- const shouldRenderExtension = React.useCallback(() => {
29813
- if (markupRef.current === markup) {
29814
- return true;
29815
- }
29816
- markupRef.current = markup;
29817
- return false;
29818
- }, [markup]);
29819
- /**
29820
- * During a render cycle in which markup changes, renderExtension receives an old copy of document
29821
- * because react is still updating the dom using `dangerouslySetInnerHTML` with latest markdown markup
29822
- * which causes the component rendered by renderExtension to receive old copy of document
29823
- * use forceRender to delay the rendering of extension by one render cycle
29824
- */
29825
- React.useEffect(() => {
29826
- if (renderExtension) {
29827
- forceRender();
29828
- }
29829
- // eslint-disable-next-line react-hooks/exhaustive-deps
29830
- }, [markup]);
29831
- return (React.createElement(React.Fragment, null, shouldRenderExtension() ? renderExtension === null || renderExtension === void 0 ? void 0 : renderExtension(docContext !== null && docContext !== void 0 ? docContext : document, selector) : null));
29832
- };
29833
- const InlineMarkdownView = ({ markup, isEmpty, renderExtension, className, }) => {
29834
- const id = React.useMemo(() => uniqueId('markdown'), []);
29835
- return (React.createElement("div", { className: css('pfext-markdown-view', { 'is-empty': isEmpty }, className), id: id },
29836
- React.createElement("div", { dangerouslySetInnerHTML: { __html: markup } }),
29837
- renderExtension && (React.createElement(RenderExtension, { renderExtension: renderExtension, selector: `#${id}`, markup: markup }))));
29838
- };
29839
- const IFrameMarkdownView = ({ exactHeight, markup, isEmpty, renderExtension, className, }) => {
29840
- const [frame, setFrame] = React.useState();
29841
- const [loaded, setLoaded] = React.useState(false);
29842
- const updateTimeoutHandle = React.useRef();
29843
- const updateDimensions = React.useCallback(() => {
29844
- var _a;
29845
- if (!((_a = frame === null || frame === void 0 ? void 0 : frame.contentWindow) === null || _a === void 0 ? void 0 : _a.document.body.firstChild)) {
29846
- return;
29847
- }
29848
- frame.style.height = `${frame.contentWindow.document.body.firstElementChild.scrollHeight}px`;
29849
- // Let the new height take effect, then reset again once we recompute
29850
- updateTimeoutHandle.current = setTimeout(() => {
29851
- if (exactHeight) {
29852
- frame.style.height = `${frame.contentWindow.document.body.firstElementChild.scrollHeight}px`;
29853
- }
29854
- else {
29855
- // Increase by 15px for the case where a horizontal scrollbar might appear
29856
- frame.style.height = `${frame.contentWindow.document.body.firstElementChild.scrollHeight + 15}px`;
29857
- }
29858
- });
29859
- }, [frame, exactHeight]);
29860
- React.useEffect(() => () => {
29861
- clearTimeout(updateTimeoutHandle.current);
29862
- }, []);
29863
- const onLoad = React.useCallback(() => {
29864
- updateDimensions();
29865
- setLoaded(true);
29866
- }, [updateDimensions]);
29867
- // Find the app's stylesheets and inject them into the frame to ensure consistent styling.
29868
- const filteredLinks = Array.from(document.getElementsByTagName('link')).filter((l) => l.href.includes('app-bundle'));
29761
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
29762
+ const DOMPurify = require('dompurify');
29763
+ const markdownConvert = (markdown, extensions) => {
29764
+ const converter = new showdown.Converter({
29765
+ tables: true,
29766
+ openLinksInNewWindow: true,
29767
+ strikethrough: true,
29768
+ emoji: false,
29769
+ });
29770
+ if (extensions) {
29771
+ converter.addExtension(extensions);
29772
+ }
29773
+ DOMPurify.addHook('beforeSanitizeElements', function (node) {
29774
+ // nodeType 1 = element type
29775
+ // transform anchor tags
29776
+ if (node.nodeType === 1 && node.nodeName.toLowerCase() === 'a') {
29777
+ node.setAttribute('rel', 'noopener noreferrer');
29778
+ return node;
29779
+ }
29780
+ // add PF class to ul and ol lists
29781
+ if (node.nodeType === 1 &&
29782
+ (node.nodeName.toLowerCase() === 'ul' || node.nodeName.toLowerCase() === 'ol')) {
29783
+ node.setAttribute('class', 'pf-v5-c-list');
29784
+ return node;
29785
+ }
29786
+ });
29787
+ // Add a hook to make all links open a new window
29788
+ DOMPurify.addHook('afterSanitizeAttributes', function (node) {
29789
+ // set all elements owning target to target=_blank
29790
+ if ('target' in node) {
29791
+ node.setAttribute('target', '_blank');
29792
+ }
29793
+ // set non-HTML/MathML links to xlink:show=new
29794
+ if (!node.hasAttribute('target') &&
29795
+ (node.hasAttribute('xlink:href') || node.hasAttribute('href'))) {
29796
+ node.setAttribute('xlink:show', 'new');
29797
+ }
29798
+ });
29799
+ return DOMPurify.sanitize(converter.makeHtml(markdown), {
29800
+ USE_PROFILES: {
29801
+ html: true,
29802
+ svg: true,
29803
+ },
29804
+ });
29805
+ };
29806
+ const SyncMarkdownView = ({ content, emptyMsg, extensions, renderExtension, exactHeight, inline, className, }) => {
29807
+ const { getResource } = React.useContext(QuickStartContext);
29808
+ const markup = React.useMemo(() => markdownConvert(content || emptyMsg || getResource('Not available'), extensions), [content, emptyMsg, extensions, getResource]);
29809
+ const innerProps = {
29810
+ renderExtension: (extensions === null || extensions === void 0 ? void 0 : extensions.length) > 0 ? renderExtension : undefined,
29811
+ exactHeight,
29812
+ markup,
29813
+ isEmpty: !content,
29814
+ className,
29815
+ };
29816
+ return inline ? React.createElement(InlineMarkdownView, Object.assign({}, innerProps)) : React.createElement(IFrameMarkdownView, Object.assign({}, innerProps));
29817
+ };
29818
+ const uniqueId = (function () {
29819
+ let num = 0;
29820
+ return function (prefix) {
29821
+ const prefixStr = String(prefix) || '';
29822
+ num += 1;
29823
+ return prefixStr + num;
29824
+ };
29825
+ })();
29826
+ const RenderExtension = ({ renderExtension, selector, markup, docContext, }) => {
29827
+ const forceRender = useForceRender();
29828
+ const markupRef = React.useRef(null);
29829
+ const shouldRenderExtension = React.useCallback(() => {
29830
+ if (markupRef.current === markup) {
29831
+ return true;
29832
+ }
29833
+ markupRef.current = markup;
29834
+ return false;
29835
+ }, [markup]);
29836
+ /**
29837
+ * During a render cycle in which markup changes, renderExtension receives an old copy of document
29838
+ * because react is still updating the dom using `dangerouslySetInnerHTML` with latest markdown markup
29839
+ * which causes the component rendered by renderExtension to receive old copy of document
29840
+ * use forceRender to delay the rendering of extension by one render cycle
29841
+ */
29842
+ React.useEffect(() => {
29843
+ if (renderExtension) {
29844
+ forceRender();
29845
+ }
29846
+ // eslint-disable-next-line react-hooks/exhaustive-deps
29847
+ }, [markup]);
29848
+ return (React.createElement(React.Fragment, null, shouldRenderExtension() ? renderExtension === null || renderExtension === void 0 ? void 0 : renderExtension(docContext !== null && docContext !== void 0 ? docContext : document, selector) : null));
29849
+ };
29850
+ const InlineMarkdownView = ({ markup, isEmpty, renderExtension, className, }) => {
29851
+ const id = React.useMemo(() => uniqueId('markdown'), []);
29852
+ return (React.createElement("div", { className: css('pfext-markdown-view', { 'is-empty': isEmpty }, className), id: id },
29853
+ React.createElement("div", { dangerouslySetInnerHTML: { __html: markup } }),
29854
+ renderExtension && (React.createElement(RenderExtension, { renderExtension: renderExtension, selector: `#${id}`, markup: markup }))));
29855
+ };
29856
+ const IFrameMarkdownView = ({ exactHeight, markup, isEmpty, renderExtension, className, }) => {
29857
+ const [frame, setFrame] = React.useState();
29858
+ const [loaded, setLoaded] = React.useState(false);
29859
+ const updateTimeoutHandle = React.useRef();
29860
+ const updateDimensions = React.useCallback(() => {
29861
+ var _a;
29862
+ if (!((_a = frame === null || frame === void 0 ? void 0 : frame.contentWindow) === null || _a === void 0 ? void 0 : _a.document.body.firstChild)) {
29863
+ return;
29864
+ }
29865
+ frame.style.height = `${frame.contentWindow.document.body.firstElementChild.scrollHeight}px`;
29866
+ // Let the new height take effect, then reset again once we recompute
29867
+ updateTimeoutHandle.current = setTimeout(() => {
29868
+ if (exactHeight) {
29869
+ frame.style.height = `${frame.contentWindow.document.body.firstElementChild.scrollHeight}px`;
29870
+ }
29871
+ else {
29872
+ // Increase by 15px for the case where a horizontal scrollbar might appear
29873
+ frame.style.height = `${frame.contentWindow.document.body.firstElementChild.scrollHeight + 15}px`;
29874
+ }
29875
+ });
29876
+ }, [frame, exactHeight]);
29877
+ React.useEffect(() => () => {
29878
+ clearTimeout(updateTimeoutHandle.current);
29879
+ }, []);
29880
+ const onLoad = React.useCallback(() => {
29881
+ updateDimensions();
29882
+ setLoaded(true);
29883
+ }, [updateDimensions]);
29884
+ // Find the app's stylesheets and inject them into the frame to ensure consistent styling.
29885
+ const filteredLinks = Array.from(document.getElementsByTagName('link')).filter((l) => l.href.includes('app-bundle'));
29869
29886
  const linkRefs = filteredLinks.reduce((refs, link) => `${refs}
29870
- <link rel="stylesheet" href="${link.href}">`, '');
29887
+ <link rel="stylesheet" href="${link.href}">`, '');
29871
29888
  const contents = `
29872
29889
  ${linkRefs}
29873
29890
  <style type="text/css">
@@ -29892,148 +29909,148 @@ const IFrameMarkdownView = ({ exactHeight, markup, isEmpty, renderExtension, cla
29892
29909
  padding-top: 0;
29893
29910
  }
29894
29911
  </style>
29895
- <body class="pf-m-redhat-font"><div style="overflow-y: auto;">${markup}</div></body>`;
29896
- return (React.createElement(React.Fragment, null,
29897
- React.createElement("iframe", { sandbox: "allow-popups allow-popups-to-escape-sandbox allow-same-origin", srcDoc: contents, style: { border: '0px', display: 'block', width: '100%', height: '0' }, ref: (r) => setFrame(r), onLoad: () => onLoad(), className: className }),
29898
- loaded && frame && renderExtension && (React.createElement(RenderExtension, { markup: markup, selector: '', renderExtension: renderExtension, docContext: frame.contentDocument }))));
29912
+ <body class="pf-m-redhat-font"><div style="overflow-y: auto;">${markup}</div></body>`;
29913
+ return (React.createElement(React.Fragment, null,
29914
+ React.createElement("iframe", { sandbox: "allow-popups allow-popups-to-escape-sandbox allow-same-origin", srcDoc: contents, style: { border: '0px', display: 'block', width: '100%', height: '0' }, ref: (r) => setFrame(r), onLoad: () => onLoad(), className: className }),
29915
+ loaded && frame && renderExtension && (React.createElement(RenderExtension, { markup: markup, selector: '', renderExtension: renderExtension, docContext: frame.contentDocument }))));
29899
29916
  };
29900
29917
 
29901
- const LINK_LABEL = '[\\d\\w\\s-()$!]+';
29902
- const HIGHLIGHT_ACTIONS = ['highlight'];
29903
- const SELECTOR_ID = `[\\w-]+`;
29904
- // [linkLabel]{{action id}}
29918
+ const LINK_LABEL = '[\\d\\w\\s-()$!]+';
29919
+ const HIGHLIGHT_ACTIONS = ['highlight'];
29920
+ const SELECTOR_ID = `[\\w-]+`;
29921
+ // [linkLabel]{{action id}}
29905
29922
  const HIGHLIGHT_REGEXP = new RegExp(`\\[(${LINK_LABEL})]{{(${HIGHLIGHT_ACTIONS.join('|')}) (${SELECTOR_ID})}}`, 'g');
29906
29923
 
29907
- const removeParagraphWrap = (markdown) => markdown.replace(/^<p>|<\/p>$/g, '');
29908
- const QuickStartMarkdownView = ({ content, exactHeight, className, }) => {
29909
- const { markdown } = React.useContext(QuickStartContext);
29910
- const inlineCopyClipboardShowdownExtension = useInlineCopyClipboardShowdownExtension();
29911
- const multilineCopyClipboardShowdownExtension = useMultilineCopyClipboardShowdownExtension();
29912
- const admonitionShowdownExtension = useAdmonitionShowdownExtension();
29913
- const codeShowdownExtension = useCodeShowdownExtension();
29914
- const accordionShowdownExtension = useAccordionShowdownExtension();
29915
- return (React.createElement(SyncMarkdownView, { inline: true, content: content, exactHeight: exactHeight, extensions: [
29916
- {
29917
- type: 'lang',
29918
- regex: HIGHLIGHT_REGEXP,
29919
- replace: (text, linkLabel, linkType, linkId) => {
29920
- if (!linkLabel || !linkType || !linkId) {
29921
- return text;
29922
- }
29923
- return `<button class="pf-v5-c-button pf-m-inline pf-m-link" data-highlight="${linkId}">${linkLabel}</button>`;
29924
- },
29925
- },
29926
- {
29927
- type: 'output',
29928
- filter(text) {
29929
- // check HTML for patterns like: <em>Status: unknown</em>{#extension-requirement-status}
29930
- // and replace with <em id="extension-requirement-status">Status: unknown</em>
29931
- return text.replace(/<em>(.*)<\/em>{#(.*)}/g, '<em id="$2">$1</em>');
29932
- },
29933
- },
29934
- inlineCopyClipboardShowdownExtension,
29935
- multilineCopyClipboardShowdownExtension,
29936
- admonitionShowdownExtension,
29937
- codeShowdownExtension,
29938
- accordionShowdownExtension,
29939
- ...(markdown ? markdown.extensions : []),
29940
- ], renderExtension: (docContext, rootSelector) => (React.createElement(React.Fragment, null,
29941
- React.createElement(AccordionRenderExtension, { docContext: docContext }),
29942
- React.createElement(MarkdownHighlightExtension, { docContext: docContext, rootSelector: rootSelector }),
29943
- React.createElement(MarkdownCopyClipboard, { docContext: docContext, rootSelector: rootSelector }),
29944
- markdown &&
29945
- markdown.renderExtension &&
29946
- markdown.renderExtension(docContext, rootSelector))), className: className }));
29947
- };
29948
-
29949
- var AdmonitionType;
29950
- (function (AdmonitionType) {
29951
- AdmonitionType["TIP"] = "TIP";
29952
- AdmonitionType["NOTE"] = "NOTE";
29953
- AdmonitionType["IMPORTANT"] = "IMPORTANT";
29954
- AdmonitionType["WARNING"] = "WARNING";
29955
- AdmonitionType["CAUTION"] = "CAUTION";
29956
- })(AdmonitionType || (AdmonitionType = {}));
29957
- const admonitionToAlertVariantMap = {
29958
- [AdmonitionType.NOTE]: { variant: 'info' },
29959
- [AdmonitionType.TIP]: { variant: 'default', customIcon: React.createElement(LightbulbIcon, null) },
29960
- [AdmonitionType.IMPORTANT]: { variant: 'danger' },
29961
- [AdmonitionType.CAUTION]: { variant: 'warning', customIcon: React.createElement(FireIcon, null) },
29962
- [AdmonitionType.WARNING]: { variant: 'warning' },
29963
- };
29964
- const useAdmonitionShowdownExtension = () =>
29965
- // const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
29966
- React.useMemo(() => ({
29967
- type: 'lang',
29968
- regex: /\[(.+)]{{(admonition) ([\w-]+)}}/g,
29969
- replace: (text, content, admonitionLabel, admonitionType, groupId) => {
29970
- if (!content || !admonitionLabel || !admonitionType || !groupId) {
29971
- return text;
29972
- }
29973
- admonitionType = admonitionType.toUpperCase();
29974
- const { variant, customIcon } = admonitionToAlertVariantMap[admonitionType];
29975
- const style = admonitionType === AdmonitionType.CAUTION ? { backgroundColor: '#ec7a0915' } : {};
29976
- const mdContent = React.createElement(QuickStartMarkdownView, { content: content });
29977
- const pfAlert = (React.createElement(Alert, { variant: variant, customIcon: customIcon && customIcon, isInline: true, title: admonitionType, className: "pfext-markdown-admonition", style: style }, mdContent));
29978
- return removeTemplateWhitespace(renderToStaticMarkup(pfAlert));
29979
- },
29924
+ const removeParagraphWrap = (markdown) => markdown.replace(/^<p>|<\/p>$/g, '');
29925
+ const QuickStartMarkdownView = ({ content, exactHeight, className, }) => {
29926
+ const { markdown } = React.useContext(QuickStartContext);
29927
+ const inlineCopyClipboardShowdownExtension = useInlineCopyClipboardShowdownExtension();
29928
+ const multilineCopyClipboardShowdownExtension = useMultilineCopyClipboardShowdownExtension();
29929
+ const admonitionShowdownExtension = useAdmonitionShowdownExtension();
29930
+ const codeShowdownExtension = useCodeShowdownExtension();
29931
+ const accordionShowdownExtension = useAccordionShowdownExtension();
29932
+ return (React.createElement(SyncMarkdownView, { inline: true, content: content, exactHeight: exactHeight, extensions: [
29933
+ {
29934
+ type: 'lang',
29935
+ regex: HIGHLIGHT_REGEXP,
29936
+ replace: (text, linkLabel, linkType, linkId) => {
29937
+ if (!linkLabel || !linkType || !linkId) {
29938
+ return text;
29939
+ }
29940
+ return `<button class="pf-v5-c-button pf-m-inline pf-m-link" data-highlight="${linkId}">${linkLabel}</button>`;
29941
+ },
29942
+ },
29943
+ {
29944
+ type: 'output',
29945
+ filter(text) {
29946
+ // check HTML for patterns like: <em>Status: unknown</em>{#extension-requirement-status}
29947
+ // and replace with <em id="extension-requirement-status">Status: unknown</em>
29948
+ return text.replace(/<em>(.*)<\/em>{#(.*)}/g, '<em id="$2">$1</em>');
29949
+ },
29950
+ },
29951
+ inlineCopyClipboardShowdownExtension,
29952
+ multilineCopyClipboardShowdownExtension,
29953
+ admonitionShowdownExtension,
29954
+ codeShowdownExtension,
29955
+ accordionShowdownExtension,
29956
+ ...(markdown ? markdown.extensions : []),
29957
+ ], renderExtension: (docContext, rootSelector) => (React.createElement(React.Fragment, null,
29958
+ React.createElement(AccordionRenderExtension, { docContext: docContext }),
29959
+ React.createElement(MarkdownHighlightExtension, { docContext: docContext, rootSelector: rootSelector }),
29960
+ React.createElement(MarkdownCopyClipboard, { docContext: docContext, rootSelector: rootSelector }),
29961
+ markdown &&
29962
+ markdown.renderExtension &&
29963
+ markdown.renderExtension(docContext, rootSelector))), className: className }));
29964
+ };
29965
+
29966
+ var AdmonitionType;
29967
+ (function (AdmonitionType) {
29968
+ AdmonitionType["TIP"] = "TIP";
29969
+ AdmonitionType["NOTE"] = "NOTE";
29970
+ AdmonitionType["IMPORTANT"] = "IMPORTANT";
29971
+ AdmonitionType["WARNING"] = "WARNING";
29972
+ AdmonitionType["CAUTION"] = "CAUTION";
29973
+ })(AdmonitionType || (AdmonitionType = {}));
29974
+ const admonitionToAlertVariantMap = {
29975
+ [AdmonitionType.NOTE]: { variant: 'info' },
29976
+ [AdmonitionType.TIP]: { variant: 'default', customIcon: React.createElement(LightbulbIcon, null) },
29977
+ [AdmonitionType.IMPORTANT]: { variant: 'danger' },
29978
+ [AdmonitionType.CAUTION]: { variant: 'warning', customIcon: React.createElement(FireIcon, null) },
29979
+ [AdmonitionType.WARNING]: { variant: 'warning' },
29980
+ };
29981
+ const useAdmonitionShowdownExtension = () =>
29982
+ // const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
29983
+ React.useMemo(() => ({
29984
+ type: 'lang',
29985
+ regex: /\[(.+)]{{(admonition) ([\w-]+)}}/g,
29986
+ replace: (text, content, admonitionLabel, admonitionType, groupId) => {
29987
+ if (!content || !admonitionLabel || !admonitionType || !groupId) {
29988
+ return text;
29989
+ }
29990
+ admonitionType = admonitionType.toUpperCase();
29991
+ const { variant, customIcon } = admonitionToAlertVariantMap[admonitionType];
29992
+ const style = admonitionType === AdmonitionType.CAUTION ? { backgroundColor: '#ec7a0915' } : {};
29993
+ const mdContent = React.createElement(QuickStartMarkdownView, { content: content });
29994
+ const pfAlert = (React.createElement(Alert, { variant: variant, customIcon: customIcon && customIcon, isInline: true, title: admonitionType, className: "pfext-markdown-admonition", style: style }, mdContent));
29995
+ return removeTemplateWhitespace(renderToStaticMarkup(pfAlert));
29996
+ },
29980
29997
  }), []);
29981
29998
 
29982
- const useCodeShowdownExtension = () => React.useMemo(() => ({
29983
- type: 'output',
29984
- regex: /<pre><code>(.*?)\n?<\/code><\/pre>/g,
29985
- replace: (text, content) => {
29986
- if (!content) {
29987
- return text;
29988
- }
29989
- const pfCodeBlock = React.createElement(CodeBlock, null, content);
29990
- return removeTemplateWhitespace(renderToStaticMarkup(pfCodeBlock));
29991
- },
29999
+ const useCodeShowdownExtension = () => React.useMemo(() => ({
30000
+ type: 'output',
30001
+ regex: /<pre><code>(.*?)\n?<\/code><\/pre>/g,
30002
+ replace: (text, content) => {
30003
+ if (!content) {
30004
+ return text;
30005
+ }
30006
+ const pfCodeBlock = React.createElement(CodeBlock, null, content);
30007
+ return removeTemplateWhitespace(renderToStaticMarkup(pfCodeBlock));
30008
+ },
29992
30009
  }), []);
29993
30010
 
29994
- const useAccordionShowdownExtension = () => React.useMemo(() => ({
29995
- type: 'lang',
29996
- regex: /\[(.+)]{{(accordion) ("(.*?)")}}/g,
29997
- replace: (_text, accordionContent, _command, accordionHeading) => {
29998
- const accordionId = String(accordionHeading).replace(/\s/g, '-');
29999
- return removeTemplateWhitespace(renderToStaticMarkup(React.createElement(Accordion, { asDefinitionList: true },
30000
- React.createElement(AccordionItem, null,
30001
- React.createElement(AccordionToggle, { isExpanded: false, id: `${ACCORDION_MARKDOWN_BUTTON_ID}-${accordionId}` }, accordionHeading),
30002
- React.createElement(AccordionContent, { id: `${ACCORDION_MARKDOWN_CONTENT_ID}-${accordionId}`, isHidden: !false }, accordionContent)))));
30003
- },
30011
+ const useAccordionShowdownExtension = () => React.useMemo(() => ({
30012
+ type: 'lang',
30013
+ regex: /\[(.+)]{{(accordion) ("(.*?)")}}/g,
30014
+ replace: (_text, accordionContent, _command, accordionHeading) => {
30015
+ const accordionId = String(accordionHeading).replace(/\s/g, '-');
30016
+ return removeTemplateWhitespace(renderToStaticMarkup(React.createElement(Accordion, { asDefinitionList: true },
30017
+ React.createElement(AccordionItem, null,
30018
+ React.createElement(AccordionToggle, { isExpanded: false, id: `${ACCORDION_MARKDOWN_BUTTON_ID}-${accordionId}` }, accordionHeading),
30019
+ React.createElement(AccordionContent, { id: `${ACCORDION_MARKDOWN_CONTENT_ID}-${accordionId}`, isHidden: !false }, accordionContent)))));
30020
+ },
30004
30021
  }), []);
30005
30022
 
30006
- const AccordionShowdownHandler = ({ buttonElement, contentElement, }) => {
30007
- const [expanded, setExpanded] = React.useState(false);
30008
- const handleClick = () => {
30009
- const expandedModifier = 'pf-m-expanded';
30010
- buttonElement.className = `pf-v5-c-accordion__toggle ${!expanded ? expandedModifier : ''}`;
30011
- contentElement.hidden = expanded;
30012
- contentElement.className = `pf-v5-c-accordion__expanded-content ${!expanded ? expandedModifier : ''}`;
30013
- setExpanded(!expanded);
30014
- };
30015
- useEventListener(buttonElement, 'click', handleClick);
30016
- return React.createElement(React.Fragment, null);
30017
- };
30018
- const AccordionRenderExtension = ({ docContext }) => {
30019
- const buttonElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_BUTTON_ID}]`);
30020
- const contentElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_CONTENT_ID}]`);
30021
- return buttonElements.length > 0 ? (React.createElement(React.Fragment, null, Array.from(buttonElements).map((elm) => {
30022
- const content = Array.from(contentElements).find((elm2) => {
30023
- const elmId = elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1];
30024
- const elm2Id = elm2.id.split(ACCORDION_MARKDOWN_CONTENT_ID)[1];
30025
- return elmId === elm2Id;
30026
- });
30027
- return (React.createElement(AccordionShowdownHandler, { key: elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1], buttonElement: elm, contentElement: content }));
30028
- }))) : null;
30029
- };
30030
-
30031
- const FallbackImg = ({ src, alt, className, fallback }) => {
30032
- const [isSrcValid, setIsSrcValid] = React.useState(true);
30033
- if (src && isSrcValid) {
30034
- return React.createElement("img", { className: className, src: src, alt: alt, onError: () => setIsSrcValid(false) });
30035
- }
30036
- return React.createElement(React.Fragment, null, fallback);
30023
+ const AccordionShowdownHandler = ({ buttonElement, contentElement, }) => {
30024
+ const [expanded, setExpanded] = React.useState(false);
30025
+ const handleClick = () => {
30026
+ const expandedModifier = 'pf-m-expanded';
30027
+ buttonElement.className = `pf-v5-c-accordion__toggle ${!expanded ? expandedModifier : ''}`;
30028
+ contentElement.hidden = expanded;
30029
+ contentElement.className = `pf-v5-c-accordion__expanded-content ${!expanded ? expandedModifier : ''}`;
30030
+ setExpanded(!expanded);
30031
+ };
30032
+ useEventListener(buttonElement, 'click', handleClick);
30033
+ return React.createElement(React.Fragment, null);
30034
+ };
30035
+ const AccordionRenderExtension = ({ docContext }) => {
30036
+ const buttonElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_BUTTON_ID}]`);
30037
+ const contentElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_CONTENT_ID}]`);
30038
+ return buttonElements.length > 0 ? (React.createElement(React.Fragment, null, Array.from(buttonElements).map((elm) => {
30039
+ const content = Array.from(contentElements).find((elm2) => {
30040
+ const elmId = elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1];
30041
+ const elm2Id = elm2.id.split(ACCORDION_MARKDOWN_CONTENT_ID)[1];
30042
+ return elmId === elm2Id;
30043
+ });
30044
+ return (React.createElement(AccordionShowdownHandler, { key: elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1], buttonElement: elm, contentElement: content }));
30045
+ }))) : null;
30046
+ };
30047
+
30048
+ const FallbackImg = ({ src, alt, className, fallback }) => {
30049
+ const [isSrcValid, setIsSrcValid] = React.useState(true);
30050
+ if (src && isSrcValid) {
30051
+ return React.createElement("img", { className: className, src: src, alt: alt, onError: () => setIsSrcValid(false) });
30052
+ }
30053
+ return React.createElement(React.Fragment, null, fallback);
30037
30054
  };
30038
30055
 
30039
30056
  var syncAltIcon = createCommonjsModule(function (module, exports) {
@@ -30054,26 +30071,26 @@ var SyncAltIcon = /*@__PURE__*/getDefaultExportFromCjs(syncAltIcon);
30054
30071
 
30055
30072
  const DASH = '-';
30056
30073
 
30057
- const PopoverStatus = ({ hideHeader, children, isVisible = null, statusBody, title, onHide, onShow, }) => (React.createElement(Popover, { position: PopoverPosition.right, headerContent: hideHeader ? null : title, bodyContent: children, "aria-label": title, onHide: onHide, onShow: onShow, isVisible: isVisible },
30074
+ const PopoverStatus = ({ hideHeader, children, isVisible = null, statusBody, title, onHide, onShow, }) => (React.createElement(Popover, { position: PopoverPosition.right, headerContent: hideHeader ? null : title, bodyContent: children, "aria-label": title, onHide: onHide, onShow: onShow, isVisible: isVisible },
30058
30075
  React.createElement(Button, { variant: "link", isInline: true }, statusBody)));
30059
30076
 
30060
- const StatusIconAndText = ({ icon, title, spin, iconOnly, noTooltip, className, }) => {
30061
- if (!title) {
30062
- return React.createElement(React.Fragment, null, DASH);
30063
- }
30064
- return (React.createElement("span", { className: css('pfext-icon-and-text', className), title: iconOnly && !noTooltip ? title : undefined },
30065
- icon &&
30066
- React.cloneElement(icon, {
30067
- className: css(spin && 'fa-spin', icon.props.className, !iconOnly && 'pfext-icon-and-text__icon pfext-icon-flex-child'),
30068
- }),
30069
- !iconOnly && React.createElement(CamelCaseWrap, { value: title, dataTest: "status-text" })));
30077
+ const StatusIconAndText = ({ icon, title, spin, iconOnly, noTooltip, className, }) => {
30078
+ if (!title) {
30079
+ return React.createElement(React.Fragment, null, DASH);
30080
+ }
30081
+ return (React.createElement("span", { className: css('pfext-icon-and-text', className), title: iconOnly && !noTooltip ? title : undefined },
30082
+ icon &&
30083
+ React.cloneElement(icon, {
30084
+ className: css(spin && 'fa-spin', icon.props.className, !iconOnly && 'pfext-icon-and-text__icon pfext-icon-flex-child'),
30085
+ }),
30086
+ !iconOnly && React.createElement(CamelCaseWrap, { value: title, dataTest: "status-text" })));
30070
30087
  };
30071
30088
 
30072
- const GenericStatus = (props) => {
30073
- const { Icon, children, popoverTitle, title, noTooltip, iconOnly } = props, restProps = __rest(props, ["Icon", "children", "popoverTitle", "title", "noTooltip", "iconOnly"]);
30074
- const renderIcon = iconOnly && !noTooltip ? React.createElement(Icon, { title: title }) : React.createElement(Icon, null);
30075
- const statusBody = (React.createElement(StatusIconAndText, Object.assign({}, restProps, { noTooltip: noTooltip, title: title, iconOnly: iconOnly, icon: renderIcon })));
30076
- return React.Children.toArray(children).length ? (React.createElement(PopoverStatus, Object.assign({ title: popoverTitle || title }, restProps, { statusBody: statusBody }), children)) : (statusBody);
30089
+ const GenericStatus = (props) => {
30090
+ const { Icon, children, popoverTitle, title, noTooltip, iconOnly } = props, restProps = __rest(props, ["Icon", "children", "popoverTitle", "title", "noTooltip", "iconOnly"]);
30091
+ const renderIcon = iconOnly && !noTooltip ? React.createElement(Icon, { title: title }) : React.createElement(Icon, null);
30092
+ const statusBody = (React.createElement(StatusIconAndText, Object.assign({}, restProps, { noTooltip: noTooltip, title: title, iconOnly: iconOnly, icon: renderIcon })));
30093
+ return React.Children.toArray(children).length ? (React.createElement(PopoverStatus, Object.assign({ title: popoverTitle || title }, restProps, { statusBody: statusBody }), children)) : (statusBody);
30077
30094
  };
30078
30095
 
30079
30096
  var checkCircleIcon = createCommonjsModule(function (module, exports) {
@@ -30130,68 +30147,68 @@ const global_palette_green_500 = {
30130
30147
  "var": "var(--pf-v5-global--palette--green-500)"
30131
30148
  };
30132
30149
 
30133
- const GreenCheckCircleIcon = ({ className, title, size }) => (React.createElement(Icon, { size: size },
30150
+ const GreenCheckCircleIcon = ({ className, title, size }) => (React.createElement(Icon, { size: size },
30134
30151
  React.createElement(CheckCircleIcon, { "data-test": "success-icon", color: global_palette_green_500.value, className: className, title: title })));
30135
30152
 
30136
- const SuccessStatus = (props) => (React.createElement(GenericStatus, Object.assign({}, props, { Icon: GreenCheckCircleIcon, title: props.title || 'Healthy' })));
30153
+ const SuccessStatus = (props) => (React.createElement(GenericStatus, Object.assign({}, props, { Icon: GreenCheckCircleIcon, title: props.title || 'Healthy' })));
30137
30154
  SuccessStatus.displayName = 'SuccessStatus';
30138
30155
 
30139
- const Status = ({ status, title, iconOnly, noTooltip, className, }) => {
30140
- const statusProps = { title: title || status, iconOnly, noTooltip, className };
30141
- switch (status) {
30142
- case 'In Progress':
30143
- return React.createElement(StatusIconAndText, Object.assign({}, statusProps, { icon: React.createElement(SyncAltIcon, null) }));
30144
- case 'Complete':
30145
- return React.createElement(SuccessStatus, Object.assign({}, statusProps));
30146
- default:
30147
- return React.createElement(React.Fragment, null, status || DASH);
30148
- }
30149
- };
30156
+ const Status = ({ status, title, iconOnly, noTooltip, className, }) => {
30157
+ const statusProps = { title: title || status, iconOnly, noTooltip, className };
30158
+ switch (status) {
30159
+ case 'In Progress':
30160
+ return React.createElement(StatusIconAndText, Object.assign({}, statusProps, { icon: React.createElement(SyncAltIcon, null) }));
30161
+ case 'Complete':
30162
+ return React.createElement(SuccessStatus, Object.assign({}, statusProps));
30163
+ default:
30164
+ return React.createElement(React.Fragment, null, status || DASH);
30165
+ }
30166
+ };
30150
30167
  const StatusIcon = ({ status }) => (React.createElement(Status, { status: status, iconOnly: true }));
30151
30168
 
30152
- const QuickStartTileDescription = ({ description, prerequisites, }) => {
30153
- const { getResource } = React.useContext(QuickStartContext);
30154
- const prereqs = prerequisites === null || prerequisites === void 0 ? void 0 : prerequisites.filter((p) => p);
30155
- return (React.createElement(React.Fragment, null,
30156
- React.createElement(QuickStartMarkdownView, { content: description, className: "pfext-quick-start-tile-description" }),
30157
- (prereqs === null || prereqs === void 0 ? void 0 : prereqs.length) > 0 && (React.createElement("div", { className: "pfext-quick-start-tile-prerequisites" },
30158
- React.createElement(Text, { component: TextVariants.h5, className: "pfext-quick-start-tile-prerequisites__text" },
30159
- getResource('Prerequisites ({{totalPrereqs}})').replace('{{totalPrereqs}}', prereqs.length),
30160
- ' '),
30161
- React.createElement(Popover, { "aria-label": getResource('Prerequisites'), headerContent: getResource('Prerequisites'), className: "pfext-quick-start__base", bodyContent: React.createElement("div", { className: "pfext-popover__base" },
30162
- React.createElement(TextList, { "aria-label": getResource('Prerequisites'), className: "pfext-quick-start-tile-prerequisites-list" }, prereqs.map((prerequisite, index) => (
30163
- // eslint-disable-next-line react/no-array-index-key
30164
- React.createElement(TextListItem, { key: index },
30165
- React.createElement(QuickStartMarkdownView, { content: prerequisite })))))) },
30166
- React.createElement(Button, { variant: "link", isInline: true, className: "pfext-quick-start-tile-prerequisites__icon", "data-testid": "qs-card-prereqs", onClick: (e) => {
30167
- e.preventDefault();
30168
- e.stopPropagation();
30169
- }, "aria-label": getResource('Show prerequisites') },
30170
- React.createElement(InfoCircleIcon, null)))))));
30171
- };
30172
-
30173
- const QuickStartTileFooter = ({ quickStartId, status, totalTasks, }) => {
30174
- const { getResource } = React.useContext(QuickStartContext);
30175
- const { activeQuickStartID, startQuickStart, restartQuickStart } = React.useContext(QuickStartContext);
30176
- const start = React.useCallback((e) => {
30177
- e.preventDefault();
30178
- e.stopPropagation();
30179
- startQuickStart(quickStartId, totalTasks);
30180
- }, [quickStartId, startQuickStart, totalTasks]);
30181
- const restart = React.useCallback((e) => {
30182
- e.preventDefault();
30183
- e.stopPropagation();
30184
- restartQuickStart(quickStartId, totalTasks);
30185
- }, [quickStartId, restartQuickStart, totalTasks]);
30186
- return (React.createElement(Flex, { justifyContent: { default: 'justifyContentSpaceBetween' } },
30187
- status === QuickStartStatus.NOT_STARTED && (React.createElement(FlexItem, null,
30188
- React.createElement(Button, { onClick: start, variant: "link", isInline: true, "data-testid": "qs-card-notStarted-start", id: `${quickStartId}-start`, "aria-labelledby": `${quickStartId}-start ${quickStartId}` }, getResource('Start')))),
30189
- status === QuickStartStatus.IN_PROGRESS && activeQuickStartID !== quickStartId && (React.createElement(FlexItem, null,
30190
- React.createElement(Button, { variant: "link", isInline: true, "data-testid": "qs-card-inProgress-resume", id: `${quickStartId}-continue`, "aria-labelledby": `${quickStartId}-continue ${quickStartId}` }, getResource('Continue')))),
30191
- status === QuickStartStatus.COMPLETE && (React.createElement(FlexItem, null,
30192
- React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-complete-restart", id: `${quickStartId}-restart`, "aria-labelledby": `${quickStartId}-restart ${quickStartId}` }, getResource('Restart')))),
30193
- status === QuickStartStatus.IN_PROGRESS && (React.createElement(FlexItem, null,
30194
- React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-inProgress-restart", id: `${quickStartId}-restart`, "aria-labelledby": `${quickStartId}-restart ${quickStartId}` }, getResource('Restart'))))));
30169
+ const QuickStartTileDescription = ({ description, prerequisites, }) => {
30170
+ const { getResource } = React.useContext(QuickStartContext);
30171
+ const prereqs = prerequisites === null || prerequisites === void 0 ? void 0 : prerequisites.filter((p) => p);
30172
+ return (React.createElement(React.Fragment, null,
30173
+ React.createElement(QuickStartMarkdownView, { content: description, className: "pfext-quick-start-tile-description" }),
30174
+ (prereqs === null || prereqs === void 0 ? void 0 : prereqs.length) > 0 && (React.createElement("div", { className: "pfext-quick-start-tile-prerequisites" },
30175
+ React.createElement(Text, { component: TextVariants.h5, className: "pfext-quick-start-tile-prerequisites__text" },
30176
+ getResource('Prerequisites ({{totalPrereqs}})').replace('{{totalPrereqs}}', prereqs.length),
30177
+ ' '),
30178
+ React.createElement(Popover, { "aria-label": getResource('Prerequisites'), headerContent: getResource('Prerequisites'), className: "pfext-quick-start__base", bodyContent: React.createElement("div", { className: "pfext-popover__base" },
30179
+ React.createElement(TextList, { "aria-label": getResource('Prerequisites'), className: "pfext-quick-start-tile-prerequisites-list" }, prereqs.map((prerequisite, index) => (
30180
+ // eslint-disable-next-line react/no-array-index-key
30181
+ React.createElement(TextListItem, { key: index },
30182
+ React.createElement(QuickStartMarkdownView, { content: prerequisite })))))) },
30183
+ React.createElement(Button, { variant: "link", isInline: true, className: "pfext-quick-start-tile-prerequisites__icon", "data-testid": "qs-card-prereqs", onClick: (e) => {
30184
+ e.preventDefault();
30185
+ e.stopPropagation();
30186
+ }, "aria-label": getResource('Show prerequisites') },
30187
+ React.createElement(InfoCircleIcon, null)))))));
30188
+ };
30189
+
30190
+ const QuickStartTileFooter = ({ quickStartId, status, totalTasks, }) => {
30191
+ const { getResource } = React.useContext(QuickStartContext);
30192
+ const { activeQuickStartID, startQuickStart, restartQuickStart } = React.useContext(QuickStartContext);
30193
+ const start = React.useCallback((e) => {
30194
+ e.preventDefault();
30195
+ e.stopPropagation();
30196
+ startQuickStart(quickStartId, totalTasks);
30197
+ }, [quickStartId, startQuickStart, totalTasks]);
30198
+ const restart = React.useCallback((e) => {
30199
+ e.preventDefault();
30200
+ e.stopPropagation();
30201
+ restartQuickStart(quickStartId, totalTasks);
30202
+ }, [quickStartId, restartQuickStart, totalTasks]);
30203
+ return (React.createElement(Flex, { justifyContent: { default: 'justifyContentSpaceBetween' } },
30204
+ status === QuickStartStatus.NOT_STARTED && (React.createElement(FlexItem, null,
30205
+ React.createElement(Button, { onClick: start, variant: "link", isInline: true, "data-testid": "qs-card-notStarted-start", id: `${quickStartId}-start`, "aria-labelledby": `${quickStartId}-start ${quickStartId}` }, getResource('Start')))),
30206
+ status === QuickStartStatus.IN_PROGRESS && activeQuickStartID !== quickStartId && (React.createElement(FlexItem, null,
30207
+ React.createElement(Button, { variant: "link", isInline: true, "data-testid": "qs-card-inProgress-resume", id: `${quickStartId}-continue`, "aria-labelledby": `${quickStartId}-continue ${quickStartId}` }, getResource('Continue')))),
30208
+ status === QuickStartStatus.COMPLETE && (React.createElement(FlexItem, null,
30209
+ React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-complete-restart", id: `${quickStartId}-restart`, "aria-labelledby": `${quickStartId}-restart ${quickStartId}` }, getResource('Restart')))),
30210
+ status === QuickStartStatus.IN_PROGRESS && (React.createElement(FlexItem, null,
30211
+ React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-inProgress-restart", id: `${quickStartId}-restart`, "aria-labelledby": `${quickStartId}-restart ${quickStartId}` }, getResource('Restart'))))));
30195
30212
  };
30196
30213
 
30197
30214
  var externalLinkAltIcon = createCommonjsModule(function (module, exports) {
@@ -30210,11 +30227,11 @@ exports["default"] = exports.ExternalLinkAltIcon;
30210
30227
 
30211
30228
  var ExternalLinkAltIcon = /*@__PURE__*/getDefaultExportFromCjs(externalLinkAltIcon);
30212
30229
 
30213
- const QuickStartTileFooterExternal = ({ link, quickStartId, }) => {
30214
- const { href, text } = link;
30215
- return (React.createElement(Flex, { justifyContent: { default: 'justifyContentSpaceBetween' } },
30216
- React.createElement(FlexItem, null,
30217
- React.createElement(Button, { component: "a", href: href, target: "_blank", rel: "noopener noreferrer", variant: "link", "aria-label": `Open documentation in new window`, isInline: true, icon: React.createElement(ExternalLinkAltIcon, null), iconPosition: "right", id: quickStartId, "aria-labelledby": `${quickStartId}-external ${quickStartId}` }, text || href))));
30230
+ const QuickStartTileFooterExternal = ({ link, quickStartId, }) => {
30231
+ const { href, text } = link;
30232
+ return (React.createElement(Flex, { justifyContent: { default: 'justifyContentSpaceBetween' } },
30233
+ React.createElement(FlexItem, null,
30234
+ React.createElement(Button, { component: "a", href: href, target: "_blank", rel: "noopener noreferrer", variant: "link", "aria-label": `Open documentation in new window`, isInline: true, icon: React.createElement(ExternalLinkAltIcon, null), iconPosition: "right", id: quickStartId, "aria-labelledby": `${quickStartId}-external ${quickStartId}` }, text || href))));
30218
30235
  };
30219
30236
 
30220
30237
  var outlinedClockIcon = createCommonjsModule(function (module, exports) {
@@ -30233,293 +30250,293 @@ exports["default"] = exports.OutlinedClockIcon;
30233
30250
 
30234
30251
  var OutlinedClockIcon = /*@__PURE__*/getDefaultExportFromCjs(outlinedClockIcon);
30235
30252
 
30236
- const statusColorMap = {
30237
- [QuickStartStatus.COMPLETE]: 'green',
30238
- [QuickStartStatus.IN_PROGRESS]: 'purple',
30239
- [QuickStartStatus.NOT_STARTED]: 'grey',
30240
- };
30241
- const QuickStartTileHeader = ({ status, duration, name, type, quickStartId, }) => {
30242
- const { getResource } = React.useContext(QuickStartContext);
30243
- const statusLocaleMap = {
30244
- [QuickStartStatus.COMPLETE]: getResource('Complete'),
30245
- [QuickStartStatus.IN_PROGRESS]: getResource('In progress'),
30246
- [QuickStartStatus.NOT_STARTED]: getResource('Not started'),
30247
- };
30248
- return (React.createElement("div", { className: "pfext-quick-start-tile-header" },
30249
- React.createElement(Title, { headingLevel: "h3", "data-test": "title", id: quickStartId },
30250
- React.createElement(QuickStartMarkdownView, { content: name })),
30251
- React.createElement("div", { className: "pfext-quick-start-tile-header__status" },
30252
- type && (React.createElement(Label, { className: "pfext-quick-start-tile-header--margin", color: type.color }, type.text)),
30253
- duration && (React.createElement(Label, { variant: "outline", "data-test": "duration", icon: React.createElement(OutlinedClockIcon, null), className: "pfext-quick-start-tile-header--margin" }, getResource('{{duration, number}} minutes', duration).replace('{{duration, number}}', duration))),
30254
- status !== QuickStartStatus.NOT_STARTED && (React.createElement(Label, { variant: "outline", color: statusColorMap[status], icon: React.createElement(StatusIcon, { status: status }), "data-test": "status" }, statusLocaleMap[status])))));
30255
- };
30256
-
30257
- const QuickStartTile = ({ quickStart, status, isActive, onClick = () => { }, }) => {
30258
- const { metadata: { name: id }, spec: { icon, tasks, displayName, description, durationMinutes, prerequisites, link, type }, } = quickStart;
30259
- const { setActiveQuickStart, footer } = React.useContext(QuickStartContext);
30260
- const ref = React.useRef(null);
30261
- let quickStartIcon;
30262
- if (typeof icon === 'object') {
30263
- quickStartIcon = icon;
30264
- }
30265
- else {
30266
- quickStartIcon = (React.createElement(FallbackImg, { className: "pfext-catalog-item-icon__img--large", src: icon, alt: "", fallback: React.createElement(RocketIcon, null) }));
30267
- }
30268
- const footerComponent = React.useMemo(() => {
30269
- if (footer && footer.show === false) {
30270
- return null;
30271
- }
30272
- if (link) {
30273
- return React.createElement(QuickStartTileFooterExternal, { link: link, quickStartId: id });
30274
- }
30275
- return React.createElement(QuickStartTileFooter, { quickStartId: id, status: status, totalTasks: tasks === null || tasks === void 0 ? void 0 : tasks.length });
30276
- }, [footer, id, link, status, tasks === null || tasks === void 0 ? void 0 : tasks.length]);
30277
- const handleClick = (e) => {
30278
- var _a;
30279
- if ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.contains(e.target)) {
30280
- if (link) {
30281
- window.open(link.href);
30282
- }
30283
- else {
30284
- setActiveQuickStart(id, tasks === null || tasks === void 0 ? void 0 : tasks.length);
30285
- }
30286
- onClick();
30287
- }
30288
- };
30289
- return (React.createElement("div", { ref: ref },
30290
- React.createElement(CatalogTile, { style: {
30291
- cursor: 'pointer',
30292
- }, icon: quickStartIcon, className: "pfext-quick-start-tile", "data-testid": `qs-card-${camelize(displayName)}`, featured: isActive, title: React.createElement(QuickStartTileHeader, { name: displayName, status: status, duration: durationMinutes, type: type, quickStartId: id }), onClick: handleClick, onKeyDown: (event) => {
30293
- if (event.key === 'Enter' || event.key === ' ') {
30294
- setActiveQuickStart(id, tasks === null || tasks === void 0 ? void 0 : tasks.length);
30295
- onClick();
30296
- }
30297
- },
30298
- // https://github.com/patternfly/patternfly-react/issues/7039
30299
- href: link === null || link === void 0 ? void 0 : link.href, "data-test": `tile ${id}`, description: React.createElement(QuickStartTileDescription, { description: description, prerequisites: prerequisites }), footer: footerComponent, tabIndex: 0 })));
30300
- };
30301
-
30302
- const QuickStartCatalog = ({ quickStarts }) => {
30303
- const { activeQuickStartID, allQuickStartStates } = React.useContext(QuickStartContext);
30304
- return (React.createElement("div", { className: "pfext-page-layout__content" },
30305
- React.createElement(Gallery, { className: "pfext-quick-start-catalog__gallery", hasGutter: true }, quickStarts.map((quickStart) => {
30306
- const { metadata: { name: id }, } = quickStart;
30307
- return (React.createElement(GalleryItem, { key: id, className: "pfext-quick-start-catalog__gallery-item" },
30308
- React.createElement(QuickStartTile, { quickStart: quickStart, isActive: id === activeQuickStartID, status: getQuickStartStatus(allQuickStartStates, id) })));
30309
- }))));
30310
- };
30311
-
30312
- const QuickStartCatalogFilterSearch = (_a) => {
30313
- var { searchInputText, handleTextChange } = _a, props = __rest(_a, ["searchInputText", "handleTextChange"]);
30314
- const { getResource } = React.useContext(QuickStartContext);
30315
- return (React.createElement(ToolbarItem, { className: "pfext-quick-start-catalog-filter__input" },
30316
- React.createElement(SearchInput, Object.assign({ placeholder: getResource('Filter by keyword...'), value: searchInputText, onChange: (_ev, value) => handleTextChange(value), onClear: () => handleTextChange('') }, props))));
30317
- };
30318
- const QuickStartCatalogFilterSelect = (_a) => {
30319
- var { isDropdownOpen, setIsDropdownOpen, onRowfilterSelect, selectedFilters, dropdownItems } = _a, props = __rest(_a, ["isDropdownOpen", "setIsDropdownOpen", "onRowfilterSelect", "selectedFilters", "dropdownItems"]);
30320
- const { getResource } = React.useContext(QuickStartContext);
30321
- const toggle = (toggleRef) => (React.createElement(MenuToggle, { isFullWidth: true, ref: toggleRef, onClick: () => setIsDropdownOpen(!isDropdownOpen), isExpanded: isDropdownOpen },
30322
- getResource('Status'),
30323
- selectedFilters.length > 0 && React.createElement(Badge, { isRead: true }, selectedFilters.length)));
30324
- return (React.createElement(ToolbarItem, null,
30325
- React.createElement(Select, Object.assign({ "aria-label": getResource('Select filter'), isOpen: isDropdownOpen, selected: selectedFilters, onSelect: onRowfilterSelect, onOpenChange: (isOpen) => setIsDropdownOpen(isOpen), toggle: toggle }, props),
30326
- React.createElement(SelectList, null, dropdownItems))));
30327
- };
30328
- const QuickStartCatalogFilterCount = ({ quickStartsCount }) => {
30329
- const { getResource } = React.useContext(QuickStartContext);
30330
- return (React.createElement(ToolbarItem, { className: "pfext-quick-start-catalog-filter__count", align: { default: 'alignRight' } }, getResource('{{count, number}} item', quickStartsCount).replace('{{count, number}}', quickStartsCount)));
30331
- };
30332
- const QuickStartCatalogFilterSearchWrapper = ({ onSearchInputChange = () => { } }) => {
30333
- const { useQueryParams, filter, setFilter } = React.useContext(QuickStartContext);
30334
- React.useEffect(() => {
30335
- // use this effect to clear the search when a `clear all` action is performed higher up
30336
- const unlisten = history.listen(({ location }) => {
30337
- const searchParams = new URLSearchParams(location.search);
30338
- const searchQuery = searchParams.get(QUICKSTART_SEARCH_FILTER_KEY) || '';
30339
- if (searchQuery === '') {
30340
- setFilter('keyword', '');
30341
- onSearchInputChange('');
30342
- }
30343
- });
30344
- return () => {
30345
- unlisten();
30346
- };
30347
- }, [onSearchInputChange, setFilter]);
30348
- const handleTextChange = (val) => {
30349
- if (val.length > 0) {
30350
- useQueryParams && setQueryArgument(QUICKSTART_SEARCH_FILTER_KEY, val);
30351
- }
30352
- else {
30353
- useQueryParams && removeQueryArgument(QUICKSTART_SEARCH_FILTER_KEY);
30354
- }
30355
- if ((filter === null || filter === void 0 ? void 0 : filter.keyword) !== val) {
30356
- setFilter('keyword', val);
30357
- }
30358
- onSearchInputChange(val);
30359
- };
30360
- return (React.createElement(QuickStartCatalogFilterSearch, { searchInputText: filter === null || filter === void 0 ? void 0 : filter.keyword, handleTextChange: handleTextChange }));
30361
- };
30362
- // compare string/number arrays
30363
- const equalsIgnoreOrder = (a, b) => {
30364
- if (a.length !== b.length) {
30365
- return false;
30366
- }
30367
- const uniqueValues = new Set([...a, ...b]);
30368
- for (const v of uniqueValues) {
30369
- const aCount = a.filter((e) => e === v).length;
30370
- const bCount = b.filter((e) => e === v).length;
30371
- if (aCount !== bCount) {
30372
- return false;
30373
- }
30374
- }
30375
- return true;
30376
- };
30377
- const QuickStartCatalogFilterStatusWrapper = ({ onStatusChange = () => { } }) => {
30378
- const { useQueryParams, filter, setFilter } = React.useContext(QuickStartContext);
30379
- React.useEffect(() => {
30380
- // use this effect to clear the status when a `clear all` action is performed higher up
30381
- const unlisten = history.listen(({ location }) => {
30382
- var _a;
30383
- const searchParams = new URLSearchParams(location.search);
30384
- const updatedStatusFilters = ((_a = searchParams.get(QUICKSTART_STATUS_FILTER_KEY)) === null || _a === void 0 ? void 0 : _a.split(',')) || [];
30385
- if (updatedStatusFilters.length === 0) {
30386
- setFilter('status', []);
30387
- onStatusChange([]);
30388
- }
30389
- });
30390
- return () => {
30391
- unlisten();
30392
- };
30393
- });
30394
- const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
30395
- const onRowfilterSelect = React.useCallback((_e, selectedValue) => {
30396
- setIsDropdownOpen(false);
30397
- const selection = Object.entries(filter.status.statusTypes).find(([_key, value]) => value === selectedValue)[0];
30398
- const selectedFiltersList = filter.status.statusFilters.includes(selection)
30399
- ? filter.status.statusFilters.filter((status) => status !== selection)
30400
- : [...filter.status.statusFilters, selection];
30401
- if (!equalsIgnoreOrder(filter.status.statusFilters, selectedFiltersList)) {
30402
- setFilter('status', selectedFiltersList);
30403
- }
30404
- if (selectedFiltersList.length > 0) {
30405
- useQueryParams && setQueryArgument('status', selectedFiltersList.join(','));
30406
- }
30407
- else {
30408
- useQueryParams && removeQueryArgument(QUICKSTART_STATUS_FILTER_KEY);
30409
- }
30410
- onStatusChange(selectedFiltersList);
30411
- }, [filter.status.statusFilters, onStatusChange, setFilter, useQueryParams]);
30412
- const dropdownItems = Object.entries(filter.status.statusTypes).map(([key, value]) => (React.createElement(SelectOption, { key: key, "data-key": key, value: value, hasCheckbox: true, isSelected: filter.status.statusFilters.includes(key) },
30413
- React.createElement(React.Fragment, null, value))));
30414
- return (React.createElement(QuickStartCatalogFilterSelect, { isDropdownOpen: isDropdownOpen, setIsDropdownOpen: setIsDropdownOpen, onRowfilterSelect: onRowfilterSelect, selectedFilters: filter.status.statusFilters, dropdownItems: dropdownItems }));
30415
- };
30253
+ const statusColorMap = {
30254
+ [QuickStartStatus.COMPLETE]: 'green',
30255
+ [QuickStartStatus.IN_PROGRESS]: 'purple',
30256
+ [QuickStartStatus.NOT_STARTED]: 'grey',
30257
+ };
30258
+ const QuickStartTileHeader = ({ status, duration, name, type, quickStartId, }) => {
30259
+ const { getResource } = React.useContext(QuickStartContext);
30260
+ const statusLocaleMap = {
30261
+ [QuickStartStatus.COMPLETE]: getResource('Complete'),
30262
+ [QuickStartStatus.IN_PROGRESS]: getResource('In progress'),
30263
+ [QuickStartStatus.NOT_STARTED]: getResource('Not started'),
30264
+ };
30265
+ return (React.createElement("div", { className: "pfext-quick-start-tile-header" },
30266
+ React.createElement(Title, { headingLevel: "h3", "data-test": "title", id: quickStartId },
30267
+ React.createElement(QuickStartMarkdownView, { content: name })),
30268
+ React.createElement("div", { className: "pfext-quick-start-tile-header__status" },
30269
+ type && (React.createElement(Label, { className: "pfext-quick-start-tile-header--margin", color: type.color }, type.text)),
30270
+ duration && (React.createElement(Label, { variant: "outline", "data-test": "duration", icon: React.createElement(OutlinedClockIcon, null), className: "pfext-quick-start-tile-header--margin" }, getResource('{{duration, number}} minutes', duration).replace('{{duration, number}}', duration))),
30271
+ status !== QuickStartStatus.NOT_STARTED && (React.createElement(Label, { variant: "outline", color: statusColorMap[status], icon: React.createElement(StatusIcon, { status: status }), "data-test": "status" }, statusLocaleMap[status])))));
30272
+ };
30273
+
30274
+ const QuickStartTile = ({ quickStart, status, isActive, onClick = () => { }, }) => {
30275
+ const { metadata: { name: id }, spec: { icon, tasks, displayName, description, durationMinutes, prerequisites, link, type }, } = quickStart;
30276
+ const { setActiveQuickStart, footer } = React.useContext(QuickStartContext);
30277
+ const ref = React.useRef(null);
30278
+ let quickStartIcon;
30279
+ if (typeof icon === 'object') {
30280
+ quickStartIcon = icon;
30281
+ }
30282
+ else {
30283
+ quickStartIcon = (React.createElement(FallbackImg, { className: "pfext-catalog-item-icon__img--large", src: icon, alt: "", fallback: React.createElement(RocketIcon, null) }));
30284
+ }
30285
+ const footerComponent = React.useMemo(() => {
30286
+ if (footer && footer.show === false) {
30287
+ return null;
30288
+ }
30289
+ if (link) {
30290
+ return React.createElement(QuickStartTileFooterExternal, { link: link, quickStartId: id });
30291
+ }
30292
+ return React.createElement(QuickStartTileFooter, { quickStartId: id, status: status, totalTasks: tasks === null || tasks === void 0 ? void 0 : tasks.length });
30293
+ }, [footer, id, link, status, tasks === null || tasks === void 0 ? void 0 : tasks.length]);
30294
+ const handleClick = (e) => {
30295
+ var _a;
30296
+ if ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.contains(e.target)) {
30297
+ if (link) {
30298
+ window.open(link.href);
30299
+ }
30300
+ else {
30301
+ setActiveQuickStart(id, tasks === null || tasks === void 0 ? void 0 : tasks.length);
30302
+ }
30303
+ onClick();
30304
+ }
30305
+ };
30306
+ return (React.createElement("div", { ref: ref },
30307
+ React.createElement(CatalogTile, { id: id + '-catalog-tile', style: {
30308
+ cursor: 'pointer',
30309
+ }, icon: quickStartIcon, className: "pfext-quick-start-tile", "data-testid": `qs-card-${camelize(displayName)}`, featured: isActive, title: React.createElement(QuickStartTileHeader, { name: displayName, status: status, duration: durationMinutes, type: type, quickStartId: id }), onClick: handleClick, onKeyDown: (event) => {
30310
+ if (event.key === 'Enter' || event.key === ' ') {
30311
+ setActiveQuickStart(id, tasks === null || tasks === void 0 ? void 0 : tasks.length);
30312
+ onClick();
30313
+ }
30314
+ },
30315
+ // https://github.com/patternfly/patternfly-react/issues/7039
30316
+ href: link === null || link === void 0 ? void 0 : link.href, "data-test": `tile ${id}`, description: React.createElement(QuickStartTileDescription, { description: description, prerequisites: prerequisites }), footer: footerComponent, tabIndex: 0 })));
30317
+ };
30318
+
30319
+ const QuickStartCatalog = ({ quickStarts }) => {
30320
+ const { activeQuickStartID, allQuickStartStates } = React.useContext(QuickStartContext);
30321
+ return (React.createElement("div", { className: "pfext-page-layout__content" },
30322
+ React.createElement(Gallery, { className: "pfext-quick-start-catalog__gallery", hasGutter: true }, quickStarts.map((quickStart) => {
30323
+ const { metadata: { name: id }, } = quickStart;
30324
+ return (React.createElement(GalleryItem, { key: id, className: "pfext-quick-start-catalog__gallery-item" },
30325
+ React.createElement(QuickStartTile, { quickStart: quickStart, isActive: id === activeQuickStartID, status: getQuickStartStatus(allQuickStartStates, id) })));
30326
+ }))));
30327
+ };
30328
+
30329
+ const QuickStartCatalogFilterSearch = (_a) => {
30330
+ var { searchInputText, handleTextChange } = _a, props = __rest(_a, ["searchInputText", "handleTextChange"]);
30331
+ const { getResource } = React.useContext(QuickStartContext);
30332
+ return (React.createElement(ToolbarItem, { className: "pfext-quick-start-catalog-filter__input" },
30333
+ React.createElement(SearchInput, Object.assign({ placeholder: getResource('Filter by keyword...'), value: searchInputText, onChange: (_ev, value) => handleTextChange(value), onClear: () => handleTextChange('') }, props))));
30334
+ };
30335
+ const QuickStartCatalogFilterSelect = (_a) => {
30336
+ var { isDropdownOpen, setIsDropdownOpen, onRowfilterSelect, selectedFilters, dropdownItems } = _a, props = __rest(_a, ["isDropdownOpen", "setIsDropdownOpen", "onRowfilterSelect", "selectedFilters", "dropdownItems"]);
30337
+ const { getResource } = React.useContext(QuickStartContext);
30338
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { isFullWidth: true, ref: toggleRef, onClick: () => setIsDropdownOpen(!isDropdownOpen), isExpanded: isDropdownOpen },
30339
+ getResource('Status'),
30340
+ selectedFilters.length > 0 && React.createElement(Badge, { isRead: true }, selectedFilters.length)));
30341
+ return (React.createElement(ToolbarItem, null,
30342
+ React.createElement(Select, Object.assign({ "aria-label": getResource('Select filter'), isOpen: isDropdownOpen, selected: selectedFilters, onSelect: onRowfilterSelect, onOpenChange: (isOpen) => setIsDropdownOpen(isOpen), toggle: toggle }, props),
30343
+ React.createElement(SelectList, null, dropdownItems))));
30344
+ };
30345
+ const QuickStartCatalogFilterCount = ({ quickStartsCount }) => {
30346
+ const { getResource } = React.useContext(QuickStartContext);
30347
+ return (React.createElement(ToolbarItem, { className: "pfext-quick-start-catalog-filter__count", align: { default: 'alignRight' } }, getResource('{{count, number}} item', quickStartsCount).replace('{{count, number}}', quickStartsCount)));
30348
+ };
30349
+ const QuickStartCatalogFilterSearchWrapper = ({ onSearchInputChange = () => { } }) => {
30350
+ const { useQueryParams, filter, setFilter } = React.useContext(QuickStartContext);
30351
+ React.useEffect(() => {
30352
+ // use this effect to clear the search when a `clear all` action is performed higher up
30353
+ const unlisten = history.listen(({ location }) => {
30354
+ const searchParams = new URLSearchParams(location.search);
30355
+ const searchQuery = searchParams.get(QUICKSTART_SEARCH_FILTER_KEY) || '';
30356
+ if (searchQuery === '') {
30357
+ setFilter('keyword', '');
30358
+ onSearchInputChange('');
30359
+ }
30360
+ });
30361
+ return () => {
30362
+ unlisten();
30363
+ };
30364
+ }, [onSearchInputChange, setFilter]);
30365
+ const handleTextChange = (val) => {
30366
+ if (val.length > 0) {
30367
+ useQueryParams && setQueryArgument(QUICKSTART_SEARCH_FILTER_KEY, val);
30368
+ }
30369
+ else {
30370
+ useQueryParams && removeQueryArgument(QUICKSTART_SEARCH_FILTER_KEY);
30371
+ }
30372
+ if ((filter === null || filter === void 0 ? void 0 : filter.keyword) !== val) {
30373
+ setFilter('keyword', val);
30374
+ }
30375
+ onSearchInputChange(val);
30376
+ };
30377
+ return (React.createElement(QuickStartCatalogFilterSearch, { searchInputText: filter === null || filter === void 0 ? void 0 : filter.keyword, handleTextChange: handleTextChange }));
30378
+ };
30379
+ // compare string/number arrays
30380
+ const equalsIgnoreOrder = (a, b) => {
30381
+ if (a.length !== b.length) {
30382
+ return false;
30383
+ }
30384
+ const uniqueValues = new Set([...a, ...b]);
30385
+ for (const v of uniqueValues) {
30386
+ const aCount = a.filter((e) => e === v).length;
30387
+ const bCount = b.filter((e) => e === v).length;
30388
+ if (aCount !== bCount) {
30389
+ return false;
30390
+ }
30391
+ }
30392
+ return true;
30393
+ };
30394
+ const QuickStartCatalogFilterStatusWrapper = ({ onStatusChange = () => { } }) => {
30395
+ const { useQueryParams, filter, setFilter } = React.useContext(QuickStartContext);
30396
+ React.useEffect(() => {
30397
+ // use this effect to clear the status when a `clear all` action is performed higher up
30398
+ const unlisten = history.listen(({ location }) => {
30399
+ var _a;
30400
+ const searchParams = new URLSearchParams(location.search);
30401
+ const updatedStatusFilters = ((_a = searchParams.get(QUICKSTART_STATUS_FILTER_KEY)) === null || _a === void 0 ? void 0 : _a.split(',')) || [];
30402
+ if (updatedStatusFilters.length === 0) {
30403
+ setFilter('status', []);
30404
+ onStatusChange([]);
30405
+ }
30406
+ });
30407
+ return () => {
30408
+ unlisten();
30409
+ };
30410
+ });
30411
+ const [isDropdownOpen, setIsDropdownOpen] = React.useState(false);
30412
+ const onRowfilterSelect = React.useCallback((_e, selectedValue) => {
30413
+ setIsDropdownOpen(false);
30414
+ const selection = Object.entries(filter.status.statusTypes).find(([_key, value]) => value === selectedValue)[0];
30415
+ const selectedFiltersList = filter.status.statusFilters.includes(selection)
30416
+ ? filter.status.statusFilters.filter((status) => status !== selection)
30417
+ : [...filter.status.statusFilters, selection];
30418
+ if (!equalsIgnoreOrder(filter.status.statusFilters, selectedFiltersList)) {
30419
+ setFilter('status', selectedFiltersList);
30420
+ }
30421
+ if (selectedFiltersList.length > 0) {
30422
+ useQueryParams && setQueryArgument('status', selectedFiltersList.join(','));
30423
+ }
30424
+ else {
30425
+ useQueryParams && removeQueryArgument(QUICKSTART_STATUS_FILTER_KEY);
30426
+ }
30427
+ onStatusChange(selectedFiltersList);
30428
+ }, [filter.status.statusFilters, onStatusChange, setFilter, useQueryParams]);
30429
+ const dropdownItems = Object.entries(filter.status.statusTypes).map(([key, value]) => (React.createElement(SelectOption, { key: key, "data-key": key, value: value, hasCheckbox: true, isSelected: filter.status.statusFilters.includes(key) },
30430
+ React.createElement(React.Fragment, null, value))));
30431
+ return (React.createElement(QuickStartCatalogFilterSelect, { isDropdownOpen: isDropdownOpen, setIsDropdownOpen: setIsDropdownOpen, onRowfilterSelect: onRowfilterSelect, selectedFilters: filter.status.statusFilters, dropdownItems: dropdownItems }));
30432
+ };
30416
30433
  const QuickStartCatalogFilterCountWrapper = ({ quickStartsCount }) => React.createElement(QuickStartCatalogFilterCount, { quickStartsCount: quickStartsCount });
30417
30434
 
30418
- const QuickStartCatalogFilter = (_a) => {
30419
- var { quickStartsCount, onSearchInputChange = () => { }, onStatusChange = () => { } } = _a, props = __rest(_a, ["quickStartsCount", "onSearchInputChange", "onStatusChange"]);
30420
- return (React.createElement(Toolbar, Object.assign({ usePageInsets: true, className: "pfext-quick-start-catalog-filter__flex" }, props),
30421
- React.createElement(ToolbarContent, null,
30422
- React.createElement(QuickStartCatalogFilterSearchWrapper, { onSearchInputChange: onSearchInputChange }),
30423
- React.createElement(QuickStartCatalogFilterStatusWrapper, { onStatusChange: onStatusChange }),
30424
- React.createElement(QuickStartCatalogFilterCountWrapper, { quickStartsCount: quickStartsCount }))));
30425
- };
30426
-
30427
- const QuickStartCatalogEmptyState = ({ clearFilters }) => {
30428
- const { getResource } = React.useContext(QuickStartContext);
30429
- return (React.createElement(EmptyState, null,
30430
- React.createElement(EmptyStateHeader, { titleText: React.createElement(React.Fragment, null, getResource('No results found')), icon: React.createElement(EmptyStateIcon, { icon: SearchIcon }), headingLevel: "h4" }),
30431
- React.createElement(EmptyStateBody, null, getResource('No results match the filter criteria. Remove filters or clear all filters to show results.')),
30432
- React.createElement(EmptyStateFooter, null,
30433
- React.createElement(EmptyStateActions, null,
30434
- React.createElement(Button, { variant: "link", onClick: clearFilters, "data-test": "clear-filter button" }, getResource('Clear all filters'))))));
30435
- };
30436
- const QuickStartCatalogPage = ({ quickStarts, showFilter, sortFnc = (q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName), title, hint, showTitle = true, }) => {
30437
- const sortFncCallback = React.useCallback(sortFnc, [sortFnc]);
30438
- const { allQuickStarts = [], setAllQuickStarts, allQuickStartStates, getResource, filter, setFilter, loading, } = React.useContext(QuickStartContext);
30439
- React.useEffect(() => {
30440
- // passed through prop, not context
30441
- if (quickStarts && JSON.stringify(quickStarts) !== JSON.stringify(allQuickStarts)) {
30442
- setAllQuickStarts(quickStarts);
30443
- }
30444
- }, [quickStarts, allQuickStarts, setAllQuickStarts]);
30445
- const initialFilteredQuickStarts = showFilter
30446
- ? filterQuickStarts(allQuickStarts, filter.keyword, filter.status.statusFilters, allQuickStartStates).sort(sortFncCallback)
30447
- : allQuickStarts;
30448
- const [filteredQuickStarts, setFilteredQuickStarts] = React.useState(initialFilteredQuickStarts);
30449
- React.useEffect(() => {
30450
- const filteredQs = showFilter
30451
- ? filterQuickStarts(allQuickStarts, filter.keyword, filter.status.statusFilters, allQuickStartStates).sort(sortFncCallback)
30452
- : allQuickStarts;
30453
- // also needs a check whether the content of the QS changed
30454
- if (filteredQs.length !== filteredQuickStarts.length ||
30455
- JSON.stringify(filteredQs) !== JSON.stringify(filteredQuickStarts)) {
30456
- setFilteredQuickStarts(filteredQs);
30457
- }
30458
- }, [
30459
- allQuickStarts,
30460
- allQuickStartStates,
30461
- showFilter,
30462
- filter.keyword,
30463
- filter.status.statusFilters,
30464
- sortFncCallback,
30465
- filteredQuickStarts,
30466
- ]);
30467
- const clearFilters = () => {
30468
- setFilter('keyword', '');
30469
- setFilter('status', []);
30470
- clearFilterParams();
30471
- setFilteredQuickStarts(allQuickStarts.sort((q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName)));
30472
- };
30473
- const onSearchInputChange = (searchValue) => {
30474
- const result = filterQuickStarts(allQuickStarts, searchValue, filter.status.statusFilters, allQuickStartStates).sort((q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName));
30475
- if (searchValue !== filter.keyword) {
30476
- setFilter('keyword', searchValue);
30477
- }
30478
- if (result.length !== filteredQuickStarts.length) {
30479
- setFilteredQuickStarts(result);
30480
- }
30481
- };
30482
- const onStatusChange = (statusList) => {
30483
- const result = filterQuickStarts(allQuickStarts, filter.keyword, statusList, allQuickStartStates).sort((q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName));
30484
- if (JSON.stringify(statusList) !== JSON.stringify(filter.status)) {
30485
- setFilter('status', statusList);
30486
- }
30487
- if (result.length !== filteredQuickStarts.length) {
30488
- setFilteredQuickStarts(result);
30489
- }
30490
- };
30491
- if (loading) {
30492
- return React.createElement(LoadingBox, null);
30493
- }
30494
- if (!allQuickStarts || allQuickStarts.length === 0) {
30495
- return React.createElement(EmptyBox, { label: getResource('Quick Starts') });
30496
- }
30497
- return (React.createElement("div", { className: "pfext-quick-start__base" },
30498
- showTitle && (React.createElement("div", { className: "pfext-page-layout__header" },
30499
- React.createElement(Text, { component: "h1", className: "pfext-page-layout__title", "data-test": "page-title" }, title || getResource('Quick Starts')),
30500
- hint && React.createElement("div", { className: "pfext-page-layout__hint" }, hint))),
30501
- showTitle && React.createElement(Divider, { component: "div" }),
30502
- showFilter && (React.createElement(React.Fragment, null,
30503
- React.createElement(QuickStartCatalogFilter, { quickStartsCount: filteredQuickStarts.length, onSearchInputChange: onSearchInputChange, onStatusChange: onStatusChange }),
30504
- React.createElement(Divider, { component: "div" }))),
30505
- React.createElement(React.Fragment, null, filteredQuickStarts.length === 0 ? (React.createElement(QuickStartCatalogEmptyState, { clearFilters: clearFilters })) : (React.createElement(QuickStartCatalog, { quickStarts: filteredQuickStarts })))));
30506
- };
30507
-
30508
- const QuickStartCatalogHeader = ({ title, hint, }) => (React.createElement("div", { className: "pfext-page-layout__header" },
30509
- React.createElement("h1", { "data-pf-content": "true", className: "pfext-page-layout__title" }, title),
30435
+ const QuickStartCatalogFilter = (_a) => {
30436
+ var { quickStartsCount, onSearchInputChange = () => { }, onStatusChange = () => { } } = _a, props = __rest(_a, ["quickStartsCount", "onSearchInputChange", "onStatusChange"]);
30437
+ return (React.createElement(Toolbar, Object.assign({ usePageInsets: true, className: "pfext-quick-start-catalog-filter__flex" }, props),
30438
+ React.createElement(ToolbarContent, null,
30439
+ React.createElement(QuickStartCatalogFilterSearchWrapper, { onSearchInputChange: onSearchInputChange }),
30440
+ React.createElement(QuickStartCatalogFilterStatusWrapper, { onStatusChange: onStatusChange }),
30441
+ React.createElement(QuickStartCatalogFilterCountWrapper, { quickStartsCount: quickStartsCount }))));
30442
+ };
30443
+
30444
+ const QuickStartCatalogEmptyState = ({ clearFilters }) => {
30445
+ const { getResource } = React.useContext(QuickStartContext);
30446
+ return (React.createElement(EmptyState, null,
30447
+ React.createElement(EmptyStateHeader, { titleText: React.createElement(React.Fragment, null, getResource('No results found')), icon: React.createElement(EmptyStateIcon, { icon: SearchIcon }), headingLevel: "h4" }),
30448
+ React.createElement(EmptyStateBody, null, getResource('No results match the filter criteria. Remove filters or clear all filters to show results.')),
30449
+ React.createElement(EmptyStateFooter, null,
30450
+ React.createElement(EmptyStateActions, null,
30451
+ React.createElement(Button, { variant: "link", onClick: clearFilters, "data-test": "clear-filter button" }, getResource('Clear all filters'))))));
30452
+ };
30453
+ const QuickStartCatalogPage = ({ quickStarts, showFilter, sortFnc = (q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName), title, hint, showTitle = true, }) => {
30454
+ const sortFncCallback = React.useCallback(sortFnc, [sortFnc]);
30455
+ const { allQuickStarts = [], setAllQuickStarts, allQuickStartStates, getResource, filter, setFilter, loading, } = React.useContext(QuickStartContext);
30456
+ React.useEffect(() => {
30457
+ // passed through prop, not context
30458
+ if (quickStarts && JSON.stringify(quickStarts) !== JSON.stringify(allQuickStarts)) {
30459
+ setAllQuickStarts(quickStarts);
30460
+ }
30461
+ }, [quickStarts, allQuickStarts, setAllQuickStarts]);
30462
+ const initialFilteredQuickStarts = showFilter
30463
+ ? filterQuickStarts(allQuickStarts, filter.keyword, filter.status.statusFilters, allQuickStartStates).sort(sortFncCallback)
30464
+ : allQuickStarts;
30465
+ const [filteredQuickStarts, setFilteredQuickStarts] = React.useState(initialFilteredQuickStarts);
30466
+ React.useEffect(() => {
30467
+ const filteredQs = showFilter
30468
+ ? filterQuickStarts(allQuickStarts, filter.keyword, filter.status.statusFilters, allQuickStartStates).sort(sortFncCallback)
30469
+ : allQuickStarts;
30470
+ // also needs a check whether the content of the QS changed
30471
+ if (filteredQs.length !== filteredQuickStarts.length ||
30472
+ JSON.stringify(filteredQs) !== JSON.stringify(filteredQuickStarts)) {
30473
+ setFilteredQuickStarts(filteredQs);
30474
+ }
30475
+ }, [
30476
+ allQuickStarts,
30477
+ allQuickStartStates,
30478
+ showFilter,
30479
+ filter.keyword,
30480
+ filter.status.statusFilters,
30481
+ sortFncCallback,
30482
+ filteredQuickStarts,
30483
+ ]);
30484
+ const clearFilters = () => {
30485
+ setFilter('keyword', '');
30486
+ setFilter('status', []);
30487
+ clearFilterParams();
30488
+ setFilteredQuickStarts(allQuickStarts.sort((q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName)));
30489
+ };
30490
+ const onSearchInputChange = (searchValue) => {
30491
+ const result = filterQuickStarts(allQuickStarts, searchValue, filter.status.statusFilters, allQuickStartStates).sort((q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName));
30492
+ if (searchValue !== filter.keyword) {
30493
+ setFilter('keyword', searchValue);
30494
+ }
30495
+ if (result.length !== filteredQuickStarts.length) {
30496
+ setFilteredQuickStarts(result);
30497
+ }
30498
+ };
30499
+ const onStatusChange = (statusList) => {
30500
+ const result = filterQuickStarts(allQuickStarts, filter.keyword, statusList, allQuickStartStates).sort((q1, q2) => q1.spec.displayName.localeCompare(q2.spec.displayName));
30501
+ if (JSON.stringify(statusList) !== JSON.stringify(filter.status)) {
30502
+ setFilter('status', statusList);
30503
+ }
30504
+ if (result.length !== filteredQuickStarts.length) {
30505
+ setFilteredQuickStarts(result);
30506
+ }
30507
+ };
30508
+ if (loading) {
30509
+ return React.createElement(LoadingBox, null);
30510
+ }
30511
+ if (!allQuickStarts || allQuickStarts.length === 0) {
30512
+ return React.createElement(EmptyBox, { label: getResource('Quick Starts') });
30513
+ }
30514
+ return (React.createElement("div", { className: "pfext-quick-start__base" },
30515
+ showTitle && (React.createElement("div", { className: "pfext-page-layout__header" },
30516
+ React.createElement(Text, { component: "h1", className: "pfext-page-layout__title", "data-test": "page-title" }, title || getResource('Quick Starts')),
30517
+ hint && React.createElement("div", { className: "pfext-page-layout__hint" }, hint))),
30518
+ showTitle && React.createElement(Divider, { component: "div" }),
30519
+ showFilter && (React.createElement(React.Fragment, null,
30520
+ React.createElement(QuickStartCatalogFilter, { quickStartsCount: filteredQuickStarts.length, onSearchInputChange: onSearchInputChange, onStatusChange: onStatusChange }),
30521
+ React.createElement(Divider, { component: "div" }))),
30522
+ React.createElement(React.Fragment, null, filteredQuickStarts.length === 0 ? (React.createElement(QuickStartCatalogEmptyState, { clearFilters: clearFilters })) : (React.createElement(QuickStartCatalog, { quickStarts: filteredQuickStarts })))));
30523
+ };
30524
+
30525
+ const QuickStartCatalogHeader = ({ title, hint, }) => (React.createElement("div", { className: "pfext-page-layout__header" },
30526
+ React.createElement("h1", { "data-pf-content": "true", className: "pfext-page-layout__title" }, title),
30510
30527
  hint && React.createElement("div", { className: "pfext-page-layout__hint" }, hint)));
30511
30528
 
30512
30529
  const QuickStartCatalogSection = ({ children }) => (React.createElement("div", { className: "pfext-page-layout__content" }, children));
30513
30530
 
30514
30531
  const QuickStartCatalogToolbar = ({ children }) => (React.createElement(Toolbar, { usePageInsets: true, className: "pfext-quick-start-catalog-filter__flex" }, children));
30515
30532
 
30516
- const QuickStartCloseModal = ({ isOpen, onConfirm, onCancel, }) => {
30517
- const { getResource } = React.useContext(QuickStartContext);
30518
- return (React.createElement(Modal, { className: "pfext-quick-start-drawer__modal pfext-quick-start__base", isOpen: isOpen, variant: ModalVariant.small, showClose: false, "data-test": "leave-quickstart", title: getResource('Leave quick start?'), footer: React.createElement(Flex, null,
30519
- React.createElement(FlexItem, { align: { default: 'alignRight' } },
30520
- React.createElement(Button, { variant: "secondary", "data-test": "cancel button", onClick: onCancel }, getResource('Cancel'))),
30521
- React.createElement(FlexItem, null,
30522
- React.createElement(Button, { variant: "primary", "data-test": "leave button", onClick: onConfirm }, getResource('Leave')))), isFullScreen: true }, getResource('Your progress will be saved.')));
30533
+ const QuickStartCloseModal = ({ isOpen, onConfirm, onCancel, }) => {
30534
+ const { getResource } = React.useContext(QuickStartContext);
30535
+ return (React.createElement(Modal, { className: "pfext-quick-start-drawer__modal pfext-quick-start__base", isOpen: isOpen, variant: ModalVariant.small, showClose: false, "data-test": "leave-quickstart", title: getResource('Leave quick start?'), footer: React.createElement(Flex, null,
30536
+ React.createElement(FlexItem, { align: { default: 'alignRight' } },
30537
+ React.createElement(Button, { variant: "secondary", "data-test": "cancel button", onClick: onCancel }, getResource('Cancel'))),
30538
+ React.createElement(FlexItem, null,
30539
+ React.createElement(Button, { variant: "primary", "data-test": "leave button", onClick: onConfirm }, getResource('Leave')))), isFullScreen: true }, getResource('Your progress will be saved.')));
30523
30540
  };
30524
30541
 
30525
30542
  var arrowRightIcon = createCommonjsModule(function (module, exports) {
@@ -30538,395 +30555,395 @@ exports["default"] = exports.ArrowRightIcon;
30538
30555
 
30539
30556
  var ArrowRightIcon = /*@__PURE__*/getDefaultExportFromCjs(arrowRightIcon);
30540
30557
 
30541
- const TaskIcon = ({ taskIndex, taskStatus }) => {
30542
- const { getResource } = React.useContext(QuickStartContext);
30543
- const success = taskStatus === QuickStartTaskStatus.SUCCESS;
30544
- const failed = taskStatus === QuickStartTaskStatus.FAILED;
30545
- const classNames = css('pfext-icon-and-text__icon', {
30546
- 'pfext-quick-start-task-header__task-icon-init': !failed && !success,
30547
- });
30548
- let content;
30549
- if (success) {
30550
- content = (React.createElement(Icon, { size: "md" },
30551
- React.createElement(CheckCircleIcon, { className: "pfext-quick-start-task-header__task-icon-success" }),
30552
- ' '));
30553
- }
30554
- else if (failed) {
30555
- content = (React.createElement(Icon, { size: "md" },
30556
- React.createElement(ExclamationCircleIcon, { className: "pfext-quick-start-task-header__task-icon-failed" })));
30557
- }
30558
- else {
30559
- content = getResource('{{taskIndex, number}}', taskIndex).replace('{{taskIndex, number}}', taskIndex);
30560
- }
30561
- return React.createElement("span", { className: classNames }, content);
30562
- };
30563
- const QuickStartTaskHeader = ({ title, taskIndex, subtitle, taskStatus, size, isActiveTask, onTaskSelect, children, }) => {
30564
- const titleRef = React.useRef(null);
30565
- React.useEffect(() => {
30566
- if (isActiveTask) {
30567
- // Focus the WizardNavItem button element that contains the title
30568
- titleRef.current.parentNode.focus();
30569
- }
30570
- }, [isActiveTask]);
30571
- const classNames = css('pfext-quick-start-task-header__title', {
30572
- 'pfext-quick-start-task-header__title-success': taskStatus === QuickStartTaskStatus.SUCCESS,
30573
- 'pfext-quick-start-task-header__title-failed': taskStatus === (QuickStartTaskStatus.FAILED || QuickStartTaskStatus.VISITED),
30574
- });
30575
- // const notCompleted = taskStatus === QuickStartTaskStatus.VISITED;
30576
- // const skippedReview = taskStatus === QuickStartTaskStatus.REVIEW;
30577
- const failedReview = taskStatus === QuickStartTaskStatus.FAILED;
30578
- // TODO: toned down when this is shown, investigate further when we should display it
30579
- // related: https://github.com/patternfly/patternfly-quickstarts/issues/104
30580
- const tryAgain = failedReview && (React.createElement(React.Fragment, null,
30581
- React.createElement("div", null),
30582
- React.createElement("div", { className: "pfext-quick-start-task-header__tryagain" }, "Try the steps again.")));
30583
- const content = (React.createElement("div", { className: "pfext-quick-start-task-header", ref: titleRef },
30584
- React.createElement(TaskIcon, { taskIndex: taskIndex, taskStatus: taskStatus }),
30585
- React.createElement(Title, { headingLevel: "h3", size: size, className: classNames },
30586
- React.createElement("span", { dangerouslySetInnerHTML: { __html: removeParagraphWrap(markdownConvert(title)) } }),
30587
- isActiveTask && subtitle && (React.createElement("span", { className: "pfext-quick-start-task-header__subtitle", "data-test-id": "quick-start-task-subtitle" },
30588
- ' ',
30589
- subtitle))),
30590
- tryAgain));
30591
- return (React.createElement(WizardNavItem, { content: content, stepIndex: taskIndex, onClick: () => onTaskSelect(taskIndex - 1), component: "button", isCurrent: isActiveTask }, children));
30558
+ const TaskIcon = ({ taskIndex, taskStatus }) => {
30559
+ const { getResource } = React.useContext(QuickStartContext);
30560
+ const success = taskStatus === QuickStartTaskStatus.SUCCESS;
30561
+ const failed = taskStatus === QuickStartTaskStatus.FAILED;
30562
+ const classNames = css('pfext-icon-and-text__icon', {
30563
+ 'pfext-quick-start-task-header__task-icon-init': !failed && !success,
30564
+ });
30565
+ let content;
30566
+ if (success) {
30567
+ content = (React.createElement(Icon, { size: "md" },
30568
+ React.createElement(CheckCircleIcon, { className: "pfext-quick-start-task-header__task-icon-success" }),
30569
+ ' '));
30570
+ }
30571
+ else if (failed) {
30572
+ content = (React.createElement(Icon, { size: "md" },
30573
+ React.createElement(ExclamationCircleIcon, { className: "pfext-quick-start-task-header__task-icon-failed" })));
30574
+ }
30575
+ else {
30576
+ content = getResource('{{taskIndex, number}}', taskIndex).replace('{{taskIndex, number}}', taskIndex);
30577
+ }
30578
+ return React.createElement("span", { className: classNames }, content);
30579
+ };
30580
+ const QuickStartTaskHeader = ({ title, taskIndex, subtitle, taskStatus, size, isActiveTask, onTaskSelect, children, }) => {
30581
+ const titleRef = React.useRef(null);
30582
+ React.useEffect(() => {
30583
+ if (isActiveTask) {
30584
+ // Focus the WizardNavItem button element that contains the title
30585
+ titleRef.current.parentNode.focus();
30586
+ }
30587
+ }, [isActiveTask]);
30588
+ const classNames = css('pfext-quick-start-task-header__title', {
30589
+ 'pfext-quick-start-task-header__title-success': taskStatus === QuickStartTaskStatus.SUCCESS,
30590
+ 'pfext-quick-start-task-header__title-failed': taskStatus === (QuickStartTaskStatus.FAILED || QuickStartTaskStatus.VISITED),
30591
+ });
30592
+ // const notCompleted = taskStatus === QuickStartTaskStatus.VISITED;
30593
+ // const skippedReview = taskStatus === QuickStartTaskStatus.REVIEW;
30594
+ const failedReview = taskStatus === QuickStartTaskStatus.FAILED;
30595
+ // TODO: toned down when this is shown, investigate further when we should display it
30596
+ // related: https://github.com/patternfly/patternfly-quickstarts/issues/104
30597
+ const tryAgain = failedReview && (React.createElement(React.Fragment, null,
30598
+ React.createElement("div", null),
30599
+ React.createElement("div", { className: "pfext-quick-start-task-header__tryagain" }, "Try the steps again.")));
30600
+ const content = (React.createElement("div", { className: "pfext-quick-start-task-header", ref: titleRef },
30601
+ React.createElement(TaskIcon, { taskIndex: taskIndex, taskStatus: taskStatus }),
30602
+ React.createElement(Title, { headingLevel: "h3", size: size, className: classNames },
30603
+ React.createElement("span", { dangerouslySetInnerHTML: { __html: removeParagraphWrap(markdownConvert(title)) } }),
30604
+ isActiveTask && subtitle && (React.createElement("span", { className: "pfext-quick-start-task-header__subtitle", "data-test-id": "quick-start-task-subtitle" },
30605
+ ' ',
30606
+ subtitle))),
30607
+ tryAgain));
30608
+ return (React.createElement(WizardNavItem, { content: content, stepIndex: taskIndex, onClick: () => onTaskSelect(taskIndex - 1), component: "button", isCurrent: isActiveTask }, children));
30592
30609
  };
30593
30610
 
30594
30611
  const QuickStartTaskHeaderList = ({ tasks, allTaskStatuses, onTaskSelect, }) => tasks.length > 0 ? (React.createElement(List, { className: "pfext-quick-start-task-header__list" }, tasks.map((task, index) => (React.createElement(QuickStartTaskHeader, { key: task.title, title: task.title, taskIndex: index + 1, size: "md", taskStatus: allTaskStatuses[index], onTaskSelect: onTaskSelect }))))) : null;
30595
30612
 
30596
- const QuickStartConclusion = ({ tasks, conclusion, allTaskStatuses, nextQuickStarts, onQuickStartChange, onTaskSelect, }) => {
30597
- const hasFailedTask = allTaskStatuses.includes(QuickStartTaskStatus.FAILED);
30598
- const { getResource } = React.useContext(QuickStartContext);
30599
- return (React.createElement(React.Fragment, null,
30600
- React.createElement(QuickStartTaskHeaderList, { tasks: tasks, allTaskStatuses: allTaskStatuses, onTaskSelect: onTaskSelect }),
30601
- React.createElement(QuickStartMarkdownView, { content: hasFailedTask
30602
- ? getResource('One or more verifications did not pass during this quick start. Revisit the tasks or the help links, and then try again.')
30603
- : conclusion }),
30604
- !hasFailedTask &&
30605
- nextQuickStarts &&
30606
- nextQuickStarts.length > 0 &&
30607
- nextQuickStarts.map((nextQuickStart, index) => {
30608
- var _a;
30609
- return (React.createElement(Button, { variant: "link", onClick: () => onQuickStartChange(nextQuickStart.metadata.name), isInline: true, isBlock: true, key: index },
30610
- getResource('Start {{nextQSDisplayName}} quick start').replace('{{nextQSDisplayName}}', (_a = nextQuickStart === null || nextQuickStart === void 0 ? void 0 : nextQuickStart.spec) === null || _a === void 0 ? void 0 : _a.displayName),
30611
- ' ',
30612
- React.createElement(ArrowRightIcon, { style: { marginLeft: 'var(--pf-v5-global--spacer--xs)', verticalAlign: 'middle' } })));
30613
- })));
30614
- };
30615
-
30616
- const QuickStartIntroduction = ({ tasks, introduction, allTaskStatuses, prerequisites, onTaskSelect, }) => {
30617
- const { getResource } = React.useContext(QuickStartContext);
30618
- const prereqs = prerequisites === null || prerequisites === void 0 ? void 0 : prerequisites.filter((p) => p);
30619
- const [isPrereqsExpanded, setIsPrereqsExpanded] = React.useState(false);
30620
- const prereqList = (prereqs === null || prereqs === void 0 ? void 0 : prereqs.length) > 0 && (React.createElement(ExpandableSection, { toggleText: getResource('View Prerequisites ({{totalPrereqs}})').replace('{{totalPrereqs}}', prereqs.length), onToggle: () => setIsPrereqsExpanded(!isPrereqsExpanded), className: "pfext-quick-start-intro__prereq" },
30621
- React.createElement(List, { className: "pfext-quick-start-intro__prereq-list" }, prereqs.map((pr) => (React.createElement(ListItem, { key: pr, className: "pfext-quick-start-intro__prereq-list__item" },
30622
- React.createElement("span", { className: "pfext-quick-start-intro__prereq-list__item-content" },
30623
- React.createElement(QuickStartMarkdownView, { content: pr }))))))));
30624
- return (React.createElement(React.Fragment, null,
30625
- React.createElement(QuickStartMarkdownView, { content: introduction }),
30626
- prereqList,
30627
- React.createElement("p", { style: { marginBottom: 'var(--pf-v5-global--spacer--md)' } },
30628
- getResource('In this quick start, you will complete {{count, number}} task', tasks.length).replace('{{count, number}}', tasks.length),
30629
- ":"),
30630
- React.createElement(QuickStartTaskHeaderList, { tasks: tasks, allTaskStatuses: allTaskStatuses, onTaskSelect: onTaskSelect })));
30631
- };
30632
-
30633
- const getAlertVariant = (status) => {
30634
- switch (status) {
30635
- case QuickStartTaskStatus.SUCCESS:
30636
- return 'success';
30637
- case QuickStartTaskStatus.FAILED:
30638
- return 'danger';
30639
- default:
30640
- return 'info';
30641
- }
30642
- };
30643
- const QuickStartTaskReview = ({ review, taskStatus, onTaskReview, }) => {
30644
- const { instructions, failedTaskHelp: taskHelp } = review;
30645
- const { getResource } = React.useContext(QuickStartContext);
30646
- const alertClassNames = css('pfext-quick-start-task-review', {
30647
- 'pfext-quick-start-task-review--success': taskStatus === QuickStartTaskStatus.SUCCESS,
30648
- 'pfext-quick-start-task-review--failed': taskStatus === QuickStartTaskStatus.FAILED,
30649
- });
30650
- const title = React.createElement("span", { className: alertClassNames }, getResource('Check your work'));
30651
- return (React.createElement(Alert, { className: "pfext-quick-start-task-review-alert", variant: getAlertVariant(taskStatus), title: title, isInline: true, role: "alert" },
30652
- React.createElement(QuickStartMarkdownView, { content: instructions }),
30653
- React.createElement("span", { className: "pfext-quick-start-task-review__actions" },
30654
- React.createElement(Radio, { id: "review-success", name: "review-success", "data-testid": "qs-drawer-check-yes", label: getResource('Yes'), className: "pfext-quick-start-task-review__radio", isChecked: taskStatus === QuickStartTaskStatus.SUCCESS, onChange: () => onTaskReview(QuickStartTaskStatus.SUCCESS) }),
30655
- React.createElement(Radio, { id: "review-failed", name: "review-failed", "data-testid": "qs-drawer-check-no", label: getResource('No'), className: "pfext-quick-start-task-review__radio", isChecked: taskStatus === QuickStartTaskStatus.FAILED, onChange: () => onTaskReview(QuickStartTaskStatus.FAILED) })),
30656
- taskStatus === QuickStartTaskStatus.FAILED && taskHelp && (React.createElement(QuickStartMarkdownView, { content: taskHelp, exactHeight: true }))));
30657
- };
30658
-
30659
- const QuickStartTasks = ({ tasks, taskNumber, allTaskStatuses, onTaskReview, onTaskSelect, }) => {
30660
- const { getResource, alwaysShowTaskReview } = React.useContext(QuickStartContext);
30661
- return (React.createElement("div", { className: "pfext-quick-start-tasks__list" },
30662
- React.createElement("ul", null, tasks
30663
- .filter((_, index) => allTaskStatuses[index] !== QuickStartTaskStatus.INIT)
30664
- .map((task, index) => {
30665
- const { title, description, review } = task;
30666
- const isActiveTask = index === taskNumber;
30667
- const taskStatus = allTaskStatuses[index];
30668
- const shouldShowTaskReview = (!QUICKSTART_TASKS_INITIAL_STATES.includes(taskStatus) || alwaysShowTaskReview) &&
30669
- review;
30670
- return (React.createElement(React.Fragment, { key: title },
30671
- React.createElement(QuickStartTaskHeader, { taskIndex: index + 1, title: title, size: "md", subtitle: getResource('{{index, number}} of {{tasks, number}}')
30672
- .replace('{{index, number}}', index + 1)
30673
- .replace('{{tasks, number}}', tasks.length), taskStatus: taskStatus, isActiveTask: isActiveTask, onTaskSelect: onTaskSelect }, isActiveTask && (React.createElement("div", { className: "pfext-quick-start-task__content" },
30674
- React.createElement(QuickStartMarkdownView, { content: description }),
30675
- shouldShowTaskReview && (React.createElement(QuickStartTaskReview, { review: review, taskStatus: taskStatus, onTaskReview: onTaskReview })))))));
30676
- }))));
30677
- };
30678
-
30679
- const QuickStartContent = React.forwardRef(({ quickStart, nextQuickStarts = [], taskNumber, allTaskStatuses, onTaskSelect, onTaskReview, onQuickStartChange, }, ref) => {
30680
- const { spec: { introduction, tasks, conclusion, prerequisites }, } = quickStart;
30681
- const totalTasks = tasks.length;
30682
- return (React.createElement("div", { className: "pfext-quick-start-content", ref: ref },
30683
- taskNumber === -1 && (React.createElement(QuickStartIntroduction, { tasks: tasks, allTaskStatuses: allTaskStatuses, introduction: introduction, prerequisites: prerequisites, onTaskSelect: onTaskSelect })),
30684
- taskNumber > -1 && taskNumber < totalTasks && (React.createElement(QuickStartTasks, { tasks: tasks, taskNumber: taskNumber, allTaskStatuses: allTaskStatuses, onTaskReview: onTaskReview, onTaskSelect: onTaskSelect })),
30685
- taskNumber === totalTasks && (React.createElement(QuickStartConclusion, { tasks: tasks, conclusion: conclusion, allTaskStatuses: allTaskStatuses, nextQuickStarts: nextQuickStarts, onQuickStartChange: onQuickStartChange, onTaskSelect: onTaskSelect }))));
30613
+ const QuickStartConclusion = ({ tasks, conclusion, allTaskStatuses, nextQuickStarts, onQuickStartChange, onTaskSelect, }) => {
30614
+ const hasFailedTask = allTaskStatuses.includes(QuickStartTaskStatus.FAILED);
30615
+ const { getResource } = React.useContext(QuickStartContext);
30616
+ return (React.createElement(React.Fragment, null,
30617
+ React.createElement(QuickStartTaskHeaderList, { tasks: tasks, allTaskStatuses: allTaskStatuses, onTaskSelect: onTaskSelect }),
30618
+ React.createElement(QuickStartMarkdownView, { content: hasFailedTask
30619
+ ? getResource('One or more verifications did not pass during this quick start. Revisit the tasks or the help links, and then try again.')
30620
+ : conclusion }),
30621
+ !hasFailedTask &&
30622
+ nextQuickStarts &&
30623
+ nextQuickStarts.length > 0 &&
30624
+ nextQuickStarts.map((nextQuickStart, index) => {
30625
+ var _a;
30626
+ return (React.createElement(Button, { variant: "link", onClick: () => onQuickStartChange(nextQuickStart.metadata.name), isInline: true, isBlock: true, key: index },
30627
+ getResource('Start {{nextQSDisplayName}} quick start').replace('{{nextQSDisplayName}}', (_a = nextQuickStart === null || nextQuickStart === void 0 ? void 0 : nextQuickStart.spec) === null || _a === void 0 ? void 0 : _a.displayName),
30628
+ ' ',
30629
+ React.createElement(ArrowRightIcon, { style: { marginLeft: 'var(--pf-v5-global--spacer--xs)', verticalAlign: 'middle' } })));
30630
+ })));
30631
+ };
30632
+
30633
+ const QuickStartIntroduction = ({ tasks, introduction, allTaskStatuses, prerequisites, onTaskSelect, }) => {
30634
+ const { getResource } = React.useContext(QuickStartContext);
30635
+ const prereqs = prerequisites === null || prerequisites === void 0 ? void 0 : prerequisites.filter((p) => p);
30636
+ const [isPrereqsExpanded, setIsPrereqsExpanded] = React.useState(false);
30637
+ const prereqList = (prereqs === null || prereqs === void 0 ? void 0 : prereqs.length) > 0 && (React.createElement(ExpandableSection, { toggleText: getResource('View Prerequisites ({{totalPrereqs}})').replace('{{totalPrereqs}}', prereqs.length), onToggle: () => setIsPrereqsExpanded(!isPrereqsExpanded), className: "pfext-quick-start-intro__prereq" },
30638
+ React.createElement(List, { className: "pfext-quick-start-intro__prereq-list" }, prereqs.map((pr) => (React.createElement(ListItem, { key: pr, className: "pfext-quick-start-intro__prereq-list__item" },
30639
+ React.createElement("span", { className: "pfext-quick-start-intro__prereq-list__item-content" },
30640
+ React.createElement(QuickStartMarkdownView, { content: pr }))))))));
30641
+ return (React.createElement(React.Fragment, null,
30642
+ React.createElement(QuickStartMarkdownView, { content: introduction }),
30643
+ prereqList,
30644
+ React.createElement("p", { style: { marginBottom: 'var(--pf-v5-global--spacer--md)' } },
30645
+ getResource('In this quick start, you will complete {{count, number}} task', tasks.length).replace('{{count, number}}', tasks.length),
30646
+ ":"),
30647
+ React.createElement(QuickStartTaskHeaderList, { tasks: tasks, allTaskStatuses: allTaskStatuses, onTaskSelect: onTaskSelect })));
30648
+ };
30649
+
30650
+ const getAlertVariant = (status) => {
30651
+ switch (status) {
30652
+ case QuickStartTaskStatus.SUCCESS:
30653
+ return 'success';
30654
+ case QuickStartTaskStatus.FAILED:
30655
+ return 'danger';
30656
+ default:
30657
+ return 'info';
30658
+ }
30659
+ };
30660
+ const QuickStartTaskReview = ({ review, taskStatus, onTaskReview, }) => {
30661
+ const { instructions, failedTaskHelp: taskHelp } = review;
30662
+ const { getResource } = React.useContext(QuickStartContext);
30663
+ const alertClassNames = css('pfext-quick-start-task-review', {
30664
+ 'pfext-quick-start-task-review--success': taskStatus === QuickStartTaskStatus.SUCCESS,
30665
+ 'pfext-quick-start-task-review--failed': taskStatus === QuickStartTaskStatus.FAILED,
30666
+ });
30667
+ const title = React.createElement("span", { className: alertClassNames }, getResource('Check your work'));
30668
+ return (React.createElement(Alert, { className: "pfext-quick-start-task-review-alert", variant: getAlertVariant(taskStatus), title: title, isInline: true, role: "alert" },
30669
+ React.createElement(QuickStartMarkdownView, { content: instructions }),
30670
+ React.createElement("span", { className: "pfext-quick-start-task-review__actions" },
30671
+ React.createElement(Radio, { id: "review-success", name: "review-success", "data-testid": "qs-drawer-check-yes", label: getResource('Yes'), className: "pfext-quick-start-task-review__radio", isChecked: taskStatus === QuickStartTaskStatus.SUCCESS, onChange: () => onTaskReview(QuickStartTaskStatus.SUCCESS) }),
30672
+ React.createElement(Radio, { id: "review-failed", name: "review-failed", "data-testid": "qs-drawer-check-no", label: getResource('No'), className: "pfext-quick-start-task-review__radio", isChecked: taskStatus === QuickStartTaskStatus.FAILED, onChange: () => onTaskReview(QuickStartTaskStatus.FAILED) })),
30673
+ taskStatus === QuickStartTaskStatus.FAILED && taskHelp && (React.createElement(QuickStartMarkdownView, { content: taskHelp, exactHeight: true }))));
30674
+ };
30675
+
30676
+ const QuickStartTasks = ({ tasks, taskNumber, allTaskStatuses, onTaskReview, onTaskSelect, }) => {
30677
+ const { getResource, alwaysShowTaskReview } = React.useContext(QuickStartContext);
30678
+ return (React.createElement("div", { className: "pfext-quick-start-tasks__list" },
30679
+ React.createElement("ul", null, tasks
30680
+ .filter((_, index) => allTaskStatuses[index] !== QuickStartTaskStatus.INIT)
30681
+ .map((task, index) => {
30682
+ const { title, description, review } = task;
30683
+ const isActiveTask = index === taskNumber;
30684
+ const taskStatus = allTaskStatuses[index];
30685
+ const shouldShowTaskReview = (!QUICKSTART_TASKS_INITIAL_STATES.includes(taskStatus) || alwaysShowTaskReview) &&
30686
+ review;
30687
+ return (React.createElement(React.Fragment, { key: title },
30688
+ React.createElement(QuickStartTaskHeader, { taskIndex: index + 1, title: title, size: "md", subtitle: getResource('{{index, number}} of {{tasks, number}}')
30689
+ .replace('{{index, number}}', index + 1)
30690
+ .replace('{{tasks, number}}', tasks.length), taskStatus: taskStatus, isActiveTask: isActiveTask, onTaskSelect: onTaskSelect }, isActiveTask && (React.createElement("div", { className: "pfext-quick-start-task__content" },
30691
+ React.createElement(QuickStartMarkdownView, { content: description }),
30692
+ shouldShowTaskReview && (React.createElement(QuickStartTaskReview, { review: review, taskStatus: taskStatus, onTaskReview: onTaskReview })))))));
30693
+ }))));
30694
+ };
30695
+
30696
+ const QuickStartContent = React.forwardRef(({ quickStart, nextQuickStarts = [], taskNumber, allTaskStatuses, onTaskSelect, onTaskReview, onQuickStartChange, }, ref) => {
30697
+ const { spec: { introduction, tasks, conclusion, prerequisites }, } = quickStart;
30698
+ const totalTasks = tasks.length;
30699
+ return (React.createElement("div", { className: "pfext-quick-start-content", ref: ref },
30700
+ taskNumber === -1 && (React.createElement(QuickStartIntroduction, { tasks: tasks, allTaskStatuses: allTaskStatuses, introduction: introduction, prerequisites: prerequisites, onTaskSelect: onTaskSelect })),
30701
+ taskNumber > -1 && taskNumber < totalTasks && (React.createElement(QuickStartTasks, { tasks: tasks, taskNumber: taskNumber, allTaskStatuses: allTaskStatuses, onTaskReview: onTaskReview, onTaskSelect: onTaskSelect })),
30702
+ taskNumber === totalTasks && (React.createElement(QuickStartConclusion, { tasks: tasks, conclusion: conclusion, allTaskStatuses: allTaskStatuses, nextQuickStarts: nextQuickStarts, onQuickStartChange: onQuickStartChange, onTaskSelect: onTaskSelect }))));
30686
30703
  });
30687
30704
 
30688
- const QuickStartFooter = ({ status, taskNumber, totalTasks, onNext, onBack, footerClass, quickStartId, }) => {
30689
- const { restartQuickStart, getResource } = React.useContext(QuickStartContext);
30690
- const PrimaryButtonText = React.useMemo(() => ({
30691
- START: getResource('Start'),
30692
- CONTINUE: getResource('Continue'),
30693
- NEXT: getResource('Next'),
30694
- CLOSE: getResource('Close'),
30695
- }), [getResource]);
30696
- const SecondaryButtonText = React.useMemo(() => ({
30697
- BACK: getResource('Back'),
30698
- RESTART: getResource('Restart'),
30699
- }), [getResource]);
30700
- const onRestart = React.useCallback((e) => {
30701
- e.preventDefault();
30702
- e.stopPropagation();
30703
- restartQuickStart(quickStartId, totalTasks);
30704
- }, [quickStartId, restartQuickStart, totalTasks]);
30705
- const getPrimaryButtonText = React.useMemo(() => {
30706
- if (status === QuickStartStatus.NOT_STARTED) {
30707
- return PrimaryButtonText.START;
30708
- }
30709
- if (taskNumber === totalTasks) {
30710
- return PrimaryButtonText.CLOSE;
30711
- }
30712
- if (taskNumber > -1 && taskNumber < totalTasks) {
30713
- return PrimaryButtonText.NEXT;
30714
- }
30715
- return PrimaryButtonText.CONTINUE;
30716
- }, [taskNumber, totalTasks, PrimaryButtonText, status]);
30717
- const getPrimaryButton = React.useMemo(() => (React.createElement(Button, { variant: "primary", className: "pfext-quick-start-footer__actionbtn", onClick: onNext, "data-testid": `qs-drawer-${camelize(getPrimaryButtonText)}`, "data-test": `${getPrimaryButtonText} button` }, getPrimaryButtonText)), [getPrimaryButtonText, onNext]);
30718
- const getSecondaryButton = React.useMemo(() => taskNumber === -1 && status !== QuickStartStatus.NOT_STARTED ? (React.createElement(Button, { variant: "secondary", onClick: onRestart, "data-testid": "qs-drawer-restart" }, SecondaryButtonText.RESTART)) : (taskNumber > -1 && (React.createElement(Button, { variant: "secondary", onClick: onBack, "data-testid": "qs-drawer-back" }, SecondaryButtonText.BACK))), [onRestart, onBack, SecondaryButtonText, status, taskNumber]);
30719
- const getSideNoteAction = React.useMemo(() => taskNumber !== -1 && (React.createElement(Button, { variant: "link", className: "pfext-quick-start-footer__restartbtn", onClick: onRestart, "data-testid": "qs-drawer-side-note-action" }, SecondaryButtonText.RESTART)), [taskNumber, onRestart, SecondaryButtonText.RESTART]);
30720
- return (React.createElement("div", { className: `pfext-quick-start-footer ${footerClass}` },
30721
- getPrimaryButton,
30722
- getSecondaryButton,
30723
- getSideNoteAction));
30724
- };
30725
-
30726
- const QuickStartController = ({ quickStart, nextQuickStarts, contentRef, footerClass, }) => {
30727
- const { metadata: { name }, spec: { tasks = [] }, } = quickStart;
30728
- const totalTasks = tasks === null || tasks === void 0 ? void 0 : tasks.length;
30729
- const { activeQuickStartState, setActiveQuickStart, setQuickStartTaskNumber, setQuickStartTaskStatus, nextStep, previousStep, } = React.useContext(QuickStartContext);
30730
- const status = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.status;
30731
- const taskNumber = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.taskNumber;
30732
- const allTaskStatuses = tasks.map((task, index) => activeQuickStartState[`taskStatus${index}`]);
30733
- const handleQuickStartChange = React.useCallback((quickStartId) => setActiveQuickStart(quickStartId), [setActiveQuickStart]);
30734
- const handleTaskStatusChange = React.useCallback((newTaskStatus) => setQuickStartTaskStatus(newTaskStatus), [setQuickStartTaskStatus]);
30735
- const getQuickStartActiveTask = React.useCallback(() => {
30736
- let activeTaskNumber = 0;
30737
- while (activeTaskNumber !== totalTasks &&
30738
- activeQuickStartState[`taskStatus${activeTaskNumber}`] !== QuickStartTaskStatus.INIT) {
30739
- activeTaskNumber++;
30740
- }
30741
- return activeTaskNumber;
30742
- }, [totalTasks, activeQuickStartState]);
30743
- const handleQuickStartContinue = React.useCallback(() => {
30744
- const activeTaskNumber = getQuickStartActiveTask();
30745
- setQuickStartTaskNumber(name, activeTaskNumber);
30746
- }, [getQuickStartActiveTask, setQuickStartTaskNumber, name]);
30747
- const handleNext = React.useCallback(() => {
30748
- if (status === QuickStartStatus.COMPLETE && taskNumber === totalTasks) {
30749
- return handleQuickStartChange('');
30750
- }
30751
- if (status !== QuickStartStatus.NOT_STARTED && taskNumber === -1) {
30752
- return handleQuickStartContinue();
30753
- }
30754
- return nextStep(totalTasks);
30755
- }, [handleQuickStartChange, nextStep, status, taskNumber, totalTasks, handleQuickStartContinue]);
30756
- const handleBack = React.useCallback(() => previousStep(), [previousStep]);
30757
- const handleTaskSelect = React.useCallback((selectedTaskNumber) => {
30758
- setQuickStartTaskNumber(name, selectedTaskNumber);
30759
- }, [name, setQuickStartTaskNumber]);
30760
- return (React.createElement(React.Fragment, null,
30761
- React.createElement(QuickStartContent, { quickStart: quickStart, nextQuickStarts: nextQuickStarts, taskNumber: taskNumber, allTaskStatuses: allTaskStatuses, onTaskSelect: handleTaskSelect, onTaskReview: handleTaskStatusChange, onQuickStartChange: handleQuickStartChange, ref: contentRef }),
30762
- React.createElement(QuickStartFooter, { status: status, taskNumber: taskNumber, totalTasks: totalTasks, onNext: handleNext, onBack: handleBack, footerClass: footerClass, quickStartId: quickStart.metadata.name })));
30763
- };
30764
-
30765
- const getElement = (appendTo) => {
30766
- if (typeof appendTo === 'function') {
30767
- return appendTo();
30768
- }
30769
- return appendTo;
30770
- };
30771
- const useScrollTopOnTaskNumberChange = (node, taskNumber) => {
30772
- React.useEffect(() => {
30773
- if (node) {
30774
- node.scrollTo({ top: 0, behavior: 'smooth' });
30775
- }
30776
- }, [taskNumber, node]);
30777
- };
30778
- const QuickStartPanelContent = (_a) => {
30779
- var { quickStarts = [], handleClose, activeQuickStartID, appendTo, isResizable = true, showClose = true, headerVariant = '' } = _a, props = __rest(_a, ["quickStarts", "handleClose", "activeQuickStartID", "appendTo", "isResizable", "showClose", "headerVariant"]);
30780
- const titleRef = React.useRef(null);
30781
- const { getResource, activeQuickStartState } = React.useContext(QuickStartContext);
30782
- const [contentRef, setContentRef] = React.useState();
30783
- const shadows = useScrollShadows(contentRef);
30784
- const quickStart = quickStarts.find((qs) => qs.metadata.name === activeQuickStartID);
30785
- const taskNumber = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.taskNumber;
30786
- useScrollTopOnTaskNumberChange(contentRef, taskNumber);
30787
- const nextQuickStarts = quickStarts.filter((qs) => { var _a; return (_a = quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.nextQuickStart) === null || _a === void 0 ? void 0 : _a.includes(qs.metadata.name); });
30788
- const headerClasses = css('pfext-quick-start-panel-content__header', {
30789
- 'pfext-quick-start-panel-content__header__shadow': shadows === Shadows.top || shadows === Shadows.both,
30790
- 'pfext-quick-start-panel-content__header--blue-white': headerVariant === 'blue-white',
30791
- });
30792
- const footerClass = css({
30793
- 'pfext-quick-start-panel-content__footer__shadow': shadows === Shadows.bottom || shadows === Shadows.both,
30794
- });
30795
- const getStep = () => {
30796
- const tasks = quickStart.spec.tasks.length;
30797
- if (Number.parseInt(taskNumber) === -1) {
30798
- return 'intro';
30799
- }
30800
- if (Number.parseInt(taskNumber) === tasks) {
30801
- return 'conclusion';
30802
- }
30803
- return Number.parseInt(taskNumber) + 1;
30804
- };
30805
- React.useEffect(() => {
30806
- if (quickStart) {
30807
- titleRef.current.focus();
30808
- }
30809
- }, [quickStart]);
30810
- const content = quickStart ? (React.createElement(DrawerPanelContent, Object.assign({ isResizable: isResizable, className: "pfext-quick-start__base", "data-testid": `qs-drawer-${camelize(quickStart.spec.displayName)}`, "data-qs": `qs-step-${getStep()}`, "data-test": "quickstart drawer" }, props),
30811
- React.createElement("div", { className: headerClasses },
30812
- React.createElement(DrawerHead, null,
30813
- React.createElement("div", { className: "pfext-quick-start-panel-content__title", tabIndex: -1, ref: titleRef },
30814
- React.createElement(Title, { headingLevel: "h2", size: "xl", className: "pfext-quick-start-panel-content__name", style: { marginRight: 'var(--pf-v5-global--spacer--md)' } },
30815
- React.createElement("span", { dangerouslySetInnerHTML: {
30816
- __html: removeParagraphWrap(markdownConvert(quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.displayName)),
30817
- } }),
30818
- ' ',
30819
- React.createElement("small", { className: "pfext-quick-start-panel-content__duration" }, (quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
30820
- ? getResource('{{type}} • {{duration, number}} minutes', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
30821
- .replace('{{duration, number}}', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
30822
- .replace('{{type}}', getResource('Type'))
30823
- : getResource('Type')))),
30824
- showClose && (React.createElement(DrawerActions, null,
30825
- React.createElement(DrawerCloseButton, { onClick: handleClose, className: "pfext-quick-start-panel-content__close-button", "data-testid": "qs-drawer-close" }))))),
30826
- React.createElement(DrawerPanelBody, { hasNoPadding: true, className: "pfext-quick-start-panel-content__body", "data-test": "content" },
30827
- React.createElement(QuickStartController, { quickStart: quickStart, nextQuickStarts: nextQuickStarts, footerClass: footerClass, contentRef: setContentRef })))) : null;
30828
- if (appendTo) {
30829
- return ReactDOM.createPortal(content, getElement(appendTo));
30830
- }
30831
- return content;
30832
- };
30833
-
30834
- const QuickStartContainer = (_a) => {
30835
- var { quickStarts, children, activeQuickStartID, allQuickStartStates, setActiveQuickStartID, setAllQuickStartStates, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress, resourceBundle, showCardFooters, useLegacyHeaderColors, language, loading = false, useQueryParams = true, markdown, contextProps, alwaysShowTaskReview = true } = _a, props = __rest(_a, ["quickStarts", "children", "activeQuickStartID", "allQuickStartStates", "setActiveQuickStartID", "setAllQuickStartStates", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress", "resourceBundle", "showCardFooters", "useLegacyHeaderColors", "language", "loading", "useQueryParams", "markdown", "contextProps", "alwaysShowTaskReview"]);
30836
- const valuesForQuickstartContext = useValuesForQuickStartContext(Object.assign({ allQuickStarts: quickStarts, activeQuickStartID,
30837
- setActiveQuickStartID,
30838
- allQuickStartStates,
30839
- setAllQuickStartStates, footer: {
30840
- show: showCardFooters,
30841
- }, useLegacyHeaderColors,
30842
- language, resourceBundle: Object.assign({}, resourceBundle), loading,
30843
- useQueryParams,
30844
- markdown,
30845
- alwaysShowTaskReview }, contextProps));
30846
- React.useEffect(() => {
30847
- if (quickStarts &&
30848
- JSON.stringify(quickStarts) !== JSON.stringify(valuesForQuickstartContext.allQuickStarts)) {
30849
- valuesForQuickstartContext.setAllQuickStarts(quickStarts);
30850
- }
30851
- }, [quickStarts, valuesForQuickstartContext]);
30852
- React.useEffect(() => {
30853
- if (loading !== valuesForQuickstartContext.loading) {
30854
- valuesForQuickstartContext.setLoading(loading);
30855
- }
30856
- }, [loading, valuesForQuickstartContext]);
30857
- const drawerProps = Object.assign({ appendTo,
30858
- fullWidth,
30859
- onCloseInProgress,
30860
- onCloseNotInProgress }, props);
30861
- return (React.createElement(QuickStartContext.Provider, { value: valuesForQuickstartContext },
30862
- React.createElement(QuickStartDrawer, Object.assign({}, drawerProps), children)));
30863
- };
30864
- const QuickStartDrawer = (_a) => {
30865
- var { quickStarts = [], children, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress } = _a, props = __rest(_a, ["quickStarts", "children", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress"]);
30866
- const { activeQuickStartID, setActiveQuickStart, allQuickStarts = [], activeQuickStartState, allQuickStartStates, setAllQuickStartStates, useLegacyHeaderColors, } = React.useContext(QuickStartContext);
30867
- const combinedQuickStarts = allQuickStarts.concat(quickStarts);
30868
- React.useEffect(() => {
30869
- const params = new URLSearchParams(window.location.search);
30870
- // if there is a quick start param, but the quick start is not active, set it
30871
- // this can happen if a new browser session is opened or an incognito window for example
30872
- const quickStartIdFromParam = params.get(QUICKSTART_ID_FILTER_KEY) || '';
30873
- if (quickStartIdFromParam && activeQuickStartID !== quickStartIdFromParam) {
30874
- const activeQuickStart = getQuickStartByName(quickStartIdFromParam, combinedQuickStarts);
30875
- // don't try to load a quick start that is actually just an external resource (spec.link)
30876
- if (combinedQuickStarts.length > 0 && activeQuickStart && !activeQuickStart.spec.link) {
30877
- setActiveQuickStart(quickStartIdFromParam);
30878
- }
30879
- }
30880
- }, [activeQuickStartID, combinedQuickStarts, setActiveQuickStart]);
30881
- React.useEffect(() => {
30882
- // If activeQuickStartID was changed through prop from QuickStartContainer, need to init the state if it does not exist yet
30883
- if (activeQuickStartID && !allQuickStartStates[activeQuickStartID]) {
30884
- setAllQuickStartStates(Object.assign(Object.assign({}, allQuickStartStates), { [activeQuickStartID]: getDefaultQuickStartState() }));
30885
- }
30886
- }, [activeQuickStartID, allQuickStartStates, setAllQuickStartStates]);
30887
- const [modalOpen, setModalOpen] = React.useState(false);
30888
- const activeQuickStartStatus = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.status;
30889
- const onClose = () => setActiveQuickStart('');
30890
- const handleClose = () => {
30891
- if (activeQuickStartStatus === QuickStartStatus.IN_PROGRESS) {
30892
- if (onCloseInProgress) {
30893
- onCloseInProgress();
30894
- }
30895
- else {
30896
- setModalOpen(true);
30897
- }
30898
- }
30899
- else if (onCloseNotInProgress) {
30900
- onCloseNotInProgress();
30901
- }
30902
- else {
30903
- onClose();
30904
- }
30905
- };
30906
- const onModalConfirm = () => {
30907
- setModalOpen(false);
30908
- onClose();
30909
- };
30910
- const onModalCancel = () => setModalOpen(false);
30911
- const fullWidthPanelStyle = fullWidth
30912
- ? {
30913
- style: {
30914
- flex: 1,
30915
- },
30916
- }
30917
- : {};
30918
- const fullWidthBodyStyle = fullWidth
30919
- ? {
30920
- style: {
30921
- display: activeQuickStartID ? 'none' : 'flex',
30922
- },
30923
- }
30924
- : {};
30925
- const panelContent = (React.createElement(QuickStartPanelContent, Object.assign({ quickStarts: combinedQuickStarts, handleClose: handleClose, activeQuickStartID: activeQuickStartID, appendTo: appendTo, isResizable: !fullWidth, headerVariant: useLegacyHeaderColors ? '' : 'blue-white' }, fullWidthPanelStyle)));
30926
- return (React.createElement(React.Fragment, null,
30927
- React.createElement(Drawer, Object.assign({ isExpanded: !!activeQuickStartID, isInline: true }, props), children ? (React.createElement(DrawerContent, Object.assign({ panelContent: panelContent }, fullWidthBodyStyle),
30928
- React.createElement(DrawerContentBody, { className: "pfext-quick-start-drawer__body" }, children))) : (React.createElement("div", { className: "pf-v5-c-drawer__main" }, panelContent))),
30929
- React.createElement(QuickStartCloseModal, { isOpen: modalOpen, onConfirm: onModalConfirm, onCancel: onModalCancel })));
30705
+ const QuickStartFooter = ({ status, taskNumber, totalTasks, onNext, onBack, footerClass, quickStartId, }) => {
30706
+ const { restartQuickStart, getResource } = React.useContext(QuickStartContext);
30707
+ const PrimaryButtonText = React.useMemo(() => ({
30708
+ START: getResource('Start'),
30709
+ CONTINUE: getResource('Continue'),
30710
+ NEXT: getResource('Next'),
30711
+ CLOSE: getResource('Close'),
30712
+ }), [getResource]);
30713
+ const SecondaryButtonText = React.useMemo(() => ({
30714
+ BACK: getResource('Back'),
30715
+ RESTART: getResource('Restart'),
30716
+ }), [getResource]);
30717
+ const onRestart = React.useCallback((e) => {
30718
+ e.preventDefault();
30719
+ e.stopPropagation();
30720
+ restartQuickStart(quickStartId, totalTasks);
30721
+ }, [quickStartId, restartQuickStart, totalTasks]);
30722
+ const getPrimaryButtonText = React.useMemo(() => {
30723
+ if (status === QuickStartStatus.NOT_STARTED) {
30724
+ return PrimaryButtonText.START;
30725
+ }
30726
+ if (taskNumber === totalTasks) {
30727
+ return PrimaryButtonText.CLOSE;
30728
+ }
30729
+ if (taskNumber > -1 && taskNumber < totalTasks) {
30730
+ return PrimaryButtonText.NEXT;
30731
+ }
30732
+ return PrimaryButtonText.CONTINUE;
30733
+ }, [taskNumber, totalTasks, PrimaryButtonText, status]);
30734
+ const getPrimaryButton = React.useMemo(() => (React.createElement(Button, { variant: "primary", className: "pfext-quick-start-footer__actionbtn", onClick: onNext, "data-testid": `qs-drawer-${camelize(getPrimaryButtonText)}`, "data-test": `${getPrimaryButtonText} button` }, getPrimaryButtonText)), [getPrimaryButtonText, onNext]);
30735
+ const getSecondaryButton = React.useMemo(() => taskNumber === -1 && status !== QuickStartStatus.NOT_STARTED ? (React.createElement(Button, { variant: "secondary", onClick: onRestart, "data-testid": "qs-drawer-restart" }, SecondaryButtonText.RESTART)) : (taskNumber > -1 && (React.createElement(Button, { variant: "secondary", onClick: onBack, "data-testid": "qs-drawer-back" }, SecondaryButtonText.BACK))), [onRestart, onBack, SecondaryButtonText, status, taskNumber]);
30736
+ const getSideNoteAction = React.useMemo(() => taskNumber !== -1 && (React.createElement(Button, { variant: "link", className: "pfext-quick-start-footer__restartbtn", onClick: onRestart, "data-testid": "qs-drawer-side-note-action" }, SecondaryButtonText.RESTART)), [taskNumber, onRestart, SecondaryButtonText.RESTART]);
30737
+ return (React.createElement("div", { className: `pfext-quick-start-footer ${footerClass}` },
30738
+ getPrimaryButton,
30739
+ getSecondaryButton,
30740
+ getSideNoteAction));
30741
+ };
30742
+
30743
+ const QuickStartController = ({ quickStart, nextQuickStarts, contentRef, footerClass, }) => {
30744
+ const { metadata: { name }, spec: { tasks = [] }, } = quickStart;
30745
+ const totalTasks = tasks === null || tasks === void 0 ? void 0 : tasks.length;
30746
+ const { activeQuickStartState, setActiveQuickStart, setQuickStartTaskNumber, setQuickStartTaskStatus, nextStep, previousStep, } = React.useContext(QuickStartContext);
30747
+ const status = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.status;
30748
+ const taskNumber = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.taskNumber;
30749
+ const allTaskStatuses = tasks.map((task, index) => activeQuickStartState[`taskStatus${index}`]);
30750
+ const handleQuickStartChange = React.useCallback((quickStartId) => setActiveQuickStart(quickStartId), [setActiveQuickStart]);
30751
+ const handleTaskStatusChange = React.useCallback((newTaskStatus) => setQuickStartTaskStatus(newTaskStatus), [setQuickStartTaskStatus]);
30752
+ const getQuickStartActiveTask = React.useCallback(() => {
30753
+ let activeTaskNumber = 0;
30754
+ while (activeTaskNumber !== totalTasks &&
30755
+ activeQuickStartState[`taskStatus${activeTaskNumber}`] !== QuickStartTaskStatus.INIT) {
30756
+ activeTaskNumber++;
30757
+ }
30758
+ return activeTaskNumber;
30759
+ }, [totalTasks, activeQuickStartState]);
30760
+ const handleQuickStartContinue = React.useCallback(() => {
30761
+ const activeTaskNumber = getQuickStartActiveTask();
30762
+ setQuickStartTaskNumber(name, activeTaskNumber);
30763
+ }, [getQuickStartActiveTask, setQuickStartTaskNumber, name]);
30764
+ const handleNext = React.useCallback(() => {
30765
+ if (status === QuickStartStatus.COMPLETE && taskNumber === totalTasks) {
30766
+ return handleQuickStartChange('');
30767
+ }
30768
+ if (status !== QuickStartStatus.NOT_STARTED && taskNumber === -1) {
30769
+ return handleQuickStartContinue();
30770
+ }
30771
+ return nextStep(totalTasks);
30772
+ }, [handleQuickStartChange, nextStep, status, taskNumber, totalTasks, handleQuickStartContinue]);
30773
+ const handleBack = React.useCallback(() => previousStep(), [previousStep]);
30774
+ const handleTaskSelect = React.useCallback((selectedTaskNumber) => {
30775
+ setQuickStartTaskNumber(name, selectedTaskNumber);
30776
+ }, [name, setQuickStartTaskNumber]);
30777
+ return (React.createElement(React.Fragment, null,
30778
+ React.createElement(QuickStartContent, { quickStart: quickStart, nextQuickStarts: nextQuickStarts, taskNumber: taskNumber, allTaskStatuses: allTaskStatuses, onTaskSelect: handleTaskSelect, onTaskReview: handleTaskStatusChange, onQuickStartChange: handleQuickStartChange, ref: contentRef }),
30779
+ React.createElement(QuickStartFooter, { status: status, taskNumber: taskNumber, totalTasks: totalTasks, onNext: handleNext, onBack: handleBack, footerClass: footerClass, quickStartId: quickStart.metadata.name })));
30780
+ };
30781
+
30782
+ const getElement = (appendTo) => {
30783
+ if (typeof appendTo === 'function') {
30784
+ return appendTo();
30785
+ }
30786
+ return appendTo;
30787
+ };
30788
+ const useScrollTopOnTaskNumberChange = (node, taskNumber) => {
30789
+ React.useEffect(() => {
30790
+ if (node) {
30791
+ node.scrollTo({ top: 0, behavior: 'smooth' });
30792
+ }
30793
+ }, [taskNumber, node]);
30794
+ };
30795
+ const QuickStartPanelContent = (_a) => {
30796
+ var { quickStarts = [], handleClose, activeQuickStartID, appendTo, isResizable = true, showClose = true, headerVariant = '' } = _a, props = __rest(_a, ["quickStarts", "handleClose", "activeQuickStartID", "appendTo", "isResizable", "showClose", "headerVariant"]);
30797
+ const titleRef = React.useRef(null);
30798
+ const { getResource, activeQuickStartState } = React.useContext(QuickStartContext);
30799
+ const [contentRef, setContentRef] = React.useState();
30800
+ const shadows = useScrollShadows(contentRef);
30801
+ const quickStart = quickStarts.find((qs) => qs.metadata.name === activeQuickStartID);
30802
+ const taskNumber = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.taskNumber;
30803
+ useScrollTopOnTaskNumberChange(contentRef, taskNumber);
30804
+ const nextQuickStarts = quickStarts.filter((qs) => { var _a; return (_a = quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.nextQuickStart) === null || _a === void 0 ? void 0 : _a.includes(qs.metadata.name); });
30805
+ const headerClasses = css('pfext-quick-start-panel-content__header', {
30806
+ 'pfext-quick-start-panel-content__header__shadow': shadows === Shadows.top || shadows === Shadows.both,
30807
+ 'pfext-quick-start-panel-content__header--blue-white': headerVariant === 'blue-white',
30808
+ });
30809
+ const footerClass = css({
30810
+ 'pfext-quick-start-panel-content__footer__shadow': shadows === Shadows.bottom || shadows === Shadows.both,
30811
+ });
30812
+ const getStep = () => {
30813
+ const tasks = quickStart.spec.tasks.length;
30814
+ if (Number.parseInt(taskNumber) === -1) {
30815
+ return 'intro';
30816
+ }
30817
+ if (Number.parseInt(taskNumber) === tasks) {
30818
+ return 'conclusion';
30819
+ }
30820
+ return Number.parseInt(taskNumber) + 1;
30821
+ };
30822
+ React.useEffect(() => {
30823
+ if (quickStart) {
30824
+ titleRef.current.focus();
30825
+ }
30826
+ }, [quickStart]);
30827
+ const content = quickStart ? (React.createElement(DrawerPanelContent, Object.assign({ isResizable: isResizable, className: "pfext-quick-start__base", "data-testid": `qs-drawer-${camelize(quickStart.spec.displayName)}`, "data-qs": `qs-step-${getStep()}`, "data-test": "quickstart drawer" }, props),
30828
+ React.createElement("div", { className: headerClasses },
30829
+ React.createElement(DrawerHead, null,
30830
+ React.createElement("div", { className: "pfext-quick-start-panel-content__title", tabIndex: -1, ref: titleRef },
30831
+ React.createElement(Title, { headingLevel: "h2", size: "xl", className: "pfext-quick-start-panel-content__name", style: { marginRight: 'var(--pf-v5-global--spacer--md)' } },
30832
+ React.createElement("span", { dangerouslySetInnerHTML: {
30833
+ __html: removeParagraphWrap(markdownConvert(quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.displayName)),
30834
+ } }),
30835
+ ' ',
30836
+ React.createElement("small", { className: "pfext-quick-start-panel-content__duration" }, (quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
30837
+ ? getResource('{{type}} • {{duration, number}} minutes', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
30838
+ .replace('{{duration, number}}', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
30839
+ .replace('{{type}}', getResource('Type'))
30840
+ : getResource('Type')))),
30841
+ showClose && (React.createElement(DrawerActions, null,
30842
+ React.createElement(DrawerCloseButton, { onClick: handleClose, className: "pfext-quick-start-panel-content__close-button", "data-testid": "qs-drawer-close" }))))),
30843
+ React.createElement(DrawerPanelBody, { hasNoPadding: true, className: "pfext-quick-start-panel-content__body", "data-test": "content" },
30844
+ React.createElement(QuickStartController, { quickStart: quickStart, nextQuickStarts: nextQuickStarts, footerClass: footerClass, contentRef: setContentRef })))) : null;
30845
+ if (appendTo) {
30846
+ return ReactDOM.createPortal(content, getElement(appendTo));
30847
+ }
30848
+ return content;
30849
+ };
30850
+
30851
+ const QuickStartContainer = (_a) => {
30852
+ var { quickStarts, children, activeQuickStartID, allQuickStartStates, setActiveQuickStartID, setAllQuickStartStates, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress, resourceBundle, showCardFooters, useLegacyHeaderColors, language, loading = false, useQueryParams = true, markdown, contextProps, alwaysShowTaskReview = true } = _a, props = __rest(_a, ["quickStarts", "children", "activeQuickStartID", "allQuickStartStates", "setActiveQuickStartID", "setAllQuickStartStates", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress", "resourceBundle", "showCardFooters", "useLegacyHeaderColors", "language", "loading", "useQueryParams", "markdown", "contextProps", "alwaysShowTaskReview"]);
30853
+ const valuesForQuickstartContext = useValuesForQuickStartContext(Object.assign({ allQuickStarts: quickStarts, activeQuickStartID,
30854
+ setActiveQuickStartID,
30855
+ allQuickStartStates,
30856
+ setAllQuickStartStates, footer: {
30857
+ show: showCardFooters,
30858
+ }, useLegacyHeaderColors,
30859
+ language, resourceBundle: Object.assign({}, resourceBundle), loading,
30860
+ useQueryParams,
30861
+ markdown,
30862
+ alwaysShowTaskReview }, contextProps));
30863
+ React.useEffect(() => {
30864
+ if (quickStarts &&
30865
+ JSON.stringify(quickStarts) !== JSON.stringify(valuesForQuickstartContext.allQuickStarts)) {
30866
+ valuesForQuickstartContext.setAllQuickStarts(quickStarts);
30867
+ }
30868
+ }, [quickStarts, valuesForQuickstartContext]);
30869
+ React.useEffect(() => {
30870
+ if (loading !== valuesForQuickstartContext.loading) {
30871
+ valuesForQuickstartContext.setLoading(loading);
30872
+ }
30873
+ }, [loading, valuesForQuickstartContext]);
30874
+ const drawerProps = Object.assign({ appendTo,
30875
+ fullWidth,
30876
+ onCloseInProgress,
30877
+ onCloseNotInProgress }, props);
30878
+ return (React.createElement(QuickStartContext.Provider, { value: valuesForQuickstartContext },
30879
+ React.createElement(QuickStartDrawer, Object.assign({}, drawerProps), children)));
30880
+ };
30881
+ const QuickStartDrawer = (_a) => {
30882
+ var { quickStarts = [], children, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress } = _a, props = __rest(_a, ["quickStarts", "children", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress"]);
30883
+ const { activeQuickStartID, setActiveQuickStart, allQuickStarts = [], activeQuickStartState, allQuickStartStates, setAllQuickStartStates, useLegacyHeaderColors, } = React.useContext(QuickStartContext);
30884
+ const combinedQuickStarts = allQuickStarts.concat(quickStarts);
30885
+ React.useEffect(() => {
30886
+ const params = new URLSearchParams(window.location.search);
30887
+ // if there is a quick start param, but the quick start is not active, set it
30888
+ // this can happen if a new browser session is opened or an incognito window for example
30889
+ const quickStartIdFromParam = params.get(QUICKSTART_ID_FILTER_KEY) || '';
30890
+ if (quickStartIdFromParam && activeQuickStartID !== quickStartIdFromParam) {
30891
+ const activeQuickStart = getQuickStartByName(quickStartIdFromParam, combinedQuickStarts);
30892
+ // don't try to load a quick start that is actually just an external resource (spec.link)
30893
+ if (combinedQuickStarts.length > 0 && activeQuickStart && !activeQuickStart.spec.link) {
30894
+ setActiveQuickStart(quickStartIdFromParam);
30895
+ }
30896
+ }
30897
+ }, [activeQuickStartID, combinedQuickStarts, setActiveQuickStart]);
30898
+ React.useEffect(() => {
30899
+ // If activeQuickStartID was changed through prop from QuickStartContainer, need to init the state if it does not exist yet
30900
+ if (activeQuickStartID && !allQuickStartStates[activeQuickStartID]) {
30901
+ setAllQuickStartStates(Object.assign(Object.assign({}, allQuickStartStates), { [activeQuickStartID]: getDefaultQuickStartState() }));
30902
+ }
30903
+ }, [activeQuickStartID, allQuickStartStates, setAllQuickStartStates]);
30904
+ const [modalOpen, setModalOpen] = React.useState(false);
30905
+ const activeQuickStartStatus = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.status;
30906
+ const onClose = () => setActiveQuickStart('');
30907
+ const handleClose = () => {
30908
+ if (activeQuickStartStatus === QuickStartStatus.IN_PROGRESS) {
30909
+ if (onCloseInProgress) {
30910
+ onCloseInProgress();
30911
+ }
30912
+ else {
30913
+ setModalOpen(true);
30914
+ }
30915
+ }
30916
+ else if (onCloseNotInProgress) {
30917
+ onCloseNotInProgress();
30918
+ }
30919
+ else {
30920
+ onClose();
30921
+ }
30922
+ };
30923
+ const onModalConfirm = () => {
30924
+ setModalOpen(false);
30925
+ onClose();
30926
+ };
30927
+ const onModalCancel = () => setModalOpen(false);
30928
+ const fullWidthPanelStyle = fullWidth
30929
+ ? {
30930
+ style: {
30931
+ flex: 1,
30932
+ },
30933
+ }
30934
+ : {};
30935
+ const fullWidthBodyStyle = fullWidth
30936
+ ? {
30937
+ style: {
30938
+ display: activeQuickStartID ? 'none' : 'flex',
30939
+ },
30940
+ }
30941
+ : {};
30942
+ const panelContent = (React.createElement(QuickStartPanelContent, Object.assign({ quickStarts: combinedQuickStarts, handleClose: handleClose, activeQuickStartID: activeQuickStartID, appendTo: appendTo, isResizable: !fullWidth, headerVariant: useLegacyHeaderColors ? '' : 'blue-white' }, fullWidthPanelStyle)));
30943
+ return (React.createElement(React.Fragment, null,
30944
+ React.createElement(Drawer, Object.assign({ isExpanded: !!activeQuickStartID, isInline: true }, props), children ? (React.createElement(DrawerContent, Object.assign({ panelContent: panelContent }, fullWidthBodyStyle),
30945
+ React.createElement(DrawerContentBody, { className: "pfext-quick-start-drawer__body" }, children))) : (React.createElement("div", { className: "pf-v5-c-drawer__main" }, panelContent))),
30946
+ React.createElement(QuickStartCloseModal, { isOpen: modalOpen, onConfirm: onModalConfirm, onCancel: onModalCancel })));
30930
30947
  };
30931
30948
 
30932
30949
  var barsIcon = createCommonjsModule(function (module, exports) {
@@ -30945,242 +30962,242 @@ exports["default"] = exports.BarsIcon;
30945
30962
 
30946
30963
  var BarsIcon = /*@__PURE__*/getDefaultExportFromCjs(barsIcon);
30947
30964
 
30948
- const HelpTopicContextDefaults = {
30949
- helpTopics: [],
30950
- setHelpTopics: () => { },
30951
- activeHelpTopic: null,
30952
- setActiveHelpTopicByName: () => { },
30953
- filteredHelpTopics: [],
30954
- setFilteredHelpTopics: () => { },
30955
- loading: false,
30956
- };
30957
- const HelpTopicContext = React__default.createContext(HelpTopicContextDefaults);
30958
- const useValuesForHelpTopicContext = (value = {}) => {
30959
- const combinedValue = Object.assign(Object.assign({}, HelpTopicContextDefaults), value);
30960
- const [loading, setLoading] = React__default.useState(combinedValue.loading);
30961
- // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
30962
- const [helpTopics, setHelpTopics] = React__default.useState(combinedValue.helpTopics || []);
30963
- const [activeHelpTopic, setActiveHelpTopic] = React__default.useState(combinedValue.activeHelpTopic || null);
30964
- const setActiveHelpTopicByName = React__default.useCallback((helpTopicName) => {
30965
- const topic = helpTopics.find((t) => t.name === helpTopicName);
30966
- if (!helpTopicName) {
30967
- setActiveHelpTopic(null);
30968
- return;
30969
- }
30970
- setActiveHelpTopic(topic);
30971
- }, [helpTopics]);
30972
- const [filteredHelpTopics, setFilteredHelpTopics] = React__default.useState(combinedValue.filteredHelpTopics || []);
30973
- return {
30974
- helpTopics,
30975
- setHelpTopics,
30976
- activeHelpTopic,
30977
- setActiveHelpTopicByName,
30978
- filteredHelpTopics,
30979
- setFilteredHelpTopics,
30980
- loading,
30981
- setLoading,
30982
- };
30965
+ const HelpTopicContextDefaults = {
30966
+ helpTopics: [],
30967
+ setHelpTopics: () => { },
30968
+ activeHelpTopic: null,
30969
+ setActiveHelpTopicByName: () => { },
30970
+ filteredHelpTopics: [],
30971
+ setFilteredHelpTopics: () => { },
30972
+ loading: false,
30973
+ };
30974
+ const HelpTopicContext = React__default.createContext(HelpTopicContextDefaults);
30975
+ const useValuesForHelpTopicContext = (value = {}) => {
30976
+ const combinedValue = Object.assign(Object.assign({}, HelpTopicContextDefaults), value);
30977
+ const [loading, setLoading] = React__default.useState(combinedValue.loading);
30978
+ // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars
30979
+ const [helpTopics, setHelpTopics] = React__default.useState(combinedValue.helpTopics || []);
30980
+ const [activeHelpTopic, setActiveHelpTopic] = React__default.useState(combinedValue.activeHelpTopic || null);
30981
+ const setActiveHelpTopicByName = React__default.useCallback((helpTopicName) => {
30982
+ const topic = helpTopics.find((t) => t.name === helpTopicName);
30983
+ if (!helpTopicName) {
30984
+ setActiveHelpTopic(null);
30985
+ return;
30986
+ }
30987
+ setActiveHelpTopic(topic);
30988
+ }, [helpTopics]);
30989
+ const [filteredHelpTopics, setFilteredHelpTopics] = React__default.useState(combinedValue.filteredHelpTopics || []);
30990
+ return {
30991
+ helpTopics,
30992
+ setHelpTopics,
30993
+ activeHelpTopic,
30994
+ setActiveHelpTopicByName,
30995
+ filteredHelpTopics,
30996
+ setFilteredHelpTopics,
30997
+ loading,
30998
+ setLoading,
30999
+ };
30983
31000
  };
30984
31001
 
30985
- const HelpTopicPanelContent = (_a) => {
30986
- var _b, _c;
30987
- var { activeHelpTopic = null, filteredHelpTopics = [], isResizable = true, onClose } = _a, props = __rest(_a, ["activeHelpTopic", "filteredHelpTopics", "isResizable", "onClose"]);
30988
- const { setActiveHelpTopicByName } = React.useContext(HelpTopicContext);
30989
- const [isHelpTopicMenuOpen, setIsHelpTopicMenuOpen] = React.useState(false);
30990
- const toggleHelpTopicMenu = () => {
30991
- setIsHelpTopicMenuOpen(!isHelpTopicMenuOpen);
30992
- };
30993
- const onSelectHelpTopic = (_event, value) => {
30994
- const topicName = value;
30995
- setActiveHelpTopicByName(topicName.toString());
30996
- toggleHelpTopicMenu();
30997
- };
30998
- const helpTopicOptions = filteredHelpTopics.length > 1 &&
30999
- filteredHelpTopics.map((topic) => (React.createElement(SelectOption, { key: topic.name, value: topic.name }, topic.title)));
31000
- const paddingContainer = (children) => React.createElement("div", { style: { padding: '24px' } }, children);
31001
- const panelBodyItems = (React.createElement(React.Fragment, null,
31002
- paddingContainer(React.createElement(QuickStartMarkdownView, { content: activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.content })),
31003
- !!((_b = activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.links) === null || _b === void 0 ? void 0 : _b.length) && React.createElement(Divider, null),
31004
- paddingContainer(React.createElement(Stack, { hasGutter: true }, (_c = activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.links) === null || _c === void 0 ? void 0 : _c.map(({ href, text, newTab, isExternal }, index) => (React.createElement(StackItem, { key: index },
31005
- React.createElement(Button, { component: "a", href: href, target: newTab ? '_blank' : '', rel: "noopener noreferrer", variant: "link", "aria-label": `Open documentation in new window`, isInline: true, icon: isExternal ? React.createElement(ExternalLinkAltIcon, null) : null, iconPosition: "right", style: { fontSize: 'inherit' } }, text || href))))))));
31006
- const content = (React.createElement(DrawerPanelContent, Object.assign({ isResizable: isResizable, className: "pfext-quick-start__base" }, props),
31007
- React.createElement("div", null,
31008
- React.createElement(DrawerHead, null,
31009
- React.createElement("div", { className: "pfext-quick-start-panel-content__title" },
31010
- helpTopicOptions && (React.createElement(Select, { isPlain: true, id: "help-topics-select", selected: activeHelpTopic, isOpen: isHelpTopicMenuOpen, onSelect: onSelectHelpTopic, onOpenChange: (isOpen) => setIsHelpTopicMenuOpen(isOpen), toggle: (toggleRef) => (React.createElement(MenuToggle, { isFullWidth: true, ref: toggleRef, icon: React.createElement(BarsIcon, null), onClick: toggleHelpTopicMenu, isExpanded: isHelpTopicMenuOpen }, activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.title)) },
31011
- React.createElement(SelectList, null, helpTopicOptions))),
31012
- React.createElement(Title, { headingLevel: "h1", size: "xl", className: "pfext-quick-start-panel-content__name", style: { marginRight: 'var(--pf-v5-global--spacer--md)' } }, activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.title)),
31013
- React.createElement(DrawerActions, null,
31014
- React.createElement(DrawerCloseButton, { onClick: onClose, className: "pfext-quick-start-panel-content__close-button", "data-testid": "qs-drawer-close" }))),
31015
- React.createElement(Divider, null),
31016
- React.createElement(DrawerPanelBody, { hasNoPadding: true, className: "pfext-quick-start-panel-content__body", "data-test": "content" }, panelBodyItems))));
31017
- return content;
31018
- };
31019
-
31020
- const HelpTopicContainer = (_a) => {
31021
- var { helpTopics, children, resourceBundle, language, loading = false, markdown, contextProps } = _a, props = __rest(_a, ["helpTopics", "children", "resourceBundle", "language", "loading", "markdown", "contextProps"]);
31022
- const valuesForHelpTopicContext = useValuesForHelpTopicContext(Object.assign({ helpTopics,
31023
- language, resourceBundle: Object.assign({}, resourceBundle), loading,
31024
- markdown }, contextProps));
31025
- React.useEffect(() => {
31026
- if (loading !== valuesForHelpTopicContext.loading) {
31027
- valuesForHelpTopicContext.setLoading(loading);
31028
- }
31029
- }, [loading, valuesForHelpTopicContext]);
31030
- React.useEffect(() => {
31031
- if (helpTopics &&
31032
- JSON.stringify(helpTopics) !== JSON.stringify(valuesForHelpTopicContext.helpTopics)) {
31033
- valuesForHelpTopicContext.setHelpTopics(helpTopics);
31034
- }
31035
- }, [helpTopics, valuesForHelpTopicContext]);
31036
- return (React.createElement(HelpTopicContext.Provider, { value: valuesForHelpTopicContext },
31037
- React.createElement(HelpTopicDrawer, Object.assign({}, props), children)));
31038
- };
31039
- const HelpTopicDrawer = (_a) => {
31040
- var { children } = _a, props = __rest(_a, ["children"]);
31041
- const { activeHelpTopic, filteredHelpTopics, setActiveHelpTopicByName } = React.useContext(HelpTopicContext);
31042
- const onClose = () => {
31043
- setActiveHelpTopicByName('');
31044
- };
31045
- const panelContent = (React.createElement(HelpTopicPanelContent, { activeHelpTopic: activeHelpTopic, filteredHelpTopics: filteredHelpTopics, onClose: onClose }));
31046
- return (React.createElement(React.Fragment, null,
31047
- React.createElement(Drawer, Object.assign({ isExpanded: !!activeHelpTopic, isInline: true }, props), children ? (React.createElement(DrawerContent, { panelContent: panelContent },
31048
- React.createElement(DrawerContentBody, { className: "pfext-quick-start-drawer__body" }, children))) : (React.createElement("div", { className: "pf-v5-c-drawer__main" }, panelContent)))));
31002
+ const HelpTopicPanelContent = (_a) => {
31003
+ var _b, _c;
31004
+ var { activeHelpTopic = null, filteredHelpTopics = [], isResizable = true, onClose } = _a, props = __rest(_a, ["activeHelpTopic", "filteredHelpTopics", "isResizable", "onClose"]);
31005
+ const { setActiveHelpTopicByName } = React.useContext(HelpTopicContext);
31006
+ const [isHelpTopicMenuOpen, setIsHelpTopicMenuOpen] = React.useState(false);
31007
+ const toggleHelpTopicMenu = () => {
31008
+ setIsHelpTopicMenuOpen(!isHelpTopicMenuOpen);
31009
+ };
31010
+ const onSelectHelpTopic = (_event, value) => {
31011
+ const topicName = value;
31012
+ setActiveHelpTopicByName(topicName.toString());
31013
+ toggleHelpTopicMenu();
31014
+ };
31015
+ const helpTopicOptions = filteredHelpTopics.length > 1 &&
31016
+ filteredHelpTopics.map((topic) => (React.createElement(SelectOption, { key: topic.name, value: topic.name }, topic.title)));
31017
+ const paddingContainer = (children) => React.createElement("div", { style: { padding: '24px' } }, children);
31018
+ const panelBodyItems = (React.createElement(React.Fragment, null,
31019
+ paddingContainer(React.createElement(QuickStartMarkdownView, { content: activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.content })),
31020
+ !!((_b = activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.links) === null || _b === void 0 ? void 0 : _b.length) && React.createElement(Divider, null),
31021
+ paddingContainer(React.createElement(Stack, { hasGutter: true }, (_c = activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.links) === null || _c === void 0 ? void 0 : _c.map(({ href, text, newTab, isExternal }, index) => (React.createElement(StackItem, { key: index },
31022
+ React.createElement(Button, { component: "a", href: href, target: newTab ? '_blank' : '', rel: "noopener noreferrer", variant: "link", "aria-label": `Open documentation in new window`, isInline: true, icon: isExternal ? React.createElement(ExternalLinkAltIcon, null) : null, iconPosition: "right", style: { fontSize: 'inherit' } }, text || href))))))));
31023
+ const content = (React.createElement(DrawerPanelContent, Object.assign({ isResizable: isResizable, className: "pfext-quick-start__base" }, props),
31024
+ React.createElement("div", null,
31025
+ React.createElement(DrawerHead, null,
31026
+ React.createElement("div", { className: "pfext-quick-start-panel-content__title" },
31027
+ helpTopicOptions && (React.createElement(Select, { isPlain: true, id: "help-topics-select", selected: activeHelpTopic, isOpen: isHelpTopicMenuOpen, onSelect: onSelectHelpTopic, onOpenChange: (isOpen) => setIsHelpTopicMenuOpen(isOpen), toggle: (toggleRef) => (React.createElement(MenuToggle, { isFullWidth: true, ref: toggleRef, icon: React.createElement(BarsIcon, null), onClick: toggleHelpTopicMenu, isExpanded: isHelpTopicMenuOpen }, activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.title)) },
31028
+ React.createElement(SelectList, null, helpTopicOptions))),
31029
+ React.createElement(Title, { headingLevel: "h1", size: "xl", className: "pfext-quick-start-panel-content__name", style: { marginRight: 'var(--pf-v5-global--spacer--md)' } }, activeHelpTopic === null || activeHelpTopic === void 0 ? void 0 : activeHelpTopic.title)),
31030
+ React.createElement(DrawerActions, null,
31031
+ React.createElement(DrawerCloseButton, { onClick: onClose, className: "pfext-quick-start-panel-content__close-button", "data-testid": "qs-drawer-close" }))),
31032
+ React.createElement(Divider, null),
31033
+ React.createElement(DrawerPanelBody, { hasNoPadding: true, className: "pfext-quick-start-panel-content__body", "data-test": "content" }, panelBodyItems))));
31034
+ return content;
31035
+ };
31036
+
31037
+ const HelpTopicContainer = (_a) => {
31038
+ var { helpTopics, children, resourceBundle, language, loading = false, markdown, contextProps } = _a, props = __rest(_a, ["helpTopics", "children", "resourceBundle", "language", "loading", "markdown", "contextProps"]);
31039
+ const valuesForHelpTopicContext = useValuesForHelpTopicContext(Object.assign({ helpTopics,
31040
+ language, resourceBundle: Object.assign({}, resourceBundle), loading,
31041
+ markdown }, contextProps));
31042
+ React.useEffect(() => {
31043
+ if (loading !== valuesForHelpTopicContext.loading) {
31044
+ valuesForHelpTopicContext.setLoading(loading);
31045
+ }
31046
+ }, [loading, valuesForHelpTopicContext]);
31047
+ React.useEffect(() => {
31048
+ if (helpTopics &&
31049
+ JSON.stringify(helpTopics) !== JSON.stringify(valuesForHelpTopicContext.helpTopics)) {
31050
+ valuesForHelpTopicContext.setHelpTopics(helpTopics);
31051
+ }
31052
+ }, [helpTopics, valuesForHelpTopicContext]);
31053
+ return (React.createElement(HelpTopicContext.Provider, { value: valuesForHelpTopicContext },
31054
+ React.createElement(HelpTopicDrawer, Object.assign({}, props), children)));
31055
+ };
31056
+ const HelpTopicDrawer = (_a) => {
31057
+ var { children } = _a, props = __rest(_a, ["children"]);
31058
+ const { activeHelpTopic, filteredHelpTopics, setActiveHelpTopicByName } = React.useContext(HelpTopicContext);
31059
+ const onClose = () => {
31060
+ setActiveHelpTopicByName('');
31061
+ };
31062
+ const panelContent = (React.createElement(HelpTopicPanelContent, { activeHelpTopic: activeHelpTopic, filteredHelpTopics: filteredHelpTopics, onClose: onClose }));
31063
+ return (React.createElement(React.Fragment, null,
31064
+ React.createElement(Drawer, Object.assign({ isExpanded: !!activeHelpTopic, isInline: true }, props), children ? (React.createElement(DrawerContent, { panelContent: panelContent },
31065
+ React.createElement(DrawerContentBody, { className: "pfext-quick-start-drawer__body" }, children))) : (React.createElement("div", { className: "pf-v5-c-drawer__main" }, panelContent)))));
31049
31066
  };
31050
31067
 
31051
- const useLocalStorage = (key, initialValue) => {
31052
- // State to store our value
31053
- // Pass initial state function to useState so logic is only executed once
31054
- const [storedValue, setStoredValue] = useState(() => {
31055
- try {
31056
- // Get from local storage by key
31057
- const item = window.localStorage.getItem(key);
31058
- // Parse stored json or if none return initialValue
31059
- return item ? JSON.parse(item) : initialValue;
31060
- }
31061
- catch (error) {
31062
- // If error also return initialValue
31063
- // eslint-disable-next-line no-console
31064
- console.log(error);
31065
- return initialValue;
31066
- }
31067
- });
31068
- // Return a wrapped version of useState's setter function that ...
31069
- // ... persists the new value to localStorage.
31070
- const setValue = (value) => {
31071
- try {
31072
- // Allow value to be a function so we have same API as useState
31073
- const valueToStore = value instanceof Function ? value(storedValue) : value;
31074
- // Save state
31075
- setStoredValue(valueToStore);
31076
- // Save to local storage
31077
- window.localStorage.setItem(key, JSON.stringify(valueToStore));
31078
- }
31079
- catch (error) {
31080
- // A more advanced implementation would handle the error case
31081
- // eslint-disable-next-line no-console
31082
- console.log(error);
31083
- }
31084
- };
31085
- return [storedValue, setValue];
31068
+ const useLocalStorage = (key, initialValue) => {
31069
+ // State to store our value
31070
+ // Pass initial state function to useState so logic is only executed once
31071
+ const [storedValue, setStoredValue] = useState(() => {
31072
+ try {
31073
+ // Get from local storage by key
31074
+ const item = window.localStorage.getItem(key);
31075
+ // Parse stored json or if none return initialValue
31076
+ return item ? JSON.parse(item) : initialValue;
31077
+ }
31078
+ catch (error) {
31079
+ // If error also return initialValue
31080
+ // eslint-disable-next-line no-console
31081
+ console.log(error);
31082
+ return initialValue;
31083
+ }
31084
+ });
31085
+ // Return a wrapped version of useState's setter function that ...
31086
+ // ... persists the new value to localStorage.
31087
+ const setValue = (value) => {
31088
+ try {
31089
+ // Allow value to be a function so we have same API as useState
31090
+ const valueToStore = value instanceof Function ? value(storedValue) : value;
31091
+ // Save state
31092
+ setStoredValue(valueToStore);
31093
+ // Save to local storage
31094
+ window.localStorage.setItem(key, JSON.stringify(valueToStore));
31095
+ }
31096
+ catch (error) {
31097
+ // A more advanced implementation would handle the error case
31098
+ // eslint-disable-next-line no-console
31099
+ console.log(error);
31100
+ }
31101
+ };
31102
+ return [storedValue, setValue];
31086
31103
  };
31087
31104
 
31088
- /* eslint-disable */
31089
- // Brought in from dev to publish this with QS module
31090
- // Dev now imports from here
31091
- const ProcQuickStartParser = (quickStart, environmentVariables) => {
31092
- var _a;
31093
- const replaceEnvironmentVariables = (s) => s === null || s === void 0 ? void 0 : s.replace(/\${(\w+)}/, (substring, name) => {
31094
- return environmentVariables ? ([name] ? environmentVariables[name] : substring) : substring;
31095
- });
31096
- quickStart.spec.tasks = (_a = quickStart.spec.tasks) === null || _a === void 0 ? void 0 : _a.map((task, index) => {
31097
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
31098
- let proc;
31099
- let answer;
31100
- if (typeof task === 'string') {
31101
- proc = task;
31102
- answer = {};
31103
- }
31104
- else {
31105
- proc = task.proc;
31106
- answer = task;
31107
- delete task.proc;
31108
- }
31109
- let description = '', procedure, verification, title, summaryFailed, success, reviewFailed, prerequisites;
31110
- if (proc) {
31111
- const taskDOM = document.createElement('div');
31112
- taskDOM.innerHTML = proc;
31113
- // remove the screencapture images
31114
- taskDOM.querySelectorAll('.imageblock.screencapture').forEach((node) => {
31115
- var _a;
31116
- (_a = node.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(node);
31117
- });
31118
- title = (_a = taskDOM
31119
- .querySelector('h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child')) === null || _a === void 0 ? void 0 : _a.innerHTML.trim();
31120
- let sectionBody = taskDOM.querySelector('.sectionbody');
31121
- if (!(sectionBody === null || sectionBody === void 0 ? void 0 : sectionBody.hasChildNodes())) {
31122
- // possibly in other templates, where we want to look for article
31123
- sectionBody = taskDOM.querySelector('article');
31124
- }
31125
- if (sectionBody) {
31126
- for (let i = 0; i < sectionBody.children.length || 0; i++) {
31127
- /**
31128
- child typically looks like:
31105
+ /* eslint-disable */
31106
+ // Brought in from dev to publish this with QS module
31107
+ // Dev now imports from here
31108
+ const ProcQuickStartParser = (quickStart, environmentVariables) => {
31109
+ var _a;
31110
+ const replaceEnvironmentVariables = (s) => s === null || s === void 0 ? void 0 : s.replace(/\${(\w+)}/, (substring, name) => {
31111
+ return environmentVariables ? ([name] ? environmentVariables[name] : substring) : substring;
31112
+ });
31113
+ quickStart.spec.tasks = (_a = quickStart.spec.tasks) === null || _a === void 0 ? void 0 : _a.map((task, index) => {
31114
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
31115
+ let proc;
31116
+ let answer;
31117
+ if (typeof task === 'string') {
31118
+ proc = task;
31119
+ answer = {};
31120
+ }
31121
+ else {
31122
+ proc = task.proc;
31123
+ answer = task;
31124
+ delete task.proc;
31125
+ }
31126
+ let description = '', procedure, verification, title, summaryFailed, success, reviewFailed, prerequisites;
31127
+ if (proc) {
31128
+ const taskDOM = document.createElement('div');
31129
+ taskDOM.innerHTML = proc;
31130
+ // remove the screencapture images
31131
+ taskDOM.querySelectorAll('.imageblock.screencapture').forEach((node) => {
31132
+ var _a;
31133
+ (_a = node.parentElement) === null || _a === void 0 ? void 0 : _a.removeChild(node);
31134
+ });
31135
+ title = (_a = taskDOM
31136
+ .querySelector('h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child')) === null || _a === void 0 ? void 0 : _a.innerHTML.trim();
31137
+ let sectionBody = taskDOM.querySelector('.sectionbody');
31138
+ if (!(sectionBody === null || sectionBody === void 0 ? void 0 : sectionBody.hasChildNodes())) {
31139
+ // possibly in other templates, where we want to look for article
31140
+ sectionBody = taskDOM.querySelector('article');
31141
+ }
31142
+ if (sectionBody) {
31143
+ for (let i = 0; i < sectionBody.children.length || 0; i++) {
31144
+ /**
31145
+ child typically looks like:
31129
31146
 
31130
- <div class="paragraph|olist|ulist|admonitionblock">
31131
- <div class="title">Procedure|Prerequisites|Verification|Note|Warning</div>
31132
- <ol|ul class="arabic">
31133
- <li>
31134
- <li>...
31135
- </ol|ul>
31136
- </div>
31147
+ <div class="paragraph|olist|ulist|admonitionblock">
31148
+ <div class="title">Procedure|Prerequisites|Verification|Note|Warning</div>
31149
+ <ol|ul class="arabic">
31150
+ <li>
31151
+ <li>...
31152
+ </ol|ul>
31153
+ </div>
31137
31154
 
31138
- And the below code extracts the <ol> or <ul>
31139
- Except for when there is no <div class="title|heading"/>, then the description is extracted
31140
- in the else if below
31141
- */
31142
- const child = sectionBody.children.item(i);
31143
- // find the title
31144
- const sectionTitle = child === null || child === void 0 ? void 0 : child.querySelector('.heading,.title');
31145
- // should this section be assigned to a specific section
31146
- const sectionTitleText = (_b = sectionTitle === null || sectionTitle === void 0 ? void 0 : sectionTitle.textContent) === null || _b === void 0 ? void 0 : _b.trim();
31147
- const isKnownSection = ['Procedure', 'Verification', 'Prerequisites'].includes((_c = sectionTitle === null || sectionTitle === void 0 ? void 0 : sectionTitle.textContent) === null || _c === void 0 ? void 0 : _c.trim());
31148
- if (isKnownSection) {
31149
- switch (sectionTitleText) {
31150
- case 'Procedure':
31151
- procedure = (_d = child === null || child === void 0 ? void 0 : child.querySelector(':not(.heading):not(.title)')) === null || _d === void 0 ? void 0 : _d.outerHTML.trim();
31152
- break;
31153
- case 'Verification':
31154
- verification = (_e = child === null || child === void 0 ? void 0 : child.querySelector(':not(.heading):not(.title)')) === null || _e === void 0 ? void 0 : _e.outerHTML.trim();
31155
- break;
31156
- case 'Prerequisites':
31157
- prerequisites = (_f = child === null || child === void 0 ? void 0 : child.querySelector(':not(.heading):not(.title)')) === null || _f === void 0 ? void 0 : _f.outerHTML.trim();
31158
- break;
31159
- }
31160
- }
31161
- else if (!procedure) {
31162
- // Otherwise if it comes before a procedure it's part of the description
31163
- description = description + (child === null || child === void 0 ? void 0 : child.outerHTML.trim());
31164
- }
31165
- }
31166
- }
31167
- success = (_g = taskDOM.querySelector('.qs-summary.success')) === null || _g === void 0 ? void 0 : _g.innerHTML.trim();
31168
- reviewFailed = (_h = taskDOM.querySelector('.qs-review.failed')) === null || _h === void 0 ? void 0 : _h.innerHTML.trim();
31169
- summaryFailed = (_j = taskDOM.querySelector('.qs-summary.failed')) === null || _j === void 0 ? void 0 : _j.innerHTML.trim();
31170
- }
31171
- answer.title = replaceEnvironmentVariables(answer.title || title);
31172
- answer.description = replaceEnvironmentVariables(answer.description || `${description} ${prerequisites || ''} ${procedure}`);
31173
- answer.review = answer.review || {};
31174
- answer.review.instructions = replaceEnvironmentVariables(((_k = answer.review) === null || _k === void 0 ? void 0 : _k.instructions) || verification || 'Have you completed these steps?');
31175
- answer.review.failedTaskHelp = replaceEnvironmentVariables(answer.review.failedTaskHelp ||
31176
- reviewFailed ||
31177
- 'This task isn’t verified yet. Try the task again.');
31178
- answer.summary = answer.summary || {};
31179
- answer.summary.success = replaceEnvironmentVariables(answer.summary.success || success || 'You have completed this task!');
31180
- answer.summary.failed = replaceEnvironmentVariables(answer.summary.failed || summaryFailed || 'Try the steps again.');
31181
- return answer;
31182
- });
31183
- return quickStart;
31155
+ And the below code extracts the <ol> or <ul>
31156
+ Except for when there is no <div class="title|heading"/>, then the description is extracted
31157
+ in the else if below
31158
+ */
31159
+ const child = sectionBody.children.item(i);
31160
+ // find the title
31161
+ const sectionTitle = child === null || child === void 0 ? void 0 : child.querySelector('.heading,.title');
31162
+ // should this section be assigned to a specific section
31163
+ const sectionTitleText = (_b = sectionTitle === null || sectionTitle === void 0 ? void 0 : sectionTitle.textContent) === null || _b === void 0 ? void 0 : _b.trim();
31164
+ const isKnownSection = ['Procedure', 'Verification', 'Prerequisites'].includes((_c = sectionTitle === null || sectionTitle === void 0 ? void 0 : sectionTitle.textContent) === null || _c === void 0 ? void 0 : _c.trim());
31165
+ if (isKnownSection) {
31166
+ switch (sectionTitleText) {
31167
+ case 'Procedure':
31168
+ procedure = (_d = child === null || child === void 0 ? void 0 : child.querySelector(':not(.heading):not(.title)')) === null || _d === void 0 ? void 0 : _d.outerHTML.trim();
31169
+ break;
31170
+ case 'Verification':
31171
+ verification = (_e = child === null || child === void 0 ? void 0 : child.querySelector(':not(.heading):not(.title)')) === null || _e === void 0 ? void 0 : _e.outerHTML.trim();
31172
+ break;
31173
+ case 'Prerequisites':
31174
+ prerequisites = (_f = child === null || child === void 0 ? void 0 : child.querySelector(':not(.heading):not(.title)')) === null || _f === void 0 ? void 0 : _f.outerHTML.trim();
31175
+ break;
31176
+ }
31177
+ }
31178
+ else if (!procedure) {
31179
+ // Otherwise if it comes before a procedure it's part of the description
31180
+ description = description + (child === null || child === void 0 ? void 0 : child.outerHTML.trim());
31181
+ }
31182
+ }
31183
+ }
31184
+ success = (_g = taskDOM.querySelector('.qs-summary.success')) === null || _g === void 0 ? void 0 : _g.innerHTML.trim();
31185
+ reviewFailed = (_h = taskDOM.querySelector('.qs-review.failed')) === null || _h === void 0 ? void 0 : _h.innerHTML.trim();
31186
+ summaryFailed = (_j = taskDOM.querySelector('.qs-summary.failed')) === null || _j === void 0 ? void 0 : _j.innerHTML.trim();
31187
+ }
31188
+ answer.title = replaceEnvironmentVariables(answer.title || title);
31189
+ answer.description = replaceEnvironmentVariables(answer.description || `${description} ${prerequisites || ''} ${procedure}`);
31190
+ answer.review = answer.review || {};
31191
+ answer.review.instructions = replaceEnvironmentVariables(((_k = answer.review) === null || _k === void 0 ? void 0 : _k.instructions) || verification || 'Have you completed these steps?');
31192
+ answer.review.failedTaskHelp = replaceEnvironmentVariables(answer.review.failedTaskHelp ||
31193
+ reviewFailed ||
31194
+ 'This task isn’t verified yet. Try the task again.');
31195
+ answer.summary = answer.summary || {};
31196
+ answer.summary.success = replaceEnvironmentVariables(answer.summary.success || success || 'You have completed this task!');
31197
+ answer.summary.failed = replaceEnvironmentVariables(answer.summary.failed || summaryFailed || 'Try the steps again.');
31198
+ return answer;
31199
+ });
31200
+ return quickStart;
31184
31201
  };
31185
31202
 
31186
31203
  export { Box, CamelCaseWrap, EmptyBox, HELP_TOPIC_NAME_KEY, HelpTopicContainer, HelpTopicContext, HelpTopicContextDefaults, HelpTopicDrawer, Loading, LoadingBox, ProcQuickStartParser, QUICKSTART_ID_FILTER_KEY, QUICKSTART_SEARCH_FILTER_KEY, QUICKSTART_STATUS_FILTER_KEY, QUICKSTART_TASKS_INITIAL_STATES, QUICK_START_NAME, QuickStartCatalog, QuickStartCatalogEmptyState, QuickStartCatalogFilter, QuickStartCatalogFilterCount, QuickStartCatalogFilterCountWrapper, QuickStartCatalogFilterSearch, QuickStartCatalogFilterSearchWrapper, QuickStartCatalogFilterSelect, QuickStartCatalogFilterStatusWrapper, QuickStartCatalogHeader, QuickStartCatalogPage, QuickStartCatalogSection, QuickStartCatalogToolbar, QuickStartCloseModal, QuickStartContainer, QuickStartContext, QuickStartContextDefaults, QuickStartContextProvider, QuickStartDrawer, QuickStartPanelContent, QuickStartStatus, QuickStartTaskStatus, QuickStartTile, QuickStartTileDescription, QuickStartTileFooter, QuickStartTileFooterExternal, QuickStartTileHeader, camelize, clearFilterParams, equalsIgnoreOrder, filterQuickStarts, getDefaultQuickStartState, getDisabledQuickStarts, getQuickStartByName, getQuickStartStatus, getQuickStartStatusCount, getResource, getTaskStatusKey, history, isDisabledQuickStart, removeQueryArgument, setQueryArgument, useLocalStorage, useValuesForHelpTopicContext, useValuesForQuickStartContext };