1 openerp.base_dashboard = function(openerp) {
3 QWeb.add_template('/base_dashboard/static/src/xml/base_dashboard.xml');
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 = {};
13 this._super.apply(this, arguments);
15 this.$element.find(".oe-dashboard-column").sortable({
16 connectWith: ".oe-dashboard-column",
18 }).disableSelection().bind('sortstop', self.do_save_dashboard);
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);
28 this.actions_attrs = {};
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);
42 this.$element.find('a.oe-dashboard-action-rename').live('click', this.on_rename);
45 this.rpc('/base/view/undo_custom', {
46 view_id: this.view.fields_view.view_id
49 on_reset: function() {
50 this.rpc('/base/view/undo_custom', {
51 view_id: this.view.fields_view.view_id,
55 on_add_widget: function() {
58 res_model : 'ir.actions.actions',
59 views : [[false,"list"]],
60 type : 'ir.actions.act_window',
65 domain : [['type', '=', 'ir.actions.act_window']],
68 views_switcher : false,
69 action_buttons : false
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({
83 $(this).dialog("destroy");
86 self.do_add_widget(action_manager);
87 $(this).dialog("destroy");
91 action_manager.start();
92 action_manager.do_action(action);
93 // TODO: should bind ListView#select_record in order to catch record clicking
95 do_add_widget : function(action_manager) {
97 actions = action_manager.viewmanager.views.list.controller.groups.get_selection().ids,
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', {
105 }, function(result) {
106 self.actions_attrs[aid] = {
108 string: _.trim(result.result.name)
111 attrs : self.actions_attrs[aid]
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)
119 on_rename : function(e) {
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();
134 self.actions_attrs[id].string = val;
135 self.do_save_dashboard();
137 $input.unbind('keydown').hide();
143 on_change_layout: function() {
146 current_layout : this.$element.find('.oe-dashboard').attr('data-layout')
148 var $dialog = $('<div>').dialog({
150 title: 'Edit Layout',
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);
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) {
171 $(v).find('.oe-dashboard-action').appendTo($last_column);
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();
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();
187 on_close_action: function(e) {
188 $(e.currentTarget).parents('.oe-dashboard-action:first').remove();
189 this.do_save_dashboard();
191 do_save_dashboard: function() {
194 form_title : this.view.fields_view.arch.attrs.string,
195 style : this.$element.find('.oe-dashboard').attr('data-layout'),
198 this.$element.find('.oe-dashboard-column').each(function() {
200 $(this).find('.oe-dashboard-action').each(function() {
201 var action_id = $(this).attr('data-id');
202 actions.push(self.actions_attrs[action_id]);
204 board.columns.push(actions);
206 var arch = QWeb.render('DashBoard.xml', board);
207 this.rpc('/base/view/add_custom', {
208 view_id: this.view.fields_view.view_id,
211 self.$element.find('.oe-dashboard-link-undo, .oe-dashboard-link-reset').show();
214 on_load_action: function(result) {
215 var action = result.result;
219 views_switcher : false,
220 action_buttons : false,
223 var element_id = this.view.element_id + '_action_' + action.id;
224 var view = new openerp.base.ViewManagerAction(this.session, element_id, action);
228 // We should start with three columns available
229 for (var i = this.node.children.length; i < 3; i++) {
230 this.node.children.push({
236 return QWeb.render(this.template, this);
238 do_reload: function() {
239 this.view.view_manager.stop();
240 this.view.view_manager.start();
243 openerp.base.form.DashBoardLegacy = openerp.base.form.DashBoard.extend({
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';
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);
259 child.children = actions;
263 return this._super(this, arguments);
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');