learningtribes-studio-frontend 1.4.1 → 1.4.2-alpha.1

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 (33) hide show
  1. package/dist/accessibilityPolicy.min.js +2 -2
  2. package/dist/assets.min.css +1 -1
  3. package/dist/assets.min.js +1 -1
  4. package/dist/assets.min.js.map +1 -1
  5. package/dist/common.min.css +2 -2
  6. package/dist/common.min.js +9 -9
  7. package/dist/common.min.js.map +1 -1
  8. package/dist/courseHealthCheck.min.js +1 -1
  9. package/dist/courseOutlineHealthCheck.min.js +1 -1
  10. package/dist/editImageModal.min.css +1 -1
  11. package/dist/editImageModal.min.js +1 -1
  12. package/dist/editImageModal.min.js.map +1 -1
  13. package/dist/i18n/messages/ar.json +0 -3
  14. package/dist/i18n/messages/es_419.json +0 -3
  15. package/dist/i18n/messages/fr.json +0 -3
  16. package/dist/i18n/messages/zh_CN.json +0 -3
  17. package/dist/i18nMessages.min.js +1 -1
  18. package/dist/i18nMessages.min.js.map +1 -1
  19. package/package.json +1 -1
  20. package/src/components/AssetsDropZone/AssetsDropZone.scss +88 -20
  21. package/src/components/AssetsDropZone/displayMessages.jsx +2 -2
  22. package/src/components/AssetsDropZone/index.jsx +18 -17
  23. package/src/components/AssetsList/AssetsList.scss +132 -0
  24. package/src/components/AssetsList/index.jsx +75 -68
  25. package/src/components/EditImageModal/EditImageModal.scss +77 -0
  26. package/src/components/EditImageModal/EditImageModal.test.jsx +9 -160
  27. package/src/components/EditImageModal/displayMessages.jsx +2 -17
  28. package/src/components/EditImageModal/index.jsx +37 -81
  29. package/src/data/i18n/default/transifex_input.json +0 -3
  30. package/src/data/i18n/locales/ar.json +0 -3
  31. package/src/data/i18n/locales/es_419.json +0 -3
  32. package/src/data/i18n/locales/fr.json +0 -3
  33. package/src/data/i18n/locales/zh_CN.json +0 -3
@@ -72,57 +72,64 @@ export default class AssetsList extends React.Component {
72
72
  }
73
73
  }
74
74
 
75
- getAssetsListHeader = () => (
76
- <div className={classNames(styles['list-header'], 'row')}>
77
- <span className="col-6 offset-3" data-identifier="asset-file-name" id="name-header"><WrappedMessage message={messages.assetsListNameLabel} /></span>
78
- <span className="col-3" data-identifier="asset-date-added" id="date-added-header"><WrappedMessage message={messages.assetsListDateLabel} /></span>
79
- </div>
80
- )
81
-
82
- getAssetListItem = (asset, index) => {
75
+ getFileExtension = (displayName) => {
76
+ if (!displayName) return '';
77
+ const lastDot = displayName.lastIndexOf('.');
78
+ if (lastDot === -1 || lastDot === displayName.length - 1) {
79
+ return 'file';
80
+ }
81
+ return displayName.substring(lastDot + 1).toLowerCase();
82
+ }
83
+
84
+ formatFileSize = (bytes) => {
85
+ if (!bytes || bytes === 0) return '';
86
+ const units = ['B', 'KB', 'MB', 'GB'];
87
+ const k = 1024;
88
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
89
+ const size = (bytes / Math.pow(k, i)).toFixed(i === 0 ? 0 : 1);
90
+ return `${size} ${units[i]}`;
91
+ }
92
+
93
+ getAssetGridItem = (asset, index) => {
83
94
  const isSelected = this.props.selectedAsset.id === asset.id;
95
+ const baseUrl = this.props.courseDetails.base_url || '';
96
+ const fileExt = this.getFileExtension(asset.display_name);
97
+ const fileSize = this.formatFileSize(asset.file_size);
84
98
 
85
99
  return (
86
- <li
87
- // prevent clicking on list item from triggering parent's focus
100
+ <div
88
101
  onMouseDown={(e) => { e.preventDefault(); this.onAssetClick(asset, index); }}
89
- className={classNames('list-group-item list-group-item-action', { active: isSelected })}
102
+ className={classNames(styles['asset-grid-item'], { [styles.selected]: isSelected })}
90
103
  id={`asset-list-option-${index}`}
91
104
  aria-selected={isSelected}
92
105
  role="option"
93
- key={asset.display_name}
106
+ key={asset.id || asset.display_name}
94
107
  tabIndex="-1"
95
- aria-labelledby={`name-header asset-name-${index} date-added-header asset-date-${index}`}
96
108
  >
97
- <div className="row">
98
- {this.getThumbnailElement(asset.thumbnail)}
99
- {this.getDisplayNameElement(asset.display_name, index)}
100
- {this.getDateAddedElement(asset.date_added, index)}
109
+ <div className={styles['asset-preview']}>
110
+ <span className={styles['file-type-badge']}>{fileExt}</span>
111
+ {asset.thumbnail ? (
112
+ <img
113
+ className={styles['asset-thumbnail']}
114
+ src={`${baseUrl}${asset.thumbnail}`}
115
+ alt=""
116
+ />
117
+ ) : (
118
+ <div className={styles['asset-icon']}>
119
+ <i className="far fa-image" />
120
+ </div>
121
+ )}
122
+ </div>
123
+ <div className={styles['asset-info']}>
124
+ <div className={classNames(styles['asset-name'], { [styles.selected]: isSelected })} title={asset.display_name}>
125
+ {asset.display_name}
126
+ </div>
127
+ {fileSize && (
128
+ <div className={styles['asset-size']}>
129
+ {fileSize}
130
+ </div>
131
+ )}
101
132
  </div>
102
- </li>
103
- );
104
- }
105
-
106
- getDateAddedElement = (dateAdded, index) => (
107
- <span id={`asset-date-${index}`} className="col-3" data-identifier="asset-date-added">{dateAdded}</span>
108
- );
109
-
110
- getDisplayNameElement = (displayName, index) => (
111
- <span id={`asset-name-${index}`} className="col-6" data-identifier="asset-file-name">{displayName}</span>
112
- );
113
-
114
- getImageThumbnail(thumbnail) {
115
- const baseUrl = this.props.courseDetails.base_url || '';
116
-
117
- return (
118
- <div className={styles['assets-list-image-preview-container']}>
119
- {
120
- thumbnail ?
121
- <img className={styles['assets-list-image-preview-image']} src={`${baseUrl}${thumbnail}`} alt="" data-identifier="asset-image-thumbnail" /> :
122
- <WrappedMessage message={messages.assetsListNoPreview} >
123
- {displayText => <span className={classNames('text-center')} data-identifier="asset-image-thumbnail">{displayText}</span>}
124
- </WrappedMessage>
125
- }
126
133
  </div>
127
134
  );
128
135
  }
@@ -130,17 +137,11 @@ export default class AssetsList extends React.Component {
130
137
  getSelectedAssetIndex = (assetsList, selectedAsset) => (assetsList.findIndex(
131
138
  asset => asset.id === selectedAsset.id));
132
139
 
133
- getThumbnailElement = thumbnail => (
134
- <span aria-hidden className="col">{this.getImageThumbnail(thumbnail)}</span>
135
- );
136
-
137
140
  handleKeyDown = (e) => {
138
141
  switch (e.key) {
139
- case 'ArrowDown': {
140
- // prevent scrolling entire modal body with arrow keys
142
+ case 'ArrowRight': {
141
143
  e.preventDefault();
142
-
143
- if (this.state.selectedAssetIndex < this.props.paginationMetadata.pageSize - 1) {
144
+ if (this.state.selectedAssetIndex < this.props.assetsList.length - 1) {
144
145
  this.setState(
145
146
  (state, props) => ({
146
147
  selectedAssetIndex: this.state.selectedAssetIndex + 1,
@@ -151,10 +152,8 @@ export default class AssetsList extends React.Component {
151
152
  }
152
153
  break;
153
154
  }
154
- case 'ArrowUp': {
155
- // prevent scrolling entire modal body with arrow keys
155
+ case 'ArrowLeft': {
156
156
  e.preventDefault();
157
-
158
157
  if (this.state.selectedAssetIndex > 0) {
159
158
  this.setState(
160
159
  (state, props) => ({
@@ -171,29 +170,36 @@ export default class AssetsList extends React.Component {
171
170
  }
172
171
 
173
172
  render = () => {
174
- const assetsListItems = this.props.assetsList.map((asset, index) =>
175
- this.getAssetListItem(asset, index));
173
+ const assetsGridItems = this.props.assetsList.map((asset, index) =>
174
+ this.getAssetGridItem(asset, index));
176
175
 
177
176
  return (
178
- <React.Fragment>
179
- {this.getAssetsListHeader()}
180
- <ol
181
- aria-activedescendant={this.state.selectedAssetIndex > -1 ? `asset-list-option-${this.state.selectedAssetIndex}` : null}
182
- className="list-group"
183
- onFocus={this.onListBoxFocus}
184
- onKeyDown={this.handleKeyDown}
185
- role="listbox"
186
- tabIndex="0"
187
- >
188
- {assetsListItems}
189
- </ol>
190
- </React.Fragment>
177
+ <div
178
+ aria-activedescendant={this.state.selectedAssetIndex > -1 ? `asset-list-option-${this.state.selectedAssetIndex}` : null}
179
+ className={styles['assets-grid']}
180
+ onFocus={this.onListBoxFocus}
181
+ onKeyDown={this.handleKeyDown}
182
+ role="listbox"
183
+ tabIndex="0"
184
+ >
185
+ {assetsGridItems}
186
+ </div>
191
187
  );
192
188
  };
193
189
  }
194
190
 
195
191
  AssetsList.propTypes = {
196
- assetsList: PropTypes.arrayOf(PropTypes.object).isRequired,
192
+ assetsList: PropTypes.arrayOf(PropTypes.shape({
193
+ display_name: PropTypes.string,
194
+ content_type: PropTypes.string,
195
+ url: PropTypes.string,
196
+ date_added: PropTypes.string,
197
+ id: PropTypes.string,
198
+ portable_url: PropTypes.string,
199
+ thumbnail: PropTypes.string,
200
+ external_url: PropTypes.string,
201
+ file_size: PropTypes.number,
202
+ })).isRequired,
197
203
  courseDetails: PropTypes.shape({
198
204
  lang: PropTypes.string,
199
205
  url_name: PropTypes.string,
@@ -222,5 +228,6 @@ AssetsList.propTypes = {
222
228
  portable_url: PropTypes.string,
223
229
  thumbnail: PropTypes.string,
224
230
  external_url: PropTypes.string,
231
+ file_size: PropTypes.number,
225
232
  }).isRequired,
226
233
  };
@@ -7,6 +7,7 @@
7
7
 
8
8
  .modal-dialog {
9
9
  max-width: $modal-lg;
10
+ margin: 40px auto;
10
11
  }
11
12
 
12
13
  // --- Copied from: https://github.com/edx/paragon/blob/master/src/Fieldset/Fieldset.scss
@@ -17,6 +18,12 @@
17
18
  width: auto;
18
19
  margin-bottom: 0;
19
20
  }
21
+
22
+ fieldset {
23
+ border: none;
24
+ padding: 0;
25
+ margin: 0;
26
+ }
20
27
  }
21
28
 
22
29
  .form-control.is-invalid.is-invalid-nodanger {
@@ -76,3 +83,73 @@
76
83
  .invalid-feedback {
77
84
  font-size: $font-size-base;
78
85
  }
86
+
87
+ .modal-body {
88
+ // Form fields
89
+ form {
90
+ .paragon-fieldset {
91
+ margin-bottom: 1.5rem;
92
+
93
+ fieldset {
94
+ legend {
95
+ font-size: 14px;
96
+ font-weight: 500;
97
+ color: #333;
98
+ margin-bottom: 0.5rem;
99
+ }
100
+ }
101
+ }
102
+
103
+ .form-group {
104
+ margin-bottom: 1rem;
105
+
106
+ label {
107
+ font-size: 14px;
108
+ font-weight: 500;
109
+ color: #333;
110
+ }
111
+
112
+ .form-control {
113
+ border-radius: 8px;
114
+ border: 1px solid #e0e0e0;
115
+ padding: 10px 14px;
116
+ font-size: 14px;
117
+
118
+ &:focus {
119
+ border-color: #e0e0e0;
120
+ box-shadow: none;
121
+ }
122
+ }
123
+
124
+ .form-text {
125
+ font-size: 12px;
126
+ color: #666;
127
+ margin-top: 4px;
128
+ }
129
+ }
130
+ }
131
+
132
+ // Dimensions row
133
+ .form-row {
134
+ .col {
135
+ .form-group {
136
+ label {
137
+ font-size: 14px;
138
+ font-weight: 500;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ // Checkbox
146
+ .form-check {
147
+ .form-check-input {
148
+ margin-top: 0.25rem;
149
+ }
150
+
151
+ .form-check-label {
152
+ font-size: 14px;
153
+ color: #333;
154
+ }
155
+ }
@@ -47,9 +47,6 @@ const getImageDescriptionFieldset = editImageModal =>
47
47
  (getFormContainer(editImageModal).find(Fieldset).at(0));
48
48
  const getImageDescriptionInput = editImageModal =>
49
49
  (getImageDescriptionFieldset(editImageModal).find(InputText));
50
- const getImageDescriptionInputCheckBox = editImageModal =>
51
- (getImageDescriptionFieldset(editImageModal).find(CheckBox));
52
-
53
50
  const getImageDimensionsFieldset = editImageModal =>
54
51
  (getFormContainer(editImageModal).find(Fieldset).at(1));
55
52
  const getImageDimensionsWidthInput = editImageModal =>
@@ -488,36 +485,6 @@ describe('EditImageModal', () => {
488
485
  });
489
486
  });
490
487
 
491
- describe('a image description CheckBox with', () => {
492
- it('a CheckBox', () => {
493
- expect(getImageDescriptionInputCheckBox(editImageModal)).toHaveLength(1);
494
- });
495
-
496
- it('correct initial props', () => {
497
- const imageDescriptionInputCheckbox =
498
- getImageDescriptionInputCheckBox(editImageModal);
499
-
500
- expect(imageDescriptionInputCheckbox.prop('id')).toEqual('isDecorative');
501
- expect(imageDescriptionInputCheckbox.prop('id')).toEqual('isDecorative');
502
-
503
- expect(shallowWithIntl(imageDescriptionInputCheckbox.prop('label')).prop('message'))
504
- .toEqual(messages.editImageModalImageIsDecorativeCheckboxLabel);
505
-
506
- expect(imageDescriptionInputCheckbox.prop('checked')).toEqual(false);
507
- });
508
-
509
- it('a Learn More link in description', () => {
510
- /*
511
- Due to Enzyme issue #1213, we must wrap React Fragments in a div in order
512
- to succesfully shallow them. Once Enzyme introduces support for React Fragments,
513
- we can remove the extraneous div.
514
- */
515
- const imageDescriptionInputCheckBoxDescriptionMessages = shallowWithIntl(<div>{getImageDescriptionInputCheckBox(editImageModal).prop('description')}</div>).find(WrappedMessage);
516
- expect(imageDescriptionInputCheckBoxDescriptionMessages.at(1).prop('children')().type).toEqual('a');
517
- expect(imageDescriptionInputCheckBoxDescriptionMessages.at(1).prop('message'))
518
- .toEqual(messages.editImageModalLearnMore);
519
- });
520
- });
521
488
  });
522
489
 
523
490
  describe('an imageDimensions Fieldset with', () => {
@@ -620,7 +587,6 @@ describe('EditImageModal', () => {
620
587
  expect(editImageModal.state('imageDimensions')).toEqual({});
621
588
  expect(editImageModal.state('imageSource')).toEqual('');
622
589
  expect(editImageModal.state('imageStyle')).toEqual('');
623
- expect(editImageModal.state('isImageDecorative')).toEqual(false);
624
590
  expect(editImageModal.state('isImageDescriptionValid')).toEqual(true);
625
591
  expect(editImageModal.state('isImageLoaded')).toEqual(false);
626
592
  expect(editImageModal.state('isImageLoading')).toEqual(false);
@@ -648,7 +614,6 @@ describe('EditImageModal', () => {
648
614
  expect(editImageModal.state('imageDimensions')).toEqual({});
649
615
  expect(editImageModal.state('imageSource')).toEqual('');
650
616
  expect(editImageModal.state('imageStyle')).toEqual('');
651
- expect(editImageModal.state('isImageDecorative')).toEqual(false);
652
617
  expect(editImageModal.state('isImageDescriptionValid')).toEqual(true);
653
618
  expect(editImageModal.state('isImageLoaded')).toEqual(false);
654
619
  expect(editImageModal.state('isImageLoading')).toEqual(false);
@@ -672,7 +637,6 @@ describe('EditImageModal', () => {
672
637
  expect(editImageModal.state('imageDimensions')).toEqual({});
673
638
  expect(editImageModal.state('imageSource')).toEqual('');
674
639
  expect(editImageModal.state('imageStyle')).toEqual('');
675
- expect(editImageModal.state('isImageDecorative')).toEqual(false);
676
640
  expect(editImageModal.state('isImageDescriptionValid')).toEqual(true);
677
641
  expect(editImageModal.state('isImageLoaded')).toEqual(false);
678
642
  expect(editImageModal.state('isImageLoading')).toEqual(false);
@@ -712,7 +676,6 @@ describe('EditImageModal', () => {
712
676
  });
713
677
  expect(editImageModal.state('imageStyle')).toEqual(sampleText);
714
678
  expect(editImageModal.state('imageSource')).toEqual(sampleText);
715
- expect(editImageModal.state('isImageDecorative')).toEqual(false);
716
679
  expect(editImageModal.state('isImageDescriptionValid')).toEqual(true);
717
680
  expect(editImageModal.state('isImageLoaded')).toEqual(true);
718
681
  expect(editImageModal.state('isImageLoading')).toEqual(false);
@@ -956,23 +919,6 @@ describe('EditImageModal', () => {
956
919
  expect(editImageModal.state('currentValidationMessages')).toEqual({});
957
920
  });
958
921
 
959
- it('this.state.currentValidationMessages has correct validation messages when invalid form submitted', () => {
960
- getInsertImageButton(editImageModal).simulate('click');
961
-
962
- expect(editImageModal.state('currentValidationMessages').imageDescription.props.message).toEqual(messages.editImageModalFormValidImageDescription);
963
- });
964
-
965
- it('this.state.currentValidationMessages has correct validation message when invalid image description submitted', () => {
966
- editImageModal.setState({
967
- imageSource: sampleText,
968
- });
969
-
970
- getInsertImageButton(editImageModal).simulate('click');
971
-
972
- expect(editImageModal.state('currentValidationMessages')).not.toHaveProperty('imageDimensions');
973
- expect(editImageModal.state('currentValidationMessages').imageDescription.props.message).toEqual(messages.editImageModalFormValidImageDescription);
974
- });
975
-
976
922
  it('this.state.currentValidationMessages has correct validation message when invalid image dimensions submitted', () => {
977
923
  editImageModal.setState({
978
924
  imageSource: sampleText,
@@ -1008,7 +954,7 @@ describe('EditImageModal', () => {
1008
954
  expect(editImageModal.state('currentValidationMessages')).not.toHaveProperty('imageDescription');
1009
955
  });
1010
956
 
1011
- it('status alert has correct validation messages when invalid form submitted', () => {
957
+ it('status alert has correct validation message when invalid dimensions submitted', () => {
1012
958
  editImageModal.setState({
1013
959
  imageDimensions: {
1014
960
  height: (-1 * sampleImgData.naturalHeight),
@@ -1021,9 +967,8 @@ describe('EditImageModal', () => {
1021
967
  editImageModal.update();
1022
968
 
1023
969
  const statusAlertListItems = shallowWithIntl(getStatusAlert(editImageModal).prop('dialog')).find('div ul.bullet-list li a');
1024
- expect(statusAlertListItems).toHaveLength(2);
1025
- expect(statusAlertListItems.at(0).find(WrappedMessage).prop('message')).toEqual(messages.editImageModalFormValidImageDescription);
1026
- expect(statusAlertListItems.at(1).find(WrappedMessage).prop('message')).toEqual(messages.editImageModalFormValidImageDimensions);
970
+ expect(statusAlertListItems).toHaveLength(1);
971
+ expect(statusAlertListItems.at(0).find(WrappedMessage).prop('message')).toEqual(messages.editImageModalFormValidImageDimensions);
1027
972
  });
1028
973
 
1029
974
  it('validation messages are hyperlinks that navigate to appropriate form elements', () => {
@@ -1040,32 +985,8 @@ describe('EditImageModal', () => {
1040
985
  editImageModal.update();
1041
986
 
1042
987
  const statusAlertListItems = shallowWithIntl(getStatusAlert(editImageModal).prop('dialog')).find('div ul.bullet-list li a');
1043
- expect(statusAlertListItems).toHaveLength(2);
1044
- expect(statusAlertListItems.at(0).prop('href')).toEqual('#imageDescription');
1045
- expect(statusAlertListItems.at(1).prop('href')).toEqual('#imageWidth');
1046
- });
1047
-
1048
- it('status alert has correct validation message when invalid image description submitted', () => {
1049
- editImageModal.setState({
1050
- imageSource: sampleText,
1051
- });
1052
-
1053
- getModalBody(editImageModal).find('img').simulate('load', { target: { ...sampleImgData } });
1054
-
1055
- getInsertImageButton(editImageModal).simulate('click');
1056
-
1057
- editImageModal.update();
1058
-
1059
- const statusAlert = getStatusAlert(editImageModal);
1060
-
1061
- const validationMessages = shallowWithIntl(statusAlert.prop('dialog')).find(WrappedMessage);
1062
- expect(validationMessages).toHaveLength(2);
1063
- expect(validationMessages.at(0).prop('message')).toEqual(messages.editImageModalFormErrorMissingFields);
1064
- expect(validationMessages.at(1).prop('message')).toEqual(messages.editImageModalFormValidImageDescription);
1065
-
1066
- const statusAlertListItems = shallowWithIntl(statusAlert.prop('dialog')).find('div ul.bullet-list li a');
1067
988
  expect(statusAlertListItems).toHaveLength(1);
1068
- expect(statusAlertListItems.at(0).find(WrappedMessage).prop('message')).toEqual(messages.editImageModalFormValidImageDescription);
989
+ expect(statusAlertListItems.at(0).prop('href')).toEqual('#imageWidth');
1069
990
  });
1070
991
 
1071
992
  it('status alert has correct validation message when invalid image dimensions submitted', () => {
@@ -1340,79 +1261,6 @@ describe('EditImageModal', () => {
1340
1261
  expect(editImageModal.state('imageDescription')).toEqual(sampleText);
1341
1262
  });
1342
1263
 
1343
- it('sets this.state.isImageDecorative with value on checkbox onChange', () => {
1344
- const isImageDecoractiveCheckBox = getImageDescriptionInputCheckBox(editImageModal);
1345
-
1346
- isImageDecoractiveCheckBox.simulate('change', true);
1347
-
1348
- expect(editImageModal.state('isImageDecorative')).toEqual(true);
1349
-
1350
- isImageDecoractiveCheckBox.simulate('change', false);
1351
-
1352
- expect(editImageModal.state('isImageDecorative')).toEqual(false);
1353
- });
1354
-
1355
- it('sends this.state.isImageDecorative as checkbox checked prop to image description checkbox', () => {
1356
- editImageModal.setState({
1357
- isImageDecorative: true,
1358
- });
1359
-
1360
- expect(getImageDescriptionInputCheckBox(editImageModal).prop('checked')).toEqual(true);
1361
-
1362
- editImageModal.setState({
1363
- isImageDecorative: false,
1364
- });
1365
-
1366
- expect(getImageDescriptionInputCheckBox(editImageModal).prop('checked')).toEqual(false);
1367
- });
1368
-
1369
- it('toggles image description input disabled prop via checkbox', () => {
1370
- getImageDescriptionInputCheckBox(editImageModal).simulate('change', true);
1371
-
1372
- editImageModal.update();
1373
-
1374
- expect(getImageDescriptionInput(editImageModal).prop('disabled')).toEqual(true);
1375
-
1376
- getImageDescriptionInputCheckBox(editImageModal).simulate('change', false);
1377
-
1378
- editImageModal.update();
1379
-
1380
- expect(getImageDescriptionInput(editImageModal).prop('disabled')).toEqual(false);
1381
- });
1382
-
1383
- it('returns correct feedback for invalid description (uses initial state)', () => {
1384
- const feedback = editImageModal.instance().validateImageDescription();
1385
-
1386
- expect(feedback.isValid).toEqual(false);
1387
- expect(shallowWithIntl(feedback.validationMessage).prop('message'))
1388
- .toEqual(messages.editImageModalFormValidImageDescription);
1389
- expect(shallowWithIntl(feedback.dangerIconDescription).prop('message'))
1390
- .toEqual(messages.editImageModalFormError);
1391
- });
1392
-
1393
- it('returns correct feedback for valid description (with non-empty description)', () => {
1394
- editImageModal.setState({
1395
- imageDescription: sampleText,
1396
- });
1397
-
1398
- const feedback = editImageModal.instance().validateImageDescription();
1399
-
1400
- expect(feedback.isValid).toEqual(true);
1401
- expect(feedback.validationMessage).toBeUndefined();
1402
- expect(feedback.dangerIconDescription).toBeUndefined();
1403
- });
1404
-
1405
- it('returns correct feedback for valid description (with checked checkbox)', () => {
1406
- editImageModal.setState({
1407
- isImageDecorative: true,
1408
- });
1409
-
1410
- const feedback = editImageModal.instance().validateImageDescription();
1411
-
1412
- expect(feedback.isValid).toEqual(true);
1413
- expect(feedback.validationMessage).toBeUndefined();
1414
- expect(feedback.dangerIconDescription).toBeUndefined();
1415
- });
1416
1264
  });
1417
1265
 
1418
1266
  describe('Image Dimensions Fieldset', () => {
@@ -1789,10 +1637,11 @@ describe('EditImageModal', () => {
1789
1637
  expect(dispatchEventSpy.mock.calls[0][0].detail.alt).toEqual(sampleText);
1790
1638
  });
1791
1639
 
1792
- it('sends empty string in submitForm event if this.state.imageIsDecorative', () => {
1793
- getImageDescriptionInput(editImageModal).simulate('blur', sampleText);
1794
-
1795
- getImageDescriptionInputCheckBox(editImageModal).simulate('change', true);
1640
+ it('sends empty string in submitForm event when description is empty', () => {
1641
+ editImageModal.setState({
1642
+ imageDescription: '',
1643
+ imageSource: sampleText,
1644
+ });
1796
1645
 
1797
1646
  getInsertImageButton(editImageModal).simulate('click');
1798
1647
 
@@ -66,16 +66,6 @@ const messages = defineMessages({
66
66
  defaultMessage: 'Height',
67
67
  description: 'Label for the text input box for an image\'s height,',
68
68
  },
69
- editImageModalImageIsDecorativeCheckboxDescription: {
70
- id: 'editImageModalImageIsDecorativeCheckboxDescription',
71
- defaultMessage: 'This image is a background or other image that does not require alternative text.',
72
- description: 'Description for a checkbox that explains what it means for an image to be decorative',
73
- },
74
- editImageModalImageIsDecorativeCheckboxLabel: {
75
- id: 'editImageModalImageIsDecorativeCheckboxLabel',
76
- defaultMessage: 'This image is decorative only',
77
- description: 'Label for a checkbox that denotes that an image is decorative',
78
- },
79
69
  editImageModalImagePreviewText: {
80
70
  id: 'editImageModalImagePreviewText',
81
71
  defaultMessage: 'Image Preview',
@@ -83,8 +73,8 @@ const messages = defineMessages({
83
73
  },
84
74
  editImageModalInsertImageButton: {
85
75
  id: 'editImageModalInsertImageButton',
86
- defaultMessage: 'Insert Image',
87
- description: 'Text inside the Insert Image button at the bottom of the modal',
76
+ defaultMessage: 'Save',
77
+ description: 'Text inside the Save button at the bottom of the modal',
88
78
  },
89
79
  editImageModalLearnMore: {
90
80
  id: 'editImageModalLearnMore',
@@ -116,11 +106,6 @@ const messages = defineMessages({
116
106
  defaultMessage: 'Edit Image Settings',
117
107
  description: 'Title of the modal used for editing image settings',
118
108
  },
119
- editImageModalImageOrFields: {
120
- id: 'editImageModalImageOrFields',
121
- defaultMessage: 'or',
122
- description: 'Describes two choices,',
123
- },
124
109
  editImageModalNextPageButton: {
125
110
  id: 'editImageModalNextPageButton',
126
111
  defaultMessage: 'Next',