mirror of
https://github.com/hcengineering/platform.git
synced 2025-06-07 00:09:34 +00:00
feat(planner): save accordion state (#5042)
Signed-off-by: Eduard Aksamitov <e@euaaaio.ru>
This commit is contained in:
parent
18e8dcab57
commit
2bb4295f4d
@ -12,14 +12,17 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import type { Asset, IntlString } from '@hcengineering/platform'
|
import type { Asset, IntlString } from '@hcengineering/platform'
|
||||||
import { AnySvelteComponent } from '../types'
|
import type { ComponentType } from 'svelte'
|
||||||
import { ComponentType } from 'svelte'
|
import type { AnySvelteComponent } from '../types'
|
||||||
import Icon from './Icon.svelte'
|
import { getTreeCollapsed, setTreeCollapsed } from '../location'
|
||||||
import Label from './Label.svelte'
|
|
||||||
import IconChevronRight from './icons/ChevronRight.svelte'
|
import IconChevronRight from './icons/ChevronRight.svelte'
|
||||||
|
import Label from './Label.svelte'
|
||||||
|
import Icon from './Icon.svelte'
|
||||||
|
|
||||||
|
export let id: string
|
||||||
export let label: IntlString | undefined = undefined
|
export let label: IntlString | undefined = undefined
|
||||||
export let title: string | undefined = undefined
|
export let title: string | undefined = undefined
|
||||||
export let icon: Asset | AnySvelteComponent | ComponentType | undefined = undefined
|
export let icon: Asset | AnySvelteComponent | ComponentType | undefined = undefined
|
||||||
@ -27,13 +30,19 @@
|
|||||||
export let size: 'small' | 'medium' | 'large'
|
export let size: 'small' | 'medium' | 'large'
|
||||||
export let kind: 'default' | 'second' = 'default'
|
export let kind: 'default' | 'second' = 'default'
|
||||||
export let nested: boolean = false
|
export let nested: boolean = false
|
||||||
export let isOpen: boolean = false
|
|
||||||
export let selected: boolean = false
|
export let selected: boolean = false
|
||||||
export let bottomSpace: boolean = true
|
export let bottomSpace: boolean = true
|
||||||
export let counter: number | boolean = false
|
export let counter: number | boolean = false
|
||||||
export let duration: number | boolean = false
|
export let duration: number | boolean = false
|
||||||
export let fixHeader: boolean = false
|
export let fixHeader: boolean = false
|
||||||
export let background: string | undefined = undefined
|
export let background: string | undefined = undefined
|
||||||
|
|
||||||
|
let collapsed: boolean = getTreeCollapsed(id)
|
||||||
|
$: setTreeCollapsed(id, collapsed)
|
||||||
|
|
||||||
|
function handleClick (): void {
|
||||||
|
collapsed = !collapsed
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="hulyAccordionItem-container {kind}" class:nested>
|
<div class="hulyAccordionItem-container {kind}" class:nested>
|
||||||
@ -41,13 +50,11 @@
|
|||||||
class="hulyAccordionItem-header {kind} {size}"
|
class="hulyAccordionItem-header {kind} {size}"
|
||||||
class:bottomSpace
|
class:bottomSpace
|
||||||
class:nested
|
class:nested
|
||||||
class:isOpen
|
class:isOpen={!collapsed}
|
||||||
class:selected
|
class:selected
|
||||||
class:scroller-header={fixHeader}
|
class:scroller-header={fixHeader}
|
||||||
style:background-color={background ?? 'transparent'}
|
style:background-color={background ?? 'transparent'}
|
||||||
on:click={() => {
|
on:click={handleClick}
|
||||||
isOpen = !isOpen
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="hulyAccordionItem-header__label-wrapper {size === 'large' ? 'heading-medium-16' : 'font-medium-12'}"
|
class="hulyAccordionItem-header__label-wrapper {size === 'large' ? 'heading-medium-16' : 'font-medium-12'}"
|
||||||
|
@ -202,5 +202,6 @@ export const getTreeCollapsed = (_id: any): boolean => {
|
|||||||
|
|
||||||
export const setTreeCollapsed = (_id: any, collapsed: boolean): void => {
|
export const setTreeCollapsed = (_id: any, collapsed: boolean): void => {
|
||||||
if (_id === undefined || _id === 'undefined') return
|
if (_id === undefined || _id === 'undefined') return
|
||||||
localStorage.setItem(getCollapsedKey(_id), collapsed ? COLLAPSED : '')
|
const key = getCollapsedKey(_id)
|
||||||
|
collapsed ? localStorage.setItem(key, COLLAPSED) : localStorage.removeItem(key)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
import ToDoDraggable from './ToDoDraggable.svelte'
|
import ToDoDraggable from './ToDoDraggable.svelte'
|
||||||
import ToDoDuration from './ToDoDuration.svelte'
|
import ToDoDuration from './ToDoDuration.svelte'
|
||||||
import ToDoElement from './ToDoElement.svelte'
|
import ToDoElement from './ToDoElement.svelte'
|
||||||
import time from '../plugin'
|
|
||||||
import { dragging } from '../dragging'
|
import { dragging } from '../dragging'
|
||||||
import ToDoProjectGroup from './ToDoProjectGroup.svelte'
|
import ToDoProjectGroup from './ToDoProjectGroup.svelte'
|
||||||
import { getClient } from '@hcengineering/presentation'
|
import { getClient } from '@hcengineering/presentation'
|
||||||
@ -49,6 +48,8 @@
|
|||||||
|
|
||||||
let groups: Project[] | undefined = undefined
|
let groups: Project[] | undefined = undefined
|
||||||
let withoutProject: boolean = false
|
let withoutProject: boolean = false
|
||||||
|
|
||||||
|
$: id = `group:${title}`
|
||||||
$: groups = updateGroups(todos, projects)
|
$: groups = updateGroups(todos, projects)
|
||||||
|
|
||||||
const updateGroups = (_todos: WithLookup<ToDo>[], _projects: IdMap<Project>): Project[] | undefined => {
|
const updateGroups = (_todos: WithLookup<ToDo>[], _projects: IdMap<Project>): Project[] | undefined => {
|
||||||
@ -92,12 +93,12 @@
|
|||||||
|
|
||||||
{#if showTitle}
|
{#if showTitle}
|
||||||
<AccordionItem
|
<AccordionItem
|
||||||
|
{id}
|
||||||
label={title}
|
label={title}
|
||||||
size={'large'}
|
size={'large'}
|
||||||
bottomSpace={false}
|
bottomSpace={false}
|
||||||
counter={todos.length}
|
counter={todos.length}
|
||||||
duration={showDuration}
|
duration={showDuration}
|
||||||
isOpen={title !== time.string.Done}
|
|
||||||
fixHeader
|
fixHeader
|
||||||
background={'var(--theme-navpanel-color)'}
|
background={'var(--theme-navpanel-color)'}
|
||||||
>
|
>
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
|
|
||||||
let projectId: string | false
|
let projectId: string | false
|
||||||
|
|
||||||
|
$: id = project === undefined ? groupName : `group:${groupName}_project:${project === false ? 'none' : project?._id}`
|
||||||
$: icon = project
|
$: icon = project
|
||||||
? project.icon === view.ids.IconWithEmoji
|
? project.icon === view.ids.IconWithEmoji
|
||||||
? IconWithEmoji
|
? IconWithEmoji
|
||||||
@ -81,7 +82,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<AccordionItem {icon} {iconProps} {title} {label} size={'medium'} isOpen nested>
|
<AccordionItem {id} {icon} {iconProps} {title} {label} size={'medium'} nested>
|
||||||
{#each todos as todo, index}
|
{#each todos as todo, index}
|
||||||
<ToDoDraggable {todo} {index} {groupName} {projectId} on:drop={handleDrop}>
|
<ToDoDraggable {todo} {index} {groupName} {projectId} on:drop={handleDrop}>
|
||||||
<ToDoElement {todo} size={largeSize ? 'large' : 'small'} planned={mode !== 'unplanned'} />
|
<ToDoElement {todo} size={largeSize ? 'large' : 'small'} planned={mode !== 'unplanned'} />
|
||||||
|
Loading…
Reference in New Issue
Block a user