2022-06-08 14:03:26 +00:00
|
|
|
<script lang="ts">
|
2023-02-10 16:45:14 +00:00
|
|
|
import { DocumentQuery, Ref, Space, WithLookup } from '@hcengineering/core'
|
2022-09-21 08:08:25 +00:00
|
|
|
import { IntlString, translate } from '@hcengineering/platform'
|
2023-02-10 16:45:14 +00:00
|
|
|
import { getClient } from '@hcengineering/presentation'
|
|
|
|
import { Issue } from '@hcengineering/tracker'
|
2023-01-18 07:53:37 +00:00
|
|
|
import { Button, IconDetails, IconDetailsFilled } from '@hcengineering/ui'
|
2022-09-21 08:08:25 +00:00
|
|
|
import view, { Viewlet } from '@hcengineering/view'
|
2023-01-21 14:16:14 +00:00
|
|
|
import { FilterBar, getActiveViewletId, getViewOptions, setActiveViewletId } from '@hcengineering/view-resources'
|
2023-01-18 07:53:37 +00:00
|
|
|
import ViewletSettingButton from '@hcengineering/view-resources/src/components/ViewletSettingButton.svelte'
|
|
|
|
import tracker from '../../plugin'
|
2022-06-08 14:03:26 +00:00
|
|
|
import IssuesContent from './IssuesContent.svelte'
|
|
|
|
import IssuesHeader from './IssuesHeader.svelte'
|
|
|
|
|
2023-01-13 15:23:04 +00:00
|
|
|
export let space: Ref<Space> | undefined = undefined
|
2022-06-15 18:04:37 +00:00
|
|
|
export let query: DocumentQuery<Issue> = {}
|
2022-06-08 14:03:26 +00:00
|
|
|
export let title: IntlString | undefined = undefined
|
|
|
|
export let label: string = ''
|
|
|
|
|
2022-06-08 15:49:50 +00:00
|
|
|
export let panelWidth: number = 0
|
|
|
|
|
2022-06-08 14:03:26 +00:00
|
|
|
let viewlet: WithLookup<Viewlet> | undefined = undefined
|
2022-06-23 06:04:51 +00:00
|
|
|
let search = ''
|
|
|
|
let searchQuery: DocumentQuery<Issue> = { ...query }
|
|
|
|
function updateSearchQuery (search: string): void {
|
|
|
|
searchQuery = search === '' ? { ...query } : { ...query, $search: search }
|
|
|
|
}
|
|
|
|
$: if (query) updateSearchQuery(search)
|
|
|
|
let resultQuery: DocumentQuery<Issue> = { ...searchQuery }
|
2022-06-08 14:03:26 +00:00
|
|
|
|
|
|
|
const client = getClient()
|
|
|
|
|
|
|
|
let viewlets: WithLookup<Viewlet>[] = []
|
|
|
|
|
2022-06-23 11:09:18 +00:00
|
|
|
$: update()
|
2022-06-08 14:03:26 +00:00
|
|
|
|
2022-06-23 11:09:18 +00:00
|
|
|
async function update (): Promise<void> {
|
|
|
|
viewlets = await client.findAll(
|
|
|
|
view.class.Viewlet,
|
2023-01-18 07:53:37 +00:00
|
|
|
{ attachTo: tracker.class.Issue, variant: { $ne: 'subissue' } },
|
2022-06-23 11:09:18 +00:00
|
|
|
{
|
|
|
|
lookup: {
|
|
|
|
descriptor: view.class.ViewletDescriptor
|
2022-06-08 14:03:26 +00:00
|
|
|
}
|
2022-06-23 11:09:18 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
const _id = getActiveViewletId()
|
|
|
|
viewlet = viewlets.find((viewlet) => viewlet._id === _id) || viewlets[0]
|
2023-01-21 14:16:14 +00:00
|
|
|
setActiveViewletId(viewlet._id)
|
2022-06-08 14:03:26 +00:00
|
|
|
}
|
|
|
|
$: if (!label && title) {
|
|
|
|
translate(title, {}).then((res) => {
|
|
|
|
label = res
|
|
|
|
})
|
|
|
|
}
|
2022-06-08 15:49:50 +00:00
|
|
|
|
|
|
|
let asideFloat: boolean = false
|
|
|
|
let asideShown: boolean = true
|
|
|
|
$: if (panelWidth < 900 && !asideFloat) asideFloat = true
|
|
|
|
$: if (panelWidth >= 900 && asideFloat) {
|
|
|
|
asideFloat = false
|
|
|
|
asideShown = false
|
|
|
|
}
|
|
|
|
let docWidth: number
|
|
|
|
let docSize: boolean = false
|
|
|
|
$: if (docWidth <= 900 && !docSize) docSize = true
|
|
|
|
$: if (docWidth > 900 && docSize) docSize = false
|
2022-12-15 05:08:53 +00:00
|
|
|
|
2023-01-18 07:53:37 +00:00
|
|
|
$: viewOptions = getViewOptions(viewlet)
|
2022-06-08 14:03:26 +00:00
|
|
|
</script>
|
|
|
|
|
2023-01-13 15:23:04 +00:00
|
|
|
<IssuesHeader {viewlets} {label} {space} bind:viewlet bind:search showLabelSelector={$$slots.label_selector}>
|
2022-08-03 07:05:19 +00:00
|
|
|
<svelte:fragment slot="label_selector">
|
|
|
|
<slot name="label_selector" />
|
|
|
|
</svelte:fragment>
|
2022-06-23 11:09:18 +00:00
|
|
|
<svelte:fragment slot="extra">
|
2022-07-10 15:29:59 +00:00
|
|
|
{#if viewlet}
|
2023-01-18 07:53:37 +00:00
|
|
|
<ViewletSettingButton bind:viewOptions {viewlet} />
|
2022-07-10 15:29:59 +00:00
|
|
|
{/if}
|
2022-06-23 11:09:18 +00:00
|
|
|
{#if asideFloat && $$slots.aside}
|
2022-08-21 07:03:00 +00:00
|
|
|
<div class="buttons-divider" />
|
2022-06-23 11:09:18 +00:00
|
|
|
<Button
|
2022-08-21 07:03:00 +00:00
|
|
|
icon={asideShown ? IconDetailsFilled : IconDetails}
|
2022-06-23 11:09:18 +00:00
|
|
|
kind={'transparent'}
|
|
|
|
size={'medium'}
|
|
|
|
selected={asideShown}
|
|
|
|
on:click={() => {
|
|
|
|
asideShown = !asideShown
|
|
|
|
}}
|
|
|
|
/>
|
2022-06-20 14:11:14 +00:00
|
|
|
{/if}
|
2022-06-23 11:09:18 +00:00
|
|
|
</svelte:fragment>
|
|
|
|
</IssuesHeader>
|
|
|
|
<slot name="afterHeader" />
|
2023-01-21 14:16:14 +00:00
|
|
|
<FilterBar _class={tracker.class.Issue} query={searchQuery} {viewOptions} on:change={(e) => (resultQuery = e.detail)} />
|
2022-06-23 11:09:18 +00:00
|
|
|
<div class="flex w-full h-full clear-mins">
|
2023-02-10 16:45:14 +00:00
|
|
|
{#if viewlet}
|
|
|
|
<IssuesContent {viewlet} query={resultQuery} {space} {viewOptions} />
|
2022-06-23 11:09:18 +00:00
|
|
|
{/if}
|
|
|
|
{#if $$slots.aside !== undefined && asideShown}
|
2022-08-03 07:05:19 +00:00
|
|
|
<div class="popupPanel-body__aside flex" class:float={asideFloat} class:shown={asideShown}>
|
2022-06-23 11:09:18 +00:00
|
|
|
<slot name="aside" />
|
|
|
|
</div>
|
|
|
|
{/if}
|
|
|
|
</div>
|