diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/datatype.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/datatype.mocks.js index 637693510c..7cb3fe5daf 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/datatype.mocks.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/datatype.mocks.js @@ -2,7 +2,7 @@ angular.module('umbraco.mocks'). factory('dataTypeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) { 'use strict'; - function returnNodebyId(status, data, headers) { + function returnById(status, data, headers) { if (!mocksUtils.checkAuth()) { return [401, null, null]; @@ -53,13 +53,33 @@ angular.module('umbraco.mocks'). return [200, dataType, null]; } + function returnEmpty(status, data, headers) { + if (!mocksUtils.checkAuth()) { + return [401, null, null]; + } + + var response = returnById(200, "", null); + var node = response[1]; + + node.name = ""; + node.selectedEditor = ""; + node.id = 0; + node.preValues = []; + + return response; + } return { register: function() { - $httpBackend - .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetById')) - .respond(returnNodebyId); + + $httpBackend + .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetById')) + .respond(returnById); + + $httpBackend + .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetEmpty')) + .respond(returnEmpty); }, expectGetById: function() { $httpBackend diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js index 6df4bf4071..3e92067787 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/tree.mocks.js @@ -63,6 +63,38 @@ angular.module('umbraco.mocks'). return [200, children, null]; } + function returnDataTypes(status, data, headers) { + if (!mocksUtils.checkAuth()) { + return [401, null, null]; + } + + var children = [ + { name: "Textstring", childNodesUrl: null, id: 10, icon: "icon-file-alt", children: [], expanded: false, hasChildren: false, level: 1, defaultAction: null, menuUrl: null }, + { name: "Multiple textstring", childNodesUrl: null, id: 11, icon: "icon-file-alt", children: [], expanded: false, hasChildren: false, level: 1, defaultAction: null, menuUrl: null }, + { name: "Yes/No", childNodesUrl: null, id: 12, icon: "icon-file-alt", children: [], expanded: false, hasChildren: false, level: 1, defaultAction: null, menuUrl: null }, + { name: "Rich Text Editor", childNodesUrl: null, id: 13, icon: "icon-file-alt", children: [], expanded: false, hasChildren: false, level: 1, defaultAction: null, menuUrl: null } + ]; + + return [200, children, null]; + } + + function returnDataTypeMenu(status, data, headers) { + if (!mocksUtils.checkAuth()) { + return [401, null, null]; + } + + var menu = [ + { + name: "Create", cssclass: "plus", alias: "create", metaData: { + jsAction: "umbracoMenuActions.CreateChildEntity" + } + }, + { seperator: true, name: "Reload", cssclass: "refresh", alias: "users", metaData: {} } + ]; + + return [200, menu, null]; + } + function returnApplicationTrees(status, data, headers) { if (!mocksUtils.checkAuth()) { @@ -111,12 +143,16 @@ angular.module('umbraco.mocks'). }; break; - case "developer": + case "developer": + + var dataTypeChildrenUrl = "/umbraco/UmbracoTrees/DataTypeTree/GetNodes?id=-1&application=developer"; + var dataTypeMenuUrl = "/umbraco/UmbracoTrees/DataTypeTree/GetMenu?id=-1&application=developer"; + t = { name: "developer", id: -1, children: [ - { name: "Data types", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "datatype" } }, + { name: "Data types", childNodesUrl: dataTypeChildrenUrl, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: dataTypeMenuUrl, metaData: { treeAlias: "datatype" } }, { name: "Macros", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "macros" } }, { name: "Packages", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "packager" } }, { name: "XSLT Files", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "xslt" } }, @@ -184,6 +220,15 @@ angular.module('umbraco.mocks'). .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren')) .respond(returnChildren); + + $httpBackend + .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/DataTypeTree/GetNodes')) + .respond(returnDataTypes); + + $httpBackend + .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/DataTypeTree/GetMenu')) + .respond(returnDataTypeMenu); + $httpBackend .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu')) .respond(getMenuItems); diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js index 160603e98b..e459cd6128 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js @@ -34,12 +34,12 @@ function dataTypeResource($q, $http, umbDataFormatter, umbRequestHelper) { /** saves or updates a data type object */ save: function (dataType, isNew) { return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "dataTypeApiBaseUrl", - "PostSave", - [{ id: id }])), - 'Failed to save data for data type id ' + id); + $http.post(umbRequestHelper.getApiUrl("dataTypeApiBaseUrl", "PostSave"), + { + //TODO: SD: I need to finish this on Monday! + action: "save" + (isNew ? "New" : "") + }), + 'Failed to save data for data type id ' + id); } }; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/menuactions.service.js b/src/Umbraco.Web.UI.Client/src/common/services/menuactions.service.js index 6b18077070..302834194c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/menuactions.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/menuactions.service.js @@ -8,7 +8,7 @@ * @description * Defines the methods that are called when menu items declare only an action to execute */ -function umbracoMenuActions($q, treeService) { +function umbracoMenuActions($q, treeService, $location) { return { @@ -26,6 +26,24 @@ function umbracoMenuActions($q, treeService) { */ "RefreshNodeMenuItem": function (args) { treeService.loadNodeChildren({ node: args.treeNode, section: args.section }); + }, + + /** + * @ngdoc method + * @name umbraco.services.umbracoMenuActions#CreateChildEntity + * @methodOf umbraco.services.umbracoMenuActions + * @function + * + * @description + * This will re-route to a route for creating a new entity as a child of the current node + * @param {object} args An arguments object + * @param {object} args.treeNode The tree node + * @param {object} args.section The current section + */ + "CreateChildEntity": function (args) { + var route = "/" + args.section + "/" + treeService.getTreeAlias(args.treeNode) + "/edit/" + args.treeNode.id; + //change to new path + $location.path(route).search({ create: true }); } }; } diff --git a/src/Umbraco.Web.UI.Client/src/views/datatype/datatype.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/datatype/datatype.edit.controller.js index c59f3a915b..4bd72c084e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatype/datatype.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/datatype/datatype.edit.controller.js @@ -8,6 +8,7 @@ */ function DataTypeEditController($scope, $routeParams, $location, dataTypeResource, notificationsService, angularHelper, serverValidationManager, contentEditingHelper) { + //set up the standard data type props function createDisplayProps() { $scope.properties = { selectedEditor: { @@ -22,6 +23,7 @@ function DataTypeEditController($scope, $routeParams, $location, dataTypeResourc }; } + //setup the pre-values as props function createPreValueProps(preVals) { $scope.preValues = []; for (var i = 0; i < preVals.length; i++) { @@ -33,17 +35,6 @@ function DataTypeEditController($scope, $routeParams, $location, dataTypeResourc view: preVals[i].view, }); } - - // { - // alias: "selectedEditor", - // description: "Select a property editor", - // label: "Property editor" - // }, - // { - // alias: "selectedEditorId", - // label: "Property editor GUID" - // } - //]; } if ($routeParams.create) { @@ -52,6 +43,7 @@ function DataTypeEditController($scope, $routeParams, $location, dataTypeResourc .then(function(data) { $scope.loaded = true; $scope.content = data; + createDisplayProps(); }); } else { @@ -74,6 +66,8 @@ function DataTypeEditController($scope, $routeParams, $location, dataTypeResourc //ensure there is a form object assigned. var currentForm = angularHelper.getRequiredCurrentForm($scope); + //TODO: We need to handle the dynamic loading of the pre-value editor view whenever the drop down changes! + $scope.save = function (cnt) { $scope.$broadcast("saving", { scope: $scope }); @@ -82,12 +76,12 @@ function DataTypeEditController($scope, $routeParams, $location, dataTypeResourc serverValidationManager.reset(); - dataTypeResource.save(cnt, $routeParams.create, $scope.files) + dataTypeResource.save(cnt, $routeParams.create) .then(function (data) { - contentEditingHelper.handleSuccessfulSave({ - scope: $scope, - newContent: data - }); + + //TODO: SD: I need to finish this on monday! + alert("Woot!"); + }, function (err) { contentEditingHelper.handleSaveError(err, $scope); }); diff --git a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest index a634b68295..a542d5b3ff 100644 --- a/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest +++ b/src/Umbraco.Web.UI/App_Plugins/MyPackage/Package.manifest @@ -21,7 +21,7 @@ preValueEditor: { fields: [ { - name: "Regular expression", + label: "Regular expression", description: "Enter a regular expression to use to validate this editor", key: "regex", view: "~/App_Plugins/MyPackage/PropertyEditors/Views/regexStatement.html", diff --git a/src/Umbraco.Web/HttpUrlHelperExtensions.cs b/src/Umbraco.Web/HttpUrlHelperExtensions.cs index 829bc419c7..a8988ac264 100644 --- a/src/Umbraco.Web/HttpUrlHelperExtensions.cs +++ b/src/Umbraco.Web/HttpUrlHelperExtensions.cs @@ -96,11 +96,11 @@ namespace Umbraco.Web routeName = string.Format("umbraco-{0}-{1}-{2}", "api", area, controllerName); if (id == null) { - return url.Link(routeName, new {controller = controllerName, action = actionName, area = area}); + return url.Link(routeName, new {controller = controllerName, action = actionName}); } else { - return url.Link(routeName, new { controller = controllerName, action = actionName, area = area, id = id }); + return url.Link(routeName, new { controller = controllerName, action = actionName, id = id }); } } } diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs index ee85b0ccdb..27e787575e 100644 --- a/src/Umbraco.Web/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTreeController.cs @@ -9,15 +9,18 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; +using Umbraco.Web.Mvc; using Umbraco.Web.Trees.Menu; using umbraco; using umbraco.BusinessLogic.Actions; using umbraco.businesslogic; using umbraco.interfaces; +using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Trees { [Tree(Constants.Applications.Content, Constants.Trees.Content, "Content")] + [PluginController("UmbracoTrees")] public class ContentTreeController : ContentTreeControllerBase { protected override TreeNode CreateRootNode(FormDataCollection queryStrings) diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index c9159b336b..73477e0f71 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -5,12 +5,15 @@ using System.Net; using System.Net.Http.Formatting; using System.Web.Http; using Umbraco.Core; +using Umbraco.Web.Mvc; using Umbraco.Web.Trees.Menu; using umbraco.BusinessLogic.Actions; +using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Trees { [Tree(Constants.Applications.Developer, Constants.Trees.DataTypes, "Data Types")] + [PluginController("UmbracoTrees")] public class DataTypeTreeController : TreeApiController { protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) diff --git a/src/Umbraco.Web/Trees/MediaTreeController.cs b/src/Umbraco.Web/Trees/MediaTreeController.cs index 0ea1954456..7078e7d2ac 100644 --- a/src/Umbraco.Web/Trees/MediaTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTreeController.cs @@ -3,12 +3,15 @@ using System.Net.Http.Formatting; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Services; +using Umbraco.Web.Mvc; using Umbraco.Web.Trees.Menu; using umbraco.BusinessLogic.Actions; +using Constants = Umbraco.Core.Constants; namespace Umbraco.Web.Trees { [Tree(Constants.Applications.Media, Constants.Trees.Media, "Media")] + [PluginController("UmbracoTrees")] public class MediaTreeController : ContentTreeControllerBase { protected override int RecycleBinId