mirror of
https://github.com/hcengineering/platform.git
synced 2025-02-09 04:18:33 +00:00
86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
import { IntlString } from '@hcengineering/platform'
|
|
import { writable } from 'svelte/store'
|
|
import type { AnyComponent, AnySvelteComponent, LabelAndProps, TooltipAlignment } from './types'
|
|
|
|
const emptyTooltip: LabelAndProps = {
|
|
label: undefined,
|
|
element: undefined,
|
|
direction: undefined,
|
|
component: undefined,
|
|
props: undefined,
|
|
anchor: undefined,
|
|
onUpdate: undefined,
|
|
kind: 'tooltip'
|
|
}
|
|
let storedValue: LabelAndProps = emptyTooltip
|
|
export const tooltipstore = writable<LabelAndProps>(emptyTooltip)
|
|
|
|
export function tooltip (node: HTMLElement, options?: LabelAndProps): any {
|
|
let toHandler: any
|
|
if (options === undefined) {
|
|
return {}
|
|
}
|
|
let opt = options
|
|
const show = (): void => {
|
|
const shown = !!(storedValue.label !== undefined || storedValue.component !== undefined)
|
|
if (!shown) {
|
|
if (opt.kind !== 'submenu') {
|
|
clearTimeout(toHandler)
|
|
toHandler = setTimeout(() => {
|
|
showTooltip(opt.label, node, opt.direction, opt.component, opt.props, opt.anchor, opt.onUpdate, opt.kind)
|
|
}, 250)
|
|
} else {
|
|
showTooltip(opt.label, node, opt.direction, opt.component, opt.props, opt.anchor, opt.onUpdate, opt.kind)
|
|
}
|
|
}
|
|
}
|
|
const hide = (): void => {
|
|
clearTimeout(toHandler)
|
|
}
|
|
node.addEventListener('mouseleave', hide)
|
|
node.addEventListener('mousemove', show)
|
|
return {
|
|
update (options: LabelAndProps) {
|
|
opt = options
|
|
if (node !== storedValue.element) return
|
|
const shown = !!(storedValue.label !== undefined || storedValue.component !== undefined)
|
|
if (shown) {
|
|
showTooltip(opt.label, node, opt.direction, opt.component, opt.props, opt.anchor, opt.onUpdate, opt.kind)
|
|
}
|
|
},
|
|
|
|
destroy () {
|
|
node.removeEventListener('mousemove', show)
|
|
node.removeEventListener('mouseleave', hide)
|
|
}
|
|
}
|
|
}
|
|
|
|
export function showTooltip (
|
|
label: IntlString | undefined,
|
|
element: HTMLElement,
|
|
direction?: TooltipAlignment,
|
|
component?: AnySvelteComponent | AnyComponent,
|
|
props?: any,
|
|
anchor?: HTMLElement,
|
|
onUpdate?: (result: any) => void,
|
|
kind?: 'tooltip' | 'submenu'
|
|
): void {
|
|
storedValue = {
|
|
label,
|
|
element,
|
|
direction,
|
|
component,
|
|
props,
|
|
anchor,
|
|
onUpdate,
|
|
kind: kind ?? 'tooltip'
|
|
}
|
|
tooltipstore.set(storedValue)
|
|
}
|
|
|
|
export function closeTooltip (): void {
|
|
storedValue = emptyTooltip
|
|
tooltipstore.set(emptyTooltip)
|
|
}
|