Skip to content
Code-Schnipsel Gruppen Projekte
BrickEdit.js 11,7 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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 );
    
                var i, len, text, setting, dataQui, 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++ )
                {
    
    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
    
    
                    text = setting.text;
    
                    if ( typeOf( setting.text ) === 'array' ) {
                        text = QUILocale.get( setting.text[ 0 ], setting.text[ 1 ] );
                    }
    
    
    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 +'">' +
    
                                        text +
    
    Henning Leutz's avatar
    Henning Leutz committed
                               '    </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 )
                });
            }
        });
    });