From 3eb7d6e9651ad5d53f09a1636b0ead7c96bbde9a Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Thu, 5 Sep 2024 14:32:46 +0400 Subject: [PATCH] ezqms-1185: fix delete document availability (#6485) Signed-off-by: Alexey Zinoviev --- models/controlled-documents/src/index.ts | 2 +- .../src/index.ts | 22 +++++++++++++++++-- .../src/plugin.ts | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index ab3cfe6b0c..670f864b5e 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -684,7 +684,7 @@ export function createModel (builder: Builder): void { input: 'any', category: view.category.General, target: documents.class.Document, - visibilityTester: documents.function.IsLatestDraftDoc, + visibilityTester: documents.function.CanDeleteDocument, query: { state: DocumentState.Draft }, diff --git a/plugins/controlled-documents-resources/src/index.ts b/plugins/controlled-documents-resources/src/index.ts index 98006f5de1..47b2b1a49e 100644 --- a/plugins/controlled-documents-resources/src/index.ts +++ b/plugins/controlled-documents-resources/src/index.ts @@ -20,7 +20,8 @@ import { type RelatedDocument, SortingOrder, type WithLookup, - type Doc + type Doc, + getCurrentAccount } from '@hcengineering/core' import { type Document, @@ -31,6 +32,7 @@ import { import { type Resources } from '@hcengineering/platform' import { type ObjectSearchResult, getClient, MessageBox } from '@hcengineering/presentation' import { showPopup } from '@hcengineering/ui' +import { type PersonAccount } from '@hcengineering/contact' import CreateDocument from './components/CreateDocument.svelte' import QmsDocumentWizard from './components/create-doc/QmsDocumentWizard.svelte' @@ -148,6 +150,22 @@ async function deleteDocuments (obj: Document | Document[]): Promise { }) } +async function canDeleteDocument (obj?: Doc | Doc[]): Promise { + if (obj == null) { + return false + } + + const objs = (Array.isArray(obj) ? obj : [obj]) as Document[] + const currentUser = getCurrentAccount() as PersonAccount + const isOwner = objs.every((doc) => doc.owner === currentUser.person) + + if (!isOwner) { + return false + } + + return await isLatestDraftDoc(obj) +} + async function isLatestDraftDoc (obj?: Doc | Doc[]): Promise { if (obj == null) { return false @@ -261,7 +279,7 @@ export default async (): Promise => ({ DocumentStateSort: sortDocumentStates, GetAllDocumentStates: getAllDocumentStates, GetDocumentMetaLinkFragment: getDocumentMetaLinkFragment, - IsLatestDraftDoc: isLatestDraftDoc, + CanDeleteDocument: canDeleteDocument, DocumentIdentifierProvider: documentIdentifierProvider, ControlledDocumentTitleProvider: getControlledDocumentTitle, Comment: comment, diff --git a/plugins/controlled-documents-resources/src/plugin.ts b/plugins/controlled-documents-resources/src/plugin.ts index c51425f957..ca2434a008 100644 --- a/plugins/controlled-documents-resources/src/plugin.ts +++ b/plugins/controlled-documents-resources/src/plugin.ts @@ -231,7 +231,7 @@ export default mergeIds(documentsId, documents, { GetAllDocumentStates: '' as Resource<() => Promise>, GetVisibleFilters: '' as Resource<(filters: KeyFilter[], space?: Ref) => Promise>, GetDocumentMetaLinkFragment: '' as Resource<(doc: Doc, props: Record) => Promise>, - IsLatestDraftDoc: '' as Resource<(doc?: Doc | Doc[]) => Promise>, + CanDeleteDocument: '' as Resource<(doc?: Doc | Doc[]) => Promise>, ControlledDocumentTitleProvider: '' as Resource<(client: Client, ref: Ref, doc?: Doc) => Promise> } })