()
| 5306 | } |
| 5307 | |
| 5308 | async function saveSettings() { |
| 5309 | const values = {}; |
| 5310 | document.querySelectorAll("[data-env-key]").forEach((input) => { |
| 5311 | values[input.dataset.envKey] = input.value; |
| 5312 | }); |
| 5313 | if ($("maxConcurrencyInput")) { |
| 5314 | values.PAPERFLOW_MAX_CONCURRENCY = $("maxConcurrencyInput").value; |
| 5315 | } |
| 5316 | if ($("fallbackModelInput")) { |
| 5317 | values.PAPERFLOW_FALLBACK_LLM_MODEL = $("fallbackModelInput").value; |
| 5318 | } |
| 5319 | values.PAPERFLOW_DEFAULT_ARXIV_CATEGORIES = Array.from($("settingArxivCategories").querySelectorAll("span")).map((item) => item.textContent.trim()).filter(Boolean).join(","); |
| 5320 | values.PAPERFLOW_DEFAULT_CONFERENCES = selectedSettingConferences().join(","); |
| 5321 | values.PAPERFLOW_CUSTOM_RSS_URLS = rssUrls().filter((url) => url !== ui().settings.customRssMissing).join(","); |
| 5322 | values.PAPERFLOW_ENABLE_ARXIV = String($("settingEnableArxiv").checked); |
| 5323 | values.PAPERFLOW_ENABLE_SEMANTIC_SCHOLAR = String($("settingEnableSemanticScholar").checked); |
| 5324 | values.PAPERFLOW_ENABLE_OPENREVIEW = String($("settingEnableOpenReview").checked); |
| 5325 | values.PAPERFLOW_ENABLE_CUSTOM_RSS = String($("settingEnableCustomRss").checked); |
| 5326 | values.PAPERFLOW_CONFERENCE_ACCESS_MODE = document.querySelector('input[name="conferenceAccessMode"]:checked')?.value || "public"; |
| 5327 | values.PAPERFLOW_REPORT_STYLE = document.querySelector("[data-pref-mode].active")?.dataset.prefMode || "standard"; |
| 5328 | values.PAPERFLOW_WRITE_FEISHU = String($("writeFeishuReports").checked || $("directWriteFeishu").checked || $("directPdfWriteFeishu").checked); |
| 5329 | values.PAPERFLOW_WIKI_INGEST = String($("wikiIngestSetting").checked); |
| 5330 | values.PAPERFLOW_READING_NOTES_GIT_LLM_REVIEW = String($("notesGitLlmReviewSetting")?.checked !== false); |
| 5331 | values.PAPERFLOW_DAILY_LIMIT = $("dailyLimitInput").value; |
| 5332 | values.PAPERFLOW_RELEVANCE_THRESHOLD = $("relevanceThreshold").value; |
| 5333 | values.HTTP_PROXY = $("proxyInput").value; |
| 5334 | values.HTTPS_PROXY = $("proxyInput").value; |
| 5335 | const data = await api("/api/settings", { method: "POST", body: JSON.stringify({ values }) }); |
| 5336 | renderSettings(data); |
| 5337 | state.reports = []; |
| 5338 | state.currentReport = null; |
| 5339 | state.wikiNodes = []; |
| 5340 | state.wikiGraph = null; |
| 5341 | state.wikiMap = null; |
| 5342 | state.currentWikiNodeId = ""; |
| 5343 | state.currentWikiEditNodeId = ""; |
| 5344 | if ($("wikiQuery")) $("wikiQuery").value = ""; |
| 5345 | if (state.currentView === "wiki") { |
| 5346 | await loadWiki(); |
| 5347 | } else if (state.currentView === "reports") { |
| 5348 | await refreshReports({ keepSelection: false }); |
| 5349 | } |
| 5350 | showSettingsMessage(ui().settings.settingsSavedMessage); |
| 5351 | showFeedbackToast("success", ui().settings.save, ui().settings.settingsSavedToast); |
| 5352 | } |
| 5353 | |
| 5354 | function joinPath(base, suffix) { |
| 5355 | const root = String(base || "").trim().replace(/[\\/]+$/, ""); |
nothing calls this directly
no test coverage detected