summaryrefslogtreecommitdiff
path: root/addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js')
-rw-r--r--addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js60
1 files changed, 60 insertions, 0 deletions
diff --git a/addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js b/addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js
new file mode 100644
index 00000000..6cdd6a04
--- /dev/null
+++ b/addons/point_of_sale/static/src/js/Popups/AbstractAwaitablePopup.js
@@ -0,0 +1,60 @@
+odoo.define('point_of_sale.AbstractAwaitablePopup', function (require) {
+ 'use strict';
+
+ const { useExternalListener } = owl.hooks;
+ const PosComponent = require('point_of_sale.PosComponent');
+
+ /**
+ * Implement this abstract class by extending it like so:
+ * ```js
+ * class ConcretePopup extends AbstractAwaitablePopup {
+ * async getPayload() {
+ * return 'result';
+ * }
+ * }
+ * ConcretePopup.template = owl.tags.xml`
+ * <div>
+ * <button t-on-click="confirm">Okay</button>
+ * <button t-on-click="cancel">Cancel</button>
+ * </div>
+ * `
+ * ```
+ *
+ * The concrete popup can now be instantiated and be awaited for
+ * the user's response like so:
+ * ```js
+ * const { confirmed, payload } = await this.showPopup('ConcretePopup');
+ * // based on the implementation above,
+ * // if confirmed, payload = 'result'
+ * // otherwise, payload = null
+ * ```
+ */
+ class AbstractAwaitablePopup extends PosComponent {
+ constructor() {
+ super(...arguments);
+ useExternalListener(window, 'keyup', this._cancelAtEscape);
+ }
+ async confirm() {
+ this.props.resolve({ confirmed: true, payload: await this.getPayload() });
+ this.trigger('close-popup');
+ }
+ cancel() {
+ this.props.resolve({ confirmed: false, payload: null });
+ this.trigger('close-popup');
+ }
+ _cancelAtEscape(event) {
+ if (event.key === 'Escape') {
+ this.cancel();
+ }
+ }
+ /**
+ * Override this in the concrete popup implementation to set the
+ * payload when the popup is confirmed.
+ */
+ async getPayload() {
+ return null;
+ }
+ }
+
+ return AbstractAwaitablePopup;
+});