From 2b0fcb77753bda709a1abf6995874469985fd595 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 14 Aug 2012 21:53:16 +0200 Subject: [PATCH 01/11] [WIP] groups drag'n drop + resequence bzr revid: fme@openerp.com-20120814195316-j66wn6yxta6yj0w9 --- addons/web/controllers/main.py | 6 ++ addons/web/static/src/js/data.js | 16 +++++ addons/web_kanban/static/src/css/kanban.css | 4 ++ addons/web_kanban/static/src/css/kanban.sass | 2 + addons/web_kanban/static/src/js/kanban.js | 71 +++++++++++++++++-- .../web_kanban/static/src/xml/web_kanban.xml | 4 ++ 6 files changed, 97 insertions(+), 6 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index c5fdcce4945..e2ba9ebc5cc 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1136,6 +1136,12 @@ class DataSet(openerpweb.Controller): def exec_workflow(self, req, model, id, signal): return req.session.exec_workflow(model, id, signal) + @openerpweb.jsonrequest + def resequence(self, req, model, ids): + m = req.session.model(model) + print "TODO: write resequencing" + return True + class DataGroup(openerpweb.Controller): _cp_path = "/web/group" @openerpweb.jsonrequest diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index e360c922918..a2adc2429bd 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -805,6 +805,22 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend( /** @lends openerp. alter_ids: function(n_ids) { this.ids = n_ids; }, + /** + * Resequence records. + * + * @param {Array} ids identifiers of the records to resequence + * @returns {$.Deferred} + */ + resequence: function (ids, options) { + options = options || {}; + return this.rpc('/web/dataset/resequence', { + model: this.model, + ids: ids, + context: this._model.context(options.context), + }).pipe(function (results) { + return results; + }); + }, }); instance.web.DataSetStatic = instance.web.DataSet.extend({ init: function(parent, model, context, ids) { diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index 47d9368d9dc..5b4d18c2e71 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -1,3 +1,4 @@ +@charset "utf-8"; .openerp .oe_kanban_view { height: inherit; } @@ -44,6 +45,9 @@ .openerp .oe_kanban_view.oe_kanban_ungrouped .oe_kanban_groups { width: 100%; } +.openerp .oe_kanban_view.oe_kanban_sortable_groups .oe_kanban_group_title { + cursor: move; +} .openerp .oe_kanban_view .oe_kanban_header:hover .oe_dropdown_kanban { display: inline-block; } diff --git a/addons/web_kanban/static/src/css/kanban.sass b/addons/web_kanban/static/src/css/kanban.sass index 029014b1f43..c1a8f48645d 100644 --- a/addons/web_kanban/static/src/css/kanban.sass +++ b/addons/web_kanban/static/src/css/kanban.sass @@ -66,6 +66,8 @@ height: inherit &.oe_kanban_ungrouped .oe_kanban_groups width: 100% + &.oe_kanban_sortable_groups .oe_kanban_group_title + cursor: move .oe_kanban_header &:hover .oe_dropdown_kanban diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 6c70ecfb8ec..4ca7ebf2be9 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -24,6 +24,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.fields_view = {}; this.fields_keys = []; this.group_by = null; + this.grouped_by_m2o = false; this.state = { groups : {}, records : {} @@ -54,7 +55,8 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.$element.find('.oe_kanban_buttons').replaceWith(this.$buttons); } this.$buttons - .on('click','button.oe_kanban_button_new', this.do_add_record); + .on('click', 'button.oe_kanban_button_new', this.do_add_record) + .on('click', '.oe_kanban_add_column', this.do_add_group); this.$groups = this.$element.find('.oe_kanban_groups tr'); this.fields_keys = _.keys(this.fields_view.fields); this.add_qweb_template(); @@ -157,6 +159,27 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.dataset.index = null; this.do_switch_view('form'); }, + do_add_group: function() { + var self = this; + var group_by = self.fields_view.fields[self.group_by]; + self.do_action({ + name: _t("Add column"), + res_model: group_by.relation, + views: [[false, 'form']], + type: 'ir.actions.act_window', + target: "new", + flags: { + action_buttons: true, + } + }); + var am = instance.webclient.action_manager; + var form = am.dialog_widget.views.form.controller; + form.on_button_cancel.add_last(am.dialog.on_close); + form.on_created.add_last(function() { + am.dialog.on_close(); + self.do_reload(); + }); + }, do_search: function(domain, context, group_by) { var self = this; this.$element.find('.oe_view_nocontent').remove(); @@ -165,6 +188,10 @@ instance.web_kanban.KanbanView = instance.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; + var group_by_field = self.fields_view.fields[self.group_by]; + self.grouped_by_m2o = !!(group_by_field && group_by_field.type === 'many2one'); + self.$buttons.find('.oe_alternative').toggle(self.grouped_by_m2o); + self.$element.toggleClass('oe_kanban_sortable_groups', self.grouped_by_m2o); self.datagroup = new instance.web.DataGroup(self, self.dataset.model, domain, context, self.group_by ? [self.group_by] : []); self.datagroup.list(self.fields_keys, self.do_process_groups, self.do_process_dataset); }); @@ -237,6 +264,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var self = this; this.compute_groups_width(); if (this.group_by) { + // Kanban cards drag'n'drop this.$element.find('.oe_kanban_column').sortable({ connectWith: '.oe_kanban_column', handle : '.oe_kanban_draghandle', @@ -245,17 +273,48 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ self.currently_dragging.group = ui.item.parents('.oe_kanban_column:first').data('widget'); }, stop: function(event, ui) { - var record = ui.item.data('widget'), - old_index = self.currently_dragging.index, - new_index = ui.item.index(), - old_group = self.currently_dragging.group, - new_group = ui.item.parents('.oe_kanban_column:first').data('widget'); + var record = ui.item.data('widget'); + var old_index = self.currently_dragging.index; + var new_index = ui.item.index(); + var old_group = self.currently_dragging.group; + var new_group = ui.item.parents('.oe_kanban_column:first').data('widget'); if (!(old_group.title === new_group.title && old_group.value === new_group.value && old_index == new_index)) { self.on_record_moved(record, old_group, old_index, new_group, new_index); } }, scroll: false }); + // Kanban groups drag'n'drop + var start_index; + if (this.grouped_by_m2o) { + this.$('.oe_kanban_groups_headers').sortable({ + helper: 'clone', + axis: 'x', + opacity: 0.5, + scroll: false, + start: function(event, ui) { + start_index = ui.item.index(); + self.$('.oe_kanban_record').hide(); + }, + stop: function(event, ui) { + var stop_index = ui.item.index(); + if (start_index !== stop_index) { + var $start_column = $('.oe_kanban_groups_records .oe_kanban_column').eq(start_index); + var $stop_column = $('.oe_kanban_groups_records .oe_kanban_column').eq(stop_index); + var method = (start_index > stop_index) ? 'insertBefore' : 'insertAfter'; + $start_column[method]($stop_column); + var tmp_group = self.groups.splice(start_index, 1)[0]; + self.groups.splice(stop_index, 0, tmp_group); + var new_sequence = _.pluck(self.groups, 'value'); + var field = self.fields_view.fields[self.group_by]; //TODO: self.field should be the field definition + (new instance.web.DataSet(self, field.relation)).resequence(new_sequence).then(function(r) { + console.log(r); + }); + } + self.$('.oe_kanban_record').show(); + } + }); + } } else { this.$element.find('.oe_kanban_draghandle').removeClass('oe_kanban_draghandle'); } diff --git a/addons/web_kanban/static/src/xml/web_kanban.xml b/addons/web_kanban/static/src/xml/web_kanban.xml index 4bcc9a709a3..e1da07e3554 100644 --- a/addons/web_kanban/static/src/xml/web_kanban.xml +++ b/addons/web_kanban/static/src/xml/web_kanban.xml @@ -18,6 +18,10 @@ + From cc406bc6920513faf960a29a500409985c1ee5bd Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 14 Aug 2012 23:37:08 +0200 Subject: [PATCH 02/11] [WIP] Added group_by_field bzr revid: fme@openerp.com-20120814213708-zkm05nkr1pdf8qbu --- addons/web/static/src/js/data.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index a2adc2429bd..2372c6bbff9 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -813,7 +813,7 @@ instance.web.DataSet = instance.web.CallbackEnabled.extend( /** @lends openerp. */ resequence: function (ids, options) { options = options || {}; - return this.rpc('/web/dataset/resequence', { + return instance.session.rpc('/web/dataset/resequence', { model: this.model, ids: ids, context: this._model.context(options.context), diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 4ca7ebf2be9..42a3fc1600e 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -24,6 +24,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.fields_view = {}; this.fields_keys = []; this.group_by = null; + this.group_by_field = {}; this.grouped_by_m2o = false; this.state = { groups : {}, @@ -161,10 +162,9 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }, do_add_group: function() { var self = this; - var group_by = self.fields_view.fields[self.group_by]; self.do_action({ name: _t("Add column"), - res_model: group_by.relation, + res_model: self.group_by_field.relation, views: [[false, 'form']], type: 'ir.actions.act_window', target: "new", @@ -188,8 +188,8 @@ instance.web_kanban.KanbanView = instance.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; - var group_by_field = self.fields_view.fields[self.group_by]; - self.grouped_by_m2o = !!(group_by_field && group_by_field.type === 'many2one'); + self.group_by_field = self.fields_view.fields[self.group_by] || {}; + self.grouped_by_m2o = (self.group_by_field.type === 'many2one'); self.$buttons.find('.oe_alternative').toggle(self.grouped_by_m2o); self.$element.toggleClass('oe_kanban_sortable_groups', self.grouped_by_m2o); self.datagroup = new instance.web.DataGroup(self, self.dataset.model, domain, context, self.group_by ? [self.group_by] : []); @@ -306,8 +306,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var tmp_group = self.groups.splice(start_index, 1)[0]; self.groups.splice(stop_index, 0, tmp_group); var new_sequence = _.pluck(self.groups, 'value'); - var field = self.fields_view.fields[self.group_by]; //TODO: self.field should be the field definition - (new instance.web.DataSet(self, field.relation)).resequence(new_sequence).then(function(r) { + (new instance.web.DataSet(self, self.group_by_field.relation)).resequence(new_sequence).then(function(r) { console.log(r); }); } @@ -421,7 +420,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.title = this.value[1]; this.value = this.value[0]; } - var field = this.view.fields_view.fields[this.view.group_by]; + var field = this.view.group_by_field; if (field) { try { this.title = instance.web.format_value(group.value, field, false); From f1531572de0c3099ff78da65473dfc29dba6c4ac Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 15 Aug 2012 00:13:34 +0200 Subject: [PATCH 03/11] [WIP] Resequence bzr revid: fme@openerp.com-20120814221334-8arihwthpwictk3y --- addons/web/controllers/main.py | 5 ++++- addons/web_kanban/static/src/js/kanban.js | 9 +++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index e2ba9ebc5cc..4a7f09cb461 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1139,7 +1139,10 @@ class DataSet(openerpweb.Controller): @openerpweb.jsonrequest def resequence(self, req, model, ids): m = req.session.model(model) - print "TODO: write resequencing" + if not len(m.fields_get(['sequence'])): + return False + for i in range(len(ids)): + m.write([ids[i]], { 'sequence': i }) return True class DataGroup(openerpweb.Controller): diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 42a3fc1600e..245f7024a22 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -307,7 +307,9 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ self.groups.splice(stop_index, 0, tmp_group); var new_sequence = _.pluck(self.groups, 'value'); (new instance.web.DataSet(self, self.group_by_field.relation)).resequence(new_sequence).then(function(r) { - console.log(r); + if (r === false) { + console.error("Kanban: could not resequence model '%s'. Probably no 'sequence' field.", self.group_by_field.relation); + } }); } self.$('.oe_kanban_record').show(); @@ -555,9 +557,8 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ do_save_sequences: function() { var self = this; if (_.indexOf(this.view.fields_keys, 'sequence') > -1) { - _.each(this.records, function(record, index) { - self.view.dataset.write(record.id, { sequence : index }); - }); + var new_sequence = _.pluck(this.records, 'id'); + self.view.dataset.resequence(new_sequence); } }, /** From 4bdf1b6beae5c3f28c5542ab8405e4599c4727c5 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 15 Aug 2012 00:23:29 +0200 Subject: [PATCH 04/11] [WIP] Improve group drag'n drop bzr revid: fme@openerp.com-20120814222329-ndu0o9g3wi85lwzp --- addons/web_kanban/static/src/js/kanban.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 245f7024a22..dd8c2fbaef0 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -294,7 +294,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ scroll: false, start: function(event, ui) { start_index = ui.item.index(); - self.$('.oe_kanban_record').hide(); + self.$('.oe_kanban_record').css({ visibility: 'hidden' }); }, stop: function(event, ui) { var stop_index = ui.item.index(); @@ -312,7 +312,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ } }); } - self.$('.oe_kanban_record').show(); + self.$('.oe_kanban_record').css({ visibility: 'visible' }); } }); } From b7ca37a21542178c1bd1b3a43513329dafb26894 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 12:09:58 +0200 Subject: [PATCH 05/11] [FIX] global click for dropdown, remove oe_opened on both elements bzr revid: fme@openerp.com-20120816100958-yi9a2xuwuhwsl3t8 --- addons/web/static/src/js/chrome.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index c632ce5cd0b..12d677bbe9a 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -963,7 +963,7 @@ instance.web.Client = instance.web.Widget.extend({ instance.web.bus.on('click', this, function(ev) { $.fn.tipsy.clear(); if (!$(ev.target).is('input[type=file]')) { - self.$element.find('.oe_dropdown_menu.oe_opened').removeClass('oe_opened'); + self.$element.find('.oe_dropdown_menu.oe_opened, .oe_dropdown_toggle.oe_opened').removeClass('oe_opened'); } }); }, From 313cf9475a29b4e37221c1221d83dace25f69ac0 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 12:50:17 +0200 Subject: [PATCH 06/11] [FIX] Fixed kanban fold/unfold bzr revid: fme@openerp.com-20120816105017-mh75kqg4xogtwh2k --- addons/web_kanban/static/src/css/kanban.css | 35 ++++++++--------- addons/web_kanban/static/src/css/kanban.sass | 38 ++++++++----------- addons/web_kanban/static/src/js/kanban.js | 24 ++++++++---- .../web_kanban/static/src/xml/web_kanban.xml | 18 ++++----- 4 files changed, 57 insertions(+), 58 deletions(-) diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index 5b4d18c2e71..194d8fad146 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -45,11 +45,17 @@ .openerp .oe_kanban_view.oe_kanban_ungrouped .oe_kanban_groups { width: 100%; } -.openerp .oe_kanban_view.oe_kanban_sortable_groups .oe_kanban_group_title { +.openerp .oe_kanban_view.oe_kanban_grouped_by_m2o .oe_kanban_group_title { cursor: move; } -.openerp .oe_kanban_view .oe_kanban_header:hover .oe_dropdown_kanban { - display: inline-block; +.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban { + float: right; +} +.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban > span { + visibility: hidden; +} +.openerp .oe_kanban_view .oe_kanban_header:hover .oe_dropdown_kanban > span { + visibility: visible; } .openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_menu { font-weight: normal; @@ -97,6 +103,9 @@ .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title_vertical { display: block; } +.openerp .oe_kanban_view .oe_kanban_group_folded .oe_dropdown_kanban { + left: -5px; +} .openerp .oe_kanban_view .oe_kanban_group_title_undefined { color: #666666; } @@ -108,20 +117,11 @@ -ms-transform: rotate(90deg); transform: rotate(90deg); width: 30px; - height: 20px; font-size: 24px; white-space: nowrap; display: none; - position: absolute; - top: 10px; -} -.openerp .oe_kanban_view .oe_kanban_fold_icon { - cursor: pointer; - float: left; - padding: 2px; - width: 16px; - height: 16px; - background: url(/web_kanban/static/src/img/minus-icon.png) no-repeat; + position: relative; + top: 5px; } .openerp .oe_kanban_view .oe_kanban_add, .openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_toggle { margin-left: 4px; @@ -466,13 +466,10 @@ top: 28px; min-width: 160px; } -.openerp .oe_kanban_view .oe_kanban_header .oe_dropdown_kanban { - display: none; -} -.openerp .oe_kanban_view .oe_kanban_column .oe_dropdown_kanban.oe_opened > span { +.openerp .oe_kanban_view .oe_dropdown_kanban.oe_opened > span { visibility: visible; } -.openerp .oe_kanban_view .oe_kanban_column .oe_dropdown_kanban > span { +.openerp .oe_kanban_view .oe_dropdown_kanban > span { visibility: hidden; } .openerp .oe_kanban_view .oe_kanban_colorpicker { diff --git a/addons/web_kanban/static/src/css/kanban.sass b/addons/web_kanban/static/src/css/kanban.sass index c1a8f48645d..69a4f1d2c97 100644 --- a/addons/web_kanban/static/src/css/kanban.sass +++ b/addons/web_kanban/static/src/css/kanban.sass @@ -66,12 +66,16 @@ height: inherit &.oe_kanban_ungrouped .oe_kanban_groups width: 100% - &.oe_kanban_sortable_groups .oe_kanban_group_title + &.oe_kanban_grouped_by_m2o .oe_kanban_group_title cursor: move .oe_kanban_header + .oe_dropdown_kanban + float: right + .oe_dropdown_kanban > span + visibility: hidden &:hover - .oe_dropdown_kanban - display: inline-block + .oe_dropdown_kanban > span + visibility: visible .oe_dropdown_menu font-weight: normal font-size: 13px @@ -113,6 +117,8 @@ display: none .oe_kanban_group_title_vertical display: block + .oe_dropdown_kanban + left: -5px .oe_kanban_group_title_undefined color: #666666 .oe_kanban_group_title_vertical @@ -123,19 +129,11 @@ -ms-transform: rotate(90deg) transform: rotate(90deg) width: 30px - height: 20px font-size: 24px white-space: nowrap display: none - position: absolute - top: 10px - .oe_kanban_fold_icon - cursor: pointer - float: left - padding: 2px - width: 16px - height: 16px - background: url(/web_kanban/static/src/img/minus-icon.png) no-repeat + position: relative + top: 5px // }}} // KanbanQuickCreate {{{ .oe_kanban_add, .oe_kanban_header .oe_dropdown_toggle @@ -390,15 +388,11 @@ left: 0 top: 28px min-width: 160px - .oe_kanban_header - .oe_dropdown_kanban - display: none - .oe_kanban_column - .oe_dropdown_kanban - &.oe_opened > span - visibility: visible - > span - visibility: hidden + .oe_dropdown_kanban + &.oe_opened > span + visibility: visible + > span + visibility: hidden // }}} // KanbanColorPicker {{{ .oe_kanban_colorpicker diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index dd8c2fbaef0..59825797f3b 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -191,7 +191,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ self.group_by_field = self.fields_view.fields[self.group_by] || {}; self.grouped_by_m2o = (self.group_by_field.type === 'many2one'); self.$buttons.find('.oe_alternative').toggle(self.grouped_by_m2o); - self.$element.toggleClass('oe_kanban_sortable_groups', self.grouped_by_m2o); + self.$element.toggleClass('oe_kanban_grouped_by_m2o', self.grouped_by_m2o); self.datagroup = new instance.web.DataGroup(self, self.dataset.model, domain, context, self.group_by ? [self.group_by] : []); self.datagroup.list(self.fields_keys, self.do_process_groups, self.do_process_dataset); }); @@ -349,7 +349,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var self = this; _.each(this.groups, function(group) { unfolded += group.state.folded ? 0 : 1; - group.$element.css('width', ''); + group.$element.children(':first').css('width', ''); }); _.each(this.groups, function(group) { if (!group.state.folded) { @@ -462,11 +462,14 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ } this.$records = $(QWeb.render('KanbanView.group_records_container', { widget : this})); this.$records.insertBefore(this.view.$element.find('.oe_kanban_groups_records td:last')); - this.$element.find(".oe_kanban_fold_icon").click(function() { - self.do_toggle_fold(); - self.view.compute_groups_width(); - return false; + + this.$element.on('click', '.oe_kanban_group_dropdown li a', function(ev) { + var fn = 'do_action_' + $(ev.target).data().action; + if (typeof(self[fn]) === 'function') { + self[fn]($(ev.target)); + } }); + this.$element.find('.oe_kanban_add').click(function () { if (self.quick) { return; } var ctx = {}; @@ -493,8 +496,8 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.$records.click(function (ev) { if (ev.target == ev.currentTarget) { if (!self.state.folded) { - add_btn.effect('bounce', {distance: 18, times: 5}, 150) - } + add_btn.effect('bounce', {distance: 18, times: 5}, 150); + } } }); return def; @@ -553,6 +556,11 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ do_toggle_fold: function(compute_width) { this.$element.add(this.$records).toggleClass('oe_kanban_group_folded'); this.state.folded = this.$element.is('.oe_kanban_group_folded'); + this.$("ul.oe_kanban_group_dropdown li a[data-action=toggle_fold]").text((this.state.folded) ? _t("Unfold") : _t("Fold")); + }, + do_action_toggle_fold: function() { + this.do_toggle_fold(); + this.view.compute_groups_width(); }, do_save_sequences: function() { var self = this; diff --git a/addons/web_kanban/static/src/xml/web_kanban.xml b/addons/web_kanban/static/src/xml/web_kanban.xml index e1da07e3554..125a4eff3c9 100644 --- a/addons/web_kanban/static/src/xml/web_kanban.xml +++ b/addons/web_kanban/static/src/xml/web_kanban.xml @@ -32,18 +32,18 @@
]
+
+ í + +
() -
- í - -
    @@ -52,7 +52,7 @@
-

+
From 529a12921b726f0d701c155828ca069fe71b5507 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 13:58:35 +0200 Subject: [PATCH 07/11] [ADD] Kanban: group edit/delete bzr revid: fme@openerp.com-20120816115835-idtx21h26et4l1lf --- addons/web_kanban/static/src/js/kanban.js | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 51264a1dda2..190f28e01a7 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -562,6 +562,36 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.do_toggle_fold(); this.view.compute_groups_width(); }, + do_action_edit: function() { + var self = this; + self.do_action({ + res_id: this.group.value[0], + name: _t("Edit column"), + res_model: self.view.group_by_field.relation, + views: [[false, 'form']], + type: 'ir.actions.act_window', + target: "new", + flags: { + action_buttons: true, + } + }); + var am = instance.webclient.action_manager; + var form = am.dialog_widget.views.form.controller; + form.on_button_cancel.add_last(am.dialog.on_close); + form.on_saved.add_last(function() { + am.dialog.on_close(); + self.view.do_reload(); + }); + }, + do_action_delete: function() { + var self = this; + if (confirm(_t("Are you sure to remove this column ?"))) { + (new instance.web.DataSet(self, self.view.group_by_field.relation)).unlink([self.group.value[0]]).then(function(r) { + self.group.destroy(); + self.view.do_reload(); + }); + } + }, do_save_sequences: function() { var self = this; if (_.indexOf(this.view.fields_keys, 'sequence') > -1) { From 790b508312656b35fa45c879b6e81b58ff436fb4 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 14:02:15 +0200 Subject: [PATCH 08/11] [FIX] Fixed group title for fields not present in fields view get bzr revid: fme@openerp.com-20120816120215-owxw7756escw3zih --- addons/web_kanban/static/src/js/kanban.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 190f28e01a7..e47948a492a 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -423,7 +423,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.value = this.value[0]; } var field = this.view.group_by_field; - if (field) { + if (!_.isEmpty(field)) { try { this.title = instance.web.format_value(group.value, field, false); } catch(e) {} From 49fb611b6366afa531b952e115376fdea63838f6 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 15:43:07 +0200 Subject: [PATCH 09/11] [FIX] avoid group droping in dummy_cell bzr revid: fme@openerp.com-20120816134307-2160irpecvcmldfk --- addons/web_kanban/static/src/js/kanban.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index e47948a492a..a5ab3847124 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -288,6 +288,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var start_index; if (this.grouped_by_m2o) { this.$('.oe_kanban_groups_headers').sortable({ + items: '.oe_kanban_group_header', helper: 'clone', axis: 'x', opacity: 0.5, From 59583e432425e5cd2e7922b68817504bf7970c7c Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 15:50:23 +0200 Subject: [PATCH 10/11] [FIX] Do not show group's edit/delete menus when group has no value (eg: Undefined) bzr revid: fme@openerp.com-20120816135023-m5xnoo0fc3cxzadg --- addons/web_kanban/static/src/xml/web_kanban.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web_kanban/static/src/xml/web_kanban.xml b/addons/web_kanban/static/src/xml/web_kanban.xml index 125a4eff3c9..39bca51c1f5 100644 --- a/addons/web_kanban/static/src/xml/web_kanban.xml +++ b/addons/web_kanban/static/src/xml/web_kanban.xml @@ -36,8 +36,10 @@ í
From b859f629bfa28ca14d9ebedd06dcc274a79efe07 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 16 Aug 2012 17:21:43 +0200 Subject: [PATCH 11/11] [FIX] Fixed add column bzr revid: fme@openerp.com-20120816152143-55onjiawyw6b4kb1 --- addons/web_kanban/static/src/js/kanban.js | 27 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index a5ab3847124..8e6037a35de 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -175,9 +175,22 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var am = instance.webclient.action_manager; var form = am.dialog_widget.views.form.controller; form.on_button_cancel.add_last(am.dialog.on_close); - form.on_created.add_last(function() { - am.dialog.on_close(); - self.do_reload(); + form.on_created.add_last(function(r) { + (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r.result]).then(function(new_record) { + am.dialog.on_close(); + var domain = self.dataset.domain.slice(0); + domain.push([self.group_by, '=', new_record[0][0]]); + var dataset = new instance.web.DataSetSearch(self, self.dataset.model, self.dataset.get_context(), domain); + var datagroup = { + value: new_record[0], + length: 0, + aggregates: {}, + }; + var new_group = new instance.web_kanban.KanbanGroup(self, [], datagroup, dataset); + self.do_add_groups([new_group]).then(function() { + $(window).scrollTo(self.groups.slice(-1)[0].$element, { axis: 'x' }); + }); + }); }); }, do_search: function(domain, context, group_by) { @@ -254,7 +267,9 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ self.groups[group.undefined_title ? 'unshift' : 'push'](group); }); var groups_started = _.map(this.groups, function(group) { - return group.insertBefore(self.$element.find('.oe_kanban_groups_headers td:last')); + if (!group.is_started) { + return group.insertBefore(self.$element.find('.oe_kanban_groups_headers td:last')); + } }); return $.when.apply(null, groups_started).then(function () { self.on_groups_started(); @@ -501,6 +516,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ } } }); + this.is_started = true; return def; }, compute_cards_auto_height: function() { @@ -588,7 +604,6 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ var self = this; if (confirm(_t("Are you sure to remove this column ?"))) { (new instance.web.DataSet(self, self.view.group_by_field.relation)).unlink([self.group.value[0]]).then(function(r) { - self.group.destroy(); self.view.do_reload(); }); } @@ -813,7 +828,7 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ this.view.dataset.read_ids([this.id], this.view.fields_keys.concat(['__last_update'])).then(function(records) { if (records.length) { self.set_record(records[0]); - self.replaceElement($(self.render())); + self.renderElement(); self.$element.data('widget', self); self.bind_events(); self.group.compute_cards_auto_height();