tsgrid-ui 2.7.1 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +173 -0
- package/dist/base.d.ts +148 -0
- package/dist/base.es6.js +11 -0
- package/dist/base.es6.js.map +1 -0
- package/dist/chunks/chunk-26XP2XU3.js +1795 -0
- package/dist/chunks/chunk-26XP2XU3.js.map +1 -0
- package/dist/chunks/chunk-3NYH6545.js +2423 -0
- package/dist/chunks/chunk-3NYH6545.js.map +1 -0
- package/dist/chunks/chunk-BIB3X2TW.js +1638 -0
- package/dist/chunks/chunk-BIB3X2TW.js.map +1 -0
- package/dist/chunks/chunk-DXZJHS4M.js +1283 -0
- package/dist/chunks/chunk-DXZJHS4M.js.map +1 -0
- package/dist/chunks/chunk-EVZMMVXO.js +1212 -0
- package/dist/chunks/chunk-EVZMMVXO.js.map +1 -0
- package/dist/chunks/chunk-GJD5NFWQ.js +2305 -0
- package/dist/chunks/chunk-GJD5NFWQ.js.map +1 -0
- package/dist/chunks/chunk-IYF3Q7GX.js +127 -0
- package/dist/chunks/chunk-IYF3Q7GX.js.map +1 -0
- package/dist/chunks/chunk-OFASTA2A.js +2980 -0
- package/dist/chunks/chunk-OFASTA2A.js.map +1 -0
- package/dist/chunks/chunk-OMLGN735.js +677 -0
- package/dist/chunks/chunk-OMLGN735.js.map +1 -0
- package/dist/chunks/chunk-WKSLGUB3.js +1127 -0
- package/dist/chunks/chunk-WKSLGUB3.js.map +1 -0
- package/dist/chunks/chunk-YBY52G2U.js +849 -0
- package/dist/chunks/chunk-YBY52G2U.js.map +1 -0
- package/dist/field.d.ts +329 -0
- package/dist/field.es6.js +11 -0
- package/dist/field.es6.js.map +1 -0
- package/dist/form.d.ts +162 -0
- package/dist/form.es6.js +14 -0
- package/dist/form.es6.js.map +1 -0
- package/dist/layout.d.ts +108 -0
- package/dist/layout.es6.js +13 -0
- package/dist/layout.es6.js.map +1 -0
- package/dist/locale.d.ts +30 -0
- package/dist/locale.es6.js +7 -0
- package/dist/locale.es6.js.map +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/popup.d.ts +92 -0
- package/dist/popup.es6.js +18 -0
- package/dist/popup.es6.js.map +1 -0
- package/dist/query-CKGg5Ugv.d.ts +81 -0
- package/dist/sidebar.d.ts +138 -0
- package/dist/sidebar.es6.js +11 -0
- package/dist/sidebar.es6.js.map +1 -0
- package/dist/tabs.d.ts +63 -0
- package/dist/tabs.es6.js +11 -0
- package/dist/tabs.es6.js.map +1 -0
- package/dist/toolbar.d.ts +97 -0
- package/dist/toolbar.es6.js +11 -0
- package/dist/toolbar.es6.js.map +1 -0
- package/dist/tooltip.d.ts +322 -0
- package/dist/tooltip.es6.js +18 -0
- package/dist/tooltip.es6.js.map +1 -0
- package/dist/tsgrid-ui.css +2 -2
- package/dist/tsgrid-ui.d.ts +16 -2004
- package/dist/tsgrid-ui.es6.js +7750 -23830
- package/dist/tsgrid-ui.es6.js.map +1 -1
- package/dist/tsgrid-ui.es6.min.js +28 -28
- package/dist/tsgrid-ui.js +96 -17
- package/dist/tsgrid-ui.min.css +2 -2
- package/dist/tsgrid-ui.min.js +24 -24
- package/dist/tsutils-message-CogFtVtO.d.ts +82 -0
- package/dist/utils.d.ts +418 -0
- package/dist/utils.es6.js +14 -0
- package/dist/utils.es6.js.map +1 -0
- package/package.json +26 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tstooltip.ts"],"sourcesContent":["/**\n * Part of TsUi 2.0 library\n * - Dependencies: mQuery, TsUtils, TsBase\n *\n * T3.1: Ported to TypeScript with aggressive typing per typing_policy.\n * No @ts-nocheck. Targeted `any` sites documented with // any: comments.\n *\n * TODO:\n * - need help pages\n *\n * 2.0 Changes\n * - multiple tooltips to the same anchor\n * - options.contextMenu\n * - options.prefilter - if true, it will show prefiltered items for TsMenu, otherwise all\n * - menu.item.help, menu.item.hotkey, menu.item.extra\n * - options.selected -> for TsMenu\n * - options.tooltip => {}\n * - TsMenu event onTooltip\n * - added onMouseEnter and onMouseLeave for TsMenu\n */\n\nimport { TsBase } from './tsbase.js'\nimport { TsUtils } from './tsutils.js'\nimport { query as _queryRaw, Query } from './query.js'\n\n// TsTooltip always calls query() with a selector (never a callback), so return is always Query.\n// any: query() overload returns void when called with a callback; we only use selector calls here\nconst query = _queryRaw as (selector: unknown, context?: unknown) => Query\n\n// ---------------------------------------------------------------------------\n// Public interfaces for option shapes\n// ---------------------------------------------------------------------------\n\n/** Base options shared by all tooltip variants */\ninterface TooltipOptions {\n name?: string | null\n html?: string\n style?: string\n class?: string\n position?: string | string[]\n draggable?: boolean\n align?: string\n anchor?: HTMLElement | null\n contextMenu?: boolean\n anchorClass?: string\n anchorStyle?: string\n autoShow?: boolean\n autoShowOn?: string | null\n autoHideOn?: string | null\n arrowSize?: number\n screenMargin?: number\n autoResize?: boolean\n margin?: number\n offsetX?: number\n offsetY?: number\n maxWidth?: number | null\n maxHeight?: number | null\n hideOn?: string | string[] | null\n onThen?: ((event: unknown) => void) | null\n onShow?: ((event: unknown) => void) | null\n onHide?: ((event: unknown) => void) | null\n onUpdate?: ((event: unknown) => void) | null\n onMove?: ((event: unknown) => void) | null\n // runtime-only fields added during attach\n _keep?: boolean\n text?: string\n [key: string]: unknown // any: options objects are open-ended; runtime code adds fields freely\n}\n\n/** A single menu item */\ninterface MenuItem {\n id?: string | number | null\n text?: string | null | ((item: MenuItem, options: MenuOptions) => string)\n style?: string\n icon?: string | null\n count?: string | number | null\n tooltip?: string | { html?: string; [key: string]: unknown } | null\n hint?: string | null\n hotkey?: string | null\n removable?: boolean | null\n remove?: boolean | null\n help?: string | null\n items?: MenuItem[] | ((item: MenuItem) => MenuItem[]) | null\n indent?: number\n type?: 'check' | 'radio' | 'break' | null\n group?: string | boolean | null\n expanded?: boolean\n hidden?: boolean\n checked?: boolean | null\n disabled?: boolean\n keepOpen?: boolean | null\n extra?: string\n _noSearchInside?: boolean\n [key: string]: unknown // any: menu items carry arbitrary runtime fields (e.g., data-* mirrors)\n}\n\n/** Options for TsMenu (MenuTooltip) */\ninterface MenuOptions extends TooltipOptions {\n type?: 'normal' | 'radio' | 'check'\n items?: MenuItem[]\n selected?: null | string | number | MenuItem | Array<string | number | MenuItem>\n render?: ((item: MenuItem, options: MenuOptions) => string) | null\n spinner?: boolean\n msgNoItems?: string\n msgSearch?: string\n topHTML?: string\n menuStyle?: string\n search?: boolean\n filter?: boolean\n match?: 'contains' | 'is' | 'begins' | 'begins with' | 'ends' | 'ends with' | 'regexp'\n markSearch?: boolean\n prefilter?: boolean\n altRows?: boolean\n url?: string\n postData?: Record<string, unknown>\n method?: string\n recId?: string | ((item: Record<string, unknown>) => unknown) | null\n recid?: string | null\n recText?: string | ((item: Record<string, unknown>) => unknown) | null\n cacheMax?: number\n minLength?: number\n debounce?: number\n hideSelected?: boolean\n parentOverlay?: TooltipOverlay | null\n parents?: number[]\n onSelect?: ((event: unknown) => void) | null\n onSubMenu?: ((event: unknown) => void) | null\n onRemove?: ((event: unknown) => void) | null\n onTooltip?: ((event: unknown) => void) | null\n onMouseEnter?: ((event: unknown) => void) | null\n onMouseLeave?: ((event: unknown) => void) | null\n}\n\n/** Options for TsColor (ColorTooltip) */\ninterface ColorOptions extends TooltipOptions {\n advanced?: boolean\n transparent?: boolean\n color?: string\n updateInput?: boolean\n onSelect?: ((event: unknown) => void) | null\n onLiveUpdate?: ((event: unknown) => void) | null\n}\n\n/** Options for TsDate (DateTooltip) */\ninterface DateOptions extends TooltipOptions {\n type?: 'date' | 'time' | 'datetime'\n value?: string\n format?: string\n start?: string | HTMLElement | null\n end?: string | HTMLElement | null\n btnNow?: boolean\n blockDates?: string[]\n blockWeekdays?: number[]\n colored?: Record<string, string>\n noMinutes?: boolean\n startTime?: string\n endTime?: string\n onSelect?: ((event: unknown) => void) | null\n}\n\n/** The overlay object — a TsBase instance extended at runtime with many dynamic props */\n// any: overlay is a TsBase extended by Object.assign at runtime with anchor, options, tmp, etc.\n// The shape cannot be expressed as a static interface without lying about the full structure.\ntype TooltipOverlay = // any: dynamic TsBase extension\n InstanceType<typeof TsBase> & {\n id: string\n name: string\n options: TooltipOptions & MenuOptions & ColorOptions & DateOptions\n anchor: HTMLElement\n self: Tooltip\n displayed: boolean\n box: HTMLElement & { overlay?: TooltipOverlay } | null\n needsUpdate?: boolean\n prevOptions?: TooltipOptions\n // any: tmp is a grab-bag of runtime state (observers, scroll positions, search state, etc.)\n tmp: Record<string, unknown>\n selected?: string | number | null\n newColor?: string\n newValue?: string\n newDate?: string\n next?: () => void\n prev?: () => void\n click?: () => void\n hide: () => void\n }\n\n/** Return value of Tooltip.attach() */\ninterface AttachReturn {\n overlay: TooltipOverlay\n then: (callback: (event: unknown) => void) => AttachReturn\n show: (callback: (event: unknown) => void) => AttachReturn\n hide: (callback: (event: unknown) => void) => AttachReturn\n update: (callback: (event: unknown) => void) => AttachReturn\n move: (callback: (event: unknown) => void) => AttachReturn\n liveUpdate?: (callback: (event: unknown) => void) => AttachReturn\n select?: (callback: (event: unknown) => void) => AttachReturn\n remove?: (callback: (event: unknown) => void) => AttachReturn\n subMenu?: (callback: (event: unknown) => void) => AttachReturn\n}\n\n/** Position calculation result */\ninterface TooltipPosition {\n left: number\n top: number\n arrow: { offset: number; class: string; style: string }\n adjust: { left: number; top: number }\n width?: number\n height?: number\n pos: string\n}\n\nclass Tooltip {\n // no need to extend TsBase, as each individual tooltip extends it\n static active: Record<string, TooltipOverlay> = {}\n defaults: TooltipOptions\n // any: setColor is assigned dynamically inside ColorTooltip.initControls closure\n setColor?: (color: Partial<{ h: number; s: number; v: number; a: number }>, fullUpdate?: boolean, initial?: string) => void\n // optional hook — overridden in subclasses; declared as method stub to allow subclass override\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initControls(_overlay: any): void { /* overridden in ColorTooltip, MenuTooltip, DateTooltip */ }\n\n constructor() {\n this.defaults = {\n name : null, // name for the overlay, otherwise input id is used\n html : '', // text or html\n style : '', // additional style for the overlay\n class : '', // add class for tsg-tooltip-body\n position : 'top|bottom', // can be left, right, top, bottom\n draggable : false, // if true, then tooltip can be move with mouse\n align : '', // can be: both, both:XX left, right, both, top, bottom\n anchor : null, // element it is attached to, if anchor is body, then it is context menu\n contextMenu : false, // if true, then it is context menu\n anchorClass : '', // add class for anchor when tooltip is shown\n anchorStyle : '', // add style for anchor when tooltip is shown\n autoShow : false, // if autoShow true, then tooltip will show on mouseEnter and hide on mouseLeave\n autoShowOn : null, // when options.autoShow = true, mouse event to show on\n autoHideOn : null, // when options.autoShow = true, mouse event to hide on\n arrowSize : 8, // size of the carret\n screenMargin : 2, // min margin from screen to tooltip\n autoResize : true, // auto resize based on content size and available size\n margin : 1, // distance from the anchor\n offsetX : 0, // delta for left coordinate\n offsetY : 0, // delta for top coordinate\n maxWidth : null, // max width\n maxHeight : null, // max height\n hideOn : null, // events when to hide tooltip, ['doc-click', 'tooltip-click', 'focus-change', 'select', 'item-remove', ... or any standard event on the anchor],\n onThen : null, // called when displayed\n onShow : null, // callBack when shown\n onHide : null, // callBack when hidden\n onUpdate : null, // callback when tooltip gets updated\n onMove : null // callback when tooltip is moved\n }\n }\n\n static observeRemove = new MutationObserver((_mutations) => {\n let cnt = 0\n Object.keys(Tooltip.active).forEach(name => {\n const overlay = Tooltip.active[name]\n if (overlay?.displayed) {\n if (!overlay.anchor || !overlay.anchor.isConnected) {\n overlay.hide()\n } else {\n cnt++\n }\n }\n })\n // remove observer, as there is no active tooltips\n if (cnt === 0) {\n Tooltip.observeRemove.disconnect()\n }\n })\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trigger(event: any, data?: any): { isCancelled?: boolean; finish: () => void; detail?: Record<string, unknown> } { // any: event is string or object; data carries event payload\n if (arguments.length == 2) {\n const type = event\n event = data\n data.type = type\n }\n if (event.overlay) {\n return event.overlay.trigger(event)\n } else {\n console.log('ERROR: cannot find overlay where to trigger events')\n return { finish: () => {} } // stub edata when overlay is missing\n }\n }\n\n get(name?: string | true): string[] | Record<string, TooltipOverlay> | TooltipOverlay | undefined {\n if (arguments.length == 0) {\n return Object.keys(Tooltip.active)\n } else if (name === true) {\n return Tooltip.active\n } else {\n return Tooltip.active[(name ?? '').replace(/[\\s\\.#]/g, '_')]\n }\n }\n\n attach(anchorArg?: HTMLElement | TooltipOptions | null, textArg?: string | TooltipOptions): AttachReturn | undefined {\n // any: anchor/text/options are mutated across branches; runtime shape determined by call path\n // any: overlay is a TsBase extended via Object.assign; full shape not statically knowable\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let anchor: any = anchorArg // any: reassigned to HTMLElement or options.anchor in branches\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let text: any = textArg // any: reassigned to string in some branches\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let options: any // any: merged from defaults + user options; open-ended shape\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let overlay: any // any: TsBase + Object.assign runtime extension\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self: Tooltip = this\n if (arguments.length == 0) {\n return\n } else if (arguments.length == 1 && anchor instanceof Object) {\n options = anchor\n anchor = options.anchor\n } else if (arguments.length === 2 && typeof text === 'string') {\n options = { anchor, html: text }\n text = options.html\n } else if (arguments.length === 2 && text != null && typeof text === 'object') {\n options = text\n text = options.html\n }\n options = TsUtils.extend({}, this.defaults, options || {})\n if (!text && options.text) text = options.text\n if (!text && options.html) text = options.html\n // anchor is func var\n delete options.anchor\n\n // define tooltip\n let name = (options.name ? options.name : anchor?.id)\n if (anchor == document || anchor == null) {\n anchor = document.body\n }\n if (options.contextMenu) {\n anchor = document.body\n name = name ?? 'context-menu'\n }\n if (!name) {\n name = 'noname-' + Object.keys(Tooltip.active).length\n console.log('NOTICE: name property is not defined for tooltip, could lead to too many instances')\n }\n // clean name as it is used as id and css selector\n name = name.replace(/[\\s\\.#]/g, '_')\n if (Tooltip.active[name]) {\n overlay = Tooltip.active[name]\n overlay.prevOptions = overlay.options\n overlay.options = options // do not merge or extend, otherwiser menu items get merged too\n // overlay.options = TsUtils.extend({}, overlay.options, options)\n overlay.anchor = anchor // as HTML elements are not copied\n if (overlay.prevOptions.html != overlay.options.html || overlay.prevOptions.class != overlay.options.class\n || overlay.prevOptions.style != overlay.options.style) {\n overlay.needsUpdate = true\n }\n options = overlay.options // it was recreated\n // clear all previous overlay events\n Object.keys(overlay).forEach(key => {\n const val = overlay[key]\n if (key.startsWith('on') && typeof val == 'function') {\n delete overlay[key]\n }\n })\n } else {\n overlay = new TsBase()\n Object.assign(overlay, {\n id: 'w2overlay-' + name,\n name, options, anchor, self,\n displayed: false,\n tmp: {\n observeTooltipResize: new ResizeObserver(() => {\n this.resize(overlay.name)\n }),\n observeAnchorResize: new ResizeObserver(() => {\n this.resize(overlay.name)\n }),\n observeAnchorMove: new MutationObserver((mutations) => {\n // any: MutationObserver target is Node; cast to Element to access getBoundingClientRect\n const target = mutations[0]!.target as Element & { _lastBoundingRect?: DOMRect }\n const currRect = target.getBoundingClientRect()\n const lastRect = target._lastBoundingRect\n if (!target._lastBoundingRect) {\n target._lastBoundingRect = currRect\n } else if (currRect.left !== lastRect!.left || currRect.top !== lastRect!.top) {\n this.resize(overlay.name)\n target._lastBoundingRect = currRect\n }\n })\n },\n hide() {\n self.hide(name)\n }\n })\n Tooltip.active[name] = overlay\n }\n // move events on to overlay layer\n Object.keys(overlay.options).forEach(key => {\n const val = overlay.options[key]\n if (key.startsWith('on') && typeof val == 'function') {\n overlay[key] = val\n delete overlay.options[key]\n }\n })\n // add event for auto show/hide\n if (options.autoShow === true) {\n options.autoShowOn = options.autoShowOn ?? 'mouseenter'\n options.autoHideOn = options.autoHideOn ?? 'mouseleave'\n options.autoShow = false\n options._keep = true\n }\n if (options.autoShowOn) {\n const scope = 'autoShow-' + overlay.name\n query(anchor)\n .off(`.${scope}`)\n .on(`${options.autoShowOn}.${scope}`, event => {\n self.show(overlay.name)\n event.stopPropagation()\n })\n delete options.autoShowOn\n options._keep = true\n }\n if (options.autoHideOn) {\n const scope = 'autoHide-' + overlay.name\n query(anchor)\n .off(`.${scope}`)\n .on(`${options.autoHideOn}.${scope}`, event => {\n self.hide(overlay.name)\n event.stopPropagation()\n })\n delete options.autoHideOn\n options._keep = true\n }\n overlay.off('.attach')\n const ret = {\n overlay,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n then: (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show:after.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n show: (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hide: (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('hide.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n update: (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('update.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n move: (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('move.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n }\n }\n return ret\n }\n\n update(name: string, html: string): void {\n const overlay = Tooltip.active[name]\n if (overlay) {\n overlay.needsUpdate = true\n overlay.options.html = html\n this.show(name)\n } else {\n console.log(`Tooltip \"${name}\" is not displayed. Cannot update it.`)\n }\n }\n\n show(name?: string | HTMLElement | TooltipOptions, extraOptions?: TooltipOptions): AttachReturn | { overlay: TooltipOverlay } | undefined { // any: name is polymorphic (string|HTMLElement|options)\n if (name instanceof HTMLElement || name instanceof Object) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let options: any = name // any: name is object-as-options in this branch\n if (name instanceof HTMLElement) {\n options = extraOptions || {}\n options.anchor = name\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ret: any = this.attach(options) // any: AttachReturn overlay is runtime-extended\n ret.overlay.tmp.hidden = false\n\n query(ret.overlay.anchor)\n .off('.autoShow-' + ret.overlay.name)\n .off('.autoHide-' + ret.overlay.name)\n\n /**\n * Need a timer, so that events in the 'return ret` would be properly set as it is using chaining mechanism\n * to set listeners: TsTooltip.show({}).then(...).show(...). Since it could be hidden before timer kick in\n * to show it, need the check in the timeout.\n */\n setTimeout(() => {\n if (!ret.overlay.tmp.hidden) {\n this.show(ret.overlay.name)\n if (this.initControls) {\n this.initControls(ret.overlay)\n }\n }\n }, 1)\n return ret\n }\n let edata\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = Tooltip.active[(name as string).replace(/[\\s\\.#]/g, '_')] // any: runtime overlay\n if (!overlay) return\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options: any = overlay.options // any: options is open-ended TooltipOptions at runtime\n if (!overlay || (overlay.displayed && !overlay.needsUpdate)) {\n this.resize(overlay?.name)\n return\n }\n const position = options.position.split('|')\n const isVertical = ['top', 'bottom'].includes(position[0])\n // enforce nowrap only when align=both and vertical\n let overlayStyles = (options.align == 'both' && isVertical ? '' : 'white-space: nowrap;')\n /**\n * If max-width is set in the html, then use it to calculate the width of the tooltip. This is needed to avoid\n * slow expansion of the tooltip bug.\n */\n if (options.maxWidth == null && /^<div[^>]*style=[\"'][^\"']*max-width[^\"']*[\"'][^>]*>/i.test(options.html?.trim?.() ?? '')) {\n options.maxWidth = TsUtils.getStrWidth(options.html, '', true)\n }\n if (options.maxWidth && TsUtils.getStrWidth(options.html, '', true) >= options.maxWidth) {\n overlayStyles = 'width: '+ options.maxWidth + 'px; white-space: inherit; overflow: auto;'\n }\n overlayStyles += ' max-height: '+ (options.maxHeight ? options.maxHeight : window.innerHeight - 4) + 'px;'\n // if empty content - then hide it\n if (options.html === '' || options.html == null) {\n self.hide(name)\n return\n } else if (overlay.box) {\n // if already present, update it\n edata = this.trigger('update', { target: name, overlay })\n if (edata.isCancelled === true) {\n // restore previous options\n if (overlay.prevOptions) {\n overlay.options = overlay.prevOptions\n delete overlay.prevOptions\n }\n return\n }\n query(overlay.box)\n .find('.tsg-overlay-body')\n .attr('style', (options.style || '') + '; ' + overlayStyles)\n .removeClass(null) // removes all classes\n .addClass('tsg-overlay-body ' + options.class + (options.draggable ? ' tsg-draggable' : ''))\n .html(options.html)\n this.resize(overlay.name)\n } else {\n // event before\n edata = this.trigger('show', { target: name, overlay })\n if (edata.isCancelled === true) return\n // normal processing\n query('body').append(\n // pointer-events will be re-enabled leter\n `<div id=\"${overlay.id}\" name=\"${name}\" style=\"display: none; pointer-events: none\" class=\"tsg-overlay\"\n data-click=\"stop\" data-focusin=\"stop\">\n <style></style>\n <div class=\"tsg-overlay-body tsg-eaction ${options.class} ${options.draggable ? 'tsg-draggable' : ''}\"\n style=\"${options.style || ''}; ${overlayStyles}\" ${options.draggable ? 'data-mousedown=\"startDrag|event\"' : ''}>\n ${options.html}\n </div>\n </div>`)\n overlay.box = query('#' + TsUtils.escapeId(overlay.id))[0]\n overlay.displayed = true\n const names: string[] = (query(overlay.anchor).data('tooltipName') ?? []) as string[] // any: data() returns unknown; runtime-validated as string[]\n names.push(name as string)\n query(overlay.anchor).data('tooltipName', names) // make available to element overlay attached to\n TsUtils.bindEvents(overlay.box, {})\n // remember anchor's original styles\n overlay.tmp.originalCSS = ''\n if (query(overlay.anchor).length > 0) {\n overlay.tmp.originalCSS = (query(overlay.anchor)[0] as HTMLElement).style.cssText // any: query [0] is Node; anchor is always HTMLElement\n }\n this.resize(overlay.name)\n }\n if (options.anchorStyle) {\n overlay.anchor.style.cssText += ';' + options.anchorStyle\n }\n if (options.anchorClass) {\n // do not add tsg-focus to body\n if (!(options.anchorClass == 'tsg-focus' && overlay.anchor == document.body)) {\n query(overlay.anchor).addClass(options.anchorClass)\n }\n }\n // add on hide events\n if (typeof options.hideOn == 'string') options.hideOn = [options.hideOn]\n if (!Array.isArray(options.hideOn)) options.hideOn = []\n // initial scroll\n Object.assign(overlay.tmp, {\n scrollLeft: document.body.scrollLeft,\n scrollTop: document.body.scrollTop\n })\n addHideEvents()\n addWatchEvents(document.body)\n // first show empty tooltip, so it will popup up in the right position\n query(overlay.box).show()\n overlay.tmp.observeTooltipResize.observe(overlay.box)\n overlay.tmp.observeAnchorResize.observe(overlay.anchor)\n overlay.tmp.observeAnchorMove.observe(overlay.anchor, { attributes: true })\n // observer element removal from DOM\n Tooltip.observeRemove.observe(document.body, { subtree: true, childList: true })\n // then insert html and it will adjust\n // any: .css() returns string|Query|undefined; at runtime with object arg it always returns Query\n ;(query(overlay.box).css('opacity', 1) as unknown as Query)\n .find('.tsg-overlay-body')\n .html(options.html)\n /**\n * pointer-events: none is needed to avoid cases when popup is shown right under the cursor\n * or it will trigger onmouseout, onmouseleave and other events.\n */\n setTimeout(() => { (query(overlay.box).css({ 'pointer-events': 'auto' }) as unknown as Query).data('ready', 'yes') }, 100) // any: css() with object returns Query\n\n // bind events\n TsUtils.bindEvents(query(overlay.box).find('.tsg-eaction'), this as unknown as Record<string, unknown>) // any: bindEvents accepts event handler object; Tooltip is valid\n\n delete overlay.needsUpdate\n // expose overlay to DOM element\n overlay.box.overlay = overlay\n // click / drag: raise stacking order among sibling overlays (DOM order, not z-index)\n query(overlay.box)\n .off('mousedown.tsg-bringfront')\n .on('mousedown.tsg-bringfront', () => {\n self.bringOverlayToFront(overlay)\n })\n // event after\n if (edata) edata.finish()\n return { overlay }\n\n function addWatchEvents(el: HTMLElement) {\n const scope = 'tooltip-' + overlay.name\n let queryEl: HTMLElement | Document = el\n if (el.tagName == 'BODY') {\n queryEl = el.ownerDocument\n }\n query(queryEl)\n .off(`.${scope}`)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on(`scroll.${scope}`, (_event: any) => { // any: query event shape\n Object.assign(overlay.tmp, {\n scrollLeft: el.scrollLeft,\n scrollTop: el.scrollTop\n })\n self.resize(overlay.name)\n })\n }\n\n function addHideEvents() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hide = (_event: any) => { self.hide(overlay.name) } // any: event from query listener\n const $anchor = query(overlay.anchor)\n const scope = 'tooltip-' + overlay.name\n // document click\n query('html').off(`.${scope}`)\n if (options.hideOn.includes('doc-click')) {\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n // otherwise hides on click to focus\n $anchor\n .off(`.${scope}-doc`)\n .on(`click.${scope}-doc`, (event) => { event.stopPropagation() })\n }\n query('html').on(`click.${scope}`, hide)\n }\n if (options.hideOn.includes('tooltip-click')) {\n query(overlay.box)\n .off(`click.${scope}`)\n .on(`click.${scope}`, hide)\n }\n if (options.hideOn.includes('focus-change') || options.hideOn.includes('blur')) {\n query('html')\n .on(`focusin.${scope}`, (_e) => {\n if (document.activeElement != overlay.anchor) {\n self.hide(overlay.name)\n }\n })\n }\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n $anchor.off(`.${scope}`)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options.hideOn.forEach((event: any) => { // any: hideOn is string[]\n if (['doc-click', 'focus-change', 'blur'].indexOf(event) == -1) {\n $anchor.on(`${event}.${scope}`, { once: true }, hide)\n }\n })\n }\n }\n }\n\n hide(name?: string | HTMLElement): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let overlay: any // any: TooltipOverlay extended at runtime; property access is runtime-safe\n if (arguments.length == 0) {\n // hide all tooltips\n Object.keys(Tooltip.active).forEach(name => { this.hide(name) })\n return\n }\n if (name instanceof HTMLElement) {\n const names = (query(name).data('tooltipName') ?? []) as string[] // any: data() unknown; runtime is string[]\n names.forEach(name => { this.hide(name) })\n return\n }\n if (typeof name == 'string') {\n name = name.replace(/[\\s\\.#]/g, '_')\n overlay = Tooltip.active[name]\n }\n if (overlay?.tmp) overlay.tmp.hidden = true // it could be hidden before it is actually shown\n if (!overlay || !overlay.box) return\n\n // event before\n const edata = this.trigger('hide', { target: name, overlay })\n if (edata.isCancelled === true) return\n\n // normal processing\n if (!overlay.options._keep) delete Tooltip.active[name as string]\n const scope = 'tooltip-' + overlay.name\n overlay.tmp.observeTooltipResize?.disconnect()\n overlay.tmp.observeAnchorResize?.disconnect()\n overlay.tmp.observeAnchorMove?.disconnect()\n // if no active tooltip then disable observeRemove\n let cnt = 0\n Object.keys(Tooltip.active).forEach(key => {\n const overlay = Tooltip.active[key]\n if (overlay?.displayed) {\n cnt++\n }\n })\n if (cnt == 0) {\n Tooltip.observeRemove.disconnect()\n }\n query('html').off(`.${scope}`) // hide to click event here\n query(document).off(`.${scope}`) // scroll event here\n // remove element\n overlay.box?.remove()\n overlay.box = null\n overlay.displayed = false\n // remove name from anchor properties\n const names = (query(overlay.anchor).data('tooltipName') ?? []) as string[] // any: data() unknown; runtime is string[]\n const ind = names.indexOf(overlay.name)\n if (ind != -1) names.splice(names.indexOf(overlay.name), 1)\n if (names.length == 0) {\n query(overlay.anchor).removeData('tooltipName')\n } else {\n query(overlay.anchor).data('tooltipName', names)\n }\n // restore original CSS, only if anchor styles where extended\n if (overlay.options.anchorStyle) {\n overlay.anchor.style.cssText = overlay.tmp.originalCSS\n }\n query(overlay.anchor)\n .off(`.${scope}`)\n .removeClass(overlay.options.anchorClass)\n // for remote data source\n if (overlay.options.url) {\n // remove all cached items\n overlay.options.items.splice(0)\n overlay.tmp.remote.hasMore = true\n overlay.tmp.remote.search = null\n }\n // event after\n edata.finish()\n }\n\n resize(name?: string): { moved: boolean; resize: boolean } | { multiple: boolean } | void {\n const state = { moved: false, resize: false }\n if (arguments.length == 0) {\n Object.keys(Tooltip.active).forEach(key => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = Tooltip.active[key] // any: runtime overlay shape\n if (overlay.displayed) this.resize(overlay.name)\n })\n return { multiple: true }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = Tooltip.active[(name ?? '').replace(/[\\s\\.#]/g, '_')] // any: runtime overlay\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const pos: any = this.getPosition(overlay.name) // any: pos may be undefined or TooltipPosition\n const newPos = pos.left + 'x' + pos.top\n const newSize = pos.width + 'x' + pos.height\n let edata1, edata2\n if (overlay.tmp.lastPos != newPos) {\n edata1 = this.trigger('move', { target: name, overlay, pos })\n state.moved = true\n }\n if (overlay.tmp.lastSize != newSize) {\n edata2 = this.trigger('resize', { target: name, overlay, pos })\n state.moved = true\n }\n // any: .css({}) returns Query at runtime (object arg path); TypeScript types it as string|Query|... union\n // any: Query.css({object}) always returns Query; TypeScript union type makes .then() ambiguous\n const qBox = query(overlay.box).css({\n left: pos.left + 'px',\n top : pos.top + 'px'\n }) as unknown as Query\n qBox.then((q: Query): Query => {\n if (pos.width != null) {\n (q.css('width', pos.width + 'px') as unknown as Query)\n .find('.tsg-overlay-body')\n .css('width', '100%')\n }\n if (pos.height != null) {\n (q.css('height', pos.height + 'px') as unknown as Query)\n .find('.tsg-overlay-body')\n .css('height', '100%')\n }\n return q\n })\n .find('.tsg-overlay-body')\n .removeClass('tsg-arrow-right tsg-arrow-left tsg-arrow-top tsg-arrow-bottom')\n .addClass(pos.arrow.class)\n .closest('.tsg-overlay')\n .find('style:first-child')\n .text(pos.arrow.style)\n\n if (overlay.tmp.lastPos != newPos && edata1) {\n overlay.tmp.lastPos = newPos\n edata1.finish()\n }\n if (overlay.tmp.lastSize != newSize && edata2) {\n overlay.tmp.lastSize = newSize\n edata2.finish()\n }\n return state\n }\n\n getPosition(name: string): TooltipPosition | undefined {\n // any: overlay.options and anchor positions are runtime-extended DOMRect-like objects\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]\n if (!overlay || !overlay.box) {\n return\n }\n const options = overlay.options\n if (overlay.tmp.resizedY || overlay.tmp.resizedX) {\n query(overlay.box).css({ width: '', height: '', scroll: 'auto' })\n }\n const scrollSize = TsUtils.scrollBarSize() as number // any: scrollBarSize returns unknown (tmp bag); runtime is always number\n const hasScrollBarX = !(document.body.scrollWidth == document.body.clientWidth)\n const hasScrollBarY = !(document.body.scrollHeight == document.body.clientHeight)\n const max = {\n width: window.innerWidth - (hasScrollBarY ? scrollSize : 0),\n height: window.innerHeight - (hasScrollBarX ? scrollSize : 0)\n }\n const position = options.position == 'auto'\n ? 'top|bottom|right|left'.split('|')\n : Array.isArray(options.position) ? options.position : options.position.split('|')\n const isVertical = ['top', 'bottom'].includes(position[0])\n const content = overlay.box.getBoundingClientRect()\n let anchor = overlay.anchor?.getBoundingClientRect?.()\n\n // minimal width should be a least content width (avoid slow expansion of the tooltip bug)\n const min_width = TsUtils.getStrWidth(options.html, '', true)\n if (content.width < min_width) content.width = min_width\n\n if (overlay.anchor == document.body) {\n // context menu\n let evt = options.originalEvent\n while (evt?.originalEvent) { evt = evt.originalEvent }\n const { x, y, width, height } = evt ?? { x: options.x, y: options.y, width: 0, height: 10 }\n anchor = {\n left: x - (options.contextMenu ? 4: 0),\n top: y - (options.contextMenu ? 4: 0),\n width: width ?? 0,\n height: height ?? 10,\n arrow: options.contextMenu ? 'none' : null\n }\n }\n let arrowSize = options.arrowSize\n if (anchor.arrow == 'none') arrowSize = 0\n if (isNaN(arrowSize)) arrowSize = this.defaults.arrowSize\n\n // space available\n const available: Record<string, number> = { // tipsize adjustment should be here, not in max.width/max.height\n top: anchor.top - arrowSize,\n bottom: max.height - arrowSize - (anchor.top + anchor.height) - (hasScrollBarX ? scrollSize : 0) - 2,\n left: anchor.left,\n right: max.width - (anchor.left + anchor.width) + (hasScrollBarY ? scrollSize : 0),\n }\n // size of empty tooltip\n if (content.width < 22) content.width = 22\n if (content.height < 14) content.height = 14\n let left: number | undefined, top: number | undefined, width: number | undefined, height: number | undefined // tooltip position\n let found = ''\n const arrow = {\n offset: 0,\n class: '',\n style: `#${overlay.id} { --tip-size: ${arrowSize}px; }`\n }\n const adjust = { left: 0, top: 0 }\n const bestFit = { posX: '', x: 0, posY: '', y: 0 }\n\n // find best position\n position.forEach((pos: string) => {\n const avail = available[pos] ?? 0\n if (['top', 'bottom'].includes(pos)) {\n if (!found && (content.height + arrowSize/1.893) < avail) { // 1.893 = 1 + sin(90)\n found = pos\n }\n if (avail > bestFit.y) {\n Object.assign(bestFit, { posY: pos, y: avail })\n }\n }\n if (['left', 'right'].includes(pos)) {\n if (!found && (content.width + arrowSize/1.893) < avail) { // 1.893 = 1 + sin(90)\n found = pos\n }\n if (avail > bestFit.x) {\n Object.assign(bestFit, { posX: pos, x: avail })\n }\n }\n })\n // if not found, use best (greatest available space) position\n if (!found) {\n if (isVertical) {\n found = bestFit.posY\n } else {\n found = bestFit.posX\n }\n }\n if (options.autoResize) {\n if (['top', 'bottom'].includes(found)) {\n const availFound = available[found] ?? 0\n if (content.height > availFound) {\n height = availFound\n overlay.tmp.resizedY = true\n } else {\n overlay.tmp.resizedY = false\n }\n }\n if (['left', 'right'].includes(found)) {\n const availFound = available[found] ?? 0\n if (content.width > availFound) {\n width = availFound\n overlay.tmp.resizedX = true\n } else {\n overlay.tmp.resizedX = false\n }\n }\n }\n usePosition(found)\n if (isVertical) anchorAlignment()\n\n // user offset\n top = (top ?? 0) + parseFloat(String(options.offsetY * (found == 'top' ? -1 : 1))) // offset will always move from original position\n left = (left ?? 0) + parseFloat(String(options.offsetX * (found == 'left' ? -1 : 1))) // offset will always move from original position\n\n // make sure it is inside visible screen area\n screenAdjust()\n\n // adjust for scrollbar\n const extraTop = (found == 'top' ? -options.margin : (found == 'bottom' ? options.margin : 0))\n const extraLeft = (found == 'left' ? -options.margin : (found == 'right' ? options.margin : 0))\n top = Math.floor(((top ?? 0) + parseFloat(extraTop)) * 100) / 100\n left = Math.floor(((left ?? 0) + parseFloat(extraLeft)) * 100) / 100\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const retPos: any = { left: left ?? 0, top: top ?? 0, arrow, adjust, pos: found } // any: exactOptionalPropertyTypes — build conditionally\n if (width != null) retPos.width = width\n if (height != null) retPos.height = height\n return retPos as TooltipPosition\n\n function usePosition(pos: string) {\n arrow.class = anchor.arrow ? anchor.arrow : `tsg-arrow-${pos}`\n switch (pos) {\n case 'top': {\n left = anchor.left + (anchor.width - (width ?? content.width)) / 2\n top = anchor.top - (height ?? content.height) - arrowSize / 1.5 + 1\n break\n }\n case 'bottom': {\n left = anchor.left + (anchor.width - (width ?? content.width)) / 2\n top = anchor.top + anchor.height + arrowSize / 1.25 + 1\n break\n }\n case 'left': {\n left = anchor.left - (width ?? content.width) - arrowSize / 1.2 - 1\n top = anchor.top + (anchor.height - (height ?? content.height)) / 2\n break\n }\n case 'right': {\n left = anchor.left + anchor.width + arrowSize / 1.2 + 1\n top = anchor.top + (anchor.height - (height ?? content.height)) / 2\n break\n }\n }\n }\n\n function anchorAlignment() {\n // top/bottom alignments\n if (options.align == 'left') {\n adjust.left = anchor.left - (left ?? 0)\n left = anchor.left\n }\n if (options.align == 'right') {\n adjust.left = (anchor.left + anchor.width - (width ?? content.width)) - (left ?? 0)\n left = anchor.left + anchor.width - (width ?? content.width)\n }\n if (['top', 'bottom'].includes(found) && options.align.startsWith('both')) {\n const minWidth = options.align.split(':')[1] ?? 50\n if (anchor.width >= minWidth) {\n left = anchor.left\n width = anchor.width\n }\n }\n // left/right alignments\n if (options.align == 'top') {\n adjust.top = anchor.top - (top ?? 0)\n top = anchor.top\n }\n if (options.align == 'bottom') {\n adjust.top = (anchor.top + anchor.height - (height ?? content.height)) - (top ?? 0)\n top = anchor.top + anchor.height - (height ?? content.height)\n }\n if (['left', 'right'].includes(found) && options.align.startsWith('both')) {\n const minHeight = options.align.split(':')[1] ?? 50\n if (anchor.height >= minHeight) {\n top = anchor.top\n height = anchor.height\n }\n }\n }\n\n function screenAdjust() {\n let adjustArrow\n // adjust tip if needed after alignment\n if ((['left', 'right'].includes(options.align) && anchor.width < (width ?? content.width))\n || (['top', 'bottom'].includes(options.align) && anchor.height < (height ?? content.height))\n ) {\n adjustArrow = true\n }\n // if off screen then adjust\n const minLeft = (found == 'right' ? arrowSize : options.screenMargin)\n const minTop = (found == 'bottom' ? arrowSize : options.screenMargin)\n const maxLeft = max.width - (width ?? content.width) - (found == 'left' ? arrowSize : options.screenMargin)\n const maxTop = max.height - (height ?? content.height) - (found == 'top' ? arrowSize : options.screenMargin) + 3\n // adjust X\n if (['top', 'bottom'].includes(found) || options.autoResize) {\n if ((left ?? 0) < minLeft) {\n adjustArrow = true\n adjust.left -= (left ?? 0)\n left = minLeft\n }\n if ((left ?? 0) > maxLeft) {\n adjustArrow = true\n adjust.left -= (left ?? 0) - maxLeft\n left = (left ?? 0) + maxLeft - (left ?? 0)\n }\n }\n // adjust Y\n if (['left', 'right'].includes(found) || options.autoResize) {\n if ((top ?? 0) < minTop) {\n adjustArrow = true\n adjust.top -= (top ?? 0)\n top = minTop\n }\n if ((top ?? 0) > maxTop) {\n adjustArrow = true\n adjust.top -= (top ?? 0) - maxTop\n top = (top ?? 0) + maxTop - (top ?? 0)\n }\n }\n // moves carret to adjust it with element width\n if (adjustArrow) {\n const aType = isVertical ? 'left' : 'top'\n const sType = isVertical ? 'width' : 'height'\n arrow.offset = -adjust[aType]\n const maxOffset = content[sType] / 2 - arrowSize\n if (Math.abs(arrow.offset) > maxOffset + arrowSize) {\n arrow.class = '' // no arrow\n }\n if (Math.abs(arrow.offset) > maxOffset) {\n arrow.offset = arrow.offset < 0 ? -maxOffset : maxOffset\n }\n // any: stripSpaces returns unknown; runtime always produces a string\n arrow.style = TsUtils.stripSpaces(`#${overlay.id} .tsg-overlay-body:after,\n #${overlay.id} .tsg-overlay-body:before {\n --tip-size: ${arrowSize}px;\n margin-${aType}: ${arrow.offset}px;\n }`) as string\n }\n }\n }\n\n /**\n * Move overlay node to the end of its parent (typically body) so it stacks above other .tsg-overlay siblings\n * without relying on z-index. No-op if it is already the last element child.\n */\n bringOverlayToFront(overlay: TooltipOverlay): void {\n if (!overlay || !overlay.box || !overlay.box.parentNode || !overlay.box.nextElementSibling) {\n return\n }\n overlay.box.parentNode.appendChild(overlay.box)\n }\n\n startDrag(event: MouseEvent & { target: EventTarget & { _lastBoundingRect?: DOMRect } }): void {\n if (event.preventDefault) {\n event.preventDefault()\n }\n const el = query(event.target).closest('.tsg-overlay')\n // any: overlay DOM element has .overlay property attached at runtime (line: overlay.box.overlay = overlay)\n const overlay = (el[0] as HTMLElement & { overlay?: TooltipOverlay })?.overlay\n if (overlay) {\n this.bringOverlayToFront(overlay)\n }\n const initial = {\n el,\n x: parseFloat(el.css('left') as string), // any: css(string) returns string when reading a property\n y: parseFloat(el.css('top') as string),\n pageX: event.pageX,\n pageY: event.pageY,\n moved: false,\n _removed: false\n }\n query(document)\n .off('.tsg-drag')\n .on('selectstart.tsg-drag, dragstart.tsg-drag', e => e.preventDefault())\n .find('body')\n .addClass('tsg-overlay-dragging')\n query('html')\n .off('.TsColor')\n .on('mousemove.TsColor', mouseMove)\n .on('mouseup.TsColor', mouseUp)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseUp(_event: any) { // any: query event\n query('html').off('.TsColor')\n query(document).off('selectstart.tsg-drag')\n query(document).off('dragstart.tsg-drag')\n query(document.body).removeClass('tsg-overlay-dragging')\n if (initial['moved']) {\n const ov = initial.el[0] && (initial.el[0] as HTMLElement & { overlay?: TooltipOverlay }).overlay // any: runtime .overlay prop\n if (ov) {\n if (!ov.tmp) ov.tmp = {}\n ov.tmp['moved'] = true\n clearTimeout(ov.tmp['_movedClearTimer'] as number) // any: tmp bag value; runtime is timer ID\n ov.tmp['_movedClearTimer'] = setTimeout(() => {\n if (ov.tmp) {\n delete ov.tmp['moved']\n delete ov.tmp['_movedClearTimer']\n }\n }, 400)\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseMove(event: any) { // any: query event\n const divX = event.pageX - initial.pageX\n const divY = event.pageY - initial.pageY\n if (Math.abs(divX) > 3 || Math.abs(divY) > 3) {\n initial.moved = true\n }\n initial.el.css({\n left: initial.x + divX + 'px',\n top: initial.y + divY + 'px'\n })\n if (!initial._removed) {\n initial._removed = true\n initial.el.find(':scope > .tsg-overlay-body')\n .removeClass('tsg-arrow-right tsg-arrow-left tsg-arrow-top tsg-arrow-bottom')\n }\n }\n }\n}\n\nclass ColorTooltip extends Tooltip {\n static custom_colors: string[] = []\n palette: string[][]\n // any: index tracks keyboard position in the palette grid; tuple [row, col]\n index!: [number, number]\n\n constructor() {\n super()\n this.palette = [\n ['000000', '333333', '555555', '777777', '888888', '999999', 'AAAAAA', 'CCCCCC', 'DDDDDD', 'EEEEEE', 'F7F7F7', 'FFFFFF'],\n ['FF011B', 'FF9838', 'FFC300', 'FFFD59', '86FF14', '14FF7A', '2EFFFC', '2693FF', '006CE7', '9B24F4', 'FF21F5', 'FF0099'],\n ['FFEAEA', 'FCEFE1', 'FCF4DC', 'FFFECF', 'EBFFD9', 'D9FFE9', 'E0FFFF', 'E8F4FF', 'ECF4FC', 'EAE6F4', 'FFF5FE', 'FCF0F7'],\n ['F4CCCC', 'FCE5CD', 'FFF1C2', 'FFFDA1', 'D5FCB1', 'B5F7D0', 'BFFFFF', 'D6ECFF', 'CFE2F3', 'D9D1E9', 'FFE3FD', 'FFD9F0'],\n ['EA9899', 'F9CB9C', 'FFE48C', 'F7F56F', 'B9F77E', '84F0B1', '83F7F7', 'B5DAFF', '9FC5E8', 'B4A7D6', 'FAB9F6', 'FFADDE'],\n ['E06666', 'F6B26B', 'DEB737', 'E0DE51', '8FDB48', '52D189', '4EDEDB', '76ACE3', '6FA8DC', '8E7CC3', 'E07EDA', 'F26DBD'],\n ['CC0814', 'E69138', 'AB8816', 'B5B20E', '6BAB30', '27A85F', '1BA8A6', '3C81C7', '3D85C6', '674EA7', 'A14F9D', 'BF4990'],\n ['99050C', 'B45F17', '80650E', '737103', '395E14', '10783D', '13615E', '094785', '0A5394', '351C75', '780172', '782C5A']\n ]\n this.defaults = TsUtils.extend({}, this.defaults, {\n advanced : false,\n transparent : true,\n position : 'top|bottom',\n class : 'tsg-white',\n color : '',\n updateInput : true,\n arrowSize : 12,\n autoResize : false,\n anchorClass : 'tsg-focus',\n autoShowOn : 'focus',\n hideOn : ['doc-click', 'focus-change'],\n onSelect : null,\n onLiveUpdate: null\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override attach(anchor: any, text?: any): AttachReturn | undefined { // any: params are overloaded per call site\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let options: any // any: merged from defaults + user options; open-ended shape\n if (arguments.length == 1 && anchor instanceof Object) {\n options = anchor\n anchor = options.anchor\n } else if (arguments.length === 2 && text != null && typeof text === 'object') {\n options = text\n options.anchor = anchor\n }\n const prevHideOn = options.hideOn\n options = TsUtils.extend({}, this.defaults, options || {})\n if (prevHideOn) {\n options.hideOn = prevHideOn\n }\n options.style += '; padding: 0;'\n // add remove transparent color\n if (options.transparent && this.palette[0]![1] == '333333') {\n this.palette[0]!.splice(1, 1)\n this.palette[0]!.push('TRANSPARENT')\n }\n if (!options.transparent && this.palette[0]![1] != '333333') {\n this.palette[0]!.splice(1, 0, '333333')\n this.palette[0]!.pop()\n }\n if (options.color) options.color = String(options.color).toUpperCase()\n if (typeof options.color === 'string' && options.color.substr(0,1) === '#') options.color = options.color.substr(1)\n // needed for keyboard navigation\n this.index = [-1, -1]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ret = super.attach(options) as any as AttachReturn // any: super.attach returns AttachReturn | undefined; non-null here since options is object\n const overlay = ret.overlay\n overlay.options.html = this.getColorHTML(overlay.name, options)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show.attach', (event: any) => { // any: TsBase event\n const overlay = event.detail.overlay\n const anchor = overlay.anchor\n const options = overlay.options\n if (['INPUT', 'TEXTAREA'].includes(anchor.tagName) && !options.color && anchor.value) {\n overlay.tmp['initColor'] = anchor.value\n }\n delete overlay.newColor\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show:after.attach', (_event: any) => { // any: TsBase event\n if (ret.overlay?.box) {\n const actions = query(ret.overlay.box).find('.tsg-eaction')\n TsUtils.bindEvents(actions, this as unknown as Record<string, unknown>)\n this.initControls(ret.overlay)\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('update:after.attach', (_event: any) => { // any: TsBase event\n if (ret.overlay?.box) {\n const actions = query(ret.overlay.box).find('.tsg-eaction')\n TsUtils.bindEvents(actions, this as unknown as Record<string, unknown>)\n this.initControls(ret.overlay)\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('hide.attach', (event: any) => { // any: TsBase event\n const overlay = event.detail.overlay\n const anchor = overlay.anchor\n const color = overlay.newColor ?? overlay.options.color ?? ''\n // color has been selected\n if (color !== '') {\n if (['INPUT', 'TEXTAREA'].includes(anchor.tagName) && anchor.value != color && overlay.options.updateInput) {\n anchor.value = color\n }\n const edata = this.trigger('select', { color, target: overlay.name, overlay })\n if (edata.isCancelled === true) return\n // event after\n edata.finish()\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ret.liveUpdate = (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('liveUpdate.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ret.select = (callback: any) => { // any: event shape varies by overlay type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('select.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n }\n return ret\n }\n\n // regular panel handler, adds selection class\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(color: any, name: any) { // any: color is string; name can be string or Event-like object\n let target\n this.index = [-1, -1]\n if (typeof name != 'string') {\n target = name.target\n this.index = (query(target).attr('index') ?? '').split(':').map(Number) as [number, number] // any: attr returns string; map to numbers for palette grid coordinates\n name = query(target).closest('.tsg-overlay').attr('name') as string // any: attr returns string|undefined; name is always present here\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = this.get(name) // any: get() returns union; runtime is TooltipOverlay when name is string\n // event before\n // any: param carries the original event object when name was non-string (event used as 2nd arg)\n const edata = this.trigger('liveUpdate', { color, target: name, overlay, param: name as unknown })\n if (edata.isCancelled === true) return\n // if anchor is input - live update\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName) && overlay.options.updateInput) {\n query(overlay.anchor).val(color)\n }\n overlay.newColor = color\n query(overlay.box).find('.tsg-color.tsg-selected').removeClass('tsg-selected')\n if (target) {\n query(target).addClass('tsg-selected')\n }\n // event after\n edata.finish()\n }\n\n // used for keyboard navigation, if any\n nextColor(direction: string) { // TODO: check it\n const pal = this.palette\n switch (direction) {\n case 'up':\n this.index[0]--\n break\n case 'down':\n this.index[0]++\n break\n case 'right':\n this.index[1]++\n break\n case 'left':\n this.index[1]--\n break\n }\n if (this.index[0] < 0) this.index[0] = 0\n if (this.index[0] > pal.length - 2) this.index[0] = pal.length - 2\n if (this.index[1] < 0) this.index[1] = 0\n if (this.index[1] > (pal[0]?.length ?? 0) - 1) this.index[1] = (pal[0]?.length ?? 1) - 1\n return pal[this.index[0]]?.[this.index[1]]\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tabClick(index: any, name: any) { // any: index is number or string; name can be string or Event-like\n if (typeof name != 'string') {\n name = query(name.target).closest('.tsg-overlay').attr('name')\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = this.get(name) // any: get() returns union; runtime is TooltipOverlay\n const tab = query(overlay.box).find(`.tsg-color-tab:nth-child(${index})`)\n query(overlay.box).find('.tsg-color-tab').removeClass('tsg-selected')\n query(tab).addClass('tsg-selected')\n query(overlay.box)\n .find('.tsg-tab-content')\n .hide()\n .closest('.tsg-colors')\n .find('.tab-'+ index)\n .show()\n }\n\n // generate HTML with color pallent and controls\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getColorHTML(name: any, options: any) { // any: name is string; options is TooltipOptions\n let html = `\n <div class=\"tsg-colors-header tsg-eaction\" data-mousedown=\"startDrag|event\">\n Colors\n </div>\n <div class=\"tsg-colors\">\n <div class=\"tsg-tab-content tab-1\">`\n for (let i = 0; i < this.palette.length; i++) {\n html += '<div class=\"tsg-color-row\">'\n for (let j = 0; j < (this.palette[i]?.length ?? 0); j++) {\n const color = this.palette[i]![j]!\n let border = ''\n if (color === 'FFFFFF') border = '; border: 1px solid #efefef'\n html += `\n <div class=\"tsg-color tsg-eaction ${color === 'TRANSPARENT' ? 'tsg-no-color' : ''} ${options.color == color ? 'tsg-selected' : ''}\"\n style=\"background-color: #${color + border};\" name=\"${color}\" index=\"${i}:${j}\"\n data-mousedown=\"select|'${color}'|event\" data-mouseup=\"hide|${name}\"> \n </div>`\n }\n html += '</div>'\n if (i < 2) html += '<div style=\"height: 8px\"></div>'\n }\n // custom colors\n html += `\n <div style=\"height: 8px\"></div>\n <div class=\"tsg-colors-custom\">\n ${this.getCustomColorsHTML(name)}\n </div>`\n html += '</div>'\n // advanced tab\n html += `\n <div class=\"tsg-tab-content tab-2\" style=\"display: none\">\n <div class=\"color-info\">\n <div class=\"color-preview-bg\"><div class=\"color-preview\"></div><div class=\"color-original\"></div></div>\n <div class=\"color-part\">\n <span>H</span> <input class=\"tsg-input\" name=\"h\" maxlength=\"3\" max=\"360\" tabindex=\"101\">\n <span>R</span> <input class=\"tsg-input\" name=\"r\" maxlength=\"3\" max=\"255\" tabindex=\"104\">\n </div>\n <div class=\"color-part\">\n <span>S</span> <input class=\"tsg-input\" name=\"s\" maxlength=\"3\" max=\"100\" tabindex=\"102\">\n <span>G</span> <input class=\"tsg-input\" name=\"g\" maxlength=\"3\" max=\"255\" tabindex=\"105\">\n </div>\n <div class=\"color-part\">\n <span>V</span> <input class=\"tsg-input\" name=\"v\" maxlength=\"3\" max=\"100\" tabindex=\"103\">\n <span>B</span> <input class=\"tsg-input\" name=\"b\" maxlength=\"3\" max=\"255\" tabindex=\"106\">\n </div>\n <div class=\"color-part opacity\">\n <span>${TsUtils.lang('Opacity')}</span>\n <input class=\"tsg-input\" name=\"a\" maxlength=\"5\" max=\"1\" tabindex=\"107\">\n </div>\n </div>\n <div class=\"palette\" name=\"palette\">\n <div class=\"palette-bg\"></div>\n <div class=\"value1 move-x move-y\"></div>\n </div>\n <div class=\"rainbow\" name=\"rainbow\">\n <div class=\"value2 move-x\"></div>\n </div>\n <div class=\"alpha\" name=\"alpha\">\n <div class=\"alpha-bg\"></div>\n <div class=\"value2 move-x\"></div>\n </div>\n <div class=\"final\" name=\"final\">\n <span style=\"text-align: right\"> Hex </span>\n <input class=\"tsg-input final\" name=\"hex\" tabindex=\"107\" style=\"width: 70px\" readonly>\n <div class=\"tsg-color tsg-color-picker tsg-eaction\" data-click=\"pickAndUse|${name}\">\n <span class=\"tsg-icon tsg-icon-eye-dropper\"></span>\n </div>\n </div>\n </div>`\n // color tabs on the bottom\n html += `\n <div class=\"tsg-color-tabs\">\n <div class=\"tsg-color-tab tsg-selected tsg-eaction\" data-click=\"tabClick|1|event|this\"><span class=\"tsg-icon tsg-icon-colors\"></span></div>\n <div class=\"tsg-color-tab tsg-eaction\" data-click=\"tabClick|2|event|this\"><span class=\"tsg-icon tsg-icon-settings\"></span></div>\n <div style=\"padding: 5px; width: 100%; text-align: right;\">\n ${(typeof options.html == 'string' ? options.html : '')}\n </div>\n </div>`\n return html\n }\n\n getCustomColorsHTML(name: string): string {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options: any = (this.get(name) as any)?.options // any: get() returns union; runtime is TooltipOverlay\n let html = '<div class=\"tsg-color-row\" style=\"min-height: 21px\">'\n ColorTooltip.custom_colors.forEach((color, i) => {\n let border = ''\n if (color === 'FFFFFF') border = '; border: 1px solid #efefef'\n html += `\n <div class=\"tsg-color tsg-eaction ${color === 'TRANSPARENT' ? 'tsg-no-color' : ''} ${options.color == color ? 'tsg-selected' : ''}\"\n style=\"background-color: #${color + border};\" name=\"${color}\" index=\"c:${i}\"\n data-mousedown=\"select|'${color}'|event\" data-mouseup=\"hide|${name}\"> \n </div>`\n\n })\n html += `\n <div class=\"tsg-color tsg-color-picker tsg-eaction\" data-click=\"pickAndSelect|${name}|event\">\n <span class=\"tsg-icon tsg-icon-eye-dropper\"></span>\n </div>\n </div>`\n return html\n }\n\n // bind advanced tab controls\n override initControls(overlay: TooltipOverlay): void {\n // any: complex HSV/RGB slider state shared across closures; runtime shapes are always correct\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let initial: any // used for mouse events\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n const options = overlay.options\n const color = (options.color || overlay.tmp['initColor']) as string // any: initColor in tmp bag; runtime is always string\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let rgb: any = TsUtils.parseColor(color)\n if (rgb == null) {\n rgb = { r: 140, g: 150, b: 160, a: 1 }\n }\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let hsv: any = (TsUtils.rgb2hsv as any)(rgb)\n if (options.advanced === true) {\n this.tabClick(2, overlay.name)\n }\n setColor(hsv, true, color ?? '') // should not be null or undefined\n\n // even for rgb, hsv inputs\n query(overlay.box)\n .off('.TsColor')\n .on('contextmenu.TsColor', event => {\n event.preventDefault() // prevent browser context menu\n })\n .find('input')\n .off('.TsColor')\n .on('change.TsColor', (event) => {\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const el: any = query(event.target)\n let val = parseFloat(el.val())\n const max = parseFloat(el.attr('max'))\n if (isNaN(val)) {\n val = 0\n el.val(0)\n }\n if (max > 1) val = parseInt(String(val)) // trancate fractions\n if (max > 0 && val > max) {\n el.val(max)\n val = max\n }\n if (val < 0) {\n el.val(0)\n val = 0\n }\n const name = el.attr('name')\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const color: any = {}\n if (['r', 'g', 'b', 'a'].indexOf(name) !== -1) {\n rgb[name] = val\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hsv = (TsUtils.rgb2hsv as any)(rgb)\n } else if (['h', 's', 'v'].indexOf(name) !== -1) {\n color[name] = val\n }\n setColor(color, true)\n })\n\n // click on original color resets it\n query(overlay.box).find('.color-original')\n .off('.TsColor')\n .on('click.TsColor', (event) => {\n const tmp = TsUtils.parseColor(query(event.target).css('background-color') as string)\n if (tmp != null) {\n rgb = tmp\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hsv = (TsUtils.rgb2hsv as any)(rgb)\n setColor(hsv, true)\n }\n })\n\n // color sliders events\n const mDown = `${!TsUtils.isMobile ? 'mousedown' : 'touchstart'}.TsColor`\n const mUp = `${!TsUtils.isMobile ? 'mouseup' : 'touchend'}.TsColor`\n const mMove = `${!TsUtils.isMobile ? 'mousemove' : 'touchmove'}.TsColor`\n query(overlay.box).find('.palette, .rainbow, .alpha')\n .off('.TsColor')\n .on(`${mDown}.TsColor`, mouseDown)\n\n this.setColor = setColor\n return\n\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function setColor(color: any, fullUpdate?: boolean, initial?: string) {\n if (color.h != null) hsv.h = color.h\n if (color.s != null) hsv.s = color.s\n if (color.v != null) hsv.v = color.v\n if (color.a != null) { rgb.a = color.a; hsv.a = color.a }\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rgb = (TsUtils.hsv2rgb as any)(hsv)\n const rgba = 'rgba('+ rgb.r +','+ rgb.g +','+ rgb.b +','+ rgb.a +')'\n const cl = [\n Number(rgb.r).toString(16).toUpperCase(),\n Number(rgb.g).toString(16).toUpperCase(),\n Number(rgb.b).toString(16).toUpperCase(),\n (Math.round(Number(rgb.a)*255)).toString(16).toUpperCase()\n ]\n cl.forEach((item, ind) => { if (item.length === 1) cl[ind] = '0' + item })\n let newColor = cl[0]! + cl[1]! + cl[2]! + cl[3]!\n if (rgb.a === 1) {\n newColor = cl[0]! + cl[1]! + cl[2]!\n }\n query(overlay.box).find('.color-preview').css('background-color', '#' + newColor)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(overlay.box).find('input').each((el: any) => { // any: query.each gives Node; runtime is HTMLInputElement\n if (el.name) {\n if (rgb[el.name] != null) el.value = String(rgb[el.name])\n if (hsv[el.name] != null) el.value = String(hsv[el.name])\n if (el.name === 'a') el.value = String(rgb.a)\n if (el.name == 'hex') el.value = newColor\n if (el.name == 'rgb') el.value = rgba\n }\n })\n // if it is in pallette\n if (initial != null) {\n const color = overlay.tmp['initColor'] || newColor\n query(overlay.box).find('.color-original')\n .css('background-color', '#' + color)\n query(overlay.box).find('.tsg-color.tsg-selected')\n .removeClass('tsg-selected')\n query(overlay.box).find(`.tsg-colors [name=\"${color}\"], .tsg-colors [name=\"${initial}\"]`) // color conversion might be slightly off\n .addClass('tsg-selected')\n // if has transparent color, open advanced tab\n if (newColor.length == 8) {\n self.tabClick(2, overlay.name)\n }\n } else {\n self.select(newColor, overlay.name)\n }\n if (fullUpdate) {\n updateSliders()\n refreshPalette()\n }\n }\n\n function updateSliders() {\n const el1 = query(overlay.box).find('.palette .value1')\n const el2 = query(overlay.box).find('.rainbow .value2')\n const el3 = query(overlay.box).find('.alpha .value2')\n if (!el1[0] || !el2[0] || !el3[0]) return\n const offset1 = (el1[0] as HTMLElement).clientWidth / 2\n const offset2 = (el2[0] as HTMLElement).clientWidth / 2\n el1.css({\n 'left': (hsv.s * 150 / 100 - offset1) + 'px',\n 'top': ((100 - hsv.v) * 125 / 100 - offset1) + 'px'\n })\n el2.css('left', (hsv.h/(360/150) - offset2) + 'px')\n el3.css('left', (rgb.a*150 - offset2) + 'px')\n }\n\n function refreshPalette() {\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cl = (TsUtils.hsv2rgb as any)(hsv.h, 100, 100)\n const rgb = `${cl.r},${cl.g},${cl.b}`\n query(overlay.box).find('.palette')\n .css('background-image', `linear-gradient(90deg, rgba(${rgb},0) 0%, rgba(${rgb},1) 100%)`)\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseDown(this: any, event: any) {\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const el: any = query(this).find('.value1, .value2')\n const offset = el.prop('clientWidth') / 2\n if (el.hasClass('move-x')) el.css({ left: (event.offsetX - offset) + 'px' })\n if (el.hasClass('move-y')) el.css({ top: (event.offsetY - offset) + 'px' })\n initial = {\n el: el,\n x: event.pageX,\n y: event.pageY,\n width: el.prop('parentNode').clientWidth,\n height: el.prop('parentNode').clientHeight,\n left: parseInt(el.css('left')),\n top: parseInt(el.css('top'))\n }\n mouseMove(event)\n query('html')\n .off('.TsColor')\n .on(mMove, mouseMove)\n .on(mUp, mouseUp)\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseUp(_event: any) {\n query('html').off('.TsColor')\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function mouseMove(event: any) {\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const el: any = initial.el\n const divX = event.pageX - initial.x\n const divY = event.pageY - initial.y\n let newX = initial.left + divX\n let newY = initial.top + divY\n const offset = el.prop('clientWidth') / 2\n if (newX < -offset) newX = -offset\n if (newY < -offset) newY = -offset\n if (newX > initial.width - offset) newX = initial.width - offset\n if (newY > initial.height - offset) newY = initial.height - offset\n if (el.hasClass('move-x')) el.css({ left : newX + 'px' })\n if (el.hasClass('move-y')) el.css({ top : newY + 'px' })\n\n // move\n const name = query(el.get(0).parentNode).attr('name')\n const x = parseInt(el.css('left')) + offset\n const y = parseInt(el.css('top')) + offset\n if (name === 'palette') {\n setColor({\n s: Math.round(x / initial.width * 100),\n v: Math.round(100 - (y / initial.height * 100))\n })\n }\n if (name === 'rainbow') {\n const h = Math.round(360 / 150 * x)\n setColor({ h: h })\n refreshPalette()\n }\n if (name === 'alpha') {\n setColor({ a: parseFloat(Number(x / 150).toFixed(2)) })\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addCustomColor(color: any, _name: any) { // any: color is string; name is string\n if (typeof color == 'string' && color.substr(0, 1) == '#' && [7, 9].includes(color.length)) {\n color = color.substr(1).toUpperCase()\n const custom = ColorTooltip.custom_colors\n if (custom.includes(color)) {\n custom.splice(custom.indexOf(color), 1)\n }\n if (custom.length >= 5) {\n custom.pop() // removes last one\n }\n custom.unshift(color)\n }\n return color\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n async pickAndSelect(name: string, event: any) {\n const color = await this.pickColor()\n if (typeof color == 'string' && color.substr(0, 1) == '#' && [7, 9].includes(color.length)) {\n this.addCustomColor(color, name)\n const cnt = query(event.target).closest('.tsg-colors-custom')\n cnt.html(this.getCustomColorsHTML(name))\n TsUtils.bindEvents(cnt.find('.tsg-eaction'), this as unknown as Record<string, unknown>)\n this.select(color.substr(1), name)\n // this.hide(name)\n }\n }\n\n async pickAndUse(_name: string) {\n const color = await this.pickColor()\n if (typeof color == 'string' && color.substr(0, 1) == '#' && [7, 9].includes(color.length)) {\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const hsv = (TsUtils.rgb2hsv as any)(TsUtils.parseColor(color))\n this.setColor!(hsv, true)\n }\n }\n\n async pickColor(): Promise<string | undefined> {\n // any: EyeDropper is a browser experimental API not yet in lib.dom.d.ts\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const win = window as any\n if (!win.EyeDropper) {\n console.error('EyeDropper API is not supported in this browser.')\n return\n }\n const eyeDropper = new win.EyeDropper()\n try {\n const result = await eyeDropper.open()\n return result.sRGBHex\n } catch (err) {\n console.error('Error picking color:', err)\n }\n return ''\n }\n}\n\nclass MenuTooltip extends Tooltip {\n constructor() {\n super()\n // ITEM STRUCTURE\n // item : {\n // id : null,\n // text : '',\n // style : '',\n // icon : '',\n // count : '',\n // tooltip : '',\n // hotkey : '',\n // removable: false,\n // help : '', // text for help tooltip\n // hotkey ; '', // hotkey text for the items\n // items : []\n // indent : 0,\n // type : null, // check/radio\n // group : false, // groupping for checks\n // expanded : false,\n // hidden : false,\n // checked : null,\n // disabled : false\n // ...\n // }\n this.defaults = TsUtils.extend({}, this.defaults, {\n type : 'normal', // can be normal, radio, check\n items : [],\n selected : null, // current selected\n render : null,\n spinner : false,\n msgNoItems : TsUtils.lang('No items found'),\n topHTML : '',\n menuStyle : '',\n search : false, // search input inside tooltip\n filter : false, // will apply filter, if anchor is INPUT or TEXTAREA\n match : 'contains', // is, begins, ends, contains, regexp\n markSearch : false,\n prefilter : false,\n altRows : false,\n arrowSize : 10,\n align : 'left',\n position : 'bottom|top',\n class : 'tsg-white',\n anchorClass : 'tsg-focus',\n autoShowOn : 'focus',\n hideOn : ['doc-click', 'focus-change', 'select'], // also can 'item-remove'\n onSelect : null,\n onSubMenu : null,\n onRemove : null,\n onTooltip : null,\n onMouseEnter: null,\n onMouseLeave: null\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override attach(anchor: any, text?: any): AttachReturn | undefined { // any: params are overloaded per call site\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let options: any // any: merged from defaults + user options; open-ended shape\n if (arguments.length == 1 && anchor instanceof Object) {\n options = anchor\n anchor = options.anchor\n } else if (arguments.length === 2 && text != null && typeof text === 'object') {\n options = text\n options.anchor = anchor\n }\n const prevHideOn = options.hideOn\n options = TsUtils.extend({}, this.defaults, options || {})\n if (prevHideOn) {\n options.hideOn = prevHideOn\n }\n options.style += '; padding: 0;'\n if (options.items == null) {\n options.items = []\n }\n if (options.cacheMax <= 0) {\n console.log(`The option \"cacheMax\" is ${options.cacheMax} but should be more than 0`)\n }\n options.items = TsUtils.normMenu(options.items, options)\n options.html = this.getMenuHTML(options)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ret = super.attach(options) as any as AttachReturn // any: super.attach returns AttachReturn | undefined; non-null here since options is object\n // any: overlay is a TsBase instance extended at runtime with menu-specific fields\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const overlay: any = ret.overlay\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show:after.attach, update:after.attach', (_event: any) => {\n if (ret.overlay?.box) {\n let search = ''\n // reset selected and active chain\n overlay.selected = overlay.options.selected // this is needed so that menu item can be preselected\n const index = overlay.anchor.dataset?.selectedIndex\n if ((overlay.options.selected !== false && overlay.options.selected !== -1) || index != null) {\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n search = (overlay.anchor as HTMLInputElement).value\n overlay.selected = null // no element should be pre-selected\n if (index != null) {\n overlay.selected = index\n }\n }\n }\n const actions = query(ret.overlay.box).find('.tsg-eaction')\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n overlay.tmp._new_search = false\n query(overlay.anchor).on('input.search-trigger', () => {\n overlay.tmp._new_search = true\n query(overlay.anchor).off('input.search-trigger')\n })\n }\n TsUtils.bindEvents(actions, this as unknown as Record<string, unknown>)\n this.applyFilter(overlay.name, null, search, undefined)\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then((data: any) => {\n if (!Tooltip.active[overlay.name]?.displayed) {\n // if toolitp is not visible, do not proceed as it would make it visible\n return\n }\n this.getActiveChain(overlay.name, options.items) // need this to update chain for up/down key navigation\n overlay.tmp.searchCount = data.count\n overlay.tmp.search = data.search\n if (options.prefilter || search !== '') {\n // if selected is not in searched items\n if (data.count === 0 || !this.getActiveChain(overlay.name, options.items).includes(overlay.selected)) {\n overlay.selected = null\n }\n this.refreshSearch(overlay.name)\n }\n this.initControls(ret.overlay)\n this.refreshIndex(overlay.name, true)\n })\n }\n })\n overlay.next = () => {\n // any: array of heterogeneous runtime values; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chain: any[] = this.getActiveChain(overlay.name)\n if (overlay.selected == null || String(overlay.selected).length == 0) {\n overlay.selected = chain[0]\n } else {\n const ind = chain.indexOf(String(overlay.selected)) // if nested menu, selected will be \"2-2\"\n // selected not in chain of items\n if (ind == -1) {\n overlay.selected = chain[0]\n }\n // not the last item\n if (ind < chain.length - 1) {\n overlay.selected = chain[ind + 1]\n }\n }\n this.refreshIndex(overlay.name)\n this.showTooltip(overlay.name)\n }\n overlay.prev = () => {\n // any: array of heterogeneous runtime values; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chain: any[] = this.getActiveChain(overlay.name)\n if (overlay.selected == null || String(overlay.selected).length == 0) {\n overlay.selected = chain[chain.length-1]\n } else {\n const ind = chain.indexOf(String(overlay.selected)) // if nested menu, selected will be \"2-2\"\n // selected not in chain of items\n if (ind == -1) {\n overlay.selected = chain[chain.length-1]\n }\n // not first item\n if (ind > 0) {\n overlay.selected = chain[ind - 1]\n }\n }\n this.refreshIndex(overlay.name)\n this.showTooltip(overlay.name)\n }\n overlay.click = () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(overlay.box).find('.tsg-selected').each((el: any) => { el.click() }) // any: query.each gives Node; runtime is HTMLElement\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('hide:after.attach', (_event: any) => { // any: TsBase event\n TsTooltip.hide(overlay.name + '-tooltip')\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ret.select = (callback: any) => { // any: event shape varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('select.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ret.remove = (callback: any) => { // any: event shape varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('remove.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ret.subMenu = (callback: any) => { // any: event shape varies\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('subMenu.attach', (event: any) => { callback(event) }) // any: TsBase event\n return ret\n }\n return ret\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override update(name: any, items: any) { // any: name is string; items is array\n const overlay = Tooltip.active[name]\n if (overlay) {\n const options = overlay.options\n if (options.items != items) {\n options.items = items\n }\n const menuHTML = this.getMenuHTML(options)\n if (options.html != menuHTML) {\n options.html = menuHTML\n overlay.needsUpdate = true\n this.show(name)\n }\n } else {\n console.log(`Tooltip \"${name}\" is not displayed. Cannot update it.`)\n }\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override initControls(overlay: any): void {\n let mdown = 'mousedown'\n let mclick = 'click'\n if (TsUtils.isMobile) {\n mdown = 'touchstart'\n mclick = 'touchend'\n }\n query(overlay.box).find('.tsg-menu:not(.tsg-sub-menu)')\n .off('.TsMenu')\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('contextmenu.TsMenu', (event: any) => {\n event.preventDefault() // prevent browser context menu\n })\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on(`${mdown}.TsMenu`, { delegate: '.tsg-menu-item' }, (event: any) => {\n const dt = event.delegate.dataset\n const parents = query(event.delegate).closest('.tsg-menu').data('parents')\n this.menuDown(overlay, event, dt.index, parents)\n if (TsUtils.isMobile) {\n // need it for mobile so that it would not generate onclick (items under menu receive focus)\n event.preventDefault()\n }\n })\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on(`${mclick}.TsMenu`, { delegate: '.tsg-menu-item' }, (event: any) => {\n const dt = event.delegate.dataset\n const parents = query(event.delegate).closest('.tsg-menu').data('parents')\n this.menuClick(overlay, event, parseInt(dt['index'] ?? '0'), parents)\n })\n .find('.tsg-menu-item')\n .off('.TsMenu')\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseEnter.TsMenu', (event: any) => {\n const dt = (event.target as HTMLElement).dataset\n const item = overlay.options.items[dt['index'] ?? '']\n const edata = this.trigger('mouseEnter', { overlay, item, originalEvent: event })\n if (edata.isCancelled) {\n return\n }\n const tooltip = item?.tooltip\n if (tooltip && dt['hassubmenu'] != 'yes') {\n this.showTooltip(overlay.name, { tooltip, anchor: event.target })\n }\n // hide previous sub-menu if any\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const _menu: any = query(event.target).closest('.tsg-menu').get(0)\n if (_menu._evt && _menu._evt.target != event.target) {\n this.closeSubMenu(_menu._evt)\n }\n // show new sub-menu\n if (dt['hassubmenu'] == 'yes') {\n const _evt = {\n index: parseInt(dt['index'] ?? '0'),\n parents: _menu.dataset.parents !== '' ? _menu.dataset.parents.split('-').map((ind: string) => parseInt(ind)) : [],\n target: event.target,\n originalEvent: event,\n overlay\n }\n _menu._evt = _evt\n this.openSubMenu(_evt)\n }\n edata.finish()\n })\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseLeave.TsMenu', (event: any) => {\n const dt = (event.target as HTMLElement).dataset\n const item = overlay.options.items[dt['index'] ?? '']\n const edata = this.trigger('mouseLeave', { overlay, item, originalEvent: event })\n if (edata.isCancelled) {\n return\n }\n TsTooltip.hide(overlay.name + '-tooltip')\n edata.finish()\n })\n .find('.menu-help')\n .off('.TsMenu')\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseEnter.TsMenu', (event: any) => {\n const target = event.target as HTMLElement\n const dt = (target.parentNode as HTMLElement)?.parentNode as HTMLElement\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tooltip = overlay.options.items[(dt as any).dataset?.index]?.help\n if (tooltip) {\n TsTooltip.show({\n name: overlay.name + '-help-tp',\n anchor: event.target,\n html: tooltip,\n position: 'right|left',\n hideOn: ['doc-click']\n })\n }\n })\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseLeave.TsMenu', (_event: any) => {\n TsTooltip.hide(overlay.name + '-help-tp')\n })\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n query(overlay.anchor)\n .off('.TsMenu')\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('input.TsMenu', (_event: any) => {\n // if user types, clear selection\n // let dt = event.target.dataset\n // delete dt.selected\n // delete dt.selectedIndex\n })\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keyup.TsMenu', (event: any) => {\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (event as any)._searchType = 'filter'\n this.keyUp(overlay, event)\n })\n }\n if (overlay.options.search) {\n query(overlay.box).find('#menu-search')\n .off('.TsMenu')\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('keyup.TsMenu', (event: any) => {\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (event as any)._searchType = 'search'\n this.keyUp(overlay, event)\n })\n }\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCurrent(name: string, id?: any) {\n const overlay = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]!\n const options = overlay.options\n const selected = String(id ? id : (overlay.selected || '')).split('-')\n if (selected?.[0] === '') {\n selected.shift()\n }\n const last = selected.length - 1\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let index: any = selected[last] // any: index can be string or number during processing\n const parents = selected.slice(0, selected.length - 1).join('-')\n index = TsUtils.isInt(index) ? parseInt(index as string) : 0\n // items\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let items: any = options.items // any: items is menu array; traversed via string keys at runtime\n selected.forEach((id, ind) => {\n // do not go to the last one\n if (ind < selected.length - 1) {\n items = items[id].items\n }\n })\n return { last, index, items, item: items?.[index], parents }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getMenuHTML(options: any) { // any: options is TooltipOptions-like with items array\n if (options.spinner) {\n return `\n <div class=\"tsg-menu\">\n <div class=\"tsg-no-items\">\n <div class=\"tsg-spinner\"></div>\n ${TsUtils.lang('Loading...')}\n </div>\n </div>`\n }\n const parents = options.parents ?? []\n let items = options.items\n if (!Array.isArray(items)) items = []\n let count = 0\n let icon = null\n let topHTML = ''\n if (options.search) {\n topHTML += `\n <div class=\"tsg-menu-search\">\n <span class=\"tsg-icon tsg-icon-search\"></span>\n <input id=\"menu-search\" class=\"tsg-input\" type=\"text\"/>\n </div>`\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any) => item.hidden = false) // any: menu item shape\n }\n if (options.topHTML) {\n topHTML += `<div class=\"tsg-menu-top\">${options.topHTML}</div>`\n }\n let menu_html = `\n ${topHTML}\n <div class=\"tsg-menu\" style=\"${options.menuStyle}\" data-parents=\"${parents.join('-')}\">\n `\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((mitem: any, f: any) => { // any: menu item shape\n icon = mitem.icon\n const index = (parents.length > 0 ? parents.join('-') + '-' : '') + f\n if (icon == null) icon = null // icon might be undefined\n if (['radio', 'check'].includes(options.type) && !Array.isArray(mitem.items) && mitem.group !== false) {\n if (mitem.checked === true) icon = 'tsg-icon-check'; else icon = 'tsg-icon-empty'\n }\n if (mitem.hidden !== true) {\n let txt = mitem.text\n let icon_dsp = ''\n if (typeof options.render === 'function') txt = options.render(mitem, options)\n if (typeof txt == 'function') txt = txt(mitem, options)\n if (icon) {\n const first = String(icon).trim().slice(0, 1)\n if (first == '#') {\n icon = `<span class=\"tsg-icon tsg-icon-empty\" style=\"background-color: ${icon}\"></span>`\n } else if (first !== '<') {\n icon = `<span class=\"tsg-icon ${icon}\"></span>`\n }\n icon_dsp = `<div class=\"menu-icon\">${icon}</div>`\n }\n // for backward compatibility\n if (mitem.removable == null && mitem.remove != null) {\n mitem.removable = mitem.remove\n }\n // render only if non-empty\n if (mitem.type !== 'break' && txt != null && txt !== '' && String(txt).substr(0, 2) != '--') {\n const classes = ['tsg-menu-item']\n if (options.altRows == true) {\n classes.push(count % 2 === 0 ? 'tsg-even' : 'tsg-odd')\n }\n let colspan = 1\n if (icon_dsp === '') colspan++\n if (mitem.count == null && mitem.hotkey == null && mitem.removable !== true && mitem.items == null) colspan++\n if (mitem.tooltip == null && mitem.hint != null) mitem.tooltip = mitem.hint // for backward compatibility\n let count_dsp = ''\n if (mitem.removable === true) {\n count_dsp = '<span class=\"menu-remove\">x</span>'\n } else if (mitem.items != null) {\n classes.push('has-sub-menu')\n count_dsp = '<span style=\"background-color: transparent; border: transparent; box-shadow: none;\"></span>' // used as drop arrow\n } else {\n if (mitem.count != null) count_dsp += '<span>' + mitem.count + '</span>'\n if (mitem.hotkey != null) count_dsp += '<span class=\"menu-hotkey\">' + mitem.hotkey + '</span>'\n if (mitem.help != null) count_dsp += '<span class=\"menu-help\">?</span>'\n }\n if (mitem.disabled === true) classes.push('tsg-disabled')\n if (mitem._noSearchInside === true) classes.push('tsg-no-search-inside')\n menu_html += `\n <div index=\"${index}\" class=\"${classes.join(' ')}\" style=\"${mitem.style ? mitem.style : ''}\"\n data-index=\"${f}\" data-hasSubmenu=\"${mitem.items != null ? 'yes' : ''}\">\n <div style=\"width: ${parseInt(mitem.indent ?? 0)}px\"></div>\n ${icon_dsp}\n <div class=\"menu-text\" colspan=\"${colspan}\">${TsUtils.lang(txt)}</div>\n <div class=\"menu-extra\">${mitem.extra ?? ''}${count_dsp}</div>\n </div>`\n count++\n } else {\n // horizontal line\n const divText = (txt ?? '').replace(/^-+/g, '')\n menu_html += `\n <div index=\"${index}\" class=\"tsg-menu-divider ${divText != '' ? 'has-text' : ''}\">\n <div class=\"line\"></div>\n ${divText ? `<div class=\"text\">${divText}</div>` : ''}\n </div>`\n }\n }\n items[f] = mitem\n })\n if (count === 0 && options.msgNoItems) {\n const overlay = Tooltip.active[options.name.replace(/[\\s\\.#]/g, '_')]\n const remote = overlay?.tmp['remote']\n let msg = options.msgNoItems\n if (options.url) {\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (count == 0 && (remote as any)?.hasMore === false) {\n // if search is applied, but there are no items\n msg = options.msgNoItems\n } else {\n msg = options.msgSearch\n }\n }\n menu_html += `\n <div class=\"tsg-no-items\">\n ${TsUtils.lang(msg)}\n </div>`\n }\n menu_html += '</div>'\n return menu_html\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n openSubMenu(event: any) {\n const anchor = query(event.originalEvent.target).get(0)\n const { overlay } = event\n const { items } = overlay.options\n // build sub-items list\n const mitem = items[event.index]\n let _items = []\n if (typeof mitem.items == 'function') {\n _items = mitem.items(mitem)\n } else if (Array.isArray(mitem.items)) {\n _items = mitem.items\n }\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const prev: any = TsMenu.get(overlay.name + '-submenu')\n if (prev) {\n prev.hide()\n }\n query(event.target).addClass('expanded')\n ;(TsMenu.show({\n name: overlay.name + '-submenu',\n anchor: anchor as HTMLElement,\n items: _items,\n class: overlay.options.class + ' ' + mitem.overlay?.class,\n offsetX: -7,\n arrowSize: 0,\n parentOverlay: overlay,\n parents: [...event.parents, event.index],\n position: 'right|left',\n hideOn: ['doc-click', 'select']\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any)\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .hide((_evt: any) => {\n query(event.target).removeClass('expanded')\n })\n // indicates if user cursor is over sub menu\n setTimeout(() => {\n query('#w2overlay-' + overlay.name + '-submenu')\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseenter', (event: any) => { (event.target as any)._keepSubOpen = true })\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('mouseleave', (event: any) => { (event.target as any)._keepSubOpen = false })\n }, 10)\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n closeSubMenu(event: any) {\n const { overlay } = event\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((event.target as any)._keepSubOpen !== true) {\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const prev: any = TsMenu.get(overlay.name + '-submenu')\n if (prev) {\n prev.hide()\n }\n }\n }\n\n // Refreshed only selected item highligh, used in keyboard navigation\n refreshIndex(name: string, instant?: boolean) {\n const overlay = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]\n if (!overlay) return\n if (!overlay.displayed) {\n this.show(overlay.name)\n }\n const view = query(overlay.box).find('.tsg-overlay-body').get(0) as HTMLElement\n const search = query(overlay.box).find('.tsg-menu-search, .tsg-menu-top').get(0) as HTMLElement\n query(overlay.box).find('.tsg-menu-item.tsg-selected')\n .removeClass('tsg-selected')\n const el = query(overlay.box).find(`.tsg-menu-item[index=\"${overlay.selected}\"]`)\n .addClass('tsg-selected')\n .get(0) as HTMLElement\n if (el) {\n if (el.offsetTop + el.clientHeight > view.clientHeight + view.scrollTop) {\n el.scrollIntoView({\n behavior: instant ? 'instant' : 'smooth',\n block: instant ? 'center' : 'start',\n inline: instant ? 'center' : 'start'\n })\n }\n if (el.offsetTop < view.scrollTop + (search ? search.clientHeight : 0)) {\n el.scrollIntoView({\n behavior: instant ? 'instant' : 'smooth',\n block: instant ? 'center' : 'end',\n inline: instant ? 'center' : 'end'\n })\n }\n }\n TsTooltip.hide(overlay.name + '-tooltip')\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n showTooltip(name: string, options?: any) {\n const overlay = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]\n if (!overlay || !overlay.displayed) return\n const anchor = options?.anchor ?? query(overlay.box).find(`.tsg-menu-item[index=\"${overlay.selected}\"]`).get(0)\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tooltip = options?.tooltip ?? (overlay.selected != null ? (overlay.options.items as any)?.[overlay.selected]?.tooltip : undefined)\n if (tooltip) {\n const html = tooltip.html ?? tooltip\n TsTooltip.show(Object.assign({\n name: overlay.name + '-tooltip',\n anchor,\n html,\n position: 'right|left',\n hideOn: ['doc-click'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onShow(event: any) { // any: TsBase event\n overlay.self.trigger('tooltip', { overlay, action: 'show', originalEvent: event })\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onHide(event: any) { // any: TsBase event\n overlay.self.trigger('tooltip', { overlay, action: 'hide', originalEvent: event })\n }\n }, typeof tooltip == 'object' && tooltip != null ? tooltip : {}))\n }\n }\n\n // show/hide searched items\n refreshSearch(name: string) {\n const overlay = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]\n if (!overlay) return\n if (!overlay.displayed) {\n this.show(overlay.name)\n }\n TsTooltip.hide(overlay.name + '-tooltip')\n query(overlay.box).find('.tsg-no-items').hide()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(overlay.box).find('.tsg-menu-item, .tsg-menu-divider').each((el: any) => { // any: query.each gives Node; runtime is HTMLElement\n const cur = this.getCurrent(name, (el as Element).getAttribute('index'))\n if (cur.item?.hidden) {\n query(el).hide()\n } else {\n const search = overlay.tmp?.['search']\n if (overlay.options.markSearch) {\n TsUtils.marker(el, search as string, { onlyFirst: overlay.options.match == 'begins' })\n }\n query(el).show()\n }\n })\n // hide empty menus\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query(overlay.box).find('.tsg-sub-menu').each((sub: any) => { // any: query.each gives Node; runtime is HTMLElement\n const hasItems = (query(sub).find('.tsg-menu-item').get() as HTMLElement[]).some(el => {\n return el.style.display != 'none' ? true : false\n })\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parent = this.getCurrent(name, (sub as any).dataset?.parent)\n // only if parent is expaneded\n if (parent.item.expanded) {\n if (!hasItems) {\n query(sub).parent().hide()\n } else {\n query(sub).parent().show()\n }\n }\n })\n // show empty message\n if (overlay.tmp['searchCount'] == 0 || (overlay.options?.items?.length ?? 0) == 0) {\n if (query(overlay.box).find('.tsg-no-items').length == 0) {\n query(overlay.box).find('.tsg-menu:not(.tsg-sub-menu)').append(`\n <div class=\"tsg-no-items\">\n ${TsUtils.lang(overlay.options.msgNoItems as string)}\n </div>`)\n }\n query(overlay.box).find('.tsg-no-items').show()\n }\n }\n\n /**\n * Loops through the items and markes item.hidden = true for those that need to be hidden, and item.hidden = false\n * for those that are visible. Return a promise (since items can be on the server) with the number of visible items.\n */\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applyFilter(name: string, items: any, search: any, debounce?: any): Promise<any> {\n let count = 0\n const overlay = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]!\n const options = overlay.options\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let resolve: any, reject: any // any: Promise resolve/reject callbacks\n const prom = new Promise((res, rej) => {\n resolve = res\n reject = rej\n })\n if (overlay.tmp['_skip_filter'] === true) {\n return prom\n }\n if (search == null) {\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n search = (overlay.anchor as HTMLInputElement).value\n } else {\n search = ''\n }\n }\n /**\n * If it is input control that has a menu, and if filter is true, then show all the items unfiltered, unless user\n * starts filtering again.\n */\n if (overlay.tmp['_new_search'] === false) {\n search = ''\n }\n // any: array of heterogeneous runtime values; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let selectedIds: any[] = []\n if (options.selected) {\n if (Array.isArray(options.selected)) {\n // any: cast-then-index for dynamic property access; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selectedIds = (options.selected as any[]).map(item => {\n return item?.id ?? item\n })\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else if ((options.selected as any)?.id) {\n // any: cast-to-any for dynamic dispatch; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selectedIds = [(options.selected as any).id]\n }\n }\n overlay.tmp['activeChain'] = null\n // if url is defined, get items from it\n // any: remote is stored in overlay.tmp bag as unknown; shape is always this object\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const remote: any = overlay.tmp['remote'] ?? { hasMore: true, emptySet: false, search: null, cached: -1 }\n if (remote.hasMore == false) {\n const len = remote.hasMore_search.length\n if (search.substr(0, len) != remote.hasMore_search) {\n remote.hasMore = true\n }\n }\n if (items == null && options.url && remote.hasMore && remote.search !== search) {\n let proceed = true\n // only when items == null because it is case of nested items\n let msg = TsUtils.lang('Loading...')\n if (search.length < (options.minLength ?? 0) && remote.emptySet !== true) {\n msg = TsUtils.lang('${count} letters or more...', { count: String(options.minLength) })\n proceed = false\n if (search === '') {\n msg = TsUtils.lang(options.msgSearch as string)\n }\n // if there are items - then clear them\n if ((options.items?.length ?? 0) > 0) {\n this.update(name, [])\n this.applyFilter(name, null, search)\n }\n }\n query(overlay.box).find('.tsg-no-items').html(msg)\n remote.search = search\n options.items = []\n overlay.tmp['remote'] = remote\n if (proceed) {\n this.request(overlay, search, debounce)\n .then(remoteItems => {\n overlay.tmp['_skip_filter'] = true\n this.update(name, remoteItems)\n delete overlay.tmp['_skip_filter']\n overlay.tmp['_new_search'] = true\n this.applyFilter(name, remoteItems, search).then(data => {\n this.getActiveChain(overlay.name, options.items) // need this to update chain for up/down key navigation\n overlay.tmp['searchCount'] = data.count\n overlay.tmp['search'] = data.search\n if (options.prefilter || search !== '') {\n // if selected is not in searched items\n if (data.count === 0 || !this.getActiveChain(overlay.name, options.items).includes(overlay.selected)) {\n overlay.selected = null\n }\n this.refreshSearch(overlay.name)\n }\n this.initControls(overlay)\n this.refreshIndex(overlay.name, true)\n\n resolve(data)\n })\n })\n .catch(error => {\n console.log('Server Request error', error)\n })\n }\n return prom\n }\n let edata\n // only trigger search event when data is present and for the top level\n if (items == null) {\n edata = this.trigger('search', { search, overlay, prom, resolve, reject })\n if (edata.isCancelled === true) {\n return prom\n }\n }\n if (items == null) {\n items = overlay.options.items\n }\n if (options.filter === false) {\n resolve({ count: -1, search })\n return prom\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any) => { // any: menu item shape\n if ((options.match as string) == 'regex') {\n try {\n const re = new RegExp(search, 'i')\n if (re.test(item.text) || item.text === '...') {\n item.hidden = false\n } else {\n item.hidden = true\n }\n } catch (e) {}\n } else {\n let prefix = ''\n let suffix = ''\n if (['is', 'begins', 'begins with'].indexOf(options.match ?? '') !== -1) prefix = '^'\n if (['is', 'ends', 'ends with'].indexOf(options.match ?? '') !== -1) suffix = '$'\n try {\n const re = new RegExp(prefix + search + suffix, 'i')\n if (re.test(item.text) || item.text === '...') {\n item.hidden = false\n } else {\n item.hidden = true\n }\n } catch (e) {}\n }\n // do not show selected items\n if (options.hideSelected && selectedIds.includes(item.id)) {\n item.hidden = true\n }\n // search nested items\n if (Array.isArray(item.items) && item.items.length > 0) {\n delete item._noSearchInside\n this.applyFilter(name, item.items, search).then(data => {\n const subCount = data.count\n if (subCount > 0) {\n count += subCount\n if (item.hidden) item._noSearchInside = true\n // only expand items if search is not empty\n if (search) item.expanded = true\n item.hidden = false\n }\n })\n }\n if (item.hidden !== true) count++\n })\n resolve({ count, search })\n edata?.finish()\n return prom\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n request(overlay: any, search: any, debounce: any): Promise<any> { // any: overlay/search/debounce shapes vary at runtime\n const options = overlay.options\n const remote = overlay.tmp['remote']\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let resolve: any, reject: any // any: Promise resolve/reject callbacks\n if ((options.items.length === 0 && remote.cached !== 0)\n || (remote.cached == options.cacheMax && search.length > remote.search.length)\n || (search.length >= remote.search.length && search.substr(0, remote.search.length) !== remote.search)\n || (search.length < remote.search.length))\n {\n // Aabort previous request if any\n if (remote.controller) {\n remote.controller.abort()\n }\n remote.loading = true\n clearTimeout(remote.timeout)\n remote.timeout = setTimeout(() => {\n let url = options.url\n const postData = { search, max: options.cacheMax }\n Object.assign(postData, options.postData)\n // trigger event\n const edata = this.trigger('request', {\n search, overlay, url, postData,\n httpMethod: options.method ?? 'GET',\n httpHeaders: {}\n })\n if (edata.isCancelled === true) return\n // if event updated url and postData, use it\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const detail: any = edata.detail // any: edata.detail index signature requires bracket access\n url = new URL(detail['url'] as string, location.href)\n const fetchOptions = TsUtils.prepareParams(url, {\n method: detail['httpMethod'],\n headers: detail['httpHeaders'],\n body: detail['postData']\n }, { caller: this, overlay, search })\n // Create new abort controller\n remote.controller = new AbortController()\n fetchOptions['signal'] = remote.controller.signal\n // send request\n fetch(url, fetchOptions)\n .then(resp => resp.json())\n .then(data => {\n remote.controller = null\n // trigger event\n const edata = overlay.trigger('load', { search: postData.search, overlay, data })\n if (edata.isCancelled === true) return\n // default behavior\n data = edata.detail.data\n if (typeof data === 'string') data = JSON.parse(data)\n // if server just returns array\n if (Array.isArray(data)) {\n data = { records: data }\n }\n // needed for backward compatibility\n if (data.records == null && data.items != null) {\n data.records = data.items\n delete data.items\n }\n // handles Golang marshal of empty arrays to null\n if (!data.error && data.records == null) {\n data.records = []\n }\n if (!Array.isArray(data.records)) {\n console.error('ERROR: server did not return proper JSON data structure', '\\n',\n ' - it should return', { records: [{ id: 1, text: 'item' }] }, '\\n',\n ' - or just an array ', [{ id: 1, text: 'item' }], '\\n',\n ' - or if errorr ', { error: true, message: 'error message' })\n return\n }\n // remove all extra items if more then needed for cache\n if (data.records.length >= options.cacheMax) {\n data.records.splice(options.cacheMax, data.records.length)\n remote.hasMore = true\n } else {\n remote.hasMore = false\n remote.hasMore_search = search\n }\n // map id and text\n if (options.recId == null && options.recid != null) options.recId = options.recid // since lower-case recid is used in grid\n if (options.recId || options.recText) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data.records.forEach((item: any) => { // any: raw server record shape unknown\n if (typeof options.recId === 'string') item.id = item[options.recId]\n if (typeof options.recId === 'function') item.id = options.recId(item)\n if (typeof options.recText === 'string') item.text = item[options.recText]\n if (typeof options.recText === 'function') item.text = options.recText(item)\n })\n }\n // remember stats\n remote.loading = false\n remote.search = search\n remote.cached = data.records.length == 0 ? -1 : data.records.length\n remote.lastError = ''\n remote.emptySet = (search === '' && data.records.length === 0 ? true : false)\n // event after\n edata.finish()\n resolve(TsUtils.normMenu(data.records, data))\n })\n .catch(error => {\n const edata = this.trigger('error', { overlay, search, error })\n if (edata.isCancelled === true) return\n // default behavior\n if (error?.name !== 'AbortError') {\n console.error('ERROR: Server communication failed.', '\\n',\n ' - it should return', { records: [{ id: 1, text: 'item' }] }, '\\n',\n ' - or just an array ', [{ id: 1, text: 'item' }], '\\n',\n ' - or if errorr ', { error: true, message: 'error message' })\n }\n // reset stats\n remote.loading = false\n remote.search = ''\n remote.cached = -1\n remote.emptySet = true\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remote.lastError = ((edata.detail as any)['error'] || 'Server communication failed') // any: edata.detail index signature\n options.items = []\n // event after\n edata.finish()\n reject()\n })\n // event after\n edata.finish()\n }, debounce ? (options.debounce ?? 350) : 0)\n }\n return new Promise((res, rej) => {\n resolve = res\n reject = rej\n })\n }\n\n /**\n * Builds an array of item ids that sequencial order for navigation with up/down keys. Skips hidden and disabled items\n * and goes into nested structures. It will remember last active chain in 'overlay.tmp.activeChain'\n */\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getActiveChain(name: string, items?: any, parents: any[] = [], res: any[] = [], noSave?: boolean): any[] {\n const overlay = Tooltip.active[name.replace(/[\\s\\.#]/g, '_')]!\n if (overlay.tmp['activeChain'] != null) {\n // any: cast-then-index for dynamic property access; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return overlay.tmp['activeChain'] as any[]\n }\n if (items == null) items = overlay.options.items\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any, ind: any) => { // any: menu item shape varies\n if (!item.hidden && !item.disabled && !item?.text?.startsWith?.('--')) {\n res.push(parents.concat([ind]).join('-'))\n if (Array.isArray(item.items) && item.items.length > 0 && item.expanded) {\n parents.push(ind)\n this.getActiveChain(name, item.items, parents, res, true)\n parents.pop()\n }\n }\n })\n if (noSave == null) {\n overlay.tmp['activeChain'] = res\n }\n return res\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n menuDown(overlay: any, event: any, index: any, parents: any) {\n const options = overlay.options\n let items = options.items\n const icon = query(event.delegate).find('.tsg-icon')\n const menu = query(event.target).closest('.tsg-menu:not(.tsg-sub-menu)')\n if (typeof items == 'function') {\n items = items({ overlay, index, parents, event })\n }\n const item = items[index]\n if (item == null || item.disabled) {\n return\n }\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const uncheck = (items: any, parent?: any) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((other: any, ind: any) => { // any: menu item shape varies\n if (other.id == item.id) return\n if (other.group === item.group && other.checked) {\n menu\n .find(`.tsg-menu-item[index=\"${(parent ? parent + '-' : '') + ind}\"] .tsg-icon`)\n .removeClass('tsg-icon-check')\n .addClass('tsg-icon-empty')\n items[ind].checked = false\n }\n if (Array.isArray(other.items)) {\n uncheck(other.items, ind)\n }\n })\n }\n if ((options.type === 'check' || options.type === 'radio') && item.group !== false\n && !query(event.target).hasClass('menu-remove')\n && !query(event.target).hasClass('menu-help')\n && !query(event.target).closest('.tsg-menu-item').hasClass('has-sub-menu')) {\n item.checked = options.type == 'radio' ? true : !item.checked\n if (item.checked) {\n if (options.type === 'radio') {\n query(event.target).closest('.tsg-menu').find('.tsg-icon')\n .removeClass('tsg-icon-check')\n .addClass('tsg-icon-empty')\n }\n if (options.type === 'check' && item.group != null) {\n uncheck(options.items)\n }\n icon.removeClass('tsg-icon-empty').addClass('tsg-icon-check')\n } else if (options.type === 'check') {\n icon.removeClass('tsg-icon-check').addClass('tsg-icon-empty')\n }\n }\n // highlight record\n if (!query(event.target).hasClass('menu-remove') && !query(event.target).hasClass('menu-help')) {\n menu.find('.tsg-menu-item').removeClass('tsg-selected')\n // click on the item that has submenu will not select the item\n if (!query(event.delegate).hasClass('has-sub-menu')) {\n query(event.delegate).addClass('tsg-selected')\n }\n }\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n menuClick(overlay: any, event: any, index: any, parents: any) {\n const options = overlay.options\n let items = options.items\n const $item = query(event.delegate).closest('.tsg-menu-item')\n let keepOpen = options.hideOn.includes('select') ? false : true\n if (event.shiftKey || event.metaKey || event.ctrlKey) {\n keepOpen = true\n }\n if (typeof items == 'function') {\n items = items({ overlay, index, parents, event })\n }\n const item = items[index]\n if (!item || (item.disabled && !query(event.target).hasClass('menu-remove'))) {\n return\n }\n let edata\n const overlays = [overlay]\n let topOverlay = overlay\n let parentOverlay\n while (topOverlay.options.parentOverlay) {\n topOverlay = topOverlay.options.parentOverlay\n parentOverlay ??= topOverlay // not top overlay, but parent overlay items\n overlays.push(topOverlay)\n }\n\n if (query(event.target).hasClass('menu-remove')) {\n edata = topOverlay.trigger('remove', {\n originalEvent: event, target: overlay.name, overlay, topOverlay, parentOverlay,\n item, index, el: $item[0], parents\n })\n if (edata.isCancelled === true) {\n return\n }\n // delete from items\n const items = options.items\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ind = items.findIndex((it: any) => it.id == item.id) // any: menu item shape varies\n if (ind != -1) {\n const tmp = items.splice(ind, 1)\n // delete from the parent too\n if (overlay.options.parents) {\n const pind = overlay.options.parents[overlay.options.parents.length -1]\n const pitems = parentOverlay.options.items[pind].items\n if (pitems[ind].id == tmp[0].id) {\n pitems.splice(ind, 1)\n }\n }\n }\n keepOpen = !options.hideOn.includes('item-remove')\n const name = $item.closest('.tsg-overlay').attr('name')\n overlay.self.update(name, items)\n\n } else if ($item.hasClass('has-sub-menu')) {\n\n edata = topOverlay.trigger('subMenu', {\n originalEvent: event, target: overlay.name, overlay, topOverlay, parentOverlay,\n item, index, el: $item[0], parents\n })\n if (edata.isCancelled === true) {\n return\n }\n keepOpen = true\n\n } else {\n\n // find items that are selected\n const selected = this.findChecked(options.items)\n const a_index = $item.attr('index') as string\n overlay.selected = isNaN(Number(a_index)) ? a_index : parseInt(a_index)\n edata = topOverlay.trigger('select', {\n originalEvent: event, target: overlay.name, overlay, topOverlay, parentOverlay,\n item, index, selected, keepOpen, el: $item[0], parents\n })\n if (edata.isCancelled === true) {\n return\n }\n if (item.keepOpen != null) {\n keepOpen = item.keepOpen\n }\n if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n overlay.anchor.dataset.selected = item.id\n overlay.anchor.dataset.selectedIndex = overlay.selected\n }\n }\n if (!keepOpen) {\n overlays.forEach(overlay => this.hide(overlay.name))\n }\n // if (['INPUT', 'TEXTAREA'].includes(overlay.anchor.tagName)) {\n // overlay.anchor.focus()\n // }\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n findChecked(items: any): any[] { // any: menu item shape varies\n // any: array of heterogeneous runtime values; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let found: any[] = []\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items.forEach((item: any) => { // any: menu item shape varies\n if (item.checked) found.push(item)\n if (Array.isArray(item.items)) {\n found = found.concat(this.findChecked(item.items))\n }\n })\n return found\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keyUp(overlay: any, event: any) {\n const options = overlay.options\n const search = event.target.value\n let filter = true\n let refreshIndex = false\n switch (event.keyCode) {\n case 46: // delete\n case 8: { // backspace\n // if search empty and delete is clicked, do not filter nor show overlay\n if (search === '' && !overlay.displayed) filter = false\n break\n }\n case 13: { // enter\n if (!overlay.displayed || !overlay.selected) return\n const { index, parents } = this.getCurrent(overlay.name)\n event.delegate = query(overlay.box).find('.tsg-selected').get(0)\n // reset active chain for folders\n this.menuClick(overlay, event, parseInt(String(index)), parents)\n filter = false\n break\n }\n case 27: { // escape\n filter = false\n if (overlay.displayed) {\n this.hide(overlay.name)\n } else {\n // clear selected\n const el = overlay.anchor\n if (['INPUT', 'TEXTAREA'].includes(el.tagName)) {\n el.value = ''\n delete el.dataset.selected\n delete el.dataset.selectedIndex\n }\n }\n break\n }\n case 37: { // left\n if (!overlay.displayed) return\n let { item, index, parents } = this.getCurrent(overlay.name)\n // collapse parent if any\n if (parents) {\n item = options.items[parseInt(parents)]\n index = parseInt(parents)\n parents = ''\n refreshIndex = true\n }\n if (Array.isArray(item?.items) && item.items.length > 0 && item.expanded) {\n event.delegate = query(overlay.box).find(`.tsg-menu-item[index=\"${index}\"]`).get(0)\n overlay.selected = index\n this.menuClick(overlay, event, parseInt(String(index)), parents)\n }\n filter = false\n break\n }\n case 39: { // right\n if (!overlay.displayed) return\n const { item, index, parents } = this.getCurrent(overlay.name)\n if (Array.isArray(item?.items) && item.items.length > 0 && !item.expanded) {\n event.delegate = query(overlay.box).find('.tsg-selected').get(0)\n this.menuClick(overlay, event, parseInt(String(index)), parents)\n }\n filter = false\n break\n }\n case 38: { // up\n if (!overlay.displayed) {\n break\n }\n overlay.prev()\n filter = false\n event.preventDefault()\n break\n }\n case 40: { // down\n if (!overlay.displayed) {\n break\n }\n overlay.next()\n filter = false\n event.preventDefault()\n break\n }\n }\n // filter\n if (filter && overlay.displayed\n && ((options.filter && event._searchType == 'filter') || (options.search && event._searchType == 'search'))) {\n this.applyFilter(overlay.name, null, search, true)\n .then(data => {\n overlay.tmp.searchCount = data.count\n overlay.tmp.search = data.search\n // if selected is not in searched items\n if (data.count === 0 || !this.getActiveChain(overlay.name).includes(overlay.selected)) {\n overlay.selected = null\n }\n this.refreshSearch(overlay.name)\n })\n }\n if (refreshIndex) {\n this.refreshIndex(overlay.name)\n }\n }\n}\n\nclass DateTooltip extends Tooltip {\n daysCount: number[]\n today: string\n\n constructor() {\n super()\n const td = new Date()\n this.daysCount = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n this.today = td.getFullYear() + '/' + (Number(td.getMonth()) + 1) + '/' + td.getDate()\n this.defaults = TsUtils.extend({}, this.defaults, {\n position : 'top|bottom',\n class : 'tsg-calendar',\n type : 'date', // can be date/time/datetime\n value : '', // initial date (in TsUtils.settings format)\n format : '',\n start : null,\n end : null,\n btnNow : false,\n blockDates : [], // array of blocked dates\n blockWeekdays : [], // blocked weekdays 0 - sunday, 1 - monday, etc\n colored : {}, // ex: { '3/13/2022': 'bg-color|text-color' }\n arrowSize : 12,\n autoResize : false,\n anchorClass : 'tsg-focus',\n autoShowOn : 'focus',\n hideOn : ['doc-click', 'focus-change'],\n onSelect : null\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override attach(anchor: any, text?: any): AttachReturn | undefined { // any: polymorphic attach signature\n let options\n if (arguments.length == 1 && anchor instanceof Object) {\n options = anchor\n anchor = options.anchor\n } else if (arguments.length === 2 && text != null && typeof text === 'object') {\n options = text\n options.anchor = anchor\n }\n const prevHideOn = options.hideOn\n options = TsUtils.extend({}, this.defaults, options || {})\n if (prevHideOn) {\n options.hideOn = prevHideOn\n }\n if (!options.format) {\n const df = TsUtils.settings.dateFormat\n const tf = TsUtils.settings.timeFormat\n if (options.type == 'date') {\n options.format = df\n } else if (options.type == 'time') {\n options.format = tf\n } else {\n options.format = df + '|' + tf\n }\n }\n const cal = options.type == 'time' ? this.getHourHTML(options) : this.getMonthHTML(options, undefined, undefined)\n options.style += '; padding: 0;'\n options.html = cal.html\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ret = super.attach(options) as any as AttachReturn // any: super.attach returns AttachReturn|undefined but we know it's defined here\n const overlay = ret.overlay\n Object.assign(overlay.tmp, cal)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show.attach', (event: any) => { // any: event detail shape varies\n const overlay = event.detail.overlay\n const anchor = overlay.anchor\n const options = overlay.options\n if (['INPUT', 'TEXTAREA'].includes(anchor.tagName) && !options.value && anchor.value) {\n overlay.tmp.initValue = anchor.value\n }\n delete overlay.newValue\n delete overlay.newDate\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('show:after.attach', (_event: any) => { // any: event detail shape varies\n if (ret.overlay?.box) {\n this.initControls(ret.overlay)\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('update:after.attach', (_event: any) => { // any: event detail shape varies\n if (ret.overlay?.box) {\n this.initControls(ret.overlay)\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('hide.attach', (event: any) => { // any: event detail shape varies\n const overlay = event.detail.overlay\n const anchor = overlay.anchor\n if (overlay.newValue != null) {\n if (overlay.newDate) {\n overlay.newValue = overlay.newDate + ' ' + overlay.newValue\n }\n if (['INPUT', 'TEXTAREA'].includes(anchor.tagName) && anchor.value != overlay.newValue) {\n anchor.value = overlay.newValue\n }\n const edata = this.trigger('select', { date: overlay.newValue, target: overlay.name, overlay })\n if (edata.isCancelled === true) return\n // event after\n edata.finish()\n }\n })\n ret.select = (callback: (event: unknown) => void) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n overlay.on('select.attach', (event: any) => { callback(event) }) // any: event detail shape varies\n return ret\n }\n return ret\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override initControls(overlay: any) { // any: overlay shape varies at runtime\n const options = overlay.options\n const moveMonth = (inc: number) => {\n let { month, year } = overlay.tmp\n month += inc\n if (month > 12) {\n month = 1\n year++\n }\n if (month < 1 ) {\n month = 12\n year--\n }\n const cal = this.getMonthHTML(options, month, year)\n Object.assign(overlay.tmp, cal)\n query(overlay.box).find('.tsg-overlay-body').html(cal.html)\n this.initControls(overlay)\n }\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const checkJump = (event: any, dblclick?: boolean) => {\n query(event.target).parent().find('.tsg-jump-month, .tsg-jump-year')\n .removeClass('tsg-selected')\n query(event.target).addClass('tsg-selected')\n const dt = new Date()\n let { jumpMonth, jumpYear } = overlay.tmp\n if (dblclick) {\n if (jumpYear == null) jumpYear = dt.getFullYear()\n if (jumpMonth == null) jumpMonth = dt.getMonth() + 1\n }\n if (jumpMonth && jumpYear) {\n const cal = this.getMonthHTML(options, jumpMonth, jumpYear)\n Object.assign(overlay.tmp, cal)\n query(overlay.box).find('.tsg-overlay-body').html(cal.html)\n overlay.tmp.jump = false\n this.initControls(overlay)\n }\n }\n\n // events for next/prev buttons and title\n query(overlay.box)\n .find('.tsg-cal-title')\n .off('.calendar')\n // click on title\n .on('click.calendar', event => {\n if (options.draggable && overlay.tmp?.moved) {\n event.stopPropagation()\n return\n }\n Object.assign(overlay.tmp, { jumpYear: null, jumpMonth: null })\n if (overlay.tmp.jump) {\n const { month, year } = overlay.tmp\n const cal = this.getMonthHTML(options, month, year)\n query(overlay.box).find('.tsg-overlay-body').html(cal.html)\n overlay.tmp.jump = false\n } else {\n query(overlay.box).find('.tsg-overlay-body .tsg-cal-days')\n .replace(this.getYearHTML())\n const el = query(overlay.box).find(`[name=\"${overlay.tmp.year}\"]`).get(0) as HTMLElement\n if (el) el.scrollIntoView(true)\n overlay.tmp.jump = true\n }\n this.initControls(overlay)\n event.stopPropagation()\n })\n // prev button\n .find('.tsg-cal-previous')\n .off('.calendar')\n .on('click.calendar', event => {\n moveMonth(-1)\n event.stopPropagation()\n })\n .parent()\n // next button\n .find('.tsg-cal-next')\n .off('.calendar')\n .on('click.calendar', event => {\n moveMonth(1)\n event.stopPropagation()\n })\n // now button\n query(overlay.box).find('.tsg-cal-now')\n .off('.calendar')\n .on('click.calendar', _event => {\n if (options.type == 'datetime') {\n if (overlay.newDate) {\n overlay.newValue = TsUtils.formatTime(new Date(), options.format.split('|')[1])\n } else {\n overlay.newValue = TsUtils.formatDateTime(new Date(), options.format)\n }\n } else if (options.type == 'date') {\n overlay.newValue = TsUtils.formatDate(new Date(), options.format)\n } else if (options.type == 'time') {\n overlay.newValue = TsUtils.formatTime(new Date(), options.format)\n }\n this.hide(overlay.name)\n })\n // events for dates\n query(overlay.box)\n .off('.calendar')\n .on('contextmenu.calendar', event => {\n event.preventDefault() // prevent browser context menu\n })\n .on('click.calendar', { delegate: '.tsg-day.tsg-date' }, event => {\n if (options.type == 'datetime') {\n overlay.newDate = query(event.target).attr('date')\n query(overlay.box).find('.tsg-overlay-body').html(this.getHourHTML(overlay.options).html)\n this.initControls(overlay)\n } else {\n overlay.newValue = query(event.target).attr('date')\n this.hide(overlay.name)\n }\n })\n // click on month\n .on('click.calendar', { delegate: '.tsg-jump-month' }, event => {\n overlay.tmp.jumpMonth = parseInt(query(event.target).attr('name') ?? '0')\n checkJump(event)\n })\n // double click on month\n .on('dblclick.calendar', { delegate: '.tsg-jump-month' }, event => {\n overlay.tmp.jumpMonth = parseInt(query(event.target).attr('name') ?? '0')\n checkJump(event, true)\n })\n // click on year\n .on('click.calendar', { delegate: '.tsg-jump-year' }, event => {\n overlay.tmp.jumpYear = parseInt(query(event.target).attr('name') ?? '0')\n checkJump(event)\n })\n // dbl click on year\n .on('dblclick.calendar', { delegate: '.tsg-jump-year' }, event => {\n overlay.tmp.jumpYear = parseInt(query(event.target).attr('name') ?? '0')\n checkJump(event, true)\n })\n // click on hour\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.calendar', { delegate: '.tsg-time.hour' }, (event: any) => {\n const hour = Number(query(event.target).attr('hour'))\n let min = (this.str2min(options.value as string) ?? 0) % 60\n if (overlay.tmp.initValue && !options.value) {\n min = (this.str2min(overlay.tmp.initValue as string) ?? 0) % 60\n }\n if (options.noMinutes) {\n overlay.newValue = this.min2str(hour * 60, options.format)\n this.hide(overlay.name)\n } else {\n overlay.newValue = hour + ':' + min\n const html = this.getMinHTML(hour, options).html\n query(overlay.box).find('.tsg-overlay-body').html(html)\n this.initControls(overlay)\n }\n })\n // click on minute\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .on('click.calendar', { delegate: '.tsg-time.min' }, (event: any) => {\n const hour = Math.floor((this.str2min(overlay.newValue as string) ?? 0) / 60)\n const time = (hour * 60) + parseInt(query(event.target).attr('min') as string)\n overlay.newValue = this.min2str(time, options.format)\n this.hide(overlay.name)\n })\n // After any innerHTML refresh, re-attach tsg-eaction handlers (startDrag on title, stop on arrows, etc.)\n TsUtils.bindEvents(query(overlay.box).find('.tsg-eaction'), this as unknown as Record<string, unknown>)\n }\n\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getMonthHTML(options: any, month?: any, year?: any) {\n const days = TsUtils.settings.fulldays.slice() // creates copy of the array\n const sdays = TsUtils.settings.shortdays.slice() // creates copy of the array\n if (TsUtils.settings.weekStarts !== 'M') {\n days.unshift(days.pop()!)\n sdays.unshift(sdays.pop()!)\n }\n\n let DT = new Date()\n const dayLengthMil = 1000 * 60 * 60 * 24\n\n const selected = options.type === 'datetime'\n ? TsUtils.isDateTime(options.value, options.format, true)\n : TsUtils.isDate(options.value, options.format, true)\n const selected_dsp = TsUtils.formatDate(selected)\n\n // normalize date\n if (month == null || year == null) {\n const selDate = (selected instanceof Date) ? selected : DT\n year = selDate.getFullYear()\n month = selDate.getMonth() + 1\n }\n if (month > 12) { month -= 12; year++ }\n if (month < 1 || month === 0) { month += 12; year-- }\n if (year/4 == Math.floor(year/4)) { this.daysCount[1] = 29 } else { this.daysCount[1] = 28 }\n options.current = month + '/' + year\n\n let weekDaysHeaderHTML = ''\n const st = TsUtils.settings.weekStarts\n for (let i = 0; i < sdays.length; i++) {\n const isSat = (st == 'M' && i == 5) || (st != 'M' && i == 6) ? true : false\n const isSun = (st == 'M' && i == 6) || (st != 'M' && i == 0) ? true : false\n weekDaysHeaderHTML += `<div class=\"tsg-day tsg-weekday ${isSat ? 'tsg-sunday' : ''} ${isSun ? 'tsg-saturday' : ''}\">${sdays[i]}</div>`\n }\n\n const calTitleClass = 'tsg-cal-title' + (options.draggable ? ' tsg-eaction tsg-draggable' : '')\n const calTitleData = options.draggable ? ' data-mousedown=\"startDrag|event\"' : ''\n\n let html = `\n <div class=\"${calTitleClass}\"${calTitleData}>\n <div class=\"tsg-cal-previous tsg-eaction\" data-mousedown=\"stop\">\n <div></div>\n </div>\n <div class=\"tsg-cal-next tsg-eaction\" data-mousedown=\"stop\">\n <div></div>\n </div>\n ${TsUtils.settings.fullmonths[month-1]}, ${year}\n <span class=\"arrow-down\"></span>\n </div>\n <div class=\"tsg-cal-days\">\n ${weekDaysHeaderHTML}\n `\n\n // start with the required date\n DT = new Date(year, month-1, 1)\n\n /**\n * Move to noon, instead of midnight. If not, then the date when time saving happens\n * will be duplicated in the calendar\n */\n DT = new Date(DT.getTime() + dayLengthMil * 0.5)\n\n // calendar offset\n let weekDayOffset = DT.getDay()\n if (TsUtils.settings.weekStarts == 'M') {\n // offset should be 1 day more, but not negative (Sunday)\n weekDayOffset = weekDayOffset > 0 ? weekDayOffset - 1 : 6\n }\n\n // apply the offset for the first day in the calendar\n DT = new Date(DT.getTime() - (weekDayOffset * dayLengthMil))\n\n const DaySat = 6, DaySun = 0\n for (let ci = 0; ci < 42; ci++) {\n const className = []\n const dt = `${DT.getFullYear()}/${DT.getMonth()+1}/${DT.getDate()}`\n if (DT.getDay() === DaySat) className.push('tsg-saturday')\n if (DT.getDay() === DaySun) className.push('tsg-sunday')\n if (DT.getMonth() + 1 !== month) className.push('outside')\n if (dt == this.today) className.push('tsg-today')\n\n const dspDay = DT.getDate()\n let col = ''\n let bgcol = ''\n let tmp_dt, tmp_dt_fmt\n if (options.type === 'datetime') {\n tmp_dt = TsUtils.formatDateTime(dt, options.format)\n tmp_dt_fmt = TsUtils.formatDate(dt, TsUtils.settings.dateFormat)\n } else {\n tmp_dt = TsUtils.formatDate(dt, options.format)\n tmp_dt_fmt = tmp_dt\n }\n if (options.colored && options.colored[tmp_dt_fmt] !== undefined) { // if there is predefined colors for dates\n const tmp = options.colored[tmp_dt_fmt].split('|')\n bgcol = 'background-color: ' + tmp[0] + ';'\n col = 'color: ' + tmp[1] + ';'\n }\n html += `<div class=\"tsg-day ${this.inRange(tmp_dt, options, true)\n ? 'tsg-date ' + (tmp_dt_fmt == selected_dsp ? 'tsg-selected' : '')\n : 'tsg-blocked'\n } ${className.join(' ')}\"\n style=\"${col + bgcol}\" date=\"${tmp_dt_fmt}\" data-date=\"${DT.getTime()}\">\n ${dspDay}\n </div>`\n DT = new Date(DT.getTime() + dayLengthMil)\n }\n html += '</div>'\n if (options.btnNow) {\n const label = TsUtils.lang('Today' + (options.type == 'datetime' ? ' & Now' : ''))\n html += `<div class=\"tsg-cal-now\">${label}</div>`\n }\n return { html, month, year }\n }\n\n getYearHTML() {\n let mhtml = ''\n let yhtml = ''\n for (let m = 0; m < TsUtils.settings.fullmonths.length; m++) {\n mhtml += `<div class=\"tsg-jump-month\" name=\"${m+1}\">${TsUtils.settings.shortmonths[m]}</div>`\n }\n for (let y = TsUtils.settings.dateStartYear; y <= TsUtils.settings.dateEndYear; y++) {\n yhtml += `<div class=\"tsg-jump-year\" name=\"${y}\">${y}</div>`\n }\n return `<div class=\"tsg-cal-jump\">\n <div id=\"tsg-jump-month\">${mhtml}</div>\n <div id=\"tsg-jump-year\">${yhtml}</div>\n </div>`\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getHourHTML(options: any) { // any: options shape varies at runtime\n options = options ?? {}\n if (!options.format) options.format = TsUtils.settings.timeFormat\n const h24 = (options.format.indexOf('h24') > -1)\n const value = options.value ? options.value : (options.anchor ? options.anchor.value : '')\n\n const tmp = []\n for (let a = 0; a < 24; a++) {\n let time = (a >= 12 && !h24 ? a - 12 : a) + ':00' + (!h24 ? (a < 12 ? ' am' : ' pm') : '')\n if (a == 12 && !h24) time = '12:00 pm'\n if (!tmp[Math.floor(a/8)]) tmp[Math.floor(a/8)] = ''\n let tm1 = this.min2str(this.str2min(time) ?? 0)\n let tm2 = this.min2str((this.str2min(time) ?? 0) + 59)\n if (options.type === 'datetime') {\n const dt = TsUtils.isDateTime(value, options.format, true)\n const fm = options.format.split('|')[0].trim()\n tm1 = TsUtils.formatDate(dt, fm) + ' ' + tm1\n tm2 = TsUtils.formatDate(dt, fm) + ' ' + tm2\n }\n const valid = this.inRange(tm1, options) || this.inRange(tm2, options)\n tmp[Math.floor(a/8)] += `<span hour=\"${a}\"\n class=\"hour ${valid ? 'tsg-time ' : 'tsg-blocked'}\">${time}</span>`\n }\n const timeTitleClass = 'tsg-time-title' + (options.draggable ? ' tsg-eaction tsg-draggable' : '')\n const timeTitleData = options.draggable ? ' data-mousedown=\"startDrag|event\"' : ''\n const html = `<div class=\"tsg-calendar\">\n <div class=\"${timeTitleClass}\"${timeTitleData}>${TsUtils.lang('Select Hour')}</div>\n <div class=\"tsg-cal-time\">\n <div class=\"tsg-cal-column\">${tmp[0]}</div>\n <div class=\"tsg-cal-column\">${tmp[1]}</div>\n <div class=\"tsg-cal-column\">${tmp[2]}</div>\n </div>\n ${options.btnNow ? `<div class=\"tsg-cal-now\">${TsUtils.lang('Now')}</div>` : '' }\n </div>`\n return { html }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getMinHTML(hour: any, options: any) { // any: hour/options shapes vary at runtime\n if (hour == null) hour = 0\n options = options ?? {}\n if (!options.format) options.format = TsUtils.settings.timeFormat\n const h24 = (options.format.indexOf('h24') > -1)\n const value = options.value ? options.value : (options.anchor ? options.anchor.value : '')\n\n const tmp = []\n for (let a = 0; a < 60; a += 5) {\n const time = (hour > 12 && !h24 ? hour - 12 : hour) + ':' + (a < 10 ? 0 : '') + a + ' ' + (!h24 ? (hour < 12 ? 'am' : 'pm') : '')\n let tm = time\n const ind = a < 20 ? 0 : (a < 40 ? 1 : 2)\n if (!tmp[ind]) tmp[ind] = ''\n if (options.type === 'datetime') {\n const dt = TsUtils.isDateTime(value, options.format, true)\n const fm = options.format.split('|')[0].trim()\n tm = TsUtils.formatDate(dt, fm) + ' ' + tm\n }\n tmp[ind] += `<span min=\"${a}\" class=\"min ${(this.inRange(tm, options) ? 'tsg-time ' : 'tsg-blocked')}\">${time}</span>`\n }\n const timeTitleClass = 'tsg-time-title' + (options.draggable ? ' tsg-eaction tsg-draggable' : '')\n const timeTitleData = options.draggable ? ' data-mousedown=\"startDrag|event\"' : ''\n const html = `<div class=\"tsg-calendar\">\n <div class=\"${timeTitleClass}\"${timeTitleData}>${TsUtils.lang('Select Minute')}</div>\n <div class=\"tsg-cal-time\">\n <div class=\"tsg-cal-column\">${tmp[0]}</div>\n <div class=\"tsg-cal-column\">${tmp[1]}</div>\n <div class=\"tsg-cal-column\">${tmp[2]}</div>\n </div>\n ${options.btnNow ? `<div class=\"tsg-cal-now\">${TsUtils.lang('Now')}</div>` : '' }\n </div>`\n return { html }\n }\n\n // checks if date is in range (loost at start, end, blockDates, blockWeekdays)\n // any: parameter typed any — runtime dispatch by call site; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inRange(str: any, options: any, dateOnly?: boolean) {\n let inRange = false\n if (options.type === 'date') {\n const dt = TsUtils.isDate(str, options.format, true)\n if (dt) {\n // enable range\n if (options.start || options.end) {\n const st = (typeof options.start === 'string' ? options.start : query(options.start).val())\n const en = (typeof options.end === 'string' ? options.end : query(options.end).val())\n let start = TsUtils.isDate(st, options.format, true)\n let end = TsUtils.isDate(en, options.format, true)\n const dtDate = dt instanceof Date ? dt : new Date()\n const current = new Date(dtDate)\n if (!start) start = current\n if (!end) end = current\n if (current >= start && current <= end) inRange = true\n } else {\n inRange = true\n }\n // block predefined dates\n if (Array.isArray(options.blockDates) && options.blockDates.includes(str)) inRange = false\n // block weekdays\n if (Array.isArray(options.blockWeekdays) && options.blockWeekdays.includes((dt instanceof Date ? dt : new Date()).getDay())) inRange = false\n }\n } else if (options.type === 'time') {\n if (options.start || options.end) {\n const tm = this.str2min(str) ?? 0\n let tm1 = this.str2min(options.start) ?? tm\n let tm2 = this.str2min(options.end) ?? tm\n if (!tm1) tm1 = tm\n if (!tm2) tm2 = tm\n if (tm >= tm1 && tm <= tm2) inRange = true\n } else {\n inRange = true\n }\n } else if (options.type === 'datetime') {\n const dt = TsUtils.isDateTime(str, options.format, true)\n if (dt) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const format = options.format.split('|').map((format: any) => format.trim()) // any: split result items\n if (dateOnly) {\n const date = TsUtils.formatDate(dt, format[0])\n const opts = TsUtils.extend({}, options, { type: 'date', format: format[0] })\n if (this.inRange(date, opts)) inRange = true\n } else {\n const time = TsUtils.formatTime(dt, format[1])\n const opts = { type: 'time', format: format[1], start: options.startTime, end: options.endTime }\n if (this.inRange(time, opts)) inRange = true\n }\n }\n }\n return inRange\n }\n\n // converts time into number of minutes since midnight -- '11:50am' => 710\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n str2min(str: any): number | null {\n if (typeof str !== 'string') return null\n // any: array of heterogeneous runtime values; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tmp: any[] = str.split(':')\n if (tmp.length === 2) {\n tmp[0] = parseInt(tmp[0])\n tmp[1] = parseInt(tmp[1])\n if (str.indexOf('pm') !== -1 && tmp[0] !== 12) tmp[0] += 12\n if (str.includes('am') && tmp[0] == 12) tmp[0] = 0 // 12:00am - is midnight\n } else {\n return null\n }\n return tmp[0] * 60 + tmp[1]\n }\n\n // converts minutes since midnight into time str -- 710 => '11:50am'\n // any: callback parameter — caller signature varies; TsTooltip overlay options merge from multiple user sources at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n min2str(time: number, format?: any): string {\n let ret = ''\n if (time >= 24 * 60) time = time % (24 * 60)\n if (time < 0) time = 24 * 60 + time\n const hour = Math.floor(time/60)\n const min = ((time % 60) < 10 ? '0' : '') + (time % 60)\n if (!format) { format = TsUtils.settings.timeFormat}\n if (format.indexOf('h24') !== -1) {\n ret = hour + ':' + min\n } else {\n ret = (hour <= 12 ? hour : hour - 12) + ':' + min + ' ' + (hour >= 12 ? 'pm' : 'am')\n }\n return ret\n }\n}\n\nconst TsTooltip = new Tooltip()\nconst TsMenu = new MenuTooltip()\nconst TsColor = new ColorTooltip()\nconst TsDate = new DateTooltip()\n\nexport { TsTooltip, TsColor, TsMenu, TsDate, Tooltip }\n"],"mappings":"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","names":["query","options","name","names","overlay","width","height","event","anchor","color","initial","rgb","id","edata","items","format"]}
|