File tree Expand file tree Collapse file tree 12 files changed +95
-15
lines changed
Expand file tree Collapse file tree 12 files changed +95
-15
lines changed Original file line number Diff line number Diff line change 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
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 ;
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 ) ;
Original file line number Diff line number Diff line change 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 ;
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 *
Original file line number Diff line number Diff line change 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 ( {
Original file line number Diff line number Diff line change 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 ,
Original file line number Diff line number Diff line change 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
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 ) ;
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
Original file line number Diff line number Diff line change 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' ,
Original file line number Diff line number Diff line change 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 ;
Original file line number Diff line number Diff line change 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 >
Original file line number Diff line number Diff line change 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 >
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments