diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index fa21b1e377..3e01c0de9b 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -477,9 +477,10 @@ Er du sikker på at du vil forlade Umbraco? Er du sikker? Klip - Rediger ordbogsnøgle - Rediger sprog + Rediger ordbogsnøgle + Rediger sprog Rediger det valgte medie + Edit webhook Indsæt lokalt link Indsæt tegn Indsæt grafisk overskrift @@ -531,6 +532,7 @@ Åben linket i et nyt vindue eller fane Link til medie Vælg startnode for indhold + Vælg event Vælg medie Vælg medietype Vælg ikon @@ -1009,6 +1011,9 @@ Tilføj webhook header Tilføj dokument type Tilføj medie Type + Opret header + Logs + Der er ikke tilføjet nogen webhook headers Culture Code @@ -1463,6 +1468,7 @@ Mange hilsner fra Umbraco robotten Dit systems information er blevet kopieret til udklipsholderen Kunne desværre ikke kopiere dit systems information til udklipsholderen + Webhook gemt Tilføj style diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index c85b1122cd..e6662d6201 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -486,9 +486,10 @@ Are you sure? Are you sure? Cut - Edit Dictionary Item - Edit Language + Edit dictionary item + Edit language Edit selected media + Edit webhook Insert local link Insert character Insert graphic headline @@ -542,6 +543,7 @@ Opens the linked document in a new window or tab Link to media Select content start node + Select event Select media Select media type Select icon @@ -1666,6 +1668,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Your system information has successfully been copied to the clipboard Could not copy your system information to the clipboard + Webhook saved Add style @@ -1933,9 +1936,11 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Create webhook Add webhook header - Logs Add Document Type Add Media Type + Create header + Logs + No webhook headers have been added Add language diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 77272aa79b..0602ff487a 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -501,9 +501,10 @@ Are you sure? Are you sure? Cut - Edit Dictionary Item - Edit Language + Edit dictionary item + Edit language Edit selected media + Edit webhook Insert local link Insert character Insert graphic headline @@ -557,6 +558,7 @@ Opens the linked document in a new window or tab Link to media Select content start node + Select event Select media Select media type Select icon @@ -1731,6 +1733,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont An error occurred while disabling version cleanup for %0% Your system information has successfully been copied to the clipboard Could not copy your system information to the clipboard + Webhook saved Add style @@ -2015,9 +2018,11 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Create webhook Add webhook header - Logs Add Document Type Add Media Type + Create header + Logs + No webhook headers have been added Add language diff --git a/src/Umbraco.Web.BackOffice/Controllers/WebhookController.cs b/src/Umbraco.Web.BackOffice/Controllers/WebhookController.cs index afa39ff623..9db46330ed 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/WebhookController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/WebhookController.cs @@ -44,20 +44,21 @@ public class WebhookController : UmbracoAuthorizedJsonController [HttpPut] public async Task Update(WebhookViewModel webhookViewModel) { - Webhook updateModel = _umbracoMapper.Map(webhookViewModel)!; + Webhook webhook = _umbracoMapper.Map(webhookViewModel)!; - await _webhookService.UpdateAsync(updateModel); + await _webhookService.UpdateAsync(webhook); - return Ok(); + return Ok(_webhookPresentationFactory.Create(webhook)); } [HttpPost] public async Task Create(WebhookViewModel webhookViewModel) { Webhook webhook = _umbracoMapper.Map(webhookViewModel)!; + await _webhookService.CreateAsync(webhook); - return Ok(); + return Ok(_webhookPresentationFactory.Create(webhook)); } [HttpGet] @@ -65,7 +66,7 @@ public class WebhookController : UmbracoAuthorizedJsonController { Webhook? webhook = await _webhookService.GetAsync(key); - return webhook is null ? NotFound() : Ok(webhook); + return webhook is null ? NotFound() : Ok(_webhookPresentationFactory.Create(webhook)); } [HttpDelete] diff --git a/src/Umbraco.Web.BackOffice/Services/WebhookPresentationFactory.cs b/src/Umbraco.Web.BackOffice/Services/WebhookPresentationFactory.cs index 57ef7e5f2a..ef4e052596 100644 --- a/src/Umbraco.Web.BackOffice/Services/WebhookPresentationFactory.cs +++ b/src/Umbraco.Web.BackOffice/Services/WebhookPresentationFactory.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Webhooks; using Umbraco.Cms.Web.Common.Models; @@ -14,12 +14,15 @@ internal class WebhookPresentationFactory : IWebhookPresentationFactory public WebhookViewModel Create(Webhook webhook) { var target = new WebhookViewModel - { - ContentTypeKeys = webhook.ContentTypeKeys, Events = webhook.Events.Select(Create).ToArray(), Url = webhook.Url, - Enabled = webhook.Enabled, - Key = webhook.Key, - Headers = webhook.Headers, - }; + { + ContentTypeKeys = webhook.ContentTypeKeys, + Events = webhook.Events.Select(Create).ToArray(), + Url = webhook.Url, + Enabled = webhook.Enabled, + Id = webhook.Id, + Key = webhook.Key, + Headers = webhook.Headers, + }; return target; } @@ -27,6 +30,7 @@ internal class WebhookPresentationFactory : IWebhookPresentationFactory private WebhookEventViewModel Create(string alias) { IWebhookEvent? webhookEvent = _webhookEventCollection.FirstOrDefault(x => x.Alias == alias); + return new WebhookEventViewModel { EventName = webhookEvent?.EventName ?? alias, diff --git a/src/Umbraco.Web.Common/Models/WebhookViewModel.cs b/src/Umbraco.Web.Common/Models/WebhookViewModel.cs index 9030ff050c..a1e581ff22 100644 --- a/src/Umbraco.Web.Common/Models/WebhookViewModel.cs +++ b/src/Umbraco.Web.Common/Models/WebhookViewModel.cs @@ -1,10 +1,13 @@ -using System.Runtime.Serialization; +using System.Runtime.Serialization; namespace Umbraco.Cms.Web.Common.Models; [DataContract] public class WebhookViewModel { + [DataMember(Name = "id")] + public int Id { get; set; } + [DataMember(Name = "key")] public Guid? Key { get; set; } diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index d68a48c702..f24365a806 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -2,7 +2,11 @@ // Container styles // -------------------------------------------------- .umb-property-editor { - width: 100%; + width: 100%; + + &--limit-width { + .umb-property-editor--limit-width(); + } } .umb-property-editor-tiny { diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js index b545bd2a7c..b2b5f487be 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/edit.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function LanguagesEditController($scope, $q, $timeout, $location, $routeParams, overlayService, navigationService, notificationsService, localizationService, languageResource, contentEditingHelper, formHelper, eventsService) { + function LanguagesEditController($scope, $q, $timeout, $location, $routeParams, overlayService, navigationService, notificationsService, localizationService, languageResource, formHelper, eventsService) { var vm = this; vm.isNew = false; diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js index ef46bcf84d..ef30ca6d46 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js @@ -11,6 +11,7 @@ vm.addLanguage = addLanguage; vm.editLanguage = editLanguage; vm.deleteLanguage = deleteLanguage; + vm.getLanguageById = function(id) { for (var i = 0; i < vm.languages.length; i++) { if (vm.languages[i].id === id) { diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js new file mode 100644 index 0000000000..93bbd842b0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js @@ -0,0 +1,330 @@ +(function () { + "use strict"; + + function WebhooksEditController($scope, $q, $timeout, $location, $routeParams, editorService, eventsService, navigationService, notificationsService, localizationService, contentTypeResource, mediaTypeResource, memberTypeResource, webhooksResource, formHelper) { + + const vm = this; + + vm.isNew = false; + vm.showIdentifier = true; + + vm.contentTypes = []; + vm.webhook = {}; + vm.breadcrumbs = []; + vm.labels = {}; + vm.save = save; + vm.back = back; + vm.goToPage = goToPage; + + vm.clearContentType = clearContentType; + vm.clearEvent = clearEvent; + vm.openContentTypePicker = openContentTypePicker; + vm.openEventPicker = openEventPicker; + vm.openCreateHeader = openCreateHeader; + vm.removeHeader = removeHeader; + + function init() { + vm.loading = true; + + let promises = []; + + // Localize labels + promises.push(localizationService.localizeMany([ + "treeHeaders_webhooks", + "webhooks_addWebhook", + "defaultdialogs_confirmSure", + "defaultdialogs_editWebhook" + ]).then(function (values) { + vm.labels.webhooks = values[0]; + vm.labels.addWebhook = values[1]; + vm.labels.areYouSure = values[2]; + vm.labels.editWebhook = values[3]; + + if ($routeParams.create) { + vm.isNew = true; + vm.showIdentifier = false; + vm.webhook.name = vm.labels.addWebhook; + vm.webhook.enabled = true; + } + })); + + // Load events + promises.push(loadEvents()); + + if (!$routeParams.create) { + + promises.push(webhooksResource.getByKey($routeParams.id).then(webhook => { + + vm.webhook = webhook; + vm.webhook.name = vm.labels.editWebhook; + + const eventType = vm.webhook ? vm.webhook.events[0].eventType.toLowerCase() : null; + const contentTypes = webhook.contentTypeKeys.map(x => ({ key: x })); + + getEntities(contentTypes, eventType); + + makeBreadcrumbs(); + })); + } + + $q.all(promises).then(() => { + if ($routeParams.create) { + $scope.$emit("$changeTitle", vm.labels.addWebhook); + } else { + $scope.$emit("$changeTitle", vm.labels.editWebhook + ": " + vm.webhook.key); + } + + vm.loading = false; + }); + + // Activate tree node + $timeout(function () { + navigationService.syncTree({ tree: $routeParams.tree, path: [-1], activate: true }); + }); + } + + function openEventPicker() { + + const dialog = { + selectedEvents: vm.webhook.events, + submit(model) { + vm.webhook.events = model.selection; + editorService.close(); + }, + close() { + editorService.close(); + } + }; + + localizationService.localize("defaultdialogs_selectEvent").then(value => { + dialog.title = value; + editorService.eventPicker(dialog); + }); + } + + function openContentTypePicker() { + const eventType = vm.webhook ? vm.webhook.events[0].eventType.toLowerCase() : null; + + const editor = { + multiPicker: true, + filterCssClass: "not-allowed not-published", + filter: function (item) { + // filter out folders (containers), element types (for content) and already selected items + return item.nodeType === "container"; // || item.metaData.isElement || !!_.findWhere(vm.itemTypes, { udi: item.udi }); + }, + submit(model) { + getEntities(model.selection, eventType); + vm.webhook.contentTypeKeys = model.selection.map(item => item.key); + editorService.close(); + }, + close() { + editorService.close(); + } + }; + + switch (eventType.toLowerCase()) { + case "content": + editorService.contentTypePicker(editor); + break; + case "media": + editorService.mediaTypePicker(editor); + break; + case "member": + editorService.memberTypePicker(editor); + break; + } + } + + function getEntities(selection, eventType) { + let resource; + switch (eventType.toCamelCase()) { + case "content": + resource = contentTypeResource; + break; + case "media": + resource = mediaTypeResource; + break; + case "member": + resource = memberTypeResource; + break; + default: + return; + } + + selection.forEach(entity => { + resource.getById(entity.key) + .then(data => { + if (!vm.contentTypes.some(x => x.key === data.key)) { + vm.contentTypes.push(data); + } + }); + }); + } + + function loadEvents() { + return webhooksResource.getAllEvents() + .then(data => { + vm.events = data; + }); + } + + function clearContentType(contentTypeKey) { + if (Utilities.isArray(vm.webhook.contentTypeKeys)) { + vm.webhook.contentTypeKeys = vm.webhook.contentTypeKeys.filter(x => x !== contentTypeKey); + } + if (Utilities.isArray(vm.contentTypes)) { + vm.contentTypes = vm.contentTypes.filter(x => x.key !== contentTypeKey); + } + } + + function clearEvent(event) { + if (Utilities.isArray(vm.webhook.events)) { + vm.webhook.events = vm.webhook.events.filter(x => x !== event); + } + + if (Utilities.isArray(vm.contentTypes)) { + vm.events = vm.events.filter(x => x.key !== event); + } + } + + function openCreateHeader() { + + const dialog = { + view: "views/webhooks/overlays/header.html", + size: 'small', + position: 'right', + submit(model) { + if (!vm.webhook.headers) { + vm.webhook.headers = {}; + } + vm.webhook.headers[model.key] = model.value; + editorService.close(); + }, + close() { + editorService.close(); + } + }; + + localizationService.localize("webhooks_createHeader").then(value => { + dialog.title = value; + editorService.open(dialog); + }); + } + + function removeHeader(key) { + delete vm.webhook.headers[key]; + } + + function save() { + + if (!formHelper.submitForm({ scope: $scope })) { + return; + } + + saveWebhook(); + } + + function saveWebhook() { + + if (vm.isNew) { + webhooksResource.create(vm.webhook) + .then(webhook => { + + formHelper.resetForm({ scope: $scope }); + + vm.webhook = webhook; + vm.webhook.name = vm.labels.editWebhook; + + vm.saveButtonState = "success"; + + $scope.$emit("$changeTitle", vm.labels.editWebhook + ": " + vm.webhook.key); + + localizationService.localize("speechBubbles_webhookSaved").then(value => { + notificationsService.success(value); + }); + + // Emit event when language is created or updated/saved + eventsService.emit("editors.webhooks.webhookSaved", { + webhook: webhook, + isNew: vm.isNew + }); + + vm.isNew = false; + vm.showIdentifier = true; + + }, x => { + let errorMessage = undefined; + if (x.data.ModelState) { + errorMessage = `Message: ${Object.values(x.data.ModelState).flat().join(' ')}`; + } + handleSubmissionError(x, `Error saving webhook. ${errorMessage ?? ''}`); + }); + } + else { + webhooksResource.update(vm.webhook) + .then(webhook => { + + formHelper.resetForm({ scope: $scope }); + + vm.webhook = webhook; + vm.webhook.name = vm.labels.editWebhook; + + vm.saveButtonState = "success"; + + $scope.$emit("$changeTitle", vm.labels.editWebhook + ": " + vm.webhook.key); + + localizationService.localize("speechBubbles_webhookSaved").then(value => { + notificationsService.success(value); + }); + + // Emit event when language is created or updated/saved + eventsService.emit("editors.webhooks.webhookSaved", { + webhook: webhook, + isNew: vm.isNew + }); + + vm.isNew = false; + vm.showIdentifier = true; + + }, x => { + let errorMessage = undefined; + if (x.data.ModelState) { + errorMessage = `Message: ${Object.values(x.data.ModelState).flat().join(' ')}`; + } + handleSubmissionError(x, `Error saving webhook. ${errorMessage ?? ''}`); + }); + } + } + + function handleSubmissionError(err, errorMessage) { + notificationsService.error(errorMessage); + vm.saveButtonState = 'error'; + formHelper.resetForm({ scope: $scope, hasErrors: true }); + formHelper.handleError(err); + } + + function back() { + $location.path("settings/webhooks/overview"); + } + + function goToPage(ancestor) { + $location.path(ancestor.path); + } + + function makeBreadcrumbs() { + vm.breadcrumbs = [ + { + "name": vm.labels.webhooks, + "path": "/settings/webhooks/overview" + }, + { + "name": vm.webhook.name + } + ]; + } + + init(); + } + + angular.module("umbraco").controller("Umbraco.Editors.Webhooks.EditController", WebhooksEditController); +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html new file mode 100644 index 0000000000..66f93c244e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html @@ -0,0 +1,206 @@ +
+ + + +
+ + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
NameValue
{{key}}{{value}} + + +
+ No webhook headers have been added. +
+ + +
+ +
+ +
+
+ +
+ +
+ + + + + +
{{vm.webhook.id}}
+ {{vm.webhook.key}} +
+ +
+
+
+ +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/edit.controller.js deleted file mode 100644 index 6f8a17ceb8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/edit.controller.js +++ /dev/null @@ -1,146 +0,0 @@ -(function () { - "use strict"; - - function EditController($scope, editorService, contentTypeResource, mediaTypeResource, memberTypeResource) { - - const vm = this; - - vm.clearContentType = clearContentType; - vm.clearEvent = clearEvent; - vm.removeHeader = removeHeader; - vm.openCreateHeader = openCreateHeader; - vm.openEventPicker = openEventPicker; - vm.openContentTypePicker = openContentTypePicker; - vm.close = close; - vm.submit = submit; - - function openEventPicker() { - editorService.eventPicker({ - title: "Select event", - selectedEvents: $scope.model.webhook.events, - submit(model) { - $scope.model.webhook.events = model.selection; - editorService.close(); - }, - close() { - editorService.close(); - } - }); - } - - function openContentTypePicker() { - const eventType = $scope.model.webhook ? $scope.model.webhook.events[0].eventType.toLowerCase() : null; - - const editor = { - multiPicker: true, - filterCssClass: "not-allowed not-published", - filter: function (item) { - // filter out folders (containers), element types (for content) and already selected items - return item.nodeType === "container"; // || item.metaData.isElement || !!_.findWhere(vm.itemTypes, { udi: item.udi }); - }, - submit(model) { - getEntities(model.selection, eventType); - $scope.model.webhook.contentTypeKeys = model.selection.map(item => item.key); - editorService.close(); - }, - close() { - editorService.close(); - } - }; - - switch (eventType.toLowerCase()) { - case "content": - editorService.contentTypePicker(editor); - break; - case "media": - editorService.mediaTypePicker(editor); - break; - case "member": - editorService.memberTypePicker(editor); - break; - } - } - - function openCreateHeader() { - editorService.open({ - title: "Create header", - view: "views/webhooks/overlays/header.html", - size: 'small', - position: 'right', - submit(model) { - if (!$scope.model.webhook.headers) { - $scope.model.webhook.headers = {}; - } - $scope.model.webhook.headers[model.key] = model.value; - editorService.close(); - }, - close() { - editorService.close(); - } - }); - } - - function getEntities(selection, eventType) { - let resource; - switch (eventType.toCamelCase()) { - case "content": - resource = contentTypeResource; - break; - case "media": - resource = mediaTypeResource; - break; - case "member": - resource = memberTypeResource; - break; - default: - return; - } - - $scope.model.contentTypes = []; - - selection.forEach(entity => { - resource.getById(entity.key) - .then(data => { - $scope.model.contentTypes.push(data); - }); - }); - } - - function clearContentType(contentTypeKey) { - if (Utilities.isArray($scope.model.webhook.contentTypeKeys)) { - $scope.model.webhook.contentTypeKeys = $scope.model.webhook.contentTypeKeys.filter(x => x !== contentTypeKey); - } - if (Utilities.isArray($scope.model.contentTypes)) { - $scope.model.contentTypes = $scope.model.contentTypes.filter(x => x.key !== contentTypeKey); - } - } - - function clearEvent(event) { - if (Utilities.isArray($scope.model.webhook.events)) { - $scope.model.webhook.events = $scope.model.webhook.events.filter(x => x !== event); - } - - if (Utilities.isArray($scope.model.contentTypes)) { - $scope.model.events = $scope.model.events.filter(x => x.key !== event); - } - } - - function removeHeader(key) { - delete $scope.model.webhook.headers[key]; - } - - function close() { - if ($scope.model.close) { - $scope.model.close(); - } - } - - function submit() { - if ($scope.model.submit) { - $scope.model.submit($scope.model); - } - } - } - - angular.module("umbraco").controller("Umbraco.Editors.Webhooks.EditController", EditController); -})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/edit.html b/src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/edit.html deleted file mode 100644 index 4bc61fec98..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/webhooks/overlays/edit.html +++ /dev/null @@ -1,159 +0,0 @@ -
- - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameValue
{{key}}{{value}} - - -
- - - -
-
-
-
-
- - - - - - - - -
-
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.controller.js b/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.controller.js index cf85f0df2c..10a0f51c08 100644 --- a/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.controller.js @@ -1,11 +1,12 @@ -(function () { +(function () { "use strict"; - function WebhookController($q, $timeout, $routeParams, webhooksResource, navigationService, notificationsService, editorService, overlayService, contentTypeResource, mediaTypeResource, memberTypeResource) { + function WebhookController($q, $timeout, $location, $routeParams, webhooksResource, navigationService, notificationsService, editorService, overlayService, contentTypeResource, mediaTypeResource, memberTypeResource) { const vm = this; - vm.openWebhookOverlay = openWebhookOverlay; + vm.addWebhook = addWebhook; + vm.editWebhook = editWebhook; vm.deleteWebhook = deleteWebhook; vm.handleSubmissionError = handleSubmissionError; vm.resolveTypeNames = resolveTypeNames; @@ -71,20 +72,6 @@ return resource; } - function getEntities(webhook) { - let resource = determineResource(webhook.events[0].eventType.toLowerCase()); - let entities = []; - - webhook.contentTypeKeys.forEach(key => { - resource.getById(key) - .then(data => { - entities.push(data); - }); - }); - - return entities; - } - function resolveTypeNames(webhook) { let resource = determineResource(webhook.events[0].eventType.toLowerCase()); @@ -104,70 +91,20 @@ }); } - function handleSubmissionError (model, errorMessage) { + function handleSubmissionError(model, errorMessage) { notificationsService.error(errorMessage); model.disableSubmitButton = false; model.submitButtonState = 'error'; } - function openWebhookOverlay (webhook) { - let isCreating = !webhook; - editorService.open({ - title: webhook ? 'Edit webhook' : 'Add webhook', - position: 'right', - size: 'small', - submitButtonLabel: webhook ? 'Save' : 'Create', - view: "views/webhooks/overlays/edit.html", - events: vm.events, - contentTypes : webhook ? getEntities(webhook) : null, - webhook: webhook ? webhook : {enabled: true}, - submit: (model) => { - model.disableSubmitButton = true; - model.submitButtonState = 'busy'; - if (!model.webhook.url) { - //Due to validation url will only be populated if it's valid, hence we can make do with checking url is there - handleSubmissionError(model, 'Please provide a valid URL. Did you include https:// ?'); - return; - } - if (!model.webhook.events || model.webhook.events.length === 0) { - handleSubmissionError(model, 'Please provide the event for which the webhook should trigger'); - return; - } + function addWebhook() { + $location.search('create', null); + $location.path("/settings/webhooks/edit/-1").search("create", "true"); + } - if (isCreating) { - webhooksResource.create(model.webhook) - .then(() => { - loadWebhooks() - notificationsService.success('Webhook saved.'); - editorService.close(); - }, x => { - let errorMessage = undefined; - if (x.data.ModelState) { - errorMessage = `Message: ${Object.values(x.data.ModelState).flat().join(' ')}`; - } - handleSubmissionError(model, `Error saving webhook. ${errorMessage ?? ''}`); - }); - } - else { - webhooksResource.update(model.webhook) - .then(() => { - loadWebhooks() - notificationsService.success('Webhook saved.'); - editorService.close(); - }, x => { - let errorMessage = undefined; - if (x.data.ModelState) { - errorMessage = `Message: ${Object.values(x.data.ModelState).flat().join(' ')}`; - } - handleSubmissionError(model, `Error saving webhook. ${errorMessage ?? ''}`); - }); - } - - }, - close: () => { - editorService.close(); - } - }); + function editWebhook(webhook) { + $location.search('create', null); + $location.path("/settings/webhooks/edit/" + webhook.key); } function loadWebhooks(){ @@ -185,7 +122,7 @@ }); } - function deleteWebhook (webhook, event) { + function deleteWebhook(webhook, event) { overlayService.open({ title: 'Confirm delete webhook', content: 'Are you sure you want to delete the webhook?', diff --git a/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.html b/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.html index 9b2c1f7461..70d2a0be05 100644 --- a/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.html +++ b/src/Umbraco.Web.UI.Client/src/views/webhooks/webhooks.html @@ -6,7 +6,7 @@ @@ -24,7 +24,7 @@ - +