|
13 | 13 | // limitations under the License.
|
14 | 14 | -->
|
15 | 15 | <script lang="ts">
|
16 |
| - import { Scroller } from '@hcengineering/ui' |
| 16 | + import { Employee, Person } from '@hcengineering/contact' |
| 17 | + import { |
| 18 | + ControlledDocument, |
| 19 | + ControlledDocumentState, |
| 20 | + DocumentApprovalRequest, |
| 21 | + DocumentReviewRequest, |
| 22 | + DocumentState |
| 23 | + } from '@hcengineering/controlled-documents' |
17 | 24 | import { Ref } from '@hcengineering/core'
|
18 |
| - import { ControlledDocument, ControlledDocumentState, DocumentState } from '@hcengineering/controlled-documents' |
19 |
| - import { Employee } from '@hcengineering/contact' |
20 | 25 | import { getClient } from '@hcengineering/presentation'
|
| 26 | + import { Scroller } from '@hcengineering/ui' |
21 | 27 |
|
22 | 28 | import DocTeam from './DocTeam.svelte'
|
23 | 29 |
|
24 | 30 | export let controlledDoc: ControlledDocument
|
25 | 31 | export let editable: boolean = true
|
| 32 | + export let reviewRequest: DocumentReviewRequest | undefined |
| 33 | + export let approvalRequest: DocumentApprovalRequest | undefined |
| 34 | +
|
| 35 | + $: controlledState = controlledDoc.controlledState ?? null |
| 36 | +
|
| 37 | + $: isEditableDraft = editable && controlledDoc.state === DocumentState.Draft |
26 | 38 |
|
27 |
| - $: canChangeCoAuthors = |
28 |
| - editable && controlledDoc.state === DocumentState.Draft && controlledDoc.controlledState == null |
29 |
| - $: canChangeReviewers = |
30 |
| - editable && controlledDoc.state === DocumentState.Draft && controlledDoc.controlledState == null |
31 |
| - $: canChangeApprovers = |
32 |
| - editable && |
33 |
| - ((controlledDoc.state === DocumentState.Draft && controlledDoc.controlledState == null) || |
34 |
| - controlledDoc.controlledState === ControlledDocumentState.InReview || |
35 |
| - controlledDoc.controlledState === ControlledDocumentState.Reviewed) |
| 39 | + $: inCleanState = controlledState === null |
| 40 | + $: inReview = controlledState === ControlledDocumentState.InReview && reviewRequest !== undefined |
| 41 | + $: inApproval = controlledState === ControlledDocumentState.InApproval && approvalRequest !== undefined |
| 42 | + $: isReviewed = controlledState === ControlledDocumentState.Reviewed |
| 43 | +
|
| 44 | + $: canChangeCoAuthors = isEditableDraft && inCleanState |
| 45 | + $: canChangeReviewers = isEditableDraft && (inCleanState || inReview) |
| 46 | + $: canChangeApprovers = isEditableDraft && (inCleanState || inApproval || inReview || isReviewed) |
| 47 | +
|
| 48 | + $: reviewers = (reviewRequest?.requested as Ref<Employee>[]) ?? controlledDoc.reviewers |
| 49 | + $: approvers = (approvalRequest?.requested as Ref<Employee>[]) ?? controlledDoc.approvers |
| 50 | + $: coAuthors = controlledDoc.coAuthors |
36 | 51 |
|
37 | 52 | const client = getClient()
|
38 | 53 |
|
39 | 54 | async function handleUpdate ({
|
40 | 55 | detail
|
41 | 56 | }: {
|
42 |
| - detail: { type: 'reviewers' | 'approvers', users: Ref<Employee>[] } |
| 57 | + detail: { type: 'reviewers' | 'approvers', users: Ref<Person>[] } |
43 | 58 | }): Promise<void> {
|
44 | 59 | const { type, users } = detail
|
45 | 60 |
|
46 |
| - await client.update(controlledDoc, { [type]: users }) |
| 61 | + const request = detail.type === 'reviewers' ? reviewRequest : approvalRequest |
| 62 | +
|
| 63 | + const ops = client.apply() |
| 64 | +
|
| 65 | + if (request?._id !== undefined) { |
| 66 | + const requested = request.requested?.slice() ?? [] |
| 67 | + const requestedSet = new Set<Ref<Person>>(requested) |
| 68 | +
|
| 69 | + const addedPersons = new Set<Ref<Person>>() |
| 70 | + const removedPersons = new Set<Ref<Person>>(requested) |
| 71 | +
|
| 72 | + for (const u of users) { |
| 73 | + if (requestedSet.has(u)) { |
| 74 | + removedPersons.delete(u) |
| 75 | + } else { |
| 76 | + addedPersons.add(u) |
| 77 | + } |
| 78 | + } |
| 79 | +
|
| 80 | + const approved = request.approved?.slice() ?? [] |
| 81 | + const approvedDates = request.approvedDates?.slice() ?? [] |
| 82 | +
|
| 83 | + for (const u of removedPersons) { |
| 84 | + const idx = approved.indexOf(u) |
| 85 | + if (idx === -1) continue |
| 86 | + approved.splice(idx, 1) |
| 87 | + approvedDates.splice(idx, 1) |
| 88 | + } |
| 89 | +
|
| 90 | + const requiredApprovesCount = users.length |
| 91 | +
|
| 92 | + await ops.update(request, { |
| 93 | + requested: users, |
| 94 | + approved, |
| 95 | + approvedDates, |
| 96 | + requiredApprovesCount |
| 97 | + }) |
| 98 | + } |
| 99 | +
|
| 100 | + await ops.update(controlledDoc, { [type]: users }) |
| 101 | + await ops.commit() |
47 | 102 | }
|
48 | 103 | </script>
|
49 | 104 |
|
|
56 | 111 | {canChangeCoAuthors}
|
57 | 112 | {canChangeReviewers}
|
58 | 113 | {canChangeApprovers}
|
| 114 | + {reviewers} |
| 115 | + {approvers} |
| 116 | + {coAuthors} |
59 | 117 | on:update={handleUpdate}
|
60 | 118 | />
|
61 | 119 | </div>
|
|
0 commit comments