From ca126ab49f2ff1382e7453a48cb041685c78897d Mon Sep 17 00:00:00 2001 From: MykolaGolubyev Date: Sun, 7 Sep 2025 12:01:19 -0400 Subject: [PATCH 1/2] slack: specify api end point via env vars --- .../java/org/testingisdocumenting/znai/core/DocMeta.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java b/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java index 4c057c764..eb58b4eee 100644 --- a/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java +++ b/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java @@ -53,10 +53,16 @@ public DocMeta(Map docMetaMap) { this.description = stringValue(docMetaMap, "description", "no description"); this.allowedUsers = stringList(docMetaMap, "allowedUsers"); this.allowedGroups = stringList(docMetaMap, "allowedGroups"); + attachSlackMetaFromEnvVars(docMetaMap); this.docMetaMap = docMetaMap; } + private void attachSlackMetaFromEnvVars(Map docMetaMap) { + addMetaFromEnvVar(docMetaMap, "sendToSlackUrl", "ZNAI_SEND_TO_SLACK_URL"); + addMetaFromEnvVar(docMetaMap, "sendToSlackUrl", "ZNAI_SEND_TO_SLACK_URL"); + } + public DocMeta cloneWithNewJson(String docMetaJson) { DocMeta clone = new DocMeta(docMetaJson); clone.setId(this.id); From fb77a4bc4eb671358f826013b066bd9a723a0f1e Mon Sep 17 00:00:00 2001 From: MykolaGolubyev Date: Sun, 7 Sep 2025 17:55:16 -0400 Subject: [PATCH 2/2] slack: specify api end point via env vars --- .../testingisdocumenting/znai/core/DocMeta.java | 15 ++++++++------- .../1.79/add-2025-09-07-slack-env-var.md | 1 + .../add-2025-09-07-slack-persisted-questions.md | 2 ++ .../text-selection/TextSelectionMenu.tsx | 1 + znai-slack-bot/slack_bot.py | 3 ++- .../znai/website/WebSite.java | 16 ++++++++++++++++ 6 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-env-var.md create mode 100644 znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-persisted-questions.md diff --git a/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java b/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java index eb58b4eee..7e6fb6a12 100644 --- a/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java +++ b/znai-core/src/main/java/org/testingisdocumenting/znai/core/DocMeta.java @@ -38,13 +38,14 @@ public class DocMeta { private final boolean displayOnLanding; private boolean previewEnabled; - private final Map docMetaMap; + private final Map docMetaMap; + @SuppressWarnings("unchecked") public DocMeta(String metaJson) { - this(JsonUtils.deserializeAsMap(metaJson)); + this((Map) JsonUtils.deserializeAsMap(metaJson)); } - public DocMeta(Map docMetaMap) { + public DocMeta(Map docMetaMap) { this.id = stringValue(docMetaMap, "id", ""); this.type = stringValue(docMetaMap, "type", "no-type"); this.title = stringValue(docMetaMap, "title", "no-title"); @@ -53,14 +54,14 @@ public DocMeta(Map docMetaMap) { this.description = stringValue(docMetaMap, "description", "no description"); this.allowedUsers = stringList(docMetaMap, "allowedUsers"); this.allowedGroups = stringList(docMetaMap, "allowedGroups"); - attachSlackMetaFromEnvVars(docMetaMap); this.docMetaMap = docMetaMap; } - private void attachSlackMetaFromEnvVars(Map docMetaMap) { - addMetaFromEnvVar(docMetaMap, "sendToSlackUrl", "ZNAI_SEND_TO_SLACK_URL"); - addMetaFromEnvVar(docMetaMap, "sendToSlackUrl", "ZNAI_SEND_TO_SLACK_URL"); + public void addMetaIfNotPresent(String key, Object value) { + if (!docMetaMap.containsKey(key)) { + docMetaMap.put(key, value); + } } public DocMeta cloneWithNewJson(String docMetaJson) { diff --git a/znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-env-var.md b/znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-env-var.md new file mode 100644 index 000000000..f21e7911d --- /dev/null +++ b/znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-env-var.md @@ -0,0 +1 @@ +* Add: Slack setup via env variable \ No newline at end of file diff --git a/znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-persisted-questions.md b/znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-persisted-questions.md new file mode 100644 index 000000000..28762f8be --- /dev/null +++ b/znai-docs/znai/release-notes/1.79/add-2025-09-07-slack-persisted-questions.md @@ -0,0 +1,2 @@ +* Add: Slack persisted questions +* Add: Slack detached questions \ No newline at end of file diff --git a/znai-reactjs/src/doc-elements/text-selection/TextSelectionMenu.tsx b/znai-reactjs/src/doc-elements/text-selection/TextSelectionMenu.tsx index 431ef84b9..bc89a54ae 100644 --- a/znai-reactjs/src/doc-elements/text-selection/TextSelectionMenu.tsx +++ b/znai-reactjs/src/doc-elements/text-selection/TextSelectionMenu.tsx @@ -239,6 +239,7 @@ export function TextSelectionMenu({ containerNode }: { containerNode: HTMLDivEle selectedPrefix: panelData!.prefixSuffixMatch.prefix, selectedSuffix: panelData!.prefixSuffixMatch.suffix, pageId: currentPageId(), + pageOrigin: document.location.origin, slackChannel: getDocMeta().slackChannel, question: question, context: panelData!.context, diff --git a/znai-slack-bot/slack_bot.py b/znai-slack-bot/slack_bot.py index d8814ebc9..fd10034b3 100644 --- a/znai-slack-bot/slack_bot.py +++ b/znai-slack-bot/slack_bot.py @@ -45,7 +45,8 @@ def ask_in_slack(): question_id = str(uuid.uuid4()) page_id = data.get('pageId') - page_url = f"http://localhost:5173/preview/{page_id}?questionId={question_id}" + page_origin = data.get('pageOrigin') + page_url = f"{page_origin}/{page_id}/?questionId={question_id}" selected_text = data.get('selectedText') selected_prefix = data.get('selectedPrefix', '') selected_suffix = data.get('selectedSuffix', '') diff --git a/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java b/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java index 1676c720c..37ec759fb 100644 --- a/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java +++ b/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java @@ -1033,6 +1033,7 @@ public Configuration withAdditionalLookupPaths(List additionalLookupPath public Configuration withMetaFromJsonFile(Path path) { String json = fileTextContent(path); docMeta = new DocMeta(json); + attachSlackMetaFromEnvVars(docMeta); withTitle(docMeta.getTitle()); withType(docMeta.getType()); @@ -1040,6 +1041,21 @@ public Configuration withMetaFromJsonFile(Path path) { return this; } + private void attachSlackMetaFromEnvVars(DocMeta docMeta) { + addMetaFromEnvVar(docMeta, "sendToSlackUrl", "ZNAI_SEND_TO_SLACK_URL"); + addMetaFromEnvVar(docMeta, "slackChannel", "ZNAI_SLACK_CHANNEL"); + addMetaFromEnvVar(docMeta, "slackActiveQuestionsUrl", "ZNAI_SLACK_ACTIVE_QUESTIONS_URL"); + addMetaFromEnvVar(docMeta, "resolveSlackQuestionUrl", "ZNAI_RESOLVE_SLACK_QUESTION_URL"); + addMetaFromEnvVar(docMeta, "sendToSlackIncludeContentType", "ZNAI_SEND_TO_SLACK_INCLUDE_CONTENT_TYPE"); + } + + private void addMetaFromEnvVar(DocMeta docMeta, String key, String envVarName) { + String envValue = System.getenv(envVarName); + if (envValue != null) { + docMeta.addMetaIfNotPresent(key, envValue); + } + } + public Configuration withEnabledPreview(boolean isPreviewEnabled) { this.isPreviewEnabled = isPreviewEnabled; return this;