@strapi/admin 4.12.0-beta.1 → 4.12.0-beta.3

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 (123) hide show
  1. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +1 -3
  2. package/admin/src/content-manager/components/RelationInput/components/Option.js +6 -5
  3. package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +7 -7
  4. package/admin/src/content-manager/pages/EditSettingsView/components/DisplayedFields.js +23 -21
  5. package/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js +21 -23
  6. package/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js +24 -22
  7. package/admin/src/content-manager/pages/ListView/components/Body/index.js +191 -0
  8. package/admin/src/content-manager/pages/ListView/components/BulkActionButtons/ConfirmBulkActionDialog/index.js +164 -0
  9. package/admin/src/content-manager/pages/ListView/components/BulkActionButtons/SelectedEntriesModal/index.js +468 -0
  10. package/admin/src/content-manager/{components/DynamicTable/BulkActionsBar → pages/ListView/components/BulkActionButtons}/index.js +56 -132
  11. package/admin/src/content-manager/pages/ListView/components/CellContent/RelationMultiple/index.js +63 -69
  12. package/admin/src/content-manager/pages/ListView/components/CellContent/RepeatableComponent/index.js +28 -21
  13. package/admin/src/content-manager/pages/ListView/index.js +191 -132
  14. package/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js +7 -7
  15. package/admin/src/translations/ca.json +4 -4
  16. package/admin/src/translations/de.json +4 -4
  17. package/admin/src/translations/dk.json +2 -2
  18. package/admin/src/translations/en.json +23 -4
  19. package/admin/src/translations/es.json +4 -4
  20. package/admin/src/translations/eu.json +4 -4
  21. package/admin/src/translations/fr.json +2 -2
  22. package/admin/src/translations/gu.json +4 -4
  23. package/admin/src/translations/hi.json +4 -4
  24. package/admin/src/translations/hu.json +4 -4
  25. package/admin/src/translations/ja.json +2 -2
  26. package/admin/src/translations/ko.json +2 -2
  27. package/admin/src/translations/ml.json +4 -4
  28. package/admin/src/translations/nl.json +4 -4
  29. package/admin/src/translations/pl.json +4 -4
  30. package/admin/src/translations/pt-BR.json +4 -4
  31. package/admin/src/translations/ru.json +4 -4
  32. package/admin/src/translations/sa.json +4 -4
  33. package/admin/src/translations/sk.json +4 -4
  34. package/admin/src/translations/sv.json +4 -4
  35. package/admin/src/translations/tr.json +4 -4
  36. package/admin/src/translations/zh-Hans.json +4 -4
  37. package/admin/src/translations/zh.json +4 -4
  38. package/build/{2801.18ac397d.chunk.js → 2801.18f38baf.chunk.js} +1 -1
  39. package/build/{3483.e182b190.chunk.js → 3483.ddd2d6df.chunk.js} +1 -1
  40. package/build/{970.89601f27.chunk.js → 3739.63e352f1.chunk.js} +52 -20
  41. package/build/6158.c974fd83.chunk.js +1 -0
  42. package/build/6691.f880a0b6.chunk.js +105 -0
  43. package/build/8298.fd253c9f.chunk.js +117 -0
  44. package/build/{9932.b5a3bb3a.chunk.js → 9806.91360bb6.chunk.js} +47 -47
  45. package/build/{Admin-authenticatedApp.2ffa318a.chunk.js → Admin-authenticatedApp.36b3826c.chunk.js} +2 -2
  46. package/build/Admin_settingsPage.8c600d1a.chunk.js +111 -0
  47. package/build/{admin-app.088bcd33.chunk.js → admin-app.1c3f7fd6.chunk.js} +9 -9
  48. package/build/{ca-json.1fed5d8b.chunk.js → ca-json.a53c10b6.chunk.js} +1 -1
  49. package/build/content-manager.b8d593d4.chunk.js +1103 -0
  50. package/build/{content-type-builder-translation-ar-json.56d8fcf4.chunk.js → content-type-builder-translation-ar-json.3e808e2f.chunk.js} +1 -1
  51. package/build/{content-type-builder-translation-cs-json.a5b299ca.chunk.js → content-type-builder-translation-cs-json.1ef9e106.chunk.js} +1 -1
  52. package/build/{content-type-builder-translation-de-json.393a76c0.chunk.js → content-type-builder-translation-de-json.63fcff7b.chunk.js} +1 -1
  53. package/build/{content-type-builder-translation-dk-json.fbd39bb7.chunk.js → content-type-builder-translation-dk-json.fd626b67.chunk.js} +1 -1
  54. package/build/{content-type-builder-translation-en-json.38e20391.chunk.js → content-type-builder-translation-en-json.ed29ff4d.chunk.js} +1 -1
  55. package/build/{content-type-builder-translation-es-json.9288474b.chunk.js → content-type-builder-translation-es-json.a4a361a9.chunk.js} +1 -1
  56. package/build/{content-type-builder-translation-fr-json.d35e269c.chunk.js → content-type-builder-translation-fr-json.499c3a46.chunk.js} +1 -1
  57. package/build/{content-type-builder-translation-id-json.f0513929.chunk.js → content-type-builder-translation-id-json.65255f93.chunk.js} +1 -1
  58. package/build/{content-type-builder-translation-it-json.aaf16753.chunk.js → content-type-builder-translation-it-json.e268ab74.chunk.js} +1 -1
  59. package/build/{content-type-builder-translation-ko-json.8fe21a7f.chunk.js → content-type-builder-translation-ko-json.04cb309d.chunk.js} +1 -1
  60. package/build/{content-type-builder-translation-ms-json.3b5d2d3e.chunk.js → content-type-builder-translation-ms-json.f6b743b9.chunk.js} +1 -1
  61. package/build/{content-type-builder-translation-nl-json.225ef5d3.chunk.js → content-type-builder-translation-nl-json.997fe8cc.chunk.js} +1 -1
  62. package/build/{content-type-builder-translation-pl-json.92f36be2.chunk.js → content-type-builder-translation-pl-json.634f638b.chunk.js} +1 -1
  63. package/build/{content-type-builder-translation-pt-BR-json.3bd10f89.chunk.js → content-type-builder-translation-pt-BR-json.6a95dc71.chunk.js} +1 -1
  64. package/build/{content-type-builder-translation-ru-json.9bfe47ce.chunk.js → content-type-builder-translation-ru-json.3af65503.chunk.js} +1 -1
  65. package/build/{content-type-builder-translation-sk-json.d03cc18a.chunk.js → content-type-builder-translation-sk-json.c6078082.chunk.js} +1 -1
  66. package/build/{content-type-builder-translation-sv-json.d23dcd32.chunk.js → content-type-builder-translation-sv-json.a6df2462.chunk.js} +1 -1
  67. package/build/{content-type-builder-translation-th-json.7ad256e2.chunk.js → content-type-builder-translation-th-json.122277cc.chunk.js} +1 -1
  68. package/build/{content-type-builder-translation-tr-json.926f6191.chunk.js → content-type-builder-translation-tr-json.41f44f77.chunk.js} +1 -1
  69. package/build/{content-type-builder-translation-uk-json.7bf19546.chunk.js → content-type-builder-translation-uk-json.e1315acd.chunk.js} +1 -1
  70. package/build/{content-type-builder-translation-zh-Hans-json.415577fb.chunk.js → content-type-builder-translation-zh-Hans-json.6ff57db6.chunk.js} +1 -1
  71. package/build/{content-type-builder-translation-zh-json.958d90e1.chunk.js → content-type-builder-translation-zh-json.3532b962.chunk.js} +1 -1
  72. package/build/{content-type-builder.3963fb2d.chunk.js → content-type-builder.40534de5.chunk.js} +21 -17
  73. package/build/{de-json.fcac7381.chunk.js → de-json.b3be02c7.chunk.js} +1 -1
  74. package/build/{dk-json.e34cad0d.chunk.js → dk-json.842aa391.chunk.js} +1 -1
  75. package/build/{en-json.fb9f6ddd.chunk.js → en-json.4c733bd1.chunk.js} +1 -1
  76. package/build/{es-json.42096084.chunk.js → es-json.f57b5335.chunk.js} +1 -1
  77. package/build/{eu-json.fb17c8f9.chunk.js → eu-json.633025f0.chunk.js} +1 -1
  78. package/build/{fr-json.69789980.chunk.js → fr-json.aa8839d2.chunk.js} +1 -1
  79. package/build/{gu-json.4d667d0c.chunk.js → gu-json.5bd62812.chunk.js} +1 -1
  80. package/build/{hi-json.323be97d.chunk.js → hi-json.9104eb78.chunk.js} +1 -1
  81. package/build/{hu-json.fe71e6c8.chunk.js → hu-json.9f4aae42.chunk.js} +1 -1
  82. package/build/index.html +1 -1
  83. package/build/{ja-json.81b6d1e3.chunk.js → ja-json.91286391.chunk.js} +1 -1
  84. package/build/{ko-json.4539f4ba.chunk.js → ko-json.fcf3ec4b.chunk.js} +1 -1
  85. package/build/main.a12c4c0f.js +2856 -0
  86. package/build/{ml-json.8988e374.chunk.js → ml-json.557aa14c.chunk.js} +1 -1
  87. package/build/{nl-json.98345913.chunk.js → nl-json.b2b16eea.chunk.js} +1 -1
  88. package/build/{pl-json.59a5dab3.chunk.js → pl-json.f094a417.chunk.js} +1 -1
  89. package/build/{pt-BR-json.9410688b.chunk.js → pt-BR-json.dec7fb01.chunk.js} +1 -1
  90. package/build/review-workflows-settings-create-view.dfd87e1f.chunk.js +1 -0
  91. package/build/review-workflows-settings-edit-view.53c00afe.chunk.js +1 -0
  92. package/build/{review-workflows-settings-list-view.240cacdf.chunk.js → review-workflows-settings-list-view.a34be805.chunk.js} +5 -5
  93. package/build/{ru-json.678cd48b.chunk.js → ru-json.8193d8c4.chunk.js} +1 -1
  94. package/build/{runtime~main.44bf2a37.js → runtime~main.d197f488.js} +2 -2
  95. package/build/{sa-json.6359a11c.chunk.js → sa-json.a56836f1.chunk.js} +1 -1
  96. package/build/{sk-json.2374f129.chunk.js → sk-json.bf2f057a.chunk.js} +1 -1
  97. package/build/{sv-json.ae6e71ea.chunk.js → sv-json.fd0e86c6.chunk.js} +1 -1
  98. package/build/{tr-json.bac5dbd3.chunk.js → tr-json.56c32cf6.chunk.js} +1 -1
  99. package/build/upload.cbfeefa5.chunk.js +58 -0
  100. package/build/{zh-Hans-json.fada6f40.chunk.js → zh-Hans-json.36d81cdc.chunk.js} +1 -1
  101. package/build/{zh-json.3529f1e5.chunk.js → zh-json.1cc86ff0.chunk.js} +1 -1
  102. package/ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn/constants.js +2 -2
  103. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/ProtectedPage/ProtectedPage.js +1 -1
  104. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/CreateView/CreateView.js +34 -6
  105. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/pages/EditView/EditView.js +42 -11
  106. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/utils/{getWorkflowValidationSchema.js → validateWorkflow.js} +33 -2
  107. package/ee/admin/pages/SettingsPage/pages/Users/ListPage/index.js +1 -1
  108. package/ee/server/constants/workflows.js +1 -0
  109. package/ee/server/services/review-workflows/validation.js +6 -0
  110. package/ee/server/validation/review-workflows.js +6 -2
  111. package/package.json +9 -9
  112. package/admin/src/content-manager/pages/ListView/components/TableRows/index.js +0 -300
  113. package/build/190.66d89241.chunk.js +0 -117
  114. package/build/6158.f9d82db9.chunk.js +0 -1
  115. package/build/6691.e6d5ac38.chunk.js +0 -105
  116. package/build/Admin_settingsPage.3ad19487.chunk.js +0 -79
  117. package/build/content-manager.9b569036.chunk.js +0 -1094
  118. package/build/main.98c989b0.js +0 -2908
  119. package/build/review-workflows-settings-create-view.60bc516c.chunk.js +0 -1
  120. package/build/review-workflows-settings-edit-view.898ea409.chunk.js +0 -1
  121. package/build/upload.8d01c525.chunk.js +0 -26
  122. /package/admin/src/content-manager/components/{DynamicTable → ListViewTable}/CellContent/PublicationState/PublicationState.js +0 -0
  123. /package/admin/src/content-manager/components/{DynamicTable → ListViewTable}/CellContent/PublicationState/index.js +0 -0
@@ -10,6 +10,11 @@ import {
10
10
  HeaderLayout,
11
11
  useNotifyAT,
12
12
  Flex,
13
+ Td,
14
+ Tr,
15
+ Typography,
16
+ Status,
17
+ lightTheme,
13
18
  } from '@strapi/design-system';
14
19
  import {
15
20
  NoPermissions,
@@ -23,14 +28,13 @@ import {
23
28
  useTracking,
24
29
  Link,
25
30
  useAPIErrorHandler,
26
- getYupInnerErrors,
27
31
  useStrapiApp,
28
- DynamicTable,
32
+ Table,
29
33
  PaginationURLQuery,
30
34
  PageSizeURLQuery,
31
35
  } from '@strapi/helper-plugin';
32
36
  import { ArrowLeft, Cog, Plus } from '@strapi/icons';
33
- import axios from 'axios';
37
+ import axios, { AxiosError } from 'axios';
34
38
  import isEqual from 'lodash/isEqual';
35
39
  import PropTypes from 'prop-types';
36
40
  import { stringify } from 'qs';
@@ -46,14 +50,13 @@ import { useEnterprise } from '../../../hooks/useEnterprise';
46
50
  import { selectAdminPermissions } from '../../../pages/App/selectors';
47
51
  import { InjectionZone } from '../../../shared/components';
48
52
  import AttributeFilter from '../../components/AttributeFilter';
49
- import BulkActionsBar from '../../components/DynamicTable/BulkActionsBar';
50
- import { createYupSchema, getRequestUrl, getTrad } from '../../utils';
53
+ import { getRequestUrl, getTrad } from '../../utils';
51
54
 
52
55
  import { getData, getDataSucceeded, onChangeListHeaders, onResetListHeaders } from './actions';
53
- import { ConfirmDialogDelete } from './components/ConfirmDialogDelete';
54
- import { ConfirmDialogDeleteAll } from './components/ConfirmDialogDeleteAll';
56
+ import { Body } from './components/Body';
57
+ import BulkActionButtons from './components/BulkActionButtons';
58
+ import CellContent from './components/CellContent';
55
59
  import { FieldPicker } from './components/FieldPicker';
56
- import { TableRows } from './components/TableRows';
57
60
  import makeSelectListView, { selectDisplayedHeaders } from './selectors';
58
61
  import { buildValidGetParams } from './utils';
59
62
 
@@ -66,6 +69,7 @@ const ConfigureLayoutBox = styled(Box)`
66
69
  `;
67
70
 
68
71
  const REVIEW_WORKFLOW_COLUMNS_CE = null;
72
+ const REVIEW_WORKFLOW_COLUMNS_CELL_CE = () => null;
69
73
 
70
74
  function ListView({
71
75
  canCreate,
@@ -88,7 +92,7 @@ function ListView({
88
92
  metadatas,
89
93
  settings: { bulkable: isBulkable, filterable: isFilterable, searchable: isSearchable },
90
94
  } = contentType;
91
-
95
+ const [isConfirmDeleteRowOpen, setIsConfirmDeleteRowOpen] = React.useState(false);
92
96
  const toggleNotification = useNotification();
93
97
  const { trackUsage } = useTracking();
94
98
  const { refetchPermissions } = useRBACProvider();
@@ -124,29 +128,18 @@ function ListView({
124
128
  enabled: !!options?.reviewWorkflows,
125
129
  }
126
130
  );
127
-
128
- const { post, del } = fetchClient;
129
-
130
- const bulkPublishMutation = useMutation(
131
- (data) =>
132
- post(`/content-manager/collection-types/${contentType.uid}/actions/bulkPublish`, data),
131
+ const ReviewWorkflowsStage = useEnterprise(
132
+ REVIEW_WORKFLOW_COLUMNS_CELL_CE,
133
+ async () =>
134
+ (await import('../../../../../ee/admin/content-manager/pages/ListView/ReviewWorkflowsColumn'))
135
+ .ReviewWorkflowsStageEE,
133
136
  {
134
- onSuccess() {
135
- toggleNotification({
136
- type: 'success',
137
- message: { id: 'content-manager.success.record.publish', defaultMessage: 'Published' },
138
- });
139
-
140
- fetchData(`/content-manager/collection-types/${slug}`, { params });
141
- },
142
- onError(error) {
143
- toggleNotification({
144
- type: 'warning',
145
- message: formatAPIError(error),
146
- });
147
- },
137
+ enabled: hasReviewWorkflows,
148
138
  }
149
139
  );
140
+
141
+ const { post, del } = fetchClient;
142
+
150
143
  const bulkUnpublishMutation = useMutation(
151
144
  (data) =>
152
145
  post(`/content-manager/collection-types/${contentType.uid}/actions/bulkUnpublish`, data),
@@ -271,66 +264,6 @@ function ListView({
271
264
  [slug, toggleNotification, formatAPIError, del, fetchData, params]
272
265
  );
273
266
 
274
- /**
275
- * @param {number[]} selectedEntries - Array of ids to publish
276
- * @returns {{validIds: number[], errors: Object.<number, string>}} - Returns an object with the valid ids and the errors
277
- */
278
- const validateEntriesToPublish = async (selectedEntries) => {
279
- const validations = { validIds: [], errors: {} };
280
- // Create the validation schema based on the contentType
281
- const schema = createYupSchema(
282
- contentType,
283
- { components: layout.components },
284
- { isDraft: false }
285
- );
286
- // Get the selected entries
287
- const entries = data.filter((entry) => {
288
- return selectedEntries.includes(entry.id);
289
- });
290
- // Validate each entry and map the unresolved promises
291
- const validationPromises = entries.map((entry) =>
292
- schema.validate(entry, { abortEarly: false })
293
- );
294
- // Resolve all the promises in one go
295
- const resolvedPromises = await Promise.allSettled(validationPromises);
296
- // Set the validations
297
- resolvedPromises.forEach((promise) => {
298
- if (promise.status === 'rejected') {
299
- const entityId = promise.reason.value.id;
300
- validations.errors[entityId] = getYupInnerErrors(promise.reason);
301
- }
302
-
303
- if (promise.status === 'fulfilled') {
304
- validations.validIds.push(promise.value.id);
305
- }
306
- });
307
-
308
- return validations;
309
- };
310
-
311
- const handleConfirmPublishAllData = async (selectedEntries) => {
312
- const validations = await validateEntriesToPublish(selectedEntries);
313
-
314
- if (Object.values(validations.errors).length) {
315
- toggleNotification({
316
- type: 'warning',
317
- title: {
318
- id: 'content-manager.listView.validation.errors.title',
319
- defaultMessage: 'Action required',
320
- },
321
- message: {
322
- id: 'content-manager.listView.validation.errors.message',
323
- defaultMessage:
324
- 'Please make sure all fields are valid before publishing (required field, min/max character limit, etc.)',
325
- },
326
- });
327
-
328
- throw new Error('Validation error');
329
- }
330
-
331
- return bulkPublishMutation.mutateAsync({ ids: selectedEntries });
332
- };
333
-
334
267
  const handleConfirmUnpublishAllData = (selectedEntries) => {
335
268
  return bulkUnpublishMutation.mutateAsync({ ids: selectedEntries });
336
269
  };
@@ -475,6 +408,57 @@ function ListView({
475
408
  </Button>
476
409
  ) : null;
477
410
 
411
+ /**
412
+ *
413
+ * @param {string} id
414
+ * @returns void
415
+ */
416
+ const handleRowClick = (id) => () => {
417
+ trackUsage('willEditEntryFromList');
418
+ push({
419
+ pathname: `${pathname}/${id}`,
420
+ state: { from: pathname },
421
+ search: pluginsQueryParams,
422
+ });
423
+ };
424
+
425
+ const handleCloneClick = (id) => async () => {
426
+ try {
427
+ const { data } = await post(
428
+ `/content-manager/collection-types/${contentType.uid}/auto-clone/${id}?${pluginsQueryParams}`
429
+ );
430
+
431
+ if ('id' in data) {
432
+ push({
433
+ pathname: `${pathname}/${data.id}`,
434
+ state: { from: pathname },
435
+ search: pluginsQueryParams,
436
+ });
437
+ }
438
+ } catch (err) {
439
+ if (err instanceof AxiosError) {
440
+ push({
441
+ pathname: `${pathname}/create/clone/${id}`,
442
+ state: { from: pathname, error: formatAPIError(err) },
443
+ search: pluginsQueryParams,
444
+ });
445
+ }
446
+ }
447
+ };
448
+
449
+ // Add 1 column for the checkbox and 1 for the actions
450
+ const colCount = tableHeaders.length + 2;
451
+
452
+ // We have this function to refetch data when selected entries modal is closed
453
+ const refetchData = () => {
454
+ fetchData(`/content-manager/collection-types/${slug}`, { params });
455
+ };
456
+
457
+ // Block rendering until the review stage component is fully loaded in EE
458
+ if (!ReviewWorkflowsStage) {
459
+ return null;
460
+ }
461
+
478
462
  return (
479
463
  <Main aria-busy={isLoading}>
480
464
  <HeaderLayout
@@ -544,54 +528,129 @@ function ListView({
544
528
  <ContentLayout>
545
529
  {canRead ? (
546
530
  <Flex gap={4} direction="column" alignItems="stretch">
547
- <DynamicTable
548
- canCreate={canCreate}
549
- canDelete={canDelete}
550
- canPublish={canPublish}
551
- contentTypeName={headerLayoutTitle}
552
- onConfirmDelete={handleConfirmDeleteData}
553
- onConfirmDeleteAll={handleConfirmDeleteAllData}
554
- onConfirmPublishAll={handleConfirmPublishAllData}
555
- onConfirmUnpublishAll={handleConfirmUnpublishAllData}
556
- isBulkable={isBulkable}
557
- isLoading={isLoading}
558
- // FIXME: remove the layout props drilling
559
- layout={layout}
560
- rows={data}
561
- components={{ ConfirmDialogDelete, ConfirmDialogDeleteAll }}
562
- contentType={headerLayoutTitle}
563
- action={getCreateAction({ variant: 'secondary' })}
564
- headers={tableHeaders}
565
- onOpenDeleteAllModalTrackedEvent="willBulkDeleteEntries"
566
- withBulkActions
567
- withMainAction={canDelete && isBulkable}
568
- renderBulkActionsBar={({ selectedEntries, clearSelectedEntries }) => (
569
- <BulkActionsBar
531
+ <Table.Root rows={data} isLoading={isLoading} colCount={colCount}>
532
+ <Table.ActionBar>
533
+ <BulkActionButtons
570
534
  showPublish={canPublish && hasDraftAndPublish}
571
535
  showDelete={canDelete}
572
536
  onConfirmDeleteAll={handleConfirmDeleteAllData}
573
- onConfirmPublishAll={handleConfirmPublishAllData}
574
537
  onConfirmUnpublishAll={handleConfirmUnpublishAllData}
575
- selectedEntries={selectedEntries}
576
- clearSelectedEntries={clearSelectedEntries}
538
+ refetchData={refetchData}
577
539
  />
578
- )}
579
- bulkAction
580
- >
581
- <TableRows
582
- canCreate={canCreate}
583
- canDelete={canDelete}
584
- contentType={contentType}
585
- features={{
586
- hasDraftAndPublish,
587
- hasReviewWorkflows,
588
- }}
589
- headers={tableHeaders}
590
- rows={data}
591
- withBulkActions
592
- withMainAction={canDelete && isBulkable}
593
- />
594
- </DynamicTable>
540
+ </Table.ActionBar>
541
+ <Table.Content>
542
+ <Table.Head>
543
+ {/* Bulk action select all checkbox */}
544
+ <Table.HeaderCheckboxCell />
545
+ {/* Dynamic headers based on fields */}
546
+ {tableHeaders.map(({ fieldSchema, key, name, metadatas }) => (
547
+ <Table.HeaderCell
548
+ key={key}
549
+ name={name}
550
+ fieldSchemaType={fieldSchema.type}
551
+ relationFieldName={metadatas.mainField?.name}
552
+ isSortable={metadatas.sortable}
553
+ label={metadatas.label}
554
+ />
555
+ ))}
556
+ {/* Visually hidden header for actions */}
557
+ <Table.HeaderHiddenActionsCell />
558
+ </Table.Head>
559
+ {/* Loading content */}
560
+ <Table.LoadingBody />
561
+ {/* Empty content */}
562
+ <Table.EmptyBody
563
+ contentType={headerLayoutTitle}
564
+ aciton={getCreateAction({ variant: 'secondary' })}
565
+ />
566
+ {/* Content */}
567
+ <Body.Root
568
+ onConfirmDelete={handleConfirmDeleteData}
569
+ isConfirmDeleteRowOpen={isConfirmDeleteRowOpen}
570
+ setIsConfirmDeleteRowOpen={setIsConfirmDeleteRowOpen}
571
+ >
572
+ {data.map((rowData, index) => {
573
+ return (
574
+ <Tr cursor="pointer" key={data.id} onClick={handleRowClick(rowData.id)}>
575
+ {/* Bulk action row checkbox */}
576
+ <Body.CheckboxDataCell rowId={rowData.id} index={index} />
577
+ {/* Field data */}
578
+ {tableHeaders.map(({ key, name, ...rest }) => {
579
+ if (hasDraftAndPublish && name === 'publishedAt') {
580
+ return (
581
+ <Td key={key}>
582
+ <Status
583
+ width="min-content"
584
+ showBullet={false}
585
+ variant={rowData.publishedAt ? 'success' : 'secondary'}
586
+ size="S"
587
+ >
588
+ <Typography
589
+ fontWeight="bold"
590
+ textColor={`${
591
+ rowData.publishedAt ? 'success' : 'secondary'
592
+ }700`}
593
+ >
594
+ {formatMessage({
595
+ id: getTrad(
596
+ `containers.List.${
597
+ rowData.publishedAt ? 'published' : 'draft'
598
+ }`
599
+ ),
600
+ defaultMessage: rowData.publishedAt ? 'Published' : 'Draft',
601
+ })}
602
+ </Typography>
603
+ </Status>
604
+ </Td>
605
+ );
606
+ }
607
+
608
+ if (hasReviewWorkflows && name === 'strapi_stage') {
609
+ return (
610
+ <Td key={key}>
611
+ {rowData.strapi_stage ? (
612
+ <ReviewWorkflowsStage
613
+ color={
614
+ rowData.strapi_stage.color ?? lightTheme.colors.primary600
615
+ }
616
+ name={rowData.strapi_stage.name}
617
+ />
618
+ ) : (
619
+ <Typography textColor="neutral800">-</Typography>
620
+ )}
621
+ </Td>
622
+ );
623
+ }
624
+
625
+ return (
626
+ <Td key={key}>
627
+ <CellContent
628
+ content={rowData[name.split('.')[0]]}
629
+ name={name}
630
+ contentType={layout.contentType}
631
+ {...rest}
632
+ rowId={rowData.id}
633
+ />
634
+ </Td>
635
+ );
636
+ })}
637
+ {/* Actions: edit, duplicate, delete */}
638
+ {(canDelete || canPublish) && isBulkable && (
639
+ <Body.EntityActionsDataCell
640
+ rowId={rowData.id}
641
+ index={index}
642
+ setIsConfirmDeleteRowOpen={setIsConfirmDeleteRowOpen}
643
+ canCreate={canCreate}
644
+ canDelete={canDelete}
645
+ handleCloneClick={handleCloneClick}
646
+ />
647
+ )}
648
+ </Tr>
649
+ );
650
+ })}
651
+ </Body.Root>
652
+ </Table.Content>
653
+ </Table.Root>
595
654
  <Flex alignItems="flex-end" justifyContent="space-between">
596
655
  <PageSizeURLQuery trackedEvent="willChangeNumberOfEntriesPerPage" />
597
656
  <PaginationURLQuery pagination={{ pageCount: pagination?.pageCount || 1 }} />
@@ -6,7 +6,7 @@
6
6
 
7
7
  import React from 'react';
8
8
 
9
- import { MenuItem, SimpleMenu } from '@strapi/design-system';
9
+ import { SingleSelect, SingleSelectOption } from '@strapi/design-system';
10
10
  import { useIntl } from 'react-intl';
11
11
 
12
12
  import useLocalesProvider from '../../../components/LocalesProvider/useLocalesProvider';
@@ -16,13 +16,13 @@ const LocaleToggle = () => {
16
16
  const { locale } = useIntl();
17
17
 
18
18
  return (
19
- <SimpleMenu label={localeNames[locale]}>
20
- {Object.keys(localeNames).map((lang) => (
21
- <MenuItem onClick={() => changeLocale(lang)} key={lang}>
22
- {localeNames[lang]}
23
- </MenuItem>
19
+ <SingleSelect value={locale} onChange={(language) => changeLocale(language)}>
20
+ {Object.entries(localeNames).map(([language, name]) => (
21
+ <SingleSelectOption key={language} value={language}>
22
+ {name}
23
+ </SingleSelectOption>
24
24
  ))}
25
- </SimpleMenu>
25
+ </SingleSelect>
26
26
  );
27
27
  };
28
28
 
@@ -447,9 +447,9 @@
447
447
  "components.popUpWarning.message": "Segur que vol esborrar això?",
448
448
  "components.popUpWarning.title": "Si us plau, confirmeu",
449
449
  "content-manager.App.schemas.data-loaded": "Els esquemes s'han carregat correctament.",
450
- "content-manager.DynamicTable.relation-loaded": "Les relacions s'han carregat",
451
- "content-manager.DynamicTable.relation-loading": "Les relacions es carreguen",
452
- "content-manager.DynamicTable.relation-more": "Aquesta relació conté més entitats de les que es mostren",
450
+ "content-manager.ListViewTable.relation-loaded": "Les relacions s'han carregat",
451
+ "content-manager.ListViewTable.relation-loading": "Les relacions es carreguen",
452
+ "content-manager.ListViewTable.relation-more": "Aquesta relació conté més entitats de les que es mostren",
453
453
  "content-manager.EditRelations.title": "Dades relacionades",
454
454
  "content-manager.HeaderLayout.button.label-add-entry": "Crear nova entrada",
455
455
  "content-manager.api.id": "ID d'API",
@@ -461,7 +461,7 @@
461
461
  "content-manager.components.DraggableCard.delete.field": "Esborrar {item}",
462
462
  "content-manager.components.DraggableCard.edit.field": "Edita {item}",
463
463
  "content-manager.components.DraggableCard.move.field": "Moure {item}",
464
- "content-manager.components.DynamicTable.row-line": "número d'element {number}",
464
+ "content-manager.components.ListViewTable.row-line": "número d'element {number}",
465
465
  "content-manager.components.DynamicZone.ComponentPicker-label": "Trieu un component",
466
466
  "content-manager.components.DynamicZone.add-component": "Afegiu un component a {componentName}",
467
467
  "content-manager.components.DynamicZone.delete-label": "Eliminar {name}",
@@ -442,9 +442,9 @@
442
442
  "components.popUpWarning.message": "Wirklich löschen?",
443
443
  "components.popUpWarning.title": "Bitte bestätigen",
444
444
  "content-manager.App.schemas.data-loaded": "Die Schemata wurden geladen",
445
- "content-manager.DynamicTable.relation-loaded": "Beziehungen wurden geladen",
446
- "content-manager.DynamicTable.relation-loading": "Beziehungen laden",
447
- "content-manager.DynamicTable.relation-more": "Diese Beziehung enthält mehr Einträge als angezeigt",
445
+ "content-manager.ListViewTable.relation-loaded": "Beziehungen wurden geladen",
446
+ "content-manager.ListViewTable.relation-loading": "Beziehungen laden",
447
+ "content-manager.ListViewTable.relation-more": "Diese Beziehung enthält mehr Einträge als angezeigt",
448
448
  "content-manager.EditRelations.title": "Beziehungs-Daten",
449
449
  "content-manager.HeaderLayout.button.label-add-entry": "Neuer Eintrag",
450
450
  "content-manager.api.id": "API ID",
@@ -455,7 +455,7 @@
455
455
  "content-manager.components.DraggableCard.delete.field": "Lösche {item}",
456
456
  "content-manager.components.DraggableCard.edit.field": "Bearbeite {item}",
457
457
  "content-manager.components.DraggableCard.move.field": "Verschiebe {item}",
458
- "content-manager.components.DynamicTable.row-line": "Eintrag Zeile {number}",
458
+ "content-manager.components.ListViewTable.row-line": "Eintrag Zeile {number}",
459
459
  "content-manager.components.DynamicZone.ComponentPicker-label": "Wähle eine Komponente",
460
460
  "content-manager.components.DynamicZone.add-component": "Füge {componentName} eine Komponente hinzu",
461
461
  "content-manager.components.DynamicZone.delete-label": "Lösche {name}",
@@ -390,7 +390,7 @@
390
390
  "components.popUpWarning.message": "Er du sikker på at du vil slette?",
391
391
  "components.popUpWarning.title": "Bekræft venligst",
392
392
  "content-manager.App.schemas.data-loaded": "Skemaerne er blevet hentet succesfuldt",
393
- "content-manager.DynamicTable.relation-loaded": "Relationerne er blevet hentet",
393
+ "content-manager.ListViewTable.relation-loaded": "Relationerne er blevet hentet",
394
394
  "content-manager.EditRelations.title": "Relationel data",
395
395
  "content-manager.HeaderLayout.button.label-add-entry": "Opret nyt element",
396
396
  "content-manager.api.id": "API ID",
@@ -401,7 +401,7 @@
401
401
  "content-manager.components.DraggableCard.delete.field": "Slet {item}",
402
402
  "content-manager.components.DraggableCard.edit.field": "Redigér {item}",
403
403
  "content-manager.components.DraggableCard.move.field": "Flyt {item}",
404
- "content-manager.components.DynamicTable.row-line": "element linje {number}",
404
+ "content-manager.components.ListViewTable.row-line": "element linje {number}",
405
405
  "content-manager.components.DynamicZone.ComponentPicker-label": "Vælg et komponent",
406
406
  "content-manager.components.DynamicZone.add-component": "Tilføj et komponent til {componentName}",
407
407
  "content-manager.components.DynamicZone.delete-label": "Slet {name}",
@@ -540,10 +540,13 @@
540
540
  "app.utils.notify.data-loaded": "The {target} has loaded",
541
541
  "app.utils.placeholder.defaultMessage": " ",
542
542
  "app.utils.publish": "Publish",
543
+ "app.utils.refresh": "Refresh",
543
544
  "app.utils.select-all": "Select all",
544
545
  "app.utils.select-field": "Select field",
545
546
  "app.utils.select-filter": "Select filter",
546
547
  "app.utils.unpublish": "Unpublish",
548
+ "app.utils.published": "Published",
549
+ "app.utils.ready-to-publish": "Ready to publish",
547
550
  "clearLabel": "Clear",
548
551
  "coming.soon": "This content is currently under construction and will be back in a few weeks!",
549
552
  "component.Input.error.validation.integer": "The value must be an integer",
@@ -582,6 +585,17 @@
582
585
  "components.Input.error.validation.regex": "The value does not match the regex.",
583
586
  "components.Input.error.validation.required": "This value is required.",
584
587
  "components.Input.error.validation.unique": "This value is already used.",
588
+ "components.Input.error.validation.email.withField": "{field} is an invalid email",
589
+ "components.Input.error.validation.json.withField": "{field} doesn't match the JSON format",
590
+ "components.Input.error.validation.lowercase.withField": "{field} must be a lowercase string",
591
+ "components.Input.error.validation.max.withField": "{field} is too high.",
592
+ "components.Input.error.validation.maxLength.withField": "{field} is too long.",
593
+ "components.Input.error.validation.min.withField": "{field} is too low.",
594
+ "components.Input.error.validation.minLength.withField": "{field} is too short.",
595
+ "components.Input.error.validation.minSupMax.withField": "{field} can't be superior",
596
+ "components.Input.error.validation.regex.withField": "{field} does not match the regex.",
597
+ "components.Input.error.validation.required.withField": "{field} is required.",
598
+ "components.Input.error.validation.unique.withField": "{field} is already used.",
585
599
  "components.InputSelect.option.placeholder": "Choose here",
586
600
  "components.ListRow.empty": "There is no data to be shown.",
587
601
  "components.NotAllowedInput.text": "No permissions to see this field",
@@ -617,9 +631,9 @@
617
631
  "components.popUpWarning.message": "Are you sure you want to delete this?",
618
632
  "components.popUpWarning.title": "Please confirm",
619
633
  "content-manager.App.schemas.data-loaded": "The schemas have been successfully loaded",
620
- "content-manager.DynamicTable.relation-loaded": "Relations have been loaded",
621
- "content-manager.DynamicTable.relation-loading": "Relations are loading",
622
- "content-manager.DynamicTable.relation-more": "This relation contains more entities than displayed",
634
+ "content-manager.ListViewTable.relation-loaded": "Relations have been loaded",
635
+ "content-manager.ListViewTable.relation-loading": "Relations are loading",
636
+ "content-manager.ListViewTable.relation-more": "This relation contains more entities than displayed",
623
637
  "content-manager.EditRelations.title": "Relational data",
624
638
  "content-manager.HeaderLayout.button.label-add-entry": "Create new entry",
625
639
  "content-manager.api.id": "API ID",
@@ -631,7 +645,7 @@
631
645
  "content-manager.components.DraggableCard.delete.field": "Delete {item}",
632
646
  "content-manager.components.DraggableCard.edit.field": "Edit {item}",
633
647
  "content-manager.components.DraggableCard.move.field": "Move {item}",
634
- "content-manager.components.DynamicTable.row-line": "item line {number}",
648
+ "content-manager.components.ListViewTable.row-line": "item line {number}",
635
649
  "content-manager.components.DynamicZone.ComponentPicker-label": "Pick one component",
636
650
  "content-manager.components.DynamicZone.add-component": "Add a component to {componentName}",
637
651
  "content-manager.components.DynamicZone.delete-label": "Delete {name}",
@@ -711,6 +725,9 @@
711
725
  "content-manager.containers.ListPage.displayedFields": "Displayed Fields",
712
726
  "content-manager.containers.ListPage.items": "{number, plural, =0 {items} one {item} other {items}}",
713
727
  "content-manager.containers.ListPage.table-headers.publishedAt": "State",
728
+ "content-manager.containers.ListPage.selectedEntriesModal.title": "Publish entries",
729
+ "content-manager.containers.ListPage.selectedEntriesModal.selectedCount": "<b>{readyToPublishCount}</b> {readyToPublishCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action.",
730
+ "content-manager.containers.ListPage.selectedEntriesModal.publishedCount": "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} published. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action.",
714
731
  "content-manager.containers.ListSettingsView.modal-form.edit-label": "Edit {fieldName}",
715
732
  "content-manager.containers.SettingPage.add.field": "Insert another field",
716
733
  "content-manager.containers.SettingPage.add.relational-field": "Insert another related field",
@@ -817,6 +834,7 @@
817
834
  "content-manager.popUpWarning.warning.updateAllSettings": "This will modify all your settings",
818
835
  "content-manager.popUpwarning.warning.has-draft-relations.button-confirm": "Yes, publish",
819
836
  "content-manager.popUpwarning.warning.has-draft-relations.message": "<b>{count, plural, one { relation is } other { relations are } }</b> not published yet and might lead to unexpected behavior.",
837
+ "content-manager.popUpwarning.warning.bulk-has-draft-relations.message": "<b>{count} {count, plural, one { relation } other { relations } } out of {entities} { entities, plural, one { entry } other { entries } } {count, plural, one { is } other { are } }</b> not published yet and might lead to unexpected behavior. ",
820
838
  "content-manager.popover.display-relations.label": "Display relations",
821
839
  "content-manager.relation.add": "Add relation",
822
840
  "content-manager.relation.disconnect": "Remove",
@@ -829,6 +847,7 @@
829
847
  "content-manager.select.currently.selected": "{count} currently selected",
830
848
  "content-manager.success.record.delete": "Deleted",
831
849
  "content-manager.success.record.publish": "Published",
850
+ "content-manager.success.record.publishing": "Publishing...",
832
851
  "content-manager.success.record.save": "Saved",
833
852
  "content-manager.success.record.unpublish": "Unpublished",
834
853
  "content-manager.utils.data-loaded": "The {number, plural, =1 {entry has} other {entries have}} successfully been loaded",
@@ -395,7 +395,7 @@
395
395
  "components.popUpWarning.message": "¿Estás seguro de que quieres borrar esto?",
396
396
  "components.popUpWarning.title": "Por favor, confirme",
397
397
  "content-manager.App.schemas.data-loaded": "Los esquemas se han cargado correctamente.",
398
- "content-manager.DynamicTable.relation-loaded": "Las relaciones se han cargado",
398
+ "content-manager.ListViewTable.relation-loaded": "Las relaciones se han cargado",
399
399
  "content-manager.EditRelations.title": "Datos relacionados",
400
400
  "content-manager.HeaderLayout.button.label-add-entry": "Crear nueva entrada",
401
401
  "content-manager.api.id": "ID de API",
@@ -406,7 +406,7 @@
406
406
  "content-manager.components.DraggableCard.delete.field": "Borrar {item}",
407
407
  "content-manager.components.DraggableCard.edit.field": "Editar {item}",
408
408
  "content-manager.components.DraggableCard.move.field": "Mover {item}",
409
- "content-manager.components.DynamicTable.row-line": "número de elemento {number}",
409
+ "content-manager.components.ListViewTable.row-line": "número de elemento {number}",
410
410
  "content-manager.components.DynamicZone.ComponentPicker-label": "Elija un componente",
411
411
  "content-manager.components.DynamicZone.add-component": "Agregue un componente a {componentName}",
412
412
  "content-manager.components.DynamicZone.delete-label": "Eliminar {name}",
@@ -687,8 +687,8 @@
687
687
  "app.components.LeftMenu.navbrand.workplace": "Lugar de trabajo",
688
688
  "app.page.not.found": "¡Vaya! Parece que no podemos encontrar la página que estás buscando...",
689
689
  "components.Input.error.validation.lowercase": "El valor debe ser una cadena en minúsculas",
690
- "content-manager.DynamicTable.relation-loading": "Las relaciones se están cargando",
691
- "content-manager.DynamicTable.relation-more": "Esta relación contiene más entidades de las que se muestran",
690
+ "content-manager.ListViewTable.relation-loading": "Las relaciones se están cargando",
691
+ "content-manager.ListViewTable.relation-more": "Esta relación contiene más entidades de las que se muestran",
692
692
  "content-manager.apiError.Este atributo debe ser único": "{field} debe ser único",
693
693
  "form.button.continue": "Continue",
694
694
  "global.search": "Buscar",
@@ -526,9 +526,9 @@
526
526
  "components.popUpWarning.message": "Ziur zaude hau ezabatu nahi duzula?",
527
527
  "components.popUpWarning.title": "Mesedez, berretsi",
528
528
  "content-manager.App.schemas.data-loaded": "Eskemak behar bezala kargatu dira",
529
- "content-manager.DynamicTable.relation-loaded": "Erlazioak kargatu dira",
530
- "content-manager.DynamicTable.relation-loading": "Erlazioak kargatzen ari dira",
531
- "content-manager.DynamicTable.relation-more": "Erlazio honek bistaratzen diren baino entitate gehiago ditu",
529
+ "content-manager.ListViewTable.relation-loaded": "Erlazioak kargatu dira",
530
+ "content-manager.ListViewTable.relation-loading": "Erlazioak kargatzen ari dira",
531
+ "content-manager.ListViewTable.relation-more": "Erlazio honek bistaratzen diren baino entitate gehiago ditu",
532
532
  "content-manager.EditRelations.title": "Datu erlazionalak",
533
533
  "content-manager.HeaderLayout.button.label-add-entry": "Sortu sarrera berria",
534
534
  "content-manager.api.id": "API IDa",
@@ -539,7 +539,7 @@
539
539
  "content-manager.components.DraggableCard.delete.field": "Ezabatu {item}",
540
540
  "content-manager.components.DraggableCard.edit.field": "Editatu {item}",
541
541
  "content-manager.components.DraggableCard.move.field": "Mugitu {item}",
542
- "content-manager.components.DynamicTable.row-line": "elementu-lerroa {number}",
542
+ "content-manager.components.ListViewTable.row-line": "elementu-lerroa {number}",
543
543
  "content-manager.components.DynamicZone.ComponentPicker-label": "Aukeratu osagai bat",
544
544
  "content-manager.components.DynamicZone.add-component": "Gehitu osagai bat {componentName}-ra",
545
545
  "content-manager.components.DynamicZone.delete-label": "Ezabatu {name}",
@@ -466,7 +466,7 @@
466
466
  "components.popUpWarning.message": "Etes-vous sure de vouloir le supprimer ?",
467
467
  "components.popUpWarning.title": "Merci de confirmer",
468
468
  "content-manager.App.schemas.data-loaded": "Les schéma ont été chargés avec succès",
469
- "content-manager.DynamicTable.relation-loaded": "Les relations on été chargées",
469
+ "content-manager.ListViewTable.relation-loaded": "Les relations on été chargées",
470
470
  "content-manager.EditRelations.title": "Données associées",
471
471
  "content-manager.HeaderLayout.button.label-add-entry": "Créer une nouvelle entrée",
472
472
  "content-manager.api.id": "API ID",
@@ -477,7 +477,7 @@
477
477
  "content-manager.components.DraggableCard.delete.field": "Supprimer {item}",
478
478
  "content-manager.components.DraggableCard.edit.field": "Modifier {item}",
479
479
  "content-manager.components.DraggableCard.move.field": "Déplacer {item}",
480
- "content-manager.components.DynamicTable.row-line": "ligne {number}",
480
+ "content-manager.components.ListViewTable.row-line": "ligne {number}",
481
481
  "content-manager.components.DynamicZone.ComponentPicker-label": "Choisir un composant",
482
482
  "content-manager.components.DynamicZone.add-component": "Ajouter un composant à {componentName}",
483
483
  "content-manager.components.DynamicZone.delete-label": "Supprimer {name}",