box-ui-elements 23.3.1-beta.1 → 23.4.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 (92) hide show
  1. package/dist/explorer.js +1 -1
  2. package/dist/preview.js +1 -1
  3. package/dist/sharing.js +1 -1
  4. package/dist/sharing.js.LICENSE.txt +10 -0
  5. package/dist/sidebar.js +1 -1
  6. package/es/common/types/metadata.js.flow +1 -0
  7. package/es/common/types/metadata.js.map +1 -1
  8. package/es/components/notification/Notification.js +17 -8
  9. package/es/components/notification/Notification.js.flow +15 -8
  10. package/es/components/notification/Notification.js.map +1 -1
  11. package/es/features/metadata-instance-editor/CascadePolicy.js +6 -2
  12. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +19 -12
  13. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  14. package/es/features/metadata-instance-editor/Instance.js +31 -9
  15. package/es/features/metadata-instance-editor/Instance.js.flow +41 -9
  16. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  17. package/es/features/metadata-instance-editor/Instances.js +2 -0
  18. package/es/features/metadata-instance-editor/Instances.js.flow +3 -0
  19. package/es/features/metadata-instance-editor/Instances.js.map +1 -1
  20. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js +2 -0
  21. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.flow +3 -0
  22. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.map +1 -1
  23. package/es/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  24. package/es/features/metadata-instance-editor/TemplateDropdown.js.flow +1 -1
  25. package/es/features/metadata-instance-editor/TemplateDropdown.js.map +1 -1
  26. package/es/features/metadata-instance-editor/TemplatedInstance.js +2 -0
  27. package/es/features/metadata-instance-editor/TemplatedInstance.js.flow +11 -1
  28. package/es/features/metadata-instance-editor/TemplatedInstance.js.map +1 -1
  29. package/es/features/metadata-instance-editor/constants.js +2 -1
  30. package/es/features/metadata-instance-editor/constants.js.flow +3 -1
  31. package/es/features/metadata-instance-editor/constants.js.map +1 -1
  32. package/es/features/metadata-instance-fields/DateMetadataField.js +30 -25
  33. package/es/features/metadata-instance-fields/DateMetadataField.js.flow +31 -27
  34. package/es/features/metadata-instance-fields/DateMetadataField.js.map +1 -1
  35. package/es/features/metadata-instance-fields/EnumMetadataField.js +8 -5
  36. package/es/features/metadata-instance-fields/EnumMetadataField.js.flow +8 -6
  37. package/es/features/metadata-instance-fields/EnumMetadataField.js.map +1 -1
  38. package/es/features/metadata-instance-fields/FloatMetadataField.js +2 -0
  39. package/es/features/metadata-instance-fields/FloatMetadataField.js.flow +3 -0
  40. package/es/features/metadata-instance-fields/FloatMetadataField.js.map +1 -1
  41. package/es/features/metadata-instance-fields/IntegerMetadataField.js +2 -0
  42. package/es/features/metadata-instance-fields/IntegerMetadataField.js.flow +3 -0
  43. package/es/features/metadata-instance-fields/IntegerMetadataField.js.map +1 -1
  44. package/es/features/metadata-instance-fields/MetadataField.js +7 -0
  45. package/es/features/metadata-instance-fields/MetadataField.js.flow +8 -0
  46. package/es/features/metadata-instance-fields/MetadataField.js.map +1 -1
  47. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js +2 -0
  48. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.flow +3 -0
  49. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.map +1 -1
  50. package/es/features/metadata-instance-fields/TextMetadataField.js +8 -5
  51. package/es/features/metadata-instance-fields/TextMetadataField.js.flow +8 -6
  52. package/es/features/metadata-instance-fields/TextMetadataField.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/common/types/metadata.js +1 -0
  55. package/src/components/notification/Notification.js +15 -8
  56. package/src/components/notification/__tests__/Notification.test.js +21 -1
  57. package/src/features/metadata-instance-editor/CascadePolicy.js +19 -12
  58. package/src/features/metadata-instance-editor/Instance.js +41 -9
  59. package/src/features/metadata-instance-editor/Instances.js +3 -0
  60. package/src/features/metadata-instance-editor/MetadataInstanceEditor.js +3 -0
  61. package/src/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  62. package/src/features/metadata-instance-editor/TemplatedInstance.js +11 -1
  63. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +92 -1
  64. package/src/features/metadata-instance-editor/__tests__/Instance.test.js +207 -2
  65. package/src/features/metadata-instance-editor/__tests__/Instances.test.js +92 -3
  66. package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +105 -0
  67. package/src/features/metadata-instance-editor/__tests__/TemplatedInstance.test.js +83 -1
  68. package/src/features/metadata-instance-editor/__tests__/__snapshots__/CascadePolicy.test.js.snap +1 -0
  69. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +16 -5
  70. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap +4 -2
  71. package/src/features/metadata-instance-editor/__tests__/__snapshots__/MetadataInstanceEditor.test.js.snap +1 -0
  72. package/src/features/metadata-instance-editor/__tests__/__snapshots__/TemplatedInstance.test.js.snap +2 -2
  73. package/src/features/metadata-instance-editor/constants.js +3 -1
  74. package/src/features/metadata-instance-fields/DateMetadataField.js +31 -27
  75. package/src/features/metadata-instance-fields/EnumMetadataField.js +8 -6
  76. package/src/features/metadata-instance-fields/FloatMetadataField.js +3 -0
  77. package/src/features/metadata-instance-fields/IntegerMetadataField.js +3 -0
  78. package/src/features/metadata-instance-fields/MetadataField.js +8 -0
  79. package/src/features/metadata-instance-fields/MultiSelectMetadataField.js +3 -0
  80. package/src/features/metadata-instance-fields/TextMetadataField.js +8 -6
  81. package/src/features/metadata-instance-fields/__tests__/DateMetadataField.test.js +59 -8
  82. package/src/features/metadata-instance-fields/__tests__/EnumMetadataField.test.js +63 -18
  83. package/src/features/metadata-instance-fields/__tests__/FloatMetadataField.test.js +68 -4
  84. package/src/features/metadata-instance-fields/__tests__/IntegerMetadataField.test.js +90 -4
  85. package/src/features/metadata-instance-fields/__tests__/MultiSelectMetadataField.test.js +95 -7
  86. package/src/features/metadata-instance-fields/__tests__/TextMetadataField.test.js +107 -14
  87. package/src/features/metadata-instance-fields/__tests__/__snapshots__/DateMetadataField.test.js.snap +0 -18
  88. package/src/features/metadata-instance-fields/__tests__/__snapshots__/EnumMetadataField.test.js.snap +0 -84
  89. package/src/features/metadata-instance-fields/__tests__/__snapshots__/FloatMetadataField.test.js.snap +0 -8
  90. package/src/features/metadata-instance-fields/__tests__/__snapshots__/IntegerMetadataField.test.js.snap +0 -8
  91. package/src/features/metadata-instance-fields/__tests__/__snapshots__/MultiSelectMetadataField.test.js.snap +0 -58
  92. package/src/features/metadata-instance-fields/__tests__/__snapshots__/TextMetadataField.test.js.snap +0 -31
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
-
2
+ import { render, screen } from '../../../test-utils/testing-library';
3
3
  import TemplatedInstance from '../TemplatedInstance';
4
4
 
5
5
  const data = {
@@ -118,6 +118,56 @@ const allFieldsHidden = [
118
118
 
119
119
  const noFieldsForTemplate = [];
120
120
 
121
+ const testTemplateFields = [
122
+ {
123
+ id: 'field1',
124
+ type: 'string',
125
+ key: 'stringfield',
126
+ displayName: 'Test String Field',
127
+ description: 'A string field for testing.',
128
+ },
129
+ {
130
+ id: 'field2',
131
+ type: 'float',
132
+ key: 'floatfield',
133
+ displayName: 'Test Float Field',
134
+ description: 'A float field for testing.',
135
+ },
136
+ {
137
+ id: 'field3',
138
+ type: 'enum',
139
+ key: 'enumfield',
140
+ displayName: 'Test Enum Field',
141
+ description: 'An enum field for testing.',
142
+ options: [
143
+ { key: 'yes', displayName: 'Yes' },
144
+ { key: 'no', displayName: 'No' },
145
+ ],
146
+ },
147
+ ];
148
+
149
+ const testTemplateData = {
150
+ stringfield: 'test string',
151
+ floatfield: 12.34,
152
+ enumfield: 'yes',
153
+ };
154
+
155
+ const getTemplatedInstanceBaseProps = (props = {}) => ({
156
+ template: {
157
+ id: 'template-id-1',
158
+ displayName: 'Test Template Name',
159
+ fields: testTemplateFields,
160
+ templateKey: 'testTemplateKeyForTemplated',
161
+ },
162
+ data: testTemplateData,
163
+ errors: {},
164
+ onFieldChange: jest.fn(),
165
+ onFieldRemove: jest.fn(),
166
+ canEdit: true,
167
+ isDisabled: false,
168
+ ...props,
169
+ });
170
+
121
171
  describe('features/metadata-instance-editor/fields/TemplatedInstance', () => {
122
172
  test('should correctly render fields that are visible', () => {
123
173
  const wrapper = shallow(
@@ -161,3 +211,35 @@ describe('features/metadata-instance-editor/fields/TemplatedInstance', () => {
161
211
  expect(wrapper).toMatchSnapshot();
162
212
  });
163
213
  });
214
+
215
+ describe('TemplatedInstance isDisabled prop', () => {
216
+ test('should render all fields as disabled when isDisabled is true', () => {
217
+ render(<TemplatedInstance {...getTemplatedInstanceBaseProps({ isDisabled: true })} />);
218
+
219
+ expect(screen.getByRole('textbox', { name: 'Test String Field A string field for testing.' })).toBeDisabled();
220
+ expect(screen.getByRole('textbox', { name: 'Test Float Field A float field for testing.' })).toBeDisabled();
221
+ expect(screen.getByRole('listbox', { name: 'Test Enum Field An enum field for testing.' })).toBeDisabled();
222
+ });
223
+
224
+ test('should render all fields as enabled when isDisabled is false', () => {
225
+ render(<TemplatedInstance {...getTemplatedInstanceBaseProps({ isDisabled: false })} />);
226
+
227
+ expect(
228
+ screen.getByRole('textbox', { name: 'Test String Field A string field for testing.' }),
229
+ ).not.toBeDisabled();
230
+ expect(screen.getByRole('textbox', { name: 'Test Float Field A float field for testing.' })).not.toBeDisabled();
231
+ expect(screen.getByRole('listbox', { name: 'Test Enum Field An enum field for testing.' })).not.toBeDisabled();
232
+ });
233
+
234
+ test('should render all fields as enabled when isDisabled is not provided (defaults to false)', () => {
235
+ const props = getTemplatedInstanceBaseProps();
236
+ delete props.isDisabled;
237
+ render(<TemplatedInstance {...props} />);
238
+
239
+ expect(
240
+ screen.getByRole('textbox', { name: 'Test String Field A string field for testing.' }),
241
+ ).not.toBeDisabled();
242
+ expect(screen.getByRole('textbox', { name: 'Test Float Field A float field for testing.' })).not.toBeDisabled();
243
+ expect(screen.getByRole('listbox', { name: 'Test Enum Field An enum field for testing.' })).not.toBeDisabled();
244
+ });
245
+ });
@@ -40,6 +40,7 @@ exports[`features/metadata-instance-editor/CascadePolicy should correctly render
40
40
  >
41
41
  <div
42
42
  className="metadata-cascade-enable"
43
+ data-testid="metadata-cascade-enable"
43
44
  >
44
45
  <div>
45
46
  <MemoizedFormattedMessage
@@ -69,6 +69,7 @@ exports[`features/metadata-instance-editor/fields/Instance collapsible isOpen pr
69
69
  }
70
70
  }
71
71
  errors={{}}
72
+ isDisabled={false}
72
73
  onFieldChange={[Function]}
73
74
  onFieldRemove={[Function]}
74
75
  template={
@@ -93,7 +94,7 @@ exports[`features/metadata-instance-editor/fields/Instance collapsible isOpen pr
93
94
  `;
94
95
 
95
96
  exports[`features/metadata-instance-editor/fields/Instance message id should be fileMetadataRemoveCustomTemplateConfirm 1`] = `
96
- <FormattedMessage
97
+ <Memo(MemoizedFormattedMessage)
97
98
  defaultMessage="Are you sure you want to delete this custom metadata and all of its values from this file?"
98
99
  id="boxui.metadataInstanceEditor.fileMetadataRemoveCustomTemplateConfirm"
99
100
  values={
@@ -105,7 +106,7 @@ exports[`features/metadata-instance-editor/fields/Instance message id should be
105
106
  `;
106
107
 
107
108
  exports[`features/metadata-instance-editor/fields/Instance message id should be fileMetadataRemoveTemplateConfirm 1`] = `
108
- <FormattedMessage
109
+ <Memo(MemoizedFormattedMessage)
109
110
  defaultMessage="Are you sure you want to delete "{metadataName}" and all of its values from this file?"
110
111
  id="boxui.metadataInstanceEditor.fileMetadataRemoveTemplateConfirm"
111
112
  values={
@@ -117,7 +118,7 @@ exports[`features/metadata-instance-editor/fields/Instance message id should be
117
118
  `;
118
119
 
119
120
  exports[`features/metadata-instance-editor/fields/Instance message id should be folderMetadataRemoveCustomTemplateConfirm 1`] = `
120
- <FormattedMessage
121
+ <Memo(MemoizedFormattedMessage)
121
122
  defaultMessage="Are you sure you want to delete this custom metadata and all of its values? Any metadata template values already applied to files in this folder will not be deleted."
122
123
  id="boxui.metadataInstanceEditor.folderMetadataRemoveCustomTemplateConfirm"
123
124
  values={
@@ -129,7 +130,7 @@ exports[`features/metadata-instance-editor/fields/Instance message id should be
129
130
  `;
130
131
 
131
132
  exports[`features/metadata-instance-editor/fields/Instance message id should be folderMetadataRemoveTemplateConfirm 1`] = `
132
- <FormattedMessage
133
+ <Memo(MemoizedFormattedMessage)
133
134
  defaultMessage="Are you sure you want to delete "{metadataName}" and all of its values? Any metadata template values already applied to files in this folder will not be deleted."
134
135
  id="boxui.metadataInstanceEditor.folderMetadataRemoveTemplateConfirm"
135
136
  values={
@@ -164,7 +165,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
164
165
  <span
165
166
  className="metadata-instance-editor-instance-title-text"
166
167
  >
167
- <FormattedMessage
168
+ <Memo(MemoizedFormattedMessage)
168
169
  defaultMessage="Custom Metadata"
169
170
  id="boxui.metadataInstanceEditor.customTitle"
170
171
  />
@@ -255,6 +256,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
255
256
  }
256
257
  }
257
258
  errors={{}}
259
+ isDisabled={false}
258
260
  onFieldChange={[Function]}
259
261
  onFieldRemove={[Function]}
260
262
  template={
@@ -414,10 +416,12 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
414
416
  >
415
417
  <CascadePolicy
416
418
  canUseAIFolderExtraction={false}
419
+ canUseAIFolderExtractionAgentSelector={false}
417
420
  isAIFolderExtractionEnabled={false}
418
421
  isCascadingEnabled={true}
419
422
  isCascadingOverwritten={false}
420
423
  isCustomMetadata={false}
424
+ isExistingAIExtractionCascadePolicy={false}
421
425
  onAIFolderExtractionToggle={[Function]}
422
426
  onCascadeModeChange={[Function]}
423
427
  onCascadeToggle={[Function]}
@@ -437,6 +441,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
437
441
  }
438
442
  }
439
443
  errors={{}}
444
+ isDisabled={false}
440
445
  onFieldChange={[Function]}
441
446
  onFieldRemove={[Function]}
442
447
  template={
@@ -609,6 +614,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
609
614
  }
610
615
  }
611
616
  errors={{}}
617
+ isDisabled={false}
612
618
  onFieldChange={[Function]}
613
619
  onFieldRemove={[Function]}
614
620
  template={
@@ -799,6 +805,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
799
805
  }
800
806
  }
801
807
  errors={{}}
808
+ isDisabled={false}
802
809
  onFieldChange={[Function]}
803
810
  onFieldRemove={[Function]}
804
811
  template={
@@ -994,6 +1001,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
994
1001
  }
995
1002
  }
996
1003
  errors={{}}
1004
+ isDisabled={false}
997
1005
  onFieldChange={[Function]}
998
1006
  onFieldRemove={[Function]}
999
1007
  template={
@@ -1098,6 +1106,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
1098
1106
  }
1099
1107
  }
1100
1108
  errors={{}}
1109
+ isDisabled={false}
1101
1110
  onFieldChange={[Function]}
1102
1111
  onFieldRemove={[Function]}
1103
1112
  template={
@@ -1169,6 +1178,7 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
1169
1178
  }
1170
1179
  }
1171
1180
  errors={{}}
1181
+ isDisabled={false}
1172
1182
  onFieldChange={[Function]}
1173
1183
  onFieldRemove={[Function]}
1174
1184
  template={
@@ -1346,6 +1356,7 @@ exports[`features/metadata-instance-editor/fields/Instance should not render foo
1346
1356
  }
1347
1357
  }
1348
1358
  errors={{}}
1359
+ isDisabled={false}
1349
1360
  onFieldChange={[Function]}
1350
1361
  onFieldRemove={[Function]}
1351
1362
  template={
@@ -2,9 +2,10 @@
2
2
 
3
3
  exports[`features/metadata-editor-editor/Instances should correctly render editors 1`] = `
4
4
  [
5
- <Instance
5
+ <injectIntl(Instance)
6
6
  canEdit={true}
7
7
  canUseAIFolderExtraction={false}
8
+ canUseAIFolderExtractionAgentSelector={false}
8
9
  data={
9
10
  {
10
11
  "datefield": "2018-06-20T00:00:00.000Z",
@@ -107,9 +108,10 @@ exports[`features/metadata-editor-editor/Instances should correctly render edito
107
108
  }
108
109
  }
109
110
  />,
110
- <Instance
111
+ <injectIntl(Instance)
111
112
  canEdit={false}
112
113
  canUseAIFolderExtraction={false}
114
+ canUseAIFolderExtractionAgentSelector={false}
113
115
  data={
114
116
  {
115
117
  "datefield": "2018-06-20T00:00:00.000Z",
@@ -772,6 +772,7 @@ exports[`features/metadata-editor-editor/MetadataInstanceEditor should correctly
772
772
  >
773
773
  <Instances
774
774
  canUseAIFolderExtraction={false}
775
+ canUseAIFolderExtractionAgentSelector={false}
775
776
  editors={
776
777
  [
777
778
  {
@@ -5,7 +5,7 @@ exports[`features/metadata-instance-editor/fields/TemplatedInstance should corre
5
5
  <div
6
6
  className="attributes-hidden-message"
7
7
  >
8
- <FormattedMessage
8
+ <MemoizedFormattedMessage
9
9
  defaultMessage="All attributes in this template have been hidden."
10
10
  id="boxui.metadataInstanceEditor.allAttributesAreHidden"
11
11
  />
@@ -165,7 +165,7 @@ exports[`features/metadata-instance-editor/fields/TemplatedInstance should corre
165
165
  <div
166
166
  className="no-attributes-message"
167
167
  >
168
- <FormattedMessage
168
+ <MemoizedFormattedMessage
169
169
  defaultMessage="There are no attributes in this template."
170
170
  id="boxui.metadataInstanceEditor.noAttributesForTemplate"
171
171
  />
@@ -1,4 +1,6 @@
1
1
  // @flow
2
2
 
3
+ const CASCADE_POLICY_TYPE_AI_EXTRACT = 'ai_extract';
3
4
  const TEMPLATE_CUSTOM_PROPERTIES: 'properties' = 'properties';
4
- export default TEMPLATE_CUSTOM_PROPERTIES;
5
+
6
+ export { CASCADE_POLICY_TYPE_AI_EXTRACT, TEMPLATE_CUSTOM_PROPERTIES };
@@ -1,6 +1,6 @@
1
1
  // @flow
2
2
  import * as React from 'react';
3
- import { injectIntl } from 'react-intl';
3
+ import { useIntl } from 'react-intl';
4
4
 
5
5
  import DatePicker from '../../components/date-picker';
6
6
  import { convertISOStringToUTCDate } from '../../utils/datetime';
@@ -13,34 +13,38 @@ type Props = {
13
13
  dataValue?: MetadataFieldValue,
14
14
  description?: string,
15
15
  displayName: string,
16
- intl: any,
16
+ isDisabled?: boolean,
17
17
  onChange: (key: string, value: MetadataFieldValue) => void,
18
18
  onRemove: (key: string) => void,
19
19
  };
20
20
 
21
- const DateMetadataField = ({ dataKey, dataValue, displayName, description, intl, onChange, onRemove }: Props) => (
22
- <DatePicker
23
- className="bdl-DateMetadataField"
24
- dateFormat="utcISOString"
25
- description={description}
26
- displayFormat={{
27
- day: 'numeric',
28
- month: 'long',
29
- year: 'numeric',
30
- }}
31
- hideOptionalLabel
32
- label={displayName}
33
- onChange={(date: Date, isoDate: string) => {
34
- if (isoDate) {
35
- onChange(dataKey, isoDate);
36
- } else {
37
- onRemove(dataKey);
38
- }
39
- }}
40
- placeholder={intl.formatMessage(messages.metadataFieldSetDate)}
41
- value={typeof dataValue === 'string' ? convertISOStringToUTCDate(dataValue) : undefined}
42
- />
43
- );
21
+ const DateMetadataField = ({ dataKey, dataValue, displayName, description, isDisabled, onChange, onRemove }: Props) => {
22
+ const { formatMessage } = useIntl();
44
23
 
45
- export { DateMetadataField as DateMetadataFieldBase };
46
- export default injectIntl(DateMetadataField);
24
+ return (
25
+ <DatePicker
26
+ className="bdl-DateMetadataField"
27
+ dateFormat="utcISOString"
28
+ description={description}
29
+ displayFormat={{
30
+ day: 'numeric',
31
+ month: 'long',
32
+ year: 'numeric',
33
+ }}
34
+ hideOptionalLabel
35
+ isDisabled={isDisabled}
36
+ label={displayName}
37
+ onChange={(date: Date, isoDate: string) => {
38
+ if (isoDate) {
39
+ onChange(dataKey, isoDate);
40
+ } else {
41
+ onRemove(dataKey);
42
+ }
43
+ }}
44
+ placeholder={formatMessage(messages.metadataFieldSetDate)}
45
+ value={typeof dataValue === 'string' ? convertISOStringToUTCDate(dataValue) : undefined}
46
+ />
47
+ );
48
+ };
49
+
50
+ export default DateMetadataField;
@@ -1,6 +1,6 @@
1
1
  // @flow
2
2
  import * as React from 'react';
3
- import { injectIntl } from 'react-intl';
3
+ import { useIntl } from 'react-intl';
4
4
 
5
5
  import Label from '../../components/label/Label';
6
6
  import SingleSelectField from '../../components/select-field/SingleSelectField';
@@ -20,7 +20,7 @@ type Props = {
20
20
  dataValue?: MetadataFieldValue,
21
21
  description?: string,
22
22
  displayName: string,
23
- intl: any,
23
+ isDisabled?: boolean,
24
24
  onChange: (key: string, value: MetadataFieldValue) => void,
25
25
  onRemove: (key: string) => void,
26
26
  options?: Array<MetadataTemplateFieldOption>,
@@ -32,7 +32,7 @@ const EnumMetadataField = ({
32
32
  dataValue,
33
33
  displayName,
34
34
  description,
35
- intl,
35
+ isDisabled,
36
36
  onChange,
37
37
  onRemove,
38
38
  options = [],
@@ -43,7 +43,9 @@ const EnumMetadataField = ({
43
43
  isSelectable: true,
44
44
  }));
45
45
 
46
- const defaultValue = intl.formatMessage(messages.metadataFieldSelectValue);
46
+ const { formatMessage } = useIntl();
47
+
48
+ const defaultValue = formatMessage(messages.metadataFieldSelectValue);
47
49
 
48
50
  selectOptions.unshift({
49
51
  displayText: defaultValue,
@@ -58,6 +60,7 @@ const EnumMetadataField = ({
58
60
  <SingleSelectField
59
61
  blurExceptionClassNames={blurExceptionClassNames}
60
62
  isEscapedWithReference
63
+ isDisabled={isDisabled}
61
64
  isScrollable
62
65
  onChange={(option: Option) => {
63
66
  if (option.isSelectable) {
@@ -77,5 +80,4 @@ const EnumMetadataField = ({
77
80
  );
78
81
  };
79
82
 
80
- export { EnumMetadataField as EnumMetadataFieldBase };
81
- export default injectIntl(EnumMetadataField);
83
+ export default EnumMetadataField;
@@ -11,6 +11,7 @@ type Props = {
11
11
  description?: string,
12
12
  displayName: string,
13
13
  error?: React.Node,
14
+ isDisabled?: boolean,
14
15
  onChange: (key: string, value: MetadataFieldValue) => void,
15
16
  onRemove: (key: string) => void,
16
17
  type: string,
@@ -22,6 +23,7 @@ const FloatMetadataField = ({
22
23
  displayName,
23
24
  description,
24
25
  error,
26
+ isDisabled,
25
27
  onChange,
26
28
  onRemove,
27
29
  type,
@@ -32,6 +34,7 @@ const FloatMetadataField = ({
32
34
  description={description}
33
35
  displayName={displayName}
34
36
  error={error}
37
+ isDisabled={isDisabled}
35
38
  onChange={(key: string, value: MetadataFieldValue) => {
36
39
  if (isValidValue(type, value)) {
37
40
  onChange(key, value);
@@ -11,6 +11,7 @@ type Props = {
11
11
  description?: string,
12
12
  displayName: string,
13
13
  error?: React.Node,
14
+ isDisabled?: boolean,
14
15
  onChange: (key: string, value: MetadataFieldValue) => void,
15
16
  onRemove: (key: string) => void,
16
17
  type: string,
@@ -22,6 +23,7 @@ const IntegerMetadataField = ({
22
23
  displayName,
23
24
  description,
24
25
  error,
26
+ isDisabled,
25
27
  onChange,
26
28
  onRemove,
27
29
  type,
@@ -32,6 +34,7 @@ const IntegerMetadataField = ({
32
34
  description={description}
33
35
  displayName={displayName}
34
36
  error={error}
37
+ isDisabled={isDisabled}
35
38
  onChange={(key: string, value: MetadataFieldValue) => {
36
39
  if (isValidValue(type, value)) {
37
40
  onChange(key, value);
@@ -31,6 +31,7 @@ type Props = {
31
31
  description?: string,
32
32
  displayName: string,
33
33
  error?: React.Node,
34
+ isDisabled?: boolean,
34
35
  isHidden?: boolean,
35
36
  onChange?: (key: string, value: MetadataFieldValue) => void,
36
37
  onRemove?: (key: string) => void,
@@ -45,6 +46,7 @@ const MetadataField = ({
45
46
  displayName,
46
47
  description,
47
48
  error,
49
+ isDisabled,
48
50
  isHidden,
49
51
  canEdit,
50
52
  onChange,
@@ -79,6 +81,7 @@ const MetadataField = ({
79
81
  dataValue={dataValue}
80
82
  description={description}
81
83
  displayName={displayName}
84
+ isDisabled={isDisabled}
82
85
  onChange={onChange}
83
86
  onRemove={onRemove}
84
87
  />
@@ -92,6 +95,7 @@ const MetadataField = ({
92
95
  description={description}
93
96
  displayName={displayName}
94
97
  error={error}
98
+ isDisabled={isDisabled}
95
99
  onChange={onChange}
96
100
  onRemove={onRemove}
97
101
  type={type}
@@ -106,6 +110,7 @@ const MetadataField = ({
106
110
  description={description}
107
111
  displayName={displayName}
108
112
  error={error}
113
+ isDisabled={isDisabled}
109
114
  onChange={onChange}
110
115
  onRemove={onRemove}
111
116
  type={type}
@@ -120,6 +125,7 @@ const MetadataField = ({
120
125
  dataValue={dataValue}
121
126
  description={description}
122
127
  displayName={displayName}
128
+ isDisabled={isDisabled}
123
129
  onChange={onChange}
124
130
  onRemove={onRemove}
125
131
  options={options}
@@ -134,6 +140,7 @@ const MetadataField = ({
134
140
  dataValue={dataValue}
135
141
  description={description}
136
142
  displayName={displayName}
143
+ isDisabled={isDisabled}
137
144
  onChange={onChange}
138
145
  onRemove={onRemove}
139
146
  options={options}
@@ -147,6 +154,7 @@ const MetadataField = ({
147
154
  dataValue={dataValue}
148
155
  description={description}
149
156
  displayName={displayName}
157
+ isDisabled={isDisabled}
150
158
  onChange={onChange}
151
159
  onRemove={onRemove}
152
160
  />
@@ -18,6 +18,7 @@ type Props = {
18
18
  dataValue?: MetadataFieldValue,
19
19
  description?: string,
20
20
  displayName: string,
21
+ isDisabled?: boolean,
21
22
  onChange: (key: string, value: MetadataFieldValue) => void,
22
23
  onRemove: (key: string) => void,
23
24
  options?: Array<MetadataTemplateFieldOption>,
@@ -29,6 +30,7 @@ const MultiSelectMetadataField = ({
29
30
  dataValue,
30
31
  displayName,
31
32
  description,
33
+ isDisabled,
32
34
  onChange,
33
35
  onRemove,
34
36
  options = [],
@@ -41,6 +43,7 @@ const MultiSelectMetadataField = ({
41
43
  {!!description && <i className="bdl-MultiSelectMetadataField-desc">{description}</i>}
42
44
  <MultiSelect
43
45
  blurExceptionClassNames={blurExceptionClassNames}
46
+ isDisabled={isDisabled}
44
47
  isEscapedWithReference
45
48
  isScrollable
46
49
  onChange={(selectedOptions: Array<SelectOptionProp>) => {
@@ -1,6 +1,6 @@
1
1
  // @flow
2
2
  import * as React from 'react';
3
- import { injectIntl } from 'react-intl';
3
+ import { useIntl } from 'react-intl';
4
4
 
5
5
  import TextInput from '../../components/text-input';
6
6
 
@@ -14,7 +14,7 @@ type Props = {
14
14
  description?: string,
15
15
  displayName: string,
16
16
  error?: React.Node,
17
- intl: any,
17
+ isDisabled?: boolean,
18
18
  onChange: (key: string, value: MetadataFieldValue) => void,
19
19
  onRemove: (key: string) => void,
20
20
  type?: string,
@@ -26,11 +26,13 @@ const TextMetadataField = ({
26
26
  displayName,
27
27
  description,
28
28
  error,
29
- intl,
29
+ isDisabled,
30
30
  onChange,
31
31
  onRemove,
32
32
  type = 'text',
33
33
  }: Props) => {
34
+ const { formatMessage } = useIntl();
35
+
34
36
  let value = '';
35
37
 
36
38
  if (typeof dataValue === 'number') {
@@ -45,6 +47,7 @@ const TextMetadataField = ({
45
47
  description={description}
46
48
  error={error}
47
49
  hideOptionalLabel
50
+ disabled={isDisabled}
48
51
  label={displayName}
49
52
  name={dataKey}
50
53
  onChange={(event: SyntheticKeyboardEvent<HTMLInputElement>) => {
@@ -55,12 +58,11 @@ const TextMetadataField = ({
55
58
  onRemove(dataKey);
56
59
  }
57
60
  }}
58
- placeholder={intl.formatMessage(messages.metadataFieldSetValue)}
61
+ placeholder={formatMessage(messages.metadataFieldSetValue)}
59
62
  type={type}
60
63
  value={value}
61
64
  />
62
65
  );
63
66
  };
64
67
 
65
- export { TextMetadataField as TextMetadataFieldBase };
66
- export default injectIntl(TextMetadataField);
68
+ export default TextMetadataField;
@@ -1,14 +1,65 @@
1
1
  import * as React from 'react';
2
+ import { render, screen } from '../../../test-utils/testing-library';
2
3
 
3
- import { DateMetadataFieldBase as DateMetadataField } from '../DateMetadataField';
4
+ import DateMetadataField from '../DateMetadataField';
4
5
 
5
- describe('features/metadata-instance-editor/fields/DateMetadataField', () => {
6
- const intl = {
7
- formatMessage: jest.fn(),
8
- };
6
+ describe('DateMetadataField', () => {
7
+ const getDateFieldBaseProps = (props = {}) => ({
8
+ dataKey: 'testKeyDate',
9
+ displayName: 'Test Date Field',
10
+ onChange: jest.fn(),
11
+ onRemove: jest.fn(),
12
+ dataValue: '2023-01-15T00:00:00.000Z',
13
+ canEdit: true,
14
+ ...props,
15
+ });
16
+
17
+ test('should correctly render a date field with its value', () => {
18
+ const testDate = '2024-07-26T00:00:00.000Z';
19
+ render(
20
+ <DateMetadataField
21
+ {...getDateFieldBaseProps({
22
+ dataValue: testDate,
23
+ displayName: 'My Test Date',
24
+ })}
25
+ />,
26
+ );
27
+
28
+ const dateInput = screen.getByRole('textbox', { name: 'My Test Date' });
29
+ expect(dateInput).toBeInTheDocument();
30
+ expect(dateInput).toHaveValue('July 26, 2024');
31
+ });
32
+
33
+ test('should display description when provided', () => {
34
+ const descriptionText = 'This is a date field description.';
35
+ render(
36
+ <DateMetadataField
37
+ {...getDateFieldBaseProps({
38
+ displayName: 'My Date With Desc',
39
+ description: descriptionText,
40
+ })}
41
+ />,
42
+ );
43
+
44
+ const dateInput = screen.getByRole('textbox', { name: 'My Date With Desc This is a date field description.' });
45
+ expect(dateInput).toBeInTheDocument();
46
+ expect(screen.getByText(descriptionText)).toBeInTheDocument();
47
+ });
48
+
49
+ test('should render as disabled when isDisabled is true', () => {
50
+ render(<DateMetadataField {...getDateFieldBaseProps({ isDisabled: true })} />);
51
+ expect(screen.getByRole('textbox', { name: 'Test Date Field' })).toBeDisabled();
52
+ });
53
+
54
+ test('should render as enabled when isDisabled is false', () => {
55
+ render(<DateMetadataField {...getDateFieldBaseProps({ isDisabled: false })} />);
56
+ expect(screen.getByRole('textbox', { name: 'Test Date Field' })).not.toBeDisabled();
57
+ });
9
58
 
10
- test('should correctly render a date field', () => {
11
- const wrapper = shallow(<DateMetadataField dataValue="2018-06-13T00:00:00.000Z" intl={intl} />);
12
- expect(wrapper).toMatchSnapshot();
59
+ test('should render as enabled when isDisabled is not provided', () => {
60
+ const props = getDateFieldBaseProps();
61
+ delete props.isDisabled;
62
+ render(<DateMetadataField {...props} />);
63
+ expect(screen.getByRole('textbox', { name: 'Test Date Field' })).not.toBeDisabled();
13
64
  });
14
65
  });