Skip to content
Code-Schnipsel Gruppen Projekte
BrickEdit.js 21,3 KiB
Newer Older
Henning Leutz's avatar
Henning Leutz committed

/**
Henning Leutz's avatar
Henning Leutz committed
 * BrickEdit Panel
Henning Leutz's avatar
Henning Leutz committed
 * Edit and change a Brick
Henning Leutz's avatar
Henning Leutz committed
 *
Henning Leutz's avatar
Henning Leutz committed
 * @module package/quiqqer/bricks/bin/BrickEdit
Henning Leutz's avatar
Henning Leutz committed
 * @author www.pcsg.de (Henning Leutz)
 *
 * @require qui/QUI
 * @require qui/controls/desktop/Panel
 * @require package/quiqqer/bricks/bin/BrickAreas
 * @require Ajax
 * @require Locale
 * @require qui/utils/Form
 * @require utils/Controls
 * @require utils/Template
 * @require css!package/quiqqer/bricks/bin/BrickEdit.css
 *
Henning Leutz's avatar
Henning Leutz committed
 * @event onLoaded [ this ]
 * @event onSave [ this ]
Henning Leutz's avatar
Henning Leutz committed
 * @event onDelete [ this ]
Henning Leutz's avatar
Henning Leutz committed
 */

Henning Leutz's avatar
Henning Leutz committed
define('package/quiqqer/bricks/bin/BrickEdit', [
Henning Leutz's avatar
Henning Leutz committed

    'qui/QUI',
    'qui/controls/desktop/Panel',
Henning Leutz's avatar
Henning Leutz committed
    'qui/controls/windows/Confirm',
Henning Leutz's avatar
Henning Leutz committed
    'package/quiqqer/bricks/bin/BrickAreas',
Henning Leutz's avatar
Henning Leutz committed
    'Ajax',
    'Locale',
    'qui/utils/Form',
Henning Leutz's avatar
Henning Leutz committed
    'utils/Controls',
    'utils/Template',
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
    'css!package/quiqqer/bricks/bin/BrickEdit.css'
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
], function(QUI, QUIPanel, QUIConfirm, BrickAreas, QUIAjax, QUILocale, QUIFormUtils, ControlUtils, Template)
Henning Leutz's avatar
Henning Leutz committed
{
    "use strict";

Henning Leutz's avatar
Henning Leutz committed
    var lg = 'quiqqer/bricks';

Henning Leutz's avatar
Henning Leutz committed
    return new Class({

        Extends : QUIPanel,
Henning Leutz's avatar
Henning Leutz committed
        Type    : 'package/quiqqer/bricks/bin/BrickEdit',
Henning Leutz's avatar
Henning Leutz committed

        Binds : [
            '$onInject',
            '$onCreate',
            '$onDestroy',
            '$load',
            '$unload',
Henning Leutz's avatar
Henning Leutz committed
            'save',
            'del'
Henning Leutz's avatar
Henning Leutz committed
        ],

        options : {
            id : false,
            projectName : false,
            projectLang : false
Henning Leutz's avatar
Henning Leutz committed
        },

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

            this.$availableBricks   = [];
            this.$availableSettings = [];
Henning Leutz's avatar
Henning Leutz committed

            this.$Editor = false;
            this.$Areas  = false;
            this.$Active = false;
Henning Leutz's avatar
Henning Leutz committed

            this.addEvents({
                onInject : this.$onInject,
                onCreate : this.$onCreate,
Henning Leutz's avatar
Henning Leutz committed
                onDestroy : this.$onDestroy
            });
        },

        /**
         * event : on create
Henning Leutz's avatar
Henning Leutz committed
         */
        $onCreate : function()
Henning Leutz's avatar
Henning Leutz committed
        {
            this.setAttributes({
Henning Leutz's avatar
Henning Leutz committed
                icon  : 'icon-spinner icon-spin fa fa-spinner fa-spin',
                title : '...'
            });

            this.addButton({
                name : 'save',
                textimage : 'fa fa-save icon-save',
                text : QUILocale.get('quiqqer/system', 'save'),
                events : {
                    click : this.save
                }
            });

            this.addButton({
                name : 'delete',
                icon : 'fa fa-trash-o icon-trash',
                title : QUILocale.get('quiqqer/system', 'delete'),
                events : {
Henning Leutz's avatar
Henning Leutz committed
                    click : this.del
                },
                styles : {
                    'float' : 'right'
                }
            });

            this.addCategory({
                name : 'information',
                icon : 'fa fa-file-o icon-file-alt',
                text : QUILocale.get('quiqqer/system', 'information'),
                events : {
                    onActive : this.$load
                }
Henning Leutz's avatar
Henning Leutz committed
            });

            this.addCategory({
                name : 'content',
                icon : 'icon-file-text-alt',
                text : QUILocale.get('quiqqer/system', 'content'),
                events : {
                    onActive : this.$load
                }
            });

            this.addCategory({
                name : 'settings',
                icon : 'icon-magic',
                text : QUILocale.get('quiqqer/system', 'properties'),
                events : {
                    onActive : this.$load
                }
            });

            this.addCategory({
                name : 'extra',
                icon : 'fa fa-gears icon-gears',
                text : QUILocale.get('quiqqer/system', 'settings'),
                events : {
                    onActive : this.$load
                }
            });
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * event : on inject
         */
        $onInject : function()
        {
            this.Loader.show();
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
            QUIAjax.get([
Henning Leutz's avatar
Henning Leutz committed
                'package_quiqqer_bricks_ajax_getBrick',
                'package_quiqqer_bricks_ajax_getAvailableBricks'
            ], function(brick, bricks)
Henning Leutz's avatar
Henning Leutz committed
            {
Henning Leutz's avatar
Henning Leutz committed
                /**
                 * @param {{availableSettings:object}} data
                 * @param {{attributes:object}} data
                 * @param {{settings:object}} data
                 */
                this.$availableBricks   = bricks;
                this.$availableSettings = brick.availableSettings;
Henning Leutz's avatar
Henning Leutz committed

                this.setAttribute('data', brick);
Henning Leutz's avatar
Henning Leutz committed

                this.setAttributes({
                    icon  : 'icon-th',
                    title :  QUILocale.get('quiqqer/bricks', 'panel.title', {
                        brickId    : this.getAttribute('id'),
                        brickTitle : brick.attributes.title
                    })
Henning Leutz's avatar
Henning Leutz committed
                });

                this.refresh();

                this.fireEvent('loaded', [this]);
                this.getCategory('information').click();

            }.bind(this), {
Henning Leutz's avatar
Henning Leutz committed
                'package' : 'quiqqer/brick',
                brickId   : this.getAttribute('id')
Henning Leutz's avatar
Henning Leutz committed
            });
        },

        /**
         * event : on destroy
         */
        $onDestroy : function()
        {
            if (this.$Editor) {
Henning Leutz's avatar
Henning Leutz committed
                this.$Editor.destroy();
            }

            if (this.$Areas) {
                this.$Areas.destroy();
            }
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * Saves the brick
Henning Leutz's avatar
Henning Leutz committed
         *
         * @return Promise
         */
        save : function(callback)
        {
            var Active = this.$Active;

            this.Loader.show();
            this.$unload();

            return this.$load(Active).then(function() {

                return new Promise(function(resolve, reject)
                {
                    QUIAjax.post('package_quiqqer_bricks_ajax_brick_save', function ()
                    {
                        if (typeof callback === 'function') {
                            callback();
                        }

                        resolve();

                        this.fireEvent('save', [this]);
                        this.Loader.hide();

                    }.bind(this), {
                        'package': 'quiqqer/brick',
                        brickId  : this.getAttribute('id'),
                        data     : JSON.encode(this.getAttribute('data').attributes),
                        onError  : reject
                    });

                }.bind(this));

            }.bind(this));
        },

Henning Leutz's avatar
Henning Leutz committed
        /**
         * Delete the brick
         */
        del : function()
        {
            var self = this;

            new QUIConfirm({
                title : QUILocale.get(lg, 'window.brick.delete.title'),
                text  : QUILocale.get(lg, 'window.brick.delete.text'),
                information : QUILocale.get(lg, 'window.brick.delete.information'),
                maxHeight : 300,
                maxWidth  : 600,
                autoclose : false,
                events : {
                    onSubmit : function(Win) {
                        Win.Loader.show();

                        QUIAjax.post('package_quiqqer_bricks_ajax_brick_delete', function()
                        {
                            Win.close();

                            self.fireEvent('delete');
                            self.destroy();
                        }, {
                            'package' : 'quiqqer/bricks',
                            brickIds  : JSON.encode([self.getAttribute('id')])
                        });
                    }
                }
            }).open();
        },

        /**
         * event on button active
         *
         * @param {Object} Button - qui/controls/buttons/Button
         *
         * @return Promise
Henning Leutz's avatar
Henning Leutz committed
         */
        $load : function(Button)
Henning Leutz's avatar
Henning Leutz committed
        {
            this.Loader.show();
Henning Leutz's avatar
Henning Leutz committed

            return new Promise(function(resolve, reject) {
Henning Leutz's avatar
Henning Leutz committed

                var Prom = false,
                    self = this;

                if (Button == this.$Active) {
                    reject();
                    self.Loader.hide();
                    return;
                }

                var data = this.getAttribute('data');

                this.$unload();

                this.setAttribute('data', data);
                this.$Active = Button;

                switch (Button.getAttribute('name'))
Henning Leutz's avatar
Henning Leutz committed
                {
                    case 'information':
                        Prom = this.$showInformation();
                        break;
                    case 'settings':
                        Prom = this.$showSettings();
                        break;
                    case 'extra':
                        Prom = this.$showExtras();
                        break;
                    case 'content':
                        Prom = this.$showContent();
                        break;

                    default:
                        reject();
                        return;
                }

                if (!Prom) {
                    reject();
                    self.Loader.hide();
                    return;
                }
                Prom.then(function() {
                    resolve();
                    self.Loader.hide();
                }).catch(function() {
                    reject();
                    self.Loader.hide();
                });
            }.bind(this));
        },

        /**
         * event unload category
         */
        $unload : function()
        {
            if (!this.$Active) {
                return;
            }

            var Form   = this.getContent().getElement('form'),
                unload = this.$Active.getAttribute('name'),
                data   = this.getAttribute('data');

            if (unload == 'information') {

                data.attributes = Object.merge(
                    data.attributes,
                    QUIFormUtils.getFormData(Form)
                );
            }

            if (unload == 'settings') {
                data.attributes.areas = this.$Areas.getAreas().join(',');
                data.attributes.width = Form.elements.width.value;
                data.attributes.height = Form.elements.height.value;

                this.$Areas.destroy();
                this.$Areas = false;
            }

            if (unload == 'extra') {
                data.settings = QUIFormUtils.getFormData(Form);
            }

            if (unload == 'content') {
                data.attributes.content = this.$Editor.getContent();

                this.$Editor.destroy();
                this.$Editor = false;
            }

            this.$Active = null;

            this.setAttribute('data', data);
        },

        /**
         * Information template
         *
         * @returns {Promise}
         */
        $showInformation : function()
        {
            return new Promise(function(resolve, reject) {

                Template.get('ajax/brick/templates/information', function(result)
                {
                    this.setContent(result);

                    QUIFormUtils.setDataToForm(
                        this.getAttribute('data').attributes,
                        this.getContent().getElement('form')
                    );

                    resolve();

                }.bind(this), {
                    'package' : 'quiqqer/bricks',
                    onError   : reject
                });

            }.bind(this));
        },

        /**
         * Settings template
         *
         * @returns {Promise}
         */
        $showSettings : function()
        {
            return new Promise(function(resolve, reject) {

                Template.get('ajax/brick/templates/settings', function(result)
                {
                    this.setContent(result);

                    // areas
                    var Content = this.getContent(),
                        areas = [],
                        attributes = this.getAttribute('data').attributes;

                    if (attributes.areas)
                    {
                        areas = attributes.areas
                                    .replace(/^,*/, '')
                                    .replace(/,*$/, '')
                                    .split(',');
                    }

                    // areas
                    this.$Areas = new BrickAreas({
                        brickId     : this.getAttribute('id'),
                        projectName : this.getAttribute('projectName'),
                        projectLang : this.getAttribute('projectLang'),
                        areas  : areas,
                        styles : {
                            height : 120
                    }).inject(Content.getElement('.quiqqer-bricks-areas'));
                    if ("width" in attributes) {
                        Content.getElement('[name="width"]').value = attributes.width;
                    }
                    if ("height" in attributes) {
                        Content.getElement('[name="height"]').value = attributes.height;
                    }
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed

                }.bind(this), {
                    'package' : 'quiqqer/bricks',
                    onError   : reject
                });

            }.bind(this));
        },

        /**
         * Setting extras
         *
         * @returns {Promise}
         */
        $showExtras : function()
        {
            return new Promise(function(resolve, reject) {

                Template.get('ajax/brick/templates/extras', function(result)
                {
                    this.setContent(result);

                    this.$createExtraData().then(function() {
                }.bind(this), {
                    'package' : 'quiqqer/bricks',
                    onError   : reject
         * Setting content
Henning Leutz's avatar
Henning Leutz committed
         *
         * @returns {Promise}
Henning Leutz's avatar
Henning Leutz committed
         */
        $showContent : function()
Henning Leutz's avatar
Henning Leutz committed
        {
            return new Promise(function(resolve, reject) {
Henning Leutz's avatar
Henning Leutz committed

                Template.get('ajax/brick/templates/content', function(result)
                    this.setContent(result);
                    this.$createContentEditor().then(function() {
                        resolve();
                    });
Henning Leutz's avatar
Henning Leutz committed

                }.bind(this), {
                    'package' : 'quiqqer/bricks',
                    onError   : reject
                });
            }.bind(this));
        },

        /**
         * Create the editor, if the brick type is a content type
         *
         * @param {Function} [callback]
         * @return Promise
         */
        $createContentEditor : function(callback)
        {
            return new Promise(function(resolve) {

                var TableBody = this.$Elm.getElement('table.brick-edit-content tbody'),
Henning Leutz's avatar
Henning Leutz committed

                    TD = new Element('td'),
                    TR = new Element('tr', {
                        'class' : 'odd'
                    });
Henning Leutz's avatar
Henning Leutz committed

                TD.inject(TR);
                TR.inject(TableBody);
Henning Leutz's avatar
Henning Leutz committed

                var contenSize = this.getContent().getSize();
Henning Leutz's avatar
Henning Leutz committed

                // load ckeditor
                require(['classes/editor/Manager'], function(EditorManager)
                {
                    new EditorManager().getEditor(null, function(Editor)
Henning Leutz's avatar
Henning Leutz committed
                    {
                        this.$Editor = Editor;
                        this.$Editor.setAttribute('showLoader', false);

                        var height = 300;

                        if ((contenSize.y - 100) > height) {
                            height = contenSize.y - 100;
                        }


                        var EditorContainer = new Element('div', {
                            styles : {
                                clear   : 'both',
                                'float' : 'left',
                                height  : height,
                        this.$Editor.addEvent('onLoaded', function()
                            if (typeof callback === 'function') {
                        this.$Editor.inject( EditorContainer );
                        this.$Editor.setHeight( EditorContainer.getSize().y );
                        this.$Editor.setWidth( EditorContainer.getSize().x );
                        this.$Editor.setContent(
                            this.getAttribute('data').attributes.content
                        );
                    }.bind(this));
                }.bind(this));
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * Create the extra settings table
Henning Leutz's avatar
Henning Leutz committed
         */
        $createExtraData : function()
        {
            return new Promise(function(resolve, reject)
Henning Leutz's avatar
Henning Leutz committed
            {
                var TableExtra = this.$Elm.getElement('table.brick-edit-extra-header'),
                    TableBody  = TableExtra.getElement('tbody');
Henning Leutz's avatar
Henning Leutz committed

                if (!this.$availableSettings || !this.$availableSettings.length)
                {
                    TableExtra.setStyle('display', 'none');
Henning Leutz's avatar
Henning Leutz committed

                TableExtra.setStyle( 'display', null );
Henning Leutz's avatar
Henning Leutz committed

                var Form = new Element('form', {
                    'class' : 'brick-edit-extra-header-form'
                }).wraps( TableExtra );
Henning Leutz's avatar
Henning Leutz committed

                var i, len, Row, text, Value, setting, extraFieldId;
Henning Leutz's avatar
Henning Leutz committed

                var self = this,
                    id   = this.getId();
Henning Leutz's avatar
Henning Leutz committed

                // extra settings
                for (i = 0, len = this.$availableSettings.length; i < len; i++)
                {
                    setting      = this.$availableSettings[ i ];
                    extraFieldId = 'extraField_'+ id +'_'+ i;
Henning Leutz's avatar
Henning Leutz committed

                    if (typeOf(setting.text) === 'array') {
                        text = QUILocale.get(setting.text[ 0 ], setting.text[ 1 ]);
                    }
                    Row = new Element('tr', {
                        'class' : i % 2 ? 'even' : 'odd',
                        html : '<td>' +
                               '    <label class="quiqqer-bricks-areas" for="'+ extraFieldId +'">' +
                                        text +
                               '    </label>' +
                               '</td>' +
                               '<td></td>'
                    }).inject(TableBody);
Henning Leutz's avatar
Henning Leutz committed

                    if (setting.type != 'select')
                    {
                        Value = new Element('input', {
                            type    : setting.type,
                            name    : setting.name,
                            'class' : setting.class,
                            id      : extraFieldId
                        }).inject(Row.getElement('td:last-child'));

                        if (setting['data-qui'] !== '') {
                            Value.set('data-qui', setting['data-qui']);
                        }
Henning Leutz's avatar
Henning Leutz committed

                        continue;
                    }

                    Value = new Element('select', {
                        name    : setting.name,
                        'class' : setting.class,
                        id      : extraFieldId
                    }).inject(Row.getElement('td:last-child'));
                    for (var c = 0, clen = setting.options.length; c < clen; c++)
Henning Leutz's avatar
Henning Leutz committed
                    {
                        text = setting.options[c].text;

                        if (typeOf(setting.options[c].text) === 'array') {
                            text = QUILocale.get(
                                setting.options[c].text[ 0 ],
                                setting.options[c].text[ 1 ]
                            );
                        }

                        new Element('option', {
                            html  : text,
                            value : setting.options[c].value
                        }).inject(Value);
Henning Leutz's avatar
Henning Leutz committed
                    }
                TableExtra.setStyle('display', null);
                QUIFormUtils.setDataToForm(
                    this.getAttribute('data').settings,
                    Form
                );

                // parse controls
                QUI.parse(TableExtra).then(function() {
                    return ControlUtils.parse(TableExtra);

                }).then(function()
                {
                    // set project to the controls
                    TableExtra.getElements('[data-quiid]').each(function(Elm)
                    {
                        var Control = QUI.Controls.getById(
                            Elm.get('data-quiid')
                        );

                        if ('setProject' in Control)
                                self.getAttribute('projectName'),
                                self.getAttribute('projectLang')
Henning Leutz's avatar
Henning Leutz committed
        }
    });
});