[ADD] Rename feature in dashboards
[odoo/odoo.git] / addons / base_dashboard / static / src / js / dashboard.js
1 openerp.base_dashboard = function(openerp) {
2
3 QWeb.add_template('/base_dashboard/static/src/xml/base_dashboard.xml');
4
5 openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
6     init: function(view, node) {
7         this._super(view, node);
8         this.template = "DashBoard";
9         this.actions_attrs = {};
10     },
11     start: function() {
12         var self = this;
13         this._super.apply(this, arguments);
14
15         this.$element.find(".oe-dashboard-column").sortable({
16             connectWith: ".oe-dashboard-column",
17             scroll: false
18         }).disableSelection().bind('sortstop', self.do_save_dashboard);
19
20         // Events
21         this.$element.find('.oe-dashboard-link-undo').click(this.on_undo);
22         this.$element.find('.oe-dashboard-link-reset').click(this.on_reset);
23         this.$element.find('.oe-dashboard-link-add_widget').click(this.on_add_widget);
24         this.$element.find('.oe-dashboard-link-change_layout').click(this.on_change_layout);
25         this.$element.find('.oe-dashboard-column .ui-icon-minusthick').click(this.on_fold_action);
26         this.$element.find('.oe-dashboard-column .ui-icon-closethick').click(this.on_close_action);
27
28         this.actions_attrs = {};
29         // Init actions
30         _.each(this.node.children, function(column) {
31             _.each(column.children, function(action) {
32                 delete(action.attrs.width);
33                 delete(action.attrs.height);
34                 delete(action.attrs.colspan);
35                 self.actions_attrs[action.attrs.name] = action.attrs;
36                 self.rpc('/base/action/load', {
37                     action_id: parseInt(action.attrs.name, 10)
38                 }, self.on_load_action);
39             });
40         });
41
42         this.$element.find('a.oe-dashboard-action-rename').live('click', this.on_rename);
43     },
44     on_undo: function() {
45         this.rpc('/base/view/undo_custom', {
46             view_id: this.view.fields_view.view_id
47         }, this.do_reload);
48     },
49     on_reset: function() {
50         this.rpc('/base/view/undo_custom', {
51             view_id: this.view.fields_view.view_id,
52             reset: true
53         }, this.do_reload);
54     },
55     on_add_widget: function() {
56         var self = this;
57         var action = {
58             res_model : 'ir.actions.actions',
59             views : [[false,"list"]],
60             type : 'ir.actions.act_window',
61             view_type : 'list',
62             view_mode : 'list',
63             limit : 80,
64             auto_search : true,
65             domain : [['type', '=', 'ir.actions.act_window']],
66             flags : {
67                 sidebar : false,
68                 views_switcher : false,
69                 action_buttons : false
70             }
71         };
72         // TODO: create a Dialog controller which optionally takes an action
73         // Should set width & height automatically and take buttons & views callback
74         var dialog_id = _.uniqueId("act_window_dialog");
75         var action_manager = new openerp.base.ActionManager(this.session, dialog_id);
76         var $dialog = $('<div id=' + dialog_id + '>').dialog({
77                             modal : true,
78                             title : 'Actions',
79                             width : 800,
80                             height : 600,
81                             buttons : {
82                                 Cancel : function() {
83                                     $(this).dialog("destroy");
84                                 },
85                                 Add : function() {
86                                     self.do_add_widget(action_manager);
87                                     $(this).dialog("destroy");
88                                 }
89                             }
90                         });
91         action_manager.start();
92         action_manager.do_action(action);
93         // TODO: should bind ListView#select_record in order to catch record clicking
94     },
95     do_add_widget : function(action_manager) {
96         var self = this,
97             actions = action_manager.viewmanager.views.list.controller.groups.get_selection().ids,
98             results = [],
99             qdict = { view : this.view };
100             console.log(this.actions_attrs)
101         // TODO: should load multiple actions at once
102         _.each(actions, function(aid) {
103             self.rpc('/base/action/load', {
104                 action_id: aid
105             }, function(result) {
106                 self.actions_attrs[aid] = {
107                     name: aid,
108                     string: _.trim(result.result.name)
109                 }
110                 qdict.action = {
111                     attrs : self.actions_attrs[aid]
112                 }
113                 self.$element.find('.oe-dashboard-column:first').prepend(QWeb.render('DashBoard.action', qdict));
114                 self.do_save_dashboard();
115                 self.on_load_action(result)
116             });
117         });
118     },
119     on_rename : function(e) {
120         var self = this,
121             id = $(e.currentTarget).parents('.oe-dashboard-action:first').attr('data-id'),
122             $header = $(e.currentTarget).parents('.oe-dashboard-action-header:first'),
123             $rename = $header.find('a.oe-dashboard-action-rename').hide(),
124             $title = $header.find('span.oe-dashboard-action-title').hide(),
125             $input = $header.find('input[name=title]');
126         $input.val($title.text()).show().focus().bind('keydown', function(e) {
127             if (e.which == 13 || e.which == 27) {
128                 if (e.which == 13) { //enter
129                     var val = $input.val();
130                     if (!val) {
131                         return false;
132                     }
133                     $title.text(val);
134                     self.actions_attrs[id].string = val;
135                     self.do_save_dashboard();
136                 }
137                 $input.unbind('keydown').hide();
138                 $rename.show();
139                 $title.show();
140             }
141         });
142     },
143     on_change_layout: function() {
144         var self = this;
145         var qdict = {
146             current_layout : this.$element.find('.oe-dashboard').attr('data-layout')
147         };
148         var $dialog = $('<div>').dialog({
149                             modal: true,
150                             title: 'Edit Layout',
151                             width: 'auto',
152                             height: 'auto',
153                         }).html(QWeb.render('DashBoard.layouts', qdict));
154         $dialog.find('li').click(function() {
155             var layout = $(this).attr('data-layout');
156             $dialog.dialog("destroy");
157             self.do_change_layout(layout);
158         });
159     },
160     do_change_layout: function(new_layout) {
161         var $dashboard = this.$element.find('.oe-dashboard');
162         var current_layout = $dashboard.attr('data-layout');
163         if (current_layout != new_layout) {
164             var clayout = current_layout.split('-').length,
165                 nlayout = new_layout.split('-').length,
166                 column_diff = clayout - nlayout;
167             if (column_diff > 0) {
168                 var $last_column = $();
169                 $dashboard.find('.oe-dashboard-column').each(function(k, v) {
170                     if (k >= nlayout) {
171                         $(v).find('.oe-dashboard-action').appendTo($last_column);
172                     } else {
173                         $last_column = $(v);
174                     }
175                 });
176             }
177             $dashboard.toggleClass('oe-dashboard-layout_' + current_layout + ' oe-dashboard-layout_' + new_layout);
178             $dashboard.attr('data-layout', new_layout);
179             this.do_save_dashboard();
180         }
181     },
182     on_fold_action: function(e) {
183         var $e = $(e.currentTarget);
184         $e.toggleClass('ui-icon-minusthick ui-icon-plusthick');
185         $e.parents('.oe-dashboard-action:first').find('.oe-dashboard-action-content').toggle();
186     },
187     on_close_action: function(e) {
188         $(e.currentTarget).parents('.oe-dashboard-action:first').remove();
189         this.do_save_dashboard();
190     },
191     do_save_dashboard: function() {
192         var self = this;
193         var board = {
194                 form_title : this.view.fields_view.arch.attrs.string,
195                 style : this.$element.find('.oe-dashboard').attr('data-layout'),
196                 columns : []
197             };
198         this.$element.find('.oe-dashboard-column').each(function() {
199             var actions = [];
200             $(this).find('.oe-dashboard-action').each(function() {
201                 var action_id = $(this).attr('data-id');
202                 actions.push(self.actions_attrs[action_id]);
203             });
204             board.columns.push(actions);
205         });
206         var arch = QWeb.render('DashBoard.xml', board);
207         this.rpc('/base/view/add_custom', {
208             view_id: this.view.fields_view.view_id,
209             arch: arch
210         }, function() {
211             self.$element.find('.oe-dashboard-link-undo, .oe-dashboard-link-reset').show();
212         });
213     },
214     on_load_action: function(result) {
215         var action = result.result;
216         action.flags = {
217             search_view : false,
218             sidebar : false,
219             views_switcher : false,
220             action_buttons : false,
221             pager: false
222         }
223         var element_id = this.view.element_id + '_action_' + action.id;
224         var view = new openerp.base.ViewManagerAction(this.session, element_id, action);
225         view.start();
226     },
227     render: function() {
228         // We should start with three columns available
229         for (var i = this.node.children.length; i < 3; i++) {
230             this.node.children.push({
231                 tag: 'column',
232                 attrs: {},
233                 children: []
234             });
235         }
236         return QWeb.render(this.template, this);
237     },
238     do_reload: function() {
239         this.view.view_manager.stop();
240         this.view.view_manager.start();
241     }
242 });
243 openerp.base.form.DashBoardLegacy = openerp.base.form.DashBoard.extend({
244     render: function() {
245         if (this.node.tag == 'hpaned') {
246             this.node.attrs.style = '1-1';
247         } else if (this.node.tag == 'vpaned') {
248             this.node.attrs.style = '1';
249         }
250         this.node.tag = 'board';
251         _.each(this.node.children, function(child) {
252             if (child.tag.indexOf('child') == 0) {
253                 child.tag = 'column';
254                 var actions = [], first_child = child.children[0];
255                 if (first_child && first_child.tag == 'vpaned') {
256                     _.each(first_child.children, function(subchild) {
257                         actions.push.apply(actions, subchild.children);
258                     });
259                     child.children = actions;
260                 }
261             }
262         });
263         return this._super(this, arguments);
264     }
265 });
266
267 openerp.base.form.widgets.add('hpaned', 'openerp.base.form.DashBoardLegacy');
268 openerp.base.form.widgets.add('vpaned', 'openerp.base.form.DashBoardLegacy');
269 openerp.base.form.widgets.add('board', 'openerp.base.form.DashBoard');
270 }