OpenERP Web
diff --git a/addons/web_graph/__init__.py b/addons/web_graph/__init__.py
index 53e20f29429..e69de29bb2d 100644
--- a/addons/web_graph/__init__.py
+++ b/addons/web_graph/__init__.py
@@ -1,2 +0,0 @@
-#!/usr/bin/python
-import controllers
\ No newline at end of file
diff --git a/addons/web_graph/controllers/__init__.py b/addons/web_graph/controllers/__init__.py
deleted file mode 100644
index 039d9715fab..00000000000
--- a/addons/web_graph/controllers/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-import main
\ No newline at end of file
diff --git a/addons/web_graph/controllers/main.py b/addons/web_graph/controllers/main.py
deleted file mode 100644
index cda868c0809..00000000000
--- a/addons/web_graph/controllers/main.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from web.controllers.main import View
-import web.common as openerpweb
-
-class GraphView(View):
- _cp_path = "/web_graph/graphview"
-
- @openerpweb.jsonrequest
- def load(self, req, model, view_id):
- fields_view = self.fields_view_get(req, model, view_id, 'graph')
- all_fields = req.session.model(model).fields_get()
- return {'fields_view': fields_view, 'all_fields':all_fields}
diff --git a/addons/web_graph/static/src/js/graph.js b/addons/web_graph/static/src/js/graph.js
index 2a493b89166..59bc2c29dcf 100644
--- a/addons/web_graph/static/src/js/graph.js
+++ b/addons/web_graph/static/src/js/graph.js
@@ -33,8 +33,20 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
this.$element.hide();
},
start: function() {
+ var self = this;
this._super();
- return this.rpc("/web_graph/graphview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
+ return $.when(
+ new openerp.web.DataSet(this, this.model).call('fields_get', []),
+ this.rpc('/web/view/load', {
+ model: this.model,
+ view_id: this.view_id,
+ view_type: 'graph'
+ })).then(function (fields_result, view_result) {
+ self.on_loaded({
+ all_fields: fields_result[0],
+ fields_view: view_result[0]
+ });
+ });
},
on_loaded: function(data) {
this.all_fields = data.all_fields;
@@ -49,8 +61,6 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
this.operator = [];
this.group_field = [];
this.orientation = this.fields_view.arch.attrs.orientation || '';
- this.elem_id = this.$element[0]['id'];
-
_.each(this.fields_view.arch.children, function (field) {
if (field.attrs.operator) {
this.operator.push(field.attrs.name);
@@ -98,7 +108,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
},
schedule_chart: function(results) {
- this.$element.html(QWeb.render("GraphView", {"fields_view": this.fields_view, "chart": this.chart,'elem_id': this.elem_id}));
+ this.$element.html(QWeb.render("GraphView", {"fields_view": this.fields_view, "chart": this.chart,'element_id': this.element_id}));
_.each(results, function (result) {
_.each(result, function (field_value, field_name) {
@@ -304,7 +314,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
var bar_chart = new dhtmlXChart({
view: view_chart,
- container: self.elem_id+"-barchart",
+ container: self.element_id+"-barchart",
value:"#"+group_list[0]+"#",
gradient: "3d",
border: false,
@@ -374,7 +384,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
});
}
bar_chart.parse(_.values(abscissa_data), "json");
- jQuery("#"+self.elem_id+"-barchart").height(jQuery("#"+self.elem_id+"-barchart").height()+50);
+ jQuery("#"+self.element_id+"-barchart").height(jQuery("#"+self.element_id+"-barchart").height()+50);
bar_chart.attachEvent("onItemClick", function(id) {
self.open_list_view(bar_chart.get(id));
});
@@ -383,7 +393,7 @@ openerp.web_graph.GraphView = openerp.web.View.extend({
var self = this;
var chart = new dhtmlXChart({
view:"pie3D",
- container:self.elem_id+"-piechart",
+ container:self.element_id+"-piechart",
value:"#"+self.operator_field+"#",
pieInnerText:function(obj) {
var sum = chart.sum("#"+self.operator_field+"#");
diff --git a/addons/web_graph/static/src/xml/web_graph.xml b/addons/web_graph/static/src/xml/web_graph.xml
index 4320b9f156e..90349623946 100644
--- a/addons/web_graph/static/src/xml/web_graph.xml
+++ b/addons/web_graph/static/src/xml/web_graph.xml
@@ -1,4 +1,4 @@
-
\ No newline at end of file
diff --git a/addons/web_hello/__openerp__.py b/addons/web_hello/__openerp__.py
index 7a80645f3b8..40e84db8cd5 100644
--- a/addons/web_hello/__openerp__.py
+++ b/addons/web_hello/__openerp__.py
@@ -5,4 +5,5 @@
"js": ["static/*/*.js", "static/*/js/*.js"],
"css": [],
'active': False,
+ 'web_preload': True,
}
diff --git a/addons/web_hello/static/openerp/base_hello.js b/addons/web_hello/static/openerp/base_hello.js
index 99c97006eac..91caf263196 100644
--- a/addons/web_hello/static/openerp/base_hello.js
+++ b/addons/web_hello/static/openerp/base_hello.js
@@ -13,6 +13,13 @@ openerp.web.SearchView = openerp.web.SearchView.extend({
// here you may tweak globals object, if any, and play with on_* or do_* callbacks on them
+openerp.web.Login = openerp.web.Login.extend({
+ start: function() {
+ console.log('Hello there');
+ this._super.apply(this,arguments);
+ }
+});
+
};
// vim:et fdc=0 fdl=0:
diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css
index afac6cdef47..f92203589b2 100644
--- a/addons/web_kanban/static/src/css/kanban.css
+++ b/addons/web_kanban/static/src/css/kanban.css
@@ -1,8 +1,21 @@
.openerp .oe_kanban_view .oe_column {
- float: left;
width: 100%;
}
+.openerp .oe_vertical_text {
+ writing-mode:tb-rl;
+ -webkit-transform:rotate(90deg);
+ -moz-transform:rotate(90deg);
+ -o-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+ display:block;
+ width:30px;
+ height:20px;
+ align:center;
+ font-size:24px;
+}
+
.openerp .oe_kanban_view .ui-sortable-placeholder {
border: 1px dotted black;
visibility: visible !important;
@@ -14,6 +27,10 @@
font-size: 1.5em;
font-weight: bold;
}
+.openerp .oe_kanban_view .fold-columns-icon {
+ float: left;
+ padding: 2px 2px 0 0;
+}
.openerp .oe_kanban_action_button {
height: 22px;
margin: 0;
@@ -200,4 +217,3 @@
.openerp .oe_kanban_color_alert .oe_kanban_color_border {
border-color: #c00 !important;
}
-
diff --git a/addons/web_kanban/static/src/img/minus-icon.png b/addons/web_kanban/static/src/img/minus-icon.png
new file mode 100644
index 00000000000..cb655d1e503
Binary files /dev/null and b/addons/web_kanban/static/src/img/minus-icon.png differ
diff --git a/addons/web_kanban/static/src/img/plus-icon.png b/addons/web_kanban/static/src/img/plus-icon.png
new file mode 100644
index 00000000000..7bb9b1be856
Binary files /dev/null and b/addons/web_kanban/static/src/img/plus-icon.png differ
diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js
index 8d6727facaa..46173341361 100644
--- a/addons/web_kanban/static/src/js/kanban.js
+++ b/addons/web_kanban/static/src/js/kanban.js
@@ -18,6 +18,8 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
this.all_display_data = false;
this.groups = [];
this.qweb = new QWeb2.Engine();
+ this.aggregates = {};
+ this.NO_OF_COLUMNS = 3;
if (this.options.action_views_ids.form) {
this.form_dialog = new openerp.web.FormDialog(this, {}, this.options.action_views_ids.form, dataset).start();
this.form_dialog.on_form_dialog_saved.add_last(this.on_record_saved);
@@ -36,8 +38,17 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
}
},
add_qweb_template: function() {
+ var group_operator = ["avg", "max", "min", "sum", "count"]
for (var i=0, ii=this.fields_view.arch.children.length; i < ii; i++) {
var child = this.fields_view.arch.children[i];
+ if (child.tag === "field") {
+ for(j=0, jj=group_operator.length; j < jj; j++) {
+ if (child.attrs[group_operator[j]]) {
+ this.aggregates[child.attrs.name] = child.attrs[group_operator[j]];
+ break;
+ }
+ }
+ }
if (child.tag === "templates") {
this.transform_qweb_template(child);
this.qweb.add_template(openerp.web.json_node_to_xml(child));
@@ -118,14 +129,33 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
}
}
},
- on_show_data: function(data) {
+ sort_group: function (first, second) {
+ if (first.header && second.header)
+ {
+ first = first.header.toLowerCase();
+ second = second.header.toLowerCase();
+ if (first > second) return 1;
+ else if (first < second) return -1;
+ else return 0;
+ }
+ else return 0;
+ },
+ on_show_data: function() {
var self = this;
- this.$element.html(QWeb.render("KanbanView", {"data": data}));
+ if (!this.group_by.length) {
+ this.do_record_group();
+ }
+ self.all_display_data.sort(this.sort_group);
+ this.$element.html(QWeb.render("KanbanView", {"data": self.all_display_data}));
this.on_reload_kanban();
+ this.$element.find(".oe_vertical_text").hide();
var drag_handel = false;
if (this.$element.find(".oe_kanban_draghandle").length > 0) {
drag_handel = ".oe_kanban_draghandle";
}
+ if (!this.group_by.length) {
+ drag_handel = true;
+ }
this.$element.find(".oe_column").sortable({
connectWith: ".oe_column",
handle : drag_handel,
@@ -134,36 +164,44 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
self.source_index['column'] = ui.item.parent().attr('id');
},
stop: self.on_receive_record,
+ scroll: false
});
this.$element.find(".oe_column").disableSelection()
this.$element.find('button.oe_kanban_button_new').click(this.do_add_record);
+ this.$element.find(".fold-columns-icon").click(function(event) {
+ self.do_fold_unfold_columns(event, this.id);
+ });
},
- on_button_click: function (button_attrs, record_id) {
- var self = this;
- if (this.groups.length) {
- _.each(this.groups, function (group) {
- group.list([],
- function (groups) {},
- function (dataset) {
- dataset.read_slice([], {}, function(records) {
- var index = parseInt(_.indexOf(dataset.ids, record_id));
- if(index >= 0) {
- self.on_confirm_click(dataset, button_attrs, index, record_id);
- }
- });
- }
- );
- });
- } else {
- var index = parseInt(_.indexOf(self.dataset.ids, record_id));
- if (index >= 0) {
- _.extend(self.dataset, {domain: self.domain, context: self.context});
- self.on_confirm_click(self.dataset, button_attrs, index, record_id);
+ do_fold_unfold_columns: function(event, element_id) {
+ var column_id = "column_" + element_id;
+ var column_element = this.$element.find("#" + column_id + " .oe_fold_column");
+ if (column_element.is(":hidden")) {
+ this.$element.find("#" + column_id).find("img.fold-columns-icon").attr('src', '/web_kanban/static/src/img/minus-icon.png');
+ column_element.show();
+ this.$element.find("#" + column_id + ".oe_table_column").css("width",Math.round(99 / this.all_display_data.length) + "%");
+ this.$element.find("#" + column_id + ".oe_vertical_text").hide();
+ }
+ else{
+ this.$element.find("#" + column_id).find("img.fold-columns-icon").attr('src', '/web_kanban/static/src/img/plus-icon.png');
+ column_element.hide();
+ this.$element.find("#" + column_id + ".oe_table_column").css("width","0.5%");
+ this.$element.find("#" + column_id + ".oe_vertical_text").show();
+ }
+
+ },
+ do_record_group: function() {
+ if (this.NO_OF_COLUMNS && this.all_display_data.length > 0) {
+ var records = this.all_display_data[0].records;
+ var record_per_group = Math.round((records).length / this.NO_OF_COLUMNS);
+ this.all_display_data = [];
+ for (var i=0, ii=this.NO_OF_COLUMNS; i < ii; i++) {
+ this.all_display_data.push({'records': records.slice(0,record_per_group), 'value':i, 'header' : false, 'ids':[]});
+ records.splice(0,record_per_group);
}
}
},
- on_confirm_click: function (dataset, button_attrs, index, record_id) {
- this.on_execute_button_click(dataset, button_attrs, record_id);
+ on_button_click: function (button_attrs, record_id) {
+ this.on_execute_button_click(this.dataset, button_attrs, record_id);
},
do_add_record: function() {
this.dataset.index = null;
@@ -179,8 +217,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
},
on_record_saved: function(r) {
var id = this.form_dialog.form.datarecord.id;
- // TODO fme: reload record instead of all. need refactoring
- this.do_actual_search();
+ this.on_reload_record(id);
},
do_change_color: function(record_id, $e) {
var self = this,
@@ -198,12 +235,41 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
var data = {};
data[$e.data('name')] = $(this).data('color');
self.dataset.write(id, data, {}, function() {
- // TODO fme: reload record instead of all. need refactoring
- self.do_actual_search();
+ self.on_reload_record(id);
});
$cpicker.remove();
});
},
+ /**
+ Reload one record in view.
+ record_id : reload record id.
+ */
+ on_reload_record: function (record_id){
+ var self = this;
+ this.dataset.read_ids([record_id], [], function (records) {
+ if (records.length > 0) {
+ for (var i=0, ii=self.all_display_data.length; i < ii; i++) {
+ for(j=0, jj=self.all_display_data[i].records.length; j < jj; j++) {
+ if (self.all_display_data[i].records[j].id == record_id) {
+ _.extend(self.all_display_data[i].records[j], records[0]);
+ self.$element.find("#main_" + record_id).children().remove();
+ self.$element.find("#main_" + record_id).append(self.qweb.render('kanban-box', {
+ record: self.do_transform_record(self.all_display_data[i].records[j]),
+ kanban_color: self.kanban_color,
+ kanban_gravatar: self.kanban_gravatar
+ }));
+ break;
+ }
+ }
+ }
+ self.$element.find("#main_" + record_id + " .oe_kanban_action").click(self.on_action_clicked);
+ self.$element.find("#main_" + record_id + " .oe_kanban_box_show_onclick_trigger").click(function() {
+ $(this).parent("#main_" + record_id + " .oe_kanban_box").find(".oe_kanban_box_show_onclick").toggle();
+ });
+ }
+ });
+
+ },
do_delete: function (id) {
var self = this;
return $.when(this.dataset.unlink([id])).then(function () {
@@ -228,16 +294,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
this.do_execute_action(
button_attrs, dataset,
record_id, function () {
- var count = 1;
- _.each(self.all_display_data, function(data, index) {
- self.dataset.read_ids( data.ids, [], function(records){
- self.all_display_data[index].records = records;
- if(self.all_display_data.length == count) {
- self.do_actual_search();
- }
- count++;
- });
- });
+ self.do_actual_search();
}
);
},
@@ -249,9 +306,8 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
if (!ui.item.attr("id")) {
return false;
}
- // TODO fme: check what was this sequence
- if (self.fields_view.fields.sequence && (self.source_index.index >= 0 && self.source_index.index != from) ||
- (self.source_index.column && self.source_index.column != ui.item.parent().attr('id'))) {
+ if (self.fields_view.fields.sequence != undefined && ((self.source_index.index >= 0 && self.source_index.index != from) ||
+ (self.source_index.column && self.source_index.column != ui.item.parent().attr('id')))) {
var child_record = ui.item.parent().children();
var data, sequence = 1, index = to;
child_record.splice(0, to);
@@ -338,9 +394,6 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
kanban_gravatar: self.kanban_gravatar
}));
});
- } else {
- self.$element.find("#column_" + data.value).remove();
- self.all_display_data.splice(index, 1);
}
});
this.$element.find('.oe_kanban_action').click(this.on_action_clicked);
@@ -377,8 +430,8 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
do_search: function (domains, contexts, group_by) {
var self = this;
this.rpc('/web/session/eval_domain_and_context', {
- domains: domains,
- contexts: contexts,
+ domains: [this.dataset.get_domain()].concat(domains),
+ contexts: [this.dataset.get_context()].concat(contexts),
group_by_seq: group_by
}, function (results) {
self.domain = results.domain;
@@ -392,23 +445,27 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
group_by = self.group_by;
if (!group_by.length && this.fields_view.arch.attrs.default_group_by) {
group_by = [this.fields_view.arch.attrs.default_group_by];
+ self.group_by = group_by;
}
self.datagroup = new openerp.web.DataGroup(self, self.model, self.domain, self.context, group_by);
- self.dataset.context = self.context;
- self.dataset.domain = self.domain;
- self.datagroup.list([],
+ self.datagroup.list(_.keys(self.fields_view.fields),
function (groups) {
self.groups = groups;
- self.do_render_group(groups);
+ if (groups.length) {
+ self.do_render_group(groups);
+ }
+ else {
+ self.all_display_data = [];
+ self.on_show_data();
+ }
},
function (dataset) {
- self.domain = dataset.domain;
- self.context = dataset.context;
self.groups = [];
- self.dataset.read_slice([], {}, function(records) {
- self.all_display_data = [{'records': records, 'value':false, 'header' : false, 'ids': self.dataset.ids}];
+ self.dataset.read_slice([], {'domain': self.domain, 'context': self.context}, function(records) {
+ if (records.length) self.all_display_data = [{'records': records, 'value':false, 'header' : false, 'ids': self.dataset.ids}];
+ else self.all_display_data = [];
self.$element.find(".oe_kanban_view").remove();
- self.on_show_data(self.all_display_data);
+ self.on_show_data();
});
}
);
@@ -417,8 +474,6 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
this.all_display_data = [];
var self = this;
_.each(datagroups, function (group) {
- self.dataset.context = group.context;
- self.dataset.domain = group.domain;
var group_name = group.value;
var group_value = group.value;
if (!group.value) {
@@ -428,11 +483,15 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
group_name = group.value[1];
group_value = group.value[0];
}
- self.dataset.read_slice([], {}, function(records) {
- self.all_display_data.push({"value" : group_value, "records": records, 'header':group_name, 'ids': self.dataset.ids});
+ var group_aggregates = {};
+ _.each(self.aggregates, function(value, key) {
+ group_aggregates[value] = group.aggregates[key];
+ });
+ self.dataset.read_slice([], {'domain': group.domain, 'context': group.context}, function(records) {
+ self.all_display_data.push({"value" : group_value, "records": records, 'header':group_name, 'ids': self.dataset.ids, 'aggregates': group_aggregates});
if (datagroups.length == self.all_display_data.length) {
self.$element.find(".oe_kanban_view").remove();
- self.on_show_data(self.all_display_data);
+ self.on_show_data();
}
});
});
diff --git a/addons/web_kanban/static/src/xml/web_kanban.xml b/addons/web_kanban/static/src/xml/web_kanban.xml
index aa7bc73190d..8f3aaf457e9 100644
--- a/addons/web_kanban/static/src/xml/web_kanban.xml
+++ b/addons/web_kanban/static/src/xml/web_kanban.xml
@@ -9,15 +9,22 @@
- |
-
+ |
+
+
|
- |
-
+ |
+
+
|
diff --git a/openerp-web.py b/openerp-web.py
index e5b28c83e0a..928a62e4528 100755
--- a/openerp-web.py
+++ b/openerp-web.py
@@ -24,7 +24,7 @@ optparser.add_option("--server-port", dest="server_port", default=8069,
help="OpenERP server port", type="int", metavar="NUMBER")
optparser.add_option("--db-filter", dest="dbfilter", default='.*',
help="Filter listed database", metavar="REGEXP")
-optparser.add_option('--addons-path', dest='addons_path', default=path_addons,
+optparser.add_option('--addons-path', dest='addons_path', default=[path_addons], action='append',
help="Path do addons directory", metavar="PATH")
server_options = optparse.OptionGroup(optparser, "Server configuration")