Minor fixes (#2615)

Signed-off-by: Denis Bykhov <bykhov.denis@gmail.com>
This commit is contained in:
Denis Bykhov 2023-02-10 07:45:22 +06:00 committed by GitHub
parent 8d14dbef14
commit ef77d22116
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 123 additions and 88 deletions

View File

@ -65,11 +65,7 @@ export async function generateIssues (
} }
async function genIssue (client: TxOperations): Promise<void> { async function genIssue (client: TxOperations): Promise<void> {
const lastOne = await client.findOne<Issue>( const lastOne = await client.findOne<Issue>(tracker.class.Issue, {}, { sort: { rank: SortingOrder.Descending } })
tracker.class.Issue,
{ status: object.status },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.updateDoc( const incResult = await client.updateDoc(
tracker.class.Team, tracker.class.Team,
core.space.Space, core.space.Space,

View File

@ -13,10 +13,20 @@
// limitations under the License. // limitations under the License.
// //
import core, { Doc, DocumentUpdate, generateId, Ref, SortingOrder, TxOperations, TxResult } from '@hcengineering/core' import core, {
Doc,
DocumentUpdate,
DOMAIN_TX,
generateId,
Ref,
SortingOrder,
TxOperations,
TxResult
} from '@hcengineering/core'
import { createOrUpdate, MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@hcengineering/model' import { createOrUpdate, MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@hcengineering/model'
import tags from '@hcengineering/tags' import tags from '@hcengineering/tags'
import { import {
calcRank,
genRanks, genRanks,
Issue, Issue,
IssueStatus, IssueStatus,
@ -327,6 +337,45 @@ async function createDefaults (tx: TxOperations): Promise<void> {
) )
} }
async function fillRank (client: MigrationClient): Promise<void> {
const docs = await client.find<Issue>(DOMAIN_TRACKER, {
_class: tracker.class.Issue,
rank: ''
})
let last = (
await client.find<Issue>(
DOMAIN_TRACKER,
{
_class: tracker.class.Issue,
rank: { $ne: '' }
},
{
sort: { rank: SortingOrder.Descending },
limit: 1
}
)
)[0]
for (const doc of docs) {
const rank = calcRank(last)
await client.update(
DOMAIN_TRACKER,
{
_id: doc._id
},
{
rank
}
)
await client.update(
DOMAIN_TX,
{ 'tx.objectId': doc._id, 'tx._class': core.class.TxCreateDoc },
{ 'tx.attributes.rank': rank }
)
doc.rank = rank
last = doc
}
}
async function upgradeTeams (tx: TxOperations): Promise<void> { async function upgradeTeams (tx: TxOperations): Promise<void> {
await upgradeTeamIssueStatuses(tx) await upgradeTeamIssueStatuses(tx)
await fixTeamsIssueStatusesOrder(tx) await fixTeamsIssueStatusesOrder(tx)
@ -375,6 +424,7 @@ export const trackerOperation: MigrateOperation = {
) )
await Promise.all([migrateIssueProjects(client), migrateParentIssues(client)]) await Promise.all([migrateIssueProjects(client), migrateParentIssues(client)])
await migrateIssueParentInfo(client) await migrateIssueParentInfo(client)
await fillRank(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)

View File

@ -49,11 +49,7 @@
throw new Error('sequence object not found') throw new Error('sequence object not found')
} }
const lastOne = await client.findOne( const lastOne = await client.findOne(board.class.Card, {}, { sort: { rank: SortingOrder.Descending } })
board.class.Card,
{ state: state._id },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true) const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true)
const value: AttachedData<BoardCard> = { const value: AttachedData<BoardCard> = {

View File

@ -70,7 +70,7 @@
const client = getClient() const client = getClient()
async function addItem (title: any) { async function addItem (title: any) {
const lastOne = await client.findOne(task.class.State, { space }, { sort: { rank: SortingOrder.Descending } }) const lastOne = await client.findOne(task.class.State, {}, { sort: { rank: SortingOrder.Descending } })
await client.createDoc(task.class.State, space, { await client.createDoc(task.class.State, space, {
title, title,
color: 9, color: 9,

View File

@ -36,11 +36,7 @@
throw new Error('sequence object not found') throw new Error('sequence object not found')
} }
const lastOne = await client.findOne( const lastOne = await client.findOne(board.class.Card, {}, { sort: { rank: SortingOrder.Descending } })
board.class.Card,
{ state: state._id },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true) const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true)
const value: AttachedData<BoardCard> = { const value: AttachedData<BoardCard> = {

View File

@ -24,7 +24,7 @@ export async function createCard (
throw new Error('sequence object not found') throw new Error('sequence object not found')
} }
const lastOne = await client.findOne(board.class.Card, { state }, { sort: { rank: SortingOrder.Descending } }) const lastOne = await client.findOne(board.class.Card, {}, { sort: { rank: SortingOrder.Descending } })
const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true) const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true)
const value: AttachedData<Card> = { const value: AttachedData<Card> = {

View File

@ -63,11 +63,7 @@
throw new Error('sequence object not found') throw new Error('sequence object not found')
} }
const lastOne = await client.findOne( const lastOne = await client.findOne(lead.class.Lead, {}, { sort: { rank: SortingOrder.Descending } })
lead.class.Lead,
{ state: state._id },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true) const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true)
const value: AttachedData<Lead> = { const value: AttachedData<Lead> = {

View File

@ -116,11 +116,7 @@
throw new Error('sequence object not found') throw new Error('sequence object not found')
} }
const lastOne = await client.findOne( const lastOne = await client.findOne(recruit.class.Applicant, {}, { sort: { rank: SortingOrder.Descending } })
recruit.class.Applicant,
{ state: state._id },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true) const incResult = await client.update(sequence, { $inc: { sequence: 1 } }, true)
const candidateInstance = await client.findOne(contact.class.Person, { _id: _candidate }) const candidateInstance = await client.findOne(contact.class.Person, { _id: _candidate })

View File

@ -15,11 +15,11 @@
<script lang="ts"> <script lang="ts">
import { AttachmentStyledBox } from '@hcengineering/attachment-resources' import { AttachmentStyledBox } from '@hcengineering/attachment-resources'
import contact, { Organization } from '@hcengineering/contact' import contact, { Organization } from '@hcengineering/contact'
import core, { FindResult, generateId, getCurrentAccount, Ref } from '@hcengineering/core' import core, { FindResult, generateId, getCurrentAccount, Ref, SortingOrder } from '@hcengineering/core'
import { Card, createQuery, getClient, UserBox } from '@hcengineering/presentation' import { Card, createQuery, getClient, UserBox } from '@hcengineering/presentation'
import { Vacancy as VacancyClass } from '@hcengineering/recruit' import { Vacancy as VacancyClass } from '@hcengineering/recruit'
import task, { createKanban, KanbanTemplate } from '@hcengineering/task' import task, { createKanban, KanbanTemplate } from '@hcengineering/task'
import tracker, { IssueStatus, IssueTemplate } from '@hcengineering/tracker' import tracker, { calcRank, Issue, IssueStatus, IssueTemplate } from '@hcengineering/tracker'
import { Button, Component, createFocusManager, EditBox, FocusHandler, IconAttachment } from '@hcengineering/ui' import { Button, Component, createFocusManager, EditBox, FocusHandler, IconAttachment } from '@hcengineering/ui'
import { createEventDispatcher } from 'svelte' import { createEventDispatcher } from 'svelte'
import recruit from '../plugin' import recruit from '../plugin'
@ -84,43 +84,56 @@
objectId objectId
) )
for (const issueTemplate of issueTemplates) { if (issueTemplates.length > 0) {
const incResult = await client.updateDoc( for (const issueTemplate of issueTemplates) {
tracker.class.Team, // we need find for each because it can be in another space
core.space.Space, const lastOne = await client.findOne<Issue>(
issueTemplate.space, tracker.class.Issue,
{ { space: issueTemplate.space },
$inc: { sequence: 1 } { sort: { rank: SortingOrder.Descending } }
}, )
true const incResult = await client.updateDoc(
) tracker.class.Team,
await client.addCollection( core.space.Space,
tracker.class.Issue, issueTemplate.space,
issueTemplate.space, {
tracker.ids.NoParent, $inc: { sequence: 1 }
tracker.class.Issue, },
'subIssues', true
{ )
title: issueTemplate.title, const team = await client.findOne(tracker.class.Team, { _id: issueTemplate.space })
description: issueTemplate.description, const rank = calcRank(lastOne, undefined)
assignee: issueTemplate.assignee, await client.addCollection(
project: issueTemplate.project, tracker.class.Issue,
sprint: issueTemplate.sprint, issueTemplate.space,
number: (incResult as any).object.sequence, tracker.ids.NoParent,
status: '' as Ref<IssueStatus>, tracker.class.Issue,
priority: issueTemplate.priority, 'subIssues',
rank: '', {
comments: 0, title: issueTemplate.title,
subIssues: 0, description: issueTemplate.description,
dueDate: null, assignee: issueTemplate.assignee,
parents: [], project: issueTemplate.project,
reportedTime: 0, sprint: issueTemplate.sprint,
estimation: issueTemplate.estimation, number: (incResult as any).object.sequence,
reports: 0, status: team?.defaultIssueStatus as Ref<IssueStatus>,
relations: [{ _id: id, _class: recruit.class.Vacancy }], priority: issueTemplate.priority,
childInfo: [] rank,
comments: 0,
subIssues: 0,
dueDate: null,
parents: [],
reportedTime: 0,
estimation: issueTemplate.estimation,
reports: 0,
relations: [{ _id: id, _class: recruit.class.Vacancy }],
childInfo: []
}
)
if (lastOne !== undefined) {
lastOne.rank = rank
} }
) }
} }
await createKanban(client, id, templateId) await createKanban(client, id, templateId)

View File

@ -75,7 +75,7 @@
} }
async function onAdd (_class: Ref<Class<State | DoneState>>) { async function onAdd (_class: Ref<Class<State | DoneState>>) {
const lastOne = await client.findOne(_class, { space: kanban.space }, { sort: { rank: SortingOrder.Descending } }) const lastOne = await client.findOne(_class, {}, { sort: { rank: SortingOrder.Descending } })
if (hierarchy.isDerived(_class, task.class.DoneState)) { if (hierarchy.isDerived(_class, task.class.DoneState)) {
await client.createDoc(_class, kanban.space, { await client.createDoc(_class, kanban.space, {
title: 'New Done State', title: 'New Done State',

View File

@ -407,11 +407,7 @@
return return
} }
const lastOne = await client.findOne<Issue>( const lastOne = await client.findOne<Issue>(tracker.class.Issue, {}, { sort: { rank: SortingOrder.Descending } })
tracker.class.Issue,
{ status: object.status },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.updateDoc( const incResult = await client.updateDoc(
tracker.class.Team, tracker.class.Team,
core.space.Space, core.space.Space,
@ -475,11 +471,7 @@
} }
} }
for (const subIssue of subIssues) { for (const subIssue of subIssues) {
const lastOne = await client.findOne<Issue>( const lastOne = await client.findOne<Issue>(tracker.class.Issue, {}, { sort: { rank: SortingOrder.Descending } })
tracker.class.Issue,
{ status: object.status },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.updateDoc( const incResult = await client.updateDoc(
tracker.class.Team, tracker.class.Team,
core.space.Space, core.space.Space,

View File

@ -91,11 +91,7 @@
loading = true loading = true
try { try {
const space = currentTeam._id const space = currentTeam._id
const lastOne = await client.findOne<Issue>( const lastOne = await client.findOne<Issue>(tracker.class.Issue, {}, { sort: { rank: SortingOrder.Descending } })
tracker.class.Issue,
{ space },
{ sort: { rank: SortingOrder.Descending } }
)
const incResult = await client.updateDoc( const incResult = await client.updateDoc(
tracker.class.Team, tracker.class.Team,
core.space.Space, core.space.Space,

View File

@ -52,11 +52,7 @@
if (state === undefined) { if (state === undefined) {
throw new Error('Move: state not found') throw new Error('Move: state not found')
} }
const lastOne = await client.findOne( const lastOne = await client.findOne((doc as Task)._class, {}, { sort: { rank: SortingOrder.Descending } })
(doc as Task)._class,
{ state: state._id },
{ sort: { rank: SortingOrder.Descending } }
)
await moveToSpace(client, doc, space, { await moveToSpace(client, doc, space, {
state: state._id, state: state._id,
rank: calcRank(lastOne, undefined) rank: calcRank(lastOne, undefined)

View File

@ -33,13 +33,21 @@ export class ModifiedMiddleware extends BaseMiddleware implements Middleware {
tx.modifiedOn = Date.now() tx.modifiedOn = Date.now()
if (this.storage.hierarchy.isDerived(tx._class, core.class.TxCreateDoc)) { if (this.storage.hierarchy.isDerived(tx._class, core.class.TxCreateDoc)) {
const createTx = tx as TxCreateDoc<Doc & { createOn: Timestamp }> const createTx = tx as TxCreateDoc<Doc & { createOn: Timestamp }>
if (createTx.attributes.createOn !== undefined) { const hasCreateOn = this.storage.hierarchy.findAttribute(createTx.objectClass, 'createOn')
if (hasCreateOn !== undefined) {
createTx.attributes.createOn = tx.modifiedOn createTx.attributes.createOn = tx.modifiedOn
} }
} }
if (this.storage.hierarchy.isDerived(tx._class, core.class.TxCollectionCUD)) { if (this.storage.hierarchy.isDerived(tx._class, core.class.TxCollectionCUD)) {
const coltx = tx as TxCollectionCUD<Doc, AttachedDoc> const coltx = tx as TxCollectionCUD<Doc, AttachedDoc>
coltx.tx.modifiedOn = tx.modifiedOn coltx.tx.modifiedOn = tx.modifiedOn
if (this.storage.hierarchy.isDerived(coltx.tx._class, core.class.TxCreateDoc)) {
const createTx = coltx.tx as TxCreateDoc<AttachedDoc & { createOn: Timestamp }>
const hasCreateOn = this.storage.hierarchy.findAttribute(createTx.objectClass, 'createOn')
if (hasCreateOn !== undefined) {
createTx.attributes.createOn = tx.modifiedOn
}
}
} }
return await this.provideTx(ctx, tx) return await this.provideTx(ctx, tx)
} }