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..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"); @@ -57,6 +58,12 @@ public DocMeta(Map docMetaMap) { this.docMetaMap = docMetaMap; } + public void addMetaIfNotPresent(String key, Object value) { + if (!docMetaMap.containsKey(key)) { + docMetaMap.put(key, value); + } + } + public DocMeta cloneWithNewJson(String docMetaJson) { DocMeta clone = new DocMeta(docMetaJson); clone.setId(this.id); 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;