Skip to content
Code-Schnipsel Gruppen Projekte
Manager.js 22,3 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";

    const lg = 'quiqqer/coupons';
Patrick Müller's avatar
Patrick Müller committed

    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,
Patrick Müller's avatar
Patrick Müller committed
                onRefresh: this.$onRefresh,
                onResize: this.$onResize
Patrick Müller's avatar
Patrick Müller committed
            });
        },

        /**
         * Event: onCreate
         */
        $onCreate: function () {
            const self = this;
Patrick Müller's avatar
Patrick Müller committed

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

            this.addButton({
                name: 'create',
                text: QUILocale.get(lg, 'controls.manager.tbl.btn.create'),
Patrick Müller's avatar
Patrick Müller committed
                textimage: 'fa fa-plus',
                events: {
Patrick Müller's avatar
Patrick Müller committed
                    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',
                events: {
Patrick Müller's avatar
Patrick Müller committed
                    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'),
Patrick Müller's avatar
Patrick Müller committed
                textimage: 'fa fa-trash',
                events: {
Patrick Müller's avatar
Patrick Müller committed
                    onClick: this.$delete
                }
            });

            this.$load();
        },

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

        /**
         * event: onResize
         */
        $onResize: function () {
            if (this.$GridParent && this.$Grid) {
                const size = this.$GridParent.getSize();
Patrick Müller's avatar
Patrick Müller committed

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

        /**
         * Load Grid
         */
        $load: function () {
            const self = this;
Patrick Müller's avatar
Patrick Müller committed

            this.setContent(Mustache.render(template));
            const Content = this.getContent();
Patrick Müller's avatar
Patrick Müller committed

            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'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'id',
                        dataType: 'number',
                        width: 50
                        header: QUILocale.get(lg, 'controls.manager.tbl.header.code'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'code',
                        dataType: 'string',
                        width: 150
                        header: QUILocale.get(lg, 'controls.manager.tbl.header.title'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'title',
                        dataType: 'string',
                        width: 200
                        header: QUILocale.get(lg, 'controls.manager.tbl.header.status'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'status',
                        dataType: 'node',
                        width: 200,
Henning Leutz's avatar
Henning Leutz committed
                        className: 'clickable'
                    },
                    {
                        header: QUILocale.get(lg, 'controls.manager.tbl.header.validUntilDate'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'validUntilDateText',
                        dataType: 'string',
                        width: 150
                        header: QUILocale.get(lg, 'controls.manager.tbl.header.reusable'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'maxUsageLabel',
                        dataType: 'string',
                        width: 150
                        header: QUILocale.get(lg, 'controls.manager.tbl.header.createDate'),
Henning Leutz's avatar
Henning Leutz committed
                        dataIndex: 'createDate',
                        dataType: 'string',
                        width: 150
                pagination: true,
                serverSort: true,
                selectable: true,
Patrick Müller's avatar
Patrick Müller committed
                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) {
                    const selected = self.$Grid.getSelectedData();
Patrick Müller's avatar
Patrick Müller committed

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

                    const 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
Patrick Müller's avatar
Patrick Müller committed
            });

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

            const self = this;
Patrick Müller's avatar
Patrick Müller committed

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

            const GridParams = {
                sortOn: Grid.getAttribute('sortOn'),
                sortBy: Grid.getAttribute('sortBy'),
Patrick Müller's avatar
Patrick Müller committed
                perPage: Grid.getAttribute('perPage'),
                page: Grid.getAttribute('page')
Patrick Müller's avatar
Patrick Müller committed
            };

            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) {
            const textUnlimited = QUILocale.get(lg, 'controls.manager.tbl.validUntil.unlimited');
Patrick Müller's avatar
Patrick Müller committed

            for (let i = 0, len = GridData.data.length; i < len; i++) {
                const Row = GridData.data[i];
Patrick Müller's avatar
Patrick Müller committed

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

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

                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

            const FuncSubmit = () => {
Patrick Müller's avatar
Patrick Müller committed
                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();
                });
            };

            const openDiscount = () => {
Patrick Müller's avatar
Patrick Müller committed
                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
            const lgPrefix = 'controls.manager.create.template.';
Patrick Müller's avatar
Patrick Müller committed

            const 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: 1000,
                maxWidth: 1000,
                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',
Patrick Müller's avatar
Patrick Müller committed
                                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: {
Patrick Müller's avatar
Patrick Müller committed
                                    onClick: openDiscount
                                },
                                styles: {
Patrick Müller's avatar
Patrick Müller committed
                                    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({
                                onAddItem: () => {
Patrick Müller's avatar
Patrick Müller committed
                                    EditDiscountBtn.enable();
                                },
                                onRemoveItem: () => {
                                    EditDiscountBtn.disable();
Patrick Müller's avatar
Patrick Müller committed
                        });
                    }
                },
                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'),
                    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'),
Patrick Müller's avatar
Patrick Müller committed
                    labelDiscountTypePercentage: QUILocale.get(lg, lgPrefix + 'labelDiscountTypePercentage'),

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

            Popup.open();

            Popup.addButton(new QUIButton({
                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'),
                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'),
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 () {
            const self = this;
            const deleteData = [];
            const deleteIds = [];
            const rows = this.$Grid.getSelectedData();
Patrick Müller's avatar
Patrick Müller committed

            for (const i = 0, len = rows.length; i < len; i++) {
Patrick Müller's avatar
Patrick Müller committed
                deleteData.push(
                    rows[i].title + ' (ID: #' + rows[i].id + ')'
                );

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

            // open popup
            const Popup = new QUIConfirm({
Patrick Müller's avatar
Patrick Müller committed
                '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',
Patrick Müller's avatar
Patrick Müller committed

                cancel_button: {
                    text: false,
Patrick Müller's avatar
Patrick Müller committed
                    textimage: 'icon-remove fa fa-remove'
                },
                ok_button: {
                    text: false,
Patrick Müller's avatar
Patrick Müller committed
                    textimage: 'icon-ok fa fa-check'
                },
                events: {
Patrick Müller's avatar
Patrick Müller committed
                    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: 600,
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',
Patrick Müller's avatar
Patrick Müller committed

                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) {
                        const lgPrefix = 'controls.Manager.usages.template.';
Patrick Müller's avatar
Patrick Müller committed

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

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

                        for (const i = 0, len = RowData.usages.length; i < len; i++) {
                            const usage = RowData.usages[i];
Patrick Müller's avatar
Patrick Müller committed

                            const Row = new Element('tr', {
Patrick Müller's avatar
Patrick Müller committed
                                html: '<td>' + usage.date + '</td>' +
                                    '<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
        }
    });
});