{"version":3,"sources":["jsdelivr-header.js","/npm/avalynx-table@1.0.4/dist/js/avalynx-table.js"],"names":[],"mappings":"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","file":"/npm/avalynx-table@1.0.4/dist/js/avalynx-table.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /npm/avalynx-table@1.0.4/dist/js/avalynx-table.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * AvalynxTable\n *\n * AvalynxTable is a simple table system for web applications. Based on Bootstrap >=5.3 without any framework dependencies.\n *\n * @version 1.0.4\n * @license MIT\n * @author https://github.com/avalynx/avalynx-table/graphs/contributors\n * @website https://github.com/avalynx/\n * @repository https://github.com/avalynx/avalynx-table.git\n * @bugs https://github.com/avalynx/avalynx-table/issues\n *\n * @param {string} selector - The selector to use for targeting tables within the DOM (default: '.avalynx-table').\n * @param {object} options - An object containing the following keys:\n * @param {Array.<number|string>} options.sortableColumns - List of sortable columns. Supports index, header label or data-avalynx-table-sort-id (default: all columns).\n * @param {Array.<{column:number|string,dir:string}>} options.sorting - Initial sorting order, e.g. [{ column: 'name', dir: 'asc' }] (default: []).\n * @param {boolean} options.stackedSorter - Shows sorting controls in stacked mode (default: true).\n * @param {boolean} options.stackedMultiSortToggle - Shows multi-sort toggle in stacked mode (default: true).\n * @param {object} options.buttonClasses - Class names for stacked control buttons (default: {multiSortInactive: 'btn btn-sm btn-outline-secondary', multiSortActive: 'btn btn-sm btn-secondary', sortButtonInactive: 'btn btn-sm btn-outline-primary', sortButtonActive: 'btn btn-sm btn-primary'}).\n *\n * @param {object} language - An object containing the following keys:\n * @param {string} language.sortByLabel - The label for the sort-by control (default: 'Sort by').\n * @param {string} language.multiSortLabel - The label for the multi-sort control (default: 'Multi-sort').\n * @param {string} language.multiSortOnLabel - The label for the multi-sort on state (default: 'on').\n * @param {string} language.multiSortOffLabel - The label for the multi-sort off state (default: 'off').\n * @param {string} language.columnLabel - The label for the column selection (default: 'Column').\n *\n */\n\nclass AvalynxTable {\n    constructor(selector, options = {}, language = {}) {\n        if (!selector) {\n            selector = '.avalynx-table';\n        }\n        if (!selector.startsWith('.') && !selector.startsWith('#')) {\n            selector = '.' + selector;\n        }\n        this.tables = document.querySelectorAll(selector);\n        if (this.tables.length === 0) {\n            console.error(\"AvalynxTable: Table(s) with selector '\" + selector + \"' not found\");\n            return;\n        }\n        if (options === null || typeof options !== 'object') {\n            options = {};\n        }\n        this.options = {\n            sortableColumns: [],\n            sorting: [],\n            stackedSorter: true,\n            stackedMultiSortToggle: true,\n            buttonClasses: {\n                multiSortInactive: 'btn btn-sm btn-outline-secondary',\n                multiSortActive: 'btn btn-sm btn-secondary',\n                sortButtonInactive: 'btn btn-sm btn-outline-primary',\n                sortButtonActive: 'btn btn-sm btn-primary'\n            },\n            ...options\n        };\n\n        const optionLanguage = (this.options.language && typeof this.options.language === 'object')\n            ? this.options.language\n            : {};\n\n        this.language = {\n            sortByLabel: 'Sort by',\n            multiSortLabel: 'Multi-sort',\n            multiSortOnLabel: 'on',\n            multiSortOffLabel: 'off',\n            multiSearchLabel: null,\n            multiSearchOnLabel: null,\n            multiSearchOffLabel: null,\n            columnLabel: 'Column',\n            ...optionLanguage,\n            ...(language && typeof language === 'object' ? language : {})\n        };\n\n        if (Object.hasOwn(this.language, 'multiSearchLabel') && this.language.multiSearchLabel !== null) {\n            this.language.multiSortLabel = this.language.multiSearchLabel;\n        }\n        if (Object.hasOwn(this.language, 'multiSearchOnLabel') && this.language.multiSearchOnLabel !== null) {\n            this.language.multiSortOnLabel = this.language.multiSearchOnLabel;\n        }\n        if (Object.hasOwn(this.language, 'multiSearchOffLabel') && this.language.multiSearchOffLabel !== null) {\n            this.language.multiSortOffLabel = this.language.multiSearchOffLabel;\n        }\n\n        this.options.buttonClasses = {\n            multiSortInactive: 'btn btn-sm btn-outline-secondary',\n            multiSortActive: 'btn btn-sm btn-secondary',\n            multiSearchInactive: null,\n            multiSearchActive: null,\n            sortButtonInactive: 'btn btn-sm btn-outline-primary',\n            sortButtonActive: 'btn btn-sm btn-primary',\n            ...(this.options.buttonClasses && typeof this.options.buttonClasses === 'object'\n                ? this.options.buttonClasses\n                : {})\n        };\n        if (Object.hasOwn(this.options.buttonClasses, 'multiSearchInactive') &&\n            this.options.buttonClasses.multiSearchInactive !== null) {\n            this.options.buttonClasses.multiSortInactive = this.options.buttonClasses.multiSearchInactive;\n        }\n        if (Object.hasOwn(this.options.buttonClasses, 'multiSearchActive') &&\n            this.options.buttonClasses.multiSearchActive !== null) {\n            this.options.buttonClasses.multiSortActive = this.options.buttonClasses.multiSearchActive;\n        }\n\n        this.options.buttonClasses.multiSortInactive = this.appendRequiredClasses(\n            this.options.buttonClasses.multiSortInactive,\n            'avalynx-table-sort-multi-toggle'\n        );\n        this.options.buttonClasses.multiSortActive = this.appendRequiredClasses(\n            this.options.buttonClasses.multiSortActive,\n            'avalynx-table-sort-multi-toggle active'\n        );\n        this.options.buttonClasses.sortButtonInactive = this.appendRequiredClasses(\n            this.options.buttonClasses.sortButtonInactive,\n            'avalynx-table-sort-button'\n        );\n        this.options.buttonClasses.sortButtonActive = this.appendRequiredClasses(\n            this.options.buttonClasses.sortButtonActive,\n            'avalynx-table-sort-button active'\n        );\n        this.tableStates = new WeakMap();\n\n        this._boundWindowResize = this.handleWindowResize.bind(this);\n        if (this.options.stackedSorter) {\n            window.addEventListener('resize', this._boundWindowResize);\n        }\n\n        this.tables.forEach(table => this.init(table));\n    }\n\n    appendRequiredClasses(value, required) {\n        const allClasses = `${value || ''} ${required}`.trim().split(/\\s+/).filter(Boolean);\n        return [...new Set(allClasses)].join(' ');\n    }\n\n    init(table) {\n        this.enhanceTable(table);\n        this.setupSorting(table);\n    }\n\n    enhanceTable(table) {\n        const headers = table.querySelectorAll('thead th');\n        const rows = table.querySelectorAll('tbody tr');\n        rows.forEach(row => {\n            const cells = row.querySelectorAll('td');\n            cells.forEach((cell, index) => {\n                if (headers[index]) {\n                    cell.setAttribute('avalynx-td-title', headers[index].textContent);\n                }\n            });\n        });\n    }\n\n    setupSorting(table) {\n        const thead = table.querySelector('thead');\n        const tbody = table.querySelector('tbody');\n\n        if (!thead || !tbody) {\n            return;\n        }\n\n        const headers = Array.from(thead.querySelectorAll('th'));\n        if (headers.length === 0) {\n            return;\n        }\n\n        const isSortableDefined = Array.isArray(this.options.sortableColumns) && this.options.sortableColumns.length > 0;\n        const isSortingDefined = Array.isArray(this.options.sorting) && this.options.sorting.length > 0;\n\n        if (!isSortableDefined && !isSortingDefined) {\n            return;\n        }\n\n        const sortableIndices = this.getSortableIndices(headers);\n        if (sortableIndices.length === 0) {\n            return;\n        }\n\n        const sorting = this.normalizeDefaultSorting(headers, sortableIndices);\n\n        const state = {\n            headers,\n            sortableIndices,\n            sorting,\n            initialSorting: sorting.map((sort) => ({ ...sort })),\n            originalRows: Array.from(tbody.querySelectorAll('tr')),\n            stackedControls: null,\n            stackedMultiMode: sorting.length > 1,\n            sortHandler: null\n        };\n\n        headers.forEach((header, index) => {\n            if (!sortableIndices.includes(index)) {\n                return;\n            }\n\n            header.classList.add('avalynx-table-sorting');\n            header.dataset.avalynxSortIndex = String(index);\n            header.setAttribute('role', 'button');\n            header.setAttribute('tabindex', '0');\n            header.setAttribute('aria-label', `${this.language.sortByLabel} ${header.textContent.trim()}`);\n        });\n\n        state.sortHandler = (event) => {\n            const header = event.target.closest('th.avalynx-table-sorting');\n            if (!header || !thead.contains(header)) {\n                return;\n            }\n\n            const column = parseInt(header.dataset.avalynxSortIndex, 10);\n            if (Number.isNaN(column)) {\n                return;\n            }\n\n            const isMultiSort = event.ctrlKey || event.shiftKey;\n            this.toggleSorting(table, state, column, isMultiSort);\n        };\n\n        thead.addEventListener('click', state.sortHandler);\n        thead.addEventListener('keydown', (event) => {\n            if (event.key !== 'Enter' && event.key !== ' ') {\n                return;\n            }\n\n            const header = event.target.closest('th.avalynx-table-sorting');\n            if (!header || !thead.contains(header)) {\n                return;\n            }\n\n            event.preventDefault();\n\n            const column = parseInt(header.dataset.avalynxSortIndex, 10);\n            if (Number.isNaN(column)) {\n                return;\n            }\n\n            const isMultiSort = event.ctrlKey || event.shiftKey;\n            this.toggleSorting(table, state, column, isMultiSort);\n        });\n\n        if (this.options.stackedSorter) {\n            state.stackedControls = this.createStackedSortControls(table, state);\n            this.updateStackedSortControls(table, state);\n            this.updateStackedSortControlsVisibility(table, state);\n        }\n\n        this.tableStates.set(table, state);\n        this.applySorting(table, state);\n        this.updateSortUI(table, state);\n    }\n\n    getSortableIndices(headers) {\n        if (!Array.isArray(this.options.sortableColumns) || this.options.sortableColumns.length === 0) {\n            return headers\n                .map((_, index) => index)\n                .filter(index => this.isSortableHeader(headers[index]));\n        }\n\n        const byId = new Map();\n        const byName = new Map();\n\n        headers.forEach((header, index) => {\n            const id = (header.dataset.avalynxTableSortId || header.dataset.avalynxSortId || '').trim();\n            const name = (header.textContent || '').trim().toLowerCase();\n\n            if (id) {\n                byId.set(id, index);\n            }\n            if (name) {\n                byName.set(name, index);\n            }\n        });\n\n        const indices = this.options.sortableColumns\n            .map((column) => this.resolveColumnIndex(column, headers, byId, byName))\n            .filter(index => index !== -1)\n            .filter(index => this.isSortableHeader(headers[index]));\n\n        return [...new Set(indices)].sort((a, b) => a - b);\n    }\n\n    isSortableHeader(header) {\n        if (!header || header.dataset.avalynxSortable === 'false') {\n            return false;\n        }\n\n        return (header.textContent || '').trim().length > 0;\n    }\n\n    resolveColumnIndex(column, headers, byId, byName) {\n        if (typeof column === 'number' && Number.isInteger(column) && headers[column]) {\n            return column;\n        }\n\n        if (typeof column === 'string') {\n            const raw = column.trim();\n            if (!raw) {\n                return -1;\n            }\n\n            if (byId.has(raw)) {\n                return byId.get(raw);\n            }\n\n            const asNumber = Number.parseInt(raw, 10);\n            if (!Number.isNaN(asNumber) && headers[asNumber]) {\n                return asNumber;\n            }\n\n            const byNameIndex = byName.get(raw.toLowerCase());\n            if (typeof byNameIndex === 'number') {\n                return byNameIndex;\n            }\n        }\n\n        return -1;\n    }\n\n    normalizeDefaultSorting(headers, sortableIndices) {\n        if (!Array.isArray(this.options.sorting)) {\n            return [];\n        }\n\n        const byId = new Map();\n        const byName = new Map();\n\n        headers.forEach((header, index) => {\n            const id = (header.dataset.avalynxTableSortId || header.dataset.avalynxSortId || '').trim();\n            const name = (header.textContent || '').trim().toLowerCase();\n\n            if (id) {\n                byId.set(id, index);\n            }\n            if (name) {\n                byName.set(name, index);\n            }\n        });\n\n        return this.options.sorting\n            .map((sortEntry) => {\n                if (!sortEntry || typeof sortEntry !== 'object') {\n                    return null;\n                }\n\n                const column = this.resolveColumnIndex(sortEntry.column, headers, byId, byName);\n                if (!sortableIndices.includes(column)) {\n                    return null;\n                }\n\n                const dir = sortEntry.dir === 'desc' ? 'desc' : 'asc';\n                return { column, dir };\n            })\n            .filter(Boolean)\n            .filter((entry, index, array) => index === array.findIndex(item => item.column === entry.column));\n    }\n\n    toggleSorting(table, state, column, isMultiSort = false) {\n        const existingIndex = state.sorting.findIndex(item => item.column === column);\n        const existing = existingIndex !== -1 ? state.sorting[existingIndex] : null;\n        let nextDir = null;\n\n        if (!existing) {\n            nextDir = 'asc';\n        } else if (existing.dir === 'asc') {\n            nextDir = 'desc';\n        }\n\n        if (!isMultiSort) {\n            state.sorting = nextDir ? [{ column, dir: nextDir }] : [];\n        } else {\n            if (!existing) {\n                state.sorting.unshift({ column, dir: 'asc' });\n            } else if (nextDir) {\n                state.sorting[existingIndex] = { column, dir: nextDir };\n            } else {\n                state.sorting.splice(existingIndex, 1);\n            }\n        }\n\n        if (state.sorting.length === 0 && state.initialSorting.length > 0) {\n            state.sorting = state.initialSorting.map((sort) => ({ ...sort }));\n            state.stackedMultiMode = state.sorting.length > 1;\n        }\n\n        this.applySorting(table, state);\n        this.updateSortUI(table, state);\n    }\n\n    applySorting(table, state) {\n        const tbody = table.querySelector('tbody');\n        if (!tbody) {\n            return;\n        }\n\n        const rowsWithIndex = state.originalRows.map((row, index) => ({ row, index }));\n        const sorting = state.sorting;\n\n        if (sorting.length > 0) {\n            rowsWithIndex.sort((a, b) => {\n                for (const sort of sorting) {\n                    const compare = this.compareRows(a.row, b.row, sort.column, sort.dir);\n                    if (compare !== 0) {\n                        return compare;\n                    }\n                }\n\n                return a.index - b.index;\n            });\n        }\n\n        const fragment = document.createDocumentFragment();\n        rowsWithIndex.forEach(({ row }) => fragment.appendChild(row));\n        tbody.innerHTML = '';\n        tbody.appendChild(fragment);\n    }\n\n    compareRows(rowA, rowB, column, dir) {\n        const cellA = rowA.children[column];\n        const cellB = rowB.children[column];\n\n        const valueA = this.getCellSortValue(cellA);\n        const valueB = this.getCellSortValue(cellB);\n\n        let result;\n        if (valueA.numeric && valueB.numeric) {\n            result = valueA.number - valueB.number;\n        } else {\n            result = valueA.text.localeCompare(valueB.text, undefined, {\n                numeric: true,\n                sensitivity: 'base'\n            });\n        }\n\n        return dir === 'desc' ? result * -1 : result;\n    }\n\n    getCellSortValue(cell) {\n        if (!cell) {\n            return {\n                text: '',\n                numeric: false,\n                number: 0\n            };\n        }\n\n        const raw = (cell.dataset.avalynxTableSortValue ||\n            cell.dataset.avalynxSortValue ||\n            cell.textContent || '').trim();\n        const normalized = raw.replace(/\\s+/g, '');\n        const numericCandidate = normalized.replace(',', '.');\n        const number = Number.parseFloat(numericCandidate);\n        const numeric = Number.isFinite(number) && /^[-+]?\\d+(?:[.,]\\d+)?$/.test(numericCandidate);\n\n        return {\n            text: raw,\n            numeric,\n            number: numeric ? number : 0\n        };\n    }\n\n    updateSortUI(table, state) {\n        state.headers.forEach((header, index) => {\n            header.classList.remove('avalynx-table-sorting-asc', 'avalynx-table-sorting-desc');\n            header.removeAttribute('data-avalynx-sort-order');\n\n            const sortIndex = state.sorting.findIndex(item => item.column === index);\n            if (sortIndex === -1) {\n                return;\n            }\n\n            const dir = state.sorting[sortIndex].dir;\n            header.classList.add(dir === 'asc' ? 'avalynx-table-sorting-asc' : 'avalynx-table-sorting-desc');\n            header.dataset.avalynxSortOrder = String(sortIndex + 1);\n        });\n\n        this.updateStackedSortControls(table, state);\n    }\n\n    createStackedSortControls(table, state) {\n        const controls = document.createElement('div');\n        controls.className = 'avalynx-table-sort-controls';\n\n        if (this.options.stackedMultiSortToggle) {\n            const toggle = document.createElement('button');\n            toggle.type = 'button';\n            toggle.className = state.stackedMultiMode\n                ? this.options.buttonClasses.multiSortActive\n                : this.options.buttonClasses.multiSortInactive;\n            toggle.textContent = this.getMultiSortToggleText(state.stackedMultiMode);\n            toggle.addEventListener('click', () => {\n                state.stackedMultiMode = !state.stackedMultiMode;\n                toggle.textContent = this.getMultiSortToggleText(state.stackedMultiMode);\n                toggle.className = state.stackedMultiMode\n                    ? this.options.buttonClasses.multiSortActive\n                    : this.options.buttonClasses.multiSortInactive;\n            });\n            controls.appendChild(toggle);\n        }\n\n        const buttons = document.createElement('div');\n        buttons.className = 'avalynx-table-sort-buttons';\n\n        state.sortableIndices.forEach((columnIndex) => {\n            const header = state.headers[columnIndex];\n            const button = document.createElement('button');\n            button.type = 'button';\n            button.className = this.options.buttonClasses.sortButtonInactive;\n            button.dataset.avalynxSortButton = String(columnIndex);\n            button.textContent = header.textContent.trim();\n\n            button.addEventListener('click', (event) => {\n                const isMultiSort = event.ctrlKey || event.shiftKey || state.stackedMultiMode;\n                this.toggleSorting(table, state, columnIndex, isMultiSort);\n            });\n\n            buttons.appendChild(button);\n        });\n\n        controls.appendChild(buttons);\n        table.parentNode.insertBefore(controls, table);\n\n        return controls;\n    }\n\n    getMultiSortToggleText(isEnabled) {\n        const modeLabel = isEnabled\n            ? this.language.multiSortOnLabel\n            : this.language.multiSortOffLabel;\n\n        return `${this.language.multiSortLabel}: ${modeLabel}`;\n    }\n\n    updateStackedSortControls(table, state) {\n        if (!state.stackedControls) {\n            return;\n        }\n\n        const buttonsContainer = state.stackedControls.querySelector('.avalynx-table-sort-buttons');\n        if (!buttonsContainer) {\n            return;\n        }\n\n        const sortButtons = buttonsContainer.querySelectorAll('[data-avalynx-sort-button]');\n        const buttonByColumn = new Map();\n        sortButtons.forEach((button) => {\n            const column = parseInt(button.dataset.avalynxSortButton, 10);\n            if (Number.isNaN(column)) {\n                return;\n            }\n\n            buttonByColumn.set(column, button);\n\n            button.className = this.options.buttonClasses.sortButtonInactive;\n            button.classList.remove('avalynx-table-sorting-asc', 'avalynx-table-sorting-desc');\n            button.removeAttribute('data-avalynx-sort-order');\n\n            const sortIndex = state.sorting.findIndex(item => item.column === column);\n            if (sortIndex === -1) {\n                return;\n            }\n\n            const dir = state.sorting[sortIndex].dir;\n            button.className = this.options.buttonClasses.sortButtonActive;\n            button.classList.add(dir === 'asc' ? 'avalynx-table-sorting-asc' : 'avalynx-table-sorting-desc');\n            button.dataset.avalynxSortOrder = String(sortIndex + 1);\n        });\n\n        const sortedColumns = state.sorting.map(sort => sort.column);\n        const remainingColumns = state.sortableIndices.filter(column => !sortedColumns.includes(column));\n        const visualOrder = [...sortedColumns, ...remainingColumns];\n\n        visualOrder.forEach((column) => {\n            const button = buttonByColumn.get(column);\n            if (button) {\n                buttonsContainer.appendChild(button);\n            }\n        });\n    }\n\n    isStacked(table) {\n        const hasStackClass = table.classList.contains('avalynx-table') ||\n            table.classList.contains('avalynx-table-md') ||\n            table.classList.contains('avalynx-table-lg') ||\n            table.classList.contains('avalynx-table-xl') ||\n            table.classList.contains('avalynx-table-xxl');\n\n        if (!hasStackClass || typeof window.getComputedStyle !== 'function') {\n            return false;\n        }\n\n        const thead = table.querySelector('thead');\n        if (!thead) {\n            return false;\n        }\n\n        return window.getComputedStyle(thead).display === 'block';\n    }\n\n    updateStackedSortControlsVisibility(table, state) {\n        if (!state.stackedControls) {\n            return;\n        }\n\n        state.stackedControls.style.display = this.isStacked(table) ? 'flex' : 'none';\n    }\n\n    handleWindowResize() {\n        this.tables.forEach((table) => {\n            const state = this.tableStates.get(table);\n            if (!state) {\n                return;\n            }\n\n            this.updateStackedSortControlsVisibility(table, state);\n        });\n    }\n}\n\n/* istanbul ignore next */\nif (typeof module !== 'undefined' && module.exports) {\n    module.exports = AvalynxTable;\n}\n"]}