diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js
index 75d2f47a28..182b487f11 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js
@@ -99,6 +99,16 @@ function entityResource($q, $http, umbRequestHelper) {
'Failed to retreive entity data for id ' + id);
},
+ getByQuery: function (query, rootNodeId, type) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetByQuery",
+ [{query: query},{ rootNodeId: rootNodeId}, {type: type }])),
+ 'Failed to retreive entity data for query ' + query);
+ },
+
/**
* @ngdoc method
* @name umbraco.resources.entityResource#getByIds
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
index ab1aeb06e2..70de53bf24 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
@@ -3,7 +3,7 @@
angular.module('umbraco')
.controller("Umbraco.PropertyEditors.ContentPickerController",
- function($scope, dialogService, entityResource, $log, iconHelper){
+ function($scope, dialogService, entityResource, editorState, $log, iconHelper){
$scope.renderModel = [];
$scope.ids = $scope.model.value ? $scope.model.value.split(',') : [];
@@ -11,6 +11,8 @@ angular.module('umbraco')
$scope.cfg = {
multiPicker: "0",
entityType: "Document",
+ filterCssClass: "not-allowed not-published",
+
startNode:{
type: "content",
id: -1
@@ -31,11 +33,23 @@ angular.module('umbraco')
$scope.cfg.entityType = "Media";
}
+ //if we have a query for the startnode, we will use that.
+ if($scope.cfg.startNode.query){
+ var rootId = -1;
+ if($scope.cfg.startNode.scope === "current"){
+ rootId = editorState.current.id;
+ }
+
+ entityResource.getByQuery($scope.cfg.startNode.query, rootId, "Document").then(function(ent){
+ $scope.cfg.startNodeId = ent.id;
+ });
+ }else{
+ $scope.cfg.startNodeId = $scope.cfg.startNode.id;
+ }
+
$scope.cfg.callback = populate;
$scope.cfg.treeAlias = $scope.cfg.startNode.type;
- $scope.cfg.section = $scope.cfg.startNode.type;
- $scope.cfg.startNodeId = $scope.cfg.startNode.id;
- $scope.cfg.filterCssClass = "not-allowed not-published";
+ $scope.cfg.section = $scope.cfg.startNode.type;
//load current data
entityResource.getByIds($scope.ids, $scope.cfg.entityType).then(function(data){
diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs
index b63ec39229..475ac6824c 100644
--- a/src/Umbraco.Web/Editors/EntityController.cs
+++ b/src/Umbraco.Web/Editors/EntityController.cs
@@ -25,6 +25,7 @@ using Examine;
using Examine.LuceneEngine.SearchCriteria;
using Examine.SearchCriteria;
using Umbraco.Web.Dynamics;
+using umbraco;
namespace Umbraco.Web.Editors
{
@@ -128,6 +129,45 @@ namespace Umbraco.Web.Editors
return GetResultForKey(id, type);
}
+ ///
+ /// Gets an entity by a xpath or css-like query
+ ///
+ ///
+ ///
+ ///
+ public EntityBasic GetByQuery(string query, int rootNodeId, UmbracoEntityTypes type)
+ {
+
+ //this is css (commented out for now, due to external dependency)
+ //if (!query.Contains("::") && !query.Contains('/'))
+ // query = css2xpath.Converter.CSSToXPath(query, "");
+
+
+ if(rootNodeId < 0){
+ var nodes = global::umbraco.library.GetXmlNodeByXPath(query);
+ var node = uQuery.GetNodesByXPath(query).FirstOrDefault();
+
+ if(node == null)
+ return null;
+
+ return GetById(node.Id, UmbracoEntityTypes.Document);
+ }else{
+ var node = global::umbraco.library.GetXmlNodeById(rootNodeId.ToString());
+ if (node.MoveNext())
+ {
+ if (node.Current != null)
+ {
+ var result = node.Current.Select(query);
+ //set it to the first node found (if there is one), otherwise to -1
+ if (result.Current != null)
+ return GetById(int.Parse(result.Current.GetAttribute("id", string.Empty)), UmbracoEntityTypes.Document);
+ }
+ }
+ }
+
+ return null;
+ }
+
public EntityBasic GetById(int id, UmbracoEntityTypes type)
{
return GetResultForId(id, type);