Skip to content
Code-Schnipsel Gruppen Projekte
Manager.js 22,8 KiB
Newer Older
Patrick Müller's avatar
Patrick Müller committed
/**
 * Manage Invite Codes
 *
 * @module package/quiqqer/coupons/bin/backend/controls/Manager
Patrick Müller's avatar
Patrick Müller committed
 * @author www.pcsg.de (Patrick Müller)
 */
define('package/quiqqer/coupons/bin/backend/controls/Manager', [
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
    'qui/QUI',
Patrick Müller's avatar
Patrick Müller committed
    'qui/controls/desktop/Panel',
    'qui/controls/loader/Loader',
    'qui/controls/windows/Popup',
    'qui/controls/windows/Confirm',
    'qui/controls/buttons/Button',
    'qui/controls/buttons/Separator',

    'controls/grid/Grid',
    'qui/utils/Form',

    'package/quiqqer/coupons/bin/backend/CouponCodes',
Patrick Müller's avatar
Patrick Müller committed

    'Locale',
    'Mustache',

    'text!package/quiqqer/coupons/bin/backend/controls/Manager.html',
    'text!package/quiqqer/coupons/bin/backend/controls/Manager.Create.html',
    'text!package/quiqqer/coupons/bin/backend/controls/Manager.Usages.html',
    'css!package/quiqqer/coupons/bin/backend/controls/Manager.css'
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
], function (QUI, QUIPanel, QUILoader, QUIPopup, QUIConfirm, QUIButton, QUISeparator,
Patrick Müller's avatar
Patrick Müller committed
             Grid, QUIFormUtils, CouponCodes, QUILocale, Mustache, template, templateCreate,
             templateUsages) {
Patrick Müller's avatar
Patrick Müller committed
    "use strict";

    var lg = 'quiqqer/coupons';

    return new Class({

        Extends: QUIPanel,
        Type   : 'package/quiqqer/coupons/bin/backend/controls/Manager',
Patrick Müller's avatar
Patrick Müller committed

        Binds: [
            '$onCreate',
            '$onResize',
            '$listRefresh',
            '$onRefresh',
            '$load',
            '$setGridData',
            '$showDetails',
Patrick Müller's avatar
Patrick Müller committed
            '$toggleActiveStatus',
            '$managePackages',
            '$delete',
            '$editBundle',
            'refresh',
            '$openUserPanel',
            '$sendMail'
        ],

        options: {
            title: QUILocale.get(lg, 'controls.manager.title')
        },

        initialize: function (options) {
            this.parent(options);

Henning Leutz's avatar
Henning Leutz committed
            this.Loader = new QUILoader();
            this.$User = null;
            this.$Grid = null;
Patrick Müller's avatar
Patrick Müller committed
            this.$GridParent = null;
Henning Leutz's avatar
Henning Leutz committed
            this.$Panel = null;
Patrick Müller's avatar
Patrick Müller committed

            this.addEvents({
                onCreate : this.$onCreate,
                onRefresh: this.$onRefresh,
                onResize : this.$onResize
            });
        },

        /**
         * Event: onCreate
         */
        $onCreate: function () {
            var self = this;

            this.Loader.inject(this.$Elm);

            this.addButton({
                name     : 'create',
                text     : QUILocale.get(lg, 'controls.manager.tbl.btn.create'),
                textimage: 'fa fa-plus',
                events   : {
                    onClick: function () {
                        self.$showDetails();
Patrick Müller's avatar
Patrick Müller committed
                    }
                }
            });

            this.addButton(new QUISeparator());

Patrick Müller's avatar
Patrick Müller committed
            this.addButton({
                name     : 'edit',
                text     : QUILocale.get(lg, 'controls.manager.tbl.btn.edit'),
                textimage: 'fa fa-edit',
Patrick Müller's avatar
Patrick Müller committed
                events   : {
                    onClick: function () {
                        self.$showDetails(Object.clone(self.$Grid.getSelectedData()[0]));
Patrick Müller's avatar
Patrick Müller committed
                    }
                }
            });

            this.addButton({
                name     : 'delete',
                text     : QUILocale.get(lg, 'controls.manager.tbl.btn.delete'),
                textimage: 'fa fa-trash',
                events   : {
                    onClick: this.$delete
                }
            });

            this.$load();
        },

        /**
         * Refresh data
         */
        refresh: function () {
            if (this.$Grid) {
                this.$Grid.refresh();
            }
        },

        /**
         * event: onResize
         */
        $onResize: function () {
            if (this.$GridParent && this.$Grid) {
                var size = this.$GridParent.getSize();

                this.$Grid.setHeight(size.y);
                this.$Grid.resize();
            }
        },

        /**
         * Load Grid
         */
        $load: function () {
            var self = this;

            this.setContent(Mustache.render(template));
            var Content = this.getContent();

            this.$GridParent = Content.getElement(
Patrick Müller's avatar
Patrick Müller committed
                '.quiqqer-coupons-manager-table'
Patrick Müller's avatar
Patrick Müller committed
            );

            this.$Grid = new Grid(this.$GridParent, {
Henning Leutz's avatar
Henning Leutz committed
                columnModel      : [
                    {
                        header   : QUILocale.get('quiqqer/system', 'id'),
                        dataIndex: 'id',
                        dataType : 'number',
                        width    : 50
                    },
                    {
                        header   : QUILocale.get(lg, 'controls.manager.tbl.header.code'),
                        dataIndex: 'code',
                        dataType : 'string',
                        width    : 150
                    },
                    {
                        header   : QUILocale.get(lg, 'controls.manager.tbl.header.title'),
                        dataIndex: 'title',
                        dataType : 'string',
                        width    : 200
                    },
                    {
                        header   : QUILocale.get(lg, 'controls.manager.tbl.header.status'),
                        dataIndex: 'status',
                        dataType : 'node',
                        width    : 200,
                        className: 'clickable'
                    },
                    {
                        header   : QUILocale.get(lg, 'controls.manager.tbl.header.validUntilDate'),
                        dataIndex: 'validUntilDateText',
                        dataType : 'string',
                        width    : 150
                    },
                    {
                        header   : QUILocale.get(lg, 'controls.manager.tbl.header.reusable'),
                        dataIndex: 'maxUsageLabel',
                        dataType : 'string',
                        width    : 150
                    },
                    {
                        header   : QUILocale.get(lg, 'controls.manager.tbl.header.createDate'),
                        dataIndex: 'createDate',
                        dataType : 'string',
                        width    : 150
                    }
                ],
Patrick Müller's avatar
Patrick Müller committed
                pagination       : true,
                serverSort       : true,
                selectable       : true,
                multipleSelection: true
            });

            this.$Grid.addEvents({
                onDblClick: function () {
                    self.$showDetails(Object.clone(self.$Grid.getSelectedData()[0]));
Patrick Müller's avatar
Patrick Müller committed
                },
                onClick   : function (event) {
                    var selected = self.$Grid.getSelectedData();

                    self.getButtons('delete').enable();

                    if (selected.length === 1) {
                        self.getButtons('edit').enable();
                    } else {
                        self.getButtons('edit').disable();
                    }

Patrick Müller's avatar
Patrick Müller committed
                    if (!event.cell.hasClass('clickable')) {
                        return;
                    }

                    var Row = selected[0];
Patrick Müller's avatar
Patrick Müller committed
                    self.$showUsages(Row);
Patrick Müller's avatar
Patrick Müller committed
                },
                onRefresh : this.$listRefresh
            });

            this.resize();
            this.$Grid.refresh();
        },

        /**
         * Event: onRefresh
         */
        $onRefresh: function () {
            if (this.$Grid) {
                this.$Grid.refresh();
            }
        },

        /**
         * Refresh bundle list
         *
         * @param {Object} Grid
         */
        $listRefresh: function (Grid) {
            if (!this.$Grid) {
                return;
            }

            var self = this;

            self.getButtons('delete').disable();
            self.getButtons('edit').disable();
Patrick Müller's avatar
Patrick Müller committed

            var GridParams = {
                sortOn : Grid.getAttribute('sortOn'),
                sortBy : Grid.getAttribute('sortBy'),
                perPage: Grid.getAttribute('perPage'),
                page   : Grid.getAttribute('page')
            };

            switch (GridParams.sortOn) {
                case 'status':
                    GridParams.sortOn = 'useDate';
                    break;

                case 'user':
                    GridParams.sortOn = 'userId';
                    break;
            }

            this.Loader.show();

            CouponCodes.getList(GridParams).then(function (ResultData) {
                self.Loader.hide();
                self.$setGridData(ResultData);
            });
        },

        /**
         * Set license data to grid
         *
         * @param {Object} GridData
         */
        $setGridData: function (GridData) {
Patrick Müller's avatar
Patrick Müller committed
            var textUnlimited = QUILocale.get(lg, 'controls.manager.tbl.validUntil.unlimited');
Patrick Müller's avatar
Patrick Müller committed

            for (var i = 0, len = GridData.data.length; i < len; i++) {
                var Row = GridData.data[i];

                var StatusElm = new Element('span', {
Patrick Müller's avatar
Patrick Müller committed
                    'class': 'quiqqer-coupons-manager-tbl-status'
Patrick Müller's avatar
Patrick Müller committed
                });

Patrick Müller's avatar
Patrick Müller committed
                var usageCount = Row.usages.length;

                if (!Row.isValid) {
                    StatusElm.set('html', QUILocale.get(lg, 'controls.manager.tbl.status.invalid', {
                        usageCount: usageCount
                    }));

                    StatusElm.addClass('quiqqer-coupons-manager-tbl-status-invalid');
Patrick Müller's avatar
Patrick Müller committed
                } else {
Patrick Müller's avatar
Patrick Müller committed
                    StatusElm.set('html', QUILocale.get(lg, 'controls.manager.tbl.status.valid', {
                        usageCount: usageCount
Patrick Müller's avatar
Patrick Müller committed
                    }));
Patrick Müller's avatar
Patrick Müller committed

                    StatusElm.addClass('quiqqer-coupons-manager-tbl-status-used');
Patrick Müller's avatar
Patrick Müller committed
                }

                Row.status = StatusElm;

                if (!Row.validUntilDate) {
                    Row.validUntilDateText = textUnlimited;
                } else {
                    Row.validUntilDateText = Row.validUntilDate;
Patrick Müller's avatar
Patrick Müller committed
                }

                if (!Row.title) {
                    Row.title = '-';
                }

                Row.maxUsageLabel = QUILocale.get(lg, 'controls.manager.tbl.maxUsageLabel.' + Row.maxUsages);
Patrick Müller's avatar
Patrick Müller committed
            }

            this.$Grid.setData(GridData);
        },

        /**
         * Create new CouponCode or edit an existing one
Patrick Müller's avatar
Patrick Müller committed
         *
         * @param {Object} [CouponData] - If omitted create new CouponCode
Patrick Müller's avatar
Patrick Müller committed
         */
        $showDetails: function (CouponData) {
Patrick Müller's avatar
Patrick Müller committed
            let Form;
            let DiscountSelect;
Patrick Müller's avatar
Patrick Müller committed

            CouponData = CouponData || false;
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
            var FuncSubmit = () => {
                if (!Form.reportValidity()) {
                    return;
                }
Patrick Müller's avatar
Patrick Müller committed

                Popup.Loader.show();

                if (CouponData) {
Patrick Müller's avatar
Patrick Müller committed
                    CouponCodes.edit(CouponData.id, QUIFormUtils.getFormData(Form)).then((couponCodeId) => {
                        if (!couponCodeId) {
                            Popup.Loader.hide();
                            return;
                        }

Patrick Müller's avatar
Patrick Müller committed
                        this.refresh();
                        Popup.close();
                    });

                    return;
                }
Patrick Müller's avatar
Patrick Müller committed
                CouponCodes.create(QUIFormUtils.getFormData(Form)).then((couponCodeId) => {
                    if (!couponCodeId) {
Patrick Müller's avatar
Patrick Müller committed
                        Popup.Loader.hide();
                        return;
                    }

Patrick Müller's avatar
Patrick Müller committed
                    require([
                        'package/quiqqer/translator/bin/classes/Translator'
                    ], (Translator) => {
                        new Translator().publish(lg).then(() => {
                            this.refresh();
                            Popup.close();
                        }).then(() => {
                            this.refresh();
                            Popup.close();
                        });
                    });
                }).catch(() => {
                    Popup.Loader.hide();
                });
            };

            var openDiscount = () => {
                Popup.Loader.show();

                require([
                    'package/quiqqer/discount/bin/controls/Discounts',
                    'utils/Panels'
                ], function (DiscountsManagerPanel, PanelUtils) {
                    const Panel = new DiscountsManagerPanel();

                    PanelUtils.openPanelInTasks(Panel).then((PanelOpened) => {
                        PanelOpened.editChild(parseInt(DiscountSelect.getValue()));
                        Popup.close();
                    });
Patrick Müller's avatar
Patrick Müller committed
                });
            };

            // open popup
            var lgPrefix = 'controls.manager.create.template.';

            var Popup = new QUIPopup({
                icon       : 'fa fa-plus',
                title      : CouponData ?
                    QUILocale.get(lg, 'controls.manager.details.popup.title_edit', {code: CouponData.code}) :
                    QUILocale.get(lg, 'controls.manager.details.popup.title_new'),
Patrick Müller's avatar
Patrick Müller committed
                maxHeight  : 1000,
                maxWidth   : 1000,
Patrick Müller's avatar
Patrick Müller committed
                events     : {
Patrick Müller's avatar
Patrick Müller committed
                    onOpen: (Win) => {
                        const Content = Popup.getContent();
Henning Leutz's avatar
Henning Leutz committed
                        Form = Content.getElement('form');
Patrick Müller's avatar
Patrick Müller committed

                        Form.addEvent('submit', function (event) {
                            event.stop();
                            FuncSubmit();
                        });

Patrick Müller's avatar
Patrick Müller committed
                        const Amount = Content.getElement('input[name="amount"]');
Henning Leutz's avatar
Henning Leutz committed
                        const Code = Content.getElement('input[name="code"]');

                        Code.addEvent('keyup', function () {
                            if (Code.value !== '') {
                                Amount.disabled = true;
Henning Leutz's avatar
Henning Leutz committed
                                Amount.value = 1;
                            } else {
                                Amount.disabled = false;
                            }
                        });

Patrick Müller's avatar
Patrick Müller committed
                        let EditDiscountBtn = false;

                        if (CouponData) {
                            CouponData.discountIds = CouponData.discountIds.join(',');
                            QUIFormUtils.setDataToForm(CouponData, Form);
Patrick Müller's avatar
Patrick Müller committed

                            EditDiscountBtn = new QUIButton({
                                'class'  : 'optional',
                                textimage: 'fa fa-percent',
                                text     : QUILocale.get(lg, 'controls.manager.details.popup.btn.open_discount'),
                                title    : QUILocale.get(lg, 'controls.manager.details.popup.btn.open_discount'),
                                events   : {
                                    onClick: openDiscount
                                },
                                styles   : {
                                    float: 'right'
                                }
                            }).inject(
                                Content.getElement('.quiqqer-coupons-manager-create-advanced-discount-buttons')
                            );
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
                        Win.Loader.show();
Patrick Müller's avatar
Patrick Müller committed

Patrick Müller's avatar
Patrick Müller committed
                        QUI.parse(Content).then(() => {
                            Win.Loader.hide();

                            if (!CouponData) {
                                return;
                            }

                            DiscountSelect = QUI.Controls.getById(
                                Content.getElement('input[name="discountIds"]').get('data-quiid')
                            );

                            DiscountSelect.addEvents({
Patrick Müller's avatar
Patrick Müller committed
                                onAddItem   : () => {
                                    EditDiscountBtn.enable();
                                },
                                onRemoveItem: () => {
                                    EditDiscountBtn.disable();
Patrick Müller's avatar
Patrick Müller committed
                        });
                    }
                },
                closeButton: true,
                content    : Mustache.render(templateCreate, {
Patrick Müller's avatar
Patrick Müller committed
                    labelTitle                 : QUILocale.get(lg, lgPrefix + 'labelTitle'),
                    labelCode                  : QUILocale.get(lg, lgPrefix + 'labelCode'),
                    labelUsers                 : QUILocale.get(lg, lgPrefix + 'labelUsers'),
                    labelGroups                : QUILocale.get(lg, lgPrefix + 'labelGroups'),
                    labelDate                  : QUILocale.get(lg, lgPrefix + 'labelDate'),
                    labelAmount                : QUILocale.get(lg, lgPrefix + 'labelAmount'),
                    labelReusable              : QUILocale.get(lg, lgPrefix + 'labelReusable'),
                    labelReusableOncePerUser   : QUILocale.get(lg, lgPrefix + 'labelReusableOncePerUser'),
                    labelReusableOnce          : QUILocale.get(lg, lgPrefix + 'labelReusableOnce'),
                    labelReusableUnlimited     : QUILocale.get(lg, lgPrefix + 'labelReusableUnlimited'),
                    labelDiscount              : QUILocale.get(lg, lgPrefix + 'labelDiscount'),
                    headerBasics               : QUILocale.get(lg, lgPrefix + 'headerBasics'),
                    headerDiscount             : QUILocale.get(lg, lgPrefix + 'headerDiscount'),
                    headerRestrictions         : QUILocale.get(lg, lgPrefix + 'headerRestrictions'),
                    descCode                   : QUILocale.get(lg, lgPrefix + 'descCode'),
                    descTitle                  : QUILocale.get(lg, lgPrefix + 'descTitle'),
                    labelDiscountAmount        : QUILocale.get(lg, lgPrefix + 'labelDiscountAmount'),
                    labelDiscountType          : QUILocale.get(lg, lgPrefix + 'labelDiscountType'),
                    labelDiscountTypeFlat      : QUILocale.get(lg, lgPrefix + 'labelDiscountTypeFlat'),
                    labelDiscountTypePercentage: QUILocale.get(lg, lgPrefix + 'labelDiscountTypePercentage'),

                    isCreate: !CouponData
Patrick Müller's avatar
Patrick Müller committed
                })
            });

            Popup.open();

            Popup.addButton(new QUIButton({
Patrick Müller's avatar
Patrick Müller committed
                name  : 'submit',
                text  : CouponData ?
                    QUILocale.get(lg, 'controls.manager.details.popup.btn.confirm_text_edit') :
                    QUILocale.get(lg, 'controls.manager.details.popup.btn.confirm_text_new'),
Patrick Müller's avatar
Patrick Müller committed
                alt   : CouponData ?
                    QUILocale.get(lg, 'controls.manager.details.popup.btn.confirm_edit') :
                    QUILocale.get(lg, 'controls.manager.details.popup.btn.confirm_new'),
Patrick Müller's avatar
Patrick Müller committed
                title : CouponData ?
                    QUILocale.get(lg, 'controls.manager.details.popup.btn.confirm_edit') :
                    QUILocale.get(lg, 'controls.manager.details.popup.btn.confirm_new'),
Patrick Müller's avatar
Patrick Müller committed
                events: {
Patrick Müller's avatar
Patrick Müller committed
                    onClick: FuncSubmit
                }
            }));
        },

        /**
         * Remove all selected licenses
         */
        $delete: function () {
Henning Leutz's avatar
Henning Leutz committed
            var self = this;
Patrick Müller's avatar
Patrick Müller committed
            var deleteData = [];
Henning Leutz's avatar
Henning Leutz committed
            var deleteIds = [];
            var rows = this.$Grid.getSelectedData();
Patrick Müller's avatar
Patrick Müller committed

            for (var i = 0, len = rows.length; i < len; i++) {
                deleteData.push(
                    rows[i].title + ' (ID: #' + rows[i].id + ')'
                );

                deleteIds.push(rows[i].id);
            }

            // open popup
            var Popup = new QUIConfirm({
                'maxHeight': 300,
                'autoclose': false,

                'information': QUILocale.get(
                    lg,
                    'controls.manager.delete.popup.info', {
                        codes: deleteData.join('<br/>')
                    }
                ),
                'title'      : QUILocale.get(lg, 'controls.manager.delete.popup.title'),
                'texticon'   : 'fa fa-trash',
                text         : QUILocale.get(lg, 'controls.manager.delete.popup.title'),
                'icon'       : 'fa fa-trash',

                cancel_button: {
                    text     : false,
                    textimage: 'icon-remove fa fa-remove'
                },
                ok_button    : {
                    text     : false,
                    textimage: 'icon-ok fa fa-check'
                },
                events       : {
                    onSubmit: function () {
                        Popup.Loader.show();

                        CouponCodes.delete(deleteIds).then(function (success) {
                            if (!success) {
                                Popup.Loader.hide();
                                return;
                            }

                            Popup.close();
                            self.refresh();
                        });
                    }
                }
            });

            Popup.open();
        },

        /**
         * Open user panel
         *
Patrick Müller's avatar
Patrick Müller committed
         * @param {Object} RowData
Patrick Müller's avatar
Patrick Müller committed
         */
Patrick Müller's avatar
Patrick Müller committed
        $showUsages: function (RowData) {
            new QUIConfirm({
                maxHeight: 550,
Patrick Müller's avatar
Patrick Müller committed
                autoclose: false,

                title: QUILocale.get(lg, 'controls.Manager.usages.title', {code: RowData.code}),
                icon : 'fa fa-user',

                cancel_button: false,
                ok_button    : {
                    text     : QUILocale.get(lg, 'controls.Manager.usages.btn_ok'),
Patrick Müller's avatar
Patrick Müller committed
                    textimage: 'icon-ok fa fa-check'
                },
                events       : {
                    onSubmit: function (Popup) {
                        Popup.close();
                    },
                    onOpen  : function (Popup) {
Patrick Müller's avatar
Patrick Müller committed
                        var lgPrefix = 'controls.Manager.usages.template.';

                        Popup.setContent(Mustache.render(templateUsages, {
                            headerUser           : QUILocale.get(lg, lgPrefix + 'headerUser'),
                            headerDate           : QUILocale.get(lg, lgPrefix + 'headerDate'),
                            headerOrderPrefixedId: QUILocale.get(lg, lgPrefix + 'headerOrderPrefixedId')
Patrick Müller's avatar
Patrick Müller committed
                        }));

Henning Leutz's avatar
Henning Leutz committed
                        var Content = Popup.getContent();
Patrick Müller's avatar
Patrick Müller committed
                        var TableBody = Content.getElement('tbody');

                        for (var i = 0, len = RowData.usages.length; i < len; i++) {
                            var usage = RowData.usages[i];

                            var Row = new Element('tr', {
Patrick Müller's avatar
Patrick Müller committed
                                html: '<td>' + usage.date + '</td>' +
Henning Leutz's avatar
Henning Leutz committed
                                      '<td>' + usage.userId + ' (' + usage.userName + ')</td>'
Patrick Müller's avatar
Patrick Müller committed
                            }).inject(TableBody);

                            new Element('td', {
                                html: usage.orderPrefixedId ? usage.orderPrefixedId : '-'
                            }).inject(Row);
Patrick Müller's avatar
Patrick Müller committed
                        }
                    }
                }
            }).open();
Patrick Müller's avatar
Patrick Müller committed
        }
    });
});