@strapi/admin 5.18.1 → 5.19.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 (77) hide show
  1. package/dist/admin/admin/src/components/LeftMenu.js +52 -29
  2. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  3. package/dist/admin/admin/src/components/LeftMenu.mjs +52 -29
  4. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/MainNav/NavLink.js +4 -42
  6. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  7. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +4 -23
  8. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/NpsSurvey.js +1 -1
  10. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  11. package/dist/admin/admin/src/components/NpsSurvey.mjs +1 -1
  12. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/SubNav.js +17 -11
  14. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  15. package/dist/admin/admin/src/components/SubNav.mjs +18 -12
  16. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js +30 -0
  18. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js.map +1 -1
  19. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs +30 -0
  20. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js +32 -10
  22. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js.map +1 -1
  23. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs +32 -10
  24. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js +28 -12
  26. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js.map +1 -1
  27. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs +28 -12
  28. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js +31 -24
  30. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js.map +1 -1
  31. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs +25 -18
  32. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/UpsellBanner.js +1 -1
  34. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  35. package/dist/admin/admin/src/components/UpsellBanner.mjs +2 -2
  36. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  37. package/dist/admin/admin/src/features/Tracking.js +34 -1
  38. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  39. package/dist/admin/admin/src/features/Tracking.mjs +34 -1
  40. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  41. package/dist/admin/admin/src/hooks/usePersistentState.js +10 -0
  42. package/dist/admin/admin/src/hooks/usePersistentState.js.map +1 -1
  43. package/dist/admin/admin/src/hooks/usePersistentState.mjs +10 -1
  44. package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +2 -2
  46. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +3 -3
  48. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +1 -1
  50. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs +2 -2
  52. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/ProfilePage.js +297 -254
  54. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  55. package/dist/admin/admin/src/pages/ProfilePage.mjs +297 -254
  56. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  57. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +12 -1
  58. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +12 -1
  60. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/UseCasePage.js +1 -1
  62. package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
  63. package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -1
  64. package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
  65. package/dist/admin/admin/src/translations/en.json.js +4 -0
  66. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  67. package/dist/admin/admin/src/translations/en.json.mjs +4 -0
  68. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  69. package/dist/admin/ee/admin/src/constants.js +4 -2
  70. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  71. package/dist/admin/ee/admin/src/constants.mjs +4 -2
  72. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  73. package/dist/admin/src/components/SubNav.d.ts +2 -1
  74. package/dist/admin/src/components/UnstableGuidedTour/Context.d.ts +2 -0
  75. package/dist/admin/src/features/Tracking.d.ts +22 -3
  76. package/dist/admin/src/hooks/usePersistentState.d.ts +2 -1
  77. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"NpsSurvey.js","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch('https://analytics.strapi.io/submit-nps', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n width=\"50%\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n >\n <Cross />\n </IconButton>\n </Flex>\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box width=\"62%\" marginTop={3} marginBottom={4}>\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Flex","hasRadius","direction","padding","borderColor","background","shadow","position","bottom","left","transform","zIndex","width","Typography","fontWeight","_jsxs","Box","tag","borderWidth","justifyContent","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","gap","marginTop","marginBottom","variant","textColor","map","className","color","cursor","Label","VisuallyHidden","Input","checked","onChange","e","parseInt","target","value","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
1
+ {"version":3,"file":"NpsSurvey.js","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n width=\"50%\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n >\n <Cross />\n </IconButton>\n </Flex>\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box width=\"62%\" marginTop={3} marginBottom={4}>\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","STRAPI_ANALYTICS_URL","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Flex","hasRadius","direction","padding","borderColor","background","shadow","position","bottom","left","transform","zIndex","width","Typography","fontWeight","_jsxs","Box","tag","borderWidth","justifyContent","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","gap","marginTop","marginBottom","variant","textColor","map","className","color","cursor","Label","VisuallyHidden","Input","checked","onChange","e","parseInt","target","value","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
@@ -139,7 +139,7 @@ const NpsSurvey = ()=>{
139
139
  license: window.strapi.projectType,
140
140
  isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud'
141
141
  };
142
- const res = await fetch('https://analytics.strapi.io/submit-nps', {
142
+ const res = await fetch(`${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`, {
143
143
  method: 'POST',
144
144
  headers: {
145
145
  'Content-Type': 'application/json'
@@ -1 +1 @@
1
- {"version":3,"file":"NpsSurvey.mjs","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch('https://analytics.strapi.io/submit-nps', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n width=\"50%\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n >\n <Cross />\n </IconButton>\n </Flex>\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box width=\"62%\" marginTop={3} marginBottom={4}>\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Flex","hasRadius","direction","padding","borderColor","background","shadow","position","bottom","left","transform","zIndex","width","Typography","fontWeight","_jsxs","Box","tag","borderWidth","justifyContent","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","gap","marginTop","marginBottom","variant","textColor","map","className","color","cursor","Label","VisuallyHidden","Input","checked","onChange","e","parseInt","target","value","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
1
+ {"version":3,"file":"NpsSurvey.mjs","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n width=\"50%\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n >\n <Cross />\n </IconButton>\n </Flex>\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box width=\"62%\" marginTop={3} marginBottom={4}>\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","STRAPI_ANALYTICS_URL","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Flex","hasRadius","direction","padding","borderColor","background","shadow","position","bottom","left","transform","zIndex","width","Typography","fontWeight","_jsxs","Box","tag","borderWidth","justifyContent","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","gap","marginTop","marginBottom","variant","textColor","map","className","color","cursor","Label","VisuallyHidden","Input","checked","onChange","e","parseInt","target","value","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
@@ -128,21 +128,26 @@ const Sections = ({ children, ...props })=>{
128
128
  * TODO:
129
129
  * This would be better in the content-type-builder package directly but currently
130
130
  * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list
131
- */ const getGuidedTourTooltip = (sectionName)=>{
132
- switch(sectionName){
133
- case 'Collection Types':
134
- return Tours.tours.contentTypeBuilder.CollectionTypes;
135
- case 'Single Types':
136
- return Tours.tours.contentTypeBuilder.SingleTypes;
137
- case 'Components':
138
- return Tours.tours.contentTypeBuilder.Components;
131
+ */ const GuidedTourTooltip = ({ sectionId, children })=>{
132
+ switch(sectionId){
133
+ case 'models':
134
+ return /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.contentTypeBuilder.CollectionTypes, {
135
+ children: children
136
+ });
137
+ case 'singleTypes':
138
+ return /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.contentTypeBuilder.SingleTypes, {
139
+ children: children
140
+ });
141
+ case 'components':
142
+ return /*#__PURE__*/ jsxRuntime.jsx(Tours.tours.contentTypeBuilder.Components, {
143
+ children: children
144
+ });
139
145
  default:
140
- return React.Fragment;
146
+ return children;
141
147
  }
142
148
  };
143
- const Section = ({ label, children, link })=>{
149
+ const Section = ({ label, children, link, sectionId })=>{
144
150
  const listId = React.useId();
145
- const GuidedTourTooltip = getGuidedTourTooltip(label);
146
151
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
147
152
  direction: "column",
148
153
  alignItems: "stretch",
@@ -165,6 +170,7 @@ const Section = ({ label, children, link })=>{
165
170
  })
166
171
  }),
167
172
  link && /*#__PURE__*/ jsxRuntime.jsx(GuidedTourTooltip, {
173
+ sectionId: sectionId,
168
174
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
169
175
  label: link.label,
170
176
  variant: "ghost",
@@ -1 +1 @@
1
- {"version":3,"file":"SubNav.js","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState, Fragment } from 'react';\n\nimport { Box, SubNav as DSSubNav, Flex, Typography, IconButton } from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { tours as unstable_tours } from './UnstableGuidedTour/Tours';\n\nconst Main = styled(DSSubNav)`\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n`;\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n }\n) => {\n const { label, endAction, ...rest } = props;\n return (\n <StyledLink {...rest}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width=\"100%\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Box)`\n height: 56px;\n display: flex;\n align-items: center;\n padding-left: ${({ theme }) => theme.spaces[5]};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader>\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({ children, ...props }: { children: React.ReactNode[]; [key: string]: any }) => {\n return (\n <Box paddingBottom={4}>\n <Flex tag=\"ol\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst getGuidedTourTooltip = (sectionName: string) => {\n switch (sectionName) {\n case 'Collection Types':\n return unstable_tours.contentTypeBuilder.CollectionTypes;\n case 'Single Types':\n return unstable_tours.contentTypeBuilder.SingleTypes;\n case 'Components':\n return unstable_tours.contentTypeBuilder.Components;\n default:\n return Fragment;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClik: () => void };\n}) => {\n const listId = useId();\n const GuidedTourTooltip = getGuidedTourTooltip(label);\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingLeft={5} paddingRight={5}>\n <Flex position=\"relative\" justifyContent=\"space-between\">\n <Flex>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n {link && (\n <GuidedTourTooltip>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClik}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={2}\n marginRight={2}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n\n height: 32px;\n\n border-radius: ${({ theme }) => theme.borderRadius};\n\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n {\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n }\n </Box>\n );\n};\n\nexport const SubNav = {\n Main,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n};\n"],"names":["Main","styled","DSSubNav","theme","colors","neutral0","neutral150","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","props","label","endAction","rest","_jsx","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","spaces","Header","variant","Sections","children","paddingBottom","direction","alignItems","map","child","index","li","getGuidedTourTooltip","sectionName","unstable_tours","contentTypeBuilder","CollectionTypes","SingleTypes","Components","Fragment","Section","link","listId","useId","GuidedTourTooltip","position","textColor","IconButton","withTooltip","onClick","onClik","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","handleClick","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","SubNav"],"mappings":"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"}
1
+ {"version":3,"file":"SubNav.js","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState } from 'react';\n\nimport { Box, SubNav as DSSubNav, Flex, Typography, IconButton } from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { tours as unstable_tours } from './UnstableGuidedTour/Tours';\n\nconst Main = styled(DSSubNav)`\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n`;\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n }\n) => {\n const { label, endAction, ...rest } = props;\n return (\n <StyledLink {...rest}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width=\"100%\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Box)`\n height: 56px;\n display: flex;\n align-items: center;\n padding-left: ${({ theme }) => theme.spaces[5]};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader>\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({ children, ...props }: { children: React.ReactNode[]; [key: string]: any }) => {\n return (\n <Box paddingBottom={4}>\n <Flex tag=\"ol\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <unstable_tours.contentTypeBuilder.CollectionTypes>\n {children}\n </unstable_tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <unstable_tours.contentTypeBuilder.SingleTypes>\n {children}\n </unstable_tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return (\n <unstable_tours.contentTypeBuilder.Components>\n {children}\n </unstable_tours.contentTypeBuilder.Components>\n );\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClik: () => void };\n sectionId?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingLeft={5} paddingRight={5}>\n <Flex position=\"relative\" justifyContent=\"space-between\">\n <Flex>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClik}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={2}\n marginRight={2}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n\n height: 32px;\n\n border-radius: ${({ theme }) => theme.borderRadius};\n\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n {\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n }\n </Box>\n );\n};\n\nexport const SubNav = {\n Main,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n};\n"],"names":["Main","styled","DSSubNav","theme","colors","neutral0","neutral150","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","props","label","endAction","rest","_jsx","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","spaces","Header","variant","Sections","children","paddingBottom","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","unstable_tours","contentTypeBuilder","CollectionTypes","SingleTypes","Components","Section","link","listId","useId","position","textColor","IconButton","withTooltip","onClick","onClik","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","handleClick","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","SubNav"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useId, useState, Fragment } from 'react';
2
+ import { useId, useState } from 'react';
3
3
  import { SubNav as SubNav$1, Box, Flex, Typography, IconButton } from '@strapi/design-system';
4
4
  import { Plus, ChevronDown } from '@strapi/icons';
5
5
  import { NavLink } from 'react-router-dom';
@@ -126,21 +126,26 @@ const Sections = ({ children, ...props })=>{
126
126
  * TODO:
127
127
  * This would be better in the content-type-builder package directly but currently
128
128
  * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list
129
- */ const getGuidedTourTooltip = (sectionName)=>{
130
- switch(sectionName){
131
- case 'Collection Types':
132
- return tours.contentTypeBuilder.CollectionTypes;
133
- case 'Single Types':
134
- return tours.contentTypeBuilder.SingleTypes;
135
- case 'Components':
136
- return tours.contentTypeBuilder.Components;
129
+ */ const GuidedTourTooltip = ({ sectionId, children })=>{
130
+ switch(sectionId){
131
+ case 'models':
132
+ return /*#__PURE__*/ jsx(tours.contentTypeBuilder.CollectionTypes, {
133
+ children: children
134
+ });
135
+ case 'singleTypes':
136
+ return /*#__PURE__*/ jsx(tours.contentTypeBuilder.SingleTypes, {
137
+ children: children
138
+ });
139
+ case 'components':
140
+ return /*#__PURE__*/ jsx(tours.contentTypeBuilder.Components, {
141
+ children: children
142
+ });
137
143
  default:
138
- return Fragment;
144
+ return children;
139
145
  }
140
146
  };
141
- const Section = ({ label, children, link })=>{
147
+ const Section = ({ label, children, link, sectionId })=>{
142
148
  const listId = useId();
143
- const GuidedTourTooltip = getGuidedTourTooltip(label);
144
149
  return /*#__PURE__*/ jsxs(Flex, {
145
150
  direction: "column",
146
151
  alignItems: "stretch",
@@ -163,6 +168,7 @@ const Section = ({ label, children, link })=>{
163
168
  })
164
169
  }),
165
170
  link && /*#__PURE__*/ jsx(GuidedTourTooltip, {
171
+ sectionId: sectionId,
166
172
  children: /*#__PURE__*/ jsx(IconButton, {
167
173
  label: link.label,
168
174
  variant: "ghost",
@@ -1 +1 @@
1
- {"version":3,"file":"SubNav.mjs","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState, Fragment } from 'react';\n\nimport { Box, SubNav as DSSubNav, Flex, Typography, IconButton } from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { tours as unstable_tours } from './UnstableGuidedTour/Tours';\n\nconst Main = styled(DSSubNav)`\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n`;\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n }\n) => {\n const { label, endAction, ...rest } = props;\n return (\n <StyledLink {...rest}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width=\"100%\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Box)`\n height: 56px;\n display: flex;\n align-items: center;\n padding-left: ${({ theme }) => theme.spaces[5]};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader>\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({ children, ...props }: { children: React.ReactNode[]; [key: string]: any }) => {\n return (\n <Box paddingBottom={4}>\n <Flex tag=\"ol\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst getGuidedTourTooltip = (sectionName: string) => {\n switch (sectionName) {\n case 'Collection Types':\n return unstable_tours.contentTypeBuilder.CollectionTypes;\n case 'Single Types':\n return unstable_tours.contentTypeBuilder.SingleTypes;\n case 'Components':\n return unstable_tours.contentTypeBuilder.Components;\n default:\n return Fragment;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClik: () => void };\n}) => {\n const listId = useId();\n const GuidedTourTooltip = getGuidedTourTooltip(label);\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingLeft={5} paddingRight={5}>\n <Flex position=\"relative\" justifyContent=\"space-between\">\n <Flex>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n {link && (\n <GuidedTourTooltip>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClik}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={2}\n marginRight={2}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n\n height: 32px;\n\n border-radius: ${({ theme }) => theme.borderRadius};\n\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n {\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n }\n </Box>\n );\n};\n\nexport const SubNav = {\n Main,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n};\n"],"names":["Main","styled","DSSubNav","theme","colors","neutral0","neutral150","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","props","label","endAction","rest","_jsx","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","spaces","Header","variant","Sections","children","paddingBottom","direction","alignItems","map","child","index","li","getGuidedTourTooltip","sectionName","unstable_tours","contentTypeBuilder","CollectionTypes","SingleTypes","Components","Fragment","Section","link","listId","useId","GuidedTourTooltip","position","textColor","IconButton","withTooltip","onClick","onClik","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","handleClick","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","SubNav"],"mappings":"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"}
1
+ {"version":3,"file":"SubNav.mjs","sources":["../../../../../admin/src/components/SubNav.tsx"],"sourcesContent":["import { useId, useState } from 'react';\n\nimport { Box, SubNav as DSSubNav, Flex, Typography, IconButton } from '@strapi/design-system';\nimport { ChevronDown, Plus } from '@strapi/icons';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { tours as unstable_tours } from './UnstableGuidedTour/Tours';\n\nconst Main = styled(DSSubNav)`\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n`;\n\nconst StyledLink = styled(NavLink)`\n display: flex;\n align-items: center;\n justify-content: space-between;\n text-decoration: none;\n height: 32px;\n\n color: ${({ theme }) => theme.colors.neutral800};\n\n &.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n color: ${theme.colors.primary700};\n font-weight: 500;\n `;\n }}\n }\n\n &:hover.active > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.primary100};\n `;\n }}\n }\n\n &:hover > div {\n ${({ theme }) => {\n return `\n background-color: ${theme.colors.neutral100};\n `;\n }}\n }\n\n &:focus-visible {\n outline-offset: -2px;\n }\n`;\n\nconst Link = (\n props: Omit<React.ComponentProps<typeof StyledLink>, 'label'> & {\n label: React.ReactNode;\n endAction?: React.ReactNode;\n }\n) => {\n const { label, endAction, ...rest } = props;\n return (\n <StyledLink {...rest}>\n <Box width={'100%'} paddingLeft={3} paddingRight={3} borderRadius={1}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={1}>\n <Typography\n tag=\"div\"\n lineHeight=\"32px\"\n width=\"100%\"\n overflow=\"hidden\"\n style={{ textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}\n >\n {label}\n </Typography>\n <Flex gap={2}>{endAction}</Flex>\n </Flex>\n </Box>\n </StyledLink>\n );\n};\n\nconst StyledHeader = styled(Box)`\n height: 56px;\n display: flex;\n align-items: center;\n padding-left: ${({ theme }) => theme.spaces[5]};\n`;\n\nconst Header = ({ label }: { label: string }) => {\n return (\n <StyledHeader>\n <Typography variant=\"beta\" tag=\"h2\">\n {label}\n </Typography>\n </StyledHeader>\n );\n};\n\nconst Sections = ({ children, ...props }: { children: React.ReactNode[]; [key: string]: any }) => {\n return (\n <Box paddingBottom={4}>\n <Flex tag=\"ol\" gap=\"5\" direction=\"column\" alignItems=\"stretch\" {...props}>\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Box>\n );\n};\n\n/**\n * TODO:\n * This would be better in the content-type-builder package directly but currently\n * the SubNav API does not expose a way to wrap the link, instead it wraps the link and the list\n */\nconst GuidedTourTooltip = ({\n sectionId,\n children,\n}: {\n sectionId?: string;\n children: React.ReactNode;\n}) => {\n switch (sectionId) {\n case 'models':\n return (\n <unstable_tours.contentTypeBuilder.CollectionTypes>\n {children}\n </unstable_tours.contentTypeBuilder.CollectionTypes>\n );\n case 'singleTypes':\n return (\n <unstable_tours.contentTypeBuilder.SingleTypes>\n {children}\n </unstable_tours.contentTypeBuilder.SingleTypes>\n );\n case 'components':\n return (\n <unstable_tours.contentTypeBuilder.Components>\n {children}\n </unstable_tours.contentTypeBuilder.Components>\n );\n default:\n return children;\n }\n};\n\nconst Section = ({\n label,\n children,\n link,\n sectionId,\n}: {\n label: string;\n children: React.ReactNode[];\n link?: { label: string; onClik: () => void };\n sectionId?: string;\n}) => {\n const listId = useId();\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Box paddingLeft={5} paddingRight={5}>\n <Flex position=\"relative\" justifyContent=\"space-between\">\n <Flex>\n <Box>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {label}\n </Typography>\n </Box>\n </Flex>\n {link && (\n <GuidedTourTooltip sectionId={sectionId}>\n <IconButton\n label={link.label}\n variant=\"ghost\"\n withTooltip\n onClick={link.onClik}\n size=\"XS\"\n >\n <Plus />\n </IconButton>\n </GuidedTourTooltip>\n )}\n </Flex>\n </Box>\n <Flex\n tag=\"ol\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n marginLeft={2}\n marginRight={2}\n >\n {children.map((child, index) => {\n return <li key={index}>{child}</li>;\n })}\n </Flex>\n </Flex>\n );\n};\n\nconst SubSectionHeader = styled.button`\n cursor: pointer;\n width: 100%;\n border: none;\n padding: 0;\n background: transparent;\n display: flex;\n align-items: center;\n\n height: 32px;\n\n border-radius: ${({ theme }) => theme.borderRadius};\n\n padding-left: ${({ theme }) => theme.spaces[3]};\n padding-right: ${({ theme }) => theme.spaces[3]};\n padding-top: ${({ theme }) => theme.spaces[2]};\n padding-bottom: ${({ theme }) => theme.spaces[2]};\n\n &:hover {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nconst SubSectionLinkWrapper = styled.li`\n ${StyledLink} > div {\n padding-left: 36px;\n }\n`;\n\nconst SubSection = ({ label, children }: { label: string; children: React.ReactNode[] }) => {\n const [isOpen, setOpenLinks] = useState(true);\n const listId = useId();\n\n const handleClick = () => {\n setOpenLinks((prev) => !prev);\n };\n\n return (\n <Box>\n <Flex justifyContent=\"space-between\">\n <SubSectionHeader onClick={handleClick} aria-expanded={isOpen} aria-controls={listId}>\n <ChevronDown\n aria-hidden\n fill=\"neutral500\"\n style={{\n transform: `rotate(${isOpen ? '0deg' : '-90deg'})`,\n transition: 'transform 0.5s',\n }}\n />\n <Box paddingLeft={2}>\n <Typography tag=\"span\" fontWeight=\"semiBold\" textColor=\"neutral800\">\n {label}\n </Typography>\n </Box>\n </SubSectionHeader>\n </Flex>\n {\n <Flex\n tag=\"ul\"\n id={listId}\n direction=\"column\"\n gap=\"2px\"\n alignItems={'stretch'}\n style={{\n maxHeight: isOpen ? '1000px' : 0,\n overflow: 'hidden',\n transition: isOpen\n ? 'max-height 1s ease-in-out'\n : 'max-height 0.5s cubic-bezier(0, 1, 0, 1)',\n }}\n >\n {children.map((child, index) => {\n return <SubSectionLinkWrapper key={index}>{child}</SubSectionLinkWrapper>;\n })}\n </Flex>\n }\n </Box>\n );\n};\n\nexport const SubNav = {\n Main,\n Header,\n Link,\n Sections,\n Section,\n SubSection,\n};\n"],"names":["Main","styled","DSSubNav","theme","colors","neutral0","neutral150","StyledLink","NavLink","neutral800","primary100","primary700","neutral100","Link","props","label","endAction","rest","_jsx","Box","width","paddingLeft","paddingRight","borderRadius","_jsxs","Flex","justifyContent","gap","Typography","tag","lineHeight","overflow","style","textOverflow","whiteSpace","StyledHeader","spaces","Header","variant","Sections","children","paddingBottom","direction","alignItems","map","child","index","li","GuidedTourTooltip","sectionId","unstable_tours","contentTypeBuilder","CollectionTypes","SingleTypes","Components","Section","link","listId","useId","position","textColor","IconButton","withTooltip","onClick","onClik","size","Plus","id","marginLeft","marginRight","SubSectionHeader","button","SubSectionLinkWrapper","SubSection","isOpen","setOpenLinks","useState","handleClick","prev","aria-expanded","aria-controls","ChevronDown","aria-hidden","fill","transform","transition","fontWeight","maxHeight","SubNav"],"mappings":";;;;;;;;AASA,MAAMA,IAAAA,GAAOC,MAAOC,CAAAA,QAAAA,CAAS;oBACT,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACC,QAAQ,CAAC;0BACjC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACE,UAAU,CAAC;;;;;;;;AAQnE,CAAC;AAED,MAAMC,UAAAA,GAAaN,MAAOO,CAAAA,OAAAA,CAAQ;;;;;;;SAOzB,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACK,UAAU,CAAC;;;IAG9C,EAAE,CAAC,EAAEN,KAAK,EAAE,GAAA;AACV,IAAA,OAAO;AACa,0BAAA,EAAEA,KAAMC,CAAAA,MAAM,CAACM,UAAU,CAAC;AACrC,eAAA,EAAEP,KAAMC,CAAAA,MAAM,CAACO,UAAU,CAAC;;MAEnC,CAAC;AACH,CAAE;;;;IAIF,EAAE,CAAC,EAAER,KAAK,EAAE,GAAA;AACV,IAAA,OAAO;AACa,0BAAA,EAAEA,KAAMC,CAAAA,MAAM,CAACM,UAAU,CAAC;MAC9C,CAAC;AACH,CAAE;;;;IAIF,EAAE,CAAC,EAAEP,KAAK,EAAE,GAAA;AACV,IAAA,OAAO;AACa,0BAAA,EAAEA,KAAMC,CAAAA,MAAM,CAACQ,UAAU,CAAC;MAC9C,CAAC;AACH,CAAE;;;;;;AAMN,CAAC;AAED,MAAMC,OAAO,CACXC,KAAAA,GAAAA;AAKA,IAAA,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGC,MAAM,GAAGH,KAAAA;AACtC,IAAA,qBACEI,GAACX,CAAAA,UAAAA,EAAAA;AAAY,QAAA,GAAGU,IAAI;AAClB,QAAA,QAAA,gBAAAC,GAACC,CAAAA,GAAAA,EAAAA;YAAIC,KAAO,EAAA,MAAA;YAAQC,WAAa,EAAA,CAAA;YAAGC,YAAc,EAAA,CAAA;YAAGC,YAAc,EAAA,CAAA;AACjE,YAAA,QAAA,gBAAAC,IAACC,CAAAA,IAAAA,EAAAA;gBAAKC,cAAe,EAAA,eAAA;gBAAgBN,KAAM,EAAA,MAAA;gBAAOO,GAAK,EAAA,CAAA;;kCACrDT,GAACU,CAAAA,UAAAA,EAAAA;wBACCC,GAAI,EAAA,KAAA;wBACJC,UAAW,EAAA,MAAA;wBACXV,KAAM,EAAA,MAAA;wBACNW,QAAS,EAAA,QAAA;wBACTC,KAAO,EAAA;4BAAEC,YAAc,EAAA,UAAA;4BAAYC,UAAY,EAAA;AAAS,yBAAA;AAEvDnB,wBAAAA,QAAAA,EAAAA;;kCAEHG,GAACO,CAAAA,IAAAA,EAAAA;wBAAKE,GAAK,EAAA,CAAA;AAAIX,wBAAAA,QAAAA,EAAAA;;;;;;AAKzB,CAAA;AAEA,MAAMmB,YAAAA,GAAelC,MAAOkB,CAAAA,GAAAA,CAAI;;;;gBAIhB,EAAE,CAAC,EAAEhB,KAAK,EAAE,GAAKA,KAAMiC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;AACjD,CAAC;AAED,MAAMC,MAAS,GAAA,CAAC,EAAEtB,KAAK,EAAqB,GAAA;AAC1C,IAAA,qBACEG,GAACiB,CAAAA,YAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAjB,GAACU,CAAAA,UAAAA,EAAAA;YAAWU,OAAQ,EAAA,MAAA;YAAOT,GAAI,EAAA,IAAA;AAC5Bd,YAAAA,QAAAA,EAAAA;;;AAIT,CAAA;AAEA,MAAMwB,WAAW,CAAC,EAAEC,QAAQ,EAAE,GAAG1B,KAA4D,EAAA,GAAA;AAC3F,IAAA,qBACEI,GAACC,CAAAA,GAAAA,EAAAA;QAAIsB,aAAe,EAAA,CAAA;AAClB,QAAA,QAAA,gBAAAvB,GAACO,CAAAA,IAAAA,EAAAA;YAAKI,GAAI,EAAA,IAAA;YAAKF,GAAI,EAAA,GAAA;YAAIe,SAAU,EAAA,QAAA;YAASC,UAAW,EAAA,SAAA;AAAW,YAAA,GAAG7B,KAAK;sBACrE0B,QAASI,CAAAA,GAAG,CAAC,CAACC,KAAOC,EAAAA,KAAAA,GAAAA;AACpB,gBAAA,qBAAO5B,GAAC6B,CAAAA,IAAAA,EAAAA;AAAgBF,oBAAAA,QAAAA,EAAAA;AAARC,iBAAAA,EAAAA,KAAAA,CAAAA;AAClB,aAAA;;;AAIR,CAAA;AAEA;;;;AAIC,IACD,MAAME,iBAAoB,GAAA,CAAC,EACzBC,SAAS,EACTT,QAAQ,EAIT,GAAA;IACC,OAAQS,SAAAA;QACN,KAAK,QAAA;AACH,YAAA,qBACE/B,GAACgC,CAAAA,KAAAA,CAAeC,kBAAkB,CAACC,eAAe,EAAA;AAC/CZ,gBAAAA,QAAAA,EAAAA;;QAGP,KAAK,aAAA;AACH,YAAA,qBACEtB,GAACgC,CAAAA,KAAAA,CAAeC,kBAAkB,CAACE,WAAW,EAAA;AAC3Cb,gBAAAA,QAAAA,EAAAA;;QAGP,KAAK,YAAA;AACH,YAAA,qBACEtB,GAACgC,CAAAA,KAAAA,CAAeC,kBAAkB,CAACG,UAAU,EAAA;AAC1Cd,gBAAAA,QAAAA,EAAAA;;AAGP,QAAA;YACE,OAAOA,QAAAA;AACX;AACF,CAAA;AAEA,MAAMe,OAAAA,GAAU,CAAC,EACfxC,KAAK,EACLyB,QAAQ,EACRgB,IAAI,EACJP,SAAS,EAMV,GAAA;AACC,IAAA,MAAMQ,MAASC,GAAAA,KAAAA,EAAAA;AAEf,IAAA,qBACElC,IAACC,CAAAA,IAAAA,EAAAA;QAAKiB,SAAU,EAAA,QAAA;QAASC,UAAW,EAAA,SAAA;QAAUhB,GAAK,EAAA,CAAA;;0BACjDT,GAACC,CAAAA,GAAAA,EAAAA;gBAAIE,WAAa,EAAA,CAAA;gBAAGC,YAAc,EAAA,CAAA;AACjC,gBAAA,QAAA,gBAAAE,IAACC,CAAAA,IAAAA,EAAAA;oBAAKkC,QAAS,EAAA,UAAA;oBAAWjC,cAAe,EAAA,eAAA;;sCACvCR,GAACO,CAAAA,IAAAA,EAAAA;AACC,4BAAA,QAAA,gBAAAP,GAACC,CAAAA,GAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAAD,GAACU,CAAAA,UAAAA,EAAAA;oCAAWU,OAAQ,EAAA,OAAA;oCAAQsB,SAAU,EAAA,YAAA;AACnC7C,oCAAAA,QAAAA,EAAAA;;;;AAINyC,wBAAAA,IAAAA,kBACCtC,GAAC8B,CAAAA,iBAAAA,EAAAA;4BAAkBC,SAAWA,EAAAA,SAAAA;AAC5B,4BAAA,QAAA,gBAAA/B,GAAC2C,CAAAA,UAAAA,EAAAA;AACC9C,gCAAAA,KAAAA,EAAOyC,KAAKzC,KAAK;gCACjBuB,OAAQ,EAAA,OAAA;gCACRwB,WAAW,EAAA,IAAA;AACXC,gCAAAA,OAAAA,EAASP,KAAKQ,MAAM;gCACpBC,IAAK,EAAA,IAAA;AAEL,gCAAA,QAAA,gBAAA/C,GAACgD,CAAAA,IAAAA,EAAAA,EAAAA;;;;;;0BAMXhD,GAACO,CAAAA,IAAAA,EAAAA;gBACCI,GAAI,EAAA,IAAA;gBACJsC,EAAIV,EAAAA,MAAAA;gBACJf,SAAU,EAAA,QAAA;gBACVf,GAAI,EAAA,KAAA;gBACJgB,UAAY,EAAA,SAAA;gBACZyB,UAAY,EAAA,CAAA;gBACZC,WAAa,EAAA,CAAA;0BAEZ7B,QAASI,CAAAA,GAAG,CAAC,CAACC,KAAOC,EAAAA,KAAAA,GAAAA;AACpB,oBAAA,qBAAO5B,GAAC6B,CAAAA,IAAAA,EAAAA;AAAgBF,wBAAAA,QAAAA,EAAAA;AAARC,qBAAAA,EAAAA,KAAAA,CAAAA;AAClB,iBAAA;;;;AAIR,CAAA;AAEA,MAAMwB,gBAAAA,GAAmBrE,MAAOsE,CAAAA,MAAM;;;;;;;;;;;AAWrB,iBAAA,EAAE,CAAC,EAAEpE,KAAK,EAAE,GAAKA,KAAAA,CAAMoB,YAAY,CAAC;;gBAErC,EAAE,CAAC,EAAEpB,KAAK,EAAE,GAAKA,KAAMiC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;iBAChC,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMiC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;eACnC,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMiC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;kBAC9B,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMiC,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;;;sBAG7B,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACQ,UAAU,CAAC;;AAE/D,CAAC;AAED,MAAM4D,qBAAAA,GAAwBvE,MAAO8C,CAAAA,EAAE;AACrC,EAAA,EAAExC,UAAW,CAAA;;;AAGf,CAAC;AAED,MAAMkE,aAAa,CAAC,EAAE1D,KAAK,EAAEyB,QAAQ,EAAkD,GAAA;AACrF,IAAA,MAAM,CAACkC,MAAAA,EAAQC,YAAa,CAAA,GAAGC,QAAS,CAAA,IAAA,CAAA;AACxC,IAAA,MAAMnB,MAASC,GAAAA,KAAAA,EAAAA;AAEf,IAAA,MAAMmB,WAAc,GAAA,IAAA;QAClBF,YAAa,CAAA,CAACG,OAAS,CAACA,IAAAA,CAAAA;AAC1B,KAAA;AAEA,IAAA,qBACEtD,IAACL,CAAAA,GAAAA,EAAAA;;0BACCD,GAACO,CAAAA,IAAAA,EAAAA;gBAAKC,cAAe,EAAA,eAAA;AACnB,gBAAA,QAAA,gBAAAF,IAAC8C,CAAAA,gBAAAA,EAAAA;oBAAiBP,OAASc,EAAAA,WAAAA;oBAAaE,eAAeL,EAAAA,MAAAA;oBAAQM,eAAevB,EAAAA,MAAAA;;sCAC5EvC,GAAC+D,CAAAA,WAAAA,EAAAA;4BACCC,aAAW,EAAA,IAAA;4BACXC,IAAK,EAAA,YAAA;4BACLnD,KAAO,EAAA;AACLoD,gCAAAA,SAAAA,EAAW,CAAC,OAAO,EAAEV,SAAS,MAAS,GAAA,QAAA,CAAS,CAAC,CAAC;gCAClDW,UAAY,EAAA;AACd;;sCAEFnE,GAACC,CAAAA,GAAAA,EAAAA;4BAAIE,WAAa,EAAA,CAAA;AAChB,4BAAA,QAAA,gBAAAH,GAACU,CAAAA,UAAAA,EAAAA;gCAAWC,GAAI,EAAA,MAAA;gCAAOyD,UAAW,EAAA,UAAA;gCAAW1B,SAAU,EAAA,YAAA;AACpD7C,gCAAAA,QAAAA,EAAAA;;;;;;0BAMPG,GAACO,CAAAA,IAAAA,EAAAA;gBACCI,GAAI,EAAA,IAAA;gBACJsC,EAAIV,EAAAA,MAAAA;gBACJf,SAAU,EAAA,QAAA;gBACVf,GAAI,EAAA,KAAA;gBACJgB,UAAY,EAAA,SAAA;gBACZX,KAAO,EAAA;AACLuD,oBAAAA,SAAAA,EAAWb,SAAS,QAAW,GAAA,CAAA;oBAC/B3C,QAAU,EAAA,QAAA;AACVsD,oBAAAA,UAAAA,EAAYX,SACR,2BACA,GAAA;AACN,iBAAA;0BAEClC,QAASI,CAAAA,GAAG,CAAC,CAACC,KAAOC,EAAAA,KAAAA,GAAAA;AACpB,oBAAA,qBAAO5B,GAACsD,CAAAA,qBAAAA,EAAAA;AAAmC3B,wBAAAA,QAAAA,EAAAA;AAARC,qBAAAA,EAAAA,KAAAA,CAAAA;AACrC,iBAAA;;;;AAKV,CAAA;MAEa0C,MAAS,GAAA;AACpBxF,IAAAA,IAAAA;AACAqC,IAAAA,MAAAA;AACAxB,IAAAA,IAAAA;AACA0B,IAAAA,QAAAA;AACAgB,IAAAA,OAAAA;AACAkB,IAAAA;AACF;;;;"}
@@ -48,6 +48,36 @@ function reducer(state, action) {
48
48
  if (action.type === 'skip_all_tours') {
49
49
  draft.enabled = false;
50
50
  }
51
+ if (action.type === 'reset_all_tours') {
52
+ draft.enabled = true;
53
+ /**
54
+ * TODO:
55
+ * This is hard coded for a quick fix
56
+ * It will be fixed properly with a dynamic solution in a follow up PR
57
+ */ draft.tours = {
58
+ contentTypeBuilder: {
59
+ currentStep: 0,
60
+ length: 5,
61
+ isCompleted: false
62
+ },
63
+ contentManager: {
64
+ currentStep: 0,
65
+ length: 4,
66
+ isCompleted: false
67
+ },
68
+ apiTokens: {
69
+ currentStep: 0,
70
+ length: 4,
71
+ isCompleted: false
72
+ },
73
+ strapiCloud: {
74
+ currentStep: 0,
75
+ length: 0,
76
+ isCompleted: false
77
+ }
78
+ };
79
+ draft.completedActions = [];
80
+ }
51
81
  });
52
82
  }
53
83
  const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';