// app/modules/loyalty/static/store/js/loyalty-cards.js // noqa: js-006 - async init pattern is safe, loadData has try/catch const loyaltyCardsLog = window.LogConfig.loggers.loyaltyCards || window.LogConfig.createLogger('loyaltyCards'); function storeLoyaltyCards() { return { ...data(), currentPage: 'cards', // Data cards: [], program: null, stats: { total_cards: 0, active_cards: 0, new_this_month: 0, total_points_balance: 0 }, // Filters filters: { search: '', status: '' }, // Pagination pagination: { page: 1, per_page: 20, total: 0, pages: 0 }, // State loading: false, error: null, async init() { loyaltyCardsLog.info('=== LOYALTY CARDS PAGE INITIALIZING ==='); if (window._loyaltyCardsInitialized) return; window._loyaltyCardsInitialized = true; // IMPORTANT: Call parent init first to set storeCode from URL const parentInit = data().init; if (parentInit) { await parentInit.call(this); } if (window.PlatformSettings) { this.pagination.per_page = await window.PlatformSettings.getRowsPerPage(); } await this.loadData(); loyaltyCardsLog.info('=== LOYALTY CARDS PAGE INITIALIZATION COMPLETE ==='); }, async loadData() { this.loading = true; this.error = null; try { await this.loadProgram(); if (this.program) { await Promise.all([this.loadCards(), this.loadStats()]); } } catch (error) { loyaltyCardsLog.error('Failed to load data:', error); this.error = error.message; } finally { this.loading = false; } }, async loadProgram() { try { const response = await apiClient.get('/store/loyalty/program'); if (response) this.program = response; } catch (error) { if (error.status !== 404) throw error; } }, async loadCards() { const params = new URLSearchParams(); params.append('skip', (this.pagination.page - 1) * this.pagination.per_page); params.append('limit', this.pagination.per_page); if (this.filters.search) params.append('search', this.filters.search); if (this.filters.status) params.append('is_active', this.filters.status === 'active'); const response = await apiClient.get(`/store/loyalty/cards?${params}`); if (response) { this.cards = response.cards || []; this.pagination.total = response.total || 0; this.pagination.pages = Math.ceil(this.pagination.total / this.pagination.per_page); } }, async loadStats() { try { const response = await apiClient.get('/store/loyalty/stats'); if (response) { this.stats = { total_cards: response.total_cards || 0, active_cards: response.active_cards || 0, new_this_month: response.new_this_month || 0, total_points_balance: response.total_points_balance || 0 }; } } catch (error) { loyaltyCardsLog.warn('Failed to load stats:', error.message); } }, debouncedSearch() { if (this._searchTimeout) clearTimeout(this._searchTimeout); this._searchTimeout = setTimeout(() => { this.pagination.page = 1; this.loadCards(); }, 300); }, applyFilter() { this.pagination.page = 1; this.loadCards(); }, get totalPages() { return this.pagination.pages; }, get startIndex() { return this.pagination.total === 0 ? 0 : (this.pagination.page - 1) * this.pagination.per_page + 1; }, get endIndex() { const end = this.pagination.page * this.pagination.per_page; return end > this.pagination.total ? this.pagination.total : end; }, get pageNumbers() { const pages = []; const total = this.totalPages; const current = this.pagination.page; if (total <= 7) { for (let i = 1; i <= total; i++) pages.push(i); } else { pages.push(1); if (current > 3) pages.push('...'); const start = Math.max(2, current - 1); const end = Math.min(total - 1, current + 1); for (let i = start; i <= end; i++) pages.push(i); if (current < total - 2) pages.push('...'); pages.push(total); } return pages; }, previousPage() { if (this.pagination.page > 1) { this.pagination.page--; this.loadCards(); } }, nextPage() { if (this.pagination.page < this.totalPages) { this.pagination.page++; this.loadCards(); } }, goToPage(num) { if (num !== '...' && num >= 1 && num <= this.totalPages) { this.pagination.page = num; this.loadCards(); } }, formatNumber(num) { return num == null ? '0' : new Intl.NumberFormat('en-US').format(num); }, formatDate(dateString) { if (!dateString) return 'Never'; try { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); } catch (e) { return dateString; } } }; } if (!window.LogConfig.loggers.loyaltyCards) { window.LogConfig.loggers.loyaltyCards = window.LogConfig.createLogger('loyaltyCards'); } loyaltyCardsLog.info('Loyalty cards module loaded');