+
-
+
{{ dayjs(creation).short() }}
-
-
- {{ status }}
-
+
+
+
+ {{ status }}
+
+
@@ -31,6 +33,10 @@
import { Avatar } from "frappe-ui";
import { dayjs } from "@/dayjs";
import IconDot from "~icons/lucide/dot";
+import { useRoute } from "vue-router";
+
+const route = useRoute();
+const isCustomerPortal: boolean = route.meta.public ?? false;
const props = defineProps({
categoryName: {
diff --git a/desk/src/types.ts b/desk/src/types.ts
index 97d40f0fc..6afe1353a 100644
--- a/desk/src/types.ts
+++ b/desk/src/types.ts
@@ -246,3 +246,5 @@ export interface Category {
};
children?: (Article | SubCategory)[];
}
+
+export type FeedbackAction = 0 | 1 | 2; // 0: neutral, 1: like, 2: dislike
diff --git a/helpdesk/__init__.py b/helpdesk/__init__.py
index 5becc17c0..6849410aa 100644
--- a/helpdesk/__init__.py
+++ b/helpdesk/__init__.py
@@ -1 +1 @@
-__version__ = "1.0.0"
+__version__ = "1.1.0"
diff --git a/helpdesk/helpdesk/doctype/hd_article/api.py b/helpdesk/helpdesk/doctype/hd_article/api.py
index 84be868b1..a509b46fa 100644
--- a/helpdesk/helpdesk/doctype/hd_article/api.py
+++ b/helpdesk/helpdesk/doctype/hd_article/api.py
@@ -17,9 +17,22 @@ def get_article(name: str):
"HD Article Category", sub_category.parent_category or article["category"]
)
+ user = frappe.session.user
+ # TODO: views count increment with views field in HD Article
+ # if not is_agent() and user != author.name:
+ # frappe.db.set_value("HD Article", name, "views", article["views"] + 1)
+
+ user_feedback = int(
+ frappe.db.get_value(
+ "HD Article Feedback", {"user": user, "article": name}, "feedback"
+ )
+ or 0
+ )
+
return {
**article,
"author": author,
"category": category,
"sub_category": sub_category,
+ "user_feedback": user_feedback,
}
diff --git a/helpdesk/helpdesk/doctype/hd_article/hd_article.json b/helpdesk/helpdesk/doctype/hd_article/hd_article.json
index d8b2db488..df87fc7b7 100644
--- a/helpdesk/helpdesk/doctype/hd_article/hd_article.json
+++ b/helpdesk/helpdesk/doctype/hd_article/hd_article.json
@@ -101,7 +101,7 @@
],
"links": [],
"make_attachments_public": 1,
- "modified": "2024-10-01 21:39:58.189965",
+ "modified": "2024-11-25 13:02:28.644492",
"modified_by": "Administrator",
"module": "Helpdesk",
"name": "HD Article",
diff --git a/helpdesk/helpdesk/doctype/hd_article/hd_article.py b/helpdesk/helpdesk/doctype/hd_article/hd_article.py
index c0e296c6c..8969e767c 100644
--- a/helpdesk/helpdesk/doctype/hd_article/hd_article.py
+++ b/helpdesk/helpdesk/doctype/hd_article/hd_article.py
@@ -52,6 +52,21 @@ def before_save(self):
)
)
+ @frappe.whitelist()
+ def set_feedback(self, value):
+ # 0 empty, 1 like, 2 dislike
+ user = frappe.session.user
+ feedback = frappe.db.exists(
+ "HD Article Feedback", {"user": user, "article": self.name}
+ )
+ if feedback:
+ frappe.db.set_value("HD Article Feedback", feedback, "feedback", value)
+ return
+
+ frappe.new_doc(
+ "HD Article Feedback", user=user, article=self.name, feedback=value
+ ).insert()
+
@property
def title_slug(self) -> str:
"""
diff --git a/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.js b/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.js
index ddb38d38d..0e718eddc 100644
--- a/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.js
+++ b/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.js
@@ -1,7 +1,8 @@
-// Copyright (c) 2022, Frappe Technologies and contributors
+// Copyright (c) 2024, Frappe Technologies and contributors
// For license information, please see license.txt
-frappe.ui.form.on("HD Article Feedback", {
- // refresh: function(frm) {
- // }
-});
+// frappe.ui.form.on("HD Article Feedback", {
+// refresh(frm) {
+
+// },
+// });
diff --git a/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.json b/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.json
index 1114e3462..956010500 100644
--- a/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.json
+++ b/helpdesk/helpdesk/doctype/hd_article_feedback/hd_article_feedback.json
@@ -1,9 +1,8 @@
{
"actions": [],
"allow_rename": 1,
- "creation": "2022-10-18 23:01:11.913095",
+ "creation": "2024-11-24 18:33:16.603719",
"doctype": "DocType",
- "editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"article",
@@ -11,27 +10,31 @@
"feedback"
],
"fields": [
- {
- "fieldname": "article",
- "fieldtype": "Link",
- "label": "Article",
- "options": "HD Article"
- },
{
"fieldname": "user",
"fieldtype": "Link",
+ "in_list_view": 1,
"label": "User",
"options": "User"
},
{
+ "description": "0 is no feedback, 1 is Like, 2 is Dislike",
"fieldname": "feedback",
- "fieldtype": "Int",
- "label": "Feedback"
+ "fieldtype": "Select",
+ "in_list_view": 1,
+ "label": "Feedback",
+ "options": "0\n1\n2"
+ },
+ {
+ "fieldname": "article",
+ "fieldtype": "Link",
+ "label": "Article",
+ "options": "HD Article"
}
],
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2023-03-26 23:06:42.029313",
+ "modified": "2024-11-25 23:01:17.163385",
"modified_by": "Administrator",
"module": "Helpdesk",
"name": "HD Article Feedback",
@@ -50,9 +53,10 @@
"write": 1
},
{
+ "create": 1,
+ "delete": 1,
"email": 1,
"export": 1,
- "if_owner": 1,
"print": 1,
"read": 1,
"report": 1,
@@ -61,7 +65,7 @@
"write": 1
}
],
- "sort_field": "modified",
+ "sort_field": "creation",
"sort_order": "DESC",
"states": []
-}
+}
\ No newline at end of file
diff --git a/helpdesk/helpdesk/doctype/hd_article_feedback/test_hd_article_feedback.py b/helpdesk/helpdesk/doctype/hd_article_feedback/test_hd_article_feedback.py
index 4083e9b31..76ab986d5 100644
--- a/helpdesk/helpdesk/doctype/hd_article_feedback/test_hd_article_feedback.py
+++ b/helpdesk/helpdesk/doctype/hd_article_feedback/test_hd_article_feedback.py
@@ -1,9 +1,29 @@
-# Copyright (c) 2022, Frappe Technologies and Contributors
+# Copyright (c) 2024, Frappe Technologies and Contributors
# See license.txt
# import frappe
-from frappe.tests.utils import FrappeTestCase
+from frappe.tests import IntegrationTestCase, UnitTestCase
+# On IntegrationTestCase, the doctype test records and all
+# link-field test record depdendencies are recursively loaded
+# Use these module variables to add/remove to/from that list
+EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
+IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
+
+
+class UnitTestHDArticleFeedback(UnitTestCase):
+ """
+ Unit tests for HDArticleFeedback.
+ Use this class for testing individual functions and methods.
+ """
+
+ pass
+
+
+class IntegrationTestHDArticleFeedback(IntegrationTestCase):
+ """
+ Integration tests for HDArticleFeedback.
+ Use this class for testing interactions between multiple components.
+ """
-class TestHDArticleFeedback(FrappeTestCase):
pass
diff --git a/helpdesk/helpdesk/doctype/hd_settings/hd_settings.json b/helpdesk/helpdesk/doctype/hd_settings/hd_settings.json
index 5bf9407ef..c7c53fef9 100644
--- a/helpdesk/helpdesk/doctype/hd_settings/hd_settings.json
+++ b/helpdesk/helpdesk/doctype/hd_settings/hd_settings.json
@@ -304,7 +304,7 @@
"fieldtype": "Section Break"
},
{
- "default": "0",
+ "default": "1",
"description": "When enabled, the ticket status will automatically change to \"Replied\" whenever the agent responds to a ticket.\n",
"fieldname": "auto_update_status",
"fieldtype": "Check",
@@ -316,7 +316,7 @@
"label": "Feedback"
},
{
- "default": "0",
+ "default": "1",
"description": "If enabled, the feedback dialog will be shown, when a user tries to close a ticket. \nNote: User can't close a ticket without giving a feedback.",
"fieldname": "is_feedback_mandatory",
"fieldtype": "Check",
@@ -325,7 +325,7 @@
],
"issingle": 1,
"links": [],
- "modified": "2024-11-22 17:25:40.112881",
+ "modified": "2024-11-22 19:47:41.543679",
"modified_by": "Administrator",
"module": "Helpdesk",
"name": "HD Settings",
diff --git a/helpdesk/helpdesk/doctype/hd_ticket/api.py b/helpdesk/helpdesk/doctype/hd_ticket/api.py
index 342918495..fd021aa2d 100644
--- a/helpdesk/helpdesk/doctype/hd_ticket/api.py
+++ b/helpdesk/helpdesk/doctype/hd_ticket/api.py
@@ -16,7 +16,6 @@ def new(doc, attachments=[]):
doc["doctype"] = "HD Ticket"
doc["via_customer_portal"] = bool(frappe.session.user)
d = frappe.get_doc(doc).insert()
- d.create_communication_via_contact(d.description, attachments)
return d
diff --git a/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py b/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py
index daf302688..6c2d7d868 100644
--- a/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py
+++ b/helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py
@@ -157,7 +157,7 @@ def by_priority(query: Query, direction: Order):
}
def publish_update(self):
- publish_event("helpdesk:ticket-update", {"name": self.name})
+ publish_event("helpdesk:ticket-update", self.name)
capture_event("ticket_updated")
def autoname(self):
@@ -191,6 +191,8 @@ def after_insert(self):
log_ticket_activity(self.name, "created this ticket")
capture_event("ticket_created")
publish_event("helpdesk:new-ticket", {"name": self.name})
+ if self.get("description"):
+ self.create_communication_via_contact(self.description)
def on_update(self):
# flake8: noqa