import { api } from '../../lib/api.mjs'; const UNITS = ['ft', 'ea', 'box', 'roll', 'pair', 'bag', 'lb', 'gal', 'pkg']; class MaterialForm extends HTMLElement { #onSave = null; connectedCallback() { if (!this.shadowRoot) { this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = ``; } } open(material, onSave) { this.#onSave = onSave; const isEdit = !!material; const d = this.shadowRoot.querySelector('dialog'); d.innerHTML = `
${isEdit ? 'Edit Material' : 'Add Material'}
${isEdit ? `
Active
` : ''}
`; if (window.lucide) lucide.createIcons({ root: d }); d.querySelector('#dlg-close').addEventListener('click', () => d.close()); d.querySelector('#dlg-cancel').addEventListener('click', () => d.close()); d.querySelector('#dlg-save').addEventListener('click', async () => { const name = d.querySelector('#m-name').value.trim(); const errEl = d.querySelector('#form-error'); if (!name) { errEl.textContent = 'Name is required'; d.querySelector('#m-name').focus(); return; } errEl.textContent = ''; const saveBtn = d.querySelector('#dlg-save'); saveBtn.disabled = true; saveBtn.textContent = 'Saving…'; const payload = { name, unit: d.querySelector('#m-unit').value, part_number: d.querySelector('#m-part').value.trim(), active: isEdit ? d.querySelector('#m-active').checked : true, }; try { if (isEdit) await api.put(`/registry/materials/${material.id}`, payload); else await api.post('/registry/materials', payload); d.close(); window.dispatchEvent(new CustomEvent('wo:toast', { detail: { message: isEdit ? 'Material updated' : 'Material added', type: 'success' } })); this.#onSave?.(); } catch (err) { errEl.textContent = err.message; saveBtn.disabled = false; saveBtn.textContent = isEdit ? 'Save Changes' : 'Add Material'; } }); d.showModal(); d.querySelector('#m-name').focus(); } #esc(s) { return (s || '').replace(/&/g,'&').replace(//g,'>'); } } customElements.define('material-form', MaterialForm);