Improved reporting of deletion consequences. Removed vestigial "Advanced" menu.
[philo.git] / contrib / gilbert / media / gilbert / plugins / models.js
index 61fa7fb..e952a32 100644 (file)
@@ -38,7 +38,7 @@ Ext.override(Gilbert.lib.models.Model, {
                                });
                        }
                        callback(new Gilbert.lib.ui.DjangoForm(Ext.applyIf(Ext.applyIf(config||{},{
-                               title: 'Editing '+model.verbose_name+' ('+pk+')',
+                               title: 'Editing '+model.verbose_name.capfirst()+' ('+pk+')',
                                header: false,
                                iconCls: 'icon-pencil',
                                baseCls: 'x-plain',
@@ -55,6 +55,16 @@ Ext.override(Gilbert.lib.models.Model, {
 });
 
 
+Gilbert.lib.plugins.models.ui.ForeignKeyColumn = Ext.extend(Ext.grid.Column, {
+       renderer: function(v) {
+               return v.__unicode__
+       }
+})
+
+
+Ext.grid.Column.types['foreignkeycolumn'] = Gilbert.lib.plugins.models.ui.ForeignKeyColumn
+
+
 Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
        constructor: function (model, plugin, config) {
                var model = this.model = model;
@@ -186,6 +196,15 @@ Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
                                                return new_consequences;
                                        };
                                        
+                                       var new_consequences = convert_consequences_array(consequences);
+                                       var nested_consequences = false;
+                                       for(var i=0;i<new_consequences.length;i++){
+                                               if (!new_consequences[i]['leaf']) {
+                                                       nested_consequences = true;
+                                                       break;
+                                               }
+                                       }
+                                       
                                        var tree = this.tree = new Ext.tree.TreePanel({
                                                loader: new Ext.tree.TreeLoader(),
                                                enableDD: false,
@@ -197,7 +216,7 @@ Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
                                                        'text': 'To be deleted',
                                                        'iconCls': 'icon-minus',
                                                        'leaf': false,
-                                                       'children': convert_consequences_array(consequences),
+                                                       'children': new_consequences,
                                                },
                                                useArrows: true,
                                                rootVisible: false,
@@ -215,7 +234,7 @@ Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
                                                        {
                                                                region: 'north',
                                                                xtype: 'panel',
-                                                               html: 'Are you sure you want to delete these ' + model.verbose_name_plural + '?',
+                                                               html: 'Are you sure you want to delete these ' + model.verbose_name_plural + '?' + (nested_consequences ? ' Nested objects will also be deleted.' : ''),
                                                                bodyStyle: 'padding: 15px;',
                                                        },
                                                        tree,
@@ -262,6 +281,16 @@ Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
                        contextmenu.showAt(e.xy);
                });
                
+               grid.on('rowdblclick', function(grid, rowIndex, e) {
+                       var record = grid.getStore().getAt(rowIndex)
+                       plugin.create_instance_window(model, record.id, function (win) {
+                               win.on('saved', function () {
+                                       store.reload();
+                               });
+                               win.show();
+                       });
+               });
+               
                grid.getSelectionModel().on('selectionchange', function (selmodel) {
                        if (selmodel.hasSelection()) {
                                edit_action.setDisabled(false);
@@ -280,13 +309,13 @@ Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
                                        { xtype: 'tbseparator' },
                                        edit_action,
                                        delete_action,
-                                       '->',
-                                       {
-                                               text: 'Advanced',
-                                               iconCls: 'icon-gear',
-                                               disabled: true,
-                                               menu: [],
-                                       },
+                                       //'->',
+                                       //{
+                                       //      text: 'Advanced',
+                                       //      iconCls: 'icon-gear',
+                                       //      disabled: true,
+                                       //      menu: [],
+                                       //},
                                ],
                        }),
                        items: [grid],
@@ -328,6 +357,8 @@ Gilbert.lib.plugins.models.Plugin = Ext.extend(Gilbert.lib.plugins.Plugin, {
                application.on('model_registered', function (model) {
                        this.handle_new_model(model);
                }, this);
+               
+               this.instance_windows = {}
        },
        
        handle_new_model: function (model) {
@@ -387,6 +418,11 @@ Gilbert.lib.plugins.models.Plugin = Ext.extend(Gilbert.lib.plugins.Plugin, {
        },
        
        create_instance_window: function (model, pk, callback, config, cls) {
+               var win = this.instance_windows[[model.app_label, model.name, pk]];
+               if (win != undefined){
+                       win.show()
+                       return
+               }
                var pk = pk;
                var callback = callback;
                var application = this.application;
@@ -394,7 +430,7 @@ Gilbert.lib.plugins.models.Plugin = Ext.extend(Gilbert.lib.plugins.Plugin, {
                
                var form_callback = function (form) {
                        var oldform = form;
-                       var win = application.create_window({
+                       var win = outer.instance_windows[[model.app_label, model.name, pk]] = application.create_window({
                                layout: 'fit',
                                title: form.title,
                                iconCls: form.iconCls,
@@ -458,6 +494,9 @@ Gilbert.lib.plugins.models.Plugin = Ext.extend(Gilbert.lib.plugins.Plugin, {
                                        },
                                ],
                        });
+                       win.on('close', function(){
+                               delete outer.instance_windows[[model.app_label, model.name, pk]];
+                       });
                        win.addEvents({
                                'saved': true,
                        });
@@ -479,5 +518,5 @@ Gilbert.lib.plugins.models.Plugin = Ext.extend(Gilbert.lib.plugins.Plugin, {
 
 
 Gilbert.on('ready', function (application) {
-       application.register_plugin('auth', new Gilbert.lib.plugins.models.Plugin());
+       application.register_plugin('models', new Gilbert.lib.plugins.models.Plugin());
 });