Skip to content
Code-Schnipsel Gruppen Projekte
CouponCodeInput.js 9,36 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
     * CouponCodeInput
     *
     * @module package/quiqqer/coupons/bin/frontend/classes/CouponCodeInput
     * @author www.pcsg.de (Patrick Müller)
     */
    define('package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput', [
    
    
        'qui/QUI',
    
        'qui/controls/Control',
        'qui/controls/loader/Loader',
    
        'utils/Session',
    
    
        'package/quiqqer/coupons/bin/frontend/CouponCodes',
    
    
        'Locale',
        'Mustache',
    
        'text!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.html',
    
        'css!package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput.css'
    
    ], function(QUI, QUIControl, QUILoader, Sessions, CouponCodes, QUIAjax, QUILocale, Mustache, template) {
        'use strict';
    
    
        var lg = 'quiqqer/coupons';
    
        return new Class({
    
            Extends: QUIControl,
    
            Type: 'package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput',
    
            initialize: function(options) {
    
                this.parent(options);
    
    
                this.$Input = null;
                this.Loader = new QUILoader();
    
                this.$running = false;
    
    
                this.addEvents({
                    onInject: this.$onInject
                });
            },
    
            /**
             * Event: onInject
             */
    
            $onInject: function() {
                var self = this;
    
                var lgPrefix = 'controls.frontend.CouponCodeInput.template.';
    
    
                this.$Elm.addClass('quiqqer-coupons-field');
    
    
                if (this.$Elm.getParent('[data-name="quiqqer-simple-checkout"]')) {
                    this.$Elm.addClass('quiqqer-coupons-field-simpleCheckout');
                }
    
    
                this.$Elm.set('html', Mustache.render(template, {
    
                    labelInput: QUILocale.get(lg, lgPrefix + 'labelInput'),
    
                    labelInputPlaceholder: QUILocale.get(lg, lgPrefix + 'labelInputPlaceholder'),
    
                    submitBtnText: QUILocale.get(lg, lgPrefix + 'submitBtnText')
    
                }));
    
                this.Loader.inject(this.$Elm);
    
    
                this.$Input = this.$Elm.getElement('input[data-name="code-input"]');
    
                this.$Input.addEvent('keyup', function(event) {
    
                    if (event.code === 13) {
                        self.$submit();
                    }
                });
    
    
                this.$Elm.getElement('[data-name="submit-coupon-code"]').addEvent('click', function(event) {
    
                    event.stop();
                    self.$submit();
                });
    
    
                if (this.isInOrder()) {
                    var OrderProcess = this.getOrderProcess();
    
    
                    new Promise(function(resolve) {
    
                        if (!OrderProcess.isLoaded()) {
                            return OrderProcess.addEvent('onLoad', resolve);
                        }
    
                        resolve();
    
                    }).then(function() {
    
                        if (OrderProcess.getAttribute('basketEditable') === false) {
                            // remove coupon codes button
                            new Element('button', {
                                'class': 'quiqqer-coupons-remove',
    
                                'html': '<span class="fa fa-close"></span>',
                                title: QUILocale.get(lg, 'remove.coupons.button'),
                                events: {
                                    click: function(e) {
    
                                        e.stop();
    
                                        self.removeCouponsFromOrder().catch(function(e) {
    
                                            console.error(e);
                                        });
                                    }
                                }
                            }).inject(self.$Elm.getElement('.quiqqer-coupons-couponcodeinput'));
                        }
                    });
                }
    
            },
    
            /**
             * Submit a CouponCode
             */
    
            $submit: function() {
    
                if (this.$running) {
                    return;
                }
    
    
                var self = this;
                var code = this.$Input.value.trim();
    
                if (code === '') {
                    this.$Input.focus();
                    return;
                }
    
    
                this.$running = true;
    
                this.Loader.show();
    
    
                // simple order
                const SimpleCheckoutNode = this.getElm().getParent('[data-name="quiqqer-simple-checkout"]');
    
                if (SimpleCheckoutNode) {
                    const SimpleCheckout = QUI.Controls.getById(SimpleCheckoutNode.get('data-quiid'));
    
                    let orderHash = window.location.hash.substring(1);
    
                    if (!orderHash || orderHash === '') {
                        orderHash = SimpleCheckout.getAttribute('orderHash');
                    }
    
    
                    QUIAjax.get('package_quiqqer_order-simple-checkout_ajax_frontend_getOrder', (response) => {
                        CouponCodes.addCouponCodeToBasket(code, response.order.uuid).then(() => {
                            if (SimpleCheckout) {
                                SimpleCheckout.$refreshBasket().then(() => {
                                    this.$running = false;
                                    this.Loader.hide();
                                });
    
                                return;
                            }
    
                            this.$running = false;
                            this.Loader.hide();
                        }).catch((err) => {
                            console.error(err);
    
                            this.$running = false;
                            this.Loader.hide();
                        });
                    }, {
                        'package': 'quiqqer/order-simple-checkout',
    
                        orderHash: orderHash
    
                if (!this.isInOrder()) {
    
                    QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getLastOrder', function(order) {
                        CouponCodes.addCouponCodeToBasket(code, order.hash).then(function(redeemed) {
    
                            if (!redeemed) {
                                self.$running = false;
                                self.Loader.hide();
                                return;
                            }
    
    
                            self.$addCouponCodeToSession(code).then(function() {
                                QUIAjax.get('package_quiqqer_order_ajax_frontend_basket_getOrderProcessUrl', function(url) {
    
                                    window.location = url + '?coupon=' + code;
                                }, {
                                    'package': 'quiqqer/order'
                                });
    
                            });
                        });
                    }, {
                        'package': 'quiqqer/order'
                    });
    
                    return;
                }
    
    
                var OrderProcess = this.getOrderProcess();
    
                OrderProcess.getOrder().then(function(orderHash) {
    
                    return CouponCodes.addCouponCodeToBasket(code, orderHash);
    
                }).then(function(redeemed) {
    
                    self.$running = false;
    
    
                    if (redeemed === false) {
                        OrderProcess.Loader.hide();
                        self.Loader.hide();
                        return;
                    }
    
    
                    self.$addCouponCodeToSession(code).then(function() {
    
                        OrderProcess.reload();
                    });
                });
            },
    
            /**
             *
             * @param code
             * @return {Promise}
             */
    
            $addCouponCodeToSession: function(code) {
                return Sessions.get('quiqqer-coupons').then(function(coupons) {
    
                    if (!coupons || typeOf(coupons) !== 'array') {
                        coupons = [];
                    }
    
                    coupons.push(code);
    
    
                    coupons = coupons.filter(function(value, index, self) {
    
                        return self.indexOf(value) === index;
                    });
    
                    return Sessions.set('quiqqer-coupons', JSON.encode(coupons));
    
            },
    
            /**
             * Is the coupon in the order process?
             * @return {boolean}
             */
    
            isInOrder: function() {
    
                var OrderProcessNode = this.getElm().getParent(
                    '[data-qui="package/quiqqer/order/bin/frontend/controls/OrderProcess"]'
                );
    
                return !!OrderProcessNode;
    
            },
    
            /**
             * Return the order process
             *
             * @return {Object}
             */
    
            getOrderProcess: function() {
    
                var OrderProcessNode = this.getElm().getParent(
                    '[data-qui="package/quiqqer/order/bin/frontend/controls/OrderProcess"]'
                );
    
                return window.QUI.Controls.getById(OrderProcessNode.get('data-quiid'));
            },
    
            /**
             * Remove all coupons from the order
             *
             * @return {Promise}
             */
    
            removeCouponsFromOrder: function() {
    
                if (!this.isInOrder()) {
                    return Promise.resolve();
                }
    
                var self = this;
    
    
                return new Promise(function(resolve) {
    
                    var OrderProcess = self.getOrderProcess();
    
                    OrderProcess.Loader.show();
    
                    OrderProcess.getOrder().then(function(orderHash) {
                        QUIAjax.get('package_quiqqer_coupons_ajax_frontend_removeCoupons', function() {
    
                            resolve();
                            OrderProcess.reload();
                        }, {
                            'package': 'quiqqer/coupon',
                            orderHash: orderHash
                        });
                    });
                });