@strapi/admin 5.17.0 → 5.18.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 (118) hide show
  1. package/dist/admin/admin/src/StrapiApp.js +27 -4
  2. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  3. package/dist/admin/admin/src/StrapiApp.mjs +27 -4
  4. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/GuidedTour/Provider.js +2 -1
  6. package/dist/admin/admin/src/components/GuidedTour/Provider.js.map +1 -1
  7. package/dist/admin/admin/src/components/GuidedTour/Provider.mjs +2 -1
  8. package/dist/admin/admin/src/components/GuidedTour/Provider.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/LeftMenu.js +1 -1
  10. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  11. package/dist/admin/admin/src/components/LeftMenu.mjs +2 -2
  12. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/MainNav/NavLink.js +40 -4
  14. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  15. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +21 -4
  16. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/MainNav/NavUser.js +1 -1
  18. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  19. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +1 -1
  20. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/Providers.js +0 -2
  22. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  23. package/dist/admin/admin/src/components/Providers.mjs +0 -2
  24. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/SubNav.js +27 -7
  26. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  27. package/dist/admin/admin/src/components/SubNav.mjs +28 -8
  28. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js +31 -9
  30. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js.map +1 -1
  31. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs +31 -9
  32. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js +306 -0
  34. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js.map +1 -0
  35. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs +304 -0
  36. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs.map +1 -0
  37. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js +73 -27
  38. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js.map +1 -1
  39. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs +75 -30
  40. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js +316 -28
  42. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js.map +1 -1
  43. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs +319 -30
  44. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs.map +1 -1
  45. package/dist/admin/admin/src/components/Widgets.js +52 -0
  46. package/dist/admin/admin/src/components/Widgets.js.map +1 -0
  47. package/dist/admin/admin/src/components/Widgets.mjs +50 -0
  48. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -0
  49. package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
  50. package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
  51. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  52. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  53. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  54. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  55. package/dist/admin/admin/src/pages/Home/HomePage.js +3 -1
  56. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  57. package/dist/admin/admin/src/pages/Home/HomePage.mjs +3 -1
  58. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +93 -0
  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 +95 -3
  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 +8 -3
  64. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +10 -5
  66. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +6 -1
  68. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
  69. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs +6 -1
  70. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs.map +1 -1
  71. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +58 -53
  72. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  73. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +58 -53
  74. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  75. package/dist/admin/admin/src/translations/en.json.js +38 -2
  76. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  77. package/dist/admin/admin/src/translations/en.json.mjs +38 -2
  78. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  79. package/dist/admin/admin/src/translations/es.json.js +3 -1
  80. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  81. package/dist/admin/admin/src/translations/es.json.mjs +3 -1
  82. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  83. package/dist/admin/admin/src/translations/fr.json.js +3 -1
  84. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  85. package/dist/admin/admin/src/translations/fr.json.mjs +3 -1
  86. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  87. package/dist/admin/admin/src/utils/users.js +8 -0
  88. package/dist/admin/admin/src/utils/users.js.map +1 -1
  89. package/dist/admin/admin/src/utils/users.mjs +8 -1
  90. package/dist/admin/admin/src/utils/users.mjs.map +1 -1
  91. package/dist/admin/admin/tests/server.js +8 -0
  92. package/dist/admin/admin/tests/server.js.map +1 -1
  93. package/dist/admin/admin/tests/server.mjs +8 -0
  94. package/dist/admin/admin/tests/server.mjs.map +1 -1
  95. package/dist/admin/admin/tests/utils.js +25 -21
  96. package/dist/admin/admin/tests/utils.js.map +1 -1
  97. package/dist/admin/admin/tests/utils.mjs +25 -21
  98. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  99. package/dist/admin/src/components/UnstableGuidedTour/Context.d.ts +12 -3
  100. package/dist/admin/src/components/UnstableGuidedTour/Overview.d.ts +1 -0
  101. package/dist/admin/src/components/UnstableGuidedTour/Step.d.ts +11 -3
  102. package/dist/admin/src/components/UnstableGuidedTour/Tours.d.ts +40 -9
  103. package/dist/admin/src/components/Widgets.d.ts +2 -0
  104. package/dist/admin/src/core/apis/Widgets.d.ts +1 -1
  105. package/dist/admin/src/features/Auth.d.ts +1 -1
  106. package/dist/admin/src/pages/Settings/components/Tokens/TokenBox.d.ts +1 -0
  107. package/dist/admin/src/utils/users.d.ts +5 -1
  108. package/dist/server/server/src/services/guided-tour.js +20 -2
  109. package/dist/server/server/src/services/guided-tour.js.map +1 -1
  110. package/dist/server/server/src/services/guided-tour.mjs +20 -2
  111. package/dist/server/server/src/services/guided-tour.mjs.map +1 -1
  112. package/dist/server/server/src/strategies/api-token.js +15 -4
  113. package/dist/server/server/src/strategies/api-token.js.map +1 -1
  114. package/dist/server/server/src/strategies/api-token.mjs +15 -4
  115. package/dist/server/server/src/strategies/api-token.mjs.map +1 -1
  116. package/dist/server/src/services/guided-tour.d.ts.map +1 -1
  117. package/dist/server/src/strategies/api-token.d.ts.map +1 -1
  118. package/package.json +9 -9
@@ -9,6 +9,7 @@ import { useNavigate, Link } from 'react-router-dom';
9
9
  import { useGuidedTour } from '../../../../components/GuidedTour/Provider.mjs';
10
10
  import { Layouts } from '../../../../components/Layouts/Layout.mjs';
11
11
  import { Page } from '../../../../components/PageHelpers.mjs';
12
+ import { tours } from '../../../../components/UnstableGuidedTour/Tours.mjs';
12
13
  import { useTypedSelector } from '../../../../core/store/hooks.mjs';
13
14
  import { useNotification } from '../../../../features/Notifications.mjs';
14
15
  import { useTracking } from '../../../../features/Tracking.mjs';
@@ -150,66 +151,70 @@ const ListView = ()=>{
150
151
  id: 'Settings.apiTokens.description',
151
152
  defaultMessage: 'List of generated tokens to consume the API'
152
153
  }),
153
- primaryAction: canCreate && /*#__PURE__*/ jsx(LinkButton, {
154
- tag: Link,
155
- "data-testid": "create-api-token-button",
156
- startIcon: /*#__PURE__*/ jsx(Plus, {}),
157
- size: "S",
158
- onClick: ()=>trackUsage('willAddTokenFromList', {
159
- tokenType: API_TOKEN_TYPE
160
- }),
161
- to: "/settings/api-tokens/create",
162
- children: formatMessage({
163
- id: 'Settings.apiTokens.create',
164
- defaultMessage: 'Create new API Token'
154
+ primaryAction: canCreate && /*#__PURE__*/ jsx(tours.apiTokens.CreateAnAPIToken, {
155
+ children: /*#__PURE__*/ jsx(LinkButton, {
156
+ tag: Link,
157
+ "data-testid": "create-api-token-button",
158
+ startIcon: /*#__PURE__*/ jsx(Plus, {}),
159
+ size: "S",
160
+ onClick: ()=>trackUsage('willAddTokenFromList', {
161
+ tokenType: API_TOKEN_TYPE
162
+ }),
163
+ to: "/settings/api-tokens/create",
164
+ children: formatMessage({
165
+ id: 'Settings.apiTokens.create',
166
+ defaultMessage: 'Create new API Token'
167
+ })
165
168
  })
166
169
  })
167
170
  }),
168
171
  !canRead ? /*#__PURE__*/ jsx(Page.NoPermissions, {}) : /*#__PURE__*/ jsx(Page.Main, {
169
172
  "aria-busy": isLoading,
170
- children: /*#__PURE__*/ jsxs(Layouts.Content, {
171
- children: [
172
- apiTokens.length > 0 && /*#__PURE__*/ jsx(Table, {
173
- permissions: {
174
- canRead,
175
- canDelete,
176
- canUpdate
177
- },
178
- headers: headers,
179
- isLoading: isLoading,
180
- onConfirmDelete: handleDelete,
181
- tokens: apiTokens,
182
- tokenType: API_TOKEN_TYPE
183
- }),
184
- canCreate && apiTokens.length === 0 ? /*#__PURE__*/ jsx(EmptyStateLayout, {
185
- icon: /*#__PURE__*/ jsx(EmptyDocuments, {
186
- width: "16rem"
187
- }),
188
- content: formatMessage({
189
- id: 'Settings.apiTokens.addFirstToken',
190
- defaultMessage: 'Add your first API Token'
173
+ children: /*#__PURE__*/ jsx(tours.apiTokens.Introduction, {
174
+ children: /*#__PURE__*/ jsxs(Layouts.Content, {
175
+ children: [
176
+ apiTokens.length > 0 && /*#__PURE__*/ jsx(Table, {
177
+ permissions: {
178
+ canRead,
179
+ canDelete,
180
+ canUpdate
181
+ },
182
+ headers: headers,
183
+ isLoading: isLoading,
184
+ onConfirmDelete: handleDelete,
185
+ tokens: apiTokens,
186
+ tokenType: API_TOKEN_TYPE
191
187
  }),
192
- action: /*#__PURE__*/ jsx(LinkButton, {
193
- tag: Link,
194
- variant: "secondary",
195
- startIcon: /*#__PURE__*/ jsx(Plus, {}),
196
- to: "/settings/api-tokens/create",
197
- children: formatMessage({
198
- id: 'Settings.apiTokens.addNewToken',
199
- defaultMessage: 'Add new API Token'
188
+ canCreate && apiTokens.length === 0 ? /*#__PURE__*/ jsx(EmptyStateLayout, {
189
+ icon: /*#__PURE__*/ jsx(EmptyDocuments, {
190
+ width: "16rem"
191
+ }),
192
+ content: formatMessage({
193
+ id: 'Settings.apiTokens.addFirstToken',
194
+ defaultMessage: 'Add your first API Token'
195
+ }),
196
+ action: /*#__PURE__*/ jsx(LinkButton, {
197
+ tag: Link,
198
+ variant: "secondary",
199
+ startIcon: /*#__PURE__*/ jsx(Plus, {}),
200
+ to: "/settings/api-tokens/create",
201
+ children: formatMessage({
202
+ id: 'Settings.apiTokens.addNewToken',
203
+ defaultMessage: 'Add new API Token'
204
+ })
200
205
  })
201
- })
202
- }) : null,
203
- !canCreate && apiTokens.length === 0 ? /*#__PURE__*/ jsx(EmptyStateLayout, {
204
- icon: /*#__PURE__*/ jsx(EmptyDocuments, {
205
- width: "16rem"
206
- }),
207
- content: formatMessage({
208
- id: 'Settings.apiTokens.emptyStateLayout',
209
- defaultMessage: 'You don’t have any content yet...'
210
- })
211
- }) : null
212
- ]
206
+ }) : null,
207
+ !canCreate && apiTokens.length === 0 ? /*#__PURE__*/ jsx(EmptyStateLayout, {
208
+ icon: /*#__PURE__*/ jsx(EmptyDocuments, {
209
+ width: "16rem"
210
+ }),
211
+ content: formatMessage({
212
+ id: 'Settings.apiTokens.emptyStateLayout',
213
+ defaultMessage: 'You don’t have any content yet...'
214
+ })
215
+ }) : null
216
+ ]
217
+ })
213
218
  })
214
219
  })
215
220
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.mjs","sources":["../../../../../../../../admin/src/pages/Settings/pages/ApiTokens/ListView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { EmptyStateLayout, LinkButton } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\n\nimport { useGuidedTour } from '../../../../components/GuidedTour/Provider';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { Page } from '../../../../components/PageHelpers';\nimport { useTypedSelector } from '../../../../core/store/hooks';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useTracking } from '../../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useOnce } from '../../../../hooks/useOnce';\nimport { useRBAC } from '../../../../hooks/useRBAC';\nimport { useDeleteAPITokenMutation, useGetAPITokensQuery } from '../../../../services/apiTokens';\nimport { API_TOKEN_TYPE } from '../../components/Tokens/constants';\nimport { Table } from '../../components/Tokens/Table';\n\nimport type { Data } from '@strapi/types';\n\nconst TABLE_HEADERS = [\n {\n name: 'name',\n label: {\n id: 'Settings.apiTokens.ListView.headers.name',\n defaultMessage: 'Name',\n },\n sortable: true,\n },\n {\n name: 'description',\n label: {\n id: 'Settings.apiTokens.ListView.headers.description',\n defaultMessage: 'Description',\n },\n sortable: false,\n },\n {\n name: 'createdAt',\n label: {\n id: 'Settings.apiTokens.ListView.headers.createdAt',\n defaultMessage: 'Created at',\n },\n sortable: false,\n },\n {\n name: 'lastUsedAt',\n label: {\n id: 'Settings.apiTokens.ListView.headers.lastUsedAt',\n defaultMessage: 'Last used',\n },\n sortable: false,\n },\n];\n\nexport const ListView = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens']\n );\n const {\n allowedActions: { canRead, canCreate, canDelete, canUpdate },\n } = useRBAC(permissions);\n const navigate = useNavigate();\n const { trackUsage } = useTracking();\n const startSection = useGuidedTour('ListView', (state) => state.startSection);\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n React.useEffect(() => {\n startSection('apiTokens');\n }, [startSection]);\n\n React.useEffect(() => {\n navigate({ search: qs.stringify({ sort: 'name:ASC' }, { encode: false }) });\n }, [navigate]);\n\n const headers = TABLE_HEADERS.map((header) => ({\n ...header,\n label: formatMessage(header.label),\n }));\n\n useOnce(() => {\n trackUsage('willAccessTokenList', {\n tokenType: API_TOKEN_TYPE,\n });\n });\n\n const { data: apiTokens = [], isLoading, error } = useGetAPITokensQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n trackUsage('didAccessTokenList', { number: apiTokens.length, tokenType: API_TOKEN_TYPE });\n }, [apiTokens, trackUsage]);\n\n const [deleteToken] = useDeleteAPITokenMutation();\n\n const handleDelete = async (id: Data.ID) => {\n try {\n const res = await deleteToken(id);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n trackUsage('didDeleteToken');\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n }\n };\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n { name: 'API Tokens' }\n )}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({ id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' })}\n subtitle={formatMessage({\n id: 'Settings.apiTokens.description',\n defaultMessage: 'List of generated tokens to consume the API',\n })}\n primaryAction={\n canCreate && (\n <LinkButton\n tag={Link}\n data-testid=\"create-api-token-button\"\n startIcon={<Plus />}\n size=\"S\"\n onClick={() =>\n trackUsage('willAddTokenFromList', {\n tokenType: API_TOKEN_TYPE,\n })\n }\n to=\"/settings/api-tokens/create\"\n >\n {formatMessage({\n id: 'Settings.apiTokens.create',\n defaultMessage: 'Create new API Token',\n })}\n </LinkButton>\n )\n }\n />\n {!canRead ? (\n <Page.NoPermissions />\n ) : (\n <Page.Main aria-busy={isLoading}>\n <Layouts.Content>\n {apiTokens.length > 0 && (\n <Table\n permissions={{ canRead, canDelete, canUpdate }}\n headers={headers}\n isLoading={isLoading}\n onConfirmDelete={handleDelete}\n tokens={apiTokens}\n tokenType={API_TOKEN_TYPE}\n />\n )}\n {canCreate && apiTokens.length === 0 ? (\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n content={formatMessage({\n id: 'Settings.apiTokens.addFirstToken',\n defaultMessage: 'Add your first API Token',\n })}\n action={\n <LinkButton\n tag={Link}\n variant=\"secondary\"\n startIcon={<Plus />}\n to=\"/settings/api-tokens/create\"\n >\n {formatMessage({\n id: 'Settings.apiTokens.addNewToken',\n defaultMessage: 'Add new API Token',\n })}\n </LinkButton>\n }\n />\n ) : null}\n {!canCreate && apiTokens.length === 0 ? (\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n content={formatMessage({\n id: 'Settings.apiTokens.emptyStateLayout',\n defaultMessage: 'You don’t have any content yet...',\n })}\n />\n ) : null}\n </Layouts.Content>\n </Page.Main>\n )}\n </>\n );\n};\n\nexport const ProtectedListView = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens'].main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListView />\n </Page.Protect>\n );\n};\n"],"names":["TABLE_HEADERS","name","label","id","defaultMessage","sortable","ListView","formatMessage","useIntl","toggleNotification","useNotification","permissions","useTypedSelector","state","admin_app","settings","allowedActions","canRead","canCreate","canDelete","canUpdate","useRBAC","navigate","useNavigate","trackUsage","useTracking","startSection","useGuidedTour","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","React","useEffect","search","qs","stringify","sort","encode","headers","map","header","useOnce","tokenType","API_TOKEN_TYPE","data","apiTokens","isLoading","error","useGetAPITokensQuery","type","message","number","length","deleteToken","useDeleteAPITokenMutation","handleDelete","res","_jsxs","_Fragment","_jsx","Page","Title","Layouts","Header","title","subtitle","primaryAction","LinkButton","tag","Link","data-testid","startIcon","Plus","size","onClick","to","NoPermissions","Main","aria-busy","Content","Table","onConfirmDelete","tokens","EmptyStateLayout","icon","EmptyDocuments","width","content","action","variant","ProtectedListView","main","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"ListView.mjs","sources":["../../../../../../../../admin/src/pages/Settings/pages/ApiTokens/ListView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { EmptyStateLayout, LinkButton } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, useNavigate } from 'react-router-dom';\n\nimport { useGuidedTour } from '../../../../components/GuidedTour/Provider';\nimport { Layouts } from '../../../../components/Layouts/Layout';\nimport { Page } from '../../../../components/PageHelpers';\nimport { tours as unstable_tours } from '../../../../components/UnstableGuidedTour/Tours';\nimport { useTypedSelector } from '../../../../core/store/hooks';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useTracking } from '../../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { useOnce } from '../../../../hooks/useOnce';\nimport { useRBAC } from '../../../../hooks/useRBAC';\nimport { useDeleteAPITokenMutation, useGetAPITokensQuery } from '../../../../services/apiTokens';\nimport { API_TOKEN_TYPE } from '../../components/Tokens/constants';\nimport { Table } from '../../components/Tokens/Table';\n\nimport type { Data } from '@strapi/types';\n\nconst TABLE_HEADERS = [\n {\n name: 'name',\n label: {\n id: 'Settings.apiTokens.ListView.headers.name',\n defaultMessage: 'Name',\n },\n sortable: true,\n },\n {\n name: 'description',\n label: {\n id: 'Settings.apiTokens.ListView.headers.description',\n defaultMessage: 'Description',\n },\n sortable: false,\n },\n {\n name: 'createdAt',\n label: {\n id: 'Settings.apiTokens.ListView.headers.createdAt',\n defaultMessage: 'Created at',\n },\n sortable: false,\n },\n {\n name: 'lastUsedAt',\n label: {\n id: 'Settings.apiTokens.ListView.headers.lastUsedAt',\n defaultMessage: 'Last used',\n },\n sortable: false,\n },\n];\n\nexport const ListView = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens']\n );\n const {\n allowedActions: { canRead, canCreate, canDelete, canUpdate },\n } = useRBAC(permissions);\n const navigate = useNavigate();\n const { trackUsage } = useTracking();\n const startSection = useGuidedTour('ListView', (state) => state.startSection);\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n React.useEffect(() => {\n startSection('apiTokens');\n }, [startSection]);\n\n React.useEffect(() => {\n navigate({ search: qs.stringify({ sort: 'name:ASC' }, { encode: false }) });\n }, [navigate]);\n\n const headers = TABLE_HEADERS.map((header) => ({\n ...header,\n label: formatMessage(header.label),\n }));\n\n useOnce(() => {\n trackUsage('willAccessTokenList', {\n tokenType: API_TOKEN_TYPE,\n });\n });\n\n const { data: apiTokens = [], isLoading, error } = useGetAPITokensQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n React.useEffect(() => {\n trackUsage('didAccessTokenList', { number: apiTokens.length, tokenType: API_TOKEN_TYPE });\n }, [apiTokens, trackUsage]);\n\n const [deleteToken] = useDeleteAPITokenMutation();\n\n const handleDelete = async (id: Data.ID) => {\n try {\n const res = await deleteToken(id);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n trackUsage('didDeleteToken');\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'Something went wrong',\n }),\n });\n }\n };\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n { name: 'API Tokens' }\n )}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({ id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' })}\n subtitle={formatMessage({\n id: 'Settings.apiTokens.description',\n defaultMessage: 'List of generated tokens to consume the API',\n })}\n primaryAction={\n canCreate && (\n <unstable_tours.apiTokens.CreateAnAPIToken>\n <LinkButton\n tag={Link}\n data-testid=\"create-api-token-button\"\n startIcon={<Plus />}\n size=\"S\"\n onClick={() =>\n trackUsage('willAddTokenFromList', {\n tokenType: API_TOKEN_TYPE,\n })\n }\n to=\"/settings/api-tokens/create\"\n >\n {formatMessage({\n id: 'Settings.apiTokens.create',\n defaultMessage: 'Create new API Token',\n })}\n </LinkButton>\n </unstable_tours.apiTokens.CreateAnAPIToken>\n )\n }\n />\n {!canRead ? (\n <Page.NoPermissions />\n ) : (\n <Page.Main aria-busy={isLoading}>\n <unstable_tours.apiTokens.Introduction>\n <Layouts.Content>\n {apiTokens.length > 0 && (\n <Table\n permissions={{ canRead, canDelete, canUpdate }}\n headers={headers}\n isLoading={isLoading}\n onConfirmDelete={handleDelete}\n tokens={apiTokens}\n tokenType={API_TOKEN_TYPE}\n />\n )}\n {canCreate && apiTokens.length === 0 ? (\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n content={formatMessage({\n id: 'Settings.apiTokens.addFirstToken',\n defaultMessage: 'Add your first API Token',\n })}\n action={\n <LinkButton\n tag={Link}\n variant=\"secondary\"\n startIcon={<Plus />}\n to=\"/settings/api-tokens/create\"\n >\n {formatMessage({\n id: 'Settings.apiTokens.addNewToken',\n defaultMessage: 'Add new API Token',\n })}\n </LinkButton>\n }\n />\n ) : null}\n {!canCreate && apiTokens.length === 0 ? (\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n content={formatMessage({\n id: 'Settings.apiTokens.emptyStateLayout',\n defaultMessage: 'You don’t have any content yet...',\n })}\n />\n ) : null}\n </Layouts.Content>\n </unstable_tours.apiTokens.Introduction>\n </Page.Main>\n )}\n </>\n );\n};\n\nexport const ProtectedListView = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['api-tokens'].main\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListView />\n </Page.Protect>\n );\n};\n"],"names":["TABLE_HEADERS","name","label","id","defaultMessage","sortable","ListView","formatMessage","useIntl","toggleNotification","useNotification","permissions","useTypedSelector","state","admin_app","settings","allowedActions","canRead","canCreate","canDelete","canUpdate","useRBAC","navigate","useNavigate","trackUsage","useTracking","startSection","useGuidedTour","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","React","useEffect","search","qs","stringify","sort","encode","headers","map","header","useOnce","tokenType","API_TOKEN_TYPE","data","apiTokens","isLoading","error","useGetAPITokensQuery","type","message","number","length","deleteToken","useDeleteAPITokenMutation","handleDelete","res","_jsxs","_Fragment","_jsx","Page","Title","Layouts","Header","title","subtitle","primaryAction","unstable_tours","CreateAnAPIToken","LinkButton","tag","Link","data-testid","startIcon","Plus","size","onClick","to","NoPermissions","Main","aria-busy","Introduction","Content","Table","onConfirmDelete","tokens","EmptyStateLayout","icon","EmptyDocuments","width","content","action","variant","ProtectedListView","main","Protect"],"mappings":"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"}
@@ -287,6 +287,7 @@ var en = {
287
287
  "Settings.tokens.RegenerateDialog.title": "Regenerate token",
288
288
  "Settings.tokens.copy.editMessage": "For security reasons, you can only see your token once.",
289
289
  "Settings.tokens.copy.editTitle": "This token isn’t accessible anymore.",
290
+ "Settings.tokens.copy.title": "Token",
290
291
  "Settings.tokens.copy.lastWarning": "Make sure to copy this token, you won’t be able to see it again!",
291
292
  "Settings.tokens.duration.30-days": "30 days",
292
293
  "Settings.tokens.duration.7-days": "7 days",
@@ -780,7 +781,8 @@ var en = {
780
781
  "global.plugins.upload.description": "Media file management.",
781
782
  "global.plugins.users-permissions": "Roles & Permissions",
782
783
  "global.plugins.users-permissions.description": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.",
783
- "global.profile": "Profile settings",
784
+ "global.profile": "Profile",
785
+ "global.profile.settings": "Profile settings",
784
786
  "global.prompt.unsaved": "Are you sure you want to leave this page? All your modifications will be lost",
785
787
  "global.reset-password": "Reset password",
786
788
  "global.roles": "Roles",
@@ -822,11 +824,45 @@ var en = {
822
824
  selectButtonTitle: selectButtonTitle,
823
825
  skipToContent: skipToContent,
824
826
  submit: submit,
827
+ "tours.contentTypeBuilder.Introduction.title": "Content-Type Builder",
828
+ "tours.contentTypeBuilder.Introduction.content": "Create and manage your content structure with collection types, single types and components.",
829
+ "tours.contentTypeBuilder.CollectionTypes.title": "Collection Types",
830
+ "tours.contentTypeBuilder.CollectionTypes.content": "A content structure that can manage multiple entries, such as articles or products.",
831
+ "tours.contentTypeBuilder.SingleTypes.title": "Single Types",
832
+ "tours.contentTypeBuilder.SingleTypes.content": "A content structure that can manage only one entry, such as a homepage or a contact page.",
833
+ "tours.contentTypeBuilder.Components.title": "Components",
834
+ "tours.contentTypeBuilder.Components.content": "A content structure that can be used in multiple collection types or single types.",
825
835
  "tours.contentManager.Introduction.title": "Content manager",
826
836
  "tours.contentManager.Introduction.content": "Create and manage content from your collection types and single types.",
837
+ "tours.apiTokens.Introduction.title": "API tokens",
838
+ "tours.apiTokens.Introduction.content": "Create and manage API tokens with highly customizable permissions.",
839
+ "tours.apiTokens.CreateAnAPIToken.title": "Create an API token",
840
+ "tours.apiTokens.CreateAnAPIToken.content": "Create a new API token. Choose a name, duration and type.",
841
+ "tours.apiTokens.CopyAPIToken.title": "Copy your new API token",
842
+ "tours.apiTokens.CopyAPIToken.content": "Make sure to do it now, you won’t be able to see it again. You’ll need to generate a new one if you lose it.",
843
+ "tours.contentManager.Fields.title": "Fields",
844
+ "tours.contentManager.Fields.content": "Add content to the fields created in the Content-Type Builder.",
845
+ "tours.contentManager.Publish.title": "Publish",
846
+ "tours.contentManager.Publish.content": "Publish entries to make their content available through the content API.",
847
+ "tours.contentManager.FinalStep.title": "It’s time to create API Tokens!",
848
+ "tours.contentManager.FinalStep.content": "Now that you’ve created and published content, time to create API tokens and set up permissions.",
827
849
  "tours.stepCount": "Step {currentStep} of {tourLength}",
828
850
  "tours.skip": "Skip",
829
- "tours.next": "Next"
851
+ "tours.next": "Next",
852
+ "tours.gotIt": "Got it",
853
+ "tours.overview.title": "Discover your application!",
854
+ "tours.overview.subtitle": "Follow the guided tour to get the most out of Strapi.",
855
+ "tours.overview.close": "Close guided tour",
856
+ "tours.overview.tasks": "Your tasks",
857
+ "tours.overview.contentTypeBuilder.label": "Create your schema",
858
+ "tours.overview.contentManager.label": "Create and publish content",
859
+ "tours.overview.apiTokens.label": "Create and copy an API token",
860
+ "tours.overview.strapiCloud.label": "Deploy your application to Strapi Cloud",
861
+ "tours.overview.strapiCloud.link": "Read documentation",
862
+ "tours.overview.tour.link": "Start",
863
+ "tours.overview.tour.done": "Done",
864
+ "tours.overview.close.description": "Are you sure you want to close the guided tour?",
865
+ "widget.profile.title": "Profile"
830
866
  };
831
867
 
832
868
  exports.Analytics = Analytics;
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -283,6 +283,7 @@ var en = {
283
283
  "Settings.tokens.RegenerateDialog.title": "Regenerate token",
284
284
  "Settings.tokens.copy.editMessage": "For security reasons, you can only see your token once.",
285
285
  "Settings.tokens.copy.editTitle": "This token isn’t accessible anymore.",
286
+ "Settings.tokens.copy.title": "Token",
286
287
  "Settings.tokens.copy.lastWarning": "Make sure to copy this token, you won’t be able to see it again!",
287
288
  "Settings.tokens.duration.30-days": "30 days",
288
289
  "Settings.tokens.duration.7-days": "7 days",
@@ -776,7 +777,8 @@ var en = {
776
777
  "global.plugins.upload.description": "Media file management.",
777
778
  "global.plugins.users-permissions": "Roles & Permissions",
778
779
  "global.plugins.users-permissions.description": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.",
779
- "global.profile": "Profile settings",
780
+ "global.profile": "Profile",
781
+ "global.profile.settings": "Profile settings",
780
782
  "global.prompt.unsaved": "Are you sure you want to leave this page? All your modifications will be lost",
781
783
  "global.reset-password": "Reset password",
782
784
  "global.roles": "Roles",
@@ -818,11 +820,45 @@ var en = {
818
820
  selectButtonTitle: selectButtonTitle,
819
821
  skipToContent: skipToContent,
820
822
  submit: submit,
823
+ "tours.contentTypeBuilder.Introduction.title": "Content-Type Builder",
824
+ "tours.contentTypeBuilder.Introduction.content": "Create and manage your content structure with collection types, single types and components.",
825
+ "tours.contentTypeBuilder.CollectionTypes.title": "Collection Types",
826
+ "tours.contentTypeBuilder.CollectionTypes.content": "A content structure that can manage multiple entries, such as articles or products.",
827
+ "tours.contentTypeBuilder.SingleTypes.title": "Single Types",
828
+ "tours.contentTypeBuilder.SingleTypes.content": "A content structure that can manage only one entry, such as a homepage or a contact page.",
829
+ "tours.contentTypeBuilder.Components.title": "Components",
830
+ "tours.contentTypeBuilder.Components.content": "A content structure that can be used in multiple collection types or single types.",
821
831
  "tours.contentManager.Introduction.title": "Content manager",
822
832
  "tours.contentManager.Introduction.content": "Create and manage content from your collection types and single types.",
833
+ "tours.apiTokens.Introduction.title": "API tokens",
834
+ "tours.apiTokens.Introduction.content": "Create and manage API tokens with highly customizable permissions.",
835
+ "tours.apiTokens.CreateAnAPIToken.title": "Create an API token",
836
+ "tours.apiTokens.CreateAnAPIToken.content": "Create a new API token. Choose a name, duration and type.",
837
+ "tours.apiTokens.CopyAPIToken.title": "Copy your new API token",
838
+ "tours.apiTokens.CopyAPIToken.content": "Make sure to do it now, you won’t be able to see it again. You’ll need to generate a new one if you lose it.",
839
+ "tours.contentManager.Fields.title": "Fields",
840
+ "tours.contentManager.Fields.content": "Add content to the fields created in the Content-Type Builder.",
841
+ "tours.contentManager.Publish.title": "Publish",
842
+ "tours.contentManager.Publish.content": "Publish entries to make their content available through the content API.",
843
+ "tours.contentManager.FinalStep.title": "It’s time to create API Tokens!",
844
+ "tours.contentManager.FinalStep.content": "Now that you’ve created and published content, time to create API tokens and set up permissions.",
823
845
  "tours.stepCount": "Step {currentStep} of {tourLength}",
824
846
  "tours.skip": "Skip",
825
- "tours.next": "Next"
847
+ "tours.next": "Next",
848
+ "tours.gotIt": "Got it",
849
+ "tours.overview.title": "Discover your application!",
850
+ "tours.overview.subtitle": "Follow the guided tour to get the most out of Strapi.",
851
+ "tours.overview.close": "Close guided tour",
852
+ "tours.overview.tasks": "Your tasks",
853
+ "tours.overview.contentTypeBuilder.label": "Create your schema",
854
+ "tours.overview.contentManager.label": "Create and publish content",
855
+ "tours.overview.apiTokens.label": "Create and copy an API token",
856
+ "tours.overview.strapiCloud.label": "Deploy your application to Strapi Cloud",
857
+ "tours.overview.strapiCloud.link": "Read documentation",
858
+ "tours.overview.tour.link": "Start",
859
+ "tours.overview.tour.done": "Done",
860
+ "tours.overview.close.description": "Are you sure you want to close the guided tour?",
861
+ "widget.profile.title": "Profile"
826
862
  };
827
863
 
828
864
  export { Analytics, Documentation, Email, Password, Provider, ResetPasswordToken, Role, Username, Users, anErrorOccurred, clearLabel, dark, en as default, light, noPreview, or, selectButtonTitle, skipToContent, submit };
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -575,6 +575,7 @@ var es = {
575
575
  "global.plugins.users-permissions": "Roles & Permisos",
576
576
  "global.plugins.users-permissions.description": "Proteja su API con un proceso de autenticación completo basado en JWT. Este complemento también viene con una estrategia ACL que le permite administrar los permisos entre los grupos de usuarios.",
577
577
  "global.profile": "Perfil",
578
+ "global.profile.settings": "Ajustes del perfil",
578
579
  "global.reset-password": "Resetear contraseña",
579
580
  "global.roles": "Roles",
580
581
  "global.save": "Guardar",
@@ -600,7 +601,8 @@ var es = {
600
601
  "components.Blocks.blocks.heading4": "Título 4",
601
602
  "components.Blocks.blocks.heading5": "Título 5",
602
603
  "components.Blocks.blocks.heading6": "Título 6",
603
- "components.Blocks.blocks.image": "Imagen"
604
+ "components.Blocks.blocks.image": "Imagen",
605
+ "widget.profile.title": "Perfil"
604
606
  };
605
607
 
606
608
  exports.Analytics = Analytics;
@@ -1 +1 @@
1
- {"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -571,6 +571,7 @@ var es = {
571
571
  "global.plugins.users-permissions": "Roles & Permisos",
572
572
  "global.plugins.users-permissions.description": "Proteja su API con un proceso de autenticación completo basado en JWT. Este complemento también viene con una estrategia ACL que le permite administrar los permisos entre los grupos de usuarios.",
573
573
  "global.profile": "Perfil",
574
+ "global.profile.settings": "Ajustes del perfil",
574
575
  "global.reset-password": "Resetear contraseña",
575
576
  "global.roles": "Roles",
576
577
  "global.save": "Guardar",
@@ -596,7 +597,8 @@ var es = {
596
597
  "components.Blocks.blocks.heading4": "Título 4",
597
598
  "components.Blocks.blocks.heading5": "Título 5",
598
599
  "components.Blocks.blocks.heading6": "Título 6",
599
- "components.Blocks.blocks.image": "Imagen"
600
+ "components.Blocks.blocks.image": "Imagen",
601
+ "widget.profile.title": "Perfil"
600
602
  };
601
603
 
602
604
  export { Analytics, Documentation, Email, Password, Provider, ResetPasswordToken, Role, Username, Users, anErrorOccurred, clearLabel, dark, es as default, light, or, skipToContent, submit };
@@ -1 +1 @@
1
- {"version":3,"file":"es.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"es.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -526,6 +526,7 @@ var fr = {
526
526
  "global.password": "Mot de passe",
527
527
  "global.plugins": "Plugins",
528
528
  "global.profile": "Profil",
529
+ "global.profile.settings": "Paramètres du profil",
529
530
  "global.reset-password": "Réinitialiser le mot de passe",
530
531
  "global.roles": "Rôles",
531
532
  "global.save": "Enregistrer",
@@ -583,7 +584,8 @@ var fr = {
583
584
  "components.Blocks.blocks.quote": "Citation",
584
585
  "components.Blocks.blocks.image": "Image",
585
586
  "components.Blocks.blocks.unorderedList": "Liste à puces",
586
- "components.Blocks.blocks.orderedList": "Liste numérotée"
587
+ "components.Blocks.blocks.orderedList": "Liste numérotée",
588
+ "widget.profile.title": "Profil"
587
589
  };
588
590
 
589
591
  exports.Analytics = Analytics;
@@ -1 +1 @@
1
- {"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -522,6 +522,7 @@ var fr = {
522
522
  "global.password": "Mot de passe",
523
523
  "global.plugins": "Plugins",
524
524
  "global.profile": "Profil",
525
+ "global.profile.settings": "Paramètres du profil",
525
526
  "global.reset-password": "Réinitialiser le mot de passe",
526
527
  "global.roles": "Rôles",
527
528
  "global.save": "Enregistrer",
@@ -579,7 +580,8 @@ var fr = {
579
580
  "components.Blocks.blocks.quote": "Citation",
580
581
  "components.Blocks.blocks.image": "Image",
581
582
  "components.Blocks.blocks.unorderedList": "Liste à puces",
582
- "components.Blocks.blocks.orderedList": "Liste numérotée"
583
+ "components.Blocks.blocks.orderedList": "Liste numérotée",
584
+ "widget.profile.title": "Profil"
583
585
  };
584
586
 
585
587
  export { Analytics, Documentation, Email, Password, Provider, ResetPasswordToken, Role, Username, Users, anErrorOccurred, clearLabel, dark, fr as default, light, noPreview, or, selectButtonTitle, skipToContent, submit };
@@ -1 +1 @@
1
- {"version":3,"file":"fr.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fr.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -14,6 +14,13 @@
14
14
  }
15
15
  return email ?? '';
16
16
  };
17
+ /* -------------------------------------------------------------------------------------------------
18
+ * getInitials
19
+ * -----------------------------------------------------------------------------------------------*/ /**
20
+ * Retrieves the initials of the user (based on their firstname / lastname or their display name)
21
+ */ const getInitials = (user = {})=>{
22
+ return user?.firstname && user?.lastname ? `${user.firstname.substring(0, 1)}${user.lastname.substring(0, 1)}` : getDisplayName(user).split(' ').map((name)=>name.substring(0, 1)).join('').substring(0, 1).toUpperCase();
23
+ };
17
24
  /* -------------------------------------------------------------------------------------------------
18
25
  * hashAdminUserEmail
19
26
  * -----------------------------------------------------------------------------------------------*/ const hashAdminUserEmail = async (payload)=>{
@@ -38,5 +45,6 @@ const digestMessage = async (message)=>{
38
45
  };
39
46
 
40
47
  exports.getDisplayName = getDisplayName;
48
+ exports.getInitials = getInitials;
41
49
  exports.hashAdminUserEmail = hashAdminUserEmail;
42
50
  //# sourceMappingURL=users.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sources":["../../../../../admin/src/utils/users.ts"],"sourcesContent":["import type { User } from '../features/Auth';\n\n/* -------------------------------------------------------------------------------------------------\n * getDisplayName\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Retrieves the display name of an admin panel user\n */\nconst getDisplayName = ({ firstname, lastname, username, email }: Partial<User> = {}): string => {\n if (username) {\n return username;\n }\n\n // firstname is not required if the user is created with a username\n if (firstname) {\n return `${firstname} ${lastname ?? ''}`.trim();\n }\n\n return email ?? '';\n};\n\n/* -------------------------------------------------------------------------------------------------\n * hashAdminUserEmail\n * -----------------------------------------------------------------------------------------------*/\n\nconst hashAdminUserEmail = async (payload?: User) => {\n if (!payload || !payload.email) {\n return null;\n }\n\n try {\n return await digestMessage(payload.email);\n } catch (error) {\n return null;\n }\n};\n\nconst bufferToHex = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((b) => b.toString(16).padStart(2, '0')).join('');\n};\nconst digestMessage = async (message: string) => {\n const msgUint8 = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n\n return bufferToHex(hashBuffer);\n};\n\nexport { getDisplayName, hashAdminUserEmail };\n"],"names":["getDisplayName","firstname","lastname","username","email","trim","hashAdminUserEmail","payload","digestMessage","error","bufferToHex","buffer","Uint8Array","map","b","toString","padStart","join","message","msgUint8","TextEncoder","encode","hashBuffer","crypto","subtle","digest"],"mappings":";;AAEA;;;;AAMC,IACKA,MAAAA,cAAAA,GAAiB,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,KAAK,EAAiB,GAAG,EAAE,GAAA;AAClF,IAAA,IAAID,QAAU,EAAA;QACZ,OAAOA,QAAAA;AACT;;AAGA,IAAA,IAAIF,SAAW,EAAA;QACb,OAAO,CAAC,EAAEA,SAAU,CAAA,CAAC,EAAEC,QAAY,IAAA,EAAA,CAAG,CAAC,CAACG,IAAI,EAAA;AAC9C;AAEA,IAAA,OAAOD,KAAS,IAAA,EAAA;AAClB;AAEA;;qGAIA,MAAME,qBAAqB,OAAOC,OAAAA,GAAAA;AAChC,IAAA,IAAI,CAACA,OAAAA,IAAW,CAACA,OAAAA,CAAQH,KAAK,EAAE;QAC9B,OAAO,IAAA;AACT;IAEA,IAAI;QACF,OAAO,MAAMI,aAAcD,CAAAA,OAAAA,CAAQH,KAAK,CAAA;AAC1C,KAAA,CAAE,OAAOK,KAAO,EAAA;QACd,OAAO,IAAA;AACT;AACF;AAEA,MAAMC,cAAc,CAACC,MAAAA,GAAAA;IACnB,OAAO;AAAI,QAAA,GAAA,IAAIC,UAAWD,CAAAA,MAAAA;AAAQ,KAAA,CAACE,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAEC,CAAAA,QAAQ,CAAC,EAAA,CAAA,CAAIC,QAAQ,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA,CAAMC,IAAI,CAAC,EAAA,CAAA;AACtF,CAAA;AACA,MAAMT,gBAAgB,OAAOU,OAAAA,GAAAA;AAC3B,IAAA,MAAMC,QAAW,GAAA,IAAIC,WAAcC,EAAAA,CAAAA,MAAM,CAACH,OAAAA,CAAAA;AAC1C,IAAA,MAAMI,aAAa,MAAMC,MAAAA,CAAOC,MAAM,CAACC,MAAM,CAAC,SAAWN,EAAAA,QAAAA,CAAAA;AAEzD,IAAA,OAAOT,WAAYY,CAAAA,UAAAA,CAAAA;AACrB,CAAA;;;;;"}
1
+ {"version":3,"file":"users.js","sources":["../../../../../admin/src/utils/users.ts"],"sourcesContent":["import type { User } from '../features/Auth';\n\n/* -------------------------------------------------------------------------------------------------\n * getDisplayName\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Retrieves the display name of an admin panel user\n */\nconst getDisplayName = ({ firstname, lastname, username, email }: Partial<User> = {}): string => {\n if (username) {\n return username;\n }\n\n // firstname is not required if the user is created with a username\n if (firstname) {\n return `${firstname} ${lastname ?? ''}`.trim();\n }\n\n return email ?? '';\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getInitials\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Retrieves the initials of the user (based on their firstname / lastname or their display name)\n */\nconst getInitials = (user: Partial<User> = {}): string => {\n return user?.firstname && user?.lastname\n ? `${user.firstname.substring(0, 1)}${user.lastname.substring(0, 1)}`\n : getDisplayName(user)\n .split(' ')\n .map((name) => name.substring(0, 1))\n .join('')\n .substring(0, 1)\n .toUpperCase();\n};\n\n/* -------------------------------------------------------------------------------------------------\n * hashAdminUserEmail\n * -----------------------------------------------------------------------------------------------*/\n\nconst hashAdminUserEmail = async (payload?: User) => {\n if (!payload || !payload.email) {\n return null;\n }\n\n try {\n return await digestMessage(payload.email);\n } catch (error) {\n return null;\n }\n};\n\nconst bufferToHex = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((b) => b.toString(16).padStart(2, '0')).join('');\n};\nconst digestMessage = async (message: string) => {\n const msgUint8 = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n\n return bufferToHex(hashBuffer);\n};\n\nexport { getDisplayName, getInitials, hashAdminUserEmail };\n"],"names":["getDisplayName","firstname","lastname","username","email","trim","getInitials","user","substring","split","map","name","join","toUpperCase","hashAdminUserEmail","payload","digestMessage","error","bufferToHex","buffer","Uint8Array","b","toString","padStart","message","msgUint8","TextEncoder","encode","hashBuffer","crypto","subtle","digest"],"mappings":";;AAEA;;;;AAMC,IACKA,MAAAA,cAAAA,GAAiB,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,KAAK,EAAiB,GAAG,EAAE,GAAA;AAClF,IAAA,IAAID,QAAU,EAAA;QACZ,OAAOA,QAAAA;AACT;;AAGA,IAAA,IAAIF,SAAW,EAAA;QACb,OAAO,CAAC,EAAEA,SAAU,CAAA,CAAC,EAAEC,QAAY,IAAA,EAAA,CAAG,CAAC,CAACG,IAAI,EAAA;AAC9C;AAEA,IAAA,OAAOD,KAAS,IAAA,EAAA;AAClB;AAEA;;;;AAMC,IACKE,MAAAA,WAAAA,GAAc,CAACC,IAAAA,GAAsB,EAAE,GAAA;IAC3C,OAAOA,IAAAA,EAAMN,aAAaM,IAAML,EAAAA,QAAAA,GAC5B,CAAC,EAAEK,IAAAA,CAAKN,SAAS,CAACO,SAAS,CAAC,CAAG,EAAA,CAAA,CAAA,CAAG,EAAED,IAAKL,CAAAA,QAAQ,CAACM,SAAS,CAAC,GAAG,CAAG,CAAA,CAAA,CAAC,GACnER,cAAeO,CAAAA,IAAAA,CAAAA,CACZE,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,OAASA,IAAKH,CAAAA,SAAS,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA,CAChCI,IAAI,CAAC,EAAA,CAAA,CACLJ,SAAS,CAAC,CAAA,EAAG,GACbK,WAAW,EAAA;AACpB;AAEA;;qGAIA,MAAMC,qBAAqB,OAAOC,OAAAA,GAAAA;AAChC,IAAA,IAAI,CAACA,OAAAA,IAAW,CAACA,OAAAA,CAAQX,KAAK,EAAE;QAC9B,OAAO,IAAA;AACT;IAEA,IAAI;QACF,OAAO,MAAMY,aAAcD,CAAAA,OAAAA,CAAQX,KAAK,CAAA;AAC1C,KAAA,CAAE,OAAOa,KAAO,EAAA;QACd,OAAO,IAAA;AACT;AACF;AAEA,MAAMC,cAAc,CAACC,MAAAA,GAAAA;IACnB,OAAO;AAAI,QAAA,GAAA,IAAIC,UAAWD,CAAAA,MAAAA;AAAQ,KAAA,CAACT,GAAG,CAAC,CAACW,CAAAA,GAAMA,CAAEC,CAAAA,QAAQ,CAAC,EAAA,CAAA,CAAIC,QAAQ,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA,CAAMX,IAAI,CAAC,EAAA,CAAA;AACtF,CAAA;AACA,MAAMI,gBAAgB,OAAOQ,OAAAA,GAAAA;AAC3B,IAAA,MAAMC,QAAW,GAAA,IAAIC,WAAcC,EAAAA,CAAAA,MAAM,CAACH,OAAAA,CAAAA;AAC1C,IAAA,MAAMI,aAAa,MAAMC,MAAAA,CAAOC,MAAM,CAACC,MAAM,CAAC,SAAWN,EAAAA,QAAAA,CAAAA;AAEzD,IAAA,OAAOP,WAAYU,CAAAA,UAAAA,CAAAA;AACrB,CAAA;;;;;;"}
@@ -12,6 +12,13 @@
12
12
  }
13
13
  return email ?? '';
14
14
  };
15
+ /* -------------------------------------------------------------------------------------------------
16
+ * getInitials
17
+ * -----------------------------------------------------------------------------------------------*/ /**
18
+ * Retrieves the initials of the user (based on their firstname / lastname or their display name)
19
+ */ const getInitials = (user = {})=>{
20
+ return user?.firstname && user?.lastname ? `${user.firstname.substring(0, 1)}${user.lastname.substring(0, 1)}` : getDisplayName(user).split(' ').map((name)=>name.substring(0, 1)).join('').substring(0, 1).toUpperCase();
21
+ };
15
22
  /* -------------------------------------------------------------------------------------------------
16
23
  * hashAdminUserEmail
17
24
  * -----------------------------------------------------------------------------------------------*/ const hashAdminUserEmail = async (payload)=>{
@@ -35,5 +42,5 @@ const digestMessage = async (message)=>{
35
42
  return bufferToHex(hashBuffer);
36
43
  };
37
44
 
38
- export { getDisplayName, hashAdminUserEmail };
45
+ export { getDisplayName, getInitials, hashAdminUserEmail };
39
46
  //# sourceMappingURL=users.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"users.mjs","sources":["../../../../../admin/src/utils/users.ts"],"sourcesContent":["import type { User } from '../features/Auth';\n\n/* -------------------------------------------------------------------------------------------------\n * getDisplayName\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Retrieves the display name of an admin panel user\n */\nconst getDisplayName = ({ firstname, lastname, username, email }: Partial<User> = {}): string => {\n if (username) {\n return username;\n }\n\n // firstname is not required if the user is created with a username\n if (firstname) {\n return `${firstname} ${lastname ?? ''}`.trim();\n }\n\n return email ?? '';\n};\n\n/* -------------------------------------------------------------------------------------------------\n * hashAdminUserEmail\n * -----------------------------------------------------------------------------------------------*/\n\nconst hashAdminUserEmail = async (payload?: User) => {\n if (!payload || !payload.email) {\n return null;\n }\n\n try {\n return await digestMessage(payload.email);\n } catch (error) {\n return null;\n }\n};\n\nconst bufferToHex = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((b) => b.toString(16).padStart(2, '0')).join('');\n};\nconst digestMessage = async (message: string) => {\n const msgUint8 = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n\n return bufferToHex(hashBuffer);\n};\n\nexport { getDisplayName, hashAdminUserEmail };\n"],"names":["getDisplayName","firstname","lastname","username","email","trim","hashAdminUserEmail","payload","digestMessage","error","bufferToHex","buffer","Uint8Array","map","b","toString","padStart","join","message","msgUint8","TextEncoder","encode","hashBuffer","crypto","subtle","digest"],"mappings":"AAEA;;;;AAMC,IACKA,MAAAA,cAAAA,GAAiB,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,KAAK,EAAiB,GAAG,EAAE,GAAA;AAClF,IAAA,IAAID,QAAU,EAAA;QACZ,OAAOA,QAAAA;AACT;;AAGA,IAAA,IAAIF,SAAW,EAAA;QACb,OAAO,CAAC,EAAEA,SAAU,CAAA,CAAC,EAAEC,QAAY,IAAA,EAAA,CAAG,CAAC,CAACG,IAAI,EAAA;AAC9C;AAEA,IAAA,OAAOD,KAAS,IAAA,EAAA;AAClB;AAEA;;qGAIA,MAAME,qBAAqB,OAAOC,OAAAA,GAAAA;AAChC,IAAA,IAAI,CAACA,OAAAA,IAAW,CAACA,OAAAA,CAAQH,KAAK,EAAE;QAC9B,OAAO,IAAA;AACT;IAEA,IAAI;QACF,OAAO,MAAMI,aAAcD,CAAAA,OAAAA,CAAQH,KAAK,CAAA;AAC1C,KAAA,CAAE,OAAOK,KAAO,EAAA;QACd,OAAO,IAAA;AACT;AACF;AAEA,MAAMC,cAAc,CAACC,MAAAA,GAAAA;IACnB,OAAO;AAAI,QAAA,GAAA,IAAIC,UAAWD,CAAAA,MAAAA;AAAQ,KAAA,CAACE,GAAG,CAAC,CAACC,CAAAA,GAAMA,CAAEC,CAAAA,QAAQ,CAAC,EAAA,CAAA,CAAIC,QAAQ,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA,CAAMC,IAAI,CAAC,EAAA,CAAA;AACtF,CAAA;AACA,MAAMT,gBAAgB,OAAOU,OAAAA,GAAAA;AAC3B,IAAA,MAAMC,QAAW,GAAA,IAAIC,WAAcC,EAAAA,CAAAA,MAAM,CAACH,OAAAA,CAAAA;AAC1C,IAAA,MAAMI,aAAa,MAAMC,MAAAA,CAAOC,MAAM,CAACC,MAAM,CAAC,SAAWN,EAAAA,QAAAA,CAAAA;AAEzD,IAAA,OAAOT,WAAYY,CAAAA,UAAAA,CAAAA;AACrB,CAAA;;;;"}
1
+ {"version":3,"file":"users.mjs","sources":["../../../../../admin/src/utils/users.ts"],"sourcesContent":["import type { User } from '../features/Auth';\n\n/* -------------------------------------------------------------------------------------------------\n * getDisplayName\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Retrieves the display name of an admin panel user\n */\nconst getDisplayName = ({ firstname, lastname, username, email }: Partial<User> = {}): string => {\n if (username) {\n return username;\n }\n\n // firstname is not required if the user is created with a username\n if (firstname) {\n return `${firstname} ${lastname ?? ''}`.trim();\n }\n\n return email ?? '';\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getInitials\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * Retrieves the initials of the user (based on their firstname / lastname or their display name)\n */\nconst getInitials = (user: Partial<User> = {}): string => {\n return user?.firstname && user?.lastname\n ? `${user.firstname.substring(0, 1)}${user.lastname.substring(0, 1)}`\n : getDisplayName(user)\n .split(' ')\n .map((name) => name.substring(0, 1))\n .join('')\n .substring(0, 1)\n .toUpperCase();\n};\n\n/* -------------------------------------------------------------------------------------------------\n * hashAdminUserEmail\n * -----------------------------------------------------------------------------------------------*/\n\nconst hashAdminUserEmail = async (payload?: User) => {\n if (!payload || !payload.email) {\n return null;\n }\n\n try {\n return await digestMessage(payload.email);\n } catch (error) {\n return null;\n }\n};\n\nconst bufferToHex = (buffer: ArrayBuffer) => {\n return [...new Uint8Array(buffer)].map((b) => b.toString(16).padStart(2, '0')).join('');\n};\nconst digestMessage = async (message: string) => {\n const msgUint8 = new TextEncoder().encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n\n return bufferToHex(hashBuffer);\n};\n\nexport { getDisplayName, getInitials, hashAdminUserEmail };\n"],"names":["getDisplayName","firstname","lastname","username","email","trim","getInitials","user","substring","split","map","name","join","toUpperCase","hashAdminUserEmail","payload","digestMessage","error","bufferToHex","buffer","Uint8Array","b","toString","padStart","message","msgUint8","TextEncoder","encode","hashBuffer","crypto","subtle","digest"],"mappings":"AAEA;;;;AAMC,IACKA,MAAAA,cAAAA,GAAiB,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,KAAK,EAAiB,GAAG,EAAE,GAAA;AAClF,IAAA,IAAID,QAAU,EAAA;QACZ,OAAOA,QAAAA;AACT;;AAGA,IAAA,IAAIF,SAAW,EAAA;QACb,OAAO,CAAC,EAAEA,SAAU,CAAA,CAAC,EAAEC,QAAY,IAAA,EAAA,CAAG,CAAC,CAACG,IAAI,EAAA;AAC9C;AAEA,IAAA,OAAOD,KAAS,IAAA,EAAA;AAClB;AAEA;;;;AAMC,IACKE,MAAAA,WAAAA,GAAc,CAACC,IAAAA,GAAsB,EAAE,GAAA;IAC3C,OAAOA,IAAAA,EAAMN,aAAaM,IAAML,EAAAA,QAAAA,GAC5B,CAAC,EAAEK,IAAAA,CAAKN,SAAS,CAACO,SAAS,CAAC,CAAG,EAAA,CAAA,CAAA,CAAG,EAAED,IAAKL,CAAAA,QAAQ,CAACM,SAAS,CAAC,GAAG,CAAG,CAAA,CAAA,CAAC,GACnER,cAAeO,CAAAA,IAAAA,CAAAA,CACZE,KAAK,CAAC,GAAA,CAAA,CACNC,GAAG,CAAC,CAACC,OAASA,IAAKH,CAAAA,SAAS,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA,CAChCI,IAAI,CAAC,EAAA,CAAA,CACLJ,SAAS,CAAC,CAAA,EAAG,GACbK,WAAW,EAAA;AACpB;AAEA;;qGAIA,MAAMC,qBAAqB,OAAOC,OAAAA,GAAAA;AAChC,IAAA,IAAI,CAACA,OAAAA,IAAW,CAACA,OAAAA,CAAQX,KAAK,EAAE;QAC9B,OAAO,IAAA;AACT;IAEA,IAAI;QACF,OAAO,MAAMY,aAAcD,CAAAA,OAAAA,CAAQX,KAAK,CAAA;AAC1C,KAAA,CAAE,OAAOa,KAAO,EAAA;QACd,OAAO,IAAA;AACT;AACF;AAEA,MAAMC,cAAc,CAACC,MAAAA,GAAAA;IACnB,OAAO;AAAI,QAAA,GAAA,IAAIC,UAAWD,CAAAA,MAAAA;AAAQ,KAAA,CAACT,GAAG,CAAC,CAACW,CAAAA,GAAMA,CAAEC,CAAAA,QAAQ,CAAC,EAAA,CAAA,CAAIC,QAAQ,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA,CAAMX,IAAI,CAAC,EAAA,CAAA;AACtF,CAAA;AACA,MAAMI,gBAAgB,OAAOQ,OAAAA,GAAAA;AAC3B,IAAA,MAAMC,QAAW,GAAA,IAAIC,WAAcC,EAAAA,CAAAA,MAAM,CAACH,OAAAA,CAAAA;AAC1C,IAAA,MAAMI,aAAa,MAAMC,MAAAA,CAAOC,MAAM,CAACC,MAAM,CAAC,SAAWN,EAAAA,QAAAA,CAAAA;AAEzD,IAAA,OAAOP,WAAYU,CAAAA,UAAAA,CAAAA;AACrB,CAAA;;;;"}
@@ -314,6 +314,14 @@ const server = node.setupServer(...[
314
314
  }
315
315
  }));
316
316
  }),
317
+ msw.rest.get('/admin/guided-tour-meta', (req, res, ctx)=>{
318
+ return res(ctx.json({
319
+ data: {
320
+ isFirstSuperAdminUser: false,
321
+ completedActions: []
322
+ }
323
+ }));
324
+ }),
317
325
  /**
318
326
  * WEBHOOKS
319
327
  */ msw.rest.get('/admin/webhooks', (req, res, ctx)=>{