Skip to content

Commit 9375dcf

Browse files
committed
document notifications
1 parent a2e63b9 commit 9375dcf

File tree

11 files changed

+238
-0
lines changed

11 files changed

+238
-0
lines changed

src/packages/documents/documents/entity-actions/manifests.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { manifests as duplicateManifests } from './duplicate/manifests.js';
1212
import { manifests as moveManifests } from './move-to/manifests.js';
1313
import { manifests as publicAccessManifests } from './public-access/manifests.js';
1414
import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js';
15+
import { manifests as notificationManifests } from './notifications/manifests.js';
1516

1617
import type { ManifestEntityAction, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
1718
import {
@@ -143,4 +144,5 @@ export const manifests: Array<ManifestTypes> = [
143144
...publicAccessManifests,
144145
...sortChildrenOfManifests,
145146
...entityActions,
147+
...notificationManifests,
146148
];
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import type {
2+
UmbDocumentNotificationsModalData,
3+
UmbDocumentNotificationsModalValue,
4+
} from './document-notifications-modal.token.js';
5+
import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity';
6+
import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit';
7+
import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal';
8+
import { UmbTextStyles } from '@umbraco-cms/backoffice/style';
9+
10+
@customElement('umb-document-notifications-modal')
11+
export class UmbDocumentNotificationsModalElement extends UmbModalBaseElement<
12+
UmbDocumentNotificationsModalData,
13+
UmbDocumentNotificationsModalValue
14+
> {
15+
#unique?: UmbEntityUnique;
16+
17+
constructor() {
18+
super();
19+
this.#unique = this.data?.unique;
20+
}
21+
22+
override render() {
23+
return html`
24+
<umb-body-layout headline=${this.localize.term('notifications_notifications')}>
25+
<uui-box>
26+
${this.#unique}
27+
<uui-toggle label="Copy"></uui-toggle>
28+
<uui-toggle label="Delete"></uui-toggle>
29+
<uui-toggle label="Move"></uui-toggle>
30+
<uui-toggle label="Create"></uui-toggle>
31+
<uui-toggle label="Restrict Public Access"></uui-toggle>
32+
<uui-toggle label="Publish"></uui-toggle>
33+
<uui-toggle label="Restore"></uui-toggle>
34+
<uui-toggle label="Permissions"></uui-toggle>
35+
<uui-toggle label="Rollback"></uui-toggle>
36+
<uui-toggle label="Sort"></uui-toggle>
37+
<uui-toggle label="Send To Publish"></uui-toggle>
38+
<uui-toggle label="Update"></uui-toggle>
39+
</uui-box>
40+
<umb-footer-layout slot="footer">
41+
<uui-button slot="actions" look="secondary" label=${this.localize.term('general_cancel')}></uui-button>
42+
<uui-button slot="actions" look="primary" label=${this.localize.term('actions_rollback')}></uui-button>
43+
</umb-footer-layout>
44+
</umb-body-layout>
45+
`;
46+
}
47+
48+
static override styles = [
49+
UmbTextStyles,
50+
css`
51+
uui-toggle {
52+
display: block;
53+
}
54+
`,
55+
];
56+
}
57+
58+
export default UmbDocumentNotificationsModalElement;
59+
60+
declare global {
61+
interface HTMLElementTagNameMap {
62+
'umb-document-notifications-modal': UmbDocumentNotificationsModalElement;
63+
}
64+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS } from './manifests.js';
2+
import type { UmbEntityUnique } from '@umbraco-cms/backoffice/entity';
3+
import { UmbModalToken } from '@umbraco-cms/backoffice/modal';
4+
5+
export interface UmbDocumentNotificationsModalData {
6+
unique: UmbEntityUnique;
7+
}
8+
export interface UmbDocumentNotificationsModalValue {}
9+
10+
export const UMB_DOCUMENT_NOTIFICATIONS_MODAL = new UmbModalToken<
11+
UmbDocumentNotificationsModalData,
12+
UmbDocumentNotificationsModalValue
13+
>(UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS, {
14+
modal: {
15+
type: 'sidebar',
16+
size: 'small',
17+
},
18+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { UMB_DOCUMENT_NOTIFICATIONS_MODAL } from './document-notifications-modal.token.js';
2+
import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action';
3+
import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action';
4+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
5+
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
6+
7+
export class UmbDocumentNotificationsEntityAction extends UmbEntityActionBase<never> {
8+
constructor(host: UmbControllerHost, args: UmbEntityActionArgs<never>) {
9+
super(host, args);
10+
}
11+
12+
override async execute() {
13+
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
14+
const modalContext = modalManager.open(this, UMB_DOCUMENT_NOTIFICATIONS_MODAL, {
15+
data: { unique: this.args.unique },
16+
});
17+
await modalContext.onSubmit();
18+
}
19+
}
20+
export default UmbDocumentNotificationsEntityAction;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './document-notifications-modal.token.js';
2+
export * from './repository/index.js';
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js';
2+
import { manifests as repositoryManifests } from './repository/manifests.js';
3+
import type { ManifestEntityAction, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
4+
5+
export const UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS = 'Umb.Modal.DocumentNotifications';
6+
7+
const actionManifest: ManifestEntityAction = {
8+
type: 'entityAction',
9+
kind: 'default',
10+
alias: 'Umb.EntityAction.Document.Notifications',
11+
name: 'Notifications',
12+
api: () => import('./document-notifications.action.js'),
13+
forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE],
14+
meta: {
15+
icon: 'icon-megaphone',
16+
label: '#notifications_notifications',
17+
},
18+
};
19+
20+
const modalManifest: ManifestTypes = {
21+
type: 'modal',
22+
alias: UMB_DOCUMENT_NOTIFICATIONS_MODAL_ALIAS,
23+
name: 'Document Notifications Modal',
24+
js: () => import('./document-notifications-modal.element.js'),
25+
};
26+
27+
export const manifests = [actionManifest, modalManifest, ...repositoryManifests];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { UmbDocumentNotificationsServerDataSource } from './document-notifications.server.data.js';
2+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
3+
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
4+
import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification';
5+
import type { UmbApi } from '@umbraco-cms/backoffice/extension-api';
6+
import type { UpdateDocumentNotificationsRequestModel } from '@umbraco-cms/backoffice/external/backend-api';
7+
8+
export class UmbDocumentNotificationsRepository extends UmbControllerBase implements UmbApi {
9+
#dataSource = new UmbDocumentNotificationsServerDataSource(this);
10+
11+
#notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE;
12+
13+
constructor(host: UmbControllerHost) {
14+
super(host);
15+
16+
this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => {
17+
this.#notificationContext = instance;
18+
});
19+
}
20+
21+
async readNotifications(unique: string) {
22+
if (!unique) throw new Error('Unique is missing');
23+
24+
const { data, error } = await this.#dataSource.read(unique);
25+
if (!error) {
26+
return { data };
27+
}
28+
return { error };
29+
}
30+
31+
async updateNotifications(unique: string, data: UpdateDocumentNotificationsRequestModel) {
32+
if (!unique) throw new Error('Unique is missing');
33+
if (!data) throw new Error('Data is missing');
34+
35+
const { error } = await this.#dataSource.update(unique, data);
36+
if (!error) {
37+
const notification = { data: { message: `Notification settings saved` } };
38+
this.#notificationContext?.peek('positive', notification);
39+
}
40+
return { error };
41+
}
42+
}
43+
44+
export { UmbDocumentNotificationsRepository as api };
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api';
2+
import type { UpdateDocumentNotificationsRequestModel } from '@umbraco-cms/backoffice/external/backend-api';
3+
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
4+
import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';
5+
6+
/**
7+
* A data source for the Document Culture and Hostnames that fetches data from the server
8+
* @class UmbDocumentNotificationsServerDataSource
9+
* @implements {RepositoryDetailDataSource}
10+
*/
11+
export class UmbDocumentNotificationsServerDataSource {
12+
#host: UmbControllerHost;
13+
14+
/**
15+
* Creates an instance of UmbDocumentNotificationsServerDataSource.
16+
* @param {UmbControllerHost} host - The controller host for this controller to be appended to
17+
* @memberof UmbDocumentNotificationsServerDataSource
18+
*/
19+
constructor(host: UmbControllerHost) {
20+
this.#host = host;
21+
}
22+
23+
/**
24+
* Fetches the Culture and Hostnames for the given Document unique
25+
* @param {string} unique
26+
* @memberof UmbDocumentNotificationsServerDataSource
27+
*/
28+
async read(unique: string) {
29+
if (!unique) throw new Error('Unique is missing');
30+
return tryExecuteAndNotify(this.#host, DocumentService.getDocumentByIdNotifications({ id: unique }));
31+
}
32+
33+
/**
34+
* Updates Culture and Hostnames for the given Document unique
35+
* @param {string} unique
36+
* @param {UpdateDocumentNotificationsRequestModel} data
37+
* @memberof UmbDocumentNotificationsServerDataSource
38+
*/
39+
async update(unique: string, data: UpdateDocumentNotificationsRequestModel) {
40+
if (!unique) throw new Error('Unique is missing');
41+
return tryExecuteAndNotify(
42+
this.#host,
43+
DocumentService.putDocumentByIdNotifications({ id: unique, requestBody: data }),
44+
);
45+
}
46+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { UmbDocumentNotificationsRepository } from './document-notifications.repository.js';
2+
export { UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS } from './manifests.js';
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
2+
3+
export const UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS = 'Umb.Repository.Document.Notifications';
4+
5+
const repository: ManifestRepository = {
6+
type: 'repository',
7+
alias: UMB_DOCUMENT_NOTIFICATIONS_REPOSITORY_ALIAS,
8+
name: 'Document Notifications Repository',
9+
api: () => import('./document-notifications.repository.js'),
10+
};
11+
12+
export const manifests: Array<ManifestTypes> = [repository];

0 commit comments

Comments
 (0)