Skip to content
Code-Schnipsel Gruppen Projekte
BrickEdit.js 11,4 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, Ajax, 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;

            Ajax.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)
        {
            var self = this;

            var Container = new Element('div', {
Henning Leutz's avatar
Henning Leutz committed
                'html' : '<label>' +
Henning Leutz's avatar
Henning Leutz committed
                         '    <span class="quiqqer-bricks-brickedit-label-text">' +
Henning Leutz's avatar
Henning Leutz committed
                                  QUILocale.get( 'quiqqer/system', 'title' ) +
Henning Leutz's avatar
Henning Leutz committed
                         '    </span>' +
                         '    <input type="text" name="title" />' +
                         '</label>' +
                         '<label>' +
Henning Leutz's avatar
Henning Leutz committed
                         '    <span class="quiqqer-bricks-brickedit-label-text">' +
Henning Leutz's avatar
Henning Leutz committed
                                  QUILocale.get( 'quiqqer/bricks', 'brick.edit.description' ) +
Henning Leutz's avatar
Henning Leutz committed
                         '    </span>' +
                         '    <textarea name="description"></textarea>' +
                         '</label>'+
                         '<label>' +
                         '    <span class="quiqqer-bricks-brickedit-label-text">' +
Henning Leutz's avatar
Henning Leutz committed
                                  QUILocale.get( 'quiqqer/bricks', 'brick.edit.type' ) +
Henning Leutz's avatar
Henning Leutz committed
                         '    </span>' +
                         '    <select name="type"></select>' +
                         '</label>'+
Henning Leutz's avatar
Henning Leutz committed
                         '<label class="quiqqer-bricks-areas">' +
                         '    <span class="quiqqer-bricks-brickedit-label-text">' +
Henning Leutz's avatar
Henning Leutz committed
                                  QUILocale.get( 'quiqqer/bricks', 'brick.edit.allowed.areas' ) +
Henning Leutz's avatar
Henning Leutz committed
                         '    </span>' +
                         '</label>'
            }).inject( this.$Elm );

Henning Leutz's avatar
Henning Leutz committed

            var i, len, title, group, val;
Henning Leutz's avatar
Henning Leutz committed

            if ( this.$availableSettings )
            {
Henning Leutz's avatar
Henning Leutz committed
                var setting, dataQui;
                var SettingsElement = new Element('form', {
                    'class' : 'quiqqer-bricks-brickedit-settings'
                });

                for ( i = 0, len = this.$availableSettings.length; i < len; i++ )
                {
                    setting = this.$availableSettings[ i ];
                    dataQui = '';

                    if ( setting['data-qui'] !== '' ) {
                        dataQui = ' data-qui="'+ setting['data-qui'] +'" ';
                    }

                    new Element('div', {
                        html : '<label class="quiqqer-bricks-areas">' +
                               '    <span class="quiqqer-bricks-brickedit-label-text">' +
                                        setting.text +
                               '    </span>' +
                               '</label>' +
                               '<input type="'+ setting.type +'" ' +
                               '       name="'+ setting.name +'" ' +
                               '       class="'+ setting.class +'" ' +
                                       dataQui +
                               '/>'
                    }).inject( SettingsElement );
                }
Henning Leutz's avatar
Henning Leutz committed
                SettingsElement.inject( Container );
Henning Leutz's avatar
Henning Leutz committed
                // set data
                QUIFormUtils.setDataToForm(
                    this.getAttribute( 'settings' ),
                    SettingsElement
                );
Henning Leutz's avatar
Henning Leutz committed
                // parse controls
                ControlUtils.parse( SettingsElement );

                QUI.parse(SettingsElement, function()
Henning Leutz's avatar
Henning Leutz committed
                    // set project to the controls
                    SettingsElement.getElements( '[data-quiid]' ).each(function(Elm)
                    {
                        var Control = QUI.Controls.getById(
                            Elm.get('data-quiid')
                        );
Henning Leutz's avatar
Henning Leutz committed
                        if ( 'setProject' in Control )
                        {
                            Control.setProject(
                                self.getAttribute( 'projectName' ),
                                self.getAttribute( 'projectLang' )
                            );
                        }
                    });
                });
Henning Leutz's avatar
Henning Leutz committed
            var Type  = this.$Elm.getElement( '[name="type"]' ),
                Title = this.$Elm.getElement( '[name="title"]' ),
                Desc  = this.$Elm.getElement( '[name="description"]' );
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
            for ( i = 0, len = this.$availableBricks.length; i < len; i++ )
Henning Leutz's avatar
Henning Leutz committed
            {
Henning Leutz's avatar
Henning Leutz committed
                title = this.$availableBricks[ i ].title;
Henning Leutz's avatar
Henning Leutz committed

                if ( 'group' in title )
                {
                    group = title.group;
                    val   = title.var;
                } else
                {
                    group = title[ 0 ];
                    val   = title[ 1 ];
                }


Henning Leutz's avatar
Henning Leutz committed
                new Element('option', {
Henning Leutz's avatar
Henning Leutz committed
                    value : this.$availableBricks[ i ].control,
                    html  : QUILocale.get( group, val )
Henning Leutz's avatar
Henning Leutz committed
                }).inject( Type );
            }

            Title.value = this.getAttribute( 'title' );
            Type.value  = this.getAttribute( 'type' );
Henning Leutz's avatar
Henning Leutz committed
            Desc.value  = this.getAttribute( 'description' );
Henning Leutz's avatar
Henning Leutz committed

            var areas = [];

            if ( this.getAttribute( 'areas' ) )
            {
                areas = this.getAttribute('areas')
                    .replace(/^,*/, '')
                    .replace(/,*$/, '')
                    .split(',');
            }
Henning Leutz's avatar
Henning Leutz committed

            // areas
Henning Leutz's avatar
Henning Leutz committed
            this.$Areas = new BrickAreas({
Henning Leutz's avatar
Henning Leutz committed
                brickId     : this.getAttribute( 'id' ),
                projectName : this.getAttribute( 'projectName' ),
                projectLang : this.getAttribute( 'projectLang' ),
                areas  : areas,
                styles : {
Henning Leutz's avatar
Henning Leutz committed
                    height : 120
                }
Henning Leutz's avatar
Henning Leutz committed
            }).inject( this.$Elm.getElement( '.quiqqer-bricks-areas' ), 'after'  );
Henning Leutz's avatar
Henning Leutz committed


Henning Leutz's avatar
Henning Leutz committed
            // brick type
Henning Leutz's avatar
Henning Leutz committed
            if ( this.getAttribute( 'type' ) == 'content' )
            {
                new Element('label', {
Henning Leutz's avatar
Henning Leutz committed
                    html : '<span class="quiqqer-bricks-brickedit-label-editor">' +
Henning Leutz's avatar
Henning Leutz committed
                                QUILocale.get( 'quiqqer/bricks', 'brick.edit.content' ) +
Henning Leutz's avatar
Henning Leutz committed
                           '</span>'
                }).inject( this.$Elm );


                // load ckeditor
                require(['classes/editor/Manager'], function(EditorManager)
                {
                    new EditorManager().getEditor(null, function(Editor)
                    {
                        self.$Editor = Editor;

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

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

                        self.$Editor.inject( EditorContainer );
                        self.$Editor.setHeight( 300 );
                        self.$Editor.setContent( self.getAttribute( 'content' ) );
                    });
                });

                return;
            }

Henning Leutz's avatar
Henning Leutz committed
            // plugin / package bricks
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
         * Saves the brick
Henning Leutz's avatar
Henning Leutz committed
         */
        save : function(callback)
        {
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"]' );
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();
            }

Henning Leutz's avatar
Henning Leutz committed
            // settings
            var SettingsForm = this.$Elm.getElement(
                '.quiqqer-bricks-brickedit-settings'
            );

            if ( SettingsForm ) {
                data.settings = QUIFormUtils.getFormData( SettingsForm );
            }


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