Skip to content
Code-Schnipsel Gruppen Projekte
Manager.js 17,6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
     * Brick manager
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @module package/quiqqer/bricks/bin/Manager
    
     * @author www.pcsg.de (Henning Leutz)
     */
    
    
    Henning Leutz's avatar
    Henning Leutz committed
    define('package/quiqqer/bricks/bin/Manager', [
    
    
        'qui/QUI',
        'qui/controls/desktop/Panel',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'qui/controls/buttons/Select',
        'qui/controls/buttons/Button',
        'qui/controls/buttons/Seperator',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'qui/controls/windows/Confirm',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'controls/grid/Grid',
        'Locale',
        'Projects',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'Ajax',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'css!package/quiqqer/bricks/bin/Manager.css'
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    ], function(QUI, QUIPanel, QUISelect, QUIButton, QUISeperator, QUIConfirm, Grid, QUILocale, Projects, Ajax)
    
    Henning Leutz's avatar
    Henning Leutz committed
        var lg = 'quiqqer/bricks';
    
    
        return new Class({
    
            Extends : QUIPanel,
    
    Henning Leutz's avatar
    Henning Leutz committed
            Type    : 'package/quiqqer/bricks/bin/Manager',
    
    Henning Leutz's avatar
    Henning Leutz committed
                'loadBricksFromProject',
    
    Henning Leutz's avatar
    Henning Leutz committed
                'refresh',
    
                '$refreshProjectLanguages',
    
    Henning Leutz's avatar
    Henning Leutz committed
                '$onCreate',
    
    Henning Leutz's avatar
    Henning Leutz committed
                '$onResize',
                '$openCreateDialog',
    
    Henning Leutz's avatar
    Henning Leutz committed
                '$openDeleteDialog',
                '$onDblClick',
                '$onClick'
    
    Henning Leutz's avatar
    Henning Leutz committed
                title : QUILocale.get( lg, 'menu.bricks.text' )
    
            },
    
            initialize : function(options)
            {
                this.parent( options );
    
    
                this.$Grid          = false;
                this.$ProjectSelect = false;
                this.$ProjectLangs  = false;
    
                this.addEvents({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    onCreate : this.$onCreate,
                    onResize : this.$onResize
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Refresh the panel data
    
    Henning Leutz's avatar
    Henning Leutz committed
             *
             * @param {Function} [callback] - callback function
    
    Henning Leutz's avatar
    Henning Leutz committed
            refresh : function(callback)
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
                if ( !this.$Elm ) {
                    return;
                }
    
    
                var self    = this,
                    project = this.$ProjectSelect.getValue(),
                    lang    = this.$ProjectLangs.getValue();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                this.Loader.show();
    
    
                this.getBricksFromProject( project, lang, function(result)
    
    Henning Leutz's avatar
    Henning Leutz committed
                    if ( typeof callback === 'function' ) {
                        callback();
                    }
    
    Henning Leutz's avatar
    Henning Leutz committed
                    self.$Grid.setData({
                        data : result
                    });
    
    Henning Leutz's avatar
    Henning Leutz committed
                    self.refreshButtons();
    
    Henning Leutz's avatar
    Henning Leutz committed
                    self.Loader.hide();
                });
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Refresh the buttons status
             */
            refreshButtons : function()
            {
                var selected  = this.$Grid.getSelectedData(),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    AddButton = this.getButtons('brick-add'),
                    DelButton = this.getButtons('brick-delete');
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                if ( !selected.length )
                {
                    AddButton.enable();
                    DelButton.disable();
                    return;
                }
    
                AddButton.enable();
                DelButton.enable();
    
                if ( selected.length > 1 ) {
                    AddButton.disable();
                }
            },
    
    
            /**
             * event : on create
             */
            $onCreate : function()
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self = this;
    
                // Buttons
                this.$ProjectSelect = new QUISelect({
    
                    name   : 'projects-name',
                    events : {
                        onChange : this.$refreshProjectLanguages
                    }
                });
    
                this.$ProjectLangs = new QUISelect({
                    name   : 'projects-langs',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    events : {
                        onChange : this.refresh
    
                    },
                    styles : {
                        width : 80
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }
                });
    
                this.addButton( this.$ProjectSelect );
    
                this.addButton( this.$ProjectLangs );
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.addButton( new QUISeperator() );
    
                this.addButton(
                    new QUIButton({
    
    Henning Leutz's avatar
    Henning Leutz committed
                        text     : QUILocale.get( lg, 'manager.button.add' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        name     : 'brick-add',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        disabled : true,
                        events   : {
    
    Henning Leutz's avatar
    Henning Leutz committed
                            onClick : this.$openCreateDialog
                        }
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.addButton(
                    new QUIButton({
    
    Henning Leutz's avatar
    Henning Leutz committed
                        text     : QUILocale.get( lg, 'manager.button.delete' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        name     : 'brick-delete',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        disabled : true,
                        events   : {
                            onClick : this.$openDeleteDialog
                        }
                    })
                );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // Grid
                var Container = new Element('div').inject(
                    this.getContent()
                );
    
                this.$Grid = new Grid( Container, {
                    columnModel : [{
                        header    : QUILocale.get( 'quiqqer/system', 'id' ),
                        dataIndex : 'id',
                        dataType  : 'integer',
                        width     : 40
                    }, {
                        header    : QUILocale.get( 'quiqqer/system', 'title' ),
                        dataIndex : 'title',
                        dataType  : 'string',
                        width     : 140
                    }, {
                        header    : QUILocale.get( 'quiqqer/system', 'description' ),
                        dataIndex : 'description',
                        dataType  : 'string',
                        width     : 300
                    }, {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        header    : QUILocale.get( lg, 'brick.type' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                        dataIndex : 'type',
                        dataType  : 'string',
                        width     : 200
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }],
                    multipleSelection : true
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.$Grid.addEvents({
                    onRefresh  : this.refresh,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    onDblClick : this.$onDblClick,
                    onClick    : this.$onClick
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.Loader.show();
    
                Projects.getList(function(projects)
                {
                    for ( var project in projects )
                    {
                        if ( !projects.hasOwnProperty( project ) ) {
                            continue;
                        }
    
                        self.$ProjectSelect.appendChild(
                            project, project, 'icon-home'
                        );
                    }
    
                    self.$ProjectSelect.setValue(
                        self.$ProjectSelect.firstChild().getAttribute( 'value' )
                    );
                });
            },
    
            /**
             * event : on resize
             */
            $onResize : function()
            {
                if ( !this.$Grid ) {
                    return;
                }
    
                var Body = this.getContent();
    
                if ( !Body ) {
                    return;
                }
    
    
                var size = Body.getSize();
    
                this.$Grid.setHeight( size.y - 40 );
                this.$Grid.setWidth( size.x - 40 );
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * event : dbl click
             */
            $onDblClick : function()
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.editBrick(
    
    Henning Leutz's avatar
    Henning Leutz committed
                    this.$Grid.getSelectedData()[0].id
                );
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * event : click
             */
            $onClick : function()
            {
                this.refreshButtons();
            },
    
    
            /**
             * Refresh the project language dropdown
             */
            $refreshProjectLanguages : function()
            {
                var self          = this,
                    activeProject = this.$ProjectSelect.getValue();
    
                Projects.getList(function(projects)
                {
                    for ( var project in projects )
                    {
                        if ( !projects.hasOwnProperty( project ) ) {
                            continue;
                        }
    
                        if ( activeProject != project ) {
                            continue;
                        }
    
                        var langs = projects[ project ].langs;
                            langs = langs.split( ',' );
    
                        self.$ProjectLangs.clear();
    
                        for ( var i = 0, len = langs.length; i < len; i++ )
                        {
                            self.$ProjectLangs.appendChild(
                                langs[ i ], langs[ i ], 'icon-home'
                            );
                        }
    
                        self.$ProjectLangs.setValue(
                            self.$ProjectLangs.firstChild().getAttribute( 'value' )
                        );
                    }
                });
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Opens the brick creation dialog
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            $openCreateDialog : function()
            {
                var self = this;
    
                new QUIConfirm({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title     : QUILocale.get( lg, 'manager.window.create.title' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    icon      : 'icon-th',
                    maxHeight : 300,
                    maxWidth  : 400,
                    autoclose : false,
                    events    :
                    {
                        onOpen : function(Win)
                        {
                            var Body = Win.getContent();
    
                            Win.Loader.show();
    
    Henning Leutz's avatar
    Henning Leutz committed
                            Body.addClass( 'quiqqer-bricks-create' );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                            Body.set(
                                'html',
    
                                '<label>' +
    
    Henning Leutz's avatar
    Henning Leutz committed
                                '   <span class="quiqqer-bricks-create-label-text">' +
    
    Henning Leutz's avatar
    Henning Leutz committed
                                        QUILocale.get( lg, 'manager.window.create.label.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-create-label-text">' +
    
    Henning Leutz's avatar
    Henning Leutz committed
                                        QUILocale.get( lg, 'manager.window.create.label.type' ) +
    
    Henning Leutz's avatar
    Henning Leutz committed
                                '   </span>' +
                                '   <select name="type"></select>' +
                                '</label>'
                            );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                            self.getAvailableBricks(function(bricklist)
    
    Henning Leutz's avatar
    Henning Leutz committed
                            {
                                if ( !Body ) {
                                    return;
                                }
    
    
                                var i, len, group, title, val;
    
    Henning Leutz's avatar
    Henning Leutz committed
                                var Select = Body.getElement( 'select'),
                                    Title  = Body.getElement( '[name="title"]');
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                                for ( i = 0, len = bricklist.length; i < len; i++ )
    
    Henning Leutz's avatar
    Henning Leutz committed
                                {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    title = bricklist[ 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 : bricklist[ i ].control,
    
                                        html  : QUILocale.get( group, val )
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    }).inject( Select );
                                }
    
                                Title.focus.delay( 500, Title );
    
                                Win.Loader.hide();
                            });
                        },
    
                        onSubmit : function(Win)
                        {
                            Win.Loader.show();
    
                            var Body  = Win.getContent(),
                                Title = Body.getElement( '[name="title"]' ),
                                Type  = Body.getElement( '[name="type"]' );
    
                            if ( Title.value === '' ) {
                                return;
                            }
    
    
                            var project = self.$ProjectSelect.getValue(),
                                lang    = self.$ProjectLangs.getValue();
    
                            self.createBrick(project, lang, {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                title : Title.value,
                                type  : Type.value
    
    Henning Leutz's avatar
    Henning Leutz committed
                            }, function(brickId)
    
    Henning Leutz's avatar
    Henning Leutz committed
                            {
                                Win.close();
    
                                self.refresh(function() {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    self.editBrick( brickId );
    
    Henning Leutz's avatar
    Henning Leutz committed
                                });
                            });
                        }
                    }
                }).open();
            },
    
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Opens the delete brick dialog
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            $openDeleteDialog : function()
            {
                var self     = this,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    brickIds = this.$Grid.getSelectedData().map(function(brick) {
                        return brick.id;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
    
                new QUIConfirm({
                    maxHeight : 300,
                    maxWidth  : 600,
                    autoclose : false,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    title     : QUILocale.get( lg, 'manager.window.delete.title' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    events    :
                    {
                        onOpen : function(Win)
                        {
                            var Content = Win.getContent(),
                                lists   = '<ul>';
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                            self.$Grid.getSelectedData().each(function(brick) {
                                lists = lists +'<li>'+ brick.id +' - '+ brick.title +'</li>';
    
    Henning Leutz's avatar
    Henning Leutz committed
                            });
    
                            lists = lists +'</ul>';
    
                            Content.set(
                                'html',
    
    Henning Leutz's avatar
    Henning Leutz committed
                                QUILocale.get( lg, 'manager.window.delete.information', {
                                    list : lists
                                })
    
    Henning Leutz's avatar
    Henning Leutz committed
                            );
                        },
    
                        onSubmit : function(Win)
                        {
                            Win.Loader.show();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                            self.deleteBricks(brickIds, function()
    
    Henning Leutz's avatar
    Henning Leutz committed
                            {
                                Win.close();
                                self.refresh();
                            });
                        }
                    }
                }).open();
            },
    
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Opens the edit sheet of a Brick
    
    Henning Leutz's avatar
    Henning Leutz committed
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {integer} brickId
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            editBrick : function(brickId)
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
                this.Loader.show();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Brick;
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self  = this,
                    Sheet = this.createSheet({
    
    Henning Leutz's avatar
    Henning Leutz committed
                        title : QUILocale.get( lg, 'brick.sheet.edit.title' ),
                        icon  : 'icon-edit'
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
    
                Sheet.addEvents({
                    onOpen : function(Sheet)
                    {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        require(['package/quiqqer/bricks/bin/BrickEdit'], function(BrickEdit)
    
    Henning Leutz's avatar
    Henning Leutz committed
                        {
    
    Henning Leutz's avatar
    Henning Leutz committed
                            Brick = new BrickEdit({
    
    Henning Leutz's avatar
    Henning Leutz committed
                                id : brickId,
                                projectName : self.$ProjectSelect.getValue(),
                                projectLang : self.$ProjectLangs.getValue(),
                                events :
    
    Henning Leutz's avatar
    Henning Leutz committed
                                {
                                    onLoaded : function() {
                                        self.Loader.hide();
                                    }
                                }
                            }).inject( Sheet.getContent() );
                        });
    
                        Sheet.getContent().setStyle( 'overflow', 'auto' );
                    }
                });
    
                Sheet.addButton({
                    textimage : 'icon-save',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    text : QUILocale.get( 'quiqqer/system', 'save' ),
    
    Henning Leutz's avatar
    Henning Leutz committed
                    styles : {
                        width : 200
                    },
                    events :
                    {
                        onClick : function()
                        {
                            self.Loader.show();
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                            Brick.save(function()
    
    Henning Leutz's avatar
    Henning Leutz committed
                            {
                                self.Loader.hide();
                                Sheet.hide();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                                self.refresh();
    
    Henning Leutz's avatar
    Henning Leutz committed
                            });
                        }
                    }
                });
    
                Sheet.show();
            },
    
            /**
             * Methods / Model
             */
    
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Return the available bricks
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param callback
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            getAvailableBricks : function(callback)
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                Ajax.get('package_quiqqer_bricks_ajax_getAvailableBricks', callback, {
                    'package' : 'quiqqer/bricks'
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Return the bricksf from a project
    
    Henning Leutz's avatar
    Henning Leutz committed
             *
             * @param {String} project - name of the project
    
             * @param {String} lang - Language of the project
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Function} callback - callback function
             */
    
            getBricksFromProject : function(project, lang, callback)
    
    Henning Leutz's avatar
    Henning Leutz committed
                Ajax.get('package_quiqqer_bricks_ajax_project_getBricks', callback, {
                    'package' : 'quiqqer/bricks',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    project   : JSON.encode({
    
                        name : project,
                        lang : lang
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Create a new brick
    
    Henning Leutz's avatar
    Henning Leutz committed
             *
             * @param {String} project
    
             * @param {String} lang
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} data
             * @param {Function} callback
             */
    
            createBrick : function(project, lang, data, callback)
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                Ajax.post('package_quiqqer_bricks_ajax_project_createBrick', callback, {
                    'package' : 'quiqqer/bricks',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    project : JSON.encode({
    
                        name : project,
                        lang : lang
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }),
                    data : JSON.encode( data )
                });
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * Delete the Brick-Ids
    
    Henning Leutz's avatar
    Henning Leutz committed
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {array} brickIds - Brick IDs which should be deleted
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Function} callback
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            deleteBricks : function(brickIds, callback)
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                Ajax.post('package_quiqqer_bricks_ajax_brick_delete', callback, {
                    'package' : 'quiqqer/bricks',
                    brickIds  : JSON.encode( brickIds )
    
    Henning Leutz's avatar
    Henning Leutz committed
                });