@strapi/admin 5.17.0 → 5.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) 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/LeftMenu.js +1 -1
  6. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/admin/src/components/LeftMenu.mjs +2 -2
  8. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/MainNav/NavLink.js +40 -4
  10. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  11. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +21 -4
  12. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/MainNav/NavUser.js +1 -1
  14. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  15. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +1 -1
  16. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/Providers.js +0 -2
  18. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  19. package/dist/admin/admin/src/components/Providers.mjs +0 -2
  20. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/SubNav.js +27 -7
  22. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  23. package/dist/admin/admin/src/components/SubNav.mjs +28 -8
  24. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js +31 -9
  26. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js.map +1 -1
  27. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs +31 -9
  28. package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js +291 -0
  30. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.js.map +1 -0
  31. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs +289 -0
  32. package/dist/admin/admin/src/components/UnstableGuidedTour/Overview.mjs.map +1 -0
  33. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js +20 -4
  34. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js.map +1 -1
  35. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs +21 -5
  36. package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js +299 -26
  38. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js.map +1 -1
  39. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs +301 -27
  40. package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/Widgets.js +52 -0
  42. package/dist/admin/admin/src/components/Widgets.js.map +1 -0
  43. package/dist/admin/admin/src/components/Widgets.mjs +50 -0
  44. package/dist/admin/admin/src/components/Widgets.mjs.map +1 -0
  45. package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
  46. package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
  47. package/dist/admin/admin/src/features/Auth.js.map +1 -1
  48. package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
  49. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  50. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  51. package/dist/admin/admin/src/pages/Home/HomePage.js +2 -1
  52. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  53. package/dist/admin/admin/src/pages/Home/HomePage.mjs +2 -1
  54. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  55. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +93 -0
  56. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
  57. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs +95 -3
  58. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.mjs.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +8 -3
  60. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
  61. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs +10 -5
  62. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -1
  63. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +6 -1
  64. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs +6 -1
  66. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +58 -53
  68. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
  69. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +58 -53
  70. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
  71. package/dist/admin/admin/src/translations/en.json.js +29 -2
  72. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  73. package/dist/admin/admin/src/translations/en.json.mjs +29 -2
  74. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  75. package/dist/admin/admin/src/translations/es.json.js +1 -0
  76. package/dist/admin/admin/src/translations/es.json.js.map +1 -1
  77. package/dist/admin/admin/src/translations/es.json.mjs +1 -0
  78. package/dist/admin/admin/src/translations/es.json.mjs.map +1 -1
  79. package/dist/admin/admin/src/translations/fr.json.js +3 -1
  80. package/dist/admin/admin/src/translations/fr.json.js.map +1 -1
  81. package/dist/admin/admin/src/translations/fr.json.mjs +3 -1
  82. package/dist/admin/admin/src/translations/fr.json.mjs.map +1 -1
  83. package/dist/admin/admin/src/utils/users.js +8 -0
  84. package/dist/admin/admin/src/utils/users.js.map +1 -1
  85. package/dist/admin/admin/src/utils/users.mjs +8 -1
  86. package/dist/admin/admin/src/utils/users.mjs.map +1 -1
  87. package/dist/admin/admin/tests/server.js +8 -0
  88. package/dist/admin/admin/tests/server.js.map +1 -1
  89. package/dist/admin/admin/tests/server.mjs +8 -0
  90. package/dist/admin/admin/tests/server.mjs.map +1 -1
  91. package/dist/admin/admin/tests/utils.js +25 -21
  92. package/dist/admin/admin/tests/utils.js.map +1 -1
  93. package/dist/admin/admin/tests/utils.mjs +25 -21
  94. package/dist/admin/admin/tests/utils.mjs.map +1 -1
  95. package/dist/admin/src/components/UnstableGuidedTour/Context.d.ts +12 -3
  96. package/dist/admin/src/components/UnstableGuidedTour/Overview.d.ts +1 -0
  97. package/dist/admin/src/components/UnstableGuidedTour/Step.d.ts +3 -1
  98. package/dist/admin/src/components/UnstableGuidedTour/Tours.d.ts +40 -9
  99. package/dist/admin/src/components/Widgets.d.ts +2 -0
  100. package/dist/admin/src/core/apis/Widgets.d.ts +1 -1
  101. package/dist/admin/src/features/Auth.d.ts +1 -1
  102. package/dist/admin/src/pages/Settings/components/Tokens/TokenBox.d.ts +1 -0
  103. package/dist/admin/src/utils/users.d.ts +5 -1
  104. package/dist/server/server/src/services/guided-tour.js +20 -2
  105. package/dist/server/server/src/services/guided-tour.js.map +1 -1
  106. package/dist/server/server/src/services/guided-tour.mjs +20 -2
  107. package/dist/server/server/src/services/guided-tour.mjs.map +1 -1
  108. package/dist/server/server/src/strategies/api-token.js +15 -4
  109. package/dist/server/server/src/strategies/api-token.js.map +1 -1
  110. package/dist/server/server/src/strategies/api-token.mjs +15 -4
  111. package/dist/server/server/src/strategies/api-token.mjs.map +1 -1
  112. package/dist/server/src/services/guided-tour.d.ts.map +1 -1
  113. package/dist/server/src/strategies/api-token.d.ts.map +1 -1
  114. package/package.json +9 -9
@@ -1,6 +1,8 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { Box, Popover } from '@strapi/design-system';
3
+ import { Box, Flex, LinkButton, Portal, Popover } from '@strapi/design-system';
4
+ import { FormattedMessage } from 'react-intl';
5
+ import { NavLink } from 'react-router-dom';
4
6
  import { styled } from 'styled-components';
5
7
  import { useGetGuidedTourMetaQuery } from '../../services/admin.mjs';
6
8
  import { unstableUseGuidedTour } from './Context.mjs';
@@ -9,11 +11,108 @@ import { createStepComponents } from './Step.mjs';
9
11
  /* -------------------------------------------------------------------------------------------------
10
12
  * Tours
11
13
  * -----------------------------------------------------------------------------------------------*/ const tours = {
12
- TEST: createTour('TEST', [
14
+ contentTypeBuilder: createTour('contentTypeBuilder', [
13
15
  {
14
16
  name: 'Introduction',
15
17
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
16
- sideOffset: -36,
18
+ side: "bottom",
19
+ children: [
20
+ /*#__PURE__*/ jsx(Step.Title, {
21
+ id: "tours.contentTypeBuilder.Introduction.title",
22
+ defaultMessage: "Content-Type Builder"
23
+ }),
24
+ /*#__PURE__*/ jsx(Step.Content, {
25
+ id: "tours.contentTypeBuilder.Introduction.content",
26
+ defaultMessage: "Create and manage your content structure with collection types, single types and components."
27
+ }),
28
+ /*#__PURE__*/ jsx(Step.Actions, {
29
+ showSkip: true
30
+ })
31
+ ]
32
+ })
33
+ },
34
+ {
35
+ name: 'CollectionTypes',
36
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
37
+ side: "right",
38
+ sideOffset: 26,
39
+ children: [
40
+ /*#__PURE__*/ jsx(Step.Title, {
41
+ id: "tours.contentTypeBuilder.CollectionTypes.title",
42
+ defaultMessage: "Collection Types"
43
+ }),
44
+ /*#__PURE__*/ jsx(Step.Content, {
45
+ id: "tours.contentTypeBuilder.CollectionTypes.content",
46
+ defaultMessage: "Create and manage your content structure with collection types, single types and components."
47
+ }),
48
+ /*#__PURE__*/ jsx(Step.Actions, {})
49
+ ]
50
+ })
51
+ },
52
+ {
53
+ name: 'SingleTypes',
54
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
55
+ side: "right",
56
+ sideOffset: 26,
57
+ children: [
58
+ /*#__PURE__*/ jsx(Step.Title, {
59
+ id: "tours.contentTypeBuilder.SingleTypes.title",
60
+ defaultMessage: "Single Types"
61
+ }),
62
+ /*#__PURE__*/ jsx(Step.Content, {
63
+ id: "tours.contentTypeBuilder.SingleTypes.content",
64
+ defaultMessage: "A content structure that can manage a single entry, such as a homepage or a header."
65
+ }),
66
+ /*#__PURE__*/ jsx(Step.Actions, {})
67
+ ]
68
+ })
69
+ },
70
+ {
71
+ name: 'Components',
72
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
73
+ side: "right",
74
+ sideOffset: 26,
75
+ children: [
76
+ /*#__PURE__*/ jsx(Step.Title, {
77
+ id: "tours.contentTypeBuilder.Components.title",
78
+ defaultMessage: "Components"
79
+ }),
80
+ /*#__PURE__*/ jsx(Step.Content, {
81
+ id: "tours.contentTypeBuilder.Components.content",
82
+ defaultMessage: "A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards."
83
+ }),
84
+ /*#__PURE__*/ jsx(Step.Actions, {})
85
+ ]
86
+ })
87
+ },
88
+ {
89
+ name: 'Finish',
90
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
91
+ side: "right",
92
+ sideOffset: 32,
93
+ children: [
94
+ /*#__PURE__*/ jsx(Step.Title, {
95
+ id: "tours.contentTypeBuilder.Finish.title",
96
+ defaultMessage: "It’s time to create content!"
97
+ }),
98
+ /*#__PURE__*/ jsx(Step.Content, {
99
+ id: "tours.contentTypeBuilder.Finish.content",
100
+ defaultMessage: "Now that you created content types, you’ll be able to create content in the content manager."
101
+ }),
102
+ /*#__PURE__*/ jsx(Step.Actions, {
103
+ showStepCount: false,
104
+ to: "/content-manager"
105
+ })
106
+ ]
107
+ }),
108
+ when: (completedActions)=>completedActions.includes('didCreateContentTypeSchema')
109
+ }
110
+ ]),
111
+ contentManager: createTour('contentManager', [
112
+ {
113
+ name: 'Introduction',
114
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
115
+ side: "top",
17
116
  children: [
18
117
  /*#__PURE__*/ jsx(Step.Title, {
19
118
  id: "tours.contentManager.Introduction.title",
@@ -30,47 +129,205 @@ import { createStepComponents } from './Step.mjs';
30
129
  })
31
130
  },
32
131
  {
33
- name: 'Done',
34
- requiredActions: [
35
- 'didCreateApiToken'
36
- ],
132
+ name: 'Fields',
37
133
  content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
134
+ side: 'top',
38
135
  align: "start",
136
+ sideOffset: -36,
137
+ children: [
138
+ /*#__PURE__*/ jsx(Step.Title, {
139
+ id: "tours.contentManager.Fields.title",
140
+ defaultMessage: "Fields"
141
+ }),
142
+ /*#__PURE__*/ jsx(Step.Content, {
143
+ id: "tours.contentManager.Fields.content",
144
+ defaultMessage: "Add content to the fields created in the Content-Type Builder."
145
+ }),
146
+ /*#__PURE__*/ jsx(Step.Actions, {})
147
+ ]
148
+ })
149
+ },
150
+ {
151
+ name: 'Publish',
152
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
153
+ side: "left",
154
+ align: "center",
155
+ sideOffset: 20,
39
156
  children: [
40
157
  /*#__PURE__*/ jsx(Step.Title, {
41
- id: "tours.contentManager.CreateEntry.title",
42
- defaultMessage: "Create entry"
158
+ id: "tours.contentManager.Publish.title",
159
+ defaultMessage: "Publish"
43
160
  }),
44
161
  /*#__PURE__*/ jsx(Step.Content, {
45
- id: "tours.contentManager.CreateEntry.content",
46
- defaultMessage: "Click this button to create an entry"
162
+ id: "tours.contentManager.Publish.content",
163
+ defaultMessage: "Publish entries to make their content available through the Document Service API."
47
164
  }),
48
165
  /*#__PURE__*/ jsx(Step.Actions, {})
49
166
  ]
50
167
  })
168
+ },
169
+ {
170
+ name: 'Finish',
171
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
172
+ side: "right",
173
+ sideOffset: 32,
174
+ children: [
175
+ /*#__PURE__*/ jsx(Step.Title, {
176
+ id: "tours.contentManager.FinalStep.title",
177
+ defaultMessage: "It’s time to create API Tokens!"
178
+ }),
179
+ /*#__PURE__*/ jsx(Step.Content, {
180
+ id: "tours.contentManager.FinalStep.content",
181
+ defaultMessage: "Now that you’ve created and published content, time to create API tokens and set up permissions."
182
+ }),
183
+ /*#__PURE__*/ jsx(Step.Actions, {
184
+ showStepCount: false,
185
+ to: "/settings/api-tokens"
186
+ })
187
+ ]
188
+ }),
189
+ when: (completedActions)=>completedActions.includes('didCreateContent')
51
190
  }
52
- ])
191
+ ]),
192
+ apiTokens: createTour('apiTokens', [
193
+ {
194
+ name: 'Introduction',
195
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
196
+ sideOffset: -36,
197
+ children: [
198
+ /*#__PURE__*/ jsx(Step.Title, {
199
+ id: "tours.apiTokens.Introduction.title",
200
+ defaultMessage: "API tokens"
201
+ }),
202
+ /*#__PURE__*/ jsx(Step.Content, {
203
+ id: "tours.apiTokens.Introduction.content",
204
+ defaultMessage: "Create and manage API tokens with highly customizable permissions."
205
+ }),
206
+ /*#__PURE__*/ jsx(Step.Actions, {
207
+ showSkip: true
208
+ })
209
+ ]
210
+ }),
211
+ when: (completedActions)=>!completedActions.includes('didCreateApiToken')
212
+ },
213
+ {
214
+ name: 'CreateAnAPIToken',
215
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
216
+ side: "bottom",
217
+ sideOffset: 20,
218
+ align: "end",
219
+ children: [
220
+ /*#__PURE__*/ jsx(Step.Title, {
221
+ id: "tours.apiTokens.CreateAnAPIToken.title",
222
+ defaultMessage: "Create an API token"
223
+ }),
224
+ /*#__PURE__*/ jsx(Step.Content, {
225
+ id: "tours.apiTokens.CreateAnAPIToken.content",
226
+ defaultMessage: "Create a new API token. Choose a name, duration and type."
227
+ }),
228
+ /*#__PURE__*/ jsx(Step.Actions, {})
229
+ ]
230
+ })
231
+ },
232
+ {
233
+ name: 'CopyAPIToken',
234
+ content: (Step)=>/*#__PURE__*/ jsxs(Step.Root, {
235
+ side: "bottom",
236
+ align: "start",
237
+ children: [
238
+ /*#__PURE__*/ jsx(Step.Title, {
239
+ id: "tours.apiTokens.CopyAPIToken.title",
240
+ defaultMessage: "Copy your new API token"
241
+ }),
242
+ /*#__PURE__*/ jsx(Step.Content, {
243
+ id: "tours.apiTokens.CopyAPIToken.content",
244
+ defaultMessage: "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."
245
+ }),
246
+ /*#__PURE__*/ jsx(Step.Actions, {})
247
+ ]
248
+ }),
249
+ when: (completedActions)=>completedActions.includes('didCreateApiToken')
250
+ },
251
+ {
252
+ name: 'Finish',
253
+ content: (Step)=>{
254
+ const dispatch = unstableUseGuidedTour('GuidedTourPopover', (s)=>s.dispatch);
255
+ return /*#__PURE__*/ jsxs(Step.Root, {
256
+ side: "right",
257
+ align: "start",
258
+ sideOffset: 32,
259
+ children: [
260
+ /*#__PURE__*/ jsx(Step.Title, {
261
+ id: "tours.apiTokens.FinalStep.title",
262
+ defaultMessage: "It’s time to deploy your application!"
263
+ }),
264
+ /*#__PURE__*/ jsx(Step.Content, {
265
+ id: "tours.apiTokens.FinalStep.content",
266
+ defaultMessage: "Your application is ready to be deployed and its content to be shared with the world!"
267
+ }),
268
+ /*#__PURE__*/ jsx(Step.Actions, {
269
+ showStepCount: false,
270
+ children: /*#__PURE__*/ jsx(Flex, {
271
+ justifyContent: "end",
272
+ width: '100%',
273
+ children: /*#__PURE__*/ jsx(LinkButton, {
274
+ onClick: ()=>{
275
+ dispatch({
276
+ type: 'next_step',
277
+ payload: 'apiTokens'
278
+ });
279
+ },
280
+ tag: NavLink,
281
+ to: "/",
282
+ children: /*#__PURE__*/ jsx(FormattedMessage, {
283
+ id: "tours.gotIt",
284
+ defaultMessage: "Got it"
285
+ })
286
+ })
287
+ })
288
+ })
289
+ ]
290
+ });
291
+ },
292
+ when: (completedActions)=>completedActions.includes('didCopyApiToken')
293
+ }
294
+ ]),
295
+ strapiCloud: createTour('strapiCloud', [])
296
+ };
297
+ const UnstableGuidedTourTooltip = ({ children, ...props })=>{
298
+ const state = unstableUseGuidedTour('TooltipWrapper', (s)=>s.state);
299
+ const hasFutureFlag = window.strapi.future.isEnabled('unstableGuidedTour');
300
+ if (!state.enabled) {
301
+ return /*#__PURE__*/ jsx(Fragment, {
302
+ children: children
303
+ });
304
+ }
305
+ if (!hasFutureFlag) {
306
+ return /*#__PURE__*/ jsx(Fragment, {
307
+ children: children
308
+ });
309
+ }
310
+ return /*#__PURE__*/ jsx(GuidedTourTooltipImpl, {
311
+ ...props,
312
+ children: children
313
+ });
53
314
  };
54
315
  const GuidedTourOverlay = styled(Box)`
55
316
  position: fixed;
56
- inset: 0;
317
+ top: 0;
318
+ left: 0;
319
+ right: 0;
320
+ bottom: 0;
57
321
  background-color: rgba(50, 50, 77, 0.2);
58
322
  z-index: 10;
59
323
  `;
60
- const UnstableGuidedTourTooltip = ({ children, content, tourName, step, requiredActions })=>{
324
+ const GuidedTourTooltipImpl = ({ children, content, tourName, step, when })=>{
61
325
  const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();
62
326
  const state = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s)=>s.state);
63
327
  const dispatch = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s)=>s.dispatch);
64
- const Step = React.useMemo(()=>createStepComponents(tourName), [
65
- tourName
66
- ]);
67
328
  const isCurrentStep = state.tours[tourName].currentStep === step;
68
- const hasCompletedRequiredActions = requiredActions?.every((action)=>{
69
- return guidedTourMeta?.data?.completedActions.includes(action);
70
- }) ?? true;
71
- const hasFutureFlag = window.strapi.future.isEnabled('unstableGuidedTour');
72
- const isEnabled = guidedTourMeta?.data?.isFirstSuperAdminUser && !state.tours[tourName].isCompleted && hasFutureFlag;
73
- const isPopoverOpen = isEnabled && isCurrentStep && hasCompletedRequiredActions;
329
+ const isStepConditionMet = when ? when(state.completedActions) : true;
330
+ const isPopoverOpen = guidedTourMeta?.data?.isFirstSuperAdminUser && !state.tours[tourName].isCompleted && isCurrentStep && isStepConditionMet;
74
331
  // Lock the scroll
75
332
  React.useEffect(()=>{
76
333
  if (!isPopoverOpen) return;
@@ -82,9 +339,24 @@ const UnstableGuidedTourTooltip = ({ children, content, tourName, step, required
82
339
  }, [
83
340
  isPopoverOpen
84
341
  ]);
342
+ // TODO: This isn't great but the only solution for syncing the completed actions
343
+ React.useEffect(()=>{
344
+ dispatch({
345
+ type: 'set_completed_actions',
346
+ payload: guidedTourMeta?.data?.completedActions ?? []
347
+ });
348
+ }, [
349
+ dispatch,
350
+ guidedTourMeta?.data?.completedActions
351
+ ]);
352
+ const Step = React.useMemo(()=>createStepComponents(tourName), [
353
+ tourName
354
+ ]);
85
355
  return /*#__PURE__*/ jsxs(Fragment, {
86
356
  children: [
87
- isPopoverOpen && /*#__PURE__*/ jsx(GuidedTourOverlay, {}),
357
+ isPopoverOpen && /*#__PURE__*/ jsx(Portal, {
358
+ children: /*#__PURE__*/ jsx(GuidedTourOverlay, {})
359
+ }),
88
360
  /*#__PURE__*/ jsxs(Popover.Root, {
89
361
  open: isPopoverOpen,
90
362
  children: [
@@ -105,17 +377,19 @@ function createTour(tourName, steps) {
105
377
  if (step.name in acc) {
106
378
  throw Error(`The tour: ${tourName} with step: ${step.name} has already been registered`);
107
379
  }
108
- acc[step.name] = ({ children })=>/*#__PURE__*/ jsx(UnstableGuidedTourTooltip, {
380
+ acc[step.name] = ({ children })=>{
381
+ return /*#__PURE__*/ jsx(UnstableGuidedTourTooltip, {
109
382
  tourName: tourName,
110
383
  step: index,
111
384
  content: step.content,
112
- requiredActions: step.requiredActions,
385
+ when: step.when,
113
386
  children: children
114
387
  });
388
+ };
115
389
  return acc;
116
390
  }, {});
117
391
  return tour;
118
392
  }
119
393
 
120
- export { GuidedTourOverlay, tours };
394
+ export { tours };
121
395
  //# sourceMappingURL=Tours.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tours.mjs","sources":["../../../../../../admin/src/components/UnstableGuidedTour/Tours.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Popover } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { type GetGuidedTourMeta } from '../../../../shared/contracts/admin';\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\n\nimport { type State, type Action, unstableUseGuidedTour, ValidTourName } from './Context';\nimport { Step, createStepComponents } from './Step';\n\n/* -------------------------------------------------------------------------------------------------\n * Tours\n * -----------------------------------------------------------------------------------------------*/\n\nconst tours = {\n TEST: createTour('TEST', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root sideOffset={-36}>\n <Step.Title\n id=\"tours.contentManager.Introduction.title\"\n defaultMessage=\"Content manager\"\n />\n <Step.Content\n id=\"tours.contentManager.Introduction.content\"\n defaultMessage=\"Create and manage content from your collection types and single types.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'Done',\n requiredActions: ['didCreateApiToken'],\n content: (Step) => (\n <Step.Root align=\"start\">\n <Step.Title id=\"tours.contentManager.CreateEntry.title\" defaultMessage=\"Create entry\" />\n <Step.Content\n id=\"tours.contentManager.CreateEntry.content\"\n defaultMessage=\"Click this button to create an entry\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n ]),\n} as const;\n\ntype Tours = typeof tours;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourTooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype Content = (\n Step: Step,\n {\n state,\n dispatch,\n }: {\n state: State;\n dispatch: React.Dispatch<Action>;\n }\n) => React.ReactNode;\n\nexport const GuidedTourOverlay = styled(Box)`\n position: fixed;\n inset: 0;\n background-color: rgba(50, 50, 77, 0.2);\n z-index: 10;\n`;\n\nconst UnstableGuidedTourTooltip = ({\n children,\n content,\n tourName,\n step,\n requiredActions,\n}: {\n children: React.ReactNode;\n content: Content;\n tourName: ValidTourName;\n step: number;\n requiredActions?: GetGuidedTourMeta.Response['data']['completedActions'];\n}) => {\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const state = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.state);\n const dispatch = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.dispatch);\n\n const Step = React.useMemo(() => createStepComponents(tourName), [tourName]);\n\n const isCurrentStep = state.tours[tourName].currentStep === step;\n const hasCompletedRequiredActions =\n requiredActions?.every((action) => {\n return guidedTourMeta?.data?.completedActions.includes(action);\n }) ?? true;\n const hasFutureFlag = window.strapi.future.isEnabled('unstableGuidedTour');\n const isEnabled =\n guidedTourMeta?.data?.isFirstSuperAdminUser &&\n !state.tours[tourName].isCompleted &&\n hasFutureFlag;\n\n const isPopoverOpen = isEnabled && isCurrentStep && hasCompletedRequiredActions;\n\n // Lock the scroll\n React.useEffect(() => {\n if (!isPopoverOpen) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = originalStyle;\n };\n }, [isPopoverOpen]);\n\n return (\n <>\n {isPopoverOpen && <GuidedTourOverlay />}\n <Popover.Root open={isPopoverOpen}>\n <Popover.Anchor>{children}</Popover.Anchor>\n {content(Step, { state, dispatch })}\n </Popover.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Tour factory\n * -----------------------------------------------------------------------------------------------*/\n\ntype TourStep<P extends string> = {\n name: P;\n content: Content;\n requiredActions?: GetGuidedTourMeta.Response['data']['completedActions'];\n};\n\nfunction createTour<const T extends ReadonlyArray<TourStep<string>>>(tourName: string, steps: T) {\n type Components = {\n [K in T[number]['name']]: React.ComponentType<{ children: React.ReactNode }>;\n };\n\n const tour = steps.reduce((acc, step, index) => {\n if (step.name in acc) {\n throw Error(`The tour: ${tourName} with step: ${step.name} has already been registered`);\n }\n\n acc[step.name as keyof Components] = ({ children }: { children: React.ReactNode }) => (\n <UnstableGuidedTourTooltip\n tourName={tourName as ValidTourName}\n step={index}\n content={step.content}\n requiredActions={step.requiredActions}\n >\n {children}\n </UnstableGuidedTourTooltip>\n );\n\n return acc;\n }, {} as Components);\n\n return tour;\n}\n\nexport type { Content, Tours };\nexport { tours };\n"],"names":["tours","TEST","createTour","name","content","Step","_jsxs","Root","sideOffset","_jsx","Title","id","defaultMessage","Content","Actions","showSkip","requiredActions","align","GuidedTourOverlay","styled","Box","UnstableGuidedTourTooltip","children","tourName","step","data","guidedTourMeta","useGetGuidedTourMetaQuery","state","unstableUseGuidedTour","s","dispatch","React","useMemo","createStepComponents","isCurrentStep","currentStep","hasCompletedRequiredActions","every","action","completedActions","includes","hasFutureFlag","window","strapi","future","isEnabled","isFirstSuperAdminUser","isCompleted","isPopoverOpen","useEffect","originalStyle","getComputedStyle","document","body","overflow","style","_Fragment","Popover","open","Anchor","steps","tour","reduce","acc","index","Error"],"mappings":"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"}
1
+ {"version":3,"file":"Tours.mjs","sources":["../../../../../../admin/src/components/UnstableGuidedTour/Tours.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Popover, Portal, Flex, LinkButton } from '@strapi/design-system';\nimport { FormattedMessage } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetGuidedTourMetaQuery } from '../../services/admin';\n\nimport {\n type State,\n type Action,\n unstableUseGuidedTour,\n ValidTourName,\n ExtendedCompletedActions,\n} from './Context';\nimport { Step, createStepComponents } from './Step';\n\n/* -------------------------------------------------------------------------------------------------\n * Tours\n * -----------------------------------------------------------------------------------------------*/\n\nconst tours = {\n contentTypeBuilder: createTour('contentTypeBuilder', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root side=\"bottom\">\n <Step.Title\n id=\"tours.contentTypeBuilder.Introduction.title\"\n defaultMessage=\"Content-Type Builder\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Introduction.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'CollectionTypes',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={26}>\n <Step.Title\n id=\"tours.contentTypeBuilder.CollectionTypes.title\"\n defaultMessage=\"Collection Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.CollectionTypes.content\"\n defaultMessage=\"Create and manage your content structure with collection types, single types and components.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'SingleTypes',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={26}>\n <Step.Title\n id=\"tours.contentTypeBuilder.SingleTypes.title\"\n defaultMessage=\"Single Types\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.SingleTypes.content\"\n defaultMessage=\"A content structure that can manage a single entry, such as a homepage or a header.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Components',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={26}>\n <Step.Title id=\"tours.contentTypeBuilder.Components.title\" defaultMessage=\"Components\" />\n <Step.Content\n id=\"tours.contentTypeBuilder.Components.content\"\n defaultMessage=\"A reusable content structure that can be used across multiple content types, such as buttons, sliders or cards.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={32}>\n <Step.Title\n id=\"tours.contentTypeBuilder.Finish.title\"\n defaultMessage=\"It’s time to create content!\"\n />\n <Step.Content\n id=\"tours.contentTypeBuilder.Finish.content\"\n defaultMessage=\"Now that you created content types, you’ll be able to create content in the content manager.\"\n />\n <Step.Actions showStepCount={false} to=\"/content-manager\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateContentTypeSchema'),\n },\n ]),\n contentManager: createTour('contentManager', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root side=\"top\">\n <Step.Title\n id=\"tours.contentManager.Introduction.title\"\n defaultMessage=\"Content manager\"\n />\n <Step.Content\n id=\"tours.contentManager.Introduction.content\"\n defaultMessage=\"Create and manage content from your collection types and single types.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n },\n {\n name: 'Fields',\n content: (Step) => (\n <Step.Root side={'top'} align=\"start\" sideOffset={-36}>\n <Step.Title id=\"tours.contentManager.Fields.title\" defaultMessage=\"Fields\" />\n <Step.Content\n id=\"tours.contentManager.Fields.content\"\n defaultMessage=\"Add content to the fields created in the Content-Type Builder.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Publish',\n content: (Step) => (\n <Step.Root side=\"left\" align=\"center\" sideOffset={20}>\n <Step.Title id=\"tours.contentManager.Publish.title\" defaultMessage=\"Publish\" />\n <Step.Content\n id=\"tours.contentManager.Publish.content\"\n defaultMessage=\"Publish entries to make their content available through the Document Service API.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'Finish',\n content: (Step) => (\n <Step.Root side=\"right\" sideOffset={32}>\n <Step.Title\n id=\"tours.contentManager.FinalStep.title\"\n defaultMessage=\"It’s time to create API Tokens!\"\n />\n <Step.Content\n id=\"tours.contentManager.FinalStep.content\"\n defaultMessage=\"Now that you’ve created and published content, time to create API tokens and set up permissions.\"\n />\n <Step.Actions showStepCount={false} to=\"/settings/api-tokens\" />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateContent'),\n },\n ]),\n apiTokens: createTour('apiTokens', [\n {\n name: 'Introduction',\n content: (Step) => (\n <Step.Root sideOffset={-36}>\n <Step.Title id=\"tours.apiTokens.Introduction.title\" defaultMessage=\"API tokens\" />\n <Step.Content\n id=\"tours.apiTokens.Introduction.content\"\n defaultMessage=\"Create and manage API tokens with highly customizable permissions.\"\n />\n <Step.Actions showSkip />\n </Step.Root>\n ),\n when: (completedActions) => !completedActions.includes('didCreateApiToken'),\n },\n {\n name: 'CreateAnAPIToken',\n content: (Step) => (\n <Step.Root side=\"bottom\" sideOffset={20} align=\"end\">\n <Step.Title\n id=\"tours.apiTokens.CreateAnAPIToken.title\"\n defaultMessage=\"Create an API token\"\n />\n <Step.Content\n id=\"tours.apiTokens.CreateAnAPIToken.content\"\n defaultMessage=\"Create a new API token. Choose a name, duration and type.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n },\n {\n name: 'CopyAPIToken',\n content: (Step) => (\n <Step.Root side=\"bottom\" align=\"start\">\n <Step.Title\n id=\"tours.apiTokens.CopyAPIToken.title\"\n defaultMessage=\"Copy your new API token\"\n />\n <Step.Content\n id=\"tours.apiTokens.CopyAPIToken.content\"\n defaultMessage=\"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.\"\n />\n <Step.Actions />\n </Step.Root>\n ),\n when: (completedActions) => completedActions.includes('didCreateApiToken'),\n },\n {\n name: 'Finish',\n content: (Step) => {\n const dispatch = unstableUseGuidedTour('GuidedTourPopover', (s) => s.dispatch);\n return (\n <Step.Root side=\"right\" align=\"start\" sideOffset={32}>\n <Step.Title\n id=\"tours.apiTokens.FinalStep.title\"\n defaultMessage=\"It’s time to deploy your application!\"\n />\n <Step.Content\n id=\"tours.apiTokens.FinalStep.content\"\n defaultMessage=\"Your application is ready to be deployed and its content to be shared with the world!\"\n />\n <Step.Actions showStepCount={false}>\n <Flex justifyContent=\"end\" width={'100%'}>\n <LinkButton\n onClick={() => {\n dispatch({ type: 'next_step', payload: 'apiTokens' });\n }}\n tag={NavLink}\n to=\"/\"\n >\n <FormattedMessage id=\"tours.gotIt\" defaultMessage=\"Got it\" />\n </LinkButton>\n </Flex>\n </Step.Actions>\n </Step.Root>\n );\n },\n when: (completedActions) => completedActions.includes('didCopyApiToken'),\n },\n ]),\n strapiCloud: createTour('strapiCloud', []),\n} as const;\n\ntype Tours = typeof tours;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourTooltip\n * -----------------------------------------------------------------------------------------------*/\n\ntype Content = (\n Step: Step,\n {\n state,\n dispatch,\n }: {\n state: State;\n dispatch: React.Dispatch<Action>;\n }\n) => React.ReactNode;\n\ntype GuidedTourTooltipProps = {\n children: React.ReactNode;\n content: Content;\n tourName: ValidTourName;\n step: number;\n when?: (completedActions: ExtendedCompletedActions) => boolean;\n};\n\nconst UnstableGuidedTourTooltip = ({ children, ...props }: GuidedTourTooltipProps) => {\n const state = unstableUseGuidedTour('TooltipWrapper', (s) => s.state);\n const hasFutureFlag = window.strapi.future.isEnabled('unstableGuidedTour');\n\n if (!state.enabled) {\n return <>{children}</>;\n }\n\n if (!hasFutureFlag) {\n return <>{children}</>;\n }\n\n return <GuidedTourTooltipImpl {...props}>{children}</GuidedTourTooltipImpl>;\n};\n\nconst GuidedTourOverlay = styled(Box)`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(50, 50, 77, 0.2);\n z-index: 10;\n`;\n\nconst GuidedTourTooltipImpl = ({\n children,\n content,\n tourName,\n step,\n when,\n}: GuidedTourTooltipProps) => {\n const { data: guidedTourMeta } = useGetGuidedTourMetaQuery();\n\n const state = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.state);\n const dispatch = unstableUseGuidedTour('UnstableGuidedTourTooltip', (s) => s.dispatch);\n\n const isCurrentStep = state.tours[tourName].currentStep === step;\n const isStepConditionMet = when ? when(state.completedActions) : true;\n const isPopoverOpen =\n guidedTourMeta?.data?.isFirstSuperAdminUser &&\n !state.tours[tourName].isCompleted &&\n isCurrentStep &&\n isStepConditionMet;\n\n // Lock the scroll\n React.useEffect(() => {\n if (!isPopoverOpen) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.body.style.overflow = originalStyle;\n };\n }, [isPopoverOpen]);\n\n // TODO: This isn't great but the only solution for syncing the completed actions\n React.useEffect(() => {\n dispatch({\n type: 'set_completed_actions',\n payload: guidedTourMeta?.data?.completedActions ?? [],\n });\n }, [dispatch, guidedTourMeta?.data?.completedActions]);\n\n const Step = React.useMemo(() => createStepComponents(tourName), [tourName]);\n\n return (\n <>\n {isPopoverOpen && (\n <Portal>\n <GuidedTourOverlay />\n </Portal>\n )}\n <Popover.Root open={isPopoverOpen}>\n <Popover.Anchor>{children}</Popover.Anchor>\n {content(Step, { state, dispatch })}\n </Popover.Root>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Tour factory\n * -----------------------------------------------------------------------------------------------*/\n\ntype TourStep<P extends string> = {\n name: P;\n content: Content;\n when?: (completedActions: ExtendedCompletedActions) => boolean;\n};\n\nfunction createTour<const T extends ReadonlyArray<TourStep<string>>>(tourName: string, steps: T) {\n type Components = {\n [K in T[number]['name']]: React.ComponentType<{ children: React.ReactNode }>;\n };\n\n const tour = steps.reduce((acc, step, index) => {\n if (step.name in acc) {\n throw Error(`The tour: ${tourName} with step: ${step.name} has already been registered`);\n }\n\n acc[step.name as keyof Components] = ({ children }: { children: React.ReactNode }) => {\n return (\n <UnstableGuidedTourTooltip\n tourName={tourName as ValidTourName}\n step={index}\n content={step.content}\n when={step.when}\n >\n {children}\n </UnstableGuidedTourTooltip>\n );\n };\n\n return acc;\n }, {} as Components);\n\n return tour;\n}\n\nexport type { Content, Tours };\nexport { tours };\n"],"names":["tours","contentTypeBuilder","createTour","name","content","Step","_jsxs","Root","side","_jsx","Title","id","defaultMessage","Content","Actions","showSkip","sideOffset","showStepCount","to","when","completedActions","includes","contentManager","align","apiTokens","dispatch","unstableUseGuidedTour","s","Flex","justifyContent","width","LinkButton","onClick","type","payload","tag","NavLink","FormattedMessage","strapiCloud","UnstableGuidedTourTooltip","children","props","state","hasFutureFlag","window","strapi","future","isEnabled","enabled","_Fragment","GuidedTourTooltipImpl","GuidedTourOverlay","styled","Box","tourName","step","data","guidedTourMeta","useGetGuidedTourMetaQuery","isCurrentStep","currentStep","isStepConditionMet","isPopoverOpen","isFirstSuperAdminUser","isCompleted","React","useEffect","originalStyle","getComputedStyle","document","body","overflow","style","useMemo","createStepComponents","Portal","Popover","open","Anchor","steps","tour","reduce","acc","index","Error"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
+ var designSystem = require('@strapi/design-system');
6
+ var styled = require('styled-components');
7
+ var users = require('../utils/users.js');
8
+
9
+ /* -------------------------------------------------------------------------------------------------
10
+ * ProfileWidget
11
+ * -----------------------------------------------------------------------------------------------*/ const DisplayNameTypography = styled.styled(designSystem.Typography)`
12
+ font-size: 2.4rem;
13
+ `;
14
+ const ProfileWidget = ()=>{
15
+ const user = strapiAdmin.useAuth('User', (state)=>state.user);
16
+ const userDisplayName = users.getDisplayName(user);
17
+ const initials = users.getInitials(user);
18
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
19
+ direction: "column",
20
+ gap: 3,
21
+ height: "100%",
22
+ justifyContent: "center",
23
+ children: [
24
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Avatar.Item, {
25
+ delayMs: 0,
26
+ fallback: initials
27
+ }),
28
+ userDisplayName && /*#__PURE__*/ jsxRuntime.jsx(DisplayNameTypography, {
29
+ fontWeight: "bold",
30
+ textTransform: "none",
31
+ textAlign: "center",
32
+ children: userDisplayName
33
+ }),
34
+ user?.email && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
35
+ variant: "omega",
36
+ textColor: "neutral600",
37
+ children: user?.email
38
+ }),
39
+ user?.roles?.length && /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
40
+ marginTop: 2,
41
+ gap: 1,
42
+ wrap: "wrap",
43
+ children: user?.roles?.map((role)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Badge, {
44
+ children: role.name
45
+ }, role.id))
46
+ })
47
+ ]
48
+ });
49
+ };
50
+
51
+ exports.ProfileWidget = ProfileWidget;
52
+ //# sourceMappingURL=Widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Flex, Typography } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { getDisplayName, getInitials } from '../utils/users';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport { ProfileWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id"],"mappings":";;;;;;;;AAMA;;AAEkG,qGAElG,MAAMA,qBAAAA,GAAwBC,aAAOC,CAAAA,uBAAAA,CAAW;;AAEhD,CAAC;AAED,MAAMC,aAAgB,GAAA,IAAA;AACpB,IAAA,MAAMC,OAAOC,mBAAQ,CAAA,MAAA,EAAQ,CAACC,KAAAA,GAAUA,MAAMF,IAAI,CAAA;AAClD,IAAA,MAAMG,kBAAkBC,oBAAeJ,CAAAA,IAAAA,CAAAA;AACvC,IAAA,MAAMK,WAAWC,iBAAYN,CAAAA,IAAAA,CAAAA;AAE7B,IAAA,qBACEO,eAACC,CAAAA,iBAAAA,EAAAA;QAAKC,SAAU,EAAA,QAAA;QAASC,GAAK,EAAA,CAAA;QAAGC,MAAO,EAAA,MAAA;QAAOC,cAAe,EAAA,QAAA;;AAC5D,0BAAAC,cAAA,CAACC,oBAAOC,IAAI,EAAA;gBAACC,OAAS,EAAA,CAAA;gBAAGC,QAAUZ,EAAAA;;AAClCF,YAAAA,eAAAA,kBACCU,cAACjB,CAAAA,qBAAAA,EAAAA;gBAAsBsB,UAAW,EAAA,MAAA;gBAAOC,aAAc,EAAA,MAAA;gBAAOC,SAAU,EAAA,QAAA;AACrEjB,gBAAAA,QAAAA,EAAAA;;AAGJH,YAAAA,IAAAA,EAAMqB,uBACLR,cAACf,CAAAA,uBAAAA,EAAAA;gBAAWwB,OAAQ,EAAA,OAAA;gBAAQC,SAAU,EAAA,YAAA;0BACnCvB,IAAMqB,EAAAA;;YAGVrB,IAAMwB,EAAAA,KAAAA,EAAOC,wBACZZ,cAACL,CAAAA,iBAAAA,EAAAA;gBAAKkB,SAAW,EAAA,CAAA;gBAAGhB,GAAK,EAAA,CAAA;gBAAGiB,IAAK,EAAA,MAAA;AAC9B3B,gBAAAA,QAAAA,EAAAA,IAAAA,EAAMwB,KAAOI,EAAAA,GAAAA,CAAI,CAACC,IAAAA,iBAAShB,cAACiB,CAAAA,kBAAAA,EAAAA;AAAqBD,wBAAAA,QAAAA,EAAAA,IAAAA,CAAKE;AAAfF,qBAAAA,EAAAA,IAAAA,CAAKG,EAAE,CAAA;;;;AAKzD;;;;"}
@@ -0,0 +1,50 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useAuth } from '@strapi/admin/strapi-admin';
3
+ import { Typography, Flex, Avatar, Badge } from '@strapi/design-system';
4
+ import { styled } from 'styled-components';
5
+ import { getInitials, getDisplayName } from '../utils/users.mjs';
6
+
7
+ /* -------------------------------------------------------------------------------------------------
8
+ * ProfileWidget
9
+ * -----------------------------------------------------------------------------------------------*/ const DisplayNameTypography = styled(Typography)`
10
+ font-size: 2.4rem;
11
+ `;
12
+ const ProfileWidget = ()=>{
13
+ const user = useAuth('User', (state)=>state.user);
14
+ const userDisplayName = getDisplayName(user);
15
+ const initials = getInitials(user);
16
+ return /*#__PURE__*/ jsxs(Flex, {
17
+ direction: "column",
18
+ gap: 3,
19
+ height: "100%",
20
+ justifyContent: "center",
21
+ children: [
22
+ /*#__PURE__*/ jsx(Avatar.Item, {
23
+ delayMs: 0,
24
+ fallback: initials
25
+ }),
26
+ userDisplayName && /*#__PURE__*/ jsx(DisplayNameTypography, {
27
+ fontWeight: "bold",
28
+ textTransform: "none",
29
+ textAlign: "center",
30
+ children: userDisplayName
31
+ }),
32
+ user?.email && /*#__PURE__*/ jsx(Typography, {
33
+ variant: "omega",
34
+ textColor: "neutral600",
35
+ children: user?.email
36
+ }),
37
+ user?.roles?.length && /*#__PURE__*/ jsx(Flex, {
38
+ marginTop: 2,
39
+ gap: 1,
40
+ wrap: "wrap",
41
+ children: user?.roles?.map((role)=>/*#__PURE__*/ jsx(Badge, {
42
+ children: role.name
43
+ }, role.id))
44
+ })
45
+ ]
46
+ });
47
+ };
48
+
49
+ export { ProfileWidget };
50
+ //# sourceMappingURL=Widgets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Flex, Typography } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { getDisplayName, getInitials } from '../utils/users';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport { ProfileWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id"],"mappings":";;;;;;AAMA;;AAEkG,qGAElG,MAAMA,qBAAAA,GAAwBC,MAAOC,CAAAA,UAAAA,CAAW;;AAEhD,CAAC;AAED,MAAMC,aAAgB,GAAA,IAAA;AACpB,IAAA,MAAMC,OAAOC,OAAQ,CAAA,MAAA,EAAQ,CAACC,KAAAA,GAAUA,MAAMF,IAAI,CAAA;AAClD,IAAA,MAAMG,kBAAkBC,cAAeJ,CAAAA,IAAAA,CAAAA;AACvC,IAAA,MAAMK,WAAWC,WAAYN,CAAAA,IAAAA,CAAAA;AAE7B,IAAA,qBACEO,IAACC,CAAAA,IAAAA,EAAAA;QAAKC,SAAU,EAAA,QAAA;QAASC,GAAK,EAAA,CAAA;QAAGC,MAAO,EAAA,MAAA;QAAOC,cAAe,EAAA,QAAA;;AAC5D,0BAAAC,GAAA,CAACC,OAAOC,IAAI,EAAA;gBAACC,OAAS,EAAA,CAAA;gBAAGC,QAAUZ,EAAAA;;AAClCF,YAAAA,eAAAA,kBACCU,GAACjB,CAAAA,qBAAAA,EAAAA;gBAAsBsB,UAAW,EAAA,MAAA;gBAAOC,aAAc,EAAA,MAAA;gBAAOC,SAAU,EAAA,QAAA;AACrEjB,gBAAAA,QAAAA,EAAAA;;AAGJH,YAAAA,IAAAA,EAAMqB,uBACLR,GAACf,CAAAA,UAAAA,EAAAA;gBAAWwB,OAAQ,EAAA,OAAA;gBAAQC,SAAU,EAAA,YAAA;0BACnCvB,IAAMqB,EAAAA;;YAGVrB,IAAMwB,EAAAA,KAAAA,EAAOC,wBACZZ,GAACL,CAAAA,IAAAA,EAAAA;gBAAKkB,SAAW,EAAA,CAAA;gBAAGhB,GAAK,EAAA,CAAA;gBAAGiB,IAAK,EAAA,MAAA;AAC9B3B,gBAAAA,QAAAA,EAAAA,IAAAA,EAAMwB,KAAOI,EAAAA,GAAAA,CAAI,CAACC,IAAAA,iBAAShB,GAACiB,CAAAA,KAAAA,EAAAA;AAAqBD,wBAAAA,QAAAA,EAAAA,IAAAA,CAAKE;AAAfF,qBAAAA,EAAAA,IAAAA,CAAKG,EAAE,CAAA;;;;AAKzD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.js","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Permission[];\n};\n\ntype Widget = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\nclass Widgets {\n widgets: Record<string, Widget>;\n\n constructor() {\n this.widgets = {};\n }\n\n register = (widget: WidgetArgs | WidgetArgs[]) => {\n if (Array.isArray(widget)) {\n widget.forEach((newWidget) => {\n this.register(newWidget);\n });\n } else {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n\n // Replace id and pluginId with computed uid\n const { id, pluginId, ...widgetToStore } = widget;\n const uid: WidgetUID = pluginId ? `plugin::${pluginId}.${id}` : `global::${id}`;\n\n this.widgets[uid] = { ...widgetToStore, uid };\n }\n };\n\n getAll = () => {\n return Object.values(this.widgets);\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, Widget };\n"],"names":["Widgets","constructor","register","widget","Array","isArray","forEach","newWidget","invariant","id","component","title","icon","pluginId","widgetToStore","uid","widgets","getAll","Object","values"],"mappings":";;;;AA+BA,MAAMA,OAAAA,CAAAA;IAGJC,WAAc,EAAA;AAIdC,QAAAA,IAAAA,CAAAA,QAAAA,GAAW,CAACC,MAAAA,GAAAA;YACV,IAAIC,KAAAA,CAAMC,OAAO,CAACF,MAAS,CAAA,EAAA;gBACzBA,MAAOG,CAAAA,OAAO,CAAC,CAACC,SAAAA,GAAAA;oBACd,IAAI,CAACL,QAAQ,CAACK,SAAAA,CAAAA;AAChB,iBAAA,CAAA;aACK,MAAA;gBACLC,SAAUL,CAAAA,MAAAA,CAAOM,EAAE,EAAE,wBAAA,CAAA;gBACrBD,SAAUL,CAAAA,MAAAA,CAAOO,SAAS,EAAE,8BAAA,CAAA;gBAC5BF,SAAUL,CAAAA,MAAAA,CAAOQ,KAAK,EAAE,0BAAA,CAAA;gBACxBH,SAAUL,CAAAA,MAAAA,CAAOS,IAAI,EAAE,0BAAA,CAAA;;AAGvB,gBAAA,MAAM,EAAEH,EAAE,EAAEI,QAAQ,EAAE,GAAGC,eAAe,GAAGX,MAAAA;AAC3C,gBAAA,MAAMY,GAAiBF,GAAAA,QAAAA,GAAW,CAAC,QAAQ,EAAEA,QAAS,CAAA,CAAC,EAAEJ,EAAAA,CAAG,CAAC,GAAG,CAAC,QAAQ,EAAEA,GAAG,CAAC;AAE/E,gBAAA,IAAI,CAACO,OAAO,CAACD,GAAAA,CAAI,GAAG;AAAE,oBAAA,GAAGD,aAAa;AAAEC,oBAAAA;AAAI,iBAAA;AAC9C;AACF,SAAA;aAEAE,MAAS,GAAA,IAAA;AACP,YAAA,OAAOC,MAAOC,CAAAA,MAAM,CAAC,IAAI,CAACH,OAAO,CAAA;AACnC,SAAA;QAxBE,IAAI,CAACA,OAAO,GAAG,EAAC;AAClB;AAwBF;;;;"}
1
+ {"version":3,"file":"Widgets.js","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>;\n};\n\ntype Widget = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\nclass Widgets {\n widgets: Record<string, Widget>;\n\n constructor() {\n this.widgets = {};\n }\n\n register = (widget: WidgetArgs | WidgetArgs[]) => {\n if (Array.isArray(widget)) {\n widget.forEach((newWidget) => {\n this.register(newWidget);\n });\n } else {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n\n // Replace id and pluginId with computed uid\n const { id, pluginId, ...widgetToStore } = widget;\n const uid: WidgetUID = pluginId ? `plugin::${pluginId}.${id}` : `global::${id}`;\n\n this.widgets[uid] = { ...widgetToStore, uid };\n }\n };\n\n getAll = () => {\n return Object.values(this.widgets);\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, Widget };\n"],"names":["Widgets","constructor","register","widget","Array","isArray","forEach","newWidget","invariant","id","component","title","icon","pluginId","widgetToStore","uid","widgets","getAll","Object","values"],"mappings":";;;;AA+BA,MAAMA,OAAAA,CAAAA;IAGJC,WAAc,EAAA;AAIdC,QAAAA,IAAAA,CAAAA,QAAAA,GAAW,CAACC,MAAAA,GAAAA;YACV,IAAIC,KAAAA,CAAMC,OAAO,CAACF,MAAS,CAAA,EAAA;gBACzBA,MAAOG,CAAAA,OAAO,CAAC,CAACC,SAAAA,GAAAA;oBACd,IAAI,CAACL,QAAQ,CAACK,SAAAA,CAAAA;AAChB,iBAAA,CAAA;aACK,MAAA;gBACLC,SAAUL,CAAAA,MAAAA,CAAOM,EAAE,EAAE,wBAAA,CAAA;gBACrBD,SAAUL,CAAAA,MAAAA,CAAOO,SAAS,EAAE,8BAAA,CAAA;gBAC5BF,SAAUL,CAAAA,MAAAA,CAAOQ,KAAK,EAAE,0BAAA,CAAA;gBACxBH,SAAUL,CAAAA,MAAAA,CAAOS,IAAI,EAAE,0BAAA,CAAA;;AAGvB,gBAAA,MAAM,EAAEH,EAAE,EAAEI,QAAQ,EAAE,GAAGC,eAAe,GAAGX,MAAAA;AAC3C,gBAAA,MAAMY,GAAiBF,GAAAA,QAAAA,GAAW,CAAC,QAAQ,EAAEA,QAAS,CAAA,CAAC,EAAEJ,EAAAA,CAAG,CAAC,GAAG,CAAC,QAAQ,EAAEA,GAAG,CAAC;AAE/E,gBAAA,IAAI,CAACO,OAAO,CAACD,GAAAA,CAAI,GAAG;AAAE,oBAAA,GAAGD,aAAa;AAAEC,oBAAAA;AAAI,iBAAA;AAC9C;AACF,SAAA;aAEAE,MAAS,GAAA,IAAA;AACP,YAAA,OAAOC,MAAOC,CAAAA,MAAM,CAAC,IAAI,CAACH,OAAO,CAAA;AACnC,SAAA;QAxBE,IAAI,CAACA,OAAO,GAAG,EAAC;AAClB;AAwBF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.mjs","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Permission[];\n};\n\ntype Widget = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\nclass Widgets {\n widgets: Record<string, Widget>;\n\n constructor() {\n this.widgets = {};\n }\n\n register = (widget: WidgetArgs | WidgetArgs[]) => {\n if (Array.isArray(widget)) {\n widget.forEach((newWidget) => {\n this.register(newWidget);\n });\n } else {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n\n // Replace id and pluginId with computed uid\n const { id, pluginId, ...widgetToStore } = widget;\n const uid: WidgetUID = pluginId ? `plugin::${pluginId}.${id}` : `global::${id}`;\n\n this.widgets[uid] = { ...widgetToStore, uid };\n }\n };\n\n getAll = () => {\n return Object.values(this.widgets);\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, Widget };\n"],"names":["Widgets","constructor","register","widget","Array","isArray","forEach","newWidget","invariant","id","component","title","icon","pluginId","widgetToStore","uid","widgets","getAll","Object","values"],"mappings":";;AA+BA,MAAMA,OAAAA,CAAAA;IAGJC,WAAc,EAAA;AAIdC,QAAAA,IAAAA,CAAAA,QAAAA,GAAW,CAACC,MAAAA,GAAAA;YACV,IAAIC,KAAAA,CAAMC,OAAO,CAACF,MAAS,CAAA,EAAA;gBACzBA,MAAOG,CAAAA,OAAO,CAAC,CAACC,SAAAA,GAAAA;oBACd,IAAI,CAACL,QAAQ,CAACK,SAAAA,CAAAA;AAChB,iBAAA,CAAA;aACK,MAAA;gBACLC,SAAUL,CAAAA,MAAAA,CAAOM,EAAE,EAAE,wBAAA,CAAA;gBACrBD,SAAUL,CAAAA,MAAAA,CAAOO,SAAS,EAAE,8BAAA,CAAA;gBAC5BF,SAAUL,CAAAA,MAAAA,CAAOQ,KAAK,EAAE,0BAAA,CAAA;gBACxBH,SAAUL,CAAAA,MAAAA,CAAOS,IAAI,EAAE,0BAAA,CAAA;;AAGvB,gBAAA,MAAM,EAAEH,EAAE,EAAEI,QAAQ,EAAE,GAAGC,eAAe,GAAGX,MAAAA;AAC3C,gBAAA,MAAMY,GAAiBF,GAAAA,QAAAA,GAAW,CAAC,QAAQ,EAAEA,QAAS,CAAA,CAAC,EAAEJ,EAAAA,CAAG,CAAC,GAAG,CAAC,QAAQ,EAAEA,GAAG,CAAC;AAE/E,gBAAA,IAAI,CAACO,OAAO,CAACD,GAAAA,CAAI,GAAG;AAAE,oBAAA,GAAGD,aAAa;AAAEC,oBAAAA;AAAI,iBAAA;AAC9C;AACF,SAAA;aAEAE,MAAS,GAAA,IAAA;AACP,YAAA,OAAOC,MAAOC,CAAAA,MAAM,CAAC,IAAI,CAACH,OAAO,CAAA;AACnC,SAAA;QAxBE,IAAI,CAACA,OAAO,GAAG,EAAC;AAClB;AAwBF;;;;"}
1
+ {"version":3,"file":"Widgets.mjs","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>;\n};\n\ntype Widget = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\nclass Widgets {\n widgets: Record<string, Widget>;\n\n constructor() {\n this.widgets = {};\n }\n\n register = (widget: WidgetArgs | WidgetArgs[]) => {\n if (Array.isArray(widget)) {\n widget.forEach((newWidget) => {\n this.register(newWidget);\n });\n } else {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n\n // Replace id and pluginId with computed uid\n const { id, pluginId, ...widgetToStore } = widget;\n const uid: WidgetUID = pluginId ? `plugin::${pluginId}.${id}` : `global::${id}`;\n\n this.widgets[uid] = { ...widgetToStore, uid };\n }\n };\n\n getAll = () => {\n return Object.values(this.widgets);\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, Widget };\n"],"names":["Widgets","constructor","register","widget","Array","isArray","forEach","newWidget","invariant","id","component","title","icon","pluginId","widgetToStore","uid","widgets","getAll","Object","values"],"mappings":";;AA+BA,MAAMA,OAAAA,CAAAA;IAGJC,WAAc,EAAA;AAIdC,QAAAA,IAAAA,CAAAA,QAAAA,GAAW,CAACC,MAAAA,GAAAA;YACV,IAAIC,KAAAA,CAAMC,OAAO,CAACF,MAAS,CAAA,EAAA;gBACzBA,MAAOG,CAAAA,OAAO,CAAC,CAACC,SAAAA,GAAAA;oBACd,IAAI,CAACL,QAAQ,CAACK,SAAAA,CAAAA;AAChB,iBAAA,CAAA;aACK,MAAA;gBACLC,SAAUL,CAAAA,MAAAA,CAAOM,EAAE,EAAE,wBAAA,CAAA;gBACrBD,SAAUL,CAAAA,MAAAA,CAAOO,SAAS,EAAE,8BAAA,CAAA;gBAC5BF,SAAUL,CAAAA,MAAAA,CAAOQ,KAAK,EAAE,0BAAA,CAAA;gBACxBH,SAAUL,CAAAA,MAAAA,CAAOS,IAAI,EAAE,0BAAA,CAAA;;AAGvB,gBAAA,MAAM,EAAEH,EAAE,EAAEI,QAAQ,EAAE,GAAGC,eAAe,GAAGX,MAAAA;AAC3C,gBAAA,MAAMY,GAAiBF,GAAAA,QAAAA,GAAW,CAAC,QAAQ,EAAEA,QAAS,CAAA,CAAC,EAAEJ,EAAAA,CAAG,CAAC,GAAG,CAAC,QAAQ,EAAEA,GAAG,CAAC;AAE/E,gBAAA,IAAI,CAACO,OAAO,CAACD,GAAAA,CAAI,GAAG;AAAE,oBAAA,GAAGD,aAAa;AAAEC,oBAAAA;AAAI,iBAAA;AAC9C;AACF,SAAA;aAEAE,MAAS,GAAA,IAAA;AACP,YAAA,OAAOC,MAAOC,CAAAA,MAAM,CAAC,IAAI,CAACH,OAAO,CAAA;AACnC,SAAA;QAxBE,IAAI,CAACA,OAAO,GAAG,EAAC;AAClB;AAwBF;;;;"}