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();