@patternfly/quickstarts 5.0.0-prerelease.2 → 5.0.0

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 (109) 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.js +2286 -2286
  92. package/dist/quickstarts-base.css +34 -34
  93. package/dist/quickstarts-full.es.js +2281 -2281
  94. package/dist/quickstarts.css +34 -34
  95. package/dist/quickstarts.min.css +1 -1
  96. package/dist/styles/patternfly-global-entry.d.ts +1 -1
  97. package/dist/styles/patternfly-nested-entry.d.ts +1 -1
  98. package/dist/styles/quickstarts-standalone-entry.d.ts +1 -1
  99. package/dist/styles/vendor-entry.d.ts +1 -1
  100. package/dist/utils/PluralResolver.d.ts +16 -16
  101. package/dist/utils/asciidoc-procedure-parser.d.ts +12 -12
  102. package/dist/utils/const.d.ts +6 -6
  103. package/dist/utils/help-topic-context.d.ts +23 -23
  104. package/dist/utils/help-topic-types.d.ts +13 -13
  105. package/dist/utils/quick-start-context.d.ts +81 -81
  106. package/dist/utils/quick-start-types.d.ts +60 -60
  107. package/dist/utils/quick-start-utils.d.ts +10 -10
  108. package/dist/utils/useLocalStorage.d.ts +1 -1
  109. package/package.json +9 -9
@@ -9680,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
9680
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?
9681
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)}}}
9682
9682
 
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";
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";
9696
9696
  })(QuickStartTaskStatus || (QuickStartTaskStatus = {}));
9697
9697
 
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
- ];
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
+ ];
9705
9705
  const HELP_TOPIC_NAME_KEY = 'topic';
9706
9706
 
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);
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);
9743
9743
  };
9744
9744
 
9745
9745
  var Status$1 = "Status";
@@ -9803,667 +9803,667 @@ var en = {
9803
9803
  "{{type}} • {{duration, number}} minutes": "{{type}} • {{duration, number}} minutes"
9804
9804
  };
9805
9805
 
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
- }
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
+ }
10123
10123
  }
10124
10124
 
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();
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();
10174
10174
  });
10175
10175
 
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
- };
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
+ };
10431
10431
  const QuickStartContextProvider = ({ children, value }) => (React__default.createElement(QuickStartContext.Provider, { value: useValuesForQuickStartContext(value) }, children));
10432
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
+ 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
+ };
10450
10450
  EmptyBox.displayName = 'EmptyBox';
10451
10451
 
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;
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;
10467
10467
  };
10468
10468
 
10469
10469
  class CatalogTile extends React.Component {
@@ -10542,342 +10542,342 @@ exports["default"] = exports.RocketIcon;
10542
10542
 
10543
10543
  var RocketIcon = /*@__PURE__*/getDefaultExportFromCjs(rocketIcon);
10544
10544
 
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;
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')) })));
10611
10548
  };
10612
10549
 
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 }))));
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;
10650
10557
  };
10651
10558
 
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";
10658
- })(ScrollDirection || (ScrollDirection = {}));
10659
-
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;
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;
10715
10611
  };
10716
10612
 
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;
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));
10724
10619
  };
10725
-
10726
- /**
10727
- * React hook that forces component render.
10728
- */
10729
- const useForceRender = () => React.useReducer((s) => !s, false)[1];
10730
-
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 });
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 }))));
10827
10650
  };
10828
10651
 
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`;
10832
- const ACCORDION_MARKDOWN_CONTENT_ID = `accordion-markdown-content-id`;
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";
10658
+ })(ScrollDirection || (ScrollDirection = {}));
10833
10659
 
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;
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;
10861
10715
  };
10862
10716
 
10863
- const removeTemplateWhitespace = (template) => template.replace(/>(?:\s|\n)+</g, '><');
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;
10724
+ };
10864
10725
 
10865
10726
  /**
10866
- * @license React
10867
- * react-dom-server-legacy.node.production.min.js
10868
- *
10869
- * Copyright (c) Facebook, Inc. and its affiliates.
10870
- *
10871
- * This source code is licensed under the MIT license found in the
10872
- * LICENSE file in the root directory of this source tree.
10727
+ * React hook that forces component render.
10873
10728
  */
10874
- var n=Object.prototype.hasOwnProperty,ha$1=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ia$1={},ja$1={};
10875
- function ka$1(a){if(n.call(ja$1,a))return !0;if(n.call(ia$1,a))return !1;if(ha$1.test(a))return ja$1[a]=!0;ia$1[a]=!0;return !1}function q$1(a,b,c,d,f,e,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=f;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=e;this.removeEmptyString=g;}var r$1={};
10876
- "children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){r$1[a]=new q$1(a,0,!1,a,null,!1,!1);});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];r$1[b]=new q$1(b,1,!1,a[1],null,!1,!1);});["contentEditable","draggable","spellCheck","value"].forEach(function(a){r$1[a]=new q$1(a,2,!1,a.toLowerCase(),null,!1,!1);});
10877
- ["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){r$1[a]=new q$1(a,2,!1,a,null,!1,!1);});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){r$1[a]=new q$1(a,3,!1,a.toLowerCase(),null,!1,!1);});
10878
- ["checked","multiple","muted","selected"].forEach(function(a){r$1[a]=new q$1(a,3,!0,a,null,!1,!1);});["capture","download"].forEach(function(a){r$1[a]=new q$1(a,4,!1,a,null,!1,!1);});["cols","rows","size","span"].forEach(function(a){r$1[a]=new q$1(a,6,!1,a,null,!1,!1);});["rowSpan","start"].forEach(function(a){r$1[a]=new q$1(a,5,!1,a.toLowerCase(),null,!1,!1);});var la$1=/[\-:]([a-z])/g;function ma$1(a){return a[1].toUpperCase()}
10879
- "accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(la$1,
10880
- ma$1);r$1[b]=new q$1(b,1,!1,a,null,!1,!1);});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(la$1,ma$1);r$1[b]=new q$1(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1);});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(la$1,ma$1);r$1[b]=new q$1(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1);});["tabIndex","crossOrigin"].forEach(function(a){r$1[a]=new q$1(a,1,!1,a.toLowerCase(),null,!1,!1);});
10729
+ const useForceRender = () => React.useReducer((s) => !s, false)[1];
10730
+
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 });
10827
+ };
10828
+
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`;
10832
+ const ACCORDION_MARKDOWN_CONTENT_ID = `accordion-markdown-content-id`;
10833
+
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;
10861
+ };
10862
+
10863
+ const removeTemplateWhitespace = (template) => template.replace(/>(?:\s|\n)+</g, '><');
10864
+
10865
+ /**
10866
+ * @license React
10867
+ * react-dom-server-legacy.node.production.min.js
10868
+ *
10869
+ * Copyright (c) Facebook, Inc. and its affiliates.
10870
+ *
10871
+ * This source code is licensed under the MIT license found in the
10872
+ * LICENSE file in the root directory of this source tree.
10873
+ */
10874
+ var n=Object.prototype.hasOwnProperty,ha$1=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ia$1={},ja$1={};
10875
+ function ka$1(a){if(n.call(ja$1,a))return !0;if(n.call(ia$1,a))return !1;if(ha$1.test(a))return ja$1[a]=!0;ia$1[a]=!0;return !1}function q$1(a,b,c,d,f,e,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=f;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=e;this.removeEmptyString=g;}var r$1={};
10876
+ "children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){r$1[a]=new q$1(a,0,!1,a,null,!1,!1);});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];r$1[b]=new q$1(b,1,!1,a[1],null,!1,!1);});["contentEditable","draggable","spellCheck","value"].forEach(function(a){r$1[a]=new q$1(a,2,!1,a.toLowerCase(),null,!1,!1);});
10877
+ ["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){r$1[a]=new q$1(a,2,!1,a,null,!1,!1);});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){r$1[a]=new q$1(a,3,!1,a.toLowerCase(),null,!1,!1);});
10878
+ ["checked","multiple","muted","selected"].forEach(function(a){r$1[a]=new q$1(a,3,!0,a,null,!1,!1);});["capture","download"].forEach(function(a){r$1[a]=new q$1(a,4,!1,a,null,!1,!1);});["cols","rows","size","span"].forEach(function(a){r$1[a]=new q$1(a,6,!1,a,null,!1,!1);});["rowSpan","start"].forEach(function(a){r$1[a]=new q$1(a,5,!1,a.toLowerCase(),null,!1,!1);});var la$1=/[\-:]([a-z])/g;function ma$1(a){return a[1].toUpperCase()}
10879
+ "accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(la$1,
10880
+ ma$1);r$1[b]=new q$1(b,1,!1,a,null,!1,!1);});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(la$1,ma$1);r$1[b]=new q$1(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1);});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(la$1,ma$1);r$1[b]=new q$1(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1);});["tabIndex","crossOrigin"].forEach(function(a){r$1[a]=new q$1(a,1,!1,a.toLowerCase(),null,!1,!1);});
10881
10881
  r$1.xlinkHref=new q$1("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(a){r$1[a]=new q$1(a,1,!1,a.toLowerCase(),null,!0,!0);});
10882
10882
  var t$1={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,
10883
10883
  fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},na=["Webkit","ms","Moz","O"];Object.keys(t$1).forEach(function(a){na.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);t$1[b]=t$1[a];});});var oa=/["'&<>]/;
@@ -25251,15 +25251,15 @@ exports["default"] = exports.CopyIcon;
25251
25251
 
25252
25252
  var CopyIcon = /*@__PURE__*/getDefaultExportFromCjs(copyIcon);
25253
25253
 
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
- }
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
+ }
25263
25263
  return removeTemplateWhitespace(`<span class="pf-v5-c-clipboard-copy pf-m-inline">
25264
25264
  <span class="pf-v5-c-clipboard-copy__text" ${MARKDOWN_SNIPPET_ID}="${groupId}">${group}</span>
25265
25265
  <span class="pf-v5-c-clipboard-copy__actions">
@@ -25269,20 +25269,20 @@ const useInlineCopyClipboardShowdownExtension = () => {
25269
25269
  </button>
25270
25270
  </span>
25271
25271
  </span>
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
- }
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
+ }
25286
25286
  return `<div class="pf-v5-c-code-block">
25287
25287
  <div class="pf-v5-c-code-block__header">
25288
25288
  <div class="pf-v5-c-code-block__actions">
@@ -25299,9 +25299,9 @@ const useMultilineCopyClipboardShowdownExtension = () => {
25299
25299
  ${MARKDOWN_SNIPPET_ID}="${groupId}">${group.trim()}</code>
25300
25300
  </pre>
25301
25301
  </div>
25302
- </div>`;
25303
- },
25304
- }), [getResource]);
25302
+ </div>`;
25303
+ },
25304
+ }), [getResource]);
25305
25305
  };
25306
25306
 
25307
25307
  var lightbulbIcon = createCommonjsModule(function (module, exports) {
@@ -29758,133 +29758,133 @@ if (module.exports) {
29758
29758
 
29759
29759
  });
29760
29760
 
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'));
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'));
29886
29886
  const linkRefs = filteredLinks.reduce((refs, link) => `${refs}
29887
- <link rel="stylesheet" href="${link.href}">`, '');
29887
+ <link rel="stylesheet" href="${link.href}">`, '');
29888
29888
  const contents = `
29889
29889
  ${linkRefs}
29890
29890
  <style type="text/css">
@@ -29909,148 +29909,148 @@ const IFrameMarkdownView = ({ exactHeight, markup, isEmpty, renderExtension, cla
29909
29909
  padding-top: 0;
29910
29910
  }
29911
29911
  </style>
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 }))));
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 }))));
29916
29916
  };
29917
29917
 
29918
- const LINK_LABEL = '[\\d\\w\\s-()$!]+';
29919
- const HIGHLIGHT_ACTIONS = ['highlight'];
29920
- const SELECTOR_ID = `[\\w-]+`;
29921
- // [linkLabel]{{action id}}
29918
+ const LINK_LABEL = '[\\d\\w\\s-()$!]+';
29919
+ const HIGHLIGHT_ACTIONS = ['highlight'];
29920
+ const SELECTOR_ID = `[\\w-]+`;
29921
+ // [linkLabel]{{action id}}
29922
29922
  const HIGHLIGHT_REGEXP = new RegExp(`\\[(${LINK_LABEL})]{{(${HIGHLIGHT_ACTIONS.join('|')}) (${SELECTOR_ID})}}`, 'g');
29923
29923
 
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
- },
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
+ },
29997
29997
  }), []);
29998
29998
 
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
- },
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
+ },
30009
30009
  }), []);
30010
30010
 
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
- },
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
+ },
30021
30021
  }), []);
30022
30022
 
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);
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);
30054
30054
  };
30055
30055
 
30056
30056
  var syncAltIcon = createCommonjsModule(function (module, exports) {
@@ -30071,26 +30071,26 @@ var SyncAltIcon = /*@__PURE__*/getDefaultExportFromCjs(syncAltIcon);
30071
30071
 
30072
30072
  const DASH = '-';
30073
30073
 
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 },
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 },
30075
30075
  React.createElement(Button, { variant: "link", isInline: true }, statusBody)));
30076
30076
 
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" })));
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" })));
30087
30087
  };
30088
30088
 
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);
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);
30094
30094
  };
30095
30095
 
30096
30096
  var checkCircleIcon = createCommonjsModule(function (module, exports) {
@@ -30147,68 +30147,68 @@ const global_palette_green_500 = {
30147
30147
  "var": "var(--pf-v5-global--palette--green-500)"
30148
30148
  };
30149
30149
 
30150
- const GreenCheckCircleIcon = ({ className, title, size }) => (React.createElement(Icon, { size: size },
30150
+ const GreenCheckCircleIcon = ({ className, title, size }) => (React.createElement(Icon, { size: size },
30151
30151
  React.createElement(CheckCircleIcon, { "data-test": "success-icon", color: global_palette_green_500.value, className: className, title: title })));
30152
30152
 
30153
- 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' })));
30154
30154
  SuccessStatus.displayName = 'SuccessStatus';
30155
30155
 
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
- };
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
+ };
30167
30167
  const StatusIcon = ({ status }) => (React.createElement(Status, { status: status, iconOnly: true }));
30168
30168
 
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'))))));
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'))))));
30212
30212
  };
30213
30213
 
30214
30214
  var externalLinkAltIcon = createCommonjsModule(function (module, exports) {
@@ -30227,11 +30227,11 @@ exports["default"] = exports.ExternalLinkAltIcon;
30227
30227
 
30228
30228
  var ExternalLinkAltIcon = /*@__PURE__*/getDefaultExportFromCjs(externalLinkAltIcon);
30229
30229
 
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))));
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))));
30235
30235
  };
30236
30236
 
30237
30237
  var outlinedClockIcon = createCommonjsModule(function (module, exports) {
@@ -30250,293 +30250,293 @@ exports["default"] = exports.OutlinedClockIcon;
30250
30250
 
30251
30251
  var OutlinedClockIcon = /*@__PURE__*/getDefaultExportFromCjs(outlinedClockIcon);
30252
30252
 
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
- };
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
+ };
30433
30433
  const QuickStartCatalogFilterCountWrapper = ({ quickStartsCount }) => React.createElement(QuickStartCatalogFilterCount, { quickStartsCount: quickStartsCount });
30434
30434
 
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),
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),
30527
30527
  hint && React.createElement("div", { className: "pfext-page-layout__hint" }, hint)));
30528
30528
 
30529
30529
  const QuickStartCatalogSection = ({ children }) => (React.createElement("div", { className: "pfext-page-layout__content" }, children));
30530
30530
 
30531
30531
  const QuickStartCatalogToolbar = ({ children }) => (React.createElement(Toolbar, { usePageInsets: true, className: "pfext-quick-start-catalog-filter__flex" }, children));
30532
30532
 
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.')));
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.')));
30540
30540
  };
30541
30541
 
30542
30542
  var arrowRightIcon = createCommonjsModule(function (module, exports) {
@@ -30555,395 +30555,395 @@ exports["default"] = exports.ArrowRightIcon;
30555
30555
 
30556
30556
  var ArrowRightIcon = /*@__PURE__*/getDefaultExportFromCjs(arrowRightIcon);
30557
30557
 
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));
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));
30609
30609
  };
30610
30610
 
30611
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;
30612
30612
 
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 }))));
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 }))));
30703
30703
  });
30704
30704
 
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 })));
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 })));
30947
30947
  };
30948
30948
 
30949
30949
  var barsIcon = createCommonjsModule(function (module, exports) {
@@ -30962,242 +30962,242 @@ exports["default"] = exports.BarsIcon;
30962
30962
 
30963
30963
  var BarsIcon = /*@__PURE__*/getDefaultExportFromCjs(barsIcon);
30964
30964
 
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
- };
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
+ };
31000
31000
  };
31001
31001
 
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)))));
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)))));
31066
31066
  };
31067
31067
 
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];
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];
31103
31103
  };
31104
31104
 
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:
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:
31146
31146
 
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>
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>
31154
31154
 
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;
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;
31201
31201
  };
31202
31202
 
31203
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 };