@strapi/plugin-users-permissions 5.0.0-beta.0 → 5.0.0-beta.2

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 (75) hide show
  1. package/admin/src/pages/AdvancedSettings/index.jsx +4 -4
  2. package/admin/src/pages/EmailTemplates/index.jsx +3 -4
  3. package/admin/src/pages/Providers/index.jsx +3 -4
  4. package/admin/src/pages/Roles/pages/CreatePage.jsx +3 -4
  5. package/admin/src/pages/Roles/pages/EditPage.jsx +3 -4
  6. package/admin/src/pages/Roles/pages/ListPage/index.jsx +3 -4
  7. package/dist/_chunks/{index-YtsLdO8d.js → index-EzbUy3No.js} +10 -10
  8. package/dist/_chunks/{index-YtsLdO8d.js.map → index-EzbUy3No.js.map} +1 -1
  9. package/dist/_chunks/{index-eH8XAk_H.mjs → index-LsKlxP6S.mjs} +14 -30
  10. package/dist/_chunks/index-LsKlxP6S.mjs.map +1 -0
  11. package/dist/_chunks/{index-nKbtq7R-.js → index-NoTh1v48.js} +11 -17
  12. package/dist/_chunks/index-NoTh1v48.js.map +1 -0
  13. package/dist/_chunks/index-PCKQWB49-i9LmKIQp.mjs +10311 -0
  14. package/dist/_chunks/index-PCKQWB49-i9LmKIQp.mjs.map +1 -0
  15. package/dist/_chunks/index-PCKQWB49-mqonSm6K.js +10335 -0
  16. package/dist/_chunks/index-PCKQWB49-mqonSm6K.js.map +1 -0
  17. package/dist/_chunks/{index-AT8MwqgE.js → index-T3jMrI6s.js} +16 -22
  18. package/dist/_chunks/index-T3jMrI6s.js.map +1 -0
  19. package/dist/_chunks/{index-cC7LGLsK.mjs → index-a65O1P4_.mjs} +9 -15
  20. package/dist/_chunks/index-a65O1P4_.mjs.map +1 -0
  21. package/dist/_chunks/{index-Omcy-t4F.js → index-joJkJUWj.js} +21 -37
  22. package/dist/_chunks/index-joJkJUWj.js.map +1 -0
  23. package/dist/_chunks/{index-i1lZHF3N.mjs → index-roTH2zy3.mjs} +10 -16
  24. package/dist/_chunks/index-roTH2zy3.mjs.map +1 -0
  25. package/dist/_chunks/{index-deaP9rgn.js → index-se17lxmu.js} +13 -19
  26. package/dist/_chunks/index-se17lxmu.js.map +1 -0
  27. package/dist/_chunks/{index-OPfJFEYD.mjs → index-wRXHhHPH.mjs} +10 -16
  28. package/dist/_chunks/index-wRXHhHPH.mjs.map +1 -0
  29. package/dist/_chunks/{index-VQ3uu7FR.mjs → index-yRndCUAV.mjs} +10 -10
  30. package/dist/_chunks/{index-VQ3uu7FR.mjs.map → index-yRndCUAV.mjs.map} +1 -1
  31. package/dist/admin/index.js +1 -1
  32. package/dist/admin/index.mjs +1 -1
  33. package/package.json +6 -6
  34. package/server/controllers/auth.js +1 -2
  35. package/server/controllers/user.js +3 -4
  36. package/server/services/user.js +3 -3
  37. package/server/services/users-permissions.js +3 -3
  38. package/server/utils/sanitize/sanitizers.js +5 -1
  39. package/dist/_chunks/EditViewPage-1NY3YGcc-PZo-tzC4.mjs +0 -84382
  40. package/dist/_chunks/EditViewPage-1NY3YGcc-PZo-tzC4.mjs.map +0 -1
  41. package/dist/_chunks/EditViewPage-1NY3YGcc-l5uN1p3e.js +0 -84410
  42. package/dist/_chunks/EditViewPage-1NY3YGcc-l5uN1p3e.js.map +0 -1
  43. package/dist/_chunks/Helmet-En-SEnNC.mjs +0 -1008
  44. package/dist/_chunks/Helmet-En-SEnNC.mjs.map +0 -1
  45. package/dist/_chunks/Helmet-d9JljxUo.js +0 -1010
  46. package/dist/_chunks/Helmet-d9JljxUo.js.map +0 -1
  47. package/dist/_chunks/ListViewPage-rkQXnquk-LJPTb3bJ.mjs +0 -1571
  48. package/dist/_chunks/ListViewPage-rkQXnquk-LJPTb3bJ.mjs.map +0 -1
  49. package/dist/_chunks/ListViewPage-rkQXnquk-rBwGjRm0.js +0 -1595
  50. package/dist/_chunks/ListViewPage-rkQXnquk-rBwGjRm0.js.map +0 -1
  51. package/dist/_chunks/ReviewWorkflowsColumn-m0_IsejA-8zmlk45y.js +0 -33
  52. package/dist/_chunks/ReviewWorkflowsColumn-m0_IsejA-8zmlk45y.js.map +0 -1
  53. package/dist/_chunks/ReviewWorkflowsColumn-m0_IsejA-vbOQ9Ruh.mjs +0 -33
  54. package/dist/_chunks/ReviewWorkflowsColumn-m0_IsejA-vbOQ9Ruh.mjs.map +0 -1
  55. package/dist/_chunks/constants--j5MCV5y-TtrVffUD.js +0 -209
  56. package/dist/_chunks/constants--j5MCV5y-TtrVffUD.js.map +0 -1
  57. package/dist/_chunks/constants--j5MCV5y-h4BGe6Tp.mjs +0 -190
  58. package/dist/_chunks/constants--j5MCV5y-h4BGe6Tp.mjs.map +0 -1
  59. package/dist/_chunks/index-AT8MwqgE.js.map +0 -1
  60. package/dist/_chunks/index-NzLAHRwx-MeSnW6w9.mjs +0 -16566
  61. package/dist/_chunks/index-NzLAHRwx-MeSnW6w9.mjs.map +0 -1
  62. package/dist/_chunks/index-NzLAHRwx-bcHTdv6V.js +0 -16591
  63. package/dist/_chunks/index-NzLAHRwx-bcHTdv6V.js.map +0 -1
  64. package/dist/_chunks/index-OPfJFEYD.mjs.map +0 -1
  65. package/dist/_chunks/index-Omcy-t4F.js.map +0 -1
  66. package/dist/_chunks/index-cC7LGLsK.mjs.map +0 -1
  67. package/dist/_chunks/index-deaP9rgn.js.map +0 -1
  68. package/dist/_chunks/index-eH8XAk_H.mjs.map +0 -1
  69. package/dist/_chunks/index-i1lZHF3N.mjs.map +0 -1
  70. package/dist/_chunks/index-nKbtq7R-.js.map +0 -1
  71. package/dist/_chunks/useSyncRbac-Od0wrAnD-fP3UP9Sk.mjs +0 -45
  72. package/dist/_chunks/useSyncRbac-Od0wrAnD-fP3UP9Sk.mjs.map +0 -1
  73. package/dist/_chunks/useSyncRbac-Od0wrAnD-mYMbQBry.js +0 -63
  74. package/dist/_chunks/useSyncRbac-Od0wrAnD-mYMbQBry.js.map +0 -1
  75. package/dist/style.css +0 -84
@@ -1,1595 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("react/jsx-runtime");
4
- const React = require("react");
5
- const designSystem = require("@strapi/design-system");
6
- const Icons = require("@strapi/icons");
7
- const isEqual = require("lodash/isEqual");
8
- const indexNzLAHRwx = require("./index-NzLAHRwx-bcHTdv6V.js");
9
- const Helmet = require("./Helmet-d9JljxUo.js");
10
- const reactIntl = require("react-intl");
11
- const reactRouterDom = require("react-router-dom");
12
- const styled = require("styled-components");
13
- const useSyncRbacOd0wrAnD = require("./useSyncRbac-Od0wrAnD-mYMbQBry.js");
14
- const isEmpty = require("lodash/isEmpty");
15
- const toString = require("lodash/toString");
16
- const v2 = require("@strapi/design-system/v2");
17
- const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
18
- function _interopNamespace(e) {
19
- if (e && e.__esModule)
20
- return e;
21
- const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
22
- if (e) {
23
- for (const k in e) {
24
- if (k !== "default") {
25
- const d = Object.getOwnPropertyDescriptor(e, k);
26
- Object.defineProperty(n, k, d.get ? d : {
27
- enumerable: true,
28
- get: () => e[k]
29
- });
30
- }
31
- }
32
- }
33
- n.default = e;
34
- return Object.freeze(n);
35
- }
36
- const React__namespace = /* @__PURE__ */ _interopNamespace(React);
37
- const isEqual__default = /* @__PURE__ */ _interopDefault(isEqual);
38
- const styled__default = /* @__PURE__ */ _interopDefault(styled);
39
- const isEmpty__default = /* @__PURE__ */ _interopDefault(isEmpty);
40
- const toString__default = /* @__PURE__ */ _interopDefault(toString);
41
- function parseISO(argument, options) {
42
- var _options$additionalDi;
43
- indexNzLAHRwx.requiredArgs(1, arguments);
44
- var additionalDigits = indexNzLAHRwx.toInteger((_options$additionalDi = options === null || options === void 0 ? void 0 : options.additionalDigits) !== null && _options$additionalDi !== void 0 ? _options$additionalDi : 2);
45
- if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {
46
- throw new RangeError("additionalDigits must be 0, 1 or 2");
47
- }
48
- if (!(typeof argument === "string" || Object.prototype.toString.call(argument) === "[object String]")) {
49
- return /* @__PURE__ */ new Date(NaN);
50
- }
51
- var dateStrings = splitDateString(argument);
52
- var date;
53
- if (dateStrings.date) {
54
- var parseYearResult = parseYear(dateStrings.date, additionalDigits);
55
- date = parseDate(parseYearResult.restDateString, parseYearResult.year);
56
- }
57
- if (!date || isNaN(date.getTime())) {
58
- return /* @__PURE__ */ new Date(NaN);
59
- }
60
- var timestamp = date.getTime();
61
- var time = 0;
62
- var offset;
63
- if (dateStrings.time) {
64
- time = parseTime(dateStrings.time);
65
- if (isNaN(time)) {
66
- return /* @__PURE__ */ new Date(NaN);
67
- }
68
- }
69
- if (dateStrings.timezone) {
70
- offset = parseTimezone(dateStrings.timezone);
71
- if (isNaN(offset)) {
72
- return /* @__PURE__ */ new Date(NaN);
73
- }
74
- } else {
75
- var dirtyDate = new Date(timestamp + time);
76
- var result = /* @__PURE__ */ new Date(0);
77
- result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate());
78
- result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds());
79
- return result;
80
- }
81
- return new Date(timestamp + time + offset);
82
- }
83
- var patterns = {
84
- dateTimeDelimiter: /[T ]/,
85
- timeZoneDelimiter: /[Z ]/i,
86
- timezone: /([Z+-].*)$/
87
- };
88
- var dateRegex = /^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/;
89
- var timeRegex = /^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/;
90
- var timezoneRegex = /^([+-])(\d{2})(?::?(\d{2}))?$/;
91
- function splitDateString(dateString) {
92
- var dateStrings = {};
93
- var array = dateString.split(patterns.dateTimeDelimiter);
94
- var timeString;
95
- if (array.length > 2) {
96
- return dateStrings;
97
- }
98
- if (/:/.test(array[0])) {
99
- timeString = array[0];
100
- } else {
101
- dateStrings.date = array[0];
102
- timeString = array[1];
103
- if (patterns.timeZoneDelimiter.test(dateStrings.date)) {
104
- dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];
105
- timeString = dateString.substr(dateStrings.date.length, dateString.length);
106
- }
107
- }
108
- if (timeString) {
109
- var token = patterns.timezone.exec(timeString);
110
- if (token) {
111
- dateStrings.time = timeString.replace(token[1], "");
112
- dateStrings.timezone = token[1];
113
- } else {
114
- dateStrings.time = timeString;
115
- }
116
- }
117
- return dateStrings;
118
- }
119
- function parseYear(dateString, additionalDigits) {
120
- var regex = new RegExp("^(?:(\\d{4}|[+-]\\d{" + (4 + additionalDigits) + "})|(\\d{2}|[+-]\\d{" + (2 + additionalDigits) + "})$)");
121
- var captures = dateString.match(regex);
122
- if (!captures)
123
- return {
124
- year: NaN,
125
- restDateString: ""
126
- };
127
- var year = captures[1] ? parseInt(captures[1]) : null;
128
- var century = captures[2] ? parseInt(captures[2]) : null;
129
- return {
130
- year: century === null ? year : century * 100,
131
- restDateString: dateString.slice((captures[1] || captures[2]).length)
132
- };
133
- }
134
- function parseDate(dateString, year) {
135
- if (year === null)
136
- return /* @__PURE__ */ new Date(NaN);
137
- var captures = dateString.match(dateRegex);
138
- if (!captures)
139
- return /* @__PURE__ */ new Date(NaN);
140
- var isWeekDate = !!captures[4];
141
- var dayOfYear = parseDateUnit(captures[1]);
142
- var month = parseDateUnit(captures[2]) - 1;
143
- var day = parseDateUnit(captures[3]);
144
- var week = parseDateUnit(captures[4]);
145
- var dayOfWeek = parseDateUnit(captures[5]) - 1;
146
- if (isWeekDate) {
147
- if (!validateWeekDate(year, week, dayOfWeek)) {
148
- return /* @__PURE__ */ new Date(NaN);
149
- }
150
- return dayOfISOWeekYear(year, week, dayOfWeek);
151
- } else {
152
- var date = /* @__PURE__ */ new Date(0);
153
- if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {
154
- return /* @__PURE__ */ new Date(NaN);
155
- }
156
- date.setUTCFullYear(year, month, Math.max(dayOfYear, day));
157
- return date;
158
- }
159
- }
160
- function parseDateUnit(value) {
161
- return value ? parseInt(value) : 1;
162
- }
163
- function parseTime(timeString) {
164
- var captures = timeString.match(timeRegex);
165
- if (!captures)
166
- return NaN;
167
- var hours = parseTimeUnit(captures[1]);
168
- var minutes = parseTimeUnit(captures[2]);
169
- var seconds = parseTimeUnit(captures[3]);
170
- if (!validateTime(hours, minutes, seconds)) {
171
- return NaN;
172
- }
173
- return hours * indexNzLAHRwx.millisecondsInHour + minutes * indexNzLAHRwx.millisecondsInMinute + seconds * 1e3;
174
- }
175
- function parseTimeUnit(value) {
176
- return value && parseFloat(value.replace(",", ".")) || 0;
177
- }
178
- function parseTimezone(timezoneString) {
179
- if (timezoneString === "Z")
180
- return 0;
181
- var captures = timezoneString.match(timezoneRegex);
182
- if (!captures)
183
- return 0;
184
- var sign = captures[1] === "+" ? -1 : 1;
185
- var hours = parseInt(captures[2]);
186
- var minutes = captures[3] && parseInt(captures[3]) || 0;
187
- if (!validateTimezone(hours, minutes)) {
188
- return NaN;
189
- }
190
- return sign * (hours * indexNzLAHRwx.millisecondsInHour + minutes * indexNzLAHRwx.millisecondsInMinute);
191
- }
192
- function dayOfISOWeekYear(isoWeekYear, week, day) {
193
- var date = /* @__PURE__ */ new Date(0);
194
- date.setUTCFullYear(isoWeekYear, 0, 4);
195
- var fourthOfJanuaryDay = date.getUTCDay() || 7;
196
- var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;
197
- date.setUTCDate(date.getUTCDate() + diff);
198
- return date;
199
- }
200
- var daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
201
- function isLeapYearIndex(year) {
202
- return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;
203
- }
204
- function validateDate(year, month, date) {
205
- return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));
206
- }
207
- function validateDayOfYearDate(year, dayOfYear) {
208
- return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);
209
- }
210
- function validateWeekDate(_year, week, day) {
211
- return week >= 1 && week <= 53 && day >= 0 && day <= 6;
212
- }
213
- function validateTime(hours, minutes, seconds) {
214
- if (hours === 24) {
215
- return minutes === 0 && seconds === 0;
216
- }
217
- return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;
218
- }
219
- function validateTimezone(_hours, minutes) {
220
- return minutes >= 0 && minutes <= 59;
221
- }
222
- const BASE_FILTERS = [
223
- {
224
- label: { id: "components.FilterOptions.FILTER_TYPES.$eq", defaultMessage: "is" },
225
- value: "$eq"
226
- },
227
- {
228
- label: { id: "components.FilterOptions.FILTER_TYPES.$ne", defaultMessage: "is not" },
229
- value: "$ne"
230
- },
231
- {
232
- label: {
233
- id: "components.FilterOptions.FILTER_TYPES.$null",
234
- defaultMessage: "is null"
235
- },
236
- value: "$null"
237
- },
238
- {
239
- label: {
240
- id: "components.FilterOptions.FILTER_TYPES.$notNull",
241
- defaultMessage: "is not null"
242
- },
243
- value: "$notNull"
244
- }
245
- ];
246
- const NUMERIC_FILTERS = [
247
- {
248
- label: {
249
- id: "components.FilterOptions.FILTER_TYPES.$gt",
250
- defaultMessage: "is greater than"
251
- },
252
- value: "$gt"
253
- },
254
- {
255
- label: {
256
- id: "components.FilterOptions.FILTER_TYPES.$gte",
257
- defaultMessage: "is greater than or equal to"
258
- },
259
- value: "$gte"
260
- },
261
- {
262
- label: {
263
- id: "components.FilterOptions.FILTER_TYPES.$lt",
264
- defaultMessage: "is less than"
265
- },
266
- value: "$lt"
267
- },
268
- {
269
- label: {
270
- id: "components.FilterOptions.FILTER_TYPES.$lte",
271
- defaultMessage: "is less than or equal to"
272
- },
273
- value: "$lte"
274
- }
275
- ];
276
- const IS_SENSITIVE_FILTERS = [
277
- {
278
- label: {
279
- id: "components.FilterOptions.FILTER_TYPES.$eqi",
280
- defaultMessage: "is (case insensitive)"
281
- },
282
- value: "$eqi"
283
- },
284
- {
285
- label: {
286
- id: "components.FilterOptions.FILTER_TYPES.$nei",
287
- defaultMessage: "is not (case insensitive)"
288
- },
289
- value: "$nei"
290
- }
291
- ];
292
- const CONTAINS_FILTERS = [
293
- {
294
- label: {
295
- id: "components.FilterOptions.FILTER_TYPES.$contains",
296
- defaultMessage: "contains"
297
- },
298
- value: "$contains"
299
- },
300
- {
301
- label: {
302
- id: "components.FilterOptions.FILTER_TYPES.$containsi",
303
- defaultMessage: "contains (case insensitive)"
304
- },
305
- value: "$containsi"
306
- },
307
- {
308
- label: {
309
- id: "components.FilterOptions.FILTER_TYPES.$notContains",
310
- defaultMessage: "not contains"
311
- },
312
- value: "$notContains"
313
- },
314
- {
315
- label: {
316
- id: "components.FilterOptions.FILTER_TYPES.$notContainsi",
317
- defaultMessage: "not contains (case insensitive)"
318
- },
319
- value: "$notContainsi"
320
- }
321
- ];
322
- const STRING_PARSE_FILTERS = [
323
- {
324
- label: {
325
- id: "components.FilterOptions.FILTER_TYPES.$startsWith",
326
- defaultMessage: "starts with"
327
- },
328
- value: "$startsWith"
329
- },
330
- {
331
- label: {
332
- id: "components.FilterOptions.FILTER_TYPES.$startsWithi",
333
- defaultMessage: "starts with (case insensitive)"
334
- },
335
- value: "$startsWithi"
336
- },
337
- {
338
- label: {
339
- id: "components.FilterOptions.FILTER_TYPES.$endsWith",
340
- defaultMessage: "ends with"
341
- },
342
- value: "$endsWith"
343
- },
344
- {
345
- label: {
346
- id: "components.FilterOptions.FILTER_TYPES.$endsWithi",
347
- defaultMessage: "ends with (case insensitive)"
348
- },
349
- value: "$endsWithi"
350
- }
351
- ];
352
- const [FiltersProvider, useFilters] = indexNzLAHRwx.createContext("Filters");
353
- const Root = ({
354
- children,
355
- disabled = false,
356
- onChange,
357
- onOpenChange,
358
- open: openProp,
359
- defaultOpen,
360
- options = []
361
- }) => {
362
- const [triggerNode, setTriggerNode] = React__namespace.useState(null);
363
- const [open = false, setOpen] = indexNzLAHRwx.useControllableState({
364
- prop: openProp,
365
- defaultProp: defaultOpen,
366
- onChange: onOpenChange
367
- });
368
- const handleChange = (data) => {
369
- if (onChange) {
370
- onChange(data);
371
- }
372
- };
373
- return /* @__PURE__ */ jsxRuntime.jsx(
374
- FiltersProvider,
375
- {
376
- disabled,
377
- onChange: handleChange,
378
- open,
379
- options,
380
- setOpen,
381
- setTriggerNode,
382
- triggerNode,
383
- children
384
- }
385
- );
386
- };
387
- const Trigger = React__namespace.forwardRef(
388
- ({ label }, forwardedRef) => {
389
- const { formatMessage } = reactIntl.useIntl();
390
- const { setTriggerNode, setOpen } = useFilters("Trigger", ({ setTriggerNode: setTriggerNode2, setOpen: setOpen2 }) => ({
391
- setTriggerNode: setTriggerNode2,
392
- setOpen: setOpen2
393
- }));
394
- const disabled = useFilters("Trigger", ({ disabled: disabled2 }) => disabled2);
395
- const open = useFilters("Trigger", ({ open: open2 }) => open2);
396
- const composedRefs = designSystem.useComposedRefs(forwardedRef, setTriggerNode);
397
- const handleClick = () => setOpen(!open);
398
- return /* @__PURE__ */ jsxRuntime.jsx(
399
- designSystem.Button,
400
- {
401
- variant: "tertiary",
402
- ref: composedRefs,
403
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Filter, {}),
404
- onClick: handleClick,
405
- size: "S",
406
- disabled,
407
- children: label || formatMessage({ id: "app.utils.filters", defaultMessage: "Filters" })
408
- }
409
- );
410
- }
411
- );
412
- const PopoverImpl = () => {
413
- const [{ query }, setQuery] = indexNzLAHRwx.useQueryParams();
414
- const { formatMessage } = reactIntl.useIntl();
415
- const open = useFilters("Popover", ({ open: open2 }) => open2);
416
- const options = useFilters("Popover", ({ options: options2 }) => options2);
417
- const triggerNode = useFilters("Popover", ({ triggerNode: triggerNode2 }) => triggerNode2);
418
- const setOpen = useFilters("Popover", ({ setOpen: setOpen2 }) => setOpen2);
419
- const onChange = useFilters("Popover", ({ onChange: onChange2 }) => onChange2);
420
- if (!open || options.length === 0 || !triggerNode) {
421
- return null;
422
- }
423
- const handleSubmit = (data) => {
424
- if (!data.value) {
425
- return;
426
- }
427
- if (onChange) {
428
- onChange(data);
429
- }
430
- const filterType = options.find((filter) => filter.name === data.name).type;
431
- const operatorValuePairing = {
432
- [data.filter]: data.value
433
- };
434
- const newFilterQuery = {
435
- ...query.filters,
436
- $and: [
437
- ...query.filters?.$and ?? [],
438
- {
439
- [data.name]: filterType === "relation" ? {
440
- id: operatorValuePairing
441
- } : operatorValuePairing
442
- }
443
- ]
444
- };
445
- setQuery({ filters: newFilterQuery, page: 1 });
446
- setOpen(false);
447
- };
448
- return /* @__PURE__ */ jsxRuntime.jsx(
449
- designSystem.PopoverPrimitives.Content,
450
- {
451
- source: { current: triggerNode },
452
- onDismiss: () => setOpen(false),
453
- padding: 3,
454
- spacing: 4,
455
- maxHeight: "unset",
456
- children: /* @__PURE__ */ jsxRuntime.jsx(
457
- indexNzLAHRwx.Form,
458
- {
459
- method: "POST",
460
- initialValues: {
461
- name: options[0]?.name,
462
- filter: BASE_FILTERS[0].value
463
- },
464
- onSubmit: handleSubmit,
465
- children: ({ values: formValues, modified, isSubmitting }) => {
466
- const filter = options.find((filter2) => filter2.name === formValues.name);
467
- const Input = filter?.input || indexNzLAHRwx.InputRenderer;
468
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 2, style: { minWidth: 184 }, children: [
469
- [
470
- {
471
- ["aria-label"]: formatMessage({
472
- id: "app.utils.select-field",
473
- defaultMessage: "Select field"
474
- }),
475
- name: "name",
476
- options: options.map((filter2) => ({
477
- label: filter2.label,
478
- value: filter2.name
479
- })),
480
- placholder: formatMessage({
481
- id: "app.utils.select-field",
482
- defaultMessage: "Select field"
483
- }),
484
- type: "enumeration"
485
- },
486
- {
487
- ["aria-label"]: formatMessage({
488
- id: "app.utils.select-filter",
489
- defaultMessage: "Select filter"
490
- }),
491
- name: "filter",
492
- options: filter?.operators || getFilterList(filter).map((opt) => ({
493
- label: formatMessage(opt.label),
494
- value: opt.value
495
- })),
496
- placeholder: formatMessage({
497
- id: "app.utils.select-filter",
498
- defaultMessage: "Select filter"
499
- }),
500
- type: "enumeration"
501
- }
502
- ].map((field) => /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.InputRenderer, { ...field }, field.name)),
503
- filter && formValues.filter && formValues.filter !== "$null" && formValues.filter !== "$notNull" ? /* @__PURE__ */ jsxRuntime.jsx(
504
- Input,
505
- {
506
- ...filter,
507
- label: null,
508
- "aria-label": filter.label,
509
- name: "value",
510
- type: filter.mainField?.type ?? filter.type
511
- }
512
- ) : null,
513
- /* @__PURE__ */ jsxRuntime.jsx(
514
- designSystem.Button,
515
- {
516
- disabled: !modified || isSubmitting,
517
- size: "L",
518
- variant: "secondary",
519
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}),
520
- type: "submit",
521
- fullWidth: true,
522
- children: formatMessage({ id: "app.utils.add-filter", defaultMessage: "Add filter" })
523
- }
524
- )
525
- ] });
526
- }
527
- }
528
- )
529
- }
530
- );
531
- };
532
- const getFilterList = (filter) => {
533
- if (!filter) {
534
- return [];
535
- }
536
- const type = filter.mainField?.type ? filter.mainField.type : filter.type;
537
- switch (type) {
538
- case "email":
539
- case "text":
540
- case "enumeration":
541
- case "string": {
542
- return [
543
- ...BASE_FILTERS,
544
- ...IS_SENSITIVE_FILTERS,
545
- ...CONTAINS_FILTERS,
546
- ...STRING_PARSE_FILTERS
547
- ];
548
- }
549
- case "float":
550
- case "integer":
551
- case "biginteger":
552
- case "decimal": {
553
- return [...BASE_FILTERS, ...NUMERIC_FILTERS];
554
- }
555
- case "time":
556
- case "date": {
557
- return [...BASE_FILTERS, ...NUMERIC_FILTERS, ...CONTAINS_FILTERS];
558
- }
559
- case "datetime": {
560
- return [...BASE_FILTERS, ...NUMERIC_FILTERS];
561
- }
562
- default:
563
- return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS];
564
- }
565
- };
566
- const List = () => {
567
- const [{ query }, setQuery] = indexNzLAHRwx.useQueryParams();
568
- const options = useFilters("List", ({ options: options2 }) => options2);
569
- const handleClick = (data) => {
570
- const nextFilters = (query?.filters?.$and ?? []).filter((filter) => {
571
- const [attributeName] = Object.keys(filter);
572
- if (attributeName !== data.name) {
573
- return true;
574
- }
575
- const { type, mainField } = options.find(({ name }) => name === attributeName);
576
- if (type === "relation") {
577
- const filterObj = filter[attributeName][mainField?.name ?? "id"];
578
- if (typeof filterObj === "object") {
579
- const [operator] = Object.keys(filterObj);
580
- const value = filterObj[operator];
581
- return !(operator === data.filter && value === data.value);
582
- }
583
- return true;
584
- } else {
585
- const filterObj = filter[attributeName];
586
- const [operator] = Object.keys(filterObj);
587
- const value = filterObj[operator];
588
- return !(operator === data.filter && value === data.value);
589
- }
590
- });
591
- setQuery({ filters: { $and: nextFilters }, page: 1 });
592
- };
593
- if (!query?.filters?.$and?.length) {
594
- return null;
595
- }
596
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: query?.filters?.$and?.map((queryFilter) => {
597
- const [attributeName] = Object.keys(queryFilter);
598
- const filter = options.find(({ name }) => name === attributeName);
599
- const filterObj = queryFilter[attributeName];
600
- if (!filter || typeof filterObj !== "object" || filterObj === null) {
601
- return null;
602
- }
603
- if (filter.type === "relation") {
604
- const modelFilter = filterObj[filter.mainField?.name ?? "id"];
605
- if (typeof modelFilter === "object") {
606
- const [operator] = Object.keys(modelFilter);
607
- const value = modelFilter[operator];
608
- return /* @__PURE__ */ jsxRuntime.jsx(
609
- AttributeTag,
610
- {
611
- ...filter,
612
- onClick: handleClick,
613
- operator,
614
- value
615
- },
616
- `${attributeName}-${operator}-${value}`
617
- );
618
- }
619
- return null;
620
- } else {
621
- const [operator] = Object.keys(filterObj);
622
- const value = filterObj[operator];
623
- if (typeof value === "object") {
624
- return null;
625
- }
626
- return /* @__PURE__ */ jsxRuntime.jsx(
627
- AttributeTag,
628
- {
629
- ...filter,
630
- onClick: handleClick,
631
- operator,
632
- value
633
- },
634
- `${attributeName}-${operator}-${value}`
635
- );
636
- }
637
- }) });
638
- };
639
- const AttributeTag = ({
640
- input,
641
- label,
642
- mainField,
643
- name,
644
- onClick,
645
- operator,
646
- options,
647
- value,
648
- ...filter
649
- }) => {
650
- const { formatMessage, formatDate, formatTime, formatNumber } = reactIntl.useIntl();
651
- const handleClick = () => {
652
- onClick({ name, value, filter: operator });
653
- };
654
- const type = mainField?.type ? mainField.type : filter.type;
655
- let formattedValue = value;
656
- switch (type) {
657
- case "date":
658
- formattedValue = formatDate(value, { dateStyle: "full" });
659
- break;
660
- case "datetime":
661
- formattedValue = formatDate(value, { dateStyle: "full", timeStyle: "short" });
662
- break;
663
- case "time":
664
- const [hour, minute] = value.split(":");
665
- const date = /* @__PURE__ */ new Date();
666
- date.setHours(Number(hour));
667
- date.setMinutes(Number(minute));
668
- formattedValue = formatTime(date, {
669
- hour: "numeric",
670
- minute: "numeric"
671
- });
672
- break;
673
- case "float":
674
- case "integer":
675
- case "biginteger":
676
- case "decimal":
677
- formattedValue = formatNumber(Number(value));
678
- break;
679
- }
680
- if (input && options) {
681
- const selectedOption = options.find((option) => {
682
- return (typeof option === "string" ? option : option.value) === value;
683
- });
684
- formattedValue = selectedOption ? typeof selectedOption === "string" ? selectedOption : selectedOption.label ?? selectedOption.value : value;
685
- }
686
- const content = `${label} ${formatMessage({
687
- id: `components.FilterOptions.FILTER_TYPES.${operator}`,
688
- defaultMessage: operator
689
- })} ${operator !== "$null" && operator !== "$notNull" ? formattedValue : ""}`;
690
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tag, { padding: 1, onClick: handleClick, icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}), children: content });
691
- };
692
- const Filters = {
693
- List,
694
- Popover: PopoverImpl,
695
- Root,
696
- Trigger
697
- };
698
- const REVIEW_WORKFLOW_FILTER_CE = [];
699
- const NOT_ALLOWED_FILTERS = [
700
- "json",
701
- "component",
702
- "media",
703
- "richtext",
704
- "dynamiczone",
705
- "password",
706
- "blocks"
707
- ];
708
- const DEFAULT_ALLOWED_FILTERS = ["createdAt", "updatedAt"];
709
- const USER_FILTER_ATTRIBUTES = [...indexNzLAHRwx.CREATOR_FIELDS, "strapi_assignee"];
710
- const FiltersImpl = ({ disabled, schema }) => {
711
- const { attributes, uid: model, options } = schema;
712
- const { formatMessage, locale } = reactIntl.useIntl();
713
- const { trackUsage } = indexNzLAHRwx.useTracking();
714
- const allPermissions = indexNzLAHRwx.useAuth("FiltersImpl", (state) => state.permissions);
715
- const [{ query }] = indexNzLAHRwx.useQueryParams();
716
- const { schemas } = indexNzLAHRwx.useContentTypeSchema();
717
- const canReadAdminUsers = React__namespace.useMemo(
718
- () => allPermissions.filter(
719
- (permission) => permission.action === "admin::users.read" && permission.subject === null
720
- ).length > 0,
721
- [allPermissions]
722
- );
723
- const selectedUserIds = (query?.filters?.$and ?? []).reduce((acc, filter) => {
724
- const [key, value] = Object.entries(filter)[0];
725
- if (typeof value.id !== "object") {
726
- return acc;
727
- }
728
- const id = value.id.$eq || value.id.$ne;
729
- if (id && USER_FILTER_ATTRIBUTES.includes(key) && !acc.includes(id)) {
730
- acc.push(id);
731
- }
732
- return acc;
733
- }, []);
734
- const { data: userData, isLoading: isLoadingAdminUsers } = indexNzLAHRwx.useAdminUsers(
735
- { filters: { id: { $in: selectedUserIds } } },
736
- {
737
- // fetch the list of admin users only if the filter contains users and the
738
- // current user has permissions to display users
739
- skip: selectedUserIds.length === 0 || !canReadAdminUsers
740
- }
741
- );
742
- const { users = [] } = userData ?? {};
743
- const { metadata } = indexNzLAHRwx.useGetContentTypeConfigurationQuery(model, {
744
- selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} })
745
- });
746
- const formatter = designSystem.useCollator(locale, {
747
- sensitivity: "base"
748
- });
749
- const displayedAttributeFilters = React__namespace.useMemo(() => {
750
- const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(
751
- (permission) => permission.action === "plugin::content-manager.explorer.read" && permission.subject === model
752
- );
753
- const allowedFields = fields.filter((field) => {
754
- const attribute = attributes[field] ?? {};
755
- return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);
756
- });
757
- return [
758
- "id",
759
- ...allowedFields,
760
- ...DEFAULT_ALLOWED_FILTERS,
761
- ...canReadAdminUsers ? indexNzLAHRwx.CREATOR_FIELDS : []
762
- ].map((name) => {
763
- const attribute = attributes[name];
764
- if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {
765
- return null;
766
- }
767
- const { mainField: mainFieldName = "", label } = metadata[name].list;
768
- let filter = {
769
- name,
770
- label: label ?? "",
771
- mainField: indexNzLAHRwx.getMainField(attribute, mainFieldName, { schemas, components: {} }),
772
- // @ts-expect-error – TODO: this is filtered out above in the `allowedFields` call but TS complains, is there a better way to solve this?
773
- type: attribute.type
774
- };
775
- if (attribute.type === "relation" && "target" in attribute && attribute.target === "admin::user") {
776
- filter = {
777
- ...filter,
778
- input: AdminUsersFilter,
779
- options: users.map((user) => ({
780
- label: indexNzLAHRwx.getDisplayName(user, formatMessage),
781
- value: user.id.toString()
782
- })),
783
- operators: [
784
- {
785
- label: formatMessage({
786
- id: "components.FilterOptions.FILTER_TYPES.$eq",
787
- defaultMessage: "is"
788
- }),
789
- value: "$eq"
790
- },
791
- {
792
- label: formatMessage({
793
- id: "components.FilterOptions.FILTER_TYPES.$ne",
794
- defaultMessage: "is not"
795
- }),
796
- value: "$ne"
797
- }
798
- ],
799
- mainField: {
800
- name: "id",
801
- type: "integer"
802
- }
803
- };
804
- }
805
- return filter;
806
- }).filter(Boolean);
807
- }, [
808
- allPermissions,
809
- model,
810
- canReadAdminUsers,
811
- attributes,
812
- metadata,
813
- schemas,
814
- users,
815
- formatMessage
816
- ]);
817
- const reviewWorkflowFilter = indexNzLAHRwx.useEnterprise(
818
- REVIEW_WORKFLOW_FILTER_CE,
819
- async () => (await Promise.resolve().then(() => require("./constants--j5MCV5y-TtrVffUD.js"))).REVIEW_WORKFLOW_FILTERS,
820
- {
821
- combine(ceFilters, eeFilters) {
822
- return [
823
- ...ceFilters,
824
- ...eeFilters.filter((eeFilter) => {
825
- if (eeFilter.name === "strapi_assignee") {
826
- return canReadAdminUsers;
827
- }
828
- return true;
829
- }).map((eeFilter) => ({
830
- ...eeFilter,
831
- "aria-label": formatMessage(eeFilter.label),
832
- options: (
833
- // TODO: strapi_assignee should not be in here and rather defined
834
- // in the ee directory.
835
- eeFilter.name === "strapi_assignee" ? users.map((user) => ({
836
- label: indexNzLAHRwx.getDisplayName(user, formatMessage),
837
- value: user.id.toString()
838
- })) : void 0
839
- )
840
- }))
841
- ];
842
- },
843
- defaultValue: [],
844
- // we have to wait for admin users to be fully loaded, because otherwise
845
- // combine is called to early and does not contain the latest state of
846
- // the users array
847
- enabled: !!options?.reviewWorkflows && !isLoadingAdminUsers
848
- }
849
- /**
850
- * this is cast because the data returns MessageDescriptor
851
- * as `metadatas.label` _then_ we turn it to a string.
852
- */
853
- );
854
- const onOpenChange = (isOpen) => {
855
- if (isOpen) {
856
- trackUsage("willFilterEntries");
857
- }
858
- };
859
- const displayedFilters = [...displayedAttributeFilters, ...reviewWorkflowFilter].sort(
860
- (a, b) => formatter.compare(a.label, b.label)
861
- );
862
- const handleFilterChange = (data) => {
863
- const attribute = attributes[data.name];
864
- if (attribute) {
865
- trackUsage("didFilterEntries", {
866
- useRelation: attribute.type === "relation"
867
- });
868
- }
869
- };
870
- return /* @__PURE__ */ jsxRuntime.jsxs(
871
- Filters.Root,
872
- {
873
- disabled,
874
- options: displayedFilters,
875
- onOpenChange,
876
- onChange: handleFilterChange,
877
- children: [
878
- /* @__PURE__ */ jsxRuntime.jsx(Filters.Trigger, {}),
879
- /* @__PURE__ */ jsxRuntime.jsx(Filters.Popover, {}),
880
- /* @__PURE__ */ jsxRuntime.jsx(Filters.List, {})
881
- ]
882
- }
883
- );
884
- };
885
- const AdminUsersFilter = ({ name }) => {
886
- const [page, setPage] = React__namespace.useState(1);
887
- const { formatMessage } = reactIntl.useIntl();
888
- const { data, isLoading } = indexNzLAHRwx.useAdminUsers({
889
- page
890
- });
891
- const field = indexNzLAHRwx.useField(name);
892
- const handleOpenChange = (isOpen) => {
893
- if (!isOpen) {
894
- setPage(1);
895
- }
896
- };
897
- const users = data?.users || [];
898
- return /* @__PURE__ */ jsxRuntime.jsx(
899
- designSystem.Combobox,
900
- {
901
- value: field.value,
902
- "aria-label": formatMessage({
903
- id: "content-manager.components.Filters.usersSelect.label",
904
- defaultMessage: "Search and select a user to filter"
905
- }),
906
- onOpenChange: handleOpenChange,
907
- onChange: (value) => field.onChange(name, value),
908
- loading: isLoading,
909
- onLoadMore: () => setPage((prev) => prev + 1),
910
- children: users.map((user) => {
911
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ComboboxOption, { value: user.id.toString(), children: indexNzLAHRwx.getDisplayName(user, formatMessage) }, user.id);
912
- })
913
- }
914
- );
915
- };
916
- const CellValue = ({ type, value }) => {
917
- const { formatDate, formatTime, formatNumber } = reactIntl.useIntl();
918
- let formattedValue = value;
919
- if (type === "date") {
920
- formattedValue = formatDate(parseISO(value), { dateStyle: "full" });
921
- }
922
- if (type === "datetime") {
923
- formattedValue = formatDate(value, { dateStyle: "full", timeStyle: "short" });
924
- }
925
- if (type === "time") {
926
- const [hour, minute, second] = value.split(":");
927
- const date = /* @__PURE__ */ new Date();
928
- date.setHours(hour);
929
- date.setMinutes(minute);
930
- date.setSeconds(second);
931
- formattedValue = formatTime(date, {
932
- timeStyle: "short"
933
- });
934
- }
935
- if (["float", "decimal"].includes(type)) {
936
- formattedValue = formatNumber(value, {
937
- // Should be kept in sync with the corresponding value
938
- // in the design-system/NumberInput: https://github.com/strapi/design-system/blob/main/packages/strapi-design-system/src/NumberInput/NumberInput.js#L53
939
- maximumFractionDigits: 20
940
- });
941
- }
942
- if (["integer", "biginteger"].includes(type)) {
943
- formattedValue = formatNumber(value, { maximumFractionDigits: 0 });
944
- }
945
- return toString__default.default(formattedValue);
946
- };
947
- const SingleComponent = ({ content, mainField }) => {
948
- if (!mainField) {
949
- return null;
950
- }
951
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { label: content[mainField.name], children: /* @__PURE__ */ jsxRuntime.jsx(SingleComponentTypography, { textColor: "neutral800", ellipsis: true, children: /* @__PURE__ */ jsxRuntime.jsx(CellValue, { type: mainField.type, value: content[mainField.name] }) }) });
952
- };
953
- const SingleComponentTypography = styled__default.default(designSystem.Typography)`
954
- max-width: 250px;
955
- `;
956
- const RepeatableComponent = ({ content, mainField }) => {
957
- const { formatMessage } = reactIntl.useIntl();
958
- if (!mainField) {
959
- return null;
960
- }
961
- return /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
962
- /* @__PURE__ */ jsxRuntime.jsxs(MenuTrigger$1, { onClick: (e) => e.stopPropagation(), children: [
963
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: content.length }),
964
- " ",
965
- formatMessage(
966
- {
967
- id: "content-manager.containers.list.items",
968
- defaultMessage: "{number, plural, =0 {items} one {item} other {items}}"
969
- },
970
- { number: content.length }
971
- )
972
- ] }),
973
- /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Content, { children: content.map((item) => /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Item, { disabled: true, children: /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponentTypography, { ellipsis: true, children: /* @__PURE__ */ jsxRuntime.jsx(CellValue, { type: mainField.type, value: item[mainField.name] }) }) }, item.id)) })
974
- ] });
975
- };
976
- const RepeatableComponentTypography = styled__default.default(designSystem.Typography)`
977
- max-width: 500px;
978
- `;
979
- const MenuTrigger$1 = styled__default.default(v2.Menu.Trigger)`
980
- svg {
981
- width: ${6 / 16}rem;
982
- height: ${4 / 16}rem;
983
- }
984
- `;
985
- const getFileExtension = (ext) => ext && ext[0] === "." ? ext.substring(1) : ext;
986
- const MediaSingle = ({ url, mime, alternativeText, name, ext, formats }) => {
987
- const fileURL = indexNzLAHRwx.prefixFileUrlWithBackendUrl(url);
988
- if (mime.includes("image")) {
989
- const thumbnail = formats?.thumbnail?.url;
990
- const mediaURL = indexNzLAHRwx.prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
991
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Avatar, { src: mediaURL, alt: alternativeText || name, preview: true });
992
- }
993
- const fileExtension = getFileExtension(ext);
994
- const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;
995
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { description: fileName, children: /* @__PURE__ */ jsxRuntime.jsx(FileWrapper, { children: fileExtension }) });
996
- };
997
- const FileWrapper = ({ children }) => {
998
- return /* @__PURE__ */ jsxRuntime.jsx(
999
- designSystem.Flex,
1000
- {
1001
- as: "span",
1002
- position: "relative",
1003
- borderRadius: "50%",
1004
- width: "26px",
1005
- height: "26px",
1006
- borderColor: "neutral200",
1007
- background: "neutral150",
1008
- paddingLeft: "1px",
1009
- justifyContent: "center",
1010
- alignItems: "center",
1011
- children: /* @__PURE__ */ jsxRuntime.jsx(FileTypography, { variant: "sigma", textColor: "neutral600", children })
1012
- }
1013
- );
1014
- };
1015
- const FileTypography = styled__default.default(designSystem.Typography)`
1016
- font-size: 0.6rem;
1017
- line-height: 0.6rem;
1018
- `;
1019
- const MediaMultiple = ({ content }) => {
1020
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.AvatarGroup, { children: content.map((file, index) => {
1021
- const key = `${file.id}${index}`;
1022
- if (index === 3) {
1023
- const remainingFiles = `+${content.length - 3}`;
1024
- return /* @__PURE__ */ jsxRuntime.jsx(FileWrapper, { children: remainingFiles }, key);
1025
- }
1026
- if (index > 3) {
1027
- return null;
1028
- }
1029
- return /* @__PURE__ */ jsxRuntime.jsx(MediaSingle, { ...file }, key);
1030
- }) });
1031
- };
1032
- const RelationSingle = ({ mainField, content }) => {
1033
- return /* @__PURE__ */ jsxRuntime.jsx(TypographyMaxWidth$1, { textColor: "neutral800", ellipsis: true, children: indexNzLAHRwx.getRelationLabel(content, mainField) });
1034
- };
1035
- const TypographyMaxWidth$1 = styled__default.default(designSystem.Typography)`
1036
- max-width: 500px;
1037
- `;
1038
- const RelationMultiple = ({ mainField, content, rowId, name }) => {
1039
- const { model } = indexNzLAHRwx.useDoc();
1040
- const { formatMessage } = reactIntl.useIntl();
1041
- const { notifyStatus } = designSystem.useNotifyAT();
1042
- const [isOpen, setIsOpen] = React__namespace.useState(false);
1043
- const [targetField] = name.split(".");
1044
- const { data, isLoading } = indexNzLAHRwx.useGetRelationsQuery(
1045
- {
1046
- model,
1047
- id: rowId,
1048
- targetField
1049
- },
1050
- {
1051
- skip: !isOpen,
1052
- refetchOnMountOrArgChange: true
1053
- }
1054
- );
1055
- React__namespace.useEffect(() => {
1056
- if (data) {
1057
- notifyStatus(
1058
- formatMessage({
1059
- id: indexNzLAHRwx.getTranslation("DynamicTable.relation-loaded"),
1060
- defaultMessage: "Relations have been loaded"
1061
- })
1062
- );
1063
- }
1064
- }, [data, formatMessage, notifyStatus]);
1065
- return /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { onOpenChange: (isOpen2) => setIsOpen(isOpen2), children: [
1066
- /* @__PURE__ */ jsxRuntime.jsx(MenuTrigger, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 1, wrap: "nowrap", children: [
1067
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: content.count }),
1068
- formatMessage(
1069
- {
1070
- id: "content-manager.containers.list.items",
1071
- defaultMessage: "{number, plural, =0 {items} one {item} other {items}}"
1072
- },
1073
- { number: content.count }
1074
- )
1075
- ] }) }),
1076
- /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Content, { children: [
1077
- isLoading && /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Item, { disabled: true, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Loader, { small: true, children: formatMessage({
1078
- id: indexNzLAHRwx.getTranslation("ListViewTable.relation-loading"),
1079
- defaultMessage: "Relations are loading"
1080
- }) }) }),
1081
- data?.results && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1082
- data.results.map((entry) => /* @__PURE__ */ jsxRuntime.jsx(v2.Menu.Item, { disabled: true, children: /* @__PURE__ */ jsxRuntime.jsx(TypographyMaxWidth$1, { ellipsis: true, children: indexNzLAHRwx.getRelationLabel(entry, mainField) }) }, entry.documentId)),
1083
- data?.pagination && data?.pagination.total > 10 && /* @__PURE__ */ jsxRuntime.jsx(
1084
- v2.Menu.Item,
1085
- {
1086
- "aria-disabled": true,
1087
- "aria-label": formatMessage({
1088
- id: indexNzLAHRwx.getTranslation("ListViewTable.relation-more"),
1089
- defaultMessage: "This relation contains more entities than displayed"
1090
- }),
1091
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: "…" })
1092
- }
1093
- )
1094
- ] })
1095
- ] })
1096
- ] });
1097
- };
1098
- const MenuTrigger = styled__default.default(v2.Menu.Trigger)`
1099
- svg {
1100
- width: ${6 / 16}rem;
1101
- height: ${4 / 16}rem;
1102
- }
1103
- `;
1104
- const CellContent = ({ content, mainField, attribute, rowId, name }) => {
1105
- if (!hasContent(content, mainField, attribute)) {
1106
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: "-" });
1107
- }
1108
- switch (attribute.type) {
1109
- case "media":
1110
- if (!attribute.multiple) {
1111
- return /* @__PURE__ */ jsxRuntime.jsx(MediaSingle, { ...content });
1112
- }
1113
- return /* @__PURE__ */ jsxRuntime.jsx(MediaMultiple, { content });
1114
- case "relation": {
1115
- if (isSingleRelation(attribute.relation)) {
1116
- return /* @__PURE__ */ jsxRuntime.jsx(RelationSingle, { mainField, content });
1117
- }
1118
- return /* @__PURE__ */ jsxRuntime.jsx(RelationMultiple, { rowId, mainField, content, name });
1119
- }
1120
- case "component":
1121
- if (attribute.repeatable) {
1122
- return /* @__PURE__ */ jsxRuntime.jsx(RepeatableComponent, { mainField, content });
1123
- }
1124
- return /* @__PURE__ */ jsxRuntime.jsx(SingleComponent, { mainField, content });
1125
- case "string":
1126
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { description: content, children: /* @__PURE__ */ jsxRuntime.jsx(TypographyMaxWidth, { ellipsis: true, textColor: "neutral800", children: /* @__PURE__ */ jsxRuntime.jsx(CellValue, { type: attribute.type, value: content }) }) });
1127
- default:
1128
- return /* @__PURE__ */ jsxRuntime.jsx(TypographyMaxWidth, { ellipsis: true, textColor: "neutral800", children: /* @__PURE__ */ jsxRuntime.jsx(CellValue, { type: attribute.type, value: content }) });
1129
- }
1130
- };
1131
- const TypographyMaxWidth = styled__default.default(designSystem.Typography)`
1132
- max-width: 300px;
1133
- `;
1134
- const hasContent = (content, mainField, attribute) => {
1135
- if (attribute.type === "component") {
1136
- if (attribute.repeatable || !mainField) {
1137
- return content?.length > 0;
1138
- }
1139
- const value = content?.[mainField.name];
1140
- if (mainField.name === "id" && ![void 0, null].includes(value)) {
1141
- return true;
1142
- }
1143
- return !isEmpty__default.default(value);
1144
- }
1145
- if (attribute.type === "relation") {
1146
- if (isSingleRelation(attribute.relation)) {
1147
- return !isEmpty__default.default(content);
1148
- }
1149
- return content?.count > 0;
1150
- }
1151
- if (["integer", "decimal", "float", "number"].includes(attribute.type)) {
1152
- return typeof content === "number";
1153
- }
1154
- if (attribute.type === "boolean") {
1155
- return content !== null;
1156
- }
1157
- return !isEmpty__default.default(content);
1158
- };
1159
- const isSingleRelation = (type) => ["oneToOne", "manyToOne", "oneToOneMorph"].includes(type);
1160
- const ViewSettingsMenu = (props) => {
1161
- const [isVisible, setIsVisible] = React__namespace.useState(false);
1162
- const cogButtonRef = React__namespace.useRef(null);
1163
- const permissions = indexNzLAHRwx.useTypedSelector(
1164
- (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations ?? []
1165
- );
1166
- const [{ query }] = indexNzLAHRwx.useQueryParams();
1167
- const { formatMessage } = reactIntl.useIntl();
1168
- const {
1169
- allowedActions: { canViewConfiguration }
1170
- } = indexNzLAHRwx.useRBAC({
1171
- viewConfiguration: permissions
1172
- });
1173
- const handleToggle = () => {
1174
- setIsVisible((prev) => !prev);
1175
- };
1176
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1177
- /* @__PURE__ */ jsxRuntime.jsx(
1178
- designSystem.IconButton,
1179
- {
1180
- icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cog, {}),
1181
- label: formatMessage({
1182
- id: "components.ViewSettings.tooltip",
1183
- defaultMessage: "View Settings"
1184
- }),
1185
- ref: cogButtonRef,
1186
- onClick: handleToggle
1187
- }
1188
- ),
1189
- isVisible && /* @__PURE__ */ jsxRuntime.jsx(
1190
- designSystem.Popover,
1191
- {
1192
- placement: "bottom-end",
1193
- source: cogButtonRef,
1194
- onDismiss: handleToggle,
1195
- spacing: 4,
1196
- padding: 3,
1197
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "stretch", direction: "column", gap: 3, children: [
1198
- canViewConfiguration ? /* @__PURE__ */ jsxRuntime.jsx(
1199
- v2.LinkButton,
1200
- {
1201
- size: "S",
1202
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Layer, {}),
1203
- variant: "secondary",
1204
- as: reactRouterDom.NavLink,
1205
- to: {
1206
- pathname: "configurations/list",
1207
- search: query.plugins ? indexNzLAHRwx.lib.stringify({ plugins: query.plugins }, { encode: false }) : ""
1208
- },
1209
- children: formatMessage({
1210
- id: "app.links.configure-view",
1211
- defaultMessage: "Configure the view"
1212
- })
1213
- }
1214
- ) : null,
1215
- /* @__PURE__ */ jsxRuntime.jsx(FieldPicker, { ...props })
1216
- ] })
1217
- }
1218
- )
1219
- ] });
1220
- };
1221
- const FieldPicker = ({ headers = [], resetHeaders, setHeaders }) => {
1222
- const { trackUsage } = indexNzLAHRwx.useTracking();
1223
- const { formatMessage, locale } = reactIntl.useIntl();
1224
- const { schema, model } = indexNzLAHRwx.useDoc();
1225
- const { list } = indexNzLAHRwx.useDocumentLayout(model);
1226
- const formatter = designSystem.useCollator(locale, {
1227
- sensitivity: "base"
1228
- });
1229
- const attributes = schema?.attributes ?? {};
1230
- const columns = Object.keys(attributes).filter((name) => indexNzLAHRwx.checkIfAttributeIsDisplayable(attributes[name])).map((name) => ({
1231
- name,
1232
- label: list.metadatas[name]?.label ?? ""
1233
- })).sort((a, b) => formatter.compare(a.label, b.label));
1234
- const handleChange = (name) => {
1235
- trackUsage("didChangeDisplayedFields");
1236
- const newHeaders = headers.includes(name) ? headers.filter((header) => header !== name) : [...headers, name];
1237
- setHeaders(newHeaders);
1238
- };
1239
- const handleReset = () => {
1240
- resetHeaders();
1241
- };
1242
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { as: "fieldset", direction: "column", alignItems: "stretch", gap: 3, children: [
1243
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
1244
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { as: "legend", variant: "pi", fontWeight: "bold", children: formatMessage({
1245
- id: "containers.list.displayedFields",
1246
- defaultMessage: "Displayed fields"
1247
- }) }),
1248
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.TextButton, { onClick: handleReset, children: formatMessage({
1249
- id: "app.components.Button.reset",
1250
- defaultMessage: "Reset"
1251
- }) })
1252
- ] }),
1253
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", children: columns.map((header) => {
1254
- const isActive = headers.includes(header.name);
1255
- return /* @__PURE__ */ jsxRuntime.jsxs(
1256
- ChackboxWrapper,
1257
- {
1258
- wrap: "wrap",
1259
- gap: 2,
1260
- as: "label",
1261
- background: isActive ? "primary100" : "transparent",
1262
- hasRadius: true,
1263
- padding: 2,
1264
- children: [
1265
- /* @__PURE__ */ jsxRuntime.jsx(
1266
- designSystem.BaseCheckbox,
1267
- {
1268
- onChange: () => handleChange(header.name),
1269
- value: isActive,
1270
- name: header.name
1271
- }
1272
- ),
1273
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontSize: 1, children: header.label })
1274
- ]
1275
- },
1276
- header.name
1277
- );
1278
- }) })
1279
- ] });
1280
- };
1281
- const ChackboxWrapper = styled__default.default(designSystem.Flex)`
1282
- :hover {
1283
- background-color: ${(props) => props.theme.colors.primary100};
1284
- }
1285
- `;
1286
- const { INJECT_COLUMN_IN_TABLE } = indexNzLAHRwx.HOOKS;
1287
- const REVIEW_WORKFLOW_COLUMNS_CE = null;
1288
- const REVIEW_WORKFLOW_COLUMNS_CELL_CE = {
1289
- ReviewWorkflowsStageEE: () => null,
1290
- ReviewWorkflowsAssigneeEE: () => null
1291
- };
1292
- const ListViewPage = () => {
1293
- const { trackUsage } = indexNzLAHRwx.useTracking();
1294
- const navigate = reactRouterDom.useNavigate();
1295
- const { formatMessage } = reactIntl.useIntl();
1296
- const { toggleNotification } = indexNzLAHRwx.useNotification();
1297
- const { _unstableFormatAPIError: formatAPIError } = indexNzLAHRwx.useAPIErrorHandler(indexNzLAHRwx.getTranslation);
1298
- const { collectionType, model, schema } = indexNzLAHRwx.useDoc();
1299
- const { list } = indexNzLAHRwx.useDocumentLayout(model);
1300
- const [displayedHeaders, setDisplayedHeaders] = React__namespace.useState([]);
1301
- const listLayout = indexNzLAHRwx.usePrev(list.layout);
1302
- React__namespace.useEffect(() => {
1303
- if (!isEqual__default.default(listLayout, list.layout)) {
1304
- setDisplayedHeaders(list.layout);
1305
- }
1306
- }, [list.layout, listLayout]);
1307
- const handleSetHeaders = (headers) => {
1308
- setDisplayedHeaders(
1309
- indexNzLAHRwx.convertListLayoutToFieldLayouts(headers, schema.attributes, list.metadatas)
1310
- );
1311
- };
1312
- const [{ query }] = indexNzLAHRwx.useQueryParams({
1313
- page: "1",
1314
- pageSize: list.settings.pageSize.toString(),
1315
- sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ""
1316
- });
1317
- const params = React__namespace.useMemo(() => indexNzLAHRwx.buildValidParams(query), [query]);
1318
- const { data, error, isLoading } = indexNzLAHRwx.useGetAllDocumentsQuery({
1319
- model,
1320
- params
1321
- });
1322
- React__namespace.useEffect(() => {
1323
- if (error) {
1324
- toggleNotification({
1325
- type: "danger",
1326
- message: formatAPIError(error)
1327
- });
1328
- }
1329
- }, [error, formatAPIError, toggleNotification]);
1330
- const { results = [], pagination } = data ?? {};
1331
- React__namespace.useEffect(() => {
1332
- if (pagination && pagination.pageCount > 0 && pagination.page > pagination.pageCount) {
1333
- navigate(
1334
- {
1335
- search: indexNzLAHRwx.lib.stringify({
1336
- ...query,
1337
- page: pagination.pageCount
1338
- })
1339
- },
1340
- { replace: true }
1341
- );
1342
- }
1343
- }, [pagination, formatMessage, query, navigate]);
1344
- const { canCreate } = indexNzLAHRwx.useDocumentRBAC("ListViewPage", ({ canCreate: canCreate2 }) => ({
1345
- canCreate: canCreate2
1346
- }));
1347
- const reviewWorkflowColumns = indexNzLAHRwx.useEnterprise(
1348
- REVIEW_WORKFLOW_COLUMNS_CE,
1349
- async () => (await Promise.resolve().then(() => require("./constants--j5MCV5y-TtrVffUD.js"))).REVIEW_WORKFLOW_COLUMNS_EE,
1350
- {
1351
- enabled: !!schema?.options?.reviewWorkflows
1352
- }
1353
- );
1354
- const ReviewWorkflowsColumns = indexNzLAHRwx.useEnterprise(
1355
- REVIEW_WORKFLOW_COLUMNS_CELL_CE,
1356
- async () => {
1357
- const { ReviewWorkflowsStageEE, ReviewWorkflowsAssigneeEE } = await Promise.resolve().then(() => require("./ReviewWorkflowsColumn-m0_IsejA-8zmlk45y.js"));
1358
- return { ReviewWorkflowsStageEE, ReviewWorkflowsAssigneeEE };
1359
- },
1360
- {
1361
- enabled: !!schema?.options?.reviewWorkflows
1362
- }
1363
- );
1364
- const runHookWaterfall = indexNzLAHRwx.useStrapiApp("ListViewPage", ({ runHookWaterfall: runHookWaterfall2 }) => runHookWaterfall2);
1365
- const tableHeaders = React__namespace.useMemo(() => {
1366
- const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {
1367
- displayedHeaders,
1368
- layout: list
1369
- });
1370
- const formattedHeaders = headers.displayedHeaders.map((header) => {
1371
- return {
1372
- ...header,
1373
- label: typeof header.label === "string" ? header.label : formatMessage(header.label),
1374
- name: `${header.name}${header.mainField ? `.${header.mainField}` : ""}`
1375
- };
1376
- });
1377
- if (schema?.options?.draftAndPublish) {
1378
- formattedHeaders.push({
1379
- attribute: {
1380
- type: "custom"
1381
- },
1382
- name: "status",
1383
- label: formatMessage({
1384
- id: indexNzLAHRwx.getTranslation(`containers.list.table-headers.status`),
1385
- defaultMessage: "status"
1386
- }),
1387
- searchable: false,
1388
- sortable: false
1389
- });
1390
- }
1391
- if (reviewWorkflowColumns) {
1392
- formattedHeaders.push(
1393
- ...reviewWorkflowColumns.map((column) => ({
1394
- ...column,
1395
- label: formatMessage(column.label)
1396
- }))
1397
- );
1398
- }
1399
- return formattedHeaders;
1400
- }, [
1401
- displayedHeaders,
1402
- formatMessage,
1403
- list,
1404
- reviewWorkflowColumns,
1405
- runHookWaterfall,
1406
- schema?.options?.draftAndPublish
1407
- ]);
1408
- if (isLoading) {
1409
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Page.Loading, {});
1410
- }
1411
- if (error) {
1412
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Page.Error, {});
1413
- }
1414
- const contentTypeTitle = schema?.info.displayName ?? "Untitled";
1415
- const handleRowClick = (id) => () => {
1416
- trackUsage("willEditEntryFromList");
1417
- navigate({
1418
- pathname: id.toString(),
1419
- search: indexNzLAHRwx.lib.stringify({ plugins: query.plugins })
1420
- });
1421
- };
1422
- return /* @__PURE__ */ jsxRuntime.jsxs(indexNzLAHRwx.Page.Main, { children: [
1423
- /* @__PURE__ */ jsxRuntime.jsx(Helmet.HelmetExport, { title: `${contentTypeTitle} | Strapi` }),
1424
- /* @__PURE__ */ jsxRuntime.jsx(
1425
- designSystem.HeaderLayout,
1426
- {
1427
- primaryAction: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(CreateButton, {}) : null,
1428
- subtitle: formatMessage(
1429
- {
1430
- id: indexNzLAHRwx.getTranslation("pages.ListView.header-subtitle"),
1431
- defaultMessage: "{number, plural, =0 {# entries} one {# entry} other {# entries}} found"
1432
- },
1433
- { number: pagination?.total }
1434
- ),
1435
- title: contentTypeTitle,
1436
- navigationAction: /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.BackButton, {})
1437
- }
1438
- ),
1439
- /* @__PURE__ */ jsxRuntime.jsx(
1440
- designSystem.ActionLayout,
1441
- {
1442
- endActions: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1443
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.InjectionZone, { area: "contentManager.listView.actions" }),
1444
- /* @__PURE__ */ jsxRuntime.jsx(
1445
- ViewSettingsMenu,
1446
- {
1447
- setHeaders: handleSetHeaders,
1448
- resetHeaders: () => setDisplayedHeaders(list.layout),
1449
- headers: displayedHeaders.map((header) => header.name)
1450
- }
1451
- )
1452
- ] }),
1453
- startActions: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1454
- list.settings.searchable && /* @__PURE__ */ jsxRuntime.jsx(
1455
- indexNzLAHRwx.SearchInput,
1456
- {
1457
- disabled: results.length === 0,
1458
- label: formatMessage(
1459
- { id: "app.component.search.label", defaultMessage: "Search for {target}" },
1460
- { target: contentTypeTitle }
1461
- ),
1462
- placeholder: formatMessage({
1463
- id: "global.search",
1464
- defaultMessage: "Search"
1465
- }),
1466
- trackedEvent: "didSearch"
1467
- }
1468
- ),
1469
- list.settings.filterable && schema ? /* @__PURE__ */ jsxRuntime.jsx(FiltersImpl, { disabled: results.length === 0, schema }) : null
1470
- ] })
1471
- }
1472
- ),
1473
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
1474
- /* @__PURE__ */ jsxRuntime.jsxs(indexNzLAHRwx.Table.Root, { rows: results, headers: tableHeaders, isLoading, children: [
1475
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.ActionBar, {}),
1476
- /* @__PURE__ */ jsxRuntime.jsxs(indexNzLAHRwx.Table.Content, { children: [
1477
- /* @__PURE__ */ jsxRuntime.jsxs(indexNzLAHRwx.Table.Head, { children: [
1478
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.HeaderCheckboxCell, {}),
1479
- tableHeaders.map((header) => /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.HeaderCell, { ...header }, header.name))
1480
- ] }),
1481
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Loading, {}),
1482
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Empty, { action: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(CreateButton, { variant: "secondary" }) : null }),
1483
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Body, { children: results.map((row) => {
1484
- return /* @__PURE__ */ jsxRuntime.jsxs(
1485
- indexNzLAHRwx.Table.Row,
1486
- {
1487
- cursor: "pointer",
1488
- onClick: handleRowClick(row.documentId),
1489
- children: [
1490
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.CheckboxCell, { id: row.id }),
1491
- tableHeaders.map(({ cellFormatter, ...header }) => {
1492
- if (header.name === "status") {
1493
- const { status } = row;
1494
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.DocumentStatus, { status, maxWidth: "min-content" }) }, header.name);
1495
- }
1496
- if (schema?.options?.reviewWorkflows) {
1497
- if (header.name === "strapi_stage") {
1498
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Cell, { children: row.strapi_stage ? /* @__PURE__ */ jsxRuntime.jsx(
1499
- ReviewWorkflowsColumns.ReviewWorkflowsStageEE,
1500
- {
1501
- color: row.strapi_stage.color ?? designSystem.lightTheme.colors.primary600,
1502
- name: row.strapi_stage.name
1503
- }
1504
- ) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: "-" }) }, header.name);
1505
- }
1506
- if (header.name === "strapi_assignee") {
1507
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Cell, { children: row.strapi_assignee ? /* @__PURE__ */ jsxRuntime.jsx(
1508
- ReviewWorkflowsColumns.ReviewWorkflowsAssigneeEE,
1509
- {
1510
- user: row.strapi_assignee
1511
- }
1512
- ) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: "-" }) }, header.name);
1513
- }
1514
- }
1515
- if (["createdBy", "updatedBy"].includes(header.name.split(".")[0])) {
1516
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", children: row[header.name.split(".")[0]] ? indexNzLAHRwx.getDisplayName(row[header.name.split(".")[0]], formatMessage) : "-" }) }, header.name);
1517
- }
1518
- if (typeof cellFormatter === "function") {
1519
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Cell, { children: cellFormatter(row, header, { collectionType, model }) }, header.name);
1520
- }
1521
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
1522
- CellContent,
1523
- {
1524
- content: row[header.name.split(".")[0]],
1525
- rowId: row.documentId,
1526
- ...header
1527
- }
1528
- ) }, header.name);
1529
- }),
1530
- /* @__PURE__ */ jsxRuntime.jsx(ActionsCell, { onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.TableActions, { document: row }) })
1531
- ]
1532
- },
1533
- row.id
1534
- );
1535
- }) })
1536
- ] })
1537
- ] }),
1538
- /* @__PURE__ */ jsxRuntime.jsxs(
1539
- indexNzLAHRwx.Pagination.Root,
1540
- {
1541
- ...pagination,
1542
- onPageSizeChange: () => trackUsage("willChangeNumberOfEntriesPerPage"),
1543
- children: [
1544
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Pagination.PageSize, {}),
1545
- /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Pagination.Links, {})
1546
- ]
1547
- }
1548
- )
1549
- ] }) })
1550
- ] });
1551
- };
1552
- const ActionsCell = styled__default.default(indexNzLAHRwx.Table.Cell)`
1553
- display: flex;
1554
- justify-content: flex-end;
1555
- `;
1556
- const CreateButton = ({ variant }) => {
1557
- const { formatMessage } = reactIntl.useIntl();
1558
- const { trackUsage } = indexNzLAHRwx.useTracking();
1559
- const [{ query }] = indexNzLAHRwx.useQueryParams();
1560
- return /* @__PURE__ */ jsxRuntime.jsx(
1561
- designSystem.Button,
1562
- {
1563
- variant,
1564
- forwardedAs: reactRouterDom.Link,
1565
- onClick: () => {
1566
- trackUsage("willCreateEntry", { status: "draft" });
1567
- },
1568
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Plus, {}),
1569
- style: { textDecoration: "none" },
1570
- to: {
1571
- pathname: "create",
1572
- search: indexNzLAHRwx.lib.stringify({ plugins: query.plugins })
1573
- },
1574
- children: formatMessage({
1575
- id: indexNzLAHRwx.getTranslation("HeaderLayout.button.label-add-entry"),
1576
- defaultMessage: "Create new entry"
1577
- })
1578
- }
1579
- );
1580
- };
1581
- const ProtectedListViewPage = () => {
1582
- const { model } = indexNzLAHRwx.useDoc();
1583
- const [{ query }] = indexNzLAHRwx.useQueryParams();
1584
- const { permissions = [], isLoading, isError } = useSyncRbacOd0wrAnD.useSyncRbac(model, query, "editView");
1585
- if (isLoading) {
1586
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Page.Loading, {});
1587
- }
1588
- if (isError) {
1589
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Page.Error, {});
1590
- }
1591
- return /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.Page.Protect, { permissions, children: ({ permissions: permissions2 }) => /* @__PURE__ */ jsxRuntime.jsx(indexNzLAHRwx.DocumentRBAC, { permissions: permissions2, children: /* @__PURE__ */ jsxRuntime.jsx(ListViewPage, {}) }) });
1592
- };
1593
- exports.ListViewPage = ListViewPage;
1594
- exports.ProtectedListViewPage = ProtectedListViewPage;
1595
- //# sourceMappingURL=ListViewPage-rkQXnquk-rBwGjRm0.js.map