From 7eb2d48413b49122124bf1d28ba1ea636e96092a Mon Sep 17 00:00:00 2001 From: Victor Ilyushchenko Date: Wed, 25 Jun 2025 21:27:47 +0300 Subject: [PATCH] EQMS-1406: added html doc link presenter for qms docs (#9382) Signed-off-by: Victor Ilyushchenko --- common/config/rush/pnpm-lock.yaml | 9 ++-- .../server-controlled-documents/src/index.ts | 4 ++ .../package.json | 4 +- .../src/index.ts | 42 +++++++++++++++++-- .../controlled-documents/src/index.ts | 1 + 5 files changed, 51 insertions(+), 9 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 26905a91e0..654735b716 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2231,7 +2231,7 @@ importers: specifier: ^9.0.12 version: 9.0.12(yjs@13.6.23) y-prosemirror: - specifier: ^1.3.5 + specifier: ^1.3.6 version: 1.3.6(prosemirror-model@1.24.1)(prosemirror-state@1.4.3)(prosemirror-view@1.37.2)(y-protocols@1.0.6(yjs@13.6.23))(yjs@13.6.23) y-protocols: specifier: ^1.0.6 @@ -5160,7 +5160,7 @@ packages: version: 0.0.0 '@rush-temp/server-controlled-documents-resources@file:projects/server-controlled-documents-resources.tgz': - resolution: {integrity: sha512-QV06gugaPdI5zCgIBD1SimgmgM/x7f39dSmLi4Y/By2vqW+2bEYES5JtoBLVlyzfAfUU8sc5GD7YSSRqv6PM3A==, tarball: file:projects/server-controlled-documents-resources.tgz} + resolution: {integrity: sha512-R5eyJx5d6zSEu1WDSvgGm1tdBtZ1+QJgs9IK7Gr8rmblRP6kqxlXZCh5cd0VafXQlzCsppJHwmS8ncnChx039Q==, tarball: file:projects/server-controlled-documents-resources.tgz} version: 0.0.0 '@rush-temp/server-controlled-documents@file:projects/server-controlled-documents.tgz': @@ -5496,7 +5496,7 @@ packages: version: 0.0.0 '@rush-temp/text-editor-resources@file:projects/text-editor-resources.tgz': - resolution: {integrity: sha512-gB42s0kWFGmQfU0zX+KHV3YvZkyh53UwVPJFt4a3FDJZkBWK4BBYLVQm9JoWtQ471lsyrzIdEcz+KEvEo92G8Q==, tarball: file:projects/text-editor-resources.tgz} + resolution: {integrity: sha512-I36q2YtMBV6V9y6S69o3cUWU82/s9Ekb1yunAWdMdqitMITc5GsCc7LfSSk+HUbTvycphD/X272w86g5Xh4++Q==, tarball: file:projects/text-editor-resources.tgz} version: 0.0.0 '@rush-temp/text-editor@file:projects/text-editor.tgz': @@ -5512,7 +5512,7 @@ packages: version: 0.0.0 '@rush-temp/text-ydoc@file:projects/text-ydoc.tgz': - resolution: {integrity: sha512-2ae84wO/EPhpT3jVgXViytwB8YOgYFje2vaihl2rOZzuk7yDGnAhb4KYUWL1oPdjldI8gZsadXXn8fb8AJmCnQ==, tarball: file:projects/text-ydoc.tgz} + resolution: {integrity: sha512-vKLzX1+/6aZmMzsR213dQDXADDE4cDw3M2Ofkn3r7QKV6GidHGHipTlBO4jjsCbYK4G0L1QIf8ZHi7QhpE8icQ==, tarball: file:projects/text-ydoc.tgz} version: 0.0.0 '@rush-temp/text@file:projects/text.tgz': @@ -24916,6 +24916,7 @@ snapshots: eslint-plugin-promise: 6.1.1(eslint@8.56.0) jest: 29.7.0(@types/node@22.15.29)(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3)) prettier: 3.2.5 + slugify: 1.6.6 ts-jest: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(esbuild@0.24.2)(jest@29.7.0(@types/node@22.15.29)(ts-node@10.9.2(@types/node@22.15.29)(typescript@5.8.3)))(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: diff --git a/models/server-controlled-documents/src/index.ts b/models/server-controlled-documents/src/index.ts index db8db3d57e..1cd559ce0a 100644 --- a/models/server-controlled-documents/src/index.ts +++ b/models/server-controlled-documents/src/index.ts @@ -60,6 +60,10 @@ export function createModel (builder: Builder): void { presenter: serverDocuments.function.ControlledDocumentTextPresenter }) + builder.mixin(documents.class.ControlledDocument, core.class.Class, serverNotification.mixin.HTMLPresenter, { + presenter: serverDocuments.function.ControlledDocumentHTMLPresenter + }) + builder.mixin( documents.notification.CoAuthorsNotification, notification.class.NotificationType, diff --git a/server-plugins/controlled-documents-resources/package.json b/server-plugins/controlled-documents-resources/package.json index 9dc93215c0..50927a643c 100644 --- a/server-plugins/controlled-documents-resources/package.json +++ b/server-plugins/controlled-documents-resources/package.json @@ -49,6 +49,8 @@ "@hcengineering/server-chunter-resources": "^0.6.0", "@hcengineering/server-core": "^0.6.1", "@hcengineering/server-token": "^0.6.11", - "@hcengineering/training": "^0.1.0" + "@hcengineering/training": "^0.1.0", + "@hcengineering/workbench": "^0.6.16", + "slugify": "^1.6.6" } } diff --git a/server-plugins/controlled-documents-resources/src/index.ts b/server-plugins/controlled-documents-resources/src/index.ts index 0677cacaf0..346c9c3140 100644 --- a/server-plugins/controlled-documents-resources/src/index.ts +++ b/server-plugins/controlled-documents-resources/src/index.ts @@ -16,11 +16,12 @@ import core, { type Doc, type RolesAssignment, type Timestamp, - type TxCUD + type TxCUD, + concatLink } from '@hcengineering/core' import { NotificationType } from '@hcengineering/notification' import { getEmployees, getSocialIds } from '@hcengineering/server-contact' -import { TriggerControl } from '@hcengineering/server-core' +import serverCore, { TriggerControl } from '@hcengineering/server-core' import documents, { ControlledDocument, @@ -35,6 +36,9 @@ import documents, { } from '@hcengineering/controlled-documents' import { RequestStatus } from '@hcengineering/request' import training, { TrainingState, type TrainingRequest } from '@hcengineering/training' +import { getMetadata } from '@hcengineering/platform' +import { workbenchId } from '@hcengineering/workbench' +import slugify from 'slugify' async function getDocs ( control: TriggerControl, @@ -363,10 +367,39 @@ export async function OnDocApprovalRequestApproved ( return result } -export async function documentTextPresenter (doc: ControlledDocument): Promise { +export async function ControlledDocumentTextPresenter (doc: ControlledDocument): Promise { return doc.title } +export async function ControlledDocumentHTMLPresenter ( + doc: ControlledDocument, + control: TriggerControl +): Promise { + const title = await ControlledDocumentTextPresenter(doc) + + const front = control.branding?.front ?? getMetadata(serverCore.metadata.FrontUrl) ?? '' + + const prjdoc = (await control.findAll(control.ctx, documents.class.ProjectDocument, { document: doc._id }))[0] + if (prjdoc === undefined) { + return title + } + + const project = prjdoc.project ?? documents.ids.NoProject + + function getDocumentLinkId (doc: Document): string { + const slug = slugify(doc.title, { lower: true }) + return `${slug}---${doc._id}` + } + + let path = `${workbenchId}/${control.workspace.url}/documents/${getDocumentLinkId(doc)}` + if (project !== documents.ids.NoProject) { + path += `/${project}` + } + + const link = concatLink(front, path) + return `${title}` +} + async function CoAuthorsTypeMatch ( originTx: TxCUD, _doc: Doc, @@ -402,7 +435,8 @@ export default async () => ({ OnDocHasBecomeEffective }, function: { - ControlledDocumentTextPresenter: documentTextPresenter, + ControlledDocumentTextPresenter, + ControlledDocumentHTMLPresenter, CoAuthorsTypeMatch } }) diff --git a/server-plugins/controlled-documents/src/index.ts b/server-plugins/controlled-documents/src/index.ts index cec44de755..eefdedff4c 100644 --- a/server-plugins/controlled-documents/src/index.ts +++ b/server-plugins/controlled-documents/src/index.ts @@ -25,6 +25,7 @@ export default plugin(serverDocumentsId, { }, function: { ControlledDocumentTextPresenter: '' as Resource, + ControlledDocumentHTMLPresenter: '' as Resource, CoAuthorsTypeMatch: '' as TypeMatchFunc } })