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

/**
Henning Leutz's avatar
Henning Leutz committed
 * BrickEdit Control
 * 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)
 *
 * @event onLoaded [ this ]
 */

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

    'qui/QUI',
    'qui/controls/Control',
Henning Leutz's avatar
Henning Leutz committed
    'qui/utils/Form',
Henning Leutz's avatar
Henning Leutz committed
    'package/quiqqer/bricks/bin/BrickAreas',
Henning Leutz's avatar
Henning Leutz committed
    'Ajax',
    'Locale',
Henning Leutz's avatar
Henning Leutz committed
    'utils/Controls',
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, QUIControl, QUIFormUtils, BrickAreas, QUIAjax, QUILocale, ControlUtils)
Henning Leutz's avatar
Henning Leutz committed
{
    "use strict";

    return new Class({

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

        Binds : [
            '$onInject',
            '$onDestroy'
        ],

        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.addEvents({
                onInject  : this.$onInject,
                onDestroy : this.$onDestroy
            });
        },

        /**
         * Return the HTML Node Element
         *
         * @return {HTMLElement}
         */
        create : function()
        {
            this.$Elm = new Element('div', {
Henning Leutz's avatar
Henning Leutz committed
                'class' : 'quiqqer-bricks-brickedit'
Henning Leutz's avatar
Henning Leutz committed
            });

            return this.$Elm;
        },

        /**
         * event : on inject
         */
        $onInject : function()
        {
            var self = this;

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(data, 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
                 */
                self.$availableBricks   = bricks;
Henning Leutz's avatar
Henning Leutz committed
                self.$availableSettings = data.availableSettings;
Henning Leutz's avatar
Henning Leutz committed

                self.setAttributes(data.attributes);
                self.setAttribute('settings', data.settings);
Henning Leutz's avatar
Henning Leutz committed

                self.$createData().then(function() {
                    self.fireEvent('loaded', [self]);
Henning Leutz's avatar
Henning Leutz committed
                });

            }, {
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 ) {
                this.$Editor.destroy();
            }
        },

        /**
         * Create the html for the control
         *
         * @param {Function} [callback]
         */
        $createData : function(callback)
        {
Henning Leutz's avatar
Henning Leutz committed
            var self = this,
                id   = this.getId();
Henning Leutz's avatar
Henning Leutz committed

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

                QUIAjax.get('package_quiqqer_bricks_ajax_brick_settingTemplate', function(result)
Henning Leutz's avatar
Henning Leutz committed
                {
                    self.$Elm.set( 'html', result );

                    self.$createExtraData().then(function() {

                        // id and for attributes
                        self.$Elm.getElements( '[for]').each(function(Label)
                        {
                            var forAttr = Label.get( 'for'),
                                Sibling = self.$Elm.getElement( '[id="'+ forAttr +'"]' );

                            if ( Sibling )
                            {
                                Sibling.set( 'id', Sibling.id + id );
                                Label.set( 'for', forAttr + id );
                            }
                        });

                        // values
                        var Type  = self.$Elm.getElement( '[name="type"]' ),
                            Title = self.$Elm.getElement( '[name="title"]' ),
                            Desc  = self.$Elm.getElement( '[name="description"]' );

                        Title.value = self.getAttribute( 'title' );
                        Type.value  = self.getAttribute( 'type' );
                        Desc.value  = self.getAttribute( 'description' );

                        // areas
                        var areas = [];

                        if ( self.getAttribute( 'areas' ) )
                        {
                            areas = self.getAttribute('areas')
Henning Leutz's avatar
Henning Leutz committed
                                .replace(/^,*/, '')
                                .replace(/,*$/, '')
                                .split(',');
                        // areas
                        self.$Areas = new BrickAreas({
                            brickId     : self.getAttribute( 'id' ),
                            projectName : self.getAttribute( 'projectName' ),
                            projectLang : self.getAttribute( 'projectLang' ),
                            areas  : areas,
                            styles : {
                                height : 120
                            }
                        }).inject( self.$Elm.getElement( '.quiqqer-bricks-areas' )  );
                        return self.$createContentEditor( callback );
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed

                        resolve();
                    });

                }, {
                    'package' : 'quiqqer/bricks',
                    onError : reject
                });
Henning Leutz's avatar
Henning Leutz committed
            });
        },

        /**
         * Create the editor, if the brick type is a content type
         *
         * @param {Function} callback
Henning Leutz's avatar
Henning Leutz committed
         */
        $createContentEditor : function(callback)
        {
            return new Promise(function(resolve) {
Henning Leutz's avatar
Henning Leutz committed

                if (this.getAttribute('type') != 'content')
                {
                    this.$Elm
                        .getElement( 'table.brick-edit-content')
                        .setStyle( 'display', 'none' );
                    if ( typeof callback === 'function' ) {
                        callback();
                    }
Henning Leutz's avatar
Henning Leutz committed

                var self      = this,
                    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

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
                    {
                        self.$Editor = Editor;

                        var EditorContainer = new Element('div', {
                            styles : {
                                clear   : 'both',
                                'float' : 'left',
                                height  : 300,
                                width   : '100%'
                            }
                        }).inject( TD );

                        self.$Editor.addEvent('onLoaded', function()
                        {
                            if ( typeof callback === 'function' ) {
                                callback();
                            }

                            resolve();
                        });

                        self.$Editor.inject( EditorContainer );
                        self.$Editor.setHeight( EditorContainer.getSize().y );
                        self.$Editor.setWidth( EditorContainer.getSize().x );
                        self.$Editor.setContent( self.getAttribute( 'content' ) );
Henning Leutz's avatar
Henning Leutz committed
                    });
                });
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' );
                    resolve();
                    return;
                }
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 );

                // set data
                QUIFormUtils.setDataToForm( this.getAttribute( '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 )
                        {
                            Control.setProject(
                                self.getAttribute( 'projectName' ),
                                self.getAttribute( 'projectLang' )
                            );
                        }
                    });

                    resolve();

                }).catch(reject);

            }.bind(this));
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
Henning Leutz's avatar
Henning Leutz committed
         * Saves the brick
Henning Leutz's avatar
Henning Leutz committed
         */
        save : function(callback)
        {
            var i, len, Control;

Henning Leutz's avatar
Henning Leutz committed
            var Type  = this.$Elm.getElement( '[name="type"]' ),
Henning Leutz's avatar
Henning Leutz committed
                Title = this.$Elm.getElement( '[name="title"]'),
                Desc  = this.$Elm.getElement( '[name="description"]'),

                quiElements = this.$Elm.getElements( '[data-quiid]' );
Henning Leutz's avatar
Henning Leutz committed

            var data = {
Henning Leutz's avatar
Henning Leutz committed
                title       : Title.value,
                description : Desc.value,
                type        : Type.value,
                content     : '',
                areas       : this.$Areas.getAreas().join(',')
Henning Leutz's avatar
Henning Leutz committed
            };

            if ( this.$Editor ) {
                data.content = this.$Editor.getContent();
            }

            for ( i = 0, len = quiElements.length; i < len; i++ )
            {
                Control = QUI.Controls.getById( quiElements[ i ].get( 'data-quiid' ) );

                if ( Control && typeOf( Control ) == 'controls/editors/Editor' ) {
                    Control.getContent();
                }
            }

Henning Leutz's avatar
Henning Leutz committed
            // settings
Henning Leutz's avatar
Henning Leutz committed
            var Form = this.$Elm.getElement( '.brick-edit-extra-header-form');
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
            if ( Form ) {
                data.settings = QUIFormUtils.getFormData( Form );
Henning Leutz's avatar
Henning Leutz committed
            }

Henning Leutz's avatar
Henning Leutz committed
            QUIAjax.post('package_quiqqer_bricks_ajax_brick_save', function()
Henning Leutz's avatar
Henning Leutz committed
            {
                if ( typeof callback === 'function'  ) {
                    callback();
                }
            }, {
Henning Leutz's avatar
Henning Leutz committed
                'package' : 'quiqqer/brick',
                brickId   : this.getAttribute( 'id' ),
Henning Leutz's avatar
Henning Leutz committed
                data      : JSON.encode( data )
            });
        }
    });
});