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.
- package/dist/accessibilityPolicy.min.js +2 -2
- package/dist/assets.min.css +1 -1
- package/dist/assets.min.js +1 -1
- package/dist/assets.min.js.map +1 -1
- package/dist/common.min.css +2 -2
- package/dist/common.min.js +9 -9
- package/dist/common.min.js.map +1 -1
- package/dist/courseHealthCheck.min.js +1 -1
- package/dist/courseOutlineHealthCheck.min.js +1 -1
- package/dist/editImageModal.min.css +1 -1
- package/dist/editImageModal.min.js +1 -1
- package/dist/editImageModal.min.js.map +1 -1
- package/dist/i18n/messages/ar.json +0 -3
- package/dist/i18n/messages/es_419.json +0 -3
- package/dist/i18n/messages/fr.json +0 -3
- package/dist/i18n/messages/zh_CN.json +0 -3
- package/dist/i18nMessages.min.js +1 -1
- package/dist/i18nMessages.min.js.map +1 -1
- package/package.json +1 -1
- package/src/components/AssetsDropZone/AssetsDropZone.scss +88 -20
- package/src/components/AssetsDropZone/displayMessages.jsx +2 -2
- package/src/components/AssetsDropZone/index.jsx +18 -17
- package/src/components/AssetsList/AssetsList.scss +132 -0
- package/src/components/AssetsList/index.jsx +75 -68
- package/src/components/EditImageModal/EditImageModal.scss +77 -0
- package/src/components/EditImageModal/EditImageModal.test.jsx +9 -160
- package/src/components/EditImageModal/displayMessages.jsx +2 -17
- package/src/components/EditImageModal/index.jsx +37 -81
- package/src/data/i18n/default/transifex_input.json +0 -3
- package/src/data/i18n/locales/ar.json +0 -3
- package/src/data/i18n/locales/es_419.json +0 -3
- package/src/data/i18n/locales/fr.json +0 -3
- 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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
<
|
|
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('
|
|
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=
|
|
98
|
-
{
|
|
99
|
-
{
|
|
100
|
-
|
|
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 '
|
|
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 '
|
|
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
|
|
175
|
-
this.
|
|
173
|
+
const assetsGridItems = this.props.assetsList.map((asset, index) =>
|
|
174
|
+
this.getAssetGridItem(asset, index));
|
|
176
175
|
|
|
177
176
|
return (
|
|
178
|
-
<
|
|
179
|
-
{this.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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.
|
|
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
|
|
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(
|
|
1025
|
-
expect(statusAlertListItems.at(0).find(WrappedMessage).prop('message')).toEqual(messages.
|
|
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).
|
|
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
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
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: '
|
|
87
|
-
description: 'Text inside the
|
|
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',
|