openerp.base.form.DashBoard = openerp.base.form.Widget.extend({
init: function(view, node) {
this._super(view, node);
- this.template = "DashBoard";
+ this.template = 'DashBoard';
this.actions_attrs = {};
+ this.action_managers = [];
},
start: function() {
var self = this;
this._super.apply(this, arguments);
- this.$element.find(".oe-dashboard-column").sortable({
- connectWith: ".oe-dashboard-column",
+ this.$element.find('.oe-dashboard-column').sortable({
+ connectWith: '.oe-dashboard-column',
+ handle: '.oe-dashboard-action-header',
scroll: false
}).disableSelection().bind('sortstop', self.do_save_dashboard);
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 .ui-icon-minusthick').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
}, self.on_load_action);
});
});
+
+ //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', {
},
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"]],
+ 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 };
- console.log(this.actions_attrs)
// TODO: should load multiple actions at once
_.each(actions, function(aid) {
self.rpc('/base/action/load', {
});
});
},
+ on_rename : function(e) {
+ var self = this,
+ id = parseInt($(e.currentTarget).parents('.oe-dashboard-action:first').attr('data-id'), 10),
+ $header = $(e.currentTarget).parents('.oe-dashboard-action-header:first'),
+ $rename = $header.find('a.oe-dashboard-action-rename').hide(),
+ $title = $header.find('span.oe-dashboard-action-title').hide(),
+ $input = $header.find('input[name=title]');
+ $input.val($title.text()).show().focus().bind('keydown', function(e) {
+ if (e.which == 13 || e.which == 27) {
+ if (e.which == 13) { //enter
+ var val = $input.val();
+ if (!val) {
+ return false;
+ }
+ $title.text(val);
+ self.actions_attrs[id].string = val;
+ self.do_save_dashboard();
+ }
+ $input.unbind('keydown').hide();
+ $rename.show();
+ $title.show();
+ }
+ });
+ },
on_change_layout: function() {
var self = this;
var qdict = {
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');
- $dialog.dialog("destroy");
+ $dialog.dialog('destroy');
self.do_change_layout(layout);
});
},
}
},
on_fold_action: function(e) {
- var $e = $(e.currentTarget);
+ var $e = $(e.currentTarget),
+ $action = $e.parents('.oe-dashboard-action:first'),
+ id = parseInt($action.attr('data-id'), 10);
+ if ($e.is('.ui-icon-minusthick')) {
+ this.actions_attrs[id].fold = '1';
+ } else {
+ delete(this.actions_attrs[id].fold);
+ }
$e.toggleClass('ui-icon-minusthick ui-icon-plusthick');
- $e.parents('.oe-dashboard-action:first').find('.oe-dashboard-action-content').toggle();
+ $action.find('.oe-dashboard-action-content').toggle();
+ this.do_save_dashboard();
},
on_close_action: function(e) {
$(e.currentTarget).parents('.oe-dashboard-action:first').remove();
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
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({
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
+ }));
+ });
+ }
+});
+};