From f2b5710178184b105eed315d889bf7a8e54adc1e Mon Sep 17 00:00:00 2001 From: "matthias.lotz" Date: Sat, 14 Feb 2026 13:31:29 +0100 Subject: [PATCH] Add POS partner search modes --- open_workshop_pos/__manifest__.py | 4 +- .../src/js/ows_partner_search_mode_patch.js | 75 +++++++++++++++++++ .../static/src/xml/ows_partner_list_patch.xml | 21 ++++++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 open_workshop_pos/static/src/js/ows_partner_search_mode_patch.js create mode 100644 open_workshop_pos/static/src/xml/ows_partner_list_patch.xml diff --git a/open_workshop_pos/__manifest__.py b/open_workshop_pos/__manifest__.py index 43018f6..9f5c43f 100644 --- a/open_workshop_pos/__manifest__.py +++ b/open_workshop_pos/__manifest__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- { 'name': 'Open Workshop POS', - 'version': '18.0.1.0.0', + 'version': '18.0.1.0.1', 'category': 'Point of Sale', 'summary': 'POS Integration für Open Workshop - Machine Access & Customer UI', 'description': """ @@ -44,6 +44,7 @@ Autor: HobbyHimmel 'open_workshop_pos/static/src/js/ows_receipt_header_patch.js', 'open_workshop_pos/static/src/js/ows_control_buttons_patch.js', 'open_workshop_pos/static/src/js/ows_product_card_patch.js', + 'open_workshop_pos/static/src/js/ows_partner_search_mode_patch.js', # XML Templates 'open_workshop_pos/static/src/xml/ows_pos_sidebar.xml', @@ -55,6 +56,7 @@ Autor: HobbyHimmel 'open_workshop_pos/static/src/xml/ows_voucher_codes_patch.xml', 'open_workshop_pos/static/src/xml/ows_control_buttons_patch.xml', 'open_workshop_pos/static/src/xml/ows_payment_screen_patch.xml', + 'open_workshop_pos/static/src/xml/ows_partner_list_patch.xml', # CSS 'open_workshop_pos/static/src/css/pos.css', diff --git a/open_workshop_pos/static/src/js/ows_partner_search_mode_patch.js b/open_workshop_pos/static/src/js/ows_partner_search_mode_patch.js new file mode 100644 index 0000000..82f09b5 --- /dev/null +++ b/open_workshop_pos/static/src/js/ows_partner_search_mode_patch.js @@ -0,0 +1,75 @@ +/** @odoo-module **/ + +import { patch } from "@web/core/utils/patch"; +import { PartnerList } from "@point_of_sale/app/screens/partner_list/partner_list"; +import { unaccent } from "@web/core/utils/strings"; + +patch(PartnerList.prototype, { + setup() { + super.setup(...arguments); + this.state.searchMode = this.state.searchMode || "all"; + }, + + setSearchMode(mode) { + if (this.state.searchMode === mode) { + return; + } + this.state.searchMode = mode; + this.state.currentOffset = 0; + this.state.previousQuery = ""; + }, + + getPartners() { + if (this.state.searchMode !== "name") { + return super.getPartners(); + } + + const searchWord = unaccent((this.state.query || "").trim(), false).toLowerCase(); + const partners = this.pos.models["res.partner"].getAll(); + + if (!searchWord) { + return partners + .slice(0, 1000) + .toSorted((a, b) => + this.props.partner?.id === a.id + ? -1 + : this.props.partner?.id === b.id + ? 1 + : (a.name || "").localeCompare(b.name || "") + ); + } + + const exactMatches = partners.filter((partner) => { + const name = unaccent(partner.name || "", false).toLowerCase(); + return name === searchWord; + }); + + if (exactMatches.length > 0) { + return exactMatches; + } + + return partners.filter((partner) => { + const name = unaccent(partner.name || "", false).toLowerCase(); + return name.includes(searchWord); + }); + }, + + async getNewPartners() { + if (this.state.searchMode !== "name") { + return super.getNewPartners(); + } + + let domain = []; + const limit = 30; + if (this.state.query) { + domain = [["name", "ilike", this.state.query + "%"]]; + } + + const result = await this.pos.data.searchRead("res.partner", domain, [], { + limit: limit, + offset: this.state.currentOffset, + }); + + return result; + }, +}); diff --git a/open_workshop_pos/static/src/xml/ows_partner_list_patch.xml b/open_workshop_pos/static/src/xml/ows_partner_list_patch.xml new file mode 100644 index 0000000..9bc180c --- /dev/null +++ b/open_workshop_pos/static/src/xml/ows_partner_list_patch.xml @@ -0,0 +1,21 @@ + + + + +
+ + +
+
+
+