talho/openphin

View on GitHub
app/assets/javascripts/documents/AddEditFolderWindow.js

Summary

Maintainability
F
3 days
Test Coverage
Ext.ns('Talho.ux.documents');

Talho.ux.documents.AddEditFolderWindow = Ext.extend(Ext.Window,  {
    height: 600,
    width: 500,
    title: 'Add Folder',
    modal: true,

    constructor: function(config){
        this.addEvents('foldercreated');

        var cb = Ext.extend(Ext.form.Checkbox, {
            anchor: '100%',
            inputValue: 'true',
            uncheckedValue: 'false',
            plugins: [new Ext.ux.form.SubmitFalse({uncheckedValue: 'false'})]
        });

        Ext.apply(config, {
            layout: 'fit',
            items: {
                xtype: 'tabpanel',
                itemId: 'tp',
                border: false,
                activeTab: 0,
                items:[
                    {itemId: 'form', title: 'General Options', xtype:'form', padding: '5', items:[
                            {xtype: 'hidden', name: config.isEdit? 'folder_id': 'folder[parent_id]', value: config.selectedFolder.get('id') },
                            {xtype: 'field', fieldLabel: 'Folder Name', name: 'folder[name]', anchor: '100%'},
                            new cb({boxLabel: 'Notify users when files are added to this folder.', name: 'folder[notify_of_document_addition]'}),
                            new cb({boxLabel: 'Notify users when they have been invited to share this folder.', name: 'folder[notify_of_audience_addition]'}),
                            new cb({boxLabel: 'Notify the uploader the first time a user downloads a file within this folder.', name: 'folder[notify_of_file_download]'}),
                            new cb({boxLabel: 'Expire documents in this folder after 30 days.', name: 'folder[expire_documents]'}),
                            new cb({boxLabel: 'Notify the uploader 5 days before files expire.', name: 'folder[notify_before_document_expiry]'})
                        ],
                        url: '/folders' + (config.isEdit ? '/' + config.selectedFolder.get('id') : '') + '.json',
                        method: config.isEdit ? 'PUT' : 'POST',
                        listeners: {
                            scope: this,
                            'beforeaction': function(form, action){
                                if(action.type == 'submit')
                                {
                                    action.options.params = action.options.params || {};

                                    var rg = this.getComponent('tp').getComponent('sh').getComponent('rh').getComponent('rg');
                                    if(rg.getValue()){
                                        action.options.params['folder[shared]'] = rg.getValue().getRawValue();
                                        if(action.options.params['folder[shared]'] == 'shared'){
                                            var selectedItems = this.getComponent('tp').getComponent('sh').getComponent('ap').getSelectedIds();
                                            Ext.apply(action.options.params, {
                                                'folder[audience][jurisdiction_ids][]': selectedItems.jurisdiction_ids,
                                                'folder[audience][role_ids][]': selectedItems.role_ids,
                                                'folder[audience][user_ids][]': selectedItems.user_ids,
                                                'folder[audience][group_ids][]': selectedItems.group_ids
                                            });

                                        }
                                    }

                                    try // wrap this in a try/catch block because getting the permissions component will totally bomb out when it hasn't been rendered yet
                                    {
                                        var permissions = this.getComponent('tp').getComponent('per').getComponent('perholder').getForm().getFieldValues();
                                        var vals = [];
                                        for(var k in permissions){
                                            if(k.match(/folder\[permissions\]\[\d+\]\[user_id\]/) !== null){
                                                var index = k.match(/\d+/)[0];
                                                var p = permissions['folder[permissions][' + index + '][permission]'];
                                                var u = permissions[k];
                                                vals.push({user_id: u, permission: p});
                                            }
                                        }

                                        action.options.params['folder[permissions]'] = Ext.encode(vals);
                                    }
                                    catch(e){}
                                }
                                return true;
                            }
                        }
                    },
                    {title: 'Sharing', itemId: 'sh', layout: 'vbox', layoutConfig: {align: 'stretch'}, padding: '5', items:[
                        {xtype:'container', itemId: 'rh', layout: 'form', labelAlign: 'top', items:[
                            {xtype: 'radiogroup', itemId: 'rg', columns: 1, fieldLabel: 'Share As', anchor: '100%', items:[
                                {itemId: 'in', boxLabel: 'Inherited (Uses the same permissions as the parent folder)', name: 'sharing', checked: config.isEdit? false : true, inputValue: 'inherited'},
                                {itemId: 'ns', boxLabel: 'Not Shared', name: 'sharing', inputValue: 'not_shared'},
                                {itemId: 'sh', boxLabel: 'Shared - Accessible to the audience specified below', name: 'sharing', inputValue: 'shared', scope: this, handler: function(cb, checked){
                                    if(checked){
                                        this.getComponent('tp').getComponent('sh').getComponent('ap').enable();
                                        this.getComponent('tp').getComponent('per').getComponent('perlabel').hide();
                                        this.getComponent('tp').getComponent('per').getComponent('perholder').show();
                                    }
                                    else{
                                        this.getComponent('tp').getComponent('sh').getComponent('ap').disable();
                                        this.getComponent('tp').getComponent('per').getComponent('perholder').hide();
                                        this.getComponent('tp').getComponent('per').getComponent('perlabel').show();
                                    }
                                }}],
                                getComponent: function(itemId){
                                    var col = new Ext.util.MixedCollection(false, function(item){return item.itemId;});
                                    col.addAll(this.items);
                                    return col.get(itemId);
                                }
                            }
                        ]},
                        {itemId: 'ap', xtype: 'audiencepanel', flex: 1, disabled: true, showJurisdictions: false, showRoles: true, showGroups: true}
                    ]},
                    {title: 'Permissions', itemId: 'per', padding: '5', autoScroll: true, items:[
                        {itemId: 'perlabel', xtype: 'box', html: 'To set per-user permissions, users must be added individually on the Sharing tab.'},
                        {itemId: 'perempty', xtype: 'box', hidden: true, html: 'This Folder is not shared with any individual users.'},
                        {itemId: 'perholder', xtype: 'form', border: false, hidden: true, autoScroll: true}
                    ], listeners:{
                        scope: this,
                        'show': function(){
                            this._fillPermissionsForm();
                        }
                    }}
                ],
                buttons:[
                    {text: 'Save', scope: this, handler: function(){
                        var form = this.getComponent('tp').getComponent('form').getForm();
                        form.submit({scope: this,
                            waitMsg: 'Saving...', 
                            success: function(){
                                this.fireEvent('foldercreated');
                                this.close();
                            },
                            failure: function(){
                                Ext.Msg.alert('Error', 'There was a problem saving this folder');
                            }
                        });
                    }},
                    {text: 'Cancel', scope: this, handler: function(){this.close()}}
                ]
            }
        });

        this.on('afterrender', function(){this.getComponent('tp').getComponent('form').getForm().waitMsgTarget = this.getLayoutTarget();});

        if(config.isEdit){
            this.title = 'Edit Folder';
            this.on('afterrender', function(){
                this.getComponent('tp').getComponent('form').getForm().load({url:'/folders' + (config.isEdit ? '/' + config.selectedFolder.get('id') : '') + '/edit.json', waitMsg: 'Loading...', method: 'GET', scope: this,
                    success: function(form, action){
                        this.loaded_data = action.result.data;

                        // set up audience panel and permissions selections here
                        var rg = this.getComponent('tp').getComponent('sh').getComponent('rh').getComponent('rg');
                        var rb = null;
                        switch(action.result.data['folder[shared]']){
                            case 'shared': rb = rg.getComponent('sh');
                                this.getComponent('tp').getComponent('per').getComponent('perlabel').hide();
                                this.getComponent('tp').getComponent('per').getComponent('perholder').show();
                                break;
                            case 'not_shared': rb = rg.getComponent('ns');
                                break;
                            case 'inherited':
                            default: rb = rg.getComponent('in');
                                break;
                        }
                        if(rb.setValue)
                            rb.setValue(true);
                        else
                            rb.checked = true;

                        var audience = this.incoming_audience = action.result.data['folder[audience]'];
                        if(audience){
                            Ext.each(audience.users, function(user){user.name = user.display_name;});
                            var ap = this.getComponent('tp').getComponent('sh').getComponent('ap');
                            if(!ap.rendered){
                                ap.on('afterrender', function(){
                                    ap.load(audience.jurisdictions,  audience.roles, audience.users, audience.groups);
                                    if(action.result.data['folder[shared]'] == 'shared'){
                                        ap.enable();
                                    }
                                    ap.doLayout();
                                }, this, {delay: 10});
                            }
                            else{
                                ap.load(audience.jurisdictions,  audience.roles, audience.users, audience.groups);
                                if(action.result.data['folder[shared]'] == 'shared'){
                                    ap.enable();
                                }
                            }
                        }
                    },
                    failure: function(){
                        Ext.Msg.alert("Error", "There was a problem loading the information for this folder. An Administrator has been notified.");
                        this.close();
                    }
                });
            }, this, {delay: 10});
        }

        Talho.ux.documents.AddEditFolderWindow.superclass.constructor.call(this, config);
    },

    _fillPermissionsForm: function(){
        var ap = this.getComponent('tp').getComponent('sh').getComponent('ap');
        var audience = null;
        if(!ap.rendered){
            audience = this.incoming_audience;
        }
        else{
            audience = ap.getSelectedItems();
        }

        var per_form = this.getComponent('tp').getComponent('per').getComponent('perholder');

        // get values
        var vals = new Ext.util.MixedCollection();
        try
        {
            var gval_results = [];
            if(per_form.rendered)
                gval_results = per_form.getForm().getValues();
            else
                gval_results =  this.loaded_data;

            for(var k in gval_results){
                if(k.match(/folder\[permissions\]\[\d+\]\[user_id\]/) !== null){
                    var index = k.match(/\d+/)[0];
                    var p = gval_results['folder[permissions][' + index + '][permission]'];
                    var u = gval_results[k];
                    vals.add({user_id: u, permission: p});
                }
            }
        }
        catch(e){

        }

        // clear form
        per_form.removeAll(true);

        this.getComponent('tp').getComponent('per').getComponent('perempty').hide();

        if(audience && audience.users.length < 1 && (
                (ap.rendered && this.getComponent('tp').getComponent('sh').getComponent('rh').getComponent('rg').getValue().getRawValue() === 'shared') ||
                (this.loaded_data && this.loaded_data['folder[shared]'] == 'shared'))){
          this.getComponent('tp').getComponent('per').getComponent('perempty').show();
        } else if(audience) {
            // write new form rows, include already selected values
            Ext.each(audience.users, function(user, index){
                var v_index = vals.findIndex('user_id', user.id);
                var val = v_index != -1 ? vals.get(v_index).permission : 0;
                per_form.add([
                    {xtype: 'combo', mode: 'local', triggerAction: 'all', editable: false, fieldLabel: user.display_name || user.name, hiddenName: 'folder[permissions][' + index + '][permission]', store: [[0, 'Reader'], [1, 'Author'], [2, 'Admin']], value: val},
                    {xtype: 'hidden', name: 'folder[permissions][' + index + '][user_id]', value: user.id}
                ]);
            }, this);
        }

        // make sure it lays out
        this.doLayout();
    }
});