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
+