2022-06-08 14:03:26 +00:00
|
|
|
<script lang="ts">
|
2022-06-20 14:11:14 +00:00
|
|
|
import { Scroller } from '@anticrm/ui'
|
2022-06-08 14:03:26 +00:00
|
|
|
import IssuesListBrowser from './IssuesListBrowser.svelte'
|
|
|
|
import tracker from '../../plugin'
|
2022-06-23 11:09:18 +00:00
|
|
|
import { Issue, IssueStatus, ViewOptions } from '@anticrm/tracker'
|
|
|
|
import { Class, Doc, DocumentQuery, Ref, SortingOrder, WithLookup } from '@anticrm/core'
|
2022-06-08 14:03:26 +00:00
|
|
|
import {
|
|
|
|
getCategories,
|
|
|
|
groupBy as groupByFunc,
|
|
|
|
issuesGroupKeyMap,
|
|
|
|
issuesOrderKeyMap,
|
|
|
|
issuesSortOrderMap
|
|
|
|
} from '../../utils'
|
|
|
|
import { createQuery } from '@anticrm/presentation'
|
|
|
|
import contact, { Employee } from '@anticrm/contact'
|
|
|
|
import { BuildModelKey } from '@anticrm/view'
|
|
|
|
|
|
|
|
export let _class: Ref<Class<Doc>>
|
|
|
|
export let config: (string | BuildModelKey)[]
|
2022-06-23 11:09:18 +00:00
|
|
|
export let query: DocumentQuery<Issue> = {}
|
2022-06-10 09:44:46 +00:00
|
|
|
export let viewOptions: ViewOptions
|
2022-06-08 14:03:26 +00:00
|
|
|
|
2022-06-23 11:09:18 +00:00
|
|
|
$: currentSpace = typeof query.space === 'string' ? query.space : tracker.team.DefaultTeam
|
2022-06-10 09:44:46 +00:00
|
|
|
$: ({ groupBy, orderBy, shouldShowEmptyGroups, shouldShowSubIssues } = viewOptions)
|
2022-06-08 14:03:26 +00:00
|
|
|
$: groupByKey = issuesGroupKeyMap[groupBy]
|
|
|
|
$: orderByKey = issuesOrderKeyMap[orderBy]
|
2022-06-10 09:44:46 +00:00
|
|
|
$: subIssuesQuery = shouldShowSubIssues ? {} : { attachedTo: tracker.ids.NoParent }
|
2022-06-08 14:03:26 +00:00
|
|
|
|
|
|
|
const statusesQuery = createQuery()
|
|
|
|
let statuses: IssueStatus[] = []
|
|
|
|
$: statusesQuery.query(
|
|
|
|
tracker.class.IssueStatus,
|
|
|
|
{ attachedTo: currentSpace },
|
|
|
|
(result) => {
|
2022-06-08 15:49:38 +00:00
|
|
|
statuses = [...result]
|
2022-06-08 14:03:26 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
lookup: { category: tracker.class.IssueStatusCategory },
|
|
|
|
sort: { rank: SortingOrder.Ascending }
|
|
|
|
}
|
|
|
|
)
|
|
|
|
$: groupedIssues = groupByFunc(issues, groupBy)
|
|
|
|
$: categories = getCategories(groupByKey, issues, !!shouldShowEmptyGroups, statuses, employees)
|
|
|
|
$: employees = issues.map((x) => x.$lookup?.assignee).filter(Boolean) as Employee[]
|
|
|
|
|
|
|
|
const issuesQuery = createQuery()
|
|
|
|
let issues: WithLookup<Issue>[] = []
|
|
|
|
$: issuesQuery.query(
|
|
|
|
tracker.class.Issue,
|
2022-06-10 09:44:46 +00:00
|
|
|
{ ...subIssuesQuery, ...query },
|
2022-06-08 14:03:26 +00:00
|
|
|
(result) => {
|
|
|
|
issues = result
|
|
|
|
},
|
|
|
|
{
|
|
|
|
sort: { [orderByKey]: issuesSortOrderMap[orderByKey] },
|
|
|
|
limit: 200,
|
2022-06-14 16:54:25 +00:00
|
|
|
lookup: {
|
|
|
|
assignee: contact.class.Employee,
|
|
|
|
status: tracker.class.IssueStatus,
|
2022-08-16 10:19:33 +00:00
|
|
|
space: tracker.class.Team,
|
2022-08-22 18:55:45 +00:00
|
|
|
sprint: tracker.class.Sprint,
|
|
|
|
_id: {
|
|
|
|
subIssues: tracker.class.Issue
|
|
|
|
}
|
2022-06-14 16:54:25 +00:00
|
|
|
}
|
2022-06-08 14:03:26 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
</script>
|
|
|
|
|
2022-06-20 14:11:14 +00:00
|
|
|
<div class="w-full h-full clear-mins">
|
2022-08-25 03:11:10 +00:00
|
|
|
<Scroller tableFade={categories[0] !== undefined} fadeTopOffset={48}>
|
2022-06-20 14:11:14 +00:00
|
|
|
<IssuesListBrowser
|
|
|
|
{_class}
|
|
|
|
{currentSpace}
|
|
|
|
{groupByKey}
|
|
|
|
orderBy={orderByKey}
|
|
|
|
{statuses}
|
|
|
|
{employees}
|
|
|
|
{categories}
|
|
|
|
itemsConfig={config}
|
|
|
|
{groupedIssues}
|
|
|
|
/>
|
|
|
|
</Scroller>
|
|
|
|
</div>
|