// app/modules/loyalty/static/store/js/loyalty-card-detail.js // noqa: js-006 - async init pattern is safe, loadData has try/catch const loyaltyCardDetailLog = window.LogConfig.loggers.loyaltyCardDetail || window.LogConfig.createLogger('loyaltyCardDetail'); function storeLoyaltyCardDetail() { return { ...data(), currentPage: 'cards', cardId: null, card: null, transactions: [], txPagination: { page: 1, perPage: 20, total: 0, pages: 0 }, loading: false, error: null, async init() { loyaltyCardDetailLog.info('=== LOYALTY CARD DETAIL PAGE INITIALIZING ==='); if (window._loyaltyCardDetailInitialized) return; window._loyaltyCardDetailInitialized = true; // IMPORTANT: Call parent init first to set storeCode from URL const parentInit = data().init; if (parentInit) { await parentInit.call(this); } // Extract card ID from URL const pathParts = window.location.pathname.split('/'); const cardsIndex = pathParts.indexOf('cards'); if (cardsIndex !== -1 && pathParts[cardsIndex + 1]) { this.cardId = parseInt(pathParts[cardsIndex + 1]); } if (!this.cardId) { this.error = 'Invalid card ID'; return; } // Use platform pagination setting if available if (window.PlatformSettings) { try { this.txPagination.perPage = await window.PlatformSettings.getRowsPerPage(); } catch (e) { /* use default */ } } await this.loadData(); loyaltyCardDetailLog.info('=== LOYALTY CARD DETAIL PAGE INITIALIZATION COMPLETE ==='); }, async loadData() { this.loading = true; this.error = null; try { await Promise.all([ this.loadCard(), this.loadTransactions() ]); } catch (error) { loyaltyCardDetailLog.error('Failed to load data:', error); this.error = error.message; } finally { this.loading = false; } }, async loadCard() { const response = await apiClient.get(`/store/loyalty/cards/${this.cardId}`); if (response) { this.card = response; loyaltyCardDetailLog.info('Card loaded:', this.card.card_number); } }, async loadTransactions(page = 1) { try { const skip = (page - 1) * this.txPagination.perPage; const response = await apiClient.get( `/store/loyalty/cards/${this.cardId}/transactions?skip=${skip}&limit=${this.txPagination.perPage}` ); if (response && response.transactions) { this.transactions = response.transactions; this.txPagination.total = response.total || 0; this.txPagination.page = page; this.txPagination.pages = Math.ceil(this.txPagination.total / this.txPagination.perPage); loyaltyCardDetailLog.info(`Loaded ${this.transactions.length} of ${this.txPagination.total} transactions (page ${page})`); } } catch (error) { loyaltyCardDetailLog.warn('Failed to load transactions:', error.message); } }, txPreviousPage() { if (this.txPagination.page > 1) this.loadTransactions(this.txPagination.page - 1); }, txNextPage() { if (this.txPagination.page < this.txPagination.pages) this.loadTransactions(this.txPagination.page + 1); }, formatNumber(num) { return num == null ? '0' : new Intl.NumberFormat('en-US').format(num); }, formatDate(dateString) { if (!dateString) return '-'; try { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); } catch (e) { return dateString; } }, formatDateTime(dateString) { if (!dateString) return '-'; try { return new Date(dateString).toLocaleString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }); } catch (e) { return dateString; } } }; } if (!window.LogConfig.loggers.loyaltyCardDetail) { window.LogConfig.loggers.loyaltyCardDetail = window.LogConfig.createLogger('loyaltyCardDetail'); } loyaltyCardDetailLog.info('Loyalty card detail module loaded');