@strapi/admin 5.51.1 → 5.52.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 (153) hide show
  1. package/dist/admin/admin/src/App.js +1 -1
  2. package/dist/admin/admin/src/App.js.map +1 -1
  3. package/dist/admin/admin/src/App.mjs +1 -1
  4. package/dist/admin/admin/src/App.mjs.map +1 -1
  5. package/dist/admin/admin/src/StrapiApp.js +3 -3
  6. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  7. package/dist/admin/admin/src/StrapiApp.mjs +3 -3
  8. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/Filters.js +19 -34
  10. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  11. package/dist/admin/admin/src/components/Filters.mjs +19 -34
  12. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  14. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/NpsSurvey.js +1 -1
  16. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  17. package/dist/admin/admin/src/components/NpsSurvey.mjs +1 -1
  18. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  19. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  20. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  21. package/dist/admin/admin/src/features/Tracking.js +1 -1
  22. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  23. package/dist/admin/admin/src/features/Tracking.mjs +1 -1
  24. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  25. package/dist/admin/admin/src/hooks/useAPIErrorHandler.js +1 -1
  26. package/dist/admin/admin/src/hooks/useAPIErrorHandler.js.map +1 -1
  27. package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs +1 -1
  28. package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs.map +1 -1
  29. package/dist/admin/admin/src/pages/Auth/components/Register.js +35 -26
  30. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  31. package/dist/admin/admin/src/pages/Auth/components/Register.mjs +35 -27
  32. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  33. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +1 -1
  34. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +1 -1
  36. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +1 -1
  38. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  39. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +1 -1
  40. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
  41. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +1 -1
  42. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +1 -1
  44. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +1 -3
  46. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +1 -3
  48. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +1 -1
  50. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +1 -1
  52. package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +1 -1
  54. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  55. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs +1 -1
  56. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  57. package/dist/admin/admin/src/pages/UseCasePage.js +1 -1
  58. package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
  59. package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -1
  60. package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
  61. package/dist/admin/admin/src/translations/id.json.js +105 -1
  62. package/dist/admin/admin/src/translations/id.json.js.map +1 -1
  63. package/dist/admin/admin/src/translations/id.json.mjs +105 -1
  64. package/dist/admin/admin/src/translations/id.json.mjs.map +1 -1
  65. package/dist/admin/admin/src/utils/baseQuery.js +3 -2
  66. package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
  67. package/dist/admin/admin/src/utils/baseQuery.mjs +3 -2
  68. package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
  69. package/dist/admin/admin/src/utils/users.js +1 -1
  70. package/dist/admin/admin/src/utils/users.js.map +1 -1
  71. package/dist/admin/admin/src/utils/users.mjs +1 -1
  72. package/dist/admin/admin/src/utils/users.mjs.map +1 -1
  73. package/dist/admin/admin/tests/server.js +640 -684
  74. package/dist/admin/admin/tests/server.js.map +1 -1
  75. package/dist/admin/admin/tests/server.mjs +640 -684
  76. package/dist/admin/admin/tests/server.mjs.map +1 -1
  77. package/dist/admin/ee/admin/src/constants.js +22 -26
  78. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  79. package/dist/admin/ee/admin/src/constants.mjs +22 -26
  80. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  81. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +1 -1
  82. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  83. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +1 -1
  84. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  85. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.js +16 -20
  86. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.js.map +1 -1
  87. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.mjs +16 -20
  88. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.mjs.map +1 -1
  89. package/dist/admin/src/components/Filters.d.ts +9 -2
  90. package/dist/admin/src/pages/Auth/components/Register.d.ts +10 -0
  91. package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/ModalForm.d.ts +3 -1
  92. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  93. package/dist/ee/server/src/destroy.d.ts +1 -4
  94. package/dist/ee/server/src/destroy.d.ts.map +1 -1
  95. package/dist/ee/server/src/index.d.ts.map +1 -1
  96. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +3 -3
  97. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
  98. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs +3 -3
  99. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
  100. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +10 -4
  101. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  102. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +10 -4
  103. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  104. package/dist/server/ee/server/src/controllers/admin.js +1 -1
  105. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  106. package/dist/server/ee/server/src/controllers/admin.mjs +1 -1
  107. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  108. package/dist/server/ee/server/src/destroy.js +1 -1
  109. package/dist/server/ee/server/src/destroy.js.map +1 -1
  110. package/dist/server/ee/server/src/destroy.mjs +1 -1
  111. package/dist/server/ee/server/src/destroy.mjs.map +1 -1
  112. package/dist/server/ee/server/src/index.js +1 -3
  113. package/dist/server/ee/server/src/index.js.map +1 -1
  114. package/dist/server/ee/server/src/index.mjs +1 -3
  115. package/dist/server/ee/server/src/index.mjs.map +1 -1
  116. package/dist/server/ee/server/src/services/index.js.map +1 -1
  117. package/dist/server/ee/server/src/services/index.mjs +2 -2
  118. package/dist/server/ee/server/src/services/index.mjs.map +1 -1
  119. package/dist/server/ee/server/src/services/persist-tables.js +2 -2
  120. package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
  121. package/dist/server/ee/server/src/services/persist-tables.mjs +4 -4
  122. package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
  123. package/dist/server/server/src/ai/controllers/ai.js +2 -2
  124. package/dist/server/server/src/ai/controllers/ai.js.map +1 -1
  125. package/dist/server/server/src/ai/controllers/ai.mjs +2 -2
  126. package/dist/server/server/src/ai/controllers/ai.mjs.map +1 -1
  127. package/dist/server/server/src/middlewares/rateLimit.js +1 -2
  128. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  129. package/dist/server/server/src/middlewares/rateLimit.mjs +2 -2
  130. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  131. package/dist/server/server/src/services/encryption.js +1 -1
  132. package/dist/server/server/src/services/encryption.js.map +1 -1
  133. package/dist/server/server/src/services/encryption.mjs +1 -1
  134. package/dist/server/server/src/services/encryption.mjs.map +1 -1
  135. package/dist/server/server/src/services/permission/engine.js +4 -8
  136. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  137. package/dist/server/server/src/services/permission/engine.mjs +5 -5
  138. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  139. package/dist/server/server/src/services/transfer/permission.js +1 -5
  140. package/dist/server/server/src/services/transfer/permission.js.map +1 -1
  141. package/dist/server/server/src/services/transfer/permission.mjs +2 -2
  142. package/dist/server/server/src/services/transfer/permission.mjs.map +1 -1
  143. package/dist/server/server/src/services/user.js +1 -1
  144. package/dist/server/server/src/services/user.js.map +1 -1
  145. package/dist/server/server/src/services/user.mjs +1 -1
  146. package/dist/server/server/src/services/user.mjs.map +1 -1
  147. package/dist/server/src/index.d.ts.map +1 -1
  148. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  149. package/dist/server/src/services/permission/engine.d.ts +1 -1
  150. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  151. package/dist/server/src/services/transfer/permission.d.ts +2 -2
  152. package/dist/server/src/services/transfer/permission.d.ts.map +1 -1
  153. package/package.json +12 -12
@@ -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 SingleSelect,\n SingleSelectOption,\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 { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\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 isMobile = useIsMobile();\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' | 'Growth' | '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 <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\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%\" gap={2}>\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 type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\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 )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\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 marginTop={3} marginBottom={4} width=\"100%\">\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 <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 </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\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","isMobile","useIsMobile","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","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","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 SingleSelect,\n SingleSelectOption,\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 { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\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 isMobile = useIsMobile();\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' | 'Growth' | '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 {\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 <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\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%\" gap={2}>\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 type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\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 )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\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 marginTop={3} marginBottom={4} width=\"100%\">\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 <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 </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\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","isMobile","useIsMobile","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","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
@@ -164,7 +164,7 @@ const NpsSurvey = ()=>{
164
164
  setTimeout(()=>{
165
165
  setSurveyIsShown(false);
166
166
  }, 3000);
167
- } catch (err) {
167
+ } catch {
168
168
  toggleNotification({
169
169
  type: 'danger',
170
170
  message: formatMessage({
@@ -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 SingleSelect,\n SingleSelectOption,\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 { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\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 isMobile = useIsMobile();\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' | 'Growth' | '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 <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\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%\" gap={2}>\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 type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\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 )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\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 marginTop={3} marginBottom={4} width=\"100%\">\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 <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 </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\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","isMobile","useIsMobile","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","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","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 SingleSelect,\n SingleSelectOption,\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 { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\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 isMobile = useIsMobile();\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' | 'Growth' | '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 {\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 <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\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%\" gap={2}>\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 type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\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 )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\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 marginTop={3} marginBottom={4} width=\"100%\">\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 <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 </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\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","isMobile","useIsMobile","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","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport {\n Cloud,\n CloudUpload,\n Earth,\n Images,\n User,\n Key,\n Files,\n Layout,\n Graph,\n Webhooks,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeployNowWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeployNowWidget = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={4} height=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n <CloudUpload width=\"3.2rem\" height=\"3.2rem\" />\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"beta\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.title',\n defaultMessage: 'Ready to go live ?',\n })}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.description',\n defaultMessage: 'Deploy with Strapi Cloud',\n })}\n </Typography>\n </Flex>\n <LinkButton href=\"https://cloud.strapi.io/login\" isExternal size=\"L\" startIcon={<Cloud />}>\n {formatMessage({ id: 'HomePage.widget.deploy-now.button', defaultMessage: 'Deploy Now' })}\n </LinkButton>\n </Flex>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget, DeployNowWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding","DeployNowWidget","CloudUpload","width","LinkButton","href","isExternal","size","startIcon","Cloud"],"mappings":"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"}
1
+ {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport {\n Cloud,\n CloudUpload,\n Earth,\n Images,\n User,\n Key,\n Files,\n Layout,\n Graph,\n Webhooks,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeployNowWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeployNowWidget = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={4} height=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n <CloudUpload width=\"3.2rem\" height=\"3.2rem\" />\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"beta\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.title',\n defaultMessage: 'Ready to go live ?',\n })}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.description',\n defaultMessage: 'Deploy with Strapi Cloud',\n })}\n </Typography>\n </Flex>\n <LinkButton href=\"https://cloud.strapi.io/login\" isExternal size=\"L\" startIcon={<Cloud />}>\n {formatMessage({ id: 'HomePage.widget.deploy-now.button', defaultMessage: 'Deploy Now' })}\n </LinkButton>\n </Flex>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget, DeployNowWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding","DeployNowWidget","CloudUpload","width","LinkButton","href","isExternal","size","startIcon","Cloud"],"mappings":";;;;;;;;;;;;;AAuBA;;AAEkG,qGAElG,MAAMA,qBAAAA,GAAwBC,uBAAAA,CAAOC,uBAAAA,CAAW;;AAEhD,CAAC;AAED,MAAMC,aAAAA,GAAgB,IAAA;AACpB,IAAA,MAAMC,OAAOC,mBAAAA,CAAQ,MAAA,EAAQ,CAACC,KAAAA,GAAUA,MAAMF,IAAI,CAAA;AAClD,IAAA,MAAMG,kBAAkBC,oBAAAA,CAAeJ,IAAAA,CAAAA;AACvC,IAAA,MAAMK,WAAWC,iBAAAA,CAAYN,IAAAA,CAAAA;AAE7B,IAAA,qBACEO,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,MAAAA,EAAO,MAAA;QAAOC,cAAAA,EAAe,QAAA;;AAC5D,0BAAAC,cAAA,CAACC,oBAAOC,IAAI,EAAA;gBAACC,OAAAA,EAAS,CAAA;gBAAGC,QAAAA,EAAUZ;;AAClCF,YAAAA,eAAAA,kBACCU,cAAA,CAACjB,qBAAAA,EAAAA;gBAAsBsB,UAAAA,EAAW,MAAA;gBAAOC,aAAAA,EAAc,MAAA;gBAAOC,SAAAA,EAAU,QAAA;AACrEjB,gBAAAA,QAAAA,EAAAA;;AAGJH,YAAAA,IAAAA,EAAMqB,uBACLR,cAAA,CAACf,uBAAAA,EAAAA;gBAAWwB,OAAAA,EAAQ,OAAA;gBAAQC,SAAAA,EAAU,YAAA;0BACnCvB,IAAAA,EAAMqB;;YAGVrB,IAAAA,EAAMwB,KAAAA,EAAOC,wBACZZ,cAAA,CAACL,iBAAAA,EAAAA;gBAAKkB,SAAAA,EAAW,CAAA;gBAAGhB,GAAAA,EAAK,CAAA;gBAAGiB,IAAAA,EAAK,MAAA;AAC9B3B,gBAAAA,QAAAA,EAAAA,IAAAA,EAAMwB,KAAAA,EAAOI,GAAAA,CAAI,CAACC,IAAAA,iBACjBhB,cAAA,CAACiB,kBAAAA,EAAAA;AAAqBD,wBAAAA,QAAAA,EAAAA,IAAAA,CAAKE;AAAfF,qBAAAA,EAAAA,IAAAA,CAAKG,EAAE,CAAA;;;;AAM/B;AAEA;;AAEkG,qGAClG,MAAMC,IAAAA,GAAOpC,uBAAAA,CAAOqC,gBAAAA,CAAI;;;;oBAIJ,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AAC5C,iBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,YAAY,CAAC;;AAErD,CAAC;AAED,MAAMC,QAAAA,GAAW1C,uBAAAA,CAAOqC,gBAAAA,CAAI;2BACD,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;0BAC1C,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;;;;;;;;;;;AAWnE,CAAC;AAED,MAAMG,eAAe,CAAC,EAAEC,MAAM,EAAEC,MAAM,EAAsC,GAAA;AAC1E,IAAA,OAAO,IAAIC,IAAAA,CAAKC,YAAY,CAACH,MAAAA,EAAQ;QACnCI,QAAAA,EAAU,SAAA;QACVC,qBAAAA,EAAuB;AACzB,KAAA,CAAA,CAAGC,MAAM,CAACL,MAAAA,CAAAA;AACZ,CAAA;AAEA,MAAMM,QAAAA,GAAWnD,uBAAAA,CAAOoD,mBAAAA,CAAK;;WAElB,EAAE,CAAC,EAAEd,KAAK,EAAE,GAAKA,KAAAA,CAAMe,MAAM,CAAC,CAAA,CAAE,CAAC;AAC5C,CAAC;AAED,MAAMC,mBAAAA,GAAsB,IAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;AACvB,IAAA,MAAM,EAAEC,aAAa,EAAEb,MAAM,EAAE,GAAGc,iBAAAA,EAAAA;AAClC,IAAA,MAAM,EAAEC,IAAAA,EAAMC,cAAc,EAAEC,SAAAA,EAAWC,uBAAuB,EAAE,GAAGC,kCAAAA,EAAAA;AACrE,IAAA,MAAM,EAAEJ,IAAAA,EAAMK,kBAAkB,EAAEH,SAAAA,EAAWI,sBAAsB,EAAE,GACnEC,iCAAAA,EAAAA;AAEF,IAAA,IAAID,0BAA0BH,uBAAAA,EAAyB;QACrD,qBAAO9C,cAAA,CAACmD,qBAAOC,OAAO,EAAA,EAAA,CAAA;AACxB,IAAA;IAEA,IAAI,CAACJ,kBAAAA,IAAsB,CAACJ,cAAAA,EAAgB;QAC1C,qBAAO5C,cAAA,CAACmD,qBAAOE,KAAK,EAAA,EAAA,CAAA;AACtB,IAAA;AAEA,IAAA,MAAMC,iBAAAA,GAAoB;QACxBC,OAAAA,EAAS;YACPC,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,oCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAAC4D,WAAAA,EAAAA,EAAAA,CAAAA;gBACZC,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAC,MAAAA,EAAQ;YACNR,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,mCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACiE,YAAAA,EAAAA,EAAAA,CAAAA;gBACZJ,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAG,YAAAA,EAAc;YACZV,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,yCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACmE,YAAAA,EAAAA,EAAAA,CAAAA;gBACZN,UAAAA,EAAY,cAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAK,UAAAA,EAAY;YACVZ,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,uCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACqE,WAAAA,EAAAA,EAAAA,CAAAA;gBACZR,UAAAA,EAAY,gBAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAO,OAAAA,EAAS;YACPd,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,oCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACuE,WAAAA,EAAAA,EAAAA,CAAAA;gBACZV,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAS,MAAAA,EAAQ;YACNhB,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,mCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAACyE,UAAAA,EAAAA,EAAAA,CAAAA;gBACZZ,UAAAA,EAAY,WAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAW,QAAAA,EAAU;YACRlB,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,qCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAAC2E,cAAAA,EAAAA,EAAAA,CAAAA;gBACZd,UAAAA,EAAY,gBAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR,SAAA;QACAa,SAAAA,EAAW;YACTpB,KAAAA,EAAO;gBACLrC,EAAAA,EAAI,sCAAA;gBACJsC,cAAAA,EAAgB;AAClB,aAAA;YACAC,IAAAA,EAAM;AACJC,gBAAAA,SAAAA,gBAAW3D,cAAA,CAAC6E,SAAAA,EAAAA,EAAAA,CAAAA;gBACZhB,UAAAA,EAAY,YAAA;gBACZC,KAAAA,EAAO;AACT,aAAA;YACAC,IAAAA,EAAM;AACR;AACF,KAAA;IAEA,MAAM,EAAEe,KAAK,EAAEC,SAAS,EAAEC,QAAQ,EAAE,GAAGpC,cAAAA,IAAkB;QACvDkC,KAAAA,EAAO,CAAA;QACPC,SAAAA,EAAW,CAAA;QACXC,QAAAA,EAAU;AACZ,KAAA;IAEA,MAAMC,iBAAAA,GAAoBH,QAAQC,SAAAA,GAAYC,QAAAA;AAE9C,IAAA,qBACEhF,cAAA,CAACoB,IAAAA,EAAAA;kBACE8D,MAAAA,CAAO3B,OAAO,CAACD,iBAAAA,CAAAA,CAAmBvC,GAAG,CAAC,CAAC,CAACoE,KAAKC,IAAAA,CAAK,GAAA;YACjD,MAAMC,KAAAA,GAAQrC,kBAAAA,GAAqBmC,GAAAA,CAAuC;YAC1E,OACEE,KAAAA,KAAU,sBACRrF,cAAA,CAAC0B,QAAAA,EAAAA;gBACC4D,EAAAA,EAAInD,QAAAA;AACJoD,gBAAAA,EAAAA,EAAIH,KAAKrB,IAAI;gBAEbyB,aAAAA,EAAa,CAAC,KAAK,EAAEL,GAAAA,CAAAA,CAAK;gBAC1BM,OAAAA,EAAS,IAAMlD,WAAW,gCAAA,EAAkC;wBAAEmD,OAAAA,EAASP;AAAI,qBAAA,CAAA;AAE3E,gBAAA,QAAA,gBAAAzF,eAAA,CAACC,iBAAAA,EAAAA;oBAAKgG,UAAAA,EAAW,QAAA;oBAAS9F,GAAAA,EAAK,CAAA;;sCAC7BG,cAAA,CAACL,iBAAAA,EAAAA;4BACCiG,OAAAA,EAAS,CAAA;4BACTnE,YAAAA,EAAc,CAAA;4BACdoC,UAAAA,EAAYuB,IAAAA,CAAK1B,IAAI,CAACG,UAAU;4BAChCC,KAAAA,EAAOsB,IAAAA,CAAK1B,IAAI,CAACI,KAAK;sCAErBsB,IAAAA,CAAK1B,IAAI,CAACC;;sCAEbjE,eAAA,CAACC,iBAAAA,EAAAA;4BAAKC,SAAAA,EAAU,QAAA;4BAAS+F,UAAAA,EAAW,YAAA;;8CAClC3F,cAAA,CAACf,uBAAAA,EAAAA;oCAAWwB,OAAAA,EAAQ,IAAA;oCAAKJ,UAAAA,EAAW,MAAA;oCAAOK,SAAAA,EAAU,YAAA;AAClD+B,oCAAAA,QAAAA,EAAAA,aAAAA,CAAc2C,KAAK5B,KAAK;;8CAE3BxD,cAAA,CAACf,uBAAAA,EAAAA;oCAAWwB,OAAAA,EAAQ,OAAA;oCAAQJ,UAAAA,EAAW,MAAA;oCAAOK,SAAAA,EAAU,YAAA;8CACrDiB,YAAAA,CAAa;AACZC,wCAAAA,MAAAA;wCACAC,MAAAA,EAAQsD,GAAAA,KAAQ,YAAYF,iBAAAA,GAAoBI;AAClD,qCAAA;;;;;;eArBD,CAAC,eAAe,EAAEF,GAAAA,CAAAA,CAAK,CAAA;AA4BpC,QAAA,CAAA;;AAGN;AAEA;;AAEkG,2GAE5FU,eAAAA,GAAkB,IAAA;IACtB,MAAM,EAAEpD,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAE1B,IAAA,qBACEhD,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,MAAAA,EAAO,MAAA;QAAO6F,UAAAA,EAAW,QAAA;QAAS5F,cAAAA,EAAe,QAAA;;0BAChFC,cAAA,CAAC8F,iBAAAA,EAAAA;gBAAYC,KAAAA,EAAM,QAAA;gBAASjG,MAAAA,EAAO;;0BACnCJ,eAAA,CAACC,iBAAAA,EAAAA;gBAAKC,SAAAA,EAAU,QAAA;gBAASC,GAAAA,EAAK,CAAA;;kCAC5BG,cAAA,CAACf,uBAAAA,EAAAA;wBAAWwB,OAAAA,EAAQ,MAAA;wBAAOF,SAAAA,EAAU,QAAA;kCAClCkC,aAAAA,CAAc;4BACbtB,EAAAA,EAAI,kCAAA;4BACJsC,cAAAA,EAAgB;AAClB,yBAAA;;kCAEFzD,cAAA,CAACf,uBAAAA,EAAAA;wBAAWwB,OAAAA,EAAQ,OAAA;wBAAQC,SAAAA,EAAU,YAAA;wBAAaH,SAAAA,EAAU,QAAA;kCAC1DkC,aAAAA,CAAc;4BACbtB,EAAAA,EAAI,wCAAA;4BACJsC,cAAAA,EAAgB;AAClB,yBAAA;;;;0BAGJzD,cAAA,CAACgG,uBAAAA,EAAAA;gBAAWC,IAAAA,EAAK,+BAAA;gBAAgCC,UAAU,EAAA,IAAA;gBAACC,IAAAA,EAAK,GAAA;AAAIC,gBAAAA,SAAAA,gBAAWpG,cAAA,CAACqG,WAAAA,EAAAA,EAAAA,CAAAA;0BAC9E5D,aAAAA,CAAc;oBAAEtB,EAAAA,EAAI,mCAAA;oBAAqCsC,cAAAA,EAAgB;AAAa,iBAAA;;;;AAI/F;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport {\n Cloud,\n CloudUpload,\n Earth,\n Images,\n User,\n Key,\n Files,\n Layout,\n Graph,\n Webhooks,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeployNowWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeployNowWidget = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={4} height=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n <CloudUpload width=\"3.2rem\" height=\"3.2rem\" />\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"beta\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.title',\n defaultMessage: 'Ready to go live ?',\n })}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.description',\n defaultMessage: 'Deploy with Strapi Cloud',\n })}\n </Typography>\n </Flex>\n <LinkButton href=\"https://cloud.strapi.io/login\" isExternal size=\"L\" startIcon={<Cloud />}>\n {formatMessage({ id: 'HomePage.widget.deploy-now.button', defaultMessage: 'Deploy Now' })}\n </LinkButton>\n </Flex>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget, DeployNowWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding","DeployNowWidget","CloudUpload","width","LinkButton","href","isExternal","size","startIcon","Cloud"],"mappings":"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"}
1
+ {"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, LinkButton, Typography } from '@strapi/design-system';\nimport {\n Cloud,\n CloudUpload,\n Earth,\n Images,\n User,\n Key,\n Files,\n Layout,\n Graph,\n Webhooks,\n} from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => (\n <Badge key={role.id}>{role.name}</Badge>\n ))}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DeployNowWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DeployNowWidget = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex direction=\"column\" gap={4} height=\"100%\" alignItems=\"center\" justifyContent=\"center\">\n <CloudUpload width=\"3.2rem\" height=\"3.2rem\" />\n <Flex direction=\"column\" gap={2}>\n <Typography variant=\"beta\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.title',\n defaultMessage: 'Ready to go live ?',\n })}\n </Typography>\n <Typography variant=\"omega\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'HomePage.widget.deploy-now.description',\n defaultMessage: 'Deploy with Strapi Cloud',\n })}\n </Typography>\n </Flex>\n <LinkButton href=\"https://cloud.strapi.io/login\" isExternal size=\"L\" startIcon={<Cloud />}>\n {formatMessage({ id: 'HomePage.widget.deploy-now.button', defaultMessage: 'Deploy Now' })}\n </LinkButton>\n </Flex>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget, DeployNowWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding","DeployNowWidget","CloudUpload","width","LinkButton","href","isExternal","size","startIcon","Cloud"],"mappings":"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"}
@@ -136,7 +136,7 @@ const TrackingProvider = ({ children })=>{
136
136
  });
137
137
  return res;
138
138
  }
139
- } catch (err) {
139
+ } catch {
140
140
  // Silence is golden
141
141
  }
142
142
  return null;