diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js
index 5313eadcaa..1471abd8d3 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js
@@ -101,6 +101,12 @@ function macroResource($q, $http, umbRequestHelper) {
$http.get(umbRequestHelper.getApiUrl("macroApiBaseUrl", "GetParameterEditors"),
"Failed to get parameter editors")
);
+ },
+
+ getById: function(id) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(umbRequestHelper.getApiUrl("macroApiBaseUrl", "GetById", { "id" : id}), "Failed to get macro")
+ );
}
};
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.html b/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.html
index bf9dbf86a3..402c3c4984 100644
--- a/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.html
+++ b/src/Umbraco.Web.UI.Client/src/views/macros/infiniteeditors/parameter.html
@@ -26,7 +26,7 @@
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/macros/macros.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/macros/macros.edit.controller.js
index f8cde110e6..91af9b0f09 100644
--- a/src/Umbraco.Web.UI.Client/src/views/macros/macros.edit.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/macros/macros.edit.controller.js
@@ -83,11 +83,24 @@ function MacrosEditController($scope, $q, $routeParams, macroResource, editorSta
return deferred.promise;
}
+ function getMacro() {
+ var deferred = $q.defer();
+
+ macroResource.getById($routeParams.id).then(function (data) {
+ deferred.resolve(data);
+ }, function () {
+ deferred.reject();
+ });
+
+ return deferred.promise;
+ }
+
function init() {
vm.page.loading = true;
vm.promises['partialViews'] = getPartialViews();
vm.promises['parameterEditors'] = getParameterEditors();
+ vm.promises['macro'] = getMacro();
$q.all(vm.promises).then(function (values) {
var keys = Object.keys(values);
@@ -102,12 +115,20 @@ function MacrosEditController($scope, $q, $routeParams, macroResource, editorSta
if (keys[i] === 'parameterEditors') {
vm.parameterEditors = values[key];
}
+
+ if (keys[i] === 'macro') {
+ vm.macro = values[key];
+ editorState.set(vm.macro);
+
+ navigationService.syncTree({ tree: "macros", path: vm.macro.path, forceReload: true }).then(function (syncArgs) {
+ vm.page.menu.currentNode = syncArgs.node;
+ });
+ }
}
vm.page.loading = false;
});
-
vm.page.navigation = [
{
"name": "Settings",
@@ -123,31 +144,6 @@ function MacrosEditController($scope, $q, $routeParams, macroResource, editorSta
"view": "views/macros/views/parameters.html"
}
];
-
- vm.macro = {
- "name": "Test macro",
- "alias": "testMacro",
- "id": 1,
- "key": "unique key goes here",
- "useInEditor": true,
- "renderInEditor": false,
- "cachePeriod": 2400,
- "cacheByPage": true,
- "cacheByUser": false,
- "view": "Second",
- "parameters": [
- {
- "key": "title",
- "label": "Label",
- "editor": "editor"
- },
- {
- "key": "link",
- "label": "Link",
- "editor": "Link picker"
- }
- ]
- }
}
init();
diff --git a/src/Umbraco.Web.UI.Client/src/views/macros/views/settings.html b/src/Umbraco.Web.UI.Client/src/views/macros/views/settings.html
index 51e83a9134..ba5b324837 100644
--- a/src/Umbraco.Web.UI.Client/src/views/macros/views/settings.html
+++ b/src/Umbraco.Web.UI.Client/src/views/macros/views/settings.html
@@ -2,7 +2,8 @@
-
+
diff --git a/src/Umbraco.Web/Editors/MacrosController.cs b/src/Umbraco.Web/Editors/MacrosController.cs
index 6e2d032ad4..d604137e19 100644
--- a/src/Umbraco.Web/Editors/MacrosController.cs
+++ b/src/Umbraco.Web/Editors/MacrosController.cs
@@ -1,25 +1,24 @@
-using System;
-using System.Net;
-using System.Net.Http;
-using System.Web.Http;
-
-using Umbraco.Core;
-using Umbraco.Core.Logging;
-using Umbraco.Core.Models;
-using Umbraco.Web.Mvc;
-using Umbraco.Web.WebApi;
-using Umbraco.Web.WebApi.Filters;
-
-using Constants = Umbraco.Core.Constants;
-
-namespace Umbraco.Web.Editors
+namespace Umbraco.Web.Editors
{
+ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+ using System.Net;
+ using System.Net.Http;
+ using System.Web.Http;
+ using Umbraco.Core;
using Umbraco.Core.IO;
+ using Umbraco.Core.Logging;
+ using Umbraco.Core.Models;
using Umbraco.Web.Composing;
+ using Umbraco.Web.Models.ContentEditing;
+ using Umbraco.Web.Mvc;
+ using Umbraco.Web.WebApi;
+ using Umbraco.Web.WebApi.Filters;
+
+ using Constants = Umbraco.Core.Constants;
///
/// The API controller used for editing dictionary items
@@ -41,33 +40,75 @@ namespace Umbraco.Web.Editors
public HttpResponseMessage Create(string name)
{
if (string.IsNullOrWhiteSpace(name))
- return Request
- .CreateNotificationValidationErrorResponse("Name can not be empty;");
+ {
+ return this.ReturnErrorResponse("Name can not be empty");
+ }
var alias = name.ToSafeAlias();
- var existingMacro = this.Services.MacroService.GetByAlias(alias);
-
- if (existingMacro != null)
+ if (this.Services.MacroService.GetByAlias(alias) != null)
{
- return Request.CreateNotificationValidationErrorResponse("Macro with this name already exists");
+ return this.ReturnErrorResponse("Macro with this name already exists");
}
try
{
- var macro = new Macro { Alias = alias, Name = name, MacroSource = string.Empty };
+ var macro = new Macro
+ {
+ Alias = alias,
+ Name = name,
+ MacroSource = string.Empty,
+ MacroType = MacroTypes.PartialView
+ };
this.Services.MacroService.Save(macro, this.Security.CurrentUser.Id);
- return Request.CreateResponse(HttpStatusCode.OK, macro.Id);
+ return this.Request.CreateResponse(HttpStatusCode.OK, macro.Id);
}
catch (Exception exception)
{
- this.Logger.Error(exception, "Error creating macro");
- return Request.CreateNotificationValidationErrorResponse("Error creating dictionary item");
+ return this.ReturnErrorResponse("Error creating macro", true, exception);
}
}
+ [HttpGet]
+ public HttpResponseMessage GetById(int id)
+ {
+ var macro = this.Services.MacroService.GetById(id);
+
+ if (macro == null)
+ {
+ return this.ReturnErrorResponse($"Macro with id {id} does not exist");
+ }
+
+ var macroDisplay = new MacroDisplay
+ {
+ Alias = macro.Alias, Id = macro.Id, Key = macro.Key, Name = macro.Name,
+ CacheByPage = macro.CacheByPage, CacheByUser = macro.CacheByMember,
+ CachePeriod = macro.CacheDuration,
+ View = macro.MacroSource,
+ RenderInEditor = !macro.DontRender,
+ UseInEditor = macro.UseInEditor,
+ Path = $"-1,{macro.Id}"
+ };
+
+ var parameters = new List();
+
+ foreach (var param in macro.Properties.Values.OrderBy(x => x.SortOrder))
+ {
+ parameters.Add(new MacroParameterDisplay
+ {
+ Editor = param.EditorAlias,
+ Key = param.Alias,
+ Label = param.Name
+ });
+ }
+
+ macroDisplay.Parameters = parameters;
+
+ return this.Request.CreateResponse(HttpStatusCode.OK, macroDisplay);
+ }
+
///
/// Gets a list of available macro partials
///
@@ -94,6 +135,31 @@ namespace Umbraco.Web.Editors
return this.Request.CreateResponse(HttpStatusCode.OK, Current.ParameterEditors);
}
+ ///
+ /// Returns a error response and optionally logs it
+ ///
+ ///
+ /// The error message.
+ ///
+ ///
+ /// Value to indicate if the error needs to be logged
+ ///
+ ///
+ /// The exception to log
+ ///
+ ///
+ /// The .
+ ///
+ private HttpResponseMessage ReturnErrorResponse(string message, bool logError = false, Exception exception = null)
+ {
+ if (logError && exception != null)
+ {
+ this.Logger.Error(exception, message);
+ }
+
+ return this.Request.CreateNotificationValidationErrorResponse(message);
+ }
+
///
/// Finds all the macro partials
///
diff --git a/src/Umbraco.Web/Models/ContentEditing/MacroDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MacroDisplay.cs
new file mode 100644
index 0000000000..e84887b88b
--- /dev/null
+++ b/src/Umbraco.Web/Models/ContentEditing/MacroDisplay.cs
@@ -0,0 +1,67 @@
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+
+namespace Umbraco.Web.Models.ContentEditing
+{
+ ///
+ /// The macro display model
+ ///
+ [DataContract(Name = "dictionary", Namespace = "")]
+ public class MacroDisplay : EntityBasic, INotificationModel
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public MacroDisplay()
+ {
+ this.Notifications = new List();
+ this.Parameters = new List();
+ }
+
+ ///
+ [DataMember(Name = "notifications")]
+ public List Notifications { get; }
+
+ ///
+ /// Gets or sets a value indicating whether the macro can be used in a rich text editor.
+ ///
+ [DataMember(Name = "useInEditor")]
+ public bool UseInEditor { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the macro should be rendered a rich text editor.
+ ///
+ [DataMember(Name = "renderInEditor")]
+ public bool RenderInEditor { get; set; }
+
+ ///
+ /// Gets or sets the cache period.
+ ///
+ [DataMember(Name = "cachePeriod")]
+ public int CachePeriod { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the macro should be cached by page
+ ///
+ [DataMember(Name = "cacheByPage")]
+ public bool CacheByPage { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether the macro should be cached by user
+ ///
+ [DataMember(Name = "cacheByUser")]
+ public bool CacheByUser { get; set; }
+
+ ///
+ /// Gets or sets the view.
+ ///
+ [DataMember(Name = "view")]
+ public string View { get; set; }
+
+ ///
+ /// Gets or sets the parameters.
+ ///
+ [DataMember(Name = "parameters")]
+ public IEnumerable Parameters { get; set; }
+ }
+}
diff --git a/src/Umbraco.Web/Models/ContentEditing/MacroParameterDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MacroParameterDisplay.cs
new file mode 100644
index 0000000000..56d3d1b76e
--- /dev/null
+++ b/src/Umbraco.Web/Models/ContentEditing/MacroParameterDisplay.cs
@@ -0,0 +1,29 @@
+namespace Umbraco.Web.Models.ContentEditing
+{
+ using System.Runtime.Serialization;
+
+ ///
+ /// The macro parameter display.
+ ///
+ [DataContract(Name = "parameter", Namespace = "")]
+ public class MacroParameterDisplay
+ {
+ ///
+ /// Gets or sets the key.
+ ///
+ [DataMember(Name = "key")]
+ public string Key { get; set; }
+
+ ///
+ /// Gets or sets the label.
+ ///
+ [DataMember(Name = "label")]
+ public string Label { get; set; }
+
+ ///
+ /// Gets or sets the editor.
+ ///
+ [DataMember(Name = "editor")]
+ public string Editor { get; set; }
+ }
+}
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 7186835ba8..dbf422531d 100755
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -158,6 +158,8 @@
+
+