Skip to content
Code-Schnipsel Gruppen Projekte
Area.js 23,2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
    
    
    /**
     * Area edit control for the site object
     *
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @module package/quiqqer/bricks/bin/Site/Area
    
     * @author www.pcsg.de (Henning Leutz)
     */
    
    Henning Leutz's avatar
    Henning Leutz committed
    define('package/quiqqer/bricks/bin/Site/Area', [
    
    
        'qui/QUI',
        'qui/controls/Control',
        'qui/controls/buttons/Button',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'qui/controls/windows/Popup',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'qui/controls/windows/Confirm',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'qui/controls/elements/List',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'package/quiqqer/bricks/bin/Sortables',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'css!package/quiqqer/bricks/bin/Site/Area.css'
    
    Henning Leutz's avatar
    Henning Leutz committed
    ], function (QUI, QUIControl, QUIButton, QUIPopup, QUIConfirm, QUIList, QUILocale, QUIAjax, Sortables)
    
    Henning Leutz's avatar
    Henning Leutz committed
        var lg = 'quiqqer/bricks';
    
    
    
        return new Class({
    
            Extends : QUIControl,
    
    Henning Leutz's avatar
    Henning Leutz committed
            Type    : 'package/quiqqer/bricks/bin/Site/Area',
    
    Henning Leutz's avatar
    Henning Leutz committed
                'openBrickDialog',
    
    Henning Leutz's avatar
    Henning Leutz committed
                'openBrickSettingDialog',
    
                'openSettingsDialog',
    
    Henning Leutz's avatar
    Henning Leutz committed
                'createNewBrick',
    
                '$onInject'
            ],
    
            options : {
                name        : '',
                description : '',
                title       : {},
    
                Site        : false,
                deactivate  : false
    
            },
    
            initialize: function (options)
            {
                this.parent( options );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.$availableBricks = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.$brickIds        = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.$brickData       = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.$AddButton      = false;
                this.$SettingsButton = false;
                this.$SortableButton = false;
                this.$MoreButton     = false;
    
                this.$List        = false;
                this.$FXExtraBtns = false;
    
    
                this.addEvents({
                    onInject : this.$onInject
                });
            },
    
            /**
             * Return the domnode element
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @return {HTMLElement}
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self  = this,
                    title = this.getAttribute( 'title' );
    
    
                this.$Elm = new Element('div', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'class' : 'quiqqer-bricks-site-category-area',
                    html    : '<div class="quiqqer-bricks-site-category-area-title">'+
    
                                  QUILocale.get( title.group, title.var ) +
    
    Henning Leutz's avatar
    Henning Leutz committed
                              '   <div class="quiqqer-bricks-site-category-area-buttons"></div>' +
    
    Henning Leutz's avatar
    Henning Leutz committed
                              '</div><ul class="quiqqer-bricks-site-category-area-list"></ul>',
    
                    'data-name' : this.getAttribute( 'name' )
                });
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // Elements
    
                var Buttons = this.$Elm.getElement(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    '.quiqqer-bricks-site-category-area-buttons'
    
    Henning Leutz's avatar
    Henning Leutz committed
                var ExtraButtons = new Element('div', {
                    'class' : 'quiqqer-bricks-site-category-area-extraButtons'
                });
    
    
                this.$FXExtraBtns = moofx( ExtraButtons );
    
                this.$List = this.$Elm.getElement(
                    '.quiqqer-bricks-site-category-area-list'
                );
    
                // buttons
    
                this.$AddButton = new QUIButton({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    text      : QUILocale.get( lg, 'site.area.button.add' ),
    
                    textimage : 'icon-plus',
                    disable   : true,
                    events    : {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        onClick : this.openBrickDialog
    
    Henning Leutz's avatar
    Henning Leutz committed
                ExtraButtons.inject( Buttons );
    
                this.$MoreButton = new QUIButton({
                    title  : QUILocale.get( lg, 'site.area.button.area.more.openIt' ),
                    icon   : 'icon-caret-left',
                    events :
                    {
                        onClick : function(Btn)
                        {
                            if ( Btn.getAttribute( 'icon' ) == 'icon-caret-left' )
                            {
                                self.openButtons();
                                return;
                            }
    
                            self.closeButtons();
                        }
                    },
                    styles : {
                        marginLeft : 5
                    }
                }).inject( Buttons );
    
                // extra buttons
    
                this.$SettingsButton = new QUIButton({
                    title  : QUILocale.get( lg, 'site.area.button.area.settings' ),
                    icon   : 'icon-gears',
                    events : {
                        onClick : this.openSettingsDialog
                    },
                    styles : {
                        marginLeft : 10
                    }
    
    Henning Leutz's avatar
    Henning Leutz committed
                }).inject( ExtraButtons );
    
                this.$SortableButton = new QUIButton({
                    title  : QUILocale.get( lg, 'site.area.button.area.sort' ),
                    icon   : 'icon-sort',
                    events :
                    {
                        onClick : function(Btn)
                        {
                            if ( Btn.isActive() )
                            {
                                Btn.setNormal();
                                self.unsortable();
                                return;
                            }
    
                            Btn.setActive();
                            self.sortable();
                        }
                    },
                    styles : {
                        marginLeft : 5
                    }
                }).inject( ExtraButtons );
    
    
                return this.$Elm;
            },
    
            /**
             * event : on inject
             */
            $onInject : function()
            {
                var self    = this,
    
                    Site    = this.getAttribute( 'Site' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                QUIAjax.get('package_quiqqer_bricks_ajax_project_getBricks', function(bricks)
    
    Henning Leutz's avatar
    Henning Leutz committed
                    self.$availableBricks = bricks;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    self.$brickIds.each(function(brickId) {
                        self.addBrickById( brickId );
    
    Henning Leutz's avatar
    Henning Leutz committed
                    self.$brickData.each(function(brickData) {
                        self.addBrick( brickData );
                    });
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'package' : 'quiqqer/bricks',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    project   : Project.encode(),
                    area      : this.getAttribute( 'name' )
    
             * Activate the area
    
            activate : function()
    
                this.setAttribute( 'deactivate', false );
                this.getElm().removeClass( 'quiqqer-bricks-site-category-area-deactivate' );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                this.$AddButton.enable();
            },
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            /**
             * Deactivate the area
             */
            deactivate : function()
            {
                var self = this,
                    data = this.getData();
    
                if ( data.length && !("deactivate" in data[ 0 ]) )
    
    Henning Leutz's avatar
    Henning Leutz committed
                {
    
                    new QUIConfirm({
                        title : QUILocale.get( lg, 'site.area.window.deactivate.title' ),
                        text  : QUILocale.get( lg, 'site.area.window.deactivate.text' ),
                        information : QUILocale.get( lg, 'site.area.window.deactivate.information' ),
                        events :
                        {
                            onSubmit : function()
                            {
                                self.clear();
                                self.setAttribute( 'deactivate', true );
                                self.deactivate();
                            }
                        }
                    }).open();
    
                    return;
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    
                this.setAttribute( 'deactivate', true );
    
                this.$AddButton.disable();
                this.getElm().addClass( 'quiqqer-bricks-site-category-area-deactivate' );
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
            /**
             * Add a brick by its brick data
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} brickData - { brickId:1, inheritance:1 }
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            addBrick : function(brickData)
            {
    
                if ( "deactivate" in brickData )
                {
                    this.clear();
                    this.setAttribute( 'deactivate', true );
                    this.deactivate();
                    return;
                }
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( !this.$loaded )
                {
                    this.$brickData.push( brickData );
                    return;
                }
    
                var BrickNode = this.addBrickById( brickData.brickId );
    
                if ( !BrickNode ) {
                    return;
                }
    
                var Select = BrickNode.getElement( 'select' );
    
                Select.set( 'data-inheritance', 0 );
    
                if ( "inheritance" in brickData ) {
                    Select.set( 'data-inheritance', brickData.inheritance );
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Add a brick by its ID
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Number} brickId
             * @return {HTMLElement|Boolean} Brick-Node
    
    Henning Leutz's avatar
    Henning Leutz committed
            addBrickById : function(brickId)
    
    Henning Leutz's avatar
    Henning Leutz committed
                    this.$brickIds.push( brickId );
    
    Henning Leutz's avatar
    Henning Leutz committed
                    return false;
    
    Henning Leutz's avatar
    Henning Leutz committed
                var found = this.$availableBricks.filter(function(Item) {
                    return Item.id === brickId;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    return false;
    
    Henning Leutz's avatar
    Henning Leutz committed
                var BrickNode = this.createNewBrick();
    
                BrickNode.getElement( 'select' ).set( 'value', brickId );
    
                return BrickNode;
    
            /**
             * Removes all bricks in the area
             */
            clear : function()
            {
                this.getElm().getElements( '.quiqqer-bricks-site-category-area-brick' ).destroy();
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Add a new brick to the area
    
    Henning Leutz's avatar
    Henning Leutz committed
            createNewBrick : function()
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self = this;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Elm = new Element('li', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    'class' : 'quiqqer-bricks-site-category-area-brick',
    
    Henning Leutz's avatar
    Henning Leutz committed
                Elm.inject( this.$List );
    
                Select = Elm.getElement( 'select' );
    
                new QUIButton({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title  : QUILocale.get( lg, 'site.area.button.delete' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    icon   : 'icon-remove',
    
    Henning Leutz's avatar
    Henning Leutz committed
                            self.openBrickDeleteDialog( Elm );
    
    Henning Leutz's avatar
    Henning Leutz committed
                new QUIButton({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title  : QUILocale.get( lg, 'site.area.button.settings' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    icon   : 'icon-gear',
                    events :
                    {
                        onClick : function(Btn)
                        {
                            var Elm    = Btn.getElm(),
                                Parent = Elm.getParent( '.quiqqer-bricks-site-category-area-brick' ),
                                Select = Parent.getElement( 'select' );
    
                            self.openBrickSettingDialog( Select );
                        }
                    }
                }).inject( Elm );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                for ( i = 0, len = this.$availableBricks.length; i < len; i++ )
    
    Henning Leutz's avatar
    Henning Leutz committed
                        html  : this.$availableBricks[ i ].title,
                        value : this.$availableBricks[ i ].id
    
            /**
             * Return the brick list
             * @returns {Array}
             */
            getData : function()
            {
                if ( this.getAttribute( 'deactivate' ) )
                {
                    return [{
                        deactivate : 1
                    }];
                }
    
                var i, len;
    
                var data   = [],
                    bricks = this.$Elm.getElements( 'select' );
    
                for ( i = 0, len = bricks.length; i < len; i++ )
                {
                    data.push({
                        brickId     : bricks[ i ].value,
                        inheritance : bricks[ i ].get( 'data-inheritance' ) == 1 ? 1 : 0
                    });
                }
    
                return data;
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * sort methods
             */
    
            /**
             * Switch the sortable on
             */
            sortable : function()
            {
                var Elm      = this.getElm(),
                    elements = Elm.getElements(
                        '.quiqqer-bricks-site-category-area-brick'
                    );
    
                elements.each(function(Brick)
                {
                    var i, len, buttons, Button;
    
                    buttons = Brick.getElements( '.qui-button' );
    
                    for ( i = 0, len = buttons.length; i < len; i++ )
                    {
                        Button = QUI.Controls.getById( buttons[ i ].get( 'data-quiid' ) );
    
                        if ( Button ) {
                            Button.setDisable();
                        }
                    }
    
                    var Select = Brick.getElement( 'select' ),
                        Option = Select.getElement( 'option[value="'+ Select.value +'"]' );
    
                    new Element('div', {
                        'class' : 'quiqqer-bricks-site-category-area-placeholder',
                        html    : Option.get( 'html' )
                    }).inject( Brick );
                });
    
                Elm.getElements( 'select' ).set( 'disabled', true );
    
    
                new Sortables( this.$List, {
                    revert: {
                        duration: 500,
                        transition: 'elastic:out'
                    },
                    clone : function(event)
                    {
                        var Target = event.target;
    
                        if ( Target.nodeName != 'LI' ) {
                            Target = Target.getParent( 'li' );
                        }
    
                        var size = Target.getSize(),
                            pos  = Target.getPosition( Target.getParent('ul') );
    
                        return new Element('div', {
                            styles : {
                                background : 'rgba(0,0,0,0.5)',
                                height     : size.y,
                                top        : pos.y,
                                width      : size.x,
                                zIndex     : 1000
                            }
                        });
                    },
    
                    onStart : function(element)
                    {
                        var Ul = element.getParent( 'ul' );
    
                        element.addClass( 'quiqqer-bricks-site-category-area-dd-active' );
    
                        Ul.setStyles({
                            height   : Ul.getSize().y,
                            overflow : 'hidden',
                            width    : Ul.getSize().x
                        });
                    },
    
                    onComplete : function(element)
                    {
                        var Ul = element.getParent( 'ul' );
    
                        element.removeClass( 'quiqqer-bricks-site-category-area-dd-active' );
    
                        Ul.setStyles({
                            height   : null,
                            overflow : null,
                            width    : null
                        });
                    }
                });
            },
    
            /**
             * Switch the sortable off
             */
            unsortable : function()
            {
                var Elm      = this.getElm(),
                    elements = Elm.getElements(
                        '.quiqqer-bricks-site-category-area-brick'
                    );
    
                Elm.getElements( 'select' ).set( 'disabled', false );
                Elm.getElements( '.quiqqer-bricks-site-category-area-placeholder').destroy();
    
                elements.each(function(Brick)
                {
                    var i, len, buttons, Button;
    
                    buttons = Brick.getElements( '.qui-button' );
    
                    for ( i = 0, len = buttons.length; i < len; i++ )
                    {
                        Button = QUI.Controls.getById( buttons[ i ].get( 'data-quiid' ) );
    
                        if ( Button ) {
                            Button.setEnable();
                        }
                    }
                });
            },
    
            /**
             * Opens the extra settings buttons
             *
             * @param {Function} callback
             */
            openButtons : function(callback)
            {
                var self = this;
    
                this.$AddButton.hide();
    
                self.$FXExtraBtns.style({
                    borderLeft : '2px solid #cccfd5',
                    height   : 30,
                    overflow : 'hidden'
                });
    
                this.$FXExtraBtns.animate({
                    opacity    : 1,
                    width      : 85,
                    marginLeft : 10
                }, {
                    callback : function()
                    {
                        self.$MoreButton.setAttribute( 'icon', 'icon-caret-right' );
    
                        self.$FXExtraBtns.style({
                            overflow : null
                        });
    
                        if ( typeof callback === 'function' ) {
                            callback();
                        }
                    }
                });
            },
    
            /**
             * Close the extra settings buttons
             *
             * * @param {Function} callback
             */
            closeButtons : function( callback )
            {
                var self = this;
    
                this.$FXExtraBtns.style({
                    overflow   : 'hidden',
                    borderLeft : null,
                    marginLeft : 0
                });
    
                this.$FXExtraBtns.animate({
                    opacity  : 0,
                    width    : 0
                }, {
                    callback : function()
                    {
                        self.$MoreButton.setAttribute( 'icon', 'icon-caret-left' );
                        self.$AddButton.show();
    
    
                        if ( typeof callback === 'function' ) {
                            callback();
                        }
                    }
                });
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * dialogs
             */
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Opens the brick add dialog
             */
            openBrickDialog : function()
            {
                if ( !this.$availableBricks.length ) {
                    return;
                }
    
                var self = this;
    
                new QUIPopup({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title     : QUILocale.get( lg, 'site.area.window.add' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    icon      : 'icon-th',
                    maxWidth  : 500,
                    maxHeight : 600,
                    autoclose : false,
                    events    :
                    {
                        onOpen : function(Win)
                        {
                            var items   = [],
                                Content = Win.getContent(),
    
                                List = new QUIList({
                                    events :
                                    {
                                        onClick : function(List, data)
                                        {
                                            self.addBrickById( data.brickId );
                                            Win.close();
                                        }
                                    }
                                });
    
                            List.inject( Content );
    
                            for ( var i = 0, len = self.$availableBricks.length; i < len; i++ )
                            {
                                items.push({
                                    brickId : self.$availableBricks[ i ].id,
                                    icon    : 'icon-th',
                                    title   : self.$availableBricks[ i ].title,
                                    text    : self.$availableBricks[ i ].description
                                });
                            }
    
                            List.addItems( items );
                        }
                    }
                }).open();
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Opens the brick deletion dialog
             *
             * @param {HTMLElement} BrickElement - Element of the Brick
             */
            openBrickDeleteDialog : function(BrickElement)
            {
                new QUIConfirm({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title : QUILocale.get( lg, 'site.area.window.delete.title' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    icon  : 'icon-remove',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    text  : QUILocale.get( lg, 'site.area.window.delete.text' ),
                    information : QUILocale.get( lg, 'site.area.window.delete.information' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    maxHeight   : 300,
                    maxWidth    : 500,
                    events :
                    {
                        onSubmit : function() {
                            BrickElement.destroy();
                        }
                    }
                }).open();
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Opens the brick settings dialog
             *
             * @param {HTMLElement} Select
             */
            openBrickSettingDialog : function(Select)
            {
                new QUIConfirm({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title     : QUILocale.get( lg, 'site.area.window.settings.title' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    icon      : 'icon-gear',
                    maxWidth  : 400,
                    maxHeight : 300,
                    autoclose : false,
                    events    :
                    {
                        onOpen : function(Win)
                        {
                            var Content = Win.getContent();
    
                            Content.set(
                                'html',
    
                                '<form>' +
                                '    <label>' +
                                '        <input type="checkbox" name="inheritance" />' +
    
    Henning Leutz's avatar
    Henning Leutz committed
                                         QUILocale.get( lg, 'site.area.window.settings.setting.inheritance' ) +
    
    Henning Leutz's avatar
    Henning Leutz committed
                                '    </label>' +
                                '</form>'
                            );
    
    
                            var Form = Win.getContent().getElement( 'form' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                                elms = Form.elements;
    
                            elms.inheritance.checked = Select.get( 'data-inheritance' ).toInt();
                        },
    
                        onSubmit : function(Win)
                        {
                            var Form = Win.getContent().getElement( 'form' );
    
                            Select.set({
                                'data-inheritance' : Form.elements.inheritance.checked ? 1 : 0
                            });
    
                            Win.close();
                        }
                    }
                }).open();
    
            },
    
            /**
             * Opens the
             */
            openSettingsDialog : function()
            {
                var self = this;
    
                new QUIConfirm({
                    title     : QUILocale.get(lg, 'area.window.settings.title'),
                    icon      : 'icon-gear',
                    maxWidth  : 400,
                    maxHeight : 300,
                    autoclose : false,
                    events    :
                    {
                        onOpen: function (Win)
                        {
                            var Content = Win.getContent();
    
                            Content.set(
                                'html',
    
                                '<form>' +
                                '    <label>' +
                                '        <input type="checkbox" name="deactivate" />' +
                                         QUILocale.get( lg, 'area.window.settings.deactivate' ) +
                                '    </label>' +
                                '</form>'
                            );
    
                            var Form = Win.getContent().getElement( 'form' ),
                                elms = Form.elements;
    
                            elms.deactivate.checked = self.getAttribute( 'deactivate' );
                        },
    
                        onSubmit : function(Win)
                        {
                            var Form = Win.getContent().getElement( 'form' );
    
                            Win.close();
    
                            if ( Form.elements.deactivate.checked )
                            {
                                self.deactivate();
                            } else
                            {
                                self.activate();
                            }
                        }
                    }
                }).open();