summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Meghazi <fme@openerp.com>2011-11-03 15:15:15 +0100
committerFabien Meghazi <fme@openerp.com>2011-11-03 15:15:15 +0100
commite2c2fd9e7b2fba739f366dd9645b41e32db02af8 (patch)
tree5ac2e9f1e30613d38b2ec558a601a4988f36b1f3
parent85f062fceee91c18e57d509535f260dffa6e6056 (diff)
[ADD] Added group_by + folding + group states
bzr revid: fme@openerp.com-20111103141515-cnk8uwb7onjtnt58
-rw-r--r--addons/web_kanban/static/src/css/kanban.css73
-rw-r--r--addons/web_kanban/static/src/js/kanban.js184
-rw-r--r--addons/web_kanban/static/src/xml/web_kanban.xml32
3 files changed, 147 insertions, 142 deletions
diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css
index d7c27510f4d..845c3093fcc 100644
--- a/addons/web_kanban/static/src/css/kanban.css
+++ b/addons/web_kanban/static/src/css/kanban.css
@@ -1,37 +1,68 @@
-.openerp .oe_kanban_view .oe_column {
- 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;
- white-space: nowrap;
-}
-
.openerp .oe_kanban_view .ui-sortable-placeholder {
border: 1px dotted black;
visibility: visible !important;
height: 60px !important;
}
+.openerp .oe_kanban_group_header {
+ position: relative;
+}
+.openerp .oe_kanban_group_folded {
+ padding: 0 5px 0 5px;
+}
+.openerp .oe_kanban_group_folded .oe_kanban_group_title,
+.openerp .oe_kanban_group_folded .oe_kanban_aggregates {
+ display: none;
+}
+.openerp .oe_kanban_group_folded .oe_kanban_group_title_vertical {
+ display: block;
+}
-.openerp .oe_kanban_view .oe_column_heading {
+.openerp .oe_kanban_group_title {
color: #000000;
font-size: 130%;
font-weight: bold;
}
-.openerp .oe_kanban_view .fold-columns-icon {
+.openerp .oe_kanban_group_title_vertical {
+ writing-mode: tb-rl;
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ transform: rotate(90deg);
+ width: 30px;
+ height: 20px;
+ align: center;
+ font-size: 24px;
+ white-space: nowrap;
+ display: none;
+ position: absolute;
+ top: 10px;
+}
+
+.openerp .oe_kanban_fold_icon {
+ cursor: pointer;
float: left;
padding: 2px 2px 0 0;
+ width: 16px;
+ height: 16px;
+ background: url(/web_kanban/static/src/img/minus-icon.png) no-repeat;
+}
+.openerp .oe_kanban_group_folded .oe_kanban_fold_icon {
+ background: url(/web_kanban/static/src/img/plus-icon.png) no-repeat;
+}
+
+.openerp ul.oe_kanban_aggregates {
+ padding: 0;
+ margin: 0 0 0 22px;
+}
+.openerp ul.oe_kanban_aggregates li {
+ list-style: circle;
+ font-style: italic;
}
+.openerp ul.oe_kanban_aggregates span {
+ text-decoration: underline;
+}
+
.openerp .oe_kanban_action_button {
height: 22px;
margin: 0;
diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js
index 4262ef1001c..bf114c5549d 100644
--- a/addons/web_kanban/static/src/js/kanban.js
+++ b/addons/web_kanban/static/src/js/kanban.js
@@ -21,6 +21,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
this.nr_columns = 3;
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.do_reload);
+ this.aggregates = {};
this.qweb = new QWeb2.Engine();
this.qweb.debug = (window.location.search.indexOf('?debug') !== -1);
this.qweb.default_dict = {
@@ -129,28 +130,51 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
this.search_group_by = group_by;
$.when(this.has_been_loaded).then(function() {
self.group_by = group_by.length ? group_by[0] : self.fields_view.arch.attrs.default_group_by;
- //self.datagroup = new openerp.web.DataGroup(self, self.model, domain, context, [self.group_by]);
- self.datagroup = new openerp.web.DataGroup(self, self.model, domain, context, []);
+ self.datagroup = new openerp.web.DataGroup(self, self.model, domain, context, self.group_by ? [self.group_by] : []);
self.datagroup.list(self.fields_keys, self.do_process_groups, self.do_process_dataset);
});
},
do_reload: function() {
this.do_search(this.search_domain, this.search_context, this.search_group_by);
},
+ do_clear_groups: function() {
+ _.each(this.groups, function(group) {
+ group.stop();
+ });
+ this.groups = [];
+ },
do_process_groups: function(groups) {
- debugger;
- return
- self.dataset.ids = [];
- self.groups = groups;
- if (groups.length) {
- self.do_render_group(groups);
- } else {
- self.all_display_data = [];
- self.on_show_data();
- }
+ this.do_clear_groups();
+ this.dataset.ids = [];
+ var self = this,
+ remaining = groups.length - 1,
+ groups_array = [];
+ _.each(groups, function (group, index) {
+ var group_name, group_value, group_aggregates = {};
+ if (group.value instanceof Array) {
+ group_name = group.value[1];
+ group_value = group.value[0];
+ } else {
+ group_name = '' + group.value;
+ group_value = group.value;
+ }
+ _.each(self.aggregates, function(value, key) {
+ group_aggregates[value] = group.aggregates[key];
+ });
+ var dataset = new openerp.web.DataSetSearch(self, self.dataset.model, group.context, group.domain);
+ dataset.read_slice(self.fields_keys, {'domain': group.domain, 'context': group.context}, function(records) {
+ self.dataset.ids.push.apply(self.dataset.ids, dataset.ids);
+ groups_array[index] = new openerp.web_kanban.KanbanGroup(self, group_value, group_name, records, group_aggregates);
+ if (!remaining--) {
+ self.dataset.index = self.dataset.ids.length ? 0 : null;
+ self.do_add_groups(groups_array);
+ }
+ });
+ });
},
do_process_dataset: function(dataset) {
var self = this;
+ this.do_clear_groups();
this.dataset.read_slice(this.fields_keys, {}, function(records) {
var groups = [];
while (records.length) {
@@ -169,33 +193,55 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
},
do_add_groups: function(groups) {
var self = this;
- _.each(this.groups, function(group) {
- group.stop();
- });
this.groups = groups;
_.each(this.groups, function(group) {
group.appendTo(self.$element.find('.oe_kanban_groups_headers'));
});
+ this.compute_groups_width();
},
do_show: function () {
this.$element.show();
},
do_hide: function () {
this.$element.hide();
+ },
+ compute_groups_width: function() {
+ var unfolded = 0;
+ _.each(this.groups, function(group) {
+ unfolded += group.state.folded ? 0 : 1;
+ group.$element.css('width', '');
+ });
+ _.each(this.groups, function(group) {
+ if (!group.state.folded) {
+ group.$element.css('width', Math.round(100/unfolded) + '%');
+ }
+ });
}
});
openerp.web_kanban.KanbanGroup = openerp.web.Widget.extend({
template: 'KanbanView.group_header',
- init: function (parent, value, title, records) {
+ init: function (parent, value, title, records, aggregates) {
var self = this;
this._super(parent);
this.view = parent;
- this.foldable = this.draggable = (title !== false);
this.value = value;
this.title = title;
+ this.aggregates = aggregates || {};
+ if (!title && !value) {
+ this.state = {};
+ this.foldable = this.draggable = false;
+ } else {
+ this.foldable = this.draggable = true;
+ var key = '' + this.view.group_by + '' + value;
+ if (!this.view.groups_states[key]) {
+ this.view.groups_states[key] = {
+ folded: false
+ }
+ }
+ this.state = this.view.groups_states[key];
+ }
this.$records = null;
- this.aggregates = {};
this.records = _.map(records, function(record) {
return new openerp.web_kanban.KanbanRecord(self, record);
});
@@ -208,6 +254,13 @@ openerp.web_kanban.KanbanGroup = openerp.web.Widget.extend({
_.each(this.records, function(record) {
record.appendTo(self.$records);
});
+ this.$element.find(".oe_kanban_fold_icon").click(function() {
+ self.do_toggle_fold();
+ return false;
+ });
+ if (this.state.folded) {
+ this.do_toggle_fold();
+ }
},
stop: function() {
this._super();
@@ -225,6 +278,12 @@ openerp.web_kanban.KanbanGroup = openerp.web.Widget.extend({
delete(this.view.dataset.ids[idx]);
}
}
+ },
+ do_toggle_fold: function() {
+ this.$element.toggleClass('oe_kanban_group_folded');
+ this.$records.find('.oe_kanban_record').toggle();
+ this.state.folded = this.$element.is('.oe_kanban_group_folded');
+ this.view.compute_groups_width();
}
});
@@ -402,9 +461,6 @@ openerp.web_kanban.KanbanView_old = openerp.web.View.extend({
if (!this.group_by.length) {
this.do_record_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";
@@ -422,9 +478,6 @@ openerp.web_kanban.KanbanView_old = openerp.web.View.extend({
stop: self.on_receive_record,
scroll: false
});
- this.$element.find(".fold-columns-icon").click(function(event) {
- self.do_fold_unfold_columns(event, this.id);
- });
},
do_fold_unfold_columns: function(event, element_id) {
var column_id = "column_" + element_id;
@@ -538,89 +591,6 @@ openerp.web_kanban.KanbanView_old = openerp.web.View.extend({
}
this.source_index = {};
},
- on_reload_kanban: function() {
- var self = this;
- _.each(self.all_display_data, function(data, index) {
- if (data.records.length > 0){
- _.each(data.records, function(record) {
- self.$element.find("#main_" + record.id).children().remove();
- self.$element.find("#main_" + record.id).append(
- self.qweb.render('kanban-box', self.get_qweb_context(record))
- );
- });
- }
- });
- this.$element.find('.oe_kanban_action').click(this.on_action_clicked);
- this.$element.find('.oe_kanban_box_show_onclick_trigger').click(function() {
- $(this).parent('.oe_kanban_box').find('.oe_kanban_box_show_onclick').toggle();
- });
- },
- do_search: function (domain, context, group_by) {
- var self = this;
- self.group_by = group_by;
- var self = this,
- 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, domain, context, group_by);
- self.datagroup.list(
- _.keys(self.fields_view.fields),
- function (groups) {
- self.dataset.ids = [];
- self.groups = groups;
- if (groups.length) {
- self.do_render_group(groups);
- } else {
- self.all_display_data = [];
- self.on_show_data();
- }
- },
- function (dataset) {
- self.groups = [];
- self.dataset.read_slice(_.keys(self.fields_view.fields), {}, 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();
- });
- }
- );
- },
- do_render_group : function (datagroups) {
- this.all_display_data = [];
- var self = this,
- remaining = datagroups.length - 1;
- _.each(datagroups, function (group, index) {
- var group_name = group.value;
- var group_value = group.value;
- if (!group.value) {
- group_name = "Undefined";
- group_value = 'false';
- } else if (group.value instanceof Array) {
- group_name = group.value[1];
- group_value = group.value[0];
- }
- var group_aggregates = {};
- _.each(self.aggregates, function(value, key) {
- group_aggregates[value] = group.aggregates[key];
- });
- var dataset = new openerp.web.DataSetSearch(self, self.dataset.model, group.context, group.domain);
- self.$element.find(".oe_kanban_view").remove();
- dataset.read_slice(_.keys(self.fields_view.fields), {'domain': group.domain, 'context': group.context}, function(records) {
- self.dataset.ids.push.apply(self.dataset.ids, dataset.ids);
- self.all_display_data[index] = {"value" : group_value, "records" : records, 'header' : group_name, 'ids' : dataset.ids, 'aggregates' : group_aggregates};
- if (!remaining--) {
- self.dataset.index = self.dataset.ids.length ? 0 : null;
- 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 6530e14e57d..476d2552cee 100644
--- a/addons/web_kanban/static/src/xml/web_kanban.xml
+++ b/addons/web_kanban/static/src/xml/web_kanban.xml
@@ -3,29 +3,33 @@
<div class="oe_kanban_header">
<button type="button" class="oe_kanban_button_new">New</button>
</div>
- <table style="width:100%;" class="oe_kanban_groups">
- <tr class="oe_kanban_groups_headers">
- </tr>
- <tr class="oe_kanban_groups_records">
- </tr>
- </table>
+ <div class="oe_kanban_view">
+ <table style="width:100%;" class="oe_kanban_groups">
+ <tr class="oe_kanban_groups_headers">
+ </tr>
+ <tr class="oe_kanban_groups_records">
+ </tr>
+ </table>
+ </div>
</t>
<t t-name="KanbanView.group_header">
- <td class="oe_table_column">
- <img t-if="widget.foldable" class="fold-columns-icon" src="/web_kanban/static/src/img/minus-icon.png"/>
+ <td class="oe_kanban_group_header">
+ <div t-if="widget.foldable" class="oe_kanban_fold_icon"></div>
<div class="oe_fold_column">
- <div class="oe_column_heading" t-if="widget.title">
+ <div class="oe_kanban_group_title" t-if="widget.title">
<t t-esc="widget.title"/>
</div>
- <div t-foreach="widget.aggregates" t-as="aggregate">
- <i><u><t t-esc="aggregate"/>:</u> <t t-esc="aggregate_value"/></i>
- </div>
+ <ul class="oe_kanban_aggregates">
+ <li t-foreach="widget.aggregates" t-as="aggregate">
+ <span><t t-esc="aggregate"/>:</span> <t t-esc="aggregate_value"/>
+ </li>
+ </ul>
</div>
+ <p t-if="widget.title" class="oe_kanban_group_title_vertical"><t t-esc="widget.title"/></p>
</td>
</t>
<t t-name="KanbanView.group_records_container">
- <td class="oe_column oe_table_column" t-attf-style="width: #{Math.round(99 / widget.view.groups.length)}%">
- <p t-if="widget.title" class="oe_vertical_text"><t t-esc="widget.title"/></p>
+ <td class="oe_column">
</td>
</t>
<t t-name="KanbanView.record">