Add POS partner search modes
This commit is contained in:
parent
f834d70859
commit
f2b5710178
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
},
|
||||
});
|
||||
21
open_workshop_pos/static/src/xml/ows_partner_list_patch.xml
Normal file
21
open_workshop_pos/static/src/xml/ows_partner_list_patch.xml
Normal 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>
|
||||
Loading…
Reference in New Issue
Block a user