diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-events.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-events.element.ts new file mode 100644 index 0000000000..ee38ab4390 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-events.element.ts @@ -0,0 +1,60 @@ +import { UMB_WEBHOOK_EVENTS_MODAL } from './webhook-events-modal/webhook-events-modal.token.js'; +import { css, html, customElement, state, property, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import '@umbraco-cms/backoffice/culture'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +@customElement('umb-input-webhook-events') +export class UmbInputWebhookEventsElement extends UmbLitElement { + @property({ attribute: false }) + public events: Array = []; + + private _modalContext?: UmbModalManagerContext; + + constructor() { + super(); + + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (_instance) => { + this._modalContext = _instance; + }); + } + + async #openModal() { + const modal = this._modalContext?.open(this, UMB_WEBHOOK_EVENTS_MODAL, { modal: { type: 'sidebar' } }); + if (!modal) return; + + await modal.onSubmit(); + + console.log('Search modal closed', modal.getValue()); + modal.destroy(); + } + + render() { + return html``; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: grid; + grid-template-columns: 1fr 1fr auto; + gap: var(--uui-size-space-2) var(--uui-size-space-2); + } + + #add { + grid-column: -1 / 1; + } + `, + ]; +} + +export default UmbInputWebhookEventsElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-input-webhook-events': UmbInputWebhookEventsElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-headers-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-headers.element.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-headers-view.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-headers.element.ts index 6062f82aac..4234ade231 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-headers-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/input-webhook-headers.element.ts @@ -1,13 +1,12 @@ import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { css, html, customElement, state, property, repeat, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '@umbraco-cms/backoffice/culture'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-input-webhook-headers') -export class UmbInputWebhookHeadersElement extends UmbLitElement implements UmbWorkspaceViewElement { +export class UmbInputWebhookHeadersElement extends UmbLitElement { @property() public headers: { [key: string]: string } = {}; @@ -17,6 +16,8 @@ export class UmbInputWebhookHeadersElement extends UmbLitElement implements UmbW protected firstUpdated(_changedProperties: PropertyValueMap | Map): void { super.firstUpdated(_changedProperties); + if (!this.headers) return; + this._headers = Object.entries(this.headers).map(([name, value]) => ({ name, value })); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/input-webhook-events.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/input-webhook-events.element.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.element.ts new file mode 100644 index 0000000000..b9e311a8c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.element.ts @@ -0,0 +1,40 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +import type { UmbModalContext } from '@umbraco-cms/backoffice/modal'; +import { UmbWebhookDetailRepository } from '../../repository/index.js'; + +@customElement('umb-webhook-events-modal') +export class UmbWebhookEventsModalElement extends UmbLitElement { + @property({ attribute: false }) + modalContext?: UmbModalContext; + + #webhookRepository = new UmbWebhookDetailRepository(this); + + constructor() { + super(); + + const hello = this.#webhookRepository; + } + + #onInput(event: InputEvent) { + const input = event.target as HTMLInputElement; + this.modalContext?.setValue(input.value); + } + + render() { + return html` + `; + } + + static styles = [UmbTextStyles, css``]; +} + +export default UmbWebhookEventsModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-webhook-events-modal': UmbWebhookEventsModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.token.ts new file mode 100644 index 0000000000..5a7a5227a8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/components/webhook-events-modal/webhook-events-modal.token.ts @@ -0,0 +1,3 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export const UMB_WEBHOOK_EVENTS_MODAL = new UmbModalToken('Umb.Modal.Webhook.Events'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts index 1a567bf2b8..6098c4358d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/manifests.ts @@ -3,4 +3,14 @@ import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as collectionManifests } from './collection/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const manifests: Array = [...treeManifests, ...workspaceManifests, ...collectionManifests]; +export const manifests: Array = [ + ...treeManifests, + ...workspaceManifests, + ...collectionManifests, + { + type: 'modal', + alias: 'Umb.Modal.Webhook.Events', + name: 'Webhook Events Modal', + js: () => import('./components/webhook-events-modal/webhook-events-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts index 3d0be02b05..37fe37a804 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/workspace/webhook/views/webhook-details-workspace-view.element.ts @@ -1,4 +1,6 @@ +import type { UmbInputWebhookHeadersElement } from '../../../components/input-webhook-headers.element.js'; import { UMB_WEBHOOK_WORKSPACE_CONTEXT } from '../webhook-workspace.context-token.js'; +import type { UmbInputWebhookEventsElement } from '../../../components/input-webhook-events.element.js'; import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -6,9 +8,12 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '@umbraco-cms/backoffice/culture'; import type { UmbWebhookDetailModel } from '@umbraco-cms/backoffice/webhook'; -import '../../../components/input-webhook-headers-view.element.js'; -import { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; -import UmbInputWebhookHeadersElement from '../../../components/input-webhook-headers-view.element.js'; +import type { UmbChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbInputDocumentTypeElement } from '@umbraco-cms/backoffice/document-type'; +import type { UUIBooleanInputEvent, UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; + +import '../../../components/input-webhook-headers.element.js'; +import '../../../components/input-webhook-events.element.js'; @customElement('umb-webhook-details-workspace-view') export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement implements UmbWorkspaceViewElement { @@ -34,29 +39,54 @@ export class UmbWebhookDetailsWorkspaceViewElement extends UmbLitElement impleme }); } - #onHeadersChange(event: UmbChangeEvent) { - if (!this._webhook) return; + #onEventsChange(event: UmbChangeEvent) { + const events = (event.target as UmbInputWebhookEventsElement).events; + this.#webhookWorkspaceContext?.setEvents(events); + } + #onHeadersChange(event: UmbChangeEvent) { const headers = (event.target as UmbInputWebhookHeadersElement).headers; this.#webhookWorkspaceContext?.setHeaders(headers); } + #onTypesChange(event: UmbChangeEvent) { + const types = (event.target as UmbInputDocumentTypeElement).selection; + this.#webhookWorkspaceContext?.setTypes(types); + } + + #onUrlChange(event: UUIInputEvent) { + const value = event.target.value; + if (typeof value !== 'string') return; + + this.#webhookWorkspaceContext?.setUrl(value); + } + + #onEnabledChange(event: UUIBooleanInputEvent) { + this.#webhookWorkspaceContext?.setEnabled(event.target.checked); + } + render() { if (!this._webhook) return nothing; return html` - + -
IMPLEMENT
+
- + - +