2022-03-31 08:32:42 +00:00
|
|
|
//
|
|
|
|
// Copyright © 2020, 2021 Anticrm Platform Contributors.
|
|
|
|
//
|
|
|
|
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License. You may
|
|
|
|
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
//
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
//
|
|
|
|
|
2022-11-21 05:44:46 +00:00
|
|
|
import { Class, Client, DocumentQuery, Ref, RelatedDocument, TxOperations } from '@hcengineering/core'
|
|
|
|
import { Resources, translate } from '@hcengineering/platform'
|
|
|
|
import { getClient, MessageBox, ObjectSearchResult } from '@hcengineering/presentation'
|
|
|
|
import { Issue, Sprint, Team } from '@hcengineering/tracker'
|
2022-09-21 08:08:25 +00:00
|
|
|
import { showPopup } from '@hcengineering/ui'
|
2022-09-09 03:44:33 +00:00
|
|
|
import CreateIssue from './components/CreateIssue.svelte'
|
2022-11-09 11:24:02 +00:00
|
|
|
import CreateIssueTemplate from './components/templates/CreateIssueTemplate.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import Inbox from './components/inbox/Inbox.svelte'
|
2022-03-31 08:32:42 +00:00
|
|
|
import Active from './components/issues/Active.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import AssigneePresenter from './components/issues/AssigneePresenter.svelte'
|
2022-03-31 08:32:42 +00:00
|
|
|
import Backlog from './components/issues/Backlog.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import DueDatePresenter from './components/issues/DueDatePresenter.svelte'
|
|
|
|
import EditIssue from './components/issues/edit/EditIssue.svelte'
|
|
|
|
import IssueItem from './components/issues/IssueItem.svelte'
|
2022-03-31 08:32:42 +00:00
|
|
|
import IssuePresenter from './components/issues/IssuePresenter.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import IssuePreview from './components/issues/IssuePreview.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import Issues from './components/issues/Issues.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import IssuesView from './components/issues/IssuesView.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import KanbanView from './components/issues/KanbanView.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import ModificationDatePresenter from './components/issues/ModificationDatePresenter.svelte'
|
2023-01-14 10:54:54 +00:00
|
|
|
import PriorityRefPresenter from './components/issues/PriorityRefPresenter.svelte'
|
2022-05-04 15:08:24 +00:00
|
|
|
import PriorityEditor from './components/issues/PriorityEditor.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import PriorityPresenter from './components/issues/PriorityPresenter.svelte'
|
2022-05-04 13:46:34 +00:00
|
|
|
import StatusEditor from './components/issues/StatusEditor.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import StatusPresenter from './components/issues/StatusPresenter.svelte'
|
|
|
|
import TitlePresenter from './components/issues/TitlePresenter.svelte'
|
|
|
|
import MyIssues from './components/myissues/MyIssues.svelte'
|
|
|
|
import NewIssueHeader from './components/NewIssueHeader.svelte'
|
|
|
|
import NopeComponent from './components/NopeComponent.svelte'
|
|
|
|
import EditProject from './components/projects/EditProject.svelte'
|
2022-05-18 05:35:34 +00:00
|
|
|
import IconPresenter from './components/projects/IconPresenter.svelte'
|
|
|
|
import LeadPresenter from './components/projects/LeadPresenter.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import ProjectEditor from './components/projects/ProjectEditor.svelte'
|
2022-05-18 05:35:34 +00:00
|
|
|
import ProjectMembersPresenter from './components/projects/ProjectMembersPresenter.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import ProjectPresenter from './components/projects/ProjectPresenter.svelte'
|
|
|
|
import Projects from './components/projects/Projects.svelte'
|
2022-06-09 14:54:54 +00:00
|
|
|
import ProjectStatusEditor from './components/projects/ProjectStatusEditor.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import ProjectStatusPresenter from './components/projects/ProjectStatusPresenter.svelte'
|
|
|
|
import ProjectTitlePresenter from './components/projects/ProjectTitlePresenter.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import Roadmap from './components/projects/Roadmap.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import TargetDatePresenter from './components/projects/TargetDatePresenter.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import TeamProjects from './components/projects/TeamProjects.svelte'
|
|
|
|
import RelationsPopup from './components/RelationsPopup.svelte'
|
2022-06-10 15:48:14 +00:00
|
|
|
import SetDueDateActionPopup from './components/SetDueDateActionPopup.svelte'
|
|
|
|
import SetParentIssueActionPopup from './components/SetParentIssueActionPopup.svelte'
|
|
|
|
import Views from './components/views/Views.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import Statuses from './components/workflow/Statuses.svelte'
|
2022-10-14 05:45:04 +00:00
|
|
|
import {
|
|
|
|
getIssueId,
|
|
|
|
getIssueTitle,
|
|
|
|
issueIdProvider,
|
|
|
|
issueLinkProvider,
|
|
|
|
issueTitleProvider,
|
|
|
|
resolveLocation
|
|
|
|
} from './issues'
|
2022-09-09 03:44:33 +00:00
|
|
|
import tracker from './plugin'
|
2022-04-12 17:41:32 +00:00
|
|
|
|
2022-09-09 03:44:33 +00:00
|
|
|
import SprintEditor from './components/sprints/SprintEditor.svelte'
|
2022-08-03 07:05:19 +00:00
|
|
|
import SprintPresenter from './components/sprints/SprintPresenter.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import Sprints from './components/sprints/Sprints.svelte'
|
|
|
|
import SprintSelector from './components/sprints/SprintSelector.svelte'
|
2022-11-22 11:39:37 +00:00
|
|
|
import SprintMembersPresenter from './components/sprints/SprintMembersPresenter.svelte'
|
2022-08-03 07:05:19 +00:00
|
|
|
import SprintStatusPresenter from './components/sprints/SprintStatusPresenter.svelte'
|
|
|
|
import SprintTitlePresenter from './components/sprints/SprintTitlePresenter.svelte'
|
|
|
|
|
2022-08-22 18:55:45 +00:00
|
|
|
import SubIssuesSelector from './components/issues/edit/SubIssuesSelector.svelte'
|
2022-09-09 03:44:33 +00:00
|
|
|
import EstimationEditor from './components/issues/timereport/EstimationEditor.svelte'
|
|
|
|
import ReportedTimeEditor from './components/issues/timereport/ReportedTimeEditor.svelte'
|
|
|
|
import TimeSpendReport from './components/issues/timereport/TimeSpendReport.svelte'
|
2022-08-16 10:19:33 +00:00
|
|
|
|
2022-09-14 04:53:48 +00:00
|
|
|
import RelatedIssues from './components/issues/related/RelatedIssues.svelte'
|
2022-11-09 11:24:02 +00:00
|
|
|
import RelatedIssueTemplates from './components/issues/related/RelatedIssueTemplates.svelte'
|
2022-09-14 04:53:48 +00:00
|
|
|
|
2022-09-21 17:32:48 +00:00
|
|
|
import ProjectSelector from './components/ProjectSelector.svelte'
|
|
|
|
|
2022-10-05 06:41:02 +00:00
|
|
|
import IssueTemplatePresenter from './components/templates/IssueTemplatePresenter.svelte'
|
|
|
|
import IssueTemplates from './components/templates/IssueTemplates.svelte'
|
|
|
|
|
|
|
|
import EditIssueTemplate from './components/templates/EditIssueTemplate.svelte'
|
2022-10-06 09:41:55 +00:00
|
|
|
import TemplateEstimationEditor from './components/templates/EstimationEditor.svelte'
|
2022-11-21 05:44:46 +00:00
|
|
|
import MoveAndDeleteSprintPopup from './components/sprints/MoveAndDeleteSprintPopup.svelte'
|
2023-01-14 10:54:54 +00:00
|
|
|
import { moveIssuesToAnotherSprint, issueStatusSort, issuePrioritySort, sprintSort, subIssueQuery } from './utils'
|
2022-11-21 05:44:46 +00:00
|
|
|
import { deleteObject } from '@hcengineering/view-resources/src/utils'
|
2022-10-05 06:41:02 +00:00
|
|
|
|
2022-11-17 04:31:42 +00:00
|
|
|
import CreateTeam from './components/teams/CreateTeam.svelte'
|
|
|
|
import TeamPresenter from './components/teams/TeamPresenter.svelte'
|
2023-01-14 10:54:54 +00:00
|
|
|
import IssueStatistics from './components/sprints/IssueStatistics.svelte'
|
|
|
|
import StatusRefPresenter from './components/issues/StatusRefPresenter.svelte'
|
|
|
|
import SprintRefPresenter from './components/sprints/SprintRefPresenter.svelte'
|
2022-11-17 04:31:42 +00:00
|
|
|
|
2022-06-10 15:48:14 +00:00
|
|
|
export async function queryIssue<D extends Issue> (
|
|
|
|
_class: Ref<Class<D>>,
|
|
|
|
client: Client,
|
2022-09-09 03:44:33 +00:00
|
|
|
search: string,
|
|
|
|
filter?: { in?: RelatedDocument[], nin?: RelatedDocument[] }
|
2022-06-10 15:48:14 +00:00
|
|
|
): Promise<ObjectSearchResult[]> {
|
|
|
|
const teams = await client.findAll<Team>(tracker.class.Team, {})
|
|
|
|
|
2022-09-09 03:44:33 +00:00
|
|
|
const q: DocumentQuery<Issue> = { title: { $like: `%${search}%` } }
|
|
|
|
if (filter?.in !== undefined || filter?.nin !== undefined) {
|
|
|
|
q._id = {}
|
|
|
|
if (filter.in !== undefined) {
|
|
|
|
q._id.$in = filter.in?.map((it) => it._id as Ref<Issue>)
|
|
|
|
}
|
|
|
|
if (filter.nin !== undefined) {
|
|
|
|
q._id.$nin = filter.nin?.map((it) => it._id as Ref<Issue>)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-10 15:48:14 +00:00
|
|
|
const named = new Map(
|
|
|
|
(
|
2022-09-09 03:44:33 +00:00
|
|
|
await client.findAll<Issue>(_class, q, {
|
|
|
|
limit: 200,
|
|
|
|
lookup: { space: tracker.class.Team }
|
|
|
|
})
|
2022-06-10 15:48:14 +00:00
|
|
|
).map((e) => [e._id, e])
|
|
|
|
)
|
|
|
|
for (const currentTeam of teams) {
|
|
|
|
const nids: number[] = []
|
2022-09-09 03:44:33 +00:00
|
|
|
for (let n = 0; n <= currentTeam.sequence; n++) {
|
2022-06-10 15:48:14 +00:00
|
|
|
const v = `${currentTeam.identifier}-${n}`
|
|
|
|
if (v.includes(search)) {
|
|
|
|
nids.push(n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (nids.length > 0) {
|
2022-09-09 03:44:33 +00:00
|
|
|
const q2: DocumentQuery<Issue> = { number: { $in: nids } }
|
|
|
|
if (q._id !== undefined) {
|
|
|
|
q2._id = q._id
|
|
|
|
}
|
|
|
|
const numbered = await client.findAll<Issue>(_class, q2, { limit: 200, lookup: { space: tracker.class.Team } })
|
2022-06-10 15:48:14 +00:00
|
|
|
for (const d of numbered) {
|
|
|
|
if (!named.has(d._id)) {
|
|
|
|
named.set(d._id, d)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Array.from(named.values()).map((e) => ({
|
|
|
|
doc: e,
|
|
|
|
title: getIssueId(e.$lookup?.space as Team, e),
|
|
|
|
icon: tracker.icon.TrackerApplication,
|
|
|
|
component: IssueItem
|
|
|
|
}))
|
|
|
|
}
|
2022-06-27 15:56:24 +00:00
|
|
|
|
2022-07-01 15:24:58 +00:00
|
|
|
async function editWorkflowStatuses (team: Team | undefined): Promise<void> {
|
|
|
|
if (team !== undefined) {
|
|
|
|
showPopup(Statuses, { teamId: team._id, teamClass: team._class }, 'float')
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-07 09:40:19 +00:00
|
|
|
async function editTeam (team: Team | undefined): Promise<void> {
|
|
|
|
if (team !== undefined) {
|
|
|
|
showPopup(CreateTeam, { team })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-21 05:44:46 +00:00
|
|
|
async function moveAndDeleteSprint (client: TxOperations, oldSprint: Sprint, newSprint?: Sprint): Promise<void> {
|
|
|
|
const noSprintLabel = await translate(tracker.string.NoSprint, {})
|
|
|
|
|
|
|
|
showPopup(
|
|
|
|
MessageBox,
|
|
|
|
{
|
|
|
|
label: tracker.string.MoveAndDeleteSprint,
|
|
|
|
message: tracker.string.MoveAndDeleteSprintConfirm,
|
|
|
|
labelProps: { newSprint: newSprint?.label ?? noSprintLabel, deleteSprint: oldSprint.label }
|
|
|
|
},
|
|
|
|
undefined,
|
|
|
|
(result?: boolean) => {
|
|
|
|
if (result === true) {
|
|
|
|
void moveIssuesToAnotherSprint(client, oldSprint, newSprint).then((succes) => {
|
|
|
|
if (succes) {
|
|
|
|
void deleteObject(client, oldSprint)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
async function deleteSprint (sprint: Sprint): Promise<void> {
|
|
|
|
const client = getClient()
|
|
|
|
// Check if available to move issues to another sprint
|
|
|
|
const firstSearchedSprint = await client.findOne(tracker.class.Sprint, { _id: { $nin: [sprint._id] } })
|
|
|
|
if (firstSearchedSprint !== undefined) {
|
|
|
|
showPopup(
|
|
|
|
MoveAndDeleteSprintPopup,
|
|
|
|
{
|
|
|
|
sprint,
|
|
|
|
moveAndDeleteSprint: async (selectedSprint?: Sprint) =>
|
|
|
|
await moveAndDeleteSprint(client, sprint, selectedSprint)
|
|
|
|
},
|
|
|
|
'top'
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
await moveAndDeleteSprint(client, sprint)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-31 08:32:42 +00:00
|
|
|
export default async (): Promise<Resources> => ({
|
|
|
|
component: {
|
|
|
|
NopeComponent,
|
2022-06-28 06:53:39 +00:00
|
|
|
Issues,
|
2022-03-31 08:32:42 +00:00
|
|
|
Active,
|
|
|
|
Backlog,
|
|
|
|
Inbox,
|
|
|
|
MyIssues,
|
|
|
|
Projects,
|
|
|
|
Views,
|
|
|
|
IssuePresenter,
|
2022-04-27 08:18:59 +00:00
|
|
|
ProjectPresenter,
|
2022-05-18 04:04:54 +00:00
|
|
|
ProjectTitlePresenter,
|
2022-04-08 18:05:49 +00:00
|
|
|
TitlePresenter,
|
|
|
|
ModificationDatePresenter,
|
2022-04-12 17:04:29 +00:00
|
|
|
PriorityPresenter,
|
2022-05-04 15:08:24 +00:00
|
|
|
PriorityEditor,
|
2023-01-14 10:54:54 +00:00
|
|
|
PriorityRefPresenter,
|
|
|
|
SprintRefPresenter,
|
2022-05-16 10:38:51 +00:00
|
|
|
ProjectEditor,
|
2022-04-12 17:41:32 +00:00
|
|
|
StatusPresenter,
|
2022-05-04 13:46:34 +00:00
|
|
|
StatusEditor,
|
2022-04-12 18:12:59 +00:00
|
|
|
AssigneePresenter,
|
2022-04-14 06:07:07 +00:00
|
|
|
DueDatePresenter,
|
2022-03-31 08:32:42 +00:00
|
|
|
EditIssue,
|
2022-04-20 06:06:05 +00:00
|
|
|
NewIssueHeader,
|
2022-05-18 05:35:34 +00:00
|
|
|
IconPresenter,
|
|
|
|
LeadPresenter,
|
|
|
|
TargetDatePresenter,
|
|
|
|
ProjectMembersPresenter,
|
2022-05-19 10:37:14 +00:00
|
|
|
ProjectStatusPresenter,
|
2022-06-09 14:54:54 +00:00
|
|
|
ProjectStatusEditor,
|
2022-05-23 07:24:15 +00:00
|
|
|
SetDueDateActionPopup,
|
2022-06-06 13:44:21 +00:00
|
|
|
SetParentIssueActionPopup,
|
2022-06-08 14:03:26 +00:00
|
|
|
EditProject,
|
|
|
|
IssuesView,
|
2022-06-15 04:59:43 +00:00
|
|
|
KanbanView,
|
2022-06-24 06:05:05 +00:00
|
|
|
TeamProjects,
|
|
|
|
Roadmap,
|
2022-06-24 12:36:08 +00:00
|
|
|
IssuePreview,
|
2022-07-01 06:14:31 +00:00
|
|
|
RelationsPopup,
|
2022-08-03 07:05:19 +00:00
|
|
|
CreateIssue,
|
2022-11-09 11:24:02 +00:00
|
|
|
CreateIssueTemplate,
|
2022-08-03 07:05:19 +00:00
|
|
|
Sprints,
|
|
|
|
SprintPresenter,
|
2022-11-22 11:39:37 +00:00
|
|
|
SprintMembersPresenter,
|
2022-08-03 07:05:19 +00:00
|
|
|
SprintStatusPresenter,
|
|
|
|
SprintTitlePresenter,
|
|
|
|
SprintSelector,
|
2022-08-16 10:19:33 +00:00
|
|
|
SprintEditor,
|
|
|
|
ReportedTimeEditor,
|
|
|
|
TimeSpendReport,
|
2022-08-22 18:55:45 +00:00
|
|
|
EstimationEditor,
|
|
|
|
SubIssuesSelector,
|
2022-09-21 17:32:48 +00:00
|
|
|
RelatedIssues,
|
2022-11-09 11:24:02 +00:00
|
|
|
RelatedIssueTemplates,
|
2022-10-05 06:41:02 +00:00
|
|
|
ProjectSelector,
|
|
|
|
IssueTemplates,
|
|
|
|
IssueTemplatePresenter,
|
2022-10-06 09:41:55 +00:00
|
|
|
EditIssueTemplate,
|
2022-11-17 04:31:42 +00:00
|
|
|
TemplateEstimationEditor,
|
|
|
|
CreateTeam,
|
2023-01-14 10:54:54 +00:00
|
|
|
TeamPresenter,
|
|
|
|
IssueStatistics,
|
|
|
|
StatusRefPresenter
|
2022-06-06 13:44:21 +00:00
|
|
|
},
|
2022-06-10 15:48:14 +00:00
|
|
|
completion: {
|
2022-09-09 03:44:33 +00:00
|
|
|
IssueQuery: async (client: Client, query: string, filter?: { in?: RelatedDocument[], nin?: RelatedDocument[] }) =>
|
|
|
|
await queryIssue(tracker.class.Issue, client, query, filter)
|
2022-06-24 07:46:53 +00:00
|
|
|
},
|
|
|
|
function: {
|
2022-10-14 05:45:04 +00:00
|
|
|
IssueTitleProvider: getIssueTitle,
|
|
|
|
GetIssueId: issueIdProvider,
|
|
|
|
GetIssueLink: issueLinkProvider,
|
2023-01-14 10:54:54 +00:00
|
|
|
GetIssueTitle: issueTitleProvider,
|
|
|
|
IssueStatusSort: issueStatusSort,
|
|
|
|
IssuePrioritySort: issuePrioritySort,
|
|
|
|
SprintSort: sprintSort,
|
|
|
|
SubIssueQuery: subIssueQuery
|
2022-06-27 15:56:24 +00:00
|
|
|
},
|
|
|
|
actionImpl: {
|
2022-11-21 05:44:46 +00:00
|
|
|
EditWorkflowStatuses: editWorkflowStatuses,
|
2022-12-07 09:40:19 +00:00
|
|
|
EditTeam: editTeam,
|
2022-11-21 05:44:46 +00:00
|
|
|
DeleteSprint: deleteSprint
|
2022-06-30 03:46:46 +00:00
|
|
|
},
|
|
|
|
resolver: {
|
|
|
|
Location: resolveLocation
|
2022-03-31 08:32:42 +00:00
|
|
|
}
|
|
|
|
})
|