(function attachSidepanelLuckmailManager(globalScope) { function createLuckmailManager(context = {}) { const { dom, helpers, runtime, constants = {}, } = context; const copyIcon = constants.copyIcon || ''; let renderedPurchases = []; let selectedPurchaseIds = new Set(); let searchTerm = ''; let filterMode = 'all'; let refreshQueued = false; function normalizeLuckmailSearchText(value) { return String(value || '').trim().toLowerCase(); } function getFilteredLuckmailPurchases(purchases = renderedPurchases) { const normalizedSearchTerm = normalizeLuckmailSearchText(searchTerm); return (Array.isArray(purchases) ? purchases : []).filter((purchase) => { const matchesFilter = (() => { switch (filterMode) { case 'reusable': return Boolean(purchase.reusable); case 'used': return Boolean(purchase.used); case 'unused': return !purchase.used; case 'preserved': return Boolean(purchase.preserved); case 'disabled': return Boolean(purchase.disabled); default: return true; } })(); if (!matchesFilter) return false; if (!normalizedSearchTerm) return true; const haystack = [ purchase.email_address, purchase.project_name, purchase.tag_name, purchase.used ? '已用 used' : '未用 unused', purchase.preserved ? '保留 preserved' : '', purchase.disabled ? '已禁用 disabled' : '', purchase.reusable ? '可复用 reusable' : '', ].join(' ').toLowerCase(); return haystack.includes(normalizedSearchTerm); }); } function pruneLuckmailSelection(purchases = renderedPurchases) { const existingIds = new Set((Array.isArray(purchases) ? purchases : []).map((purchase) => String(purchase.id))); selectedPurchaseIds = new Set([...selectedPurchaseIds].filter((id) => existingIds.has(id))); } function updateLuckmailBulkUI(visiblePurchases = getFilteredLuckmailPurchases()) { if (!dom.checkboxLuckmailSelectAll || !dom.luckmailSelectionSummary) { return; } const visibleIds = visiblePurchases.map((purchase) => String(purchase.id)); const selectedVisibleCount = visibleIds.filter((id) => selectedPurchaseIds.has(id)).length; const hasVisible = visibleIds.length > 0; const hasSelection = selectedPurchaseIds.size > 0; dom.checkboxLuckmailSelectAll.checked = hasVisible && selectedVisibleCount === visibleIds.length; dom.checkboxLuckmailSelectAll.indeterminate = selectedVisibleCount > 0 && selectedVisibleCount < visibleIds.length; dom.checkboxLuckmailSelectAll.disabled = !hasVisible; dom.luckmailSelectionSummary.textContent = `已选 ${selectedPurchaseIds.size} 个(当前显示 ${visibleIds.length} 个)`; if (dom.btnLuckmailBulkUsed) dom.btnLuckmailBulkUsed.disabled = !hasSelection; if (dom.btnLuckmailBulkUnused) dom.btnLuckmailBulkUnused.disabled = !hasSelection; if (dom.btnLuckmailBulkPreserve) dom.btnLuckmailBulkPreserve.disabled = !hasSelection; if (dom.btnLuckmailBulkUnpreserve) dom.btnLuckmailBulkUnpreserve.disabled = !hasSelection; if (dom.btnLuckmailBulkDisable) dom.btnLuckmailBulkDisable.disabled = !hasSelection; if (dom.btnLuckmailBulkEnable) dom.btnLuckmailBulkEnable.disabled = !hasSelection; } function setLuckmailLoadingState(loading, summary = '') { if (dom.btnLuckmailRefresh) dom.btnLuckmailRefresh.disabled = loading; if (dom.btnLuckmailDisableUsed) dom.btnLuckmailDisableUsed.disabled = loading; if (dom.inputLuckmailSearch) dom.inputLuckmailSearch.disabled = loading; if (dom.selectLuckmailFilter) dom.selectLuckmailFilter.disabled = loading; if (dom.checkboxLuckmailSelectAll) dom.checkboxLuckmailSelectAll.disabled = loading || getFilteredLuckmailPurchases().length === 0; if (dom.btnLuckmailBulkUsed) dom.btnLuckmailBulkUsed.disabled = loading || selectedPurchaseIds.size === 0; if (dom.btnLuckmailBulkUnused) dom.btnLuckmailBulkUnused.disabled = loading || selectedPurchaseIds.size === 0; if (dom.btnLuckmailBulkPreserve) dom.btnLuckmailBulkPreserve.disabled = loading || selectedPurchaseIds.size === 0; if (dom.btnLuckmailBulkUnpreserve) dom.btnLuckmailBulkUnpreserve.disabled = loading || selectedPurchaseIds.size === 0; if (dom.btnLuckmailBulkDisable) dom.btnLuckmailBulkDisable.disabled = loading || selectedPurchaseIds.size === 0; if (dom.btnLuckmailBulkEnable) dom.btnLuckmailBulkEnable.disabled = loading || selectedPurchaseIds.size === 0; if (summary && dom.luckmailSummary) { dom.luckmailSummary.textContent = summary; } } function renderLuckmailPurchases(purchases = renderedPurchases) { if (!dom.luckmailList || !dom.luckmailSummary) return; renderedPurchases = Array.isArray(purchases) ? purchases : []; pruneLuckmailSelection(renderedPurchases); dom.luckmailList.innerHTML = ''; if (!renderedPurchases.length) { selectedPurchaseIds.clear(); dom.luckmailList.innerHTML = '