From 102db62a180ab42e29d2df069ce0480216dd5694 Mon Sep 17 00:00:00 2001 From: assk-odoo Date: Fri, 2 May 2025 12:24:29 +0530 Subject: [PATCH] [ADD] webiste_helpdesk_snippet: Dynamic snippet added show a all dynamic data of ticket is shown into list and card view form and filter out that ticket based on the team wise. --- website_helpdesk_snippet/__init__.py | 0 website_helpdesk_snippet/__manifest__.py | 26 +++++ .../data/helpdesk_snippet_tour.xml | 8 ++ .../src/snippets/s_helpdesk_ticket/000.js | 95 +++++++++++++++++++ .../src/snippets/s_helpdesk_ticket/000.xml | 62 ++++++++++++ .../src/snippets/s_helpdesk_ticket/options.js | 35 +++++++ .../tests/tours/helpdesk_snippet_tour.js | 57 +++++++++++ website_helpdesk_snippet/tests/__init__.py | 1 + .../tests/test_helpdesk_snippet_tour.py | 9 ++ .../views/snippets/snippets.xml | 38 ++++++++ 10 files changed, 331 insertions(+) create mode 100644 website_helpdesk_snippet/__init__.py create mode 100644 website_helpdesk_snippet/__manifest__.py create mode 100644 website_helpdesk_snippet/data/helpdesk_snippet_tour.xml create mode 100644 website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.js create mode 100644 website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.xml create mode 100644 website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/options.js create mode 100644 website_helpdesk_snippet/static/tests/tours/helpdesk_snippet_tour.js create mode 100644 website_helpdesk_snippet/tests/__init__.py create mode 100644 website_helpdesk_snippet/tests/test_helpdesk_snippet_tour.py create mode 100644 website_helpdesk_snippet/views/snippets/snippets.xml diff --git a/website_helpdesk_snippet/__init__.py b/website_helpdesk_snippet/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/website_helpdesk_snippet/__manifest__.py b/website_helpdesk_snippet/__manifest__.py new file mode 100644 index 00000000000..35cf3847938 --- /dev/null +++ b/website_helpdesk_snippet/__manifest__.py @@ -0,0 +1,26 @@ +{ + 'name': 'Website Helpdesk Snippet', + 'version': '1.0', + 'author': "sujal asodariya", + 'summary': 'Website snippet for displaying Helpdesk Tickets', + 'depends': ['website', 'helpdesk'], + 'data': [ + "data/helpdesk_snippet_tour.xml", + "views/snippets/snippets.xml", + ], + 'assets': { + 'web.assets_frontend': [ + 'website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.xml', + "website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.js", + ], + 'website.assets_wysiwyg': [ + 'website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/options.js', + ], + 'web.assets_tests': [ + 'website_helpdesk_snippet/static/tests/tours/helpdesk_snippet_tour.js', + ], + }, + 'application': False, + 'installable': True, + 'license': "LGPL-3", +} diff --git a/website_helpdesk_snippet/data/helpdesk_snippet_tour.xml b/website_helpdesk_snippet/data/helpdesk_snippet_tour.xml new file mode 100644 index 00000000000..e64117d38d6 --- /dev/null +++ b/website_helpdesk_snippet/data/helpdesk_snippet_tour.xml @@ -0,0 +1,8 @@ + + + + website_helpdesk_snippet.helpdesk_snippet_tour + 10 + Congrats, your tour completed successfully! + + diff --git a/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.js b/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.js new file mode 100644 index 00000000000..62e5c2d3497 --- /dev/null +++ b/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.js @@ -0,0 +1,95 @@ + +// /** @odoo-module */ +// import { renderToElement } from "@web/core/utils/render"; +// import publicWidget from "@web/legacy/js/public/public_widget"; +// // import { rpc } from "@web/core/network/rpc"; + +// publicWidget.registry.get_product_tab = publicWidget.Widget.extend({ +// selector: '.categories_section', +// disabledInEditableMode: false, + +// init() { +// this._super(...arguments); +// this.orm = this.bindService("orm"); +// this.customDomain = []; +// this.result = []; +// }, + +// async willStart() { +// const helpdeskTeamId = this.el.dataset.helpdeskTeamId; +// if (helpdeskTeamId) { +// this.customDomain = [["team_id", "=", parseInt(helpdeskTeamId)]]; +// } + +// this.layout = this.el.dataset.layout || "list"; + +// this.result = await this.orm.searchRead( +// "helpdesk.ticket", +// this.customDomain, +// ["name", "user_id", "partner_id", "priority"] +// ); +// }, + +// start() { +// if (this.result && this.result.length) { +// const templateName = +// this.layout === "list" +// ? "website_helpdesk_snippet.helpdesk_ticket_list" +// : "website_helpdesk_snippet.helpdesk_ticket_card"; + +// const rendered = renderToElement(templateName, { result: this.result }); +// this.el.replaceChildren(rendered); +// } +// }, +// }); + +/** @odoo-module **/ + +import { Interaction } from "@web/public/interaction"; +import { registry } from "@web/core/registry"; +import { renderToElement } from "@web/core/utils/render"; + +export class GetProductTab extends Interaction { + static selector = ".categories_section"; + + setup(){ + this.orm = this.services.orm; + } + + async willStart() { + + const helpdeskTeamId = this.el.dataset.helpdeskTeamId; + this.customDomain = []; + if (helpdeskTeamId) { + this.customDomain = [["team_id", "=", parseInt(helpdeskTeamId)]]; + } + + this.layout = this.el.dataset.layout || "list"; + this.result = await this.orm.searchRead( + "helpdesk.ticket", + this.customDomain, + ["name", "user_id", "partner_id", "priority"] + ); + } + + start() { + if (this.result && this.result.length) { + const templateName = + this.layout === "list" + ? "website_helpdesk_snippet.helpdesk_ticket_list" + : "website_helpdesk_snippet.helpdesk_ticket_card"; + + const rendered = renderToElement(templateName, { result: this.result }); + this.el.replaceChildren(rendered); + } + } +} + +registry + .category("public.interactions") + .add("website_helpdesk.get_product_tab", GetProductTab); + +registry + .category("public.interactions.edit") + .add("website_helpdesk.get_product_tab", { Interaction: GetProductTab} ); + diff --git a/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.xml b/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.xml new file mode 100644 index 00000000000..7ad13c2f268 --- /dev/null +++ b/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/000.xml @@ -0,0 +1,62 @@ + + + + +
+
+

Helpdesk Ticket

+
+ +
+
+
+

Name:

+

Assigned to: + +

+

Customer: + +

+

Priority: + +

+
+
+
+
+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
Ticket NameAssigned ToCustomerPriority
+ + + +
+
+
+
+ +
diff --git a/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/options.js b/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/options.js new file mode 100644 index 00000000000..6d0f6f49db9 --- /dev/null +++ b/website_helpdesk_snippet/static/src/snippets/s_helpdesk_ticket/options.js @@ -0,0 +1,35 @@ +/** @odoo-module **/ + +import options from '@web_editor/js/editor/snippets.options'; + +options.registry.HelpdeskTickets = options.Class.extend({ + + selectDataAttribute(previewMode, widgetValue, params) { + this.$target[0].setAttribute("data-helpdesk-team-id", widgetValue) || ''; + }, + + selectLayout(previewMode, widgetValue, params) { + + this.$target[0].setAttribute("data-layout", widgetValue); + }, + //---------------------------------------------------------------------- + // Private methods + //---------------------------------------------------------------------- + + /** + * @override + */ + + _computeWidgetState(methodName, params) { + if (methodName === 'selectDataAttribute') { + return this.$target[0].getAttribute("data-helpdesk-team-id") || ''; + } + + if (methodName === 'selectLayout') { + return this.$target[0].getAttribute("data-layout"); + } + return this._super(...arguments); + }, + +}); + diff --git a/website_helpdesk_snippet/static/tests/tours/helpdesk_snippet_tour.js b/website_helpdesk_snippet/static/tests/tours/helpdesk_snippet_tour.js new file mode 100644 index 00000000000..1d9e8bbec24 --- /dev/null +++ b/website_helpdesk_snippet/static/tests/tours/helpdesk_snippet_tour.js @@ -0,0 +1,57 @@ +import { + changeOption, + insertSnippet, + clickOnSnippet, + clickOnEditAndWaitEditMode, + clickOnSave, + registerWebsitePreviewTour, +} from '@website/js/tours/tour_utils'; + +function helpdeskSnippetTourSteps() { + return [ + ...clickOnEditAndWaitEditMode(), + { + content: "Click on the Helpdesk snippet to insert it.", + trigger: "[data-snippet='s_helpdesk_tickets']", + run: "drag_and_drop :iframe #wrap .oe_drop_zone", + }, + ...clickOnSnippet({ id: "categories_section", name: "Helpdesk Ticket" }), + { + content: "Click to open the layout selection.", + trigger: '[data-option-name="view_template"] we-toggler', + run: 'click', + }, + { + content: "Select the card layout.", + trigger: '[data-select-layout="card"]', + run: 'click', + }, + { + content: "check that list to card layout is selected", + trigger: ":iframe .categories_section[data-layout='card']", + }, + { + content: "Open the Helpdesk Team filter.", + trigger: '[data-name="helpdesk_team_opt"] we-toggler', + run: 'click', + }, + { + content: "Choose a Helpdesk Team to filter the tickets.", + trigger: '[data-select-data-attribute="2"]', + run: 'click', + }, + { + content: "check that my team id-2 filter apply", + trigger: ':iframe .categories_section[data-helpdesk-team-id="2"]', + }, + ...clickOnSave(), + ]; +} + +registerWebsitePreviewTour( + "website_helpdesk_snippet.helpdesk_snippet_tour", // same name as your js tour name + { + url: "/", // staring point of my url + }, + helpdeskSnippetTourSteps +); diff --git a/website_helpdesk_snippet/tests/__init__.py b/website_helpdesk_snippet/tests/__init__.py new file mode 100644 index 00000000000..34ade5190bb --- /dev/null +++ b/website_helpdesk_snippet/tests/__init__.py @@ -0,0 +1 @@ +from . import test_helpdesk_snippet_tour \ No newline at end of file diff --git a/website_helpdesk_snippet/tests/test_helpdesk_snippet_tour.py b/website_helpdesk_snippet/tests/test_helpdesk_snippet_tour.py new file mode 100644 index 00000000000..e4c4082d51e --- /dev/null +++ b/website_helpdesk_snippet/tests/test_helpdesk_snippet_tour.py @@ -0,0 +1,9 @@ +import odoo.tests +from odoo.tests import HttpCase + +@odoo.tests.common.tagged('post_install', '-at_install') +class MyCustomTest(HttpCase): + def test_my_tour(self): + + self.start_tour("/", "website_helpdesk_snippet.helpdesk_snippet_tour", login="admin") + diff --git a/website_helpdesk_snippet/views/snippets/snippets.xml b/website_helpdesk_snippet/views/snippets/snippets.xml new file mode 100644 index 00000000000..79732eea094 --- /dev/null +++ b/website_helpdesk_snippet/views/snippets/snippets.xml @@ -0,0 +1,38 @@ + + + + + + + + + +