From d379b98c576b81307e5b42edd22973dbbef2ddeb Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 12 Nov 2015 11:28:41 +0100 Subject: [PATCH] Gets data type folders working/creating, data types being able to be created in folders, tree syncing with data type paths, fixes up some localization stuff and fixes up some issues with media type folders with parent ids --- src/Umbraco.Core/Models/DataTypeDefinition.cs | 2 - .../src/common/resources/datatype.resource.js | 4 +- .../src/common/services/navigation.service.js | 10 ++--- .../src/common/services/util.service.js | 2 +- .../src/views/datatypes/create.controller.js | 2 +- .../src/views/datatypes/create.html | 2 +- .../datatypes/datatype.delete.controller.js | 17 ++++++++ .../datatypes/datatype.edit.controller.js | 6 +-- .../src/views/datatypes/delete.html | 30 ++++++++++++-- .../src/views/mediatypes/delete.html | 4 +- src/Umbraco.Web/Editors/DataTypeController.cs | 4 +- .../Editors/MediaTypeController.cs | 4 +- .../Models/Mapping/DataTypeModelMapper.cs | 4 +- .../Trees/DataTypeTreeController.cs | 39 ++++++++----------- 14 files changed, 80 insertions(+), 50 deletions(-) diff --git a/src/Umbraco.Core/Models/DataTypeDefinition.cs b/src/Umbraco.Core/Models/DataTypeDefinition.cs index 5d5b9490a5..a2ca15e46a 100644 --- a/src/Umbraco.Core/Models/DataTypeDefinition.cs +++ b/src/Umbraco.Core/Models/DataTypeDefinition.cs @@ -49,8 +49,6 @@ namespace Umbraco.Core.Models _additionalData = new Dictionary(); } - [Obsolete("Don't use this, parentId is always -1 for data types")] - [EditorBrowsable(EditorBrowsableState.Never)] public DataTypeDefinition(int parentId, string propertyEditorAlias) { _parentId = parentId; 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 48abd8443e..5cc1e4fec4 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 @@ -181,13 +181,13 @@ function dataTypeResource($q, $http, umbDataFormatter, umbRequestHelper) { * @returns {Promise} resourcePromise object containing the data type scaffold. * */ - getScaffold: function () { + getScaffold: function (parentId) { return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( "dataTypeApiBaseUrl", - "GetEmpty")), + "GetEmpty", { parentId: parentId })), "Failed to retrieve data for empty datatype"); }, /** diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js index 11c62f1aec..7bc069ef44 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js @@ -108,7 +108,7 @@ function navigationService($rootScope, $routeParams, $log, $location, $q, $timeo * @param {String} source The URL to load into the iframe */ loadLegacyIFrame: function (source) { - $location.path("/" + appState.getSectionState("currentSection") + "/framed/" + encodeURIComponent(source)); + $location.path("/" + appState.getSectionState("currentSection").toLowerCase() + "/framed/" + encodeURIComponent(source)); }, /** @@ -132,7 +132,7 @@ function navigationService($rootScope, $routeParams, $log, $location, $q, $timeo appState.setSectionState("currentSection", sectionAlias); this.showTree(sectionAlias); - $location.path(sectionAlias); + $location.path(sectionAlias.toLowerCase()); }, /** @@ -250,10 +250,10 @@ function navigationService($rootScope, $routeParams, $log, $location, $q, $timeo appState.setMenuState("currentNode", args.node); //not legacy, lets just set the route value and clear the query string if there is one. - $location.path(n.routePath).search(""); + $location.path(n.routePath.toLowerCase()).search(""); } else if (args.element.section) { - $location.path(args.element.section).search(""); + $location.path(args.element.section.toLowerCase()).search(""); } service.hideNavigation(); @@ -446,7 +446,7 @@ function navigationService($rootScope, $routeParams, $log, $location, $q, $timeo if (action.metaData && action.metaData["actionRoute"] && angular.isString(action.metaData["actionRoute"])) { //first check if the menu item simply navigates to a route var parts = action.metaData["actionRoute"].split("?"); - $location.path(parts[0]).search(parts.length > 1 ? parts[1] : ""); + $location.path(parts[0].toLowerCase()).search(parts.length > 1 ? parts[1] : ""); this.hideNavigation(); return; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 8d94a66793..4371c0d7a7 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -537,7 +537,7 @@ function umbDataFormatter() { /** formats the display model used to display the data type to the model used to save the data type */ formatDataTypePostData: function(displayModel, preValues, action) { var saveModel = { - parentId: -1, + parentId: displayModel.parentId, id: displayModel.id, name: displayModel.name, selectedEditor: displayModel.selectedEditor, diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/datatypes/create.controller.js index e57deb6145..d5d8128155 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatypes/create.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/create.controller.js @@ -40,7 +40,7 @@ function DataTypeCreateController($scope, $location, navigationService, dataType $scope.createDataType = function() { $location.search('create', null); - $location.path("/settings/datatype/edit/" + node.id).search("create", "true"); + $location.path("/developer/datatypes/edit/" + node.id).search("create", "true"); navigationService.hideMenu(); } } diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html b/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html index 677fd5aa89..af60632f2b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html @@ -7,7 +7,7 @@
  • - + New Data type diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.delete.controller.js index 4fc5d3a935..101d74b16b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.delete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.delete.controller.js @@ -25,6 +25,23 @@ function DataTypeDeleteController($scope, dataTypeResource, treeService, navigat }; + $scope.performContainerDelete = function () { + + //mark it for deletion (used in the UI) + $scope.currentNode.loading = true; + dataTypeResource.deleteContainerById($scope.currentNode.id).then(function () { + $scope.currentNode.loading = false; + + //get the root node before we remove it + var rootNode = treeService.getTreeRoot($scope.currentNode); + + //TODO: Need to sync tree, etc... + treeService.removeNode($scope.currentNode); + navigationService.hideMenu(); + }); + + }; + $scope.cancel = function() { navigationService.hideDialog(); }; diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js index 7a6fdf0a9d..f0dff7e2f3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js @@ -52,7 +52,7 @@ function DataTypeEditController($scope, $routeParams, $location, appState, navig $scope.page.loading = true; //we are creating so get an empty data type item - dataTypeResource.getScaffold() + dataTypeResource.getScaffold($routeParams.id) .then(function(data) { $scope.preValuesLoaded = true; @@ -91,7 +91,7 @@ function DataTypeEditController($scope, $routeParams, $location, appState, navig // if there are any and then clear them so the collection no longer persists them. serverValidationManager.executeAndClearAllSubscriptions(); - navigationService.syncTree({ tree: "datatypes", path: [String(data.id)] }).then(function (syncArgs) { + navigationService.syncTree({ tree: "datatypes", path: data.path }).then(function (syncArgs) { $scope.page.menu.currentNode = syncArgs.node; }); @@ -152,7 +152,7 @@ function DataTypeEditController($scope, $routeParams, $location, appState, navig //share state editorState.set($scope.content); - navigationService.syncTree({ tree: "datatypes", path: [String(data.id)], forceReload: true }).then(function (syncArgs) { + navigationService.syncTree({ tree: "datatypes", path: data.path, forceReload: true }).then(function (syncArgs) { $scope.page.menu.currentNode = syncArgs.node; }); diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/delete.html b/src/Umbraco.Web.UI.Client/src/views/datatypes/delete.html index b7bcae8e3d..d303f8aab4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatypes/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/delete.html @@ -2,11 +2,35 @@

    - Are you sure you want to delete {{currentNode.name}} ? + Are you sure you want to delete {{currentNode.name}} ?

    - - + +
    +

    Any item that exists in this folder will be moved to the parent folder

    + + + +
    + +
    +

    + All property types & property data + using this data type will be deleted permanently, please confirm you want to delete these as well. +

    + +
    + + + + + +
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/mediatypes/delete.html b/src/Umbraco.Web.UI.Client/src/views/mediatypes/delete.html index a46b77e898..700775dbe7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediatypes/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/mediatypes/delete.html @@ -2,12 +2,12 @@

    - Are you sure you want to delete {{currentNode.name}} ? + Are you sure you want to delete {{currentNode.name}} ?

    -

    This action cannot be undone, click ok to delete.

    +

    Any item that exists in this folder will be moved to the parent folder

    (dt); } diff --git a/src/Umbraco.Web/Editors/MediaTypeController.cs b/src/Umbraco.Web/Editors/MediaTypeController.cs index 14a4732d43..05e861cce2 100644 --- a/src/Umbraco.Web/Editors/MediaTypeController.cs +++ b/src/Umbraco.Web/Editors/MediaTypeController.cs @@ -82,9 +82,9 @@ namespace Umbraco.Web.Editors return Request.CreateResponse(HttpStatusCode.OK); } - public ContentTypeCompositionDisplay GetEmpty() + public ContentTypeCompositionDisplay GetEmpty(int parentId) { - var ct = new MediaType(-1); + var ct = new MediaType(parentId); ct.Icon = "icon-picture"; var dto = Mapper.Map(ct); diff --git a/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs b/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs index c451e1a9bd..70ff63ca12 100644 --- a/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs +++ b/src/Umbraco.Web/Models/Mapping/DataTypeModelMapper.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using AutoMapper; -using System.Collections.Generic; using System.Linq; using Umbraco.Core; using Umbraco.Core.Models; @@ -71,7 +70,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(x => x.Notifications, expression => expression.Ignore()) .ForMember(x => x.Icon, expression => expression.Ignore()) .ForMember(x => x.Alias, expression => expression.Ignore()) - .ForMember(x => x.Group, expression => expression.Ignore()) + .ForMember(x => x.Group, expression => expression.Ignore()) .ForMember(x => x.IsSystemDataType, expression => expression.MapFrom(definition => systemIds.Contains(definition.Id))) .AfterMap((def, basic) => { @@ -99,7 +98,6 @@ namespace Umbraco.Web.Models.Mapping .ForMember(definition => definition.Key, expression => expression.Ignore()) .ForMember(definition => definition.Path, expression => expression.Ignore()) .ForMember(definition => definition.PropertyEditorAlias, expression => expression.MapFrom(save => save.SelectedEditor)) - .ForMember(definition => definition.ParentId, expression => expression.MapFrom(save => -1)) .ForMember(definition => definition.DatabaseType, expression => expression.ResolveUsing()) .ForMember(x => x.ControlId, expression => expression.Ignore()) .ForMember(x => x.CreatorId, expression => expression.Ignore()) diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index a0d2addd35..ee12562fc5 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -12,6 +12,7 @@ using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; using umbraco; using umbraco.BusinessLogic.Actions; +using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; using Constants = Umbraco.Core.Constants; @@ -32,7 +33,7 @@ namespace Umbraco.Web.Trees //Folders first nodes.AddRange( - Services.EntityService.GetChildren(intId.Result, UmbracoObjectTypes.MediaTypeContainer) + Services.EntityService.GetChildren(intId.Result, UmbracoObjectTypes.DataTypeContainer) .OrderBy(entity => entity.Name) .Select(dt => { @@ -46,10 +47,20 @@ namespace Umbraco.Web.Trees //Normal nodes var sysIds = GetSystemIds(); + nodes.AddRange( - Services.DataTypeService.GetAllDataTypeDefinitions() - .OrderBy(x => x.Name) - .Select(dt => CreateTreeNode(id, queryStrings, sysIds, dt))); + Services.EntityService.GetChildren(intId.Result, UmbracoObjectTypes.DataType) + .OrderBy(entity => entity.Name) + .Select(dt => + { + var node = CreateTreeNode(dt.Id.ToInvariantString(), id, queryStrings, dt.Name, "icon-autofill", false); + node.Path = dt.Path; + if (sysIds.Contains(dt.Id)) + { + node.Icon = "icon-thumbnail-list"; + } + return node; + })); return nodes; } @@ -64,25 +75,7 @@ namespace Umbraco.Web.Trees }; return systemIds; } - - private TreeNode CreateTreeNode(string id, FormDataCollection queryStrings, IEnumerable systemIds, IDataTypeDefinition dt) - { - var node = CreateTreeNode( - dt.Id.ToInvariantString(), - id, - queryStrings, - dt.Name, - "icon-autofill", - false); - - if (systemIds.Contains(dt.Id)) - { - node.Icon = "icon-thumbnail-list"; - } - - return node; - } - + protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings) { var menu = new MenuItemCollection();