Skip to content
Code-Schnipsel Gruppen Projekte
Manager.js 21 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);

            this.Loader      = new QUILoader();
            this.$User       = null;
            this.$Grid       = null;
            this.$GridParent = null;
            this.$Panel      = null;

            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, {
                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',
Patrick Müller's avatar
Patrick Müller committed
                    width    : 200,
                    className: 'clickable'
Patrick Müller's avatar
Patrick Müller committed
                }, {
                    header   : QUILocale.get(lg, 'controls.manager.tbl.header.validUntilDate'),
                    dataIndex: 'validUntilDateText',
Patrick Müller's avatar
Patrick Müller committed
                    dataType : 'string',
                    width    : 150
Patrick Müller's avatar
Patrick Müller committed
                }, {
                    header   : QUILocale.get(lg, 'controls.manager.tbl.header.reusable'),
                    dataIndex: 'reusableStatus',
Patrick Müller's avatar
Patrick Müller committed
                    dataType : 'node',
                    width    : 150
Patrick Müller's avatar
Patrick Müller committed
                }, {
                    header   : QUILocale.get(lg, 'controls.manager.tbl.header.createDate'),
                    dataIndex: 'createDate',
                    dataType : 'string',
                    width    : 150
                }],
                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 = '-';
                }

Patrick Müller's avatar
Patrick Müller committed
                var ReusableElm = new Element('span', {
Patrick Müller's avatar
Patrick Müller committed
                    'class': 'fa'
                });

                if (!Row.reusable) {
Patrick Müller's avatar
Patrick Müller committed
                    ReusableElm.addClass('fa-close');
Patrick Müller's avatar
Patrick Müller committed
                } else {
Patrick Müller's avatar
Patrick Müller committed
                    ReusableElm.addClass('fa-check');
Patrick Müller's avatar
Patrick Müller committed
                }

                Row.reusableStatus = ReusableElm;
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
            var self = this;

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

            var FuncSubmit = function () {
                var Content = Popup.getContent();
                var Form    = Content.getElement('form');

                Popup.Loader.show();

                if (CouponData) {
                    CouponCodes.edit(CouponData.id, QUIFormUtils.getFormData(Form)).then(function (couponCodeId) {
                        if (!couponCodeId) {
                            Popup.Loader.hide();
                            return;
                        }

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

                    return;
                }

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

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

            // 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'),
                maxHeight  : 335,
Patrick Müller's avatar
Patrick Müller committed
                maxWidth   : 450,
                events     : {
                    onOpen: function () {
                        var Content   = Popup.getContent();
                        var Form      = Content.getElement('form');
                        var SubmitBtn = Popup.getButton('submit');
Patrick Müller's avatar
Patrick Müller committed

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

                        var Settings = Content.getElement('.quiqqer-coupons-manager-create-settings');
                        var Amount   = Content.getElement('input[name="amount"]');
                        var Code     = Content.getElement('input[name="code"]');

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

                        new QUIButton({
                            textimage: 'fa fa-cogs',
                            text     : QUILocale.get(lg, 'controls.Manager.create.settings_btn.show'),
                            events   : {
                                onClick: function (Btn) {
                                    if (Settings.getStyle('display') === 'none') {
                                        Settings.setStyle('display', 'block');

                                        Btn.setAttribute(
                                            'text',
                                            QUILocale.get(lg, 'controls.Manager.create.settings_btn.hide')
                                        );

                                        Content.getElement('input[name="title"]').focus();

                                        Popup.setAttribute('maxHeight', 850);
                                        Popup.resize();
                                    } else {
                                        Settings.setStyle('display', 'none');

                                        Btn.setAttribute(
                                            'text',
                                            QUILocale.get(lg, 'controls.Manager.create.settings_btn.show')
                                        );

                                        Popup.setAttribute('maxHeight', 335);
                                        Popup.resize();
                                    }
                                }
                            }
                        }).inject(Content.getElement(
                            '.quiqqer-coupons-manager-create-settings-btn'
                        ));

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

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

Patrick Müller's avatar
Patrick Müller committed
                        QUI.parse(Content).then(function () {
                            var DiscountSelect = QUI.Controls.getById(
                                Content.getElement('input[name="discountIds"]').get('data-quiid')
                            );

                            DiscountSelect.addEvents({
                                onChange: function () {
                                    if (DiscountSelect.getValue() === '') {
                                        SubmitBtn.disable();
                                    } else {
                                        SubmitBtn.enable();
                                    }
                                }
                            });

Patrick Müller's avatar
Patrick Müller committed
                            Popup.Loader.hide();
Patrick Müller's avatar
Patrick Müller committed
                        });
                    }
                },
                closeButton: true,
                content    : Mustache.render(templateCreate, {
                    labelTitle   : QUILocale.get(lg, lgPrefix + 'labelTitle'),
Patrick Müller's avatar
Patrick Müller committed
                    labelCode    : QUILocale.get(lg, lgPrefix + 'labelCode'),
                    labelUsers   : QUILocale.get(lg, lgPrefix + 'labelUsers'),
                    labelGroups  : QUILocale.get(lg, lgPrefix + 'labelGroups'),
Patrick Müller's avatar
Patrick Müller committed
                    labelDate    : QUILocale.get(lg, lgPrefix + 'labelDate'),
Patrick Müller's avatar
Patrick Müller committed
                    labelAmount  : QUILocale.get(lg, lgPrefix + 'labelAmount'),
                    labelReusable: QUILocale.get(lg, lgPrefix + 'labelReusable'),
                    labelDiscount: QUILocale.get(lg, lgPrefix + 'labelDiscount')
Patrick Müller's avatar
Patrick Müller committed
                })
            });

            Popup.open();

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

        /**
         * Remove all selected licenses
         */
        $delete: function () {
            var self       = this;
            var deleteData = [];
            var deleteIds  = [];
            var rows       = this.$Grid.getSelectedData();

            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,
                maxWidth : 400,
                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')
                        }));

                        var Content   = Popup.getContent();
                        var TableBody = Content.getElement('tbody');

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

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