wunderbaum 0.13.0 → 0.14.1

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.
@@ -1,76 +1,76 @@
1
1
  /*!
2
2
  * Wunderbaum - debounce.ts
3
3
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
4
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
4
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
5
5
  */
6
- const freeGlobal="object"==typeof global&&null!==global&&global.Object===Object&&global,freeGlobalThis="object"==typeof globalThis&&null!==globalThis&&globalThis.Object==Object&&globalThis,freeSelf="object"==typeof self&&null!==self&&self.Object===Object&&self,root=freeGlobalThis||freeGlobal||freeSelf||Function("return this")();function isObject(e){const t=typeof e;return null!=e&&("object"===t||"function"===t)}function debounce(e,t=0,i={}){let s,n,o,r,l,a,d=0,c=!1,h=!1,u=!0;const p=!t&&0!==t&&"function"==typeof root.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function f(t){const i=s,o=n;return s=n=void 0,d=t,r=e.apply(o,i),r}function g(e,t){return p?(root.cancelAnimationFrame(l),root.requestAnimationFrame(e)):setTimeout(e,t)}function m(e){const i=e-a;return void 0===a||i>=t||i<0||h&&e-d>=o}function v(){const e=Date.now();if(m(e))return b(e);l=g(v,function(e){const i=e-d,s=t-(e-a);return h?Math.min(s,o-i):s}(e))}function b(e){return l=void 0,u&&s?f(e):(s=n=void 0,r)}function y(...e){const i=Date.now(),o=m(i);if(s=e,n=this,a=i,o){if(void 0===l)return function(e){return d=e,l=g(v,t),c?f(e):r}(a);if(h)return l=g(v,t),f(a)}return void 0===l&&(l=g(v,t)),r}return t=+t||0,isObject(i)&&(c=!!i.leading,h="maxWait"in i,o=h?Math.max(+i.maxWait||0,t):o,u="trailing"in i?!!i.trailing:u),y.cancel=function(){void 0!==l&&function(e){if(p)return root.cancelAnimationFrame(e);clearTimeout(e)}(l),d=0,s=a=n=l=void 0},y.flush=function(){return void 0===l?r:b(Date.now())},y.pending=function(){return void 0!==l},y}function throttle(e,t=0,i={}){let s=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return isObject(i)&&(s="leading"in i?!!i.leading:s,n="trailing"in i?!!i.trailing:n),debounce(e,t,{leading:s,trailing:n,maxWait:t})}
6
+ const freeGlobal="object"==typeof global&&null!==global&&global.Object===Object&&global,freeGlobalThis="object"==typeof globalThis&&null!==globalThis&&globalThis.Object==Object&&globalThis,freeSelf="object"==typeof self&&null!==self&&self.Object===Object&&self,root=freeGlobalThis||freeGlobal||freeSelf||Function("return this")();function isObject(e){const t=typeof e;return null!=e&&("object"===t||"function"===t)}function debounce(e,t=0,i={}){let s,n,r,o,l,a,d=0,c=!1,h=!1,u=!0;const p=!t&&0!==t&&"function"==typeof root.requestAnimationFrame;if("function"!=typeof e)throw new TypeError("Expected a function");function f(t){const i=s,r=n;return s=n=void 0,d=t,o=e.apply(r,i),o}function g(e,t){return p?(root.cancelAnimationFrame(l),root.requestAnimationFrame(e)):setTimeout(e,t)}function m(e){const i=e-a;return void 0===a||i>=t||i<0||h&&e-d>=r}function v(){const e=Date.now();if(m(e))return y(e);l=g(v,function(e){const i=e-d,s=t-(e-a);return h?Math.min(s,r-i):s}(e))}function y(e){return l=void 0,u&&s?f(e):(s=n=void 0,o)}function b(...e){const i=Date.now(),r=m(i);if(s=e,n=this,a=i,r){if(void 0===l)return function(e){return d=e,l=g(v,t),c?f(e):o}(a);if(h)return l=g(v,t),f(a)}return void 0===l&&(l=g(v,t)),o}return t=+t||0,isObject(i)&&(c=!!i.leading,h="maxWait"in i,r=h?Math.max(+i.maxWait||0,t):r,u="trailing"in i?!!i.trailing:u),b.cancel=function(){void 0!==l&&function(e){if(p)return root.cancelAnimationFrame(e);clearTimeout(e)}(l),d=0,s=a=n=l=void 0},b.flush=function(){return void 0===l?o:y(Date.now())},b.pending=function(){return void 0!==l},b}function throttle(e,t=0,i={}){let s=!0,n=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return isObject(i)&&(s="leading"in i?!!i.leading:s,n="trailing"in i?!!i.trailing:n),debounce(e,t,{leading:s,trailing:n,maxWait:t})}
7
7
  /*!
8
8
  * Wunderbaum - util
9
9
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
10
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
11
- */const MOUSE_BUTTONS={0:"",1:"left",2:"middle",3:"right",4:"back",5:"forward"},MAX_INT=9007199254740991,userInfo=_getUserInfo(),isMac=userInfo.isMac,REX_HTML=/[&<>"'/]/g,REX_TOOLTIP=/[<>"'/]/g,ENTITY_MAP={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};class ValidationError extends Error{constructor(e){super(e),this.name="ValidationError"}}let Deferred$1=class{constructor(){this.thens=[],this.catches=[],this.status=""}resolve(e){if(this.status)throw new Error("already settled");this.status="resolved",this.resolvedValue=e,this.thens.forEach((t=>t(e))),this.thens=[]}reject(e){if(this.status)throw new Error("already settled");this.status="rejected",this.rejectedError=e,this.catches.forEach((t=>t(e))),this.catches=[]}then(e){"resolved"===status?e(this.resolvedValue):this.thens.unshift(e)}catch(e){"rejected"===this.status?e(this.rejectedError):this.catches.unshift(e)}promise(){return{then:this.then,catch:this.catch}}};function assert(e,t){if(!e)throw t=t||"Assertion failed.",new Error(t)}function _getUserInfo(){const e=navigator;return{isMac:/Mac/.test(e.platform)}}function documentReady(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}function documentReadyPromise(){return new Promise((e=>{documentReady(e)}))}function each(e,t){if(null==e)return e;const i=e.length;let s=0;if("number"==typeof i)for(;s<i&&!1!==t.call(e[s],s,e[s]);s++);else for(const i in e)if(!1===t.call(e[s],i,e[i]))break;return e}function error(e){throw new Error(e)}function escapeHtml(e){return(""+e).replace(REX_HTML,(function(e){return ENTITY_MAP[e]}))}function escapeRegex(e){return(""+e).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function escapeTooltip(e){return(""+e).replace(REX_TOOLTIP,(function(e){return ENTITY_MAP[e]}))}function extractHtmlText(e){return e.indexOf(">")>=0&&error("Not implemented"),e}function getValueFromElem(e,t=!1){const i=e.tagName;let s=null;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,n=i.querySelector("input,select");if(n)return getValueFromElem(n,t);i.innerText=""+s}else if("INPUT"===i){const i=e;switch(i.type){case"button":case"reset":case"submit":case"image":break;case"checkbox":s=i.indeterminate?null:i.checked;break;case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":s=t?i.valueAsDate:i.value;break;case"number":case"range":s=i.valueAsNumber;break;case"radio":{const e=i.name,t=i.parentElement.querySelector(`input[name="${e}"]:checked`);s=t?t.value:void 0}break;default:s=i.value}}else if("SELECT"===i){s=e.value}return s}function setValueToElem(e,t){const i=e.tagName;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,s=i.querySelector("input,select");if(s)return setValueToElem(s,t);i.innerText=""+t}else if("INPUT"===i){const i=e,s=i.type;switch(s){case"checkbox":i.indeterminate=null===t,i.checked=!!t;break;case"date":case"month":case"time":case"week":case"datetime":case"datetime-local":i.valueAsDate=new Date(t);break;case"number":case"range":null==t?i.value=t:i.valueAsNumber=t;break;case"radio":error(`Not yet implemented: ${s}`);break;case"button":case"reset":case"submit":case"image":break;default:i.value=null!=t?t:""}}else if("SELECT"===i){const i=e;null==t?i.selectedIndex=-1:i.value=t}}function setElemDisplay(e,t){const i=elemFromSelector(e).style;t?"none"===i.display&&(i.display=""):""===i.display&&(i.display="none")}function elemFromHtml(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}const _IGNORE_KEYS=new Set(["Alt","Control","Meta","Shift"]);function elemFromSelector(e){return e?"string"==typeof e?document.querySelector(e):e:null}function eventToString(e){const t=e.key,i=e.type,s=[];return e.altKey&&s.push("Alt"),e.ctrlKey&&s.push("Control"),e.metaKey&&s.push("Meta"),e.shiftKey&&s.push("Shift"),"click"===i||"dblclick"===i?s.push(MOUSE_BUTTONS[e.button]+i):"wheel"===i?s.push(i):_IGNORE_KEYS.has(t)||s.push(t),s.join("+")}function extend(...e){for(let t=1;t<e.length;t++){const i=e[t];if(null!=i)for(const t in i)Object.prototype.hasOwnProperty.call(i,t)&&(e[0][t]=i[t])}return e[0]}function isArray(e){return Array.isArray(e)}function isEmptyObject(e){return 0===Object.keys(e).length&&e.constructor===Object}function isFunction(e){return"function"==typeof e}function isPlainObject(e){return"[object Object]"===Object.prototype.toString.call(e)}function noop(...e){}function onEvent(e,t,i,s){let n,o;e=elemFromSelector(e),s?(n=i,o=s):(n="",o=i),t.split(" ").forEach((t=>{e.addEventListener(t,(function(e){if(!n)return o(e);if(e.target){let t=e.target;if(t.matches(n))return o(e);if(t=t.closest(n),t)return o(e)}}))}))}function overrideMethod(e,t,i,s){let n,o;const r=s||e,l=e[t],a=(...e)=>l.apply(r,e),d=e=>l.apply(r,e);e[t]=(...e)=>{try{return n=r._super,o=r._superApply,r._super=a,r._superApply=d,i.apply(r,e)}finally{r._super=n,r._superApply=o}}}function setTimeoutPromise(e,t){return new Promise(((i,s)=>{setTimeout((()=>{try{i(e.apply(this))}catch(e){s(e)}}),t)}))}async function sleep(e){return new Promise((t=>setTimeout(t,e)))}function toggleCheckbox(e,t,i){const s=elemFromSelector(e);if(assert("checkbox"===s.type,`Expected a checkbox: ${s.type}`),null!=i||(i=s.classList.contains("wb-tristate")||s.indeterminate),void 0===t){switch(s.indeterminate?null:s.checked){case!0:t=!1;break;case!1:t=!i||null;break;case null:t=!0}}s.indeterminate=null==t,s.checked=!!t}function getOption(e,t,i=void 0){let s;e&&t.indexOf(".")>=0&&([s,t]=t.split("."),e=e[s]);const n=e?e[t]:null;return null!=n?n:i}function rotate(e,t){const i=t.indexOf(e);return t[(i+1)%t.length]}function toSet(e){if(e instanceof Set)return e;if("string"==typeof e){const t=new Set;for(const i of e.split(" "))t.add(i.trim());return t}if(Array.isArray(e))return new Set(e);throw new Error("Cannot convert to Set<string>: "+e)}function toPixel(...e){for(const t of e){if("number"==typeof t)return t;if("string"==typeof t&&t.endsWith("px"))return parseInt(t,10);assert(null==t,`Expected a number or string like '123px': ${t}`)}throw new Error(`Expected a string like '123px': ${e}`)}function toBool(...e){for(const t of e)if(null!=t)return!!t;throw new Error("No default boolean value provided")}function intToBool(e){return"number"==typeof e?!!e:e}function type(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()}function adaptiveThrottle(e,t){const i=Object.assign({minDelay:16,defaultDelay:200,maxDelay:5e3,delayFactor:2},t),s=Math.max(16,+i.minDelay),n=+i.maxDelay;let o=0,r=null,l=null;const a=(...t)=>{if(o)r=t,o+=1;else{o=1;const d=t;r=null;const c=Date.now();try{e.apply(this,d)}catch(e){console.error(e)}const h=Date.now()-c,u=Math.min(Math.max(s,h*i.delayFactor),n),p=Math.max(s,u-h);l=setTimeout((()=>{l=null,o=0,null!=r&&a.apply(this,r)}),p)}};return a.cancel=()=>{l&&(clearTimeout(l),l=null),r=null,o=0},a.pending=()=>!!l,a.flush=()=>{throw new Error("Not implemented")},a}var ChangeType,RenderFlag,NodeStatusType,NodeRegion,NavModeEnum,util=Object.freeze({__proto__:null,Deferred:Deferred$1,MAX_INT:MAX_INT,MOUSE_BUTTONS:MOUSE_BUTTONS,ValidationError:ValidationError,adaptiveThrottle:adaptiveThrottle,assert:assert,debounce:debounce,documentReady:documentReady,documentReadyPromise:documentReadyPromise,each:each,elemFromHtml:elemFromHtml,elemFromSelector:elemFromSelector,error:error,escapeHtml:escapeHtml,escapeRegex:escapeRegex,escapeTooltip:escapeTooltip,eventToString:eventToString,extend:extend,extractHtmlText:extractHtmlText,getOption:getOption,getValueFromElem:getValueFromElem,intToBool:intToBool,isArray:isArray,isEmptyObject:isEmptyObject,isFunction:isFunction,isMac:isMac,isPlainObject:isPlainObject,noop:noop,onEvent:onEvent,overrideMethod:overrideMethod,rotate:rotate,setElemDisplay:setElemDisplay,setTimeoutPromise:setTimeoutPromise,setValueToElem:setValueToElem,sleep:sleep,throttle:throttle,toBool:toBool,toPixel:toPixel,toSet:toSet,toggleCheckbox:toggleCheckbox,type:type});
10
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
11
+ */const MOUSE_BUTTONS={0:"",1:"left",2:"middle",3:"right",4:"back",5:"forward"},MAX_INT=9007199254740991,userInfo=_getUserInfo(),isMac=userInfo.isMac,REX_HTML=/[&<>"'/]/g,REX_TOOLTIP=/[<>"'/]/g,ENTITY_MAP={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};class ValidationError extends Error{constructor(e){super(e),this.name="ValidationError"}}let Deferred$1=class{constructor(){this.thens=[],this.catches=[],this.status=""}resolve(e){if(this.status)throw new Error("already settled");this.status="resolved",this.resolvedValue=e,this.thens.forEach(t=>t(e)),this.thens=[]}reject(e){if(this.status)throw new Error("already settled");this.status="rejected",this.rejectedError=e,this.catches.forEach(t=>t(e)),this.catches=[]}then(e){"resolved"===status?e(this.resolvedValue):this.thens.unshift(e)}catch(e){"rejected"===this.status?e(this.rejectedError):this.catches.unshift(e)}promise(){return{then:this.then,catch:this.catch}}};function assert(e,t){if(!e)throw t=t||"Assertion failed.",new Error(t)}function _getUserInfo(){const e=navigator;return{isMac:/Mac/.test(e.platform)}}function documentReady(e){"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):e()}function documentReadyPromise(){return new Promise(e=>{documentReady(e)})}function each(e,t){if(null==e)return e;const i=e.length;let s=0;if("number"==typeof i)for(;s<i&&!1!==t.call(e[s],s,e[s]);s++);else for(const i in e)if(!1===t.call(e[s],i,e[i]))break;return e}function error(e){throw new Error(e)}function escapeHtml(e){return(""+e).replace(REX_HTML,function(e){return ENTITY_MAP[e]})}function escapeRegex(e){return(""+e).replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}function escapeTooltip(e){return(""+e).replace(REX_TOOLTIP,function(e){return ENTITY_MAP[e]})}function extractHtmlText(e){return e.indexOf(">")>=0&&error("Not implemented"),e}function getValueFromElem(e,t=!1){const i=e.tagName;let s=null;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,n=i.querySelector("input,select");if(n)return getValueFromElem(n,t);i.innerText=""+s}else if("INPUT"===i){const i=e;switch(i.type){case"button":case"reset":case"submit":case"image":break;case"checkbox":s=i.indeterminate?null:i.checked;break;case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":s=t?i.valueAsDate:i.value;break;case"number":case"range":s=i.valueAsNumber;break;case"radio":{const e=i.name,t=i.parentElement.querySelector(`input[name="${e}"]:checked`);s=t?t.value:void 0}break;default:s=i.value}}else if("SELECT"===i){s=e.value}return s}function setValueToElem(e,t){const i=e.tagName;if("SPAN"===i&&e.classList.contains("wb-col")){const i=e,s=i.querySelector("input,select");if(s)return setValueToElem(s,t);i.innerText=""+t}else if("INPUT"===i){const i=e,s=i.type;switch(s){case"checkbox":i.indeterminate=null===t,i.checked=!!t;break;case"date":case"month":case"time":case"week":case"datetime":case"datetime-local":i.valueAsDate=new Date(t);break;case"number":case"range":null==t?i.value=t:i.valueAsNumber=t;break;case"radio":error(`Not yet implemented: ${s}`);break;case"button":case"reset":case"submit":case"image":break;default:i.value=null!=t?t:""}}else if("SELECT"===i){const i=e;null==t?i.selectedIndex=-1:i.value=t}}function setElemDisplay(e,t){const i=elemFromSelector(e).style;t?"none"===i.display&&(i.display=""):""===i.display&&(i.display="none")}function elemFromHtml(e){const t=document.createElement("template");return t.innerHTML=e.trim(),t.content.firstElementChild}const _IGNORE_KEYS=new Set(["Alt","Control","Meta","Shift"]);function elemFromSelector(e){return e?"string"==typeof e?document.querySelector(e):e:null}function eventToString(e){const t=e.key,i=e.type,s=[];return e.altKey&&s.push("Alt"),e.ctrlKey&&s.push("Control"),e.metaKey&&s.push("Meta"),e.shiftKey&&s.push("Shift"),"click"===i||"dblclick"===i?s.push(MOUSE_BUTTONS[e.button]+i):"wheel"===i?s.push(i):_IGNORE_KEYS.has(t)||s.push(t),s.join("+")}function extend(...e){for(let t=1;t<e.length;t++){const i=e[t];if(null!=i)for(const t in i)Object.prototype.hasOwnProperty.call(i,t)&&(e[0][t]=i[t])}return e[0]}function isArray(e){return Array.isArray(e)}function isEmptyObject(e){return 0===Object.keys(e).length&&e.constructor===Object}function isFunction(e){return"function"==typeof e}function isPlainObject(e){return"[object Object]"===Object.prototype.toString.call(e)}function noop(...e){}function onEvent(e,t,i,s){let n,r;e=elemFromSelector(e),s?(n=i,r=s):(n="",r=i),t.split(" ").forEach(t=>{e.addEventListener(t,function(e){if(!n)return r(e);if(e.target){let t=e.target;if(t.matches(n))return r(e);if(t=t.closest(n),t)return r(e)}})})}function overrideMethod(e,t,i,s){let n,r;const o=s||e,l=e[t],a=(...e)=>l.apply(o,e),d=e=>l.apply(o,e);e[t]=(...e)=>{try{return n=o._super,r=o._superApply,o._super=a,o._superApply=d,i.apply(o,e)}finally{o._super=n,o._superApply=r}}}function setTimeoutPromise(e,t){return new Promise((i,s)=>{setTimeout(()=>{try{i(e.apply(this))}catch(e){s(e)}},t)})}async function sleep(e){return new Promise(t=>setTimeout(t,e))}function toggleCheckbox(e,t,i){const s=elemFromSelector(e);if(assert("checkbox"===s.type,`Expected a checkbox: ${s.type}`),null!=i||(i=s.classList.contains("wb-tristate")||s.indeterminate),void 0===t){switch(s.indeterminate?null:s.checked){case!0:t=!1;break;case!1:t=!i||null;break;case null:t=!0}}s.indeterminate=null==t,s.checked=!!t}function getOption(e,t,i=void 0){let s;e&&t.indexOf(".")>=0&&([s,t]=t.split("."),e=e[s]);const n=e?e[t]:null;return null!=n?n:i}function rotate(e,t){const i=t.indexOf(e);return t[(i+1)%t.length]}function toSet(e){if(e instanceof Set)return e;if("string"==typeof e){const t=new Set;for(const i of e.split(" "))t.add(i.trim());return t}if(Array.isArray(e))return new Set(e);throw new Error("Cannot convert to Set<string>: "+e)}function toPixel(...e){for(const t of e){if("number"==typeof t)return t;if("string"==typeof t&&t.endsWith("px"))return parseInt(t,10);assert(null==t,`Expected a number or string like '123px': ${t}`)}throw new Error(`Expected a string like '123px': ${e}`)}function unsafeCast(e){return e}function toBool(...e){for(const t of e)if(null!=t)return!!t;throw new Error("No default boolean value provided")}function intToBool(e){return"number"==typeof e?!!e:e}function type(e){return Object.prototype.toString.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase()}function adaptiveThrottle(e,t){const i=Object.assign({minDelay:16,defaultDelay:200,maxDelay:5e3,delayFactor:2},t),s=Math.max(16,+i.minDelay),n=+i.maxDelay;let r=0,o=null,l=null;const a=(...t)=>{if(r)o=t,r+=1;else{r=1;const d=t;o=null;const c=Date.now();try{e.apply(this,d)}catch(e){console.error(e)}const h=Date.now()-c,u=Math.min(Math.max(s,h*i.delayFactor),n),p=Math.max(s,u-h);l=setTimeout(()=>{l=null,r=0,null!=o&&a.apply(this,o)},p)}};return a.cancel=()=>{l&&(clearTimeout(l),l=null),o=null,r=0},a.pending=()=>!!l,a.flush=()=>{throw new Error("Not implemented")},a}function murmurHash3(e,t=!0,i=0){let s=i;const n=3&e.length,r=e.length-n,o=3432918353,l=461845907;let a=0;for(;a<r;){let t=255&e.charCodeAt(a)|(255&e.charCodeAt(++a))<<8|(255&e.charCodeAt(++a))<<16|(255&e.charCodeAt(++a))<<24;++a,t=Math.imul(t,o),t=t<<15|t>>>17,t=Math.imul(t,l),s^=t,s=s<<13|s>>>19,s=Math.imul(s,5)+3864292196}let d=0;switch(n){case 3:d^=(255&e.charCodeAt(a+2))<<16;case 2:d^=(255&e.charCodeAt(a+1))<<8;case 1:d^=255&e.charCodeAt(a),d=Math.imul(d,o),d=d<<15|d>>>17,d=Math.imul(d,l),s^=d}return s^=e.length,s^=s>>>16,s=Math.imul(s,2246822507),s^=s>>>13,s=Math.imul(s,3266489909),s^=s>>>16,t?(s>>>0).toString(16).padStart(8,"0"):s>>>0}var ChangeType,RenderFlag,NodeStatusType,NodeRegion,NavModeEnum,util=Object.freeze({__proto__:null,Deferred:Deferred$1,MAX_INT:MAX_INT,MOUSE_BUTTONS:MOUSE_BUTTONS,ValidationError:ValidationError,adaptiveThrottle:adaptiveThrottle,assert:assert,debounce:debounce,documentReady:documentReady,documentReadyPromise:documentReadyPromise,each:each,elemFromHtml:elemFromHtml,elemFromSelector:elemFromSelector,error:error,escapeHtml:escapeHtml,escapeRegex:escapeRegex,escapeTooltip:escapeTooltip,eventToString:eventToString,extend:extend,extractHtmlText:extractHtmlText,getOption:getOption,getValueFromElem:getValueFromElem,intToBool:intToBool,isArray:isArray,isEmptyObject:isEmptyObject,isFunction:isFunction,isMac:isMac,isPlainObject:isPlainObject,murmurHash3:murmurHash3,noop:noop,onEvent:onEvent,overrideMethod:overrideMethod,rotate:rotate,setElemDisplay:setElemDisplay,setTimeoutPromise:setTimeoutPromise,setValueToElem:setValueToElem,sleep:sleep,throttle:throttle,toBool:toBool,toPixel:toPixel,toSet:toSet,toggleCheckbox:toggleCheckbox,type:type,unsafeCast:unsafeCast});
12
12
  /*!
13
13
  * Wunderbaum - types
14
14
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
15
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
15
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
16
16
  */!function(e){e.any="any",e.data="data",e.colStructure="colStructure",e.resize="resize",e.row="row",e.structure="structure",e.status="status",e.scroll="scroll"}(ChangeType||(ChangeType={})),function(e){e.clearMarkup="clearMarkup",e.header="header",e.redraw="redraw",e.scroll="scroll"}(RenderFlag||(RenderFlag={})),function(e){e.ok="ok",e.loading="loading",e.error="error",e.noData="noData",e.paging="paging"}(NodeStatusType||(NodeStatusType={})),function(e){e.unknown="",e.checkbox="checkbox",e.column="column",e.expander="expander",e.icon="icon",e.prefix="prefix",e.title="title"}(NodeRegion||(NodeRegion={})),function(e){e.startRow="startRow",e.cell="cell",e.startCell="startCell",e.row="row"}(NavModeEnum||(NavModeEnum={}));
17
17
  /*!
18
18
  * Wunderbaum - wb_extension_base
19
19
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
20
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
20
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
21
21
  */
22
22
  class WunderbaumExtension{constructor(e,t,i){this.enabled=!0,this.tree=e,this.id=t,this.treeOpts=e.options;const s=e.options;void 0===this.treeOpts[t]?s[t]=this.extensionOpts=extend({},i):(this.extensionOpts=extend({},i,s[t]),s[t]=this.extensionOpts),this.enabled=this.getPluginOption("enabled",!0)}init(){this.tree.element.classList.add("wb-ext-"+this.id)}getPluginOption(e,t){var i;return null!==(i=this.extensionOpts[e])&&void 0!==i?i:t}setPluginOption(e,t){this.extensionOpts[e]=t}setEnabled(e=!0){return this.setPluginOption("enabled",!!e)}onKeyEvent(e){}onRender(e){}}
23
23
  /*!
24
24
  * Wunderbaum - ext-filter
25
25
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
26
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
27
- */const START_MARKER="￷",END_MARKER="￸",RE_START_MARKER=new RegExp(escapeRegex("￷"),"g"),RE_END_MARTKER=new RegExp(escapeRegex("￸"),"g");class FilterExtension extends WunderbaumExtension{constructor(e){super(e,"filter",{autoApply:!0,autoExpand:!1,matchBranch:!1,connect:null,fuzzy:!1,hideExpanders:!1,highlight:!0,leavesOnly:!1,mode:"dim",noData:!0}),this.queryInput=null,this.prevButton=null,this.nextButton=null,this.modeButton=null,this.matchInfoElem=null,this.lastFilterArgs=null}init(){super.init();this.getPluginOption("connect")&&this._connectControls()}setPluginOption(e,t){if(super.setPluginOption(e,t),"mode"===e)this.tree.filterMode="hide"===t?"hide":"mark"===t?"mark":"dim",this.tree.updateFilter()}_updatedConnectedControls(){var e;const t=null!==this.tree.filterMode,i=this.tree.getActiveNode(),s=t?this.countMatches():0,n=this.treeOpts.strings;let o="?";if(this.matchInfoElem)if(t){let t;0===s?t=n.noMatch:i&&i.match>=1?(o=null!==(e=i.match)&&void 0!==e?e:"?",t=n.matchIndex):t=n.queryResult,t=t.replace("${count}",this.tree.count().toLocaleString()).replace("${match}",""+o).replace("${matches}",s.toLocaleString()),this.matchInfoElem.textContent=t}else this.matchInfoElem.textContent="";this.nextButton instanceof HTMLButtonElement&&(this.nextButton.disabled=!s),this.prevButton instanceof HTMLButtonElement&&(this.prevButton.disabled=!s),this.modeButton&&(this.modeButton.disabled=!t,this.modeButton.classList.toggle("wb-filter-hide","hide"===this.tree.filterMode))}_connectControls(){const e=this.tree,t=this.getPluginOption("connect");if(t){if(this.queryInput=elemFromSelector(t.inputElem),!this.queryInput)throw new Error(`Invalid 'filter.connect' option: ${t.inputElem}.`);this.prevButton=elemFromSelector(t.prevButton),this.nextButton=elemFromSelector(t.nextButton),this.modeButton=elemFromSelector(t.modeButton),this.matchInfoElem=elemFromSelector(t.matchInfoElem),this.prevButton&&onEvent(this.prevButton,"click",(()=>{e.findRelatedNode(e.getActiveNode()||e.getFirstChild(),"prevMatch"),this._updatedConnectedControls()})),this.nextButton&&onEvent(this.nextButton,"click",(()=>{e.findRelatedNode(e.getActiveNode()||e.getFirstChild(),"nextMatch"),this._updatedConnectedControls()})),this.modeButton&&onEvent(this.modeButton,"click",(t=>{this.tree.filterMode&&this.setPluginOption("mode","dim"===e.filterMode?"hide":"dim")})),onEvent(this.queryInput,"input",debounce((e=>{this.filterNodes(this.queryInput.value.trim(),{})}),700)),this._updatedConnectedControls()}}_applyFilterNoUpdate(e,t){return this.tree.runWithDeferredUpdate((()=>this._applyFilterImpl(e,t)))}_applyFilterImpl(e,t){var i;let s=0;const n=Date.now(),o=this.tree,r=o.options,l=r.autoCollapse,a=extend({},r.filter,t),d="hide"===a.mode,c=!!a.matchBranch,h=!!a.leavesOnly&&!c;let u,p;if("string"==typeof e||e instanceof RegExp){if(""===e)return o.logInfo("Passing an empty string as a filter is handled as clearFilter()."),this.clearFilter(),0;if(a.fuzzy){assert("string"==typeof e,"fuzzy filter must be a string");const t=e.split("").map(escapeRegex).reduce((function(e,t){return e+"([^"+t+"]*)"+t}),"");u=new RegExp(t,"i")}else if(e instanceof RegExp)u=e,p=e;else{const t=escapeRegex(e);u=new RegExp(t,"i"),p=new RegExp(t,"gi")}o.logDebug(`Filtering nodes by '${u}'`),e=e=>{if(!e.title)return!1;const t=e.title,i=u.exec(t);if(i&&a.highlight){let s;s=a.fuzzy?_markFuzzyMatchedChars(t,i,!0):t.replace(p,(function(e){return"￷"+e+"￸"})),e.titleWithHighlight=escapeHtml(s).replace(RE_START_MARKER,"<mark>").replace(RE_END_MARTKER,"</mark>")}return!!i}}return o.filterMode=null!==(i=a.mode)&&void 0!==i?i:"dim",this.lastFilterArgs=arguments,o.element.classList.toggle("wb-ext-filter-hide",!!d),o.element.classList.toggle("wb-ext-filter-dim","dim"===a.mode),o.element.classList.toggle("wb-ext-filter-hide-expanders",!!a.hideExpanders),o.root.subMatchCount=0,o.visit((e=>{delete e.match,delete e.titleWithHighlight,e.subMatchCount=0})),o.setStatus(NodeStatusType.ok),r.autoCollapse=!1,o.visit((t=>{if(h&&null!=t.children)return;let i=e(t);if("skip"===i)return t.visit((function(e){e.match=void 0}),!0),"skip";let n=!1;(c||"branch"===i)&&t.parent.match&&(i=!0,n=!0),i&&(s++,t.match=s,t.visitParents((e=>{e!==t&&(e.subMatchCount+=1),!a.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0}),e._filterAutoExpanded=!0)}),!0))})),r.autoCollapse=l,0===s&&a.noData&&d&&("string"==typeof a.noData?o.root.setStatus(NodeStatusType.noData,{message:a.noData}):o.root.setStatus(NodeStatusType.noData)),o.logDebug(`Filter '${e}' found ${s} nodes in ${Date.now()-n} ms.`),this._updatedConnectedControls(),s}filterNodes(e,t){return this._applyFilterNoUpdate(e,t)}filterBranches(e,t){return assert(void 0===t.matchBranch,"filterBranches() is deprecated."),t.matchBranch=!0,this._applyFilterNoUpdate(e,t)}countMatches(){let e=0;return this.tree.visit((t=>{t.match&&!t.statusNodeType&&e++})),e}updateFilter(){var e;const t=this.tree;t.filterMode&&this.lastFilterArgs&&(null===(e=t.options.filter)||void 0===e?void 0:e.autoApply)?this._applyFilterNoUpdate.apply(this,this.lastFilterArgs):t.logWarn("updateFilter(): no filter active."),this._updatedConnectedControls()}clearFilter(){const e=this.tree;e.enableUpdate(!1),e.setStatus(NodeStatusType.ok),delete e.root.match,delete e.root.subMatchCount,e.visit((e=>{delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0}),delete e._filterAutoExpanded})),e.filterMode=null,this.lastFilterArgs=null,e.element.classList.remove("wb-ext-filter-dim","wb-ext-filter-hide"),this._updatedConnectedControls(),e.enableUpdate(!0)}}function _markFuzzyMatchedChars(e,t,i=!0){const s=[];for(let e=1;e<t.length;e++){const i=t[e].length+(1===e?0:1)+(s[s.length-1]||0);s.push(i)}const n=e.split("");return i?s.forEach((function(e){n[e]="￷"+n[e]+"￸"})):s.forEach((function(e){n[e]="<mark>"+n[e]+"</mark>"})),n.join("")}
26
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
27
+ */const START_MARKER="￷",END_MARKER="￸",RE_START_MARKER=new RegExp(escapeRegex("￷"),"g"),RE_END_MARTKER=new RegExp(escapeRegex("￸"),"g");class FilterExtension extends WunderbaumExtension{constructor(e){super(e,"filter",{autoApply:!0,autoExpand:!1,matchBranch:!1,connect:null,fuzzy:!1,hideExpanders:!1,highlight:!0,leavesOnly:!1,mode:"dim",noData:!0}),this.queryInput=null,this.prevButton=null,this.nextButton=null,this.modeButton=null,this.matchInfoElem=null,this.lastFilterArgs=null}init(){super.init();this.getPluginOption("connect")&&this._connectControls()}setPluginOption(e,t){if(super.setPluginOption(e,t),"mode"===e)this.tree.filterMode="hide"===t?"hide":"mark"===t?"mark":"dim",this.tree.updateFilter()}_updatedConnectedControls(){var e;const t=null!==this.tree.filterMode,i=this.tree.getActiveNode(),s=t?this.countMatches():0,n=this.treeOpts.strings;let r="?";if(this.matchInfoElem)if(t){let t;0===s?t=n.noMatch:i&&i.match>=1?(r=null!==(e=i.match)&&void 0!==e?e:"?",t=n.matchIndex):t=n.queryResult,t=t.replace("${count}",this.tree.count().toLocaleString()).replace("${match}",""+r).replace("${matches}",s.toLocaleString()),this.matchInfoElem.textContent=t}else this.matchInfoElem.textContent="";this.nextButton instanceof HTMLButtonElement&&(this.nextButton.disabled=!s),this.prevButton instanceof HTMLButtonElement&&(this.prevButton.disabled=!s),this.modeButton&&(this.modeButton.disabled=!t,this.modeButton.classList.toggle("wb-filter-hide","hide"===this.tree.filterMode))}_connectControls(){const e=this.tree,t=this.getPluginOption("connect");if(t){if(this.queryInput=elemFromSelector(t.inputElem),!this.queryInput)throw new Error(`Invalid 'filter.connect' option: ${t.inputElem}.`);this.prevButton=elemFromSelector(t.prevButton),this.nextButton=elemFromSelector(t.nextButton),this.modeButton=elemFromSelector(t.modeButton),this.matchInfoElem=elemFromSelector(t.matchInfoElem),this.prevButton&&onEvent(this.prevButton,"click",()=>{e.findRelatedNode(e.getActiveNode()||e.getFirstChild(),"prevMatch"),this._updatedConnectedControls()}),this.nextButton&&onEvent(this.nextButton,"click",()=>{e.findRelatedNode(e.getActiveNode()||e.getFirstChild(),"nextMatch"),this._updatedConnectedControls()}),this.modeButton&&onEvent(this.modeButton,"click",t=>{this.tree.filterMode&&this.setPluginOption("mode","dim"===e.filterMode?"hide":"dim")}),onEvent(this.queryInput,"input",debounce(e=>{this.filterNodes(this.queryInput.value.trim(),{})},700)),this._updatedConnectedControls()}}_applyFilterNoUpdate(e,t){return this.tree.runWithDeferredUpdate(()=>this._applyFilterImpl(e,t))}_applyFilterImpl(e,t){var i;let s=0;const n=Date.now(),r=this.tree,o=r.options,l=o.autoCollapse,a=extend({},o.filter,t),d="hide"===a.mode,c=!!a.matchBranch,h=!!a.leavesOnly&&!c;let u,p;if("string"==typeof e||e instanceof RegExp){if(""===e)return r.logInfo("Passing an empty string as a filter is handled as clearFilter()."),this.clearFilter(),0;if(a.fuzzy){assert("string"==typeof e,"fuzzy filter must be a string");const t=e.split("").map(escapeRegex).reduce(function(e,t){return e+"([^"+t+"]*)"+t},"");u=new RegExp(t,"i")}else if(e instanceof RegExp)u=e,p=e;else{const t=escapeRegex(e);u=new RegExp(t,"i"),p=new RegExp(t,"gi")}r.logDebug(`Filtering nodes by '${u}'`),e=e=>{if(!e.title)return!1;const t=e.title,i=u.exec(t);if(i&&a.highlight){let s;s=a.fuzzy?_markFuzzyMatchedChars(t,i,!0):t.replace(p,function(e){return"￷"+e+"￸"}),e.titleWithHighlight=escapeHtml(s).replace(RE_START_MARKER,"<mark>").replace(RE_END_MARTKER,"</mark>")}return!!i}}return r.filterMode=null!==(i=a.mode)&&void 0!==i?i:"dim",this.lastFilterArgs=arguments,r.element.classList.toggle("wb-ext-filter-hide",!!d),r.element.classList.toggle("wb-ext-filter-dim","dim"===a.mode),r.element.classList.toggle("wb-ext-filter-hide-expanders",!!a.hideExpanders),r.root.subMatchCount=0,r.visit(e=>{delete e.match,delete e.titleWithHighlight,e.subMatchCount=0}),r.setStatus(NodeStatusType.ok),o.autoCollapse=!1,r.visit(t=>{if(h&&null!=t.children)return;let i=e(t);if("skip"===i)return t.visit(function(e){e.match=void 0},!0),"skip";let n=!1;(c||"branch"===i)&&t.parent.match&&(i=!0,n=!0),i&&(s++,t.match=s,t.visitParents(e=>{e!==t&&(e.subMatchCount+=1),!a.autoExpand||n||e.expanded||(e.setExpanded(!0,{noAnimation:!0,noEvents:!0}),e._filterAutoExpanded=!0)},!0))}),o.autoCollapse=l,0===s&&a.noData&&d&&("string"==typeof a.noData?r.root.setStatus(NodeStatusType.noData,{message:a.noData}):r.root.setStatus(NodeStatusType.noData)),r.logDebug(`Filter '${e}' found ${s} nodes in ${Date.now()-n} ms.`),this._updatedConnectedControls(),s}filterNodes(e,t){return this._applyFilterNoUpdate(e,t)}filterBranches(e,t){return assert(void 0===t.matchBranch,"filterBranches() is deprecated."),this.tree.logDeprecate("filterBranches()",{since:"0.9.0",hint:"Use `filterNodes` instead and set `options.matchBranch: true`"}),t.matchBranch=!0,this._applyFilterNoUpdate(e,t)}countMatches(){let e=0;return this.tree.visit(t=>{t.match&&!t.statusNodeType&&e++}),e}updateFilter(){var e;const t=this.tree;t.filterMode&&this.lastFilterArgs&&(null===(e=t.options.filter)||void 0===e?void 0:e.autoApply)?this._applyFilterNoUpdate.apply(this,this.lastFilterArgs):t.logWarn("updateFilter(): no filter active."),this._updatedConnectedControls()}clearFilter(){const e=this.tree;e.enableUpdate(!1),e.setStatus(NodeStatusType.ok),delete e.root.match,delete e.root.subMatchCount,e.visit(e=>{delete e.match,delete e.subMatchCount,delete e.titleWithHighlight,e._filterAutoExpanded&&e.expanded&&e.setExpanded(!1,{noAnimation:!0,noEvents:!0}),delete e._filterAutoExpanded}),e.filterMode=null,this.lastFilterArgs=null,e.element.classList.remove("wb-ext-filter-dim","wb-ext-filter-hide"),this._updatedConnectedControls(),e.enableUpdate(!0)}}function _markFuzzyMatchedChars(e,t,i=!0){const s=[];for(let e=1;e<t.length;e++){const i=t[e].length+(1===e?0:1)+(s[s.length-1]||0);s.push(i)}const n=e.split("");return i?s.forEach(function(e){n[e]="￷"+n[e]+"￸"}):s.forEach(function(e){n[e]="<mark>"+n[e]+"</mark>"}),n.join("")}
28
28
  /*!
29
29
  * Wunderbaum - ext-keynav
30
30
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
31
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
32
- */const QUICKSEARCH_DELAY=500;class KeynavExtension extends WunderbaumExtension{constructor(e){super(e,"keynav",{})}_getEmbeddedInputElem(e){var t;let i=null;if(e&&null!=e.type)i=e;else{const e=null===(t=this.tree.getActiveColElem())||void 0===t?void 0:t.querySelector("input,select");e&&(i=e)}return i}_isCurInputFocused(){var e;return!!(null===(e=this.tree.getActiveColElem())||void 0===e?void 0:e.querySelector("input:focus,select:focus"))}onKeyEvent(e){const t=e.event,i=this.tree,s=e.options,n=!t.ctrlKey||s.autoActivate,o=this._getEmbeddedInputElem(t.target),r=o&&this._isCurInputFocused(),l=s.navigationModeOption;let a,d=eventToString(t),c=e.node,h=!0;if(!i.isEnabled())return!1;if(!1===i._callEvent("keydown",e))return!1;if(!1===i._callMethod("edit._preprocessKeyEvent",e))return!1;if(!c){const e=i.getFocusNode()||i.getActiveNode(),t=i.getFirstChild();if(!e&&t&&"ArrowDown"===d)return t.logInfo("Keydown: activate first node."),void t.setActive();a=e||t,a&&(a.setFocus(),c=i.getFocusNode(),c.logInfo("Keydown: force focus on active node."))}const u=c.isColspan();if(i.isRowNav()){if(r){switch(d){case"Enter":o.blur(),i.setFocus();break;case"Escape":c._render(),i.setFocus()}return}if(s.quicksearch&&1===d.length&&/^\w$/.test(d)&&!o){const e=Date.now();e-i.lastQuicksearchTime>500&&(i.lastQuicksearchTerm=""),i.lastQuicksearchTime=e,i.lastQuicksearchTerm+=d;const s=i.findNextNode(i.lastQuicksearchTerm,i.getActiveNode());return s&&s.setActive(!0,{event:t}),void t.preventDefault()}switch(d){case"Enter":c.isActive()&&(c.isExpanded()?d="Subtract":c.isExpandable(!0)&&(d="Add"));break;case"ArrowLeft":c.expanded&&(d="Subtract");break;case"ArrowRight":if(!c.expanded&&c.isExpandable(!0))d="Add";else if(l===NavModeEnum.startCell||l===NavModeEnum.startRow)return t.preventDefault(),i.setCellNav(),!1}switch(d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":c.getOption("checkbox")?c.toggleSelected():c.setActive(!0,{event:t});break;case"Enter":c.setActive(!0,{event:t});break;case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"Backspace":case"End":case"Home":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t});break;default:h=!1}}else{const e=o?o.type||o.tagName:"",s=o&&"checkbox"!==e;if(r){if("Escape"===d)return c.logDebug("Reset focused input on Escape"),o.setCustomValidity(""),c._render(),i.setFocus(),void i.setColumn(i.activeColIdx);if("Enter"!==d)return o&&o.checkValidity&&!o.checkValidity()?(c.logDebug(`Ignored ${d} inside invalid input`),!1):void c.logDebug(`Ignored ${d} inside focused input`)}else if(o&&1===d.length&&s)return o.focus(),o.value="",c.logDebug(`Focus input: ${d}`),!1;switch("Tab"===d?(d="ArrowRight",h=!0):"Shift+Tab"===d&&(d=i.activeColIdx>0?"ArrowLeft":"",h=!0),d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":0===i.activeColIdx&&c.getOption("checkbox")?(c.toggleSelected(),h=!0):o&&"checkbox"===e&&(o.click(),h=!0);break;case"F2":o&&!r&&s&&(o.focus(),h=!0);break;case"Enter":i.setFocus(),(0===i.activeColIdx||u)&&c.isExpandable()?(c.setExpanded(!c.isExpanded()),h=!0):o&&!r&&s&&(o.focus(),h=!0);break;case"Escape":i.setFocus(),c.log("keynav: focus tree..."),i.isCellNav()&&l!==NavModeEnum.cell&&(c.log("keynav: setCellNav(false)"),i.setCellNav(!1),i.setFocus(),h=!0);break;case"ArrowLeft":i.setFocus(),u&&c.isExpanded()?c.setExpanded(!1):!u&&i.activeColIdx>0?i.setColumn(i.activeColIdx-1):l!==NavModeEnum.cell&&i.setCellNav(!1),h=!0;break;case"ArrowRight":i.setFocus(),u&&!c.isExpanded()?c.setExpanded():!u&&i.activeColIdx<i.columns.length-1&&i.setColumn(i.activeColIdx+1),h=!0;break;case"Home":i.setFocus(),!u&&i.activeColIdx>0&&i.setColumn(0),h=!0;break;case"End":i.setFocus(),!u&&i.activeColIdx<i.columns.length-1&&i.setColumn(i.columns.length-1),h=!0;break;case"ArrowDown":case"ArrowUp":case"Backspace":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t}),h=!0;break;default:h=!1}}h&&t.preventDefault()}}
31
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
32
+ */const QUICKSEARCH_DELAY=500;class KeynavExtension extends WunderbaumExtension{constructor(e){super(e,"keynav",{})}_getEmbeddedInputElem(e){var t;let i=null;if(e&&null!=e.type)i=e;else{const e=null===(t=this.tree.getActiveColElem())||void 0===t?void 0:t.querySelector("input,select");e&&(i=e)}return i}_isCurInputFocused(){var e;return!!(null===(e=this.tree.getActiveColElem())||void 0===e?void 0:e.querySelector("input:focus,select:focus"))}onKeyEvent(e){const t=e.event,i=this.tree,s=e.options,n=!t.ctrlKey||s.autoActivate,r=this._getEmbeddedInputElem(t.target),o=r&&this._isCurInputFocused(),l=s.navigationModeOption;let a,d=eventToString(t),c=e.node,h=!0;if(!i.isEnabled())return!1;if(!1===i._callEvent("keydown",e))return!1;if(!1===i._callMethod("edit._preprocessKeyEvent",e))return!1;if(!c){const e=i.getFocusNode()||i.getActiveNode(),t=i.getFirstChild();if(!e&&t&&"ArrowDown"===d)return t.logInfo("Keydown: activate first node."),void t.setActive();a=e||t,a&&(a.setFocus(),c=i.getFocusNode(),c.logInfo("Keydown: force focus on active node."))}const u=c.isColspan();if(i.isRowNav()){if(o){switch(d){case"Enter":r.blur(),i.setFocus();break;case"Escape":c._render(),i.setFocus()}return}if(s.quicksearch&&1===d.length&&/^\w$/.test(d)&&!r){const e=Date.now();e-i.lastQuicksearchTime>500&&(i.lastQuicksearchTerm=""),i.lastQuicksearchTime=e,i.lastQuicksearchTerm+=d;const s=i.findNextNode(i.lastQuicksearchTerm,i.getActiveNode());return s&&s.setActive(!0,{event:t}),void t.preventDefault()}switch(d){case"Enter":c.isActive()&&(c.isExpanded()?d="Subtract":c.isExpandable(!0)&&(d="Add"));break;case"ArrowLeft":c.expanded&&(d="Subtract");break;case"ArrowRight":if(!c.expanded&&c.isExpandable(!0))d="Add";else if(l===NavModeEnum.startCell||l===NavModeEnum.startRow)return t.preventDefault(),i.setCellNav(),!1}switch(d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":c.getOption("checkbox")?c.toggleSelected():c.setActive(!0,{event:t});break;case"Enter":c.setActive(!0,{event:t});break;case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"Backspace":case"End":case"Home":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t});break;default:h=!1}}else{const e=r?r.type||r.tagName:"",s=r&&"checkbox"!==e;if(o){if("Escape"===d)return c.logDebug("Reset focused input on Escape"),r.setCustomValidity(""),c._render(),i.setFocus(),void i.setColumn(i.activeColIdx);if("Enter"!==d)return r&&r.checkValidity&&!r.checkValidity()?(c.logDebug(`Ignored ${d} inside invalid input`),!1):void c.logDebug(`Ignored ${d} inside focused input`)}else if(r&&1===d.length&&s)return r.focus(),r.value="",c.logDebug(`Focus input: ${d}`),!1;switch("Tab"===d?(d="ArrowRight",h=!0):"Shift+Tab"===d&&(d=i.activeColIdx>0?"ArrowLeft":"",h=!0),d){case"+":case"Add":c.setExpanded(!0);break;case"-":case"Subtract":c.setExpanded(!1);break;case" ":0===i.activeColIdx&&c.getOption("checkbox")?(c.toggleSelected(),h=!0):r&&"checkbox"===e&&(r.click(),h=!0);break;case"F2":r&&!o&&s&&(r.focus(),h=!0);break;case"Enter":i.setFocus(),(0===i.activeColIdx||u)&&c.isExpandable()?(c.setExpanded(!c.isExpanded()),h=!0):r&&!o&&s&&(r.focus(),h=!0);break;case"Escape":i.setFocus(),c.log("keynav: focus tree..."),i.isCellNav()&&l!==NavModeEnum.cell&&(c.log("keynav: setCellNav(false)"),i.setCellNav(!1),i.setFocus(),h=!0);break;case"ArrowLeft":i.setFocus(),u&&c.isExpanded()?c.setExpanded(!1):!u&&i.activeColIdx>0?i.setColumn(i.activeColIdx-1):l!==NavModeEnum.cell&&i.setCellNav(!1),h=!0;break;case"ArrowRight":i.setFocus(),u&&!c.isExpanded()?c.setExpanded():!u&&i.activeColIdx<i.columns.length-1&&i.setColumn(i.activeColIdx+1),h=!0;break;case"Home":i.setFocus(),!u&&i.activeColIdx>0&&i.setColumn(0),h=!0;break;case"End":i.setFocus(),!u&&i.activeColIdx<i.columns.length-1&&i.setColumn(i.columns.length-1),h=!0;break;case"ArrowDown":case"ArrowUp":case"Backspace":case"Control+End":case"Control+Home":case"Meta+ArrowDown":case"Meta+ArrowUp":case"PageDown":case"PageUp":c.navigate(d,{activate:n,event:t}),h=!0;break;default:h=!1}}h&&t.preventDefault()}}
33
33
  /*!
34
34
  * Wunderbaum - ext-logger
35
35
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
36
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
37
- */class LoggerExtension extends WunderbaumExtension{constructor(e){super(e,"logger",{}),this.ignoreEvents=new Set(["iconBadge","render","discard"]),this.prefix=e+".ext-logger"}init(){const e=this.tree;if(e.getOption("debugLevel")>=4){const t=this.ignoreEvents,i=this.prefix;overrideMethod(e,"callEvent",(function(s,n){if(t.has(s))return e._superApply(arguments);const o=Date.now(),r=e._superApply(arguments);return e.logDebug(`${i}: callEvent('${s}') took ${Date.now()-o} ms.`,arguments[1]),r}))}}onKeyEvent(e){this.tree.logDebug(`${this.prefix}: onKeyEvent()`,e)}}
36
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
37
+ */class LoggerExtension extends WunderbaumExtension{constructor(e){super(e,"logger",{}),this.ignoreEvents=new Set(["iconBadge","render","discard"]),this.prefix=e+".ext-logger"}init(){const e=this.tree;if(e.getOption("debugLevel")>=4){const t=this.ignoreEvents,i=this.prefix;overrideMethod(e,"callEvent",function(s,n){if(t.has(s))return e._superApply(arguments);const r=Date.now(),o=e._superApply(arguments);return e.logDebug(`${i}: callEvent('${s}') took ${Date.now()-r} ms.`,arguments[1]),o})}}onKeyEvent(e){this.tree.logDebug(`${this.prefix}: onKeyEvent()`,e)}}
38
38
  /*!
39
39
  * Wunderbaum - ext-dnd
40
40
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
41
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
42
- */const nodeMimeType="application/x-wunderbaum-node";class DndExtension extends WunderbaumExtension{constructor(e){super(e,"dnd",{autoExpandMS:1500,multiSource:!1,effectAllowed:"all",dropEffectDefault:"move",guessDropEffect:!0,preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,serializeClipboardData:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,sourceCopyHook:null,dragStart:null,drag:null,dragEnd:null,dragEnter:null,dragOver:null,dragExpand:null,drop:null,dragLeave:null}),this.srcNode=null,this.lastTargetNode=null,this.lastEnterStamp=0,this.lastAllowedDropRegions=null,this.lastDropEffect=null,this.lastDropRegion=!1,this.currentScrollDir=0,this.applyScrollDirThrottled=throttle(this._applyScrollDir,50)}init(){super.init();const e=this.tree,t=e.options.dnd;t.dragStart&&onEvent(e.element,"dragstart drag dragend",this.onDragEvent.bind(this)),t.dragEnter&&onEvent(e.element,"dragenter dragover dragleave drop",this.onDropEvent.bind(this))}_leaveNode(){const e=this.lastTargetNode;this.lastEnterStamp=0,e&&(e.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before",!1),this.lastTargetNode=null)}unifyDragover(e){if(!1===e)return!1;if(e instanceof Set)return e.size>0&&e;if(!0===e)return new Set(["over","before","after"]);if("string"==typeof e||isArray(e))return(e=toSet(e)).size>0&&e;throw new Error("Unsupported drop region definition: "+e)}_calcDropRegion(e,t){const i=this.tree.options.rowHeightPx,s=e.offsetY;return!!t&&(3===t.size?s<.25*i?"before":s>.75*i?"after":"over":1===t.size&&t.has("over")?"over":s>i/2?"after":"before")}_guessDropEffect(e){var t;const i=this.treeOpts.dnd,s=null!==(t=i.effectAllowed)&&void 0!==t?t:"all",n=["all","copy","copyLink","copyMove"].includes(s),o=["all","link","copyLink","linkMove"].includes(s),r=["all","move","copyMove","linkMove"].includes(s);let l=i.dropEffectDefault;return i.guessDropEffect&&(isMac?(e.altKey&&n&&(l="copy"),e.metaKey&&r&&(l="move"),e.altKey&&e.metaKey&&o&&(l="link")):(e.ctrlKey&&n&&(l="copy"),e.shiftKey&&r&&(l="move"),e.altKey&&o&&(l="link"))),l}_isVoidDrop(e,t,i){return!(!this.treeOpts.dnd.preventVoidMoves||!t)&&("before"===i&&e===t.getNextSibling()||"after"===i&&e===t.getPrevSibling()||(t===e||t.parent===e))}_applyScrollDir(){if(this.isDragging()&&this.currentScrollDir){const e=this.tree.options.dnd,t=this.tree.element,i=t.scrollTop;this.currentScrollDir<0?t.scrollTop=Math.max(0,i-e.scrollSpeed):this.currentScrollDir>0&&(t.scrollTop=i+e.scrollSpeed)}}_autoScroll(e){const t=this.tree,i=t.options.dnd.scrollSensitivity,s=t.element,n=t.headerElement.clientHeight,o=s.offsetHeight,r=s.scrollTop;return this.currentScrollDir=0,r>0&&e>0&&e<=i+n?this.currentScrollDir=-1:r<s.scrollHeight-o&&e>=o-i&&(this.currentScrollDir=1),this.currentScrollDir&&this.applyScrollDirThrottled(),s.scrollTop-r}isDragging(){return!!this.srcNode}onDragEvent(e){var t;const i=this.treeOpts.dnd,s=Wunderbaum.getNode(e);if(s){if(["dragstart","dragend"].includes(e.type)&&this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${s}`,e),"dragstart"===e.type){if(e.dataTransfer.effectAllowed=i.effectAllowed,s.isEditingTitle())return s.logDebug("Prevented dragging node in edit mode."),e.preventDefault(),!1;if(!s._callEvent("dnd.dragStart",{event:e}))return e.preventDefault(),!1;const n=s.toDict(!0,(e=>{e._orgKey=e.key,delete e.key}));n._treeId=s.tree.id,i.serializeClipboardData&&("function"==typeof i.serializeClipboardData?e.dataTransfer.setData(nodeMimeType,i.serializeClipboardData(n,s)):e.dataTransfer.setData(nodeMimeType,JSON.stringify(n))),(null===(t=e.dataTransfer)||void 0===t?void 0:t.types.includes("text/plain"))||e.dataTransfer.setData("text/plain",s.title),this.srcNode=s,setTimeout((()=>{s.setClass("wb-drag-source")}),0)}else"drag"===e.type?i.drag&&s._callEvent("dnd.drag",{event:e}):"dragend"===e.type&&(s.setClass("wb-drag-source",!1),this.srcNode=null,this.lastTargetNode&&this._leaveNode(),s._callEvent("dnd.dragEnd",{event:e}));return!0}this.tree.logWarn(`onDragEvent.${e.type}: no node`)}onDropEvent(e){var t;const i=this.srcNode,s=i?i.tree:null,n=Wunderbaum.getNode(e),o=this.treeOpts.dnd,r=e.dataTransfer,l=this._calcDropRegion(e,this.lastAllowedDropRegions),a=(e,t)=>(e&&this.tree.log(`Prevented drop operation (${t}).`),e);if(n){if(["drop"].includes(e.type)&&this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${n}, ea: ${null==r?void 0:r.effectAllowed}, de: ${null==r?void 0:r.dropEffect}, cy: ${e.offsetY}, r: ${l}, srcNode: ${i}`,e),"dragenter"===e.type){if(this.lastAllowedDropRegions=null,this.lastTargetNode&&this.lastTargetNode!==n&&this._leaveNode(),this.lastTargetNode=n,this.lastEnterStamp=Date.now(),a(n.isStatusNode(),"is status node")||a(o.preventForeignNodes&&n.tree!==s,"preventForeignNodes")||a(o.preventLazyParents&&!n.isLoaded(),"preventLazyParents")||a(o.preventNonNodes&&!i,"preventNonNodes")||a(o.preventRecursion&&(null==i?void 0:i.isAncestorOf(n)),"preventRecursion")||a(o.preventSameParent&&i&&n.parent===i.parent,"preventSameParent")||a(o.preventVoidMoves&&n===i,"preventVoidMoves"))return r.dropEffect="none",!0;r.dropEffect=this._guessDropEffect(e)||"none";let t=n._callEvent("dnd.dragEnter",{event:e,sourceNode:i});if(t=this.unifyDragover(t),!t)return r.dropEffect="none",!0;this.lastAllowedDropRegions=t,this.lastDropEffect=r.dropEffect;const l=this._calcDropRegion(e,this.lastAllowedDropRegions);return n.setClass("wb-drop-target"),n.setClass("wb-drop-over","over"===l),n.setClass("wb-drop-before","before"===l),n.setClass("wb-drop-after","after"===l),e.preventDefault(),!1}if("dragover"===e.type){const t=e.clientY-this.tree.element.offsetTop;this._autoScroll(t),r.dropEffect=this._guessDropEffect(e)||"none",n._callEvent("dnd.dragOver",{event:e,sourceNode:i});const s=this._calcDropRegion(e,this.lastAllowedDropRegions);if(this.lastDropRegion=s,this.lastDropEffect=r.dropEffect,o.autoExpandMS>0&&n.isExpandable(!0)&&!n._isLoading&&Date.now()-this.lastEnterStamp>o.autoExpandMS&&!1!==n._callEvent("dnd.dragExpand",{event:e,sourceNode:i})&&n.setExpanded(),!s||this._isVoidDrop(n,i,s))return;return n.setClass("wb-drop-over","over"===s),n.setClass("wb-drop-before","before"===s),n.setClass("wb-drop-after","after"===s),e.preventDefault(),!1}if("dragleave"===e.type)n._callEvent("dnd.dragLeave",{event:e,sourceNode:i});else if("drop"===e.type){e.stopPropagation(),e.preventDefault(),this._leaveNode();const i=this.lastDropRegion;let s=null===(t=e.dataTransfer)||void 0===t?void 0:t.getData(nodeMimeType);s=s?JSON.parse(s):null;const o=this.srcNode,r=this.lastDropEffect;setTimeout((()=>{n._callEvent("dnd.drop",{event:e,region:i,suggestedDropMode:"over"===i?"appendChild":i,suggestedDropEffect:r,sourceNode:o,sourceNodeData:s})}),10)}return!1}this._leaveNode()}}
41
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
42
+ */const nodeMimeType="application/x-wunderbaum-node";class DndExtension extends WunderbaumExtension{constructor(e){super(e,"dnd",{autoExpandMS:1500,multiSource:!1,effectAllowed:"all",dropEffectDefault:"move",guessDropEffect:!0,preventForeignNodes:!1,preventLazyParents:!0,preventNonNodes:!1,preventRecursion:!0,preventSameParent:!1,preventVoidMoves:!0,serializeClipboardData:!0,scroll:!0,scrollSensitivity:20,scrollSpeed:5,sourceCopyHook:null,dragStart:null,drag:null,dragEnd:null,dragEnter:null,dragOver:null,dragExpand:null,drop:null,dragLeave:null}),this.srcNode=null,this.lastTargetNode=null,this.lastEnterStamp=0,this.lastAllowedDropRegions=null,this.lastDropEffect=null,this.lastDropRegion=!1,this.currentScrollDir=0,this.applyScrollDirThrottled=throttle(this._applyScrollDir,50)}init(){super.init();const e=this.tree,t=e.options.dnd;t.dragStart&&onEvent(e.element,"dragstart drag dragend",this.onDragEvent.bind(this)),t.dragEnter&&onEvent(e.element,"dragenter dragover dragleave drop",this.onDropEvent.bind(this))}_leaveNode(){const e=this.lastTargetNode;this.lastEnterStamp=0,e&&(e.setClass("wb-drop-target wb-drop-over wb-drop-after wb-drop-before",!1),this.lastTargetNode=null)}unifyDragover(e){if(!1===e)return!1;if(e instanceof Set)return e.size>0&&e;if(!0===e)return new Set(["over","before","after"]);if("string"==typeof e||isArray(e))return(e=toSet(e)).size>0&&e;throw new Error("Unsupported drop region definition: "+e)}_calcDropRegion(e,t){const i=this.tree.options.rowHeightPx,s=e.offsetY;return!!t&&(3===t.size?s<.25*i?"before":s>.75*i?"after":"over":1===t.size&&t.has("over")?"over":s>i/2?"after":"before")}_guessDropEffect(e){var t;const i=this.treeOpts.dnd,s=null!==(t=i.effectAllowed)&&void 0!==t?t:"all",n=["all","copy","copyLink","copyMove"].includes(s),r=["all","link","copyLink","linkMove"].includes(s),o=["all","move","copyMove","linkMove"].includes(s);let l=i.dropEffectDefault;return i.guessDropEffect&&(isMac?(e.altKey&&n&&(l="copy"),e.metaKey&&o&&(l="move"),e.altKey&&e.metaKey&&r&&(l="link")):(e.ctrlKey&&n&&(l="copy"),e.shiftKey&&o&&(l="move"),e.altKey&&r&&(l="link"))),l}_isVoidDrop(e,t,i){return!(!this.treeOpts.dnd.preventVoidMoves||!t)&&("before"===i&&e===t.getNextSibling()||"after"===i&&e===t.getPrevSibling()||(t===e||t.parent===e))}_applyScrollDir(){if(this.isDragging()&&this.currentScrollDir){const e=this.tree.options.dnd,t=this.tree.element,i=t.scrollTop;this.currentScrollDir<0?t.scrollTop=Math.max(0,i-e.scrollSpeed):this.currentScrollDir>0&&(t.scrollTop=i+e.scrollSpeed)}}_autoScroll(e){const t=this.tree,i=t.options.dnd.scrollSensitivity,s=t.element,n=t.headerElement.clientHeight,r=s.offsetHeight,o=s.scrollTop;return this.currentScrollDir=0,o>0&&e>0&&e<=i+n?this.currentScrollDir=-1:o<s.scrollHeight-r&&e>=r-i&&(this.currentScrollDir=1),this.currentScrollDir&&this.applyScrollDirThrottled(),s.scrollTop-o}isDragging(){return!!this.srcNode}onDragEvent(e){var t;const i=this.treeOpts.dnd,s=Wunderbaum.getNode(e);if(s){if(["dragstart","dragend"].includes(e.type)&&this.tree.logDebug(`onDragEvent.${e.type} srcNode: ${s}`,e),"dragstart"===e.type){if(e.dataTransfer.effectAllowed=i.effectAllowed,s.isEditingTitle())return s.logDebug("Prevented dragging node in edit mode."),e.preventDefault(),!1;if(!s._callEvent("dnd.dragStart",{event:e}))return e.preventDefault(),!1;const n=s.toDict(!0,e=>{e._orgKey=e.key,delete e.key});n._treeId=s.tree.id,i.serializeClipboardData&&("function"==typeof i.serializeClipboardData?e.dataTransfer.setData(nodeMimeType,i.serializeClipboardData(n,s)):e.dataTransfer.setData(nodeMimeType,JSON.stringify(n))),(null===(t=e.dataTransfer)||void 0===t?void 0:t.types.includes("text/plain"))||e.dataTransfer.setData("text/plain",s.title),this.srcNode=s,setTimeout(()=>{s.setClass("wb-drag-source")},0)}else"drag"===e.type?i.drag&&s._callEvent("dnd.drag",{event:e}):"dragend"===e.type&&(s.setClass("wb-drag-source",!1),this.srcNode=null,this.lastTargetNode&&this._leaveNode(),s._callEvent("dnd.dragEnd",{event:e}));return!0}this.tree.logWarn(`onDragEvent.${e.type}: no node`)}onDropEvent(e){var t;const i=this.srcNode,s=i?i.tree:null,n=Wunderbaum.getNode(e),r=this.treeOpts.dnd,o=e.dataTransfer,l=this._calcDropRegion(e,this.lastAllowedDropRegions),a=(e,t)=>(e&&this.tree.log(`Prevented drop operation (${t}).`),e);if(!n)return this._leaveNode(),void e.preventDefault();if(["drop"].includes(e.type)&&this.tree.logDebug(`onDropEvent.${e.type} targetNode: ${n}, ea: ${null==o?void 0:o.effectAllowed}, de: ${null==o?void 0:o.dropEffect}, cy: ${e.offsetY}, r: ${l}, srcNode: ${i}`,e),"dragenter"===e.type){if(this.lastAllowedDropRegions=null,this.lastTargetNode&&this.lastTargetNode!==n&&this._leaveNode(),this.lastTargetNode=n,this.lastEnterStamp=Date.now(),a(n.isStatusNode(),"is status node")||a(r.preventForeignNodes&&n.tree!==s,"preventForeignNodes")||a(r.preventLazyParents&&!n.isLoaded(),"preventLazyParents")||a(r.preventNonNodes&&!i,"preventNonNodes")||a(r.preventRecursion&&(null==i?void 0:i.isAncestorOf(n)),"preventRecursion")||a(r.preventSameParent&&i&&n.parent===i.parent,"preventSameParent")||a(r.preventVoidMoves&&n===i,"preventVoidMoves"))return o.dropEffect="none",!0;o.dropEffect=this._guessDropEffect(e)||"none";let t=n._callEvent("dnd.dragEnter",{event:e,sourceNode:i});if(t=this.unifyDragover(t),!t)return o.dropEffect="none",!0;this.lastAllowedDropRegions=t,this.lastDropEffect=o.dropEffect;const l=this._calcDropRegion(e,this.lastAllowedDropRegions);return n.setClass("wb-drop-target"),n.setClass("wb-drop-over","over"===l),n.setClass("wb-drop-before","before"===l),n.setClass("wb-drop-after","after"===l),e.preventDefault(),!1}if("dragover"===e.type){const t=e.clientY-this.tree.element.offsetTop;this._autoScroll(t),o.dropEffect=this._guessDropEffect(e)||"none",n._callEvent("dnd.dragOver",{event:e,sourceNode:i});const s=this._calcDropRegion(e,this.lastAllowedDropRegions);if(this.lastDropRegion=s,this.lastDropEffect=o.dropEffect,r.autoExpandMS>0&&n.isExpandable(!0)&&!n._isLoading&&Date.now()-this.lastEnterStamp>r.autoExpandMS&&!1!==n._callEvent("dnd.dragExpand",{event:e,sourceNode:i})&&n.setExpanded(),!s||this._isVoidDrop(n,i,s))return;return n.setClass("wb-drop-over","over"===s),n.setClass("wb-drop-before","before"===s),n.setClass("wb-drop-after","after"===s),e.preventDefault(),!1}if("dragleave"===e.type)n._callEvent("dnd.dragLeave",{event:e,sourceNode:i});else if("drop"===e.type){e.stopPropagation(),e.preventDefault(),this._leaveNode();const i=this.lastDropRegion;let s=null===(t=e.dataTransfer)||void 0===t?void 0:t.getData(nodeMimeType);s=s?JSON.parse(s):null;const r=this.srcNode,o=this.lastDropEffect;n._callEvent("dnd.drop",{event:e,region:i,suggestedDropMode:"over"===i?"appendChild":i,suggestedDropEffect:o,sourceNode:r,sourceNodeData:s,dataTransfer:e.dataTransfer})}return!1}}
43
43
  /*!
44
44
  * Wunderbaum - drag_observer
45
45
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
46
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
47
- */class DragObserver{constructor(e){if(this.start={event:null,x:0,y:0,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1},this.dragElem=null,this.dragging=!1,this.customData={},this.events=["mousedown","mouseup","mousemove","keydown"],!e.root)throw new Error("Missing `root` option.");this.opts=Object.assign({thresh:5},e),this.root=e.root,this._handler=this.handleEvent.bind(this),this.events.forEach((e=>{this.root.addEventListener(e,this._handler)}))}disconnect(){this.events.forEach((e=>{this.root.removeEventListener(e,this._handler)}))}getDragElem(){return this.dragElem}isDragging(){return this.dragging}stopDrag(e){if(this.dragging&&this.opts.dragstop&&e){e.type="dragstop";try{this.opts.dragstop(e)}catch(e){console.error("dragstop error",e)}}this.dragElem=null,this.dragging=!1,this.start.event=null,this.customData={}}handleEvent(e){const t=e.type,i=this.opts,s={type:e.type,startEvent:"mousedown"===t?e:this.start.event,event:e,customData:this.customData,dragElem:this.dragElem,dx:e.pageX-this.start.x,dy:e.pageY-this.start.y,apply:void 0};switch(t){case"keydown":this.stopDrag(s);break;case"mousedown":if(this.dragElem){this.stopDrag(s);break}if(i.selector){let t=e.target;if(t.matches(i.selector))this.dragElem=t;else{if(t=t.closest(i.selector),!t)break;this.dragElem=t}}this.start.event=e,this.start.x=e.pageX,this.start.y=e.pageY,this.start.altKey=e.altKey,this.start.ctrlKey=e.ctrlKey,this.start.metaKey=e.metaKey,this.start.shiftKey=e.shiftKey;break;case"mousemove":if(!this.dragElem)break;if(!this.dragging){if(i.thresh){if(s.dx*s.dx+s.dy*s.dy<i.thresh*i.thresh)break}if(s.type="dragstart",!1===i.dragstart(s)){this.stopDrag(s);break}this.dragging=!0}this.dragging&&this.opts.drag&&(s.type="drag",this.opts.drag(s));break;case"mouseup":if(!this.dragging){this.stopDrag(s);break}0===e.button?s.apply=!0:s.apply=!1,this.stopDrag(s)}}}
46
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
47
+ */class DragObserver{constructor(e){if(this.start={event:null,x:0,y:0,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1},this.dragElem=null,this.dragging=!1,this.customData={},this.events=["mousedown","mouseup","mousemove","keydown"],!e.root)throw new Error("Missing `root` option.");this.opts=Object.assign({thresh:5},e),this.root=e.root,this._handler=this.handleEvent.bind(this),this.events.forEach(e=>{this.root.addEventListener(e,this._handler)})}disconnect(){this.events.forEach(e=>{this.root.removeEventListener(e,this._handler)})}getDragElem(){return this.dragElem}isDragging(){return this.dragging}stopDrag(e){if(this.dragging&&this.opts.dragstop&&e){e.type="dragstop";try{this.opts.dragstop(e)}catch(e){console.error("dragstop error",e)}}this.dragElem=null,this.dragging=!1,this.start.event=null,this.customData={}}handleEvent(e){const t=e.type,i=this.opts,s={type:e.type,startEvent:"mousedown"===t?e:this.start.event,event:e,customData:this.customData,dragElem:this.dragElem,dx:e.pageX-this.start.x,dy:e.pageY-this.start.y,apply:void 0};switch(t){case"keydown":this.stopDrag(s);break;case"mousedown":if(this.dragElem){this.stopDrag(s);break}if(i.selector){let t=e.target;if(t.matches(i.selector))this.dragElem=t;else{if(t=t.closest(i.selector),!t)break;this.dragElem=t}}this.start.event=e,this.start.x=e.pageX,this.start.y=e.pageY,this.start.altKey=e.altKey,this.start.ctrlKey=e.ctrlKey,this.start.metaKey=e.metaKey,this.start.shiftKey=e.shiftKey;break;case"mousemove":if(!this.dragElem)break;if(!this.dragging){if(i.thresh){if(s.dx*s.dx+s.dy*s.dy<i.thresh*i.thresh)break}if(s.type="dragstart",!1===i.dragstart(s)){this.stopDrag(s);break}this.dragging=!0}this.dragging&&this.opts.drag&&(s.type="drag",this.opts.drag(s));break;case"mouseup":if(!this.dragging){this.stopDrag(s);break}0===e.button?s.apply=!0:s.apply=!1,this.stopDrag(s)}}}
48
48
  /*!
49
49
  * Wunderbaum - common
50
50
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
51
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
52
- */const DEFAULT_DEBUGLEVEL=3,DEFAULT_ROW_HEIGHT=22,ICON_WIDTH=20,TITLE_SPAN_PAD_Y=7,RENDER_MAX_PREFETCH=5,DEFAULT_MIN_COL_WIDTH=4,TEST_IMG=new RegExp(/\.|\//),iconMaps={bootstrap:{error:"bi bi-exclamation-triangle",loading:"bi bi-chevron-right wb-busy",noData:"bi bi-question-circle",expanderExpanded:"bi bi-chevron-down",expanderCollapsed:"bi bi-chevron-right",expanderLazy:"bi bi-chevron-right wb-helper-lazy-expander",checkChecked:"bi bi-check-square",checkUnchecked:"bi bi-square",checkUnknown:"bi bi-dash-square-dotted",radioChecked:"bi bi-circle-fill",radioUnchecked:"bi bi-circle",radioUnknown:"bi bi-record-circle",folder:"bi bi-folder2",folderOpen:"bi bi-folder2-open",folderLazy:"bi bi-folder-symlink",doc:"bi bi-file-earmark",colSortable:"bi bi-chevron-expand",colSortAsc:"bi bi-arrow-down",colSortDesc:"bi bi-arrow-up",colFilter:"bi bi-filter-circle",colFilterActive:"bi bi-filter-circle-fill wb-helper-invalid",colMenu:"bi bi-three-dots-vertical"},fontawesome6:{error:"fa-solid fa-triangle-exclamation",loading:"fa-solid fa-chevron-right fa-beat",noData:"fa-solid fa-circle-question",expanderExpanded:"fa-solid fa-chevron-down",expanderCollapsed:"fa-solid fa-chevron-right",expanderLazy:"fa-solid fa-chevron-right wb-helper-lazy-expander",checkChecked:"fa-regular fa-square-check",checkUnchecked:"fa-regular fa-square",checkUnknown:"fa-regular fa-square-minus",radioChecked:"fa-solid fa-circle",radioUnchecked:"fa-regular fa-circle",radioUnknown:"fa-regular fa-circle-question",folder:"fa-solid fa-folder-closed",folderOpen:"fa-regular fa-folder-open",folderLazy:"fa-solid fa-folder-plus",doc:"fa-regular fa-file",colSortable:"fa-solid fa-fw fa-sort",colSortAsc:"fa-solid fa-fw fa-sort-up",colSortDesc:"fa-solid fa-fw fa-sort-down",colFilter:"fa-solid fa-fw fa-filter",colFilterActive:"fa-solid fa-fw fa-filter wb-helper-invalid",colMenu:"fa-solid fa-fw fa-ellipsis-v"}},RESERVED_TREE_SOURCE_KEYS=new Set(["_format","_keyMap","_positional","_typeList","_valueMap","_version","children","columns","types"]),KEY_TO_NAVIGATION_MAP={ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",Backspace:"parent",End:"lastCol",Home:"firstCol","Control+End":"last","Control+Home":"first","Meta+ArrowDown":"last","Meta+ArrowUp":"first",PageDown:"pageDown",PageUp:"pageUp"};function makeNodeTitleMatcher(e){return e instanceof RegExp?function(t){return e.test(t.title)}:(assert("string"==typeof e,`Expected a string or RegExp: ${e}`),function(t){return t.title===e})}function makeNodeTitleStartMatcher(e){e=escapeRegex(e);const t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}function nodeTitleSorter(e,t){const i=e.title.toLowerCase(),s=t.title.toLowerCase();return i===s?0:i>s?1:-1}function unflattenSource(e){var t,i,s;const{_format:n,_keyMap:o={},_positional:r=[],children:l}=e,a=r.length;if("flat"!==n)throw new Error(`Expected source._format: "flat", but got ${n}`);if(a&&r.includes("children"))throw new Error(`source._positional must not include "children": ${r}`);let d=o;if(o.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),d={};for(const[e,t]of Object.entries(o))d[t]=e}const c=r.map((e=>{var t;return null!==(t=d[e])&&void 0!==t?t:e})),h=[],u={},p={},f=null!==(t=d.key)&&void 0!==t?t:"key",g=null!==(i=d.children)&&void 0!==i?i:"children";for(const[e,t]of l.entries()){let i;const[n,...o]=t;if(o.length===a)i={};else{if(o.length!==a+1)throw new Error(`unflattenSource: unexpected tuple length: ${t}`);if(i=o.pop(),"object"!=typeof i)throw new Error(`unflattenSource: Expected dict as last tuple element: ${t}`)}t[1]=null,null!=t[2]&&(t[2]=null),o.forEach(((e,t)=>{i[c[t]]=e})),o.length=0,p[e]=i;const r=i[f];null!=r&&(u[r]=i);let l=null;if(null===n);else if("number"==typeof n){if(l=p[n],void 0===l)throw new Error(`unflattenSource: Could not find parent node by index: ${n}.`)}else if(l=u[n],void 0===l)throw new Error(`unflattenSource: Could not find parent node by key: ${n}`);l?(null!==(s=l[g])&&void 0!==s||(l[g]=[]),l[g].push(i)):h.push(i)}e.children=h}function decompressSourceData(e){let{_format:t,_version:i=1,_keyMap:s,_valueMap:n}=e;assert(1===i,`Expected file version 1 instead of ${i}`);let o=s,r={};if(o)for(const[e,t]of Object.entries(o))r[t]=e;if(o&&o.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),[o,r]=[r,o]}if(null!=e._typeList){const t='source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.';if(null!=n)throw new Error(t);console.warn(t),n={type:e._typeList},delete e._typeList}"flat"===t&&unflattenSource(e),delete e._format,delete e._version,delete e._keyMap,delete e._valueMap,delete e._positional,(s||n)&&function e(t){for(const i of t)Object.getOwnPropertyNames(i).forEach((e=>{const t=i[e];let o=e;if(s&&null!=r[e]&&(o=r[e],o!==e&&(i[o]=t,delete i[e])),n&&"number"==typeof t&&null!=n[o]){const e=n[o][t];if(null==e)throw new Error(`Expected valueMap[${o}][${t}] entry in [${n[o]}]`);i[o]=e}})),i.children&&e(i.children)}(e.children)}
51
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
52
+ */const DEFAULT_DEBUGLEVEL=3,DEFAULT_ROW_HEIGHT=22,ICON_WIDTH=20,TITLE_SPAN_PAD_Y=7,RENDER_MAX_PREFETCH=5,DEFAULT_MIN_COL_WIDTH=4,NODE_TYPE_FOLDER="folder",TEST_FILE_PATH=/^(?!.*<).*[/.]/,TEST_HTML=/</,defaultIconMaps={bootstrap:{error:"bi bi-exclamation-triangle",loading:"bi bi-chevron-right wb-busy",noData:"bi bi-question-circle",expanderExpanded:"bi bi-chevron-down",expanderCollapsed:"bi bi-chevron-right",expanderLazy:"bi bi-chevron-right wb-helper-lazy-expander",checkChecked:"bi bi-check-square",checkUnchecked:"bi bi-square",checkUnknown:"bi bi-dash-square-dotted",radioChecked:"bi bi-circle-fill",radioUnchecked:"bi bi-circle",radioUnknown:"bi bi-record-circle",folder:"bi bi-folder2",folderOpen:"bi bi-folder2-open",folderLazy:"bi bi-folder-symlink",doc:"bi bi-file-earmark",colSortable:"bi bi-chevron-expand",colSortAsc:"bi bi-arrow-down",colSortDesc:"bi bi-arrow-up",colFilter:"bi bi-filter-circle",colFilterActive:"bi bi-filter-circle-fill wb-helper-invalid",colMenu:"bi bi-three-dots-vertical"},fontawesome6:{error:"fa-solid fa-triangle-exclamation",loading:"fa-solid fa-chevron-right fa-beat",noData:"fa-solid fa-circle-question",expanderExpanded:"fa-solid fa-chevron-down",expanderCollapsed:"fa-solid fa-chevron-right",expanderLazy:"fa-solid fa-chevron-right wb-helper-lazy-expander",checkChecked:"fa-regular fa-square-check",checkUnchecked:"fa-regular fa-square",checkUnknown:"fa-regular fa-square-minus",radioChecked:"fa-solid fa-circle",radioUnchecked:"fa-regular fa-circle",radioUnknown:"fa-regular fa-circle-question",folder:"fa-regular fa-folder-closed",folderOpen:"fa-regular fa-folder-open",folderLazy:"fa-solid fa-folder-plus",doc:"fa-regular fa-file",colSortable:"fa-solid fa-fw fa-sort",colSortAsc:"fa-solid fa-fw fa-sort-up",colSortDesc:"fa-solid fa-fw fa-sort-down",colFilter:"fa-solid fa-fw fa-filter",colFilterActive:"fa-solid fa-fw fa-filter wb-helper-invalid",colMenu:"fa-solid fa-fw fa-ellipsis-v"}},RESERVED_TREE_SOURCE_KEYS=new Set(["_format","_keyMap","_positional","_typeList","_valueMap","_version","children","columns","types"]),KEY_TO_NAVIGATION_MAP={ArrowDown:"down",ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",Backspace:"parent",End:"lastCol",Home:"firstCol","Control+End":"last","Control+Home":"first","Meta+ArrowDown":"last","Meta+ArrowUp":"first",PageDown:"pageDown",PageUp:"pageUp"};function makeNodeTitleMatcher(e){return e instanceof RegExp?function(t){return e.test(t.title)}:(assert("string"==typeof e,`Expected a string or RegExp: ${e}`),function(t){return t.title===e})}function makeNodeTitleStartMatcher(e){e=escapeRegex(e);const t=new RegExp("^"+e,"i");return function(e){return t.test(e.title)}}function nodeTitleSorter(e,t){const i=e.title.toLowerCase(),s=t.title.toLowerCase();return i===s?0:i>s?1:-1}function unflattenSource(e){var t,i,s;const{_format:n,_keyMap:r={},_positional:o=[],children:l}=e,a=o.length;if("flat"!==n)throw new Error(`Expected source._format: "flat", but got ${n}`);if(a&&o.includes("children"))throw new Error(`source._positional must not include "children": ${o}`);let d=r;if(r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),d={};for(const[e,t]of Object.entries(r))d[t]=e}const c=o.map(e=>{var t;return null!==(t=d[e])&&void 0!==t?t:e}),h=[],u={},p={},f=null!==(t=d.key)&&void 0!==t?t:"key",g=null!==(i=d.children)&&void 0!==i?i:"children";for(const[e,t]of l.entries()){let i;const[n,...r]=t;if(r.length===a)i={};else{if(r.length!==a+1)throw new Error(`unflattenSource: unexpected tuple length: ${t}`);if(i=r.pop(),"object"!=typeof i)throw new Error(`unflattenSource: Expected dict as last tuple element: ${t}`)}t[1]=null,null!=t[2]&&(t[2]=null),r.forEach((e,t)=>{i[c[t]]=e}),r.length=0,p[e]=i;const o=i[f];null!=o&&(u[o]=i);let l=null;if(null===n);else if("number"==typeof n){if(l=p[n],void 0===l)throw new Error(`unflattenSource: Could not find parent node by index: ${n}.`)}else if(l=u[n],void 0===l)throw new Error(`unflattenSource: Could not find parent node by key: ${n}`);l?(null!==(s=l[g])&&void 0!==s||(l[g]=[]),l[g].push(i)):h.push(i)}e.children=h}function decompressSourceData(e){let{_format:t,_version:i=1,_keyMap:s,_valueMap:n}=e;assert(1===i,`Expected file version 1 instead of ${i}`);let r=s,o={};if(r)for(const[e,t]of Object.entries(r))o[t]=e;if(r&&r.t){const e="source._keyMap maps from long to short since v0.7.0. Flip key/value!";console.warn(e),[r,o]=[o,r]}if(null!=e._typeList){const t='source._typeList is deprecated since v0.7.0: use source._valueMap: {"type": [...]} instead.';if(null!=n)throw new Error(t);console.warn(t),n={type:e._typeList},delete e._typeList}"flat"===t&&unflattenSource(e),delete e._format,delete e._version,delete e._keyMap,delete e._valueMap,delete e._positional,(s||n)&&function e(t){for(const i of t)Object.getOwnPropertyNames(i).forEach(e=>{const t=i[e];let r=e;if(s&&null!=o[e]&&(r=o[e],r!==e&&(i[r]=t,delete i[e])),n&&"number"==typeof t&&null!=n[r]){const e=n[r][t];if(null==e)throw new Error(`Expected valueMap[${r}][${t}] entry in [${n[r]}]`);i[r]=e}}),i.children&&e(i.children)}(e.children)}
53
53
  /*!
54
54
  * Wunderbaum - ext-grid
55
55
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
56
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
56
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
57
57
  */class GridExtension extends WunderbaumExtension{constructor(e){super(e,"grid",{}),this.observer=new DragObserver({root:window.document,selector:"span.wb-col-resizer-active",thresh:4,dragstart:t=>{const i=Wunderbaum.getEventInfo(t.startEvent),s=i.colDef,n=s&&this.tree.element.contains(t.dragElem)&&toBool(s.resizable,e.options.columnsResizable,!1);if(this.tree.element.classList.toggle("wb-col-resizing",!!n),i.colElem.classList.toggle("wb-col-resizing",!!n),n){t.customData.colDef=s,t.customData.orgCustomWidthPx=s.customWidthPx;const e=Number.parseInt(i.colElem.style.width,10);t.customData.orgWidthPx=e,s.customWidthPx=e,this.tree.update(ChangeType.colStructure)}return n},drag:e=>this.handleDrag(e),dragstop:e=>this.handleDrag(e)})}init(){super.init()}handleDrag(e){const t=e.customData,i=t.colDef;if("dragstop"===e.type||"drag"===e.type){if(this.tree.element.classList.remove("wb-col-resizing"),e.apply||"drag"===e.type){const s=toPixel(i.minWidth,4),n=Math.max(s,t.orgWidthPx+e.dx);i.customWidthPx=n}else this.tree.log("Column resize cancelled",e),i.customWidthPx=t.orgCustomWidthPx;this.tree.update(ChangeType.colStructure)}}}
58
58
  /*!
59
59
  * Wunderbaum - deferred
60
60
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
61
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
62
- */class Deferred{constructor(){this._promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}resolve(e){this._resolve(e)}reject(e){this._reject(e)}promise(){return this._promise}then(e){return this._promise.then(e)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}}
61
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
62
+ */class Deferred{constructor(){this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}resolve(e){this._resolve(e)}reject(e){this._reject(e)}promise(){return this._promise}then(e){return this._promise.then(e)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}}
63
63
  /*!
64
64
  * Wunderbaum - wunderbaum_node
65
65
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
66
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
67
- */const NODE_PROPS=new Set(["checkbox","classes","expanded","icon","iconTooltip","key","lazy","_partsel","radiogroup","refKey","selected","statusNodeType","title","tooltip","type","unselectable"]),NODE_DICT_PROPS=new Set(NODE_PROPS);NODE_DICT_PROPS.delete("_partsel"),NODE_DICT_PROPS.delete("unselectable");class WunderbaumNode{constructor(e,t,i){var s,n;this.refKey=void 0,this.children=null,this.classes=null,this.data={},this._isLoading=!1,this._requestId=0,this._errorInfo=null,this._partsel=!1,this._partload=!1,this.subMatchCount=0,this._rowIdx=0,this._rowElem=void 0,assert(!t||t.tree===e,`Invalid parent: ${t}`),assert(!i.children,"'children' not allowed here"),this.tree=e,this.parent=t,this.key=""+(null!==(s=i.key)&&void 0!==s?s:++WunderbaumNode.sequence),this.title=""+(null!==(n=i.title)&&void 0!==n?n:"<"+this.key+">"),this.expanded=!!i.expanded,this.lazy=!!i.lazy,null!=i.refKey&&(this.refKey=""+i.refKey),null!=i.type&&(this.type=""+i.type),null!=i.icon&&(this.icon=intToBool(i.icon)),null!=i.tooltip&&(this.tooltip=intToBool(i.tooltip)),null!=i.iconTooltip&&(this.iconTooltip=intToBool(i.iconTooltip)),null!=i.statusNodeType&&(this.statusNodeType=""+i.statusNodeType),null!=i.colspan&&(this.colspan=!!i.colspan),null!=i.checkbox&&intToBool(i.checkbox),null!=i.radiogroup&&(this.radiogroup=!!i.radiogroup),null!=i.selected&&(this.selected=!!i.selected),null!=i.unselectable&&(this.unselectable=!!i.unselectable),i.classes&&this.setClass(i.classes);for(const[e,t]of Object.entries(i))NODE_PROPS.has(e)||(this.data[e]=t);t&&!this.statusNodeType&&e._registerNode(this)}toString(){return`WunderbaumNode@${this.key}<'${this.title}'>`}*[Symbol.iterator](){const e=this.children;if(e)for(let t=0,i=e.length;t<i;t++){const i=e[t];yield i,i.children&&(yield*i)}}_callEvent(e,t){var i;return null===(i=this.tree)||void 0===i?void 0:i._callEvent(e,extend({node:this,typeInfo:this.type?this.tree.types[this.type]:{}},t))}addChildren(e,t){const i=this.tree;let{before:s=null,applyMinExpanLevel:n=!0,_level:o}=null!=t?t:{};null!=o||(o=this.getLevel());const r=[];try{i.enableUpdate(!1),isPlainObject(e)&&(e=[e]);const t=n&&o<i.options.minExpandLevel;for(const s of e){const e=s.children;delete s.children;const n=new WunderbaumNode(i,this,s);t&&!n.isUnloaded()&&(n.expanded=!0),r.push(n),e&&n.addChildren(e,{_level:o+1})}if(this.children)if(null==s||0===this.children.length)this.children=this.children.concat(r);else{s=this.findDirectChild(s);const e=this.children.indexOf(s);assert(e>=0,`options.before must be a direct child of ${this}`),this.children.splice(e,0,...r)}else this.children=r;i.update(ChangeType.structure)}finally{i.enableUpdate(!0)}return r[0]}addNode(e,t="appendChild"){switch("over"===t&&(t="appendChild"),t){case"after":return this.parent.addChildren(e,{before:this.getNextSibling()});case"before":return this.parent.addChildren(e,{before:this});case"prependChild":return this.addChildren(e,{before:0});case"appendChild":return this.addChildren(e)}assert(!1,`Invalid mode: ${t}`)}applyCommand(e,t){return this.tree.applyCommand(e,this,t)}collapseSiblings(e){for(const t of this.parent.children)t!==this&&t.expanded&&t.setExpanded(!1,e)}setClass(e,t=!0){const i=toSet(e);if(t)null===this.classes&&(this.classes=new Set),i.forEach((e=>{var i;this.classes.add(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)}));else{if(null===this.classes)return;i.forEach((e=>{var i;this.classes.delete(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)})),0===this.classes.size&&(this.classes=null)}}startEditTitle(){this.tree._callMethod("edit.startEditTitle",this)}async expandAll(e=!0,t){const i=this.tree,{collapseOthers:s,deep:n,depth:o,force:r,keepActiveNodeVisible:l=!0,loadLazy:a,resetLazy:d}=null!=t?t:{},c=this.tree.options.minExpandLevel||null,h=null!=o?o:r?null:c,u={deep:n,force:r,loadLazy:a,resetLazy:d,scrollIntoView:!1};this.logInfo(`expandAll(${e}, depth=${o}, minLevel=${h})`),assert(!(e&&null!=n&&!s),"Expanding with `deep` option is not supported (implied by the `depth` option).");const p=i.logTime(`${this}.expandAll(${e}, depth=${o})`);try{i.enableUpdate(!1),await async function t(i,s){var r;const l=[];return null===(r=i.children)||void 0===r||r.forEach((i=>{if(e)if(!i.expanded&&(null==h||s<h)&&(i.children||a&&i.lazy)){const e=i.setExpanded(!0,u);l.push(e),null==o&&e.then((async()=>{await t(i,s+1)}))}else l.push(t(i,s+1));else(null==h||s>=h)&&i.setExpanded(!1,u),(null!=h&&s<h||n)&&t(i,s+1)})),new Promise((e=>{Promise.all(l).then((()=>{e(!0)}))}))}(this,0),s&&(assert(e,"Option `collapseOthers` requires flag=true"),assert(null!=h,"Option `collapseOthers` requires `depth` or `minExpandLevel`"),this.expandAll(!1,{depth:h}))}finally{i.enableUpdate(!0),i.logTimeEnd(p)}i.activeNode&&l&&i.activeNode.scrollIntoView()}findAll(e){const t="function"==typeof e?e:makeNodeTitleMatcher(e),i=[];return this.visit((e=>{t(e)&&i.push(e)})),i}findDirectChild(e){const t=this.children;if(!t)return null;if("string"==typeof e){for(let i=0,s=t.length;i<s;i++)if(t[i].key===e)return t[i]}else{if("number"==typeof e)return t[e];if(e.parent===this)return e}return null}findFirst(e){const t="function"==typeof e?e:makeNodeTitleMatcher(e);let i=null;return this.visit((e=>{if(t(e))return i=e,!1})),i}findRelatedNode(e,t=!1){return this.tree.findRelatedNode(this,e,t)}*format_iter(e,t){function i(e){const t=e.parent.children;return e===t[t.length-1]}null!=t||(t=[" "," | "," ╰─ "," ├─ "]),null!=e||(e=e=>""+e);const s=s=>{const n=[e(s)];n.unshift(t[i(s)?2:3]);let o=s.parent;for(;o&&o!==this;)n.unshift(t[i(o)?0:1]),o=o.parent;return n.join("")};yield e(this);for(const e of this)yield s(e)}format(e,t){const i=[];for(const s of this.format_iter(e,t))i.push(s);return i.join("\n")}getColElem(e){var t;"string"==typeof e&&(e=this.tree.columns.findIndex((t=>t.id===e)));const i=null===(t=this._rowElem)||void 0===t?void 0:t.querySelectorAll("span.wb-col");return i?i[e]:null}getCloneList(e=!1){if(!this.refKey)return[];const t=this.tree.findByRefKey(this.refKey);return e?t:[...t].filter((e=>e!==this))}getFirstChild(){return this.children?this.children[0]:null}getLastChild(){return this.children?this.children[this.children.length-1]:null}getLevel(){let e=0,t=this.parent;for(;t;)e++,t=t.parent;return e}getNextSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t+1]||null}getParent(){return this.parent}getParentList(e=!1,t=!1){const i=[];let s=t?this:this.parent;for(;s;)(e||s.parent)&&i.unshift(s),s=s.parent;return i}getPath(e=!0,t="title",i="/"){let s;const n=[],o="function"==typeof t;return this.visitParents((e=>{e.parent&&(s=o?t(e):e[t],n.unshift(s))}),e),n.join(i)}getPrevSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t-1]||null}hasChildren(){if(this.lazy){if(null==this.children)return;if(0===this.children.length)return!1;if(1===this.children.length&&this.children[0].isStatusNode())return;return!0}return!(!this.children||!this.children.length)}hasClass(e){return!!this.classes&&this.classes.has(e)}hasFocus(){return this.tree.focusNode===this}isActive(){return this.tree.activeNode===this}isAncestorOf(e){return e&&e.isDescendantOf(this)}isChildOf(e){return e&&this.parent===e}isClone(){return!!this.refKey&&this.tree.findByRefKey(this.refKey).length>1}isColspan(){return!!this.getOption("colspan")}isDescendantOf(e){if(!e||e.tree!==this.tree)return!1;let t=this.parent;for(;t;){if(t===e)return!0;t===t.parent&&error(`Recursive parent link: ${t}`),t=t.parent}return!1}isExpandable(e=!1){return!(e&&this.expanded||!1===this.children)&&(null==this.children?!!this.lazy:0!==this.children.length||!!this.tree.options.emptyChildListExpandable)}isEditingTitle(){return this.tree._callMethod("edit.isEditingTitle",this)}isExpanded(){return!!this.expanded}isFirstSibling(){const e=this.parent;return!e||e.children[0]===this}isLastSibling(){const e=this.parent;return!e||e.children[e.children.length-1]===this}isLazy(){return!!this.lazy}isLoaded(){return!this.lazy||void 0!==this.hasChildren()}isLoading(){return this._isLoading}isPagingNode(){return"paging"===this.statusNodeType}isParentOf(e){return e&&e.parent===this}isPartload(){return!!this._partload}isPartsel(){return!this.selected&&!!this._partsel}isRadio(){return!!this.parent.radiogroup||"radio"===this.getOption("checkbox")}isRendered(){return!!this._rowElem}isRootNode(){return this.tree.root===this}isSelected(){return!!this.selected||!!this._partsel&&void 0}isStatusNode(){return!!this.statusNodeType}isTopLevel(){return this.tree.root===this.parent}isUnloaded(){return void 0===this.hasChildren()}isVisible(){const e="hide"===this.tree.filterMode,t=this.getParentList(!1,!1);if(e&&!this.match&&!this.subMatchCount)return!1;for(let e=0,i=t.length;e<i;e++){if(!t[e].expanded)return!1}return!0}_loadSourceObject(e,t){var i;const s=this.tree;null!=t||(t=this.getLevel());const n=this._callEvent("receive",{response:e});null!=n&&(e=n),isArray(e)&&(e={children:e}),assert(isPlainObject(e),`Expected an array or plain object: ${e}`);const o=null!==(i=e.format)&&void 0!==i?i:"nested";assert("nested"===o||"flat"===o,`Expected source.format = 'nested' or 'flat': ${o}`),decompressSourceData(e),assert(e.children,"If `source` is an object, it must have a `children` property"),e.types&&(s.logInfo("Redefine types",e.columns),s.setTypes(e.types,!1),delete e.types),e.columns&&(s.logInfo("Redefine columns",e.columns),s.columns=e.columns,delete e.columns,s.update(ChangeType.colStructure)),this.addChildren(e.children);for(const[t,i]of Object.entries(e))RESERVED_TREE_SOURCE_KEYS.has(t)||(s.data[t]=i);"hier"===s.options.selectMode&&this.fixSelection3FromEndNodes(),this.resetNativeChildOrder(),this._callEvent("load")}async _fetchWithOptions(e){var t,i;let s,n,o,r,l,a={};"string"==typeof e?(s=e,a.method="GET"):isPlainObject(e)?(({url:s,params:n,body:o,options:r,...l}=e),assert(!l||0===Object.keys(l).length,`Unexpected source properties: ${Object.keys(l)}. Use 'options' instead.`),assert("string"==typeof s,"expected source.url as string"),isPlainObject(r)&&(a=r),isPlainObject(o)&&(assert(!a.body,"options.body should be passed as source.body"),a.body=JSON.stringify(a.body),null!==(t=a.method)&&void 0!==t||(a.method="POST")),isPlainObject(n)&&(s+="?"+new URLSearchParams(n),null!==(i=a.method)&&void 0!==i||(a.method="GET"))):(s="",error(`Unsupported source format: ${e}`)),this.setStatus(NodeStatusType.loading);const d=await fetch(s,a);return d.ok||error(`GET ${s} returned ${d.status}, ${d}`),await d.json()}async load(e){const t=this.tree,i=Date.now(),s=this.parent,n=Date.now();let o=0,r=0,l=0;this._requestId&&this.logWarn(`Recursive load request #${i} while #${this._requestId} is pending. The previous request will be ignored.`),this._requestId=i;try{if("string"==typeof e?e:e.url){const t=await this._fetchWithOptions(e);if(r=Date.now()-n,this._requestId&&this._requestId>i)return void this.logWarn(`Ignored load response #${i} because #${this._requestId} is pending.`);if(this.logDebug(`Received response for load request #${i}`),null===this.parent&&null!==s)return void this.logWarn("Lazy parent node was removed while loading: discarding response.");this.setStatus(NodeStatusType.ok);const o=Date.now();this._loadSourceObject(t),l=Date.now()-o}else{if("function"==typeof e.then){const i=t.logTime(`Resolve thenable ${e}`);e=await Promise.resolve(e),t.logTimeEnd(i)}this._loadSourceObject(e),l=Date.now()-n}}catch(t){throw this.logError("Error during load()",e,t),this._callEvent("error",{error:t}),this.setStatus(NodeStatusType.error,{message:""+t}),t}finally{this._requestId=0,o=Date.now()-n,t.options.debugLevel>=3&&t.logInfo(`Load source took ${o/1e3} seconds (transfer: ${r/1e3}s, processing: ${l/1e3}s)`)}}async loadLazy(e=!1){const t=this.expanded;if(assert(this.lazy,"load() requires a lazy node"),e||this.isUnloaded())if(this.isLoading())this.logWarn("loadLazy() called while already loading: ignored.");else{this.isLoaded()&&this.resetLazy(),this.setStatus(NodeStatusType.loading);try{const e=await this._callEvent("lazyLoad");if(!1===e)return void this.setStatus(NodeStatusType.ok);assert(isArray(e)||e&&e.url,"The lazyLoad event must return a node list, `{url: ...}`, or false."),await this.load(e),this.setStatus(NodeStatusType.ok),t?(this.expanded=!0,this.tree.update(ChangeType.structure)):this.update()}catch(e){this.logError("Error during loadLazy()",e),this._callEvent("error",{error:e}),this.setStatus(NodeStatusType.error,{message:""+e})}}}log(...e){this.tree.options.debugLevel>=4&&console.log(this.toString(),...e)}logDebug(...e){this.tree.options.debugLevel>=4&&console.debug(this.toString(),...e)}logError(...e){this.tree.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.tree.options.debugLevel>=3&&console.info(this.toString(),...e)}logWarn(...e){this.tree.options.debugLevel>=2&&console.warn(this.toString(),...e)}async makeVisible(e){let t;const i=new Deferred,s=[],n=this.getParentList(!1,!1),o=n.length,r=getOption(e,"noAnimation",!1),l=getOption(e,"scrollIntoView",!0);for(t=o-1;t>=0;t--){const e={noAnimation:r};s.push(n[t].setExpanded(!0,e))}return Promise.all(s).then((()=>{l&&this.tree?(this.tree.updatePendingModifications(),this.scrollIntoView().then((()=>{i.resolve()}))):i.resolve()})),i.promise()}moveTo(e,t="appendChild",i){let s;"over"===t&&(t="appendChild"),"prependChild"===t&&(e.children&&e.children.length?(t="before",e=e.children[0]):t="appendChild");const n=this.tree,o=this.parent,r="appendChild"===t?e:e.parent;if(this!==e){if(this.parent?r.isDescendantOf(this)&&error("Cannot move a node to its own descendant"):error("Cannot move system root"),r!==o&&o.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===r)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else s=this.parent.children.indexOf(this),assert(s>=0,"invalid source parent"),this.parent.children.splice(s,1);if(this.parent=r,r.hasChildren())switch(t){case"appendChild":r.children.push(this);break;case"before":s=r.children.indexOf(e),assert(s>=0,"invalid target parent"),r.children.splice(s,0,this);break;case"after":s=r.children.indexOf(e),assert(s>=0,"invalid target parent"),r.children.splice(s+1,0,this);break;default:error(`Invalid mode '${t}'.`)}else r.children=[this];i&&e.visit(i,!0),r===o?r.triggerModifyChild("move",this):r.triggerModifyChild("add",this),n!==e.tree&&(this.logWarn("Cross-tree moveTo is experimental!"),this.visit((t=>{t.tree=e.tree}),!0)),setTimeout((()=>{n.update(ChangeType.any)}),0)}}async navigate(e,t){var i;const s=null!==(i=KEY_TO_NAVIGATION_MAP[e])&&void 0!==i?i:e,n=this.findRelatedNode(s);if(!n)return this.logWarn(`Could not find related node '${e}'.`),Promise.resolve(this);try{n.makeVisible({scrollIntoView:!1})}catch(e){}return n.setFocus(),!1===(null==t?void 0:t.activate)?Promise.resolve(this):n.setActive(!0,{event:null==t?void 0:t.event})}remove(){const e=this.tree,t=this.parent.children.indexOf(this);this.triggerModify("remove"),this.parent.children.splice(t,1),this.visit((t=>{t.removeMarkup(),e._unregisterNode(t)}),!0),e.update(ChangeType.structure)}removeChildren(){var e,t;const i=this.tree;this.children&&((null===(e=i.activeNode)||void 0===e?void 0:e.isDescendantOf(this))&&i.activeNode.setActive(!1),(null===(t=i.focusNode)||void 0===t?void 0:t.isDescendantOf(this))&&i._setFocusNode(null),this.triggerModifyChild("remove",null),this.visit((e=>{i._unregisterNode(e)})),this.lazy?this.children=[]:this.children=null,this.isRootNode()||(this.expanded=!1),this.tree.update(ChangeType.structure))}removeMarkup(){this._rowElem&&(delete this._rowElem._wb_node,this._rowElem.remove(),this._rowElem=void 0)}_getRenderInfo(){const e={},t={},i=this.isColspan(),s=this._rowElem?this._rowElem.querySelectorAll("span.wb-col"):null;let n=0;for(const o of this.tree.columns)e[o.id]={id:o.id,idx:n,elem:s?s[n]:null,info:o},i||"*"===o.id||(t[o.id]=e[o.id]),n++;return{allColInfosById:e,renderColInfosById:t}}_createIcon(e,t,i){const s=this.tree._createNodeIcon(this,i,!0);return s&&(t?e.replaceChild(s,t):e.appendChild(s)),s}_render_markup(e){const t=this.tree,i=t.options,s=i.rowHeightPx,n=this.getOption("checkbox"),o=t.columns,r=this.getLevel(),l=t.isRowNav()?null:t.activeColIdx;let a,d=this._rowElem,c=null,h=null;const u=!d;assert(u,"Expected unrendered node"),assert(!u||e&&e.after,"opts.after expected, unless updating"),assert(!this.isRootNode(),"Root node not allowed"),d=document.createElement("div"),d.classList.add("wb-row"),d.style.top=this._rowIdx*s+"px",this._rowElem=d,d._wb_node=this;const p=document.createElement("span");p.classList.add("wb-node","wb-col"),d.appendChild(p);let f=0;n&&(c=document.createElement("i"),c.classList.add("wb-checkbox"),("radio"===n||this.parent.radiogroup)&&c.classList.add("wb-radio"),p.appendChild(c),f+=20);for(let e=r-1;e>0;e--)a=document.createElement("i"),a.classList.add("wb-indent"),p.appendChild(a),f+=20;(!i.minExpandLevel||r>i.minExpandLevel)&&(h=document.createElement("i"),h.classList.add("wb-expander"),p.appendChild(h),f+=20);this._createIcon(p,null,!h)&&(f+=20);const g=document.createElement("span");g.classList.add("wb-title"),p.appendChild(g),p._ofsTitlePx=f,t.options.dnd.dragStart&&(p.draggable=!0);if(!this.isColspan()&&o.length>1){let e=0;for(const t of o){let i;e++,"*"===t.id?i=p:(i=document.createElement("span"),i.classList.add("wb-col"),d.appendChild(i)),e===l&&i.classList.add("wb-active"),t.classes&&i.classList.add(...t.classes.split(" ")),i.style.left=t._ofsPx+"px",i.style.width=t._widthPx+"px",u&&t.html&&"string"==typeof t.html&&(i.innerHTML=t.html)}}switch(e?e.after:"last"){case"first":t.nodeListElement.prepend(d);break;case"last":t.nodeListElement.appendChild(d);break;default:e.after.after(d)}e.isNew=!0,this._render_data(e)}_render_data(e){assert(this._rowElem,"No _rowElem");const t=this.tree,i=t.options,s=this._rowElem,n=!!e.isNew,o=!!e.preventScroll,r=t.columns,l=this.isColspan(),a=s.querySelector("span.wb-node"),d=a.querySelector("span.wb-title"),c=t.element.scrollTop;this.titleWithHighlight?d.innerHTML=this.titleWithHighlight:d.textContent=this.title;const h=this.getOption("tooltip",!1);if(h&&(d.title=!0===h?this.title:h),o&&(t.element.scrollTop=c),!i.skeleton)if(l){const e=t.element.clientWidth;d.style.width=e-a._ofsTitlePx-7+"px"}else d.style.width=r[0]._widthPx-a._ofsTitlePx-7+"px";if(e.isDataChange=!0,this._render_status(e),this.statusNodeType)this._callEvent("renderStatusNode",{isNew:n,nodeElem:a,isColspan:l});else if(this.parent){const e=this._getRenderInfo();this._callEvent("render",{isNew:n,nodeElem:a,isColspan:l,allColInfosById:e.allColInfosById,renderColInfosById:e.renderColInfosById})}}_render_status(e){const t=this.tree,i=t.iconMap,s=t.options,n=this.type?t.types[this.type]:null,o=this._rowElem,r=o.querySelector("span.wb-node"),l=r.querySelector("i.wb-expander"),a=r.querySelector("i.wb-checkbox"),d=["wb-row"];if(this.expanded&&d.push("wb-expanded"),this.lazy&&d.push("wb-lazy"),this.selected&&d.push("wb-selected"),this._partsel&&d.push("wb-partsel"),this===t.activeNode&&d.push("wb-active"),this===t.focusNode&&d.push("wb-focus"),this._errorInfo&&d.push("wb-error"),this._isLoading&&d.push("wb-loading"),this.isColspan()&&d.push("wb-colspan"),this.statusNodeType&&d.push("wb-status-"+this.statusNodeType),this.match&&d.push("wb-match"),this.subMatchCount&&d.push("wb-submatch"),s.skeleton&&d.push("wb-skeleton"),o.className=d.join(" "),this.classes&&o.classList.add(...this.classes),n&&n.classes&&o.classList.add(...n.classes),l){let e=null;this._isLoading?e=i.loading:this.isExpandable(!1)?e=this.expanded?i.expanderExpanded:i.expanderCollapsed:this.lazy&&null==this.children&&(e=i.expanderLazy),null==e?l.classList.add("wb-indent"):TEST_IMG.test(e)?l.style.backgroundImage=`url('${e}')`:l.className="wb-expander "+e}if(a){let e="wb-checkbox ";this.isRadio()?(e+="wb-radio ",this.selected?e+=i.radioChecked:e+=i.radioUnchecked):this.selected?e+=i.checkChecked:this._partsel?e+=i.checkUnknown:e+=i.checkUnchecked,a.className=e}if(!e.isNew){let e=0;for(const i of o.children)i.classList.toggle("wb-active",e++===t.activeColIdx),i.classList.remove("wb-error","wb-invalid");const i=r.querySelector("i.wb-icon");i&&this._createIcon(r,i,!l)}if(!1!==e.resizeCols&&!this.isColspan()){const e=o.querySelectorAll("span.wb-col");let t=0,i=0;for(const s of this.tree.columns){const n=e[t];n.style.left=`${i}px`,n.style.width=`${s._widthPx}px`,t++,i+=s._widthPx}}}_render(e){const t=Object.assign({change:ChangeType.data},e);switch(this._rowElem||(t.change=ChangeType.row),t.change){case"status":this._render_status(t);break;case"data":this._render_data(t);break;case"row":this._render_markup(t);break;default:error(`Invalid change type '${t.change}'.`)}}resetLazy(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=null,this.tree.update(ChangeType.structure)}toDict(e=!1,t){const i={};if(NODE_DICT_PROPS.forEach((e=>{const t=this[e];t instanceof Set?t.size&&(i[e]=Array.prototype.join.call(t.keys()," ")):(t||!1===t||0===t)&&(i[e]=t)})),isEmptyObject(this.data)||(i.data=extend({},this.data),isEmptyObject(i.data)&&delete i.data),t){const s=t(i,this);if(!1===s)return!1;"skip"===s&&(e=!1)}if(e&&isArray(this.children)){i.children=[];for(let e=0,s=this.children.length;e<s;e++){const s=this.children[e];if(!s.isStatusNode()){const e=s.toDict(!0,t);!1!==e&&i.children.push(e)}}}return i}getOption(e,t){const i=this.tree;let s=i.options;e.indexOf(".")>=0&&([s,e]=e.split("."));const n=s[e];if("function"==typeof n){const e=n.call(i,{type:"resolve",tree:i,node:this});if(void 0!==e)return e}if(void 0!==this[e])return this[e];const o=this.type?i.types[this.type]:void 0,r=o?o[e]:void 0;return void 0!==r?r:null!=n?n:t}async scrollIntoView(e){const t=Object.assign({node:this},e);return this.tree.scrollTo(t)}async setActive(e=!0,t){const i=this.tree,s=i.getActiveNode(),n=null==t?void 0:t.retrigger,o=null==t?void 0:t.focusTree,r=null==t?void 0:t.noEvents,l=null==t?void 0:t.event,a=null==t?void 0:t.colIdx,d=null==t?void 0:t.edit;if(assert(!d||null!=a,"edit requires colIdx"),!r)if(e){if(s!==this||n){if(!1===(null==s?void 0:s._callEvent("deactivate",{nextNode:this,event:l}))||!1===this._callEvent("beforeActivate",{prevNode:s,event:l}))return;i._setActiveNode(null),null==s||s.update(ChangeType.status)}}else(s===this||n)&&this._callEvent("deactivate",{nextNode:null,event:l});return s!==this&&(e&&i._setActiveNode(this),null==s||s.update(ChangeType.status),this.update(ChangeType.status)),this.makeVisible().then((()=>{e&&((o||d)&&(i.setFocus(),i._setFocusNode(this),i.focusNode.setFocus()),null!=a&&i.isCellNav()&&i.setColumn(a,{edit:d}),r||this._callEvent("activate",{prevNode:s,event:l}))}))}async setExpanded(e=!0,t){const{force:i,scrollIntoView:s,immediate:n,resetLazy:o}=null!=t?t:{},r=!(null==t?void 0:t.noEvents);if(!e&&this.isExpanded()&&this.getLevel()<=this.tree.getOption("minExpandLevel")&&!i)return void this.logDebug("Ignored collapse request below minExpandLevel.");if(!e==!this.expanded)return;if(r&&!1===this._callEvent("beforeExpand",{flag:e}))return;e&&this.getOption("autoCollapse")&&this.collapseSiblings(t),e&&this.lazy&&null==this.children?await this.loadLazy():!e&&o&&this.lazy&&this.children&&this.resetLazy(),this.expanded=e;const l={immediate:n};if(this.tree.update(ChangeType.structure,l),e&&s){const e=this.getLastChild();e&&(this.tree.updatePendingModifications(),e.scrollIntoView({topNode:this}))}r&&this._callEvent("expand",{flag:e})}setFocus(e=!0){assert(!!e,"Blur is not yet implemented");const t=this.tree.focusNode;this.tree._setFocusNode(this),null==t||t.update(),this.update()}setIcon(e){this.icon=e,this.update()}setKey(e,t){throw new Error("Not yet implemented")}update(e=ChangeType.data){assert(e===ChangeType.status||e===ChangeType.data,`Invalid change type ${e}`),this.tree.update(e,this)}getSelectedNodes(e=!1){const t=[];return this.visit((i=>{if(i.selected&&(t.push(i),!0===e))return"skip"})),t}toggleSelected(e){let t=this.isSelected();return t=void 0!==t||this.isRadio()?!t:this._anySelectable(),this.setSelected(t,e)}_anySelectable(){let e=!1;return this.visit((t=>{if(!1===t.selected&&!t.unselectable&&!t.hasChildren()&&!t.parent.radiogroup)return e=!0,!1})),e}_changeSelectStatusProps(e){let t=!1;switch(e){case!1:t=this.selected||this._partsel,this.selected=!1,this._partsel=!1;break;case!0:t=!this.selected||!this._partsel,this.selected=!0,this._partsel=!0;break;case void 0:t=this.selected||!this._partsel,this.selected=!1,this._partsel=!!this.hasChildren();break;default:error(`Invalid state: ${e}`)}return t&&this.update(),t}fixSelection3AfterClick(e){const t=!!(null==e?void 0:e.force),i=this.isSelected();this.visit((e=>{if(e.radiogroup)return"skip";!t&&e.getOption("unselectable")||e._changeSelectStatusProps(i)})),this.fixSelection3FromEndNodes()}fixSelection3FromEndNodes(e){const t=!!(null==e?void 0:e.force);assert("hier"===this.tree.options.selectMode,"expected selectMode 'hier'");const i=e=>{let s;const n=e.children;if(n&&n.length){let e=!0,t=!1;for(let s=0,o=n.length;s<o;s++){const o=n[s],r=i(o);!1!==r&&(t=!0),!0!==r&&(e=!1)}s=!!e||!!t&&void 0}else s=!!e.selected;return e._partsel&&!e.selected&&e.lazy&&null==e.children&&(s=void 0),!t&&e.getOption("unselectable")||e._changeSelectStatusProps(s),s};i(this),this.visitParents((e=>{let t;const i=e.children;let s=!0,n=!1;for(let e=0,o=i.length;e<o;e++){const o=i[e];t=!!o.selected,(t||o._partsel)&&(n=!0),t||(s=!1)}t=!!s||!!n&&void 0,e._changeSelectStatusProps(t)}))}setSelected(e=!0,t){const i=this.tree,s=!(null==t?void 0:t.noEvents),n=this.isSelected(),o=this.parent&&this.parent.radiogroup,r=i.options.selectMode,l=(null==t?void 0:t.force)||!this.getOption("unselectable");return e=!!e,l?(null==t?void 0:t.propagateDown)&&"multi"===r?(i.runWithDeferredUpdate((()=>{this.visit((t=>{t.setSelected(e)}))})),n):(e===n||s&&!1===this._callEvent("beforeSelect",{flag:e})||(i.runWithDeferredUpdate((()=>{if(o){if(!e&&!(null==t?void 0:t.force))return n;for(const e of this.parent.children)e.selected=e===this}else this.selected=e,"hier"===r?this.fixSelection3AfterClick():"single"===r&&i.visit((e=>{e.selected=!1}))})),s&&this._callEvent("select",{flag:e})),n):n}setStatus(e,t){const i=this.tree,s=null==t?void 0:t.message,n=null==t?void 0:t.details;let o=null;const r=e=>{const t=this.children,s=t?t[0]:null;return assert(e.statusNodeType,"Not a status node"),assert(!s||!s.isStatusNode(),"Child must not be a status node"),o=this.addNode(e,"prependChild"),o.match=-1,i.update(ChangeType.structure),o};switch((()=>{const e=this.children;e&&e.length&&e[0].isStatusNode()&&e[0].remove()})(),e){case"ok":this._isLoading=!1,this._errorInfo=null;break;case"loading":this._isLoading=!0,this._errorInfo=null,this.parent?this.update(ChangeType.status):r({statusNodeType:e,title:i.options.strings.loading+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n});break;case"error":r({statusNodeType:e,title:i.options.strings.loadError+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo={message:s,details:n};break;case"noData":r({statusNodeType:e,title:s||i.options.strings.noData,checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo=null;break;default:error("invalid node status "+e)}return i.update(ChangeType.structure),o}setTitle(e){this.title=e,this.update()}setTooltip(e){this.tooltip=e,this.update()}_sortChildren(e,t){const i=this.children;if(i&&(i.sort(e),t))for(let s=0,n=i.length;s<n;s++)i[s].children&&i[s]._sortChildren(e,t)}sortChildren(e=nodeTitleSorter,t=!1){this._sortChildren(e||nodeTitleSorter,t),this.tree.update(ChangeType.structure)}resetNativeChildOrder(e){const{recursive:t=!0,propName:i="_nativeIndex"}=null!=e?e:{};this.children&&this.children.forEach(((s,n)=>{s.data[i]=n,t&&s.children&&s.resetNativeChildOrder(e)}))}sortByProperty(e){var t,i,s;const{caseInsensitive:n=!0,deep:o=!0,nativeOrderPropName:r="_nativeIndex",updateColInfo:l=!1}=e;let a,d;if(l){d=this.tree._columnsById[e.colId],assert(d,`Invalid colId specified: ${e.colId}`),a=null!==(t=e.order)&&void 0!==t?t:rotate(d.sortOrder,["asc","desc",void 0]);for(const e of this.tree.columns)e.sortOrder=e===d?a:void 0;this.tree.update(ChangeType.colStructure)}else a=null!==(i=e.order)&&void 0!==i?i:"asc";let c=null!==(s=e.propName)&&void 0!==s?s:e.colId||"";"*"===c&&(c="title"),null==a&&(c=r,a="asc"),this.logDebug(`sortByProperty(), propName=${c}, ${a}`,e),assert(c,"No property name specified");return this.sortChildren(((e,t)=>{let i,s;return NODE_DICT_PROPS.has(c)?(i=e[c],s=t[c]):(i=e.data[c],s=t.data[c]),null==i&&null==s?0:(null==i?i="string"==typeof s?"":0:"boolean"==typeof i&&(i=i?1:0),null==s?s="string"==typeof i?"":0:"boolean"==typeof s&&(s=s?1:0),n&&("string"==typeof i&&(i=i.toLowerCase()),"string"==typeof s&&(s=s.toLowerCase())),"desc"===a?i===s?0:i>s?-1:1:i===s?0:i>s?1:-1)}),o)}triggerModifyChild(e,t,i){this.logDebug(`modifyChild(${e})`,i,t),this.tree.options.modifyChild&&(t&&t.parent!==this&&error("child "+t+" is not a child of "+this),this._callEvent("modifyChild",extend({operation:e,child:t},i)))}triggerModify(e,t){this.parent.triggerModifyChild(e,this,t)}visit(e,t=!1){let i=!0;const s=this.children;if(!0===t&&(i=e(this),!1===i||"skip"===i))return i;if(s)for(let t=0,n=s.length;t<n&&(i=s[t].visit(e,!0),!1!==i);t++);return i}visitParents(e,t=!1){if(t&&!1===e(this))return!1;let i=this.parent;for(;i;){if(!1===e(i))return!1;i=i.parent}return!0}visitSiblings(e,t=!1){const i=this.parent.children;for(let s=0,n=i.length;s<n;s++){const n=i[s];if((t||n!==this)&&!1===e(n))return!1}return!0}isMatched(){return!(this.tree.filterMode&&!this.match)}}WunderbaumNode.sequence=0;
66
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
67
+ */const NODE_PROPS=new Set(["checkbox","classes","expanded","icon","iconTooltip","key","lazy","_partsel","radiogroup","refKey","selected","statusNodeType","title","tooltip","type","unselectable"]),NODE_DICT_PROPS=new Set(NODE_PROPS);NODE_DICT_PROPS.delete("_partsel"),NODE_DICT_PROPS.delete("unselectable");class WunderbaumNode{constructor(e,t,i){var s;this.refKey=void 0,this.children=null,this.classes=null,this.data={},this._isLoading=!1,this._requestId=0,this._errorInfo=null,this._partsel=!1,this._partload=!1,this.subMatchCount=0,this._rowIdx=0,this._rowElem=void 0,assert(!t||t.tree===e,`Invalid parent: ${t}`),assert(!i.children,"'children' not allowed here"),this.tree=e,this.parent=t,this.key=e._calculateKey(i,t),this.title=""+(null!==(s=i.title)&&void 0!==s?s:"<"+this.key+">"),this.expanded=!!i.expanded,this.lazy=!!i.lazy,null!=i.refKey&&(this.refKey=""+i.refKey),null!=i.type&&(this.type=""+i.type),null!=i.icon&&(this.icon=intToBool(i.icon)),null!=i.tooltip&&(this.tooltip=intToBool(i.tooltip)),null!=i.iconTooltip&&(this.iconTooltip=intToBool(i.iconTooltip)),null!=i.statusNodeType&&(this.statusNodeType=""+i.statusNodeType),null!=i.colspan&&(this.colspan=!!i.colspan),null!=i.checkbox&&(this.checkbox=intToBool(i.checkbox)),null!=i.radiogroup&&(this.radiogroup=!!i.radiogroup),null!=i.selected&&(this.selected=!!i.selected),null!=i.unselectable&&(this.unselectable=!!i.unselectable),i.classes&&this.setClass(i.classes);for(const[e,t]of Object.entries(i))NODE_PROPS.has(e)||(this.data[e]=t);t&&!this.statusNodeType&&e._registerNode(this)}toString(){return`WunderbaumNode@${this.key}<'${this.title}'>`}*[Symbol.iterator](){const e=this.children;if(e)for(let t=0,i=e.length;t<i;t++){const i=e[t];yield i,i.children&&(yield*i)}}_callEvent(e,t){var i;return null===(i=this.tree)||void 0===i?void 0:i._callEvent(e,extend({node:this,typeInfo:this.type?this.tree.types[this.type]:{}},t))}addChildren(e,t){const i=this.tree;let{before:s=null,applyMinExpanLevel:n=!0,_level:r}=null!=t?t:{};null!=r||(r=this.getLevel());const o=[];try{i.enableUpdate(!1),isPlainObject(e)&&(e=[e]);const t=n&&r<i.options.minExpandLevel;for(const s of e){const e=s.children;delete s.children;const n=new WunderbaumNode(i,this,s);null!=e&&(s.children=e),t&&!n.isUnloaded()&&(n.expanded=!0),o.push(n),e&&n.addChildren(e,{_level:r+1})}if(this.children)if(null==s||0===this.children.length)this.children=this.children.concat(o);else{s=this.findDirectChild(s);const e=this.children.indexOf(s);assert(e>=0,`options.before must be a direct child of ${this}`),this.children.splice(e,0,...o)}else this.children=o;i.update(ChangeType.structure)}finally{i.enableUpdate(!0)}return o[0]}addNode(e,t="appendChild"){switch("over"===t&&(t="appendChild"),t){case"after":return this.parent.addChildren(e,{before:this.getNextSibling()});case"before":return this.parent.addChildren(e,{before:this});case"prependChild":return this.addChildren(e,{before:0});case"appendChild":return this.addChildren(e)}assert(!1,`Invalid mode: ${t}`)}applyCommand(e,t){return this.tree.applyCommand(e,this,t)}collapseSiblings(e){for(const t of this.parent.children)t!==this&&t.expanded&&t.setExpanded(!1,e)}setClass(e,t=!0){const i=toSet(e);if(t)null===this.classes&&(this.classes=new Set),i.forEach(e=>{var i;this.classes.add(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)});else{if(null===this.classes)return;i.forEach(e=>{var i;this.classes.delete(e),null===(i=this._rowElem)||void 0===i||i.classList.toggle(e,t)}),0===this.classes.size&&(this.classes=null)}}startEditTitle(){this.tree._callMethod("edit.startEditTitle",this)}async expandAll(e=!0,t){const i=this.tree,{collapseOthers:s,deep:n,depth:r,force:o,keepActiveNodeVisible:l=!0,loadLazy:a,resetLazy:d}=null!=t?t:{},c=this.tree.options.minExpandLevel||null,h=null!=r?r:o?null:c,u={deep:n,force:o,loadLazy:a,resetLazy:d,scrollIntoView:!1};this.logInfo(`expandAll(${e}, depth=${r}, minLevel=${h})`),assert(!(e&&null!=n&&!s),"Expanding with `deep` option is not supported (implied by the `depth` option).");const p=i.logTime(`${this}.expandAll(${e}, depth=${r})`);try{i.enableUpdate(!1),await async function t(i,s){var o;const l=[];return null===(o=i.children)||void 0===o||o.forEach(i=>{if(e)if(!i.expanded&&(null==h||s<h)&&(i.children||a&&i.lazy)){const e=i.setExpanded(!0,u);l.push(e),null==r&&e.then(async()=>{await t(i,s+1)})}else l.push(t(i,s+1));else(null==h||s>=h)&&i.setExpanded(!1,u),(null!=h&&s<h||n)&&t(i,s+1)}),new Promise(e=>{Promise.all(l).then(()=>{e(!0)})})}(this,0),s&&(assert(e,"Option `collapseOthers` requires flag=true"),assert(null!=h,"Option `collapseOthers` requires `depth` or `minExpandLevel`"),this.expandAll(!1,{depth:h}))}finally{i.enableUpdate(!0),i.logTimeEnd(p)}i.activeNode&&l&&i.activeNode.scrollIntoView()}findAll(e){const t="function"==typeof e?e:makeNodeTitleMatcher(e),i=[];return this.visit(e=>{t(e)&&i.push(e)}),i}findDirectChild(e){const t=this.children;if(!t)return null;if("string"==typeof e){for(let i=0,s=t.length;i<s;i++)if(t[i].key===e)return t[i]}else{if("number"==typeof e)return t[e];if(e.parent===this)return e}return null}findFirst(e){const t="function"==typeof e?e:makeNodeTitleMatcher(e);let i=null;return this.visit(e=>{if(t(e))return i=e,!1}),i}findRelatedNode(e,t=!1){return this.tree.findRelatedNode(this,e,t)}*format_iter(e,t){function i(e){const t=e.parent.children;return e===t[t.length-1]}null!=t||(t=[" "," | "," ╰─ "," ├─ "]),null!=e||(e=e=>""+e);const s=s=>{const n=[e(s)];n.unshift(t[i(s)?2:3]);let r=s.parent;for(;r&&r!==this;)n.unshift(t[i(r)?0:1]),r=r.parent;return n.join("")};yield e(this);for(const e of this)yield s(e)}format(e,t){const i=[];for(const s of this.format_iter(e,t))i.push(s);return i.join("\n")}getColElem(e){var t;"string"==typeof e&&(e=this.tree.columns.findIndex(t=>t.id===e));const i=null===(t=this._rowElem)||void 0===t?void 0:t.querySelectorAll("span.wb-col");return i?i[e]:null}getCloneList(e=!1){if(!this.refKey)return[];const t=this.tree.findByRefKey(this.refKey);return e?t:[...t].filter(e=>e!==this)}getFirstChild(){return this.children?this.children[0]:null}getLastChild(){return this.children?this.children[this.children.length-1]:null}getLevel(){let e=0,t=this.parent;for(;t;)e++,t=t.parent;return e}getNextSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t+1]||null}getParent(){return this.parent}getParentList(e=!1,t=!1){const i=[];let s=t?this:this.parent;for(;s;)(e||s.parent)&&i.unshift(s),s=s.parent;return i}getPath(e=!0,t="title",i="/"){let s;const n=[],r="function"==typeof t;return this.visitParents(e=>{e.parent&&(s=r?t(e):e[t],n.unshift(s))},e),n.join(i)}getPrevSibling(){const e=this.parent.children,t=e.indexOf(this);return e[t-1]||null}hasChildren(){if(this.lazy){if(null==this.children)return;if(0===this.children.length)return!1;if(1===this.children.length&&this.children[0].isStatusNode())return;return!0}return!(!this.children||!this.children.length)}hasClass(e){return!!this.classes&&this.classes.has(e)}hasFocus(){return this.tree.focusNode===this}isActive(){return this.tree.activeNode===this}isAncestorOf(e){return e&&e.isDescendantOf(this)}isChildOf(e){return e&&this.parent===e}isClone(){return!!this.refKey&&this.tree.findByRefKey(this.refKey).length>1}isColspan(){return!!this.getOption("colspan")}isDescendantOf(e){if(!e||e.tree!==this.tree)return!1;let t=this.parent;for(;t;){if(t===e)return!0;t===t.parent&&error(`Recursive parent link: ${t}`),t=t.parent}return!1}isExpandable(e=!1){return!(e&&this.expanded||!1===this.children)&&(null==this.children?!!this.lazy:0!==this.children.length||!!this.tree.options.emptyChildListExpandable)}isEditingTitle(){return this.tree._callMethod("edit.isEditingTitle",this)}isExpanded(){return!!this.expanded}isFirstSibling(){const e=this.parent;return!e||e.children[0]===this}isLastSibling(){const e=this.parent;return!e||e.children[e.children.length-1]===this}isLazy(){return!!this.lazy}isLoaded(){return!this.lazy||void 0!==this.hasChildren()}isLoading(){return this._isLoading}isPagingNode(){return"paging"===this.statusNodeType}isParentOf(e){return e&&e.parent===this}isPartload(){return!!this._partload}isPartsel(){return!this.selected&&!!this._partsel}isRadio(){return!!this.parent.radiogroup||"radio"===this.getOption("checkbox")}isRendered(){return!!this._rowElem}isRootNode(){return this.tree.root===this}isSelected(){return!!this.selected||!!this._partsel&&void 0}isStatusNode(){return!!this.statusNodeType}isTopLevel(){return this.tree.root===this.parent}isUnloaded(){return void 0===this.hasChildren()}isVisible(){const e="hide"===this.tree.filterMode,t=this.getParentList(!1,!1);if(e&&!this.match&&!this.subMatchCount)return!1;for(let e=0,i=t.length;e<i;e++){if(!t[e].expanded)return!1}return!0}_loadSourceObject(e,t){var i;const s=this.tree;null!=t||(t=this.getLevel());const n=this._callEvent("receive",{response:e});null!=n&&(e=n),isArray(e)&&(e={children:e}),assert(isPlainObject(e),`Expected an array or plain object: ${e}`);const r=null!==(i=e.format)&&void 0!==i?i:"nested";assert("nested"===r||"flat"===r,`Expected source.format = 'nested' or 'flat': ${r}`),decompressSourceData(e),assert(e.children,"If `source` is an object, it must have a `children` property"),e.types&&(s.logInfo("Redefine types",e.columns),s.setTypes(e.types,!1),delete e.types),e.columns&&(s.logInfo("Redefine columns",e.columns),s.columns=e.columns,delete e.columns,s.update(ChangeType.colStructure)),this.addChildren(e.children);for(const[t,i]of Object.entries(e))RESERVED_TREE_SOURCE_KEYS.has(t)||(s.data[t]=i);"hier"===s.options.selectMode&&this.fixSelection3FromEndNodes(),this.resetNativeChildOrder(),this._callEvent("load")}async _fetchWithOptions(e){var t,i;let s,n,r,o,l,a={};"string"==typeof e?(s=e,a.method="GET"):isPlainObject(e)?(({url:s,params:n,body:r,options:o,...l}=e),assert(!l||0===Object.keys(l).length,`Unexpected source properties: ${Object.keys(l)}. Use 'options' instead.`),assert("string"==typeof s,"expected source.url as string"),isPlainObject(o)&&(a=o),isPlainObject(r)&&(assert(!a.body,"options.body should be passed as source.body"),a.body=JSON.stringify(a.body),null!==(t=a.method)&&void 0!==t||(a.method="POST")),isPlainObject(n)&&(s+="?"+new URLSearchParams(n),null!==(i=a.method)&&void 0!==i||(a.method="GET"))):(s="",error(`Unsupported source format: ${e}`)),this.setStatus(NodeStatusType.loading);const d=await fetch(s,a);return d.ok||error(`GET ${s} returned ${d.status}, ${d}`),await d.json()}async load(e){const t=this.tree,i=Date.now(),s=this.parent,n=Date.now();let r=0,o=0,l=0;this._requestId&&this.logWarn(`Recursive load request #${i} while #${this._requestId} is pending. The previous request will be ignored.`),this._requestId=i;try{if("string"==typeof e?e:e.url){const t=await this._fetchWithOptions(e);if(o=Date.now()-n,this._requestId&&this._requestId>i)return void this.logWarn(`Ignored load response #${i} because #${this._requestId} is pending.`);if(this.logDebug(`Received response for load request #${i}`),null===this.parent&&null!==s)return void this.logWarn("Lazy parent node was removed while loading: discarding response.");this.setStatus(NodeStatusType.ok);const r=Date.now();this._loadSourceObject(t),l=Date.now()-r}else{if("function"==typeof e.then){const i=t.logTime(`Resolve thenable ${e}`);e=await Promise.resolve(e),t.logTimeEnd(i)}this._loadSourceObject(e),l=Date.now()-n}}catch(t){throw this.logError("Error during load()",e,t),this._callEvent("error",{error:t}),this.setStatus(NodeStatusType.error,{message:""+t}),t}finally{this._requestId=0,r=Date.now()-n,t.options.debugLevel>=3&&t.logInfo(`Load source took ${r/1e3} seconds (transfer: ${o/1e3}s, processing: ${l/1e3}s)`)}}async loadLazy(e=!1){const t=this.expanded;if(assert(this.lazy,"load() requires a lazy node"),e||this.isUnloaded())if(this.isLoading())this.logWarn("loadLazy() called while already loading: ignored.");else{this.isLoaded()&&this.resetLazy(),this.setStatus(NodeStatusType.loading);try{const e=await this._callEvent("lazyLoad");if(!1===e)return void this.setStatus(NodeStatusType.ok);assert(isArray(e)||e&&e.url,"The lazyLoad event must return a node list, `{url: ...}`, or false."),await this.load(e),this.setStatus(NodeStatusType.ok),t?(this.expanded=!0,this.tree.update(ChangeType.structure)):this.update()}catch(e){this.logError("Error during loadLazy()",e),this._callEvent("error",{error:e}),this.setStatus(NodeStatusType.error,{message:""+e})}}}log(...e){this.tree.options.debugLevel>=4&&console.log(this.toString(),...e)}logDebug(...e){this.tree.options.debugLevel>=4&&console.debug(this.toString(),...e)}logError(...e){this.tree.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.tree.options.debugLevel>=3&&console.info(this.toString(),...e)}logWarn(...e){this.tree.options.debugLevel>=2&&console.warn(this.toString(),...e)}async makeVisible(e){let t;const i=new Deferred,s=[],n=this.getParentList(!1,!1),r=n.length,o=getOption(e,"noAnimation",!1),l=getOption(e,"scrollIntoView",!0);for(t=r-1;t>=0;t--){const e={noAnimation:o};s.push(n[t].setExpanded(!0,e))}return Promise.all(s).then(()=>{l&&this.tree?(this.tree.updatePendingModifications(),this.scrollIntoView().then(()=>{i.resolve()})):i.resolve()}),i.promise()}moveTo(e,t="appendChild",i){let s;"over"===t&&(t="appendChild"),"prependChild"===t&&(e.children&&e.children.length?(t="before",e=e.children[0]):t="appendChild");const n=this.tree,r=this.parent,o="appendChild"===t?e:e.parent;if(this!==e){if(this.parent?o.isDescendantOf(this)&&error("Cannot move a node to its own descendant"):error("Cannot move system root"),o!==r&&r.triggerModifyChild("remove",this),1===this.parent.children.length){if(this.parent===o)return;this.parent.children=this.parent.lazy?[]:null,this.parent.expanded=!1}else s=this.parent.children.indexOf(this),assert(s>=0,"invalid source parent"),this.parent.children.splice(s,1);if(this.parent=o,o.hasChildren())switch(t){case"appendChild":o.children.push(this);break;case"before":s=o.children.indexOf(e),assert(s>=0,"invalid target parent"),o.children.splice(s,0,this);break;case"after":s=o.children.indexOf(e),assert(s>=0,"invalid target parent"),o.children.splice(s+1,0,this);break;default:error(`Invalid mode '${t}'.`)}else o.children=[this];i&&e.visit(i,!0),o===r?o.triggerModifyChild("move",this):o.triggerModifyChild("add",this),n!==e.tree&&(this.logWarn("Cross-tree moveTo is experimental!"),this.visit(t=>{t.tree=e.tree},!0)),setTimeout(()=>{n.update(ChangeType.any)},0)}}async navigate(e,t){var i;const s=null!==(i=KEY_TO_NAVIGATION_MAP[e])&&void 0!==i?i:e,n=this.findRelatedNode(s);if(!n)return this.logWarn(`Could not find related node '${e}'.`),Promise.resolve(this);try{n.makeVisible({scrollIntoView:!1})}catch(e){}return n.setFocus(),!1===(null==t?void 0:t.activate)?Promise.resolve(this):n.setActive(!0,{event:null==t?void 0:t.event})}remove(){const e=this.tree,t=this.parent.children.indexOf(this);this.triggerModify("remove"),this.parent.children.splice(t,1),this.visit(t=>{t.removeMarkup(),e._unregisterNode(t)},!0),e.update(ChangeType.structure)}removeChildren(){var e,t;const i=this.tree;this.children&&((null===(e=i.activeNode)||void 0===e?void 0:e.isDescendantOf(this))&&i.activeNode.setActive(!1),(null===(t=i.focusNode)||void 0===t?void 0:t.isDescendantOf(this))&&i._setFocusNode(null),this.triggerModifyChild("remove",null),this.visit(e=>{i._unregisterNode(e)}),this.lazy?this.children=[]:this.children=null,this.isRootNode()||(this.expanded=!1),this.tree.update(ChangeType.structure))}removeMarkup(){this._rowElem&&(delete this._rowElem._wb_node,this._rowElem.remove(),this._rowElem=void 0)}_getRenderInfo(){const e={},t={},i=this.isColspan(),s=this._rowElem?this._rowElem.querySelectorAll("span.wb-col"):null;let n=0;for(const r of this.tree.columns)e[r.id]={id:r.id,idx:n,elem:s?s[n]:null,info:r},i||"*"===r.id||(t[r.id]=e[r.id]),n++;return{allColInfosById:e,renderColInfosById:t}}_createIcon(e,t,i){const s=this.tree._createNodeIcon(this,i,!0);return s&&(t?e.replaceChild(s,t):e.appendChild(s)),s}_render_markup(e){const t=this.tree,i=t.options,s=i.rowHeightPx,n=this.getOption("checkbox"),r=t.columns,o=this.getLevel(),l=t.isRowNav()?null:t.activeColIdx;let a,d=this._rowElem,c=null,h=null;const u=!d;assert(u,"Expected unrendered node"),assert(!u||e&&e.after,"opts.after expected, unless updating"),assert(!this.isRootNode(),"Root node not allowed"),d=document.createElement("div"),d.classList.add("wb-row"),d.style.top=this._rowIdx*s+"px",this._rowElem=d,d._wb_node=this;const p=document.createElement("span");p.classList.add("wb-node","wb-col"),d.appendChild(p);let f=0;n&&(c=document.createElement("i"),c.classList.add("wb-checkbox"),("radio"===n||this.parent.radiogroup)&&c.classList.add("wb-radio"),p.appendChild(c),f+=20);for(let e=o-1;e>0;e--)a=document.createElement("i"),a.classList.add("wb-indent"),p.appendChild(a),f+=20;(!i.minExpandLevel||o>i.minExpandLevel)&&(h=document.createElement("i"),h.classList.add("wb-expander"),p.appendChild(h),f+=20);this._createIcon(p,null,!h)&&(f+=20);const g=document.createElement("span");g.classList.add("wb-title"),p.appendChild(g),p._ofsTitlePx=f,t.options.dnd.dragStart&&(p.draggable=!0);if(!this.isColspan()&&r.length>1){let e=0;for(const t of r){let i;e++,"*"===t.id?i=p:(i=document.createElement("span"),i.classList.add("wb-col"),d.appendChild(i)),e===l&&i.classList.add("wb-active"),t.classes&&i.classList.add(...t.classes.split(" ")),i.style.left=t._ofsPx+"px",i.style.width=t._widthPx+"px",u&&t.html&&"string"==typeof t.html&&(i.innerHTML=t.html)}}switch(e?e.after:"last"){case"first":t.nodeListElement.prepend(d);break;case"last":t.nodeListElement.appendChild(d);break;default:e.after.after(d)}e.isNew=!0,this._render_data(e)}_render_data(e){assert(this._rowElem,"No _rowElem");const t=this.tree,i=t.options,s=this._rowElem,n=!!e.isNew,r=!!e.preventScroll,o=t.columns,l=this.isColspan(),a=s.querySelector("span.wb-node"),d=a.querySelector("span.wb-title"),c=t.element.scrollTop;this.titleWithHighlight?d.innerHTML=this.titleWithHighlight:d.textContent=this.title;const h=this.getOption("tooltip",!1);if(h&&(d.title=!0===h?this.title:h),r&&(t.element.scrollTop=c),!i.skeleton)if(l){const e=t.element.clientWidth;d.style.width=e-a._ofsTitlePx-7+"px"}else d.style.width=o[0]._widthPx-a._ofsTitlePx-7+"px";if(e.isDataChange=!0,this._render_status(e),this.statusNodeType)this._callEvent("renderStatusNode",{isNew:n,nodeElem:a,isColspan:l});else if(this.parent){const e=this._getRenderInfo();this._callEvent("render",{isNew:n,nodeElem:a,isColspan:l,allColInfosById:e.allColInfosById,renderColInfosById:e.renderColInfosById})}}_render_status(e){const t=this.tree,i=t.iconMap,s=t.options,n=this.type?t.types[this.type]:null,r=this._rowElem,o=r.querySelector("span.wb-node"),l=o.querySelector("i.wb-expander"),a=o.querySelector("i.wb-checkbox"),d=["wb-row"];if(this.expanded&&d.push("wb-expanded"),this.lazy&&d.push("wb-lazy"),this.selected&&d.push("wb-selected"),this._partsel&&d.push("wb-partsel"),this===t.activeNode&&d.push("wb-active"),this===t.focusNode&&d.push("wb-focus"),this._errorInfo&&d.push("wb-error"),this._isLoading&&d.push("wb-loading"),this.isColspan()&&d.push("wb-colspan"),this.statusNodeType&&d.push("wb-status-"+this.statusNodeType),this.match&&d.push("wb-match"),this.subMatchCount&&d.push("wb-submatch"),s.skeleton&&d.push("wb-skeleton"),r.className=d.join(" "),this.classes&&r.classList.add(...this.classes),n&&n.classes&&r.classList.add(...n.classes),l){let e=null;this._isLoading?e=i.loading:this.isExpandable(!1)?e=this.expanded?i.expanderExpanded:i.expanderCollapsed:this.lazy&&null==this.children&&(e=i.expanderLazy),null==e?(l.className="wb-expander",l.classList.add("wb-indent")):TEST_HTML.test(e)?l.replaceWith(elemFromHtml(e)):TEST_FILE_PATH.test(e)?l.style.backgroundImage=`url('${e}')`:l.className="wb-expander "+e}if(a){let e="wb-checkbox ";this.isRadio()?(e+="wb-radio ",this.selected?e+=i.radioChecked:e+=i.radioUnchecked):this.selected?e+=i.checkChecked:this._partsel?e+=i.checkUnknown:e+=i.checkUnchecked,a.className=e}if(!e.isNew){let e=0;for(const i of r.children)i.classList.toggle("wb-active",e++===t.activeColIdx),i.classList.remove("wb-error","wb-invalid");const i=o.querySelector("i.wb-icon");i&&this._createIcon(o,i,!l)}if(!1!==e.resizeCols&&!this.isColspan()){const e=r.querySelectorAll("span.wb-col");let t=0,i=0;for(const s of this.tree.columns){const n=e[t];n.style.left=`${i}px`,n.style.width=`${s._widthPx}px`,t++,i+=s._widthPx}}}_render(e){const t=Object.assign({change:ChangeType.data},e);switch(this._rowElem||(t.change=ChangeType.row),t.change){case"status":this._render_status(t);break;case"data":this._render_data(t);break;case"row":this._render_markup(t);break;default:error(`Invalid change type '${t.change}'.`)}}resetLazy(){this.removeChildren(),this.expanded=!1,this.lazy=!0,this.children=null,this.tree.update(ChangeType.structure)}toDict(e=!1,t){const i={};if(NODE_DICT_PROPS.forEach(e=>{const t=this[e];t instanceof Set?t.size&&(i[e]=Array.prototype.join.call(t.keys()," ")):(t||!1===t||0===t)&&(i[e]=t)}),isEmptyObject(this.data)||(i.data=extend({},this.data),isEmptyObject(i.data)&&delete i.data),t){const s=t(i,this);if(!1===s)return!1;"skip"===s&&(e=!1)}if(e&&isArray(this.children)){i.children=[];for(let e=0,s=this.children.length;e<s;e++){const s=this.children[e];if(!s.isStatusNode()){const e=s.toDict(!0,t);!1!==e&&i.children.push(e)}}}return i}getOption(e,t){const i=this.tree;let s=i.options;e.indexOf(".")>=0&&([s,e]=e.split("."));const n=s[e];if("function"==typeof n){const e=n.call(i,{type:"resolve",tree:i,node:this});if(void 0!==e)return e}if(void 0!==this[e])return this[e];const r=this.type?i.types[this.type]:void 0,o=r?r[e]:void 0;return void 0!==o?o:null!=n?n:t}async scrollIntoView(e){const t=Object.assign({node:this},e);return this.tree.scrollTo(t)}async setActive(e=!0,t){const i=this.tree,s=i.getActiveNode(),n=null==t?void 0:t.retrigger,r=null==t?void 0:t.focusTree,o=null==t?void 0:t.noEvents,l=null==t?void 0:t.event,a=null==t?void 0:t.colIdx,d=null==t?void 0:t.edit;if(assert(!d||null!=a,"edit requires colIdx"),!o)if(e){if(s!==this||n){if(!1===(null==s?void 0:s._callEvent("deactivate",{nextNode:this,event:l}))||!1===this._callEvent("beforeActivate",{prevNode:s,event:l}))return;i._setActiveNode(null),null==s||s.update(ChangeType.status)}}else(s===this||n)&&this._callEvent("deactivate",{nextNode:null,event:l});return s!==this&&(e&&i._setActiveNode(this),null==s||s.update(ChangeType.status),this.update(ChangeType.status)),this.makeVisible().then(()=>{e&&((r||d)&&(i.setFocus(),i._setFocusNode(this),i.focusNode.setFocus()),null!=a&&i.isCellNav()&&i.setColumn(a,{edit:d}),o||this._callEvent("activate",{prevNode:s,event:l}))})}async setExpanded(e=!0,t){const{force:i,scrollIntoView:s,immediate:n,resetLazy:r}=null!=t?t:{},o=!(null==t?void 0:t.noEvents);if(!e&&this.isExpanded()&&this.getLevel()<=this.tree.getOption("minExpandLevel")&&!i)return void this.logDebug("Ignored collapse request below minExpandLevel.");if(!e==!this.expanded)return;if(o&&!1===this._callEvent("beforeExpand",{flag:e}))return;e&&this.getOption("autoCollapse")&&this.collapseSiblings(t),e&&this.lazy&&null==this.children?await this.loadLazy():!e&&r&&this.lazy&&this.children&&this.resetLazy(),this.expanded=e;const l={immediate:n};if(this.tree.update(ChangeType.structure,l),e&&s){const e=this.getLastChild();e&&(this.tree.updatePendingModifications(),e.scrollIntoView({topNode:this}))}o&&this._callEvent("expand",{flag:e})}setFocus(e=!0){assert(!!e,"Blur is not yet implemented");const t=this.tree.focusNode;this.tree._setFocusNode(this),null==t||t.update(),this.update()}setIcon(e){this.icon=e,this.update()}setKey(e,t){throw new Error("Not yet implemented")}update(e=ChangeType.data){assert(e===ChangeType.status||e===ChangeType.data,`Invalid change type ${e}`),this.tree.update(e,this)}getSelectedNodes(e=!1){const t=[];return this.visit(i=>{if(i.selected&&(t.push(i),!0===e))return"skip"}),t}getRefKeys(e=!1){const t=new Set;return this.visit(i=>{null==i.refKey||e&&!i.selected||t.add(i.refKey)}),Array.from(t)}toggleSelected(e){let t=this.isSelected();return t=void 0!==t||this.isRadio()?!t:this._anySelectable(),this.setSelected(t,e)}_anySelectable(){let e=!1;return this.visit(t=>{if(!1===t.selected&&!t.unselectable&&!t.hasChildren()&&!t.parent.radiogroup)return e=!0,!1}),e}_changeSelectStatusProps(e){let t=!1;switch(e){case!1:t=this.selected||this._partsel,this.selected=!1,this._partsel=!1;break;case!0:t=!this.selected||!this._partsel,this.selected=!0,this._partsel=!0;break;case void 0:t=this.selected||!this._partsel,this.selected=!1,this._partsel=!!this.hasChildren();break;default:error(`Invalid state: ${e}`)}return t&&this.update(),t}fixSelection3AfterClick(e){const t=!!(null==e?void 0:e.force),i=this.isSelected();this.visit(e=>{if(e.radiogroup)return"skip";!t&&e.getOption("unselectable")||e._changeSelectStatusProps(i)}),this.fixSelection3FromEndNodes()}fixSelection3FromEndNodes(e){const t=!!(null==e?void 0:e.force);assert("hier"===this.tree.options.selectMode,"expected selectMode 'hier'");const i=e=>{let s;const n=e.children;if(n&&n.length){let e=!0,t=!1;for(let s=0,r=n.length;s<r;s++){const r=n[s],o=i(r);!1!==o&&(t=!0),!0!==o&&(e=!1)}s=!!e||!!t&&void 0}else s=!!e.selected;return e._partsel&&!e.selected&&e.lazy&&null==e.children&&(s=void 0),!t&&e.getOption("unselectable")||e._changeSelectStatusProps(s),s};i(this),this.visitParents(e=>{let t;const i=e.children;let s=!0,n=!1;for(let e=0,r=i.length;e<r;e++){const r=i[e];t=!!r.selected,(t||r._partsel)&&(n=!0),t||(s=!1)}t=!!s||!!n&&void 0,e._changeSelectStatusProps(t)})}setSelected(e=!0,t){const i=this.tree,s=!(null==t?void 0:t.noEvents),n=this.isSelected(),r=this.parent&&this.parent.radiogroup,o=i.options.selectMode,l=(null==t?void 0:t.force)||!this.getOption("unselectable");return e=!!e,l?(null==t?void 0:t.propagateDown)&&"multi"===o?(i.runWithDeferredUpdate(()=>{this.visit(t=>{t.setSelected(e)})}),n):(e===n||s&&!1===this._callEvent("beforeSelect",{flag:e})||(i.runWithDeferredUpdate(()=>{if(r){if(!e&&!(null==t?void 0:t.force))return n;for(const e of this.parent.children)e.selected=e===this}else this.selected=e,"hier"===o?this.fixSelection3AfterClick():"single"===o&&e&&i.visit(e=>{e!==this&&(e.selected=!1)})}),s&&this._callEvent("select",{flag:e})),n):n}setStatus(e,t){const i=this.tree,s=null==t?void 0:t.message,n=null==t?void 0:t.details;let r=null;const o=e=>{const t=this.children,s=t?t[0]:null;return assert(e.statusNodeType,"Not a status node"),assert(!s||!s.isStatusNode(),"Child must not be a status node"),r=this.addNode(e,"prependChild"),r.match=-1,i.update(ChangeType.structure),r};switch((()=>{const e=this.children;e&&e.length&&e[0].isStatusNode()&&e[0].remove()})(),e){case"ok":this._isLoading=!1,this._errorInfo=null;break;case"loading":this._isLoading=!0,this._errorInfo=null,this.parent?this.update(ChangeType.status):o({statusNodeType:e,title:i.options.strings.loading+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n});break;case"error":o({statusNodeType:e,title:i.options.strings.loadError+(s?" ("+s+")":""),checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo={message:s,details:n};break;case"noData":o({statusNodeType:e,title:s||i.options.strings.noData,checkbox:!1,colspan:!0,tooltip:n}),this._isLoading=!1,this._errorInfo=null;break;default:error("invalid node status "+e)}return i.update(ChangeType.structure),r}setTitle(e){this.title=e,this.update()}setTooltip(e){this.tooltip=e,this.update()}sortChildren(e=nodeTitleSorter,t=!1){return this.tree.logDeprecate("node.sortChildren()",{since:"0.14.0"}),this.sort({cmp:e||void 0,deep:t})}resetNativeChildOrder(e){const{recursive:t=!0,propName:i="_nativeIndex"}=null!=e?e:{};this.children&&this.children.forEach((s,n)=>{s.data[i]=n,t&&s.children&&s.resetNativeChildOrder(e)})}sortByProperty(e){return this.tree.logDeprecate("node.sortByProperty()",{since:"0.14.0"}),this.sort(e)}sort(e){const t=this.tree;let{propName:i,deep:s=!0,key:n,order:r,caseInsensitive:o=!0,cmp:l,updateColInfo:a=!1,nativeOrderPropName:d="_nativeIndex",colId:c}=e;null!=i||(i=c),"*"===i&&(i="title");const h=!0===t.options.sortFoldersFirst?e=>!1!==e.hasChildren()||"folder"===e.type:t.options.sortFoldersFirst;if(a){const t=this.tree._columnsById[e.colId];assert(t,`Invalid colId specified: ${e.colId}`),null!=r||(r=rotate(t.sortOrder,["asc","desc",void 0]));for(const e of this.tree.columns)e.sortOrder=e===t?r:void 0;void 0===r&&(i=d,r="asc"),this.tree.update(ChangeType.colStructure)}else null!=i||(i="title"),null!=r||(r="asc");this.logDebug(`sort(), propName=${i}, ${r}`,e),assert(i||l||n,"No `propName` or `key` specified"),null==n&&null==l&&(n=e=>{let t;return t=NODE_DICT_PROPS.has(i)?e[i]:e.data[i],o&&"string"==typeof t&&(t=t.toLowerCase()),t}),l?(assert(!n,"`key` and `cmp` are mutually exclusive"),t.logDeprecate("SortOptions.cmp",{since:"0.14.0",hint:"use the `key` callback instead"})):((e.propName||e.caseInsensitive)&&t.logWarn("sort(): ignoring propName, caseInsensitive"),l=(e,t)=>{if(h){const i=h(e);if(i!==h(t))return i?-1:1}let i=n(e),s=n(t);return null==i?i="string"==typeof s?"":0:"boolean"==typeof i&&(i=i?1:0),null==s?s="string"==typeof i?"":0:"boolean"==typeof s&&(s=s?1:0),"desc"===r?i===s?0:i>s?-1:1:i===s?0:i>s?1:-1}),this.children&&function e(t){if(t&&(t.sort(l),s))for(let i=0,s=t.length;i<s;i++)t[i].children&&e(t[i].children)}(this.children),this.tree.update(ChangeType.structure)}resort(e={}){for(const t of this.tree.columns)if(t.sortOrder){e.colId=t.id,e.order=t.sortOrder,this.sort(e);break}}triggerModifyChild(e,t,i){this.logDebug(`modifyChild(${e})`,i,t),this.tree.options.modifyChild&&(t&&t.parent!==this&&error("child "+t+" is not a child of "+this),this._callEvent("modifyChild",extend({operation:e,child:t},i)))}triggerModify(e,t){this.parent.triggerModifyChild(e,this,t)}visit(e,t=!1){let i=!0;const s=this.children;if(!0===t&&(i=e(this),!1===i||"skip"===i))return i;if(s)for(let t=0,n=s.length;t<n&&(i=s[t].visit(e,!0),!1!==i);t++);return i}visitParents(e,t=!1){if(t&&!1===e(this))return!1;let i=this.parent;for(;i;){if(!1===e(i))return!1;i=i.parent}return!0}visitSiblings(e,t=!1){const i=this.parent.children;for(let s=0,n=i.length;s<n;s++){const n=i[s];if((t||n!==this)&&!1===e(n))return!1}return!0}isMatched(){return!(this.tree.filterMode&&!this.match)}}WunderbaumNode.sequence=0;
68
68
  /*!
69
69
  * Wunderbaum - ext-edit
70
70
  * Copyright (c) 2021-2025, Martin Wendt. Released under the MIT license.
71
- * v0.13.0, Sat, 08 Mar 2025 14:16:31 GMT (https://github.com/mar10/wunderbaum)
71
+ * v0.14.1, Sun, 22 Mar 2026 05:52:05 GMT (https://github.com/mar10/wunderbaum)
72
72
  */
73
- class EditExtension extends WunderbaumExtension{constructor(e){super(e,"edit",{debounce:100,minlength:1,maxlength:null,trigger:[],trim:!0,select:!0,slowClickDelay:1e3,validity:!0,beforeEdit:null,edit:null,apply:null}),this.curEditNode=null,this.relatedNode=null,this.debouncedOnChange=debounce(this._onChange.bind(this),this.getPluginOption("debounce"))}async _applyChange(e,t,i,s,n){return t.log(`_applyChange(${e})`,n),i.classList.add("wb-busy"),i.classList.remove("wb-error","wb-invalid"),s.setCustomValidity(""),new Promise(((i,s)=>{const o=t._callEvent(e,n);Promise.resolve(o).then((e=>{i(e)})).catch((e=>{s(e)}))})).then((e=>{if(!s.checkValidity())throw t.logWarn("inputElem.checkValidity() failed: throwing...."),new ValidationError(s.validationMessage);return e})).catch((n=>{if(!(n instanceof ValidationError))throw t.logError(`Error in ${e} event handler (throw e.util.ValidationError instead if this was intended)`,n),i.classList.add("wb-error"),n;t.logWarn("catched ",n),i.classList.add("wb-invalid"),s.setCustomValidity&&!s.validationMessage&&s.setCustomValidity(n.message),s.validationMessage&&s.reportValidity()})).finally((()=>{i.classList.remove("wb-busy")}))}_onChange(e){const t=Wunderbaum.getEventInfo(e),i=t.node,s=t.colElem;i&&0!==t.colIdx?this._applyChange("change",i,s,e.target,{info:t,event:e,inputElem:e.target,inputValue:Wunderbaum.util.getValueFromElem(e.target),inputValid:e.target.checkValidity()}):this.tree.log("Ignored change event for removed element or node title")}init(){super.init(),onEvent(this.tree.element,"change",".contenteditable,input,textarea,select",(e=>this._onChange(e)))}_preprocessKeyEvent(e){const t=e.event,i=eventToString(t),s=this.tree,n=this.getPluginOption("trigger");if(this.isEditingTitle()){switch(i){case"Enter":return this._stopEditTitle(!0,{event:t}),!1;case"Escape":return this._stopEditTitle(!1,{event:t}),!1}return!1}if(s.isRowNav()||0===s.activeColIdx){switch(i){case"Enter":if(n.indexOf("macEnter")>=0&&isMac)return this.startEditTitle(),!1;break;case"F2":if(n.indexOf("F2")>=0)return this.startEditTitle(),!1}return!0}return!0}isEditingTitle(e){return e?this.curEditNode===e:!!this.curEditNode}startEditTitle(e){e=null!=e?e:this.tree.getActiveNode();const t=this.getPluginOption("validity"),i=this.getPluginOption("select");if(!e)return;if(e.isStatusNode())return void e.logWarn("Cannot edit status node.");this.tree.logDebug(`startEditTitle(node=${e})`);let s=e._callEvent("edit.beforeEdit");if(!1===s)return void e.logDebug("beforeEdit canceled operation.");if(!0===s||!s){const t=escapeHtml(e.title);let i=this.getPluginOption("maxlength");const n=i?` maxlength="${i}"`:"";i=this.getPluginOption("minlength");s=`<input type=text class="wb-input-edit" tabindex=-1 value="${t}" autocorrect="off"${i>0?" required":""}${i?` minlength="${i}"`:""}${n} >`}const n=e.getColElem(0).querySelector(".wb-title");n.innerHTML=s;const o=n.firstElementChild;t&&o.addEventListener("keydown",(t=>{o.setCustomValidity(""),o.reportValidity()||e.logWarn(`Invalid input: '${o.value}'`)})),o.focus(),i&&o.select(),this.curEditNode=e,e._callEvent("edit.edit",{inputElem:o})}stopEditTitle(e){return this._stopEditTitle(e,{})}_stopEditTitle(e,t){var i;null!=t||(t={});const s=document.activeElement;let n=s?getValueFromElem(s):null;const o=this.curEditNode,r=!!t.forceClose,l=this.getPluginOption("validity");if(n&&this.getPluginOption("trim")&&(n=n.trim()),o)if(o.logDebug(`stopEditTitle(${e})`,t,s,n),e&&null!==n&&n!==o.title){const e=s.validationMessage;if(e)throw new Error(`Input validation failed for "${n}": ${e}.`);const t=o.getColElem(0);this._applyChange("edit.apply",o,t,s,{oldValue:o.title,newValue:n,inputElem:s,inputValid:s.checkValidity()}).then((e=>{var t;const i=s.validationMessage;if(l&&i&&!1!==e)throw new Error(`Edit apply validation failed for "${n}": ${i}.`);(r||!1!==e)&&(null==o||o.setTitle(n),null===(t=this.curEditNode)||void 0===t||t._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus())}))}else null===(i=this.curEditNode)||void 0===i||i._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus();else this.tree.logDebug("stopEditTitle: not in edit mode.")}createNode(e="after",t,i){const s=this.tree;if(assert(t=null!=t?t:s.getActiveNode(),"No node was passed, or no node is currently active."),e=e||"prependChild",null==i?i={title:""}:"string"==typeof i?i={title:i}:assert(isPlainObject(i),`Expected a plain object: ${i}`),("prependChild"===e||"appendChild"===e)&&(null==t?void 0:t.isExpandable(!0)))return void t.setExpanded().then((()=>{this.createNode(e,t,i)}));const n=t.addNode(i,e);n.setClass("wb-edit-new"),this.relatedNode=t,n.match=-1,n.makeVisible({noAnimation:!0}).then((()=>{this.startEditTitle(n)}))}}
73
+ class EditExtension extends WunderbaumExtension{constructor(e){super(e,"edit",{debounce:100,minlength:1,maxlength:null,trigger:[],trim:!0,select:!0,slowClickDelay:1e3,validity:!0,beforeEdit:null,edit:null,apply:null}),this.curEditNode=null,this.relatedNode=null,this.debouncedOnChange=debounce(this._onChange.bind(this),this.getPluginOption("debounce"))}async _applyChange(e,t,i,s,n){return t.log(`_applyChange(${e})`,n),i.classList.add("wb-busy"),i.classList.remove("wb-error","wb-invalid"),s.setCustomValidity(""),new Promise((i,s)=>{const r=t._callEvent(e,n);Promise.resolve(r).then(e=>{i(e)}).catch(e=>{s(e)})}).then(e=>{if(!s.checkValidity())throw t.logWarn("inputElem.checkValidity() failed: throwing...."),new ValidationError(s.validationMessage);return e}).catch(n=>{if(!(n instanceof ValidationError))throw t.logError(`Error in ${e} event handler (throw e.util.ValidationError instead if this was intended)`,n),i.classList.add("wb-error"),n;t.logWarn("catched ",n),i.classList.add("wb-invalid"),s.setCustomValidity&&!s.validationMessage&&s.setCustomValidity(n.message),s.validationMessage&&s.reportValidity()}).finally(()=>{i.classList.remove("wb-busy")})}_onChange(e){const t=Wunderbaum.getEventInfo(e),i=t.node,s=t.colElem;i&&0!==t.colIdx?this._applyChange("change",i,s,e.target,{info:t,event:e,inputElem:e.target,inputValue:Wunderbaum.util.getValueFromElem(e.target),inputValid:e.target.checkValidity()}):this.tree.log("Ignored change event for removed element or node title")}init(){super.init(),onEvent(this.tree.element,"change",".contenteditable,input,textarea,select",e=>this._onChange(e))}_preprocessKeyEvent(e){const t=e.event,i=eventToString(t),s=this.tree,n=this.getPluginOption("trigger");if(this.isEditingTitle()){switch(i){case"Enter":return this._stopEditTitle(!0,{event:t}),!1;case"Escape":return this._stopEditTitle(!1,{event:t}),!1}return!1}if(s.isRowNav()||0===s.activeColIdx){switch(i){case"Enter":if(n.indexOf("macEnter")>=0&&isMac)return this.startEditTitle(),!1;break;case"F2":if(n.indexOf("F2")>=0)return this.startEditTitle(),!1}return!0}return!0}isEditingTitle(e){return e?this.curEditNode===e:!!this.curEditNode}startEditTitle(e){e=null!=e?e:this.tree.getActiveNode();const t=this.getPluginOption("validity"),i=this.getPluginOption("select");if(!e)return;if(e.isStatusNode())return void e.logWarn("Cannot edit status node.");this.tree.logDebug(`startEditTitle(node=${e})`);let s=e._callEvent("edit.beforeEdit");if(!1===s)return void e.logDebug("beforeEdit canceled operation.");if(!0===s||!s){const t=escapeHtml(e.title);let i=this.getPluginOption("maxlength");const n=i?` maxlength="${i}"`:"";i=this.getPluginOption("minlength");s=`<input type=text class="wb-input-edit" tabindex=-1 value="${t}" autocorrect="off"${i>0?" required":""}${i?` minlength="${i}"`:""}${n} >`}const n=e.getColElem(0).querySelector(".wb-title");n.innerHTML=s;const r=n.firstElementChild;t&&r.addEventListener("keydown",t=>{r.setCustomValidity(""),r.reportValidity()||e.logWarn(`Invalid input: '${r.value}'`)}),r.focus(),i&&r.select(),this.curEditNode=e,e._callEvent("edit.edit",{inputElem:r})}stopEditTitle(e){return this._stopEditTitle(e,{})}_stopEditTitle(e,t){var i;null!=t||(t={});const s=document.activeElement;let n=s?getValueFromElem(s):null;const r=this.curEditNode,o=!!t.forceClose,l=this.getPluginOption("validity");if(n&&this.getPluginOption("trim")&&(n=n.trim()),r)if(r.logDebug(`stopEditTitle(${e})`,t,s,n),e&&null!==n&&n!==r.title){const e=s.validationMessage;if(e)throw new Error(`Input validation failed for "${n}": ${e}.`);const t=r.getColElem(0);this._applyChange("edit.apply",r,t,s,{oldValue:r.title,newValue:n,inputElem:s,inputValid:s.checkValidity()}).then(e=>{var t;const i=s.validationMessage;if(l&&i&&!1!==e)throw new Error(`Edit apply validation failed for "${n}": ${i}.`);(o||!1!==e)&&(null==r||r.setTitle(n),null===(t=this.curEditNode)||void 0===t||t._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus())})}else null===(i=this.curEditNode)||void 0===i||i._render({preventScroll:!0}),this.curEditNode=null,this.relatedNode=null,this.tree.setFocus()}createNode(e="after",t,i){const s=this.tree;if(assert(t=null!=t?t:s.getActiveNode(),"No node was passed, or no node is currently active."),e=e||"prependChild",null==i?i={title:""}:"string"==typeof i?i={title:i}:assert(isPlainObject(i),`Expected a plain object: ${i}`),("prependChild"===e||"appendChild"===e)&&(null==t?void 0:t.isExpandable(!0)))return void t.setExpanded().then(()=>{this.createNode(e,t,i)});const n=t.addNode(i,e);n.setClass("wb-edit-new"),this.relatedNode=t,n.match=-1,n.makeVisible({noAnimation:!0}).then(()=>{this.startEditTitle(n)})}}
74
74
  /*!
75
75
  * wunderbaum.ts
76
76
  *
@@ -80,7 +80,7 @@ class EditExtension extends WunderbaumExtension{constructor(e){super(e,"edit",{d
80
80
  * https://github.com/mar10/wunderbaum
81
81
  *
82
82
  * Released under the MIT license.
83
- * @version v0.13.0
84
- * @date Sat, 08 Mar 2025 14:16:31 GMT
85
- */class WbSystemRoot extends WunderbaumNode{constructor(e){super(e,null,{key:"__root__",title:e.id})}toString(){return`WbSystemRoot@${this.key}<'${this.tree.id}'>`}}class Wunderbaum{get activeNode(){var e;return(null===(e=this._activeNode)||void 0===e?void 0:e.tree)?this._activeNode:null}get focusNode(){var e;return(null===(e=this._focusNode)||void 0===e?void 0:e.tree)?this._focusNode:null}constructor(e){this.enabled=!0,this.data={},this.extensionList=[],this.extensions={},this.keyMap=new Map,this.refKeyMap=new Map,this.treeRowCount=0,this._disableUpdateCount=0,this._disableUpdateIgnoreCount=0,this._activeNode=null,this._focusNode=null,this.types={},this.columns=[],this._columnsById={},this.pendingChangeTypes=new Set,this._util=util,this.breadcrumb=null,this.filterMode=null,this.activeColIdx=0,this._cellNavMode=!1,this.lastQuicksearchTime=0,this.lastQuicksearchTerm="",this.lastClickTime=0;const t=this.options=extend({id:null,source:null,element:null,debugLevel:3,header:null,rowHeightPx:22,iconMap:"bootstrap",columns:null,types:null,enabled:!0,fixedCol:!1,showSpinner:!1,checkbox:!1,minExpandLevel:0,emptyChildListExpandable:!1,skeleton:!1,connectTopBreadcrumb:null,selectMode:"multi",navigationModeOption:null,quicksearch:!0,iconBadge:null,change:null,error:null,receive:null,strings:{loadError:"Error",loading:"Loading...",noData:"No data",breadcrumbDelimiter:" » ",queryResult:"Found ${matches} of ${count}",noMatch:"No results",matchIndex:"${match} of ${matches}"}},e),i=new Deferred;this.ready=i.promise();let s=!1;if(this.ready.then((()=>{s=!0;try{this._callEvent("init")}catch(e){this.logError("Exception inside `init(e)` event:",e)}})).catch((e=>{if(s)throw e;this._callEvent("init",{error:e})})),this.id=t.id||"wb_"+ ++Wunderbaum.sequence,this.root=new WbSystemRoot(this),this._registerExtension(new KeynavExtension(this)),this._registerExtension(new EditExtension(this)),this._registerExtension(new FilterExtension(this)),this._registerExtension(new DndExtension(this)),this._registerExtension(new GridExtension(this)),this._registerExtension(new LoggerExtension(this)),this._updateViewportThrottled=adaptiveThrottle(this._updateViewportImmediately.bind(this),{}),this.columns=t.columns,delete t.columns,!this.columns||!this.columns.length){const e="string"==typeof t.header?t.header:this.id;this.columns=[{id:"*",title:e,width:"*"}]}t.types&&this.setTypes(t.types,!0),delete t.types,this.element=elemFromSelector(t.element),assert(!!this.element,`Invalid 'element' option: ${t.element}`),this.element.classList.add("wunderbaum"),this.element.getAttribute("tabindex")||(this.element.tabIndex=0),22!==t.rowHeightPx&&(this.element.style.setProperty("--wb-row-outer-height",t.rowHeightPx+"px"),this.element.style.setProperty("--wb-row-inner-height",t.rowHeightPx-2+"px")),this.element._wb_tree=this,this.headerElement=this.element.querySelector("div.wb-header");const n=null==t.header?this.columns.length>1:!!t.header;if(this.headerElement){assert(!this.columns,"`opts.columns` must not be set if table markup already contains a header"),this.columns=[];const e=this.headerElement.querySelector("div.wb-row");for(const t of e.querySelectorAll("div"))this.columns.push({id:t.dataset.id||`col_${this.columns.length}`,title:""+t.textContent,width:"*"})}else{const e="<span class='wb-col'></span>".repeat(this.columns.length);if(this.element.innerHTML=`\n <div class='wb-header'>\n <div class='wb-row'>\n ${e}\n </div>\n </div>`,!n){this.element.querySelector("div.wb-header").style.display="none"}}this.element.innerHTML+='\n <div class="wb-list-container">\n <div class="wb-node-list"></div>\n </div>',this.listContainerElement=this.element.querySelector("div.wb-list-container"),this.nodeListElement=this.listContainerElement.querySelector("div.wb-node-list"),this.headerElement=this.element.querySelector("div.wb-header"),this.element.classList.toggle("wb-grid",this.columns.length>1),this.options.connectTopBreadcrumb&&(this.breadcrumb=elemFromSelector(this.options.connectTopBreadcrumb),assert(!this.breadcrumb||null!=this.breadcrumb.innerHTML,`Invalid 'connectTopBreadcrumb' option: ${this.breadcrumb}.`),this.breadcrumb.addEventListener("click",(e=>{const t=e.target;if(t&&t.matches("a.wb-breadcrumb")){const i=this.keyMap.get(t.dataset.key);null==i||i.setActive(),e.preventDefault()}}))),this._initExtensions(),["enabled","fixedCol"].forEach((e=>{null!=t[e]&&this.setOption(e,t[e])})),t.source?(t.showSpinner&&(this.nodeListElement.innerHTML=`<progress class='spinner'>${t.strings.loading}</progress>`),this.load(t.source).then((()=>{null==t.navigationModeOption?this.isGrid()?this.setNavigationOption(NavModeEnum.cell):this.setNavigationOption(NavModeEnum.row):this.setNavigationOption(t.navigationModeOption),this.update(ChangeType.structure,{immediate:!0}),i.resolve()})).catch((e=>{i.reject(e)})).finally((()=>{var e;null===(e=this.element.querySelector("progress.spinner"))||void 0===e||e.remove(),this.element.classList.remove("wb-initializing")}))):i.resolve(),this.update(ChangeType.any),this.element.addEventListener("scroll",(e=>{this.update(ChangeType.scroll)})),this.resizeObserver=new ResizeObserver((e=>{this.update(ChangeType.resize)})),this.resizeObserver.observe(this.element),onEvent(this.element,"click",".wb-button,.wb-col-icon",(e=>{var t,i;const s=Wunderbaum.getEventInfo(e),n=null===(i=null===(t=e.target)||void 0===t?void 0:t.dataset)||void 0===i?void 0:i.command;this._callEvent("buttonClick",{event:e,info:s,command:n})})),onEvent(this.nodeListElement,"click","div.wb-row",(t=>{const i=Wunderbaum.getEventInfo(t),s=i.node,n=t;if(!1===this._callEvent("click",{event:t,node:s,info:i}))return this.lastClickTime=Date.now(),!1;if(s){if(n.ctrlKey)return void s.toggleSelected();const o=this.getOption("edit.trigger"),r=this.getOption("edit.slowClickDelay");o.indexOf("clickActive")>=0&&"title"===i.region&&s.isActive()&&(!r||Date.now()-this.lastClickTime<r)&&s.startEditTitle(),i.colIdx>=0?s.setActive(!0,{colIdx:i.colIdx,event:t}):s.setActive(!0,{event:t}),i.region===NodeRegion.expander?s.setExpanded(!s.isExpanded(),{scrollIntoView:!1!==e.scrollIntoViewOnExpandClick}):i.region===NodeRegion.checkbox&&s.toggleSelected()}this.lastClickTime=Date.now()})),onEvent(this.nodeListElement,"dblclick","div.wb-row",(e=>{const t=Wunderbaum.getEventInfo(e),i=t.node;if(!1===this._callEvent("dblclick",{event:e,node:i,info:t}))return!1;i&&0===t.colIdx&&i.isExpandable()&&t.region!==NodeRegion.expander&&(this._callMethod("edit._stopEditTitle"),i.setExpanded(!i.isExpanded()))})),onEvent(this.element,"keydown",(e=>{const t=Wunderbaum.getEventInfo(e),i=eventToString(e),s=t.node||this.getFocusNode();this._callHook("onKeyEvent",{event:e,node:s,info:t,eventName:i})})),onEvent(this.element,"focusin focusout",(e=>{const i="focusin"===e.type,s=Wunderbaum.getNode(e);this._callEvent("focus",{flag:i,event:e}),i&&this.isRowNav()&&!this.isEditingTitle()&&(t.navigationModeOption===NavModeEnum.row?null==s||s.setActive():this.setCellNav()),i||this._callMethod("edit._stopEditTitle",!0,{event:e,forceClose:!0})}))}static getTree(e){if(e instanceof Wunderbaum)return e;if(e instanceof WunderbaumNode)return e.tree;if(void 0===e&&(e=0),"number"==typeof e)e=document.querySelectorAll(".wunderbaum")[e];else if("string"==typeof e){for(const t of document.querySelectorAll(".wunderbaum")){const i=t._wb_tree;if(i&&i.id===e)return i}if(!(e=document.querySelector(e)))return null}else e.target&&(e=e.target);return assert(e instanceof Element,`Invalid el type: ${e}`),e.matches(".wunderbaum")||(e=e.closest(".wunderbaum")),e&&e._wb_tree?e._wb_tree:null}get iconMap(){const e=this.options.iconMap;return"string"==typeof e?iconMaps[e]:e}static getNode(e){if(!e)return null;if(e instanceof WunderbaumNode)return e;for(void 0!==e.target&&(e=e.target);e;){if(e._wb_node)return e._wb_node;e=e.parentElement}return null}*[Symbol.iterator](){yield*this.root}_registerExtension(e){this.extensionList.push(e),this.extensions[e.id]=e}_initExtensions(){for(const e of this.extensionList)e.init()}_registerNode(e){const t=e.key;assert(null!=t,`Missing key: '${e}'.`),assert(!this.keyMap.has(t),`Duplicate key: '${t}': ${e}.`),this.keyMap.set(t,e);const i=e.refKey;if(null!=i){const t=this.refKeyMap.get(i);t?t.add(e):this.refKeyMap.set(i,new Set([e]))}}_unregisterNode(e){const t=e.refKey;if(null!=t){const i=this.refKeyMap.get(t);i&&i.delete(e)&&!i.size&&this.refKeyMap.delete(t)}this.keyMap.delete(e.key),e.tree=null,e.parent=null,e.removeMarkup()}_callHook(e,t={}){let i;const s=extend({},{tree:this,options:this.options,result:void 0},t);for(const t of this.extensionList){if(i=t[e].call(t,s),!1===i)break;void 0!==s.result&&(i=s.result)}return i}_callMethod(e,...t){const[i,s]=e.split("."),n=s?this.extensions[i]:this,o=n[s];if(o)return o.apply(n,t);this.logError(`Calling undefined method '${e}()'.`)}_callEvent(e,t){const[i,s]=e.split("."),n=this.options,o=s?n[i][s]:n[i];if(o)return o.call(this,extend({type:e,tree:this,util:this._util},t))}_getNodeByRowIdx(e){let t=null;return this.visitRows((i=>{if(i._rowIdx===e)return t=i,!1})),t}getTopmostVpNode(e=!0){const t=this.options.rowHeightPx,i=this.element.scrollTop;let s;return s=e?Math.ceil((i-1)/t):Math.floor(i/t),this._getNodeByRowIdx(s)}getLowestVpNode(e=!0){const t=this.options.rowHeightPx,i=this.element,s=this.headerElement.clientHeight,n=i.scrollTop,o=i.clientHeight-s;let r;return r=e?Math.floor((n+o)/t)-1:Math.ceil((n+o)/t)-1,r=Math.min(r,this.count(!0)-1),this._getNodeByRowIdx(r)}_getNextNodeInView(e,t){let i=(null==t?void 0:t.ofs)||1;const s=!!(null==t?void 0:t.reverse);return this.visitRows((s=>(e=s,(!(null==t?void 0:t.cb)||!t.cb(s))&&(!(i--<=0)&&void 0))),{reverse:s,start:e||this.getActiveNode()}),e}addChildren(e,t){return this.root.addChildren(e,t)}applyCommand(e,t,i){let s,n;switch(t instanceof WunderbaumNode?s=t:(s=this.getActiveNode(),assert(void 0===i,`Unexpected options: ${i}`),i=t),e){case"moveUp":n=s.getPrevSibling(),n&&(s.moveTo(n,"before"),s.setActive());break;case"moveDown":n=s.getNextSibling(),n&&(s.moveTo(n,"after"),s.setActive());break;case"indent":n=s.getPrevSibling(),n&&(s.moveTo(n,"appendChild"),n.setExpanded(),s.setActive());break;case"outdent":s.isTopLevel()||(s.moveTo(s.getParent(),"after"),s.setActive());break;case"remove":n=s.getPrevSibling()||s.getParent(),s.remove(),n&&n.setActive();break;case"addChild":this._callMethod("edit.createNode","prependChild");break;case"addSibling":this._callMethod("edit.createNode","after");break;case"rename":s.startEditTitle();break;case"down":case"first":case"last":case"left":case"nextMatch":case"pageDown":case"pageUp":case"parent":case"prevMatch":case"right":case"up":return s.navigate(e);default:error(`Unhandled command: '${e}'`)}}clear(){this.root.removeChildren(),this.root.children=null,this.keyMap.clear(),this.refKeyMap.clear(),this.treeRowCount=0,this._activeNode=null,this._focusNode=null,this.update(ChangeType.structure)}destroy(){this.logInfo("destroy()..."),this.clear(),this.resizeObserver.disconnect(),this.element.innerHTML="",this.element.outerHTML=this.element.outerHTML}getOption(e,t){let i,s=this.options;e.indexOf(".")>=0&&([i,e]=e.split("."),s=s[i]);let n=s[e];return"function"==typeof n&&(n=n({type:"resolve",tree:this})),null!=n?n:t}setOption(e,t){if(e.indexOf(".")>=0){const i=e.split(".");this.extensions[i[0]].setPluginOption(i[1],t)}else switch(this.options[e]=t,e){case"checkbox":this.update(ChangeType.any);break;case"enabled":this.setEnabled(!!t);break;case"fixedCol":this.element.classList.toggle("wb-fixed-col",!!t)}}hasFocus(){return this.element.contains(document.activeElement)}hasHeader(){const e=this.options.header;return this.isGrid()?!1!==e:!!e}runWithDeferredUpdate(e,t=null){try{this.enableUpdate(!1);const t=e();return assert(!(t instanceof Promise),`Promise return not allowed: ${t}`),t}finally{this.enableUpdate(!0)}}async expandAll(e=!0,t){await this.root.expandAll(e,t)}selectAll(e=!0){return this.root.setSelected(e,{propagateDown:!0})}toggleSelect(){this.selectAll(this.root._anySelectable())}getSelectedNodes(e=!1){return this.root.getSelectedNodes(e)}_selectRange(e){this.logDebug("_selectRange",e),error("Not yet implemented.")}count(e=!1){return e?this.treeRowCount:this.keyMap.size}countUnique(){return this.refKeyMap.size}_check(){let e=0;this.visit((t=>{e++})),this.keyMap.size!==e&&this.logWarn(`_check failed: ${this.keyMap.size} !== ${e}`)}findAll(e){return this.root.findAll(e)}findByRefKey(e){const t=this.refKeyMap.get(e);return t?Array.from(t):[]}findFirst(e){return this.root.findFirst(e)}findKey(e){return this.keyMap.get(e)||null}findNextNode(e,t,i=!1){let s=null;const n=this.getFirstChild(),o=i?this.findRelatedNode(n,"last"):null,r="string"==typeof e?makeNodeTitleStartMatcher(e):e;function l(e){if(r(e)&&(s=e),s||e===t)return!1}return t=t||(i?o:n),this.visitRows(l,{start:t,includeSelf:!1,reverse:i}),s||t===n||this.visitRows(l,{start:i?o:n,includeSelf:!0,reverse:i}),s}findRelatedNode(e,t,i=!1){const s=this.options.rowHeightPx;let n=null;const o=Math.floor(this.listContainerElement.clientHeight/s);switch(t){case"parent":case"left":e.parent&&e.parent.parent&&(n=e.parent);break;case"first":this.visit((e=>{if(e.isVisible())return n=e,!1}));break;case"last":this.visit((e=>{e.isVisible()&&(n=e)}));break;case"right":e.children&&e.children.length&&(n=e.children[0]);break;case"up":n=this._getNextNodeInView(e,{reverse:!0});break;case"down":n=this._getNextNodeInView(e);break;case"pageDown":{const t=this.getLowestVpNode();n=e._rowIdx<t._rowIdx?t:this._getNextNodeInView(e,{reverse:!1,ofs:o})}break;case"pageUp":if(0===e._rowIdx)n=e;else{const t=this.getTopmostVpNode();n=e._rowIdx>t._rowIdx?t:this._getNextNodeInView(e,{reverse:!0,ofs:o})}break;case"prevMatch":case"nextMatch":if(!this.isFilterActive){this.logWarn(`${t}: Filter is not active.`);break}n=this.findNextNode((e=>e.isMatched()),e,"prevMatch"===t),null==n||n.setActive();break;default:this.logWarn("Unknown relation '"+t+"'.")}return n}*format_iter(e,t){yield*this.root.format_iter(e,t)}format(e,t){return this.root.format(e,t)}getActiveColElem(){return this.activeNode&&this.activeColIdx>=0?this.activeNode.getColElem(this.activeColIdx):null}getActiveNode(){return this.activeNode}getFirstChild(){return this.root.getFirstChild()}getLastChild(){return this.root.getLastChild()}getFocusNode(){return this.focusNode}static getEventInfo(e){const t=e.target,i=t.classList,s=t.closest("span.wb-col"),n=Wunderbaum.getNode(t),o=n?n.tree:Wunderbaum.getTree(e),r={event:e,canonicalName:eventToString(e),tree:o,node:n,region:NodeRegion.unknown,colDef:void 0,colIdx:-1,colId:void 0,colElem:s};if(i.contains("wb-title"))r.region=NodeRegion.title;else if(i.contains("wb-expander"))r.region=n.isExpandable()?NodeRegion.expander:NodeRegion.prefix;else if(i.contains("wb-checkbox"))r.region=NodeRegion.checkbox;else if(i.contains("wb-icon"))r.region=NodeRegion.icon;else if(i.contains("wb-node"))r.region=NodeRegion.title;else if(s){r.region=NodeRegion.column;const e=Array.prototype.indexOf.call(s.parentNode.children,s);r.colIdx=e}else{if(!i.contains("wb-row"))return"mousemove"===e.type||e instanceof KeyboardEvent||null==o||o.logWarn("getEventInfo(): not found",e,r),r;r.region=NodeRegion.title}return-1===r.colIdx&&(r.colIdx=0),r.colDef=null==o?void 0:o.columns[r.colIdx],null!=r.colDef&&(r.colId=r.colDef.id),r}toString(){return`Wunderbaum<'${this.id}'>`}isEditing(){return!!this.nodeListElement.querySelector("input:focus,select:focus")}isEditingTitle(){return this._callMethod("edit.isEditingTitle")}isLoading(){let e=!1;return this.root.visit((t=>{if(t._isLoading||t._requestId)return e=!0,!1}),!0),e}log(...e){this.options.debugLevel>=4&&console.log(this.toString(),...e)}logDebug(...e){this.options.debugLevel>=4&&console.debug(this.toString(),...e)}logError(...e){this.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.options.debugLevel>=3&&console.info(this.toString(),...e)}logTime(e){return this.options.debugLevel>=4&&console.time(this+": "+e),e}logTimeEnd(e){this.options.debugLevel>=4&&console.timeEnd(this+": "+e)}logWarn(...e){this.options.debugLevel>=2&&console.warn(this.toString(),...e)}resetColumns(){this.columns.forEach((e=>{delete e.customWidthPx})),this.update(ChangeType.colStructure)}scrollTo(e){let t,i;e instanceof WunderbaumNode?t=e:(i=e,t=i.node),assert(t&&null!=t._rowIdx,`Invalid node: ${t}`);const s=this.options.rowHeightPx,n=this.element,o=this.headerElement.clientHeight,r=n.scrollTop,l=n.clientHeight,a=t._rowIdx*s+o,d=o,c=a-r,h=c+s,u=null==i?void 0:i.topNode;let p=null;c>=d?h<=l||(p=a+s-l+2):p=a-d-2,null!=p&&(this.log(`scrollTo(${a}): ${r} => ${p}`),n.scrollTop=p,u&&this.scrollTo(u))}scrollToHorz(){const e=this.columns[0]._widthPx,t=this.element.clientWidth,i=this.element.scrollLeft,s=this.getActiveColElem(),n=Number.parseInt(null==s?void 0:s.style.left,10),o=n+Number.parseInt(null==s?void 0:s.style.width,10);let r=i;n-i<e?r=n-e:o-i>t&&(r=o-t),r=Math.max(0,r),this.log(`scrollToHorz(${this.activeColIdx}): ${n}..${o}, fixedOfs=${e}, vpWidth=${t}, curLeft=${i} -> ${r}`),this.element.scrollLeft=r}setColumn(e,t){var i,s,n;const o=null==t?void 0:t.edit,r=!1!==(null==t?void 0:t.scrollIntoView);if(assert(this.isCellNav(),"Expected cellNav mode"),"string"==typeof e){const t=e;assert((e=this.columns.findIndex((t=>t.id===e)))>=0,`Invalid colId: ${t}`)}if(assert(0<=e&&e<this.columns.length,`Invalid colIdx: ${e}`),this.activeColIdx=e,this.hasHeader())for(const t of this.headerElement.children){let i=0;for(const s of t.children)s.classList.toggle("wb-active",i++===e)}null===(i=this.activeNode)||void 0===i||i.update(ChangeType.status);for(const t of this.nodeListElement.children){let i=0;for(const s of t.children)s.classList.toggle("wb-active",i++===e)}(r||o)&&this.scrollToHorz(),o&&this.activeNode&&(0===e?this.activeNode.startEditTitle():null===(n=null===(s=this.getActiveColElem())||void 0===s?void 0:s.querySelector("input,select"))||void 0===n||n.focus())}_setActiveNode(e){this._activeNode=e}setActiveNode(e,t=!0,i){var s;null===(s=this.findKey(e))||void 0===s||s.setActive(t,i)}setFocus(e=!0){e?this.element.focus():this.element.blur()}_setFocusNode(e){this._focusNode=e}getState(e){var t,i;let s;if(!1!==e.expandedKeys){s=[];for(const e of this)e.expanded&&s.push(e.key)}return{activeKey:null!==(i=null===(t=this.activeNode)||void 0===t?void 0:t.key)&&void 0!==i?i:null,activeColIdx:this.activeColIdx,selectedKeys:!1===e.selectedKeys?void 0:this.getSelectedNodes().flatMap((e=>e.key)),expandedKeys:s}}setState(e,t){this.runWithDeferredUpdate((()=>{var t,i;if(e.selectedKeys){this.selectAll(!1);for(const i of e.selectedKeys)null===(t=this.findKey(i))||void 0===t||t.setSelected(!0)}if(e.expandedKeys)for(const t of e.expandedKeys)null===(i=this.findKey(t))||void 0===i||i.setExpanded(!0);e.activeKey&&this.setActiveNode(e.activeKey),null!=e.activeColIdx&&this.setColumn(e.activeColIdx)}))}update(e,t,i){t instanceof WunderbaumNode||(i=t,t=void 0);const s=!!getOption(i,"immediate"),n=RenderFlag,o=this.pendingChangeTypes;if(this._disableUpdateCount)this._disableUpdateIgnoreCount++;else{switch(e){case ChangeType.any:case ChangeType.colStructure:o.add(n.header),o.add(n.clearMarkup),o.add(n.redraw),o.add(n.scroll);break;case ChangeType.resize:o.add(n.header),o.add(n.redraw);break;case ChangeType.structure:o.add(n.redraw);break;case ChangeType.scroll:o.add(n.scroll);break;case ChangeType.row:case ChangeType.data:case ChangeType.status:assert(t,`Option '${e}' requires a node.`),t._rowElem&&t._render({change:e});break;default:error(`Invalid change type '${e}'.`)}if(e===ChangeType.colStructure){const e=this.isGrid();this.element.classList.toggle("wb-grid",e),!e&&this.isCellNav()&&this.setCellNav(!1)}o.size>0&&(s?this._updateViewportImmediately():this._updateViewportThrottled())}}setEnabled(e=!0){const t=this.enabled;return this.enabled=!!e,this.element.classList.toggle("wb-disabled",!e),t}isEnabled(){return this.enabled}isGrid(){return this.columns&&this.columns.length>1}isCellNav(){return!!this._cellNavMode}isRowNav(){return!this._cellNavMode}setCellNav(e=!0){var t;const i=this._cellNavMode;this._cellNavMode=!!e,e&&!i&&this.setColumn(0),this.element.classList.toggle("wb-cell-mode",e),null===(t=this.activeNode)||void 0===t||t.update(ChangeType.status)}setNavigationOption(e,t=!1){if(this.isGrid()||e===NavModeEnum.row)switch(this.options.navigationModeOption=e,e){case NavModeEnum.cell:this.setCellNav(!0);break;case NavModeEnum.row:this.setCellNav(!1);break;case NavModeEnum.startCell:t&&this.setCellNav(!0);break;case NavModeEnum.startRow:t&&this.setCellNav(!1);break;default:error(`Invalid mode '${e}'.`)}else this.logWarn("Plain trees only support row navigation mode.")}setStatus(e,t){return this.root.setStatus(e,t)}setTypes(e,t=!0){assert(isPlainObject(e),`Expected plain objext: ${e}`),t?this.types=e:extend(this.types,e);for(const e of Object.values(this.types))e.classes&&(e.classes=toSet(e.classes))}sortChildren(e=nodeTitleSorter,t=!1){this.root.sortChildren(e,t)}sortByProperty(e){this.root.sortByProperty(e)}toDictArray(e){var t;return null!==(t=this.root.toDict(!0,e).children)&&void 0!==t?t:[]}_updateColumnWidths(){const e=this.element.clientWidth,t=this.columns,i=t[0];let s=0,n=0,o=0,r=!1;if("*"!==i.id)throw new Error(`First column must have id '*': got '${i.id}'.`);this._columnsById={};for(const e of t){this._columnsById[e.id]=e;const t=e.customWidthPx?`${e.customWidthPx}px`:e.width;if("*"===e.id&&e!==i)throw new Error(`Column id '*' must be defined only once: '${e.title}'.`);if(t&&"*"!==t)if("number"==typeof t)e._weight=t,n+=t;else if("string"==typeof t&&t.endsWith("px")){e._weight=0;const i=parseFloat(t.slice(0,-2));e._widthPx!=i&&(r=!0,e._widthPx=i),o+=i}else error(`Invalid column width: ${t} (expected string ending with 'px' or number, e.g. "<num>px" or <int>).`);else e._weight=1,n+=1}const l=Math.max(0,e-o);let a=0;for(const e of t){let t;if(e._weight){const i=e.minWidth;t="number"==typeof i?i:"string"==typeof i&&i.endsWith("px")?parseFloat(i.slice(0,-2)):4;const s=Math.max(t,l*e._weight/n);e._widthPx!=s&&(r=!0,e._widthPx=s)}e._ofsPx=a,a+=e._widthPx}t[t.length-1]._widthPx-=1,s=a-1;const d=`${s}px`;return this.headerElement.style.width=d,this.listContainerElement.style.width=d,r}_renderHeaderMarkup(){assert(this.headerElement,"Expected a headerElement");const e=this.hasHeader();if(setElemDisplay(this.headerElement,e),!e)return;const t=this.iconMap,i=this.columns.length,s=this.headerElement.querySelector(".wb-row");assert(s,"Expected a row in header element"),s.innerHTML="<span class='wb-col'></span>".repeat(i);for(let e=0;e<i;e++){const n=this.columns[e],o=s.children[e];o.style.left=n._ofsPx+"px",o.style.width=n._widthPx+"px","string"==typeof n.headerClasses?n.headerClasses&&o.classList.add(...n.headerClasses.split(" ")):n.classes&&o.classList.add(...n.classes.split(" "));let r="";n.tooltip&&(r=escapeTooltip(n.tooltip),r=` title="${r}"`);let l="";if(toBool(n.menu,this.options.columnsMenu,!1)){l+=`<i data-command=menu class="wb-col-icon ${"wb-col-icon-menu "+t.colMenu}"></i>`}if(toBool(n.sortable,this.options.columnsSortable,!1)){let e="wb-col-icon-sort "+t.colSortable;n.sortOrder&&(e+=`wb-col-sort-${n.sortOrder}`,e+="asc"===n.sortOrder?t.colSortAsc:t.colSortDesc);l+=`<i data-command=sort class="wb-col-icon ${e}"></i>`}if(toBool(n.filterable,this.options.columnsFilterable,!1)){o.classList.toggle("wb-col-filter",!!n.filterActive);let e="wb-col-icon-filter "+t.colFilter;n.filterActive&&(e+=t.colFilterActive);l+=`<i data-command=filter class="wb-col-icon ${e}"></i>`}e<i-1&&(toBool(n.resizable,this.options.columnsResizable,!1)?l+='<span class="wb-col-resizer wb-col-resizer-active"></span>':l+='<span class="wb-col-resizer"></span>');const a=escapeHtml(n.title||n.id);o.innerHTML=`<span class="wb-col-title"${r}>${a}</span>${l}`,this.isCellNav()&&o.classList.toggle("wb-active",e===this.activeColIdx)}}updatePendingModifications(){this.pendingChangeTypes.size>0&&this._updateViewportImmediately()}_createNodeIcon(e,t,i){const s=this.iconMap;let n,o=e.getOption("icon");if(e._errorInfo?o=s.error:e._isLoading&&t&&(o=s.loading),!1===o)return null;"string"==typeof o||(o=e.statusNodeType?s[e.statusNodeType]:e.expanded?s.folderOpen:e.children?s.folder:e.lazy?s.folderLazy:s.doc),o?o.indexOf("<")>=0?n=elemFromHtml(o):TEST_IMG.test(o)?n=elemFromHtml(`<i class="wb-icon" style="background-image: url('${o}');">`):(n=document.createElement("i"),n.className="wb-icon "+o):(n=document.createElement("i"),n.className="wb-icon");const r=i&&e._callEvent("iconBadge",{iconSpan:n});let l=null;if(null!=r&&!1!==r){let e="",t="";isPlainObject(r)?(l=""+r.badge,e=r.badgeClass?" "+r.badgeClass:"",t=r.badgeTooltip?` title="${r.badgeTooltip}"`:""):l="number"==typeof r?""+r:r,"string"==typeof l&&(l=elemFromHtml(`<span class="wb-badge${e}"${t}>${escapeHtml(l)}</span>`)),l&&n.append(l)}return n}_updateTopBreadcrumb(){const e=this.breadcrumb,t=this.getTopmostVpNode(!0),i=null==t?void 0:t.getParentList(!1,!1);if(null==i?void 0:i.length){e.innerHTML="";for(const i of t.getParentList(!1,!1)){const t=this._createNodeIcon(i,!1,!1);t&&e.append(t," ");const s=document.createElement("a");s.textContent=i.title,s.href="#",s.classList.add("wb-breadcrumb"),s.dataset.key=i.key,e.append(s,this.options.strings.breadcrumbDelimiter)}}else e.innerHTML="&nbsp;"}_updateViewportImmediately(){if(this._disableUpdateCount)return this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount}).`),void this._disableUpdateIgnoreCount++;this._updateViewportThrottled.pending()&&this._updateViewportThrottled.cancel();const e=RenderFlag,t=new Set(this.pendingChangeTypes);this.pendingChangeTypes.clear();if(t.has(e.scroll)&&1===t.size)this._updateRows({newNodesOnly:!0});else{if(this.log("_updateViewportImmediately():",t),!1!==this.options.adjustHeight){let e=this.listContainerElement.clientHeight;const t=this.headerElement.clientHeight,i=this.element.clientHeight-t-1;Math.abs(e-i)>1&&(this.listContainerElement.style.height=i+"px",e=i)}t.has(e.clearMarkup)&&this.visit((e=>{e.removeMarkup()})),t.has(e.header)&&(this._updateColumnWidths(),this._renderHeaderMarkup()),this._updateRows()}this.breadcrumb&&this._updateTopBreadcrumb(),this._callEvent("update")}_updateRows(e){const t=!!(e=Object.assign({newNodesOnly:!1},e)).newNodesOnly,i=this.options.rowHeightPx,s=this.element.clientHeight,n=this.element.scrollTop;let o=Math.max(0,n/i-5);o=Math.floor(o),o%2&&o--;let r=Math.max(0,(n+s)/i+5);r=Math.ceil(r);const l=new Set;this.nodeListElement.childNodes.forEach((e=>{e._wb_node&&l.add(e._wb_node)}));let a=0,d=0,c=!1,h="first";this.visitRows((function(e){const s=e._rowElem;e._rowIdx!==a&&(e._rowIdx=a,c=!0),a<o||a>r?s&&(h=s):s&&t?(l.delete(e),s.style.top=a*i+"px",h=s):(l.delete(e),s&&(s.style.top=a*i+"px"),e._render({top:d,after:h}),h=e._rowElem),a++,d+=i})),this.treeRowCount=a;for(const e of l)e._callEvent("discard"),e.removeMarkup();return this.nodeListElement.style.height=`${d}px`,c}visit(e){return this.root.visit(e,!1)}visitRows(e,t){if(!this.root.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);let i,s,n,o,r,l,a=0,d=!1===(t=t||{}).includeSelf,c=t.start||this.root.children[0];const h=!!t.includeHidden,u=!h&&"hide"===this.filterMode;for(n=c.parent;n;){for(r=n.children,s=r.indexOf(c)+a,assert(s>=0,`Could not find ${c} in parent's children: ${n}`),i=s;i<r.length;i++){if(c=r[i],c===l)return!1;if(!u||c.statusNodeType||c.match||c.subMatchCount){if(!d&&!1===e(c))return!1;if(d=!1,c.children&&c.children.length&&(h||c.expanded)&&(o=c.visit((t=>t!==l&&(!u||t.match||t.subMatchCount?!1!==e(t)&&(h||!t.children||t.expanded?void 0:"skip"):"skip")),!1),!1===o))return!1}}c=n,n=n.parent,a=1,!n&&t.wrap&&(this.logDebug("visitRows(): wrap around"),assert(t.start,"`wrap` option requires `start`"),l=t.start,t.wrap=!1,n=this.root,a=0)}return!0}_visitRowsUp(e,t){let i,s,n,o=t.start||this.root.children[0];const r=!!t.includeHidden;if(!1!==t.includeSelf&&!1===e(o))return!1;for(;;){if(n=o.parent,i=n.children,i[0]===o){if(o=n,!o.parent)break;i=n.children}else for(s=i.indexOf(o),o=i[s-1];(r||o.expanded)&&o.children&&o.children.length;)i=o.children,n=o,o=i[i.length-1];if((r||o.isVisible())&&!1===e(o))return!1}return!0}load(e){return this.clear(),this.root.load(e)}enableUpdate(e){e?(assert(this._disableUpdateCount>0,"enableUpdate(true) was called too often"),this._disableUpdateCount--,0===this._disableUpdateCount&&(this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`),this._disableUpdateIgnoreCount=0,this.update(ChangeType.any,{immediate:!0}))):this._disableUpdateCount++}filterNodes(e,t){return this.extensions.filter.filterNodes(e,t)}countMatches(){return this.extensions.filter.countMatches()}filterBranches(e,t){return this.extensions.filter.filterBranches(e,t)}clearFilter(){return this.extensions.filter.clearFilter()}isFilterActive(){return!!this.filterMode}updateFilter(){return this.extensions.filter.updateFilter()}}Wunderbaum.sequence=0,Wunderbaum.version="v0.13.0",Wunderbaum.util=util;export{Wunderbaum};
83
+ * @version v0.14.1
84
+ * @date Sun, 22 Mar 2026 05:52:05 GMT
85
+ */class WbSystemRoot extends WunderbaumNode{constructor(e){super(e,null,{key:"__root__",title:e.id})}toString(){return`WbSystemRoot@${this.key}<'${this.tree.id}'>`}}class Wunderbaum{get activeNode(){var e;return(null===(e=this._activeNode)||void 0===e?void 0:e.tree)?this._activeNode:null}get focusNode(){var e;return(null===(e=this._focusNode)||void 0===e?void 0:e.tree)?this._focusNode:null}constructor(e){this.enabled=!0,this.data={},this.extensionList=[],this.extensions={},this.keyMap=new Map,this.refKeyMap=new Map,this.treeRowCount=0,this._disableUpdateCount=0,this._disableUpdateIgnoreCount=0,this._activeNode=null,this._focusNode=null,this._initialSource=null,this.types={},this.columns=[],this._columnsById={},this.pendingChangeTypes=new Set,this._util=util,this.breadcrumb=null,this.filterMode=null,this.activeColIdx=0,this._cellNavMode=!1,this.lastQuicksearchTime=0,this.lastQuicksearchTerm="",this.lastClickTime=0;const t=Object.assign({id:void 0,source:[],element:unsafeCast(null),debugLevel:3,header:null,rowHeightPx:22,iconMap:"bootstrap",columns:[],types:{},enabled:!0,fixedCol:!1,showSpinner:!1,checkbox:!1,minExpandLevel:0,emptyChildListExpandable:!1,skeleton:!1,autoCollapse:!1,adjustHeight:!0,connectTopBreadcrumb:null,columnsFilterable:!1,columnsMenu:!1,columnsResizable:!1,columnsSortable:!1,selectMode:"multi",scrollIntoViewOnExpandClick:!0,dnd:unsafeCast(null),edit:unsafeCast(null),filter:unsafeCast(null),navigationModeOption:unsafeCast(null),quicksearch:!0,strings:{loadError:"Error",loading:"Loading...",noData:"No data",breadcrumbDelimiter:" » ",queryResult:"Found ${matches} of ${count}",noMatch:"No results",matchIndex:"${match} of ${matches}"}},e),i=t;this.options=i;const s=new Deferred;this.ready=s.promise();let n=!1;if(this.ready.then(()=>{n=!0;try{this._callEvent("init")}catch(e){this.logError("Exception inside `init(e)` event:",e)}}).catch(e=>{if(n)throw e;this._callEvent("init",{error:e})}),this.id=t.id||"wb_"+ ++Wunderbaum.sequence,delete t.id,this.root=new WbSystemRoot(this),this._registerExtension(new KeynavExtension(this)),this._registerExtension(new EditExtension(this)),this._registerExtension(new FilterExtension(this)),this._registerExtension(new DndExtension(this)),this._registerExtension(new GridExtension(this)),this._registerExtension(new LoggerExtension(this)),this._updateViewportThrottled=adaptiveThrottle(this._updateViewportImmediately.bind(this),{}),this.columns=t.columns||[],delete t.columns,!this.columns||!this.columns.length){const e="string"==typeof i.header?i.header:this.id;this.columns=[{id:"*",title:e,width:"*"}]}t.types&&this.setTypes(t.types,!0),delete t.types,this.element=elemFromSelector(t.element),assert(!!this.element,`Invalid 'element' option: ${t.element}`),delete t.element,this.element.classList.add("wunderbaum"),this.element.getAttribute("tabindex")||(this.element.tabIndex=0),22!==i.rowHeightPx&&(this.element.style.setProperty("--wb-row-outer-height",i.rowHeightPx+"px"),this.element.style.setProperty("--wb-row-inner-height",i.rowHeightPx-2+"px")),this.element._wb_tree=this,this.headerElement=this.element.querySelector("div.wb-header");const r=null==i.header?this.columns.length>1:!!i.header;if(this.headerElement){assert(!this.columns,"`opts.columns` must not be set if table markup already contains a header"),this.columns=[];const e=this.headerElement.querySelector("div.wb-row");for(const t of e.querySelectorAll("div"))this.columns.push({id:t.dataset.id||`col_${this.columns.length}`,title:""+t.textContent,width:"*"})}else{const e="<span class='wb-col'></span>".repeat(this.columns.length);if(this.element.innerHTML=`\n <div class='wb-header'>\n <div class='wb-row'>\n ${e}\n </div>\n </div>`,!r){this.element.querySelector("div.wb-header").style.display="none"}}this.element.innerHTML+='\n <div class="wb-list-container">\n <div class="wb-node-list"></div>\n </div>',this.listContainerElement=this.element.querySelector("div.wb-list-container"),this.nodeListElement=this.listContainerElement.querySelector("div.wb-node-list"),this.headerElement=this.element.querySelector("div.wb-header"),this.element.classList.toggle("wb-grid",this.columns.length>1),this.options.connectTopBreadcrumb&&(this.breadcrumb=elemFromSelector(this.options.connectTopBreadcrumb),assert(!this.breadcrumb||null!=this.breadcrumb.innerHTML,`Invalid 'connectTopBreadcrumb' option: ${this.breadcrumb}.`),this.breadcrumb.addEventListener("click",e=>{const t=e.target;if(t&&t.matches("a.wb-breadcrumb")){const i=this.keyMap.get(t.dataset.key);null==i||i.setActive(),e.preventDefault()}})),this._initExtensions(),["enabled","fixedCol"].forEach(e=>{null!=i[e]&&this.setOption(e,i[e])}),t.source?(i.showSpinner&&(this.nodeListElement.innerHTML=`<progress class='spinner'>${i.strings.loading}</progress>`),this.load(t.source).then(()=>{null==i.navigationModeOption?this.isGrid()?this.setNavigationOption(NavModeEnum.cell):this.setNavigationOption(NavModeEnum.row):this.setNavigationOption(i.navigationModeOption),this.update(ChangeType.structure,{immediate:!0}),s.resolve()}).catch(e=>{s.reject(e)}).finally(()=>{var e;null===(e=this.element.querySelector("progress.spinner"))||void 0===e||e.remove(),this.element.classList.remove("wb-initializing")})):s.resolve(),this.update(ChangeType.any),this._registerEventHandlers(),this.resizeObserver=new ResizeObserver(e=>{this.update(ChangeType.resize)}),this.resizeObserver.observe(this.element)}_registerEventHandlers(){this.element.addEventListener("scroll",e=>{this.update(ChangeType.scroll)}),onEvent(this.element,"click",".wb-button,.wb-col-icon",e=>{var t,i;const s=Wunderbaum.getEventInfo(e),n=null===(i=null===(t=e.target)||void 0===t?void 0:t.dataset)||void 0===i?void 0:i.command;this._callEvent("buttonClick",{event:e,info:s,command:n})}),onEvent(this.nodeListElement,"click","div.wb-row",e=>{const t=Wunderbaum.getEventInfo(e),i=t.node,s=e;if(!1===this._callEvent("click",{event:e,node:i,info:t}))return this.lastClickTime=Date.now(),!1;if(i){if(s.ctrlKey)return void i.toggleSelected();const n=this.getOption("edit.trigger"),r=this.getOption("edit.slowClickDelay");n.indexOf("clickActive")>=0&&"title"===t.region&&i.isActive()&&(!r||Date.now()-this.lastClickTime<r)&&i.startEditTitle(),t.region===NodeRegion.expander?i.setExpanded(!i.isExpanded(),{scrollIntoView:!1!==this.options.scrollIntoViewOnExpandClick}):t.region===NodeRegion.checkbox?i.toggleSelected():t.colIdx>=0?i.setActive(!0,{colIdx:t.colIdx,event:e}):i.setActive(!0,{event:e})}this.lastClickTime=Date.now()}),onEvent(this.nodeListElement,"dblclick","div.wb-row",e=>{const t=Wunderbaum.getEventInfo(e),i=t.node;if(!1===this._callEvent("dblclick",{event:e,node:i,info:t}))return!1;i&&0===t.colIdx&&i.isExpandable()&&t.region!==NodeRegion.expander&&(this._callMethod("edit._stopEditTitle"),i.setExpanded(!i.isExpanded()))}),onEvent(this.element,"keydown",e=>{const t=Wunderbaum.getEventInfo(e),i=eventToString(e),s=t.node||this.getFocusNode();this._callHook("onKeyEvent",{event:e,node:s,info:t,eventName:i})}),onEvent(this.element,"focusin focusout",e=>{const t="focusin"===e.type,i=Wunderbaum.getNode(e);this._callEvent("focus",{flag:t,event:e}),t&&this.isRowNav()&&!this.isEditingTitle()&&(this.options.navigationModeOption===NavModeEnum.row?null==i||i.setActive():this.setCellNav()),t||this._callMethod("edit._stopEditTitle",!0,{event:e,forceClose:!0})})}static getTree(e){if(e instanceof Wunderbaum)return e;if(e instanceof WunderbaumNode)return e.tree;if(void 0===e&&(e=0),"number"==typeof e)e=document.querySelectorAll(".wunderbaum")[e];else if("string"==typeof e){for(const t of document.querySelectorAll(".wunderbaum")){const i=t._wb_tree;if(i&&i.id===e)return i}if(!(e=document.querySelector(e)))return null}else e.target&&(e=e.target);return assert(e instanceof Element,`Invalid el type: ${e}`),e.matches(".wunderbaum")||(e=e.closest(".wunderbaum")),e&&e._wb_tree?e._wb_tree:null}get iconMap(){const e=this.options.iconMap;return"string"==typeof e?defaultIconMaps[e]:e}static getNode(e){if(!e)return null;if(e instanceof WunderbaumNode)return e;for(void 0!==e.target&&(e=e.target);e;){if(e._wb_node)return e._wb_node;e=e.parentElement}return null}*[Symbol.iterator](){yield*this.root}_registerExtension(e){this.extensionList.push(e),this.extensions[e.id]=e}_initExtensions(){for(const e of this.extensionList)e.init()}_calculateKey(e,t){if(e.key)return e.key;if(!this.options.autoKeys)return""+ ++WunderbaumNode.sequence;const i=(t?t.key:"")+(e.refKey||e.title),s=murmurHash3(i,!0);let n="id_"+s+murmurHash3(s+i,!0);const r=this.keyMap.get(n);return r&&(n+="."+ ++Wunderbaum.sequence,this.logWarn(`Node with existing key: '${r}', using ${n}.`,e)),n}_registerNode(e){const t=e.key;assert(null!=t,`Missing key: '${e}'.`),assert(!this.keyMap.has(t),`Duplicate key: '${t}': ${e}.`),this.keyMap.set(t,e);const i=e.refKey;if(null!=i){const t=this.refKeyMap.get(i);t?t.add(e):this.refKeyMap.set(i,new Set([e]))}}_unregisterNode(e){const t=e.refKey;if(null!=t){const i=this.refKeyMap.get(t);i&&i.delete(e)&&!i.size&&this.refKeyMap.delete(t)}this.keyMap.delete(e.key),e.tree=null,e.parent=null,e.removeMarkup()}_callHook(e,t={}){let i;const s=extend({},{tree:this,options:this.options,result:void 0},t);for(const t of this.extensionList){if(i=t[e].call(t,s),!1===i)break;void 0!==s.result&&(i=s.result)}return i}_callMethod(e,...t){const[i,s]=e.split("."),n=s?this.extensions[i]:this,r=n[s];if(r)return r.apply(n,t);this.logError(`Calling undefined method '${e}()'.`)}_callEvent(e,t){const[i,s]=e.split("."),n=this.options,r=s?n[i][s]:n[i];if(r)return r.call(this,extend({type:e,tree:this,util:this._util},t))}_getNodeByRowIdx(e){let t=null;return this.visitRows(i=>{if(i._rowIdx===e)return t=i,!1}),t}getTopmostVpNode(e=!0){const t=this.options.rowHeightPx,i=this.element.scrollTop;let s;return s=e?Math.ceil((i-1)/t):Math.floor(i/t),this._getNodeByRowIdx(s)}getLowestVpNode(e=!0){const t=this.options.rowHeightPx,i=this.element,s=this.headerElement.clientHeight,n=i.scrollTop,r=i.clientHeight-s;let o;return o=e?Math.floor((n+r)/t)-1:Math.ceil((n+r)/t)-1,o=Math.min(o,this.count(!0)-1),this._getNodeByRowIdx(o)}_getPrevNodeInView(e,t=1){return this.visitRows(i=>{if(e=i,t--<=0)return!1},{reverse:!0,start:e||this.getActiveNode()}),e}_getNextNodeInView(e,t){let i=(null==t?void 0:t.ofs)||1;const s=!!(null==t?void 0:t.reverse);return this.visitRows(s=>(e=s,(!(null==t?void 0:t.cb)||!t.cb(s))&&(!(i--<=0)&&void 0)),{reverse:s,start:e||this.getActiveNode()}),e}addChildren(e,t){return this.root.addChildren(e,t)}applyCommand(e,t,i){let s,n;switch(t instanceof WunderbaumNode?s=t:(s=this.getActiveNode(),assert(void 0===i,`Unexpected options: ${i}`),i=t),e){case"moveUp":n=s.getPrevSibling(),n&&(s.moveTo(n,"before"),s.setActive());break;case"moveDown":n=s.getNextSibling(),n&&(s.moveTo(n,"after"),s.setActive());break;case"indent":n=s.getPrevSibling(),n&&(s.moveTo(n,"appendChild"),n.setExpanded(),s.setActive());break;case"outdent":s.isTopLevel()||(s.moveTo(s.getParent(),"after"),s.setActive());break;case"remove":n=s.getPrevSibling()||s.getParent(),s.remove(),n&&n.setActive();break;case"addChild":this._callMethod("edit.createNode","prependChild");break;case"addSibling":this._callMethod("edit.createNode","after");break;case"rename":s.startEditTitle();break;case"down":case"first":case"last":case"left":case"nextMatch":case"pageDown":case"pageUp":case"parent":case"prevMatch":case"right":case"up":return s.navigate(e);default:error(`Unhandled command: '${e}'`)}}clear(){this.root.removeChildren(),this.root.children=null,this.keyMap.clear(),this.refKeyMap.clear(),this.treeRowCount=0,this._activeNode=null,this._focusNode=null,this.update(ChangeType.structure)}destroy(){this.logInfo("destroy()..."),this.clear(),this.resizeObserver.disconnect(),this.element.innerHTML="",this.element.outerHTML=this.element.outerHTML}getOption(e,t){let i,s=this.options;e.indexOf(".")>=0&&([i,e]=e.split("."),s=s[i]);let n=s[e];return"function"==typeof n&&(n=n({type:"resolve",tree:this})),null!=n?n:t}setOption(e,t){if(e.indexOf(".")>=0){const i=e.split(".");return void this.extensions[i[0]].setPluginOption(i[1],t)}switch(this.options[e]=t,e){case"checkbox":this.update(ChangeType.any);break;case"enabled":this.setEnabled(!!t);break;case"fixedCol":this.element.classList.toggle("wb-fixed-col",!!t)}}hasFocus(){return this.element.contains(document.activeElement)}hasHeader(){const e=this.options.header;return this.isGrid()?!1!==e:!!e}runWithDeferredUpdate(e){try{this.enableUpdate(!1);const t=e();return assert(!(t instanceof Promise),`Promise return not allowed (see 'runWithDeferredUpdateAsync()'): ${t}`),t}finally{this.enableUpdate(!0)}}async runWithDeferredUpdateAsync(e){try{return this.enableUpdate(!1),await e()}finally{this.enableUpdate(!0)}}async expandAll(e=!0,t){await this.root.expandAll(e,t)}selectAll(e=!0){return this.root.setSelected(e,{propagateDown:!0})}toggleSelect(){this.selectAll(this.root._anySelectable())}getSelectedNodes(e=!1){return this.root.getSelectedNodes(e)}getRefKeys(e=!1){return this.root.getRefKeys(e)}_selectRange(e){this.logDebug("_selectRange",e),error("Not yet implemented.")}count(e=!1){return e?this.treeRowCount:this.keyMap.size}countUnique(){return this.refKeyMap.size}_check(){let e=0;this.visit(t=>{e++}),this.keyMap.size!==e&&this.logWarn(`_check failed: ${this.keyMap.size} !== ${e}`)}findAll(e){return this.root.findAll(e)}findByRefKey(e){const t=this.refKeyMap.get(e);return t?Array.from(t):[]}findFirst(e){return this.root.findFirst(e)}findKey(e){return this.keyMap.get(e)||null}findNextNode(e,t,i=!1){let s=null;const n=this.getFirstChild(),r=i?this.findRelatedNode(n,"last"):null,o="string"==typeof e?makeNodeTitleStartMatcher(e):e;function l(e){if(o(e)&&(s=e),s||e===t)return!1}return t=t||(i?r:n),this.visitRows(l,{start:t,includeSelf:!1,reverse:i}),s||t===n||this.visitRows(l,{start:i?r:n,includeSelf:!0,reverse:i}),s}findRelatedNode(e,t,i=!1){const s=this.options.rowHeightPx;let n=null;const r=Math.floor(this.listContainerElement.clientHeight/s);switch(t){case"parent":case"left":e.parent&&e.parent.parent&&(n=e.parent);break;case"first":this.visit(e=>{if(e.isVisible())return n=e,!1});break;case"last":this.visit(e=>{e.isVisible()&&(n=e)});break;case"right":e.children&&e.children.length&&(n=e.children[0]);break;case"up":n=this._getNextNodeInView(e,{reverse:!0});break;case"down":n=this._getNextNodeInView(e);break;case"pageDown":{const t=this.getLowestVpNode();n=e._rowIdx<t._rowIdx?t:this._getNextNodeInView(e,{reverse:!1,ofs:r})}break;case"pageUp":if(0===e._rowIdx)n=e;else{const t=this.getTopmostVpNode();n=e._rowIdx>t._rowIdx?t:this._getNextNodeInView(e,{reverse:!0,ofs:r})}break;case"prevMatch":case"nextMatch":if(!this.isFilterActive){this.logWarn(`${t}: Filter is not active.`);break}n=this.findNextNode(e=>e.isMatched(),e,"prevMatch"===t),null==n||n.setActive();break;default:this.logWarn("Unknown relation '"+t+"'.")}return n}*format_iter(e,t){yield*this.root.format_iter(e,t)}format(e,t){return this.root.format(e,t)}get parent(){return null}get children(){return this.root.children||[]}getActiveColElem(){return this.activeNode&&this.activeColIdx>=0?this.activeNode.getColElem(this.activeColIdx):null}getActiveNode(){return this.activeNode}getFirstChild(){return this.root.getFirstChild()}getLastChild(){return this.root.getLastChild()}getFocusNode(){return this.focusNode}static getEventInfo(e){const t=e.target,i=t.classList,s=t.closest("span.wb-col"),n=Wunderbaum.getNode(t),r=n?n.tree:Wunderbaum.getTree(e),o={event:e,canonicalName:eventToString(e),tree:r,node:n,region:NodeRegion.unknown,colDef:void 0,colIdx:-1,colId:void 0,colElem:s};if(i.contains("wb-title"))o.region=NodeRegion.title;else if(i.contains("wb-expander"))o.region=n.isExpandable()?NodeRegion.expander:NodeRegion.prefix;else if(i.contains("wb-checkbox"))o.region=NodeRegion.checkbox;else if(i.contains("wb-icon"))o.region=NodeRegion.icon;else if(i.contains("wb-node"))o.region=NodeRegion.title;else if(s){o.region=NodeRegion.column;const e=Array.prototype.indexOf.call(s.parentNode.children,s);o.colIdx=e}else{if(!i.contains("wb-row"))return"mousemove"===e.type||e instanceof KeyboardEvent||null==r||r.logWarn("getEventInfo(): not found",e,o),o;o.region=NodeRegion.title}return-1===o.colIdx&&(o.colIdx=0),o.colDef=null==r?void 0:r.columns[o.colIdx],null!=o.colDef&&(o.colId=o.colDef.id),o}toString(){return`Wunderbaum<'${this.id}'>`}isEditing(){return!!this.nodeListElement.querySelector("input:focus,select:focus")}isEditingTitle(){return this._callMethod("edit.isEditingTitle")}isLoading(){let e=!1;return this.root.visit(t=>{if(t._isLoading||t._requestId)return e=!0,!1},!0),e}log(...e){this.options.debugLevel>=4&&console.log(this.toString(),...e)}logDebug(...e){this.options.debugLevel>=4&&console.debug(this.toString(),...e)}logError(...e){this.options.debugLevel>=1&&console.error(this.toString(),...e)}logInfo(...e){this.options.debugLevel>=3&&console.info(this.toString(),...e)}logTime(e){return this.options.debugLevel>=4&&console.time(this+": "+e),e}logTimeEnd(e){this.options.debugLevel>=4&&console.timeEnd(this+": "+e)}logWarn(...e){this.options.debugLevel>=2&&console.warn(this.toString(),...e)}logDeprecate(e,t){if(this.options.debugLevel>=2){let i=`${this}: ${e} is deprecated`;(null==t?void 0:t.since)&&(i+=` since ${t.since}`),(null==t?void 0:t.hint)&&(i+=` (${t.since})`),console.warn(i+".")}}resetColumns(){this.columns.forEach(e=>{delete e.customWidthPx}),this.update(ChangeType.colStructure)}scrollTo(e){let t,i;e instanceof WunderbaumNode?t=e:(i=e,t=i.node),assert(t&&null!=t._rowIdx,`Invalid node: ${t}`);const s=this.options.rowHeightPx,n=this.element,r=this.headerElement.clientHeight,o=n.scrollTop,l=n.clientHeight,a=t._rowIdx*s+r,d=r,c=a-o,h=c+s,u=null==i?void 0:i.topNode;let p=null;c>=d?h<=l||(p=a+s-l+2):p=a-d-2,null!=p&&(this.log(`scrollTo(${a}): ${o} => ${p}`),n.scrollTop=p,u&&this.scrollTo(u))}scrollToHorz(){const e=this.columns[0]._widthPx,t=this.element.clientWidth,i=this.element.scrollLeft,s=this.getActiveColElem(),n=Number.parseInt(null==s?void 0:s.style.left,10),r=n+Number.parseInt(null==s?void 0:s.style.width,10);let o=i;n-i<e?o=n-e:r-i>t&&(o=r-t),o=Math.max(0,o),this.log(`scrollToHorz(${this.activeColIdx}): ${n}..${r}, fixedOfs=${e}, vpWidth=${t}, curLeft=${i} -> ${o}`),this.element.scrollLeft=o}setColumn(e,t){var i,s,n;const r=null==t?void 0:t.edit,o=!1!==(null==t?void 0:t.scrollIntoView);if(assert(this.isCellNav(),"Expected cellNav mode"),"string"==typeof e){const t=e;assert((e=this.columns.findIndex(t=>t.id===e))>=0,`Invalid colId: ${t}`)}if(assert(0<=e&&e<this.columns.length,`Invalid colIdx: ${e}`),this.activeColIdx=e,this.hasHeader())for(const t of this.headerElement.children){let i=0;for(const s of t.children)s.classList.toggle("wb-active",i++===e)}null===(i=this.activeNode)||void 0===i||i.update(ChangeType.status);for(const t of this.nodeListElement.children){let i=0;for(const s of t.children)s.classList.toggle("wb-active",i++===e)}(o||r)&&this.scrollToHorz(),r&&this.activeNode&&(0===e?this.activeNode.startEditTitle():null===(n=null===(s=this.getActiveColElem())||void 0===s?void 0:s.querySelector("input,select"))||void 0===n||n.focus())}_setActiveNode(e){this._activeNode=e}setActiveNode(e,t=!0,i){var s;null===(s=this.findKey(e))||void 0===s||s.setActive(t,i)}setFocus(e=!0){e?this.element.focus():this.element.blur()}_setFocusNode(e){this._focusNode=e}getState(e={}){var t,i;const{activeKey:s=!0,expandedKeys:n=!1,selectedKeys:r=!1}=e,o=new Set;if(n)for(const e of this)e.isExpanded()&&e.hasChildren()&&o.add(e.key);s&&this.activeNode&&this.activeNode.visitParents(e=>{e.parent&&o.add(e.key)},!1);return{expandedKeys:o.size?Array.from(o):void 0,activeKey:null!==(i=null===(t=this.activeNode)||void 0===t?void 0:t.key)&&void 0!==i?i:null,activeColIdx:this.activeColIdx,selectedKeys:r?this.getSelectedNodes().flatMap(e=>e.key):void 0}}async setState(e,t={}){const{expandLazy:i=!0}=t;return this.runWithDeferredUpdateAsync(async()=>{var t,s;if(e.expandedKeys&&e.expandedKeys.length)if(i)await this._loadLazyNodes(e.expandedKeys,{expand:!0,noEvents:!0});else for(const i of e.expandedKeys)null===(t=this.findKey(i))||void 0===t||t.setExpanded(!0);if(e.activeKey&&this.setActiveNode(e.activeKey),e.selectedKeys){this.selectAll(!1);for(const t of e.selectedKeys)null===(s=this.findKey(t))||void 0===s||s.setSelected(!0)}this.isCellNav()&&null!=e.activeColIdx&&this.setColumn(e.activeColIdx)})}update(e,t,i){t instanceof WunderbaumNode||(i=t,t=void 0);const s=!!getOption(i,"immediate"),n=RenderFlag,r=this.pendingChangeTypes;if(this._disableUpdateCount)this._disableUpdateIgnoreCount++;else{switch(e){case ChangeType.any:case ChangeType.colStructure:r.add(n.header),r.add(n.clearMarkup),r.add(n.redraw),r.add(n.scroll);break;case ChangeType.resize:r.add(n.header),r.add(n.redraw);break;case ChangeType.structure:r.add(n.redraw);break;case ChangeType.scroll:r.add(n.scroll);break;case ChangeType.row:case ChangeType.data:case ChangeType.status:assert(t,`Option '${e}' requires a node.`),t._rowElem&&t._render({change:e});break;default:error(`Invalid change type '${e}'.`)}if(e===ChangeType.colStructure){const e=this.isGrid();this.element.classList.toggle("wb-grid",e),!e&&this.isCellNav()&&this.setCellNav(!1)}r.size>0&&(s?this._updateViewportImmediately():this._updateViewportThrottled())}}setEnabled(e=!0){const t=this.enabled;return this.enabled=!!e,this.element.classList.toggle("wb-disabled",!e),t}isEnabled(){return this.enabled}isGrid(){return this.columns&&this.columns.length>1}isCellNav(){return!!this._cellNavMode}isRowNav(){return!this._cellNavMode}setCellNav(e=!0){var t;const i=this._cellNavMode;this._cellNavMode=!!e,e&&!i&&this.setColumn(0),this.element.classList.toggle("wb-cell-mode",e),null===(t=this.activeNode)||void 0===t||t.update(ChangeType.status)}setNavigationOption(e,t=!1){if(this.isGrid()||e===NavModeEnum.row)switch(this.options.navigationModeOption=e,e){case NavModeEnum.cell:this.setCellNav(!0);break;case NavModeEnum.row:this.setCellNav(!1);break;case NavModeEnum.startCell:t&&this.setCellNav(!0);break;case NavModeEnum.startRow:t&&this.setCellNav(!1);break;default:error(`Invalid mode '${e}'.`)}else this.logWarn("Plain trees only support row navigation mode.")}setStatus(e,t){return this.root.setStatus(e,t)}setTypes(e,t=!0){assert(isPlainObject(e),`Expected plain objext: ${e}`),t?this.types=e:extend(this.types,e);for(const e of Object.values(this.types))e.classes&&(e.classes=toSet(e.classes))}sortChildren(e=nodeTitleSorter,t=!1){return this.logDeprecate("sortChildren()",{since:"0.14.0"}),this.sort({cmp:e||void 0,deep:t,propName:"title"})}sortByProperty(e){this.logDeprecate("sortByProperty()",{since:"0.14.0"}),this.root.sortByProperty(e)}sort(e){this.root.sort(e)}toDictArray(e){var t;return null!==(t=this.root.toDict(!0,e).children)&&void 0!==t?t:[]}_updateColumnWidths(){const e=this.element.clientWidth,t=this.columns,i=t[0];let s=0,n=0,r=0,o=!1;if("*"!==i.id)throw new Error(`First column must have id '*': got '${i.id}'.`);this._columnsById={};for(const e of t){this._columnsById[e.id]=e;const t=e.customWidthPx?`${e.customWidthPx}px`:e.width;if("*"===e.id&&e!==i)throw new Error(`Column id '*' must be defined only once: '${e.title}'.`);if(t&&"*"!==t)if("number"==typeof t)e._weight=t,n+=t;else if("string"==typeof t&&t.endsWith("px")){e._weight=0;const i=parseFloat(t.slice(0,-2));e._widthPx!=i&&(o=!0,e._widthPx=i),r+=i}else error(`Invalid column width: ${t} (expected string ending with 'px' or number, e.g. "<num>px" or <int>).`);else e._weight=1,n+=1}const l=Math.max(0,e-r);let a=0;for(const e of t){let t;if(e._weight){const i=e.minWidth;t="number"==typeof i?i:"string"==typeof i&&i.endsWith("px")?parseFloat(i.slice(0,-2)):4;const s=Math.max(t,l*e._weight/n);e._widthPx!=s&&(o=!0,e._widthPx=s)}e._ofsPx=a,a+=e._widthPx}t[t.length-1]._widthPx-=1,s=a-1;const d=`${s}px`;return this.headerElement.style.width=d,this.listContainerElement.style.width=d,o}_renderHeaderMarkup(){assert(this.headerElement,"Expected a headerElement");const e=this.hasHeader();if(setElemDisplay(this.headerElement,e),!e)return;const t=this.iconMap,i=this.columns.length,s=this.headerElement.querySelector(".wb-row");assert(s,"Expected a row in header element"),s.innerHTML="<span class='wb-col'></span>".repeat(i);for(let e=0;e<i;e++){const n=this.columns[e],r=s.children[e];r.style.left=n._ofsPx+"px",r.style.width=n._widthPx+"px","string"==typeof n.headerClasses?n.headerClasses&&r.classList.add(...n.headerClasses.split(" ")):n.classes&&r.classList.add(...n.classes.split(" "));let o="";n.tooltip&&(o=escapeTooltip(n.tooltip),o=` title="${o}"`);let l="";if(toBool(n.menu,this.options.columnsMenu,!1)){l+=`<i data-command=menu class="wb-col-icon ${"wb-col-icon-menu "+t.colMenu}"></i>`}if(toBool(n.sortable,this.options.columnsSortable,!1)){let e="wb-col-icon-sort "+t.colSortable;n.sortOrder&&(e+=`wb-col-sort-${n.sortOrder}`,e+="asc"===n.sortOrder?t.colSortAsc:t.colSortDesc);l+=`<i data-command=sort class="wb-col-icon ${e}"></i>`}if(toBool(n.filterable,this.options.columnsFilterable,!1)){r.classList.toggle("wb-col-filter",!!n.filterActive);let e="wb-col-icon-filter "+t.colFilter;n.filterActive&&(e+=t.colFilterActive);l+=`<i data-command=filter class="wb-col-icon ${e}"></i>`}e<i-1&&(toBool(n.resizable,this.options.columnsResizable,!1)?l+='<span class="wb-col-resizer wb-col-resizer-active"></span>':l+='<span class="wb-col-resizer"></span>');const a=escapeHtml(n.title||n.id);r.innerHTML=`<span class="wb-col-title"${o}>${a}</span>${l}`,this.isCellNav()&&r.classList.toggle("wb-active",e===this.activeColIdx)}}updatePendingModifications(){this.pendingChangeTypes.size>0&&this._updateViewportImmediately()}_createNodeIcon(e,t,i){const s=this.iconMap;let n,r=e.getOption("icon");if(e._errorInfo?r=s.error:e._isLoading&&t&&(r=s.loading),!1===r)return null;"string"==typeof r||(r=e.statusNodeType?s[e.statusNodeType]:e.expanded?s.folderOpen:e.children?s.folder:e.lazy?s.folderLazy:s.doc),r?TEST_HTML.test(r)?n=elemFromHtml(r):TEST_FILE_PATH.test(r)?n=elemFromHtml(`<i class="wb-icon" style="background-image: url('${r}');">`):(n=document.createElement("i"),n.className="wb-icon "+r):(n=document.createElement("i"),n.className="wb-icon");const o=i&&e._callEvent("iconBadge",{iconSpan:n});let l=null;if(null!=o&&!1!==o){let e="",t="";isPlainObject(o)?(l=""+o.badge,e=o.badgeClass?" "+o.badgeClass:"",t=o.badgeTooltip?` title="${o.badgeTooltip}"`:""):l="number"==typeof o?""+o:o,"string"==typeof l&&(l=elemFromHtml(`<span class="wb-badge${e}"${t}>${escapeHtml(l)}</span>`)),l&&n.append(l)}return n}_updateTopBreadcrumb(){const e=this.breadcrumb,t=this.getTopmostVpNode(!0),i=null==t?void 0:t.getParentList(!1,!1);if(null==i?void 0:i.length){e.innerHTML="";for(const i of t.getParentList(!1,!1)){const t=this._createNodeIcon(i,!1,!1);t&&e.append(t," ");const s=document.createElement("a");s.textContent=i.title,s.href="#",s.classList.add("wb-breadcrumb"),s.dataset.key=i.key,e.append(s,this.options.strings.breadcrumbDelimiter)}}else e.innerHTML="&nbsp;"}_updateViewportImmediately(){if(this._disableUpdateCount)return this.log(`_updateViewportImmediately() IGNORED (disable level: ${this._disableUpdateCount}).`),void this._disableUpdateIgnoreCount++;this._updateViewportThrottled.pending()&&this._updateViewportThrottled.cancel();const e=RenderFlag,t=new Set(this.pendingChangeTypes);this.pendingChangeTypes.clear();if(t.has(e.scroll)&&1===t.size)this._updateRows({newNodesOnly:!0});else{if(this.log("_updateViewportImmediately():",t),!1!==this.options.adjustHeight){let e=this.listContainerElement.clientHeight;const t=this.headerElement.clientHeight,i=this.element.clientHeight-t-1;Math.abs(e-i)>1&&(this.listContainerElement.style.height=i+"px",e=i)}t.has(e.clearMarkup)&&this.visit(e=>{e.removeMarkup()}),t.has(e.header)&&(this._updateColumnWidths(),this._renderHeaderMarkup()),this._updateRows()}this.breadcrumb&&this._updateTopBreadcrumb(),this._callEvent("update")}_updateRows(e){const t=!!(e=Object.assign({newNodesOnly:!1},e)).newNodesOnly,i=this.options.rowHeightPx,s=this.element.clientHeight,n=this.element.scrollTop;let r=Math.max(0,n/i-5);r=Math.floor(r),r%2&&r--;let o=Math.max(0,(n+s)/i+5);o=Math.ceil(o);const l=new Set;this.nodeListElement.childNodes.forEach(e=>{e._wb_node&&l.add(e._wb_node)});let a=0,d=0,c=!1,h="first";this.visitRows(function(e){const s=e._rowElem;e._rowIdx!==a&&(e._rowIdx=a,c=!0),a<r||a>o?s&&(h=s):s&&t?(l.delete(e),s.style.top=a*i+"px",h=s):(l.delete(e),s&&(s.style.top=a*i+"px"),e._render({top:d,after:h}),h=e._rowElem),a++,d+=i}),this.treeRowCount=a;for(const e of l)e._callEvent("discard"),e.removeMarkup();return this.nodeListElement.style.height=`${d}px`,c}visit(e){return this.root.visit(e,!1)}visitRows(e,t){if(!this.root.hasChildren())return!1;if(t&&t.reverse)return delete t.reverse,this._visitRowsUp(e,t);let i,s,n,r,o,l,a=0,d=!1===(t=t||{}).includeSelf,c=t.start||this.root.children[0];const h=!!t.includeHidden,u=!h&&"hide"===this.filterMode;for(n=c.parent;n;){for(o=n.children,s=o.indexOf(c)+a,assert(s>=0,`Could not find ${c} in parent's children: ${n}`),i=s;i<o.length;i++){if(c=o[i],c===l)return!1;if(!u||c.statusNodeType||c.match||c.subMatchCount){if(!d&&!1===e(c))return!1;if(d=!1,c.children&&c.children.length&&(h||c.expanded)&&(r=c.visit(t=>t!==l&&(!u||t.match||t.subMatchCount?!1!==e(t)&&(h||!t.children||t.expanded?void 0:"skip"):"skip"),!1),!1===r))return!1}}c=n,n=n.parent,a=1,!n&&t.wrap&&(this.logDebug("visitRows(): wrap around"),assert(t.start,"`wrap` option requires `start`"),l=t.start,t.wrap=!1,n=this.root,a=0)}return!0}_visitRowsUp(e,t){let i,s,n,r=t.start||this.root.children[0];const o=!!t.includeHidden;if(!1!==t.includeSelf&&!1===e(r))return!1;for(;;){if(n=r.parent,i=n.children,i[0]===r){if(r=n,!r.parent)break;i=n.children}else for(s=i.indexOf(r),r=i[s-1];(o||r.expanded)&&r.children&&r.children.length;)i=r.children,n=r,r=i[i.length-1];if((o||r.isVisible())&&!1===e(r))return!1}return!0}async load(e){return this.clear(),this._initialSource=e,this.root.load(e)}async reload(e={}){const{source:t=this._initialSource,reactivate:i=!0}=e;if(!t)return void this.logWarn("No previous ajax source to reload.");if(!i)return this.load(t);const s=this.getState();return await this.load(t),this.setState(s)}async _loadLazyNodes(e,t={}){const{expand:i=!0}=t,s=new Set(e);for(;s.size>0;){const e=[],t=new Set(s);for(const n of t){const t=this.findKey(n);t&&(s.delete(n),i?e.push(t.setExpanded(!0)):t.isUnloaded()&&e.push(t.loadLazy()),t._rowElem&&t._render())}if(0===e.length){this.logWarn(`Could not expand ${s.size} nodes:`,s);break}await Promise.allSettled(e)}}enableUpdate(e){e?(assert(this._disableUpdateCount>0,"enableUpdate(true) was called too often"),this._disableUpdateCount--,0===this._disableUpdateCount&&(this.logDebug(`enableUpdate(): active again. Re-painting to catch up with ${this._disableUpdateIgnoreCount} ignored update requests...`),this._disableUpdateIgnoreCount=0,this.update(ChangeType.any,{immediate:!0}))):this._disableUpdateCount++}filterNodes(e,t){return this.extensions.filter.filterNodes(e,t)}countMatches(){return this.extensions.filter.countMatches()}filterBranches(e,t){return this.extensions.filter.filterBranches(e,t)}clearFilter(){return this.extensions.filter.clearFilter()}isFilterActive(){return!!this.filterMode}updateFilter(){return this.extensions.filter.updateFilter()}}Wunderbaum.sequence=0,Wunderbaum.version="v0.14.1",Wunderbaum.util=util,Wunderbaum.iconMaps=defaultIconMaps;export{Wunderbaum};
86
86
  //# sourceMappingURL=wunderbaum.esm.min.js.map