Skip to content
Code-Schnipsel Gruppen Projekte
CouponCodeInput.js 9,2 KiB
Newer Older
/**
 * 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[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();
            });
Henning Leutz's avatar
Henning Leutz committed

            if (this.isInOrder()) {
                var OrderProcess = this.getOrderProcess();

                new Promise(function(resolve) {
Henning Leutz's avatar
Henning Leutz committed
                    if (!OrderProcess.isLoaded()) {
                        return OrderProcess.addEvent('onLoad', resolve);
                    }

                    resolve();
                }).then(function() {
Henning Leutz's avatar
Henning Leutz committed
                    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) {
Henning Leutz's avatar
Henning Leutz committed
                                    e.stop();
                                    self.removeCouponsFromOrder().catch(function(e) {
Henning Leutz's avatar
Henning Leutz committed
                                        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'));

                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: window.location.hash.substring(1)
                });

                return;
            }

            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;
            }

Henning Leutz's avatar
Henning Leutz committed
            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;
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * Return the order process
         *
         * @return {Object}
         */
        getOrderProcess: function() {
Henning Leutz's avatar
Henning Leutz committed
            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() {
Henning Leutz's avatar
Henning Leutz committed
            if (!this.isInOrder()) {
                return Promise.resolve();
            }

            var self = this;

            return new Promise(function(resolve) {
Henning Leutz's avatar
Henning Leutz committed
                var OrderProcess = self.getOrderProcess();

                OrderProcess.Loader.show();
                OrderProcess.getOrder().then(function(orderHash) {
                    QUIAjax.get('package_quiqqer_coupons_ajax_frontend_removeCoupons', function() {
Henning Leutz's avatar
Henning Leutz committed
                        resolve();
                        OrderProcess.reload();
                    }, {
                        'package': 'quiqqer/coupon',
                        orderHash: orderHash
                    });
                });
            });