/* ============================================================
KODILA — Admin: Temeljne postavitve
============================================================ */
const EMPTY_SETTINGS = {
mail_host: '', mail_port: '', mail_encryption: 'tls', mail_username: '', mail_password: '',
mail_from_address: '', mail_from_name: '',
ai_model: '', ai_api_key: '',
erp_api_endpoint: '', erp_api_key: '',
company_city: '', company_country: '',
};
function SecretField({ label, isSet, value, onChange, placeholder }) {
const [editing, setEditing] = useState(false);
if (!editing) {
return (
{isSet ? 'Nastavljeno' : 'Ni nastavljeno'}
);
}
return (
onChange(e.target.value)} />
);
}
function TemeljnePostavitve() {
const toast = useToast();
const [form, setForm] = useState(EMPTY_SETTINGS);
const [flags, setFlags] = useState({ mail_password_set: false, ai_api_key_set: false, erp_api_key_set: false });
const [loading, setLoading] = useState(true);
const [saving, setSaving] = useState(false);
const [errors, setErrors] = useState({});
const [testTo, setTestTo] = useState('');
const [testing, setTesting] = useState(false);
const set = (k, v) => setForm(s => ({ ...s, [k]: v }));
const load = async () => {
setLoading(true);
const { ok, data } = await api('/api/settings');
if (ok) {
const s = data.settings;
setForm(f => ({
...f,
mail_host: s.mail_host || '', mail_port: s.mail_port || '', mail_encryption: s.mail_encryption || 'tls',
mail_username: s.mail_username || '', mail_from_address: s.mail_from_address || '', mail_from_name: s.mail_from_name || '',
ai_model: s.ai_model || '', erp_api_endpoint: s.erp_api_endpoint || '',
company_city: s.company_city || '', company_country: s.company_country || '',
}));
setFlags({ mail_password_set: s.mail_password_set, ai_api_key_set: s.ai_api_key_set, erp_api_key_set: s.erp_api_key_set });
} else {
toast('Nastavitev ni bilo mogoče naložiti.', 'alert');
}
setLoading(false);
};
useEffect(() => { load(); }, []);
const save = async () => {
setSaving(true);
setErrors({});
const { ok, data } = await api('/api/settings', { method: 'PUT', body: JSON.stringify(form) });
setSaving(false);
if (!ok) {
setErrors(data.errors || {});
toast('Shranjevanje ni uspelo — preveri polja.', 'alert');
return;
}
toast('Nastavitve shranjene', 'check');
set('mail_password', ''); set('ai_api_key', ''); set('erp_api_key', '');
setFlags({
mail_password_set: data.settings.mail_password_set,
ai_api_key_set: data.settings.ai_api_key_set,
erp_api_key_set: data.settings.erp_api_key_set,
});
};
const testMail = async () => {
setTesting(true);
const { ok, data } = await api('/api/settings/test-mail', { method: 'POST', body: JSON.stringify({ to: testTo || undefined }) });
setTesting(false);
if (!ok) {
const msg = data.error === 'mail_not_configured'
? 'Najprej vnesi in shrani strežnik ter vrata.'
: (data.message || 'Pošiljanje testnega sporočila ni uspelo.');
toast(msg, 'alert');
return;
}
toast('Testno sporočilo poslano na ' + data.sent_to, 'send');
};
const fieldError = (field) => {
const codes = errors[field];
return codes && codes.length ? codes.join(', ') : null;
};
if (loading) return Nalaganje …
;
return (
Poštni strežnik (SMTP)
set('mail_host', e.target.value)} placeholder="smtp.kodila.si" />
set('mail_port', e.target.value)} placeholder="587"
style={fieldError('mail_port') ? { borderColor: 'var(--danger)' } : null} />
set('mail_username', e.target.value)} placeholder="intranet@kodila.si" />
set('mail_password', v)} placeholder="Novo geslo strežnika" />
set('mail_from_address', e.target.value)} placeholder="intranet@kodila.si"
style={fieldError('mail_from_address') ? { borderColor: 'var(--danger)' } : null} />
set('mail_from_name', e.target.value)} placeholder="KODILA Intranet" />
AI model
set('ai_model', e.target.value)} placeholder="npr. claude-sonnet-4-6" />
set('ai_api_key', v)} placeholder="sk-…" />
ERP povezava
set('erp_api_endpoint', e.target.value)} placeholder="https://erp.kodila.si/api"
style={fieldError('erp_api_endpoint') ? { borderColor: 'var(--danger)' } : null} />
set('erp_api_key', v)} placeholder="API ključ ERP sistema" />
Lokacija sedeža podjetja
set('company_city', e.target.value)} placeholder="npr. Murska Sobota" />
set('company_country', e.target.value)} placeholder="npr. Slovenija" />
);
}
Object.assign(window, { TemeljnePostavitve });