Skip to content
Code-Schnipsel Gruppen Projekte
CouponCodeInput.js 6,95 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/controls/Control',
        'qui/controls/loader/Loader',
    
        '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 (QUIControl, QUILoader, CouponCodes, QUIAjax, QUILocale, Mustache, template) {
    
        "use strict";
    
        var lg = 'quiqqer/coupons';
    
        return new Class({
    
            Extends: QUIControl,
            Type   : 'package/quiqqer/coupons/bin/frontend/controls/CouponCodeInput',
    
            Binds: [
                '$submit'
            ],
    
            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');
    
    
                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[name="code"]');
    
                this.$Input.addEvent('keyup', function (event) {
                    if (event.code === 13) {
                        self.$submit();
                    }
                });
    
    
                this.$Elm.getElement(
                    'button.quiqqer-coupons-couponcodeinput-btn'
                ).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();
    
    
                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;
                            }
    
                            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.Loader.show();
    
                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;
                    }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    OrderProcess.reload();
    
            },
    
            /**
             * 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
                        });
                    });
                });