From 6875082f66d634bb66364b098561e1ab8d4816d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=ABss=20J=C4=81nis=20=C4=80bolti=C5=86=C5=A1?= Date: Thu, 17 Sep 2015 12:25:11 +0300 Subject: [PATCH 01/24] Remove composer.lock from .gitignore This file should be included in the codebase so that all developers get exact copies of libraries and their corresponding versions. Explained in more detail [here](https://blog.engineyard.com/2014/composer-its-all-about-the-lock-file). --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 90c0df18f..55b624267 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ /bootstrap/compiled.php /vendor -composer.lock composer.phar .DS_Store .idea From d9e85380af21028d2f3912738b9138711e0346f6 Mon Sep 17 00:00:00 2001 From: Karl Thibault Date: Sat, 26 Sep 2015 22:03:05 -0400 Subject: [PATCH 02/24] Add localization for the backend Switch widget --- modules/backend/lang/en/lang.php | 4 +++- modules/backend/lang/fr/lang.php | 4 +++- modules/backend/widgets/Lists.php | 12 ++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php index 89beb9a7f..52832e733 100644 --- a/modules/backend/lang/en/lang.php +++ b/modules/backend/lang/en/lang.php @@ -138,7 +138,9 @@ return [ 'delete_selected' => 'Delete selected', 'delete_selected_empty' => 'There are no selected records to delete.', 'delete_selected_confirm' => 'Delete the selected records?', - 'delete_selected_success' => 'Successfully deleted the selected records.' + 'delete_selected_success' => 'Successfully deleted the selected records.', + 'widget_switch_true' => 'Yes', + 'widget_switch_false' => 'No' ], 'fileupload' => [ 'attachment' => 'Attachment', diff --git a/modules/backend/lang/fr/lang.php b/modules/backend/lang/fr/lang.php index 3511404d4..ee2c340e3 100644 --- a/modules/backend/lang/fr/lang.php +++ b/modules/backend/lang/fr/lang.php @@ -139,6 +139,8 @@ return [ 'delete_selected_empty' => 'Il n’y a aucun enregistrement à supprimer', 'delete_selected_confirm' => 'Confirmer la suppression des enregistrements sélectionnés ?', 'delete_selected_success' => 'Les enregistrements ont bien été supprimés.', + 'widget_switch_true' => 'Oui', + 'widget_switch_false' => 'Non' ], 'fileupload' => [ 'attachment' => 'Pièce jointe', @@ -315,4 +317,4 @@ return [ 'filter' => [ 'all' => 'tous' ], -]; \ No newline at end of file +]; diff --git a/modules/backend/widgets/Lists.php b/modules/backend/widgets/Lists.php index 93b3f16aa..0f61b201a 100644 --- a/modules/backend/widgets/Lists.php +++ b/modules/backend/widgets/Lists.php @@ -878,8 +878,16 @@ class Lists extends WidgetBase */ protected function evalSwitchTypeValue($record, $column, $value) { - // return ($value) ? '' : ''; - return ($value) ? 'Yes' : 'No'; + $contents = ''; + + if($value) { + $contents = trans('backend::lang.list.widget_switch_true'); + } + else { + $contents = trans('backend::lang.list.widget_switch_false'); + } + + return $contents; } /** From 20704bca676ae0fbab2c328023b11a47815684e8 Mon Sep 17 00:00:00 2001 From: Patrick Ward Date: Tue, 29 Sep 2015 19:02:42 -0400 Subject: [PATCH 03/24] Allow minDate/maxDate to be entered in date format for DatePicker. Fixes #909. --- modules/backend/formwidgets/DatePicker.php | 32 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/modules/backend/formwidgets/DatePicker.php b/modules/backend/formwidgets/DatePicker.php index 390be8a2f..e1ce658f7 100644 --- a/modules/backend/formwidgets/DatePicker.php +++ b/modules/backend/formwidgets/DatePicker.php @@ -46,15 +46,35 @@ class DatePicker extends FormWidgetBase */ public function init() { - $this->fillFromConfig([ - 'mode', - 'minDate', - 'maxDate', - ]); - + $this->fillDatesFromConfig(); + $this->fillFromConfig(['mode']); $this->mode = strtolower($this->mode); } + /** + * Transfers minDate and maxDate config values stored inside the + * $config property directly on to the root object properties. + * + * This method checks for Yaml parsed dates that have been converted + * into integer timestamps via the Symfony Yaml parser and converts them + * back into strings for use with the datepicker. + * + * @param array $properties + * @return void + */ + protected function fillDatesFromConfig() + { + foreach(['minDate', 'maxDate'] as $property) { + + $this->{$property} = $this->getConfig($property, $this->{$property}); + + if (is_integer($this->{$property})) { + $this->{$property} = date('Y-m-d', $this->{$property}); + } + + } + } + /** * {@inheritDoc} */ From b1766196c292417ee9c00ec11010c1f8527dd432 Mon Sep 17 00:00:00 2001 From: Matiss Janis Aboltins Date: Thu, 8 Oct 2015 10:02:06 +0300 Subject: [PATCH 04/24] Added missing latvian language strings --- modules/backend/lang/lv/lang.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/backend/lang/lv/lang.php b/modules/backend/lang/lv/lang.php index aa950ad44..f904add5e 100644 --- a/modules/backend/lang/lv/lang.php +++ b/modules/backend/lang/lv/lang.php @@ -187,6 +187,7 @@ return [ 'close' => 'Aizvērt', 'confirm' => 'Apstiprināt', 'reload' => 'Pārlādēt', + 'complete' => 'Pabeigt', 'ok' => 'OK', 'or' => 'vai', 'confirm_tab_close' => 'Vai tiešām vēlaties aizvērt šo cilni? Nesaglabātās izmaiņas būs zudušas.', @@ -235,6 +236,10 @@ return [ 'unlink_name' => "Atsaistīt :name", 'unlink_confirm' => "Vai esat pārliecināts?", ], + 'reorder' => [ + 'default_title' => 'Pārkārtot ierakstus', + 'no_records' => 'Nav pieejami ieraksti, ko pārkārtot.', + ], 'model' => [ 'name' => 'Modulis', 'not_found' => "Modulis ':class' ar ID :id netika atrasts", @@ -259,6 +264,7 @@ return [ 'code_folding' => 'Koda savilkšana', 'word_wrap' => 'Vārdu aplaušana', 'highlight_active_line' => 'Iekrāsot aktīvo līniju', + 'auto_closing' => 'Automātiski aizvērt birkas un īpašos simbolus', 'show_invisibles' => 'Rādīt slēptos simbolus', 'show_gutter' => 'Rādīt līniju numurus', 'theme' => 'Krāsu shēma' From 82c2787f39834b972da2b25bf93b08a91d19a640 Mon Sep 17 00:00:00 2001 From: flynsarmy Date: Fri, 9 Oct 2015 13:51:33 +1000 Subject: [PATCH 05/24] Add support for default values in form widgets --- modules/backend/classes/FormWidgetBase.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/backend/classes/FormWidgetBase.php b/modules/backend/classes/FormWidgetBase.php index 716b84dd0..f63d32d64 100644 --- a/modules/backend/classes/FormWidgetBase.php +++ b/modules/backend/classes/FormWidgetBase.php @@ -113,7 +113,19 @@ abstract class FormWidgetBase extends WidgetBase */ public function getLoadValue() { - return $this->formField->getValueFromData($this->data ?: $this->model); + $defaultValue = null; + + if (!$this->model->exists) { + if ($this->formField->defaultFrom) { + list($model, $attribute) = $this->formField->resolveModelAttribute($this->model, $this->formField->defaultFrom); + $defaultValue = $model->{$attribute}; + } + elseif ($this->formField->defaults !== '') { + $defaultValue = $this->formField->defaults; + } + } + + return $this->formField->getValueFromData($this->data ?: $this->model, $defaultValue); } /** From c4fffbd6f72ef4a6379a4cccf7eca072abdb6cf6 Mon Sep 17 00:00:00 2001 From: tschallacka Date: Fri, 9 Oct 2015 16:01:09 +0200 Subject: [PATCH 06/24] Fixed form field parsing to accept no config If a programmer would define a yaml like fields: shortcut: country: It would fail with message "array_key_exists() expects parameter 2 to be array, null given" on line 275 of ..\modules\backend\classes\FormField.php The yaml parsing returns a null. This check intercepts that null value being passed to the function and turns it into a proper array. --- modules/backend/classes/FormField.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/backend/classes/FormField.php b/modules/backend/classes/FormField.php index 4ef1aeac4..20d17eb3a 100644 --- a/modules/backend/classes/FormField.php +++ b/modules/backend/classes/FormField.php @@ -254,6 +254,10 @@ class FormField */ protected function evalConfig($config) { + if(is_null($config)) { + $config = []; + } + /* * Standard config:property values */ From 9f2e50c4ebe01cda5cfb2be5a9c0b948d4032e76 Mon Sep 17 00:00:00 2001 From: Oliver Vartiainen Date: Wed, 14 Oct 2015 20:36:48 +0300 Subject: [PATCH 07/24] Display media manager upload errors more clearly * Differentiate between successful and failed uploads * Add a function for updating upload bar status * Add a new upload error text Fixes #1349 --- modules/cms/lang/en/lang.php | 1 + .../assets/js/mediamanager-browser-min.js | 12 ++++++---- .../mediamanager/assets/js/mediamanager.js | 23 +++++++++++++------ .../partials/_upload-progress.htm | 3 ++- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/modules/cms/lang/en/lang.php b/modules/cms/lang/en/lang.php index 921aa68e4..614184296 100644 --- a/modules/cms/lang/en/lang.php +++ b/modules/cms/lang/en/lang.php @@ -265,6 +265,7 @@ return [ 'multiple_selected' => 'Multiple items selected.', 'uploading_file_num' => 'Uploading :number file(s)...', 'uploading_complete' => 'Upload complete', + 'uploading_error' => 'Upload failed', 'order_by' => 'Order by', 'folder' => 'Folder', 'no_files_found' => 'No files found by your request.', diff --git a/modules/cms/widgets/mediamanager/assets/js/mediamanager-browser-min.js b/modules/cms/widgets/mediamanager/assets/js/mediamanager-browser-min.js index b307569e6..dc7b47969 100644 --- a/modules/cms/widgets/mediamanager/assets/js/mediamanager-browser-min.js +++ b/modules/cms/widgets/mediamanager/assets/js/mediamanager-browser-min.js @@ -286,7 +286,8 @@ this.dropzone.on('addedfile',this.proxy(this.uploadFileAdded)) this.dropzone.on('totaluploadprogress',this.proxy(this.uploadUpdateTotalProgress)) this.dropzone.on('queuecomplete',this.proxy(this.uploadQueueComplete)) this.dropzone.on('sending',this.proxy(this.uploadSending)) -this.dropzone.on('error',this.proxy(this.uploadError))} +this.dropzone.on('error',this.proxy(this.uploadError)) +this.dropzone.on('success',this.proxy(this.uploadSuccess))} MediaManager.prototype.destroyUploader=function(){if(!this.dropzone) return this.dropzone.destroy() @@ -305,16 +306,17 @@ fileNumberLabel.innerHTML=messageTemplate.replace(':number',fileNumber).replace( MediaManager.prototype.setUploadProgress=function(value){var progresBar=this.$el.get(0).querySelector('[data-control="upload-progress-bar"]') progresBar.setAttribute('style','width: '+value+'%') progresBar.setAttribute('class','progress-bar')} -MediaManager.prototype.uploadQueueComplete=function(){var fileNumberLabel=this.$el.get(0).querySelector('[data-label="file-number-and-progress"]'),completeTemplate=fileNumberLabel.getAttribute('data-complete-template'),progresBar=this.$el.get(0).querySelector('[data-control="upload-progress-bar"]') -fileNumberLabel.innerHTML=completeTemplate;progresBar.setAttribute('class','progress-bar progress-bar-success') -this.$el.find('[data-command="cancel-uploading"]').addClass('hide') +MediaManager.prototype.uploadQueueComplete=function(){this.$el.find('[data-command="cancel-uploading"]').addClass('hide') this.$el.find('[data-command="close-uploader"]').removeClass('hide') this.refresh()} MediaManager.prototype.uploadSending=function(file,xhr,formData){formData.append('path',this.$el.find('[data-type="current-folder"]').val()) formData.append('X_OCTOBER_FILEUPLOAD',this.options.uniqueId)} MediaManager.prototype.uploadCancelAll=function(){this.dropzone.removeAllFiles(true) this.hideUploadUi()} -MediaManager.prototype.uploadError=function(file,message){$.oc.alert('Error uploading file')} +MediaManager.prototype.updateUploadBar=function(templateName,classNames){var fileNumberLabel=this.$el.get(0).querySelector('[data-label="file-number-and-progress"]'),successTemplate=fileNumberLabel.getAttribute('data-'+templateName+'-template'),progresBar=this.$el.get(0).querySelector('[data-control="upload-progress-bar"]') +fileNumberLabel.innerHTML=successTemplate;progresBar.setAttribute('class',classNames)} +MediaManager.prototype.uploadSuccess=function(){this.updateUploadBar('success','progress-bar progress-bar-success');} +MediaManager.prototype.uploadError=function(file,message){this.updateUploadBar('error','progress-bar-error');$.oc.alert('Error uploading file')} MediaManager.prototype.cropSelectedImage=function(callback){var selectedItems=this.getSelectedItems(true) if(selectedItems.length!=1){alert(this.options.selectSingleImage) return} diff --git a/modules/cms/widgets/mediamanager/assets/js/mediamanager.js b/modules/cms/widgets/mediamanager/assets/js/mediamanager.js index c6456864e..68736f66d 100644 --- a/modules/cms/widgets/mediamanager/assets/js/mediamanager.js +++ b/modules/cms/widgets/mediamanager/assets/js/mediamanager.js @@ -730,6 +730,7 @@ this.dropzone.on('queuecomplete', this.proxy(this.uploadQueueComplete)) this.dropzone.on('sending', this.proxy(this.uploadSending)) this.dropzone.on('error', this.proxy(this.uploadError)) + this.dropzone.on('success', this.proxy(this.uploadSuccess)) } MediaManager.prototype.destroyUploader = function() { @@ -781,13 +782,6 @@ } MediaManager.prototype.uploadQueueComplete = function() { - var fileNumberLabel = this.$el.get(0).querySelector('[data-label="file-number-and-progress"]'), - completeTemplate = fileNumberLabel.getAttribute('data-complete-template'), - progresBar = this.$el.get(0).querySelector('[data-control="upload-progress-bar"]') - - fileNumberLabel.innerHTML = completeTemplate; - progresBar.setAttribute('class', 'progress-bar progress-bar-success') - this.$el.find('[data-command="cancel-uploading"]').addClass('hide') this.$el.find('[data-command="close-uploader"]').removeClass('hide') @@ -804,7 +798,22 @@ this.hideUploadUi() } + MediaManager.prototype.updateUploadBar = function(templateName, classNames) { + var fileNumberLabel = this.$el.get(0).querySelector('[data-label="file-number-and-progress"]'), + successTemplate = fileNumberLabel.getAttribute('data-' + templateName + '-template'), + progresBar = this.$el.get(0).querySelector('[data-control="upload-progress-bar"]') + + fileNumberLabel.innerHTML = successTemplate; + progresBar.setAttribute('class', classNames) + } + + MediaManager.prototype.uploadSuccess = function() { + this.updateUploadBar('success', 'progress-bar progress-bar-success'); + } + MediaManager.prototype.uploadError = function(file, message) { + this.updateUploadBar('error', 'progress-bar-error'); + $.oc.alert('Error uploading file') } diff --git a/modules/cms/widgets/mediamanager/partials/_upload-progress.htm b/modules/cms/widgets/mediamanager/partials/_upload-progress.htm index 409c268e0..92a423b4e 100644 --- a/modules/cms/widgets/mediamanager/partials/_upload-progress.htm +++ b/modules/cms/widgets/mediamanager/partials/_upload-progress.htm @@ -4,7 +4,8 @@
From 20145e46eff4c4125d7335f624b3aebce54c0acc Mon Sep 17 00:00:00 2001 From: Alexander Guth Date: Thu, 15 Oct 2015 22:10:38 +0200 Subject: [PATCH 08/24] Translate missing items Some local names may need some more attention. Im unsure how to translate them (best). --- modules/system/lang/de/lang.php | 84 ++++++++++++++++----------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/modules/system/lang/de/lang.php b/modules/system/lang/de/lang.php index 7c463d583..e8a6069ba 100644 --- a/modules/system/lang/de/lang.php +++ b/modules/system/lang/de/lang.php @@ -7,29 +7,29 @@ return [ ], 'locale' => [ 'cs' => 'Tschechisch', - 'en' => 'English', - 'de' => 'German', - 'el' => 'Greek', - 'es' => 'Spanish', - 'es-ar' => 'Spanish (Argentina)', - 'fa' => 'Persian', - 'fr' => 'French', - 'hu' => 'Hungarian', - 'id' => 'Bahasa Indonesia', - 'it' => 'Italian', - 'ja' => 'Japanese', - 'lv' => 'Latvian', + 'en' => 'Englisch', + 'de' => 'Deutsch', + 'el' => 'Griechisch', + 'es' => 'Spanisch', + 'es-ar' => 'Spanisch (Argentinien)', + 'fa' => 'Persisch', + 'fr' => 'Französisch', + 'hu' => 'Ungarisch', + 'id' => 'Indonesisch', + 'it' => 'Italienisch', + 'ja' => 'Japanisch', + 'lv' => 'Lettisch', 'nb-no' => 'Norwegisch (Bokmål)', - 'nl' => 'Dutch', - 'pl' => 'Polish', - 'pt-br' => 'Portuguese (Brazil)', - 'ro' => 'Romana', - 'ru' => 'Russian', - 'sv' => 'Swedish', - 'sk' => 'Slovak (Slovakia)', - 'tr' => 'Turkish', - 'zh-cn' => 'Chinese (China)', - 'zh-tw' => 'Chinese (Taiwan)' + 'nl' => 'Niederländisch', + 'pl' => 'Polnisch', + 'pt-br' => 'Portugiesisch (Brasilien)', + 'ro' => 'Rumänisch', + 'ru' => 'Russisch', + 'sv' => 'Schwedisch', + 'sk' => 'Slowakisch', + 'tr' => 'Türkisch', + 'zh-cn' => 'Chinesisch (China)', + 'zh-tw' => 'Chinesisch (Taiwan)' ], 'directory' => [ 'create_fail' => "Konnte Verzeichnis: :name nicht erstellen", @@ -54,41 +54,41 @@ return [ 'project' => [ 'name' => 'Projekt', 'owner_label' => 'Besitzer', - 'attach' => 'Attach Project', - 'detach' => 'Detach Project', - 'none' => 'None', + 'attach' => 'Projekt verbinden', + 'detach' => 'Projekt trennen', + 'none' => 'Keins', 'id' => [ 'label' => 'Projekt-ID', 'help' => 'Wie Sie Ihre Projekt-ID finden', 'missing' => 'Bitte geben Sie eine Projekt-ID an.', ], - 'detach_confirm' => 'Are you sure you want to detach this project?', + 'detach_confirm' => 'Möchtest du dieses Projekt wirklich trennen?', 'unbind_success' => 'Projekt wurde erfolgreich getrennt (detached).', ], 'settings' => [ 'menu_label' => 'Einstellungen', 'missing_model' => 'Der Einstellungsseite fehlt eine Model-Definition.', 'update_success' => 'Einstellung für :name wurde erfolgreich aktualisiert.', - 'return' => 'Return to system settings', + 'return' => 'Zurück zu den Einstellungen', ], 'email' => [ - 'menu_label' => 'Email Configuration', - 'menu_description' => 'Manage email configuration.', - 'general' => 'General', + 'menu_label' => 'Email Einstellungen', + 'menu_description' => 'Email Einstellungen verwalten.', + 'general' => 'Allgemein', 'method' => 'Email Method', - 'sender_name' => 'Sender Name', - 'sender_email' => 'Sender Email', + 'sender_name' => 'Absender Name', + 'sender_email' => 'Absender Email', 'smtp' => 'SMTP', - 'smtp_address' => 'SMTP Address', - 'smtp_authorization' => 'SMTP authorization required', - 'smtp_authorization_comment' => 'Use this checkbox if your SMTP server requires authorization.', - 'smtp_username' => 'Username', - 'smtp_password' => 'Password', + 'smtp_address' => 'SMTP Adresse', + 'smtp_authorization' => 'SMTP Authorisation erforderlich', + 'smtp_authorization_comment' => 'Bitte auswählen, wenn der SMTP Server eine SMTP Authorisation erfordert.', + 'smtp_username' => 'Benutzername', + 'smtp_password' => 'Passwort', 'smtp_port' => 'SMTP Port', - 'smtp_ssl' => 'SSL connection required', + 'smtp_ssl' => 'SSL Verbindung erforderlich', 'sendmail' => 'Sendmail', - 'sendmail_path' => 'Sendmail Path', - 'sendmail_path_comment' => 'Please specify the path of the sendmail program.', + 'sendmail_path' => 'Sendmail Pfad', + 'sendmail_path_comment' => 'Bitte gib den (absoluten) Pfad zum Sendmail Programm an.', ], 'install' => [ 'project_label' => 'Mit Projekt verbinden', @@ -104,9 +104,9 @@ return [ 'check_label' => 'Auf Aktualisierungen überprüfen', 'retry_label' => 'Erneut versuchen', 'plugin_name' => 'Name', - 'plugin_description' => 'Description', + 'plugin_description' => 'Beschreibung', 'plugin_version' => 'Version', - 'plugin_author' => 'Author', + 'plugin_author' => 'Autor', 'core_current_build' => 'Aktueller Build', 'core_build' => 'Build :build', 'core_build_help' => 'Aktuellster Build ist verfügbar.', From 22252638a89a062400f72e52067c10c8b6d6322d Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Fri, 16 Oct 2015 17:50:27 +1100 Subject: [PATCH 09/24] Because W3C --- modules/backend/formwidgets/FileUpload.php | 2 +- .../backend/formwidgets/fileupload/partials/_file_multi.htm | 2 +- .../backend/formwidgets/fileupload/partials/_file_single.htm | 2 +- .../backend/formwidgets/fileupload/partials/_image_multi.htm | 4 ++-- .../backend/formwidgets/fileupload/partials/_image_single.htm | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/backend/formwidgets/FileUpload.php b/modules/backend/formwidgets/FileUpload.php index f6470830a..7bcc47601 100644 --- a/modules/backend/formwidgets/FileUpload.php +++ b/modules/backend/formwidgets/FileUpload.php @@ -141,7 +141,7 @@ class FileUpload extends FormWidgetBase /* * Decorate each file with thumb and custom download path */ - $list->each(function($file){ + $list->each(function($file) { $this->decorateFileAttributes($file); }); diff --git a/modules/backend/formwidgets/fileupload/partials/_file_multi.htm b/modules/backend/formwidgets/fileupload/partials/_file_multi.htm index 6ae8c2d6b..23a49033f 100644 --- a/modules/backend/formwidgets/fileupload/partials/_file_multi.htm +++ b/modules/backend/formwidgets/fileupload/partials/_file_multi.htm @@ -48,7 +48,7 @@
- +

diff --git a/modules/backend/formwidgets/fileupload/partials/_file_single.htm b/modules/backend/formwidgets/fileupload/partials/_file_single.htm index ecc7225c2..51d033b60 100644 --- a/modules/backend/formwidgets/fileupload/partials/_file_single.htm +++ b/modules/backend/formwidgets/fileupload/partials/_file_single.htm @@ -52,7 +52,7 @@
- +

diff --git a/modules/backend/formwidgets/fileupload/partials/_image_multi.htm b/modules/backend/formwidgets/fileupload/partials/_image_multi.htm index 5b9e76f00..0747cf6f4 100644 --- a/modules/backend/formwidgets/fileupload/partials/_image_multi.htm +++ b/modules/backend/formwidgets/fileupload/partials/_image_multi.htm @@ -20,7 +20,7 @@
- +

@@ -47,7 +47,7 @@