@strapi/admin 5.25.0 → 5.26.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 (134) hide show
  1. package/dist/admin/admin/src/App.js +6 -2
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +7 -3
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/GuidedTour/Context.js +11 -1
  6. package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
  7. package/dist/admin/admin/src/components/GuidedTour/Context.mjs +11 -1
  8. package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js +160 -23
  10. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
  11. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs +162 -25
  12. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +28 -9
  14. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
  15. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs +30 -11
  16. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js +2 -1
  18. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js.map +1 -1
  19. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs +2 -1
  20. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/NpsSurvey.js +2 -1
  22. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  23. package/dist/admin/admin/src/components/NpsSurvey.mjs +2 -1
  24. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  25. package/dist/admin/admin/src/features/Tracking.js +2 -1
  26. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  27. package/dist/admin/admin/src/features/Tracking.mjs +2 -1
  28. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  29. package/dist/admin/admin/src/hooks/useAIAvailability.js +13 -0
  30. package/dist/admin/admin/src/hooks/useAIAvailability.js.map +1 -0
  31. package/dist/admin/admin/src/hooks/useAIAvailability.mjs +11 -0
  32. package/dist/admin/admin/src/hooks/useAIAvailability.mjs.map +1 -0
  33. package/dist/admin/admin/src/pages/Home/HomePage.js +1 -0
  34. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Home/HomePage.mjs +1 -0
  36. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +12 -1
  38. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  39. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +12 -1
  40. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  41. package/dist/admin/admin/src/render.js +6 -1
  42. package/dist/admin/admin/src/render.js.map +1 -1
  43. package/dist/admin/admin/src/render.mjs +6 -1
  44. package/dist/admin/admin/src/render.mjs.map +1 -1
  45. package/dist/admin/admin/src/translations/en.json.js +2 -0
  46. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  47. package/dist/admin/admin/src/translations/en.json.mjs +2 -0
  48. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  49. package/dist/admin/ee/admin/src/components/GlobalNotifications.js +11 -0
  50. package/dist/admin/ee/admin/src/components/GlobalNotifications.js.map +1 -0
  51. package/dist/admin/ee/admin/src/components/GlobalNotifications.mjs +9 -0
  52. package/dist/admin/ee/admin/src/components/GlobalNotifications.mjs.map +1 -0
  53. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js +11 -0
  54. package/dist/admin/ee/admin/src/hooks/useAIAvailability.js.map +1 -0
  55. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs +9 -0
  56. package/dist/admin/ee/admin/src/hooks/useAIAvailability.mjs.map +1 -0
  57. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js +82 -0
  58. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.js.map +1 -0
  59. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs +80 -0
  60. package/dist/admin/ee/admin/src/hooks/useAIUsageWarning.mjs.map +1 -0
  61. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +102 -0
  62. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -0
  63. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +100 -0
  64. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -0
  65. package/dist/admin/ee/admin/src/services/ai.js +30 -0
  66. package/dist/admin/ee/admin/src/services/ai.js.map +1 -0
  67. package/dist/admin/ee/admin/src/services/ai.mjs +26 -0
  68. package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -0
  69. package/dist/admin/ee.js +4 -0
  70. package/dist/admin/ee.js.map +1 -1
  71. package/dist/admin/ee.mjs +2 -0
  72. package/dist/admin/ee.mjs.map +1 -1
  73. package/dist/admin/index.js +2 -0
  74. package/dist/admin/index.js.map +1 -1
  75. package/dist/admin/index.mjs +1 -0
  76. package/dist/admin/index.mjs.map +1 -1
  77. package/dist/admin/src/components/GuidedTour/Context.d.ts +7 -0
  78. package/dist/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.d.ts +7 -16
  79. package/dist/admin/src/components/GuidedTour/Tours.d.ts +1 -22
  80. package/dist/admin/src/ee.d.ts +2 -0
  81. package/dist/admin/src/features/Tracking.d.ts +21 -2
  82. package/dist/admin/src/hooks/useAIAvailability.d.ts +5 -0
  83. package/dist/admin/src/index.d.ts +2 -0
  84. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  85. package/dist/admin/src/services/admin.d.ts +1 -0
  86. package/dist/ee/admin/src/components/GlobalNotifications.d.ts +1 -0
  87. package/dist/ee/admin/src/hooks/useAIAvailability.d.ts +1 -0
  88. package/dist/ee/admin/src/hooks/useAIUsageWarning.d.ts +5 -0
  89. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +1 -1
  90. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +1 -0
  91. package/dist/ee/admin/src/services/ai.d.ts +9 -0
  92. package/dist/ee/server/src/ai/controllers/ai.d.ts +7 -0
  93. package/dist/ee/server/src/ai/controllers/ai.d.ts.map +1 -0
  94. package/dist/ee/server/src/ai/routes/ai.d.ts +13 -0
  95. package/dist/ee/server/src/ai/routes/ai.d.ts.map +1 -0
  96. package/dist/ee/server/src/controllers/admin.d.ts +3 -0
  97. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  98. package/dist/ee/server/src/controllers/index.d.ts +3 -0
  99. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  100. package/dist/ee/server/src/index.d.ts +15 -187
  101. package/dist/ee/server/src/index.d.ts.map +1 -1
  102. package/dist/server/ee/server/src/ai/controllers/ai.js +218 -0
  103. package/dist/server/ee/server/src/ai/controllers/ai.js.map +1 -0
  104. package/dist/server/ee/server/src/ai/controllers/ai.mjs +216 -0
  105. package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +1 -0
  106. package/dist/server/ee/server/src/ai/routes/ai.js +32 -0
  107. package/dist/server/ee/server/src/ai/routes/ai.js.map +1 -0
  108. package/dist/server/ee/server/src/ai/routes/ai.mjs +30 -0
  109. package/dist/server/ee/server/src/ai/routes/ai.mjs.map +1 -0
  110. package/dist/server/ee/server/src/controllers/admin.js +4 -1
  111. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  112. package/dist/server/ee/server/src/controllers/admin.mjs +4 -1
  113. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  114. package/dist/server/ee/server/src/index.js +37 -23
  115. package/dist/server/ee/server/src/index.js.map +1 -1
  116. package/dist/server/ee/server/src/index.mjs +37 -23
  117. package/dist/server/ee/server/src/index.mjs.map +1 -1
  118. package/dist/server/server/src/controllers/admin.js +5 -1
  119. package/dist/server/server/src/controllers/admin.js.map +1 -1
  120. package/dist/server/server/src/controllers/admin.mjs +5 -1
  121. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  122. package/dist/server/src/controllers/admin.d.ts +2 -0
  123. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  124. package/dist/server/src/controllers/index.d.ts +2 -0
  125. package/dist/server/src/controllers/index.d.ts.map +1 -1
  126. package/dist/server/src/index.d.ts +2 -0
  127. package/dist/server/src/index.d.ts.map +1 -1
  128. package/dist/shared/contracts/admin.d.ts +1 -0
  129. package/dist/shared/contracts/admin.d.ts.map +1 -1
  130. package/dist/shared/contracts/ai.d.ts +40 -0
  131. package/dist/shared/contracts/ai.d.ts.map +1 -0
  132. package/dist/shared/contracts/users.d.ts +16 -0
  133. package/dist/shared/contracts/users.d.ts.map +1 -1
  134. package/package.json +7 -7
@@ -3,6 +3,7 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var reactRouterDom = require('react-router-dom');
6
+ var GlobalNotifications = require('../../ee/admin/src/components/GlobalNotifications.js');
6
7
  var PageHelpers = require('./components/PageHelpers.js');
7
8
  var Providers = require('./components/Providers.js');
8
9
  var reducer = require('./reducer.js');
@@ -17,9 +18,12 @@ const App = ({ strapi, store })=>{
17
18
  return /*#__PURE__*/ jsxRuntime.jsx(Providers.Providers, {
18
19
  strapi: strapi,
19
20
  store: store,
20
- children: /*#__PURE__*/ jsxRuntime.jsx(React.Suspense, {
21
+ children: /*#__PURE__*/ jsxRuntime.jsxs(React.Suspense, {
21
22
  fallback: /*#__PURE__*/ jsxRuntime.jsx(PageHelpers.Page.Loading, {}),
22
- children: /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Outlet, {})
23
+ children: [
24
+ /*#__PURE__*/ jsxRuntime.jsx(GlobalNotifications.GlobalNotifications, {}),
25
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Outlet, {})
26
+ ]
23
27
  })
24
28
  });
25
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"App.js","sources":["../../../../admin/src/App.tsx"],"sourcesContent":["/**\n *\n * App.js\n *\n */\nimport { Suspense, useEffect } from 'react';\n\nimport { Outlet } from 'react-router-dom';\n\nimport { Page } from './components/PageHelpers';\nimport { Providers } from './components/Providers';\nimport { LANGUAGE_LOCAL_STORAGE_KEY } from './reducer';\n\nimport type { Store } from './core/store/configure';\nimport type { StrapiApp } from './StrapiApp';\n\ninterface AppProps {\n strapi: StrapiApp;\n store: Store;\n}\n\nconst App = ({ strapi, store }: AppProps) => {\n useEffect(() => {\n const language = localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || 'en';\n\n if (language) {\n document.documentElement.lang = language;\n }\n }, []);\n\n return (\n <Providers strapi={strapi} store={store}>\n <Suspense fallback={<Page.Loading />}>\n <Outlet />\n </Suspense>\n </Providers>\n );\n};\n\nexport { App };\nexport type { AppProps };\n"],"names":["App","strapi","store","useEffect","language","localStorage","getItem","LANGUAGE_LOCAL_STORAGE_KEY","document","documentElement","lang","_jsx","Providers","Suspense","fallback","Page","Loading","Outlet"],"mappings":";;;;;;;;;AAqBA,MAAMA,MAAM,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAY,GAAA;IACtCC,eAAU,CAAA,IAAA;AACR,QAAA,MAAMC,QAAWC,GAAAA,YAAAA,CAAaC,OAAO,CAACC,kCAA+B,CAAA,IAAA,IAAA;AAErE,QAAA,IAAIH,QAAU,EAAA;YACZI,QAASC,CAAAA,eAAe,CAACC,IAAI,GAAGN,QAAAA;AAClC;AACF,KAAA,EAAG,EAAE,CAAA;AAEL,IAAA,qBACEO,cAACC,CAAAA,mBAAAA,EAAAA;QAAUX,MAAQA,EAAAA,MAAAA;QAAQC,KAAOA,EAAAA,KAAAA;AAChC,QAAA,QAAA,gBAAAS,cAACE,CAAAA,cAAAA,EAAAA;YAASC,QAAU,gBAAAH,cAAA,CAACI,iBAAKC,OAAO,EAAA,EAAA,CAAA;AAC/B,YAAA,QAAA,gBAAAL,cAACM,CAAAA,qBAAAA,EAAAA,EAAAA;;;AAIT;;;;"}
1
+ {"version":3,"file":"App.js","sources":["../../../../admin/src/App.tsx"],"sourcesContent":["/**\n *\n * App.js\n *\n */\nimport { Suspense, useEffect } from 'react';\n\nimport { Outlet } from 'react-router-dom';\n\nimport { GlobalNotifications } from '../../ee/admin/src/components/GlobalNotifications';\n\nimport { Page } from './components/PageHelpers';\nimport { Providers } from './components/Providers';\nimport { LANGUAGE_LOCAL_STORAGE_KEY } from './reducer';\n\nimport type { Store } from './core/store/configure';\nimport type { StrapiApp } from './StrapiApp';\n\ninterface AppProps {\n strapi: StrapiApp;\n store: Store;\n}\n\nconst App = ({ strapi, store }: AppProps) => {\n useEffect(() => {\n const language = localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || 'en';\n\n if (language) {\n document.documentElement.lang = language;\n }\n }, []);\n\n return (\n <Providers strapi={strapi} store={store}>\n <Suspense fallback={<Page.Loading />}>\n <GlobalNotifications />\n <Outlet />\n </Suspense>\n </Providers>\n );\n};\n\nexport { App };\nexport type { AppProps };\n"],"names":["App","strapi","store","useEffect","language","localStorage","getItem","LANGUAGE_LOCAL_STORAGE_KEY","document","documentElement","lang","_jsx","Providers","_jsxs","Suspense","fallback","Page","Loading","GlobalNotifications","Outlet"],"mappings":";;;;;;;;;;AAuBA,MAAMA,MAAM,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAY,GAAA;IACtCC,eAAU,CAAA,IAAA;AACR,QAAA,MAAMC,QAAWC,GAAAA,YAAAA,CAAaC,OAAO,CAACC,kCAA+B,CAAA,IAAA,IAAA;AAErE,QAAA,IAAIH,QAAU,EAAA;YACZI,QAASC,CAAAA,eAAe,CAACC,IAAI,GAAGN,QAAAA;AAClC;AACF,KAAA,EAAG,EAAE,CAAA;AAEL,IAAA,qBACEO,cAACC,CAAAA,mBAAAA,EAAAA;QAAUX,MAAQA,EAAAA,MAAAA;QAAQC,KAAOA,EAAAA,KAAAA;AAChC,QAAA,QAAA,gBAAAW,eAACC,CAAAA,cAAAA,EAAAA;YAASC,QAAU,gBAAAJ,cAAA,CAACK,iBAAKC,OAAO,EAAA,EAAA,CAAA;;8BAC/BN,cAACO,CAAAA,uCAAAA,EAAAA,EAAAA,CAAAA;8BACDP,cAACQ,CAAAA,qBAAAA,EAAAA,EAAAA;;;;AAIT;;;;"}
@@ -1,6 +1,7 @@
1
- import { jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useEffect, Suspense } from 'react';
3
3
  import { Outlet } from 'react-router-dom';
4
+ import { GlobalNotifications } from '../../ee/admin/src/components/GlobalNotifications.mjs';
4
5
  import { Page } from './components/PageHelpers.mjs';
5
6
  import { Providers } from './components/Providers.mjs';
6
7
  import { LANGUAGE_LOCAL_STORAGE_KEY } from './reducer.mjs';
@@ -15,9 +16,12 @@ const App = ({ strapi, store })=>{
15
16
  return /*#__PURE__*/ jsx(Providers, {
16
17
  strapi: strapi,
17
18
  store: store,
18
- children: /*#__PURE__*/ jsx(Suspense, {
19
+ children: /*#__PURE__*/ jsxs(Suspense, {
19
20
  fallback: /*#__PURE__*/ jsx(Page.Loading, {}),
20
- children: /*#__PURE__*/ jsx(Outlet, {})
21
+ children: [
22
+ /*#__PURE__*/ jsx(GlobalNotifications, {}),
23
+ /*#__PURE__*/ jsx(Outlet, {})
24
+ ]
21
25
  })
22
26
  });
23
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"App.mjs","sources":["../../../../admin/src/App.tsx"],"sourcesContent":["/**\n *\n * App.js\n *\n */\nimport { Suspense, useEffect } from 'react';\n\nimport { Outlet } from 'react-router-dom';\n\nimport { Page } from './components/PageHelpers';\nimport { Providers } from './components/Providers';\nimport { LANGUAGE_LOCAL_STORAGE_KEY } from './reducer';\n\nimport type { Store } from './core/store/configure';\nimport type { StrapiApp } from './StrapiApp';\n\ninterface AppProps {\n strapi: StrapiApp;\n store: Store;\n}\n\nconst App = ({ strapi, store }: AppProps) => {\n useEffect(() => {\n const language = localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || 'en';\n\n if (language) {\n document.documentElement.lang = language;\n }\n }, []);\n\n return (\n <Providers strapi={strapi} store={store}>\n <Suspense fallback={<Page.Loading />}>\n <Outlet />\n </Suspense>\n </Providers>\n );\n};\n\nexport { App };\nexport type { AppProps };\n"],"names":["App","strapi","store","useEffect","language","localStorage","getItem","LANGUAGE_LOCAL_STORAGE_KEY","document","documentElement","lang","_jsx","Providers","Suspense","fallback","Page","Loading","Outlet"],"mappings":";;;;;;;AAqBA,MAAMA,MAAM,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAY,GAAA;IACtCC,SAAU,CAAA,IAAA;AACR,QAAA,MAAMC,QAAWC,GAAAA,YAAAA,CAAaC,OAAO,CAACC,0BAA+B,CAAA,IAAA,IAAA;AAErE,QAAA,IAAIH,QAAU,EAAA;YACZI,QAASC,CAAAA,eAAe,CAACC,IAAI,GAAGN,QAAAA;AAClC;AACF,KAAA,EAAG,EAAE,CAAA;AAEL,IAAA,qBACEO,GAACC,CAAAA,SAAAA,EAAAA;QAAUX,MAAQA,EAAAA,MAAAA;QAAQC,KAAOA,EAAAA,KAAAA;AAChC,QAAA,QAAA,gBAAAS,GAACE,CAAAA,QAAAA,EAAAA;YAASC,QAAU,gBAAAH,GAAA,CAACI,KAAKC,OAAO,EAAA,EAAA,CAAA;AAC/B,YAAA,QAAA,gBAAAL,GAACM,CAAAA,MAAAA,EAAAA,EAAAA;;;AAIT;;;;"}
1
+ {"version":3,"file":"App.mjs","sources":["../../../../admin/src/App.tsx"],"sourcesContent":["/**\n *\n * App.js\n *\n */\nimport { Suspense, useEffect } from 'react';\n\nimport { Outlet } from 'react-router-dom';\n\nimport { GlobalNotifications } from '../../ee/admin/src/components/GlobalNotifications';\n\nimport { Page } from './components/PageHelpers';\nimport { Providers } from './components/Providers';\nimport { LANGUAGE_LOCAL_STORAGE_KEY } from './reducer';\n\nimport type { Store } from './core/store/configure';\nimport type { StrapiApp } from './StrapiApp';\n\ninterface AppProps {\n strapi: StrapiApp;\n store: Store;\n}\n\nconst App = ({ strapi, store }: AppProps) => {\n useEffect(() => {\n const language = localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || 'en';\n\n if (language) {\n document.documentElement.lang = language;\n }\n }, []);\n\n return (\n <Providers strapi={strapi} store={store}>\n <Suspense fallback={<Page.Loading />}>\n <GlobalNotifications />\n <Outlet />\n </Suspense>\n </Providers>\n );\n};\n\nexport { App };\nexport type { AppProps };\n"],"names":["App","strapi","store","useEffect","language","localStorage","getItem","LANGUAGE_LOCAL_STORAGE_KEY","document","documentElement","lang","_jsx","Providers","_jsxs","Suspense","fallback","Page","Loading","GlobalNotifications","Outlet"],"mappings":";;;;;;;;AAuBA,MAAMA,MAAM,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAY,GAAA;IACtCC,SAAU,CAAA,IAAA;AACR,QAAA,MAAMC,QAAWC,GAAAA,YAAAA,CAAaC,OAAO,CAACC,0BAA+B,CAAA,IAAA,IAAA;AAErE,QAAA,IAAIH,QAAU,EAAA;YACZI,QAASC,CAAAA,eAAe,CAACC,IAAI,GAAGN,QAAAA;AAClC;AACF,KAAA,EAAG,EAAE,CAAA;AAEL,IAAA,qBACEO,GAACC,CAAAA,SAAAA,EAAAA;QAAUX,MAAQA,EAAAA,MAAAA;QAAQC,KAAOA,EAAAA,KAAAA;AAChC,QAAA,QAAA,gBAAAW,IAACC,CAAAA,QAAAA,EAAAA;YAASC,QAAU,gBAAAJ,GAAA,CAACK,KAAKC,OAAO,EAAA,EAAA,CAAA;;8BAC/BN,GAACO,CAAAA,mBAAAA,EAAAA,EAAAA,CAAAA;8BACDP,GAACQ,CAAAA,MAAAA,EAAAA,EAAAA;;;;AAIT;;;;"}
@@ -33,7 +33,8 @@ const getInitialTourState = (tours)=>{
33
33
  return Object.keys(tours).reduce((acc, tourName)=>{
34
34
  acc[tourName] = {
35
35
  currentStep: 0,
36
- isCompleted: false
36
+ isCompleted: false,
37
+ tourType: undefined
37
38
  };
38
39
  return acc;
39
40
  }, {});
@@ -82,6 +83,15 @@ function reducer(state, action) {
82
83
  if (action.type === 'go_to_step') {
83
84
  draft.tours[action.payload.tourName].currentStep = action.payload.step;
84
85
  }
86
+ if (action.type === 'set_tour_type') {
87
+ const { tourName, tourType } = action.payload;
88
+ const currentTour = draft.tours[tourName];
89
+ // If tour type changes and tour is not completed, reset to step 0
90
+ if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {
91
+ currentTour.currentStep = 0;
92
+ }
93
+ currentTour.tourType = tourType;
94
+ }
85
95
  });
86
96
  }
87
97
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
@@ -1 +1 @@
1
- {"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n };\n\ntype TourState = Record<ValidTourName, { currentStep: number; isCompleted: boolean }>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n }\n | {\n type: 'set_tour_type';\n payload: {\n tourName: ValidTourName;\n tourType: 'ContentTypeBuilderAI' | 'ContentTypeBuilderNoAI';\n };\n };\n\ntype TourState = Record<\n ValidTourName,\n { currentStep: number; isCompleted: boolean; tourType?: string }\n>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n tourType: undefined,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n\n if (action.type === 'set_tour_type') {\n const { tourName, tourType } = action.payload;\n const currentTour = draft.tours[tourName];\n\n // If tour type changes and tour is not completed, reset to step 0\n if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {\n currentTour.currentStep = 0;\n }\n\n currentTour.tourType = tourType;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","tourType","undefined","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","currentTour","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
@@ -12,7 +12,8 @@ const getInitialTourState = (tours)=>{
12
12
  return Object.keys(tours).reduce((acc, tourName)=>{
13
13
  acc[tourName] = {
14
14
  currentStep: 0,
15
- isCompleted: false
15
+ isCompleted: false,
16
+ tourType: undefined
16
17
  };
17
18
  return acc;
18
19
  }, {});
@@ -61,6 +62,15 @@ function reducer(state, action) {
61
62
  if (action.type === 'go_to_step') {
62
63
  draft.tours[action.payload.tourName].currentStep = action.payload.step;
63
64
  }
65
+ if (action.type === 'set_tour_type') {
66
+ const { tourName, tourType } = action.payload;
67
+ const currentTour = draft.tours[tourName];
68
+ // If tour type changes and tour is not completed, reset to step 0
69
+ if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {
70
+ currentTour.currentStep = 0;
71
+ }
72
+ currentTour.tourType = tourType;
73
+ }
64
74
  });
65
75
  }
66
76
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
@@ -1 +1 @@
1
- {"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n };\n\ntype TourState = Record<ValidTourName, { currentStep: number; isCompleted: boolean }>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n }\n | {\n type: 'set_tour_type';\n payload: {\n tourName: ValidTourName;\n tourType: 'ContentTypeBuilderAI' | 'ContentTypeBuilderNoAI';\n };\n };\n\ntype TourState = Record<\n ValidTourName,\n { currentStep: number; isCompleted: boolean; tourType?: string }\n>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n tourType: undefined,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n\n if (action.type === 'set_tour_type') {\n const { tourName, tourType } = action.payload;\n const currentTour = draft.tours[tourName];\n\n // If tour type changes and tour is not completed, reset to step 0\n if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {\n currentTour.currentStep = 0;\n }\n\n currentTour.tourType = tourType;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","tourType","undefined","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","currentTour","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
@@ -1,11 +1,106 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ require('react');
4
5
  var reactRouterDom = require('react-router-dom');
6
+ var useAIAvailability = require('../../../hooks/useAIAvailability.js');
5
7
  var admin = require('../../../services/admin.js');
8
+ var Context = require('../Context.js');
9
+ var Tours = require('../Tours.js');
6
10
  var constants = require('../utils/constants.js');
7
11
  var Step = require('./Step.js');
8
12
 
13
+ const ContentTypeBuilderActions = ({ ...props })=>{
14
+ const state = Context.useGuidedTour('ContentTypeBuilderActions', (s)=>s.state);
15
+ const dispatch = Context.useGuidedTour('ContentTypeBuilderActions', (s)=>s.dispatch);
16
+ const isAIEnabled = useAIAvailability.useAIAvailability();
17
+ const currentStepOffset = state.tours.contentTypeBuilder.currentStep + 1;
18
+ const displayedCurrentStep = (()=>{
19
+ if (!isAIEnabled && currentStepOffset > contentTypeBuilderStepsAI.length) {
20
+ // If AI is not enabled, we remove the AI steps
21
+ return currentStepOffset - contentTypeBuilderStepsAI.length;
22
+ } else if (isAIEnabled && currentStepOffset > contentTypeBuilderStepsNoAI.length) {
23
+ // If AI is enabled, we remove the non-AI steps
24
+ return currentStepOffset - contentTypeBuilderStepsNoAI.length;
25
+ }
26
+ return currentStepOffset;
27
+ })();
28
+ // When AI is enabled, we subtract the no AI steps and vice versa
29
+ const displayedTourLength = isAIEnabled ? Tours.tours.contentTypeBuilder._meta.displayedStepCount - contentTypeBuilderStepsNoAI.length : Tours.tours.contentTypeBuilder._meta.displayedStepCount - contentTypeBuilderStepsAI.length;
30
+ const handleNextStep = ()=>{
31
+ const currentStep = state.tours.contentTypeBuilder.currentStep;
32
+ if (!isAIEnabled && currentStep === 0) {
33
+ // If AI is disabled, after Introduction (step 0), skip AI steps and go to first NoAI step
34
+ const nextStep = 1 + contentTypeBuilderStepsAI.length; // Skip AI steps
35
+ dispatch({
36
+ type: 'go_to_step',
37
+ payload: {
38
+ tourName: 'contentTypeBuilder',
39
+ step: nextStep
40
+ }
41
+ });
42
+ } else if (isAIEnabled && currentStep === contentTypeBuilderStepsAI.length) {
43
+ // If AI is enabled, after AI steps, skip NoAI steps and go to Save/Finish
44
+ const nextStep = 1 + contentTypeBuilderStepsAI.length + contentTypeBuilderStepsNoAI.length;
45
+ dispatch({
46
+ type: 'go_to_step',
47
+ payload: {
48
+ tourName: 'contentTypeBuilder',
49
+ step: nextStep
50
+ }
51
+ });
52
+ } else {
53
+ // Normal step progression
54
+ dispatch({
55
+ type: 'next_step',
56
+ payload: 'contentTypeBuilder'
57
+ });
58
+ }
59
+ };
60
+ const handlePreviousStep = ()=>{
61
+ const currentStep = state.tours.contentTypeBuilder.currentStep;
62
+ if (!isAIEnabled && currentStep === 1 + contentTypeBuilderStepsAI.length) {
63
+ // If AI is disabled and we're at the first NoAI step, go back to Introduction (step 0)
64
+ dispatch({
65
+ type: 'go_to_step',
66
+ payload: {
67
+ tourName: 'contentTypeBuilder',
68
+ step: 0
69
+ }
70
+ });
71
+ } else if (isAIEnabled && currentStep === 1 + contentTypeBuilderStepsAI.length + contentTypeBuilderStepsNoAI.length) {
72
+ // If AI is enabled and we're at Save/Finish, go back to last AI step
73
+ dispatch({
74
+ type: 'go_to_step',
75
+ payload: {
76
+ tourName: 'contentTypeBuilder',
77
+ step: contentTypeBuilderStepsAI.length
78
+ }
79
+ });
80
+ } else {
81
+ // Normal step progression
82
+ dispatch({
83
+ type: 'previous_step',
84
+ payload: 'contentTypeBuilder'
85
+ });
86
+ }
87
+ };
88
+ return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
89
+ children: [
90
+ /*#__PURE__*/ jsxRuntime.jsx(Step.StepCount, {
91
+ tourName: "contentTypeBuilder",
92
+ displayedCurrentStep: displayedCurrentStep,
93
+ displayedTourLength: displayedTourLength
94
+ }),
95
+ props.children || /*#__PURE__*/ jsxRuntime.jsx(Step.DefaultActions, {
96
+ tourName: "contentTypeBuilder",
97
+ onNextStep: handleNextStep,
98
+ onPreviousStep: handlePreviousStep,
99
+ ...props
100
+ })
101
+ ]
102
+ });
103
+ };
9
104
  /* -------------------------------------------------------------------------------------------------
10
105
  * Step Components
11
106
  * -----------------------------------------------------------------------------------------------*/ const Introduction = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
@@ -21,7 +116,27 @@ var Step = require('./Step.js');
21
116
  defaultMessage: "Create and manage your content structure with collection types, single types and components."
22
117
  }),
23
118
  /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {
24
- showPrevious: false
119
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
120
+ showSkip: true
121
+ })
122
+ })
123
+ ]
124
+ });
125
+ const AIChat = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
126
+ side: "left",
127
+ children: [
128
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Title, {
129
+ id: "tours.contentTypeBuilder.AIChat.title",
130
+ defaultMessage: "Time to get started!"
131
+ }),
132
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Content, {
133
+ id: "tours.contentTypeBuilder.AIChat.content",
134
+ defaultMessage: "<p>If you have any questions about the Content-Type Builder or Strapi ask them here.</p><p>Strapi AI can generate schemas tailored to your needs. Ask for exactly what you want, for example:<ul><li>Date picker</li><li>Email and password fields</li><li>Media of any type</li><li>UIDs</li></ul></p><p>Don’t be shy, try it out !</p>"
135
+ }),
136
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {
137
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
138
+ showPrevious: true
139
+ })
25
140
  })
26
141
  ]
27
142
  });
@@ -37,7 +152,11 @@ const CollectionTypes = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
37
152
  id: "tours.contentTypeBuilder.CollectionTypes.content",
38
153
  defaultMessage: "A content structure that can manage multiple entries, such as articles or products."
39
154
  }),
40
- /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {})
155
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {
156
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
157
+ showPrevious: true
158
+ })
159
+ })
41
160
  ]
42
161
  });
43
162
  const SingleTypes = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
@@ -52,7 +171,11 @@ const SingleTypes = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
52
171
  id: "tours.contentTypeBuilder.SingleTypes.content",
53
172
  defaultMessage: "A content structure that can manage a single entry, such as a homepage or a header."
54
173
  }),
55
- /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {})
174
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {
175
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
176
+ showPrevious: true
177
+ })
178
+ })
56
179
  ]
57
180
  });
58
181
  const Components = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
@@ -67,7 +190,11 @@ const Components = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
67
190
  id: "tours.contentTypeBuilder.Components.content",
68
191
  defaultMessage: "A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards."
69
192
  }),
70
- /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {})
193
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {
194
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
195
+ showPrevious: true
196
+ })
197
+ })
71
198
  ]
72
199
  });
73
200
  const YourTurn = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
@@ -82,7 +209,11 @@ const YourTurn = ({ Step })=>/*#__PURE__*/ jsxRuntime.jsxs(Step.Root, {
82
209
  id: "tours.contentTypeBuilder.YourTurn.content",
83
210
  defaultMessage: "Create a collection type or single type and configure it."
84
211
  }),
85
- /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {})
212
+ /*#__PURE__*/ jsxRuntime.jsx(Step.Actions, {
213
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
214
+ showPrevious: true
215
+ })
216
+ })
86
217
  ]
87
218
  });
88
219
  const AddFields = ({ Step: Step$1, dispatch })=>/*#__PURE__*/ jsxRuntime.jsxs(Step$1.Root, {
@@ -96,18 +227,16 @@ const AddFields = ({ Step: Step$1, dispatch })=>/*#__PURE__*/ jsxRuntime.jsxs(St
96
227
  id: "tours.contentTypeBuilder.AddFields.content",
97
228
  defaultMessage: "Add the fields your content needs such as text, media and relations."
98
229
  }),
99
- /*#__PURE__*/ jsxRuntime.jsxs(Step$1.Actions, {
100
- children: [
101
- /*#__PURE__*/ jsxRuntime.jsx(Step.StepCount, {
102
- tourName: "contentTypeBuilder"
103
- }),
104
- /*#__PURE__*/ jsxRuntime.jsx(Step.GotItAction, {
230
+ /*#__PURE__*/ jsxRuntime.jsx(Step$1.Actions, {
231
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
232
+ showPrevious: true,
233
+ children: /*#__PURE__*/ jsxRuntime.jsx(Step.GotItAction, {
105
234
  onClick: ()=>dispatch({
106
235
  type: 'next_step',
107
236
  payload: 'contentTypeBuilder'
108
237
  })
109
238
  })
110
- ]
239
+ })
111
240
  })
112
241
  ]
113
242
  });
@@ -122,12 +251,10 @@ const Save = ({ Step: Step$1, dispatch })=>/*#__PURE__*/ jsxRuntime.jsxs(Step$1.
122
251
  id: "tours.contentTypeBuilder.Save.content",
123
252
  defaultMessage: "Save the changes you made here before leaving this page."
124
253
  }),
125
- /*#__PURE__*/ jsxRuntime.jsxs(Step$1.Actions, {
126
- children: [
127
- /*#__PURE__*/ jsxRuntime.jsx(Step.StepCount, {
128
- tourName: "contentTypeBuilder"
129
- }),
130
- /*#__PURE__*/ jsxRuntime.jsx(Step.GotItAction, {
254
+ /*#__PURE__*/ jsxRuntime.jsx(Step$1.Actions, {
255
+ children: /*#__PURE__*/ jsxRuntime.jsx(ContentTypeBuilderActions, {
256
+ showPrevious: true,
257
+ children: /*#__PURE__*/ jsxRuntime.jsx(Step.GotItAction, {
131
258
  onClick: ()=>{
132
259
  // Ensure the completed action is removed
133
260
  // in the event the user already has a schema but is still doing the tour
@@ -141,7 +268,7 @@ const Save = ({ Step: Step$1, dispatch })=>/*#__PURE__*/ jsxRuntime.jsxs(Step$1.
141
268
  });
142
269
  }
143
270
  })
144
- ]
271
+ })
145
272
  })
146
273
  ]
147
274
  });
@@ -177,11 +304,13 @@ const Finish = ({ Step })=>{
177
304
  };
178
305
  /* -------------------------------------------------------------------------------------------------
179
306
  * Steps
180
- * -----------------------------------------------------------------------------------------------*/ const contentTypeBuilderSteps = [
307
+ * -----------------------------------------------------------------------------------------------*/ const contentTypeBuilderStepsAI = [
181
308
  {
182
- name: 'Introduction',
183
- content: Introduction
184
- },
309
+ name: 'AIChat',
310
+ content: AIChat
311
+ }
312
+ ];
313
+ const contentTypeBuilderStepsNoAI = [
185
314
  {
186
315
  name: 'CollectionTypes',
187
316
  content: CollectionTypes
@@ -201,7 +330,15 @@ const Finish = ({ Step })=>{
201
330
  {
202
331
  name: 'AddFields',
203
332
  content: AddFields
333
+ }
334
+ ];
335
+ const contentTypeBuilderSteps = [
336
+ {
337
+ name: 'Introduction',
338
+ content: Introduction
204
339
  },
340
+ ...contentTypeBuilderStepsAI,
341
+ ...contentTypeBuilderStepsNoAI,
205
342
  {
206
343
  name: 'Save',
207
344
  when: (completedActions)=>completedActions.includes(constants.GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField),
@@ -1 +1 @@
1
- {"version":3,"file":"ContentTypeBuilderSteps.js","sources":["../../../../../../../admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.tsx"],"sourcesContent":["import { UID } from '@strapi/types';\nimport { useParams } from 'react-router-dom';\n\nimport { useGetGuidedTourMetaQuery } from '../../../services/admin';\nimport { CompletedActions } from '../Context';\nimport { type StepContentProps } from '../Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from '../utils/constants';\n\nimport { GotItAction, StepCount } from './Step';\n\n/* -------------------------------------------------------------------------------------------------\n * Step Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst Introduction = ({ Step }: StepContentProps) => (\n <Step.Root sideOffset={33} withArrow={false}>\n <Step.Title\n id=\"tours.contentTypeBuilder.Introduction.title\"\n defaultMessage=\"Content-Type Builder\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Introduction.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions showPrevious={false} />\n </Step.Root>\n);\n\nconst CollectionTypes = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title\n id=\"tours.contentTypeBuilder.CollectionTypes.title\"\n defaultMessage=\"Collection Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.CollectionTypes.content\"\n defaultMessage=\"A content structure that can manage multiple entries, such as articles or products.\"\n />\n <Step.Actions />\n </Step.Root>\n);\n\nconst SingleTypes = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.SingleTypes.title\" defaultMessage=\"Single Types\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.SingleTypes.content\"\n defaultMessage=\"A content structure that can manage a single entry, such as a homepage or a header.\"\n />\n <Step.Actions />\n </Step.Root>\n);\n\nconst Components = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.Components.title\" defaultMessage=\"Components\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Components.content\"\n defaultMessage=\"A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards.\"\n />\n <Step.Actions />\n </Step.Root>\n);\n\nconst YourTurn = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.YourTurn.title\" defaultMessage=\"Your turn\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.YourTurn.content\"\n defaultMessage=\"Create a collection type or single type and configure it.\"\n />\n <Step.Actions />\n </Step.Root>\n);\n\nconst AddFields = ({ Step, dispatch }: StepContentProps) => (\n <Step.Root side=\"bottom\">\n <Step.Title\n id=\"tours.contentTypeBuilder.AddFields.title\"\n defaultMessage=\"Don't forget to add a field to your content type\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.AddFields.content\"\n defaultMessage=\"Add the fields your content needs such as text, media and relations.\"\n />\n <Step.Actions>\n <StepCount tourName=\"contentTypeBuilder\" />\n <GotItAction onClick={() => dispatch({ type: 'next_step', payload: 'contentTypeBuilder' })} />\n </Step.Actions>\n </Step.Root>\n);\n\nconst Save = ({ Step, dispatch }: StepContentProps) => (\n <Step.Root side=\"right\">\n <Step.Title id=\"tours.contentTypeBuilder.Save.title\" defaultMessage=\"Save before you leave!\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Save.content\"\n defaultMessage=\"Save the changes you made here before leaving this page.\"\n />\n <Step.Actions>\n <StepCount tourName=\"contentTypeBuilder\" />\n <GotItAction\n onClick={() => {\n // Ensure the completed action is removed\n // in the event the user already has a schema but is still doing the tour\n dispatch({\n type: 'remove_completed_action',\n payload: GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema,\n });\n dispatch({ type: 'next_step', payload: 'contentTypeBuilder' });\n }}\n />\n </Step.Actions>\n </Step.Root>\n);\n\nconst Finish = ({ Step }: StepContentProps) => {\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n const { '*': routeParams } = useParams();\n // Get the uid from the params\n const uid = routeParams?.split('/').pop();\n const contentType = uid ? guidedTourMeta?.data?.schemas?.[uid as UID.ContentType] : null;\n const contentTypeKindDictionary = {\n collectionType: 'collection-types',\n singleType: 'single-types',\n };\n\n const to = contentType\n ? `/content-manager/${contentTypeKindDictionary[contentType.kind]}/${contentType.uid}`\n : '/content-manager';\n\n return (\n <Step.Root side=\"right\">\n <Step.Title\n id=\"tours.contentTypeBuilder.Finish.title\"\n defaultMessage=\"It's time to create content!\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Finish.content\"\n defaultMessage=\"Now that you created content types, you'll be able to create content in the content manager.\"\n />\n <Step.Actions showStepCount={false} showPrevious={false} to={to} />\n </Step.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Steps\n * -----------------------------------------------------------------------------------------------*/\n\nexport const contentTypeBuilderSteps = [\n {\n name: 'Introduction',\n content: Introduction,\n },\n {\n name: 'CollectionTypes',\n content: CollectionTypes,\n },\n {\n name: 'SingleTypes',\n content: SingleTypes,\n },\n {\n name: 'Components',\n content: Components,\n },\n {\n name: 'YourTurn',\n content: YourTurn,\n },\n {\n name: 'AddFields',\n content: AddFields,\n },\n {\n name: 'Save',\n when: (completedActions: CompletedActions) =>\n completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField),\n content: Save,\n },\n {\n name: 'Finish',\n content: Finish,\n excludeFromStepCount: true,\n when: (completedActions: CompletedActions) =>\n completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema),\n },\n] as const;\n"],"names":["Introduction","Step","_jsxs","Root","sideOffset","withArrow","_jsx","Title","id","defaultMessage","Content","Actions","showPrevious","CollectionTypes","side","SingleTypes","Components","YourTurn","AddFields","dispatch","StepCount","tourName","GotItAction","onClick","type","payload","Save","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","Finish","data","guidedTourMeta","useGetGuidedTourMetaQuery","routeParams","useParams","uid","split","pop","contentType","schemas","contentTypeKindDictionary","collectionType","singleType","to","kind","showStepCount","contentTypeBuilderSteps","name","content","when","completedActions","includes","addField","excludeFromStepCount"],"mappings":"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"}
1
+ {"version":3,"file":"ContentTypeBuilderSteps.js","sources":["../../../../../../../admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { UID } from '@strapi/types';\nimport { useParams } from 'react-router-dom';\n\nimport { useAIAvailability } from '../../../hooks/useAIAvailability';\nimport { useGetGuidedTourMetaQuery } from '../../../services/admin';\nimport { CompletedActions, useGuidedTour } from '../Context';\nimport { tours, type StepContentProps } from '../Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from '../utils/constants';\n\nimport { GotItAction, StepCount, DefaultActions, DefaultActionsProps } from './Step';\n\nconst ContentTypeBuilderActions = ({\n ...props\n}: Omit<DefaultActionsProps, 'tourName'> & { children?: React.ReactNode }) => {\n const state = useGuidedTour('ContentTypeBuilderActions', (s) => s.state);\n const dispatch = useGuidedTour('ContentTypeBuilderActions', (s) => s.dispatch);\n\n const isAIEnabled = useAIAvailability();\n\n const currentStepOffset = state.tours.contentTypeBuilder.currentStep + 1;\n const displayedCurrentStep = (() => {\n if (!isAIEnabled && currentStepOffset > contentTypeBuilderStepsAI.length) {\n // If AI is not enabled, we remove the AI steps\n return currentStepOffset - contentTypeBuilderStepsAI.length;\n } else if (isAIEnabled && currentStepOffset > contentTypeBuilderStepsNoAI.length) {\n // If AI is enabled, we remove the non-AI steps\n return currentStepOffset - contentTypeBuilderStepsNoAI.length;\n }\n\n return currentStepOffset;\n })();\n\n // When AI is enabled, we subtract the no AI steps and vice versa\n const displayedTourLength = isAIEnabled\n ? tours.contentTypeBuilder._meta.displayedStepCount - contentTypeBuilderStepsNoAI.length\n : tours.contentTypeBuilder._meta.displayedStepCount - contentTypeBuilderStepsAI.length;\n\n const handleNextStep = () => {\n const currentStep = state.tours.contentTypeBuilder.currentStep;\n\n if (!isAIEnabled && currentStep === 0) {\n // If AI is disabled, after Introduction (step 0), skip AI steps and go to first NoAI step\n const nextStep = 1 + contentTypeBuilderStepsAI.length; // Skip AI steps\n dispatch({\n type: 'go_to_step',\n payload: { tourName: 'contentTypeBuilder', step: nextStep },\n });\n } else if (isAIEnabled && currentStep === contentTypeBuilderStepsAI.length) {\n // If AI is enabled, after AI steps, skip NoAI steps and go to Save/Finish\n const nextStep = 1 + contentTypeBuilderStepsAI.length + contentTypeBuilderStepsNoAI.length;\n dispatch({\n type: 'go_to_step',\n payload: { tourName: 'contentTypeBuilder', step: nextStep },\n });\n } else {\n // Normal step progression\n dispatch({\n type: 'next_step',\n payload: 'contentTypeBuilder',\n });\n }\n };\n\n const handlePreviousStep = () => {\n const currentStep = state.tours.contentTypeBuilder.currentStep;\n\n if (!isAIEnabled && currentStep === 1 + contentTypeBuilderStepsAI.length) {\n // If AI is disabled and we're at the first NoAI step, go back to Introduction (step 0)\n dispatch({\n type: 'go_to_step',\n payload: { tourName: 'contentTypeBuilder', step: 0 },\n });\n } else if (\n isAIEnabled &&\n currentStep === 1 + contentTypeBuilderStepsAI.length + contentTypeBuilderStepsNoAI.length\n ) {\n // If AI is enabled and we're at Save/Finish, go back to last AI step\n dispatch({\n type: 'go_to_step',\n payload: { tourName: 'contentTypeBuilder', step: contentTypeBuilderStepsAI.length },\n });\n } else {\n // Normal step progression\n dispatch({\n type: 'previous_step',\n payload: 'contentTypeBuilder',\n });\n }\n };\n\n return (\n <>\n <StepCount\n tourName=\"contentTypeBuilder\"\n displayedCurrentStep={displayedCurrentStep}\n displayedTourLength={displayedTourLength}\n />\n {props.children || (\n <DefaultActions\n tourName=\"contentTypeBuilder\"\n onNextStep={handleNextStep}\n onPreviousStep={handlePreviousStep}\n {...props}\n />\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Step Components\n * -----------------------------------------------------------------------------------------------*/\n\nconst Introduction = ({ Step }: StepContentProps) => (\n <Step.Root sideOffset={33} withArrow={false}>\n <Step.Title\n id=\"tours.contentTypeBuilder.Introduction.title\"\n defaultMessage=\"Content-Type Builder\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Introduction.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showSkip />\n </Step.Actions>\n </Step.Root>\n);\n\nconst AIChat = ({ Step }: StepContentProps) => (\n <Step.Root side=\"left\">\n <Step.Title id=\"tours.contentTypeBuilder.AIChat.title\" defaultMessage=\"Time to get started!\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.AIChat.content\"\n defaultMessage=\"<p>If you have any questions about the Content-Type Builder or Strapi ask them here.</p><p>Strapi AI can generate schemas tailored to your needs. Ask for exactly what you want, for example:<ul><li>Date picker</li><li>Email and password fields</li><li>Media of any type</li><li>UIDs</li></ul></p><p>Don’t be shy, try it out !</p>\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious />\n </Step.Actions>\n </Step.Root>\n);\n\nconst CollectionTypes = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title\n id=\"tours.contentTypeBuilder.CollectionTypes.title\"\n defaultMessage=\"Collection Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.CollectionTypes.content\"\n defaultMessage=\"A content structure that can manage multiple entries, such as articles or products.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious />\n </Step.Actions>\n </Step.Root>\n);\n\nconst SingleTypes = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.SingleTypes.title\" defaultMessage=\"Single Types\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.SingleTypes.content\"\n defaultMessage=\"A content structure that can manage a single entry, such as a homepage or a header.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious />\n </Step.Actions>\n </Step.Root>\n);\n\nconst Components = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.Components.title\" defaultMessage=\"Components\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Components.content\"\n defaultMessage=\"A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious />\n </Step.Actions>\n </Step.Root>\n);\n\nconst YourTurn = ({ Step }: StepContentProps) => (\n <Step.Root side=\"right\" sideOffset={16}>\n <Step.Title id=\"tours.contentTypeBuilder.YourTurn.title\" defaultMessage=\"Your turn\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.YourTurn.content\"\n defaultMessage=\"Create a collection type or single type and configure it.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious />\n </Step.Actions>\n </Step.Root>\n);\n\nconst AddFields = ({ Step, dispatch }: StepContentProps) => (\n <Step.Root side=\"bottom\">\n <Step.Title\n id=\"tours.contentTypeBuilder.AddFields.title\"\n defaultMessage=\"Don't forget to add a field to your content type\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.AddFields.content\"\n defaultMessage=\"Add the fields your content needs such as text, media and relations.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious>\n <GotItAction\n onClick={() => dispatch({ type: 'next_step', payload: 'contentTypeBuilder' })}\n />\n </ContentTypeBuilderActions>\n </Step.Actions>\n </Step.Root>\n);\n\nconst Save = ({ Step, dispatch }: StepContentProps) => (\n <Step.Root side=\"right\">\n <Step.Title id=\"tours.contentTypeBuilder.Save.title\" defaultMessage=\"Save before you leave!\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Save.content\"\n defaultMessage=\"Save the changes you made here before leaving this page.\"\n />\n <Step.Actions>\n <ContentTypeBuilderActions showPrevious>\n <GotItAction\n onClick={() => {\n // Ensure the completed action is removed\n // in the event the user already has a schema but is still doing the tour\n dispatch({\n type: 'remove_completed_action',\n payload: GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema,\n });\n dispatch({ type: 'next_step', payload: 'contentTypeBuilder' });\n }}\n />\n </ContentTypeBuilderActions>\n </Step.Actions>\n </Step.Root>\n);\n\nconst Finish = ({ Step }: StepContentProps) => {\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n const { '*': routeParams } = useParams();\n // Get the uid from the params\n const uid = routeParams?.split('/').pop();\n const contentType = uid ? guidedTourMeta?.data?.schemas?.[uid as UID.ContentType] : null;\n const contentTypeKindDictionary = {\n collectionType: 'collection-types',\n singleType: 'single-types',\n };\n\n const to = contentType\n ? `/content-manager/${contentTypeKindDictionary[contentType.kind]}/${contentType.uid}`\n : '/content-manager';\n\n return (\n <Step.Root side=\"right\">\n <Step.Title\n id=\"tours.contentTypeBuilder.Finish.title\"\n defaultMessage=\"It's time to create content!\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Finish.content\"\n defaultMessage=\"Now that you created content types, you'll be able to create content in the content manager.\"\n />\n <Step.Actions showStepCount={false} showPrevious={false} to={to} />\n </Step.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Steps\n * -----------------------------------------------------------------------------------------------*/\nconst contentTypeBuilderStepsAI = [\n {\n name: 'AIChat',\n content: AIChat,\n },\n];\n\nconst contentTypeBuilderStepsNoAI = [\n {\n name: 'CollectionTypes',\n content: CollectionTypes,\n },\n {\n name: 'SingleTypes',\n content: SingleTypes,\n },\n {\n name: 'Components',\n content: Components,\n },\n {\n name: 'YourTurn',\n content: YourTurn,\n },\n {\n name: 'AddFields',\n content: AddFields,\n },\n];\n\nexport const contentTypeBuilderSteps = [\n {\n name: 'Introduction',\n content: Introduction,\n },\n ...contentTypeBuilderStepsAI,\n ...contentTypeBuilderStepsNoAI,\n {\n name: 'Save',\n when: (completedActions: CompletedActions) =>\n completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.addField),\n content: Save,\n },\n {\n name: 'Finish',\n content: Finish,\n excludeFromStepCount: true,\n when: (completedActions: CompletedActions) =>\n completedActions.includes(GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema),\n },\n] as const;\n"],"names":["ContentTypeBuilderActions","props","state","useGuidedTour","s","dispatch","isAIEnabled","useAIAvailability","currentStepOffset","tours","contentTypeBuilder","currentStep","displayedCurrentStep","contentTypeBuilderStepsAI","length","contentTypeBuilderStepsNoAI","displayedTourLength","_meta","displayedStepCount","handleNextStep","nextStep","type","payload","tourName","step","handlePreviousStep","_jsxs","_Fragment","_jsx","StepCount","children","DefaultActions","onNextStep","onPreviousStep","Introduction","Step","Root","sideOffset","withArrow","Title","id","defaultMessage","Content","Actions","showSkip","AIChat","side","showPrevious","CollectionTypes","SingleTypes","Components","YourTurn","AddFields","GotItAction","onClick","Save","GUIDED_TOUR_REQUIRED_ACTIONS","createSchema","Finish","data","guidedTourMeta","useGetGuidedTourMetaQuery","routeParams","useParams","uid","split","pop","contentType","schemas","contentTypeKindDictionary","collectionType","singleType","to","kind","showStepCount","name","content","contentTypeBuilderSteps","when","completedActions","includes","addField","excludeFromStepCount"],"mappings":"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"}