diff --git a/desk/src/pages/knowledge-base/Article.vue b/desk/src/pages/knowledge-base/Article.vue
index d2533eb5b..310dc08b5 100644
--- a/desk/src/pages/knowledge-base/Article.vue
+++ b/desk/src/pages/knowledge-base/Article.vue
@@ -19,14 +19,13 @@
@@ -128,10 +130,11 @@ import { useUserStore } from "@/stores/user";
import LayoutHeader from "@/components/LayoutHeader.vue";
import MoveToCategoryModal from "@/components/knowledge-base/MoveToCategoryModal.vue";
import DiscardButton from "@/components/DiscardButton.vue";
-import { Resource, Article } from "@/types";
+import { Resource, Article, FeedbackAction } from "@/types";
import IconDot from "~icons/lucide/dot";
import { createToast, textEditorMenuButtons, copyToClipboard } from "@/utils";
import IconMoreHorizontal from "~icons/lucide/more-horizontal";
+import ArticleFeedback from "./ArticleFeedback.vue";
const props = defineProps({
articleId: {
@@ -151,6 +154,7 @@ const editable = ref(route.query.isEdit ?? false);
const content = ref("");
const title = ref("");
+const feedback = ref();
const titleRef = ref(null);
watch(
@@ -173,6 +177,7 @@ const article: Resource = createResource({
onSuccess: (data: Article) => {
content.value = data.content;
title.value = data.title;
+ feedback.value = data.feedback;
},
});
@@ -299,12 +304,11 @@ watch([() => content.value, () => title.value], ([newContent, newTitle]) => {
});
const editorClass = computed(() => {
- let basicStyles =
- "rounded-b-lg max-w-[unset] prose-sm h-[calc(100vh-340px)] sm:h-[calc(100vh-250px)]";
- if (editable.value) {
- basicStyles += " overflow-auto";
- }
- return basicStyles;
+ return [
+ "rounded-b-lg max-w-[unset] prose-sm",
+ editable.value &&
+ "overflow-auto h-[calc(100vh-340px)] sm:h-[calc(100vh-250px)]",
+ ];
});
const options = computed(() => [
diff --git a/desk/src/pages/knowledge-base/ArticleFeedback.vue b/desk/src/pages/knowledge-base/ArticleFeedback.vue
new file mode 100644
index 000000000..acb7668b6
--- /dev/null
+++ b/desk/src/pages/knowledge-base/ArticleFeedback.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
Did this article solve your issue?
+
+
+
+
+
+
+
+
+
+ Can’t find what you’re looking for?
+
+
+ Create a ticket →
+
+
+
+
+
+
+
+
diff --git a/desk/src/stores/knowledgeBase.ts b/desk/src/stores/knowledgeBase.ts
index 6fef7d9bd..d94ba9601 100644
--- a/desk/src/stores/knowledgeBase.ts
+++ b/desk/src/stores/knowledgeBase.ts
@@ -107,3 +107,17 @@ export const categoryName = createResource({
return { category };
},
});
+
+//feedback
+export const setFeedback = createResource({
+ url: "run_doc_method",
+ debounce: 300,
+ makeParams: ({ articleId, action }) => ({
+ dt: "HD Article",
+ dn: articleId,
+ method: "set_feedback",
+ args: {
+ value: action,
+ },
+ }),
+});
diff --git a/helpdesk/api/knowledge_base.py b/helpdesk/api/knowledge_base.py
index c4383869e..5c5434005 100644
--- a/helpdesk/api/knowledge_base.py
+++ b/helpdesk/api/knowledge_base.py
@@ -14,6 +14,14 @@ def get_article(name: str):
frappe.throw(_("Access denied"), frappe.PermissionError)
author = get_user_info_for_avatar(article["author"])
+ feedback = (
+ frappe.db.get_value(
+ "HD Article Feedback",
+ {"article": name, "user": frappe.session.user},
+ "feedback",
+ )
+ or 0
+ )
return {
"name": article.name,
@@ -28,6 +36,7 @@ def get_article(name: str):
"HD Article Category", article.category, "category_name"
),
"category_id": article.category,
+ "feedback": int(feedback),
}
return article