@strapi/admin 5.22.0 → 5.23.1

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 (122) hide show
  1. package/dist/admin/admin/src/components/GuidedTour/Context.js +48 -8
  2. package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
  3. package/dist/admin/admin/src/components/GuidedTour/Context.mjs +48 -9
  4. package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/GuidedTour/Overview.js +35 -24
  6. package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
  7. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs +36 -25
  8. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/GuidedTour/Steps/ApiTokensSteps.js +156 -0
  10. package/dist/admin/admin/src/components/GuidedTour/Steps/ApiTokensSteps.js.map +1 -0
  11. package/dist/admin/admin/src/components/GuidedTour/Steps/ApiTokensSteps.mjs +154 -0
  12. package/dist/admin/admin/src/components/GuidedTour/Steps/ApiTokensSteps.mjs.map +1 -0
  13. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentManagerSteps.js +221 -0
  14. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentManagerSteps.js.map +1 -0
  15. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentManagerSteps.mjs +219 -0
  16. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentManagerSteps.mjs.map +1 -0
  17. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js +219 -0
  18. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -0
  19. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs +217 -0
  20. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -0
  21. package/dist/admin/admin/src/components/GuidedTour/{Step.js → Steps/Step.js} +116 -71
  22. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -0
  23. package/dist/admin/admin/src/components/GuidedTour/{Step.mjs → Steps/Step.mjs} +117 -74
  24. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -0
  25. package/dist/admin/admin/src/components/GuidedTour/Tours.js +47 -324
  26. package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
  27. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs +48 -326
  28. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/GuidedTour/utils/constants.js +19 -0
  30. package/dist/admin/admin/src/components/GuidedTour/utils/constants.js.map +1 -0
  31. package/dist/admin/admin/src/components/GuidedTour/utils/constants.mjs +17 -0
  32. package/dist/admin/admin/src/components/GuidedTour/utils/constants.mjs.map +1 -0
  33. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js +31 -0
  34. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.js.map +1 -0
  35. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs +29 -0
  36. package/dist/admin/admin/src/components/GuidedTour/utils/migrations.mjs.map +1 -0
  37. package/dist/admin/admin/src/components/SubNav.js +3 -1
  38. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  39. package/dist/admin/admin/src/components/SubNav.mjs +3 -1
  40. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/Widgets.js +4 -0
  42. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  43. package/dist/admin/admin/src/components/Widgets.mjs +5 -1
  44. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
  45. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  46. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  47. package/dist/admin/admin/src/pages/Home/HomePage.js +10 -1
  48. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  49. package/dist/admin/admin/src/pages/Home/HomePage.mjs +10 -1
  50. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +17 -14
  52. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +17 -14
  54. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
  55. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +31 -6
  56. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  57. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +12 -6
  58. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +28 -24
  60. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
  61. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +28 -24
  62. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
  63. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  64. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +56 -57
  66. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +57 -58
  68. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  69. package/dist/admin/admin/src/services/apiTokens.js +0 -1
  70. package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
  71. package/dist/admin/admin/src/services/apiTokens.mjs +0 -1
  72. package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
  73. package/dist/admin/admin/src/translations/en.json.js +33 -21
  74. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  75. package/dist/admin/admin/src/translations/en.json.mjs +33 -21
  76. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  77. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js +2 -2
  78. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
  79. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.mjs +2 -2
  80. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.mjs.map +1 -1
  81. package/dist/admin/index.js +6 -2
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +2 -0
  84. package/dist/admin/index.mjs.map +1 -1
  85. package/dist/admin/src/components/GuidedTour/Context.d.ts +28 -10
  86. package/dist/admin/src/components/GuidedTour/Steps/ApiTokensSteps.d.ts +20 -0
  87. package/dist/admin/src/components/GuidedTour/Steps/ContentManagerSteps.d.ts +21 -0
  88. package/dist/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.d.ts +30 -0
  89. package/dist/admin/src/components/GuidedTour/{Step.d.ts → Steps/Step.d.ts} +25 -6
  90. package/dist/admin/src/components/GuidedTour/Tours.d.ts +53 -14
  91. package/dist/admin/src/components/GuidedTour/utils/constants.d.ts +15 -0
  92. package/dist/admin/src/components/GuidedTour/utils/migrations.d.ts +6 -0
  93. package/dist/admin/src/features/Tracking.d.ts +23 -4
  94. package/dist/admin/src/index.d.ts +5 -0
  95. package/dist/admin/src/pages/Home/HomePage.d.ts +2 -2
  96. package/dist/server/server/src/controllers/admin.js +2 -5
  97. package/dist/server/server/src/controllers/admin.js.map +1 -1
  98. package/dist/server/server/src/controllers/admin.mjs +2 -5
  99. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  100. package/dist/server/server/src/services/index.js +0 -2
  101. package/dist/server/server/src/services/index.js.map +1 -1
  102. package/dist/server/server/src/services/index.mjs +0 -2
  103. package/dist/server/server/src/services/index.mjs.map +1 -1
  104. package/dist/server/src/controllers/admin.d.ts +1 -1
  105. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  106. package/dist/server/src/controllers/index.d.ts +1 -1
  107. package/dist/server/src/index.d.ts +1 -6
  108. package/dist/server/src/index.d.ts.map +1 -1
  109. package/dist/server/src/services/constants.d.ts +1 -0
  110. package/dist/server/src/services/guided-tour.d.ts +2 -3
  111. package/dist/server/src/services/guided-tour.d.ts.map +1 -1
  112. package/dist/server/src/services/index.d.ts +0 -5
  113. package/dist/server/src/services/index.d.ts.map +1 -1
  114. package/dist/shared/contracts/admin.d.ts +2 -2
  115. package/dist/shared/contracts/admin.d.ts.map +1 -1
  116. package/package.json +7 -7
  117. package/dist/admin/admin/src/components/GuidedTour/Step.js.map +0 -1
  118. package/dist/admin/admin/src/components/GuidedTour/Step.mjs.map +0 -1
  119. package/dist/server/server/src/services/guided-tour.js +0 -61
  120. package/dist/server/server/src/services/guided-tour.js.map +0 -1
  121. package/dist/server/server/src/services/guided-tour.mjs +0 -59
  122. package/dist/server/server/src/services/guided-tour.mjs.map +0 -1
@@ -26,7 +26,7 @@ const LastActivityTable = ({ items })=>{
26
26
  return `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC&id=${item.id}`;
27
27
  };
28
28
  const handleRowClick = (document)=>()=>{
29
- trackUsage('willOpenAuditLogDetails');
29
+ trackUsage('willOpenAuditLogDetailsFromHome');
30
30
  const link = getAuditLogDetailsLink(document);
31
31
  navigate(link);
32
32
  };
@@ -79,7 +79,7 @@ const LastActivityTable = ({ items })=>{
79
79
  children: /*#__PURE__*/ jsx(IconButton, {
80
80
  tag: Link,
81
81
  to: getAuditLogDetailsLink(item),
82
- onClick: ()=>trackUsage('willOpenAuditLogDetails'),
82
+ onClick: ()=>trackUsage('willOpenAuditLogDetailsFromHome'),
83
83
  label: formatMessage({
84
84
  id: 'global.details',
85
85
  defaultMessage: 'Details'
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.mjs","sources":["../../../../../../../ee/admin/src/components/AuditLogs/Widgets.tsx"],"sourcesContent":["import { useTracking, Widget } from '@strapi/admin/strapi-admin';\nimport { Box, IconButton, Table, Tbody, Td, Tr, Typography } from '@strapi/design-system';\nimport { Eye } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { RelativeTime as BaseRelativeTime } from '../../../../../admin/src/components/RelativeTime';\nimport { useQueryParams } from '../../../../../admin/src/hooks/useQueryParams';\nimport { AuditLog } from '../../../../../shared/contracts/audit-logs';\nimport { AUDIT_LOGS_DEFAULT_PAGE_SIZE } from '../../constants';\nimport { getDefaultMessage } from '../../pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages';\nimport { useGetAuditLogsQuery } from '../../services/auditLogs';\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst LastActivityTable = ({ items }: { items: AuditLog[] }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getAuditLogDetailsLink = (item: AuditLog): string => {\n return `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC&id=${item.id}`;\n };\n\n const handleRowClick = (document: AuditLog) => () => {\n trackUsage('willOpenAuditLogDetails');\n const link = getAuditLogDetailsLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={4} rowCount={items?.length ?? 0}>\n <Tbody>\n {items?.map((item) => {\n const action = formatMessage(\n {\n id: `Settings.permissions.auditLogs.${item.action}`,\n // @ts-expect-error – getDefaultMessage probably doesn't benefit from being so strongly typed unless we just add string at the end.\n defaultMessage: getDefaultMessage(item.action),\n },\n { model: (item.payload.model as string) ?? '' }\n );\n const userDisplayName = item.user?.displayName ?? '-';\n return (\n <Tr\n onClick={handleRowClick(item)}\n cursor=\"pointer\"\n key={`lastActivity_auditLog_${item.id}`}\n >\n <Td>\n <Typography title={action} variant=\"omega\" textColor=\"neutral800\">\n {action}\n </Typography>\n </Td>\n <Td>\n <Typography variant=\"omega\" textColor=\"neutral800\">\n <RelativeTime timestamp={new Date(item.date)} />\n </Typography>\n </Td>\n <Td>\n <Typography title={userDisplayName} variant=\"omega\" textColor=\"neutral800\">\n {userDisplayName}\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getAuditLogDetailsLink(item)}\n onClick={() => trackUsage('willOpenAuditLogDetails')}\n label={formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n );\n};\n\nconst AuditLogsWidget = () => {\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams();\n const { data, isLoading, error } = useGetAuditLogsQuery(\n {\n ...query,\n page: 1,\n pageSize: 4,\n sort: 'date:DESC',\n },\n {\n refetchOnMountOrArgChange: true,\n }\n );\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data?.results) {\n return <Widget.Error />;\n }\n\n if (data.results.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'widget.last-activity.no-activity',\n defaultMessage: 'No activity',\n })}\n </Widget.NoData>\n );\n }\n\n return <LastActivityTable items={data.results ?? []} />;\n};\n\nexport { AuditLogsWidget };\n"],"names":["RelativeTime","styled","BaseRelativeTime","LastActivityTable","items","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getAuditLogDetailsLink","item","AUDIT_LOGS_DEFAULT_PAGE_SIZE","id","handleRowClick","document","link","_jsx","Table","colCount","rowCount","length","Tbody","map","action","defaultMessage","getDefaultMessage","model","payload","userDisplayName","user","displayName","_jsxs","Tr","onClick","cursor","Td","Typography","title","variant","textColor","timestamp","Date","date","e","stopPropagation","Box","display","IconButton","tag","Link","to","label","Eye","AuditLogsWidget","query","useQueryParams","data","isLoading","error","useGetAuditLogsQuery","page","pageSize","sort","refetchOnMountOrArgChange","Widget","Loading","results","Error","NoData"],"mappings":"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"}
1
+ {"version":3,"file":"Widgets.mjs","sources":["../../../../../../../ee/admin/src/components/AuditLogs/Widgets.tsx"],"sourcesContent":["import { useTracking, Widget } from '@strapi/admin/strapi-admin';\nimport { Box, IconButton, Table, Tbody, Td, Tr, Typography } from '@strapi/design-system';\nimport { Eye } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { RelativeTime as BaseRelativeTime } from '../../../../../admin/src/components/RelativeTime';\nimport { useQueryParams } from '../../../../../admin/src/hooks/useQueryParams';\nimport { AuditLog } from '../../../../../shared/contracts/audit-logs';\nimport { AUDIT_LOGS_DEFAULT_PAGE_SIZE } from '../../constants';\nimport { getDefaultMessage } from '../../pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages';\nimport { useGetAuditLogsQuery } from '../../services/auditLogs';\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst LastActivityTable = ({ items }: { items: AuditLog[] }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n\n const getAuditLogDetailsLink = (item: AuditLog): string => {\n return `/settings/audit-logs?pageSize=${AUDIT_LOGS_DEFAULT_PAGE_SIZE}&page=1&sort=date:DESC&id=${item.id}`;\n };\n\n const handleRowClick = (document: AuditLog) => () => {\n trackUsage('willOpenAuditLogDetailsFromHome');\n const link = getAuditLogDetailsLink(document);\n navigate(link);\n };\n\n return (\n <Table colCount={4} rowCount={items?.length ?? 0}>\n <Tbody>\n {items?.map((item) => {\n const action = formatMessage(\n {\n id: `Settings.permissions.auditLogs.${item.action}`,\n // @ts-expect-error – getDefaultMessage probably doesn't benefit from being so strongly typed unless we just add string at the end.\n defaultMessage: getDefaultMessage(item.action),\n },\n { model: (item.payload.model as string) ?? '' }\n );\n const userDisplayName = item.user?.displayName ?? '-';\n return (\n <Tr\n onClick={handleRowClick(item)}\n cursor=\"pointer\"\n key={`lastActivity_auditLog_${item.id}`}\n >\n <Td>\n <Typography title={action} variant=\"omega\" textColor=\"neutral800\">\n {action}\n </Typography>\n </Td>\n <Td>\n <Typography variant=\"omega\" textColor=\"neutral800\">\n <RelativeTime timestamp={new Date(item.date)} />\n </Typography>\n </Td>\n <Td>\n <Typography title={userDisplayName} variant=\"omega\" textColor=\"neutral800\">\n {userDisplayName}\n </Typography>\n </Td>\n <Td onClick={(e) => e.stopPropagation()}>\n <Box display=\"inline-block\">\n <IconButton\n tag={Link}\n to={getAuditLogDetailsLink(item)}\n onClick={() => trackUsage('willOpenAuditLogDetailsFromHome')}\n label={formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n variant=\"ghost\"\n >\n <Eye />\n </IconButton>\n </Box>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n );\n};\n\nconst AuditLogsWidget = () => {\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams();\n const { data, isLoading, error } = useGetAuditLogsQuery(\n {\n ...query,\n page: 1,\n pageSize: 4,\n sort: 'date:DESC',\n },\n {\n refetchOnMountOrArgChange: true,\n }\n );\n\n if (isLoading) {\n return <Widget.Loading />;\n }\n\n if (error || !data?.results) {\n return <Widget.Error />;\n }\n\n if (data.results.length === 0) {\n return (\n <Widget.NoData>\n {formatMessage({\n id: 'widget.last-activity.no-activity',\n defaultMessage: 'No activity',\n })}\n </Widget.NoData>\n );\n }\n\n return <LastActivityTable items={data.results ?? []} />;\n};\n\nexport { AuditLogsWidget };\n"],"names":["RelativeTime","styled","BaseRelativeTime","LastActivityTable","items","formatMessage","useIntl","trackUsage","useTracking","navigate","useNavigate","getAuditLogDetailsLink","item","AUDIT_LOGS_DEFAULT_PAGE_SIZE","id","handleRowClick","document","link","_jsx","Table","colCount","rowCount","length","Tbody","map","action","defaultMessage","getDefaultMessage","model","payload","userDisplayName","user","displayName","_jsxs","Tr","onClick","cursor","Td","Typography","title","variant","textColor","timestamp","Date","date","e","stopPropagation","Box","display","IconButton","tag","Link","to","label","Eye","AuditLogsWidget","query","useQueryParams","data","isLoading","error","useGetAuditLogsQuery","page","pageSize","sort","refetchOnMountOrArgChange","Widget","Loading","results","Error","NoData"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  var render = require('./admin/src/render.js');
4
4
  var BackButton = require('./admin/src/features/BackButton.js');
5
5
  var ConfirmDialog = require('./admin/src/components/ConfirmDialog.js');
6
- var Context = require('./admin/src/components/Context.js');
6
+ var Context$1 = require('./admin/src/components/Context.js');
7
7
  var DescriptionComponentRenderer = require('./admin/src/components/DescriptionComponentRenderer.js');
8
8
  var Filters = require('./admin/src/components/Filters.js');
9
9
  var Form = require('./admin/src/components/Form.js');
@@ -17,6 +17,8 @@ var ContentBox = require('./admin/src/components/ContentBox.js');
17
17
  var SubNav = require('./admin/src/components/SubNav.js');
18
18
  var GradientBadge = require('./admin/src/components/GradientBadge.js');
19
19
  var Tours = require('./admin/src/components/GuidedTour/Tours.js');
20
+ var Context = require('./admin/src/components/GuidedTour/Context.js');
21
+ var constants = require('./admin/src/components/GuidedTour/utils/constants.js');
20
22
  var Tracking = require('./admin/src/features/Tracking.js');
21
23
  var StrapiApp = require('./admin/src/features/StrapiApp.js');
22
24
  var Notifications = require('./admin/src/features/Notifications.js');
@@ -45,7 +47,7 @@ exports.renderAdmin = render.renderAdmin;
45
47
  exports.BackButton = BackButton.BackButton;
46
48
  exports.useHistory = BackButton.useHistory;
47
49
  exports.ConfirmDialog = ConfirmDialog.ConfirmDialog;
48
- exports.createContext = Context.createContext;
50
+ exports.createContext = Context$1.createContext;
49
51
  exports.DescriptionComponentRenderer = DescriptionComponentRenderer.DescriptionComponentRenderer;
50
52
  exports.Filters = Filters.Filters;
51
53
  exports.Blocker = Form.Blocker;
@@ -64,6 +66,8 @@ exports.ContentBox = ContentBox.ContentBox;
64
66
  exports.SubNav = SubNav.SubNav;
65
67
  exports.GradientBadge = GradientBadge.GradientBadge;
66
68
  exports.tours = Tours.tours;
69
+ exports.useGuidedTour = Context.useGuidedTour;
70
+ exports.GUIDED_TOUR_REQUIRED_ACTIONS = constants.GUIDED_TOUR_REQUIRED_ACTIONS;
67
71
  exports.useTracking = Tracking.useTracking;
68
72
  exports.useStrapiApp = StrapiApp.useStrapiApp;
69
73
  exports.NotificationsProvider = Notifications.NotificationsProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -15,6 +15,8 @@ export { ContentBox } from './admin/src/components/ContentBox.mjs';
15
15
  export { SubNav } from './admin/src/components/SubNav.mjs';
16
16
  export { GradientBadge } from './admin/src/components/GradientBadge.mjs';
17
17
  export { tours } from './admin/src/components/GuidedTour/Tours.mjs';
18
+ export { useGuidedTour } from './admin/src/components/GuidedTour/Context.mjs';
19
+ export { GUIDED_TOUR_REQUIRED_ACTIONS } from './admin/src/components/GuidedTour/utils/constants.mjs';
18
20
  export { useTracking } from './admin/src/features/Tracking.mjs';
19
21
  export { useStrapiApp } from './admin/src/features/StrapiApp.mjs';
20
22
  export { NotificationsProvider, useNotification } from './admin/src/features/Notifications.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,40 +1,58 @@
1
1
  import * as React from 'react';
2
- import { GetGuidedTourMeta } from '../../../../shared/contracts/admin';
3
2
  import { type Tours } from './Tours';
3
+ import { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';
4
4
  type ValidTourName = keyof Tours;
5
- export type ExtendedCompletedActions = (GetGuidedTourMeta.Response['data']['completedActions'][number] | 'didCopyApiToken')[];
5
+ /**
6
+ * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS
7
+ * (ie didCreateContentTypeSchema | didCreateContent etc...)
8
+ */
9
+ type ValueOf<T> = T[keyof T];
10
+ type NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;
11
+ export type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];
6
12
  type Action = {
7
13
  type: 'next_step';
8
14
  payload: ValidTourName;
9
15
  } | {
10
- type: 'skip_tour';
16
+ type: 'previous_step';
11
17
  payload: ValidTourName;
12
18
  } | {
13
- type: 'set_completed_actions';
14
- payload: ExtendedCompletedActions;
19
+ type: 'go_to_step';
20
+ payload: {
21
+ tourName: ValidTourName;
22
+ step: number;
23
+ };
24
+ } | {
25
+ type: 'skip_tour';
26
+ payload: ValidTourName;
15
27
  } | {
16
28
  type: 'skip_all_tours';
17
29
  } | {
18
30
  type: 'reset_all_tours';
31
+ } | {
32
+ type: 'set_completed_actions';
33
+ payload: CompletedActions;
34
+ } | {
35
+ type: 'remove_completed_action';
36
+ payload: ValueOf<CompletedActions>;
19
37
  };
20
- type Tour = Record<ValidTourName, {
38
+ type TourState = Record<ValidTourName, {
21
39
  currentStep: number;
22
- length: number;
23
40
  isCompleted: boolean;
24
41
  }>;
25
42
  type State = {
26
- tours: Tour;
43
+ tours: TourState;
27
44
  enabled: boolean;
28
- completedActions: ExtendedCompletedActions;
45
+ completedActions: CompletedActions;
29
46
  };
30
47
  declare const useGuidedTour: <Selected, ShouldThrow extends boolean = true>(consumerName: string, selector: (value: {
31
48
  state: State;
32
49
  dispatch: React.Dispatch<Action>;
33
50
  }) => Selected, shouldThrowOnMissingContext?: ShouldThrow | undefined) => ShouldThrow extends true ? Selected : Selected | undefined;
51
+ declare const getCompletedTours: (tours: TourState) => ValidTourName[];
34
52
  declare function reducer(state: State, action: Action): State;
35
53
  declare const GuidedTourContext: ({ children, enabled, }: {
36
54
  children: React.ReactNode;
37
55
  enabled?: boolean;
38
56
  }) => import("react/jsx-runtime").JSX.Element;
39
57
  export type { Action, State, ValidTourName };
40
- export { GuidedTourContext, useGuidedTour, reducer };
58
+ export { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };
@@ -0,0 +1,20 @@
1
+ import { type CompletedActions } from '../Context';
2
+ import { type StepContentProps } from '../Tours';
3
+ export declare const apiTokensSteps: readonly [{
4
+ readonly name: "Introduction";
5
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
6
+ }, {
7
+ readonly name: "ManageAPIToken";
8
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
9
+ }, {
10
+ readonly name: "ViewAPIToken";
11
+ readonly content: ({ Step, dispatch }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
12
+ }, {
13
+ readonly name: "CopyAPIToken";
14
+ readonly content: ({ Step, dispatch }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
15
+ }, {
16
+ readonly name: "Finish";
17
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
18
+ readonly excludeFromStepCount: true;
19
+ readonly when: (completedActions: CompletedActions) => boolean;
20
+ }];
@@ -0,0 +1,21 @@
1
+ import { CompletedActions } from '../Context';
2
+ import { type StepContentProps } from '../Tours';
3
+ export declare const contentManagerSteps: readonly [{
4
+ readonly name: "Introduction";
5
+ readonly when: (completedActions: CompletedActions) => boolean;
6
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
7
+ }, ...{
8
+ name: string;
9
+ content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
10
+ }[], {
11
+ readonly name: "Fields";
12
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
13
+ }, {
14
+ readonly name: "Publish";
15
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
16
+ }, {
17
+ readonly name: "Finish";
18
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
19
+ readonly excludeFromStepCount: true;
20
+ readonly when: (completedActions: CompletedActions) => boolean;
21
+ }];
@@ -0,0 +1,30 @@
1
+ import { CompletedActions } from '../Context';
2
+ import { type StepContentProps } from '../Tours';
3
+ export declare const contentTypeBuilderSteps: readonly [{
4
+ readonly name: "Introduction";
5
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
6
+ }, {
7
+ readonly name: "CollectionTypes";
8
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
9
+ }, {
10
+ readonly name: "SingleTypes";
11
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
12
+ }, {
13
+ readonly name: "Components";
14
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
15
+ }, {
16
+ readonly name: "YourTurn";
17
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
18
+ }, {
19
+ readonly name: "AddFields";
20
+ readonly content: ({ Step, dispatch }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
21
+ }, {
22
+ readonly name: "Save";
23
+ readonly when: (completedActions: CompletedActions) => boolean;
24
+ readonly content: ({ Step, dispatch }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
25
+ }, {
26
+ readonly name: "Finish";
27
+ readonly content: ({ Step }: StepContentProps) => import("react/jsx-runtime").JSX.Element;
28
+ readonly excludeFromStepCount: true;
29
+ readonly when: (completedActions: CompletedActions) => boolean;
30
+ }];
@@ -1,7 +1,25 @@
1
1
  import * as React from 'react';
2
2
  import { Popover, FlexProps } from '@strapi/design-system';
3
3
  import { type MessageDescriptor } from 'react-intl';
4
- import { type ValidTourName } from './Context';
4
+ import { To } from 'react-router-dom';
5
+ import { type ValidTourName } from '../Context';
6
+ declare const StepCount: ({ tourName, displayedCurrentStep, displayedTourLength, }: {
7
+ tourName: ValidTourName;
8
+ displayedCurrentStep?: number;
9
+ displayedTourLength?: number;
10
+ }) => import("react/jsx-runtime").JSX.Element;
11
+ declare const GotItAction: ({ onClick }: {
12
+ onClick: () => void;
13
+ }) => import("react/jsx-runtime").JSX.Element;
14
+ export type DefaultActionsProps = {
15
+ showSkip?: boolean;
16
+ showPrevious?: boolean;
17
+ to?: To;
18
+ onNextStep?: () => void;
19
+ onPreviousStep?: () => void;
20
+ tourName: ValidTourName;
21
+ };
22
+ declare const DefaultActions: ({ showSkip, showPrevious, to, tourName, onNextStep, onPreviousStep, }: DefaultActionsProps) => import("react/jsx-runtime").JSX.Element;
5
23
  type WithChildren = {
6
24
  children: React.ReactNode;
7
25
  id?: never;
@@ -17,11 +35,13 @@ type WithActionsChildren = {
17
35
  children: React.ReactNode;
18
36
  showStepCount?: boolean;
19
37
  showSkip?: boolean;
38
+ showPrevious?: boolean;
20
39
  };
21
40
  type WithActionsProps = {
22
41
  children?: undefined;
23
42
  showStepCount?: boolean;
24
43
  showSkip?: boolean;
44
+ showPrevious?: boolean;
25
45
  };
26
46
  type StepProps = WithChildren | WithIntl;
27
47
  type ActionsProps = WithActionsChildren | WithActionsProps;
@@ -30,14 +50,13 @@ type Step = {
30
50
  withArrow?: boolean;
31
51
  }>;
32
52
  Title: (props: StepProps) => React.ReactNode;
33
- Content: (props: StepProps) => React.ReactNode;
53
+ Content: (props: StepProps & {
54
+ values?: Record<string, React.ReactNode | ((chunks: React.ReactNode) => React.ReactNode)>;
55
+ }) => React.ReactNode;
34
56
  Actions: (props: ActionsProps & {
35
57
  to?: string;
36
58
  } & FlexProps) => React.ReactNode;
37
59
  };
38
- export declare const StepCount: ({ tourName }: {
39
- tourName: ValidTourName;
40
- }) => import("react/jsx-runtime").JSX.Element;
41
60
  declare const createStepComponents: (tourName: ValidTourName) => Step;
42
61
  export type { Step };
43
- export { createStepComponents };
62
+ export { createStepComponents, GotItAction, StepCount, DefaultActions };
@@ -1,8 +1,11 @@
1
1
  import * as React from 'react';
2
- import { type State, type Action } from './Context';
3
- import { Step } from './Step';
2
+ import { type State, type Action, CompletedActions } from './Context';
3
+ import { type Step } from './Steps/Step';
4
4
  declare const tours: {
5
5
  readonly contentTypeBuilder: {
6
+ Save: React.ComponentType<{
7
+ children: React.ReactNode;
8
+ }>;
6
9
  Introduction: React.ComponentType<{
7
10
  children: React.ReactNode;
8
11
  }>;
@@ -15,23 +18,30 @@ declare const tours: {
15
18
  Components: React.ComponentType<{
16
19
  children: React.ReactNode;
17
20
  }>;
18
- Finish: React.ComponentType<{
21
+ YourTurn: React.ComponentType<{
19
22
  children: React.ReactNode;
20
23
  }>;
21
- };
22
- readonly contentManager: {
23
- Introduction: React.ComponentType<{
24
+ AddFields: React.ComponentType<{
24
25
  children: React.ReactNode;
25
26
  }>;
26
27
  Finish: React.ComponentType<{
27
28
  children: React.ReactNode;
28
29
  }>;
29
- Fields: React.ComponentType<{
30
- children: React.ReactNode;
31
- }>;
32
- Publish: React.ComponentType<{
30
+ } & {
31
+ _meta: {
32
+ totalStepCount: number;
33
+ displayedStepCount: number;
34
+ };
35
+ };
36
+ readonly contentManager: {
37
+ [x: string]: React.ComponentType<{
33
38
  children: React.ReactNode;
34
39
  }>;
40
+ } & {
41
+ _meta: {
42
+ totalStepCount: number;
43
+ displayedStepCount: number;
44
+ };
35
45
  };
36
46
  readonly apiTokens: {
37
47
  Introduction: React.ComponentType<{
@@ -40,19 +50,48 @@ declare const tours: {
40
50
  Finish: React.ComponentType<{
41
51
  children: React.ReactNode;
42
52
  }>;
43
- CreateAnAPIToken: React.ComponentType<{
53
+ ManageAPIToken: React.ComponentType<{
54
+ children: React.ReactNode;
55
+ }>;
56
+ ViewAPIToken: React.ComponentType<{
44
57
  children: React.ReactNode;
45
58
  }>;
46
59
  CopyAPIToken: React.ComponentType<{
47
60
  children: React.ReactNode;
48
61
  }>;
62
+ } & {
63
+ _meta: {
64
+ totalStepCount: number;
65
+ displayedStepCount: number;
66
+ };
67
+ };
68
+ readonly strapiCloud: {} & {
69
+ _meta: {
70
+ totalStepCount: number;
71
+ displayedStepCount: number;
72
+ };
49
73
  };
50
- readonly strapiCloud: {};
51
74
  };
52
75
  type Tours = typeof tours;
53
- type Content = (Step: Step, { state, dispatch, }: {
76
+ export type StepContentProps = {
77
+ Step: Step;
54
78
  state: State;
55
79
  dispatch: React.Dispatch<Action>;
56
- }) => React.ReactNode;
80
+ };
81
+ type Content = (props: StepContentProps) => React.ReactNode;
82
+ export type TourStep<P extends string> = {
83
+ name: P;
84
+ content: Content;
85
+ when?: (completedActions: CompletedActions) => boolean;
86
+ excludeFromStepCount?: boolean;
87
+ };
88
+ export declare function createTour<const T extends ReadonlyArray<TourStep<string>>>(tourName: string, steps: T): { [K in T[number]["name"]]: React.ComponentType<{
89
+ children: React.ReactNode;
90
+ }>; } & {
91
+ _meta: {
92
+ totalStepCount: number;
93
+ displayedStepCount: number;
94
+ };
95
+ };
57
96
  export type { Content, Tours };
58
97
  export { tours };
@@ -0,0 +1,15 @@
1
+ declare const GUIDED_TOUR_REQUIRED_ACTIONS: {
2
+ readonly contentTypeBuilder: {
3
+ readonly createSchema: "didCreateContentTypeSchema";
4
+ readonly addField: "didAddFieldToSchema";
5
+ };
6
+ readonly contentManager: {
7
+ readonly createContent: "didCreateContent";
8
+ };
9
+ readonly apiTokens: {
10
+ readonly createToken: "didCreateApiToken";
11
+ readonly copyToken: "didCopyApiToken";
12
+ };
13
+ readonly strapiCloud: {};
14
+ };
15
+ export { GUIDED_TOUR_REQUIRED_ACTIONS };
@@ -0,0 +1,6 @@
1
+ import type { State } from '../Context';
2
+ /**
3
+ * Migrates tours added or removed from the tours object
4
+ */
5
+ declare const migrateTours: (storedTourState: State) => State;
6
+ export { migrateTours };
@@ -25,7 +25,7 @@ declare const TrackingProvider: ({ children }: TrackingProviderProps) => import(
25
25
  * event so understanding which properties go with which event is very helpful.
26
26
  */
27
27
  export interface EventWithoutProperties {
28
- name: 'changeComponentsOrder' | 'didAddComponentToDynamicZone' | 'didBulkDeleteEntries' | 'didNotBulkDeleteEntries' | 'didChangeDisplayedFields' | 'didCheckDraftRelations' | 'didClickGuidedTourHomepageApiTokens' | 'didClickGuidedTourHomepageContentManager' | 'didClickGuidedTourHomepageContentTypeBuilder' | 'didClickGuidedTourStep1CollectionType' | 'didClickGuidedTourStep2ContentManager' | 'didClickGuidedTourStep3ApiTokens' | 'didClickonBlogSection' | 'didClickonCodeExampleSection' | 'didClickonReadTheDocumentationSection' | 'didClickOnTryStrapiCloudSection' | 'didClickonTutorialSection' | 'didCreateGuidedTourCollectionType' | 'didCreateGuidedTourEntry' | 'didCreateNewRole' | 'didCreateRole' | 'didDeleteToken' | 'didDuplicateRole' | 'didEditEditSettings' | 'didEditEmailTemplates' | 'didEditFieldNameOnContentType' | 'didEditListSettings' | 'didEditMediaLibraryConfig' | 'didEditNameOfContentType' | 'didGenerateGuidedTourApiTokens' | 'didGoToMarketplace' | 'didLaunchGuidedtour' | 'didMissMarketplacePlugin' | 'didNotCreateFirstAdmin' | 'didNotSaveComponent' | 'didPluginLearnMore' | 'didBulkPublishEntries' | 'didNotBulkPublishEntries' | 'didUnpublishEntry' | 'didBulkUnpublishEntries' | 'didNotBulkUnpublishEntries' | 'didSaveComponent' | 'didSaveContentType' | 'didSearch' | 'didSkipGuidedtour' | 'didSubmitPlugin' | 'didSubmitProvider' | 'didUpdateConditions' | 'didSelectAllMediaLibraryElements' | 'didSelectContentTypeFieldSettings' | 'didSelectContentTypeSettings' | 'didEditAuthenticationProvider' | 'didRestoreHistoryVersion' | 'hasClickedCTBAddFieldBanner' | 'removeComponentFromDynamicZone' | 'willAddMoreFieldToContentType' | 'willBulkDeleteEntries' | 'willBulkPublishEntries' | 'willBulkUnpublishEntries' | 'willChangeNumberOfEntriesPerPage' | 'willCheckDraftRelations' | 'willCreateComponent' | 'willCreateComponentFromAttributesModal' | 'willCreateContentType' | 'willCreateFirstAdmin' | 'willCreateNewRole' | 'willCreateRole' | 'willCreateSingleType' | 'willCreateStage' | 'willCreateWorkflow' | 'willDeleteEntryFromList' | 'willDeleteFieldOfContentType' | 'willDuplicateRole' | 'willEditEditLayout' | 'willEditEmailTemplates' | 'willEditEntryFromButton' | 'willEditEntryFromHome' | 'willEditEntryFromList' | 'willEditReleaseFromHome' | 'willEditFieldOfContentType' | 'willEditMediaLibraryConfig' | 'willEditNameOfContentType' | 'willEditNameOfSingleType' | 'willEditAuthenticationProvider' | 'willEditFieldNameOnContentType' | 'willEditStage' | 'willFilterEntries' | 'willInstallPlugin' | 'willOpenAuditLogDetails' | 'willUnpublishEntry' | 'willSaveComponent' | 'willSaveContentType' | 'willSaveContentTypeLayout' | 'didEditFieldNameOnContentType' | 'didCreateRelease' | 'didLaunchGuidedtour';
28
+ name: 'changeComponentsOrder' | 'didAddComponentToDynamicZone' | 'didBulkDeleteEntries' | 'didNotBulkDeleteEntries' | 'didChangeDisplayedFields' | 'didCheckDraftRelations' | 'didClickGuidedTourHomepageApiTokens' | 'didClickGuidedTourHomepageContentManager' | 'didClickGuidedTourHomepageContentTypeBuilder' | 'didClickGuidedTourStep1CollectionType' | 'didClickGuidedTourStep2ContentManager' | 'didClickGuidedTourStep3ApiTokens' | 'didClickonBlogSection' | 'didClickonCodeExampleSection' | 'didClickonReadTheDocumentationSection' | 'didClickOnTryStrapiCloudSection' | 'didClickonTutorialSection' | 'didCreateGuidedTourCollectionType' | 'didCreateGuidedTourEntry' | 'didCreateNewRole' | 'didCreateRole' | 'didDeleteToken' | 'didDuplicateRole' | 'didEditEditSettings' | 'didEditEmailTemplates' | 'didEditFieldNameOnContentType' | 'didEditListSettings' | 'didEditMediaLibraryConfig' | 'didEditNameOfContentType' | 'didGenerateGuidedTourApiTokens' | 'didGoToMarketplace' | 'didLaunchGuidedtour' | 'didMissMarketplacePlugin' | 'didNotCreateFirstAdmin' | 'didNotSaveComponent' | 'didPluginLearnMore' | 'didBulkPublishEntries' | 'didNotBulkPublishEntries' | 'didUnpublishEntry' | 'didBulkUnpublishEntries' | 'didNotBulkUnpublishEntries' | 'didSaveComponent' | 'didSaveContentType' | 'didSearch' | 'didSkipGuidedtour' | 'didSubmitPlugin' | 'didSubmitProvider' | 'didUpdateConditions' | 'didSelectAllMediaLibraryElements' | 'didSelectContentTypeFieldSettings' | 'didSelectContentTypeSettings' | 'didEditAuthenticationProvider' | 'didRestoreHistoryVersion' | 'hasClickedCTBAddFieldBanner' | 'removeComponentFromDynamicZone' | 'willAddMoreFieldToContentType' | 'willBulkDeleteEntries' | 'willBulkPublishEntries' | 'willBulkUnpublishEntries' | 'willChangeNumberOfEntriesPerPage' | 'willCheckDraftRelations' | 'willCreateComponent' | 'willCreateComponentFromAttributesModal' | 'willCreateContentType' | 'willCreateFirstAdmin' | 'willCreateNewRole' | 'willCreateRole' | 'willCreateSingleType' | 'willCreateStage' | 'willCreateWorkflow' | 'willDeleteEntryFromList' | 'willDeleteFieldOfContentType' | 'willDuplicateRole' | 'willEditEditLayout' | 'willEditEmailTemplates' | 'willEditEntryFromButton' | 'willEditEntryFromList' | 'willEditReleaseFromHome' | 'willEditFieldOfContentType' | 'willEditMediaLibraryConfig' | 'willEditNameOfContentType' | 'willEditNameOfSingleType' | 'willEditAuthenticationProvider' | 'willEditFieldNameOnContentType' | 'willEditStage' | 'willFilterEntries' | 'willInstallPlugin' | 'willOpenAuditLogDetailsFromHome' | 'willUnpublishEntry' | 'willSaveComponent' | 'willSaveContentType' | 'willSaveContentTypeLayout' | 'didEditFieldNameOnContentType' | 'didCreateRelease' | 'didLaunchGuidedtour';
29
29
  properties?: never;
30
30
  }
31
31
  interface DidAccessAuthenticatedAdministrationEvent {
@@ -196,16 +196,35 @@ interface DidSkipGuidedTour {
196
196
  interface DidCompleteGuidedTour {
197
197
  name: 'didCompleteGuidedTour';
198
198
  properties: {
199
- name: keyof Tours;
199
+ name: keyof Tours | 'all';
200
200
  };
201
201
  }
202
202
  interface DidStartGuidedTour {
203
- name: 'didStartGuidedTourFromHomepage';
203
+ name: 'didStartGuidedTour';
204
204
  properties: {
205
205
  name: keyof Tours;
206
+ fromHomepage?: boolean;
207
+ };
208
+ }
209
+ interface WillEditEntryFromHome {
210
+ name: 'willEditEntryFromHome';
211
+ properties: {
212
+ entryType: 'edited' | 'published' | 'assigned';
213
+ };
214
+ }
215
+ interface DidOpenHomeWidgetLink {
216
+ name: 'didOpenHomeWidgetLink';
217
+ properties: {
218
+ widgetUID: string;
219
+ };
220
+ }
221
+ interface DidOpenKeyStatisticsWidgetLink {
222
+ name: 'didOpenKeyStatisticsWidgetLink';
223
+ properties: {
224
+ itemKey: string;
206
225
  };
207
226
  }
208
- type EventsWithProperties = CreateEntryEvents | PublishEntryEvents | DidAccessAuthenticatedAdministrationEvent | DidAccessTokenListEvent | DidChangeModeEvent | DidCropFileEvent | DeleteEntryEvents | DidEditMediaLibraryElementsEvent | DidFilterMediaLibraryElementsEvent | DidFilterEntriesEvent | DidSelectContentTypeFieldTypeEvent | DidSelectFile | DidSortMediaLibraryElementsEvent | DidSubmitWithErrorsFirstAdminEvent | LogoEvent | TokenEvents | UpdateEntryEvents | WillModifyTokenEvent | WillNavigateEvent | DidPublishRelease | MediaEvents | DidUpdateCTBSchema | DidSkipGuidedTour | DidCompleteGuidedTour | DidStartGuidedTour;
227
+ type EventsWithProperties = CreateEntryEvents | PublishEntryEvents | DidAccessAuthenticatedAdministrationEvent | DidAccessTokenListEvent | DidChangeModeEvent | DidCropFileEvent | DeleteEntryEvents | DidEditMediaLibraryElementsEvent | DidFilterMediaLibraryElementsEvent | DidFilterEntriesEvent | DidSelectContentTypeFieldTypeEvent | DidSelectFile | DidSortMediaLibraryElementsEvent | DidSubmitWithErrorsFirstAdminEvent | LogoEvent | TokenEvents | UpdateEntryEvents | WillModifyTokenEvent | WillNavigateEvent | DidPublishRelease | MediaEvents | DidUpdateCTBSchema | DidSkipGuidedTour | DidCompleteGuidedTour | DidStartGuidedTour | DidOpenHomeWidgetLink | DidOpenKeyStatisticsWidgetLink | WillEditEntryFromHome;
209
228
  export type TrackingEvent = EventWithoutProperties | EventsWithProperties;
210
229
  export interface UseTrackingReturn {
211
230
  /**
@@ -22,7 +22,12 @@ export * from './components/Table';
22
22
  export * from './components/ContentBox';
23
23
  export * from './components/SubNav';
24
24
  export * from './components/GradientBadge';
25
+ /** @internal */
25
26
  export { tours } from './components/GuidedTour/Tours';
27
+ /** @internal */
28
+ export { useGuidedTour } from './components/GuidedTour/Context';
29
+ /** @internal */
30
+ export { GUIDED_TOUR_REQUIRED_ACTIONS } from './components/GuidedTour/utils/constants';
26
31
  /**
27
32
  * Features
28
33
  */
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import type { WidgetType } from '@strapi/admin/strapi-admin';
3
- interface WidgetRootProps extends Pick<WidgetType, 'title' | 'icon' | 'permissions' | 'link'> {
3
+ interface WidgetRootProps extends Pick<WidgetType, 'title' | 'icon' | 'permissions' | 'link' | 'uid'> {
4
4
  children: React.ReactNode;
5
5
  }
6
- export declare const WidgetRoot: ({ title, icon, children, link }: WidgetRootProps) => import("react/jsx-runtime").JSX.Element;
6
+ export declare const WidgetRoot: ({ title, icon, children, link, uid }: WidgetRootProps) => import("react/jsx-runtime").JSX.Element;
7
7
  declare const HomePageCE: () => import("react/jsx-runtime").JSX.Element;
8
8
  declare const HomePage: () => import("react/jsx-runtime").JSX.Element | null;
9
9
  export { HomePage, HomePageCE };
@@ -139,14 +139,11 @@ const { isUsingTypeScript } = tsUtils;
139
139
  return data;
140
140
  },
141
141
  async getGuidedTourMeta (ctx) {
142
- const [isFirstSuperAdminUser, completedActions] = await Promise.all([
143
- index.getService('user').isFirstSuperAdminUser(ctx.state.user.id),
144
- index.getService('guided-tour').getCompletedActions()
145
- ]);
142
+ const isFirstSuperAdminUser = await index.getService('user').isFirstSuperAdminUser(ctx.state.user.id);
146
143
  return {
147
144
  data: {
148
145
  isFirstSuperAdminUser,
149
- completedActions
146
+ schemas: strapi.contentTypes
150
147
  }
151
148
  };
152
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins }) satisfies Plugins.Response;\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const [isFirstSuperAdminUser, completedActions] = await Promise.all([\n getService('user').isFirstSuperAdminUser(ctx.state.user.id),\n getService('guided-tour').getCompletedActions(),\n ]);\n\n return {\n data: {\n isFirstSuperAdminUser,\n completedActions,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","completedActions","Promise","all","state","user","id","getCompletedActions"],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sources":["../../../../../server/src/controllers/admin.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport path from 'path';\n\nimport { map, values, sumBy, pipe, flatMap, propEq } from 'lodash/fp';\nimport _ from 'lodash';\nimport { exists } from 'fs-extra';\nimport { env } from '@strapi/utils';\nimport tsUtils from '@strapi/typescript-utils';\nimport {\n validateUpdateProjectSettings,\n validateUpdateProjectSettingsFiles,\n validateUpdateProjectSettingsImagesDimensions,\n} from '../validation/project-settings';\nimport { getService } from '../utils';\n\nimport type {\n Init,\n GetProjectSettings,\n Information,\n Plugins,\n TelemetryProperties,\n UpdateProjectSettings,\n GetGuidedTourMeta,\n} from '../../../shared/contracts/admin';\n\nconst { isUsingTypeScript } = tsUtils;\n\n/**\n * A set of functions called \"actions\" for `Admin`\n */\nexport default {\n // TODO very temporary to check the switch ee/ce\n // When removing this we need to update the /admin/src/index.js file\n // whe,re we set the strapi.window.isEE value\n\n // NOTE: admin/ee/server overrides this controller, and adds the EE features\n // This returns an empty feature list for CE\n async getProjectType() {\n const flags = strapi.config.get('admin.flags', {});\n return { data: { isEE: false, features: [], flags } };\n },\n\n async init() {\n let uuid = strapi.config.get('uuid', false);\n const hasAdmin = await getService('user').exists();\n const { menuLogo, authLogo } = await getService('project-settings').getProjectSettings();\n // set to null if telemetryDisabled flag not avaialble in package.json\n const telemetryDisabled: boolean | null = strapi.config.get(\n 'packageJsonStrapi.telemetryDisabled',\n null\n );\n\n if (telemetryDisabled !== null && telemetryDisabled === true) {\n uuid = false;\n }\n\n return {\n data: {\n uuid,\n hasAdmin,\n menuLogo: menuLogo ? menuLogo.url : null,\n authLogo: authLogo ? authLogo.url : null,\n },\n } satisfies Init.Response;\n },\n\n async getProjectSettings() {\n return getService(\n 'project-settings'\n ).getProjectSettings() satisfies Promise<GetProjectSettings.Response>;\n },\n\n async updateProjectSettings(ctx: Context) {\n const {\n request: { files, body },\n } = ctx as { request: UpdateProjectSettings.Request };\n\n const projectSettingsService = getService('project-settings');\n\n await validateUpdateProjectSettings(body);\n await validateUpdateProjectSettingsFiles(files);\n\n const formatedFiles = await projectSettingsService.parseFilesData(files);\n await validateUpdateProjectSettingsImagesDimensions(formatedFiles);\n\n return projectSettingsService.updateProjectSettings({\n ...body,\n ...formatedFiles,\n }) satisfies Promise<UpdateProjectSettings.Response>;\n },\n\n async telemetryProperties(ctx: Context) {\n // If the telemetry is disabled, ignore the request and return early\n if (strapi.telemetry.isDisabled) {\n ctx.status = 204;\n return;\n }\n\n const useTypescriptOnServer = await isUsingTypeScript(strapi.dirs.app.root);\n const useTypescriptOnAdmin = await isUsingTypeScript(\n path.join(strapi.dirs.app.root, 'src', 'admin')\n );\n const isHostedOnStrapiCloud = env('STRAPI_HOSTING', null) === 'strapi.cloud';\n\n const numberOfAllContentTypes = _.size(strapi.contentTypes);\n const numberOfComponents = _.size(strapi.components);\n\n const getNumberOfDynamicZones = () => {\n return pipe(\n map('attributes'),\n flatMap(values),\n // @ts-expect-error lodash types\n sumBy(propEq('type', 'dynamiczone'))\n )(strapi.contentTypes as any);\n };\n\n return {\n data: {\n useTypescriptOnServer,\n useTypescriptOnAdmin,\n isHostedOnStrapiCloud,\n numberOfAllContentTypes, // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n numberOfComponents,\n numberOfDynamicZones: getNumberOfDynamicZones(),\n },\n } satisfies TelemetryProperties.Response;\n },\n\n async information() {\n const currentEnvironment: string = strapi.config.get('environment');\n const autoReload = strapi.config.get('autoReload', false);\n const strapiVersion = strapi.config.get('info.strapi', null);\n const dependencies = strapi.config.get('info.dependencies', {});\n const projectId = strapi.config.get('uuid', null);\n const nodeVersion = process.version;\n const communityEdition = !strapi.EE;\n const useYarn: boolean = await exists(path.join(process.cwd(), 'yarn.lock'));\n\n return {\n data: {\n currentEnvironment,\n autoReload,\n strapiVersion,\n dependencies,\n projectId,\n nodeVersion,\n communityEdition,\n useYarn,\n },\n } satisfies Information.Response;\n },\n\n async plugins(ctx: Context) {\n const enabledPlugins = strapi.config.get('enabledPlugins') as any;\n\n // List of core plugins that are always enabled,\n // and so it's not necessary to display them in the plugins list\n const CORE_PLUGINS = [\n 'content-manager',\n 'content-type-builder',\n 'email',\n 'upload',\n 'i18n',\n 'content-releases',\n 'review-workflows',\n ];\n\n const plugins = Object.entries(enabledPlugins)\n .filter(([key]: any) => !CORE_PLUGINS.includes(key))\n .map(([key, plugin]: any) => ({\n name: plugin.info.name || key,\n displayName: plugin.info.displayName || plugin.info.name || key,\n description: plugin.info.description || '',\n packageName: plugin.info.packageName,\n }));\n\n ctx.send({ plugins }) satisfies Plugins.Response;\n },\n\n async licenseTrialTimeLeft() {\n const data = await strapi.ee.getTrialEndDate({\n strapi,\n });\n\n return data;\n },\n\n async getGuidedTourMeta(ctx: Context) {\n const isFirstSuperAdminUser = await getService('user').isFirstSuperAdminUser(ctx.state.user.id);\n\n return {\n data: {\n isFirstSuperAdminUser,\n schemas: strapi.contentTypes,\n },\n } satisfies GetGuidedTourMeta.Response;\n },\n};\n"],"names":["isUsingTypeScript","tsUtils","getProjectType","flags","strapi","config","get","data","isEE","features","init","uuid","hasAdmin","getService","exists","menuLogo","authLogo","getProjectSettings","telemetryDisabled","url","updateProjectSettings","ctx","request","files","body","projectSettingsService","validateUpdateProjectSettings","validateUpdateProjectSettingsFiles","formatedFiles","parseFilesData","validateUpdateProjectSettingsImagesDimensions","telemetryProperties","telemetry","isDisabled","status","useTypescriptOnServer","dirs","app","root","useTypescriptOnAdmin","path","join","isHostedOnStrapiCloud","env","numberOfAllContentTypes","_","size","contentTypes","numberOfComponents","components","getNumberOfDynamicZones","pipe","map","flatMap","values","sumBy","propEq","numberOfDynamicZones","information","currentEnvironment","autoReload","strapiVersion","dependencies","projectId","nodeVersion","process","version","communityEdition","EE","useYarn","cwd","plugins","enabledPlugins","CORE_PLUGINS","Object","entries","filter","key","includes","plugin","name","info","displayName","description","packageName","send","licenseTrialTimeLeft","ee","getTrialEndDate","getGuidedTourMeta","isFirstSuperAdminUser","state","user","id","schemas"],"mappings":"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"}