From ddccc378d528c59e5c307de0da616b32998561ab Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 16 Aug 2013 17:25:52 +1000 Subject: [PATCH] Started getting the creation process working for data types, created custom mock data type trees and menu's to get it all up and running but is still in progress. Will finish that on Monday along with dynamically changing the pre-value editors based on the drop down changing. --- .../common/mocks/resources/datatype.mocks.js | 28 +++++++++-- .../src/common/mocks/resources/tree.mocks.js | 49 ++++++++++++++++++- .../src/common/resources/datatype.resource.js | 12 ++--- .../common/services/menuactions.service.js | 20 +++++++- .../datatype/datatype.edit.controller.js | 26 ++++------ .../App_Plugins/MyPackage/Package.manifest | 2 +- src/Umbraco.Web/HttpUrlHelperExtensions.cs | 4 +- .../Trees/ContentTreeController.cs | 3 ++ .../Trees/DataTypeTreeController.cs | 3 ++ src/Umbraco.Web/Trees/MediaTreeController.cs | 3 ++ 10 files changed, 118 insertions(+), 32 deletions(-) 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