import * as api from '../api.js'; import { showModal } from '../components/modal.js'; const el = () => document.getElementById('page-mappings'); export async function initMappings() { el().innerHTML = `

App Mappings

Map process names, window titles, or URLs to categories
`; document.getElementById('btn-new-mapping').addEventListener('click', () => showMappingForm()); await loadMappings(); } async function loadMappings() { try { const mappings = await api.mappings.list(); const container = document.getElementById('mapping-list'); if (!mappings || !mappings.length) { container.innerHTML = `
No mappings configured
`; return; } container.innerHTML = ` ${mappings.map(m => ` `).join('')}
PatternMatch TypeCategoryFriendly NameActions
${esc(m.pattern)} ${m.matchType} ${esc(m.category)} ${esc(m.friendlyName) || '-'}
`; container.querySelectorAll('[data-edit]').forEach(btn => { btn.addEventListener('click', () => { const m = mappings.find(x => x.id === parseInt(btn.dataset.edit)); if (m) showMappingForm(m); }); }); container.querySelectorAll('[data-delete]').forEach(btn => { btn.addEventListener('click', () => confirmDelete(parseInt(btn.dataset.delete))); }); } catch (e) { document.getElementById('mapping-list').innerHTML = `
Failed to load mappings
`; } } function showMappingForm(existing = null) { const title = existing ? 'Edit Mapping' : 'New Mapping'; showModal(title, `
`, [ { label: 'Cancel', onClick: () => {} }, { label: existing ? 'Save' : 'Create', cls: 'btn-primary', onClick: async (modal) => { const pattern = modal.querySelector('#map-pattern').value.trim(); const matchType = modal.querySelector('#map-match-type').value; const category = modal.querySelector('#map-category').value.trim(); const friendlyName = modal.querySelector('#map-friendly').value.trim() || null; if (!pattern || !category) { alert('Pattern and Category are required'); throw new Error('cancel'); } const body = { pattern, matchType, category, friendlyName }; if (existing) await api.mappings.update(existing.id, body); else await api.mappings.create(body); loadMappings(); }, }, ]); setTimeout(() => document.getElementById('map-pattern')?.focus(), 100); } function confirmDelete(id) { showModal('Delete Mapping', `

Are you sure you want to delete this mapping?

`, [ { label: 'Cancel', onClick: () => {} }, { label: 'Delete', cls: 'btn-danger', onClick: async () => { await api.mappings.remove(id); loadMappings(); }, }, ]); } function esc(str) { if (!str) return ''; const d = document.createElement('div'); d.textContent = str; return d.innerHTML; }