{"version":3,"file":"ui.min.js","sources":["../lib/functions.js","../lib/ui/icon.js","../lib/ui/checkbox.js","../lib/ui/tooltip.js","../lib/utility/strings.js","../lib/utility/lgres.js","../lib/utility.js","../lib/ui/dropdown.js","../lib/ui/grid/column.js","../lib/ui/grid/grid.js","../lib/ui/popup.js"],"sourcesContent":["export function createElement(tagName, init, ...children) {\r\n    const element = document.createElement(tagName);\r\n    if (typeof init === 'function') {\r\n        init(element);\r\n    } else if (init != null) {\r\n        element.className = init;\r\n    }\r\n    if (children.length > 0) {\r\n        element.append(...children);\r\n    }\r\n    return element;\r\n}\r\n","const svgns = 'http://www.w3.org/2000/svg';\r\n\r\nfunction createUse(type, id) {\r\n    const c = typeof consts !== 'undefined' ? consts : {};\r\n    const path = c.path || '';\r\n    const ver = c.resver == null ? '' : `?${c.resver}`;\r\n    const use = document.createElementNS(svgns, 'use');\r\n    use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', `${path}fonts/${type}.svg${ver}#${id}`);\r\n    return use;\r\n}\r\n\r\nfunction changeIcon(svg, type, id) {\r\n    if (svg instanceof SVGElement) {\r\n        svg.replaceChildren(createUse(type, id));\r\n    }\r\n    return svg;\r\n}\r\n\r\nfunction createIcon(type, id, style) {\r\n    const svg = document.createElementNS(svgns, 'svg');\r\n    svg.appendChild(createUse(type, id));\r\n    if (style != null) {\r\n        for (let css of Object.entries(style)) {\r\n            svg.style.setProperty(css[0], css[1]);\r\n        }\r\n    }\r\n    return svg;\r\n}\r\n\r\nfunction resolveIcon(container) {\r\n    const svgs = container.querySelectorAll('svg[data-id]');\r\n    for (let icon of svgs) {\r\n        const type = icon.dataset.type;\r\n        const id = icon.dataset.id;\r\n        icon.replaceChildren(createUse(type, id));\r\n        icon.removeAttribute('data-type');\r\n        icon.removeAttribute('data-id');\r\n    }\r\n    return container;\r\n}\r\n\r\nexport {\r\n    createIcon,\r\n    changeIcon,\r\n    resolveIcon\r\n}","import './css/checkbox.scss';\r\nimport { createElement } from \"../functions\";\r\nimport { createIcon } from \"./icon\";\r\n\r\nfunction fillCheckbox(container, type = 'fa-regular', label, tabindex = -1, charactor = 'check') {\r\n    container.appendChild(\r\n        createElement('layer', layer => {\r\n            layer.className = 'ui-check-inner';\r\n            layer.addEventListener('keypress', e => {\r\n                if (e.key === ' ' || e.key === 'Enter') {\r\n                    const input = container.querySelector('input');\r\n                    if (input != null) {\r\n                        input.checked = !input.checked;\r\n                        input.dispatchEvent(new Event('change'));\r\n                    }\r\n                }\r\n            });\r\n            if (tabindex >= 0) {\r\n                layer.tabIndex = tabindex;\r\n            }\r\n        }, createIcon(type, charactor))\r\n    );\r\n    if (label instanceof Element) {\r\n        container.appendChild(label);\r\n    } else if (label?.length > 0) {\r\n        container.appendChild(\r\n            createElement('span', span => span.innerText = label)\r\n        );\r\n    }\r\n}\r\n\r\nfunction createRadiobox(opts = {}) {\r\n    const container = createElement('label', 'ui-check-wrapper ui-radio-wrapper',\r\n        createElement('input', input => {\r\n            input.setAttribute('type', 'radio');\r\n            input.name = opts.name;\r\n            if (opts.checked === true) {\r\n                input.checked = true;\r\n            }\r\n            if (opts.enabled === false) {\r\n                input.disabled = true;\r\n            }\r\n            if (opts.customerAttributes != null) {\r\n                for (let entry of Object.entries(opts.customerAttributes)) {\r\n                    input.setAttribute(entry[0], entry[1]);\r\n                }\r\n            }\r\n            if (typeof opts.onchange === 'function') {\r\n                input.addEventListener('change', opts.onchange);\r\n            }\r\n        }));\r\n    if (opts.className) {\r\n        container.classList.add(opts.className);\r\n    }\r\n    fillCheckbox(container, opts.type, opts.label, opts.tabIndex, 'circle');\r\n    return container;\r\n}\r\n\r\nfunction createCheckbox(opts = {}) {\r\n    const container = createElement('label', 'ui-check-wrapper',\r\n        createElement('input', input => {\r\n            input.setAttribute('type', 'checkbox');\r\n            if (opts.checked === true) {\r\n                input.checked = true;\r\n            }\r\n            if (opts.enabled === false) {\r\n                input.disabled = true;\r\n            }\r\n            if (opts.customerAttributes != null) {\r\n                for (let entry of Object.entries(opts.customerAttributes)) {\r\n                    input.setAttribute(entry[0], entry[1]);\r\n                }\r\n            }\r\n            if (typeof opts.onchange === 'function') {\r\n                input.addEventListener('change', opts.onchange);\r\n            }\r\n        }));\r\n    if (opts.className) {\r\n        container.classList.add(opts.className);\r\n    }\r\n    if (opts.enabled === false) {\r\n        container.classList.add('disabled');\r\n    }\r\n    if (opts.checkedNode != null && opts.uncheckedNode != null) {\r\n        container.classList.add('ui-check-image-wrapper');\r\n        let height = opts.imageHeight;\r\n        if (isNaN(height) || height <= 0) {\r\n            height = 14;\r\n        }\r\n        opts.checkedNode.classList.add('checked');\r\n        container.appendChild(opts.checkedNode);\r\n        opts.uncheckedNode.classList.add('unchecked');\r\n        container.appendChild(opts.uncheckedNode);\r\n    } else {\r\n        fillCheckbox(container, opts.type, opts.label, opts.tabIndex);\r\n    }\r\n    return container;\r\n}\r\n\r\nfunction resolveCheckbox(container = document.body, legacy) {\r\n    if (legacy) {\r\n        const checks = container.querySelectorAll('input[type=\"checkbox\"]');\r\n        for (let chk of checks) {\r\n            if (chk.parentElement.classList.contains('ui-check-wrapper')) {\r\n                // skip\r\n                continue;\r\n            }\r\n            const id = chk.id;\r\n            let label, text;\r\n            if (id != null) {\r\n                label = container.querySelector(`label[for=\"${id}\"]`);\r\n            }\r\n            if (label == null) {\r\n                const e = chk.nextElementSibling;\r\n                if (e != null) {\r\n                    if (e.tagName === 'LABEL') {\r\n                        label = e;\r\n                    } else if (e.tagName === 'SPAN' && e.dataset.lgid != null) {\r\n                        text = e.innerText;\r\n                        e.style.display = 'none';\r\n                    }\r\n                }\r\n            }\r\n            if (label == null) {\r\n                const e = chk.previousElementSibling;\r\n                if (e != null) {\r\n                    if (e.tagName === 'LABEL') {\r\n                        label = e;\r\n                    } else if (text == null && e.tagName === 'SPAN' && e.dataset.lgid != null) {\r\n                        text = e.innerText;\r\n                        e.style.display = 'none';\r\n                    }\r\n                }\r\n            }\r\n            if (label == null) {\r\n                label = createElement('label');\r\n                chk.parentElement.insertBefore(label, chk);\r\n            } else {\r\n                text = label.innerText;\r\n            }\r\n            if (chk.disabled) {\r\n                label.className = 'ui-check-wrapper disabled';\r\n            } else {\r\n                label.className = 'ui-check-wrapper';\r\n            }\r\n            label.replaceChildren();\r\n            fillCheckbox(label, 'fa-regular', text, chk.tabIndex);\r\n            label.insertBefore(chk, label.firstChild);\r\n        }\r\n    }\r\n    const boxes = container.querySelectorAll('label[data-checkbox]');\r\n    for (let box of boxes) {\r\n        if (!box.classList.contains('ui-check-wrapper')) {\r\n            box.classList.add('ui-check-wrapper');\r\n        }\r\n        if (box.hasChildNodes()) {\r\n            if (!box.classList.contains('ui-check-image-wrapper')) {\r\n                box.classList.add('ui-check-image-wrapper');\r\n            }\r\n        } else {\r\n            fillCheckbox(box,\r\n                box.dataset.type,\r\n                box.dataset.label,\r\n                box.dataset.tabIndex)\r\n            box.removeAttribute('data-type');\r\n            box.removeAttribute('data-label');\r\n        }\r\n        const input = createElement('input');\r\n        const id = box.dataset.id;\r\n        if (id?.length > 0) {\r\n            input.id = id;\r\n        }\r\n        if (box.dataset.checked != null) {\r\n            input.checked = true;\r\n        }\r\n        input.setAttribute('type', 'checkbox');\r\n        box.insertBefore(input, box.firstChild);\r\n    }\r\n    return container;\r\n}\r\n\r\nexport {\r\n    createCheckbox,\r\n    resolveCheckbox,\r\n    createRadiobox\r\n}","import './css/tooltip.scss';\r\nimport { createElement } from \"../functions\";\r\n// import { global } from \"../utility\";\r\n\r\nfunction setTooltip(container, content, flag = false, parent = null) {\r\n    const isParent = parent instanceof HTMLElement;\r\n    if (isParent) {\r\n        const tipid = container.dataset.tipId;\r\n        const tip = parent.querySelector(`.ui-tooltip-wrapper[data-tip-id=\"${tipid}\"]`);\r\n        tip?.remove();\r\n    } else {\r\n        const tip = container.querySelector('.ui-tooltip-wrapper');\r\n        tip?.remove();\r\n    }\r\n    const wrapper = createElement('div', wrapper => {\r\n        wrapper.className = 'ui-tooltip-wrapper ui-tooltip-color';\r\n        wrapper.style.visibility = 'hidden';\r\n        wrapper.style.opacity = 0;\r\n        wrapper.style.top = '0';\r\n        wrapper.style.left = '0';\r\n    },\r\n        createElement('div', 'ui-tooltip-pointer ui-tooltip-color'),\r\n        createElement('div', 'ui-tooltip-curtain ui-tooltip-color'),\r\n        createElement('div', cnt => {\r\n            cnt.className = 'ui-tooltip-content';\r\n            if (content instanceof Element) {\r\n                cnt.appendChild(content);\r\n            } else {\r\n                cnt.innerText = content;\r\n            }\r\n        })\r\n    );\r\n    // container.insertAdjacentElement('afterend', wrapper);\r\n    if (isParent) {\r\n        const tipId = String(Math.random()).substring(2);\r\n        container.dataset.tipId = tipId;\r\n        wrapper.dataset.tipId = tipId;\r\n        parent.appendChild(wrapper);\r\n    } else {\r\n        container.appendChild(wrapper);\r\n    }\r\n\r\n    let tid;\r\n    container.addEventListener('mouseenter', () => {\r\n        tid && clearTimeout(tid);\r\n        let c = container;\r\n        while (c?.offsetWidth == null) {\r\n            c = c.parentElement;\r\n        }\r\n        if (c == null) {\r\n            return;\r\n        }\r\n        if (!flag || c.scrollWidth > c.offsetWidth) {\r\n            tid = setTimeout(() => {\r\n                let p;\r\n                let left;\r\n                let top;\r\n                left = c.offsetLeft;\r\n                top = c.offsetTop;\r\n                if (isParent) {\r\n                    p = c.offsetParent;\r\n                    while (p != null && p !== parent) {\r\n                        left += p.offsetLeft;\r\n                        top += p.offsetTop;\r\n                        p = p.offsetParent;\r\n                    }\r\n                }\r\n                p = c.parentElement;\r\n                const offsetParent = c.offsetParent;\r\n                while (p != null && p !== (isParent ? parent : offsetParent)) {\r\n                    left -= p.scrollLeft;\r\n                    top -= p.scrollTop;\r\n                    p = p.parentElement;\r\n                }\r\n                left += (c.offsetWidth - wrapper.offsetWidth) / 2;\r\n                top -= wrapper.offsetHeight + 14;\r\n                wrapper.style.left = `${left}px`;\r\n                wrapper.style.top = `${top}px`;\r\n                wrapper.style.visibility = 'visible';\r\n                wrapper.style.opacity = 1;\r\n            }, 100);\r\n        }\r\n    });\r\n    container.addEventListener('mouseleave', () => {\r\n        tid && clearTimeout(tid);\r\n        tid = setTimeout(() => {\r\n            wrapper.style.visibility = 'hidden';\r\n            wrapper.style.opacity = 0;\r\n        }, 300);\r\n    });\r\n    return container;\r\n}\r\n\r\nfunction resolveTooltip(container = document.body) {\r\n    const tips = container.querySelectorAll('[title]');\r\n    for (let tip of tips) {\r\n        const title = tip.getAttribute('title');\r\n        if (title != null) {\r\n            tip.removeAttribute('title');\r\n            setTooltip(tip, title);\r\n        }\r\n    }\r\n    return container;\r\n}\r\n\r\nexport {\r\n    setTooltip,\r\n    resolveTooltip\r\n}","function nullOrEmpty(s) {\r\n    return s == null || typeof s !== 'string' || s.length === 0;\r\n}\r\n\r\nfunction contains(s, key, ignoreCase) {\r\n    if (nullOrEmpty(s) || key == null) {\r\n        return false;\r\n    }\r\n    if (typeof key !== 'string') {\r\n        key = String(key);\r\n    }\r\n    if (ignoreCase) {\r\n        return s.toLowerCase().indexOf(key.toLowerCase()) >= 0;\r\n    }\r\n    return s.indexOf(key) >= 0;\r\n}\r\n\r\nfunction endsWith(s, suffix) {\r\n    if (nullOrEmpty(s) || nullOrEmpty(suffix)) {\r\n        return false;\r\n    }\r\n    return s.indexOf(suffix) === s.length - suffix.length;\r\n}\r\n\r\nfunction padStart(s, num, char) {\r\n    if (nullOrEmpty(s) || isNaN(num) || num <= s.length) {\r\n        return s;\r\n    }\r\n    return (char ?? ' ').repeat(num - s.length);\r\n}\r\n\r\nfunction formatUrl(msg) {\r\n    //const urlReg = /(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?/ig;\r\n    //const urlArrray = str.match(urlReg);\r\n    const p = /(http|ftp|https):\\/\\/.+?(\\s|\\r\\n|\\r|\\n|\\\"|\\'|\\*|$)/g;\r\n    const r = msg.match(p);\r\n    msg = escapeHtml(msg);\r\n\r\n    if (r?.length > 0) {\r\n        const rs = [];\r\n        for (let t of r) {\r\n            t = t.replace(/[\"'\\r\\n ]/g, '');\r\n            if (rs.indexOf(t) < 0) {\r\n                rs.push(t);\r\n            }\r\n        }\r\n\r\n        for (let r of rs) {\r\n            msg = msg.replaceAll(r, '<a target=\"_blank\" href=\"' + r + '\"><svg><use xlink:href=\"' + ((typeof consts !== 'undefined' && consts.path) || '') + 'fonts/fa-regular.svg#link\"></use></svg></a>');\r\n        }\r\n    }\r\n\r\n    return msg;\r\n}\r\n\r\nfunction escapeHtml(text) {\r\n    if (text == null) {\r\n        return '';\r\n    }\r\n    return String(text)\r\n        .replaceAll('&', '&amp;')\r\n        .replaceAll('<', '&lt;')\r\n        .replaceAll('>', '&gt;')\r\n        .replaceAll('\\r\\n', '<br/>')\r\n        .replaceAll('\\n', '<br/>')\r\n        .replaceAll('  ', '&nbsp;');\r\n}\r\n\r\nexport {\r\n    nullOrEmpty,\r\n    contains,\r\n    endsWith,\r\n    padStart,\r\n    formatUrl,\r\n    escapeHtml\r\n}","import { getCookie } from \"./cookie\";\r\nimport { get } from \"./request\";\r\nimport { nullOrEmpty } from \"./strings\";\r\n\r\nlet cache;\r\n\r\nfunction getCurrentLgId() {\r\n    let lgid;\r\n    if (typeof consts !== 'undefined') {\r\n        lgid = getCookie(consts.cookie?.lang);\r\n        if (nullOrEmpty(lgid)) {\r\n            lgid = consts.user?.language;\r\n        }\r\n    }\r\n    if (nullOrEmpty(lgid)) {\r\n        lgid = getCookie('lgid');\r\n    }\r\n    if (nullOrEmpty(lgid)) {\r\n        lgid = navigator.language || 'en-us';\r\n    }\r\n    lgid = lgid.toLowerCase().replace(/-/g, '_');\r\n    if (nullOrEmpty(lgid)) {\r\n        lgid = 'en';\r\n    }\r\n    switch (lgid) {\r\n        case 'en':\r\n        case 'en_au':\r\n        case 'fr':\r\n        case 'zh_cn':\r\n            return lgid;\r\n    }\r\n    const lang = lgid.split('_')[0];\r\n    switch (lang) {\r\n        case 'en':\r\n        case 'fr':\r\n            return lang;\r\n    }\r\n    return 'en';\r\n}\r\n\r\nfunction getStorageKey(lgid) {\r\n    if (typeof consts !== 'undefined') {\r\n        return (consts.prefix || '') + `res_${lgid}`;\r\n    }\r\n    return `res_${lgid}`;\r\n}\r\n\r\nasync function doRefreshLgres(template = '') {\r\n    const lgid = getCurrentLgId();\r\n    const r = await get(`language/${lgid}${template}`);\r\n    const dict = await r.json();\r\n    localStorage.setItem(getStorageKey(lgid), JSON.stringify(dict));\r\n    return dict;\r\n}\r\n\r\nasync function refreshLgres(template, lgres) {\r\n    if (lgres == null || typeof consts === 'undefined') {\r\n        lgres = await doRefreshLgres(template);\r\n    }\r\n    const ver = Number(consts.resver);\r\n    if (isNaN(lgres.ver) || isNaN(ver) || ver > lgres.ver) {\r\n        console.log(`found new language res version: ${lgres.ver} => ${ver}`);\r\n        lgres = await doRefreshLgres(template);\r\n    }\r\n    Object.defineProperty(lgres, 'r', {\r\n        writable: false,\r\n        configurable: false,\r\n        enumerable: false,\r\n        value: function (key, defaultValue) {\r\n            return getLanguage(this, key, defaultValue);\r\n        }\r\n    });\r\n    cache = lgres;\r\n    return lgres;\r\n}\r\n\r\nfunction getLanguage(lgres, key, defaultValue) {\r\n    let value = lgres[key];\r\n    return value ?? defaultValue;\r\n}\r\n\r\nfunction applyLanguage(dom, result) {\r\n    for (let text of dom.querySelectorAll('[data-lgid]')) {\r\n        const key = text.dataset.lgid;\r\n        if (text.tagName === 'INPUT') {\r\n            text.value = getLanguage(result, key, text.value);\r\n        } else {\r\n            text.innerText = getLanguage(result, key, text.innerText);\r\n        }\r\n    }\r\n    for (let title of dom.querySelectorAll('[data-title-lgid]')) {\r\n        const key = title.dataset.titleLgid;\r\n        title.setAttribute('title', getLanguage(result, key, title.getAttribute('title')));\r\n    }\r\n    for (let holder of dom.querySelectorAll('[data-placeholder-lgid]')) {\r\n        const key = holder.dataset.placeholderLgid;\r\n        holder.setAttribute('placeholder', getLanguage(result, key, holder.getAttribute('placeholder')));\r\n    }\r\n}\r\n\r\nasync function init(dom = document.body, options = {}) {\r\n    const lgid = getCurrentLgId();\r\n    let lgres = localStorage.getItem(getStorageKey(lgid));\r\n    let result;\r\n    if (lgres != null) {\r\n        try {\r\n            lgres = JSON.parse(lgres);\r\n            result = await refreshLgres(options.template, lgres);\r\n        } catch (e) {\r\n            console.error('error while parsing lgres, try refresh ...', e);\r\n            result = await refreshLgres(options.template);\r\n        }\r\n    } else {\r\n        result = await refreshLgres(options.template);\r\n    }\r\n\r\n    try {\r\n        if (document.readyState === 'loading') {\r\n            return await new Promise((resolve, reject) => {\r\n                let tid = setTimeout(() => reject('timeout'), 30000);\r\n                document.addEventListener('DOMContentLoaded', () => {\r\n                    clearTimeout(tid);\r\n                    tid = void 0;\r\n                    if (typeof options.callback === 'function') {\r\n                        options.callback(result);\r\n                    }\r\n                    applyLanguage(dom, result);\r\n                    resolve(result);\r\n                });\r\n            });\r\n        }\r\n        if (typeof options.callback === 'function') {\r\n            options.callback(result);\r\n        }\r\n        applyLanguage(dom, result);\r\n        return result;\r\n    } catch (err) {\r\n        console.error('error while loading language res ...', err);\r\n    }\r\n}\r\n\r\nfunction r(key, defaultValue) {\r\n    if (cache != null) {\r\n        return getLanguage(cache, key, defaultValue);\r\n    }\r\n    return defaultValue;\r\n}\r\n\r\nconst lang = {\r\n    get current() {\r\n        return getCurrentLgId();\r\n    },\r\n    get unknownError() {\r\n        return r('unknownError', 'An unknown error occurred, please contact the administrator.');\r\n    },\r\n    get savedSuccessfully() {\r\n        return r('savedSuccessfully', 'Saved successfully.');\r\n    }\r\n}\r\n\r\nexport {\r\n    init,\r\n    r,\r\n    lang\r\n}","import { getCookie, setCookie, deleteCookie } from \"./utility/cookie\";\r\nimport { init, r, lang } from \"./utility/lgres\";\r\nimport { get, post, upload } from \"./utility/request\";\r\nimport { nullOrEmpty, contains, endsWith, padStart, formatUrl, escapeHtml } from \"./utility/strings\";\r\n\r\nlet g = typeof globalThis !== 'undefined' ? globalThis : self;\r\n\r\nfunction isPositive(n) {\r\n    return !isNaN(n) && n > 0;\r\n}\r\n\r\nfunction isMobile() {\r\n    return /mobile/i.test(navigator.userAgent);\r\n}\r\n\r\nfunction throttle(method, delay = 100, context = g, ...args) {\r\n    if (method == null) {\r\n        return;\r\n    }\r\n    method.tiid && clearTimeout(method.tiid);\r\n    const current = new Date();\r\n    if (method.tdate == null || current - method.tdate > delay) {\r\n        method.apply(context, args);\r\n        method.tdate = current;\r\n    } else {\r\n        method.tiid = setTimeout(() => method.apply(context, args), delay);\r\n    }\r\n}\r\n\r\nfunction debounce(method, delay = 100, context = g, ...args) {\r\n    if (method == null) {\r\n        return;\r\n    }\r\n    method.tiid && clearTimeout(method.tiid);\r\n    method.tiid = setTimeout(() => method.apply(context, args), delay);\r\n}\r\n\r\nfunction truncate(v) {\r\n    return (v > 0 ? Math.floor : Math.ceil)(v);\r\n}\r\n\r\nfunction isEmail(text) {\r\n    return /^\\w[-\\w.+]*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/.test(text);\r\n}\r\n\r\nfunction isPhone(text) {\r\n    return /^[1-9]\\d{9,}$/.test(text);\r\n}\r\n\r\nexport {\r\n    // cookie\r\n    getCookie,\r\n    setCookie,\r\n    deleteCookie,\r\n    // lgres\r\n    init,\r\n    r,\r\n    lang,\r\n    // request\r\n    get,\r\n    post,\r\n    upload,\r\n    // strings\r\n    nullOrEmpty,\r\n    contains,\r\n    endsWith,\r\n    padStart,\r\n    formatUrl,\r\n    escapeHtml,\r\n    // variables\r\n    g as global,\r\n    isPositive,\r\n    isMobile,\r\n    // functions\r\n    throttle,\r\n    debounce,\r\n    truncate,\r\n    isEmail,\r\n    isPhone\r\n}","// import { r, global, contains, isPositive, nullOrEmpty } from \"../utility\";\r\nimport './css/dropdown.scss';\r\nimport { r } from \"../utility/lgres\";\r\nimport { contains, nullOrEmpty } from \"../utility/strings\";\r\nimport { global, isPositive } from \"../utility\";\r\nimport { createElement } from \"../functions\";\r\nimport { createCheckbox } from \"./checkbox\";\r\nimport { createIcon } from \"./icon\"\r\n\r\nconst SymbolDropdown = Symbol.for('ui-dropdown');\r\nconst DropdownTitleHeight = 26;\r\nconst DropdownItemHeight = 30;\r\n\r\nlet dropdownGlobal = global[SymbolDropdown];\r\n\r\nif (dropdownGlobal == null) {\r\n    // init\r\n    dropdownGlobal = {};\r\n    Object.defineProperty(dropdownGlobal, 'clear', {\r\n        writable: false,\r\n        configurable: false,\r\n        enumerable: false,\r\n        value: function () {\r\n            const panel = document.querySelector('.ui-drop-wrapper .ui-drop-box.active');\r\n            if (panel == null) {\r\n                return;\r\n            }\r\n            panel.classList.remove('active');\r\n            const dropId = panel.parentElement.dataset.dropId;\r\n            if (dropId == null) {\r\n                return;\r\n            }\r\n            const dropdown = this[dropId];\r\n            if (dropdown?.multiselect && typeof dropdown.oncollapsed === 'function') {\r\n                dropdown.oncollapsed();\r\n            }\r\n        }\r\n    })\r\n    global[SymbolDropdown] = dropdownGlobal;\r\n\r\n    document.addEventListener('mousedown', e => {\r\n        let parent = e.target;\r\n        while (parent != null) {\r\n            if (parent.classList.contains('ui-drop-box')) {\r\n                e.stopPropagation();\r\n                return;\r\n            }\r\n            parent = parent.parentElement;\r\n        }\r\n        dropdownGlobal.clear();\r\n    });\r\n}\r\n\r\nfunction selectItems(label, itemlist, htmlkey, textkey) {\r\n    const htmls = itemlist.map(it => it[htmlkey]);\r\n    if (htmls.some(it => it instanceof HTMLElement)) {\r\n        label.replaceChildren(...htmls.filter(it => it != null).map(it => it.cloneNode(true)));\r\n    } else {\r\n        let text = itemlist.map(it => it[textkey]).join(', ');\r\n        if (nullOrEmpty(text)) {\r\n            text = r('noneItem', '( None )');\r\n        }\r\n        label.innerText = text;\r\n    }\r\n}\r\n\r\nfunction filterSource(searchkeys, textkey, key, source) {\r\n    if (!Array.isArray(searchkeys) || searchkeys.length === 0) {\r\n        searchkeys = [textkey];\r\n    }\r\n    if (key.length > 0) {\r\n        source = source.filter(it => {\r\n            for (let k of searchkeys) {\r\n                if (contains(it[k].toLowerCase(), key)) {\r\n                    return true;\r\n                }\r\n            }\r\n            return false;\r\n        });\r\n    }\r\n    return source;\r\n}\r\n\r\nclass Dropdown {\r\n    #options;\r\n\r\n    #wrapper;\r\n    #container;\r\n    #label;\r\n\r\n    #allChecked;\r\n    #source;\r\n    #lastSelected;\r\n    #selected;\r\n    #selectedList;\r\n\r\n    sourceFilter;\r\n    onselectedlist;\r\n    onselected;\r\n    onexpanded;\r\n\r\n    constructor(options = {}) {\r\n        options.searchplaceholder ??= r('searchHolder', 'Search...');\r\n        options.textkey ??= 'text';\r\n        options.valuekey ??= 'value';\r\n        options.htmlkey ??= 'html';\r\n        options.maxlength ??= 500;\r\n        this.#options = options;\r\n    }\r\n\r\n    create() {\r\n        const options = this.#options;\r\n\r\n        // wrapper\r\n        const wrapper = createElement('div', 'ui-drop-wrapper');\r\n        const dropId = String(Math.random()).substring(2);\r\n        wrapper.dataset.dropId = dropId;\r\n        dropdownGlobal[dropId] = this;\r\n        this.#wrapper = wrapper;\r\n\r\n        // header\r\n        const header = createElement('div', 'ui-drop-header');\r\n        header.addEventListener('keypress', e => {\r\n            if (e.key === ' ' || e.key === 'Enter') {\r\n                header.dispatchEvent(new MouseEvent('click'));\r\n            }\r\n        });\r\n        header.addEventListener('keydown', e => {\r\n            const up = e.key === 'ArrowUp';\r\n            const down = e.key === 'ArrowDown';\r\n            if (up || down) {\r\n                const source = this.source;\r\n                const count = source.length;\r\n                const valuekey = this.#options.valuekey;\r\n                let index = source?.indexOf(this.#selected);\r\n                if (isNaN(index) || index < -1) {\r\n                    index = -1;\r\n                } else if (index >= count) {\r\n                    index = count - 1;\r\n                }\r\n                if (up) {\r\n                    if (index > 0) {\r\n                        index--;\r\n                    } else {\r\n                        index = 0;\r\n                    }\r\n                } else if (down) {\r\n                    if (index < 0) {\r\n                        index = 0;\r\n                    } else if (index < count) {\r\n                        index++;\r\n                    } else {\r\n                        index = count - 1;\r\n                    }\r\n                }\r\n                const target = source[index]?.[valuekey];\r\n                if (target != null) {\r\n                    this.select(target);\r\n                }\r\n            } else if (e.key === 'Tab') {\r\n                this.#dropdown(false);\r\n            }\r\n        });\r\n        header.addEventListener('click', () => {\r\n            if (this.disabled) {\r\n                return;\r\n            }\r\n            const active = this.#expanded;\r\n            const label = this.#label;\r\n            if (active && label.ownerDocument.activeElement === label) {\r\n                return;\r\n            }\r\n            this.#dropdown(!active);\r\n            if (!active && typeof this.onexpanded === 'function') {\r\n                setTimeout(() => this.onexpanded(), 120);\r\n            }\r\n        });\r\n\r\n        // label or input\r\n        let label;\r\n        if (options.input) {\r\n            label = createElement('input', 'ui-drop-text');\r\n            label.setAttribute('type', 'text');\r\n            options.placeholder && label.setAttribute('placeholder', options.placeholder);\r\n            isPositive(options.maxlength) && label.setAttribute('maxlength', options.maxlength);\r\n            isPositive(options.tabIndex) && label.setAttribute('tabindex', options.tabIndex);\r\n            label.addEventListener('input', e => {\r\n                const key = e.target.value.toLowerCase();\r\n                const source = filterSource(options.searchkeys, options.textkey, key, this.source);\r\n                this.#filllist(source);\r\n                this.#container.classList.add('active');\r\n            });\r\n            label.addEventListener('blur', e => this.select(e.target.value));\r\n            label.addEventListener('mousedown', e => this.#expanded && e.stopPropagation());\r\n        } else {\r\n            isPositive(options.tabIndex) && header.setAttribute('tabindex', options.tabIndex);\r\n            label = createElement('label', 'ui-drop-text');\r\n        }\r\n        this.#label = label;\r\n        if (options.multiselect) {\r\n            if (Array.isArray(options.selectedlist)) {\r\n                this.selectlist(options.selectedlist, true);\r\n            } else {\r\n                this.#allChecked = true;\r\n                label.innerText = r('allItem', '( All )');\r\n            }\r\n        } else if (options.selected != null) {\r\n            this.select(options.selected, true);\r\n        }\r\n        header.append(label, createElement('label', 'ui-drop-caret'));\r\n        wrapper.appendChild(header);\r\n\r\n        this.disabled = options.disabled || false;\r\n        return wrapper;\r\n    }\r\n\r\n    get multiselect() { return this.#options.multiselect }\r\n\r\n    get disabled() { return this.#wrapper == null || this.#wrapper.querySelector('.ui-drop-header.disabled') != null }\r\n\r\n    set disabled(flag) {\r\n        if (this.#wrapper == null) {\r\n            return;\r\n        }\r\n        if (flag) {\r\n            this.#wrapper.querySelector('.ui-drop-header').classList.add('disabled');\r\n        } else {\r\n            this.#wrapper.querySelector('.ui-drop-header').classList.remove('disabled');\r\n        }\r\n    }\r\n\r\n    get source() {\r\n        let source = this.#source;\r\n        if (source == null || !Array.isArray(source)) {\r\n            if (typeof this.sourceFilter === 'function') {\r\n                source = this.sourceFilter();\r\n            }\r\n            if (!Array.isArray(source)) {\r\n                source = [];\r\n            }\r\n            this.#source = source;\r\n        }\r\n        return source;\r\n    }\r\n\r\n    set source(list) {\r\n        if (!Array.isArray(list)) {\r\n            return;\r\n        }\r\n        this.#source = list;\r\n        if (this.#expanded) {\r\n            setTimeout(() => this.#dropdown(), 120);\r\n        }\r\n    }\r\n\r\n    get selected() { return this.#selected }\r\n\r\n    get selectedlist() { return this.#selectedList || [] }\r\n\r\n    select(selected, silence) {\r\n        if (this.#lastSelected === selected) {\r\n            return false;\r\n        }\r\n        this.#lastSelected = selected;\r\n        const valuekey = this.#options.valuekey;\r\n        const textkey = this.#options.textkey;\r\n        const htmlkey = this.#options.htmlkey;\r\n        let item = this.source.find(it => it[valuekey] === selected);\r\n        if (this.#options.input) {\r\n            if (item == null) {\r\n                item = { [valuekey]: selected };\r\n            }\r\n            this.#label.value = selected;\r\n        } else {\r\n            const expanded = this.#expanded;\r\n            if (expanded) {\r\n                this.#container.querySelectorAll('li[data-value].selected').forEach(li => li.classList.remove('selected'));\r\n            }\r\n            if (item == null) {\r\n                this.#selected = null;\r\n                this.#label.innerText = ' ';\r\n                return false;\r\n            }\r\n            const html = item[htmlkey];\r\n            if (html instanceof HTMLElement) {\r\n                this.#label.replaceChildren(html.cloneNode(true));\r\n            } else {\r\n                let text = item[textkey];\r\n                if (nullOrEmpty(text)) {\r\n                    text = ' ';\r\n                }\r\n                this.#label.innerText = text;\r\n            }\r\n            if (expanded) {\r\n                const val = selected.replace(/\"/g, '\\\\\"');\r\n                const li = this.#container.querySelector(`li[data-value=\"${val}\"]`);\r\n                if (li != null) {\r\n                    li.classList.add('selected');\r\n                }\r\n            }\r\n        }\r\n        this.#selected = item;\r\n        if (!silence && typeof this.onselected === 'function') {\r\n            this.onselected(item);\r\n        }\r\n    }\r\n\r\n    selectlist(selectedlist, silence) {\r\n        const source = this.source;\r\n        const valuekey = this.#options.valuekey;\r\n        const textkey = this.#options.textkey;\r\n        const htmlkey = this.#options.htmlkey;\r\n        const itemlist = selectedlist.map(v => {\r\n            let item = source.find(it => it[valuekey] === v);\r\n            if (item == null) {\r\n                item = { [valuekey]: v, [textkey]: v };\r\n            }\r\n            return item;\r\n        });\r\n        if (itemlist.length === 0) {\r\n            this.#selectedList = null;\r\n            this.#label.innerText = none;\r\n            return false;\r\n        }\r\n        selectItems(this.#label, itemlist, htmlkey, textkey);\r\n        this.#selectedList = itemlist;\r\n        if (!silence && typeof this.onselectedlist === 'function') {\r\n            this.onselectedlist(itemlist);\r\n        }\r\n    }\r\n\r\n    get #expanded() { return this.#container?.classList?.contains('active') }\r\n\r\n    #dropdown(flag = true) {\r\n        const options = this.#options;\r\n        let panel = this.#container;\r\n        if (panel == null) {\r\n            panel = createElement('div', 'ui-drop-box');\r\n            // search box\r\n            if (!options.input && options.search) {\r\n                const search = createElement('div', 'ui-drop-search');\r\n                const input = createElement('input');\r\n                input.setAttribute('type', 'text');\r\n                isPositive(options.tabIndex) && input.setAttribute('tabindex', options.tabIndex);\r\n                !nullOrEmpty(options.searchplaceholder) && input.setAttribute('placeholder', options.searchplaceholder);\r\n                input.addEventListener('input', e => {\r\n                    const key = e.target.value.toLowerCase();\r\n                    const source = filterSource(options.searchkeys, options.textkey, key, this.source);\r\n                    this.#filllist(source);\r\n                })\r\n                search.append(input, createIcon('fa-light', 'search'));\r\n                panel.appendChild(search);\r\n            }\r\n            // list\r\n            const list = createElement('ul', 'ui-drop-list');\r\n            if (!this.multiselect) {\r\n                list.addEventListener('click', e => {\r\n                    let li = e.target;\r\n                    while (li.tagName !== 'LI') {\r\n                        li = li.parentElement;\r\n                        if (li == null) {\r\n                            return;\r\n                        }\r\n                    }\r\n                    const value = li.dataset.value;\r\n                    if (this.select(value) !== false) {\r\n                        dropdownGlobal.clear();\r\n                    }\r\n                });\r\n            }\r\n            panel.appendChild(list);\r\n            this.#container = panel;\r\n            this.#wrapper.appendChild(panel);\r\n        }\r\n        if (flag) {\r\n            let source = this.source;\r\n            if (!options.input && options.search) {\r\n                const search = panel.querySelector('.ui-drop-search > input');\r\n                if (!nullOrEmpty(search?.value)) {\r\n                    source = filterSource(options.searchkeys, options.textkey, search.value, source);\r\n                }\r\n            }\r\n            this.#filllist(source);\r\n            // slide direction\r\n            if (!options.slidefixed) {\r\n                let parent = options.parent ?? document.body;\r\n                let p = this.#wrapper;\r\n                let top = p.offsetTop;\r\n                while ((p = p.parentElement) != null && p !== parent) {\r\n                    top -= p.scrollTop;\r\n                }\r\n                if (top - parent.offsetTop + DropdownTitleHeight + panel.offsetHeight >= parent.offsetHeight) {\r\n                    panel.classList.add('slide-up');\r\n                } else {\r\n                    panel.classList.remove('slide-up');\r\n                }\r\n            }\r\n            panel.classList.add('active');\r\n        } else {\r\n            panel.classList.remove('active');\r\n        }\r\n    }\r\n\r\n    #filllist(source) {\r\n        const list = this.#container.querySelector('.ui-drop-list');\r\n        list.replaceChildren();\r\n        const multiselect = this.multiselect;\r\n        const allchecked = this.#allChecked;\r\n        if (multiselect) {\r\n            list.appendChild(\r\n                createElement('li', null,\r\n                    createCheckbox({\r\n                        label: r('allItem', '( All )'),\r\n                        checked: allchecked,\r\n                        customerAttributes: { 'isall': '1' },\r\n                        onchange: e => this.#triggerselect(e.target)\r\n                    })\r\n                )\r\n            );\r\n        }\r\n        // TODO: virtual mode\r\n        const valuekey = this.#options.valuekey;\r\n        const textkey = this.#options.textkey;\r\n        const htmlkey = this.#options.htmlkey;\r\n        const selected = this.selected;\r\n        const selectedlist = this.selectedlist;\r\n        let scrolled;\r\n        source.slice(0, 200).forEach((item, i) => {\r\n            const val = item[valuekey];\r\n            const li = createElement('li');\r\n            li.dataset.value = val;\r\n            li.setAttribute('title', item[textkey]);\r\n            let label;\r\n            const html = item[htmlkey];\r\n            if (html instanceof HTMLElement) {\r\n                label = html;\r\n            }\r\n            if (multiselect) {\r\n                const selected = selectedlist.some(s => s[valuekey] === val);\r\n                if (label == null) {\r\n                    label = createElement('span');\r\n                    label.innerText = item[textkey];\r\n                }\r\n                const box = createCheckbox({\r\n                    label,\r\n                    checked: allchecked || selected,\r\n                    customerAttributes: {\r\n                        'class': 'dataitem',\r\n                        'data-value': val\r\n                    },\r\n                    onchange: e => this.#triggerselect(e.target)\r\n                });\r\n                li.appendChild(box);\r\n            } else {\r\n                if (label == null) {\r\n                    li.innerText = item[textkey];\r\n                } else {\r\n                    li.appendChild(label);\r\n                }\r\n                if (selected != null && selected[valuekey] === val) {\r\n                    scrolled = DropdownItemHeight * i;\r\n                    li.classList.add('selected');\r\n                }\r\n            }\r\n            list.appendChild(li);\r\n        });\r\n        if (scrolled != null) {\r\n            setTimeout(() => list.scrollTop = scrolled, 10);\r\n        }\r\n    }\r\n\r\n    #triggerselect(checkbox) {\r\n        let list;\r\n        const valuekey = this.#options.valuekey;\r\n        const textkey = this.#options.textkey;\r\n        const htmlkey = this.#options.htmlkey;\r\n        if (checkbox.getAttribute('isall') === '1') {\r\n            const allchecked = this.#allChecked = checkbox.checked;\r\n            const boxes = this.#container.querySelectorAll('input.dataitem');\r\n            boxes.forEach(box => box.checked = allchecked);\r\n            list = [];\r\n        } else if (checkbox.checked) {\r\n            if (this.#container.querySelectorAll('input.dataitem:not(:checked)').length === 0) {\r\n                this.#allChecked = true;\r\n                this.#container.querySelector('input[isall=\"1\"]').checked = true;\r\n                list = [];\r\n            } else {\r\n                const source = this.source;\r\n                list = [...this.#container.querySelectorAll('input.dataitem:checked')]\r\n                    .map(c => source.find(it => it[valuekey] === c.dataset.value))\r\n                    .filter(it => it != null);\r\n            }\r\n        } else {\r\n            const val = checkbox.dataset.value;\r\n            if (this.#allChecked) {\r\n                this.#allChecked = false;\r\n                this.#container.querySelector('input[isall=\"1\"]').checked = false;\r\n                list = this.source.filter(it => it[valuekey] !== val);\r\n            } else {\r\n                list = this.selectedlist.filter(it => it[valuekey] !== val);\r\n            }\r\n        }\r\n        if (this.#allChecked) {\r\n            this.#label.innerText = r('allItem', '( All )');\r\n        } else {\r\n            selectItems(this.#label, list, htmlkey, textkey);\r\n        }\r\n        this.#selectedList = list;\r\n        if (typeof this.onselectedlist === 'function') {\r\n            this.onselectedlist(itemlist);\r\n        }\r\n    }\r\n\r\n    static resolve(dom = document.body) {\r\n        const selects = dom.querySelectorAll('select');\r\n        for (let sel of selects) {\r\n            const source = [...sel.children].map(it => {\r\n                return { value: it.value, text: it.innerText }\r\n            });\r\n            const drop = new Dropdown({\r\n                selected: sel.value,\r\n                disabled: sel.disabled,\r\n                tabIndex: sel.tabIndex\r\n            });\r\n            drop.source = source;\r\n            sel.parentElement.replaceChild(drop.create(), sel);\r\n        }\r\n        return dom;\r\n    }\r\n}\r\n\r\nexport default Dropdown;","import { global } from \"../../utility\";\r\nimport { nullOrEmpty } from \"../../utility/strings\";\r\nimport { createElement } from \"../../functions\";\r\nimport { createIcon } from \"../icon\";\r\nimport { createCheckbox } from \"../checkbox\";\r\nimport { setTooltip } from \"../tooltip\";\r\nimport Dropdown from \"../dropdown\";\r\n\r\nclass GridColumn {\r\n    static create() {\r\n        return createElement('span');\r\n    }\r\n\r\n    static setValue(element, val) {\r\n        element.innerText = val;\r\n    }\r\n\r\n    static setStyle(element, style) {\r\n        for (let css of Object.entries(style)) {\r\n            element.style.setProperty(css[0], css[1]);\r\n        }\r\n    }\r\n}\r\n\r\nclass GridInputColumn extends GridColumn {\r\n    static get editing() { return true };\r\n\r\n    static createEdit(trigger, col, _parent, vals) {\r\n        const input = createElement('input');\r\n        input.setAttribute('type', 'text');\r\n        if (typeof trigger === 'function') {\r\n            input.addEventListener('change', trigger);\r\n        }\r\n        input.addEventListener('input', () => {\r\n            if (vals.__editing == null) {\r\n                vals.__editing = {\r\n                    [col.key]: true\r\n                }\r\n            } else {\r\n                vals.__editing[col.key] = true;\r\n            }\r\n        });\r\n        return input;\r\n    }\r\n\r\n    static setValue(element, val) {\r\n        if (element.tagName !== 'INPUT') {\r\n            super.setValue(element, val);\r\n        } else {\r\n            element.value = val;\r\n        }\r\n    }\r\n\r\n    static getValue(e) { return e.target.value }\r\n\r\n    static setEnabled(element, enabled) {\r\n        element.disabled = enabled === false;\r\n    }\r\n}\r\n\r\nclass GridTextColumn extends GridInputColumn {\r\n    static createEdit(trigger, col, _parent, vals) {\r\n        const input = createElement('textarea');\r\n        if (typeof trigger === 'function') {\r\n            input.addEventListener('change', trigger);\r\n        }\r\n        input.addEventListener('input', () => {\r\n            if (vals.__editing == null) {\r\n                vals.__editing = {\r\n                    [col.key]: true\r\n                }\r\n            } else {\r\n                vals.__editing[col.key] = true;\r\n            }\r\n        });\r\n        return input;\r\n    }\r\n\r\n    static setValue(element, val, _item, _col, grid) {\r\n        if (element.tagName !== 'TEXTAREA') {\r\n            super.setValue(element, val);\r\n        } else {\r\n            element.value = val;\r\n            if (val != null) {\r\n                const lines = String(val).split('\\n').length;\r\n                element.style.height = `${lines * grid.lineHeight + 12}px`;\r\n            }\r\n            // TODO: bad performance\r\n        }\r\n    }\r\n}\r\n\r\nconst SymbolDropdown = Symbol.for('ui-dropdown');\r\n\r\nclass GridDropdownColumn extends GridColumn {\r\n    static createEdit(trigger, col, parent) {\r\n        const drop = new Dropdown({ ...col.dropOptions, parent });\r\n        drop.onselected = trigger;\r\n        return drop.create();\r\n    }\r\n\r\n    static #getDrop(element) {\r\n        const dropGlobal = global[SymbolDropdown];\r\n        if (dropGlobal == null) {\r\n            return null;\r\n        }\r\n        const dropId = element.dataset.dropId;\r\n        const drop = dropGlobal[dropId];\r\n        if (drop == null) {\r\n            return null;\r\n        }\r\n        return drop;\r\n    }\r\n\r\n    static #getSource(item, col) {\r\n        let source = col.source;\r\n        if (typeof source === 'function') {\r\n            source = source(item);\r\n        }\r\n        return source;\r\n    }\r\n\r\n    static #setValue(source, element, val) {\r\n        const data = source?.find(v => v.value === val);\r\n        if (data != null) {\r\n            val = data.text;\r\n        }\r\n        super.setValue(element, val);\r\n    }\r\n\r\n    static setValue(element, val, item, col) {\r\n        if (element.tagName !== 'DIV') {\r\n            let source = this.#getSource(item, col);\r\n            if (source instanceof Promise) {\r\n                source.then(s => this.#setValue(s, element, val));\r\n            } else {\r\n                this.#setValue(source, element, val);\r\n            }\r\n            return;\r\n        }\r\n        const drop = this.#getDrop(element);\r\n        if (drop == null) {\r\n            return;\r\n        }\r\n        if (drop.source == null || drop.source.length === 0) {\r\n            let source = this.#getSource(item, col);\r\n            if (source instanceof Promise) {\r\n                source.then(s => {\r\n                    drop.source = s;\r\n                    drop.select(val, true);\r\n                })\r\n                return;\r\n            } else if (source != null) {\r\n                drop.source = source;\r\n            }\r\n        }\r\n        drop.select(val, true);\r\n    }\r\n\r\n    static getValue(e) {\r\n        return e.value;\r\n    }\r\n\r\n    static setEnabled(element, enabled) {\r\n        const drop = this.#getDrop(element);\r\n        if (drop == null) {\r\n            return;\r\n        }\r\n        drop.disabled = enabled === false;\r\n    }\r\n}\r\n\r\nclass GridCheckboxColumn extends GridColumn {\r\n    static createEdit(trigger) {\r\n        const check = createCheckbox({\r\n            onchange: typeof trigger === 'function' ? trigger : null\r\n        });\r\n        return check;\r\n    }\r\n\r\n    static setValue(element, val) {\r\n        element.querySelector('input').checked = val;\r\n    }\r\n\r\n    static getValue(e) { return e.target.checked }\r\n\r\n    static setEnabled(element, enabled) {\r\n        element.querySelector('input').disabled = enabled === false;\r\n    }\r\n}\r\n\r\nclass GridIconColumn extends GridColumn {\r\n    static create() { return createElement('span', 'col-icon') }\r\n\r\n    static setValue(element, val, item, col, grid) {\r\n        let className = col.className;\r\n        if (typeof className === 'function') {\r\n            className = className.call(col, item);\r\n        }\r\n        if (className == null) {\r\n            element.className = 'col-icon';\r\n        } else {\r\n            element.className = `col-icon ${className}`;\r\n        }\r\n        let type = col.iconType;\r\n        if (typeof type === 'function') {\r\n            type = type.call(col, item);\r\n        }\r\n        type ??= 'fa-regular';\r\n        if (element.dataset.type !== type || element.dataset.icon !== val) {\r\n            const icon = createIcon(type, val);\r\n            // const layer = element.children[0];\r\n            element.replaceChildren(icon);\r\n            !nullOrEmpty(col.tooltip) && setTooltip(element, col.tooltip, false, grid.element);\r\n            element.dataset.type = type;\r\n            element.dataset.icon = val;\r\n        }\r\n    }\r\n\r\n    static setEnabled(element, enabled) {\r\n        if (enabled === false) {\r\n            element.classList.add('disabled');\r\n        } else {\r\n            element.classList.remove('disabled');\r\n        }\r\n        const tooltip = element.querySelector('.ui-tooltip-wrapper');\r\n        if (tooltip != null) {\r\n            tooltip.style.display = enabled === false ? 'none' : '';\r\n        }\r\n    }\r\n}\r\n\r\nexport {\r\n    GridColumn,\r\n    GridInputColumn,\r\n    GridTextColumn,\r\n    GridDropdownColumn,\r\n    GridCheckboxColumn,\r\n    GridIconColumn\r\n}","import '../css/grid.scss';\r\nimport { global, isPositive, isMobile, throttle, truncate } from \"../../utility\";\r\nimport { r } from \"../../utility/lgres\";\r\nimport { createElement } from \"../../functions\";\r\nimport { createIcon } from \"../icon\";\r\nimport { createCheckbox } from \"../checkbox\";\r\nimport { GridColumn, GridInputColumn, GridTextColumn, GridDropdownColumn, GridCheckboxColumn, GridIconColumn } from \"./column\";\r\n\r\nconst ColumnChangedType = {\r\n    Reorder: 'reorder',\r\n    Resize: 'resize',\r\n    Sort: 'sort'\r\n};\r\nconst RefreshInterval = isMobile() ? 32 : 0;\r\nconst HoverInternal = 200;\r\nconst RedumCount = 4;\r\nconst MiniDragOffset = 4;\r\nconst MiniColumnWidth = 50;\r\nconst FilterPanelWidth = 200;\r\n\r\nfunction getClientX(e) {\r\n    if (e == null) {\r\n        return null;\r\n    }\r\n    const cx = e.touches && e.touches[0]?.clientX;\r\n    return cx ?? e.clientX;\r\n}\r\n\r\nfunction getOffsetLeftFromWindow(element) {\r\n    let left = 0;\r\n    while (element != null) {\r\n        left += element.offsetLeft;\r\n        element = element.offsetParent;\r\n    }\r\n    return left;\r\n}\r\n\r\nfunction indexOfParent(target) {\r\n    // return [...target.parentElement.children].indexOf(target);\r\n    return Array.prototype.indexOf.call(target.parentElement.children, target);\r\n}\r\n\r\nconst ColumnTypes = {\r\n    0: GridColumn,\r\n    1: GridInputColumn,\r\n    2: GridDropdownColumn,\r\n    3: GridCheckboxColumn,\r\n    4: GridIconColumn,\r\n    5: GridTextColumn\r\n};\r\n\r\nclass Grid {\r\n    #source;\r\n    #currentSource;\r\n    #parent;\r\n    #el;\r\n    #refs;\r\n    #rendering;\r\n    #selectedColumnIndex = -1;\r\n    #selectedIndexes;\r\n    #startIndex = 0;\r\n    #needResize;\r\n    #containerHeight;\r\n    #bodyClientWidth;\r\n    #rowCount = -1;\r\n    #scrollTop;\r\n    #scrollLeft;\r\n    #colTypes = {};\r\n    #colAttrs = {};\r\n    #vtable = [];\r\n\r\n    columns = [];\r\n    langs = {\r\n        all: r('allItem', '( All )'),\r\n        ok: r('ok', 'OK'),\r\n        reset: r('reset', 'Reset')\r\n    };\r\n    virtualCount = 100;\r\n    rowHeight = 36;\r\n    lineHeight = 24;\r\n    extraRows = 0;\r\n    filterRowHeight = 30;\r\n    height;\r\n    readonly;\r\n    multiSelect = false;\r\n    fullrowClick = true;\r\n    allowHtml = false;\r\n    holderDisabled = false;\r\n    headerVisible = true;\r\n    window = global;\r\n    sortIndex = -1;\r\n    sortDirection = 1;\r\n\r\n    willSelect;\r\n    selectedRowChanged;\r\n    cellDblClicked;\r\n    cellClicked;\r\n    rowDblClicked;\r\n    columnChanged;\r\n\r\n    static ColumnTypes = {\r\n        Common: 0,\r\n        Input: 1,\r\n        Dropdown: 2,\r\n        Checkbox: 3,\r\n        Icon: 4,\r\n        Text: 5,\r\n        isCheckbox(type) { return type === 3 }\r\n    };\r\n\r\n    static GridColumn = GridColumn;\r\n\r\n    constructor(container) {\r\n        this.#parent = container;\r\n    }\r\n\r\n    get element() { return this.#el }\r\n\r\n    get source() { return this.#source?.map(s => s.values) }\r\n    set source(list) {\r\n        if (this.#el == null) {\r\n            throw new Error('grid has not been initialized.')\r\n        }\r\n        if (!Array.isArray(list)) {\r\n            throw new Error('source is not an Array.')\r\n        }\r\n        list = list.map(i => { return { values: i } });\r\n        this.#source = list;\r\n        this.#refreshSource(list);\r\n    }\r\n\r\n    #refreshSource(list) {\r\n        list ??= this.#source;\r\n        if (this.#colAttrs.__filtered === true) {\r\n            this.#currentSource = list.filter(it => {\r\n                for (let col of this.columns) {\r\n                    if (Array.isArray(col.filterValues)) {\r\n                        const v = this.#getItemValue(it.values, col.key, col.filter);\r\n                        if (col.filterValues.indexOf(v) < 0) {\r\n                            return false;\r\n                        }\r\n                    }\r\n                }\r\n                return true;\r\n            });\r\n        } else {\r\n            this.#currentSource = list;\r\n        }\r\n        this.#selectedColumnIndex = -1;\r\n        this.#selectedIndexes = [];\r\n        this.#startIndex = 0;\r\n        this.#scrollTop = 0;\r\n        this.#scrollLeft = 0;\r\n        this.#rowCount = -1;\r\n\r\n        if (this.sortIndex >= 0) {\r\n            this.sortColumn();\r\n        }\r\n        this.resize();\r\n    }\r\n\r\n    get virtual() { return this.#currentSource?.length > this.virtualCount }\r\n\r\n    get sortKey() {\r\n        if (this.columns == null) {\r\n            return null;\r\n        }\r\n        return this.columns[this.sortIndex]?.key;\r\n    }\r\n\r\n    get selectedIndexes() { return this.#selectedIndexes }\r\n    set selectedIndexes(indexes) {\r\n        const startIndex = this.#startIndex;\r\n        this.#selectedIndexes.splice(0, this.#selectedIndexes.length, ...indexes);\r\n        if (this.readonly !== true) {\r\n            this.refresh();\r\n        } else {\r\n            [...this.#refs.bodyContent.children].forEach((row, i) => {\r\n                if (indexes.indexOf(startIndex + i) >= 0) {\r\n                    row.classList.add('selected');\r\n                } else if (row.classList.contains('selected')) {\r\n                    row.classList.remove('selected');\r\n                }\r\n            });\r\n        }\r\n        if (typeof this.selectedRowChanged === 'function') {\r\n            this.selectedRowChanged();\r\n        }\r\n    }\r\n\r\n    get selectedIndex() { return (this.#selectedIndexes && this.#selectedIndexes[0]) ?? -1 }\r\n\r\n    get loading() { return this.#refs.loading?.style?.visibility === 'visible' }\r\n    set loading(flag) {\r\n        if (this.#refs.loading == null) {\r\n            return;\r\n        }\r\n        if (flag === false) {\r\n            this.#refs.loading.style.visibility = 'hidden';\r\n            this.#refs.loading.style.opacity = 0;\r\n        } else {\r\n            this.#refs.loading.style.visibility = 'visible';\r\n            this.#refs.loading.style.opacity = 1;\r\n        }\r\n    }\r\n\r\n    get scrollTop() { return this.#refs.body?.scrollTop; }\r\n    set scrollTop(top) {\r\n        if (this.#refs.body == null) {\r\n            return;\r\n        }\r\n        this.#refs.body.scrollTop = top;\r\n        this.reload();\r\n    }\r\n\r\n    init(container = this.#parent) {\r\n        this.#el = null;\r\n        this.#refs = {};\r\n        this.#rendering = true;\r\n        if (!(container instanceof HTMLElement)) {\r\n            throw new Error('no specified parent.');\r\n        }\r\n        this.#parent = container;\r\n        const grid = createElement('div', 'ui-grid');\r\n        grid.setAttribute('tabindex', 0);\r\n        const onKeydown = e => {\r\n            let index = this.selectedIndex;\r\n            let flag = false;\r\n            if (e.key === 'ArrowUp') {\r\n                // up\r\n                if (index > 0) {\r\n                    flag = true;\r\n                    index -= 1;\r\n                }\r\n            } else if (e.key === 'ArrowDown') {\r\n                // down\r\n                const count = this.#currentSource?.length ?? 0;\r\n                if (index < count - 1) {\r\n                    flag = true;\r\n                    index += 1;\r\n                }\r\n            }\r\n            if (flag) {\r\n                this.#selectedIndexes = [index];\r\n                this.scrollToIndex(index);\r\n                this.refresh();\r\n                if (typeof this.selectedRowChanged === 'function') {\r\n                    this.selectedRowChanged(index);\r\n                }\r\n                e.stopPropagation();\r\n            }\r\n        };\r\n        grid.addEventListener('keydown', e => throttle(onKeydown, 800, this, e));\r\n        container.replaceChildren(grid);\r\n        const sizer = createElement('span', 'ui-grid-sizer');\r\n        grid.appendChild(sizer);\r\n        this.#refs.sizer = sizer;\r\n\r\n        // header & body\r\n        const header = this.#createHeader();\r\n        grid.appendChild(header);\r\n        const body = this.#createBody();\r\n        grid.appendChild(body);\r\n\r\n        // loading\r\n        const loading = createElement('div', 'ui-grid-loading',\r\n            createElement('div', null, createIcon('fa-regular', 'spinner-third'))\r\n        );\r\n        this.#refs.loading = loading;\r\n        grid.appendChild(loading);\r\n        this.#el = grid;\r\n\r\n        this.#rendering = false;\r\n        if (this.#source != null && this.sortIndex >= 0) {\r\n            this.sortColumn();\r\n        }\r\n    }\r\n\r\n    scrollToIndex(index) {\r\n        const top = this.#scrollToTop(index * (this.rowHeight + 1), true);\r\n        this.#refs.body.scrollTop = top;\r\n    }\r\n\r\n    resize(force) {\r\n        if (this.#rendering || this.#el == null) {\r\n            return;\r\n        }\r\n        const body = this.#refs.body;\r\n        // let height = this.#refs.header.offsetHeight + 2;\r\n        // let top = body.offsetTop;\r\n        // if (top !== height) {\r\n        //     body.style.top = `${height}px`;\r\n        //     top = height;\r\n        // }\r\n        const top = this.headerVisible === false ? 0 : this.#refs.header.offsetHeight;\r\n\r\n        let height = this.height;\r\n        if (height === 0) {\r\n            height = this.#containerHeight;\r\n        } else if (isNaN(height) || height < 0) {\r\n            height = this.#el.offsetHeight - top;\r\n        }\r\n        const count = truncate((height - 1) / (this.rowHeight + 1)) + (RedumCount * 2) + 1;\r\n        if (force || count !== this.#rowCount) {\r\n            this.#rowCount = count;\r\n            this.reload();\r\n        }\r\n        this.#bodyClientWidth = body.clientWidth;\r\n    }\r\n\r\n    reload() {\r\n        let length = this.#currentSource.length;\r\n        if (this.extraRows > 0) {\r\n            length += this.extraRows;\r\n        }\r\n        this.#containerHeight = length * (this.rowHeight + 1);\r\n        this.#refs.body.scrollTop = 0;\r\n        this.#refs.body.scrollLeft = 0;\r\n        this.#refs.bodyContent.style.top = '0px';\r\n        this.#refs.bodyContainer.style.height = `${this.#containerHeight}px`;\r\n        // this.#adjustRows(this.#refs.bodyContent);\r\n        this.refresh();\r\n    }\r\n\r\n    refresh() {\r\n        if (this.#refs.bodyContent == null) {\r\n            throw new Error('body has not been created.');\r\n        }\r\n        const widths = {};\r\n        this.#fillRows(widths);\r\n        if (this.#needResize && widths.flag) {\r\n            this.#needResize = false;\r\n            this.columns.forEach((col, i) => {\r\n                if (!this.#get(col.key, 'autoResize')) {\r\n                    return;\r\n                }\r\n                let width = widths[i];\r\n                if (width < col.width) {\r\n                    width = col.width;\r\n                }\r\n                if (width > 0) {\r\n                    this.#changeColumnWidth(i, width);\r\n                }\r\n            });\r\n        }\r\n    }\r\n\r\n    resetChange() {\r\n        if (this.#source == null) {\r\n            return;\r\n        }\r\n        for (let row of this.#source) {\r\n            delete row.__changed;\r\n        }\r\n    }\r\n\r\n    sortColumn(reload) {\r\n        const index = this.sortIndex;\r\n        const col = this.columns[index];\r\n        if (col == null) {\r\n            return;\r\n        }\r\n        const direction = this.sortDirection;\r\n        [...this.#refs.header.children].forEach((th, i) => {\r\n            const arrow = th.querySelector('.arrow');\r\n            if (arrow == null) {\r\n                return;\r\n            }\r\n            if (i === index) {\r\n                arrow.className = `arrow ${(direction !== 1 ? 'desc' : 'asc')}`;\r\n            } else if (arrow.className !== 'arrow') {\r\n                arrow.className = 'arrow';\r\n            }\r\n        });\r\n        let comparer;\r\n        if (typeof col.sortFilter !== 'function') {\r\n            const direction = this.sortDirection;\r\n            if (isNaN(direction)) {\r\n                direction = 1;\r\n            }\r\n            comparer = (a, b) => {\r\n                a = this.#getItemValue(a.values, col.key, col.filter);\r\n                b = this.#getItemValue(b.values, col.key, col.filter);\r\n                if (a == null && typeof b === 'number') {\r\n                    a = 0;\r\n                } else if (typeof a === 'number' && b == null) {\r\n                    b = 0;\r\n                } else if (a != null && b == null) {\r\n                    return direction;\r\n                } else if (typeof a === 'string' && typeof b === 'string') {\r\n                    a = a.toLowerCase();\r\n                    b = b.toLowerCase();\r\n                }\r\n                return a === b ? 0 : (a > b ? 1 : -1) * direction;\r\n            };\r\n        } else {\r\n            comparer = (a, b) => col.sortFilter(a.values, b.values) * direction;\r\n        }\r\n        this.#source.sort(comparer);\r\n        if (this.#colAttrs.__filtered === true) {\r\n            this.#currentSource.sort(comparer);\r\n        }\r\n        if (this.#rowCount < 0) {\r\n            return;\r\n        }\r\n        if (reload) {\r\n            this.reload();\r\n        } else {\r\n            this.refresh();\r\n        }\r\n    }\r\n\r\n    #createHeader() {\r\n        const thead = createElement('table', 'ui-grid-header');\r\n        if (this.headerVisible === false) {\r\n            thead.style.display = 'none';\r\n        }\r\n        const header = createElement('tr');\r\n        thead.appendChild(header);\r\n        const sizer = this.#refs.sizer;\r\n        for (let col of this.columns) {\r\n            if (col.visible === false) {\r\n                const hidden = createElement('th');\r\n                hidden.style.display = 'none';\r\n                if (col.sortable !== false) {\r\n                    hidden.dataset.key = col.key;\r\n                    hidden.addEventListener('click', e => this.#onHeaderClicked(e, col, true));\r\n                }\r\n                header.appendChild(hidden);\r\n                continue;\r\n            }\r\n            // style\r\n            const isCheckbox = Grid.ColumnTypes.isCheckbox(col.type);\r\n            if (col.width > 0) {\r\n                // col.autoResize = false;\r\n            } else {\r\n                this.#set(col.key, 'autoResize', true);\r\n                this.#needResize = true;\r\n                sizer.innerText = col.caption ?? '';\r\n                let width = sizer.offsetWidth + 22;\r\n                if (!this.readonly && col.enabled !== false && col.allcheck && isCheckbox) {\r\n                    width += 32;\r\n                }\r\n                if (col.allowFilter === true) {\r\n                    width += 14;\r\n                }\r\n                if (width < MiniColumnWidth) {\r\n                    width = MiniColumnWidth;\r\n                }\r\n                col.width = width;\r\n            }\r\n            col.align ??= isCheckbox ? 'center' : 'left';\r\n            if (col.sortable !== false) {\r\n                col.sortable = true;\r\n            }\r\n            const w = `${col.width}px`;\r\n            const style = {\r\n                'width': w,\r\n                'max-width': w,\r\n                'min-width': w,\r\n                'text-align': col.align\r\n            };\r\n            this.#set(col.key, 'style', style);\r\n            // element\r\n            const th = createElement('th', 'column');\r\n            th.dataset.key = col.key;\r\n            for (let css of Object.entries(style)) {\r\n                th.style.setProperty(css[0], css[1]);\r\n            }\r\n            if (col.sortable) {\r\n                th.style.cursor = 'pointer';\r\n                th.addEventListener('click', e => this.#onHeaderClicked(e, col));\r\n            }\r\n            if (col.orderable !== false) {\r\n                col.orderable = true;\r\n                th.addEventListener('mousedown', e => this.#onDragStart(e, col));\r\n            }\r\n            const wrapper = createElement('div');\r\n            th.appendChild(wrapper);\r\n            if (!this.readonly && col.enabled !== false && col.allcheck && isCheckbox) {\r\n                const check = createCheckbox({\r\n                    onchange: e => this.#onColumnAllChecked(col, e.target.checked)\r\n                });\r\n                wrapper.appendChild(check);\r\n            }\r\n            const caption = createElement('span');\r\n            if (col.textStyle != null) {\r\n                for (let css of Object.entries(col.textStyle)) {\r\n                    caption.style.setProperty(css[0], css[1]);\r\n                }\r\n            }\r\n            caption.innerText = col.caption ?? '';\r\n            wrapper.appendChild(caption);\r\n            // order arrow\r\n            if (col.sortable) {\r\n                th.appendChild(createElement('layer', 'arrow'));\r\n            }\r\n            // filter\r\n            if (col.allowFilter === true) {\r\n                const filter = createElement('layer', 'filter');\r\n                filter.appendChild(createIcon('fa-solid', 'filter'));\r\n                filter.addEventListener('mousedown', e => this.#onFilter(e, col));\r\n                th.classList.add('header-filter');\r\n                th.appendChild(filter);\r\n            }\r\n            // resize spliter\r\n            if (col.resizable !== false) {\r\n                const spliter = createElement('layer', 'spliter');\r\n                spliter.addEventListener('mousedown', e => this.#onResizeStart(e, col));\r\n                spliter.addEventListener('dblclick', e => this.#onAutoResize(e, col));\r\n                th.appendChild(spliter);\r\n            }\r\n            // tooltip\r\n            // !nullOrEmpty(col.tooltip) && setTooltip(th, col.tooltip);\r\n            header.appendChild(th);\r\n        }\r\n        const dragger = createElement('div', 'dragger');\r\n        const draggerCursor = createElement('layer', 'dragger-cursor');\r\n        header.appendChild(createElement('th', null, dragger, draggerCursor));\r\n\r\n        sizer.replaceChildren();\r\n        this.#refs.header = header;\r\n        this.#refs.dragger = dragger;\r\n        this.#refs.draggerCursor = draggerCursor;\r\n        return thead;\r\n    }\r\n\r\n    #createBody() {\r\n        const body = createElement('div', 'ui-grid-body');\r\n        body.addEventListener('scroll', e => throttle(this.#onScroll, RefreshInterval, this, e), { passive: true });\r\n        const cols = this.columns;\r\n        let width = 1;\r\n        for (let col of cols) {\r\n            if (col.visible !== false && !isNaN(col.width)) {\r\n                width += col.width + 1;\r\n            }\r\n        }\r\n        // body container\r\n        const bodyContainer = createElement('div');\r\n        bodyContainer.style.position = 'relative';\r\n        bodyContainer.style.minWidth = '100%';\r\n        bodyContainer.style.minHeight = '1px';\r\n        if (width > 0) {\r\n            bodyContainer.style.width = `${width}px`;\r\n        }\r\n        body.appendChild(bodyContainer);\r\n        // body content\r\n        const bodyContent = createElement('table', 'ui-grid-body-content');\r\n        bodyContent.addEventListener('mousedown', e => {\r\n            let [parent, target] = this.#getRowTarget(e.target);\r\n            const rowIndex = indexOfParent(parent);\r\n            let colIndex = indexOfParent(target);\r\n            if (colIndex >= this.columns.length) {\r\n                colIndex = -1;\r\n            }\r\n            this.#onRowClicked(e, rowIndex, colIndex);\r\n        });\r\n        bodyContent.addEventListener('dblclick', e => this.#onRowDblClicked(e));\r\n        bodyContainer.appendChild(bodyContent);\r\n        // this.#adjustRows();\r\n        // events\r\n        if (!this.holderDisabled) {\r\n            const holder = createElement('div', 'ui-grid-hover-holder');\r\n            holder.addEventListener('mousedown', e => {\r\n                const holder = e.currentTarget;\r\n                const row = Number(holder.dataset.row);\r\n                const col = Number(holder.dataset.col);\r\n                if (holder.classList.contains('active')) {\r\n                    holder.classList.remove('active');\r\n                }\r\n                return this.#onRowClicked(e, row + this.#startIndex, col);\r\n            });\r\n            holder.addEventListener('dblclick', e => this.#onRowDblClicked(e));\r\n            bodyContainer.appendChild(holder);\r\n            body.addEventListener('mousemove', e => throttle(this.#onBodyMouseMove, HoverInternal, this, e, holder), { passive: true });\r\n        }\r\n        this.#refs.body = body;\r\n        this.#refs.bodyContainer = bodyContainer;\r\n        this.#refs.bodyContent = bodyContent;\r\n\r\n        // this.refresh();\r\n        return body;\r\n    }\r\n\r\n    #fillRows(widths) {\r\n        let count = this.#rowCount;\r\n        if (isNaN(count) || count < 0 || !this.virtual) {\r\n            count = this.#currentSource.length;\r\n        }\r\n        const content = this.#refs.bodyContent;\r\n        // content.replaceChildren();\r\n        const cols = this.columns;\r\n        const vtable = this.#vtable;\r\n        const vnew = [];\r\n        const startIndex = this.#startIndex;\r\n        // reuse\r\n        for (let i = 0; i < count; i++) {\r\n            const index = startIndex + i;\r\n            const e = vtable.findIndex(v => v.index === index);\r\n            if (e >= 0) {\r\n                vnew[i] = vtable.splice(e, 1)[0];\r\n            }\r\n        }\r\n        // move or create\r\n        for (let i = 0; i < count; i++) {\r\n            if (vnew[i] != null) {\r\n                continue;\r\n            }\r\n            const index = startIndex + i;\r\n            const e = vtable.splice(0, 1);\r\n            let vdom;\r\n            if (e.length > 0) {\r\n                vdom = {\r\n                    ...e[0],\r\n                    index,\r\n                    mode: 'move'\r\n                };\r\n                vdom.el.remove();\r\n            } else {\r\n                const row = createElement('tr', 'ui-grid-row');\r\n                cols.forEach((col, j) => {\r\n                    const cell = createElement('td');\r\n                    if (col.visible !== false) {\r\n                        cell.dataset.col = String(j);\r\n                        const style = this.#get(col.key, 'style');\r\n                        if (style != null) {\r\n                            for (let css of Object.entries(style)) {\r\n                                cell.style.setProperty(css[0], css[1]);\r\n                            }\r\n                        }\r\n                        if (col.css != null) {\r\n                            for (let css of Object.entries(col.css)) {\r\n                                cell.style.setProperty(css[0], css[1]);\r\n                            }\r\n                        }\r\n                        if (Grid.ColumnTypes.isCheckbox(col.type)) {\r\n                            cell.appendChild(GridCheckboxColumn.createEdit(e => this.#onRowChanged(e, exists + i, col, e.target.checked)));\r\n                            // this.#colTypes[col.key] = GridCheckboxColumn;\r\n                        } else {\r\n                            let type = this.#colTypes[col.key];\r\n                            if (type == null) {\r\n                                if (isNaN(col.type)) {\r\n                                    if (this.allowHtml && col.type != null) {\r\n                                        type = col.type;\r\n                                    }\r\n                                } else {\r\n                                    type = ColumnTypes[col.type];\r\n                                }\r\n                                type ??= GridColumn;\r\n                                this.#colTypes[col.key] = type;\r\n                            }\r\n                            cell.appendChild(type.create(col));\r\n                        }\r\n                    }\r\n                    row.appendChild(cell);\r\n                });\r\n                row.appendChild(createElement('td'));\r\n                vdom = {\r\n                    index,\r\n                    mode: 'create',\r\n                    el: row\r\n                };\r\n            }\r\n            vnew[i] = vdom;\r\n        }\r\n        this.#vtable = vnew;\r\n\r\n        const selectedIndexes = this.#selectedIndexes;\r\n        vnew.filter(vdom => vdom.mode != null).forEach(vdom => {\r\n            const row = vdom.el;\r\n            const index = vdom.index;\r\n            const vals = this.#currentSource[index];\r\n            if (vals == null) {\r\n                return;\r\n            }\r\n            if (!isPositive(row.children.length)) {\r\n                return;\r\n            }\r\n            // row.dataset.row = String(index);\r\n            const item = vals.values;\r\n            const selected = selectedIndexes.indexOf(index) >= 0;\r\n            if (selected) {\r\n                row.classList.add('selected');\r\n            } else if (row.classList.contains('selected')) {\r\n                row.classList.remove('selected');\r\n            }\r\n            // data\r\n            const selectChanged = vals.__selected ^ selected;\r\n            if (selected) {\r\n                vals.__selected = true;\r\n            } else {\r\n                delete vals.__selected;\r\n            }\r\n            cols.forEach((col, j) => {\r\n                if (col.visible === false) {\r\n                    return;\r\n                }\r\n                let val;\r\n                if (col.text != null) {\r\n                    val = col.text;\r\n                } else if (typeof col.filter === 'function') {\r\n                    val = col.filter(item);\r\n                } else {\r\n                    val = item[col.key];\r\n                    if (val?.displayValue != null) {\r\n                        val = val.displayValue;\r\n                    }\r\n                }\r\n                val ??= '';\r\n                // fill\r\n                const cell = row.children[j];\r\n                cell.dataset.row = String(index);\r\n                if (typeof col.bgFilter === 'function') {\r\n                    const bgColor = col.bgFilter(item);\r\n                    cell.style.backgroundColor = bgColor ?? '';\r\n                }\r\n                const isCheckbox = Grid.ColumnTypes.isCheckbox(col.type);\r\n                const type = isCheckbox ? GridCheckboxColumn : this.#colTypes[col.key] ?? GridColumn;\r\n                let element;\r\n                if (!isCheckbox && selectChanged && typeof type.createEdit === 'function') {\r\n                    if (vals.__editing?.[col.key] && type.editing) {\r\n                        val = type.getValue({ target: cell.children[0] });\r\n                        this.#onRowChanged(null, index, col, val, true);\r\n                    }\r\n                    element = selected ?\r\n                        type.createEdit(e => this.#onRowChanged(e, index, col, type.getValue(e)), col, this.#refs.bodyContent, vals) :\r\n                        type.create(col);\r\n                    cell.replaceChildren(element);\r\n                } else {\r\n                    element = cell.children[0];\r\n                }\r\n                let enabled;\r\n                if (this.readonly) {\r\n                    enabled = false;\r\n                } else {\r\n                    enabled = col.enabled;\r\n                    if (typeof enabled === 'function') {\r\n                        enabled = enabled.call(col, item);\r\n                    } else if (typeof enabled === 'string') {\r\n                        enabled = item[enabled];\r\n                    }\r\n                }\r\n                type.setValue(element, val, item, col, this);\r\n                if (typeof type.setEnabled === 'function') {\r\n                    type.setEnabled(element, enabled);\r\n                }\r\n                // auto resize\r\n                if (this.#needResize && this.#get(col.key, 'autoResize')) {\r\n                    const width = element.scrollWidth + 12;\r\n                    if (width > 0 && widths != null && (isNaN(widths[j]) || widths[j] < width)) {\r\n                        widths[j] = width;\r\n                        widths.flag = true;\r\n                    }\r\n                }\r\n                if (typeof col.styleFilter === 'function') {\r\n                    const style = col.styleFilter(item);\r\n                    if (style != null) {\r\n                        type.setStyle(element, style);\r\n                    }\r\n                }\r\n                if (col.events != null) {\r\n                    for (let ev of Object.entries(col.events)) {\r\n                        element[ev[0]] = ev[1].bind(item);\r\n                    }\r\n                }\r\n                if (col.attrs != null) {\r\n                    let attrs = col.attrs;\r\n                    if (typeof attrs === 'function') {\r\n                        attrs = attrs(item);\r\n                    }\r\n                    for (let attr of Object.entries(attrs)) {\r\n                        element.setAttribute(attr[0], attr[1]);\r\n                    }\r\n                }\r\n            });\r\n            if (vals.__editing != null) {\r\n                delete vals.__editing;\r\n            }\r\n        });\r\n\r\n        content.replaceChildren(...vnew.map(vdom => vdom.el));\r\n    }\r\n\r\n    #changeColumnWidth(index, width) {\r\n        const col = this.columns[index];\r\n        // const oldwidth = col.width;\r\n        const w = `${width}px`;\r\n        col.width = width;\r\n        const style = this.#get(col.key, 'style');\r\n        style.width = w;\r\n        style['max-width'] = w;\r\n        style['min-width'] = w;\r\n        let element = this.#refs.header.children[index];\r\n        element.style.width = w;\r\n        element.style.maxWidth = w;\r\n        element.style.minWidth = w;\r\n        const body = this.#refs.bodyContent;\r\n        for (let row of body.children) {\r\n            element = row.children[index];\r\n            if (element != null) {\r\n                element.style.width = w;\r\n                element.style.maxWidth = w;\r\n                element.style.minWidth = w;\r\n            }\r\n        }\r\n        // } else {\r\n        //     width = this.#refs.bodyContainer.offsetWidth - oldwidth + width;\r\n        //     this.#refs.bodyContainer.style.width = `${width}px`;\r\n        // }\r\n    }\r\n\r\n    #changingColumnOrder(index, offset, x, offsetLeft) {\r\n        const children = this.#refs.header.children;\r\n        let element = children[index];\r\n        this.#refs.dragger.style.left = `${element.offsetLeft - offsetLeft + offset}px`;\r\n        this.#refs.dragger.style.width = element.style.width;\r\n        this.#refs.dragger.style.display = 'block';\r\n        offset = x - getOffsetLeftFromWindow(element);\r\n        let idx;\r\n        if (offset < 0) {\r\n            offset = -offset;\r\n            for (let i = index - 1; i >= 0 && offset >= 0; i -= 1) {\r\n                element = children[i];\r\n                if (element == null || element.className !== 'column') {\r\n                    break;\r\n                }\r\n                if (offset < element.offsetWidth) {\r\n                    idx = (offset > element.offsetWidth / 2) ? i : i + 1;\r\n                    break;\r\n                }\r\n                offset -= element.offsetWidth;\r\n            }\r\n            idx ??= 0;\r\n        } else {\r\n            const count = children.length;\r\n            for (let i = index; i < count - 1 && offset >= 0; i += 1) {\r\n                element = children[i];\r\n                if (element == null || element.className !== 'column') {\r\n                    idx = i;\r\n                    break;\r\n                }\r\n                if (offset < element.offsetWidth) {\r\n                    idx = (offset > element.offsetWidth / 2) ? i + 1 : i;\r\n                    break;\r\n                }\r\n                offset -= element.offsetWidth;\r\n            }\r\n            idx ??= count - 1;\r\n        }\r\n        if (idx !== this.#colAttrs.__orderIndex) {\r\n            this.#colAttrs.__orderIndex = idx;\r\n            element = children[idx];\r\n            if (element == null) {\r\n                return;\r\n            }\r\n            this.#refs.draggerCursor.style.left = `${element.offsetLeft - offsetLeft}px`;\r\n            this.#refs.draggerCursor.style.display = 'block';\r\n        }\r\n    }\r\n\r\n    #changeColumnOrder(index) {\r\n        this.#refs.dragger.style.display = '';\r\n        this.#refs.draggerCursor.style.display = '';\r\n        const orderIndex = this.#colAttrs.__orderIndex;\r\n        if (orderIndex >= 0 && orderIndex !== index) {\r\n            let targetIndex = orderIndex - index;\r\n            if (targetIndex >= 0 && targetIndex <= 1) {\r\n                return;\r\n            }\r\n            const header = this.#refs.header;\r\n            const children = header.children;\r\n            const rows = this.#refs.bodyContent.children;\r\n            const columns = this.columns;\r\n            if (targetIndex > 1) {\r\n                targetIndex = orderIndex - 1;\r\n                // const current = columns[index];\r\n                // for (let i = index; i < targetIndex; i += 1) {\r\n                //     columns[i] = columns[i + 1];\r\n                // }\r\n                // columns[targetIndex] = current;\r\n                const current = columns.splice(index, 1)[0];\r\n                columns.splice(targetIndex, 0, current);\r\n                header.insertBefore(children[index], children[targetIndex].nextElementSibling);\r\n                for (let row of rows) {\r\n                    row.insertBefore(row.children[index], row.children[targetIndex].nextElementSibling);\r\n                }\r\n            } else {\r\n                targetIndex = orderIndex;\r\n                // const current = columns[index];\r\n                // for (let i = index; i > targetIndex; i -= 1) {\r\n                //     columns[i] = columns[i - 1];\r\n                // }\r\n                // columns[targetIndex] = current;\r\n                const current = columns.splice(index, 1)[0];\r\n                columns.splice(targetIndex, 0, current);\r\n                header.insertBefore(children[index], children[targetIndex]);\r\n                for (let row of rows) {\r\n                    row.insertBefore(row.children[index], row.children[targetIndex]);\r\n                }\r\n            }\r\n            // refresh sortIndex\r\n            [...children].forEach((th, i) => {\r\n                const arrow = th.querySelector('.arrow');\r\n                if (arrow == null) {\r\n                    return;\r\n                }\r\n                if (arrow.className !== 'arrow') {\r\n                    this.sortIndex = i;\r\n                }\r\n            });\r\n\r\n            if (typeof this.columnChanged === 'function') {\r\n                this.columnChanged(ColumnChangedType.Reorder, index, targetIndex);\r\n            }\r\n        }\r\n    }\r\n\r\n    #scrollToTop(top, reload) {\r\n        const rowHeight = (this.rowHeight + 1);\r\n        top -= (top % (rowHeight * 2)) + (RedumCount * rowHeight);\r\n        if (top < 0) {\r\n            top = 0;\r\n        } else {\r\n            let bottomTop = this.#containerHeight - (reload ? 0 : this.#rowCount * rowHeight);\r\n            if (bottomTop < 0) {\r\n                bottomTop = 0;\r\n            }\r\n            if (top > bottomTop) {\r\n                top = bottomTop;\r\n            }\r\n        }\r\n        if (this.#scrollTop !== top) {\r\n            this.#scrollTop = top;\r\n            if (this.virtual) {\r\n                this.#startIndex = top / rowHeight;\r\n            }\r\n            this.refresh();\r\n            if (this.virtual) {\r\n                this.#refs.bodyContent.style.top = `${top}px`;\r\n            }\r\n        } else if (reload) {\r\n            this.refresh();\r\n        }\r\n\r\n        return top;\r\n    }\r\n\r\n    #get(key, name) {\r\n        const attr = this.#colAttrs[key];\r\n        if (attr == null) {\r\n            return null;\r\n        }\r\n        return attr[name];\r\n    }\r\n\r\n    #set(key, name, value) {\r\n        const attr = this.#colAttrs[key];\r\n        if (attr == null) {\r\n            this.#colAttrs[key] = { [name]: value };\r\n        } else {\r\n            attr[name] = value;\r\n        }\r\n    }\r\n\r\n    #getItemValue(item, key, filter) {\r\n        let value;\r\n        if (typeof filter === 'function') {\r\n            value = filter(item);\r\n        } else {\r\n            value = item[key];\r\n        }\r\n        return value?.value ?? value;\r\n    }\r\n\r\n    #getRowTarget(target) {\r\n        let parent;\r\n        while ((parent = target.parentElement) != null && !parent.classList.contains('ui-grid-row')) {\r\n            target = parent;\r\n        }\r\n        return [parent, target];\r\n    }\r\n\r\n    #notHeader(tagName) {\r\n        return /^(input|label|layer|svg|use)$/i.test(tagName);\r\n    }\r\n\r\n    #onHeaderClicked(e, col, force) {\r\n        if (!force && (this.#get(col.key, 'resizing') || this.#get(col.key, 'dragging'))) {\r\n            return;\r\n        }\r\n        if (!this.#notHeader(e.target.tagName)) {\r\n            const index = this.columns.indexOf(col);\r\n            if (index < 0) {\r\n                return;\r\n            }\r\n            if (this.sortIndex === index) {\r\n                this.sortDirection = this.sortDirection === 1 ? -1 : 1;\r\n            } else {\r\n                this.sortIndex = index;\r\n            }\r\n            this.sortColumn(true);\r\n            if (typeof this.columnChanged === 'function') {\r\n                this.columnChanged(ColumnChangedType.Sort, index, this.sortDirection);\r\n            }\r\n        }\r\n    }\r\n\r\n    #onCloseFilter() {\r\n        const panels = this.#el.querySelectorAll('.filter-panel.active');\r\n        if (panels.length > 0) {\r\n            panels.forEach(el => el.classList.remove('active'));\r\n            setTimeout(() => this.#el.querySelectorAll('.filter-panel').forEach(el => el.remove()), 120);\r\n            const filtering = this.#colAttrs.__filtering;\r\n            if (filtering instanceof HTMLElement) {\r\n                filtering.classList.remove('hover');\r\n            }\r\n            delete this.#colAttrs.__filtering;\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    #onFilter(e, col) {\r\n        if (this.#onCloseFilter()) {\r\n            return;\r\n        }\r\n        const close = e => {\r\n            if ((e.target.tagName === 'LAYER' && e.target.classList.contains('filter')) ||\r\n                e.target.tagName === 'use') {\r\n                return;\r\n            }\r\n            if (this.#onCloseFilter()) {\r\n                document.removeEventListener('mousedown', close);\r\n            }\r\n        }\r\n        document.addEventListener('mousedown', close);\r\n        const panel = createElement('div', 'filter-panel');\r\n        panel.addEventListener('mousedown', e => e.stopPropagation());\r\n        const filter = e.currentTarget;\r\n        const th = filter.parentElement;\r\n        const width = th.offsetWidth;\r\n        panel.style.top = `${th.offsetHeight}px`;\r\n        panel.style.left = (th.offsetLeft + (width > FilterPanelWidth ? width - FilterPanelWidth : 0)) + 'px';\r\n\r\n        // search\r\n        let searchbox;\r\n        if (col.allowSearch !== false) {\r\n            const searchholder = createElement('div', 'filter-search-holder');\r\n            searchbox = createElement('input', 'filter-search-box ui-text');\r\n            searchbox.type = 'text';\r\n            const searchicon = createIcon('fa-regular', 'search');\r\n            searchicon.addEventListener('mousedown', e => {\r\n                searchbox.focus();\r\n                e.preventDefault();\r\n            });\r\n            searchholder.append(searchbox, searchicon);\r\n            panel.append(searchholder);\r\n        }\r\n        // list\r\n        const itemlist = createElement('div', 'filter-item-list');\r\n        itemlist.addEventListener('scroll', e => throttle(this.#onFilterScroll, RefreshInterval, this, col, itemlist, e.target.scrollTop), { passive: true });\r\n        // - all\r\n        const itemall = createElement('div', 'filter-item filter-all');\r\n        itemall.appendChild(createCheckbox({\r\n            label: this.langs.all,\r\n            onchange: e => {\r\n                const checked = e.target.checked;\r\n                itemlist.querySelectorAll('.filter-content input').forEach(box => box.checked = checked);\r\n            }\r\n        }));\r\n        itemlist.appendChild(itemall);\r\n        // - items\r\n        let array;\r\n        if (Array.isArray(col.filterSource)) {\r\n            array = col.filterSource;\r\n        } else if (typeof col.filterSource === 'function') {\r\n            array = col.filterSource.call(this, col);\r\n        } else {\r\n            const dict = Object.create(null);\r\n            for (let item of this.#source) {\r\n                const val = this.#getItemValue(item.values, col.key, col.filter);\r\n                if (!Object.hasOwnProperty.call(dict, val)) {\r\n                    const v = item.values[col.key];\r\n                    dict[val] = {\r\n                        value: val,\r\n                        displayValue: typeof col.filter === 'function' ? col.filter(item.values) : v?.displayValue ?? v\r\n                    };\r\n                }\r\n            }\r\n            array = Object.values(dict)\r\n                .sort((a, b) => {\r\n                    a = a?.value ?? a;\r\n                    b = b?.value ?? b;\r\n                    return a > b ? 1 : a < b ? -1 : 0;\r\n                });\r\n        }\r\n        array = array.map(i => {\r\n            if (Object.prototype.hasOwnProperty.call(i, 'value') &&\r\n                Object.prototype.hasOwnProperty.call(i, 'displayValue')) {\r\n                return i;\r\n            }\r\n            return {\r\n                value: i,\r\n                displayValue: i == null ? '' : i\r\n            };\r\n        });\r\n        this.#fillFilterList(col, itemlist, array, itemall);\r\n        itemall.querySelector('input').checked = ![...itemlist.querySelectorAll('.filter-content input')].some(i => !i.checked);\r\n        panel.appendChild(itemlist);\r\n        if (searchbox != null) {\r\n            searchbox.addEventListener('input', e => {\r\n                const key = e.currentTarget.value.toLowerCase();\r\n                const items = key.length === 0 ? array : array.filter(i => {\r\n                    const displayValue = i?.displayValue ?? i;\r\n                    return String(displayValue ?? '').indexOf(key) >= 0;\r\n                });\r\n                this.#fillFilterList(col, itemlist, items, itemall);\r\n            });\r\n        }\r\n        // function\r\n        const functions = createElement('div', 'filter-function');\r\n        functions.append(\r\n            createElement('button', ok => {\r\n                ok.innerText = this.langs.ok;\r\n                ok.addEventListener('click', () => {\r\n                    const array = this.#get(col.key, 'filterSource').filter(i => i.__checked !== false);\r\n                    if (typeof col.onFilterOk === 'function') {\r\n                        col.onFilterOk.call(this, col, array);\r\n                    } else {\r\n                        col.filterValues = array.map(a => a.value);\r\n                    }\r\n                    this.#colAttrs.__filtered = true;\r\n                    this.#refreshSource();\r\n                    if (typeof col.onFiltered === 'function') {\r\n                        col.onFiltered.call(this, col);\r\n                    }\r\n                    filter.classList.add('active');\r\n                    this.#onCloseFilter();\r\n                });\r\n            }),\r\n            createElement('button', reset => {\r\n                reset.innerText = this.langs.reset;\r\n                reset.addEventListener('click', () => {\r\n                    delete col.filterValues;\r\n                    this.#colAttrs.__filtered = this.columns.some(c => col.filterValues != null)\r\n                    this.#refreshSource();\r\n                    if (typeof col.onFiltered === 'function') {\r\n                        col.onFiltered.call(this, col);\r\n                    }\r\n                    filter.classList.remove('active');\r\n                    this.#onCloseFilter();\r\n                });\r\n            })\r\n        );\r\n        panel.appendChild(functions);\r\n\r\n        this.#el.appendChild(panel);\r\n        setTimeout(() => panel.classList.add('active'), 0);\r\n        this.#colAttrs.__filtering = filter;\r\n        filter.classList.add('hover');\r\n    }\r\n\r\n    #fillFilterList(col, list, array, all) {\r\n        list.querySelector('.filter-holder')?.remove();\r\n        list.querySelector('.filter-content')?.remove();\r\n        const rowHeight = this.filterRowHeight;\r\n        const height = array.length * rowHeight;\r\n        this.#set(col.key, 'filterHeight', height);\r\n        const holder = createElement('div', 'filter-holder');\r\n        holder.style.height = `${height}px`;\r\n        const content = createElement('div', 'filter-content');\r\n        content.style.top = `${rowHeight}px`;\r\n        this.#set(col.key, 'filterSource', array);\r\n        for (let item of array) {\r\n            item.__checked = !Array.isArray(col.filterValues) || col.filterValues.indexOf(item.value ?? item) >= 0;\r\n        }\r\n        if (array.length > 12) {\r\n            array = array.slice(0, 12);\r\n        }\r\n        this.#doFillFilterList(content, array, all);\r\n        list.append(holder, content);\r\n    }\r\n\r\n    #doFillFilterList(content, array, all) {\r\n        for (let item of array) {\r\n            const div = createElement('div', 'filter-item');\r\n            div.appendChild(createCheckbox({\r\n                checked: item.__checked,\r\n                label: item?.displayValue ?? item,\r\n                onchange: e => {\r\n                    item.__checked = e.target.checked;\r\n                    all.querySelector('input').checked = ![...content.querySelectorAll('input')].some(i => !i.checked);\r\n                }\r\n            }));\r\n            content.appendChild(div);\r\n        }\r\n    }\r\n\r\n    #onFilterScroll(col, list, top) {\r\n        const rowHeight = this.filterRowHeight;\r\n        top -= (top % (rowHeight * 2)) + rowHeight;\r\n        if (top < 0) {\r\n            top = 0;\r\n        } else {\r\n            let bottomTop = this.#get(col.key, 'filterHeight') - (12 * rowHeight);\r\n            if (bottomTop < 0) {\r\n                bottomTop = 0;\r\n            }\r\n            if (top > bottomTop) {\r\n                top = bottomTop;\r\n            }\r\n        }\r\n        if (this.#get(col.key, 'filterTop') !== top) {\r\n            this.#set(col.key, 'filterTop', top);\r\n            const startIndex = top / rowHeight;\r\n            let array = this.#get(col.key, 'filterSource');\r\n            if (startIndex + 12 < array.length) {\r\n                array = array.slice(startIndex, startIndex + 12);\r\n            } else {\r\n                array = array.slice(-12);\r\n            }\r\n            const content = list.querySelector('.filter-content');\r\n            content.replaceChildren();\r\n            this.#doFillFilterList(content, array, list.querySelector('.filter-all>input'));\r\n            content.style.top = `${top + rowHeight}px`;\r\n        }\r\n    }\r\n\r\n    #onDragStart(e, col) {\r\n        if (this.#notHeader(e.target.tagName)) {\r\n            return;\r\n        }\r\n        const cx = getClientX(e);\r\n        const index = indexOfParent(e.currentTarget);\r\n        const clearEvents = attr => {\r\n            for (let event of ['mousemove', 'mouseup']) {\r\n                if (attr.hasOwnProperty(event)) {\r\n                    window.removeEventListener(event, attr[event]);\r\n                    delete attr[event];\r\n                }\r\n            }\r\n        };\r\n        let attr = this.#colAttrs[col.key];\r\n        if (attr == null) {\r\n            attr = this.#colAttrs[col.key] = {};\r\n        } else {\r\n            clearEvents(attr);\r\n        }\r\n        attr.dragging = true;\r\n        const offsetLeft = this.#refs.header.querySelector('th:last-child').offsetLeft;\r\n        const dragmove = e => {\r\n            const cx2 = getClientX(e);\r\n            const offset = cx2 - cx;\r\n            let pos = attr.offset;\r\n            let dragging;\r\n            if (pos == null && (offset > MiniDragOffset || offset < -MiniDragOffset)) {\r\n                dragging = true;\r\n            } else if (pos !== offset) {\r\n                dragging = true;\r\n            }\r\n            if (dragging) {\r\n                this.#changingColumnOrder(index, offset, cx2, offsetLeft);\r\n                attr.offset = offset;\r\n            }\r\n        };\r\n        attr.mousemove = e => throttle(dragmove, RefreshInterval, this, e);\r\n        attr.mouseup = () => {\r\n            clearEvents(attr);\r\n            if (attr.offset == null) {\r\n                delete attr.dragging;\r\n            } else {\r\n                setTimeout(() => {\r\n                    delete attr.dragging;\r\n                    delete attr.offset;\r\n                });\r\n                this.#changeColumnOrder(index);\r\n            }\r\n        };\r\n        ['mousemove', 'mouseup'].forEach(event => window.addEventListener(event, attr[event]));\r\n    }\r\n\r\n    #onResizeStart(e, col) {\r\n        const cx = getClientX(e);\r\n        const width = col.width;\r\n        const index = indexOfParent(e.currentTarget.parentElement);\r\n        const window = this.window ?? global;\r\n        const clearEvents = attr => {\r\n            for (let event of ['mousemove', 'mouseup']) {\r\n                if (attr.hasOwnProperty(event)) {\r\n                    window.removeEventListener(event, attr[event]);\r\n                    delete attr[event];\r\n                }\r\n            }\r\n        };\r\n        let attr = this.#colAttrs[col.key];\r\n        if (attr == null) {\r\n            attr = this.#colAttrs[col.key] = {};\r\n        } else {\r\n            clearEvents(attr);\r\n        }\r\n        attr.resizing = width;\r\n        const resizemove = e => {\r\n            const cx2 = getClientX(e);\r\n            const val = width + (cx2 - cx);\r\n            if (val < MiniColumnWidth) {\r\n                return;\r\n            }\r\n            attr.resizing = val;\r\n            attr.sizing = true;\r\n            this.#changeColumnWidth(index, val);\r\n        };\r\n        attr.mousemove = e => throttle(resizemove, RefreshInterval, this, e);\r\n        attr.mouseup = e => {\r\n            clearEvents(attr);\r\n            const width = attr.resizing;\r\n            if (width != null) {\r\n                setTimeout(() => delete attr.resizing);\r\n                if (attr.sizing) {\r\n                    delete attr.sizing;\r\n                    delete attr.autoResize;\r\n                    this.#changeColumnWidth(index, width);\r\n                    if (typeof this.columnChanged === 'function') {\r\n                        this.columnChanged(ColumnChangedType.Resize, index, width);\r\n                    }\r\n                }\r\n            }\r\n            e.stopPropagation();\r\n            e.preventDefault();\r\n        };\r\n        ['mousemove', 'mouseup'].forEach(event => window.addEventListener(event, attr[event]));\r\n    }\r\n\r\n    #onAutoResize(e, col) {\r\n        const th = e.currentTarget.parentElement;\r\n        const index = indexOfParent(th);\r\n        let width = th.querySelector('div:first-child').scrollWidth;\r\n        for (let row of this.#refs.bodyContent.children) {\r\n            const element = row.children[index].children[0];\r\n            const w = element.scrollWidth;\r\n            if (w > width) {\r\n                width = w;\r\n            }\r\n        }\r\n        if (width < MiniColumnWidth) {\r\n            width = MiniColumnWidth;\r\n        }\r\n        if (width > 0 && width !== col.width) {\r\n            width += 12;\r\n            this.#changeColumnWidth(index, width);\r\n            if (typeof this.columnChanged === 'function') {\r\n                this.columnChanged(ColumnChangedType.Resize, index, width);\r\n            }\r\n        }\r\n    }\r\n\r\n    #onColumnAllChecked(col, flag) {\r\n        if (this.#currentSource == null) {\r\n            return;\r\n        }\r\n        const key = col.key;\r\n        const isFunction = typeof col.enabled === 'function';\r\n        const isString = typeof col.enabled === 'string';\r\n        if (typeof col.onallchecked === 'function') {\r\n            col.onallchecked.call(this, col, flag);\r\n        } else {\r\n            for (let row of this.#currentSource) {\r\n                const item = row.values;\r\n                if (item == null) {\r\n                    continue;\r\n                }\r\n                const enabled = isFunction ? col.enabled(item) : isString ? item[col.enabled] : col.enabled;\r\n                if (enabled !== false) {\r\n                    item[key] = flag;\r\n                    row.__changed = true;\r\n                    if (typeof col.onchanged === 'function') {\r\n                        col.onchanged.call(this, item, flag);\r\n                    }\r\n                }\r\n            }\r\n            this.refresh();\r\n        }\r\n    }\r\n\r\n    #onScroll(e) {\r\n        const left = e.target.scrollLeft;\r\n        if (this.#scrollLeft !== left) {\r\n            this.#scrollLeft = left;\r\n            this.#refs.header.style.left = `${-left}px`;\r\n        }\r\n        if (!this.virtual) {\r\n            return;\r\n        }\r\n        const top = e.target.scrollTop;\r\n        this.#scrollToTop(top);\r\n    }\r\n\r\n    #onBodyMouseMove(e, holder) {\r\n        if (e.target.classList.contains('ui-grid-hover-holder')) {\r\n            return;\r\n        }\r\n        let [parent, target] = this.#getRowTarget(e.target);\r\n        if (parent == null) {\r\n            delete holder.dataset.row;\r\n            delete holder.dataset.col;\r\n            if (holder.classList.contains('active')) {\r\n                holder.classList.remove('active');\r\n            }\r\n            return;\r\n        }\r\n        const element = target.children[0];\r\n        if (element?.tagName !== 'SPAN') {\r\n            if (holder.classList.contains('active')) {\r\n                delete holder.dataset.row;\r\n                delete holder.dataset.col;\r\n                holder.classList.remove('active');\r\n            }\r\n            return;\r\n        }\r\n        const row = target.dataset.row;\r\n        const col = target.dataset.col;\r\n        if (holder.dataset.row === row &&\r\n            holder.dataset.col === col) {\r\n            return;\r\n        }\r\n        if (element.scrollWidth > element.offsetWidth) {\r\n            holder.dataset.row = row;\r\n            holder.dataset.col = col;\r\n            holder.innerText = element.innerText;\r\n            const top = this.#refs.bodyContent.offsetTop + target.offsetTop;\r\n            let left = target.offsetLeft;\r\n            let width = holder.offsetWidth;\r\n            if (width > this.#bodyClientWidth) {\r\n                width = this.#bodyClientWidth;\r\n            }\r\n            const maxleft = this.#bodyClientWidth + this.#scrollLeft - width;\r\n            if (left > maxleft) {\r\n                left = maxleft;\r\n            }\r\n            const height = target.offsetHeight;\r\n            holder.style.cssText = `top: ${top}px; left: ${left}px; max-width: ${this.#bodyClientWidth}px; height: ${height - 2}px`;\r\n            holder.classList.add('active');\r\n        } else if (holder.classList.contains('active')) {\r\n            delete holder.dataset.row;\r\n            delete holder.dataset.col;\r\n            holder.classList.remove('active');\r\n        }\r\n    }\r\n\r\n    #onRowClicked(e, index, colIndex) {\r\n        const startIndex = this.#startIndex;\r\n        const selectedIndex = startIndex + index;\r\n        if (typeof this.willSelect === 'function' && !this.willSelect(selectedIndex, colIndex)) {\r\n            return;\r\n        }\r\n        // multi-select\r\n        let flag = false;\r\n        const selectedIndexes = this.#selectedIndexes;\r\n        if (this.multiSelect) {\r\n            if (e.ctrlKey) {\r\n                const i = selectedIndexes.indexOf(selectedIndex);\r\n                if (i < 0) {\r\n                    selectedIndexes.push(selectedIndex);\r\n                } else {\r\n                    selectedIndexes.splice(i, 1);\r\n                }\r\n                flag = true;\r\n            } else if (e.shiftKey && selectedIndexes.length > 0) {\r\n                if (selectedIndexes.length > 1 || selectedIndexes[0] !== selectedIndex) {\r\n                    let start = selectedIndexes[selectedIndexes.length - 1];\r\n                    let end;\r\n                    if (start > selectedIndex) {\r\n                        end = start;\r\n                        start = selectedIndex;\r\n                    } else {\r\n                        end = selectedIndex;\r\n                    }\r\n                    selectedIndexes.splice(0);\r\n                    for (let i = start; i <= end; i += 1) {\r\n                        selectedIndexes.push(i);\r\n                    }\r\n                    flag = true;\r\n                }\r\n            }\r\n        }\r\n        if (!flag && selectedIndexes.length !== 1 || selectedIndexes[0] !== selectedIndex) {\r\n            selectedIndexes.splice(0, selectedIndexes.length, selectedIndex);\r\n            flag = true;\r\n        }\r\n        // apply style\r\n        if (flag) {\r\n            if (this.readonly !== true) {\r\n                this.refresh();\r\n            } else {\r\n                [...this.#refs.bodyContent.children].forEach((row, i) => {\r\n                    if (selectedIndexes.indexOf(startIndex + i) >= 0) {\r\n                        row.classList.add('selected');\r\n                    } else if (row.classList.contains('selected')) {\r\n                        row.classList.remove('selected');\r\n                    }\r\n                });\r\n            }\r\n            if (typeof this.selectedRowChanged === 'function') {\r\n                this.selectedRowChanged(selectedIndex);\r\n            }\r\n        }\r\n        this.#selectedColumnIndex = colIndex;\r\n        if ((this.fullrowClick || colIndex >= 0) && e.buttons === 1 && typeof this.cellClicked === 'function') {\r\n            if (this.cellClicked(selectedIndex, colIndex) === false) {\r\n                e.stopPropagation();\r\n                e.preventDefault();\r\n            }\r\n        }\r\n    }\r\n\r\n    #onRowDblClicked(e) {\r\n        if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA' || e.target.tagName === 'LAYER' && e.target.className === 'ui-check-inner' || e.target.tagName === 'LABEL' && (e.target.className === 'ui-drop-text' || e.target.className === 'ui-drop-caret')) {\r\n            return;\r\n        }\r\n        const index = this.selectedIndex;\r\n        if (typeof this.rowDblClicked === 'function') {\r\n            this.rowDblClicked(index);\r\n        }\r\n        if (typeof this.cellDblClicked === 'function') {\r\n            const colIndex = this.#selectedColumnIndex;\r\n            if (this.fullrowClick || colIndex >= 0) {\r\n                this.cellDblClicked(index, colIndex);\r\n            }\r\n        }\r\n    }\r\n\r\n    #onRowChanged(_e, index, col, value, blur) {\r\n        if (this.#currentSource == null) {\r\n            return;\r\n        }\r\n        const row = this.#currentSource[this.#startIndex + index];\r\n        const item = row.values;\r\n        if (item == null) {\r\n            return;\r\n        }\r\n        let enabled = col.enabled;\r\n        if (typeof enabled === 'function') {\r\n            enabled = enabled.call(col, item);\r\n        } else if (typeof enabled === 'string') {\r\n            enabled = item[enabled];\r\n        }\r\n        if (enabled !== false) {\r\n            item[col.key] = value;\r\n            row.__changed = true;\r\n            if (blur) {\r\n                if (typeof col.oneditend === 'function') {\r\n                    col.oneditend.call(this, item, value);\r\n                }\r\n            } else {\r\n                if (typeof col.onchanged === 'function') {\r\n                    col.onchanged.call(this, item, value);\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport default Grid;","import \"./css/popup.scss\";\r\nimport { r } from \"../utility/lgres\";\r\nimport { nullOrEmpty } from \"../utility/strings\";\r\nimport { global } from \"../utility\";\r\nimport { createElement } from \"../functions\";\r\nimport { createIcon, changeIcon } from \"./icon\";\r\n\r\nconst ResizeMods = {\r\n    right: 1,\r\n    bottom: 2,\r\n    left: 4,\r\n    top: 8,\r\n    bottomRight: 2 | 1,\r\n    bottomLeft: 2 | 4,\r\n    topRight: 8 | 1,\r\n    topLeft: 8 | 4\r\n}\r\n\r\n// const Cursors = {\r\n//     [ResizeMods.right]: 'ew-resize',\r\n//     [ResizeMods.bottom]: 'ns-resize',\r\n//     [ResizeMods.bottomRight]: 'nwse-resize',\r\n//     [ResizeMods.left]: 'ew-resize',\r\n//     [ResizeMods.bottomLeft]: 'nesw-resize',\r\n//     [ResizeMods.top]: 'ns-resize',\r\n//     [ResizeMods.topRight]: 'nesw-resize',\r\n//     [ResizeMods.topLeft]: 'nwse-resize'\r\n// }\r\n\r\nfunction trimPx(px) {\r\n    if (typeof px !== 'string') {\r\n        return px;\r\n    }\r\n    if (px.endsWith('px')) {\r\n        const size = Number(px.substring(0, px.length - 2));\r\n        return isNaN(size) ? px : size;\r\n    }\r\n    return px;\r\n}\r\n\r\nclass Popup {\r\n    #mask;\r\n    #option;\r\n    #bounds;\r\n    // #cursor;\r\n\r\n    constructor(opts = {}) {\r\n        this.#option = opts;\r\n    }\r\n\r\n    get container() { return this.#mask.querySelector('.ui-popup-container') }\r\n\r\n    get rect() {\r\n        const container = this.container;\r\n        if (container == null) {\r\n            return null;\r\n        }\r\n        const style = global.getComputedStyle(container);\r\n        const collapsed = container.classList.contains('ui-popup-collapse');\r\n        const bounds = this.#bounds;\r\n        return {\r\n            collapsed,\r\n            left: trimPx(style.left),\r\n            top: trimPx(style.top),\r\n            width: collapsed === true && bounds != null ? bounds.width : trimPx(style.width),\r\n            height: collapsed === true && bounds != null ? bounds.height : trimPx(style.height)\r\n        };\r\n    }\r\n    set rect(r) {\r\n        const container = this.container;\r\n        if (container == null) {\r\n            return;\r\n        }\r\n        const css = [];\r\n        if (!isNaN(r.left)) {\r\n            css.push(`left: ${r.left}px`);\r\n        }\r\n        if (!isNaN(r.top)) {\r\n            css.push(`top: ${r.top}px`);\r\n        }\r\n        const collapse = container.querySelector('.ui-popup-header>.icon-expand');\r\n        if (r.collapsed === true) {\r\n            css.push('width: 160px', 'height: 40px');\r\n            this.#bounds = r;\r\n            container.classList.add('ui-popup-collapse');\r\n            if (collapse != null) {\r\n                changeIcon(collapse, 'fa-regular', 'expand-alt');\r\n            }\r\n        } else {\r\n            if (!isNaN(r.width) && r.width > 0) {\r\n                css.push(`width: ${r.width}px`);\r\n            }\r\n            if (!isNaN(r.height) && r.height > 0) {\r\n                css.push(`height: ${r.height}px`);\r\n            }\r\n            container.classList.remove('ui-popup-collapse');\r\n            this.#bounds = null;\r\n            if (collapse != null) {\r\n                changeIcon(collapse, 'fa-regular', 'compress-alt');\r\n            }\r\n        }\r\n        if (css.length > 0) {\r\n            container.style.cssText += css.join('; ');\r\n        }\r\n    }\r\n\r\n    create() {\r\n        const mask = createElement('div', 'ui-popup-mask');\r\n        if (this.#option.mask === false) {\r\n            mask.classList.add('ui-popup-transparent');\r\n        }\r\n        const container = createElement('div', 'ui-popup-container');\r\n        let tabIndex = Math.max.apply(null, [...document.querySelectorAll('[tabindex]')].map(e => e.tabIndex ?? 0));\r\n        if (tabIndex < 0) {\r\n            tabIndex = 0;\r\n        }\r\n        container.tabIndex = tabIndex + 1;\r\n        const close = () => {\r\n            mask.classList.add('ui-popup-active');\r\n            mask.style.opacity = 0;\r\n            setTimeout(() => mask.remove(), 120);\r\n        };\r\n        let content = this.#option.content;\r\n        if (!(content instanceof HTMLElement)) {\r\n            content = createElement('div', d => d.innerText = content);\r\n        }\r\n        container.append(\r\n            createElement('div', header => {\r\n                header.className = 'ui-popup-header';\r\n                let title = this.#option.title;\r\n                if (!(title instanceof HTMLElement)) {\r\n                    title = createElement('div', t => {\r\n                        t.className = 'ui-popup-header-title';\r\n                        t.innerText = title;\r\n                    });\r\n                }\r\n                header.appendChild(title);\r\n                if (this.#option.movable !== false) {\r\n                    const move = title.querySelector('.ui-popup-move') ?? title;\r\n                    move.addEventListener('mousedown', e => {\r\n                        const x = e.clientX - container.offsetLeft;\r\n                        const y = e.clientY - container.offsetTop;\r\n                        let moved;\r\n                        const move = e => {\r\n                            container.style.left = `${e.clientX - x}px`;\r\n                            container.style.top = `${e.clientY - y}px`;\r\n                            moved = true;\r\n                        };\r\n                        mask.addEventListener('mousemove', move, { passive: false });\r\n                        const up = () => {\r\n                            mask.removeEventListener('mousemove', move, { passive: false });\r\n                            mask.removeEventListener('mouseup', up);\r\n                            if (moved === true && typeof this.#option.onMoveEnded === 'function') {\r\n                                this.#option.onMoveEnded.call(this);\r\n                            }\r\n                            moved = false;\r\n                        };\r\n                        mask.addEventListener('mouseup', up);\r\n                    });\r\n                }\r\n                if (this.#option.collapsable === true) {\r\n                    const collapse = createIcon('fa-regular', 'compress-alt');\r\n                    collapse.tabIndex = tabIndex + 2;\r\n                    collapse.classList.add('icon-expand');\r\n                    collapse.addEventListener('keypress', e => {\r\n                        if (e.key === ' ' || e.key === 'Enter') {\r\n                            collapse.dispatchEvent(new MouseEvent('click'));\r\n                        }\r\n                    });\r\n                    collapse.addEventListener('click', () => {\r\n                        if (container.classList.contains('ui-popup-collapse')) {\r\n                            const bounds = this.#bounds;\r\n                            if (bounds != null) {\r\n                                container.style.cssText += `width: ${bounds.width}px; height: ${bounds.height}px`;\r\n                                this.#bounds = null;\r\n                            }\r\n                            container.classList.remove('ui-popup-collapse');\r\n                            changeIcon(collapse, 'fa-regular', 'compress-alt');\r\n                        } else {\r\n                            const rect = this.rect;\r\n                            this.#bounds = rect;\r\n                            container.style.cssText += `width: 160px; height: 40px`;\r\n                            container.classList.add('ui-popup-collapse');\r\n                            changeIcon(collapse, 'fa-regular', 'expand-alt');\r\n                        }\r\n                    });\r\n                    header.appendChild(collapse);\r\n                }\r\n                const cancel = createIcon('fa-regular', 'times');\r\n                cancel.tabIndex = tabIndex + 3;\r\n                cancel.addEventListener('keypress', e => {\r\n                    if (e.key === ' ' || e.key === 'Enter') {\r\n                        close();\r\n                    }\r\n                });\r\n                cancel.addEventListener('click', () => close());\r\n                header.appendChild(cancel);\r\n            }),\r\n            createElement('div', 'ui-popup-body', content, createElement('div', 'ui-popup-loading',\r\n                createElement('div', null, createIcon('fa-regular', 'spinner-third'))\r\n            ))\r\n        );\r\n        if (Array.isArray(this.#option.buttons)) {\r\n            tabIndex = Math.max.apply(null, [...container.querySelectorAll('[tabindex]')].map(e => e.tabIndex ?? 0));\r\n            container.appendChild(\r\n                createElement('div', 'ui-popup-footer', ...this.#option.buttons.map((b, i) => {\r\n                    const button = createElement('button', 'ui-popup-button');\r\n                    if (b.tabIndex > 0) {\r\n                        button.tabIndex = b.tabIndex;\r\n                    } else {\r\n                        button.tabIndex = tabIndex + i + 1;\r\n                    }\r\n                    button.innerText = b.text;\r\n                    button.addEventListener('click', () => {\r\n                        if (typeof b.trigger === 'function') {\r\n                            const result = b.trigger(this);\r\n                            if (typeof result?.then === 'function') {\r\n                                result.then(r => {\r\n                                    if (r !== false) {\r\n                                        close();\r\n                                    }\r\n                                }).catch(() => { });\r\n                            } else if (result !== false) {\r\n                                close();\r\n                            }\r\n                        } else {\r\n                            close();\r\n                        }\r\n                    });\r\n                    return button;\r\n                }))\r\n            );\r\n            const tabs = [...container.querySelectorAll('[tabindex]')].map(e => e.tabIndex ?? 0);\r\n            const tabMin = Math.min.apply(null, tabs);\r\n            const tabMax = Math.max.apply(null, tabs);\r\n            const last = container.querySelector(`[tabindex=\"${tabMax}\"]`);\r\n            if (last != null) {\r\n                last.addEventListener('keydown', e => {\r\n                    if (e.key === 'Tab') {\r\n                        const first = container.querySelector(`[tabindex=\"${tabMin}\"]`);\r\n                        first?.focus();\r\n                        e.preventDefault();\r\n                    }\r\n                });\r\n            }\r\n        }\r\n        // resizable\r\n        if (this.#option.resizable === true) {\r\n            container.append(\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-right';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.right, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-bottom';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.bottom, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-left';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.left, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-top';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.top, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-bottom-right';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.bottomRight, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-bottom-left';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.bottomLeft, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-top-left';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.topLeft, e));\r\n                }),\r\n                createElement('layer', layer => {\r\n                    layer.className = 'ui-popup-border ui-popup-border-top-right';\r\n                    layer.addEventListener('mousedown', e => this.#resize(ResizeMods.topRight, e));\r\n                })\r\n            )\r\n        }\r\n        mask.appendChild(container);\r\n        this.#mask = mask;\r\n        return mask;\r\n    }\r\n\r\n    show(parent = document.body) {\r\n        if (parent == null) {\r\n            return;\r\n        }\r\n        let mask = this.#mask ?? this.create();\r\n        parent.appendChild(mask);\r\n        if (this.#option.mask === false) {\r\n            // calculator position\r\n            const container = this.container;\r\n            container.style.left = String((parent.offsetWidth - container.offsetWidth) / 2) + 'px';\r\n            container.style.top = String((parent.offsetHeight - container.offsetHeight) / 2) + 'px';\r\n        }\r\n        return new Promise(resolve => {\r\n            setTimeout(() => {\r\n                mask.style.opacity = 1;\r\n                this.container.focus();\r\n                resolve(mask);\r\n            }, 0);\r\n        });\r\n    }\r\n\r\n    get loading() { return this.#mask?.querySelector('.ui-popup-body>.ui-popup-loading')?.style?.visibility === 'visible' }\r\n    set loading(flag) {\r\n        let loading = this.#mask?.querySelector('.ui-popup-body>.ui-popup-loading');\r\n        if (loading == null) {\r\n            return;\r\n        }\r\n        if (flag === false) {\r\n            loading.style.visibility = 'hidden';\r\n            loading.style.opacity = 0;\r\n        } else {\r\n            loading.style.visibility = 'visible';\r\n            loading.style.opacity = 1;\r\n        }\r\n    }\r\n\r\n    #resize(mod, e) {\r\n        const container = this.container;\r\n        const option = this.#option;\r\n        if (typeof option.onResizeStarted === 'function') {\r\n            option.onResizeStarted.call(this);\r\n        }\r\n        const mask = this.#mask;\r\n        // this.#cursor = mask.style.cursor;\r\n        // mask.style.cursor = Cursors[mod];\r\n        const originalX = e.clientX;\r\n        const originalY = e.clientY;\r\n        const original = {\r\n            width: container.offsetWidth,\r\n            height: container.offsetHeight,\r\n            left: container.offsetLeft,\r\n            top: container.offsetTop\r\n        };\r\n        const minWidth = option.minWidth ?? 200;\r\n        const minHeight = option.minHeight ?? 200;\r\n        let resized;\r\n        const move = e => {\r\n            const offsetX = e.clientX - originalX;\r\n            const offsetY = e.clientY - originalY;\r\n            let width = original.width;\r\n            let height = original.height;\r\n            let x = original.left;\r\n            let y = original.top;\r\n            if ((mod & ResizeMods.right) === ResizeMods.right) {\r\n                width += offsetX;\r\n                if (width < minWidth) {\r\n                    width = minWidth;\r\n                }\r\n            }\r\n            if ((mod & ResizeMods.bottom) === ResizeMods.bottom) {\r\n                height += offsetY;\r\n                if (height < minHeight) {\r\n                    height = minHeight;\r\n                }\r\n            }\r\n            if ((mod & ResizeMods.left) === ResizeMods.left) {\r\n                width -= offsetX;\r\n                if (width < minWidth) {\r\n                    width = minWidth;\r\n                    x = originalX + original.width - minWidth;\r\n                } else {\r\n                    x += offsetX;\r\n                }\r\n            }\r\n            if ((mod & ResizeMods.top) === ResizeMods.top) {\r\n                height -= offsetY;\r\n                if (height < minHeight) {\r\n                    height = minHeight;\r\n                    y = originalY + original.height - minHeight;\r\n                } else {\r\n                    y += offsetY;\r\n                }\r\n            }\r\n            if (typeof option.onResizing === 'function') {\r\n                option.onResizing.call(this, x, y, width, height);\r\n            } else {\r\n                container.style.cssText += `left: ${x}px; top: ${y}px; width: ${width}px; height: ${height}px`;\r\n            }\r\n            resized = true;\r\n        }\r\n        const parent = option.mask === false ? mask.parentElement : mask;\r\n        parent.addEventListener('mousemove', move, { passive: false });\r\n        const up = () => {\r\n            parent.removeEventListener('mousemove', move, { passive: false });\r\n            parent.removeEventListener('mouseup', up);\r\n            // mask.style.cursor = this.#cursor;\r\n            if (resized === true && typeof option.onResizeEnded === 'function') {\r\n                option.onResizeEnded.call(this);\r\n            }\r\n            resized = false;\r\n        };\r\n        parent.addEventListener('mouseup', up);\r\n    }\r\n}\r\n\r\nexport default Popup;\r\n\r\nexport function createPopup(title, content, ...buttons) {\r\n    const popup = new Popup({\r\n        title,\r\n        content,\r\n        buttons\r\n    });\r\n    return popup;\r\n}\r\n\r\nconst iconTypes = {\r\n    'info': 'info-circle',\r\n    'information': 'info-circle',\r\n    'warn': 'exclamation-triangle',\r\n    'warning': 'exclamation-triangle',\r\n    'question': 'question-circle',\r\n    'error': 'times-circle'\r\n}\r\n\r\nexport function showAlert(title, message, iconType = 'info', parent = document.body) {\r\n    return new Promise(resolve => {\r\n        const popup = new Popup({\r\n            title,\r\n            content: createElement('div', 'message-wrapper',\r\n                createIcon('fa-solid', iconTypes[iconType] ?? 'info-circle'),\r\n                createElement('span', span => span.innerText = message)\r\n            ),\r\n            buttons: [\r\n                { text: r('ok', 'OK'), trigger: resolve }\r\n            ]\r\n        });\r\n        popup.show(parent).then(mask => {\r\n            const button = mask.querySelector('.ui-popup-container .ui-popup-footer .ui-popup-button:last-child');\r\n            button?.focus();\r\n        });\r\n    });\r\n}\r\n\r\nexport function showConfirm(title, content, buttons, iconType = 'question', parent = document.body) {\r\n    return new Promise(resolve => {\r\n        const wrapper = createElement('div', 'message-wrapper');\r\n        if (!nullOrEmpty(iconType)) {\r\n            wrapper.appendChild(createIcon('fa-solid', iconTypes[iconType] ?? 'question-circle'));\r\n        }\r\n        wrapper.appendChild(content instanceof HTMLElement ?\r\n            content :\r\n            createElement('span', span => span.innerText = content));\r\n        const popup = new Popup({\r\n            title,\r\n            content: wrapper,\r\n            buttons: buttons?.map(b => {\r\n                return {\r\n                    text: b.text,\r\n                    trigger: p => {\r\n                        let result;\r\n                        if (typeof b.trigger === 'function') {\r\n                            result = b.trigger(p, b);\r\n                            if (typeof result?.then === 'function') {\r\n                                return result.then(r => {\r\n                                    r !== false && resolve(r);\r\n                                    return r;\r\n                                });\r\n                            }\r\n                            result !== false && resolve(result);\r\n                        } else {\r\n                            result = {\r\n                                key: b.key,\r\n                                popup: p\r\n                            };\r\n                            resolve(result);\r\n                        }\r\n                        return result;\r\n                    }\r\n                };\r\n            }) ??\r\n                [\r\n                    { text: r('yes', 'Yes'), trigger: p => resolve({ key: 'yes', popup: p }) },\r\n                    { text: r('no', 'No'), trigger: p => resolve({ key: 'no', popup: p }) }\r\n                ]\r\n        });\r\n        popup.show(parent).then(mask => {\r\n            const button = mask.querySelector('.ui-popup-container .ui-popup-footer .ui-popup-button:last-child');\r\n            button?.focus();\r\n        });\r\n    });\r\n}"],"names":["createElement","tagName","init","children","element","svgns","createUse","type","id","c","path","ver","use","changeIcon","svg","createIcon","style","css","resolveIcon","container","svgs","icon","fillCheckbox","label","tabindex","charactor","layer","e","input","span","createRadiobox","opts","entry","createCheckbox","resolveCheckbox","legacy","checks","chk","text","boxes","box","setTooltip","content","flag","parent","isParent","tipid","tip","wrapper","cnt","tipId","tid","p","left","top","offsetParent","resolveTooltip","tips","title","nullOrEmpty","s","contains","key","ignoreCase","r","defaultValue","g","isPositive","n","isMobile","throttle","method","delay","context","args","current","truncate","v","SymbolDropdown","DropdownTitleHeight","DropdownItemHeight","dropdownGlobal","global","panel","dropId","dropdown","selectItems","itemlist","htmlkey","textkey","htmls","it","filterSource","searchkeys","source","k","_Dropdown","options","__privateAdd","_expanded","_dropdown","_filllist","_triggerselect","_options","_wrapper","_container","_label","_allChecked","_source","_lastSelected","_selected","_selectedList","__publicField","__privateSet","__privateGet","header","up","down","count","valuekey","index","target","_a","__privateMethod","dropdown_fn","active","expanded_get","filllist_fn","list","selected","silence","item","expanded","li","html","val","selectedlist","dom","selects","sel","drop","Dropdown","_b","search","value","multiselect","allchecked","triggerselect_fn","scrolled","i","checkbox","GridColumn","GridInputColumn","trigger","col","_parent","vals","enabled","GridTextColumn","_item","_col","grid","lines","_GridDropdownColumn","_getSource","getSource_fn","_setValue","setValue_fn","_getDrop","getDrop_fn","GridDropdownColumn","dropGlobal","data","__superGet","GridCheckboxColumn","GridIconColumn","className","tooltip","ColumnChangedType","RefreshInterval","HoverInternal","RedumCount","MiniDragOffset","MiniColumnWidth","FilterPanelWidth","getClientX","getOffsetLeftFromWindow","indexOfParent","ColumnTypes","_Grid","_refreshSource","_createHeader","_createBody","_fillRows","_changeColumnWidth","_changingColumnOrder","_changeColumnOrder","_scrollToTop","_get","_set","_getItemValue","_getRowTarget","_notHeader","_onHeaderClicked","_onCloseFilter","_onFilter","_fillFilterList","_doFillFilterList","_onFilterScroll","_onDragStart","_onResizeStart","_onAutoResize","_onColumnAllChecked","_onScroll","_onBodyMouseMove","_onRowClicked","_onRowDblClicked","_onRowChanged","_currentSource","_el","_refs","_rendering","_selectedColumnIndex","_selectedIndexes","_startIndex","_needResize","_containerHeight","_bodyClientWidth","_rowCount","_scrollTop","_scrollLeft","_colTypes","_colAttrs","_vtable","refreshSource_fn","indexes","startIndex","row","onKeydown","sizer","createHeader_fn","body","createBody_fn","loading","scrollToTop_fn","force","height","length","widths","fillRows_fn","get_fn","width","changeColumnWidth_fn","reload","direction","th","arrow","comparer","a","b","getItemValue_fn","Grid","thead","hidden","onHeaderClicked_fn","isCheckbox","set_fn","w","onDragStart_fn","check","onColumnAllChecked_fn","caption","filter","onFilter_fn","spliter","onResizeStart_fn","onAutoResize_fn","dragger","draggerCursor","onScroll_fn","cols","bodyContainer","bodyContent","getRowTarget_fn","rowIndex","colIndex","onRowClicked_fn","onRowDblClicked_fn","holder","onBodyMouseMove_fn","vtable","vnew","vdom","j","cell","onRowChanged_fn","selectedIndexes","selectChanged","bgColor","ev","attrs","attr","changingColumnOrder_fn","offset","x","offsetLeft","idx","changeColumnOrder_fn","orderIndex","targetIndex","rows","columns","rowHeight","bottomTop","name","notHeader_fn","onCloseFilter_fn","panels","el","filtering","close","searchbox","searchholder","searchicon","onFilterScroll_fn","itemall","checked","array","dict","fillFilterList_fn","items","displayValue","functions","ok","reset","all","doFillFilterList_fn","div","cx","clearEvents","event","dragmove","cx2","pos","dragging","window","resizemove","isFunction","isString","maxleft","selectedIndex","start","end","_e","blur","ResizeMods","trimPx","px","size","Popup","_resize","_mask","_option","_bounds","collapsed","bounds","collapse","mask","tabIndex","d","t","y","moved","move","rect","cancel","button","result","tabs","tabMin","tabMax","last","first","resize_fn","resolve","_c","mod","option","originalX","originalY","original","minWidth","minHeight","resized","offsetX","offsetY","createPopup","buttons","iconTypes","showAlert","message","iconType","showConfirm"],"mappings":"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"}