[FIX] selector for config overview widget: widget root has moved, .oe-dashboard-confi...
[odoo/odoo.git] / addons / base_dashboard / static / src / js / dashboard.js
index 7000137..e5b06a1 100644 (file)
@@ -7,6 +7,7 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
         this._super(view, node);
         this.template = 'DashBoard';
         this.actions_attrs = {};
+        this.action_managers = [];
     },
     start: function() {
         var self = this;
@@ -23,8 +24,9 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
         this.$element.find('.oe-dashboard-link-reset').click(this.on_reset);
         this.$element.find('.oe-dashboard-link-add_widget').click(this.on_add_widget);
         this.$element.find('.oe-dashboard-link-change_layout').click(this.on_change_layout);
-        this.$element.find('.oe-dashboard-column .oe-dashboard-fold').click(this.on_fold_action);
-        this.$element.find('.oe-dashboard-column .ui-icon-closethick').click(this.on_close_action);
+
+        this.$element.delegate('.oe-dashboard-column .oe-dashboard-fold', 'click', this.on_fold_action);
+        this.$element.delegate('.oe-dashboard-column .ui-icon-closethick', 'click', this.on_close_action);
 
         this.actions_attrs = {};
         // Init actions
@@ -40,7 +42,10 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
             });
         });
 
-        this.$element.find('a.oe-dashboard-action-rename').live('click', this.on_rename);
+        //this.$element.find('a.oe-dashboard-action-rename').live('click', this.on_rename);
+        this.$element.find('.oe-dashboard-action').live('mouseover mouseout', function(event) {
+            $(this).find('.oe-dashboard-action-header .ui-icon, .oe-dashboard-action-header .oe-dashboard-action-rename').toggle(event.type == 'mouseover');
+        });
     },
     on_undo: function() {
         this.rpc('/base/view/undo_custom', {
@@ -55,47 +60,39 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
     },
     on_add_widget: function() {
         var self = this;
-        var action = {
+        var action_manager = new openerp.base.ActionManager(this);
+        var dialog = new openerp.base.Dialog(this, {
+            title : 'Actions',
+            width: 800,
+            height: 600,
+            buttons : {
+                Cancel : function() {
+                    $(this).dialog('destroy');
+                },
+                Add : function() {
+                    self.do_add_widget(action_manager.inner_viewmanager.views.list.controller);
+                    $(this).dialog('destroy');
+                }
+            }
+        }).start().open();
+        action_manager.appendTo(dialog.$element);
+        action_manager.do_action({
             res_model : 'ir.actions.actions',
             views : [[false, 'list']],
             type : 'ir.actions.act_window',
-            view_type : 'list',
-            view_mode : 'list',
             limit : 80,
             auto_search : true,
-            domain : [['type', '=', 'ir.actions.act_window']],
             flags : {
                 sidebar : false,
                 views_switcher : false,
                 action_buttons : false
             }
-        };
-        // TODO: create a Dialog controller which optionally takes an action
-        // Should set width & height automatically and take buttons & views callback
-        var dialog_id = _.uniqueId('act_window_dialog');
-        var action_manager = new openerp.base.ActionManager(this.session, dialog_id);
-        var $dialog = $('<div id=' + dialog_id + '>').dialog({
-                            modal : true,
-                            title : 'Actions',
-                            width : 800,
-                            height : 600,
-                            buttons : {
-                                Cancel : function() {
-                                    $(this).dialog('destroy');
-                                },
-                                Add : function() {
-                                    self.do_add_widget(action_manager);
-                                    $(this).dialog('destroy');
-                                }
-                            }
-                        });
-        action_manager.start();
-        action_manager.do_action(action);
+        });
         // TODO: should bind ListView#select_record in order to catch record clicking
     },
-    do_add_widget : function(action_manager) {
+    do_add_widget : function(listview) {
         var self = this,
-            actions = action_manager.viewmanager.views.list.controller.groups.get_selection().ids,
+            actions = listview.groups.get_selection().ids,
             results = [],
             qdict = { view : this.view };
         // TODO: should load multiple actions at once
@@ -149,7 +146,7 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
                             modal: true,
                             title: 'Edit Layout',
                             width: 'auto',
-                            height: 'auto',
+                            height: 'auto'
                         }).html(QWeb.render('DashBoard.layouts', qdict));
         $dialog.find('li').click(function() {
             var layout = $(this).attr('data-layout');
@@ -227,10 +224,11 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
             views_switcher : false,
             action_buttons : false,
             pager: false
-        }
-        var element_id = this.view.element_id + '_action_' + action.id;
-        var view = new openerp.base.ViewManagerAction(this.session, element_id, action);
-        view.start();
+        };
+        var am = new openerp.base.ActionManager(this);
+        this.action_managers.push(am);
+        am.appendTo($("#"+this.view.element_id + '_action_' + action.id));
+        am.do_action(action);
     },
     render: function() {
         // We should start with three columns available
@@ -244,8 +242,12 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
         return QWeb.render(this.template, this);
     },
     do_reload: function() {
-        this.view.view_manager.stop();
-        this.view.view_manager.start();
+        _.each(this.action_managers, function(am) {
+            am.stop();
+        });
+        this.action_managers = [];
+        this.view.stop();
+        this.view.start();
     }
 });
 openerp.base.form.DashBoardLegacy = openerp.base.form.DashBoard.extend({
@@ -275,4 +277,134 @@ openerp.base.form.DashBoardLegacy = openerp.base.form.DashBoard.extend({
 openerp.base.form.widgets.add('hpaned', 'openerp.base.form.DashBoardLegacy');
 openerp.base.form.widgets.add('vpaned', 'openerp.base.form.DashBoardLegacy');
 openerp.base.form.widgets.add('board', 'openerp.base.form.DashBoard');
+
+openerp.base.client_actions.add(
+    'board.config.overview', 'openerp.base_dashboard.ConfigOverview'
+);
+if (!openerp.base_dashboard) {
+    openerp.base_dashboard = {};
 }
+openerp.base_dashboard.ConfigOverview = openerp.base.View.extend({
+    template: 'ConfigOverview',
+    init: function (parent, element_id) {
+        this._super(parent, element_id);
+        this.dataset = new openerp.base.DataSetSearch(
+                this, 'ir.actions.todo');
+        this.dataset.domain = [['type', '=', 'manual']];
+    },
+    start: function () {
+        $.when(this.dataset.read_slice(['state', 'action_id', 'category_id']),
+               this.dataset.call('progress'))
+            .then(this.on_records_loaded);
+    },
+    on_records_loaded: function (read_response, progress_response) {
+        var records = read_response[0].records,
+           progress = progress_response[0];
+
+        var grouped_todos = _(records).chain()
+            .map(function (record) {
+                return {
+                    id: record.id,
+                    name: record.action_id[1],
+                    done: record.state !== 'open',
+                    to_do: record.state === 'open',
+                    category: record['category_id'][1] || "Uncategorized"
+                }
+            })
+            .groupBy(function (record) {return record.category})
+            .value();
+        this.$element.html(QWeb.render('ConfigOverview.content', {
+            completion: 100 * progress.done / progress.total,
+            groups: grouped_todos
+        }));
+        var $progress = this.$element.find('div.oe-config-progress-bar');
+        $progress.progressbar({value: $progress.data('completion')});
+
+        var self = this;
+        this.$element.find('dl')
+            .delegate('input', 'click', function (e) {
+                // switch todo status
+                e.stopImmediatePropagation();
+                var new_state = this.checked ? 'done' : 'open',
+                      todo_id = parseInt($(this).val(), 10);
+                self.dataset.write(todo_id, {state: new_state}, function () {
+                    self.start();
+                });
+            })
+            .delegate('li:not(.oe-done)', 'click', function () {
+                self.execute_action({
+                        type: 'object',
+                        name: 'action_launch'
+                    }, self.dataset,
+                    $(this).data('id'), function () {
+                        // after action popup closed, refresh configuration
+                        // thingie
+                        self.start();
+                    });
+            });
+    }
+});
+
+openerp.base.client_actions.add(
+    'board.home.applications', 'openerp.base_dashboard.ApplicationTiles');
+openerp.base_dashboard.ApplicationTiles = openerp.base.View.extend({
+    template: 'ApplicationTiles',
+    start: function () {
+        var self = this;
+        return new openerp.base.DataSetSearch(
+                this, 'ir.ui.menu', null, [['parent_id', '=', false]])
+            .read_slice( ['name', 'web_icon_data', 'web_icon_hover_data'], {}, function (applications) {
+                // Create a matrix of 3*x applications
+                var rows = [];
+                while (applications.length) {
+                    rows.push(applications.splice(0, 3));
+                }
+                self.$element
+                    .append(QWeb.render(
+                        'ApplicationTiles.content', {rows: rows}))
+                    .find('.oe-dashboard-home-tile')
+                        .click(function () {
+                            var $this = $(this);
+                            $this.closest('.openerp')
+                                 .find('.menu a[data-menu=' + $this.data('menuid') + ']')
+                                 .click();});
+            });
+    }
+});
+openerp.base.client_actions.add(
+    'board.home.widgets', 'openerp.base_dashboard.Widgets');
+openerp.base_dashboard.Widgets = openerp.base.View.extend({
+    template: 'HomeWidgets',
+    start: function () {
+        return new openerp.base.DataSetSearch(
+                this, 'res.widget.user', null,
+                ['|', ['user_id', '=', false],
+                      ['user_id', '=', parseInt(this.session.uid, 10)]])
+            .read_slice(['widget_id', 'user_id'], {}, this.on_widgets_list_loaded);
+    },
+    on_widgets_list_loaded: function (user_widgets) {
+        var self = this;
+        var widget_user = {};
+        _(user_widgets).each(function (widget) {
+            widget['widget_id'] = widget['widget_id'][0];
+            widget_user[widget['widget_id']] = {
+                removable: widget['user_id'] !== false,
+                user_widget_id: widget['id']
+            };
+        });
+        new openerp.base.DataSetSearch(this, 'res.widget')
+            .read_ids(_(user_widgets).pluck('widget_id'), ['title'], function (widgets) {
+                _(widgets).each(function (widget) {
+                    _.extend(widget, widget_user[widget['id']]);
+                });
+                var url = _.sprintf(
+                    '/base_dashboard/widgets/content?session_id=%s&widget_id=',
+                    self.session.session_id);
+                self.$element.html(QWeb.render('HomeWidgets', {
+                    widgets: widgets,
+                    url: url
+                }));
+            });
+    }
+});
+};