summaryrefslogtreecommitdiff
path: root/client/simple/src/js/main/preferences.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client/simple/src/js/main/preferences.ts')
-rw-r--r--client/simple/src/js/main/preferences.ts71
1 files changed, 71 insertions, 0 deletions
diff --git a/client/simple/src/js/main/preferences.ts b/client/simple/src/js/main/preferences.ts
new file mode 100644
index 000000000..6c66018a6
--- /dev/null
+++ b/client/simple/src/js/main/preferences.ts
@@ -0,0 +1,71 @@
+import { searxng } from "./00_toolkit.ts";
+
+const loadEngineDescriptions = async (): Promise<void> => {
+ let engineDescriptions: Record<string, [string, string]> | null = null;
+ try {
+ const res = await searxng.http("GET", "engine_descriptions.json");
+ engineDescriptions = await res.json();
+ } catch (error) {
+ console.error("Error fetching engineDescriptions:", error);
+ }
+ if (!engineDescriptions) return;
+
+ for (const [engine_name, [description, source]] of Object.entries(engineDescriptions)) {
+ const elements = document.querySelectorAll<HTMLElement>(`[data-engine-name="${engine_name}"] .engine-description`);
+ const sourceText = ` (<i>${searxng.settings.translations?.Source}:&nbsp;${source}</i>)`;
+
+ for (const element of elements) {
+ element.innerHTML = description + sourceText;
+ }
+ }
+};
+
+const toggleEngines = (enable: boolean, engineToggles: NodeListOf<HTMLInputElement>): void => {
+ for (const engineToggle of engineToggles) {
+ // check if element visible, so that only engines of the current category are modified
+ if (engineToggle.offsetParent) {
+ engineToggle.checked = !enable;
+ }
+ }
+};
+
+searxng.ready(
+ () => {
+ const engineElements = document.querySelectorAll<HTMLElement>("[data-engine-name]");
+ for (const engineElement of engineElements) {
+ searxng.listen("mouseenter", engineElement, loadEngineDescriptions);
+ }
+
+ const engineToggles = document.querySelectorAll<HTMLInputElement>(
+ "tbody input[type=checkbox][class~=checkbox-onoff]"
+ );
+
+ const enableAllEngines = document.querySelectorAll<HTMLElement>(".enable-all-engines");
+ for (const engine of enableAllEngines) {
+ searxng.listen("click", engine, () => toggleEngines(true, engineToggles));
+ }
+
+ const disableAllEngines = document.querySelectorAll<HTMLElement>(".disable-all-engines");
+ for (const engine of disableAllEngines) {
+ searxng.listen("click", engine, () => toggleEngines(false, engineToggles));
+ }
+
+ const copyHashButton = document.querySelector<HTMLElement>("#copy-hash");
+ if (copyHashButton) {
+ searxng.listen("click", copyHashButton, async (event: Event) => {
+ event.preventDefault();
+
+ const { copiedText, hash } = copyHashButton.dataset;
+ if (!copiedText || !hash) return;
+
+ try {
+ await navigator.clipboard.writeText(hash);
+ copyHashButton.innerText = copiedText;
+ } catch (error) {
+ console.error("Failed to copy hash:", error);
+ }
+ });
+ }
+ },
+ { on: [searxng.endpoint === "preferences"] }
+);