[ADD] Added group_by + folding + group states
bzr revid: fme@openerp.com-20111103141515-cnk8uwb7onjtnt58
This commit is contained in:
parent
85f062fcee
commit
e2c2fd9e7b
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
Loading…
Reference in New Issue