// Provider Enable/Disable Manager class ProviderEnableManager { constructor() { this.enabledStatus = {}; this.currentFilter = 'all'; // 'all', 'enabled', 'disabled' } async init(providers) { this.providers = providers; await this.loadEnabledStatus(); } async loadEnabledStatus() { try { const response = await fetch(`${API_BASE}/api/providers/enabled`); if (!response.ok) { throw new Error(`HTTP ${response.status}`); } const data = await response.json(); this.enabledStatus = data.providers || {}; console.log('Loaded enabled status:', this.enabledStatus); } catch (error) { console.error('Error loading enabled status:', error); // Initialize with defaults (all enabled) this.providers.forEach(p => { this.enabledStatus[p.name] = { enabled: true, source: 'default', can_modify: true }; }); } } isEnabled(providerName) { return this.enabledStatus[providerName]?.enabled !== false; } canModify(providerName) { return this.enabledStatus[providerName]?.can_modify !== false; } getSource(providerName) { return this.enabledStatus[providerName]?.source || 'default'; } async toggleProvider(providerName, newState) { const statusInfo = this.enabledStatus[providerName]; if (!statusInfo?.can_modify) { showAlert('error', `Cannot modify ${providerName} - controlled by ${statusInfo?.source || 'external source'}`); return false; } try { const response = await fetch(`${API_BASE}/api/providers/${providerName}/enabled`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ enabled: newState }) }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || 'Failed to update status'); } const result = await response.json(); // Update local status this.enabledStatus[providerName] = { enabled: newState, source: result.source || 'file', can_modify: true }; return true; } catch (error) { console.error('Error toggling provider:', error); showAlert('error', `Failed to ${newState ? 'enable' : 'disable'} ${providerName}: ${error.message}`); return false; } } setFilter(filter) { this.currentFilter = filter; this.applyFilter(); } applyFilter() { const cards = document.querySelectorAll('.provider-card'); let visibleCount = 0; cards.forEach(card => { const providerName = card.dataset.provider; const isEnabled = this.isEnabled(providerName); let shouldShow = false; switch (this.currentFilter) { case 'all': shouldShow = true; break; case 'enabled': shouldShow = isEnabled; break; case 'disabled': shouldShow = !isEnabled; break; } if (shouldShow) { card.style.display = ''; visibleCount++; } else { card.style.display = 'none'; } }); // Update filter info this.updateFilterInfo(visibleCount); } updateFilterInfo(visibleCount) { const filterInfo = document.querySelector('.filter-info'); if (filterInfo) { const totalEnabled = Object.values(this.enabledStatus).filter(s => s.enabled).length; const totalDisabled = Object.values(this.enabledStatus).filter(s => !s.enabled).length; let infoText = ''; switch (this.currentFilter) { case 'all': infoText = `Showing all ${visibleCount} providers (${totalEnabled} enabled, ${totalDisabled} disabled)`; break; case 'enabled': infoText = `Showing ${visibleCount} enabled providers`; break; case 'disabled': infoText = `Showing ${visibleCount} disabled providers`; break; } filterInfo.innerHTML = infoText; } } shouldShowInTab(providerName, tabId) { // In credentials tab, show all (enabled and disabled) if (tabId === 'credentials') { return true; } // In other tabs (proxy, epg-mapping), only show enabled return this.isEnabled(providerName); } getFilteredProviders(tabId) { if (!this.providers) return []; return this.providers.filter(provider => this.shouldShowInTab(provider.name, tabId) ); } } // Create global instance window.providerEnableManager = new ProviderEnableManager(); // Add filter UI to credentials tab function addFilterUI() { const credentialsTab = document.getElementById('tab-credentials'); const cardBody = credentialsTab.querySelector('.card-body'); // Check if filter already exists if (document.querySelector('.filter-section')) { return; } const filterHTML = `