tsgrid-ui 2.7.1 → 2.10.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 +217 -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-3NYH6545.js +2423 -0
- package/dist/chunks/chunk-3NYH6545.js.map +1 -0
- package/dist/chunks/chunk-6MOFFUV2.js +2305 -0
- package/dist/chunks/chunk-6MOFFUV2.js.map +1 -0
- package/dist/chunks/chunk-6UCGFWIQ.js +865 -0
- package/dist/chunks/chunk-6UCGFWIQ.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-DZSFZLV6.js +1638 -0
- package/dist/chunks/chunk-DZSFZLV6.js.map +1 -0
- package/dist/chunks/chunk-EQK6JAHT.js +33 -0
- package/dist/chunks/chunk-EQK6JAHT.js.map +1 -0
- package/dist/chunks/chunk-FAIRNXQR.js +3020 -0
- package/dist/chunks/chunk-FAIRNXQR.js.map +1 -0
- package/dist/chunks/chunk-GZFWK4LZ.js +677 -0
- package/dist/chunks/chunk-GZFWK4LZ.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-KLJ35UAH.js +1795 -0
- package/dist/chunks/chunk-KLJ35UAH.js.map +1 -0
- package/dist/chunks/chunk-LUSNRF73.js +1212 -0
- package/dist/chunks/chunk-LUSNRF73.js.map +1 -0
- package/dist/chunks/chunk-N3GASHTI.js +1127 -0
- package/dist/chunks/chunk-N3GASHTI.js.map +1 -0
- package/dist/field.d.ts +329 -0
- package/dist/field.es6.js +12 -0
- package/dist/field.es6.js.map +1 -0
- package/dist/form.d.ts +162 -0
- package/dist/form.es6.js +15 -0
- package/dist/form.es6.js.map +1 -0
- package/dist/layout.d.ts +108 -0
- package/dist/layout.es6.js +14 -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/popup.d.ts +97 -0
- package/dist/popup.es6.js +21 -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 +12 -0
- package/dist/sidebar.es6.js.map +1 -0
- package/dist/tabs.d.ts +63 -0
- package/dist/tabs.es6.js +12 -0
- package/dist/tabs.es6.js.map +1 -0
- package/dist/toolbar.d.ts +97 -0
- package/dist/toolbar.es6.js +12 -0
- package/dist/toolbar.es6.js.map +1 -0
- package/dist/tooltip.d.ts +330 -0
- package/dist/tooltip.es6.js +21 -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 +7751 -23830
- package/dist/tsgrid-ui.es6.js.map +1 -1
- package/dist/tsgrid-ui.es6.min.js +37 -37
- package/dist/tsgrid-ui.js +150 -22
- package/dist/tsgrid-ui.min.css +2 -2
- package/dist/tsgrid-ui.min.js +39 -39
- 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 +25 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tssidebar.ts"],"sourcesContent":["/**\n * Part of TsUi 2.0 library\n * - Dependencies: mQuery, TsUtils, TsBase, TsTooltip, TsMenu\n *\n * == TODO ==\n * - dbl click should be like it is in grid (with timer not HTML dbl click event)\n * - node.style is misleading - should be there to apply color for example\n * - node.plus - is not working\n *\n * == 2.0 changes\n * - remove jQuery dependency\n * - deprecarted obj.img, node.img\n * - CSP - fixed inline events\n * - observeResize for the box\n * - search(..., compare) - comparison function\n * - editable = true\n * - edit(id) - new method\n * - onEdit, onRename - new events\n * - reorder = true - to allow reorder\n * - mouseDown - for reorder\n * - onReorder, onDragStart, onDragOver - events\n * - this.mutlti - for multi select (ctrl for one at a time and shift for range)\n * - onSelect, onUnselect - new events\n * - prev(), next(), getChain()\n */\n\nimport { TsBase } from './tsbase.js'\nimport { TsUi, TsUtils } from './tsutils.js'\nimport { query as _queryRaw, Query } from './query.js'\nimport { TsTooltip, TsMenu } from './tstooltip.js'\n// any: query() returns Query|void; cast once here for clean chaining\nconst query = _queryRaw as (selector: unknown, context?: unknown) => Query\n\n// ---------------------------------------------------------------------------\n// Option shapes for public methods\n// ---------------------------------------------------------------------------\n\n/** Options accepted by refresh() */\nexport interface TsSidebarRefreshOptions {\n recursive?: boolean\n}\n\n/** Options accepted by update() — mirrors node property names that can be updated in-place */\nexport interface TsSidebarUpdateOptions {\n icon?: string | ((nd: unknown, level: number) => string) | null\n class?: string | null\n style?: string | null\n text?: string | ((nd: unknown, level: number) => string) | null\n count?: number | string | null\n [key: string]: unknown // remaining props returned as-is\n}\n\n/** Options accepted by setCount() */\nexport interface TsSidebarSetCountOptions {\n className?: string\n style?: string\n noRepeat?: boolean\n}\n\n/** Options for find() */\nexport interface TsSidebarFindOptions {\n returnDisabled?: boolean\n returnGroups?: boolean\n [key: string]: unknown\n}\n\n/** Options for sort() */\nexport interface TsSidebarSortOptions {\n foldersFirst?: boolean\n caseSensitive?: boolean\n reverse?: boolean\n [key: string]: unknown\n}\n\nclass TsSidebar extends TsBase {\n declare box: HTMLElement | null\n declare name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nodes: any[] // any: sidebar node tree has dynamic shape\n // any: targeted-any per typing_policy; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n selected: any\n // any: targeted-any per typing_policy; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n img: any\n // any: targeted-any per typing_policy; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n icon: any\n style: string\n hasFocus: boolean\n flat: boolean\n flatButton: boolean\n keyboard: boolean\n editable: boolean\n reorder: boolean\n tabIndex: number | null\n routeData: Record<string, unknown>\n multi: boolean\n skipRefresh: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n last: any // any: accumulates move, renaming, observeResize\n node_template: Record<string, unknown>\n // any: targeted-any per typing_policy; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(options: any) { // any: options bag — mixed type at construction time\n super(options.name)\n this.name = ''\n this.box = null\n this['sidebar'] = null\n this['parent'] = null\n this.nodes = [] // Sidebar child nodes\n this['menu'] = []\n this.routeData = {} // data for dynamic routes\n this.selected = null // current selected node (readonly)\n this.icon = null\n this.style = ''\n this['topHTML'] = ''\n this['bottomHTML'] = ''\n this.multi = false\n this.editable = false\n this.reorder = false\n this.flatButton = false\n this.keyboard = true\n this.flat = false\n this.hasFocus = false\n this['levelPadding'] = 12\n this['toggleAlign'] = 'right' // can be left or right\n this.skipRefresh = false\n this.tabIndex = null // will only be set if > 0 and not null\n this['handle'] = { width: 0, style: '', text: '', tooltip: '' }\n this['badge'] = null\n this['onClick'] = null // Fire when user click on Node Text\n this['onSelect'] = null\n this['onUnselect'] = null\n this['onDblClick'] = null // Fire when user dbl clicks\n this['onMouseEnter'] = null // mouse enter/leave over an item\n this['onMouseLeave'] = null\n this['onContextMenu'] = null\n this['onMenuClick'] = null // when context menu item selected\n this['onExpand'] = null // Fire when node expands\n this['onCollapse'] = null // Fire when node collapses\n this['onKeydown'] = null\n this['onRender'] = null\n this['onRefresh'] = null\n this['onResize'] = null\n this['onDestroy'] = null\n this['onFocus'] = null\n this['onBlur'] = null\n this['onFlat'] = null\n this['onEdit'] = null\n this['onRename'] = null\n this['onReorder'] = null\n this['onDragStart'] = null\n this['onDragOver'] = null\n this.node_template = {\n id: null,\n text: '',\n order: null,\n count: null,\n icon: null,\n nodes: [],\n style: '', // additional style for subitems\n route: null,\n selected: false,\n expanded: false,\n hidden: false,\n disabled: false,\n group: false, // if true, it will build as a group\n groupShowHide: true,\n collapsible: false,\n plus: false, // if true, plus will be shown even if there is no sub nodes\n childOffset: 0,\n // events\n onClick: null,\n onDblClick: null,\n onContextMenu: null,\n onExpand: null,\n onCollapse: null,\n // internal\n parent: null, // node object\n sidebar: null\n }\n this.last = {\n badge: {},\n renaming: false,\n move: null, // object, move details\n }\n const nodes = options.nodes\n delete options.nodes\n // mix in options\n Object.assign(this, options)\n // add item via method to makes sure item_template is applied\n if (Array.isArray(nodes)) this.add(nodes)\n // need to reassign back to keep it in config\n options.nodes = nodes\n\n // render if box specified\n // any: query().get(0) returns Node|Node[]; box selector always resolves to HTMLElement\n if (typeof this.box == 'string') this.box = query(this.box).get(0) as HTMLElement\n if (this.box) this.render(this.box)\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n add(parent?: any, nodes?: any) {\n if (nodes === undefined) {\n // need to be in reverse order\n nodes = parent\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n parent = this\n }\n if (typeof parent == 'string') parent = this.get(parent)\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n if (parent == null || parent == '') parent = this\n return this.insert(parent, null, nodes)\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n insert(parent?: any, before?: any, nodes?: any) {\n let txt, ind, tmp, node, nd\n if (nodes === undefined && typeof parent == 'string') {\n // need to be in reverse order\n nodes = before\n before = parent\n if (before != null) {\n ind = this.get(before)\n if (ind == null) {\n if (!Array.isArray(nodes)) nodes = [nodes]\n if (nodes[0].caption != null && nodes[0].text == null) {\n console.log('NOTICE: sidebar node.caption property is deprecated, please use node.text. Node -> ', nodes[0])\n nodes[0].text = nodes[0].caption\n }\n txt = nodes[0].text\n console.log('ERROR: Cannot insert node \"'+ txt +'\" because cannot find node \"'+ before +'\" to insert before.')\n return null\n }\n parent = this.get(before).parent\n } else {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n parent = this\n }\n }\n if (typeof parent == 'string') parent = this.get(parent)\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n if (parent == null || parent == '') parent = this\n if (!Array.isArray(nodes)) nodes = [nodes]\n for (let o = 0; o < nodes.length; o++) {\n node = nodes[o]\n if (node.caption != null && node.text == null) {\n console.log('NOTICE: sidebar node.caption property is deprecated, please use node.text')\n node.text = node.caption\n }\n if (typeof node.id == null) {\n txt = node.text\n console.log('ERROR: Cannot insert node \"'+ txt +'\" because it has no id.')\n continue\n }\n if (this.get(this, node.id) != null) {\n console.log('ERROR: Cannot insert node with id='+ node.id +' (text: '+ node.text + ') because another node with the same id already exists.')\n continue\n }\n tmp = Object.assign({}, this.node_template, node)\n tmp.sidebar = this\n tmp.parent = parent\n nd = tmp.nodes || []\n tmp.nodes = [] // very important to re-init empty nodes array\n if (before == null) { // append to the end\n parent.nodes.push(tmp)\n } else {\n ind = this.get(parent, before, true)\n if (ind == null) {\n console.log('ERROR: Cannot insert node \"'+ node.text +'\" because cannot find node \"'+ before +'\" to insert before.')\n return null\n }\n parent.nodes.splice(ind, 0, tmp)\n }\n if (nd.length > 0) {\n this.insert(tmp, null, nd)\n }\n }\n if (!this.skipRefresh) this.refresh(parent.id)\n return tmp\n }\n\n // any: array of heterogeneous runtime values; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n remove(...args: any[]) { // multiple arguments\n let effected = 0\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let lastNode: any = null // any: node objects have dynamic shape; tracks last removed for refresh\n args.forEach(arg => {\n const node = this.get(arg)\n if (node == null) return\n if (this.selected != null) {\n if (Array.isArray(this.selected)) {\n this.selected.splice(this.selected.indexOf(node.id), 1)\n } else if (this.selected === node.id) {\n this.selected = null\n }\n }\n const ind = this.get(node.parent, arg, true)\n if (ind == null) return\n if (node.parent.nodes[ind].selected) node['sidebar'].unselect(node.id)\n node.parent.nodes.splice(ind, 1)\n node.parent.collapsible = node.parent.nodes.length > 0\n lastNode = node\n effected++\n })\n if (!this.skipRefresh) {\n if (effected > 0 && arguments.length == 1 && lastNode != null) this.refresh(lastNode.parent.id); else this.refresh()\n }\n return effected\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n set(parent?: any, id?: any, node?: any) {\n if (node === undefined) {\n // need to be in reverse order\n node = id\n id = parent\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n parent = this\n }\n // searches all nested nodes\n if (typeof parent == 'string') parent = this.get(parent)\n if (parent.nodes == null) return null\n for (let i = 0; i < parent.nodes.length; i++) {\n if (parent.nodes[i].id === id) {\n // see if quick update is possible\n const res = this.update(id, node)\n if (Object.keys(res).length != 0) {\n // make sure nodes inserted correctly\n const nodes = node.nodes\n TsUtils.extend(parent.nodes[i], node, (nodes != null ? { nodes: [] } : {}))\n if (nodes != null) {\n this.add(parent.nodes[i], nodes)\n }\n if (!this.skipRefresh) this.refresh(id)\n }\n return true\n } else {\n const rv = this.set(parent.nodes[i], id, node)\n if (rv) return true\n }\n }\n return false\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(parent?: any, id?: any, returnIndex?: any): any { // can be just called get(id) or get(id, true)\n if (arguments.length === 0) {\n const all = []\n const tmp = this.find({})\n for (let t = 0; t < tmp.length; t++) {\n if (tmp[t].id != null) all.push(tmp[t].id)\n }\n return all\n } else {\n if (arguments.length == 1 || (arguments.length == 2 && id === true) ) {\n // need to be in reverse order\n returnIndex = id\n id = parent\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n parent = this\n }\n // searches all nested nodes\n if (typeof parent == 'string') parent = this.get(parent)\n if (parent.nodes == null) return null\n for (let i = 0; i < parent.nodes.length; i++) {\n if (parent.nodes[i].id == id) {\n if (returnIndex === true) return i; else return parent.nodes[i]\n } else {\n const rv = this.get(parent.nodes[i], id, returnIndex)\n if (rv || rv === 0) return rv\n }\n }\n return null\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n setCount(id: any, count: any, options: TsSidebarSetCountOptions = {}) { // any: node id + count are runtime-typed\n const node = this.get(id)\n if (node.group) {\n console.log(`Node \"${id}\" is a group and groups cannot have counts or badges.`)\n return\n }\n this.last.badge[id] = {\n className: options.className ?? '',\n style: options.style ?? ''\n }\n const btn = query(this.box).find(`#node_${TsUtils.escapeId(id)} .tsg-node-badge`)\n if (btn.length > 0) {\n // any: query().text(val) returns unknown|Query; setter always returns Query here\n const $cnt = (btn.removeClass(null)\n .addClass(`tsg-node-badge ${options.className ?? 'tsg-node-count'}`)\n .text(count) as unknown as Query)\n // any: query().get(0) returns Node|Node[]; badge button is always HTMLElement\n ;($cnt.get(0) as HTMLElement).style.cssText = options.style || ''\n const item = this.get(id)\n item.count = count\n } else if (!options.noRepeat) {\n this.set(id, { count })\n options.noRepeat = true\n queueMicrotask(() => this.setCount(id, count, options)) // to update styles\n }\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n find(parent?: any, params?: any, results?: any): any { // can be just called find({ selected: true })\n // TODO: rewrite with this.each()\n if (arguments.length == 1) {\n // need to be in reverse order\n params = parent\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n parent = this\n }\n if (!results) results = []\n // searches all nested nodes\n if (typeof parent == 'string') parent = this.get(parent)\n if (parent.nodes == null) return results\n for (let i = 0; i < parent.nodes.length; i++) {\n let match = true\n for (const prop in params) { // params is an object\n if (parent.nodes[i][prop] != params[prop]) match = false\n }\n if (match) results.push(parent.nodes[i])\n if (parent.nodes[i].nodes.length > 0) results = this.find(parent.nodes[i], params, results)\n }\n return results\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sort(options: TsSidebarSortOptions | null | undefined, nodes?: any) { // any: recursive call passes node subtree of unknown shape\n // default options\n if (!options || typeof options != 'object') options = {}\n if (options.foldersFirst == null) options.foldersFirst = true\n if (options.caseSensitive == null) options.caseSensitive = false\n if (options.reverse == null) options.reverse = false\n\n if (nodes == null) {\n nodes = this.nodes\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nodes.sort((a: any, b: any) => { // any: node objects have dynamic shape\n // folders first\n const isAfolder = (a.nodes && a.nodes.length > 0)\n const isBfolder = (b.nodes && b.nodes.length > 0)\n // both folder or both not folders\n if (options.foldersFirst === false || (!isAfolder && !isBfolder) || (isAfolder && isBfolder)) {\n let aText = a.text\n let bText = b.text\n if (a.order != null) aText = a.order\n if (b.order != null) bText = b.order\n if (!options.caseSensitive) {\n aText = aText.toLowerCase()\n bText = bText.toLowerCase()\n }\n const cmp = TsUtils.naturalCompare(aText, bText)\n // any: bitwise-AND on boolean mirrors original JS behavior (truthy = reversed)\n return ((cmp === 1 || cmp === -1) as unknown as number) & (options.reverse ? 1 : 0) ? -cmp : cmp\n }\n if (isAfolder && !isBfolder) {\n return !options.reverse ? -1 : 1\n }\n if (!isAfolder && isBfolder) {\n return !options.reverse ? 1 : -1\n }\n })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nodes.forEach((node: any) => { // any: node objects have dynamic shape\n if (node.nodes && node.nodes.length > 0) {\n this.sort(options, node.nodes)\n }\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n each(fn: any, nodes?: any) { // any: fn is a user-supplied callback; nodes is a dynamic node array\n if (nodes == null) nodes = this.nodes\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nodes.forEach((node: any) => { // any: node objects have dynamic shape\n fn.call(this, node)\n if (node.nodes && node.nodes.length > 0) {\n this.each(fn, node.nodes)\n }\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n search(str: any, compare: any = null) { // any: str is searched text; compare is an optional user callback\n let count = 0\n const str2 = str.toLowerCase()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.each((node: any) => { // any: node objects have dynamic shape\n let match = false\n if (typeof compare == 'function') {\n match = compare(str, node)\n } else {\n match = !(node.text.toLowerCase().indexOf(str2) === -1)\n }\n if (match) {\n count++\n showParents(node)\n node.hidden = false\n } else {\n node.hidden = true\n }\n })\n this.refresh()\n return count\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function showParents(node: any): void { // any: node objects have dynamic shape\n if (node.parent) {\n node.parent.hidden = false\n showParents(node.parent)\n }\n }\n }\n\n // any: array of heterogeneous runtime values; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n show(...args: any[]) { // multiple arguments\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const effected: any[] = [] // any: node ids can be string|number at runtime\n args.forEach(it => {\n const node = this.get(it)\n if (node == null || node.hidden === false) return\n node.hidden = false\n effected.push(node.id)\n })\n if (effected.length > 0) {\n if (args.length == 1) this.refresh(args[0]); else this.refresh()\n }\n return effected\n }\n\n // any: array of heterogeneous runtime values; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n hide(...args: any[]) { // multiple arguments\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const effected: any[] = [] // any: node ids can be string|number at runtime\n args.forEach(it => {\n const node = this.get(it)\n if (node == null || node.hidden === true) return\n node.hidden = true\n effected.push(node.id)\n })\n if (effected.length > 0) {\n if (args.length == 1) this.refresh(args[0]); else this.refresh()\n }\n return effected\n }\n\n // any: array of heterogeneous runtime values; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n enable(...args: any[]) { // multiple arguments\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const effected: any[] = [] // any: node ids can be string|number at runtime\n args.forEach(it => {\n const node = this.get(it)\n if (node == null || node.disabled === false) return\n node.disabled = false\n effected.push(node.id)\n })\n if (effected.length > 0) {\n if (args.length == 1) this.refresh(args[0]); else this.refresh()\n }\n return effected\n }\n\n // any: array of heterogeneous runtime values; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n disable(...args: any[]) { // multiple arguments\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const effected: any[] = [] // any: node ids can be string|number at runtime\n args.forEach(it => {\n const node = this.get(it)\n if (node == null || node.disabled === true) return\n node.disabled = true\n if (node.selected) this.unselect(node.id)\n effected.push(node.id)\n })\n if (effected.length > 0) {\n if (args.length == 1) this.refresh(args[0]); else this.refresh()\n }\n return effected\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n select(id: any) { // any: node id is string|number at runtime\n if (Array.isArray(id)) {\n [...id].forEach(id => this.select(id))\n return\n }\n const new_node = this.get(id)\n if (!new_node) return false\n // event before\n const edata = this.trigger('select', { target: id, id, node: new_node })\n if (edata.isCancelled === true) {\n return true\n }\n // if already selected\n if (!this.multi && this.selected == id && new_node.selected) {\n return false\n } else {\n // unselect all previously selected nodes\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.find({ selected: true }).forEach((nd: any) => nd.selected = false) // any: node objects have dynamic shape\n }\n const $el = query(this.box).find('#node_'+ TsUtils.escapeId(id))\n $el.addClass('tsg-selected')\n .find('.tsg-icon')\n .addClass('tsg-icon-selected')\n if ($el.length > 0) {\n if (!this.inView(id)) this.scrollIntoView(id)\n }\n new_node.selected = true\n if (this.multi) {\n if (!Array.isArray(this.selected)) {\n this.selected = this.selected ? [this.selected] : []\n }\n this.selected.push(id)\n } else {\n this.selected = this.multi ? [id] : id\n }\n edata.finish()\n return true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unselect(id?: any) { // any: node id is string|number at runtime; optional to unselect all\n // if no arguments provided, unselect selected node\n if (arguments.length === 0) {\n id = this.selected\n }\n if (Array.isArray(id)) {\n [...id].forEach(id => this.unselect(id))\n return\n }\n const current = this.get(id)\n if (!current) return false\n // event before\n const edata = this.trigger('unselect', { target: id, id, node: current })\n if (edata.isCancelled === true) {\n return true\n }\n current.selected = false\n query(this.box).find('#node_'+ TsUtils.escapeId(id))\n .removeClass('tsg-selected')\n .find('.tsg-icon').removeClass('tsg-icon-selected')\n if (typeof this.selected == 'string' && this.selected == id) {\n this.selected = null\n }\n if (this.multi && Array.isArray(this.selected)) {\n const ind = this.selected.indexOf(id)\n if (ind != -1) this.selected.splice(ind, 1)\n }\n edata.finish()\n return true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toggle(id: any) { // any: node id is string|number at runtime\n const nd = this.get(id)\n if (nd == null) return false\n if (nd.plus) {\n this.set(id, { plus: false })\n this.expand(id)\n this.refresh(id)\n return\n }\n if (nd.nodes.length === 0) return false\n if (!nd.collapsible) return false\n if (this.get(id).expanded) return this.collapse(id); else return this.expand(id)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n collapse(id: any) { // any: node id is string|number at runtime\n const nd = this.get(id)\n if (nd == null) return false\n // event before\n const edata = this.trigger('collapse', { target: id, object: nd, node: nd })\n if (edata.isCancelled === true) return\n // default action\n query(this.box).find('#node_'+ TsUtils.escapeId(id) +'_sub').hide()\n query(this.box).find('#node_'+ TsUtils.escapeId(id) +' .tsg-expanded')\n .removeClass('tsg-expanded')\n .addClass('tsg-collapsed')\n nd.expanded = false\n // event after\n edata.finish()\n this.refresh(id)\n return true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n expand(id: any) { // any: node id is string|number at runtime\n const nd = this.get(id)\n // event before\n const edata = this.trigger('expand', { target: id, object: nd, node: nd })\n if (edata.isCancelled === true) return\n // default action\n query(this.box).find('#node_'+ TsUtils.escapeId(id) +'_sub')\n .show()\n query(this.box).find('#node_'+ TsUtils.escapeId(id) +' .tsg-collapsed')\n .removeClass('tsg-collapsed')\n .addClass('tsg-expanded')\n nd.expanded = true\n // event after\n edata.finish()\n this.refresh(id)\n return true\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n collapseAll(parent?: any) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n if (parent == null) parent = this\n if (typeof parent == 'string') parent = this.get(parent)\n if (parent.nodes == null) return false\n for (let i = 0; i < parent.nodes.length; i++) {\n if (parent.nodes[i].expanded === true) parent.nodes[i].expanded = false\n if (parent.nodes[i].nodes && parent.nodes[i].nodes.length > 0) this.collapseAll(parent.nodes[i])\n }\n this.refresh(parent.id)\n return true\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n expandAll(parent?: any) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n if (parent == null) parent = this\n if (typeof parent == 'string') parent = this.get(parent)\n if (parent.nodes == null) return false\n for (let i = 0; i < parent.nodes.length; i++) {\n if (parent.nodes[i].expanded === false) parent.nodes[i].expanded = true\n if (parent.nodes[i].nodes && parent.nodes[i].nodes.length > 0) this.expandAll(parent.nodes[i])\n }\n this.refresh(parent.id)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n expandParents(id: any) { // any: node id is string|number at runtime\n const node = this.get(id)\n if (node == null) return false\n if (node.parent) {\n if (!node.parent.expanded) {\n node.parent.expanded = true\n this.refresh(node.parent.id)\n }\n this.expandParents(node.parent.id)\n }\n return true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n click(id: any, event?: any) { // any: id is string|number; event may be MouseEvent|TouchEvent at runtime\n const nd = this.get(id)\n if (nd == null) return\n if (nd.disabled || nd.group) {\n // even if disabled, it should still emit click event\n const edata = this.trigger('click', { target: id, originalEvent: event, node: nd, object: nd })\n edata.finish()\n return\n }\n // select new one\n const newNode = query(this.box).find('#node_'+ TsUtils.escapeId(id))\n newNode.addClass('tsg-selected').find('.tsg-icon').addClass('tsg-icon-selected')\n // need timeout to allow rendering\n setTimeout(() => {\n // event before\n const edata = this.trigger('click', { target: id, originalEvent: event, node: nd, object: nd })\n if (edata.isCancelled === true) {\n // restore selection\n newNode.removeClass('tsg-selected').find('.tsg-icon').removeClass('tsg-icon-selected')\n return\n }\n // default action\n if (this.multi) {\n /**\n * Multi select with shift or ctrl/meta\n */\n // any: Event may be MouseEvent at runtime; shiftKey/ctrlKey/metaKey are MouseEvent properties\n const mev = event as MouseEvent | undefined\n const isShift = mev?.shiftKey ?? false\n const isCtrl = (mev?.ctrlKey || mev?.metaKey) ?? false\n if (typeof this.selected == 'string') {\n this.selected = [this.selected]\n }\n if (isCtrl && !isShift) { // only Ctrl\n if (this.selected?.includes(id)) {\n this.unselect(id)\n return\n } else {\n this.select(id)\n }\n } else if (!isCtrl && isShift) { // only Shift\n // select range in between\n const chain = this.getChain()\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ind1 = Math.min(this.selected.map((sel: any) => chain.indexOf(sel))) // any: selected ids are string|number; first item in selection\n const ind2 = chain.indexOf(id)\n for (let i = Math.min(ind1, ind2); i < chain.length && i <= Math.max(ind1, ind2); i++) {\n const node = this.get(chain[i])\n if (!this.selected.includes(chain[i]) && node.hidden != true) {\n this.select(chain[i])\n }\n }\n\n } else { // neither\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ids = this.selected?.filter((sid: any) => sid != id && this.selected.includes(sid)) // any: selected ids are string|number\n this.unselect(ids)\n // only select if it is not selected\n if (!this.selected?.includes(id)) {\n this.select(id)\n }\n }\n\n } else if (this.selected !== id) {\n /**\n * Single selection at a time\n */\n if (this.selected != null) this.unselect(this.selected)\n this.select(id)\n // route processing\n if (typeof nd.route == 'string') {\n let route = nd.route !== '' ? String('/'+ nd.route).replace(/\\/{2,}/g, '/') : ''\n const info = TsUtils.parseRoute(route)\n if (info.keys.length > 0) {\n for (let k = 0; k < info.keys.length; k++) {\n const routeKey = info.keys[k]\n if (routeKey == null) continue\n if (this.routeData[routeKey.name] == null) continue\n // any: routeData values are runtime strings; declared as unknown for safety\n route = route.replace((new RegExp(':'+ routeKey.name, 'g')), this.routeData[routeKey.name] as string)\n }\n }\n setTimeout(() => { window.location.hash = route }, 1)\n }\n // if sidebar is flat - show menu\n if (this.flat) {\n const items = _getItems(nd.nodes)\n if (items.length > 0) {\n this.flatMenu(newNode, items)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _getItems(nodes: any): any { // any: node objects have dynamic shape\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items = nodes.map((it: any) => { // any: node objects have dynamic shape\n const items = it.nodes.length > 0 ? _getItems(it.nodes) : null\n return { id: it.id, text: it.text, icon: it.icon, items }\n })\n return items\n }\n }\n }\n // event after\n edata.finish()\n }, 1)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n flatMenu(el: any, items: any) { // any: el is query-wrapped element; items is dynamic node menu array\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n const $el = query(el).find('.tsg-node-data')\n TsMenu.show({\n // any: query().get(0) returns Node|Node[]; anchor is always HTMLElement in flat menu context\n anchor: $el.get(0) as HTMLElement,\n name: this.name + '_flat-menu',\n items,\n // class: 'tsg-dark',\n position: 'right|left',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSelect(event: any) { // any: TsMenu select event detail has dynamic shape\n self.unselect()\n self.click(event.detail.item.id, event.detail.originalEvent)\n },\n onHide(_event) {\n self.unselect()\n }\n })\n TsTooltip.hide(this.name + '_tooltip')\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n focus(event?: any) { // any: event may be FocusEvent|MouseEvent at runtime\n // event before\n const edata = this.trigger('focus', { target: this.name, originalEvent: event })\n if (edata.isCancelled === true) return false\n // default behaviour\n this.hasFocus = true\n query(this.box).find('.tsg-sidebar-body').addClass('tsg-focus')\n setTimeout(() => {\n const input = query(this.box).find('#sidebar_'+ this.name + '_focus').get(0) as HTMLElement\n if (document.activeElement != input) input.focus()\n }, 10)\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n blur(event: any) { // any: event may be FocusEvent|MouseEvent at runtime\n // event before\n const edata = this.trigger('blur', { target: this.name, originalEvent: event })\n if (edata.isCancelled === true) return false\n // default behaviour\n this.hasFocus = false\n query(this.box).find('.tsg-sidebar-body').removeClass('tsg-focus')\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n next(node: any, noSubs?: any): any { // any: node objects have dynamic shape; return is node or null\n if (node == null) return null\n const parent = node.parent\n const ind = this.get(node.id, true)\n let nextNode = null\n // jump inside\n if (node.expanded && node.nodes.length > 0 && noSubs !== true) {\n const nd = node.nodes[0] ?? null\n if (nd == null) { nextNode = null } else if (nd.hidden || nd.disabled || nd.group) { nextNode = this.next(nd) } else { nextNode = nd }\n } else {\n if (parent && ind + 1 < parent.nodes.length) {\n nextNode = parent.nodes[ind + 1] ?? null\n } else {\n nextNode = this.next(parent, true) // jump to the parent\n }\n }\n if (nextNode != null && (nextNode.hidden || nextNode.disabled || nextNode.group)) nextNode = this.next(nextNode)\n return nextNode\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n prev(node: any): any { // any: node objects have dynamic shape; return is node or null\n if (node == null) return null\n const parent = node.parent\n const ind = this.get(node.id, true)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lastChild = (node: any): any => { // any: node objects have dynamic shape\n if (node.expanded && node.nodes.length > 0) {\n const nd = node.nodes[node.nodes.length - 1] ?? null\n if (nd == null) return node\n if (nd.hidden || nd.disabled || nd.group) return this.prev(nd); else return lastChild(nd)\n }\n return node\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const prevNodeSource: any = (ind > 0) ? parent.nodes[ind - 1] : null // any: node from index access\n let prevNode = (ind > 0 && prevNodeSource != null) ? lastChild(prevNodeSource) : parent\n if (prevNode != null && (prevNode.hidden || prevNode.disabled || prevNode.group)) prevNode = this.prev(prevNode)\n return prevNode\n }\n\n // returns ids of expanded elements as a flat array\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getChain(nodes?: any, options: TsSidebarFindOptions = {}): any[] { // any: nodes is dynamic node array; returns id array\n options.returnDisabled ??= false\n options.returnGroups ??= false\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ids: any[] = [] // any: node ids can be string|number at runtime\n if (nodes == null) nodes = this.nodes\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nodes.forEach((node: any) => { // any: node objects have dynamic shape\n // can skip disabled if needed\n if ((!node.disabled && !node.group) || (node.disabled && options.returnDisabled) || (node.group && options.returnGroups)) {\n ids.push(node.id)\n }\n if (Array.isArray(node.nodes) && node.expanded) {\n ids.push(...this.getChain(node.nodes, options))\n }\n })\n return ids\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n keydown(event: any) { // any: KeyboardEvent in practice but dispatched via TsUi bindEvents as generic Event\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n const first = Array.isArray(this.selected) ? this.selected[0] : this.selected\n let nd = this.get(first)\n if (this.keyboard !== true) return\n if (!nd) nd = this.nodes[0] ?? null\n // if user hits esc and there is active move\n if (event.keyCode == 27) {\n const mv = this.last.move\n if (mv?.reorder && mv?.moved) {\n mv.restore()\n return\n }\n }\n // trigger event\n const edata = this.trigger('keydown', { target: this.name, originalEvent: event })\n if (edata.isCancelled === true) return\n // default behaviour\n if (event.keyCode == 13 || event.keyCode == 32) { // enter or space\n if (event.keyCode == 13 && this.editable && !event.ctrlKey && !event.metaKey) {\n this.edit(first)\n } else {\n if (nd.nodes.length > 0) {\n this.toggle(first)\n }\n }\n }\n if (event.keyCode == 37) { // left\n if (nd.nodes.length > 0 && nd.expanded) {\n this.collapse(first)\n } else {\n selectNode(nd.parent)\n if (!nd.parent.group) this.collapse(nd.parent.id)\n }\n }\n if (event.keyCode == 39) { // right\n if ((nd.nodes.length > 0 || nd.plus) && !nd.expanded) this.expand(first)\n }\n if (event.keyCode == 38) { // up\n if (this.get(first) == null) {\n selectNode(this.nodes[0] || null)\n } else {\n selectNode(neighbor(nd, this.prev))\n }\n }\n if (event.keyCode == 40) { // down\n if (this.get(first) == null) {\n selectNode(this.nodes[0] || null)\n } else {\n selectNode(neighbor(nd, this.next))\n }\n }\n // cancel event if needed\n if ([13, 32, 37, 38, 39, 40].includes(event.keyCode)) {\n if (event.preventDefault) event.preventDefault()\n if (event.stopPropagation) event.stopPropagation()\n }\n // event after\n edata.finish()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function selectNode(node: any, event?: any) { // any: node object has dynamic shape; event may be any Event subtype\n if (node != null && !node.hidden && !node.disabled && !node.group) {\n self.click(node.id, event)\n if (!self.inView(node.id)) self.scrollIntoView(node.id)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function neighbor(node: any, neighborFunc: any): any { // any: node object and neighborFunc have dynamic shape\n node = neighborFunc.call(self, node)\n while (node != null && (node.hidden || node.disabled)) {\n if (node.group) break; else node = neighborFunc(node)\n }\n return node\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inView(id: any) { // any: node id is string|number at runtime\n // any: query().get(0) returns Node|Node[]; sidebar nodes are always HTMLElement\n const item = query(this.box).find('#node_'+ TsUtils.escapeId(id)).get(0) as HTMLElement | undefined\n if (!item) {\n return false\n }\n const div = query(this.box).find('.tsg-sidebar-body').get(0) as HTMLElement | undefined\n if (!div) return false\n if (item.offsetTop < div.scrollTop || (item.offsetTop + item.clientHeight > div.clientHeight + div.scrollTop)) {\n return false\n }\n return true\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n scrollIntoView(id?: any, instant?: any) { // any: id is string|number; instant is boolean-ish\n return new Promise<void>((resolve) => {\n if (id == null) id = Array.isArray(this.selected) ? this.selected[0] : this.selected\n const nd = this.get(id)\n if (nd == null) return\n // any: query().get(0) returns Node|Node[]; sidebar node is always HTMLElement\n const item = query(this.box).find('#node_'+ TsUtils.escapeId(id)).get(0) as HTMLElement | undefined\n if (item) item.scrollIntoView({ block: 'center', inline: 'center', behavior: instant ? 'auto' : 'smooth' })\n setTimeout(() => { this.resize(); resolve() }, instant ? 0 : 500)\n })\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dblClick(id: any, event: any) { // any: id is string|number; event may be MouseEvent|TouchEvent at runtime\n const nd = this.get(id)\n // event before\n const edata = this.trigger('dblClick', { target: id, originalEvent: event, object: nd })\n if (edata.isCancelled === true) return\n // default action\n if (this.editable) {\n this.edit(id)\n } else if (!this.flat) {\n this.toggle(id)\n }\n // event after\n edata.finish()\n }\n\n /**\n * This is needed for not reorder\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mouseDown(id: any, event: any) { // any: id is string|number; event may be MouseEvent|TouchEvent at runtime\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n if (this.reorder) {\n this.last.move = {\n x: event.screenX,\n y: event.screenY,\n divX: 0,\n divY: 0,\n reorder: true,\n moved: false\n }\n // display empty record and ghost record\n const mv = this.last.move\n const body = query(this.box).find('.tsg-sidebar-body')\n if (!mv.ghost) {\n const node = query(this.box).find(`#node_${TsUtils.escapeId(id)}`)\n mv.offsetY = event.offsetY\n mv.target = id\n // any: query().get(0) returns Node|Node[]; sidebar node is always HTMLElement\n const nodeEl = node.get(0) as HTMLElement\n mv.pos = { top: nodeEl.offsetTop - 1, left: nodeEl.offsetLeft }\n // ghost content\n // any: query().get(0) returns Node; it has cloneNode as all Nodes do\n const clone = query((node.find('.tsg-node-data').get(0) as Node).cloneNode(true))\n mv.node = node\n mv.nodeSub = node.next()\n body.append('<div id=\"sidebar_'+ this.name + '_ghost\" class=\"tsg-node tsg-ghost\"></div>')\n query(this.box).find('#sidebar_'+ this.name + '_ghost').append(clone)\n mv.ghost = query(this.box).find('#sidebar_'+ this.name + '_ghost')\n mv.ghost.css({ display: 'none' })\n mv.restore = () => {\n mv.resetReorder()\n this.refresh()\n }\n mv.resetReorder = () => {\n this.last.move = null\n query(this.box).find(`#sidebar_${this.name}_ghost`).remove()\n query(document).off(`.tsg-${this.name}-reorder`)\n }\n }\n // add mouse move and stop events\n query(document)\n .on(`mousemove.tsg-${this.name}-reorder`, _mouseMove)\n .on(`mouseup.tsg-${this.name}-reorder`, _mouseStop)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _mouseMove(event: any) { // any: event is MouseEvent at runtime but bound as generic EventListener\n if (!event.target.tagName) {\n // element has no tagName - most likely the target is the #document itself\n // this can happen is you click+drag and move the mouse out of the DOM area,\n // e.g. into the browser's toolbar area\n return\n }\n const mv = self.last.move\n mv.divX = (event.screenX - mv.x)\n mv.divY = (event.screenY - mv.y)\n if (Math.abs(mv.divX) <= 1 && Math.abs(mv.divY) <= 1) return // only if moved more then 1px\n\n if (self.reorder == true && mv.reorder && !mv.moved) {\n const edata = self.trigger('dragStart', { target: mv.target, moved: true, node: self.get(mv.target), mv, originalEvent: event })\n if (edata.isCancelled === true) {\n mv.restore()\n return\n }\n const rect = mv.node.get(0).getBoundingClientRect()\n mv.moved = true\n mv.node.html('')\n .removeAttr('id', 'data-id')\n .addClass('tsg-reorder-empty')\n .css({ height: rect.height + 'px' })\n // if there are children\n if (mv.node.next().css('display') !== 'none') {\n const rect = mv.node.next().get(0).getBoundingClientRect()\n mv.node.next()\n .html('<div class=\"tsg-reorder-empty-sub\"></div>')\n .css({ height: rect.height + 'px' })\n }\n mv.ghost.css({ display: 'block' })\n // event after\n edata.finish()\n }\n // move ghost mode\n mv.ghost.css({\n top: (mv.pos.top + mv.divY) + 'px',\n left: 0\n })\n const over = query(event.target).closest('.tsg-node, .tsg-node-group')\n const id = over.attr('data-id')\n // append to the end\n if (query(event.target).hasClass('tsg-sidebar-body') && event.layerY > 5 && !mv.append) {\n const edata = self.trigger('dragOver', { target: mv.target, append: true, mv, originalEvent: event })\n if (edata.isCancelled === true) {\n return\n }\n mv.ghost.before(mv.node)\n mv.ghost.before(mv.nodeSub)\n mv.append = true\n mv.moveBefore = null\n // event after\n edata.finish()\n } else if (id != null && id != mv.moveBefore) {\n mv.append = false\n mv.moveBefore = id\n // reorder nodes\n const edata = self.trigger('dragOver', { target: mv.target, moveBefore: id, mv, originalEvent: event })\n if (edata.isCancelled === true) {\n return\n }\n const el = query(self.box).find(`#node_${TsUtils.escapeId(id)}`)\n el.before(mv.node)\n el.before(mv.nodeSub)\n // event after\n edata.finish()\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _mouseStop(event: any) { // any: event is MouseEvent at runtime but bound as generic EventListener\n const mv = self.last.move\n mv.resetReorder()\n if (mv.moved) {\n if (((mv.moveBefore != null && mv.target != mv.moveBefore) || mv.append)) {\n const edata = self.trigger('reorder', { target: mv.target, moveBefore: mv.moveBefore, append: mv.append, originalEvent: event })\n if (edata.isCancelled === true) {\n self.refresh()\n return\n }\n // remove\n const target = self.get(mv.target)\n const targetInd = target.parent.nodes.indexOf(target)\n const cut = target.parent.nodes.splice(targetInd, 1)\n // insert\n if (mv.append) {\n self.nodes.push(...cut)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cut.forEach((nd: any) => nd.parent = self) // any: cut nodes have dynamic shape\n } else {\n const before = self.get(mv.moveBefore)\n const beforeInd = before.parent.nodes.indexOf(before)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cut.forEach((nd: any) => nd.parent = before.parent) // any: cut nodes have dynamic shape\n before.parent.nodes.splice(beforeInd, 0, ...cut)\n }\n // refresh\n self.refresh()\n // event after\n edata.finish()\n } else {\n self.refresh()\n }\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n edit(id: any) { // any: node id is string|number at runtime\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n const node = query(this.box).find('#node_'+ TsUtils.escapeId(id))\n const text = node.find('.tsg-node-text')\n // event before\n const edata = this.trigger('edit', { target: id, el: node, textEl: text })\n if (edata.isCancelled === true) {\n return\n }\n this.last.renaming = true\n node.addClass('tsg-editing')\n // any: css(key,val) and attr(name,val) overloads return string|Query; cast for chaining\n ;((text.addClass('tsg-focus')\n .css('pointer-events', 'all') as unknown as Query)\n .attr('contenteditable', TsUtils.isFirefox ? 'true' : 'plaintext-only') as unknown as Query)\n .on('blur.node-editing', (_event) => {\n // timeout is needed to add to the end of the event loop\n setTimeout(_rename, 0)\n })\n .on('keydown.node-editing', (event: Event) => {\n const kbdEvent = event as KeyboardEvent\n if (kbdEvent.keyCode == 13) _rename(kbdEvent)\n if (kbdEvent.keyCode == 27) _rename(kbdEvent, true)\n })\n // any: query().get(0) returns Node|Node[]; text contenteditable node is always HTMLElement\n ;(text.get(0) as HTMLElement).focus()\n\n const original = text.text() as string\n // any: query()[0] returns Node; text node is HTMLElement; text.text() returns unknown at runtime\n TsUtils.setCursorPosition(text[0] as HTMLElement, 0, (text.text() as string).length)\n // event after\n edata.finish()\n\n return text.get(0) // return editable input\n\n function _rename(event?: KeyboardEvent | Event, cancel?: boolean) {\n // any: text() returns unknown; rename text is always a string at runtime\n const renameTo = text.text() as string\n node.removeClass('tsg-editing')\n // any: css(key, value) overload returns string|Record|Query; cast to Query for chaining\n ;(text.removeClass('tsg-focus')\n .css('pointer-events', 'none') as unknown as Query)\n .removeAttr('contenteditable')\n .off('.node-editing')\n // send event if it was not cancelled\n if (!cancel && self.last.renaming && original !== renameTo) {\n const edata = self.trigger('rename', { target: id, text_previous: original, text_new: renameTo, originalEvent: event })\n if (edata.isCancelled === true) {\n text.text(original)\n self.last.renaming = false\n self.focus()\n return\n }\n self.set(id, { text: renameTo })\n edata.finish()\n }\n if (cancel) {\n self.set(id, { text: original })\n }\n self.last.renaming = false\n self.focus()\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contextMenu(id: any, event: any) { // any: id is string|number; event may be MouseEvent|ContextMenuEvent at runtime\n const nd = this.get(id)\n if (Array.isArray(this.selected)) {\n if (!this.selected.includes(id)) this.click(id)\n } else {\n if (id != this.selected) this.click(id)\n }\n // event before\n const edata = this.trigger('contextMenu', { target: id, originalEvent: event, object: nd, allowOnDisabled: false })\n if (edata.isCancelled === true) return\n // default action\n // any: allowOnDisabled is a custom event field stored in detail (TsEventData allows [key: string]: unknown)\n if (nd.disabled && !edata.detail['allowOnDisabled']) return\n if (this['menu'].length > 0) {\n TsMenu.hide(this.name + '_menu') // hide previous if any needed when other item's menu is shown\n // any: TsMenu.show() returns AttachReturn|{overlay}; select exists on AttachReturn only\n const menuAttach = TsMenu.show({\n name: this.name + '_menu',\n anchor: document.body,\n contextMenu: true,\n items: this['menu'],\n originalEvent: event\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any // any: AttachReturn not exported from TsTooltip; select is optional on it\n menuAttach?.select?.((evt: unknown) => {\n this.menuClick(id, (evt as { detail: unknown }).detail)\n })\n }\n // prevent default context menu\n if (event.preventDefault) event.preventDefault()\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n menuClick(itemId: any, detail: any = {}) { // any: itemId is string|number; detail is event detail object\n // event before\n const edata = this.trigger('menuClick', { target: itemId, ...detail })\n if (edata.isCancelled === true) return\n // default action\n // -- empty\n // event after\n edata.finish()\n }\n\n goFlat() {\n // event before\n const edata = this.trigger('flat', { goFlat: !this.flat })\n if (edata.isCancelled === true) return\n // default action\n this.flat = !this.flat\n this.refresh()\n if (this.flat) {\n // collapse all unless it is a group\n this.nodes.forEach(node => {\n if (!node.group) {\n this.collapse(node.id)\n this.collapseAll(node.id) // sub items too\n }\n })\n this.unselect() // unselects all\n } else {\n // expand all unless it is a group\n this.nodes.forEach(node => {\n if (!node.group) {\n this.expand(node.id)\n this.expandAll(node.id) // sub items too\n }\n })\n }\n // event after\n edata.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n override render(box?: any) { // any: box is HTMLElement|string|null at runtime\n const time = Date.now()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = this\n if (typeof box == 'string') box = query(box).get(0) as HTMLElement\n // event before\n const edata = this.trigger('render', { target: this.name, box: box ?? this.box })\n if (edata.isCancelled === true) return\n // default action\n if (box != null) {\n this.unmount() // clean previous control\n this.box = box\n }\n if (!this.box) return\n query(this.box)\n .attr('name', this.name)\n .addClass('tsg-reset tsg-sidebar')\n .html(`<div>\n <div class=\"tsg-sidebar-top\"></div>\n <input id=\"sidebar_${this.name}_focus\" ${(this.tabIndex ? 'tabindex=\"' + this.tabIndex + '\"' : '')}\n style=\"position: absolute; top: 0; right: 1px; width: 1px; z-index: -1; opacity: 0\"\n ${(TsUtils.isMobile ? 'readonly' : '')}/>\n <div class=\"tsg-sidebar-body\"></div>\n <div class=\"tsg-sidebar-bottom\"></div>\n </div>`)\n // any: query().get(0) returns Node|Node[]; box is always HTMLElement when rendering\n const boxEl3 = query(this.box).get(0) as HTMLElement\n const rect = boxEl3.getBoundingClientRect()\n query(this.box).find(':scope > div').css({\n width : rect.width + 'px',\n height : rect.height + 'px'\n })\n boxEl3.style.cssText += this.style\n // focus\n let kbd_timer: ReturnType<typeof setTimeout> | undefined\n query(this.box).find('#sidebar_'+ this.name + '_focus')\n .on('focus', function(event) {\n clearTimeout(kbd_timer)\n if (!obj.hasFocus) obj.focus(event)\n })\n .on('blur', function(event) {\n kbd_timer = setTimeout(() => {\n if (obj.hasFocus) { obj.blur(event) }\n }, 100)\n })\n .on('keydown', function(event) {\n // any: TsUi is Record<string,unknown>; keydown is a method on the registered sidebar\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const w2obj = TsUi[obj.name] as any // any: TsUi registry value is dynamic\n w2obj?.keydown?.call(w2obj, event)\n })\n query(this.box).off('mousedown')\n .on('mousedown', function(event) {\n // set focus to sidebar\n setTimeout(() => {\n // if input then do not focus\n // any: event.target is EventTarget; tagName exists on HTMLElement\n if (['INPUT', 'TEXTAREA', 'SELECT'].indexOf((event.target as HTMLElement)?.tagName?.toUpperCase()) == -1) {\n const $input = query(obj.box).find('#sidebar_'+ obj.name + '_focus')\n // any: query().get(0) returns Node|Node[]; focus input is always HTMLElement\n const inputEl = $input.get(0) as HTMLElement | undefined\n if (document.activeElement != inputEl && $input.length > 0) {\n inputEl?.focus()\n }\n }\n }, 1)\n })\n /**\n * FlatHTML is always present and in .refresh() it is just refreshed. However topHTML and buttomHTML should be here\n * because it should never be refreshed, as it could create recursive refresh loop\n */\n const flatHTML = `<div class=\"tsg-flat tsg-flat-${(this.flat ? 'right' : 'left')}\" ${this.flatButton == false ? 'style=\"display: none\"' : ''}></div>`\n if (this['topHTML'] !== '' || flatHTML !== '') {\n query(this.box).find('.tsg-sidebar-top').html(this['topHTML'] + flatHTML)\n query(this.box).find('.tsg-sidebar-body')\n // any: query().get(0) returns Node|Node[]; sidebar-top element is always HTMLElement\n .css('top', (query(this.box).find('.tsg-sidebar-top').get(0) as HTMLElement | undefined)?.clientHeight + 'px')\n query(this.box).find('.tsg-flat')\n .off('click')\n .on('click', _event => { this.goFlat() })\n }\n if (this['bottomHTML'] !== '') {\n query(this.box).find('.tsg-sidebar-bottom').html(this['bottomHTML'])\n query(this.box).find('.tsg-sidebar-body')\n // any: query().get(0) returns Node|Node[]; sidebar-bottom element is always HTMLElement\n .css('bottom', (query(this.box).find('.tsg-sidebar-bottom').get(0) as HTMLElement | undefined)?.clientHeight + 'px')\n }\n\n // observe div resize\n this.last.observeResize = new ResizeObserver(() => { this.resize() })\n this.last.observeResize.observe(this.box)\n // event after\n edata.finish()\n // ---\n this.refresh()\n return Date.now() - time\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n update(id: any, options: TsSidebarUpdateOptions = {}) { // any: node id is string|number at runtime\n // quick function to refresh just this item (not sub nodes)\n // - icon, class, style, text, count\n const nd = this.get(id)\n let level\n if (nd) {\n const $el = query(this.box).find('#node_'+ TsUtils.escapeId(nd.id))\n if (nd.group) {\n if (options.text) {\n nd.text = options.text\n $el.find('.tsg-group-text').replace(typeof nd.text == 'function'\n ? nd.text.call(this, nd)\n : '<span class=\"tsg-group-text\">'+ nd.text +'</span>')\n delete options.text\n }\n if (options.class) {\n nd.class = options.class\n level = $el.data('level')\n // any: query().get(0) returns Node|Node[]; sidebar node element is always HTMLElement\n ;($el.get(0) as HTMLElement).className = 'tsg-node-group tsg-level-'+ level +(nd.class ? ' ' + nd.class : '')\n delete options.class\n }\n if (options.style) {\n nd.style = options.style\n // any: query().get(0) returns Node|Node[]; sidebar node element is always HTMLElement\n const nextEl = ($el.get(0) as HTMLElement).nextElementSibling as HTMLElement | null\n if (nextEl) nextEl.setAttribute('style', nd.style +';'+ (!nd.hidden && nd.expanded ? '' : 'display: none;'))\n delete options.style\n }\n } else {\n if (options.icon) {\n const $icon = $el.find('.tsg-node-image > span')\n if ($icon.length > 0) {\n nd.icon = options.icon\n // any: query()[0] returns Node; sidebar icon span is always HTMLElement\n ;($icon[0] as HTMLElement).className = (typeof nd.icon == 'function' ? nd.icon.call(this, nd) : nd.icon)\n delete options.icon\n }\n }\n if (options.count != null) {\n nd.count = options.count\n // update counts\n let txt = nd.count ?? this['badge']?.text\n const style = this['badge']?.style\n const last = this.last.badge[nd.id]\n if (typeof txt == 'function') txt = txt.call(this, nd, level)\n // any: .html(val) returns Query|string; cast to Query for chaining .attr()\n ;($el.find('.tsg-node-badge')\n .html(txt) as unknown as Query)\n .attr('style', `${style}; ${last?.style ?? ''}`)\n if ($el.find('.tsg-node-badge').length > 0) delete options.count\n }\n if (options.class && $el.length > 0) {\n nd.class = options.class\n level = $el.data('level')\n // any: query()[0] returns Node; sidebar node element is always HTMLElement\n ;($el[0] as HTMLElement).className = 'tsg-node tsg-level-'+ level + (nd.selected ? ' tsg-selected' : '') + (nd.disabled ? ' tsg-disabled' : '') + (nd.class ? ' ' + nd.class : '')\n delete options.class\n }\n if (options.text != null) {\n nd.text = options.text\n $el.find('.tsg-node-text').html(typeof nd.text == 'function' ? nd.text.call(this, nd) : nd.text)\n delete options.text\n }\n if (options.style && $el.length > 0) {\n const $txt = $el.find('.tsg-node-text')\n nd.style = options.style\n // any: query()[0] returns Node; sidebar node text element is always HTMLElement\n ;($txt[0] as HTMLElement).setAttribute('style', nd.style)\n delete options.style\n }\n }\n }\n // return what was not set\n return options\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n refresh(id?: any, options: TsSidebarRefreshOptions = {}) { // any: node id is string|number at runtime\n if (this.box == null) return\n // any: query().get(0) returns Node|Node[]; sidebar body is always HTMLElement\n const body = query(this.box).find(':scope > div > .tsg-sidebar-body').get(0) as HTMLElement | undefined\n const { scrollTop, scrollLeft } = body ?? {}\n const time = Date.now()\n // event before\n const edata = this.trigger('refresh', {\n target: (id != null ? id : this.name),\n nodeId: (id != null ? id : null),\n fullRefresh: (id != null ? false : true)\n })\n if (edata.isCancelled === true) return\n if (this.flatButton == true) {\n query(this.box).find('.tsg-sidebar-top .tsg-flat').show()\n .removeClass('tsg-flat-left tsg-flat-right')\n .addClass(` tsg-flat-${(this.flat ? 'right' : 'left')}`)\n\n } else {\n query(this.box).find('.tsg-sidebar-top .tsg-flat').hide()\n }\n // default action\n // any: query().get(0) returns Node|Node[]; box is always HTMLElement at this point\n const boxEl2 = query(this.box).get(0) as HTMLElement | undefined\n query(this.box).find(':scope > div').removeClass('tsg-sidebar-flat').addClass(this.flat ? 'tsg-sidebar-flat' : '').css({\n width : (boxEl2?.clientWidth ?? 0) + 'px',\n height: (boxEl2?.clientHeight ?? 0) + 'px'\n })\n // if no parent - reset nodes\n if (this.nodes.length > 0 && this.nodes[0].parent == null) {\n const tmp = this.nodes\n this.nodes = []\n this.add(this, tmp)\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const obj = this\n let node\n let nodeSubId\n if (id == null) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n node = this\n nodeSubId = '.tsg-sidebar-body'\n } else {\n node = this.get(id)\n if (node == null) return\n nodeSubId = '#node_'+ TsUtils.escapeId(node.id) + '_sub'\n }\n const nodeId = '#node_'+ TsUtils.escapeId(node.id)\n let nodeHTML\n if (node !== this) {\n nodeHTML = getNodeHTML(node)\n query(this.box).find(nodeId).before('<div id=\"sidebar_'+ this.name + '_tmp\"></div>')\n query(this.box).find(nodeId).remove()\n query(this.box).find(nodeSubId).remove()\n query(this.box).find('#sidebar_'+ this.name + '_tmp').before(nodeHTML)\n query(this.box).find('#sidebar_'+ this.name + '_tmp').remove()\n }\n // remember scroll position\n // any: query().get(0) returns Node|Node[]; sidebar div is always HTMLElement\n const div = query(this.box).find(':scope > div').get(0) as HTMLElement | undefined\n const scroll = {\n top: div?.scrollTop,\n left: div?.scrollLeft\n }\n // refresh sub nodes\n const cnt = node == this\n ? query(this.box).find(':scope > div > .tsg-sidebar-body')\n : query(body).find(nodeSubId)\n cnt.html('')\n for (let i = 0; i < node.nodes.length; i++) {\n const subNode = node.nodes[i]\n nodeHTML = getNodeHTML(subNode)\n cnt.append(nodeHTML)\n if (subNode.nodes.length !== 0) {\n // TODO: here\n this.refresh(subNode.id, { recursive: true, })\n } else {\n // trigger event\n const edata2 = this.trigger('refresh', { target: subNode.id })\n if (edata2.isCancelled === true) return\n // event after\n edata2.finish()\n }\n }\n // reset scroll\n if (div) {\n div.scrollTop = scroll.top ?? 0\n div.scrollLeft = scroll.left ?? 0\n }\n // bind events\n if (!options.recursive) {\n const els = query(this.box).find(`${nodeId}, ${nodeId} .tsg-eaction, ${nodeSubId} .tsg-eaction`)\n TsUtils.bindEvents(els, this)\n // restore scroll position\n query(body).prop({ scrollLeft, scrollTop })\n }\n // event after\n edata.finish()\n return Date.now() - time\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function getNodeHTML(nd: any): string { // any: sidebar node objects have dynamic shape\n let html = ''\n let icon = nd.icon\n if (icon == null) icon = obj.icon\n // -- find out level\n let tmp = nd.parent\n let level = 0\n while (tmp && tmp.parent != null) {\n // if (tmp.group) level--;\n tmp = tmp.parent\n level++\n }\n if (nd.caption != null && nd.text == null) nd.text = nd.caption\n if (nd.caption != null) {\n console.log('NOTICE: sidebar node.caption property is deprecated, please use node.text. Node -> ', nd)\n nd.text = nd.caption\n }\n if (Array.isArray(nd.nodes) && nd.nodes.length > 0) nd.collapsible = true\n if (nd.group) {\n let text = TsUtils.lang(typeof nd.text == 'function' ? nd.text.call(obj, nd, level) : nd.text)\n if (String(text).substr(0, 5) != '<span') {\n text = `<span class=\"tsg-group-text\">${text}</span>`\n }\n html = `\n <div id=\"node_${nd.id}\" data-id=\"${nd.id}\" data-level=\"${level}\" style=\"${nd.hidden ? 'display: none' : ''}\"\n class=\"tsg-node-group tsg-level-${level} ${nd.class ? nd.class : ''} tsg-eaction\"\n data-click=\"toggle|${nd.id}\"\n data-contextmenu=\"contextMenu|${nd.id}|event\"\n data-mouseenter=\"showPlus|this|inherit\"\n data-mouseleave=\"showPlus|this|transparent\">\n ${nd.groupShowHide && nd.collapsible\n ? `<span>${!nd.hidden && nd.expanded ? TsUtils.lang('Hide') : TsUtils.lang('Show')}</span>`\n : '<span></span>'\n } ${text}\n </div>\n <div class=\"tsg-node-sub\" id=\"node_${nd.id}_sub\" style=\"${nd.style}; ${!nd.hidden && nd.expanded ? '' : 'display: none;'}\">\n </div>`\n if (obj.flat) {\n html = `\n <div class=\"tsg-node-group\" id=\"node_${nd.id}\" data-id=\"${nd.id}\"><span> </span></div>\n <div id=\"node_${nd.id}_sub\" style=\"${nd.style}; ${!nd.hidden && nd.expanded ? '' : 'display: none;'}\"></div>`\n }\n } else {\n if (nd.selected && !nd.disabled) {\n if (obj.multi) {\n obj.selected ??= []\n if (!obj.selected.includes(nd.id)) {\n obj.selected.push(nd.id)\n }\n } else {\n obj.selected = nd.id\n }\n }\n // icon or image\n let image = ''\n if (icon) {\n if (icon instanceof Object) {\n const text = (typeof icon.text == 'function' ? (icon.text.call(obj, nd, level) ?? '') : icon.text)\n image = `\n <div class=\"tsg-node-image tsg-eaction\" style=\"${obj.icon.style ?? ''}; pointer-events: all\"\n data-mouseEnter=\"mouseAction|Enter|this|${nd.id}|event|icon\"\n data-mouseLeave=\"mouseAction|Leave|this|${nd.id}|event|icon\"\n data-click=\"mouseAction|click|this|${nd.id}|event|icon\">\n ${text}\n </div>\n `\n } else {\n image = `\n <div class=\"tsg-node-image\">\n <span class=\"${typeof icon == 'function' ? icon.call(obj, nd, level) : icon}\"></span>\n </div>`\n }\n }\n let expand = ''\n let counts = ''\n if (obj['badge'] != null || nd.count != null) {\n let txt = nd.count ?? obj['badge']?.text\n const style = obj['badge']?.style\n const last = obj.last.badge[nd.id]\n if (typeof txt == 'function') txt = txt.call(obj, nd, level)\n if (txt || txt === 0) { // can be number 0\n counts = `\n <div class=\"tsg-node-badge tsg-eaction ${nd.count != null ? 'tsg-node-count' : ''} ${last?.className ?? ''}\"\n style=\"${style ?? ''};${last?.style ?? ''}\"\n data-mouseEnter=\"mouseAction|Enter|this|${nd.id}|event|badge\"\n data-mouseLeave=\"mouseAction|Leave|this|${nd.id}|event|badge\"\n data-click=\"mouseAction|click|this|${nd.id}|event|badge\"\n >\n ${txt}\n </div>`\n }\n }\n // array with classes\n const classes = ['tsg-node', `tsg-level-${level}`, 'tsg-eaction']\n if (nd.selected) classes.push('tsg-selected')\n if (nd.disabled) classes.push('tsg-disabled')\n if (nd.class) classes.push(nd.class)\n // collapsible\n if (nd.collapsible === true) {\n const toggleClasses = ['tsg-sb-toggle', 'tsg-eaction', (nd.expanded ? 'tsg-expanded' : 'tsg-collapsed')]\n if (obj['toggleAlign'] == 'left') toggleClasses.push('tsg-left-toggle')\n expand = `<div class=\"${toggleClasses.join(' ')}\" data-click=\"toggle|${nd.id}\"><span></span></div>`\n classes.push('tsg-has-children')\n }\n const text = TsUtils.lang(typeof nd.text == 'function' ? nd.text.call(obj, nd, level) : nd.text)\n let nodeOffset = nd.parent?.childOffset ?? 0\n if (level === 0 && nd.collapsible === true && obj['toggleAlign'] == 'left') {\n nodeOffset += 12\n }\n html = `\n <div id=\"node_${nd.id}\" class=\"${classes.join(' ')}\" data-id=\"${nd.id}\" data-level=\"${level}\"\n style=\"${nd.hidden ? 'display: none;' : ''}\"\n data-click=\"click|${nd.id}|event\"\n data-dblclick=\"dblClick|${nd.id}|event\"\n data-mouseDown=\"mouseDown|${nd.id}|event\"\n data-contextmenu=\"contextMenu|${nd.id}|event\"\n data-mouseEnter=\"mouseAction|Enter|this|${nd.id}|event\"\n data-mouseLeave=\"mouseAction|Leave|this|${nd.id}|event\"\n >\n ${obj['handle'].text\n ? `<div class=\"tsg-node-handle tsg-eaction\" style=\"width: ${obj['handle'].width}px; ${obj['handle'].style}\"\n data-mouseEnter=\"mouseAction|Enter|this|${nd.id}|event|handle\"\n data-mouseLeave=\"mouseAction|Leave|this|${nd.id}|event|handle\"\n data-click=\"mouseAction|click|this|${nd.id}|event|handle\"\n >\n ${typeof obj['handle'].text == 'function' ? obj['handle'].text.call(obj, nd, level) ?? '' : obj['handle'].text}\n </div>`\n : ''\n }\n <div class=\"tsg-node-data\" style=\"margin-left: ${(level * obj['levelPadding']) + nodeOffset + obj['handle'].width}px\">\n ${expand} ${image} ${counts}\n <div class=\"tsg-node-text ${!image ? 'no-icon' : ''}\" style=\"${nd.style || ''}\">${text}</div>\n </div>\n </div>\n <div class=\"tsg-node-sub\" id=\"node_${nd.id}_sub\" style=\"${nd.style}; ${!nd.hidden && nd.expanded ? '' : 'display: none;'}\"></div>`\n if (obj.flat) {\n html = `\n <div id=\"node_${nd.id}\" class=\"${classes.join(' ')} tsg-node-flat\" data-id=\"${nd.id}\" style=\"${nd.hidden ? 'display: none;' : ''}\"\n data-click=\"click|${nd.id}|event\"\n data-dblclick=\"dblClick|${nd.id}|event\"\n data-contextmenu=\"contextMenu|${nd.id}|event\"\n data-mouseEnter=\"mouseAction|Enter|this|${nd.id}|event|tooltip\"\n data-mouseLeave=\"mouseAction|Leave|this|${nd.id}|event|tooltip\"\n >\n <div class=\"tsg-node-data\">${image}</div>\n </div>\n <div class=\"tsg-node-sub\" id=\"node_${nd.id}_sub\" style=\"${nd.style}; ${!nd.hidden && nd.expanded ? '' : 'display: none;'}\"></div>`\n }\n }\n return html\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mouseAction(action: any, anchor: any, nodeId: any, event: any, type: any) { // any: all params are runtime-typed event handler args\n let edata\n const node = this.get(nodeId)\n if (type == null) {\n edata = this.trigger('mouse' + action, { target: node.id, node, originalEvent: event })\n }\n if (type == 'tooltip') {\n // this tooltip shows for flat sidebars\n const text = TsUtils.lang(typeof node.text == 'function' ? node.text.call(this, node) : node.text)\n let tooltip = text + (node.count != null\n ? ' - <span class=\"tsg-node-badge tsg-node-count\">'+ node.count +'</span>'\n : '')\n if (action == 'Leave' || this.selected == node.id) tooltip = ''\n this.tooltip(anchor, tooltip)\n }\n if (type == 'handle') {\n if (action == 'click') {\n const onClick = this['handle'].onClick\n if (typeof onClick == 'function') {\n onClick.call(this, node, event)\n }\n } else {\n let tooltip = this['handle'].tooltip\n if (typeof tooltip == 'function') {\n tooltip = tooltip.call(this, node, event)\n }\n if (action == 'Leave') tooltip = ''\n this.otherTooltip(anchor, tooltip)\n }\n }\n if (type == 'icon') {\n if (action == 'click') {\n const onClick = this.icon.onClick\n if (typeof onClick == 'function') {\n onClick.call(this, node, event)\n }\n } else {\n let tooltip = this.icon.tooltip\n if (typeof tooltip == 'function') {\n tooltip = tooltip.call(this, node, event)\n }\n if (action == 'Leave') tooltip = ''\n this.otherTooltip(anchor, tooltip)\n }\n }\n if (type == 'badge') {\n if (action == 'click') {\n const onClick = this['badge']?.onClick\n if (typeof onClick == 'function') {\n onClick.call(this, node, event)\n }\n } else {\n let tooltip = this['badge']?.tooltip\n if (typeof tooltip == 'function') {\n tooltip = tooltip.call(this, node, event)\n }\n if (action == 'Leave') tooltip = ''\n this.otherTooltip(anchor, tooltip)\n }\n }\n edata?.finish()\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n tooltip(el: any, text: any) { // any: el is query-wrapped element; text is string|number at runtime\n const $el = query(el).find('.tsg-node-data')\n if (text !== '') {\n TsTooltip.show({\n // any: query().get(0) returns Node|Node[]; sidebar node-data element is always HTMLElement\n anchor: $el.get(0) as HTMLElement,\n name: this.name + '_tooltip',\n html: text,\n position: 'right|left'\n })\n } else {\n TsTooltip.hide(this.name + '_tooltip')\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n otherTooltip(el: any, text: any) { // any: el is query-wrapped element; text is string|number at runtime\n if (text !== '') {\n TsTooltip.show({\n anchor: el,\n name: this.name + '_tooltip',\n html: text,\n position: 'top|bottom'\n })\n } else {\n TsTooltip.hide(this.name + '_tooltip')\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n showPlus(el: any, color: any) { // any: el is query-wrapped element; color is CSS color string\n query(el).find('span:nth-child(1)').css('color', color)\n }\n\n resize() {\n const time = Date.now()\n // event before\n const edata = this.trigger('resize', { target: this.name })\n if (edata.isCancelled === true) return\n // default action\n if (this.box != null) {\n // any: query().get(0) returns Node|Node[]; box is always a real HTMLElement here\n const boxEl = query(this.box).get(0) as HTMLElement\n const rect = boxEl.getBoundingClientRect()\n query(this.box).css('overflow', 'hidden') // container should have no overflow\n query(this.box).find(':scope > div').css({\n width : rect.width + 'px',\n height : rect.height + 'px'\n })\n }\n // event after\n edata.finish()\n return Date.now() - time\n }\n\n destroy() {\n // event before\n const edata = this.trigger('destroy', { target: this.name })\n if (edata.isCancelled === true) return\n // clean up\n if (query(this.box).find('.tsg-sidebar-body').length > 0) {\n this.unmount()\n }\n delete TsUi[this.name]\n // event after\n edata.finish()\n }\n\n override unmount() {\n super.unmount()\n this.last.observeResize?.disconnect()\n }\n\n // any: callback parameter — caller signature varies; TsSidebar node tree shape is user-defined at runtime\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n lock(msg?: any, showSpinner?: any) {\n TsUtils.lock(this.box, msg, showSpinner)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unlock(speed: any) { // any: speed is numeric ms at runtime\n TsUtils.unlock(this.box, speed)\n }\n}\nexport { TsSidebar }\n"],"mappings":"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","names":["query","id","_getItems","items","node","event","rect","edata","text"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// src/lazy-singleton.ts
|
|
2
|
+
function lazySingleton(factory, protoRef) {
|
|
3
|
+
let _impl = null;
|
|
4
|
+
const materialize = () => _impl ??= factory();
|
|
5
|
+
return new Proxy({}, {
|
|
6
|
+
get(_t, prop, receiver) {
|
|
7
|
+
return Reflect.get(materialize(), prop, receiver);
|
|
8
|
+
},
|
|
9
|
+
set(_t, prop, value, _receiver) {
|
|
10
|
+
return Reflect.set(materialize(), prop, value, materialize());
|
|
11
|
+
},
|
|
12
|
+
has(_t, prop) {
|
|
13
|
+
return Reflect.has(materialize(), prop);
|
|
14
|
+
},
|
|
15
|
+
ownKeys() {
|
|
16
|
+
return Reflect.ownKeys(materialize());
|
|
17
|
+
},
|
|
18
|
+
getOwnPropertyDescriptor(_t, prop) {
|
|
19
|
+
return Reflect.getOwnPropertyDescriptor(materialize(), prop);
|
|
20
|
+
},
|
|
21
|
+
defineProperty(_t, prop, desc) {
|
|
22
|
+
return Reflect.defineProperty(materialize(), prop, desc);
|
|
23
|
+
},
|
|
24
|
+
getPrototypeOf() {
|
|
25
|
+
return protoRef.prototype;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
lazySingleton
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=chunk-EQK6JAHT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lazy-singleton.ts"],"sourcesContent":["/**\n * Creates a lazily-initialized singleton wrapped in a transparent Proxy.\n * The factory is invoked at most once, on first property access / set / has /\n * instanceof / ownKeys / getOwnPropertyDescriptor.\n *\n * `protoRef` is the class whose `.prototype` is returned by `getPrototypeOf`.\n * It is required so `instanceof` works without triggering materialization.\n */\nexport function lazySingleton<T extends object>(\n factory: () => T,\n protoRef: { prototype: object },\n): T {\n let _impl: T | null = null\n const materialize = (): T => (_impl ??= factory())\n // `as T` cast is purely for type erasure — runtime sees an empty object as target.\n return new Proxy({} as T, {\n get(_t, prop, receiver) { return Reflect.get(materialize(), prop, receiver) },\n set(_t, prop, value, _receiver) { return Reflect.set(materialize(), prop, value, materialize()) },\n has(_t, prop) { return Reflect.has(materialize(), prop) },\n ownKeys() { return Reflect.ownKeys(materialize()) },\n getOwnPropertyDescriptor(_t, prop) { return Reflect.getOwnPropertyDescriptor(materialize(), prop) },\n defineProperty(_t, prop, desc) { return Reflect.defineProperty(materialize(), prop, desc) },\n getPrototypeOf() { return protoRef.prototype },\n })\n}\n"],"mappings":";AAQO,SAAS,cACZ,SACA,UACC;AACD,MAAI,QAAkB;AACtB,QAAM,cAAc,MAAU,UAAU,QAAQ;AAEhD,SAAO,IAAI,MAAM,CAAC,GAAQ;AAAA,IACtB,IAAI,IAAI,MAAM,UAAU;AAAE,aAAO,QAAQ,IAAI,YAAY,GAAG,MAAM,QAAQ;AAAA,IAAE;AAAA,IAC5E,IAAI,IAAI,MAAM,OAAO,WAAW;AAAE,aAAO,QAAQ,IAAI,YAAY,GAAG,MAAM,OAAO,YAAY,CAAC;AAAA,IAAE;AAAA,IAChG,IAAI,IAAI,MAAM;AAAE,aAAO,QAAQ,IAAI,YAAY,GAAG,IAAI;AAAA,IAAE;AAAA,IACxD,UAAU;AAAE,aAAO,QAAQ,QAAQ,YAAY,CAAC;AAAA,IAAE;AAAA,IAClD,yBAAyB,IAAI,MAAM;AAAE,aAAO,QAAQ,yBAAyB,YAAY,GAAG,IAAI;AAAA,IAAE;AAAA,IAClG,eAAe,IAAI,MAAM,MAAM;AAAE,aAAO,QAAQ,eAAe,YAAY,GAAG,MAAM,IAAI;AAAA,IAAE;AAAA,IAC1F,iBAAiB;AAAE,aAAO,SAAS;AAAA,IAAU;AAAA,EACjD,CAAC;AACL;","names":[]}
|