document notifications

This commit is contained in:
Lone Iversen
2024-09-10 23:27:59 +02:00
parent 2c497cd843
commit 5ceb9ed4e8
11 changed files with 238 additions and 0 deletions

View File

@@ -12,6 +12,7 @@ import { manifests as duplicateManifests } from './duplicate/manifests.js';
import { manifests as moveManifests } from './move-to/manifests.js';
import { manifests as publicAccessManifests } from './public-access/manifests.js';
import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js';
import { manifests as notificationManifests } from './notifications/manifests.js';
import type { ManifestEntityAction, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
import {
@@ -143,4 +144,5 @@ export const manifests: Array<ManifestTypes> = [
...publicAccessManifests,
...sortChildrenOfManifests,
...entityActions,
...notificationManifests,
];

View File

@@ -0,0 +1,64 @@
import type {
UmbDocumentNotificationsModalData,
UmbDocumentNotificationsModalValue,
} from './document-notifications-modal.token.js';
import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity';
import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit';
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
@customElement('umb-document-notifications-modal')
export class UmbDocumentNotificationsModalElement extends UmbModalBaseElement<
UmbDocumentNotificationsModalData,
UmbDocumentNotificationsModalValue
> {
#unique?: UmbEntityUnique;
constructor() {
super();
this.#unique = this.data?.unique;
}
override render() {
return html`
<umb-body-layout headline=${this.localize.term('notifications_notifications')}>
<uui-box>
${this.#unique}
<uui-toggle label="Copy"></uui-toggle>
<uui-toggle label="Delete"></uui-toggle>
<uui-toggle label="Move"></uui-toggle>
<uui-toggle label="Create"></uui-toggle>
<uui-toggle label="Restrict Public Access"></uui-toggle>
<uui-toggle label="Publish"></uui-toggle>
<uui-toggle label="Restore"></uui-toggle>
<uui-toggle label="Permissions"></uui-toggle>
<uui-toggle label="Rollback"></uui-toggle>
<uui-toggle label="Sort"></uui-toggle>
<uui-toggle label="Send To Publish"></uui-toggle>
<uui-toggle label="Update"></uui-toggle>
</uui-box>
<umb-footer-layout slot="footer">
<uui-button slot="actions" look="secondary" label=${this.localize.term('general_cancel')}></uui-button>
<uui-button slot="actions" look="primary" label=${this.localize.term('actions_rollback')}></uui-button>
</umb-footer-layout>
</umb-body-layout>
`;
}
static override styles = [
UmbTextStyles,
css`
uui-toggle {
display: block;
}
`,
];
}
export default UmbDocumentNotificationsModalElement;
declare global {
interface HTMLElementTagNameMap {
'umb-document-notifications-modal': UmbDocumentNotificationsModalElement;
}
}

View File

@@ -0,0 +1,18 @@
import { UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS } from './manifests.js';
import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity';
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
export interface UmbDocumentNotificationsModalData {
unique: UmbEntityUnique;
}
export interface UmbDocumentNotificationsModalValue {}
export const UMB_DOCUMENT_NOTIFICATIONS_MODAL = new UmbModalToken<
UmbDocumentNotificationsModalData,
UmbDocumentNotificationsModalValue
>(UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS, {
modal: {
type: 'sidebar',
size: 'small',
},
});

View File

@@ -0,0 +1,20 @@
import { UMB_DOCUMENT_NOTIFICATIONS_MODAL } from './document-notifications-modal.token.js';
import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action';
import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
export class UmbDocumentNotificationsEntityAction extends UmbEntityActionBase<never> {
constructor(host: UmbControllerHost, args: UmbEntityActionArgs<never>) {
super(host, args);
}
override async execute() {
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
const modalContext = modalManager.open(this, UMB_DOCUMENT_NOTIFICATIONS_MODAL, {
data: { unique: this.args.unique },
});
await modalContext.onSubmit();
}
}
export default UmbDocumentNotificationsEntityAction;

View File

@@ -0,0 +1,2 @@
export * from './document-notifications-modal.token.js';
export * from './repository/index.js';

View File

@@ -0,0 +1,27 @@
import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js';
import { manifests as repositoryManifests } from './repository/manifests.js';
import type { ManifestEntityAction, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS = 'Umb.Modal.DocumentNotifications';
const actionManifest: ManifestEntityAction = {
type: 'entityAction',
kind: 'default',
alias: 'Umb.EntityAction.Document.Notifications',
name: 'Notifications',
api: () => import('./document-notifications.action.js'),
forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
meta: {
icon: 'icon-megaphone',
label: '#notifications_notifications',
},
};
const modalManifest: ManifestTypes = {
type: 'modal',
alias: UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS,
name: 'Document Notifications Modal',
js: () => import('./document-notifications-modal.element.js'),
};
export const manifests = [actionManifest, modalManifest, ...repositoryManifests];

View File

@@ -0,0 +1,44 @@
import { UmbDocumentNotificationsServerDataSource } from './document-notifications.server.data.js';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
import type { UpdateDocumentNotificationsRequestModel } from '@umbraco-cms/backoffice/external/backend-api';
export class UmbDocumentNotificationsRepository extends UmbControllerBase implements UmbApi {
#dataSource = new UmbDocumentNotificationsServerDataSource(this);
#notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE;
constructor(host: UmbControllerHost) {
super(host);
this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => {
this.#notificationContext = instance;
});
}
async readNotifications(unique: string) {
if (!unique) throw new Error('Unique is missing');
const { data, error } = await this.#dataSource.read(unique);
if (!error) {
return { data };
}
return { error };
}
async updateNotifications(unique: string, data: UpdateDocumentNotificationsRequestModel) {
if (!unique) throw new Error('Unique is missing');
if (!data) throw new Error('Data is missing');
const { error } = await this.#dataSource.update(unique, data);
if (!error) {
const notification = { data: { message: `Notification settings saved` } };
this.#notificationContext?.peek('positive', notification);
}
return { error };
}
}
export { UmbDocumentNotificationsRepository as api };

View File

@@ -0,0 +1,46 @@
import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api';
import type { UpdateDocumentNotificationsRequestModel } from '@umbraco-cms/backoffice/external/backend-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';
/**
* A data source for the Document Culture and Hostnames that fetches data from the server
* @class UmbDocumentNotificationsServerDataSource
* @implements {RepositoryDetailDataSource}
*/
export class UmbDocumentNotificationsServerDataSource {
#host: UmbControllerHost;
/**
* Creates an instance of UmbDocumentNotificationsServerDataSource.
* @param {UmbControllerHost} host - The controller host for this controller to be appended to
* @memberof UmbDocumentNotificationsServerDataSource
*/
constructor(host: UmbControllerHost) {
this.#host = host;
}
/**
* Fetches the Culture and Hostnames for the given Document unique
* @param {string} unique
* @memberof UmbDocumentNotificationsServerDataSource
*/
async read(unique: string) {
if (!unique) throw new Error('Unique is missing');
return tryExecuteAndNotify(this.#host, DocumentService.getDocumentByIdNotifications({ id: unique }));
}
/**
* Updates Culture and Hostnames for the given Document unique
* @param {string} unique
* @param {UpdateDocumentNotificationsRequestModel} data
* @memberof UmbDocumentNotificationsServerDataSource
*/
async update(unique: string, data: UpdateDocumentNotificationsRequestModel) {
if (!unique) throw new Error('Unique is missing');
return tryExecuteAndNotify(
this.#host,
DocumentService.putDocumentByIdNotifications({ id: unique, requestBody: data }),
);
}
}

View File

@@ -0,0 +1,2 @@
export { UmbDocumentNotificationsRepository } from './document-notifications.repository.js';
export { UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS } from './manifests.js';

View File

@@ -0,0 +1,12 @@
import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS = 'Umb.Repository.Document.Notifications';
const repository: ManifestRepository = {
type: 'repository',
alias: UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS,
name: 'Document Notifications Repository',
api: () => import('./document-notifications.repository.js'),
};
export const manifests: Array<ManifestTypes> = [repository];

View File

@@ -6,6 +6,7 @@ export const UMB_DOCUMENT_PUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentPublish';
export const UMB_DOCUMENT_UNPUBLISH_MODAL_ALIAS = 'Umb.Modal.DocumentUnpublish';
export const UMB_DOCUMENT_SCHEDULE_MODAL_ALIAS = 'Umb.Modal.DocumentSchedule';
export const UMB_DOCUMENT_PUBLISH_WITH_DESCENDANTS_MODAL_ALIAS = 'Umb.Modal.DocumentPublishWithDescendants';
export const UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS = 'Umb.Modal.DocumentNotifications';
const modals: Array<ManifestModal> = [
{