diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js
index 7f405eb28c..79dfee059e 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js
@@ -20,7 +20,7 @@ TODO
angular.module("umbraco.directives")
.directive('umbFileDropzone',
- function ($timeout, Upload, localizationService, umbRequestHelper, overlayService) {
+ function ($timeout, Upload, localizationService, umbRequestHelper, overlayService, mediaHelper, mediaTypeHelper) {
return {
restrict: 'E',
replace: true,
@@ -88,21 +88,12 @@ angular.module("umbraco.directives")
});
scope.queue = [];
}
- // One allowed type
- if (scope.acceptedMediatypes && scope.acceptedMediatypes.length === 1) {
- // Standard setup - set alias to auto select to let the server best decide which media type to use
- if (scope.acceptedMediatypes[0].alias === 'Image') {
- scope.contentTypeAlias = "umbracoAutoSelect";
- } else {
- scope.contentTypeAlias = scope.acceptedMediatypes[0].alias;
- }
+ // If we have Accepted Media Types, we will ask to choose Media Type, if Choose Media Type returns false, it only had one choice and therefor no reason to
+ if (scope.acceptedMediatypes && _requestChooseMediaTypeDialog() === false) {
+ scope.contentTypeAlias = "umbracoAutoSelect";
_processQueueItem();
}
- // More than one, open dialog
- if (scope.acceptedMediatypes && scope.acceptedMediatypes.length > 1) {
- _chooseMediaType();
- }
}
}
@@ -146,8 +137,8 @@ angular.module("umbraco.directives")
// set percentage property on file
file.uploadProgress = progressPercentage;
// set uploading status on file
- file.uploadStatus = "uploading";
- }
+ file.uploadStatus = "uploading";
+ }
})
.success(function(data, status, headers, config) {
if (data.notifications && data.notifications.length > 0) {
@@ -195,35 +186,61 @@ angular.module("umbraco.directives")
});
}
- function _chooseMediaType() {
+ function _requestChooseMediaTypeDialog() {
- const dialog = {
- view: "itempicker",
- filter: scope.acceptedMediatypes.length > 15,
- availableItems: scope.acceptedMediatypes,
- submit: function (model) {
- scope.contentTypeAlias = model.selectedItem.alias;
- _processQueueItem();
+ if (scope.acceptedMediatypes.length === 1) {
+ // if only one accepted type, then we wont ask to choose.
+ return false;
+ }
- overlayService.close();
- },
- close: function () {
+ var uploadFileExtensions = scope.queue.map(file => mediaHelper.getFileExtension(file.name));
- scope.queue.map(function (file) {
- file.uploadStatus = "error";
- file.serverErrorMessage = "Cannot upload this file, no mediatype selected";
- scope.rejected.push(file);
- });
- scope.queue = [];
+ var filteredMediaTypes = mediaTypeHelper.getTypeAcceptingFileExtensions(scope.acceptedMediatypes, uploadFileExtensions);
- overlayService.close();
- }
- };
+ var mediaTypesNotFile = filteredMediaTypes.filter(mediaType => mediaType.alias !== "File");
- localizationService.localize("defaultdialogs_selectMediaType").then(value => {
- dialog.title = value;
+ if (mediaTypesNotFile.length <= 1) {
+ // if only one or less accepted types when we have filtered type 'file' out, then we wont ask to choose.
+ return false;
+ }
+
+
+ localizationService.localizeMany(["defaultdialogs_selectMediaType", "mediaType_autoPickMediaType"]).then(function (translations) {
+
+ filteredMediaTypes.push({
+ alias: "umbracoAutoSelect",
+ name: translations[1],
+ icon: "icon-wand"
+ });
+
+ const dialog = {
+ view: "itempicker",
+ filter: filteredMediaTypes.length > 8,
+ availableItems: filteredMediaTypes,
+ submit: function (model) {
+ scope.contentTypeAlias = model.selectedItem.alias;
+ _processQueueItem();
+
+ overlayService.close();
+ },
+ close: function () {
+
+ scope.queue.map(function (file) {
+ file.uploadStatus = "error";
+ file.serverErrorMessage = "No files uploaded, no mediatype selected";
+ scope.rejected.push(file);
+ });
+ scope.queue = [];
+
+ overlayService.close();
+ }
+ };
+
+ dialog.title = translations[0];
overlayService.open(dialog);
});
+
+ return true;// yes, we did open the choose-media dialog, therefor we return true.
}
scope.handleFiles = function(files, event) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/mediatypehelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/mediatypehelper.service.js
index a347279fdb..f6ac16a9bc 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/mediatypehelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/mediatypehelper.service.js
@@ -23,15 +23,15 @@ function mediaTypeHelper(mediaTypeResource, $q) {
getAllowedImagetypes: function (mediaId){
// TODO: This is horribly inneficient - why make one request per type!?
- //This should make a call to c# to get exactly what it's looking for instead of returning every single media type and doing
+ //This should make a call to c# to get exactly what it's looking for instead of returning every single media type and doing
//some filtering on the client side.
- //This is also called multiple times when it's not needed! Example, when launching the media picker, this will be called twice
+ //This is also called multiple times when it's not needed! Example, when launching the media picker, this will be called twice
//which means we'll be making at least 6 REST calls to fetch each media type
// Get All allowedTypes
return mediaTypeResource.getAllowedTypes(mediaId)
.then(function(types){
-
+
var allowedQ = types.map(function(type){
return mediaTypeResource.getById(type.id);
});
@@ -39,16 +39,8 @@ function mediaTypeHelper(mediaTypeResource, $q) {
// Get full list
return $q.all(allowedQ).then(function(fullTypes){
- // Find all the media types with an Image Cropper property editor
- var filteredTypes = mediaTypeHelperService.getTypeWithEditor(fullTypes, ['Umbraco.ImageCropper']);
-
- // If there is only one media type with an Image Cropper we will return this one
- if(filteredTypes.length === 1) {
- return filteredTypes;
- // If there is more than one Image cropper, custom media types have been added, and we return all media types with and Image cropper or UploadField
- } else {
- return mediaTypeHelperService.getTypeWithEditor(fullTypes, ['Umbraco.ImageCropper', 'Umbraco.UploadField']);
- }
+ // Find all the media types with an Image Cropper or Upload Field property editor
+ return mediaTypeHelperService.getTypeWithEditor(fullTypes, ['Umbraco.ImageCropper', 'Umbraco.UploadField']);
});
});
@@ -68,6 +60,31 @@ function mediaTypeHelper(mediaTypeResource, $q) {
}
});
+ },
+
+ getTypeAcceptingFileExtensions: function (mediaTypes, fileExtensions) {
+ return mediaTypes.filter(mediaType => {
+ var uploadProperty;
+ mediaType.groups.forEach(group => {
+ var foundProperty = group.properties.find(property => property.alias === "umbracoFile");
+ if(foundProperty) {
+ uploadProperty = foundProperty;
+ }
+ });
+ if(uploadProperty) {
+ var acceptedFileExtensions;
+ if(uploadProperty.editor === "Umbraco.ImageCropper") {
+ acceptedFileExtensions = Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes;
+ } else if(uploadProperty.editor === "Umbraco.UploadField") {
+ acceptedFileExtensions = (uploadProperty.config.fileExtensions && uploadProperty.config.fileExtensions.length > 0) ? uploadProperty.config.fileExtensions.map(x => x.value) : null;
+ }
+ if(acceptedFileExtensions && acceptedFileExtensions.length > 0) {
+ return fileExtensions.length === fileExtensions.filter(fileExt => acceptedFileExtensions.includes(fileExt)).length;
+ }
+ return true;
+ }
+ return false;
+ });
}
};
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
index 4abcdf8a40..62e3ad6b64 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
@@ -343,6 +343,7 @@
Kopiering af medietypen fejlede
Flytning af medietypen fejlede
+ Auto vælg
Kopiering af medlemstypen fejlede
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
index cbb6902d74..7172e44b36 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
@@ -362,6 +362,7 @@
Failed to copy media type
Failed to move media type
+ Auto pick
Failed to copy member type
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
index 590a248393..a159b78b83 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
@@ -369,6 +369,7 @@
Failed to copy media type
Failed to move media type
+ Auto pick
Failed to copy member type