@patternfly/quickstarts 2.2.3 → 2.2.4

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 (188) hide show
  1. package/dist/HelpTopicDrawer.d.ts +8 -2
  2. package/dist/QuickStartDrawer.d.ts +21 -2
  3. package/dist/index.es.js.map +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/patternfly-docs/quick-starts/design-guidelines/design-guidelines.md +105 -0
  6. package/dist/patternfly-docs/quick-starts/design-guidelines/img/card-elements copy.png +0 -0
  7. package/dist/patternfly-docs/quick-starts/design-guidelines/img/card-elements.png +0 -0
  8. package/dist/patternfly-docs/quick-starts/design-guidelines/img/catalog-elements.png +0 -0
  9. package/dist/patternfly-docs/quick-starts/design-guidelines/img/check-your-work.png +0 -0
  10. package/dist/patternfly-docs/quick-starts/design-guidelines/img/introduction-screen.png +0 -0
  11. package/dist/patternfly-docs/quick-starts/design-guidelines/img/mixed-catalog.png +0 -0
  12. package/dist/patternfly-docs/quick-starts/design-guidelines/img/prerequisites.png +0 -0
  13. package/dist/patternfly-docs/quick-starts/design-guidelines/img/qs-context.png +0 -0
  14. package/dist/patternfly-docs/quick-starts/design-guidelines/img/side-panel-elements.png +0 -0
  15. package/dist/patternfly-docs/quick-starts/design-guidelines/img/side-panel-resized.png +0 -0
  16. package/dist/patternfly-docs/quick-starts/design-guidelines/img/side-panel.png +0 -0
  17. package/dist/patternfly-docs/quick-starts/design-guidelines/img/task-no.png +0 -0
  18. package/dist/patternfly-docs/quick-starts/design-guidelines/img/task-yes.png +0 -0
  19. package/dist/patternfly-docs/quick-starts/design-guidelines/img/task.png +0 -0
  20. package/dist/patternfly-docs/quick-starts/examples/Basic.jsx +73 -0
  21. package/dist/patternfly-docs/quick-starts/examples/HelpTopic.jsx +53 -0
  22. package/dist/patternfly-docs/quick-starts/examples/about.md +77 -0
  23. package/dist/patternfly-docs/quick-starts/examples/basic.md +27 -0
  24. package/dist/patternfly-docs/quick-starts/examples/example-data/example-help-topics.js +173 -0
  25. package/dist/patternfly-docs/quick-starts/examples/example-data/example-quickstarts.js +215 -0
  26. package/dist/patternfly-docs/quick-starts/examples/example-data/index.js +15 -0
  27. package/dist/patternfly-docs/quick-starts/examples/help-topics.md +25 -0
  28. package/dist/patternfly-docs/quick-starts/examples/img/catalog.png +0 -0
  29. package/dist/patternfly-docs/quick-starts/examples/img/help-topic.png +0 -0
  30. package/dist/patternfly-docs/quick-starts/examples/img/side-panel.png +0 -0
  31. package/dist/quickstarts-full.es.js.map +1 -1
  32. package/package.json +11 -4
  33. package/src/ConsoleInternal/components/_icon-and-text.scss +14 -0
  34. package/src/ConsoleInternal/components/_markdown-view.scss +19 -0
  35. package/src/ConsoleInternal/components/catalog/_catalog.scss +390 -0
  36. package/src/ConsoleInternal/components/markdown-view.tsx +305 -0
  37. package/src/ConsoleInternal/components/utils/_status-box.scss +58 -0
  38. package/src/ConsoleInternal/components/utils/camel-case-wrap.tsx +33 -0
  39. package/src/ConsoleInternal/components/utils/index.tsx +3 -0
  40. package/src/ConsoleInternal/components/utils/router.ts +47 -0
  41. package/src/ConsoleInternal/components/utils/status-box.tsx +94 -0
  42. package/src/ConsoleInternal/module/k8s/types.ts +53 -0
  43. package/src/ConsoleShared/index.ts +1 -0
  44. package/src/ConsoleShared/src/components/index.ts +7 -0
  45. package/src/ConsoleShared/src/components/layout/PageLayout.scss +29 -0
  46. package/src/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx +93 -0
  47. package/src/ConsoleShared/src/components/markdown-extensions/__tests__/MarkdownCopyClipboard.spec.tsx +25 -0
  48. package/src/ConsoleShared/src/components/markdown-extensions/__tests__/test-data.ts +5 -0
  49. package/src/ConsoleShared/src/components/markdown-extensions/admonition-extension.tsx +66 -0
  50. package/src/ConsoleShared/src/components/markdown-extensions/code-extension.tsx +25 -0
  51. package/src/ConsoleShared/src/components/markdown-extensions/const.ts +3 -0
  52. package/src/ConsoleShared/src/components/markdown-extensions/index.ts +5 -0
  53. package/src/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.tsx +45 -0
  54. package/src/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.tsx +50 -0
  55. package/src/ConsoleShared/src/components/markdown-extensions/showdown-extension.scss +52 -0
  56. package/src/ConsoleShared/src/components/markdown-extensions/utils.ts +3 -0
  57. package/src/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.tsx +64 -0
  58. package/src/ConsoleShared/src/components/markdown-highlight-extension/highlight-consts.ts +9 -0
  59. package/src/ConsoleShared/src/components/markdown-highlight-extension/index.ts +1 -0
  60. package/src/ConsoleShared/src/components/modal/Modal.scss +3 -0
  61. package/src/ConsoleShared/src/components/modal/Modal.tsx +19 -0
  62. package/src/ConsoleShared/src/components/modal/index.ts +1 -0
  63. package/src/ConsoleShared/src/components/popper/Portal.tsx +23 -0
  64. package/src/ConsoleShared/src/components/popper/SimplePopper.tsx +90 -0
  65. package/src/ConsoleShared/src/components/popper/index.ts +2 -0
  66. package/src/ConsoleShared/src/components/spotlight/InteractiveSpotlight.tsx +58 -0
  67. package/src/ConsoleShared/src/components/spotlight/Spotlight.tsx +35 -0
  68. package/src/ConsoleShared/src/components/spotlight/StaticSpotlight.tsx +32 -0
  69. package/src/ConsoleShared/src/components/spotlight/index.ts +1 -0
  70. package/src/ConsoleShared/src/components/spotlight/spotlight.scss +63 -0
  71. package/src/ConsoleShared/src/components/status/GenericStatus.tsx +33 -0
  72. package/src/ConsoleShared/src/components/status/NotStartedIcon.tsx +27 -0
  73. package/src/ConsoleShared/src/components/status/PopoverStatus.tsx +42 -0
  74. package/src/ConsoleShared/src/components/status/Status.tsx +38 -0
  75. package/src/ConsoleShared/src/components/status/StatusIconAndText.tsx +42 -0
  76. package/src/ConsoleShared/src/components/status/icons.tsx +77 -0
  77. package/src/ConsoleShared/src/components/status/index.tsx +1 -0
  78. package/src/ConsoleShared/src/components/status/statuses.tsx +36 -0
  79. package/src/ConsoleShared/src/components/status/types.ts +7 -0
  80. package/src/ConsoleShared/src/components/utils/FallbackImg.tsx +20 -0
  81. package/src/ConsoleShared/src/components/utils/index.ts +1 -0
  82. package/src/ConsoleShared/src/constants/index.ts +1 -0
  83. package/src/ConsoleShared/src/constants/ui.ts +1 -0
  84. package/src/ConsoleShared/src/hooks/index.ts +6 -0
  85. package/src/ConsoleShared/src/hooks/scroll.ts +52 -0
  86. package/src/ConsoleShared/src/hooks/useBoundingClientRect.ts +18 -0
  87. package/src/ConsoleShared/src/hooks/useEventListener.ts +14 -0
  88. package/src/ConsoleShared/src/hooks/useForceRender.ts +6 -0
  89. package/src/ConsoleShared/src/hooks/useResizeObserver.ts +20 -0
  90. package/src/ConsoleShared/src/hooks/useScrollShadows.ts +45 -0
  91. package/src/ConsoleShared/src/index.ts +4 -0
  92. package/src/ConsoleShared/src/utils/index.ts +1 -0
  93. package/src/ConsoleShared/src/utils/useCombineRefs.ts +17 -0
  94. package/src/HelpTopicDrawer.tsx +124 -0
  95. package/src/HelpTopicPanelContent.tsx +152 -0
  96. package/src/QuickStartCatalogPage.tsx +190 -0
  97. package/src/QuickStartCloseModal.tsx +47 -0
  98. package/src/QuickStartController.tsx +113 -0
  99. package/src/QuickStartDrawer.scss +11 -0
  100. package/src/QuickStartDrawer.tsx +265 -0
  101. package/src/QuickStartMarkdownView.tsx +75 -0
  102. package/src/QuickStartPanelContent.scss +46 -0
  103. package/src/QuickStartPanelContent.tsx +153 -0
  104. package/src/__tests__/quick-start-utils.spec.tsx +16 -0
  105. package/src/catalog/Catalog/QuickStartCatalogHeader.tsx +18 -0
  106. package/src/catalog/Catalog/QuickStartCatalogSection.tsx +9 -0
  107. package/src/catalog/Catalog/QuickStartCatalogToolbar.tsx +12 -0
  108. package/src/catalog/Catalog/index.ts +3 -0
  109. package/src/catalog/QuickStartCatalog.scss +8 -0
  110. package/src/catalog/QuickStartCatalog.tsx +42 -0
  111. package/src/catalog/QuickStartTile.scss +11 -0
  112. package/src/catalog/QuickStartTile.tsx +105 -0
  113. package/src/catalog/QuickStartTileDescription.scss +29 -0
  114. package/src/catalog/QuickStartTileDescription.tsx +79 -0
  115. package/src/catalog/QuickStartTileFooter.tsx +101 -0
  116. package/src/catalog/QuickStartTileFooterExternal.tsx +40 -0
  117. package/src/catalog/QuickStartTileHeader.scss +12 -0
  118. package/src/catalog/QuickStartTileHeader.tsx +77 -0
  119. package/src/catalog/Toolbar/QuickStartCatalogFilter.scss +25 -0
  120. package/src/catalog/Toolbar/QuickStartCatalogFilter.tsx +34 -0
  121. package/src/catalog/Toolbar/QuickStartCatalogFilterItems.tsx +199 -0
  122. package/src/catalog/__tests__/QuickStartCatalog.spec.tsx +35 -0
  123. package/src/catalog/__tests__/QuickStartTile.spec.tsx +38 -0
  124. package/src/catalog/__tests__/QuickStartTileDescription.spec.tsx +44 -0
  125. package/src/catalog/index.ts +9 -0
  126. package/src/controller/QuickStartConclusion.tsx +63 -0
  127. package/src/controller/QuickStartContent.scss +12 -0
  128. package/src/controller/QuickStartContent.tsx +72 -0
  129. package/src/controller/QuickStartFooter.scss +13 -0
  130. package/src/controller/QuickStartFooter.tsx +128 -0
  131. package/src/controller/QuickStartIntroduction.scss +35 -0
  132. package/src/controller/QuickStartIntroduction.tsx +66 -0
  133. package/src/controller/QuickStartTaskHeader.scss +58 -0
  134. package/src/controller/QuickStartTaskHeader.tsx +116 -0
  135. package/src/controller/QuickStartTaskHeaderList.scss +17 -0
  136. package/src/controller/QuickStartTaskHeaderList.tsx +35 -0
  137. package/src/controller/QuickStartTaskReview.scss +30 -0
  138. package/src/controller/QuickStartTaskReview.tsx +81 -0
  139. package/src/controller/QuickStartTasks.scss +89 -0
  140. package/src/controller/QuickStartTasks.tsx +75 -0
  141. package/src/controller/__tests__/QuickStartConclusion.spec.tsx +95 -0
  142. package/src/controller/__tests__/QuickStartContent.spec.tsx +52 -0
  143. package/src/controller/__tests__/QuickStartFooter.spec.tsx +148 -0
  144. package/src/controller/__tests__/QuickStartTaskHeader.spec.tsx +56 -0
  145. package/src/controller/__tests__/QuickStartTaskReview.spec.tsx +45 -0
  146. package/src/controller/__tests__/QuickStartTasks.spec.tsx +81 -0
  147. package/src/data/mocks/json/explore-pipeline-quickstart.ts +66 -0
  148. package/src/data/mocks/json/explore-serverless-quickstart.ts +90 -0
  149. package/src/data/mocks/json/monitor-sampleapp-quickstart.ts +77 -0
  150. package/src/data/mocks/json/tour-icons.ts +3 -0
  151. package/src/data/mocks/yamls/add-healthchecks-quickstart.yaml +67 -0
  152. package/src/data/mocks/yamls/explore-pipeline-quickstart.yaml +57 -0
  153. package/src/data/mocks/yamls/explore-serverless-quickstart.yaml +83 -0
  154. package/src/data/mocks/yamls/install-associate-pipeline-quickstart.yaml +74 -0
  155. package/src/data/mocks/yamls/monitor-sampleapp-quickstart.yaml +66 -0
  156. package/src/data/mocks/yamls/sample-application-quickstart.yaml +97 -0
  157. package/src/data/mocks/yamls/serverless-application-quickstart.yaml +141 -0
  158. package/src/data/quick-start-test-data.ts +10 -0
  159. package/src/data/test-utils.ts +11 -0
  160. package/src/declaration.d.ts +2 -0
  161. package/src/index.ts +17 -0
  162. package/src/locales/en/quickstart.json +46 -0
  163. package/src/styles/_base.scss +54 -0
  164. package/src/styles/_dark-custom-override.scss +62 -0
  165. package/src/styles/legacy-bootstrap/README.md +21 -0
  166. package/src/styles/legacy-bootstrap/_code.scss +44 -0
  167. package/src/styles/legacy-bootstrap/_tables.scss +38 -0
  168. package/src/styles/legacy-bootstrap/_type.scss +90 -0
  169. package/src/styles/legacy-bootstrap/_variables.scss +48 -0
  170. package/src/styles/legacy-bootstrap.scss +5 -0
  171. package/src/styles/patternfly-global-entry.ts +1 -0
  172. package/src/styles/patternfly-global.scss +28 -0
  173. package/src/styles/patternfly-nested-entry.ts +1 -0
  174. package/src/styles/patternfly-nested.scss +18 -0
  175. package/src/styles/quickstarts-standalone-entry.ts +1 -0
  176. package/src/styles/quickstarts-standalone.scss +7 -0
  177. package/src/styles/style.scss +12 -0
  178. package/src/styles/vendor-entry.ts +1 -0
  179. package/src/styles/vendor.scss +7 -0
  180. package/src/utils/PluralResolver.ts +356 -0
  181. package/src/utils/asciidoc-procedure-parser.ts +132 -0
  182. package/src/utils/const.ts +10 -0
  183. package/src/utils/help-topic-context.tsx +74 -0
  184. package/src/utils/help-topic-types.ts +16 -0
  185. package/src/utils/quick-start-context.tsx +477 -0
  186. package/src/utils/quick-start-types.ts +72 -0
  187. package/src/utils/quick-start-utils.ts +92 -0
  188. package/src/utils/useLocalStorage.ts +38 -0
@@ -0,0 +1,66 @@
1
+ import * as React from 'react';
2
+ import { ExpandableSection, List, ListItem } from '@patternfly/react-core';
3
+ import QuickStartMarkdownView from '../QuickStartMarkdownView';
4
+ import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context';
5
+ import { QuickStartTask, QuickStartTaskStatus } from '../utils/quick-start-types';
6
+ import TaskHeaderList from './QuickStartTaskHeaderList';
7
+
8
+ import './QuickStartIntroduction.scss';
9
+
10
+ type QuickStartIntroductionProps = {
11
+ introduction: string;
12
+ tasks: QuickStartTask[];
13
+ allTaskStatuses: QuickStartTaskStatus[];
14
+ prerequisites?: string[];
15
+ onTaskSelect: (selectedTaskNumber: number) => void;
16
+ };
17
+
18
+ const QuickStartIntroduction: React.FC<QuickStartIntroductionProps> = ({
19
+ tasks,
20
+ introduction,
21
+ allTaskStatuses,
22
+ prerequisites,
23
+ onTaskSelect,
24
+ }) => {
25
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
26
+ const prereqs = prerequisites?.filter((p) => p);
27
+ const [isPrereqsExpanded, setIsPrereqsExpanded] = React.useState(false);
28
+ const prereqList = prereqs?.length > 0 && (
29
+ <ExpandableSection
30
+ toggleText={getResource('View Prerequisites ({{totalPrereqs}})').replace(
31
+ '{{totalPrereqs}}',
32
+ prereqs.length,
33
+ )}
34
+ onToggle={() => setIsPrereqsExpanded(!isPrereqsExpanded)}
35
+ className="pfext-quick-start-intro__prereq"
36
+ >
37
+ <List className="pfext-quick-start-intro__prereq-list">
38
+ {prereqs.map((pr) => {
39
+ return (
40
+ <ListItem key={pr} className="pfext-quick-start-intro__prereq-list__item">
41
+ <span className="pfext-quick-start-intro__prereq-list__item-content">
42
+ <QuickStartMarkdownView content={pr} />
43
+ </span>
44
+ </ListItem>
45
+ );
46
+ })}
47
+ </List>
48
+ </ExpandableSection>
49
+ );
50
+ return (
51
+ <>
52
+ <QuickStartMarkdownView content={introduction} />
53
+ {prereqList}
54
+ <p style={{ marginBottom: 'var(--pf-global--spacer--md)' }}>
55
+ {getResource(
56
+ 'In this quick start, you will complete {{count, number}} task',
57
+ tasks.length,
58
+ ).replace('{{count, number}}', tasks.length)}
59
+ :
60
+ </p>
61
+ <TaskHeaderList tasks={tasks} allTaskStatuses={allTaskStatuses} onTaskSelect={onTaskSelect} />
62
+ </>
63
+ );
64
+ };
65
+
66
+ export default QuickStartIntroduction;
@@ -0,0 +1,58 @@
1
+ .pfext-quick-start-task-header {
2
+ margin-bottom: var(--pf-global--spacer--sm);
3
+ display: grid;
4
+ grid-template-columns: min-content auto;
5
+ font-size: var(--pf-global--FontSize--md);
6
+ button::before {
7
+ content: none;
8
+ }
9
+
10
+ &__title {
11
+ color: var(--pf-global--primary-color--100) !important;
12
+ margin-right: var(--pf-global--spacer--md) !important;
13
+ }
14
+
15
+ &__subtitle {
16
+ font-size: var(--pf-global--FontSize--sm);
17
+ color: var(--pf-global--Color--dark-200) !important;
18
+ }
19
+
20
+ &__tryagain {
21
+ display: block;
22
+ font-size: var(--pf-global--FontSize--md);
23
+ color: var(--pf-global--Color--300) !important;
24
+ }
25
+
26
+ &__title-success {
27
+ color: var(--pf-global--success-color--100) !important;
28
+ }
29
+
30
+ &__title-failed {
31
+ color: var(--pf-global--danger-color--100) !important;
32
+ }
33
+
34
+ &__task-icon {
35
+ &-init {
36
+ background-color: var(--pf-global--primary-color--100);
37
+ border-radius: var(--pf-global--BorderRadius--lg);
38
+ color: var(--pf-global--Color--light-100);
39
+ display: inline-flex;
40
+ justify-content: center;
41
+ height: 1.5em;
42
+ width: 1.5em;
43
+ }
44
+
45
+ &-success,
46
+ &-failed {
47
+ vertical-align: middle !important;
48
+ }
49
+
50
+ &-success {
51
+ color: var(--pf-global--success-color--100) !important;
52
+ }
53
+
54
+ &-failed {
55
+ color: var(--pf-global--danger-color--100) !important;
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,116 @@
1
+ import * as React from 'react';
2
+ import { Title, WizardNavItem } from '@patternfly/react-core';
3
+ import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
4
+ import ExclamationCircleIcon from '@patternfly/react-icons/dist/js/icons/exclamation-circle-icon';
5
+ import { css } from '@patternfly/react-styles';
6
+ import { markdownConvert } from '../ConsoleInternal/components/markdown-view';
7
+ import { removeParagraphWrap } from '../QuickStartMarkdownView';
8
+ import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context';
9
+ import { QuickStartTaskStatus } from '../utils/quick-start-types';
10
+
11
+ import './QuickStartTaskHeader.scss';
12
+
13
+ type QuickStartTaskHeaderProps = {
14
+ title: string;
15
+ taskIndex: number;
16
+ subtitle?: string;
17
+ taskStatus?: QuickStartTaskStatus;
18
+ size?: 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';
19
+ isActiveTask?: boolean;
20
+ onTaskSelect: (index: number) => void;
21
+ chidlren?: React.ReactNode;
22
+ };
23
+
24
+ const TaskIcon: React.FC<{
25
+ taskIndex: number;
26
+ taskStatus: QuickStartTaskStatus;
27
+ }> = ({ taskIndex, taskStatus }) => {
28
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
29
+ const success = taskStatus === QuickStartTaskStatus.SUCCESS;
30
+ const failed = taskStatus === QuickStartTaskStatus.FAILED;
31
+
32
+ const classNames = css('pfext-icon-and-text__icon', {
33
+ 'pfext-quick-start-task-header__task-icon-init': !failed && !success,
34
+ });
35
+ let content: {};
36
+ if (success) {
37
+ content = (
38
+ <CheckCircleIcon size="md" className="pfext-quick-start-task-header__task-icon-success" />
39
+ );
40
+ } else if (failed) {
41
+ content = (
42
+ <ExclamationCircleIcon
43
+ size="md"
44
+ className="pfext-quick-start-task-header__task-icon-failed"
45
+ />
46
+ );
47
+ } else {
48
+ content = getResource('{{taskIndex, number}}', taskIndex).replace(
49
+ '{{taskIndex, number}}',
50
+ taskIndex,
51
+ );
52
+ }
53
+ return <span className={classNames}>{content}</span>;
54
+ };
55
+
56
+ const QuickStartTaskHeader: React.FC<QuickStartTaskHeaderProps> = ({
57
+ title,
58
+ taskIndex,
59
+ subtitle,
60
+ taskStatus,
61
+ size,
62
+ isActiveTask,
63
+ onTaskSelect,
64
+ children,
65
+ }) => {
66
+ const classNames = css('pfext-quick-start-task-header__title', {
67
+ 'pfext-quick-start-task-header__title-success': taskStatus === QuickStartTaskStatus.SUCCESS,
68
+ 'pfext-quick-start-task-header__title-failed':
69
+ taskStatus === (QuickStartTaskStatus.FAILED || QuickStartTaskStatus.VISITED),
70
+ });
71
+ // const notCompleted = taskStatus === QuickStartTaskStatus.VISITED;
72
+ // const skippedReview = taskStatus === QuickStartTaskStatus.REVIEW;
73
+ const failedReview = taskStatus === QuickStartTaskStatus.FAILED;
74
+
75
+ // TODO: toned down when this is shown, investigate further when we should display it
76
+ // related: https://github.com/patternfly/patternfly-quickstarts/issues/104
77
+ const tryAgain = failedReview && (
78
+ <>
79
+ <div />
80
+ <div className="pfext-quick-start-task-header__tryagain">Try the steps again.</div>
81
+ </>
82
+ );
83
+
84
+ const content = (
85
+ <div className="pfext-quick-start-task-header">
86
+ <TaskIcon taskIndex={taskIndex} taskStatus={taskStatus} />
87
+ <Title headingLevel="h3" size={size} className={classNames}>
88
+ <span dangerouslySetInnerHTML={{ __html: removeParagraphWrap(markdownConvert(title)) }} />
89
+ {isActiveTask && subtitle && (
90
+ <span
91
+ className="pfext-quick-start-task-header__subtitle"
92
+ data-test-id="quick-start-task-subtitle"
93
+ >
94
+ {' '}
95
+ {subtitle}
96
+ </span>
97
+ )}
98
+ </Title>
99
+ {tryAgain}
100
+ </div>
101
+ );
102
+
103
+ return (
104
+ <WizardNavItem
105
+ content={content}
106
+ step={taskIndex}
107
+ onNavItemClick={() => onTaskSelect(taskIndex - 1)}
108
+ navItemComponent="button"
109
+ isCurrent={isActiveTask}
110
+ >
111
+ {children}
112
+ </WizardNavItem>
113
+ );
114
+ };
115
+
116
+ export default QuickStartTaskHeader;
@@ -0,0 +1,17 @@
1
+ .pfext-quick-start-task-header {
2
+ &__list {
3
+ padding: 0 !important;
4
+
5
+ button::before {
6
+ content: none;
7
+ }
8
+
9
+ li {
10
+ list-style-type: none;
11
+ display: flex;
12
+ flex-wrap: wrap;
13
+ align-items: center;
14
+ margin-bottom: var(--pf-global--spacer--xs);
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from 'react';
2
+ import { List } from '@patternfly/react-core';
3
+ import { QuickStartTask, QuickStartTaskStatus } from '../utils/quick-start-types';
4
+ import TaskHeader from './QuickStartTaskHeader';
5
+
6
+ import './QuickStartTaskHeaderList.scss';
7
+
8
+ type QuickStartTaskHeaderListProps = {
9
+ tasks: QuickStartTask[];
10
+ allTaskStatuses: QuickStartTaskStatus[];
11
+ onTaskSelect: (selectedTaskNumber: number) => void;
12
+ };
13
+
14
+ const QuickStartTaskHeaderList: React.FC<QuickStartTaskHeaderListProps> = ({
15
+ tasks,
16
+ allTaskStatuses,
17
+ onTaskSelect,
18
+ }) => {
19
+ return tasks.length > 0 ? (
20
+ <List className="pfext-quick-start-task-header__list">
21
+ {tasks.map((task, index) => (
22
+ <TaskHeader
23
+ key={task.title}
24
+ title={task.title}
25
+ taskIndex={index + 1}
26
+ size="md"
27
+ taskStatus={allTaskStatuses[index]}
28
+ onTaskSelect={onTaskSelect}
29
+ />
30
+ ))}
31
+ </List>
32
+ ) : null;
33
+ };
34
+
35
+ export default QuickStartTaskHeaderList;
@@ -0,0 +1,30 @@
1
+ .pfext-quick-start-task-review-alert {
2
+ margin: var(--pf-global--spacer--lg) 0;
3
+ }
4
+ .pfext-quick-start-task-review {
5
+ font-size: var(--pf-global--FontSize--md);
6
+ line-height: var(--pf-global--FontSize--xl);
7
+ font-family: var(--pf-global--FontFamily--heading--sans-serif);
8
+
9
+ &__actions {
10
+ display: flex;
11
+ align-items: flex-start;
12
+ margin-bottom: var(--pf-global--spacer--sm);
13
+ input[type='radio'] {
14
+ margin-top: 0;
15
+ margin-right: 0;
16
+ }
17
+ }
18
+
19
+ &__radio {
20
+ margin-right: var(--pf-global--spacer--xl) !important;
21
+ }
22
+
23
+ &--success {
24
+ color: var(--pf-global--success-color--100) !important;
25
+ }
26
+
27
+ &--failed {
28
+ color: var(--pf-chart-global--danger--Color--100);
29
+ }
30
+ }
@@ -0,0 +1,81 @@
1
+ import * as React from 'react';
2
+ import { Alert, Radio } from '@patternfly/react-core';
3
+ import { css } from '@patternfly/react-styles';
4
+ import QuickStartMarkdownView from '../QuickStartMarkdownView';
5
+ import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context';
6
+ import {
7
+ QuickStartTaskReview as QuickStartTaskReviewType,
8
+ QuickStartTaskStatus,
9
+ } from '../utils/quick-start-types';
10
+
11
+ import './QuickStartTaskReview.scss';
12
+
13
+ type QuickStartTaskReviewProps = {
14
+ review: QuickStartTaskReviewType;
15
+ taskStatus: QuickStartTaskStatus;
16
+ onTaskReview: (status: QuickStartTaskStatus) => void;
17
+ };
18
+
19
+ const getAlertVariant = (status) => {
20
+ switch (status) {
21
+ case QuickStartTaskStatus.SUCCESS:
22
+ return 'success';
23
+ case QuickStartTaskStatus.FAILED:
24
+ return 'danger';
25
+ default:
26
+ return 'info';
27
+ }
28
+ };
29
+
30
+ const QuickStartTaskReview: React.FC<QuickStartTaskReviewProps> = ({
31
+ review,
32
+ taskStatus,
33
+ onTaskReview,
34
+ }) => {
35
+ const { instructions, failedTaskHelp: taskHelp } = review;
36
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
37
+
38
+ const alertClassNames = css('pfext-quick-start-task-review', {
39
+ 'pfext-quick-start-task-review--success': taskStatus === QuickStartTaskStatus.SUCCESS,
40
+ 'pfext-quick-start-task-review--failed': taskStatus === QuickStartTaskStatus.FAILED,
41
+ });
42
+
43
+ const title = <span className={alertClassNames}>{getResource('Check your work')}</span>;
44
+
45
+ return (
46
+ <Alert
47
+ className="pfext-quick-start-task-review-alert"
48
+ variant={getAlertVariant(taskStatus)}
49
+ title={title}
50
+ isInline
51
+ role="alert"
52
+ >
53
+ <QuickStartMarkdownView content={instructions} />
54
+ <span className="pfext-quick-start-task-review__actions">
55
+ <Radio
56
+ id="review-success"
57
+ name="review-success"
58
+ data-testid="qs-drawer-check-yes"
59
+ label={getResource('Yes')}
60
+ className="pfext-quick-start-task-review__radio"
61
+ isChecked={taskStatus === QuickStartTaskStatus.SUCCESS}
62
+ onChange={() => onTaskReview(QuickStartTaskStatus.SUCCESS)}
63
+ />
64
+ <Radio
65
+ id="review-failed"
66
+ name="review-failed"
67
+ data-testid="qs-drawer-check-no"
68
+ label={getResource('No')}
69
+ className="pfext-quick-start-task-review__radio"
70
+ isChecked={taskStatus === QuickStartTaskStatus.FAILED}
71
+ onChange={() => onTaskReview(QuickStartTaskStatus.FAILED)}
72
+ />
73
+ </span>
74
+ {taskStatus === QuickStartTaskStatus.FAILED && taskHelp && (
75
+ <QuickStartMarkdownView content={taskHelp} exactHeight />
76
+ )}
77
+ </Alert>
78
+ );
79
+ };
80
+
81
+ export default QuickStartTaskReview;
@@ -0,0 +1,89 @@
1
+ .pfext-quick-start-tasks {
2
+ &__list {
3
+ button::before {
4
+ content: none;
5
+ }
6
+
7
+ li {
8
+ &.pf-c-wizard__nav-item {
9
+ list-style-type: none;
10
+ display: flex;
11
+ flex-wrap: wrap;
12
+ align-items: center;
13
+ margin-bottom: var(--pf-global--spacer--xs);
14
+ }
15
+ }
16
+ .pfext-quick-start-task__content {
17
+ margin-bottom: var(--pf-global--spacer--md);
18
+ }
19
+ // Custom styles on PF React List rendered in custom react renderer
20
+ .task-pflist {
21
+ &-title {
22
+ font-size: 14px !important;
23
+ margin-bottom: 6px;
24
+ }
25
+ &-subtitle {
26
+ color: var(--pf-global--Color--200);
27
+ font-size: 16px;
28
+ }
29
+ &-list {
30
+ font-size: 16px;
31
+ &--prereq {
32
+ padding-left: var(--pf-global--spacer--lg);
33
+ li + li {
34
+ margin-top: 4px;
35
+ }
36
+ }
37
+ &--proc {
38
+ padding-left: 10px;
39
+ li + li {
40
+ margin-top: 16px;
41
+ }
42
+ }
43
+ &__item {
44
+ &--prereq {
45
+ &::marker {
46
+ font-size: 0.8rem;
47
+ }
48
+ .task-pflist-list__item__content {
49
+ position: relative;
50
+ left: 2px;
51
+ }
52
+ }
53
+ &--proc {
54
+ font-size: 14px;
55
+ .task-pflist-list__item__content {
56
+ position: relative;
57
+ left: 4px;
58
+ }
59
+ }
60
+ &__content {
61
+ .pf-c-alert {
62
+ // add margins to match design
63
+ margin: var(--pf-global--spacer--md) 0;
64
+ }
65
+ .pf-c-alert__title {
66
+ // remove margins from markdown css
67
+ margin-top: 0;
68
+ margin-bottom: 0;
69
+ // lift PF style specificity to override markdown css
70
+ font-weight: var(--pf-c-alert__title--FontWeight);
71
+ font-family: inherit;
72
+ line-height: inherit;
73
+ color: var(--pf-c-alert__title--Color);
74
+ word-break: break-word;
75
+ }
76
+ .task-pflist-list__item__content__note {
77
+ background-color: var(--pf-global--palette--blue-50);
78
+ border-color: var(--pf-global--active-color--200);
79
+ margin: var(--pf-global--spacer--md) 0;
80
+ &__body {
81
+ font-size: 14px;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,75 @@
1
+ import * as React from 'react';
2
+ import QuickStartMarkdownView from '../QuickStartMarkdownView';
3
+ import { QUICKSTART_TASKS_INITIAL_STATES } from '../utils/const';
4
+ import { QuickStartContext, QuickStartContextValues } from '../utils/quick-start-context';
5
+ import { QuickStartTask, QuickStartTaskStatus } from '../utils/quick-start-types';
6
+ import TaskHeader from './QuickStartTaskHeader';
7
+ import QuickStartTaskReview from './QuickStartTaskReview';
8
+
9
+ import './QuickStartTasks.scss';
10
+
11
+ type QuickStartTaskProps = {
12
+ tasks: QuickStartTask[];
13
+ taskNumber: number;
14
+ allTaskStatuses: QuickStartTaskStatus[];
15
+ onTaskReview: (reviewState: QuickStartTaskStatus) => void;
16
+ onTaskSelect: (activeQuickStartId) => void;
17
+ };
18
+
19
+ const QuickStartTasks: React.FC<QuickStartTaskProps> = ({
20
+ tasks,
21
+ taskNumber,
22
+ allTaskStatuses,
23
+ onTaskReview,
24
+ onTaskSelect,
25
+ }) => {
26
+ const { getResource, alwaysShowTaskReview } = React.useContext<QuickStartContextValues>(
27
+ QuickStartContext,
28
+ );
29
+ return (
30
+ <div className="pfext-quick-start-tasks__list">
31
+ <ul>
32
+ {tasks
33
+ .filter((_, index) => allTaskStatuses[index] !== QuickStartTaskStatus.INIT)
34
+ .map((task, index) => {
35
+ const { title, description, review } = task;
36
+ const isActiveTask = index === taskNumber;
37
+ const taskStatus = allTaskStatuses[index];
38
+ const shouldShowTaskReview =
39
+ (!QUICKSTART_TASKS_INITIAL_STATES.includes(taskStatus) || alwaysShowTaskReview) &&
40
+ review;
41
+ return (
42
+ <React.Fragment key={title}>
43
+ <TaskHeader
44
+ taskIndex={index + 1}
45
+ title={title}
46
+ size="md"
47
+ subtitle={getResource('{{index, number}} of {{tasks, number}}')
48
+ .replace('{{index, number}}', index + 1)
49
+ .replace('{{tasks, number}}', tasks.length)}
50
+ taskStatus={taskStatus}
51
+ isActiveTask={isActiveTask}
52
+ onTaskSelect={onTaskSelect}
53
+ >
54
+ {isActiveTask && (
55
+ <div className="pfext-quick-start-task__content">
56
+ <QuickStartMarkdownView content={description} />
57
+ {shouldShowTaskReview && (
58
+ <QuickStartTaskReview
59
+ review={review}
60
+ taskStatus={taskStatus}
61
+ onTaskReview={onTaskReview}
62
+ />
63
+ )}
64
+ </div>
65
+ )}
66
+ </TaskHeader>
67
+ </React.Fragment>
68
+ );
69
+ })}
70
+ </ul>
71
+ </div>
72
+ );
73
+ };
74
+
75
+ export default QuickStartTasks;
@@ -0,0 +1,95 @@
1
+ import * as React from 'react';
2
+ import { Button } from '@patternfly/react-core';
3
+ import { ShallowWrapper, shallow } from 'enzyme';
4
+ import { allQuickStarts } from '../../data/quick-start-test-data';
5
+ import QuickStartMarkdownView from '../../QuickStartMarkdownView';
6
+ import { QuickStartTaskStatus } from '../../utils/quick-start-types';
7
+ import { getQuickStartByName } from '../../utils/quick-start-utils';
8
+ import QuickStartConclusion from '../QuickStartConclusion';
9
+
10
+ jest.mock('react', () => {
11
+ const ActualReact = require.requireActual('react');
12
+ return {
13
+ ...ActualReact,
14
+ useContext: () => jest.fn(),
15
+ };
16
+ });
17
+
18
+ const i18nNS = 'quickstart';
19
+
20
+ type QuickStartConclusionProps = React.ComponentProps<typeof QuickStartConclusion>;
21
+ let wrapper: ShallowWrapper<QuickStartConclusionProps>;
22
+ const props: QuickStartConclusionProps = {
23
+ tasks: getQuickStartByName('explore-pipelines', allQuickStarts).spec.tasks,
24
+ allTaskStatuses: [
25
+ QuickStartTaskStatus.SUCCESS,
26
+ QuickStartTaskStatus.SUCCESS,
27
+ QuickStartTaskStatus.SUCCESS,
28
+ ],
29
+ conclusion: 'conclusion',
30
+ onTaskSelect: jest.fn(),
31
+ onQuickStartChange: jest.fn(),
32
+ };
33
+
34
+ describe('QuickStartConclusion', () => {
35
+ beforeEach(() => {
36
+ spyOn(React, 'useContext').and.returnValue({
37
+ activeQuickStartID: '',
38
+ startQuickStart: () => {},
39
+ restartQuickStart: () => {},
40
+ getResource: (key) => `quickstart~${key}`,
41
+ });
42
+ wrapper = shallow(<QuickStartConclusion {...props} />);
43
+ });
44
+
45
+ it('should render conclusion if there are no failed tasks', () => {
46
+ expect(
47
+ wrapper
48
+ .find(QuickStartMarkdownView)
49
+ .first()
50
+ .props().content,
51
+ ).toEqual('conclusion');
52
+ });
53
+
54
+ it('should render link for next quick start if nextQuickStart prop is available and there are no failed tasks', () => {
55
+ wrapper = shallow(
56
+ <QuickStartConclusion
57
+ {...props}
58
+ nextQuickStarts={[getQuickStartByName('explore-pipelines', allQuickStarts)]}
59
+ />,
60
+ );
61
+ expect(
62
+ wrapper
63
+ .find(Button)
64
+ .at(0)
65
+ .props().children[0],
66
+ ).toEqual(`${i18nNS}~Start Installing the Pipelines Operator quick start`);
67
+ });
68
+
69
+ it('should not render link for next quick start if nextQuickStart props is not available', () => {
70
+ expect(wrapper.find(Button).length).toBe(0);
71
+ });
72
+
73
+ it('should not render conclusion, link for next quick start and should render message for retrying if there are failed tasks', () => {
74
+ wrapper = shallow(
75
+ <QuickStartConclusion
76
+ {...props}
77
+ nextQuickStart={getQuickStartByName('explore-pipelines', allQuickStarts)}
78
+ allTaskStatuses={[
79
+ QuickStartTaskStatus.FAILED,
80
+ QuickStartTaskStatus.SUCCESS,
81
+ QuickStartTaskStatus.SUCCESS,
82
+ ]}
83
+ />,
84
+ );
85
+ expect(
86
+ wrapper
87
+ .find(QuickStartMarkdownView)
88
+ .first()
89
+ .props().content,
90
+ ).toEqual(
91
+ `${i18nNS}~One or more verifications did not pass during this quick start. Revisit the tasks or the help links, and then try again.`,
92
+ );
93
+ expect(wrapper.find(Button).length).toBe(0);
94
+ });
95
+ });