diff --git a/dev/doc-import-tool/src/import.ts b/dev/doc-import-tool/src/import.ts index d3c207bae4f..2e2a1aa2b06 100644 --- a/dev/doc-import-tool/src/import.ts +++ b/dev/doc-import-tool/src/import.ts @@ -92,6 +92,7 @@ async function createDocument ( requests: 0, reviewers: [], approvers: [], + externalApprovers: [], coAuthors: [], changeControl: ccRecordId, author: owner, @@ -175,6 +176,7 @@ async function createTemplateIfNotExist ( requests: 0, reviewers: [], approvers: [], + externalApprovers: [], coAuthors: [], changeControl: ccRecordId, content: null, diff --git a/models/controlled-documents/src/index.ts b/models/controlled-documents/src/index.ts index 5eb65a77840..f3233c6532b 100644 --- a/models/controlled-documents/src/index.ts +++ b/models/controlled-documents/src/index.ts @@ -20,7 +20,10 @@ import documentsPlugin, { documentsId, DocumentState, type Document, - type DocumentSpace + type DocumentSpace, + type ProjectDocument, + type ChangeControl, + type DocumentRequest } from '@hcengineering/controlled-documents' import { type Builder } from '@hcengineering/model' import chunter from '@hcengineering/model-chunter' @@ -977,9 +980,38 @@ export function defineNotifications (builder: Builder): void { components: { input: { component: chunter.component.ChatMessageInput } } }) + builder.createDoc>(core.class.ClassCollaborators, core.space.Model, { + attachedTo: documents.class.Document, + fields: ['author', 'owner'], + provideSecurity: true + }) + + builder.createDoc>(core.class.ClassCollaborators, core.space.Model, { + attachedTo: documents.class.ProjectDocument, + fields: [], + provideSecurity: true + }) + + builder.createDoc>(core.class.ClassCollaborators, core.space.Model, { + attachedTo: documents.class.ChangeControl, + fields: [], + provideSecurity: true + }) + + builder.createDoc>(core.class.ClassCollaborators, core.space.Model, { + attachedTo: documents.class.DocumentRequest, + fields: ['requested', 'createdBy'], + provideSecurity: true + }) + + builder.mixin(documents.class.DocumentApprovalRequest, core.class.Class, core.mixin.TxAccessLevel, { + updateAccessLevel: AccountRole.Guest + }) + builder.createDoc>(core.class.ClassCollaborators, core.space.Model, { attachedTo: documents.class.ControlledDocument, - fields: ['author', 'owner', 'reviewers', 'approvers', 'coAuthors'] + fields: ['author', 'owner', 'reviewers', 'approvers', 'coAuthors', 'externalApprovers'], + provideSecurity: true }) builder.createDoc( diff --git a/models/controlled-documents/src/migration.ts b/models/controlled-documents/src/migration.ts index 871cbe5d9f9..d9be18a1579 100644 --- a/models/controlled-documents/src/migration.ts +++ b/models/controlled-documents/src/migration.ts @@ -145,6 +145,7 @@ async function createProductChangeControlTemplate (tx: TxOperations): Promise { + await client.update( + DOMAIN_DOCUMENTS, + { + _class: documents.class.ControlledDocument, + externalApprovers: { $exists: false } + }, + { + externalApprovers: [] + } + ) +} + export const documentsOperation: MigrateOperation = { async migrate (client: MigrationClient, mode): Promise { await tryMigrate(mode, client, documentsId, [ @@ -550,6 +564,10 @@ export const documentsOperation: MigrateOperation = { { state: 'migrateCancelDuplicateActiveRequests', func: migrateCancelDuplicateActiveRequests + }, + { + state: 'migrateExternalApprovers', + func: migrateExternalApprovers } ]) }, diff --git a/models/controlled-documents/src/types.ts b/models/controlled-documents/src/types.ts index 4294ef30b81..1974b9a6ee7 100644 --- a/models/controlled-documents/src/types.ts +++ b/models/controlled-documents/src/types.ts @@ -382,6 +382,9 @@ export class TControlledDocument extends THierarchyDocument implements Controlle @Prop(ArrOf(TypeRef(contact.mixin.Employee)), documents.string.Approvers) approvers!: Ref[] + @Prop(ArrOf(TypeRef(contact.mixin.Employee)), documents.string.ExternalApprovers) + externalApprovers!: Ref[] + @Prop(ArrOf(TypeRef(contact.mixin.Employee)), documents.string.CoAuthors) coAuthors!: Ref[] diff --git a/plugins/notification/src/utils.ts b/packages/core/src/collaborators.ts similarity index 97% rename from plugins/notification/src/utils.ts rename to packages/core/src/collaborators.ts index 81895f4b6ef..1574a2c1401 100644 --- a/plugins/notification/src/utils.ts +++ b/packages/core/src/collaborators.ts @@ -13,7 +13,7 @@ // limitations under the License. // -import core, { Class, ClassCollaborators, Doc, Hierarchy, ModelDb, Ref } from '@hcengineering/core' +import core, { Class, ClassCollaborators, Doc, Hierarchy, ModelDb, Ref } from '.' export function getClassCollaborators ( model: ModelDb, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 2e4289a14ba..5cc09fb86b0 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -42,5 +42,6 @@ export * from './clone' export * from './common' export * from './time' export * from './benchmark' +export * from './collaborators' export default core diff --git a/packages/importer/src/importer/importer.ts b/packages/importer/src/importer/importer.ts index 7d59b93e9f9..49148d4b6f6 100644 --- a/packages/importer/src/importer/importer.ts +++ b/packages/importer/src/importer/importer.ts @@ -204,6 +204,7 @@ export interface ImportControlledDocumentTemplate extends ImportDoc { abstract?: string reviewers?: Ref[] approvers?: Ref[] + externalApprovers?: Ref[] coAuthors?: Ref[] ccReason?: string ccImpact?: string @@ -223,6 +224,7 @@ export interface ImportControlledDocument extends ImportDoc { category?: Ref reviewers?: Ref[] approvers?: Ref[] + externalApprovers?: Ref[] coAuthors?: Ref[] author?: Ref owner?: Ref @@ -999,6 +1001,7 @@ export class WorkspaceImporter { category: template.category, reviewers: template.reviewers ?? [], approvers: template.approvers ?? [], + externalApprovers: template.externalApprovers ?? [], coAuthors: template.coAuthors ?? [], code, seqNumber, @@ -1118,6 +1121,7 @@ export class WorkspaceImporter { abstract: document.abstract, reviewers: document.reviewers ?? [], approvers: document.approvers ?? [], + externalApprovers: document.externalApprovers ?? [], coAuthors: document.coAuthors ?? [], changeControl: changeControlId, code, diff --git a/plugins/controlled-documents-assets/lang/de.json b/plugins/controlled-documents-assets/lang/de.json index 8af3ac49189..85646f9278c 100644 --- a/plugins/controlled-documents-assets/lang/de.json +++ b/plugins/controlled-documents-assets/lang/de.json @@ -42,6 +42,7 @@ "SearchDocument": "Dokument suchen...", "CreateEnVersion": "Version zur Überprüfung erstellen", "Approvers": "Genehmiger", + "ExternalApprovers": "Externe Genehmiger", "CoAuthors": "Co-Autoren", "Status": "Status", "TemplateName": "Vorlagenname", diff --git a/plugins/controlled-documents-assets/lang/en.json b/plugins/controlled-documents-assets/lang/en.json index fe8a2ae8506..7151e33f3a7 100644 --- a/plugins/controlled-documents-assets/lang/en.json +++ b/plugins/controlled-documents-assets/lang/en.json @@ -42,6 +42,7 @@ "SearchDocument": "Search document...", "CreateEnVersion": "Create version for review", "Approvers": "Approvers", + "ExternalApprovers": "External approvers", "CoAuthors": "Co-Authors", "Status": "Status", "TemplateName": "Template name", diff --git a/plugins/controlled-documents-assets/lang/fr.json b/plugins/controlled-documents-assets/lang/fr.json index ea1a7f1cd02..f1464559867 100644 --- a/plugins/controlled-documents-assets/lang/fr.json +++ b/plugins/controlled-documents-assets/lang/fr.json @@ -42,6 +42,7 @@ "SearchDocument": "Rechercher un document...", "CreateEnVersion": "Créer une version pour révision", "Approvers": "Approuveurs", + "ExternalApprovers": "Approuveurs externes", "CoAuthors": "Co-auteurs", "Status": "Statut", "TemplateName": "Nom du modèle", diff --git a/plugins/controlled-documents-assets/lang/it.json b/plugins/controlled-documents-assets/lang/it.json index c8d48a4d503..559ba5fd0e6 100644 --- a/plugins/controlled-documents-assets/lang/it.json +++ b/plugins/controlled-documents-assets/lang/it.json @@ -42,6 +42,7 @@ "SearchDocument": "Cerca documento...", "CreateEnVersion": "Crea versione per revisione", "Approvers": "Approvatori", + "ExternalApprovers": "Approvatori esterni", "CoAuthors": "Co-autori", "Status": "Stato", "TemplateName": "Nome del modello", diff --git a/plugins/controlled-documents-assets/lang/ja.json b/plugins/controlled-documents-assets/lang/ja.json index 4a142dc1d14..cf43ee8b8da 100644 --- a/plugins/controlled-documents-assets/lang/ja.json +++ b/plugins/controlled-documents-assets/lang/ja.json @@ -41,6 +41,7 @@ "SearchDocument": "ドキュメントを検索...", "CreateEnVersion": "レビュー用バージョンを作成", "Approvers": "承認者", + "ExternalApprovers": "外部承認者", "CoAuthors": "共同作成者", "Status": "ステータス", "TemplateName": "テンプレート名", diff --git a/plugins/controlled-documents-assets/lang/pt.json b/plugins/controlled-documents-assets/lang/pt.json index e39eaa0c087..e6ca2594bb7 100644 --- a/plugins/controlled-documents-assets/lang/pt.json +++ b/plugins/controlled-documents-assets/lang/pt.json @@ -42,6 +42,7 @@ "SearchDocument": "Buscar documento...", "CreateEnVersion": "Criar versão para revisão", "Approvers": "Aprovadores", + "ExternalApprovers": "Aprovadores externos", "CoAuthors": "Coautores", "Status": "Status", "TemplateName": "Nome do modelo", diff --git a/plugins/controlled-documents-assets/lang/ru.json b/plugins/controlled-documents-assets/lang/ru.json index 491b59208a6..ab5ac7d7de4 100644 --- a/plugins/controlled-documents-assets/lang/ru.json +++ b/plugins/controlled-documents-assets/lang/ru.json @@ -42,6 +42,7 @@ "SearchDocument": "Найти документ...", "CreateEnVersion": "Создать версию для оценки", "Approvers": "Утверждающие", + "ExternalApprovers": "Внешние утверждающие", "CoAuthors": "Соавторы", "Status": "Статус", "TemplateName": "Имя шаблона", diff --git a/plugins/controlled-documents-assets/lang/zh.json b/plugins/controlled-documents-assets/lang/zh.json index 642c3b19be9..111ecfc5d3c 100644 --- a/plugins/controlled-documents-assets/lang/zh.json +++ b/plugins/controlled-documents-assets/lang/zh.json @@ -42,6 +42,7 @@ "SearchDocument": "搜索文档...", "CreateEnVersion": "创建审核版本", "Approvers": "批准人", + "ExternalApprovers": "外部批准人", "CoAuthors": "共同作者", "Status": "状态", "TemplateName": "模板名称", diff --git a/plugins/controlled-documents-resources/src/components/CreateDocument.svelte b/plugins/controlled-documents-resources/src/components/CreateDocument.svelte index 7546946e798..99aed0f4dc5 100644 --- a/plugins/controlled-documents-resources/src/components/CreateDocument.svelte +++ b/plugins/controlled-documents-resources/src/components/CreateDocument.svelte @@ -67,6 +67,7 @@ snapshots: 0, reviewers: [], approvers: [], + externalApprovers: [], coAuthors: [], changeControl: '' as Ref, content: null diff --git a/plugins/controlled-documents-resources/src/components/DocumentTemplates.svelte b/plugins/controlled-documents-resources/src/components/DocumentTemplates.svelte index a7f9b19c6b4..45f6c7e4f9a 100644 --- a/plugins/controlled-documents-resources/src/components/DocumentTemplates.svelte +++ b/plugins/controlled-documents-resources/src/components/DocumentTemplates.svelte @@ -14,8 +14,8 @@ --> -
+
@@ -113,6 +123,31 @@ />
+ {#if !isReviewRequest} +
+
+
+
+ {externalUsers?.length} +
+
+ (externalUsers = detail)} + /> +
+
+ {/if}
diff --git a/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte b/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte index f179dc1da5e..7e5eda32424 100644 --- a/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte +++ b/plugins/controlled-documents-resources/src/components/create-doc/QmsDocumentWizard.svelte @@ -53,6 +53,7 @@ currentStepUpdated } from '../../stores/wizards/create-document' import FailedToCreateDocument from '../FailedToCreateDocument.svelte' + import { updateExternalApproversAccess } from '../../utils' export let _class: Ref> = documents.class.ControlledDocument @@ -119,6 +120,7 @@ requests: 0, reviewers: [], approvers: [], + externalApprovers: [], coAuthors: [], plannedEffectiveDate: 0, reviewInterval: DEFAULT_PERIODIC_REVIEW_INTERVAL @@ -176,6 +178,14 @@ await createChangeControl(client, ccRecordId, ccRecord, _space) + if (docObject.externalApprovers.length > 0) { + const controlledDoc = await client.findOne(documents.class.ControlledDocument, { _id: newDocId }) + + if (controlledDoc !== undefined) { + await updateExternalApproversAccess(client, controlledDoc, docObject.externalApprovers, []) + } + } + const loc = getProjectDocumentLink(newDocId, $locationStep.project) navigate(loc) diff --git a/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte b/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte index 5df76d5884d..69e13bde400 100644 --- a/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte +++ b/plugins/controlled-documents-resources/src/components/create-doc/QmsTemplateWizard.svelte @@ -52,6 +52,7 @@ wizardClosed } from '../../stores/wizards/create-document' import FailedToCreateDocument from '../FailedToCreateDocument.svelte' + import { updateExternalApproversAccess } from '../../utils' export let _class: Ref> = documents.class.ControlledDocument export let _templateMixin: Ref> = documents.mixin.DocumentTemplate @@ -114,6 +115,7 @@ requests: 0, reviewers: [], approvers: [], + externalApprovers: [], coAuthors: [], plannedEffectiveDate: 0, reviewInterval: DEFAULT_PERIODIC_REVIEW_INTERVAL @@ -178,6 +180,14 @@ await createChangeControl(client, ccRecordId, ccRecord, space) + if (docObject.externalApprovers.length > 0) { + const controlledDoc = await client.findOne(documents.class.ControlledDocument, { _id: newDocId }) + + if (controlledDoc !== undefined) { + await updateExternalApproversAccess(client, controlledDoc, docObject.externalApprovers, []) + } + } + const loc = getProjectDocumentLink(newDocId, $locationStep.project) navigate(loc) diff --git a/plugins/controlled-documents-resources/src/components/create-doc/steps/TeamStep.svelte b/plugins/controlled-documents-resources/src/components/create-doc/steps/TeamStep.svelte index 4b42f1504e9..3dd4893d7d7 100644 --- a/plugins/controlled-documents-resources/src/components/create-doc/steps/TeamStep.svelte +++ b/plugins/controlled-documents-resources/src/components/create-doc/steps/TeamStep.svelte @@ -26,7 +26,7 @@ async function handleUpdate ({ detail }: { - detail: { type: 'reviewers' | 'approvers', users: Ref[] } + detail: { type: 'reviewers' | 'approvers' | 'coAuthors' | 'externalApprovers', users: Ref[] } }): Promise { if (docObject === undefined) { return @@ -40,11 +40,20 @@ $: reviewers = docObject?.reviewers ?? [] $: approvers = docObject?.approvers ?? [] $: coAuthors = docObject?.coAuthors ?? [] + $: externalApprovers = docObject?.externalApprovers ?? [] {#if docObject !== undefined}
- +
{/if} diff --git a/plugins/controlled-documents-resources/src/components/document/DocTeam.svelte b/plugins/controlled-documents-resources/src/components/document/DocTeam.svelte index 1954fcd6afd..dc4c422736c 100644 --- a/plugins/controlled-documents-resources/src/components/document/DocTeam.svelte +++ b/plugins/controlled-documents-resources/src/components/document/DocTeam.svelte @@ -27,6 +27,7 @@ export let canChangeCoAuthors: boolean = true export let reviewers: Ref[] = controlledDoc?.reviewers ?? [] export let approvers: Ref[] = controlledDoc?.approvers ?? [] + export let externalApprovers: Ref[] = controlledDoc?.externalApprovers ?? [] export let coAuthors: Ref[] = controlledDoc?.coAuthors ?? [] const dispatch = createEventDispatcher() @@ -52,7 +53,10 @@ $permissionsStore ).filter((person) => person !== currentEmployee) as Ref[] - function handleUsersUpdated (type: 'reviewers' | 'approvers' | 'coAuthors', users: Ref[]): void { + function handleUsersUpdated ( + type: 'reviewers' | 'approvers' | 'coAuthors' | 'externalApprovers', + users: Ref[] + ): void { dispatch('update', { type, users }) } @@ -120,6 +124,28 @@ }} />
+
+
+
+
+ {externalApprovers?.length} +
+
+ { + handleUsersUpdated('externalApprovers', detail) + }} + /> +