Skip to content
Code-Schnipsel Gruppen Projekte
BrickEdit.js 11,6 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 );
Henning Leutz's avatar
Henning Leutz committed
                self.setAttribute( 'settings', data.settings );

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

            }, {
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

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();
Henning Leutz's avatar
Henning Leutz committed

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

Henning Leutz's avatar
Henning Leutz committed
                    if ( Sibling )
                    {
                        Sibling.set( 'id', Sibling.id + id );
                        Label.set( 'for', forAttr + id );
Henning Leutz's avatar
Henning Leutz committed
                    }
Henning Leutz's avatar
Henning Leutz committed
                });
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
                // values
                var Type  = self.$Elm.getElement( '[name="type"]' ),
                    Title = self.$Elm.getElement( '[name="title"]' ),
                    Desc  = self.$Elm.getElement( '[name="description"]' );
Henning Leutz's avatar
Henning Leutz committed
                Title.value = self.getAttribute( 'title' );
                Type.value  = self.getAttribute( 'type' );
                Desc.value  = self.getAttribute( 'description' );
Henning Leutz's avatar
Henning Leutz committed
                // areas
                var areas = [];
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
                if ( self.getAttribute( 'areas' ) )
Henning Leutz's avatar
Henning Leutz committed
                    areas = self.getAttribute('areas')
                                .replace(/^,*/, '')
                                .replace(/,*$/, '')
                                .split(',');
                }
Henning Leutz's avatar
Henning Leutz committed
                // 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' )  );
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
                // editor
                self.$createContentEditor( callback );

            }, {
                'package' : 'quiqqer/bricks'
            });
        },

        /**
         * Create the editor, if the brick type is a content type
         *
         * @param {Function} callback
         */
        $createContentEditor : function(callback)
        {
            if ( this.getAttribute( 'type' ) != 'content' )
Henning Leutz's avatar
Henning Leutz committed
            {
Henning Leutz's avatar
Henning Leutz committed
                this.$Elm
                    .getElement( 'table.brick-edit-content')
                    .setStyle( 'display', 'none' );
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
                if ( typeof callback === 'function' ) {
                    callback();
Henning Leutz's avatar
Henning Leutz committed
                return;
Henning Leutz's avatar
Henning Leutz committed
            }

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

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)
Henning Leutz's avatar
Henning Leutz committed
            {
Henning Leutz's avatar
Henning Leutz committed
                new EditorManager().getEditor(null, function(Editor)
Henning Leutz's avatar
Henning Leutz committed
                {
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()
Henning Leutz's avatar
Henning Leutz committed
                    {
Henning Leutz's avatar
Henning Leutz committed
                        if ( typeof callback === 'function' ) {
                            callback();
                        }
Henning Leutz's avatar
Henning Leutz committed
                    });
Henning Leutz's avatar
Henning Leutz committed

                    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
         */
        $createExtraData : function()
        {
            var TableExtra = this.$Elm.getElement( 'table.brick-edit-extra-header'),
                TableBody  = TableExtra.getElement( 'tbody' );
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
            if ( !this.$availableSettings || !this.$availableSettings.length )
            {
                TableExtra.setStyle( 'display', 'none' );
Henning Leutz's avatar
Henning Leutz committed
                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

Henning Leutz's avatar
Henning Leutz committed
            var i, len, setting, dataQui, extraFieldId;

            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++ )
            {
Henning Leutz's avatar
Henning Leutz committed
                setting      = this.$availableSettings[ i ];
                dataQui      = '';
                extraFieldId = 'extraField_'+ id +'_'+ i;
Henning Leutz's avatar
Henning Leutz committed

                if ( setting['data-qui'] !== '' ) {
                    dataQui = ' data-qui="'+ setting['data-qui'] +'" ';
                }
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
                new Element('tr', {
                    'class' : i % 2 ? 'even' : 'odd',
                    html : '<td>' +
Henning Leutz's avatar
Henning Leutz committed
                           '    <label class="quiqqer-bricks-areas" for="'+ extraFieldId +'">' +
Henning Leutz's avatar
Henning Leutz committed
                                     setting.text +
                           '    </label>' +
                           '</td>' +
                           '<td>' +
                           '    <input type="'+ setting.type +'" ' +
                           '           name="'+ setting.name +'" ' +
                           '           class="'+ setting.class +'" ' +
Henning Leutz's avatar
Henning Leutz committed
                           '           id="'+ extraFieldId +'"' +
Henning Leutz's avatar
Henning Leutz committed
                                       dataQui +
                           '    />' +
                           '</td>'
                }).inject( TableBody );
Henning Leutz's avatar
Henning Leutz committed
            TableExtra.setStyle( 'display', null );

            // set data
            QUIFormUtils.setDataToForm( this.getAttribute( 'settings' ), Form );

            // parse controls
            ControlUtils.parse( TableExtra );

            QUI.parse(TableExtra, 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' )
                        );
                    }
                });
            });
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 )
            });
        }
    });
});