Add POS partner search modes

This commit is contained in:
Matthias Lotz 2026-02-14 13:31:29 +01:00
parent f834d70859
commit f2b5710178
3 changed files with 99 additions and 1 deletions

View File

@ -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',

View File

@ -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;
},
});

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-name="point_of_sale.PartnerList" t-inherit="point_of_sale.PartnerList" t-inherit-mode="extension">
<xpath expr="//t[@t-set-slot='header']" position="inside">
<div class="btn-group ms-2" role="group" aria-label="Search mode">
<button
class="btn btn-outline-secondary"
t-att-class="{ active: state.searchMode === 'name' }"
t-on-click="() => this.setSearchMode('name')">
Name
</button>
<button
class="btn btn-outline-secondary"
t-att-class="{ active: state.searchMode === 'all' }"
t-on-click="() => this.setSearchMode('all')">
Alle Felder
</button>
</div>
</xpath>
</t>
</templates>