1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
odoo.define('point_of_sale.OrderManagementScreen', function (require) {
'use strict';
const { useContext } = owl.hooks;
const { useListener } = require('web.custom_hooks');
const ControlButtonsMixin = require('point_of_sale.ControlButtonsMixin');
const NumberBuffer = require('point_of_sale.NumberBuffer');
const Registries = require('point_of_sale.Registries');
const OrderFetcher = require('point_of_sale.OrderFetcher');
const IndependentToOrderScreen = require('point_of_sale.IndependentToOrderScreen');
const contexts = require('point_of_sale.PosContext');
class OrderManagementScreen extends ControlButtonsMixin(IndependentToOrderScreen) {
constructor() {
super(...arguments);
useListener('close-screen', this.close);
useListener('set-numpad-mode', this._setNumpadMode);
useListener('click-order', this._onClickOrder);
useListener('next-page', this._onNextPage);
useListener('prev-page', this._onPrevPage);
useListener('search', this._onSearch);
NumberBuffer.use({
nonKeyboardInputEvent: 'numpad-click-input',
useWithBarcode: true,
});
this.numpadMode = 'quantity';
OrderFetcher.setComponent(this);
OrderFetcher.setConfigId(this.env.pos.config_id);
this.orderManagementContext = useContext(contexts.orderManagement);
}
mounted() {
OrderFetcher.on('update', this, this.render);
this.env.pos.get('orders').on('add remove', this.render, this);
// calculate how many can fit in the screen.
// It is based on the height of the header element.
// So the result is only accurate if each row is just single line.
const flexContainer = this.el.querySelector('.flex-container');
const cpEl = this.el.querySelector('.control-panel');
const headerEl = this.el.querySelector('.order-row.header');
const val = Math.trunc(
(flexContainer.offsetHeight - cpEl.offsetHeight - headerEl.offsetHeight) /
headerEl.offsetHeight
);
OrderFetcher.setNPerPage(val);
// Fetch the order after mounting so that order management screen
// is shown while fetching.
setTimeout(() => OrderFetcher.fetch(), 0);
}
willUnmount() {
OrderFetcher.off('update', this);
this.env.pos.get('orders').off('add remove', null, this);
}
get selectedClient() {
const order = this.orderManagementContext.selectedOrder;
return order ? order.get_client() : null;
}
get orders() {
return OrderFetcher.get();
}
async _setNumpadMode(event) {
const { mode } = event.detail;
this.numpadMode = mode;
NumberBuffer.reset();
}
_onNextPage() {
OrderFetcher.nextPage();
}
_onPrevPage() {
OrderFetcher.prevPage();
}
_onSearch({ detail: domain }) {
OrderFetcher.setSearchDomain(domain);
OrderFetcher.setPage(1);
OrderFetcher.fetch();
}
_onClickOrder({ detail: clickedOrder }) {
if (!clickedOrder || clickedOrder.locked) {
this.orderManagementContext.selectedOrder = clickedOrder;
} else {
this._setOrder(clickedOrder);
}
}
/**
* @param {models.Order} order
*/
_setOrder(order) {
this.env.pos.set_order(order);
if (order === this.env.pos.get_order()) {
this.close();
}
}
}
OrderManagementScreen.template = 'OrderManagementScreen';
OrderManagementScreen.hideOrderSelector = true;
Registries.Component.add(OrderManagementScreen);
return OrderManagementScreen;
});
|