@strapi/admin 4.11.0-exp.push-transfer-push-stuck → 4.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/admin/src/components/Providers/index.js +32 -32
  2. package/admin/src/components/Theme/index.js +5 -3
  3. package/admin/src/content-manager/components/ComponentIcon/ComponentIcon.js +16 -26
  4. package/admin/src/content-manager/components/ComponentIcon/constants.js +133 -0
  5. package/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js +307 -0
  6. package/admin/src/content-manager/components/DynamicTable/index.js +20 -4
  7. package/admin/src/content-manager/components/DynamicZone/components/AddComponentButton.js +32 -95
  8. package/admin/src/content-manager/components/DynamicZone/components/ComponentCard.js +10 -2
  9. package/admin/src/content-manager/components/DynamicZone/components/ComponentCategory.js +63 -15
  10. package/admin/src/content-manager/components/DynamicZone/components/ComponentPicker.js +50 -63
  11. package/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js +132 -58
  12. package/admin/src/content-manager/components/DynamicZone/components/DynamicZoneLabel.js +29 -37
  13. package/admin/src/content-manager/components/DynamicZone/index.js +131 -83
  14. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +31 -8
  15. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +18 -6
  16. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +0 -1
  17. package/admin/src/content-manager/components/Inputs/index.js +18 -11
  18. package/admin/src/content-manager/components/Inputs/utils/index.js +0 -1
  19. package/admin/src/content-manager/pages/EditSettingsView/components/DynamicZoneList.js +7 -1
  20. package/admin/src/content-manager/pages/EditView/index.js +1 -1
  21. package/admin/src/content-manager/pages/ListView/index.js +118 -2
  22. package/admin/src/content-manager/utils/index.js +2 -0
  23. package/admin/src/content-manager/{components/EditViewDataManagerProvider/utils → utils}/schema.js +1 -1
  24. package/admin/src/hooks/useContentTypes/useContentTypes.js +0 -2
  25. package/admin/src/index.js +4 -3
  26. package/admin/src/injectionZones.js +6 -1
  27. package/admin/src/pages/SettingsPage/pages/Users/ListPage/index.js +1 -1
  28. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/EventTableCE.js +13 -0
  29. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/index.js +3 -0
  30. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/Events/index.js +331 -0
  31. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/Combobox.js +54 -4
  32. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/index.js +12 -23
  33. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/index.js +129 -116
  34. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/WebhookForm/utils/makeWebhookValidationSchema.js +62 -0
  35. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/index.js +59 -64
  36. package/admin/src/translations/ar.json +684 -1
  37. package/admin/src/translations/en.json +12 -1
  38. package/build/3562.e0b1a0b3.chunk.js +50 -0
  39. package/build/371.6e4e2c1f.chunk.js +71 -0
  40. package/build/5297.31c9ffdc.chunk.js +39 -0
  41. package/build/5542.64b623c9.chunk.js +63 -0
  42. package/build/{5563.79950369.chunk.js → 5563.badbffde.chunk.js} +2 -2
  43. package/build/6691.f7a3b5ac.chunk.js +105 -0
  44. package/build/6970.d456705f.chunk.js +1 -0
  45. package/build/{7259.5cc67413.chunk.js → 7259.5d0de931.chunk.js} +1 -1
  46. package/build/8976.0022f5a3.chunk.js +50 -0
  47. package/build/{1657.ca8562dd.chunk.js → 9932.5ef475c5.chunk.js} +54 -62
  48. package/build/Admin-authenticatedApp.ab2b5910.chunk.js +79 -0
  49. package/build/{Admin_InternalErrorPage.96ceaae1.chunk.js → Admin_InternalErrorPage.f25f04f3.chunk.js} +1 -1
  50. package/build/Admin_homePage.05063e43.chunk.js +73 -0
  51. package/build/Admin_marketplace.005d2d5b.chunk.js +55 -0
  52. package/build/Admin_pluginsPage.5d9d4060.chunk.js +6 -0
  53. package/build/{Admin_profilePage.a8fa3a56.chunk.js → Admin_profilePage.ab7b94d7.chunk.js} +2 -2
  54. package/build/Admin_settingsPage.07a6a5f0.chunk.js +79 -0
  55. package/build/{Upload_ConfigureTheView.aa64ed9a.chunk.js → Upload_ConfigureTheView.121deffb.chunk.js} +1 -1
  56. package/build/admin-app.7cc667be.chunk.js +63 -0
  57. package/build/{admin-edit-roles-page.0d12b741.chunk.js → admin-edit-roles-page.bfe3304d.chunk.js} +3 -3
  58. package/build/{admin-edit-users.f9ce7844.chunk.js → admin-edit-users.6efe0382.chunk.js} +2 -2
  59. package/build/admin-roles-list.b2577370.chunk.js +23 -0
  60. package/build/admin-users.4af49ccf.chunk.js +26 -0
  61. package/build/{api-tokens-create-page.973d2816.chunk.js → api-tokens-create-page.65411a36.chunk.js} +1 -1
  62. package/build/{api-tokens-edit-page.29725c5e.chunk.js → api-tokens-edit-page.60312cb6.chunk.js} +1 -1
  63. package/build/{api-tokens-list-page.66c4fbdd.chunk.js → api-tokens-list-page.01a4d5cd.chunk.js} +2 -2
  64. package/build/ar-json.f530bc3f.chunk.js +1 -0
  65. package/build/audit-logs-settings-page.b165679b.chunk.js +16 -0
  66. package/build/content-manager.8cc6c3f9.chunk.js +1094 -0
  67. package/build/content-type-builder-list-view.58f9ed20.chunk.js +211 -0
  68. package/build/{content-type-builder-translation-en-json.af293c9e.chunk.js → content-type-builder-translation-en-json.f592325b.chunk.js} +1 -1
  69. package/build/content-type-builder.baeb0413.chunk.js +132 -0
  70. package/build/email-settings-page.8caad83f.chunk.js +11 -0
  71. package/build/en-json.a8f34002.chunk.js +1 -0
  72. package/build/i18n-settings-page.579d5eab.chunk.js +9 -0
  73. package/build/i18n-translation-en-json.1ec7becf.chunk.js +1 -0
  74. package/build/index.html +1 -1
  75. package/build/main.1d678f7b.js +2926 -0
  76. package/build/{review-workflows-settings.56cab253.chunk.js → review-workflows-settings.3a7bae25.chunk.js} +2 -2
  77. package/build/{runtime~main.adbe36a4.js → runtime~main.9dbd4553.js} +2 -2
  78. package/build/{sso-settings-page.265e3d72.chunk.js → sso-settings-page.4bb073e0.chunk.js} +1 -1
  79. package/build/{transfer-tokens-create-page.170acee6.chunk.js → transfer-tokens-create-page.9ec277d7.chunk.js} +1 -1
  80. package/build/{transfer-tokens-edit-page.6cf23295.chunk.js → transfer-tokens-edit-page.fa5ade14.chunk.js} +1 -1
  81. package/build/{transfer-tokens-list-page.c3fec4c1.chunk.js → transfer-tokens-list-page.5d68d590.chunk.js} +2 -2
  82. package/build/upload-settings.2c1565d6.chunk.js +14 -0
  83. package/build/upload.257b2aef.chunk.js +26 -0
  84. package/build/users-advanced-settings-page.ddd29040.chunk.js +9 -0
  85. package/build/users-email-settings-page.717e2a51.chunk.js +24 -0
  86. package/build/users-providers-settings-page.c7eae829.chunk.js +29 -0
  87. package/build/{users-roles-settings-page.2549794b.chunk.js → users-roles-settings-page.63cf2838.chunk.js} +1 -1
  88. package/build/webhook-edit-page.8576742e.chunk.js +31 -0
  89. package/build/webhook-list-page.abf5747c.chunk.js +63 -0
  90. package/ee/admin/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/EventTableEE.js +23 -0
  91. package/ee/admin/pages/SettingsPage/pages/Webhooks/EditView/components/EventTable/index.js +3 -0
  92. package/ee/server/services/review-workflows/review-workflows.js +4 -0
  93. package/package.json +22 -24
  94. package/server/controllers/webhooks.js +6 -6
  95. package/admin/src/content-manager/components/DynamicTable/ConfirmDialogDeleteAll/index.js +0 -73
  96. package/admin/src/content-manager/components/DynamicZone/utils/connect.js +0 -12
  97. package/admin/src/content-manager/components/DynamicZone/utils/select.js +0 -53
  98. package/admin/src/content-manager/components/Inputs/utils/getStep.js +0 -13
  99. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventInput/EventRow.js +0 -70
  100. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventInput/index.js +0 -174
  101. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/HeadersInput/keys.js +0 -39
  102. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/utils/fieldsRegex.js +0 -4
  103. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/utils/schema.js +0 -35
  104. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/reducer.js +0 -100
  105. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/utils/formatData.js +0 -20
  106. package/build/3081.c2cdfac8.chunk.js +0 -108
  107. package/build/3816.60f858cf.chunk.js +0 -211
  108. package/build/462.a073ff1f.chunk.js +0 -71
  109. package/build/5542.002522eb.chunk.js +0 -71
  110. package/build/617.87b2fe96.chunk.js +0 -155
  111. package/build/6858.85d76858.chunk.js +0 -50
  112. package/build/6970.6a329e15.chunk.js +0 -1
  113. package/build/Admin-authenticatedApp.d425b485.chunk.js +0 -79
  114. package/build/Admin_homePage.107a9fe0.chunk.js +0 -73
  115. package/build/Admin_marketplace.717bd7ca.chunk.js +0 -55
  116. package/build/Admin_pluginsPage.7df6b5a9.chunk.js +0 -6
  117. package/build/Admin_settingsPage.1394aaf2.chunk.js +0 -79
  118. package/build/admin-app.ac5b1f59.chunk.js +0 -63
  119. package/build/admin-roles-list.e8bf9685.chunk.js +0 -31
  120. package/build/admin-users.751b28b2.chunk.js +0 -34
  121. package/build/ar-json.39e54aba.chunk.js +0 -1
  122. package/build/audit-logs-settings-page.3c6cea81.chunk.js +0 -129
  123. package/build/content-manager.70548048.chunk.js +0 -1123
  124. package/build/content-type-builder-list-view.1e821eb9.chunk.js +0 -215
  125. package/build/content-type-builder.b10576e7.chunk.js +0 -126
  126. package/build/email-settings-page.dba83275.chunk.js +0 -11
  127. package/build/en-json.d965e364.chunk.js +0 -1
  128. package/build/i18n-settings-page.55628f74.chunk.js +0 -114
  129. package/build/i18n-translation-en-json.60af6722.chunk.js +0 -1
  130. package/build/main.d9d9ed10.js +0 -2630
  131. package/build/upload-settings.63d99bf5.chunk.js +0 -14
  132. package/build/upload.c50d8c7a.chunk.js +0 -34
  133. package/build/users-advanced-settings-page.4f49ca57.chunk.js +0 -9
  134. package/build/users-email-settings-page.d2429d0a.chunk.js +0 -24
  135. package/build/users-providers-settings-page.50c5ba27.chunk.js +0 -29
  136. package/build/webhook-edit-page.ddd5963d.chunk.js +0 -128
  137. package/build/webhook-list-page.e2fca9f8.chunk.js +0 -71
@@ -6,14 +6,41 @@
6
6
 
7
7
  import React from 'react';
8
8
  import PropTypes from 'prop-types';
9
- import { useIntl } from 'react-intl';
10
9
  import styled from 'styled-components';
11
10
  import { PlusCircle } from '@strapi/icons';
12
- import { BaseButton, Box, Flex, Typography } from '@strapi/design-system';
11
+ import { BaseButton, Flex, Typography } from '@strapi/design-system';
13
12
 
14
- import { getTrad } from '../../../utils';
13
+ export const AddComponentButton = ({ hasError, isDisabled, isOpen, children, onClick }) => {
14
+ return (
15
+ <StyledButton
16
+ type="button"
17
+ onClick={onClick}
18
+ disabled={isDisabled}
19
+ hasError={hasError}
20
+ background="neutral0"
21
+ paddingTop={3}
22
+ paddingBottom={3}
23
+ paddingLeft={4}
24
+ paddingRight={4}
25
+ style={{ cursor: isDisabled ? 'not-allowed' : 'pointer' }}
26
+ >
27
+ <Flex as="span" gap={2}>
28
+ <StyledAddIcon aria-hidden $isOpen={isOpen} $hasError={hasError && !isOpen} />
29
+ <Typography
30
+ variant="pi"
31
+ fontWeight="bold"
32
+ textColor={hasError && !isOpen ? 'danger600' : 'neutral500'}
33
+ >
34
+ {children}
35
+ </Typography>
36
+ </Flex>
37
+ </StyledButton>
38
+ );
39
+ };
15
40
 
16
41
  const StyledAddIcon = styled(PlusCircle)`
42
+ height: ${({ theme }) => theme.spaces[6]};
43
+ width: ${({ theme }) => theme.spaces[6]};
17
44
  transform: ${({ $isOpen }) => ($isOpen ? 'rotate(45deg)' : 'rotate(0deg)')};
18
45
  > circle {
19
46
  fill: ${({ theme, $hasError }) =>
@@ -28,25 +55,11 @@ const StyledAddIcon = styled(PlusCircle)`
28
55
  const StyledButton = styled(BaseButton)`
29
56
  border-radius: 26px;
30
57
  border-color: ${({ theme }) => theme.colors.neutral150};
31
- background: ${({ theme }) => theme.colors.neutral0};
32
- padding-top: ${({ theme }) => theme.spaces[3]};
33
- padding-right: ${({ theme }) => theme.spaces[4]};
34
- padding-bottom: ${({ theme }) => theme.spaces[3]};
35
- padding-left: ${({ theme }) => theme.spaces[4]};
36
-
37
58
  box-shadow: ${({ theme }) => theme.shadows.filterShadow};
38
59
 
39
- svg {
40
- height: ${({ theme }) => theme.spaces[6]};
41
- width: ${({ theme }) => theme.spaces[6]};
42
- > path {
43
- fill: ${({ theme }) => theme.colors.neutral600};
44
- }
45
- }
46
60
  &:hover {
47
- color: ${({ theme }) => theme.colors.primary600} !important;
48
61
  ${Typography} {
49
- color: ${({ theme }) => theme.colors.primary600} !important;
62
+ color: ${({ theme }) => theme.colors.primary600};
50
63
  }
51
64
 
52
65
  ${StyledAddIcon} {
@@ -73,92 +86,16 @@ const StyledButton = styled(BaseButton)`
73
86
  }
74
87
  `;
75
88
 
76
- const BoxFullHeight = styled(Box)`
77
- height: 100%;
78
- `;
79
-
80
- const AddComponentButton = ({
81
- hasError,
82
- hasMaxError,
83
- hasMinError,
84
- isDisabled,
85
- isOpen,
86
- label,
87
- missingComponentNumber,
88
- name,
89
- onClick,
90
- }) => {
91
- const { formatMessage } = useIntl();
92
- const addLabel = formatMessage(
93
- {
94
- id: getTrad('components.DynamicZone.add-component'),
95
- defaultMessage: 'Add a component to {componentName}',
96
- },
97
- { componentName: label || name }
98
- );
99
- const closeLabel = formatMessage({ id: 'app.utils.close-label', defaultMessage: 'Close' });
100
- let buttonLabel = isOpen ? closeLabel : addLabel;
101
-
102
- if (hasMaxError && !isOpen) {
103
- buttonLabel = formatMessage({
104
- id: 'components.Input.error.validation.max',
105
- defaultMessage: 'The value is too high.',
106
- });
107
- }
108
-
109
- if (hasMinError && !isOpen) {
110
- buttonLabel = formatMessage(
111
- {
112
- id: getTrad(`components.DynamicZone.missing-components`),
113
- defaultMessage:
114
- 'There {number, plural, =0 {are # missing components} one {is # missing component} other {are # missing components}}',
115
- },
116
- { number: missingComponentNumber }
117
- );
118
- }
119
-
120
- return (
121
- <Flex justifyContent="center">
122
- <Box style={{ cursor: isDisabled ? 'not-allowed' : 'pointer' }}>
123
- <StyledButton type="button" onClick={onClick} disabled={isDisabled} hasError={hasError}>
124
- <Flex>
125
- <BoxFullHeight aria-hidden paddingRight={2}>
126
- <StyledAddIcon $isOpen={isOpen} $hasError={hasError && !isOpen} />
127
- </BoxFullHeight>
128
- <Typography
129
- variant="pi"
130
- fontWeight="bold"
131
- textColor={hasError && !isOpen ? 'danger600' : 'neutral500'}
132
- >
133
- {buttonLabel}
134
- </Typography>
135
- </Flex>
136
- </StyledButton>
137
- </Box>
138
- </Flex>
139
- );
140
- };
141
-
142
89
  AddComponentButton.defaultProps = {
143
90
  hasError: false,
144
- hasMaxError: false,
145
- hasMinError: false,
146
91
  isDisabled: false,
147
92
  isOpen: false,
148
- label: '',
149
- missingComponentNumber: 0,
150
93
  };
151
94
 
152
95
  AddComponentButton.propTypes = {
153
- label: PropTypes.string,
96
+ children: PropTypes.node.isRequired,
154
97
  hasError: PropTypes.bool,
155
- hasMaxError: PropTypes.bool,
156
- hasMinError: PropTypes.bool,
157
98
  isDisabled: PropTypes.bool,
158
99
  isOpen: PropTypes.bool,
159
- missingComponentNumber: PropTypes.number,
160
- name: PropTypes.string.isRequired,
161
100
  onClick: PropTypes.func.isRequired,
162
101
  };
163
-
164
- export default AddComponentButton;
@@ -36,15 +36,21 @@ const ComponentBox = styled(Box)`
36
36
  > div > div:first-child {
37
37
  background: ${({ theme }) => theme.colors.primary200};
38
38
  color: ${({ theme }) => theme.colors.primary600};
39
+
40
+ svg {
41
+ path {
42
+ fill: ${({ theme }) => theme.colors.primary600};
43
+ }
44
+ }
39
45
  }
40
46
  }
41
47
  `;
42
48
 
43
- export default function ComponentCard({ children, onClick }) {
49
+ export default function ComponentCard({ children, onClick, icon }) {
44
50
  return (
45
51
  <ComponentBox as="button" type="button" onClick={onClick} hasRadius>
46
52
  <Flex direction="column" gap={1} alignItems="center" justifyContent="center">
47
- <ComponentIcon />
53
+ <ComponentIcon icon={icon} />
48
54
 
49
55
  <Typography variant="pi" fontWeight="bold" textColor="neutral600">
50
56
  {children}
@@ -56,9 +62,11 @@ export default function ComponentCard({ children, onClick }) {
56
62
 
57
63
  ComponentCard.defaultProps = {
58
64
  onClick() {},
65
+ icon: 'Cube',
59
66
  };
60
67
 
61
68
  ComponentCard.propTypes = {
62
69
  children: PropTypes.node.isRequired,
63
70
  onClick: PropTypes.func,
71
+ icon: PropTypes.string,
64
72
  };
@@ -1,18 +1,27 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { Accordion, AccordionToggle, AccordionContent, Box } from '@strapi/design-system';
3
+ import {
4
+ Accordion,
5
+ AccordionToggle,
6
+ AccordionContent,
7
+ Box,
8
+ Flex,
9
+ Typography,
10
+ } from '@strapi/design-system';
11
+ import { pxToRem } from '@strapi/helper-plugin';
4
12
  import styled from 'styled-components';
5
13
  import { useIntl } from 'react-intl';
6
14
 
7
- import ComponentCard from './ComponentCard';
15
+ import { ComponentIcon } from '../../ComponentIcon';
8
16
 
9
- const Grid = styled.div`
10
- display: grid;
11
- grid-template-columns: repeat(auto-fit, ${140 / 16}rem);
12
- grid-gap: ${({ theme }) => theme.spaces[1]};
13
- `;
14
-
15
- const ComponentCategory = ({ category, components, variant, isOpen, onAddComponent, onToggle }) => {
17
+ export const ComponentCategory = ({
18
+ category,
19
+ components,
20
+ variant,
21
+ isOpen,
22
+ onAddComponent,
23
+ onToggle,
24
+ }) => {
16
25
  const { formatMessage } = useIntl();
17
26
 
18
27
  const handleToggle = () => {
@@ -29,10 +38,27 @@ const ComponentCategory = ({ category, components, variant, isOpen, onAddCompone
29
38
  <AccordionContent>
30
39
  <Box paddingTop={4} paddingBottom={4} paddingLeft={3} paddingRight={3}>
31
40
  <Grid>
32
- {components.map(({ componentUid, info: { displayName } }) => (
33
- <ComponentCard key={componentUid} onClick={onAddComponent(componentUid)}>
34
- {formatMessage({ id: displayName, defaultMessage: displayName })}
35
- </ComponentCard>
41
+ {components.map(({ componentUid, info: { displayName, icon } }) => (
42
+ <ComponentBox
43
+ key={componentUid}
44
+ as="button"
45
+ type="button"
46
+ background="neutral100"
47
+ justifyContent="center"
48
+ onClick={onAddComponent(componentUid)}
49
+ hasRadius
50
+ height={pxToRem(84)}
51
+ shrink={0}
52
+ borderColor="neutral200"
53
+ >
54
+ <Flex direction="column" gap={1} alignItems="center" justifyContent="center">
55
+ <ComponentIcon icon={icon} />
56
+
57
+ <Typography variant="pi" fontWeight="bold" textColor="neutral600">
58
+ {formatMessage({ id: displayName, defaultMessage: displayName })}
59
+ </Typography>
60
+ </Flex>
61
+ </ComponentBox>
36
62
  ))}
37
63
  </Grid>
38
64
  </Box>
@@ -41,6 +67,30 @@ const ComponentCategory = ({ category, components, variant, isOpen, onAddCompone
41
67
  );
42
68
  };
43
69
 
70
+ const Grid = styled.div`
71
+ display: grid;
72
+ grid-template-columns: repeat(auto-fit, ${140 / 16}rem);
73
+ grid-gap: ${({ theme }) => theme.spaces[1]};
74
+ `;
75
+
76
+ const ComponentBox = styled(Flex)`
77
+ &:focus,
78
+ &:hover {
79
+ border: 1px solid ${({ theme }) => theme.colors.primary200};
80
+ background: ${({ theme }) => theme.colors.primary100};
81
+
82
+ ${Typography} {
83
+ color: ${({ theme }) => theme.colors.primary600};
84
+ }
85
+
86
+ /* > Flex > ComponentIcon */
87
+ > div > div:first-child {
88
+ background: ${({ theme }) => theme.colors.primary200};
89
+ color: ${({ theme }) => theme.colors.primary600};
90
+ }
91
+ }
92
+ `;
93
+
44
94
  ComponentCategory.defaultProps = {
45
95
  components: [],
46
96
  isOpen: false,
@@ -55,5 +105,3 @@ ComponentCategory.propTypes = {
55
105
  onToggle: PropTypes.func.isRequired,
56
106
  variant: PropTypes.oneOf(['primary', 'secondary']),
57
107
  };
58
-
59
- export default ComponentCategory;
@@ -1,40 +1,24 @@
1
- import React, { useEffect, useMemo, useState } from 'react';
2
- import groupBy from 'lodash/groupBy';
1
+ import React, { useEffect, useState } from 'react';
3
2
  import PropTypes from 'prop-types';
4
3
  import { useIntl } from 'react-intl';
5
4
  import { KeyboardNavigable, Box, Flex, Typography } from '@strapi/design-system';
6
5
 
7
6
  import { getTrad } from '../../../utils';
8
- import { useContentTypeLayout } from '../../../hooks';
9
7
 
10
- import ComponentCategory from './ComponentCategory';
8
+ import { ComponentCategory } from './ComponentCategory';
11
9
 
12
- const ComponentPicker = ({ components, isOpen, onClickAddComponent }) => {
10
+ export const ComponentPicker = ({ dynamicComponentsByCategory, isOpen, onClickAddComponent }) => {
13
11
  const { formatMessage } = useIntl();
14
- const { getComponentLayout } = useContentTypeLayout();
15
- const [categoryToOpen, setCategoryToOpen] = useState('');
16
-
17
- const dynamicComponentCategories = useMemo(() => {
18
- const componentsWithInfo = components.map((componentUid) => {
19
- const { category, info } = getComponentLayout(componentUid);
20
-
21
- return { componentUid, category, info };
22
- });
23
-
24
- const categories = groupBy(componentsWithInfo, 'category');
25
12
 
26
- return Object.keys(categories).reduce((acc, current) => {
27
- acc.push({ category: current, components: categories[current] });
28
-
29
- return acc;
30
- }, []);
31
- }, [components, getComponentLayout]);
13
+ const [categoryToOpen, setCategoryToOpen] = useState('');
32
14
 
33
15
  useEffect(() => {
34
- if (isOpen && dynamicComponentCategories.length > 0) {
35
- setCategoryToOpen(dynamicComponentCategories[0].category);
16
+ const categoryKeys = Object.keys(dynamicComponentsByCategory);
17
+
18
+ if (isOpen && categoryKeys.length > 0) {
19
+ setCategoryToOpen(categoryKeys[0]);
36
20
  }
37
- }, [isOpen, dynamicComponentCategories]);
21
+ }, [isOpen, dynamicComponentsByCategory]);
38
22
 
39
23
  const handleAddComponentToDz = (componentUid) => () => {
40
24
  onClickAddComponent(componentUid);
@@ -53,54 +37,57 @@ const ComponentPicker = ({ components, isOpen, onClickAddComponent }) => {
53
37
  }
54
38
 
55
39
  return (
56
- <Box paddingBottom={6}>
57
- <Box
58
- paddingTop={6}
59
- paddingBottom={6}
60
- paddingLeft={5}
61
- paddingRight={5}
62
- background="neutral0"
63
- shadow="tableShadow"
64
- borderColor="neutral150"
65
- hasRadius
66
- >
67
- <Flex justifyContent="center">
68
- <Typography fontWeight="bold" textColor="neutral600">
69
- {formatMessage({
70
- id: getTrad('components.DynamicZone.ComponentPicker-label'),
71
- defaultMessage: 'Pick one component',
72
- })}
73
- </Typography>
74
- </Flex>
75
- <Box paddingTop={2}>
76
- <KeyboardNavigable attributeName="data-strapi-accordion-toggle">
77
- {dynamicComponentCategories.map(({ category, components }, index) => (
78
- <ComponentCategory
79
- key={category}
80
- category={category}
81
- components={components}
82
- onAddComponent={handleAddComponentToDz}
83
- isOpen={category === categoryToOpen}
84
- onToggle={handleClickToggle}
85
- variant={index % 2 === 1 ? 'primary' : 'secondary'}
86
- />
87
- ))}
88
- </KeyboardNavigable>
89
- </Box>
40
+ <Box
41
+ paddingTop={6}
42
+ paddingBottom={6}
43
+ paddingLeft={5}
44
+ paddingRight={5}
45
+ background="neutral0"
46
+ shadow="tableShadow"
47
+ borderColor="neutral150"
48
+ hasRadius
49
+ >
50
+ <Flex justifyContent="center">
51
+ <Typography fontWeight="bold" textColor="neutral600">
52
+ {formatMessage({
53
+ id: getTrad('components.DynamicZone.ComponentPicker-label'),
54
+ defaultMessage: 'Pick one component',
55
+ })}
56
+ </Typography>
57
+ </Flex>
58
+ <Box paddingTop={2}>
59
+ <KeyboardNavigable attributeName="data-strapi-accordion-toggle">
60
+ {Object.entries(dynamicComponentsByCategory).map(([category, components], index) => (
61
+ <ComponentCategory
62
+ key={category}
63
+ category={category}
64
+ components={components}
65
+ onAddComponent={handleAddComponentToDz}
66
+ isOpen={category === categoryToOpen}
67
+ onToggle={handleClickToggle}
68
+ variant={index % 2 === 1 ? 'primary' : 'secondary'}
69
+ />
70
+ ))}
71
+ </KeyboardNavigable>
90
72
  </Box>
91
73
  </Box>
92
74
  );
93
75
  };
94
76
 
95
77
  ComponentPicker.defaultProps = {
96
- components: [],
78
+ dynamicComponentsByCategory: {},
97
79
  isOpen: false,
98
80
  };
99
81
 
100
82
  ComponentPicker.propTypes = {
101
- components: PropTypes.array,
83
+ dynamicComponentsByCategory: PropTypes.shape({
84
+ components: PropTypes.arrayOf(
85
+ PropTypes.shape({
86
+ componentUid: PropTypes.string.isRequired,
87
+ info: PropTypes.object,
88
+ })
89
+ ),
90
+ }),
102
91
  isOpen: PropTypes.bool,
103
92
  onClickAddComponent: PropTypes.func.isRequired,
104
93
  };
105
-
106
- export default ComponentPicker;