mirror of
https://github.com/hcengineering/platform.git
synced 2025-06-01 21:31:04 +00:00
parent
85d040010c
commit
07cc690d23
@ -16,10 +16,9 @@
|
|||||||
import { Event } from '@hcengineering/calendar'
|
import { Event } from '@hcengineering/calendar'
|
||||||
import { Class, DocumentQuery, Ref, Space, WithLookup } from '@hcengineering/core'
|
import { Class, DocumentQuery, Ref, Space, WithLookup } from '@hcengineering/core'
|
||||||
import { Asset, IntlString } from '@hcengineering/platform'
|
import { Asset, IntlString } from '@hcengineering/platform'
|
||||||
import { createQuery } from '@hcengineering/presentation'
|
import { AnyComponent, Button, Component, IconAdd, Label, Loading, showPopup } from '@hcengineering/ui'
|
||||||
import { AnyComponent, Button, Component, Label, Loading, showPopup, TabList, IconAdd } from '@hcengineering/ui'
|
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import view, { Viewlet, ViewletPreference } from '@hcengineering/view'
|
import { ViewletSelector, getViewOptions, viewOptionStore } from '@hcengineering/view-resources'
|
||||||
import { getViewOptions, setActiveViewletId, viewOptionStore } from '@hcengineering/view-resources'
|
|
||||||
import calendar from '../plugin'
|
import calendar from '../plugin'
|
||||||
// import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
// import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
||||||
|
|
||||||
@ -33,23 +32,10 @@
|
|||||||
export let createComponent: AnyComponent | undefined = calendar.component.CreateEvent
|
export let createComponent: AnyComponent | undefined = calendar.component.CreateEvent
|
||||||
export let createLabel: IntlString | undefined = calendar.string.CreateEvent
|
export let createLabel: IntlString | undefined = calendar.string.CreateEvent
|
||||||
|
|
||||||
const viewletQuery = createQuery()
|
|
||||||
const search = ''
|
const search = ''
|
||||||
let resultQuery: DocumentQuery<Event> = {}
|
let resultQuery: DocumentQuery<Event> = {}
|
||||||
|
|
||||||
let viewlets: WithLookup<Viewlet>[] = []
|
let viewlets: WithLookup<Viewlet>[] = []
|
||||||
viewletQuery.query(
|
|
||||||
view.class.Viewlet,
|
|
||||||
{ attachTo: _class },
|
|
||||||
(res) => {
|
|
||||||
viewlets = res
|
|
||||||
if (viewlet === undefined || res.findIndex((p) => p._id === viewlet?._id) === -1) {
|
|
||||||
viewlet = res[0]
|
|
||||||
setActiveViewletId(viewlet._id)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ lookup: { descriptor: view.class.ViewletDescriptor } }
|
|
||||||
)
|
|
||||||
|
|
||||||
function updateResultQuery (search: string): void {
|
function updateResultQuery (search: string): void {
|
||||||
resultQuery = search === '' ? { ...query } : { ...query, $search: search }
|
resultQuery = search === '' ? { ...query } : { ...query, $search: search }
|
||||||
@ -66,30 +52,9 @@
|
|||||||
|
|
||||||
let viewlet: WithLookup<Viewlet> | undefined
|
let viewlet: WithLookup<Viewlet> | undefined
|
||||||
|
|
||||||
const preferenceQuery = createQuery()
|
|
||||||
let preference: ViewletPreference | undefined
|
let preference: ViewletPreference | undefined
|
||||||
let loading = true
|
let loading = true
|
||||||
|
|
||||||
$: viewlet &&
|
|
||||||
preferenceQuery.query(
|
|
||||||
view.class.ViewletPreference,
|
|
||||||
{
|
|
||||||
attachedTo: viewlet._id
|
|
||||||
},
|
|
||||||
(res) => {
|
|
||||||
preference = res[0]
|
|
||||||
loading = false
|
|
||||||
},
|
|
||||||
{ limit: 1 }
|
|
||||||
)
|
|
||||||
$: viewslist = viewlets.map((views) => {
|
|
||||||
return {
|
|
||||||
id: views._id,
|
|
||||||
icon: views.$lookup?.descriptor?.icon,
|
|
||||||
tooltip: views.$lookup?.descriptor?.label
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
$: viewOptions = getViewOptions(viewlet, $viewOptionStore)
|
$: viewOptions = getViewOptions(viewlet, $viewOptionStore)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -99,16 +64,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ac-header-full medium-gap mb-1">
|
<div class="ac-header-full medium-gap mb-1">
|
||||||
{#if viewlets.length > 1}
|
<ViewletSelector bind:viewlet bind:loading bind:preference bind:viewlets viewletQuery={{ attachTo: _class }} />
|
||||||
<TabList
|
|
||||||
items={viewslist}
|
|
||||||
multiselect={false}
|
|
||||||
selected={viewlet?._id}
|
|
||||||
on:select={(result) => {
|
|
||||||
if (result.detail !== undefined) viewlet = viewlets.find((vl) => vl._id === result.detail.id)
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
<Button icon={IconAdd} label={createLabel} kind={'accented'} on:click={showCreateDialog} />
|
<Button icon={IconAdd} label={createLabel} kind={'accented'} on:click={showCreateDialog} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,7 +18,13 @@
|
|||||||
import { ActionContext } from '@hcengineering/presentation'
|
import { ActionContext } from '@hcengineering/presentation'
|
||||||
import { Button, Label, Loading, SearchEdit, showPopup } from '@hcengineering/ui'
|
import { Button, Label, Loading, SearchEdit, showPopup } from '@hcengineering/ui'
|
||||||
import view, { Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
import view, { Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import {
|
||||||
|
FilterBar,
|
||||||
|
FilterButton,
|
||||||
|
TableBrowser,
|
||||||
|
ViewletSelector,
|
||||||
|
ViewletSettingButton
|
||||||
|
} from '@hcengineering/view-resources'
|
||||||
import contact from '../plugin'
|
import contact from '../plugin'
|
||||||
import CreateContact from './CreateContact.svelte'
|
import CreateContact from './CreateContact.svelte'
|
||||||
// import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
// import { deviceOptionsStore as deviceInfo } from '@hcengineering/ui'
|
||||||
@ -68,16 +74,17 @@
|
|||||||
<FilterButton _class={contact.class.Contact} />
|
<FilterButton _class={contact.class.Contact} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
bind:viewOptions
|
hidden
|
||||||
|
bind:viewlet
|
||||||
|
bind:preference
|
||||||
|
bind:loading
|
||||||
viewletQuery={{
|
viewletQuery={{
|
||||||
attachTo: contact.class.Contact,
|
attachTo: contact.class.Contact,
|
||||||
descriptor: view.viewlet.Table
|
descriptor: view.viewlet.Table
|
||||||
}}
|
}}
|
||||||
bind:viewlet
|
|
||||||
bind:preference
|
|
||||||
bind:loading
|
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
import { createQuery, getClient } from '@hcengineering/presentation'
|
import { createQuery, getClient } from '@hcengineering/presentation'
|
||||||
import { Button, Icon, IconAdd, Label, showPopup } from '@hcengineering/ui'
|
import { Button, Icon, IconAdd, Label, showPopup } from '@hcengineering/ui'
|
||||||
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { Table, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { Table, ViewletSelector, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
import contact from '../plugin'
|
import contact from '../plugin'
|
||||||
import UsersPopup from './UsersPopup.svelte'
|
import UsersPopup from './UsersPopup.svelte'
|
||||||
import IconMembersOutline from './icons/MembersOutline.svelte'
|
import IconMembersOutline from './icons/MembersOutline.svelte'
|
||||||
@ -75,13 +75,14 @@
|
|||||||
<Label label={contact.string.Members} />
|
<Label label={contact.string.Members} />
|
||||||
</span>
|
</span>
|
||||||
<div class="buttons-group xsmall-gap">
|
<div class="buttons-group xsmall-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
viewletQuery={{ _id: contact.viewlet.TableMember }}
|
hidden
|
||||||
kind={'ghost'}
|
|
||||||
bind:viewlet
|
bind:viewlet
|
||||||
bind:preference
|
bind:preference
|
||||||
bind:loading
|
bind:loading
|
||||||
|
viewletQuery={{ _id: contact.viewlet.TableMember }}
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton kind={'ghost'} bind:viewlet />
|
||||||
<Button id={contact.string.AddMember} icon={IconAdd} kind={'ghost'} on:click={createApp} />
|
<Button id={contact.string.AddMember} icon={IconAdd} kind={'ghost'} on:click={createApp} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
import { ActionContext } from '@hcengineering/presentation'
|
import { ActionContext } from '@hcengineering/presentation'
|
||||||
import { Label, Loading, SearchEdit } from '@hcengineering/ui'
|
import { Label, Loading, SearchEdit } from '@hcengineering/ui'
|
||||||
import view, { Viewlet, ViewletPreference } from '@hcengineering/view'
|
import view, { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { FilterButton, TableBrowser, ViewletSelector, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
import document from '../plugin'
|
import document from '../plugin'
|
||||||
|
|
||||||
export let query: DocumentQuery<Document> = {}
|
export let query: DocumentQuery<Document> = {}
|
||||||
@ -57,15 +57,17 @@
|
|||||||
<FilterButton _class={document.class.Document} />
|
<FilterButton _class={document.class.Document} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
|
hidden
|
||||||
|
bind:viewlet
|
||||||
|
bind:preference
|
||||||
|
bind:loading
|
||||||
viewletQuery={{
|
viewletQuery={{
|
||||||
attachTo: document.class.Document,
|
attachTo: document.class.Document,
|
||||||
descriptor: view.viewlet.Table
|
descriptor: view.viewlet.Table
|
||||||
}}
|
}}
|
||||||
bind:viewlet
|
|
||||||
bind:preference
|
|
||||||
bind:loading
|
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton bind:viewlet />
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
import { createQuery, getClient } from '@hcengineering/presentation'
|
import { createQuery, getClient } from '@hcengineering/presentation'
|
||||||
import { Button, IconAdd, Label, Scroller, eventToHTMLElement, showPopup } from '@hcengineering/ui'
|
import { Button, IconAdd, Label, Scroller, eventToHTMLElement, showPopup } from '@hcengineering/ui'
|
||||||
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { Table, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { Table, ViewletSelector, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
import hr from '../plugin'
|
import hr from '../plugin'
|
||||||
import { addMember } from '../utils'
|
import { addMember } from '../utils'
|
||||||
|
|
||||||
@ -73,13 +73,14 @@
|
|||||||
<Label label={hr.string.Members} />
|
<Label label={hr.string.Members} />
|
||||||
</span>
|
</span>
|
||||||
<div class="flex-row-center gap-2 reverse">
|
<div class="flex-row-center gap-2 reverse">
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
viewletQuery={{ _id: hr.viewlet.TableMember }}
|
hidden
|
||||||
kind={'ghost'}
|
|
||||||
bind:viewlet
|
bind:viewlet
|
||||||
bind:preference
|
bind:preference
|
||||||
bind:loading
|
bind:loading
|
||||||
|
viewletQuery={{ _id: hr.viewlet.TableMember }}
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton kind={'ghost'} bind:viewlet />
|
||||||
<Button id={hr.string.AddEmployee} icon={IconAdd} kind={'ghost'} on:click={add} />
|
<Button id={hr.string.AddEmployee} icon={IconAdd} kind={'ghost'} on:click={add} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
import { getEmbeddedLabel } from '@hcengineering/platform'
|
import { getEmbeddedLabel } from '@hcengineering/platform'
|
||||||
import { Button, Label, Loading, showPopup, tableToCSV } from '@hcengineering/ui'
|
import { Button, Label, Loading, showPopup, tableToCSV } from '@hcengineering/ui'
|
||||||
import { BuildModelKey, Viewlet, ViewletPreference } from '@hcengineering/view'
|
import { BuildModelKey, Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { TableBrowser, ViewletSelector, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
import hr from '../../plugin'
|
import hr from '../../plugin'
|
||||||
import {
|
import {
|
||||||
EmployeeReports,
|
EmployeeReports,
|
||||||
@ -367,7 +367,14 @@
|
|||||||
<div class="clear-mins" />
|
<div class="clear-mins" />
|
||||||
<div class="ac-header-full small-gap">
|
<div class="ac-header-full small-gap">
|
||||||
<Button label={getEmbeddedLabel('Export')} on:click={(evt) => exportTable(evt)} />
|
<Button label={getEmbeddedLabel('Export')} on:click={(evt) => exportTable(evt)} />
|
||||||
<ViewletSettingButton viewletQuery={{ _id: hr.viewlet.StaffStats }} bind:viewlet bind:preference bind:loading />
|
<ViewletSelector
|
||||||
|
hidden
|
||||||
|
bind:viewlet
|
||||||
|
bind:preference
|
||||||
|
bind:loading
|
||||||
|
viewletQuery={{ _id: hr.viewlet.StaffStats }}
|
||||||
|
/>
|
||||||
|
<ViewletSettingButton bind:viewlet />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{#if viewlet}
|
{#if viewlet}
|
||||||
|
@ -21,7 +21,13 @@
|
|||||||
import task from '@hcengineering/task'
|
import task from '@hcengineering/task'
|
||||||
import { IModeSelector, Label, Loading, ModeSelector, resolvedLocationStore, SearchEdit } from '@hcengineering/ui'
|
import { IModeSelector, Label, Loading, ModeSelector, resolvedLocationStore, SearchEdit } from '@hcengineering/ui'
|
||||||
import { Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
import { Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import {
|
||||||
|
FilterBar,
|
||||||
|
FilterButton,
|
||||||
|
TableBrowser,
|
||||||
|
ViewletSelector,
|
||||||
|
ViewletSettingButton
|
||||||
|
} from '@hcengineering/view-resources'
|
||||||
import { createEventDispatcher } from 'svelte'
|
import { createEventDispatcher } from 'svelte'
|
||||||
import lead from '../plugin'
|
import lead from '../plugin'
|
||||||
|
|
||||||
@ -102,16 +108,17 @@
|
|||||||
<div class="buttons-divider" />
|
<div class="buttons-divider" />
|
||||||
<FilterButton {_class} />
|
<FilterButton {_class} />
|
||||||
</div>
|
</div>
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
bind:viewOptions
|
hidden
|
||||||
|
bind:viewlet
|
||||||
|
bind:preference
|
||||||
|
bind:loading
|
||||||
viewletQuery={{
|
viewletQuery={{
|
||||||
attachTo: _class,
|
attachTo: _class,
|
||||||
descriptor: task.viewlet.StatusTable
|
descriptor: task.viewlet.StatusTable
|
||||||
}}
|
}}
|
||||||
bind:viewlet
|
|
||||||
bind:preference
|
|
||||||
bind:loading
|
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
</div>
|
</div>
|
||||||
<FilterBar {_class} query={searchQuery} {viewOptions} on:change={(e) => (resultQuery = e.detail)} />
|
<FilterBar {_class} query={searchQuery} {viewOptions} on:change={(e) => (resultQuery = e.detail)} />
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
import type { Doc, Ref } from '@hcengineering/core'
|
import type { Doc, Ref } from '@hcengineering/core'
|
||||||
import { Button, Icon, IconAdd, Label, Scroller, showPopup } from '@hcengineering/ui'
|
import { Button, Icon, IconAdd, Label, Scroller, showPopup } from '@hcengineering/ui'
|
||||||
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { Table, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { Table, ViewletsSettingButton } from '@hcengineering/view-resources'
|
||||||
import recruit from '../plugin'
|
import recruit from '../plugin'
|
||||||
import CreateApplication from './CreateApplication.svelte'
|
import CreateApplication from './CreateApplication.svelte'
|
||||||
import IconApplication from './icons/Application.svelte'
|
import IconApplication from './icons/Application.svelte'
|
||||||
@ -44,7 +44,7 @@
|
|||||||
<Label label={recruit.string.Applications} />
|
<Label label={recruit.string.Applications} />
|
||||||
</span>
|
</span>
|
||||||
<div class="flex-row-center gap-2 reverse">
|
<div class="flex-row-center gap-2 reverse">
|
||||||
<ViewletSettingButton
|
<ViewletsSettingButton
|
||||||
viewletQuery={{ _id: recruit.viewlet.VacancyApplicationsEmbeddeed }}
|
viewletQuery={{ _id: recruit.viewlet.VacancyApplicationsEmbeddeed }}
|
||||||
kind={'ghost'}
|
kind={'ghost'}
|
||||||
bind:viewlet
|
bind:viewlet
|
||||||
|
@ -19,7 +19,13 @@
|
|||||||
import { Applicant, Vacancy } from '@hcengineering/recruit'
|
import { Applicant, Vacancy } from '@hcengineering/recruit'
|
||||||
import { Button, IconAdd, Label, Loading, SearchEdit, showPopup } from '@hcengineering/ui'
|
import { Button, IconAdd, Label, Loading, SearchEdit, showPopup } from '@hcengineering/ui'
|
||||||
import view, { BuildModelKey, Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
import view, { BuildModelKey, Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import {
|
||||||
|
FilterBar,
|
||||||
|
FilterButton,
|
||||||
|
TableBrowser,
|
||||||
|
ViewletSelector,
|
||||||
|
ViewletSettingButton
|
||||||
|
} from '@hcengineering/view-resources'
|
||||||
import recruit from '../plugin'
|
import recruit from '../plugin'
|
||||||
import CreateOrganization from './CreateOrganization.svelte'
|
import CreateOrganization from './CreateOrganization.svelte'
|
||||||
import VacancyListApplicationsPopup from './organizations/VacancyListApplicationsPopup.svelte'
|
import VacancyListApplicationsPopup from './organizations/VacancyListApplicationsPopup.svelte'
|
||||||
@ -205,16 +211,17 @@
|
|||||||
<FilterButton _class={recruit.mixin.VacancyList} />
|
<FilterButton _class={recruit.mixin.VacancyList} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
bind:viewOptions
|
hidden
|
||||||
viewletQuery={{
|
viewletQuery={{
|
||||||
attachTo: recruit.mixin.VacancyList,
|
attachTo: recruit.mixin.VacancyList,
|
||||||
descriptor: view.viewlet.Table
|
descriptor: view.viewlet.Table
|
||||||
}}
|
}}
|
||||||
bind:viewlet
|
|
||||||
bind:preference
|
bind:preference
|
||||||
bind:loading
|
bind:loading
|
||||||
|
bind:viewlet
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,7 +18,13 @@
|
|||||||
import { Vacancy } from '@hcengineering/recruit'
|
import { Vacancy } from '@hcengineering/recruit'
|
||||||
import { Button, IconAdd, Label, Loading, SearchEdit, showPopup, tableToCSV } from '@hcengineering/ui'
|
import { Button, IconAdd, Label, Loading, SearchEdit, showPopup, tableToCSV } from '@hcengineering/ui'
|
||||||
import view, { BuildModelKey, ViewOptions, Viewlet, ViewletPreference } from '@hcengineering/view'
|
import view, { BuildModelKey, ViewOptions, Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import {
|
||||||
|
FilterBar,
|
||||||
|
FilterButton,
|
||||||
|
TableBrowser,
|
||||||
|
ViewletSelector,
|
||||||
|
ViewletSettingButton
|
||||||
|
} from '@hcengineering/view-resources'
|
||||||
import recruit from '../plugin'
|
import recruit from '../plugin'
|
||||||
import CreateVacancy from './CreateVacancy.svelte'
|
import CreateVacancy from './CreateVacancy.svelte'
|
||||||
|
|
||||||
@ -149,16 +155,17 @@
|
|||||||
<FilterButton _class={recruit.class.Vacancy} />
|
<FilterButton _class={recruit.class.Vacancy} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
bind:viewOptions
|
hidden
|
||||||
viewletQuery={{
|
viewletQuery={{
|
||||||
attachTo: recruit.class.Vacancy,
|
attachTo: recruit.class.Vacancy,
|
||||||
descriptor: view.viewlet.Table
|
descriptor: view.viewlet.Table
|
||||||
}}
|
}}
|
||||||
bind:viewlet
|
|
||||||
bind:preference
|
bind:preference
|
||||||
bind:loading
|
bind:loading
|
||||||
|
bind:viewlet
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
import { recruitId, Vacancy } from '@hcengineering/recruit'
|
import { recruitId, Vacancy } from '@hcengineering/recruit'
|
||||||
import { Button, Icon, IconAdd, Label, Loading, resizeObserver, Scroller, showPopup } from '@hcengineering/ui'
|
import { Button, Icon, IconAdd, Label, Loading, resizeObserver, Scroller, showPopup } from '@hcengineering/ui'
|
||||||
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
import { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { NavLink, Table, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { NavLink, Table, ViewletsSettingButton } from '@hcengineering/view-resources'
|
||||||
import recruit from '../plugin'
|
import recruit from '../plugin'
|
||||||
import CreateApplication from './CreateApplication.svelte'
|
import CreateApplication from './CreateApplication.svelte'
|
||||||
import IconApplication from './icons/Application.svelte'
|
import IconApplication from './icons/Application.svelte'
|
||||||
@ -53,7 +53,7 @@
|
|||||||
</NavLink>
|
</NavLink>
|
||||||
</span>
|
</span>
|
||||||
<div class="flex-row-center gap-2 reverse">
|
<div class="flex-row-center gap-2 reverse">
|
||||||
<ViewletSettingButton
|
<ViewletsSettingButton
|
||||||
viewletQuery={{ _id: recruit.viewlet.VacancyApplicationsShort }}
|
viewletQuery={{ _id: recruit.viewlet.VacancyApplicationsShort }}
|
||||||
kind={'ghost'}
|
kind={'ghost'}
|
||||||
bind:viewlet
|
bind:viewlet
|
||||||
|
@ -29,7 +29,13 @@
|
|||||||
SearchEdit
|
SearchEdit
|
||||||
} from '@hcengineering/ui'
|
} from '@hcengineering/ui'
|
||||||
import { Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
import { Viewlet, ViewletPreference, ViewOptions } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, TableBrowser, ViewletSettingButton } from '@hcengineering/view-resources'
|
import {
|
||||||
|
FilterBar,
|
||||||
|
FilterButton,
|
||||||
|
TableBrowser,
|
||||||
|
ViewletSelector,
|
||||||
|
ViewletSettingButton
|
||||||
|
} from '@hcengineering/view-resources'
|
||||||
import { createEventDispatcher } from 'svelte'
|
import { createEventDispatcher } from 'svelte'
|
||||||
import task from '../plugin'
|
import task from '../plugin'
|
||||||
|
|
||||||
@ -152,13 +158,14 @@
|
|||||||
<div class="buttons-divider" />
|
<div class="buttons-divider" />
|
||||||
<FilterButton {_class} />
|
<FilterButton {_class} />
|
||||||
</div>
|
</div>
|
||||||
<ViewletSettingButton
|
<ViewletSelector
|
||||||
bind:viewOptions
|
hidden
|
||||||
viewletQuery={{ attachTo: _class, descriptor: task.viewlet.StatusTable }}
|
|
||||||
bind:viewlet
|
bind:viewlet
|
||||||
bind:preference
|
bind:preference
|
||||||
bind:loading
|
bind:loading
|
||||||
|
viewletQuery={{ attachTo: _class, descriptor: task.viewlet.StatusTable }}
|
||||||
/>
|
/>
|
||||||
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
</div>
|
</div>
|
||||||
<FilterBar {_class} query={searchQuery} {viewOptions} on:change={(e) => (resultQuery = e.detail)} />
|
<FilterBar {_class} query={searchQuery} {viewOptions} on:change={(e) => (resultQuery = e.detail)} />
|
||||||
|
|
||||||
|
@ -16,14 +16,14 @@
|
|||||||
import { DocumentQuery, WithLookup } from '@hcengineering/core'
|
import { DocumentQuery, WithLookup } from '@hcengineering/core'
|
||||||
import { IntlString } from '@hcengineering/platform'
|
import { IntlString } from '@hcengineering/platform'
|
||||||
import { Component } from '@hcengineering/tracker'
|
import { Component } from '@hcengineering/tracker'
|
||||||
import { Button, IconAdd, Label, SearchEdit, TabList, resolvedLocationStore, showPopup } from '@hcengineering/ui'
|
import { Button, IconAdd, Label, SearchEdit, resolvedLocationStore, showPopup } from '@hcengineering/ui'
|
||||||
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
||||||
import {
|
import {
|
||||||
FilterBar,
|
FilterBar,
|
||||||
FilterButton,
|
FilterButton,
|
||||||
|
ViewletSelector,
|
||||||
ViewletSettingButton,
|
ViewletSettingButton,
|
||||||
makeViewletKey,
|
makeViewletKey
|
||||||
updateActiveViewlet
|
|
||||||
} from '@hcengineering/view-resources'
|
} from '@hcengineering/view-resources'
|
||||||
import { onDestroy } from 'svelte'
|
import { onDestroy } from 'svelte'
|
||||||
import tracker from '../../plugin'
|
import tracker from '../../plugin'
|
||||||
@ -86,15 +86,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ac-header-full medium-gap mb-1">
|
<div class="ac-header-full medium-gap mb-1">
|
||||||
{#if viewlets && viewlets.length > 1}
|
<ViewletSelector bind:viewlet bind:viewlets viewletQuery={{ attachTo: tracker.class.Component }} />
|
||||||
<TabList
|
|
||||||
items={views}
|
|
||||||
selected={viewlet?._id}
|
|
||||||
kind="normal"
|
|
||||||
on:select={({ detail }) =>
|
|
||||||
(viewlet = viewlets && detail?.id ? updateActiveViewlet(viewlets, detail.id) : viewlet)}
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
<Button icon={IconAdd} label={tracker.string.Component} kind="accented" on:click={showCreateDialog} />
|
<Button icon={IconAdd} label={tracker.string.Component} kind="accented" on:click={showCreateDialog} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -106,12 +98,7 @@
|
|||||||
<FilterButton _class={tracker.class.Component} {space} />
|
<FilterButton _class={tracker.class.Component} {space} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
bind:viewOptions
|
|
||||||
viewletQuery={{ attachTo: tracker.class.Component }}
|
|
||||||
bind:viewlet
|
|
||||||
bind:viewlets
|
|
||||||
/>
|
|
||||||
<!-- <ActionIcon icon={IconMoreH} size="small" /> -->
|
<!-- <ActionIcon icon={IconMoreH} size="small" /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
export let modeSelectorProps: IModeSelector | undefined = undefined
|
export let modeSelectorProps: IModeSelector | undefined = undefined
|
||||||
|
|
||||||
let viewlet: WithLookup<Viewlet> | undefined = undefined
|
let viewlet: WithLookup<Viewlet> | undefined = undefined
|
||||||
let viewlets: WithLookup<Viewlet>[] | undefined = undefined
|
const viewlets: WithLookup<Viewlet>[] | undefined = undefined
|
||||||
let viewOptions: ViewOptions | undefined
|
let viewOptions: ViewOptions | undefined
|
||||||
|
|
||||||
let search = ''
|
let search = ''
|
||||||
@ -51,6 +51,7 @@
|
|||||||
bind:viewlet
|
bind:viewlet
|
||||||
bind:search
|
bind:search
|
||||||
showLabelSelector={$$slots.label_selector}
|
showLabelSelector={$$slots.label_selector}
|
||||||
|
viewletQuery={{ attachTo: tracker.class.Issue, variant: { $ne: 'subissue' } }}
|
||||||
{viewlets}
|
{viewlets}
|
||||||
{label}
|
{label}
|
||||||
{space}
|
{space}
|
||||||
@ -60,12 +61,7 @@
|
|||||||
<slot name="label_selector" />
|
<slot name="label_selector" />
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
<svelte:fragment slot="extra">
|
<svelte:fragment slot="extra">
|
||||||
<ViewletSettingButton
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
bind:viewOptions
|
|
||||||
viewletQuery={{ attachTo: tracker.class.Issue, variant: { $ne: 'subissue' } }}
|
|
||||||
bind:viewlet
|
|
||||||
bind:viewlets
|
|
||||||
/>
|
|
||||||
{#if asideFloat && $$slots.aside}
|
{#if asideFloat && $$slots.aside}
|
||||||
<div class="buttons-divider" />
|
<div class="buttons-divider" />
|
||||||
<Button
|
<Button
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
showPopup
|
showPopup
|
||||||
} from '@hcengineering/ui'
|
} from '@hcengineering/ui'
|
||||||
import view, { ViewOptions, Viewlet, ViewletPreference } from '@hcengineering/view'
|
import view, { ViewOptions, Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
import { ViewletSettingButton, createFilter, setFilters } from '@hcengineering/view-resources'
|
import { ViewletsSettingButton, createFilter, setFilters } from '@hcengineering/view-resources'
|
||||||
import { afterUpdate } from 'svelte'
|
import { afterUpdate } from 'svelte'
|
||||||
import tracker from '../../../plugin'
|
import tracker from '../../../plugin'
|
||||||
import CreateIssue from '../../CreateIssue.svelte'
|
import CreateIssue from '../../CreateIssue.svelte'
|
||||||
@ -147,7 +147,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
<div class="flex-row-center gap-2">
|
<div class="flex-row-center gap-2">
|
||||||
{#if hasSubIssues}
|
{#if hasSubIssues}
|
||||||
<ViewletSettingButton
|
<ViewletsSettingButton
|
||||||
bind:viewOptions
|
bind:viewOptions
|
||||||
viewletQuery={{ _id: tracker.viewlet.SubIssues }}
|
viewletQuery={{ _id: tracker.viewlet.SubIssues }}
|
||||||
kind={'ghost'}
|
kind={'ghost'}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
import { Issue, trackerId } from '@hcengineering/tracker'
|
import { Issue, trackerId } from '@hcengineering/tracker'
|
||||||
import { Button, Component, Icon, IconAdd, Label, showPopup } from '@hcengineering/ui'
|
import { Button, Component, Icon, IconAdd, Label, showPopup } from '@hcengineering/ui'
|
||||||
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
||||||
import { ViewletSettingButton, getAdditionalHeader } from '@hcengineering/view-resources'
|
import { ViewletsSettingButton, getAdditionalHeader } from '@hcengineering/view-resources'
|
||||||
import viewplg from '@hcengineering/view-resources/src/plugin'
|
import viewplg from '@hcengineering/view-resources/src/plugin'
|
||||||
import { fade } from 'svelte/transition'
|
import { fade } from 'svelte/transition'
|
||||||
import tracker from '../../../plugin'
|
import tracker from '../../../plugin'
|
||||||
@ -56,7 +56,7 @@
|
|||||||
<span class="flex-grow" />
|
<span class="flex-grow" />
|
||||||
{/if}
|
{/if}
|
||||||
<div class="flex-row-center gap-2">
|
<div class="flex-row-center gap-2">
|
||||||
<ViewletSettingButton
|
<ViewletsSettingButton
|
||||||
bind:viewOptions
|
bind:viewOptions
|
||||||
viewletQuery={{ _id: tracker.viewlet.SubIssues }}
|
viewletQuery={{ _id: tracker.viewlet.SubIssues }}
|
||||||
kind={'ghost'}
|
kind={'ghost'}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
import { Milestone } from '@hcengineering/tracker'
|
import { Milestone } from '@hcengineering/tracker'
|
||||||
import { Button, IconAdd, Label, SearchEdit, TabItem, TabList, showPopup } from '@hcengineering/ui'
|
import { Button, IconAdd, Label, SearchEdit, TabItem, TabList, showPopup } from '@hcengineering/ui'
|
||||||
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, ViewletSettingButton } from '@hcengineering/view-resources'
|
import { FilterBar, FilterButton, ViewletSelector, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
import tracker from '../../plugin'
|
import tracker from '../../plugin'
|
||||||
import { MilestoneViewMode, getIncludedMilestoneStatuses, milestoneTitleMap } from '../../utils'
|
import { MilestoneViewMode, getIncludedMilestoneStatuses, milestoneTitleMap } from '../../utils'
|
||||||
import MilestoneContent from './MilestoneContent.svelte'
|
import MilestoneContent from './MilestoneContent.svelte'
|
||||||
@ -99,7 +99,8 @@
|
|||||||
<FilterButton _class={tracker.class.Milestone} {space} />
|
<FilterButton _class={tracker.class.Milestone} {space} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton bind:viewOptions viewletQuery={{ attachTo: tracker.class.Milestone }} bind:viewlet />
|
<ViewletSelector viewletQuery={{ attachTo: tracker.class.Milestone }} bind:viewlet />
|
||||||
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -80,12 +80,7 @@
|
|||||||
/>
|
/>
|
||||||
<div class="buttons-divider" />
|
<div class="buttons-divider" />
|
||||||
{/if}
|
{/if}
|
||||||
<ViewletSettingButton
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
bind:viewOptions
|
|
||||||
viewletQuery={{ attachTo: tracker.class.IssueTemplate }}
|
|
||||||
bind:viewlet
|
|
||||||
bind:viewlets
|
|
||||||
/>
|
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
</SpaceHeader>
|
</SpaceHeader>
|
||||||
<slot name="afterHeader" />
|
<slot name="afterHeader" />
|
||||||
|
@ -1,27 +1,19 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Class, Doc, Ref, Space } from '@hcengineering/core'
|
import { Class, Doc, DocumentQuery, Ref, Space, WithLookup } from '@hcengineering/core'
|
||||||
import { TabList, SearchEdit, IModeSelector, ModeSelector } from '@hcengineering/ui'
|
import { IModeSelector, ModeSelector, SearchEdit } from '@hcengineering/ui'
|
||||||
import { Viewlet } from '@hcengineering/view'
|
import { Viewlet } from '@hcengineering/view'
|
||||||
import { WithLookup } from '@hcengineering/core'
|
import ViewletSelector from './ViewletSelector.svelte'
|
||||||
import { setActiveViewletId } from '../utils'
|
|
||||||
import FilterButton from './filter/FilterButton.svelte'
|
import FilterButton from './filter/FilterButton.svelte'
|
||||||
|
|
||||||
export let space: Ref<Space> | undefined = undefined
|
export let space: Ref<Space> | undefined = undefined
|
||||||
export let _class: Ref<Class<Doc>>
|
export let _class: Ref<Class<Doc>>
|
||||||
export let viewlet: WithLookup<Viewlet> | undefined
|
export let viewlet: WithLookup<Viewlet> | undefined
|
||||||
|
export let viewletQuery: DocumentQuery<Viewlet> | undefined = undefined
|
||||||
export let viewlets: WithLookup<Viewlet>[] = []
|
export let viewlets: WithLookup<Viewlet>[] = []
|
||||||
export let label: string
|
export let label: string
|
||||||
export let search: string
|
export let search: string
|
||||||
export let showLabelSelector = false
|
export let showLabelSelector = false
|
||||||
export let modeSelectorProps: IModeSelector | undefined = undefined
|
export let modeSelectorProps: IModeSelector | undefined = undefined
|
||||||
|
|
||||||
$: viewslist = viewlets.map((views) => {
|
|
||||||
return {
|
|
||||||
id: views._id,
|
|
||||||
icon: views.$lookup?.descriptor?.icon,
|
|
||||||
tooltip: views.$lookup?.descriptor?.label
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@ -42,24 +34,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-1 clear-mins">
|
<div class="mb-1 clear-mins">
|
||||||
{#if viewlets.length > 1}
|
<ViewletSelector bind:viewlet bind:viewlets viewletQuery={viewletQuery ?? { attachTo: _class }} />
|
||||||
<TabList
|
|
||||||
items={viewslist}
|
|
||||||
multiselect={false}
|
|
||||||
selected={viewlet?._id}
|
|
||||||
onlyIcons
|
|
||||||
on:select={(result) => {
|
|
||||||
if (result.detail !== undefined) {
|
|
||||||
if (viewlet?._id === result.detail.id) return
|
|
||||||
viewlet = viewlets.find((vl) => vl._id === result.detail.id)
|
|
||||||
|
|
||||||
if (viewlet) {
|
|
||||||
setActiveViewletId(viewlet._id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
<slot name="header-tools" />
|
<slot name="header-tools" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
104
plugins/view-resources/src/components/ViewletSelector.svelte
Normal file
104
plugins/view-resources/src/components/ViewletSelector.svelte
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import { createEventDispatcher, onDestroy } from 'svelte'
|
||||||
|
import { activeViewlet, makeViewletKey, setActiveViewletId } from '../utils'
|
||||||
|
import { TabList, resolvedLocationStore } from '@hcengineering/ui'
|
||||||
|
import view, { Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
|
import { DocumentQuery, Ref, WithLookup } from '@hcengineering/core'
|
||||||
|
import { createQuery } from '@hcengineering/presentation'
|
||||||
|
|
||||||
|
export let viewlet: WithLookup<Viewlet> | undefined
|
||||||
|
export let viewlets: WithLookup<Viewlet>[] = []
|
||||||
|
export let viewletQuery: DocumentQuery<Viewlet>
|
||||||
|
export let preference: ViewletPreference | undefined = undefined
|
||||||
|
export let loading = true
|
||||||
|
export let hidden = false
|
||||||
|
|
||||||
|
const query = createQuery()
|
||||||
|
|
||||||
|
$: query.query(
|
||||||
|
view.class.Viewlet,
|
||||||
|
viewletQuery,
|
||||||
|
(res) => {
|
||||||
|
viewlets = res
|
||||||
|
dispatch('viewlets', viewlets)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
lookup: {
|
||||||
|
descriptor: view.class.ViewletDescriptor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
let key = makeViewletKey()
|
||||||
|
|
||||||
|
onDestroy(
|
||||||
|
resolvedLocationStore.subscribe((loc) => {
|
||||||
|
key = makeViewletKey(loc)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
$: getActiveViewlet(viewlets, $activeViewlet, key)
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
|
function getActiveViewlet (
|
||||||
|
viewlets: WithLookup<Viewlet>[],
|
||||||
|
activeViewlet: Record<string, Ref<Viewlet> | null>,
|
||||||
|
key: string
|
||||||
|
) {
|
||||||
|
if (viewlets.length === 0) return
|
||||||
|
const newViewlet = viewlets.find((viewlet) => viewlet?._id === activeViewlet[key]) ?? viewlets[0]
|
||||||
|
if (viewlet?._id !== newViewlet?._id) {
|
||||||
|
viewlet = newViewlet
|
||||||
|
setActiveViewletId(newViewlet._id)
|
||||||
|
dispatch('viewlet', viewlet)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$: viewslist = viewlets.map((views) => {
|
||||||
|
return {
|
||||||
|
id: views._id,
|
||||||
|
icon: views.$lookup?.descriptor?.icon,
|
||||||
|
tooltip: views.$lookup?.descriptor?.label
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const preferenceQuery = createQuery()
|
||||||
|
|
||||||
|
$: if (viewlet != null) {
|
||||||
|
preferenceQuery.query(
|
||||||
|
view.class.ViewletPreference,
|
||||||
|
{
|
||||||
|
attachedTo: viewlet._id
|
||||||
|
},
|
||||||
|
(res) => {
|
||||||
|
preference = res[0]
|
||||||
|
loading = false
|
||||||
|
dispatch('loading', loading)
|
||||||
|
dispatch('preference', preference)
|
||||||
|
},
|
||||||
|
{ limit: 1 }
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
preferenceQuery.unsubscribe()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if viewlets.length > 1 && !hidden}
|
||||||
|
<TabList
|
||||||
|
items={viewslist}
|
||||||
|
multiselect={false}
|
||||||
|
selected={viewlet?._id}
|
||||||
|
on:select={(result) => {
|
||||||
|
if (result.detail !== undefined) {
|
||||||
|
if (viewlet?._id === result.detail.id) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
viewlet = viewlets.find((vl) => vl._id === result.detail.id)
|
||||||
|
if (viewlet) {
|
||||||
|
setActiveViewletId(viewlet._id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{/if}
|
@ -13,28 +13,16 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
-->
|
-->
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { DocumentQuery, Ref, WithLookup } from '@hcengineering/core'
|
import { Button, ButtonKind, showPopup } from '@hcengineering/ui'
|
||||||
import { createQuery } from '@hcengineering/presentation'
|
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
||||||
import { Button, ButtonKind, resolvedLocationStore, showPopup } from '@hcengineering/ui'
|
|
||||||
import { ViewOptions, Viewlet, ViewletPreference } from '@hcengineering/view'
|
|
||||||
import { createEventDispatcher, onDestroy } from 'svelte'
|
|
||||||
import view from '../plugin'
|
import view from '../plugin'
|
||||||
import { activeViewlet, makeViewletKey, setActiveViewletId } from '../utils'
|
|
||||||
import { getViewOptions, viewOptionStore } from '../viewOptions'
|
import { getViewOptions, viewOptionStore } from '../viewOptions'
|
||||||
import ViewOptionsButton from './ViewOptionsButton.svelte'
|
import ViewOptionsButton from './ViewOptionsButton.svelte'
|
||||||
import ViewletSetting from './ViewletSetting.svelte'
|
import ViewletSetting from './ViewletSetting.svelte'
|
||||||
|
|
||||||
export let viewletQuery: DocumentQuery<Viewlet> = {}
|
|
||||||
export let kind: ButtonKind = 'regular'
|
export let kind: ButtonKind = 'regular'
|
||||||
export let viewOptions: ViewOptions | undefined = undefined
|
export let viewOptions: ViewOptions | undefined = undefined
|
||||||
|
|
||||||
export let loading = true
|
|
||||||
|
|
||||||
export let viewlet: Viewlet | undefined = undefined
|
export let viewlet: Viewlet | undefined = undefined
|
||||||
export let viewlets: WithLookup<Viewlet>[] = []
|
|
||||||
export let preference: ViewletPreference | undefined = undefined
|
|
||||||
|
|
||||||
const dispatch = createEventDispatcher()
|
|
||||||
|
|
||||||
let btn: HTMLButtonElement
|
let btn: HTMLButtonElement
|
||||||
|
|
||||||
@ -43,67 +31,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
$: viewOptions = getViewOptions(viewlet, $viewOptionStore)
|
$: viewOptions = getViewOptions(viewlet, $viewOptionStore)
|
||||||
|
|
||||||
const query = createQuery()
|
|
||||||
|
|
||||||
$: query.query(
|
|
||||||
view.class.Viewlet,
|
|
||||||
viewletQuery,
|
|
||||||
(res) => {
|
|
||||||
viewlets = res
|
|
||||||
dispatch('viewlets', viewlets)
|
|
||||||
},
|
|
||||||
{
|
|
||||||
lookup: {
|
|
||||||
descriptor: view.class.ViewletDescriptor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
let key = makeViewletKey()
|
|
||||||
|
|
||||||
onDestroy(
|
|
||||||
resolvedLocationStore.subscribe((loc) => {
|
|
||||||
key = makeViewletKey(loc)
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
$: getActiveViewlet(viewlets, $activeViewlet, key)
|
|
||||||
|
|
||||||
function getActiveViewlet (
|
|
||||||
viewlets: WithLookup<Viewlet>[],
|
|
||||||
activeViewlet: Record<string, Ref<Viewlet> | null>,
|
|
||||||
key: string
|
|
||||||
) {
|
|
||||||
if (viewlets.length === 0) return
|
|
||||||
const newViewlet = viewlets.find((viewlet) => viewlet?._id === activeViewlet[key]) ?? viewlets[0]
|
|
||||||
if (viewlet?._id !== newViewlet?._id) {
|
|
||||||
preference = undefined
|
|
||||||
viewlet = newViewlet
|
|
||||||
setActiveViewletId(newViewlet._id)
|
|
||||||
dispatch('viewlet', viewlet)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const preferenceQuery = createQuery()
|
|
||||||
|
|
||||||
$: if (viewlet != null) {
|
|
||||||
preferenceQuery.query(
|
|
||||||
view.class.ViewletPreference,
|
|
||||||
{
|
|
||||||
attachedTo: viewlet._id
|
|
||||||
},
|
|
||||||
(res) => {
|
|
||||||
preference = res[0]
|
|
||||||
loading = false
|
|
||||||
dispatch('loading', loading)
|
|
||||||
dispatch('preference', preference)
|
|
||||||
},
|
|
||||||
{ limit: 1 }
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
preferenceQuery.unsubscribe()
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if viewlet}
|
{#if viewlet}
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
<!--
|
||||||
|
// Copyright © 2022 Hardcore Engineering Inc.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
-->
|
||||||
|
<script lang="ts">
|
||||||
|
import { DocumentQuery, WithLookup } from '@hcengineering/core'
|
||||||
|
import { createQuery } from '@hcengineering/presentation'
|
||||||
|
import { Button, ButtonKind, showPopup } from '@hcengineering/ui'
|
||||||
|
import { ViewOptions, Viewlet, ViewletPreference } from '@hcengineering/view'
|
||||||
|
import { createEventDispatcher } from 'svelte'
|
||||||
|
import view from '../plugin'
|
||||||
|
import { getViewOptions, viewOptionStore } from '../viewOptions'
|
||||||
|
import ViewOptionsButton from './ViewOptionsButton.svelte'
|
||||||
|
import ViewletSetting from './ViewletSetting.svelte'
|
||||||
|
|
||||||
|
export let viewletQuery: DocumentQuery<Viewlet> = {}
|
||||||
|
export let kind: ButtonKind = 'regular'
|
||||||
|
export let viewOptions: ViewOptions | undefined = undefined
|
||||||
|
|
||||||
|
export let viewlet: Viewlet | undefined = undefined
|
||||||
|
export let viewlets: WithLookup<Viewlet>[] = []
|
||||||
|
export let preference: ViewletPreference | undefined = undefined
|
||||||
|
export let loading = true
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher()
|
||||||
|
|
||||||
|
let btn: HTMLButtonElement
|
||||||
|
|
||||||
|
function clickHandler (event: MouseEvent) {
|
||||||
|
showPopup(ViewletSetting, { viewlet }, btn)
|
||||||
|
}
|
||||||
|
|
||||||
|
$: viewOptions = getViewOptions(viewlet, $viewOptionStore)
|
||||||
|
|
||||||
|
const query = createQuery()
|
||||||
|
|
||||||
|
$: query.query(
|
||||||
|
view.class.Viewlet,
|
||||||
|
viewletQuery,
|
||||||
|
(res) => {
|
||||||
|
viewlets = res
|
||||||
|
viewlet = viewlets[0]
|
||||||
|
dispatch('viewlets', viewlets)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
lookup: {
|
||||||
|
descriptor: view.class.ViewletDescriptor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const preferenceQuery = createQuery()
|
||||||
|
|
||||||
|
$: if (viewlet != null) {
|
||||||
|
preferenceQuery.query(
|
||||||
|
view.class.ViewletPreference,
|
||||||
|
{
|
||||||
|
attachedTo: viewlet._id
|
||||||
|
},
|
||||||
|
(res) => {
|
||||||
|
preference = res[0]
|
||||||
|
loading = false
|
||||||
|
},
|
||||||
|
{ limit: 1 }
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
preferenceQuery.unsubscribe()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#if viewlet}
|
||||||
|
<div class="flex-row-center gap-2 reverse">
|
||||||
|
{#if viewOptions}
|
||||||
|
<ViewOptionsButton {viewlet} {kind} {viewOptions} />
|
||||||
|
{/if}
|
||||||
|
<Button
|
||||||
|
icon={view.icon.Configure}
|
||||||
|
label={view.string.Show}
|
||||||
|
{kind}
|
||||||
|
shrink={1}
|
||||||
|
adaptiveShrink={'sm'}
|
||||||
|
showTooltip={{ label: view.string.CustomizeView, direction: 'bottom' }}
|
||||||
|
bind:input={btn}
|
||||||
|
on:click={clickHandler}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
{/if}
|
@ -131,6 +131,9 @@ export { default as TableBrowser } from './components/TableBrowser.svelte'
|
|||||||
export { default as ValueSelector } from './components/ValueSelector.svelte'
|
export { default as ValueSelector } from './components/ValueSelector.svelte'
|
||||||
export { default as FilterRemovedNotification } from './components/filter/FilterRemovedNotification.svelte'
|
export { default as FilterRemovedNotification } from './components/filter/FilterRemovedNotification.svelte'
|
||||||
export { default as ParentsNavigator } from './components/ParentsNavigator.svelte'
|
export { default as ParentsNavigator } from './components/ParentsNavigator.svelte'
|
||||||
|
export { default as ViewletSelector } from './components/ViewletSelector.svelte'
|
||||||
|
export { default as ViewletsSettingButton } from './components/ViewletsSettingButton.svelte'
|
||||||
|
|
||||||
export * from './filter'
|
export * from './filter'
|
||||||
export * from './selection'
|
export * from './selection'
|
||||||
export * from './utils'
|
export * from './utils'
|
||||||
|
@ -99,6 +99,14 @@ export function migrateViewOpttions (): void {
|
|||||||
if (!Array.isArray(res.groupBy)) {
|
if (!Array.isArray(res.groupBy)) {
|
||||||
res.groupBy = [res.groupBy]
|
res.groupBy = [res.groupBy]
|
||||||
}
|
}
|
||||||
|
let ind = res.groupBy.findIndex((p) => p === 'state')
|
||||||
|
while (ind !== -1) {
|
||||||
|
res.groupBy[ind] = 'status'
|
||||||
|
ind = res.groupBy.findIndex((p) => p === 'state')
|
||||||
|
}
|
||||||
|
if (res.orderBy[0] === 'state') {
|
||||||
|
res.orderBy[0] = 'status'
|
||||||
|
}
|
||||||
localStorage.setItem(key, JSON.stringify(res))
|
localStorage.setItem(key, JSON.stringify(res))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
import core, { WithLookup } from '@hcengineering/core'
|
import core, { WithLookup } from '@hcengineering/core'
|
||||||
import { IntlString } from '@hcengineering/platform'
|
import { IntlString } from '@hcengineering/platform'
|
||||||
import presentation, { createQuery } from '@hcengineering/presentation'
|
import presentation, { createQuery } from '@hcengineering/presentation'
|
||||||
import { AnyComponent, Button, IconAdd, SearchEdit, TabList, showPopup } from '@hcengineering/ui'
|
import { AnyComponent, Button, IconAdd, SearchEdit, showPopup } from '@hcengineering/ui'
|
||||||
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
import { ViewOptions, Viewlet } from '@hcengineering/view'
|
||||||
import { FilterButton, ViewletSettingButton, setActiveViewletId } from '@hcengineering/view-resources'
|
import { FilterButton, ViewletSelector, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
import { createEventDispatcher } from 'svelte'
|
import { createEventDispatcher } from 'svelte'
|
||||||
import Header from './Header.svelte'
|
import Header from './Header.svelte'
|
||||||
|
|
||||||
@ -52,14 +52,6 @@
|
|||||||
dispatch('search', '')
|
dispatch('search', '')
|
||||||
}
|
}
|
||||||
|
|
||||||
$: viewslist = viewlets.map((views) => {
|
|
||||||
return {
|
|
||||||
id: views._id,
|
|
||||||
icon: views.$lookup?.descriptor?.icon,
|
|
||||||
tooltip: views.$lookup?.descriptor?.label
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// $: twoRows = $deviceInfo.twoRows
|
// $: twoRows = $deviceInfo.twoRows
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -68,19 +60,7 @@
|
|||||||
<Header {space} {_class} />
|
<Header {space} {_class} />
|
||||||
|
|
||||||
<div class="ac-header-full medium-gap mb-1">
|
<div class="ac-header-full medium-gap mb-1">
|
||||||
{#if viewlets.length > 1}
|
<ViewletSelector {viewletQuery} bind:viewlet bind:viewlets />
|
||||||
<TabList
|
|
||||||
items={viewslist}
|
|
||||||
multiselect={false}
|
|
||||||
selected={viewlet?._id}
|
|
||||||
on:select={(result) => {
|
|
||||||
if (result.detail !== undefined) {
|
|
||||||
viewlet = viewlets.find((vl) => vl._id === result.detail.id)
|
|
||||||
if (viewlet) setActiveViewletId(viewlet._id)
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
{#if createItemDialog}
|
{#if createItemDialog}
|
||||||
<Button icon={IconAdd} label={createItemLabel} kind={'accented'} on:click={(ev) => showCreateDialog(ev)} />
|
<Button icon={IconAdd} label={createItemLabel} kind={'accented'} on:click={(ev) => showCreateDialog(ev)} />
|
||||||
{/if}
|
{/if}
|
||||||
@ -94,7 +74,7 @@
|
|||||||
<FilterButton {_class} />
|
<FilterButton {_class} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton bind:viewOptions {viewletQuery} bind:viewlet bind:viewlets />
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -15,19 +15,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Class, Doc, DocumentQuery, Ref, Space, WithLookup } from '@hcengineering/core'
|
import { Class, Doc, DocumentQuery, Ref, Space, WithLookup } from '@hcengineering/core'
|
||||||
import { Asset, IntlString } from '@hcengineering/platform'
|
import { Asset, IntlString } from '@hcengineering/platform'
|
||||||
import {
|
import { AnyComponent, Button, Component, IconAdd, Label, Loading, SearchEdit, showPopup } from '@hcengineering/ui'
|
||||||
AnyComponent,
|
|
||||||
Button,
|
|
||||||
Component,
|
|
||||||
IconAdd,
|
|
||||||
Label,
|
|
||||||
Loading,
|
|
||||||
SearchEdit,
|
|
||||||
TabList,
|
|
||||||
showPopup
|
|
||||||
} from '@hcengineering/ui'
|
|
||||||
import { ViewOptions, Viewlet, ViewletDescriptor, ViewletPreference } from '@hcengineering/view'
|
import { ViewOptions, Viewlet, ViewletDescriptor, ViewletPreference } from '@hcengineering/view'
|
||||||
import { FilterBar, FilterButton, ViewletSettingButton, setActiveViewletId } from '@hcengineering/view-resources'
|
import { FilterBar, FilterButton, ViewletSettingButton } from '@hcengineering/view-resources'
|
||||||
|
import ViewletSelector from '@hcengineering/view-resources/src/components/ViewletSelector.svelte'
|
||||||
|
|
||||||
export let _class: Ref<Class<Doc>>
|
export let _class: Ref<Class<Doc>>
|
||||||
export let space: Ref<Space> | undefined = undefined
|
export let space: Ref<Space> | undefined = undefined
|
||||||
@ -55,14 +46,6 @@
|
|||||||
if (createComponent === undefined) return
|
if (createComponent === undefined) return
|
||||||
showPopup(createComponent, createComponentProps, 'top')
|
showPopup(createComponent, createComponentProps, 'top')
|
||||||
}
|
}
|
||||||
|
|
||||||
$: viewslist = viewlets.map((views) => {
|
|
||||||
return {
|
|
||||||
id: views._id,
|
|
||||||
icon: views.$lookup?.descriptor?.icon,
|
|
||||||
tooltip: views.$lookup?.descriptor?.label
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="ac-header full divide caption-height">
|
<div class="ac-header full divide caption-height">
|
||||||
@ -71,24 +54,16 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="ac-header-full medium-gap mb-1">
|
<div class="ac-header-full medium-gap mb-1">
|
||||||
{#if viewlets.length > 1}
|
<ViewletSelector
|
||||||
<TabList
|
bind:viewlet
|
||||||
items={viewslist}
|
bind:preference
|
||||||
multiselect={false}
|
bind:viewlets
|
||||||
selected={viewlet?._id}
|
viewletQuery={{
|
||||||
on:select={(result) => {
|
attachTo: _class,
|
||||||
if (result.detail !== undefined) {
|
variant: { $exists: false },
|
||||||
if (viewlet?._id === result.detail.id) {
|
...(descriptors !== undefined ? { descriptor: { $in: descriptors } } : {})
|
||||||
return
|
}}
|
||||||
}
|
/>
|
||||||
viewlet = viewlets.find((vl) => vl._id === result.detail.id)
|
|
||||||
if (viewlet) {
|
|
||||||
setActiveViewletId(viewlet._id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
{#if createLabel && createComponent}
|
{#if createLabel && createComponent}
|
||||||
<Button
|
<Button
|
||||||
icon={IconAdd}
|
icon={IconAdd}
|
||||||
@ -108,17 +83,7 @@
|
|||||||
<FilterButton {_class} />
|
<FilterButton {_class} />
|
||||||
</div>
|
</div>
|
||||||
<div class="ac-header-full medium-gap">
|
<div class="ac-header-full medium-gap">
|
||||||
<ViewletSettingButton
|
<ViewletSettingButton bind:viewOptions bind:viewlet />
|
||||||
bind:viewOptions
|
|
||||||
viewletQuery={{
|
|
||||||
attachTo: _class,
|
|
||||||
variant: { $exists: false },
|
|
||||||
...(descriptors !== undefined ? { descriptor: { $in: descriptors } } : {})
|
|
||||||
}}
|
|
||||||
bind:viewlets
|
|
||||||
bind:viewlet
|
|
||||||
bind:preference
|
|
||||||
/>
|
|
||||||
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
<!-- <ActionIcon icon={IconMoreH} size={'small'} /> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user