diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/html/umbphotofolder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/html/umbphotofolder.directive.js new file mode 100644 index 0000000000..814db432d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/html/umbphotofolder.directive.js @@ -0,0 +1,158 @@ +/** +* @ngdoc directive +* @name umbraco.directives.directive:umbPhotoFolder +* @restrict E +**/ +angular.module("umbraco.directives.html") +.directive('umbPhotoFolder', function ($compile, $log, $timeout, imageHelper) { + + return { + restrict: 'E', + replace: true, + require: '?ngModel', + terminate: true, + templateUrl: 'views/directives/html/umb-photo-folder.html', + link: function(scope, element, attrs, ngModel) { + + element.ready(function(){ + var wat = 1; + + }); + + ngModel.$render = function() { + + if(ngModel.$modelValue){ + + $timeout(function(){ + + var photos = ngModel.$modelValue; + var rows = []; + + scope.baseline = element.attr('baseline') ? parseInt(element.attr('baseline'),10) : 0; + scope.minWidth = element.attr('min-width') ? parseInt(element.attr('min-width'),10) : 420; + scope.minHeight = element.attr('min-height') ? parseInt(element.attr('min-height'),10) : 200; + scope.border = element.attr('border') ? parseInt(element.attr('border'),10) : 5; + scope.clickHandler = scope.$eval(element.attr('on-click')); + scope.lastWidth = Math.max(element.width(), scope.minWidth); + + // get row width - this is fixed. + var w = scope.lastWidth; + + + // initial height - effectively the maximum height +/- 10%; + var h = Math.max(scope.minHeight,Math.floor(w / 5)); + + + // store relative widths of all images (scaled to match estimate height above) + var ws = []; + $.each(photos, function(key, val) { + + val.width_n = $.grep(val.properties, function(val, index) {return (val.alias === "umbracoWidth");})[0]; + val.height_n = $.grep(val.properties, function(val, index) {return (val.alias === "umbracoHeight");})[0]; + + //val.url_n = imageHelper.getThumbnail({ imageModel: val, scope: scope }); + + if(val.width_n && val.height_n){ + var wt = parseInt(val.width_n.value, 10); + var ht = parseInt(val.height_n.value, 10); + + if( ht !== h ) { + wt = Math.floor(wt * (h / ht)); + } + + ws.push(wt); + }else{ + //if its files or folders, we make them square + ws.push(scope.minHeight); + } + }); + + + var rowNum = 0; + var limit = photos.length; + while(scope.baseline < limit) + { + rowNum++; + // number of images appearing in this row + var c = 0; + // total width of images in this row - including margins + var tw = 0; + + // calculate width of images and number of images to view in this row. + while( (tw * 1.1 < w) && (scope.baseline + c < limit)) + { + tw += ws[scope.baseline + c++] + scope.border * 2; + } + + // Ratio of actual width of row to total width of images to be used. + var r = w / tw; + // image number being processed + var i = 0; + // reset total width to be total width of processed images + tw = 0; + + // new height is not original height * ratio + var ht = Math.floor(h * r); + + var row = {}; + row.photos = []; + row.style = {}; + row.style = {"height": ht + scope.border * 2, "width": scope.lastWidth}; + rows.push(row); + + while( i < c ) + { + var photo = photos[scope.baseline + i]; + // Calculate new width based on ratio + var wt = Math.floor(ws[scope.baseline + i] * r); + // add to total width with margins + tw += wt + scope.border * 2; + + // Create image, set src, width, height and margin + //var purl = photo.url_n; + photo.thumbnail = imageHelper.getThumbnail({ imageModel: photo, scope: scope }); + if(!photo.thumbnail){ + photo.thumbnail = "none"; + } + + photo.style = {"width": wt, "height": ht, "margin": scope.border+"px", "cursor": "pointer"}; + row.photos.push(photo); + i++; + } + + // set row height to actual height + margins + scope.baseline += c; + + // if total width is slightly smaller than + // actual div width then add 1 to each + // photo width till they match + i = 0; + while( tw < w ) + { + row.photos[i].style.width++; + i = (i + 1) % c; + tw++; + } + + // if total width is slightly bigger than + // actual div width then subtract 1 from each + // photo width till they match + i = 0; + while( tw > w ) + { + row.photos[i].style.width--; + i = (i + 1) % c; + tw--; + } + } + + //populate the scope + scope.rows = rows; + + }, 500); //end timeout + } //end if modelValue + + }; //end $render + } + }; +}); diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js index fc138fe28c..ceceebacc3 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js @@ -88,6 +88,37 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) { [{ id: id }])), 'Failed to retreive data for media id ' + id); }, + + /** + * @ngdoc method + * @name umbraco.resources.mediaResource#deleteById + * @methodOf umbraco.resources.mediaResource + * + * @description + * Deletes a media item with a given id + * + * ##usage + *
+         * mediaResource.deleteById(1234)
+         *    .then(function() {
+         *        alert('its gone!');
+         *    });
+         * 
+ * + * @param {Int} id id of media item to delete + * @returns {Promise} resourcePromise object. + * + */ + deleteById: function(id) { + return umbRequestHelper.resourcePromise( + $http.delete( + umbRequestHelper.getApiUrl( + "mediaApiBaseUrl", + "DeleteById", + [{ id: id }])), + 'Failed to delete item ' + id); + }, + /** * @ngdoc method * @name umbraco.resources.mediaResource#getByIds diff --git a/src/Umbraco.Web.UI.Client/src/less/dragdrop.less b/src/Umbraco.Web.UI.Client/src/less/dragdrop.less index 61ea911956..74e968051b 100644 --- a/src/Umbraco.Web.UI.Client/src/less/dragdrop.less +++ b/src/Umbraco.Web.UI.Client/src/less/dragdrop.less @@ -2,7 +2,7 @@ body.dragging, body.dragging * { cursor: move !important; } -.dragged { +li.dragged { position: absolute; opacity: 0.5; z-index: 2000; diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 756560931a..7206b272bb 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -32,14 +32,52 @@ ul.color-picker li a { border:none; } + // // Media picker // -------------------------------------------------- .umb-mediapicker .add-link{ display: inline-block; - height: 100px; - width: 100px; + height: 120px; + width: 120px; + text-align: center; + color: @grayLight; + border: 2px @grayLight dashed !important; + line-height: 120px; +} + + +// +// folder-browser +// -------------------------------------------------- +.umb-folderbrowser .add-link{ + display: inline-block; + height: 120px; + width: 120px; text-align: center; border: 1px @grayLight dashed; - line-height: 100px + line-height: 120px } + +// +// Photo folder styling +// -------------------------------------------------- + +.umb-photo-folder .umb-non-thumbnail{ + text-align: center; + color: @gray; + font-size: 12px; +} + +.umb-photo-folder .umb-non-thumbnail i{ + color: @grayLight; + font-size: 60px; + line-height: 80px; + display: block +} + + +.umb-photo-folder .selected img{ + opacity:0.5; +} + diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.controller.js index a813f76d67..8c02df4bbd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.controller.js @@ -55,6 +55,22 @@ angular.module("umbraco") $scope.gotoFolder($scope.options.formData.currentFolder); }); + $scope.clickHandler = function(image, ev){ + if (image.contentTypeAlias.toLowerCase() == 'folder') { + $scope.options.formData.currentFolder = image.id; + $scope.gotoFolder(image.id); + }else if (image.contentTypeAlias.toLowerCase() == 'image') { + eventsService.publish("Umbraco.Dialogs.MediaPickerController.Select", image).then(function(image){ + if(dialogOptions && dialogOptions.multipicker){ + $scope.select(image); + image.cssclass = ($scope.dialogData.selection.indexOf(image) > -1) ? "selected" : ""; + }else{ + $scope.submit(image); + } + }); + } + }; + $scope.selectMediaItem = function(image) { if (image.contentTypeAlias.toLowerCase() == 'folder') { $scope.options.formData.currentFolder = image.id; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html index 68660a25ee..cb433fbaed 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/mediapicker.html @@ -57,6 +57,14 @@ data-file-upload="options" data-file-upload-progress="" data-ng-class="{'fileupl
+ + +