[ADD] Added group_by + folding + group states

bzr revid: fme@openerp.com-20111103141515-cnk8uwb7onjtnt58
This commit is contained in:
Fabien Meghazi 2011-11-03 15:15:15 +01:00
parent 85f062fcee
commit e2c2fd9e7b
3 changed files with 147 additions and 142 deletions

View File

@ -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;

View File

@ -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();
}
});
});
},
});
};

View File

@ -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">