mirror of
https://github.com/hcengineering/platform.git
synced 2025-04-14 04:08:19 +00:00
parent
a9cd080476
commit
c5a97b163c
@ -23,9 +23,11 @@ import {
|
|||||||
Ref,
|
Ref,
|
||||||
Space,
|
Space,
|
||||||
Status,
|
Status,
|
||||||
|
Tx,
|
||||||
TxCollectionCUD,
|
TxCollectionCUD,
|
||||||
TxCreateDoc,
|
TxCreateDoc,
|
||||||
TxOperations,
|
TxOperations,
|
||||||
|
TxProcessor,
|
||||||
TxUpdateDoc,
|
TxUpdateDoc,
|
||||||
toIdMap
|
toIdMap
|
||||||
} from '@hcengineering/core'
|
} from '@hcengineering/core'
|
||||||
@ -357,7 +359,7 @@ async function migrateStatuses (client: MigrationClient): Promise<void> {
|
|||||||
const filters = JSON.parse(filter.filters) as Filter[]
|
const filters = JSON.parse(filter.filters) as Filter[]
|
||||||
let changed = false
|
let changed = false
|
||||||
for (const filter of filters) {
|
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++) {
|
for (let index = 0; index < filter.value.length; index++) {
|
||||||
const val = filter.value[index]
|
const val = filter.value[index]
|
||||||
const newVal = oldStatusesMap.get(val)
|
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 })
|
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 = {
|
export const taskOperation: MigrateOperation = {
|
||||||
async migrate (client: MigrationClient): Promise<void> {
|
async migrate (client: MigrationClient): Promise<void> {
|
||||||
await renameState(client)
|
await renameState(client)
|
||||||
await migrateStatuses(client)
|
await migrateStatuses(client)
|
||||||
|
await fixFilters(client)
|
||||||
},
|
},
|
||||||
async upgrade (client: MigrationUpgradeClient): Promise<void> {
|
async upgrade (client: MigrationUpgradeClient): Promise<void> {
|
||||||
const tx = new TxOperations(client, core.account.System)
|
const tx = new TxOperations(client, core.account.System)
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
import { IssueStatus, Project } from '@hcengineering/tracker'
|
import { IssueStatus, Project } from '@hcengineering/tracker'
|
||||||
import IssueStatusIcon from './IssueStatusIcon.svelte'
|
import IssueStatusIcon from './IssueStatusIcon.svelte'
|
||||||
import { createQuery } from '@hcengineering/presentation'
|
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'
|
import { statusStore } from '@hcengineering/view-resources'
|
||||||
|
|
||||||
export let value: Ref<IssueStatus>[]
|
export let value: Ref<IssueStatus>[]
|
||||||
@ -30,8 +30,15 @@
|
|||||||
categories = toIdMap(res)
|
categories = toIdMap(res)
|
||||||
})
|
})
|
||||||
|
|
||||||
function sort (value: IssueStatus[], categories: IdMap<StatusCategory>): IssueStatus[] {
|
function sort (value: Ref<IssueStatus>[], store: IdMap<Status>, categories: IdMap<StatusCategory>): IssueStatus[] {
|
||||||
return value.sort((a, b) => {
|
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 (a.category === undefined) return -1
|
||||||
if (b.category === undefined) return 1
|
if (b.category === undefined) return 1
|
||||||
const aCat = categories.get(a.category)
|
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>
|
</script>
|
||||||
|
|
||||||
<div class="flex-presenter flex-gap-1-5">
|
<div class="flex-presenter flex-gap-1-5">
|
||||||
|
@ -18,7 +18,7 @@ import { createQuery, getClient } from '@hcengineering/presentation'
|
|||||||
import { writable } from 'svelte/store'
|
import { writable } from 'svelte/store'
|
||||||
|
|
||||||
// Issue status live query
|
// Issue status live query
|
||||||
export const statusStore = writable<IdMap<Status>>()
|
export const statusStore = writable<IdMap<Status>>(new Map())
|
||||||
|
|
||||||
function fillStores (): void {
|
function fillStores (): void {
|
||||||
const client = getClient()
|
const client = getClient()
|
||||||
|
Loading…
Reference in New Issue
Block a user