mirror of
https://github.com/hcengineering/platform.git
synced 2025-06-09 09:20:54 +00:00
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>
This commit is contained in:
parent
37309e1718
commit
5aef4170c9
@ -17,8 +17,10 @@ import {
|
||||
ControlledDocumentState,
|
||||
createChangeControl,
|
||||
createDocumentTemplate,
|
||||
type DocumentApprovalRequest,
|
||||
type DocumentCategory,
|
||||
type DocumentMeta,
|
||||
type DocumentReviewRequest,
|
||||
documentsId,
|
||||
DocumentState,
|
||||
type ProjectMeta
|
||||
@ -57,6 +59,8 @@ import tags from '@hcengineering/tags'
|
||||
import { compareDocumentVersions } from '@hcengineering/controlled-documents/src'
|
||||
import { makeRank } from '@hcengineering/rank'
|
||||
import documents, { DOMAIN_DOCUMENTS } from './index'
|
||||
import { DOMAIN_REQUEST } from '@hcengineering/model-request'
|
||||
import { RequestStatus } from '@hcengineering/request'
|
||||
|
||||
async function createTemplatesSpace (tx: TxOperations): Promise<void> {
|
||||
const existingSpace = await tx.findOne(documents.class.DocumentSpace, {
|
||||
@ -515,6 +519,50 @@ async function migrateInvalidPlannedEffectiveDate (client: MigrationClient): Pro
|
||||
await client.bulk(DOMAIN_DOCUMENTS, operations)
|
||||
}
|
||||
|
||||
async function migrateCancelDuplicateActiveRequests (client: MigrationClient): Promise<void> {
|
||||
const reviews = await client.find<DocumentReviewRequest>(DOMAIN_REQUEST, {
|
||||
_class: documents.class.DocumentReviewRequest
|
||||
})
|
||||
const approvals = await client.find<DocumentApprovalRequest>(DOMAIN_REQUEST, {
|
||||
_class: documents.class.DocumentApprovalRequest
|
||||
})
|
||||
|
||||
const requests = [...reviews, ...approvals].sort((a, b) => (b.createdOn ?? 0) - (a.createdOn ?? 0))
|
||||
|
||||
const requestsByDoc = new Map<Ref<ControlledDocument>, (DocumentApprovalRequest | DocumentReviewRequest)[]>()
|
||||
for (const request of requests) {
|
||||
const attachedTo = request.attachedTo as Ref<ControlledDocument>
|
||||
const entry = requestsByDoc.get(attachedTo)
|
||||
if (entry === undefined) {
|
||||
requestsByDoc.set(attachedTo, [request])
|
||||
} else {
|
||||
entry.push(request)
|
||||
}
|
||||
}
|
||||
|
||||
const requestsToCancel: (DocumentApprovalRequest | DocumentReviewRequest)[] = []
|
||||
|
||||
for (const entry of requestsByDoc.entries()) {
|
||||
const requests = entry[1]
|
||||
if (requests.length < 2) continue
|
||||
const tail = requests.slice(1).filter((r) => r.status === RequestStatus.Active)
|
||||
requestsToCancel.push(...tail)
|
||||
}
|
||||
|
||||
const operations: {
|
||||
filter: MigrationDocumentQuery<DocumentApprovalRequest | DocumentReviewRequest>
|
||||
update: MigrateUpdate<DocumentApprovalRequest | DocumentReviewRequest>
|
||||
}[] = []
|
||||
for (const doc of requestsToCancel) {
|
||||
operations.push({
|
||||
filter: { _id: doc._id },
|
||||
update: { status: RequestStatus.Cancelled }
|
||||
})
|
||||
}
|
||||
|
||||
await client.bulk(DOMAIN_REQUEST, operations)
|
||||
}
|
||||
|
||||
export const documentsOperation: MigrateOperation = {
|
||||
async migrate (client: MigrationClient, mode): Promise<void> {
|
||||
await tryMigrate(mode, client, documentsId, [
|
||||
@ -552,6 +600,10 @@ export const documentsOperation: MigrateOperation = {
|
||||
{
|
||||
state: 'migrateInvalidPlannedEffectiveDate',
|
||||
func: migrateInvalidPlannedEffectiveDate
|
||||
},
|
||||
{
|
||||
state: 'migrateCancelDuplicateActiveRequests',
|
||||
func: migrateCancelDuplicateActiveRequests
|
||||
}
|
||||
])
|
||||
},
|
||||
|
@ -36,11 +36,15 @@
|
||||
|
||||
docObject[type] = users
|
||||
}
|
||||
|
||||
$: reviewers = docObject?.reviewers ?? []
|
||||
$: approvers = docObject?.approvers ?? []
|
||||
$: coAuthors = docObject?.coAuthors ?? []
|
||||
</script>
|
||||
|
||||
{#if docObject !== undefined}
|
||||
<div class="root">
|
||||
<DocTeam controlledDoc={docObject} {space} on:update={handleUpdate} />
|
||||
<DocTeam controlledDoc={docObject} {space} on:update={handleUpdate} {approvers} {reviewers} {coAuthors} />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
@ -120,9 +120,7 @@ const queryReviewRequestFx = createEffect(
|
||||
documents.class.DocumentReviewRequest,
|
||||
{ attachedTo: _id, attachedToClass: _class, status: RequestStatus.Active },
|
||||
(result) => {
|
||||
if (result !== null && result !== undefined && result.length > 0) {
|
||||
reviewRequestUpdated(result[0])
|
||||
}
|
||||
reviewRequestUpdated(result[0] ?? null)
|
||||
}
|
||||
)
|
||||
}
|
||||
@ -158,9 +156,7 @@ const queryApprovalRequestFx = createEffect(
|
||||
documents.class.DocumentApprovalRequest,
|
||||
{ attachedTo: _id, attachedToClass: _class, status: RequestStatus.Active },
|
||||
(result) => {
|
||||
if (result !== null && result !== undefined && result.length > 0) {
|
||||
approvalRequestUpdated(result[0])
|
||||
}
|
||||
approvalRequestUpdated(result[0] ?? null)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
@ -283,8 +283,22 @@ async function createRequest<T extends Doc> (
|
||||
approveTx: Tx,
|
||||
rejectedTx?: Tx,
|
||||
areAllApprovesRequired = true
|
||||
): Promise<Ref<Request>> {
|
||||
return await client.addCollection(reqClass, space, attachedTo, attachedToClass, 'requests', {
|
||||
): Promise<Ref<Request> | undefined> {
|
||||
const sequentialRequestClassGroup = [documents.class.DocumentReviewRequest, documents.class.DocumentApprovalRequest]
|
||||
|
||||
const ops = client.apply('create-qms-doc-request')
|
||||
|
||||
if (sequentialRequestClassGroup.includes(reqClass)) {
|
||||
for (const _class of sequentialRequestClassGroup) {
|
||||
ops.notMatch(_class, {
|
||||
attachedTo,
|
||||
attachedToClass,
|
||||
status: RequestStatus.Active
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const ref = await ops.addCollection(reqClass, space, attachedTo, attachedToClass, 'requests', {
|
||||
requested: users,
|
||||
approved: [],
|
||||
tx: approveTx,
|
||||
@ -292,6 +306,12 @@ async function createRequest<T extends Doc> (
|
||||
status: RequestStatus.Active,
|
||||
requiredApprovesCount: areAllApprovesRequired ? users.length : 1
|
||||
})
|
||||
|
||||
const commit = await ops.commit()
|
||||
|
||||
if (commit.result) {
|
||||
return ref
|
||||
}
|
||||
}
|
||||
|
||||
async function getActiveRequest (
|
||||
|
Loading…
Reference in New Issue
Block a user