Skip to content

Commit a4b9cb7

Browse files
committed
added validation of image extensions
1 parent 534c9d1 commit a4b9cb7

File tree

12 files changed

+95
-15
lines changed

12 files changed

+95
-15
lines changed

src/bundle/Resources/public/js/scripts/fieldType/base/base-file-field.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
const isRequired = input.required || this.fieldContainer.classList.contains('ibexa-field-edit--required');
1717
const dataMaxSize = +input.dataset.maxFileSize;
1818
const maxFileSize = parseInt(dataMaxSize, 10);
19+
const allowedFileTypes = input.dataset.allowedFileTypes;
1920
const isEmpty = input.files && !input.files.length && dataContainer && !dataContainer.hasAttribute('hidden');
2021
let result = { isError: false };
2122

@@ -26,8 +27,14 @@
2627
};
2728
}
2829

29-
if (!isEmpty && maxFileSize > 0 && input.files[0] && input.files[0].size > maxFileSize) {
30-
result = this.validateFileSize(event);
30+
const file = input.files[0];
31+
32+
if (!isEmpty && maxFileSize > 0 && file && file.size > maxFileSize) {
33+
result = this.validateFileSize();
34+
}
35+
36+
if (!isEmpty && allowedFileTypes.length > 0 && file && !allowedFileTypes.includes(file.type)) {
37+
result = this.showFileTypeError();
3138
}
3239

3340
return result;
@@ -52,6 +59,16 @@
5259

5360
return result;
5461
}
62+
63+
showFileTypeError() {
64+
const label = this.fieldContainer.querySelector(SELECTOR_FIELD_LABEL).innerHTML;
65+
const result = {
66+
isError: true,
67+
errorMessage: ibexa.errors.invalidFileType.replace('{fieldName}', label),
68+
};
69+
70+
return result;
71+
}
5572
}
5673

5774
ibexa.addConfig('BaseFileFieldValidator', BaseFileFieldValidator);

src/bundle/Resources/public/js/scripts/fieldType/base/base-preview-field.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@
8787
return this.showFileSizeError();
8888
}
8989

90+
if (this.allowedFileTypes.length > 0 && !this.allowedFileTypes.includes(file.type)) {
91+
return this.showFileTypeError();
92+
}
93+
9094
const changeEvent = new Event('change');
9195

9296
this.inputField.files = event.dataTransfer.files;
@@ -102,6 +106,10 @@
102106
this.inputField.dispatchEvent(new CustomEvent('ibexa-invalid-file-size'));
103107
}
104108

109+
showFileTypeError() {
110+
this.inputField.dispatchEvent(new CustomEvent('ibexa-invalid-file-type'));
111+
}
112+
105113
/**
106114
* Checks whether a given file can be dropped onto a field
107115
*

src/bundle/Resources/public/js/scripts/fieldType/ezbinaryfile.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@
4141
callback: 'showFileSizeError',
4242
errorNodeSelectors: ['.ibexa-form-error'],
4343
},
44+
{
45+
isValueValidator: false,
46+
selector: `input[type="file"]`,
47+
eventName: 'ibexa-invalid-file-type',
48+
callback: 'showFileTypeError',
49+
errorNodeSelectors: ['.ibexa-form-error'],
50+
},
4451
],
4552
});
4653
const previewField = new EzBinaryFilePreviewField({

src/bundle/Resources/public/js/scripts/fieldType/ezimage.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,13 @@
123123
callback: 'showFileSizeError',
124124
errorNodeSelectors: ['.ibexa-form-error'],
125125
},
126+
{
127+
isValueValidator: false,
128+
selector: `${SELECTOR_INPUT_FILE}`,
129+
eventName: 'ibexa-invalid-file-type',
130+
callback: 'showFileTypeError',
131+
errorNodeSelectors: ['.ibexa-form-error'],
132+
},
126133
{
127134
isValueValidator: false,
128135
selector: SELECTOR_INPUT_ALT,

src/bundle/Resources/public/js/scripts/fieldType/ezimageasset.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@
187187
*/
188188
handleInputChange(event) {
189189
const [file] = event.currentTarget.files;
190-
const { languageCode } = event.currentTarget.dataset;
190+
const { languageCode, allowedFileTypes } = event.currentTarget.dataset;
191191
const isFileSizeLimited = this.maxFileSize > 0;
192192
const maxFileSizeExceeded = isFileSizeLimited && file.size > this.maxFileSize;
193193

@@ -196,6 +196,11 @@
196196
return;
197197
}
198198

199+
if (!allowedFileTypes.includes(file.type)) {
200+
this.resetInputField();
201+
return;
202+
}
203+
199204
this.fieldContainer.querySelector('.ibexa-field-edit__option--remove-media').checked = false;
200205

201206
this.createAsset(file, languageCode);
@@ -244,6 +249,13 @@
244249
callback: 'showFileSizeError',
245250
errorNodeSelectors: ['.ibexa-form-error'],
246251
},
252+
{
253+
isValueValidator: false,
254+
selector: `${SELECTOR_INPUT_FILE}`,
255+
eventName: 'ibexa-invalid-file-type',
256+
callback: 'showFileTypeError',
257+
errorNodeSelectors: ['.ibexa-form-error'],
258+
},
247259
],
248260
});
249261

src/bundle/Resources/public/js/scripts/fieldType/ezmedia.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,13 @@
139139
callback: 'showFileSizeError',
140140
errorNodeSelectors: ['.ibexa-field-edit--ezmedia .ibexa-form-error'],
141141
},
142+
{
143+
isValueValidator: false,
144+
selector: SELECTOR_INPUT_FILE,
145+
eventName: 'ibexa-invalid-file-type',
146+
callback: 'showFileTypeError',
147+
errorNodeSelectors: ['.ibexa-field-edit--ezmedia .ibexa-form-error'],
148+
},
142149
{
143150
selector: '.ibexa-field-edit-preview__dimensions .form-control',
144151
eventName: 'blur',

src/bundle/Resources/public/scss/fieldType/edit/_base-preview.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
color: $ibexa-color-dark-300;
4545
}
4646

47-
&--mime-types,
47+
&--image-extensions,
4848
&--filesize {
4949
color: $ibexa-color-dark-300;
5050
font-size: $ibexa-text-font-size-small;

src/bundle/Resources/translations/ibexa_content_forms_content.en.xliff

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,16 @@
161161
<target state="new">or</target>
162162
<note>key: fieldtype.binary_base.drag_drop.or</note>
163163
</trans-unit>
164+
<trans-unit id="0f71380bdf7b1b566dfd532ec3611aa13b2f0c38" resname="fieldtype.binary_base.image_extensions">
165+
<source>Allowed extensions: %extensions%</source>
166+
<target state="new">Allowed extensions: %extensions%</target>
167+
<note>key: fieldtype.binary_base.image_extensions</note>
168+
</trans-unit>
164169
<trans-unit id="858c986173f1ef87d7acda017535b86f01bca87d" resname="fieldtype.binary_base.max_file_size">
165170
<source>Max file size: %size%</source>
166171
<target state="new">Max file size: %size%</target>
167172
<note>key: fieldtype.binary_base.max_file_size</note>
168173
</trans-unit>
169-
<trans-unit id="b19a26b0ded06a8d2bfc9490e2645ba682c8ca30" resname="fieldtype.binary_base.mime_types">
170-
<source>Allowed mime types: %mime_types%</source>
171-
<target state="new">Allowed mime types: %mime_types%</target>
172-
<note>key: fieldtype.binary_base.mime_types</note>
173-
</trans-unit>
174174
<trans-unit id="763e9b64f4f0024e90753727ccc212a3596bfccd" resname="fieldtype.binary_base.upload_file">
175175
<source>Upload file</source>
176176
<target state="new">Upload file</target>

src/bundle/Resources/translations/validators.en.xliff

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@
9696
<target state="new">{fieldName}: Cannot upload. File exceeds file size limit.</target>
9797
<note>key: js.error.invalid_file_size</note>
9898
</trans-unit>
99+
<trans-unit id="e34fdb2fe0c2a86056b2e9084b9226c921044df6" resname="js.error.invalid_file_type">
100+
<source>{fieldName}: Cannot upload. File has wrong type.</source>
101+
<target state="new">{fieldName}: Cannot upload. File has wrong type.</target>
102+
<note>key: js.error.invalid_file_type</note>
103+
</trans-unit>
99104
<trans-unit id="21c38818d1cb73ff54f0dc0b184d6de25058f24d" resname="js.error.invalid_url">
100105
<source>A valid URL is required</source>
101106
<target state="new">A valid URL is required</target>

src/bundle/Resources/views/themes/admin/ui/field_type/edit/binary_base.html.twig

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,15 @@
5353
<div class="ibexa-data-source__message--filesize">{{ 'fieldtype.binary_base.max_file_size'|trans({'%size%': max_file_size|default(0)|ibexa_file_size(2)})|desc('Max file size: %size%') }}</div>
5454
{% endif %}
5555

56-
{% if mime_types is defined %}
57-
<div class="ibexa-data-source__message--mime-types">
58-
{{ 'fieldtype.binary_base.mime_types'|trans({'%mime_types%': mime_types|join(', ')})|desc('Allowed mime types: %mime_types%') }}
56+
{% if image_extensions is defined %}
57+
{% set extensions = [] %}
58+
59+
{% for mime_type in mime_types %}
60+
{% set extensions = extensions|merge(image_extensions[mime_type]) %}
61+
{% endfor %}
62+
63+
<div class="ibexa-data-source__message--image-extensions">
64+
{{ 'fieldtype.binary_base.image_extensions'|trans({'%extensions%': extensions|join(', ')})|desc('Allowed extensions: %extensions%') }}
5965
</div>
6066
{% endif %}
6167

0 commit comments

Comments
 (0)