Skip to content

Commit 5aef417

Browse files
authored
Cherry pick of latest QMS changes (develop -> staging) (#9065)
* EQMS-1541: fixes TeamStep in qms document wizard (#8840) Signed-off-by: Victor Ilyushchenko <alt13ri@gmail.com> * EQMS-1561: fixed approval/review requests query when switching between documents (#9059) Signed-off-by: Victor Ilyushchenko <alt13ri@gmail.com> * EQMS-1560: fix & migrate duplicate active review/approval requests in qms (#9062) Signed-off-by: Victor Ilyushchenko <alt13ri@gmail.com> --------- Signed-off-by: Victor Ilyushchenko <alt13ri@gmail.com>
1 parent 37309e1 commit 5aef417

File tree

4 files changed

+81
-9
lines changed

4 files changed

+81
-9
lines changed

models/controlled-documents/src/migration.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ import {
1717
ControlledDocumentState,
1818
createChangeControl,
1919
createDocumentTemplate,
20+
type DocumentApprovalRequest,
2021
type DocumentCategory,
2122
type DocumentMeta,
23+
type DocumentReviewRequest,
2224
documentsId,
2325
DocumentState,
2426
type ProjectMeta
@@ -57,6 +59,8 @@ import tags from '@hcengineering/tags'
5759
import { compareDocumentVersions } from '@hcengineering/controlled-documents/src'
5860
import { makeRank } from '@hcengineering/rank'
5961
import documents, { DOMAIN_DOCUMENTS } from './index'
62+
import { DOMAIN_REQUEST } from '@hcengineering/model-request'
63+
import { RequestStatus } from '@hcengineering/request'
6064

6165
async function createTemplatesSpace (tx: TxOperations): Promise<void> {
6266
const existingSpace = await tx.findOne(documents.class.DocumentSpace, {
@@ -515,6 +519,50 @@ async function migrateInvalidPlannedEffectiveDate (client: MigrationClient): Pro
515519
await client.bulk(DOMAIN_DOCUMENTS, operations)
516520
}
517521

522+
async function migrateCancelDuplicateActiveRequests (client: MigrationClient): Promise<void> {
523+
const reviews = await client.find<DocumentReviewRequest>(DOMAIN_REQUEST, {
524+
_class: documents.class.DocumentReviewRequest
525+
})
526+
const approvals = await client.find<DocumentApprovalRequest>(DOMAIN_REQUEST, {
527+
_class: documents.class.DocumentApprovalRequest
528+
})
529+
530+
const requests = [...reviews, ...approvals].sort((a, b) => (b.createdOn ?? 0) - (a.createdOn ?? 0))
531+
532+
const requestsByDoc = new Map<Ref<ControlledDocument>, (DocumentApprovalRequest | DocumentReviewRequest)[]>()
533+
for (const request of requests) {
534+
const attachedTo = request.attachedTo as Ref<ControlledDocument>
535+
const entry = requestsByDoc.get(attachedTo)
536+
if (entry === undefined) {
537+
requestsByDoc.set(attachedTo, [request])
538+
} else {
539+
entry.push(request)
540+
}
541+
}
542+
543+
const requestsToCancel: (DocumentApprovalRequest | DocumentReviewRequest)[] = []
544+
545+
for (const entry of requestsByDoc.entries()) {
546+
const requests = entry[1]
547+
if (requests.length < 2) continue
548+
const tail = requests.slice(1).filter((r) => r.status === RequestStatus.Active)
549+
requestsToCancel.push(...tail)
550+
}
551+
552+
const operations: {
553+
filter: MigrationDocumentQuery<DocumentApprovalRequest | DocumentReviewRequest>
554+
update: MigrateUpdate<DocumentApprovalRequest | DocumentReviewRequest>
555+
}[] = []
556+
for (const doc of requestsToCancel) {
557+
operations.push({
558+
filter: { _id: doc._id },
559+
update: { status: RequestStatus.Cancelled }
560+
})
561+
}
562+
563+
await client.bulk(DOMAIN_REQUEST, operations)
564+
}
565+
518566
export const documentsOperation: MigrateOperation = {
519567
async migrate (client: MigrationClient, mode): Promise<void> {
520568
await tryMigrate(mode, client, documentsId, [
@@ -552,6 +600,10 @@ export const documentsOperation: MigrateOperation = {
552600
{
553601
state: 'migrateInvalidPlannedEffectiveDate',
554602
func: migrateInvalidPlannedEffectiveDate
603+
},
604+
{
605+
state: 'migrateCancelDuplicateActiveRequests',
606+
func: migrateCancelDuplicateActiveRequests
555607
}
556608
])
557609
},

plugins/controlled-documents-resources/src/components/create-doc/steps/TeamStep.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@
3636
3737
docObject[type] = users
3838
}
39+
40+
$: reviewers = docObject?.reviewers ?? []
41+
$: approvers = docObject?.approvers ?? []
42+
$: coAuthors = docObject?.coAuthors ?? []
3943
</script>
4044

4145
{#if docObject !== undefined}
4246
<div class="root">
43-
<DocTeam controlledDoc={docObject} {space} on:update={handleUpdate} />
47+
<DocTeam controlledDoc={docObject} {space} on:update={handleUpdate} {approvers} {reviewers} {coAuthors} />
4448
</div>
4549
{/if}
4650

plugins/controlled-documents-resources/src/stores/editors/document/query.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@ const queryReviewRequestFx = createEffect(
120120
documents.class.DocumentReviewRequest,
121121
{ attachedTo: _id, attachedToClass: _class, status: RequestStatus.Active },
122122
(result) => {
123-
if (result !== null && result !== undefined && result.length > 0) {
124-
reviewRequestUpdated(result[0])
125-
}
123+
reviewRequestUpdated(result[0] ?? null)
126124
}
127125
)
128126
}
@@ -158,9 +156,7 @@ const queryApprovalRequestFx = createEffect(
158156
documents.class.DocumentApprovalRequest,
159157
{ attachedTo: _id, attachedToClass: _class, status: RequestStatus.Active },
160158
(result) => {
161-
if (result !== null && result !== undefined && result.length > 0) {
162-
approvalRequestUpdated(result[0])
163-
}
159+
approvalRequestUpdated(result[0] ?? null)
164160
}
165161
)
166162
}

plugins/controlled-documents-resources/src/utils.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,35 @@ async function createRequest<T extends Doc> (
283283
approveTx: Tx,
284284
rejectedTx?: Tx,
285285
areAllApprovesRequired = true
286-
): Promise<Ref<Request>> {
287-
return await client.addCollection(reqClass, space, attachedTo, attachedToClass, 'requests', {
286+
): Promise<Ref<Request> | undefined> {
287+
const sequentialRequestClassGroup = [documents.class.DocumentReviewRequest, documents.class.DocumentApprovalRequest]
288+
289+
const ops = client.apply('create-qms-doc-request')
290+
291+
if (sequentialRequestClassGroup.includes(reqClass)) {
292+
for (const _class of sequentialRequestClassGroup) {
293+
ops.notMatch(_class, {
294+
attachedTo,
295+
attachedToClass,
296+
status: RequestStatus.Active
297+
})
298+
}
299+
}
300+
301+
const ref = await ops.addCollection(reqClass, space, attachedTo, attachedToClass, 'requests', {
288302
requested: users,
289303
approved: [],
290304
tx: approveTx,
291305
rejectedTx,
292306
status: RequestStatus.Active,
293307
requiredApprovesCount: areAllApprovesRequired ? users.length : 1
294308
})
309+
310+
const commit = await ops.commit()
311+
312+
if (commit.result) {
313+
return ref
314+
}
295315
}
296316

297317
async function getActiveRequest (

0 commit comments

Comments
 (0)