Skip to content
Code-Schnipsel Gruppen Projekte
Manager.js 16,47 KiB
/**
 * Manage Invite Codes
 *
 * @module package/quiqqer/coupons/bin/controls/Manager
 * @author www.pcsg.de (Patrick Müller)
 */
define('package/quiqqer/coupons/bin/controls/Manager', [

    'qui/QUI',
    '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/CouponCodes',

    'Locale',
    'Mustache',

    'text!package/quiqqer/coupons/bin/controls/Manager.html',
    'text!package/quiqqer/coupons/bin/controls/Manager.Create.html',
    'text!package/quiqqer/coupons/bin/controls/Manager.Usages.html',
    'css!package/quiqqer/coupons/bin/controls/Manager.css'

], function (QUI, QUIPanel, QUILoader, QUIPopup, QUIConfirm, QUIButton, QUISeparator,
             Grid, QUIFormUtils, CouponCodes, QUILocale, Mustache, template, templateCreate,
             templateUsages) {
    "use strict";

    var lg = 'quiqqer/coupons';

    return new Class({

        Extends: QUIPanel,
        Type   : 'package/quiqqer/coupons/bin/controls/Manager',

        Binds: [
            '$onCreate',
            '$onResize',
            '$listRefresh',
            '$onRefresh',
            '$load',
            '$setGridData',
            '$create',
            '$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.$create();
                    }
                }
            });

            this.addButton({
                name     : 'quickcreate',
                text     : QUILocale.get(lg, 'controls.manager.tbl.btn.quickcreate'),
                textimage: 'fa fa-plus',
                events   : {
                    onClick: function () {
                        self.$create(true);
                    }
                }
            });

            this.addButton(new QUISeparator());

            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(
                '.quiqqer-coupons-manager-table'
            );

            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',
                    width    : 200,
                    className: 'clickable'
                }, {
                    header   : QUILocale.get(lg, 'controls.manager.tbl.header.validUntilDate'),
                    dataIndex: 'validUntilDate',
                    dataType : 'string',
                    width    : 150
                }, {
                    header   : QUILocale.get(lg, 'controls.manager.tbl.header.reusable'),
                    dataIndex: 'reusable',
                    dataType : 'node',
                    width    : 150
                }, {
                    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 () {
                    // @todo
                    //self.$managePackages(
                    //    self.$Grid.getSelectedData()[0].id
                    //);
                },
                onClick   : function (event) {
                    var selected = self.$Grid.getSelectedData();
                    self.getButtons('delete').enable();

                    if (!event.cell.hasClass('clickable')) {
                        return;
                    }

                    var Row = selected[0];
                    self.$showUsages(Row);
                },
                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();

            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) {
            var textUnlimited = QUILocale.get(lg, 'controls.manager.tbl.validUntil.unlimited');

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

                var StatusElm = new Element('span', {
                    'class': 'quiqqer-coupons-manager-tbl-status'
                });

                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');
                } else {
                    StatusElm.set('html', QUILocale.get(lg, 'controls.manager.tbl.status.valid', {
                        usageCount: usageCount
                    }));

                    StatusElm.addClass('quiqqer-coupons-manager-tbl-status-used');
                }

                Row.status = StatusElm;

                if (!Row.validUntilDate) {
                    Row.validUntilDate = textUnlimited;
                }

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

                var ReusableElm = new Element('span', {
                    'class': 'fa'
                });

                if (!Row.isReusable) {
                    ReusableElm.addClass('fa-close');
                } else {
                    ReusableElm.addClass('fa-check');
                }

                Row.reusable = ReusableElm;
            }

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

        /**
         * Create new InviteCode
         *
         * @param {Boolean} [quickCreate]
         */
        $create: function (quickCreate) {
            var self = this;

            quickCreate = quickCreate || false;

            if (quickCreate) {
                CouponCodes.create({}).then(function (inviteCodeId) {
                    if (!inviteCodeId) {
                        return;
                    }

                    self.refresh();
                });
                return;
            }

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

                Popup.Loader.show();

                CouponCodes.create(QUIFormUtils.getFormData(Form)).then(function (inviteCodeId) {
                    if (!inviteCodeId) {
                        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      : QUILocale.get(
                    lg, 'controls.manager.create.popup.title'
                ),
                maxHeight  : 800,
                maxWidth   : 450,
                events     : {
                    onOpen: function () {
                        var Content = Popup.getContent();
                        var Form    = Content.getElement('form');

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

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

                        Popup.Loader.show();

                        QUI.parse(Content).then(function () {
                            Popup.Loader.hide();
                        });
                    }
                },
                closeButton: true,
                content    : Mustache.render(templateCreate, {
                    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')
                })
            });

            Popup.open();

            Popup.addButton(new QUIButton({
                text  : QUILocale.get(lg, 'controls.manager.create.popup.btn.confirm_text'),
                alt   : QUILocale.get(lg, 'controls.manager.create.popup.btn.confirm'),
                title : QUILocale.get(lg, 'controls.manager.create.popup.btn.confirm'),
                events: {
                    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
         *
         * @param {Object} RowData
         */
        $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     : false,
                    textimage: 'icon-ok fa fa-check'
                },
                events       : {
                    onOpen: function (Popup) {
                        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');

                        console.log(TableBody);

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