From cc852446b0ccb8a354c519d86bc6497cfe5f83a1 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Fri, 5 Jan 2024 15:48:27 +0100 Subject: [PATCH] audit log and info workspace --- src/Umbraco.Web.UI.Client/package.json | 1 + .../src/apps/backoffice/backoffice.element.ts | 1 + .../src/packages/audit-log/index.ts | 1 + .../src/packages/audit-log/manifests.ts | 3 + .../repository/audit-log.repository.ts | 67 +++++++ .../repository/audit-log.server.data.ts | 80 +++++++++ .../packages/audit-log/repository/index.ts | 2 + .../audit-log/repository/manifests.ts | 13 ++ .../src/packages/audit-log/umbraco-package.ts | 9 + .../history/history-item.element.ts | 2 +- .../document-info-workspace-view.element.ts | 158 ++-------------- ...ent-info-general-workspace-view.element.ts | 0 ...ent-info-history-workspace-view.element.ts | 170 ++++++++++++++++++ .../views/info/history/history-utils.ts | 64 +++++++ ...ument-info-links-workspace-view.element.ts | 0 ...t-info-reference-workspace-view.element.ts | 0 src/Umbraco.Web.UI.Client/tsconfig.json | 1 + .../web-test-runner.config.mjs | 1 + 18 files changed, 432 insertions(+), 141 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/general/document-info-general-workspace-view.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/history/document-info-history-workspace-view.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/history/history-utils.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/links/document-info-links-workspace-view.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/reference/document-info-reference-workspace-view.element.ts diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index f3df7fa2e0..19af4fd69b 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -49,6 +49,7 @@ "./events": "./dist-cms/packages/core/umb-events/index.js", "./repository": "./dist-cms/packages/core/repository/index.js", "./temporary-file": "./dist-cms/packages/core/temporary-file/index.js", + "./audit-log": "./dist-cms/packages/audit-log/index.js", "./dictionary": "./dist-cms/packages/dictionary/dictionary/index.js", "./document": "./dist-cms/packages/documents/documents/index.js", "./document-blueprint": "./dist-cms/packages/documents/document-blueprints/index.js", diff --git a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts index 5044f6ccbd..954fa8d5e5 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/backoffice/backoffice.element.ts @@ -12,6 +12,7 @@ import './components/index.js'; // TODO: temp solution to load core packages const CORE_PACKAGES = [ + import('../../packages/audit-log/umbraco-package.js'), import('../../packages/core/umbraco-package.js'), import('../../packages/settings/umbraco-package.js'), import('../../packages/documents/umbraco-package.js'), diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts new file mode 100644 index 0000000000..3d76f338dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/index.ts @@ -0,0 +1 @@ +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts new file mode 100644 index 0000000000..4e1826b900 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as repositoryManifests } from './repository/manifests.js'; + +export const manifests = [...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts new file mode 100644 index 0000000000..79796d6350 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.repository.ts @@ -0,0 +1,67 @@ +import { UmbAuditLogServerDataSource } from './audit-log.server.data.js'; +import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; +import { AuditTypeModel, DirectionModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; + +export class UmbAuditLogRepository extends UmbBaseController { + #dataSource: UmbAuditLogServerDataSource; + #notificationService?: UmbNotificationContext; + #init; + + constructor(host: UmbControllerHostElement) { + super(host); + this.#dataSource = new UmbAuditLogServerDataSource(host); + + this.#init = new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.#notificationService = instance; + }).asPromise(); + } + + async getLog({ + orderDirection, + sinceDate, + skip = 0, + take = 100, + }: { + orderDirection?: DirectionModel; + sinceDate?: string; + skip?: number; + take?: number; + }) { + await this.#init; + + return this.#dataSource.getAuditLog({ orderDirection, sinceDate, skip, take }); + } + + async getAuditLogByUnique({ + id, + orderDirection, + skip = 0, + take = 100, + }: { + id: string; + orderDirection?: DirectionModel; + skip?: number; + take?: number; + }) { + await this.#init; + return this.#dataSource.getAuditLogById({ id, orderDirection, skip, take }); + } + + async getAuditLogTypeByLogType({ + logType, + sinceDate, + skip, + take, + }: { + logType: AuditTypeModel; + sinceDate?: string; + skip?: number; + take?: number; + }) { + await this.#init; + return this.#dataSource.getAuditLogTypeByLogType({ logType, sinceDate, skip, take }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts new file mode 100644 index 0000000000..7fbd256231 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/audit-log.server.data.ts @@ -0,0 +1,80 @@ +import { AuditLogResource, DirectionModel, AuditTypeModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for Data Type items that fetches data from the server + * @export + * @class UmbAuditLogServerDataSource + */ +export class UmbAuditLogServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbAuditLogServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbAuditLogServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches the items for the given ids from the server + * @param {Array} ids + * @return {*} + * @memberof UmbAuditLogServerDataSource + */ + async getAuditLog({ + orderDirection, + sinceDate, + skip, + take, + }: { + orderDirection?: DirectionModel; + sinceDate?: string; + skip?: number; + take?: number; + }) { + return await tryExecuteAndNotify( + this.#host, + AuditLogResource.getAuditLog({ orderDirection, sinceDate, skip, take }), + ); + } + + async getAuditLogById({ + id, + orderDirection, + sinceDate, + skip, + take, + }: { + id: string; + orderDirection?: DirectionModel; + sinceDate?: string; + skip?: number; + take?: number; + }) { + return await tryExecuteAndNotify( + this.#host, + AuditLogResource.getAuditLogById({ id, orderDirection, sinceDate, skip, take }), + ); + } + + async getAuditLogTypeByLogType({ + logType, + sinceDate, + skip, + take, + }: { + logType: AuditTypeModel; + sinceDate?: string; + skip?: number; + take?: number; + }) { + return await tryExecuteAndNotify( + this.#host, + AuditLogResource.getAuditLogTypeByLogType({ logType, sinceDate, skip, take }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts new file mode 100644 index 0000000000..0b87786128 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/index.ts @@ -0,0 +1,2 @@ +export { UMB_AUDIT_LOG_REPOSITORY_ALIAS as AUDIT_LOG_REPOSITORY_ALIAS } from './manifests.js'; +export { UmbAuditLogRepository } from './audit-log.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts new file mode 100644 index 0000000000..072eb15b79 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/repository/manifests.ts @@ -0,0 +1,13 @@ +import { UmbAuditLogRepository } from './audit-log.repository.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_AUDIT_LOG_REPOSITORY_ALIAS = 'Umb.Repository.AuditLog'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_AUDIT_LOG_REPOSITORY_ALIAS, + name: 'AuditLog Repository', + api: UmbAuditLogRepository, +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts new file mode 100644 index 0000000000..5f4f04e17c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/audit-log/umbraco-package.ts @@ -0,0 +1,9 @@ +export const name = 'Umbraco.Core.AuditLog'; +export const extensions = [ + { + name: 'Audit Log Bundle', + alias: 'Umb.Bundle.AuditLog', + type: 'bundle', + js: () => import('./manifests.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-item.element.ts index 851f6a5f50..bd8737e579 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/history/history-item.element.ts @@ -43,11 +43,11 @@ export class UmbHistoryItemElement extends UmbLitElement { gap: calc(2 * var(--uui-size-space-5)); align-items: center; } + .slots-wrapper { display: flex; justify-content: space-between; align-items: center; - flex: 1; } slot[name='actions'] { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-info-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-info-workspace-view.element.ts index c7cc7117e2..40c9267f90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-info-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-info-workspace-view.element.ts @@ -1,27 +1,15 @@ -import { css, html, nothing, repeat, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; import { UMB_WORKSPACE_MODAL, UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -interface HistoryNode { - userId?: number; - userAvatars?: []; - userName?: string; - timestamp?: string; - comment?: string; - entityType?: string; - logType?: HistoryLogType; - nodeId?: string; - parameters?: string; -} - -type HistoryLogType = 'Publish' | 'Save' | 'Unpublish' | 'ContentVersionEnableCleanup' | 'ContentVersionPreventCleanup'; +import './history/document-info-history-workspace-view.element.js'; @customElement('umb-document-info-workspace-view') export class UmbDocumentInfoWorkspaceViewElement extends UmbLitElement { - @state() - private _historyList: HistoryNode[] = [ + /** Dont delete, need for mock data */ + /*@state() + private _historyList: [] = [ { userId: -1, userAvatars: [], @@ -79,13 +67,7 @@ export class UmbDocumentInfoWorkspaceViewElement extends UmbLitElement { nodeId: '1058', parameters: undefined, }, - ]; - - @state() - private _total?: number; - - @state() - private _currentPage = 1; + ];*/ @state() private _nodeName = ''; @@ -94,7 +76,6 @@ export class UmbDocumentInfoWorkspaceViewElement extends UmbLitElement { private _documentTypeId = ''; private _workspaceContext?: typeof UMB_WORKSPACE_CONTEXT.TYPE; - private itemsPerPage = 10; @state() private _editDocumentTypePath = ''; @@ -130,27 +111,14 @@ export class UmbDocumentInfoWorkspaceViewElement extends UmbLitElement { */ } - #onPageChange(event: UUIPaginationEvent) { - if (this._currentPage === event.target.current) return; - this._currentPage = event.target.current; - //TODO: Run endpoint to get next history parts - } - render() { return html`
${this.#renderLinksSection()} - - - ${repeat( - this._historyList, - (item) => item.timestamp, - (item) => this.#renderHistory(item), - )} - - ${this.#renderHistoryPagination()} - + +
${this.#renderGeneralSection()} @@ -158,7 +126,6 @@ export class UmbDocumentInfoWorkspaceViewElement extends UmbLitElement { } #renderLinksSection() { - //repeat return html`