advanced-filter-system 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/AFS.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"AFS.js","sources":["../src/AFS.js"],"sourcesContent":["/**\n * @fileoverview Advanced Filter System for DOM elements\n * @version 1.0.0\n *\n * A flexible and customizable filtering system that supports:\n * - Multiple filtering modes (OR/AND)\n * - Text search with debouncing\n * - Multiple sorting criteria\n * - Range filtering\n * - URL state management\n * - Animation and transitions\n * - Results counter\n */\n\n/**\n * Utility function for debouncing\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function} Debounced function\n */\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nclass AFS {\n /**\n * @typedef {Object} FilterOptions\n * @property {string} containerSelector - Main container selector\n * @property {string} itemSelector - Items to filter selector\n * @property {string} filterButtonSelector - Filter buttons selector\n * @property {string} [searchInputSelector] - Search input selector\n * @property {string} [counterSelector] - Results counter selector\n * @property {string} [activeClass='active'] - Active state class\n * @property {string} [hiddenClass='hidden'] - Hidden state class\n * @property {number} [animationDuration=300] - Animation duration in ms\n * @property {string} [filterMode='OR'] - Filter mode ('OR' or 'AND')\n * @property {string[]} [searchKeys=['title']] - Data attributes to search in\n * @property {number} [debounceTime=300] - Search debounce delay in ms\n */\n\n /**\n * @param {FilterOptions} options - Filter configuration options\n */\n constructor(options = {}) {\n this.options = {\n containerSelector: \".filter-container\",\n itemSelector: \".filter-item\",\n filterButtonSelector: \".btn-filter\",\n searchInputSelector: \".filter-search\",\n counterSelector: \".filter-counter\",\n activeClass: \"active\",\n hiddenClass: \"hidden\",\n animationDuration: 300,\n filterMode: \"OR\",\n searchKeys: [\"title\"],\n debounceTime: 300,\n ...options,\n };\n\n // Initialize elements\n this.container = document.querySelector(this.options.containerSelector);\n this.items = document.querySelectorAll(this.options.itemSelector);\n this.filterButtons = document.querySelectorAll(\n this.options.filterButtonSelector,\n );\n this.searchInput = document.querySelector(this.options.searchInputSelector);\n this.counter = document.querySelector(this.options.counterSelector);\n\n // Initialize state\n this.currentFilters = new Set([\"*\"]);\n this.currentSearch = \"\";\n this.visibleItems = new Set(this.items);\n this.filterGroups = new Map();\n this.groupMode = \"OR\"; // Default group mode\n\n this.init();\n }\n\n /**\n * Initialize the filter system\n * @private\n */\n init() {\n this.addStyles();\n this.bindEvents();\n this.loadFromURL();\n this.updateCounter();\n }\n\n /**\n * Add required styles to document\n * @private\n */\n addStyles() {\n const styles = `\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `;\n\n const styleSheet = document.createElement(\"style\");\n styleSheet.textContent = styles;\n document.head.appendChild(styleSheet);\n }\n\n /**\n * Bind all event listeners\n * @private\n */\n bindEvents() {\n this.filterButtons.forEach((button) => {\n button.addEventListener(\"click\", () => this.handleFilterClick(button));\n });\n\n if (this.searchInput) {\n this.searchInput.addEventListener(\n \"input\",\n debounce((e) => {\n this.search(e.target.value);\n }, this.options.debounceTime),\n );\n }\n\n window.addEventListener(\"popstate\", () => this.loadFromURL());\n }\n\n /**\n * Handle filter button clicks\n * @private\n * @param {HTMLElement} button - Clicked filter button\n */\n handleFilterClick(button) {\n const filterValue = button.dataset.filter;\n\n if (filterValue === \"*\") {\n this.resetFilters();\n } else {\n this.toggleFilter(filterValue, button);\n }\n\n this.filter();\n this.updateURL();\n }\n\n /**\n * Reset all filters to default state\n * @private\n */\n resetFilters() {\n this.filterButtons.forEach((btn) =>\n btn.classList.remove(this.options.activeClass),\n );\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filterButtons[0].classList.add(this.options.activeClass);\n this.resetCounter();\n }\n\n /**\n * Reset visible items counter\n * @private\n */\n resetCounter() {\n this.visibleItems = new Set(this.items);\n this.updateCounter();\n }\n\n /**\n * Toggle individual filter state\n * @private\n * @param {string} filterValue - Filter value to toggle\n * @param {HTMLElement} button - Filter button element\n */\n toggleFilter(filterValue, button) {\n this.currentFilters.delete(\"*\");\n this.filterButtons[0].classList.remove(this.options.activeClass);\n\n if (button.classList.contains(this.options.activeClass)) {\n button.classList.remove(this.options.activeClass);\n this.currentFilters.delete(filterValue);\n\n if (this.currentFilters.size === 0) {\n this.resetFilters();\n }\n } else {\n button.classList.add(this.options.activeClass);\n this.currentFilters.add(filterValue);\n }\n }\n\n /**\n * Apply current filters to items\n * @public\n */\n /**\n * Apply current filters to items\n * @public\n */\nfilter() {\n // Store the original filter logic\n const standardFilter = () => {\n this.visibleItems.clear();\n \n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesFilter =\n this.options.filterMode === \"OR\"\n ? this.matchesAnyFilter(itemCategories)\n : this.matchesAllFilters(itemCategories);\n\n if (matchesFilter) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n };\n\n // Check if we should use group filtering or standard filtering\n if (this.filterGroups.size === 0) {\n standardFilter();\n } else {\n this.visibleItems.clear();\n\n this.items.forEach(item => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(item.dataset.categories?.split(\" \") || []);\n const matchesGroups = this.matchesFilterGroups(itemCategories);\n\n if (matchesGroups) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n }\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n}\n\n /**\n * Add or update a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @param {string[]} filters - Array of filter values\n * @param {string} [operator='OR'] - Operator within group ('AND' or 'OR')\n * @returns {boolean} Success status\n */\n addFilterGroup(groupId, filters, operator = \"OR\") {\n try {\n // Validate inputs\n if (!groupId || !Array.isArray(filters)) {\n console.warn(\"Invalid group parameters\");\n return false;\n }\n\n const validOperator = operator.toUpperCase();\n if (![\"AND\", \"OR\"].includes(validOperator)) {\n console.warn('Invalid operator. Using default \"OR\"');\n operator = \"OR\";\n }\n\n // Create or update group\n this.filterGroups.set(groupId, {\n filters: new Set(filters),\n operator: validOperator,\n });\n\n // Only update if we have active groups\n if (this.filterGroups.size > 0) {\n this.updateFiltersFromGroups();\n this.filter();\n this.updateURL();\n }\n\n return true;\n } catch (error) {\n console.error(\"Error adding filter group:\", error);\n return false;\n }\n }\n\n /**\n * Set how groups combine with each other\n * @public\n * @param {string} mode - Mode for combining groups ('AND' or 'OR')\n */\n setGroupMode(mode) {\n const validMode = mode.toUpperCase();\n if ([\"AND\", \"OR\"].includes(validMode)) {\n this.groupMode = validMode;\n if (this.filterGroups.size > 0) {\n this.filter();\n }\n }\n }\n\n /**\n * Remove a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @returns {boolean} Success status\n */\n removeFilterGroup(groupId) {\n if (this.filterGroups.has(groupId)) {\n this.filterGroups.delete(groupId);\n\n // If no groups left, revert to normal filtering\n if (this.filterGroups.size === 0) {\n this.resetFilters();\n } else {\n this.updateFiltersFromGroups();\n }\n\n this.filter();\n this.updateURL();\n return true;\n }\n return false;\n }\n\n /**\n * Update filters based on groups\n * @private\n */\n updateFiltersFromGroups() {\n // Only process if we have groups\n if (this.filterGroups.size === 0) return;\n\n // Clear current filters except '*'\n if (!this.currentFilters.has(\"*\")) {\n this.currentFilters.clear();\n }\n\n // Combine all group filters\n for (const group of this.filterGroups.values()) {\n group.filters.forEach((filter) => {\n if (filter !== \"*\") {\n this.currentFilters.add(filter);\n }\n });\n }\n }\n\n /**\n * Check if item matches any active filter (OR mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches any filter\n */\n matchesAnyFilter(itemCategories) {\n return [...this.currentFilters].some((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Check if item matches all active filters (AND mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches all filters\n */\n matchesAllFilters(itemCategories) {\n return [...this.currentFilters].every((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Show an item with animation\n * @private\n * @param {HTMLElement} item - Item to show\n */\n showItem(item) {\n this.visibleItems.add(item);\n item.classList.remove(this.options.hiddenClass);\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n item.offsetHeight;\n\n requestAnimationFrame(() => {\n item.style.opacity = \"1\";\n item.style.transform = \"scale(1)\";\n });\n }\n\n /**\n * Hide an item with animation\n * @private\n * @param {HTMLElement} item - Item to hide\n */\n hideItem(item) {\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n setTimeout(() => {\n if (item.style.opacity === \"0\") {\n item.classList.add(this.options.hiddenClass);\n this.visibleItems.delete(item);\n }\n }, this.options.animationDuration);\n }\n\n /**\n * Search items by text\n * @public\n * @param {string} query - Search query\n */\n search(query) {\n this.currentSearch = query.toLowerCase().trim();\n let matches = 0;\n\n this.items.forEach((item) => {\n const searchText = this.options.searchKeys\n .map((key) => item.dataset[key] || \"\")\n .join(\" \")\n .toLowerCase();\n\n const matchesSearch =\n this.currentSearch === \"\" || searchText.includes(this.currentSearch);\n\n if (matchesSearch) {\n this.showItem(item);\n matches++;\n } else {\n this.hideItem(item);\n }\n });\n\n this.updateURL();\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Sort items by multiple criteria\n * @public\n * @param {Array<{key: string, direction: string}>} criteria - Sort criteria\n */\n sortMultiple(criteria) {\n const items = [...this.items];\n\n items.sort((a, b) => {\n for (const criterion of criteria) {\n const valueA = a.dataset[criterion.key];\n const valueB = b.dataset[criterion.key];\n\n const comparison =\n criterion.direction === \"asc\"\n ? valueA.localeCompare(valueB)\n : valueB.localeCompare(valueA);\n\n if (comparison !== 0) return comparison;\n }\n return 0;\n });\n\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Filter items by numeric range\n * @public\n * @param {string} key - Data attribute key\n * @param {number} min - Minimum value\n * @param {number} max - Maximum value\n */\n addRangeFilter(key, min, max) {\n this.items.forEach((item) => {\n const value = parseFloat(item.dataset[key]);\n const inRange = value >= min && value <= max;\n\n if (inRange) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Check if item matches filter groups\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches the group filters\n */\n matchesFilterGroups(itemCategories) {\n const groupMatches = [...this.filterGroups.values()].map((group) => {\n const groupFilters = [...group.filters];\n if (groupFilters.length === 0) return true;\n\n return group.operator === \"OR\"\n ? groupFilters.some((filter) => itemCategories.has(filter))\n : groupFilters.every((filter) => itemCategories.has(filter));\n });\n\n return this.groupMode === \"OR\"\n ? groupMatches.some((matches) => matches)\n : groupMatches.every((matches) => matches);\n }\n\n /**\n * Update URL with current filter state\n * @private\n */\n updateURL() {\n const params = new URLSearchParams(window.location.search);\n\n // Add groups to URL if they exist\n if (this.filterGroups.size > 0) {\n for (const [groupId, group] of this.filterGroups.entries()) {\n params.set(`group_${groupId}`, [...group.filters].join(\",\"));\n params.set(`groupOp_${groupId}`, group.operator.toLowerCase());\n }\n params.set(\"groupMode\", this.groupMode.toLowerCase());\n }\n\n // Séparer les filtres par type\n const filtersByType = {};\n for (const filter of this.currentFilters) {\n if (filter !== \"*\") {\n const [type, value] = filter.split(\":\");\n if (!filtersByType[type]) {\n filtersByType[type] = new Set();\n }\n filtersByType[type].add(value);\n }\n }\n\n // Ajouter chaque type de filtre à l'URL\n Object.entries(filtersByType).forEach(([type, values]) => {\n params.set(type, Array.from(values).join(\",\"));\n });\n\n if (this.currentSearch) {\n params.set(\"search\", this.currentSearch);\n }\n\n const newURL = `${window.location.pathname}${\n params.toString() ? \"?\" + params.toString() : \"\"\n }`;\n window.history.pushState({}, \"\", newURL);\n }\n\n /**\n * Load filter state from URL\n * @private\n */\n loadFromURL() {\n const params = new URLSearchParams(window.location.search);\n\n // Load groups if they exist\n this.filterGroups.clear();\n for (const [key, value] of params.entries()) {\n if (key.startsWith(\"group_\")) {\n const groupId = key.replace(\"group_\", \"\");\n const operator =\n params.get(`groupOp_${groupId}`)?.toUpperCase() || \"OR\";\n const filters = value.split(\",\");\n this.addFilterGroup(groupId, filters, operator);\n }\n }\n\n // Set group mode if present\n const groupMode = params.get(\"groupMode\")?.toUpperCase();\n if (groupMode && [\"AND\", \"OR\"].includes(groupMode)) {\n this.groupMode = groupMode;\n }\n\n this.currentFilters.clear();\n\n // Si aucun filtre n'est présent, utiliser '*'\n let hasFilters = false;\n\n // Parcourir tous les paramètres\n for (const [type, values] of params.entries()) {\n if (type !== \"search\") {\n hasFilters = true;\n values.split(\",\").forEach((value) => {\n this.currentFilters.add(`${type}:${value}`);\n });\n }\n }\n\n if (!hasFilters) {\n this.currentFilters.add(\"*\");\n }\n\n // Update active buttons\n this.filterButtons.forEach((button) => {\n const filterValue = button.dataset.filter;\n if (\n this.currentFilters.has(filterValue) ||\n (filterValue === \"*\" && this.currentFilters.has(\"*\"))\n ) {\n button.classList.add(this.options.activeClass);\n } else {\n button.classList.remove(this.options.activeClass);\n }\n });\n\n // Load search\n const search = params.get(\"search\") || \"\";\n if (this.searchInput) {\n this.searchInput.value = search;\n }\n\n this.filter();\n if (search) {\n this.search(search);\n }\n }\n\n /**\n * Update results counter\n * @private\n * @returns {{total: number, visible: number}}\n */\n updateCounter() {\n const total = this.items.length;\n const visible = this.visibleItems.size;\n\n if (this.counter) {\n this.counter.textContent = `Showing ${visible} of ${total}`;\n }\n\n return { total, visible };\n }\n\n /**\n * Set animation options\n * @public\n * @param {Object} options - Animation options\n */\n setAnimationOptions(options = {}) {\n this.options.animationDuration =\n options.duration || this.options.animationDuration;\n this.options.animationType = options.type || \"ease-out\";\n this.addStyles(); // Refresh styles with new options\n }\n\n /**\n * Event handling system\n */\n addEventSystem() {\n this.events = {};\n\n this.on = (eventName, callback) => {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n };\n\n this.emit = (eventName, data) => {\n if (this.events[eventName]) {\n this.events[eventName].forEach((callback) => callback(data));\n }\n };\n }\n\n /**\n * Add pagination\n * @public\n * @param {number} itemsPerPage - Number of items per page\n */\n setPagination(itemsPerPage) {\n this.pagination = {\n currentPage: 1,\n itemsPerPage: itemsPerPage,\n totalPages: Math.ceil(this.visibleItems.size / itemsPerPage),\n };\n this.updatePagination();\n }\n\n updatePagination() {\n const start =\n (this.pagination.currentPage - 1) * this.pagination.itemsPerPage;\n const end = start + this.pagination.itemsPerPage;\n\n [...this.visibleItems].forEach((item, index) => {\n if (index >= start && index < end) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n }\n\n /**\n * Enable analytics tracking\n * @public\n * @param {Function} callback - Analytics callback function\n */\n enableAnalytics(callback) {\n this.analyticsCallback = callback;\n this.on(\"filter\", (data) => {\n this.analyticsCallback({\n type: \"filter\",\n filters: [...this.currentFilters],\n visibleItems: this.visibleItems.size,\n timestamp: new Date().toISOString(),\n });\n });\n }\n\n /**\n * Sort with custom comparator\n * @public\n * @param {string} key - Data attribute key\n * @param {Function} comparator - Custom comparison function\n */\n sortWithComparator(key, comparator) {\n const items = [...this.items];\n items.sort((a, b) => {\n const valueA = a.dataset[key];\n const valueB = b.dataset[key];\n return comparator(valueA, valueB);\n });\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Add responsive behavior\n * @public\n * @param {Object} breakpoints - Breakpoint configurations\n */\n setResponsiveOptions(breakpoints) {\n window.addEventListener(\n \"resize\",\n debounce(() => {\n const width = window.innerWidth;\n for (const [breakpoint, options] of Object.entries(breakpoints)) {\n if (width <= parseInt(breakpoint)) {\n Object.assign(this.options, options);\n this.filter();\n break;\n }\n }\n }, 250),\n );\n }\n\n /**\n * Enable keyboard navigation\n * @public\n */\n enableKeyboardNavigation() {\n document.addEventListener(\"keydown\", (e) => {\n if (\n e.key === \"Enter\" &&\n document.activeElement.classList.contains(\n this.options.filterButtonSelector.slice(1),\n )\n ) {\n document.activeElement.click();\n }\n });\n }\n\n /**\n * Export current filter state\n * @public\n * @returns {Object} Filter state\n */\n exportState() {\n return {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Import filter state\n * @public\n * @param {Object} state - Filter state to import\n */\n importState(state) {\n if (state.filters) {\n this.currentFilters = new Set(state.filters);\n this.currentSearch = state.search || \"\";\n this.options.filterMode = state.mode || \"OR\";\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Save current filter state as preset\n * @public\n * @param {string} presetName - Name of the preset\n */\n savePreset(presetName) {\n const preset = {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n };\n localStorage.setItem(`afs_preset_${presetName}`, JSON.stringify(preset));\n }\n\n /**\n * Load filter preset\n * @public\n * @param {string} presetName - Name of the preset to load\n */\n loadPreset(presetName) {\n const preset = JSON.parse(localStorage.getItem(`afs_preset_${presetName}`));\n if (preset) {\n this.currentFilters = new Set(preset.filters);\n this.currentSearch = preset.search;\n this.options.filterMode = preset.mode;\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Set filter logic mode (alias for setFilterMode)\n * @public\n * @param {string} logic - New filter logic ('AND' or 'OR')\n */\n setLogic(logic) {\n if (typeof logic === \"boolean\") {\n // Handle boolean input (true = AND, false = OR)\n this.options.filterMode = logic ? \"AND\" : \"OR\";\n this.filter();\n return;\n }\n\n const mode = logic.toUpperCase();\n if ([\"OR\", \"AND\"].includes(mode)) {\n this.options.filterMode = mode;\n this.filter();\n }\n }\n\n /**\n * Change filter mode\n * @public\n * @param {string} mode - New filter mode ('OR' or 'AND')\n */\n setFilterMode(mode) {\n if ([\"OR\", \"AND\"].includes(mode.toUpperCase())) {\n this.options.filterMode = mode.toUpperCase();\n this.filter();\n }\n }\n\n /**\n * Add filter by type and value\n * @public\n * @param {string} type - Filter type\n * @param {string} value - Filter value\n */\n addFilter(type, value) {\n this.currentFilters.add(`${type}:${value}`);\n this.filter();\n this.updateURL();\n }\n\n /**\n * Remove filter by type and value\n * @public\n * @param {string} type - Filter type\n */\n removeFilter(type, value) {\n this.currentFilters.delete(`${type}:${value}`);\n if (this.currentFilters.size === 0) {\n this.currentFilters.add(\"*\");\n }\n this.filter();\n this.updateURL();\n }\n\n /**\n * Get active filters by type\n * @public\n * @param {string} type - Filter type\n */\n getActiveFiltersByType(type) {\n return [...this.currentFilters]\n .filter((filter) => filter.startsWith(`${type}:`))\n .map((filter) => filter.split(\":\")[1]);\n }\n}\n\nexport { AFS };\n"],"names":["debounce","func","wait","timeout","executedFunction","_len","arguments","length","args","Array","_key","later","clearTimeout","setTimeout","AFS","constructor","options","undefined","containerSelector","itemSelector","filterButtonSelector","searchInputSelector","counterSelector","activeClass","hiddenClass","animationDuration","filterMode","searchKeys","debounceTime","container","document","querySelector","items","querySelectorAll","filterButtons","searchInput","counter","currentFilters","Set","currentSearch","visibleItems","filterGroups","Map","groupMode","init","addStyles","bindEvents","loadFromURL","updateCounter","styles","styleSheet","createElement","textContent","head","appendChild","forEach","button","addEventListener","handleFilterClick","e","search","target","value","window","filterValue","dataset","filter","resetFilters","toggleFilter","updateURL","btn","classList","remove","clear","add","resetCounter","delete","contains","size","standardFilter","item","has","showItem","itemCategories","categories","split","matchesFilter","matchesAnyFilter","matchesAllFilters","hideItem","matchesGroups","matchesFilterGroups","addFilterGroup","groupId","filters","operator","isArray","console","warn","validOperator","toUpperCase","includes","set","updateFiltersFromGroups","error","setGroupMode","mode","validMode","removeFilterGroup","group","values","some","type","every","style","opacity","transform","offsetHeight","requestAnimationFrame","query","toLowerCase","trim","searchText","map","key","join","matchesSearch","sortMultiple","criteria","sort","a","b","criterion","valueA","valueB","comparison","direction","localeCompare","addRangeFilter","min","max","parseFloat","inRange","groupMatches","groupFilters","matches","params","URLSearchParams","location","entries","filtersByType","Object","_ref","from","newURL","pathname","toString","history","pushState","startsWith","replace","get","hasFilters","total","visible","setAnimationOptions","duration","animationType","addEventSystem","events","on","eventName","callback","push","emit","data","setPagination","itemsPerPage","pagination","currentPage","totalPages","Math","ceil","updatePagination","start","end","index","enableAnalytics","analyticsCallback","timestamp","Date","toISOString","sortWithComparator","comparator","setResponsiveOptions","breakpoints","width","innerWidth","breakpoint","parseInt","assign","enableKeyboardNavigation","activeElement","slice","click","exportState","importState","state","savePreset","presetName","preset","localStorage","setItem","JSON","stringify","loadPreset","parse","getItem","setLogic","logic","setFilterMode","addFilter","removeFilter","getActiveFiltersByType"],"mappings":"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"}
1
+ {"version":3,"file":"AFS.js","sources":["../src/AFS.js"],"sourcesContent":["/**\n * @fileoverview Advanced Filter System for DOM elements\n * @version 1.0.6\n *\n * A flexible and customizable filtering system that supports:\n * - Multiple filtering modes (OR/AND)\n * - Text search with debouncing\n * - Multiple sorting criteria\n * - Range filtering\n * - URL state management\n * - Animation and transitions\n * - Results counter\n */\n\n/**\n * Utility function for debouncing\n * @param {Function} func - Function to debounce\n * @param {number} wait - Delay in milliseconds\n * @returns {Function} Debounced function\n */\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\nclass AFS {\n /**\n * @typedef {Object} FilterOptions\n * @property {string} containerSelector - Main container selector\n * @property {string} itemSelector - Items to filter selector\n * @property {string} filterButtonSelector - Filter buttons selector\n * @property {string} [searchInputSelector] - Search input selector\n * @property {string} [counterSelector] - Results counter selector\n * @property {string} [activeClass='active'] - Active state class\n * @property {string} [hiddenClass='hidden'] - Hidden state class\n * @property {number} [animationDuration=300] - Animation duration in ms\n * @property {string} [filterMode='OR'] - Filter mode ('OR' or 'AND')\n * @property {string[]} [searchKeys=['title']] - Data attributes to search in\n * @property {number} [debounceTime=300] - Search debounce delay in ms\n */\n\n /**\n * @param {FilterOptions} options - Filter configuration options\n */\n constructor(options = {}) {\n this.options = {\n containerSelector: \".filter-container\",\n itemSelector: \".filter-item\",\n filterButtonSelector: \".btn-filter\",\n searchInputSelector: \".filter-search\",\n counterSelector: \".filter-counter\",\n activeClass: \"active\",\n hiddenClass: \"hidden\",\n animationDuration: 300,\n filterMode: \"OR\",\n searchKeys: [\"title\"],\n debounceTime: 300,\n debug: false,\n logLevel: 'info',\n ...options,\n };\n\n // Define logging levels hierarchy\n this.logLevels = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3\n };\n\n // Initialize elements\n this.container = document.querySelector(this.options.containerSelector);\n this.items = document.querySelectorAll(this.options.itemSelector);\n this.sortOrders = {};\n this.filterButtons = document.querySelectorAll(\n this.options.filterButtonSelector,\n );\n this.searchInput = document.querySelector(this.options.searchInputSelector);\n this.counter = document.querySelector(this.options.counterSelector);\n\n // Initialize state\n this.currentFilters = new Set([\"*\"]);\n this.currentSearch = \"\";\n this.visibleItems = new Set(this.items);\n this.filterGroups = new Map();\n this.groupMode = \"OR\"; // Default group mode\n\n this.log('debug', 'Initializing AFS with options:', this.options);\n this.init();\n }\n\n /**\n * Internal logging method\n * Handles debug message output based on current log level\n * \n * @private\n * @param {string} level - Log level ('error', 'warn', 'info', 'debug')\n * @param {...any} args - Arguments to log\n */\n log(level, ...args) {\n if (!this.options.debug) return;\n \n const currentLevelValue = this.logLevels[this.options.logLevel];\n const messageLevel = this.logLevels[level];\n\n if (messageLevel <= currentLevelValue) {\n const timestamp = new Date().toISOString();\n const prefix = `[AFS ${level.toUpperCase()}] ${timestamp}`;\n\n switch (level) {\n case 'error':\n console.error(prefix, ...args);\n break;\n case 'warn':\n console.warn(prefix, ...args);\n break;\n case 'info':\n console.info(prefix, ...args);\n break;\n case 'debug':\n console.debug(prefix, ...args);\n break;\n }\n }\n }\n\n /**\n * Configure debug mode settings\n * \n * @public\n * @param {boolean} enabled - Enable or disable debug mode\n * @param {string} [level='info'] - Log level ('error', 'warn', 'info', 'debug')\n */\n setDebugMode(enabled, level = 'info') {\n this.options.debug = enabled;\n if (this.logLevels.hasOwnProperty(level)) {\n this.options.logLevel = level;\n }\n this.log('info', `Debug mode ${enabled ? 'enabled' : 'disabled'} with level: ${level}`);\n }\n\n /**\n * Initialize the filter system\n * Sets up styles, events, and initial state\n * \n * @private\n */\n init() {\n this.log('debug', 'Starting initialization');\n \n if (!this.container) {\n this.log('error', `Container not found: ${this.options.containerSelector}`);\n return;\n }\n\n this.addStyles();\n this.bindEvents();\n this.loadFromURL();\n this.updateCounter();\n \n this.log('info', 'Initialization complete');\n }\n\n /**\n * Add required styles to document\n * @private\n */\n addStyles() {\n const styles = `\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `;\n\n const styleSheet = document.createElement(\"style\");\n styleSheet.textContent = styles;\n document.head.appendChild(styleSheet);\n this.log('debug', 'Styles added to document');\n }\n\n /**\n * Bind all event listeners\n * @private\n */\n bindEvents() {\n this.log('debug', 'Binding events');\n\n this.filterButtons.forEach((button) => {\n button.addEventListener(\"click\", () => this.handleFilterClick(button));\n });\n\n if (this.searchInput) {\n this.searchInput.addEventListener(\n \"input\",\n debounce((e) => {\n this.search(e.target.value);\n }, this.options.debounceTime),\n );\n }\n\n window.addEventListener(\"popstate\", () => this.loadFromURL());\n\n this.log('debug', 'Events bound successfully');\n }\n\n /**\n * Handle filter button clicks\n * @private\n * @param {HTMLElement} button - Clicked filter button\n */\n handleFilterClick(button) {\n const filterValue = button.dataset.filter;\n this.log('debug', 'Filter button clicked:', filterValue);\n\n if (filterValue === \"*\") {\n this.resetFilters();\n } else {\n this.toggleFilter(filterValue, button);\n }\n\n this.filter();\n this.updateURL();\n }\n\n /**\n * Reset all filters to default state\n * @private\n */\n resetFilters() {\n this.log('debug', 'Resetting filters');\n\n this.filterButtons.forEach((btn) =>\n btn.classList.remove(this.options.activeClass),\n );\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filterButtons[0].classList.add(this.options.activeClass);\n this.resetCounter();\n }\n\n /**\n * Reset visible items counter\n * @private\n */\n resetCounter() {\n this.visibleItems = new Set(this.items);\n this.updateCounter();\n }\n\n /**\n * Toggle individual filter state\n * @private\n * @param {string} filterValue - Filter value to toggle\n * @param {HTMLElement} button - Filter button element\n */\n toggleFilter(filterValue, button) {\n this.log('debug', `Toggling filter: ${filterValue}`);\n\n this.currentFilters.delete(\"*\");\n this.filterButtons[0].classList.remove(this.options.activeClass);\n\n if (button.classList.contains(this.options.activeClass)) {\n button.classList.remove(this.options.activeClass);\n this.currentFilters.delete(filterValue);\n\n // If no filters are selected, reset to default state and clear URL\n if (this.currentFilters.size === 0) {\n this.resetFilters();\n window.history.pushState({}, \"\", window.location.pathname);\n return;\n }\n } else {\n button.classList.add(this.options.activeClass);\n this.currentFilters.add(filterValue);\n }\n }\n\n /**\n * Sort items based on auto-detecting ASC or DESC for each key\n * @public\n * @param {string} key - The data attribute key to sort by (e.g., 'title', 'price', 'date')\n */\n sortWithOrder(key) {\n const items = [...this.items];\n\n // Check if the current sort order is ASC, default to ASC if undefined\n const currentOrder = this.sortOrders[key] || \"asc\";\n const newOrder = currentOrder === \"asc\" ? \"desc\" : \"asc\"; // Toggle order\n\n // Sort items based on the new order\n items.sort((a, b) => {\n let valueA = a.dataset[key];\n let valueB = b.dataset[key];\n\n // Check if values are numeric and convert them to numbers if they are\n const isNumeric = !isNaN(valueA) && !isNaN(valueB);\n if (isNumeric) {\n valueA = parseFloat(valueA);\n valueB = parseFloat(valueB);\n }\n\n if (newOrder === \"asc\") {\n return isNumeric ? valueA - valueB : valueA.localeCompare(valueB);\n } else {\n return isNumeric ? valueB - valueA : valueB.localeCompare(valueA);\n }\n });\n\n // Update the current sort order for the key\n this.sortOrders[key] = newOrder;\n\n // Reorder items in the DOM\n items.forEach((item) => this.container.appendChild(item));\n\n this.log('debug', `Sorting items by ${key} in ${newOrder} order`);\n }\n\n /**\n * Shuffle items randomly and display in the container\n * @public\n */\n shuffle() {\n const itemsArray = [...this.items];\n\n // Shuffle the itemsArray using Fisher-Yates algorithm\n for (let i = itemsArray.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [itemsArray[i], itemsArray[j]] = [itemsArray[j], itemsArray[i]];\n }\n\n // Re-append the shuffled items to the container\n itemsArray.forEach((item) => this.container.appendChild(item));\n\n this.log('debug', 'Shuffling items');\n }\n\n /**\n * Apply current filters to items\n * @public\n */\n /**\n * Apply current filters to items\n * @public\n */\n filter() {\n // Store the original filter logic\n const standardFilter = () => {\n this.log('debug', 'Applying filters');\n\n this.visibleItems.clear();\n\n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesFilter =\n this.options.filterMode === \"OR\"\n ? this.matchesAnyFilter(itemCategories)\n : this.matchesAllFilters(itemCategories);\n\n if (matchesFilter) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n };\n\n // Check if we should use group filtering or standard filtering\n if (this.filterGroups.size === 0) {\n standardFilter();\n } else {\n this.visibleItems.clear();\n\n this.items.forEach((item) => {\n if (this.currentFilters.has(\"*\")) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n const itemCategories = new Set(\n item.dataset.categories?.split(\" \") || [],\n );\n const matchesGroups = this.matchesFilterGroups(itemCategories);\n\n if (matchesGroups) {\n this.showItem(item);\n this.visibleItems.add(item);\n } else {\n this.hideItem(item);\n }\n }\n });\n }\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n\n this.log('info', `Filter applied. Visible items: ${this.visibleItems.size}`);\n }\n\n /**\n * Add or update a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @param {string[]} filters - Array of filter values\n * @param {string} [operator='OR'] - Operator within group ('AND' or 'OR')\n * @returns {boolean} Success status\n */\n addFilterGroup(groupId, filters, operator = \"OR\") {\n try {\n // Validate inputs\n if (!groupId || !Array.isArray(filters)) {\n this.log('error', 'Invalid group ID or filters');\n return false;\n }\n\n const validOperator = operator.toUpperCase();\n if (![\"AND\", \"OR\"].includes(validOperator)) {\n this.log('error', 'Invalid operator:', operator);\n operator = \"OR\";\n }\n\n // Create or update group\n this.filterGroups.set(groupId, {\n filters: new Set(filters),\n operator: validOperator,\n });\n\n // Only update if we have active groups\n if (this.filterGroups.size > 0) {\n this.updateFiltersFromGroups();\n this.filter();\n this.updateURL();\n }\n\n return true;\n } catch (error) {\n this.log('error', 'Error adding filter group:', error);\n return false;\n }\n }\n\n /**\n * Set how groups combine with each other\n * @public\n * @param {string} mode - Mode for combining groups ('AND' or 'OR')\n */\n setGroupMode(mode) {\n const validMode = mode.toUpperCase();\n if ([\"AND\", \"OR\"].includes(validMode)) {\n this.groupMode = validMode;\n if (this.filterGroups.size > 0) {\n this.filter();\n }\n }\n }\n\n /**\n * Remove a filter group\n * @public\n * @param {string} groupId - Group identifier\n * @returns {boolean} Success status\n */\n removeFilterGroup(groupId) {\n if (this.filterGroups.has(groupId)) {\n this.filterGroups.delete(groupId);\n\n // If no groups left, revert to normal filtering\n if (this.filterGroups.size === 0) {\n this.resetFilters();\n } else {\n this.updateFiltersFromGroups();\n }\n\n this.filter();\n this.updateURL();\n return true;\n }\n return false;\n }\n\n /**\n * Update filters based on groups\n * @private\n */\n updateFiltersFromGroups() {\n // Only process if we have groups\n if (this.filterGroups.size === 0) return;\n\n // Clear current filters except '*'\n if (!this.currentFilters.has(\"*\")) {\n this.currentFilters.clear();\n }\n\n // Combine all group filters\n for (const group of this.filterGroups.values()) {\n group.filters.forEach((filter) => {\n if (filter !== \"*\") {\n this.currentFilters.add(filter);\n }\n });\n }\n }\n\n /**\n * Check if item matches any active filter (OR mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches any filter\n */\n matchesAnyFilter(itemCategories) {\n return [...this.currentFilters].some((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Check if item matches all active filters (AND mode)\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches all filters\n */\n matchesAllFilters(itemCategories) {\n return [...this.currentFilters].every((filter) => {\n const [type, value] = filter.split(\":\");\n return itemCategories.has(`${type}:${value}`);\n });\n }\n\n /**\n * Show an item with animation\n * @private\n * @param {HTMLElement} item - Item to show\n */\n showItem(item) {\n this.visibleItems.add(item);\n item.classList.remove(this.options.hiddenClass);\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n item.offsetHeight;\n\n requestAnimationFrame(() => {\n item.style.opacity = \"1\";\n item.style.transform = \"scale(1)\";\n });\n }\n\n /**\n * Hide an item with animation\n * @private\n * @param {HTMLElement} item - Item to hide\n */\n hideItem(item) {\n item.style.opacity = \"0\";\n item.style.transform = \"scale(0.95)\";\n\n setTimeout(() => {\n if (item.style.opacity === \"0\") {\n item.classList.add(this.options.hiddenClass);\n this.visibleItems.delete(item);\n }\n }, this.options.animationDuration);\n }\n\n /**\n * Search items by text\n * @public\n * @param {string} query - Search query\n */\n search(query) {\n this.log('debug', 'Performing search with query:', query);\n\n this.currentSearch = query.toLowerCase().trim();\n let matches = 0;\n\n this.items.forEach((item) => {\n const searchText = this.options.searchKeys\n .map((key) => item.dataset[key] || \"\")\n .join(\" \")\n .toLowerCase();\n\n const matchesSearch =\n this.currentSearch === \"\" || searchText.includes(this.currentSearch);\n\n if (matchesSearch) {\n this.showItem(item);\n matches++;\n } else {\n this.hideItem(item);\n }\n });\n\n this.updateURL();\n this.log('info', `Search complete. Found ${matches} matches`);\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n }\n\n /**\n * Sort items by multiple criteria\n * @public\n * @param {Array<{key: string, direction: string}>} criteria - Sort criteria\n */\n sortMultiple(criteria) {\n const items = [...this.items];\n\n items.sort((a, b) => {\n for (const criterion of criteria) {\n const valueA = a.dataset[criterion.key];\n const valueB = b.dataset[criterion.key];\n\n const comparison =\n criterion.direction === \"asc\"\n ? valueA.localeCompare(valueB)\n : valueB.localeCompare(valueA);\n\n if (comparison !== 0) return comparison;\n }\n return 0;\n });\n\n items.forEach((item) => this.container.appendChild(item));\n\n this.log('debug', 'Sorting items by multiple criteria:', criteria);\n }\n\n /**\n * Filter items by numeric range\n * @public\n * @param {string} key - Data attribute key\n * @param {number} min - Minimum value\n * @param {number} max - Maximum value\n */\n addRangeFilter(key, min, max) {\n this.items.forEach((item) => {\n const value = parseFloat(item.dataset[key]);\n const inRange = value >= min && value <= max;\n\n if (inRange) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n\n setTimeout(() => {\n this.updateCounter();\n }, this.options.animationDuration);\n\n this.log('debug', `Filtering items by range: ${key} between ${min} and ${max}`);\n }\n\n /**\n * Check if item matches filter groups\n * @private\n * @param {Set} itemCategories - Item's categories\n * @returns {boolean} Whether item matches the group filters\n */\n matchesFilterGroups(itemCategories) {\n const groupMatches = [...this.filterGroups.values()].map((group) => {\n const groupFilters = [...group.filters];\n if (groupFilters.length === 0) return true;\n\n return group.operator === \"OR\"\n ? groupFilters.some((filter) => itemCategories.has(filter))\n : groupFilters.every((filter) => itemCategories.has(filter));\n });\n\n return this.groupMode === \"OR\"\n ? groupMatches.some((matches) => matches)\n : groupMatches.every((matches) => matches);\n }\n\n /**\n * Update URL with current filter state\n * @private\n */\n updateURL() {\n this.log('debug', 'Updating URL');\n\n // If only \"*\" filter is active or no filters are active, clear the URL\n if (\n this.currentFilters.size === 0 ||\n (this.currentFilters.size === 1 && this.currentFilters.has(\"*\"))\n ) {\n window.history.pushState({}, \"\", window.location.pathname);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n\n // Add groups to URL if they exist\n if (this.filterGroups.size > 0) {\n for (const [groupId, group] of this.filterGroups.entries()) {\n params.set(`group_${groupId}`, [...group.filters].join(\",\"));\n params.set(`groupOp_${groupId}`, group.operator.toLowerCase());\n }\n params.set(\"groupMode\", this.groupMode.toLowerCase());\n }\n\n // Separate filters by type\n const filtersByType = {};\n for (const filter of this.currentFilters) {\n if (filter !== \"*\") {\n const [type, value] = filter.split(\":\");\n if (!filtersByType[type]) {\n filtersByType[type] = new Set();\n }\n filtersByType[type].add(value);\n }\n }\n\n // Add each filter type to the URL\n Object.entries(filtersByType).forEach(([type, values]) => {\n params.set(type, Array.from(values).join(\",\"));\n });\n\n if (this.currentSearch) {\n params.set(\"search\", this.currentSearch);\n }\n\n const newURL = `${window.location.pathname}${\n params.toString() ? \"?\" + params.toString() : \"\"\n }`;\n window.history.pushState({}, \"\", newURL);\n this.log('debug', 'URL updated:', newURL);\n }\n\n /**\n * Load filter state from URL\n * @private\n */\n loadFromURL() {\n this.log('debug', 'Loading state from URL');\n const params = new URLSearchParams(window.location.search);\n\n // Load groups if they exist\n this.filterGroups.clear();\n for (const [key, value] of params.entries()) {\n if (key.startsWith(\"group_\")) {\n const groupId = key.replace(\"group_\", \"\");\n const operator =\n params.get(`groupOp_${groupId}`)?.toUpperCase() || \"OR\";\n const filters = value.split(\",\");\n this.addFilterGroup(groupId, filters, operator);\n }\n }\n\n // Set group mode if present\n const groupMode = params.get(\"groupMode\")?.toUpperCase();\n if (groupMode && [\"AND\", \"OR\"].includes(groupMode)) {\n this.groupMode = groupMode;\n }\n\n this.currentFilters.clear();\n\n // Si aucun filtre n'est présent, utiliser '*'\n let hasFilters = false;\n\n // Parcourir tous les paramètres\n for (const [type, values] of params.entries()) {\n if (type !== \"search\") {\n hasFilters = true;\n values.split(\",\").forEach((value) => {\n this.currentFilters.add(`${type}:${value}`);\n });\n }\n }\n\n if (!hasFilters) {\n this.currentFilters.add(\"*\");\n }\n\n // Update active buttons\n this.filterButtons.forEach((button) => {\n const filterValue = button.dataset.filter;\n if (\n this.currentFilters.has(filterValue) ||\n (filterValue === \"*\" && this.currentFilters.has(\"*\"))\n ) {\n button.classList.add(this.options.activeClass);\n } else {\n button.classList.remove(this.options.activeClass);\n }\n });\n\n // Load search\n const search = params.get(\"search\") || \"\";\n if (this.searchInput) {\n this.searchInput.value = search;\n }\n\n this.filter();\n if (search) {\n this.search(search);\n }\n\n this.log('info', 'State loaded from URL');\n }\n\n /**\n * Update results counter\n * @private\n * @returns {{total: number, visible: number}}\n */\n updateCounter() {\n const total = this.items.length;\n const visible = this.visibleItems.size;\n\n if (this.counter) {\n this.counter.textContent = `Showing ${visible} of ${total}`;\n }\n \n this.log('debug', `Counter updated: ${visible}/${total}`);\n return { total, visible };\n }\n\n /**\n * Set animation options\n * @public\n * @param {Object} options - Animation options\n */\n setAnimationOptions(options = {}) {\n this.options.animationDuration =\n options.duration || this.options.animationDuration;\n this.options.animationType = options.type || \"ease-out\";\n this.addStyles(); // Refresh styles with new options\n }\n\n /**\n * Event handling system\n */\n addEventSystem() {\n this.events = {};\n\n this.on = (eventName, callback) => {\n if (!this.events[eventName]) {\n this.events[eventName] = [];\n }\n this.events[eventName].push(callback);\n };\n\n this.emit = (eventName, data) => {\n if (this.events[eventName]) {\n this.events[eventName].forEach((callback) => callback(data));\n }\n };\n }\n\n /**\n * Add pagination\n * @public\n * @param {number} itemsPerPage - Number of items per page\n */\n setPagination(itemsPerPage) {\n this.pagination = {\n currentPage: 1,\n itemsPerPage: itemsPerPage,\n totalPages: Math.ceil(this.visibleItems.size / itemsPerPage),\n };\n this.updatePagination();\n }\n\n updatePagination() {\n const start =\n (this.pagination.currentPage - 1) * this.pagination.itemsPerPage;\n const end = start + this.pagination.itemsPerPage;\n\n [...this.visibleItems].forEach((item, index) => {\n if (index >= start && index < end) {\n this.showItem(item);\n } else {\n this.hideItem(item);\n }\n });\n }\n\n /**\n * Enable analytics tracking\n * @public\n * @param {Function} callback - Analytics callback function\n */\n enableAnalytics(callback) {\n this.analyticsCallback = callback;\n this.on(\"filter\", (data) => {\n this.analyticsCallback({\n type: \"filter\",\n filters: [...this.currentFilters],\n visibleItems: this.visibleItems.size,\n timestamp: new Date().toISOString(),\n });\n });\n }\n\n /**\n * Sort with custom comparator\n * @public\n * @param {string} key - Data attribute key\n * @param {Function} comparator - Custom comparison function\n */\n sortWithComparator(key, comparator) {\n const items = [...this.items];\n items.sort((a, b) => {\n const valueA = a.dataset[key];\n const valueB = b.dataset[key];\n return comparator(valueA, valueB);\n });\n items.forEach((item) => this.container.appendChild(item));\n }\n\n /**\n * Add responsive behavior\n * @public\n * @param {Object} breakpoints - Breakpoint configurations\n */\n setResponsiveOptions(breakpoints) {\n window.addEventListener(\n \"resize\",\n debounce(() => {\n const width = window.innerWidth;\n for (const [breakpoint, options] of Object.entries(breakpoints)) {\n if (width <= parseInt(breakpoint)) {\n Object.assign(this.options, options);\n this.filter();\n break;\n }\n }\n }, 250),\n );\n }\n\n /**\n * Enable keyboard navigation\n * @public\n */\n enableKeyboardNavigation() {\n document.addEventListener(\"keydown\", (e) => {\n if (\n e.key === \"Enter\" &&\n document.activeElement.classList.contains(\n this.options.filterButtonSelector.slice(1),\n )\n ) {\n document.activeElement.click();\n }\n });\n }\n\n /**\n * Export current filter state\n * @public\n * @returns {Object} Filter state\n */\n exportState() {\n return {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Import filter state\n * @public\n * @param {Object} state - Filter state to import\n */\n importState(state) {\n if (state.filters) {\n this.currentFilters = new Set(state.filters);\n this.currentSearch = state.search || \"\";\n this.options.filterMode = state.mode || \"OR\";\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Save current filter state as preset\n * @public\n * @param {string} presetName - Name of the preset\n */\n savePreset(presetName) {\n const preset = {\n filters: [...this.currentFilters],\n search: this.currentSearch,\n mode: this.options.filterMode,\n };\n localStorage.setItem(`afs_preset_${presetName}`, JSON.stringify(preset));\n\n this.log('info', `Preset saved: ${presetName}`);\n }\n\n /**\n * Load filter preset\n * @public\n * @param {string} presetName - Name of the preset to load\n */\n loadPreset(presetName) {\n const preset = JSON.parse(localStorage.getItem(`afs_preset_${presetName}`));\n if (preset) {\n this.currentFilters = new Set(preset.filters);\n this.currentSearch = preset.search;\n this.options.filterMode = preset.mode;\n this.filter();\n this.updateURL();\n }\n }\n\n /**\n * Set filter logic mode (alias for setFilterMode)\n * @public\n * @param {string} logic - New filter logic ('AND' or 'OR')\n */\n setLogic(logic) {\n if (typeof logic === \"boolean\") {\n // Handle boolean input (true = AND, false = OR)\n this.options.filterMode = logic ? \"AND\" : \"OR\";\n this.filter();\n return;\n }\n\n const mode = logic.toUpperCase();\n if ([\"OR\", \"AND\"].includes(mode)) {\n this.options.filterMode = mode;\n this.filter();\n }\n }\n\n /**\n * Change filter mode\n * @public\n * @param {string} mode - New filter mode ('OR' or 'AND')\n */\n setFilterMode(mode) {\n if ([\"OR\", \"AND\"].includes(mode.toUpperCase())) {\n this.options.filterMode = mode.toUpperCase();\n this.filter();\n }\n }\n\n /**\n * Add filter by type and value\n * @public\n * @param {string} type - Filter type\n * @param {string} value - Filter value\n */\n addFilter(type, value) {\n this.currentFilters.add(`${type}:${value}`);\n this.filter();\n this.updateURL();\n }\n\n /**\n * Remove filter by type and value\n * @public\n * @param {string} type - Filter type\n */\n removeFilter(type, value) {\n this.currentFilters.delete(`${type}:${value}`);\n if (this.currentFilters.size === 0) {\n this.currentFilters.add(\"*\");\n }\n this.filter();\n this.updateURL();\n }\n\n /**\n * Get active filters by type\n * @public\n * @param {string} type - Filter type\n */\n getActiveFiltersByType(type) {\n return [...this.currentFilters]\n .filter((filter) => filter.startsWith(`${type}:`))\n .map((filter) => filter.split(\":\")[1]);\n }\n\n /**\n * Clear all filters, url and search\n *\n * @public\n */\n clearAllFilters() {\n this.currentFilters.clear();\n this.currentFilters.add(\"*\");\n this.filter();\n this.updateURL();\n\n // Uncheck all checkboxes if any with activeClass\n const checkboxes = document.querySelectorAll('input[type=\"checkbox\"]');\n checkboxes.forEach((checkbox) => {\n if (checkbox.classList.contains(this.options.activeClass)) {\n checkbox.checked = false;\n checkbox.classList.remove(this.options.activeClass);\n }\n });\n\n // Clear active on buttons\n this.filterButtons.forEach((btn) => {\n btn.classList.remove(this.options.activeClass);\n });\n\n // Clear search input\n if (this.searchInput) {\n this.searchInput.value = \"\";\n }\n\n this.log('info', 'All filters cleared');\n }\n}\n\nexport { AFS };\n"],"names":["debounce","func","wait","timeout","executedFunction","_len","arguments","length","args","Array","_key","later","clearTimeout","setTimeout","AFS","constructor","options","undefined","containerSelector","itemSelector","filterButtonSelector","searchInputSelector","counterSelector","activeClass","hiddenClass","animationDuration","filterMode","searchKeys","debounceTime","debug","logLevel","logLevels","error","warn","info","container","document","querySelector","items","querySelectorAll","sortOrders","filterButtons","searchInput","counter","currentFilters","Set","currentSearch","visibleItems","filterGroups","Map","groupMode","log","init","level","currentLevelValue","messageLevel","timestamp","Date","toISOString","prefix","toUpperCase","_len2","_key2","console","setDebugMode","enabled","hasOwnProperty","addStyles","bindEvents","loadFromURL","updateCounter","styles","styleSheet","createElement","textContent","head","appendChild","forEach","button","addEventListener","handleFilterClick","e","search","target","value","window","filterValue","dataset","filter","resetFilters","toggleFilter","updateURL","btn","classList","remove","clear","add","resetCounter","delete","contains","size","history","pushState","location","pathname","sortWithOrder","key","currentOrder","newOrder","sort","a","b","valueA","valueB","isNumeric","isNaN","parseFloat","localeCompare","item","shuffle","itemsArray","i","j","Math","floor","random","standardFilter","has","showItem","itemCategories","categories","split","matchesFilter","matchesAnyFilter","matchesAllFilters","hideItem","matchesGroups","matchesFilterGroups","addFilterGroup","groupId","filters","operator","isArray","validOperator","includes","set","updateFiltersFromGroups","setGroupMode","mode","validMode","removeFilterGroup","group","values","some","type","every","style","opacity","transform","offsetHeight","requestAnimationFrame","query","toLowerCase","trim","matches","searchText","map","join","matchesSearch","sortMultiple","criteria","criterion","comparison","direction","addRangeFilter","min","max","inRange","groupMatches","groupFilters","params","URLSearchParams","entries","filtersByType","Object","_ref","from","newURL","toString","startsWith","replace","get","hasFilters","total","visible","setAnimationOptions","duration","animationType","addEventSystem","events","on","eventName","callback","push","emit","data","setPagination","itemsPerPage","pagination","currentPage","totalPages","ceil","updatePagination","start","end","index","enableAnalytics","analyticsCallback","sortWithComparator","comparator","setResponsiveOptions","breakpoints","width","innerWidth","breakpoint","parseInt","assign","enableKeyboardNavigation","activeElement","slice","click","exportState","importState","state","savePreset","presetName","preset","localStorage","setItem","JSON","stringify","loadPreset","parse","getItem","setLogic","logic","setFilterMode","addFilter","removeFilter","getActiveFiltersByType","clearAllFilters","checkboxes","checkbox","checked"],"mappings":"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"}
package/dist/AFS.min.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).AFS={})}(this,(function(t){"use strict";function e(t,e){let s;return function(){for(var i=arguments.length,r=new Array(i),o=0;o<i;o++)r[o]=arguments[o];clearTimeout(s),s=setTimeout((()=>{clearTimeout(s),t(...r)}),e)}}t.AFS=class{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options={containerSelector:".filter-container",itemSelector:".filter-item",filterButtonSelector:".btn-filter",searchInputSelector:".filter-search",counterSelector:".filter-counter",activeClass:"active",hiddenClass:"hidden",animationDuration:300,filterMode:"OR",searchKeys:["title"],debounceTime:300,...t},this.container=document.querySelector(this.options.containerSelector),this.items=document.querySelectorAll(this.options.itemSelector),this.filterButtons=document.querySelectorAll(this.options.filterButtonSelector),this.searchInput=document.querySelector(this.options.searchInputSelector),this.counter=document.querySelector(this.options.counterSelector),this.currentFilters=new Set(["*"]),this.currentSearch="",this.visibleItems=new Set(this.items),this.filterGroups=new Map,this.groupMode="OR",this.init()}init(){this.addStyles(),this.bindEvents(),this.loadFromURL(),this.updateCounter()}addStyles(){const t=`\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `,e=document.createElement("style");e.textContent=t,document.head.appendChild(e)}bindEvents(){this.filterButtons.forEach((t=>{t.addEventListener("click",(()=>this.handleFilterClick(t)))})),this.searchInput&&this.searchInput.addEventListener("input",e((t=>{this.search(t.target.value)}),this.options.debounceTime)),window.addEventListener("popstate",(()=>this.loadFromURL()))}handleFilterClick(t){const e=t.dataset.filter;"*"===e?this.resetFilters():this.toggleFilter(e,t),this.filter(),this.updateURL()}resetFilters(){this.filterButtons.forEach((t=>t.classList.remove(this.options.activeClass))),this.currentFilters.clear(),this.currentFilters.add("*"),this.filterButtons[0].classList.add(this.options.activeClass),this.resetCounter()}resetCounter(){this.visibleItems=new Set(this.items),this.updateCounter()}toggleFilter(t,e){this.currentFilters.delete("*"),this.filterButtons[0].classList.remove(this.options.activeClass),e.classList.contains(this.options.activeClass)?(e.classList.remove(this.options.activeClass),this.currentFilters.delete(t),0===this.currentFilters.size&&this.resetFilters()):(e.classList.add(this.options.activeClass),this.currentFilters.add(t))}filter(){const t=()=>{this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);("OR"===this.options.filterMode?this.matchesAnyFilter(e):this.matchesAllFilters(e))?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}}))};0===this.filterGroups.size?t():(this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);this.matchesFilterGroups(e)?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}}))),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}addFilterGroup(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"OR";try{if(!t||!Array.isArray(e))return console.warn("Invalid group parameters"),!1;const i=s.toUpperCase();return["AND","OR"].includes(i)||(console.warn('Invalid operator. Using default "OR"'),s="OR"),this.filterGroups.set(t,{filters:new Set(e),operator:i}),this.filterGroups.size>0&&(this.updateFiltersFromGroups(),this.filter(),this.updateURL()),!0}catch(t){return console.error("Error adding filter group:",t),!1}}setGroupMode(t){const e=t.toUpperCase();["AND","OR"].includes(e)&&(this.groupMode=e,this.filterGroups.size>0&&this.filter())}removeFilterGroup(t){return!!this.filterGroups.has(t)&&(this.filterGroups.delete(t),0===this.filterGroups.size?this.resetFilters():this.updateFiltersFromGroups(),this.filter(),this.updateURL(),!0)}updateFiltersFromGroups(){if(0!==this.filterGroups.size){this.currentFilters.has("*")||this.currentFilters.clear();for(const t of this.filterGroups.values())t.filters.forEach((t=>{"*"!==t&&this.currentFilters.add(t)}))}}matchesAnyFilter(t){return[...this.currentFilters].some((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}matchesAllFilters(t){return[...this.currentFilters].every((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}showItem(t){this.visibleItems.add(t),t.classList.remove(this.options.hiddenClass),t.style.opacity="0",t.style.transform="scale(0.95)",t.offsetHeight,requestAnimationFrame((()=>{t.style.opacity="1",t.style.transform="scale(1)"}))}hideItem(t){t.style.opacity="0",t.style.transform="scale(0.95)",setTimeout((()=>{"0"===t.style.opacity&&(t.classList.add(this.options.hiddenClass),this.visibleItems.delete(t))}),this.options.animationDuration)}search(t){this.currentSearch=t.toLowerCase().trim(),this.items.forEach((t=>{const e=this.options.searchKeys.map((e=>t.dataset[e]||"")).join(" ").toLowerCase();""===this.currentSearch||e.includes(this.currentSearch)?this.showItem(t):this.hideItem(t)})),this.updateURL(),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}sortMultiple(t){const e=[...this.items];e.sort(((e,s)=>{for(const i of t){const t=e.dataset[i.key],r=s.dataset[i.key],o="asc"===i.direction?t.localeCompare(r):r.localeCompare(t);if(0!==o)return o}return 0})),e.forEach((t=>this.container.appendChild(t)))}addRangeFilter(t,e,s){this.items.forEach((i=>{const r=parseFloat(i.dataset[t]);r>=e&&r<=s?this.showItem(i):this.hideItem(i)})),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}matchesFilterGroups(t){const e=[...this.filterGroups.values()].map((e=>{const s=[...e.filters];return 0===s.length||("OR"===e.operator?s.some((e=>t.has(e))):s.every((e=>t.has(e))))}));return"OR"===this.groupMode?e.some((t=>t)):e.every((t=>t))}updateURL(){const t=new URLSearchParams(window.location.search);if(this.filterGroups.size>0){for(const[e,s]of this.filterGroups.entries())t.set(`group_${e}`,[...s.filters].join(",")),t.set(`groupOp_${e}`,s.operator.toLowerCase());t.set("groupMode",this.groupMode.toLowerCase())}const e={};for(const t of this.currentFilters)if("*"!==t){const[s,i]=t.split(":");e[s]||(e[s]=new Set),e[s].add(i)}Object.entries(e).forEach((e=>{let[s,i]=e;t.set(s,Array.from(i).join(","))})),this.currentSearch&&t.set("search",this.currentSearch);const s=`${window.location.pathname}${t.toString()?"?"+t.toString():""}`;window.history.pushState({},"",s)}loadFromURL(){const t=new URLSearchParams(window.location.search);this.filterGroups.clear();for(const[e,s]of t.entries())if(e.startsWith("group_")){const i=e.replace("group_",""),r=t.get(`groupOp_${i}`)?.toUpperCase()||"OR",o=s.split(",");this.addFilterGroup(i,o,r)}const e=t.get("groupMode")?.toUpperCase();e&&["AND","OR"].includes(e)&&(this.groupMode=e),this.currentFilters.clear();let s=!1;for(const[e,i]of t.entries())"search"!==e&&(s=!0,i.split(",").forEach((t=>{this.currentFilters.add(`${e}:${t}`)})));s||this.currentFilters.add("*"),this.filterButtons.forEach((t=>{const e=t.dataset.filter;this.currentFilters.has(e)||"*"===e&&this.currentFilters.has("*")?t.classList.add(this.options.activeClass):t.classList.remove(this.options.activeClass)}));const i=t.get("search")||"";this.searchInput&&(this.searchInput.value=i),this.filter(),i&&this.search(i)}updateCounter(){const t=this.items.length,e=this.visibleItems.size;return this.counter&&(this.counter.textContent=`Showing ${e} of ${t}`),{total:t,visible:e}}setAnimationOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options.animationDuration=t.duration||this.options.animationDuration,this.options.animationType=t.type||"ease-out",this.addStyles()}addEventSystem(){this.events={},this.on=(t,e)=>{this.events[t]||(this.events[t]=[]),this.events[t].push(e)},this.emit=(t,e)=>{this.events[t]&&this.events[t].forEach((t=>t(e)))}}setPagination(t){this.pagination={currentPage:1,itemsPerPage:t,totalPages:Math.ceil(this.visibleItems.size/t)},this.updatePagination()}updatePagination(){const t=(this.pagination.currentPage-1)*this.pagination.itemsPerPage,e=t+this.pagination.itemsPerPage;[...this.visibleItems].forEach(((s,i)=>{i>=t&&i<e?this.showItem(s):this.hideItem(s)}))}enableAnalytics(t){this.analyticsCallback=t,this.on("filter",(t=>{this.analyticsCallback({type:"filter",filters:[...this.currentFilters],visibleItems:this.visibleItems.size,timestamp:(new Date).toISOString()})}))}sortWithComparator(t,e){const s=[...this.items];s.sort(((s,i)=>{const r=s.dataset[t],o=i.dataset[t];return e(r,o)})),s.forEach((t=>this.container.appendChild(t)))}setResponsiveOptions(t){window.addEventListener("resize",e((()=>{const e=window.innerWidth;for(const[s,i]of Object.entries(t))if(e<=parseInt(s)){Object.assign(this.options,i),this.filter();break}}),250))}enableKeyboardNavigation(){document.addEventListener("keydown",(t=>{"Enter"===t.key&&document.activeElement.classList.contains(this.options.filterButtonSelector.slice(1))&&document.activeElement.click()}))}exportState(){return{filters:[...this.currentFilters],search:this.currentSearch,mode:this.options.filterMode,timestamp:(new Date).toISOString()}}importState(t){t.filters&&(this.currentFilters=new Set(t.filters),this.currentSearch=t.search||"",this.options.filterMode=t.mode||"OR",this.filter(),this.updateURL())}savePreset(t){const e={filters:[...this.currentFilters],search:this.currentSearch,mode:this.options.filterMode};localStorage.setItem(`afs_preset_${t}`,JSON.stringify(e))}loadPreset(t){const e=JSON.parse(localStorage.getItem(`afs_preset_${t}`));e&&(this.currentFilters=new Set(e.filters),this.currentSearch=e.search,this.options.filterMode=e.mode,this.filter(),this.updateURL())}setLogic(t){if("boolean"==typeof t)return this.options.filterMode=t?"AND":"OR",void this.filter();const e=t.toUpperCase();["OR","AND"].includes(e)&&(this.options.filterMode=e,this.filter())}setFilterMode(t){["OR","AND"].includes(t.toUpperCase())&&(this.options.filterMode=t.toUpperCase(),this.filter())}addFilter(t,e){this.currentFilters.add(`${t}:${e}`),this.filter(),this.updateURL()}removeFilter(t,e){this.currentFilters.delete(`${t}:${e}`),0===this.currentFilters.size&&this.currentFilters.add("*"),this.filter(),this.updateURL()}getActiveFiltersByType(t){return[...this.currentFilters].filter((e=>e.startsWith(`${t}:`))).map((t=>t.split(":")[1]))}}}));
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).AFS={})}(this,(function(t){"use strict";function e(t,e){let s;return function(){for(var i=arguments.length,r=new Array(i),o=0;o<i;o++)r[o]=arguments[o];clearTimeout(s),s=setTimeout((()=>{clearTimeout(s),t(...r)}),e)}}t.AFS=class{constructor(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options={containerSelector:".filter-container",itemSelector:".filter-item",filterButtonSelector:".btn-filter",searchInputSelector:".filter-search",counterSelector:".filter-counter",activeClass:"active",hiddenClass:"hidden",animationDuration:300,filterMode:"OR",searchKeys:["title"],debounceTime:300,debug:!1,logLevel:"info",...t},this.logLevels={error:0,warn:1,info:2,debug:3},this.container=document.querySelector(this.options.containerSelector),this.items=document.querySelectorAll(this.options.itemSelector),this.sortOrders={},this.filterButtons=document.querySelectorAll(this.options.filterButtonSelector),this.searchInput=document.querySelector(this.options.searchInputSelector),this.counter=document.querySelector(this.options.counterSelector),this.currentFilters=new Set(["*"]),this.currentSearch="",this.visibleItems=new Set(this.items),this.filterGroups=new Map,this.groupMode="OR",this.log("debug","Initializing AFS with options:",this.options),this.init()}log(t){if(!this.options.debug)return;const e=this.logLevels[this.options.logLevel];if(this.logLevels[t]<=e){const e=(new Date).toISOString(),o=`[AFS ${t.toUpperCase()}] ${e}`;for(var s=arguments.length,i=new Array(s>1?s-1:0),r=1;r<s;r++)i[r-1]=arguments[r];switch(t){case"error":console.error(o,...i);break;case"warn":console.warn(o,...i);break;case"info":console.info(o,...i);break;case"debug":console.debug(o,...i)}}}setDebugMode(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info";this.options.debug=t,this.logLevels.hasOwnProperty(e)&&(this.options.logLevel=e),this.log("info",`Debug mode ${t?"enabled":"disabled"} with level: ${e}`)}init(){this.log("debug","Starting initialization"),this.container?(this.addStyles(),this.bindEvents(),this.loadFromURL(),this.updateCounter(),this.log("info","Initialization complete")):this.log("error",`Container not found: ${this.options.containerSelector}`)}addStyles(){const t=`\n .${this.options.hiddenClass} {\n display: none !important;\n }\n\n ${this.options.itemSelector} {\n opacity: 1;\n transform: scale(1);\n transition: opacity ${this.options.animationDuration}ms ease-out,\n transform ${this.options.animationDuration}ms ease-out;\n }\n\n ${this.options.filterButtonSelector} {\n opacity: 0.5;\n transition: opacity ${this.options.animationDuration}ms ease;\n }\n\n ${this.options.filterButtonSelector}.${this.options.activeClass} {\n opacity: 1;\n }\n `,e=document.createElement("style");e.textContent=t,document.head.appendChild(e),this.log("debug","Styles added to document")}bindEvents(){this.log("debug","Binding events"),this.filterButtons.forEach((t=>{t.addEventListener("click",(()=>this.handleFilterClick(t)))})),this.searchInput&&this.searchInput.addEventListener("input",e((t=>{this.search(t.target.value)}),this.options.debounceTime)),window.addEventListener("popstate",(()=>this.loadFromURL())),this.log("debug","Events bound successfully")}handleFilterClick(t){const e=t.dataset.filter;this.log("debug","Filter button clicked:",e),"*"===e?this.resetFilters():this.toggleFilter(e,t),this.filter(),this.updateURL()}resetFilters(){this.log("debug","Resetting filters"),this.filterButtons.forEach((t=>t.classList.remove(this.options.activeClass))),this.currentFilters.clear(),this.currentFilters.add("*"),this.filterButtons[0].classList.add(this.options.activeClass),this.resetCounter()}resetCounter(){this.visibleItems=new Set(this.items),this.updateCounter()}toggleFilter(t,e){if(this.log("debug",`Toggling filter: ${t}`),this.currentFilters.delete("*"),this.filterButtons[0].classList.remove(this.options.activeClass),e.classList.contains(this.options.activeClass)){if(e.classList.remove(this.options.activeClass),this.currentFilters.delete(t),0===this.currentFilters.size)return this.resetFilters(),void window.history.pushState({},"",window.location.pathname)}else e.classList.add(this.options.activeClass),this.currentFilters.add(t)}sortWithOrder(t){const e=[...this.items],s="asc"===(this.sortOrders[t]||"asc")?"desc":"asc";e.sort(((e,i)=>{let r=e.dataset[t],o=i.dataset[t];const n=!isNaN(r)&&!isNaN(o);return n&&(r=parseFloat(r),o=parseFloat(o)),"asc"===s?n?r-o:r.localeCompare(o):n?o-r:o.localeCompare(r)})),this.sortOrders[t]=s,e.forEach((t=>this.container.appendChild(t))),this.log("debug",`Sorting items by ${t} in ${s} order`)}shuffle(){const t=[...this.items];for(let e=t.length-1;e>0;e--){const s=Math.floor(Math.random()*(e+1));[t[e],t[s]]=[t[s],t[e]]}t.forEach((t=>this.container.appendChild(t))),this.log("debug","Shuffling items")}filter(){const t=()=>{this.log("debug","Applying filters"),this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);("OR"===this.options.filterMode?this.matchesAnyFilter(e):this.matchesAllFilters(e))?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}}))};0===this.filterGroups.size?t():(this.visibleItems.clear(),this.items.forEach((t=>{if(this.currentFilters.has("*"))this.showItem(t),this.visibleItems.add(t);else{const e=new Set(t.dataset.categories?.split(" ")||[]);this.matchesFilterGroups(e)?(this.showItem(t),this.visibleItems.add(t)):this.hideItem(t)}}))),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration),this.log("info",`Filter applied. Visible items: ${this.visibleItems.size}`)}addFilterGroup(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"OR";try{if(!t||!Array.isArray(e))return this.log("error","Invalid group ID or filters"),!1;const i=s.toUpperCase();return["AND","OR"].includes(i)||(this.log("error","Invalid operator:",s),s="OR"),this.filterGroups.set(t,{filters:new Set(e),operator:i}),this.filterGroups.size>0&&(this.updateFiltersFromGroups(),this.filter(),this.updateURL()),!0}catch(t){return this.log("error","Error adding filter group:",t),!1}}setGroupMode(t){const e=t.toUpperCase();["AND","OR"].includes(e)&&(this.groupMode=e,this.filterGroups.size>0&&this.filter())}removeFilterGroup(t){return!!this.filterGroups.has(t)&&(this.filterGroups.delete(t),0===this.filterGroups.size?this.resetFilters():this.updateFiltersFromGroups(),this.filter(),this.updateURL(),!0)}updateFiltersFromGroups(){if(0!==this.filterGroups.size){this.currentFilters.has("*")||this.currentFilters.clear();for(const t of this.filterGroups.values())t.filters.forEach((t=>{"*"!==t&&this.currentFilters.add(t)}))}}matchesAnyFilter(t){return[...this.currentFilters].some((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}matchesAllFilters(t){return[...this.currentFilters].every((e=>{const[s,i]=e.split(":");return t.has(`${s}:${i}`)}))}showItem(t){this.visibleItems.add(t),t.classList.remove(this.options.hiddenClass),t.style.opacity="0",t.style.transform="scale(0.95)",t.offsetHeight,requestAnimationFrame((()=>{t.style.opacity="1",t.style.transform="scale(1)"}))}hideItem(t){t.style.opacity="0",t.style.transform="scale(0.95)",setTimeout((()=>{"0"===t.style.opacity&&(t.classList.add(this.options.hiddenClass),this.visibleItems.delete(t))}),this.options.animationDuration)}search(t){this.log("debug","Performing search with query:",t),this.currentSearch=t.toLowerCase().trim();let e=0;this.items.forEach((t=>{const s=this.options.searchKeys.map((e=>t.dataset[e]||"")).join(" ").toLowerCase();""===this.currentSearch||s.includes(this.currentSearch)?(this.showItem(t),e++):this.hideItem(t)})),this.updateURL(),this.log("info",`Search complete. Found ${e} matches`),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration)}sortMultiple(t){const e=[...this.items];e.sort(((e,s)=>{for(const i of t){const t=e.dataset[i.key],r=s.dataset[i.key],o="asc"===i.direction?t.localeCompare(r):r.localeCompare(t);if(0!==o)return o}return 0})),e.forEach((t=>this.container.appendChild(t))),this.log("debug","Sorting items by multiple criteria:",t)}addRangeFilter(t,e,s){this.items.forEach((i=>{const r=parseFloat(i.dataset[t]);r>=e&&r<=s?this.showItem(i):this.hideItem(i)})),setTimeout((()=>{this.updateCounter()}),this.options.animationDuration),this.log("debug",`Filtering items by range: ${t} between ${e} and ${s}`)}matchesFilterGroups(t){const e=[...this.filterGroups.values()].map((e=>{const s=[...e.filters];return 0===s.length||("OR"===e.operator?s.some((e=>t.has(e))):s.every((e=>t.has(e))))}));return"OR"===this.groupMode?e.some((t=>t)):e.every((t=>t))}updateURL(){if(this.log("debug","Updating URL"),0===this.currentFilters.size||1===this.currentFilters.size&&this.currentFilters.has("*"))return void window.history.pushState({},"",window.location.pathname);const t=new URLSearchParams(window.location.search);if(this.filterGroups.size>0){for(const[e,s]of this.filterGroups.entries())t.set(`group_${e}`,[...s.filters].join(",")),t.set(`groupOp_${e}`,s.operator.toLowerCase());t.set("groupMode",this.groupMode.toLowerCase())}const e={};for(const t of this.currentFilters)if("*"!==t){const[s,i]=t.split(":");e[s]||(e[s]=new Set),e[s].add(i)}Object.entries(e).forEach((e=>{let[s,i]=e;t.set(s,Array.from(i).join(","))})),this.currentSearch&&t.set("search",this.currentSearch);const s=`${window.location.pathname}${t.toString()?"?"+t.toString():""}`;window.history.pushState({},"",s),this.log("debug","URL updated:",s)}loadFromURL(){this.log("debug","Loading state from URL");const t=new URLSearchParams(window.location.search);this.filterGroups.clear();for(const[e,s]of t.entries())if(e.startsWith("group_")){const i=e.replace("group_",""),r=t.get(`groupOp_${i}`)?.toUpperCase()||"OR",o=s.split(",");this.addFilterGroup(i,o,r)}const e=t.get("groupMode")?.toUpperCase();e&&["AND","OR"].includes(e)&&(this.groupMode=e),this.currentFilters.clear();let s=!1;for(const[e,i]of t.entries())"search"!==e&&(s=!0,i.split(",").forEach((t=>{this.currentFilters.add(`${e}:${t}`)})));s||this.currentFilters.add("*"),this.filterButtons.forEach((t=>{const e=t.dataset.filter;this.currentFilters.has(e)||"*"===e&&this.currentFilters.has("*")?t.classList.add(this.options.activeClass):t.classList.remove(this.options.activeClass)}));const i=t.get("search")||"";this.searchInput&&(this.searchInput.value=i),this.filter(),i&&this.search(i),this.log("info","State loaded from URL")}updateCounter(){const t=this.items.length,e=this.visibleItems.size;return this.counter&&(this.counter.textContent=`Showing ${e} of ${t}`),this.log("debug",`Counter updated: ${e}/${t}`),{total:t,visible:e}}setAnimationOptions(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options.animationDuration=t.duration||this.options.animationDuration,this.options.animationType=t.type||"ease-out",this.addStyles()}addEventSystem(){this.events={},this.on=(t,e)=>{this.events[t]||(this.events[t]=[]),this.events[t].push(e)},this.emit=(t,e)=>{this.events[t]&&this.events[t].forEach((t=>t(e)))}}setPagination(t){this.pagination={currentPage:1,itemsPerPage:t,totalPages:Math.ceil(this.visibleItems.size/t)},this.updatePagination()}updatePagination(){const t=(this.pagination.currentPage-1)*this.pagination.itemsPerPage,e=t+this.pagination.itemsPerPage;[...this.visibleItems].forEach(((s,i)=>{i>=t&&i<e?this.showItem(s):this.hideItem(s)}))}enableAnalytics(t){this.analyticsCallback=t,this.on("filter",(t=>{this.analyticsCallback({type:"filter",filters:[...this.currentFilters],visibleItems:this.visibleItems.size,timestamp:(new Date).toISOString()})}))}sortWithComparator(t,e){const s=[...this.items];s.sort(((s,i)=>{const r=s.dataset[t],o=i.dataset[t];return e(r,o)})),s.forEach((t=>this.container.appendChild(t)))}setResponsiveOptions(t){window.addEventListener("resize",e((()=>{const e=window.innerWidth;for(const[s,i]of Object.entries(t))if(e<=parseInt(s)){Object.assign(this.options,i),this.filter();break}}),250))}enableKeyboardNavigation(){document.addEventListener("keydown",(t=>{"Enter"===t.key&&document.activeElement.classList.contains(this.options.filterButtonSelector.slice(1))&&document.activeElement.click()}))}exportState(){return{filters:[...this.currentFilters],search:this.currentSearch,mode:this.options.filterMode,timestamp:(new Date).toISOString()}}importState(t){t.filters&&(this.currentFilters=new Set(t.filters),this.currentSearch=t.search||"",this.options.filterMode=t.mode||"OR",this.filter(),this.updateURL())}savePreset(t){const e={filters:[...this.currentFilters],search:this.currentSearch,mode:this.options.filterMode};localStorage.setItem(`afs_preset_${t}`,JSON.stringify(e)),this.log("info",`Preset saved: ${t}`)}loadPreset(t){const e=JSON.parse(localStorage.getItem(`afs_preset_${t}`));e&&(this.currentFilters=new Set(e.filters),this.currentSearch=e.search,this.options.filterMode=e.mode,this.filter(),this.updateURL())}setLogic(t){if("boolean"==typeof t)return this.options.filterMode=t?"AND":"OR",void this.filter();const e=t.toUpperCase();["OR","AND"].includes(e)&&(this.options.filterMode=e,this.filter())}setFilterMode(t){["OR","AND"].includes(t.toUpperCase())&&(this.options.filterMode=t.toUpperCase(),this.filter())}addFilter(t,e){this.currentFilters.add(`${t}:${e}`),this.filter(),this.updateURL()}removeFilter(t,e){this.currentFilters.delete(`${t}:${e}`),0===this.currentFilters.size&&this.currentFilters.add("*"),this.filter(),this.updateURL()}getActiveFiltersByType(t){return[...this.currentFilters].filter((e=>e.startsWith(`${t}:`))).map((t=>t.split(":")[1]))}clearAllFilters(){this.currentFilters.clear(),this.currentFilters.add("*"),this.filter(),this.updateURL();document.querySelectorAll('input[type="checkbox"]').forEach((t=>{t.classList.contains(this.options.activeClass)&&(t.checked=!1,t.classList.remove(this.options.activeClass))})),this.filterButtons.forEach((t=>{t.classList.remove(this.options.activeClass)})),this.searchInput&&(this.searchInput.value=""),this.log("info","All filters cleared")}}}));
2
2
  //# sourceMappingURL=AFS.min.js.map