/* global React, Card, Button, Input, Ic, VS */ // Zakładka "Maile" — admin-only. // Lista odbiorców raportów (tabela vibrostore_contacts). // Pojawiają się w pop-upie po kliknięciu "Wyślij raport mailem". function MaileScreen() { const role = VS.getRole(); const isAdmin = role === 'admin'; if (!isAdmin) { return (
Maile
Dostęp tylko dla administratora.
); } const [list, setList] = React.useState(null); const [err, setErr] = React.useState(''); const [msg, setMsg] = React.useState(''); const [showAdd, setShowAdd] = React.useState(false); const [nName, setNName] = React.useState(''); const [nEmail, setNEmail] = React.useState(''); const [nRole, setNRole] = React.useState(''); const [adding, setAdding] = React.useState(false); const load = React.useCallback(() => { VS.contacts() .then(r => setList(r || [])) .catch(e => setErr(e.message)); }, []); React.useEffect(() => { load(); }, [load]); function flash(text) { setMsg(text); setTimeout(() => setMsg(''), 2200); } async function add() { if (!nName.trim() || !nEmail.trim()) { flash('Nazwa i e-mail wymagane'); return; } setAdding(true); try { await VS.addContact({ name: nName.trim(), email: nEmail.trim(), role: nRole.trim() }); setNName(''); setNEmail(''); setNRole(''); setShowAdd(false); load(); flash('Dodano odbiorcę.'); } catch (e) { flash('Błąd: ' + e.message); } finally { setAdding(false); } } async function remove(c) { if (!confirm(`Usunąć "${c.name}"?`)) return; try { await VS.deleteContact(c.id); load(); flash('Usunięto.'); } catch (e) { flash('Błąd: ' + e.message); } } return (
Administracja

Maile

Lista odbiorców raportów. Pojawia się w pop-upie po kliknięciu „Wyślij raport mailem".
{list ? `${list.length} kontaktów` : ''}
{showAdd && (
Dodaj odbiorcę
Imię i nazwisko / Firma
setNName(e.target.value)} placeholder="Jan Kowalski" />
E-mail
setNEmail(e.target.value)} placeholder="email@firma.pl" />
Notatka / rola
setNRole(e.target.value)} placeholder="np. utrzymanie ruchu" />
{msg && {msg}}
)} {err && (
{err}
)} {!err && !list &&
Ładowanie…
} {!err && list && list.length === 0 && (
Brak odbiorców. Dodaj pierwszego, by mogli pojawić się w pop-upie wysyłki raportu.
)} {!err && list && list.length > 0 && (
Nazwa
E-mail
Notatka
Akcje
{list.map((c, i) => ( remove(c)} /> ))}
)} {!showAdd && msg && ( {msg} )}
); } function ContactRow({ item, last, onChange, onRemove }) { const [editing, setEditing] = React.useState(false); const [name, setName] = React.useState(item.name || ''); const [email, setEmail] = React.useState(item.email || ''); const [role, setRole] = React.useState(item.role || ''); const [busy, setBusy] = React.useState(false); const [msg, setMsg] = React.useState(''); React.useEffect(() => { setName(item.name || ''); setEmail(item.email || ''); setRole(item.role || ''); }, [item.id, item.name, item.email, item.role]); async function save() { setBusy(true); setMsg(''); try { await VS.updateContact(item.id, { name, email, role }); setEditing(false); onChange && onChange(); } catch (e) { setMsg('Błąd: ' + e.message); } finally { setBusy(false); } } if (!editing) { return (
{item.name}
{item.email}
{item.role || '—'}
); } return (
setName(e.target.value)} placeholder="Nazwa" /> setEmail(e.target.value)} placeholder="email" /> setRole(e.target.value)} placeholder="notatka" />
{msg && {msg}}
); } Object.assign(window, { MaileScreen });