Fixes: U4-4177 U7 - Add Startnode Picker to Multiple Media Picker

This commit is contained in:
perploug
2014-03-19 07:47:23 +01:00
parent 6453a82717
commit 375b3948e0
7 changed files with 133 additions and 9 deletions

View File

@@ -6,6 +6,8 @@ angular.module("umbraco")
var dialogOptions = $scope.$parent.dialogOptions;
$scope.onlyImages = dialogOptions.onlyImages;
$scope.multiPicker = (dialogOptions.multiPicker && dialogOptions.multiPicker !== "0") ? true : false;
$scope.startNodeId = dialogOptions.startNodeId ? dialogOptions.startNodeId : -1;
$scope.options = {
url: umbRequestHelper.getApiUrl("mediaApiBaseUrl", "PostAddFile"),
@@ -51,7 +53,9 @@ angular.module("umbraco")
entityResource.getAncestors(folder.id, "media")
.then(function(anc) {
// anc.splice(0,1);
$scope.path = anc;
$scope.path = _.filter(anc, function (f) {
return f.path.indexOf($scope.startNodeId) !== -1;
});
});
}
else {
@@ -152,7 +156,6 @@ angular.module("umbraco")
//default root item
if(!$scope.target){
$scope.gotoFolder();
$scope.gotoFolder({ id: $scope.startNodeId, name: "Media", icon: "icon-folder" });
}
});

View File

@@ -74,8 +74,9 @@ data-file-upload="options" data-file-upload-progress="" data-ng-class="{'fileupl
<div class="row">
<ul class="breadcrumb span12">
<li><a href ng-click="gotoFolder()" prevent-default>Media</a> / </li>
<li ng-hide="startNodeId != -1">
<a href ng-click="gotoFolder()" prevent-default>Media</a> / </li>
<li ng-repeat="item in path">
<a href ng-click="gotoFolder(item)" prevent-default>{{item.name}}</a> /
</li>

View File

@@ -0,0 +1,79 @@
//this controller simply tells the dialogs service to open a mediaPicker window
//with a specified callback, this callback will receive an object with a selection on it
angular.module('umbraco')
.controller("Umbraco.PrevalueEditors.MediaPickerController",
function($scope, dialogService, entityResource, $log, iconHelper){
$scope.renderModel = [];
$scope.ids = [];
$scope.cfg = {
multiPicker: false,
entityType: "Media",
type: "media",
treeAlias: "media"
};
if($scope.model.value){
$scope.ids = $scope.model.value.split(',');
entityResource.getByIds($scope.ids, $scope.cfg.entityType).then(function(data){
_.each(data, function (item, i) {
item.icon = iconHelper.convertFromLegacyIcon(item.icon);
$scope.renderModel.push({name: item.name, id: item.id, icon: item.icon});
});
});
}
$scope.openContentPicker =function(){
var d = dialogService.treePicker({
section: $scope.cfg.type,
treeAlias: $scope.cfg.type,
scope: $scope,
multiPicker: $scope.cfg.multiPicker,
callback: populate});
};
$scope.remove =function(index){
$scope.renderModel.splice(index, 1);
$scope.ids.splice(index, 1);
$scope.model.value = trim($scope.ids.join(), ",");
};
$scope.clear = function() {
$scope.model.value = "";
$scope.renderModel = [];
$scope.ids = [];
};
$scope.add =function(item){
if($scope.ids.indexOf(item.id) < 0){
item.icon = iconHelper.convertFromLegacyIcon(item.icon);
$scope.ids.push(item.id);
$scope.renderModel.push({name: item.name, id: item.id, icon: item.icon});
$scope.model.value = trim($scope.ids.join(), ",");
}
};
$scope.$on("formSubmitting", function (ev, args) {
$scope.model.value = trim($scope.ids.join(), ",");
});
function trim(str, chr) {
var rgxtrim = (!chr) ? new RegExp('^\\s+|\\s+$', 'g') : new RegExp('^'+chr+'+|'+chr+'+$', 'g');
return str.replace(rgxtrim, '');
}
function populate(data){
if(angular.isArray(data)){
_.each(data, function (item, i) {
$scope.add(item);
});
}else{
$scope.clear();
$scope.add(data);
}
}
});

View File

@@ -0,0 +1,22 @@
<div ng-controller="Umbraco.PrevalueEditors.MediaPickerController" class="umb-editor umb-contentpicker">
<ul class="unstyled list-icons"
ng-model="renderModel">
<li ng-repeat="node in renderModel">
<i class="icon icon-delete red hover-show pull-right" ng-click="remove($index)"></i>
<i class="icon {{node.icon}} hover-hide"></i>
<a href prevent-default ng-click="openContentPicker()" >{{node.name}}</a>
</li>
</ul>
<ul class="unstyled list-icons" ng-show="multipicker || renderModel.length === 0">
<li>
<i class="icon icon-add blue"></i>
<a href ng-click="openContentPicker()" prevent-default>
<localize key="general_add">Add</localize>
</a>
</li>
</ul>
</div>

View File

@@ -6,6 +6,10 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
//check the pre-values for multi-picker
var multiPicker = $scope.model.config.multiPicker !== '0' ? true : false;
if (!$scope.model.config.startNodeId)
$scope.model.config.startNodeId = -1;
function setupViewModel() {
$scope.images = [];
$scope.ids = [];
@@ -34,6 +38,7 @@ angular.module('umbraco').controller("Umbraco.PropertyEditors.MediaPickerControl
$scope.add = function() {
dialogService.mediaPicker({
startNodeId: $scope.model.config.startNodeId,
multiPicker: multiPicker,
callback: function(data) {

View File

@@ -24,16 +24,27 @@ namespace Umbraco.Web.PropertyEditors
protected override PropertyValueEditor CreateValueEditor()
{
//TODO: Need to add some validation to the ValueEditor to ensure that any media chosen actually exists!
return base.CreateValueEditor();
//TODO: Need to add some validation to the ValueEditor to ensure that any media chosen actually exists!
return base.CreateValueEditor();
}
public override IDictionary<string, object> DefaultPreValues
{
get { return InternalPreValues; }
set { InternalPreValues = value; }
}
protected override PreValueEditor CreatePreValueEditor()
{
return new SingleMediaPickerPreValueEditor();
}
internal class SingleMediaPickerPreValueEditor : PreValueEditor
{
[PreValueField("startNodeId", "Start node", "mediapicker")]
public int StartNodeId { get; set; }
}
}
}

View File

@@ -21,6 +21,9 @@ namespace Umbraco.Web.PropertyEditors
{
[PreValueField("multiPicker", "Pick multiple items", "boolean")]
public bool MultiPicker { get; set; }
[PreValueField("startNodeId", "Start node", "mediapicker")]
public int StartNodeId { get; set; }
}
}
}