Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
This commit is contained in:
Denis Bykhov 2023-09-11 07:46:05 +03:00 committed by GitHub
parent a9cd080476
commit c5a97b163c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 65 additions and 6 deletions

View File

@ -23,9 +23,11 @@ import {
Ref,
Space,
Status,
Tx,
TxCollectionCUD,
TxCreateDoc,
TxOperations,
TxProcessor,
TxUpdateDoc,
toIdMap
} from '@hcengineering/core'
@ -357,7 +359,7 @@ async function migrateStatuses (client: MigrationClient): Promise<void> {
const filters = JSON.parse(filter.filters) as Filter[]
let changed = false
for (const filter of filters) {
if (['status, doneStatus'].includes(filter.key.key)) {
if (['status', 'doneStatus'].includes(filter.key.key)) {
for (let index = 0; index < filter.value.length; index++) {
const val = filter.value[index]
const newVal = oldStatusesMap.get(val)
@ -381,10 +383,60 @@ async function migrateStatuses (client: MigrationClient): Promise<void> {
await client.update(DOMAIN_STATUS, { space: { $ne: task.space.Statuses } }, { space: task.space.Statuses })
}
async function fixFilters (client: MigrationClient): Promise<void> {
const currentStatuses = await client.find<Status>(DOMAIN_STATUS, {})
const currentStatusesMap = toIdMap(currentStatuses)
const cacheMap = new Map<Ref<Status>, Ref<Status>>()
const descendants = client.hierarchy.getDescendants(task.class.Task)
const filters = await client.find<FilteredView>(DOMAIN_VIEW, {
_class: view.class.FilteredView,
filterClass: { $in: descendants }
})
for (const filter of filters) {
const filters = JSON.parse(filter.filters) as Filter[]
let changed = false
for (const filter of filters) {
if (['status', 'doneStatus'].includes(filter.key.key)) {
for (let index = 0; index < filter.value.length; index++) {
const val = filter.value[index]
if (!currentStatusesMap.has(val)) {
const newVal = cacheMap.get(val)
if (newVal !== undefined) {
filter.value[index] = newVal
changed = true
} else {
const ownTxes = await client.find<Tx>(DOMAIN_TX, { objectId: val })
const attachedTxes = await client.find<Tx>(DOMAIN_TX, { 'tx.objectId': val })
const txes = [...ownTxes, ...attachedTxes].sort((a, b) => a.modifiedOn - b.modifiedOn)
const oldStatus = TxProcessor.buildDoc2Doc<Status>(txes)
if (oldStatus !== undefined) {
const newStatus = currentStatuses.find(
(p) =>
p.ofAttribute === oldStatus.ofAttribute &&
p.name.toLowerCase().trim() === oldStatus.name.toLowerCase().trim()
)
if (newStatus !== undefined) {
filter.value[index] = newStatus._id
cacheMap.set(val, newStatus._id)
changed = true
}
}
}
}
}
}
}
if (changed) {
await client.update(DOMAIN_VIEW, { _id: filter._id }, { filters: JSON.stringify(filters) })
}
}
}
export const taskOperation: MigrateOperation = {
async migrate (client: MigrationClient): Promise<void> {
await renameState(client)
await migrateStatuses(client)
await fixFilters(client)
},
async upgrade (client: MigrationUpgradeClient): Promise<void> {
const tx = new TxOperations(client, core.account.System)

View File

@ -16,7 +16,7 @@
import { IssueStatus, Project } from '@hcengineering/tracker'
import IssueStatusIcon from './IssueStatusIcon.svelte'
import { createQuery } from '@hcengineering/presentation'
import core, { IdMap, Ref, StatusCategory, toIdMap } from '@hcengineering/core'
import core, { IdMap, Ref, Status, StatusCategory, toIdMap } from '@hcengineering/core'
import { statusStore } from '@hcengineering/view-resources'
export let value: Ref<IssueStatus>[]
@ -30,8 +30,15 @@
categories = toIdMap(res)
})
function sort (value: IssueStatus[], categories: IdMap<StatusCategory>): IssueStatus[] {
return value.sort((a, b) => {
function sort (value: Ref<IssueStatus>[], store: IdMap<Status>, categories: IdMap<StatusCategory>): IssueStatus[] {
const result: IssueStatus[] = []
for (const val of new Set(value)) {
const res = store.get(val)
if (res) {
result.push(res)
}
}
return result.sort((a, b) => {
if (a.category === undefined) return -1
if (b.category === undefined) return 1
const aCat = categories.get(a.category)
@ -42,7 +49,7 @@
})
}
$: statuses = sort(value.map((p) => $statusStore.get(p)) as IssueStatus[], categories)
$: statuses = sort(value, $statusStore, categories)
</script>
<div class="flex-presenter flex-gap-1-5">

View File

@ -18,7 +18,7 @@ import { createQuery, getClient } from '@hcengineering/presentation'
import { writable } from 'svelte/store'
// Issue status live query
export const statusStore = writable<IdMap<Status>>()
export const statusStore = writable<IdMap<Status>>(new Map())
function fillStores (): void {
const client = getClient()