From 5c31a0afeb9bbd0dbcc4267f6d73054d801219bd Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 28 Jan 2025 21:03:39 +0200 Subject: [PATCH] fix(client): quote breaking tooltips (fixes #1003) --- src/public/app/services/utils.ts | 4 ++ .../attribute_widgets/attribute_editor.ts | 5 ++- src/public/app/widgets/dialogs/import.js | 8 ++-- .../app/widgets/dialogs/upload_attachments.js | 4 +- src/public/app/widgets/sync_status.js | 43 ++++++++++--------- 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/public/app/services/utils.ts b/src/public/app/services/utils.ts index 7c7e47b31..527caf55d 100644 --- a/src/public/app/services/utils.ts +++ b/src/public/app/services/utils.ts @@ -124,6 +124,10 @@ function escapeHtml(str: string) { return str.replace(/[&<>"'`=\/]/g, (s) => entityMap[s]); } +export function escapeQuotes(value: string) { + return value.replaceAll("\"", """); +} + function formatSize(size: number) { size = Math.max(Math.round(size / 1024), 1); diff --git a/src/public/app/widgets/attribute_widgets/attribute_editor.ts b/src/public/app/widgets/attribute_widgets/attribute_editor.ts index 622da6ca9..1547de085 100644 --- a/src/public/app/widgets/attribute_widgets/attribute_editor.ts +++ b/src/public/app/widgets/attribute_widgets/attribute_editor.ts @@ -14,6 +14,7 @@ import type AttributeDetailWidget from "./attribute_detail.js"; import type { CommandData, EventData, EventListener, FilteredCommandNames } from "../../components/app_context.js"; import type { default as FAttribute, AttributeType } from "../../entities/fattribute.js"; import type FNote from "../../entities/fnote.js"; +import { escapeQuotes } from "../../services/utils.js"; const HELP_TEXT = `

${t("attribute_editor.help_text_body1")}

@@ -76,8 +77,8 @@ const TPL = `
-
-
+
+
diff --git a/src/public/app/widgets/dialogs/import.js b/src/public/app/widgets/dialogs/import.js index cf09fff2d..cd00bec66 100644 --- a/src/public/app/widgets/dialogs/import.js +++ b/src/public/app/widgets/dialogs/import.js @@ -1,4 +1,4 @@ -import utils from "../../services/utils.js"; +import utils, { escapeQuotes } from "../../services/utils.js"; import treeService from "../../services/tree.js"; import importService from "../../services/import.js"; import options from "../../services/options.js"; @@ -27,21 +27,21 @@ const TPL = ` ${t("import.options")}:
-
-
-
diff --git a/src/public/app/widgets/dialogs/upload_attachments.js b/src/public/app/widgets/dialogs/upload_attachments.js index 5bf9661b1..c59afb635 100644 --- a/src/public/app/widgets/dialogs/upload_attachments.js +++ b/src/public/app/widgets/dialogs/upload_attachments.js @@ -1,5 +1,5 @@ import { t } from "../../services/i18n.js"; -import utils from "../../services/utils.js"; +import utils, { escapeQuotes } from "../../services/utils.js"; import treeService from "../../services/tree.js"; import importService from "../../services/import.js"; import options from "../../services/options.js"; @@ -24,7 +24,7 @@ const TPL = `
${t("upload_attachments.options")}:
-
diff --git a/src/public/app/widgets/sync_status.js b/src/public/app/widgets/sync_status.js index dc7d8da26..df13c8716 100644 --- a/src/public/app/widgets/sync_status.js +++ b/src/public/app/widgets/sync_status.js @@ -3,35 +3,36 @@ import BasicWidget from "./basic_widget.js"; import ws from "../services/ws.js"; import options from "../services/options.js"; import syncService from "../services/sync.js"; +import { escapeQuotes } from "../services/utils.js"; const TPL = `
- + + data-bs-toggle="tooltip" + title="${escapeQuotes(t("sync_status.connected_with_changes"))}"> - + + data-bs-toggle="tooltip" + title="${escapeQuotes(t("sync_status.disconnected_with_changes"))}"> - + title="${escapeQuotes(t("sync_status.disconnected_no_changes"))}"> - + title="${escapeQuotes(t("sync_status.in_progress"))}">