Remove team (#2625)

Signed-off-by: Vyacheslav Tumanov <me@slavatumanov.me>
This commit is contained in:
Vyacheslav Tumanov 2023-02-13 13:18:31 +05:00 committed by GitHub
parent 6450ebe66d
commit 93305b512a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 101 additions and 6 deletions

View File

@ -36,4 +36,8 @@ export function createModel (builder: Builder): void {
builder.createDoc(serverCore.class.Trigger, core.space.Model, {
trigger: serverTracker.trigger.OnProjectRemove
})
builder.createDoc(serverCore.class.Trigger, core.space.Model, {
trigger: serverTracker.trigger.OnTeamDelete
})
}

View File

@ -1085,6 +1085,26 @@ export function createModel (builder: Builder): void {
tracker.action.EditTeam
)
createAction(
builder,
{
action: tracker.actionImpl.DeleteTeam,
label: tracker.string.DeleteTeam,
icon: view.icon.Delete,
input: 'focus',
category: tracker.category.Tracker,
target: tracker.class.Team,
query: {
archived: false
},
context: {
mode: ['context', 'browser'],
group: 'edit'
}
},
tracker.action.DeleteTeam
)
builder.createDoc(
view.class.ActionCategory,
core.space.Model,

View File

@ -58,11 +58,13 @@ export default mergeIds(trackerId, tracker, {
CopyToClipboard: '' as ViewAction,
EditWorkflowStatuses: '' as ViewAction,
EditTeam: '' as ViewAction,
DeleteTeam: '' as ViewAction,
DeleteSprint: '' as ViewAction
},
action: {
NewRelatedIssue: '' as Ref<Action<Doc, Record<string, any>>>,
DeleteSprint: '' as Ref<Action<Doc, Record<string, any>>>,
DeleteTeam: '' as Ref<Action<Doc, Record<string, any>>>,
SetSprintLead: '' as Ref<Action<Doc, Record<string, any>>>
}
})

View File

@ -177,6 +177,9 @@
"EditIssue": "Edit {title}",
"EditWorkflowStatuses": "Edit issue statuses",
"EditTeam": "Edit team",
"DeleteTeam": "Delete team",
"DeleteTeamName": "Delete team {name}?",
"TeamHasIssues": "There are existing issues in this team, are you sure that you want to delete? Both the team and the issues will be deleted.",
"ManageWorkflowStatuses": "Manage issue statuses within team",
"AddWorkflowStatus": "Add issue status",
"EditWorkflowStatus": "Edit issue status",

View File

@ -177,6 +177,9 @@
"EditIssue": "Редактирование {title}",
"EditWorkflowStatuses": "Редактировать статусы задач",
"EditTeam": "Редактировать команду",
"DeleteTeam": "Удалить команду",
"DeleteTeamName": "Удалить команду {name}?",
"TeamHasIssues": "Для данной команды существуют задачи, уверены, что хотите удалить? Задачи и команда будут удалены.",
"ManageWorkflowStatuses": "Управлять статусами задач для команды",
"AddWorkflowStatus": "Добавить статус задачи",
"EditWorkflowStatus": "Редактировать статус задачи",

View File

@ -119,7 +119,8 @@ import {
getAllStatuses,
getAllPriority,
getAllProjects,
getAllSprints
getAllSprints,
removeTeam
} from './utils'
import { deleteObject } from '@hcengineering/view-resources/src/utils'
@ -201,6 +202,31 @@ async function editTeam (team: Team | undefined): Promise<void> {
}
}
async function deleteTeam (team: Team | undefined): Promise<void> {
if (team !== undefined) {
const client = getClient()
const anyIssue = await client.findOne(tracker.class.Issue, { space: team._id })
if (anyIssue !== undefined) {
showPopup(
MessageBox,
{
label: tracker.string.DeleteTeamName,
labelProps: { name: team.name },
message: tracker.string.TeamHasIssues
},
undefined,
(result?: boolean) => {
if (result === true) {
void removeTeam(team)
}
}
)
} else {
await removeTeam(team)
}
}
}
async function moveAndDeleteSprints (client: TxOperations, oldSprints: Sprint[], newSprint?: Sprint): Promise<void> {
const noSprintLabel = await translate(tracker.string.NoSprint, {})
@ -412,7 +438,8 @@ export default async (): Promise<Resources> => ({
actionImpl: {
EditWorkflowStatuses: editWorkflowStatuses,
EditTeam: editTeam,
DeleteSprint: deleteSprint
DeleteSprint: deleteSprint,
DeleteTeam: deleteTeam
},
resolver: {
Location: resolveLocation

View File

@ -96,6 +96,9 @@ export default mergeIds(trackerId, tracker, {
IssueStatuses: '' as IntlString,
EditWorkflowStatuses: '' as IntlString,
EditTeam: '' as IntlString,
DeleteTeam: '' as IntlString,
DeleteTeamName: '' as IntlString,
TeamHasIssues: '' as IntlString,
ManageWorkflowStatuses: '' as IntlString,
AddWorkflowStatus: '' as IntlString,
EditWorkflowStatus: '' as IntlString,

View File

@ -30,7 +30,7 @@ import core, {
} from '@hcengineering/core'
import { TypeState } from '@hcengineering/kanban'
import { Asset, IntlString, translate } from '@hcengineering/platform'
import { createQuery } from '@hcengineering/presentation'
import { createQuery, getClient } from '@hcengineering/presentation'
import {
Issue,
IssuePriority,
@ -650,3 +650,8 @@ export async function getPreviousAssignees (
)
})
}
export async function removeTeam (teamToDelete: Team): Promise<void> {
const client = getClient()
await client.removeDoc(tracker.class.Team, core.space.Space, teamToDelete._id)
}

View File

@ -36,7 +36,7 @@ import { getMetadata } from '@hcengineering/platform'
import { Resource } from '@hcengineering/platform/lib/platform'
import { TriggerControl } from '@hcengineering/server-core'
import { addAssigneeNotification } from '@hcengineering/server-task-resources'
import tracker, { Issue, IssueParentInfo, Project, TimeSpendReport, trackerId } from '@hcengineering/tracker'
import tracker, { Issue, IssueParentInfo, Project, Team, TimeSpendReport, trackerId } from '@hcengineering/tracker'
async function updateSubIssues (
updateTx: TxUpdateDoc<Issue>,
@ -96,6 +96,32 @@ export async function addTrackerAssigneeNotification (
)
}
/**
* @public
*/
export async function OnTeamDelete (tx: Tx, control: TriggerControl): Promise<Tx[]> {
const actualTx = TxProcessor.extractTx(tx)
if (actualTx._class !== core.class.TxRemoveDoc) {
return []
}
const ctx = actualTx as TxRemoveDoc<Team>
if (ctx.objectClass !== tracker.class.Team) {
return []
}
const issues = await control.findAll(tracker.class.Issue, {
space: ctx.objectId
})
const res: Tx[] = []
issues.forEach((issue) => {
res.push(control.txFactory.createTxRemoveDoc(issue._class, issue.space, issue._id))
})
return res
}
/**
* @public
*/
@ -202,7 +228,8 @@ export default async () => ({
},
trigger: {
OnIssueUpdate,
OnProjectRemove
OnProjectRemove,
OnTeamDelete
}
})

View File

@ -33,6 +33,7 @@ export default plugin(serverTrackerId, {
},
trigger: {
OnIssueUpdate: '' as Resource<TriggerFunc>,
OnProjectRemove: '' as Resource<TriggerFunc>
OnProjectRemove: '' as Resource<TriggerFunc>,
OnTeamDelete: '' as Resource<TriggerFunc>
}
})