1 Ext.ns('Gilbert.lib.plugins.models.ui');
4 Ext.override(Gilbert.lib.models.Model, {
5 create_new_form: function (callback, config) {
8 model.api.get_form({}, function (formspec) {
9 var formspec = formspec;
10 for (var item_index in formspec.items) {
11 var item = formspec.items[item_index];
16 var form_panel = new Gilbert.lib.ui.DjangoForm(Ext.applyIf(Ext.applyIf(config||{},{
17 title: 'New '+model.verbose_name,
23 submit: model.api.save_form,
29 create_edit_form: function (callback, pk, config) {
32 model.api.get_form({'pk': pk}, function (formspec) {
33 var formspec = formspec;
34 for (var item_index in formspec.items) {
35 var item = formspec.items[item_index];
40 callback(new Gilbert.lib.ui.DjangoForm(Ext.applyIf(Ext.applyIf(config||{},{
41 title: 'Editing '+model.verbose_name+' ('+pk+')',
43 iconCls: 'icon-pencil',
47 submit: model.api.save_form,
58 Gilbert.lib.plugins.models.ui.ModelPanel = Ext.extend(Ext.Panel, {
59 constructor: function (model, plugin, config) {
60 var model = this.model = model;
61 var plugin = this.plugin = plugin;
62 var application = this.application = plugin.application;
65 var store = this.store = model.create_store({
75 var grid = this.grid = new Ext.grid.GridPanel({
76 ddGroup: model.drag_drop_group,
80 columns: model.columns,
86 selModel: new Ext.grid.RowSelectionModel(),
87 bbar: new Ext.PagingToolbar({
91 displayMsg: 'Displaying '+model.verbose_name_plural+' {0} - {1} of {2}',
92 emptyMsg: 'No '+model.verbose_name_plural+' to display',
94 if (model.searchable) {
99 new Ext.ux.form.SearchField({
110 var new_action = this.new_action = new Ext.Action({
111 text: 'New ' + model.verbose_name,
112 iconCls: 'icon-plus',
113 handler: function () {
114 plugin.create_instance_window(model, undefined, function (win) {
115 win.on('saved', function () {
123 var edit_action = this.edit_action = new Ext.Action({
126 iconCls: 'icon-pencil',
127 handler: function () {
128 Ext.each(grid.getSelectionModel().getSelections(), function (record, index) {
129 plugin.create_instance_window(model, record.id, function (win) {
130 win.on('saved', function () {
139 var delete_action = this.delete_action = new Ext.Action({
142 iconCls: 'icon-minus',
143 handler: function () {
144 var records = grid.getSelectionModel().getSelections();
146 Ext.each(records, function (record, index) {
149 model.api.data_destroy_consequences(pks, function (consequences) {
150 var convert_consequences_array = function (consequences) {
151 var last_parent = consequences[0];
152 Ext.each(consequences, function (consequence, index) {
154 if (!Ext.isArray(consequence)) {
155 last_parent = consequence;
157 last_parent['children'] = convert_consequences_array(consequence);
158 delete consequences[index];
162 new_consequences = [];
163 Ext.each(consequences, function (consequence) {
165 var new_consequence = {};
166 if (!consequence['children']) {
167 new_consequence['leaf'] = true;
169 new_consequence['leaf'] = false;
170 new_consequence['children'] = consequence['children'];
172 var app_label = consequence['app_label'];
173 var name = consequence['name'];
174 var model = Gilbert.get_model(app_label, name);
176 new_consequence['text'] = consequence['__unicode__'];
177 new_consequence['iconCls'] = model.iconCls;
179 new_consequence['text'] = '(' + consequence['name'] + ') ' + consequence['__unicode__'];
180 new_consequence['iconCls'] = 'icon-block';
182 new_consequence['disabled'] = true;
183 new_consequences.push(new_consequence);
186 return new_consequences;
189 var tree = this.tree = new Ext.tree.TreePanel({
190 loader: new Ext.tree.TreeLoader(),
193 trackMouseOver: false,
197 'text': 'To be deleted',
198 'iconCls': 'icon-minus',
200 'children': convert_consequences_array(consequences),
207 var consequences_win = application.create_window({
212 title: 'Delete ' + model.verbose_name_plural,
213 iconCls: 'icon-minus',
218 html: 'Are you sure you want to delete these ' + model.verbose_name_plural + '?',
219 bodyStyle: 'padding: 15px;',
227 handler: function () {
228 consequences_win.close();
235 handler: function () {
236 consequences_win.close();
237 store.remove(records);
245 consequences_win.show();
250 grid.on('cellcontextmenu', function (grid, rowIndex, cellIndex, e) {
252 selmodel = grid.getSelectionModel();
253 if (!selmodel.isSelected(rowIndex)) {
254 selmodel.selectRow(rowIndex, false);
256 var contextmenu = new Ext.menu.Menu({
262 contextmenu.showAt(e.xy);
265 grid.getSelectionModel().on('selectionchange', function (selmodel) {
266 if (selmodel.hasSelection()) {
267 edit_action.setDisabled(false);
268 delete_action.setDisabled(false);
270 edit_action.setDisabled(true);
271 delete_action.setDisabled(true);
275 Gilbert.lib.plugins.models.ui.ModelPanel.superclass.constructor.call(this, Ext.applyIf(config||{}, {
277 tbar: new Ext.Toolbar({
280 { xtype: 'tbseparator' },
286 iconCls: 'icon-gear',
298 Gilbert.lib.plugins.models.Plugin = Ext.extend(Gilbert.lib.plugins.Plugin, {
300 init: function (application) {
301 Gilbert.lib.plugins.models.Plugin.superclass.init.call(this, application);
303 var new_menu = this.new_menu = new Ext.menu.Menu();
304 var manage_menu = this.manage_menu = new Ext.menu.Menu();
306 application.mainmenu.insert(2, {
308 iconCls: 'icon-plus',
313 application.mainmenu.insert(3, {
315 iconCls: 'icon-databases',
320 application.do_layout();
322 Ext.iterate(application.models, function (app_label, models) {
323 Ext.iterate(models, function (name, model) {
324 this.handle_new_model(model);
328 application.on('model_registered', function (model) {
329 this.handle_new_model(model);
333 handle_new_model: function (model) {
335 model.api.has_add_permission(function (has_add_permission) {
336 if (has_add_permission) {
337 outer.add_to_new_menu(model);
340 model.api.has_read_permission(function (has_read_permission) {
341 if (has_read_permission) {
342 outer.add_to_manage_menu(model);
347 add_to_new_menu: function (model) {
350 text: model.verbose_name.capfirst(),
351 iconCls: model.iconCls,
353 handler: function (button, event) {
354 outer.create_instance_window(this.model, undefined, function (win) {
361 add_to_manage_menu: function (model) {
363 this.manage_menu.add({
364 text: model.verbose_name_plural.capfirst(),
365 iconCls: model.iconCls,
367 handler: function (button, event) {
368 var win = outer.create_model_management_window(this.model);
374 create_model_management_window: function (model, config, cls) {
376 var panel = new Gilbert.lib.plugins.models.ui.ModelPanel(model, this);
377 var win = this.application.create_window(Ext.applyIf(config||{},{
379 title: model.verbose_name_plural.capfirst(),
380 iconCls: model.iconCls,
389 create_instance_window: function (model, pk, callback, config, cls) {
391 var callback = callback;
392 var application = this.application;
395 var form_callback = function (form) {
397 var win = application.create_window({
400 iconCls: form.iconCls,
401 bodyStyle: 'padding: 5px; background: solid;',
410 text: 'Save and Close',
411 iconCls: 'icon-database-import',
412 handler: function (button) {
413 var loading_mask = new Ext.LoadMask(win.body, {
418 win.items.items[0].getForm().submit({
419 success: function (form, action) {
421 win.fireEvent('saved');
424 failure: function (form, action) {
433 iconCls: 'icon-database-import',
434 handler: function (button) {
435 var loading_mask = new Ext.LoadMask(win.body, {
440 win.items.items[0].getForm().submit({
441 success: function (form, action) {
442 win.fireEvent('saved');
443 var pk = action.result.pk;
444 model.create_edit_form(function (newform) {
448 win.setTitle(newform.title);
449 win.setIconClass(newform.iconCls);
453 failure: function (form, action) {
468 model.create_edit_form(form_callback, pk, {
469 bodyStyle: 'padding: 10px;',
472 model.create_new_form(form_callback, {
473 bodyStyle: 'padding: 10px;',
481 Gilbert.on('ready', function (application) {
482 application.register_plugin('auth', new Gilbert.lib.plugins.models.Plugin());