Add OpenAI key save and test controls
This commit is contained in:
+32
-4
@@ -80,11 +80,13 @@ $("#adminSoundRepeat").addEventListener("change", (event) => {
|
||||
$("#adminSoundTest").addEventListener("click", () => {
|
||||
playNotifySound({ ignoreMuted: true });
|
||||
});
|
||||
$("#translationEnabled").addEventListener("change", saveTranslationSettings);
|
||||
$("#operatorLanguage").addEventListener("change", saveTranslationSettings);
|
||||
$("#translationModel").addEventListener("change", saveTranslationSettings);
|
||||
$("#openaiApiKey").addEventListener("change", saveTranslationSettings);
|
||||
$("#translationEnabled").addEventListener("change", markAiSettingsDirty);
|
||||
$("#operatorLanguage").addEventListener("change", markAiSettingsDirty);
|
||||
$("#translationModel").addEventListener("change", markAiSettingsDirty);
|
||||
$("#openaiApiKey").addEventListener("input", markAiSettingsDirty);
|
||||
$("#refreshAiModels").addEventListener("click", loadAiModels);
|
||||
$("#saveAiSettings").addEventListener("click", saveTranslationSettings);
|
||||
$("#testOpenAiKey").addEventListener("click", testOpenAiKey);
|
||||
document.querySelectorAll("[data-settings-tab]").forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
const tab = button.dataset.settingsTab;
|
||||
@@ -403,6 +405,7 @@ function renderSite() {
|
||||
|
||||
async function saveTranslationSettings() {
|
||||
if (!state.site) return;
|
||||
setOpenAiStatus("Ukladam AI nastaveni...");
|
||||
const settings = structuredClone(state.site.settings);
|
||||
settings.translations = {
|
||||
...(settings.translations || {}),
|
||||
@@ -414,9 +417,34 @@ async function saveTranslationSettings() {
|
||||
if (apiKey) settings.translations.openaiApiKey = apiKey;
|
||||
await saveSite({ settings, isOnline: state.site.isOnline });
|
||||
$("#openaiApiKey").value = "";
|
||||
setOpenAiStatus(state.site.settings.translations?.hasOpenaiApiKey
|
||||
? `Klic ulozeny (${state.site.settings.translations.openaiApiKeyMasked || "sk-..."})`
|
||||
: "Klic neni ulozeny. Bez nej AI preklady nepobezi.");
|
||||
await loadAiModels().catch(() => {});
|
||||
}
|
||||
|
||||
function markAiSettingsDirty() {
|
||||
setOpenAiStatus("AI nastaveni ma neulozene zmeny.");
|
||||
}
|
||||
|
||||
async function testOpenAiKey() {
|
||||
setOpenAiStatus("Testuji OpenAI klic...");
|
||||
const result = await api("/api/admin/ai/test", { method: "POST" }).catch((error) => error);
|
||||
if (result?.ok) {
|
||||
setOpenAiStatus(`Klic funguje (${result.key || "sk-..."}), dostupnych modelu: ${result.modelCount}.`);
|
||||
await loadAiModels().catch(() => {});
|
||||
return;
|
||||
}
|
||||
const message = result?.error === "missing_openai_api_key"
|
||||
? "Klic neni ulozeny. Nejdřív ho vloz a klikni na Ulozit AI nastaveni."
|
||||
: `Test selhal (${result?.error || "neznamá chyba"}).`;
|
||||
setOpenAiStatus(message);
|
||||
}
|
||||
|
||||
function setOpenAiStatus(message) {
|
||||
$("#openaiApiKeyStatus").textContent = message;
|
||||
}
|
||||
|
||||
async function loadAiModels() {
|
||||
const current = $("#translationModel").value || state.site?.settings?.translations?.model || "gpt-5-mini";
|
||||
const data = await api("/api/admin/ai/models").catch((error) => error?.models ? error : null);
|
||||
|
||||
Reference in New Issue
Block a user