From 2b46bc9925f09cec83f976b0dfde95e419916f1b Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 28 Jul 2011 15:21:52 +0530 Subject: [PATCH 001/119] [ADD] add basic directory structure of kanban view. bzr revid: ysa@tinyerp.com-20110728095152-l8g2zqqro2mkr7ne --- addons/base_kanban/__init__.py | 1 + addons/base_kanban/__openerp__.py | 10 ++++++++ addons/base_kanban/controllers/__init__.py | 1 + addons/base_kanban/controllers/main.py | 11 ++++++++ addons/base_kanban/static/src/js/kanban.js | 30 ++++++++++++++++++++++ 5 files changed, 53 insertions(+) create mode 100644 addons/base_kanban/__init__.py create mode 100644 addons/base_kanban/__openerp__.py create mode 100644 addons/base_kanban/controllers/__init__.py create mode 100644 addons/base_kanban/controllers/main.py create mode 100644 addons/base_kanban/static/src/js/kanban.js diff --git a/addons/base_kanban/__init__.py b/addons/base_kanban/__init__.py new file mode 100644 index 00000000000..355939a4922 --- /dev/null +++ b/addons/base_kanban/__init__.py @@ -0,0 +1 @@ +import controllers \ No newline at end of file diff --git a/addons/base_kanban/__openerp__.py b/addons/base_kanban/__openerp__.py new file mode 100644 index 00000000000..81f7228c1cb --- /dev/null +++ b/addons/base_kanban/__openerp__.py @@ -0,0 +1,10 @@ +{ + "name" : "Base Kanban", + "version" : "2.0", + "depends" : ["base"], + "js": [ + "static/src/js/kanban.js" + ], + "css": [], + 'active': True +} diff --git a/addons/base_kanban/controllers/__init__.py b/addons/base_kanban/controllers/__init__.py new file mode 100644 index 00000000000..039d9715fab --- /dev/null +++ b/addons/base_kanban/controllers/__init__.py @@ -0,0 +1 @@ +import main \ No newline at end of file diff --git a/addons/base_kanban/controllers/main.py b/addons/base_kanban/controllers/main.py new file mode 100644 index 00000000000..ba2ee948f34 --- /dev/null +++ b/addons/base_kanban/controllers/main.py @@ -0,0 +1,11 @@ +from base.controllers.main import View +import openerpweb + +class KanbanView(View): + _cp_path = "/base_kanban/kanbanview" + + @openerpweb.jsonrequest + def load(self, req, model, view_id): + fields_view = self.fields_view_get(req, model, view_id, 'kanban') + all_fields = req.session.model(model).fields_get() + return {'fields_view': fields_view, 'all_fields':all_fields} diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js new file mode 100644 index 00000000000..f10b0d45c37 --- /dev/null +++ b/addons/base_kanban/static/src/js/kanban.js @@ -0,0 +1,30 @@ +openerp.base_kanban = function (openerp) { +openerp.base.views.add('kanban', 'openerp.base_kanban.KanbanView'); +openerp.base_kanban.KanbanView = openerp.base.View.extend({ + + init: function(parent, element_id, dataset, view_id) { + this._super(parent, element_id); + this.view_manager = parent; + this.dataset = dataset; + this.model = this.dataset.model; + this.view_id = view_id; + }, + + start: function() { + this.rpc("/base_kanban/kanbanview/load", + {"model": this.model, "view_id": this.view_id}, this.on_loaded); + }, + + on_loaded: function(data) { + var template_xml = ''; + _.each(data.fields_view.arch.children, function(child) { + if (child.tag == "template"){ + template_xml = openerp.base.json_node_to_xml(child, true) + } + }); + console.log(":template_xml:::",template_xml); + }, +}); +}; + +// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: From bf57289f89185e2b1c8179b52287f193f2e8d42b Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 29 Jul 2011 14:34:30 +0530 Subject: [PATCH 002/119] [IMP] improve kanban view. simple display all records. bzr revid: ysa@tinyerp.com-20110729090430-ilaaxzpl0waes3a2 --- addons/base/static/src/js/views.js | 10 ++-- addons/base_kanban/__openerp__.py | 6 ++- addons/base_kanban/static/src/js/kanban.js | 56 +++++++++++++++++++++- 3 files changed, 65 insertions(+), 7 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 5e1d6be4f61..1bc0f896ee6 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -219,7 +219,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ }, /** * Event launched when a controller has been inited. - * + * * @param {String} view_type type of view * @param {String} view the inited controller */ @@ -525,7 +525,7 @@ openerp.base.View = openerp.base.Controller.extend({ * Directly set a view to use instead of calling fields_view_get. This method must * be called before start(). When an embedded view is set, underlying implementations * of openerp.base.View must use the provided view instead of any other one. - * + * * @param embedded_view A view. */ set_embedded_view: function(embedded_view) { @@ -541,7 +541,11 @@ openerp.base.views = new openerp.base.Registry(); openerp.base.json_node_to_xml = function(node, single_quote, indent) { // For debugging purpose, this function will convert a json node back to xml // Maybe usefull for xml view editor - if (typeof(node.tag) !== 'string' || !node.children instanceof Array || !node.attrs instanceof Object) { + + if (typeof(node) === 'string') { + return node; + } + else if (typeof(node.tag) !== 'string' || !node.children instanceof Array || !node.attrs instanceof Object) { throw("Node a json node"); } indent = indent || 0; diff --git a/addons/base_kanban/__openerp__.py b/addons/base_kanban/__openerp__.py index 81f7228c1cb..df1fe37564c 100644 --- a/addons/base_kanban/__openerp__.py +++ b/addons/base_kanban/__openerp__.py @@ -3,8 +3,10 @@ "version" : "2.0", "depends" : ["base"], "js": [ - "static/src/js/kanban.js" + "static/src/js/kanban.js" + ], + "css": [ + "static/src/css/kanban.css" ], - "css": [], 'active': True } diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index f10b0d45c37..72b47b4c99e 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -1,4 +1,5 @@ openerp.base_kanban = function (openerp) { +QWeb.add_template('/base_kanban/static/src/xml/base_kanban.xml'); openerp.base.views.add('kanban', 'openerp.base_kanban.KanbanView'); openerp.base_kanban.KanbanView = openerp.base.View.extend({ @@ -8,22 +9,73 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ this.dataset = dataset; this.model = this.dataset.model; this.view_id = view_id; + this.element_id = element_id; }, start: function() { this.rpc("/base_kanban/kanbanview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, - on_loaded: function(data) { + var self = this; var template_xml = ''; + _.each(data.fields_view.arch.children, function(child) { if (child.tag == "template"){ template_xml = openerp.base.json_node_to_xml(child, true) } }); - console.log(":template_xml:::",template_xml); + + if(template_xml){ + self.dataset.read_slice([], 0, false, function (records) { + self.on_show_data(records, template_xml); + }); + } }, + + on_show_data: function(records, template_xml) { + var self = this; + var new_qweb = new QWeb2.Engine(); + new_qweb.add_template('' + template_xml + '') + + self.$element.html(QWeb.render("KanbanBiew", {"records" :records})); + _.each(records, function(record) { + self.$element.find("#data_" + record.id).append(new_qweb.render('custom_template', record)); + }); + + this.$element.find(".column").sortable({ + connectWith: ".column" + }); + this.$element.find(".portlet").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") + .find(".portlet-header") + .addClass("ui-widget-header ui-corner-all") + .prepend( "") + .end() + .find( ".portlet-content" ); + + this.$element.find(".portlet-header .ui-icon").click(function() { + $(this).toggleClass("ui-icon-minusthick").toggleClass("ui-icon-plusthick"); + $(this).parents(".portlet:first").find(".portlet-content").toggle(); + }); + this.$element.find('.portlet .ui-icon-closethick').click(this.on_close_action); + this.$element.find(".column").disableSelection(); + this.$element.find(".ui.item").css("background-color","#c3dAf9"); + + //self.$element.find( ".column" ).css("width",column_width); + }, + + on_close_action: function(e) { + $(e.currentTarget).parents('.portlet:first').remove(); + }, + + do_show: function () { + this.$element.show(); + }, + + do_hide: function () { + this.$element.hide(); + }, + }); }; From a64d060b1afead17137155b3de1a8889e1bc27de Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 1 Aug 2011 15:45:28 +0530 Subject: [PATCH 003/119] [IMP] Impliment basic structure of kanban view. bzr revid: ysa@tinyerp.com-20110801101528-gcq9rf58hr7e2ejz --- addons/base_kanban/static/src/css/kanban.css | 40 +++++++++++ addons/base_kanban/static/src/js/kanban.js | 72 ++++++++++++++----- .../static/src/xml/base_kanban.xml | 21 ++++++ 3 files changed, 117 insertions(+), 16 deletions(-) create mode 100644 addons/base_kanban/static/src/css/kanban.css create mode 100644 addons/base_kanban/static/src/xml/base_kanban.xml diff --git a/addons/base_kanban/static/src/css/kanban.css b/addons/base_kanban/static/src/css/kanban.css new file mode 100644 index 00000000000..16f46f849a8 --- /dev/null +++ b/addons/base_kanban/static/src/css/kanban.css @@ -0,0 +1,40 @@ +.openerp .oe_column { + width: 100%; + float: left; + padding-bottom: 100px; +} + +.portlet { + width: 100%; + margin: 0 1em 1em 0; +} + +.portlet-header { + margin: 0.3em; + padding-bottom: 4px; + padding-left: 0.2em; +} + +.portlet-header .ui-icon { + float: right; +} + +.portlet-content { + padding: 0.4em; +} + +.ui-sortable-placeholder { + border: 1px dotted black; + visibility: visible !important; + height: 50px !important; +} + +.ui-sortable-placeholder * { + visibility: hidden; +} + +.openerp .oe_column_heading{ + color: #000000; + font-size: 1.5em; + font-weight: bold; +} diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index 72b47b4c99e..ee60d91be35 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -18,33 +18,33 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }, on_loaded: function(data) { var self = this; - var template_xml = ''; + this.template_xml = ''; _.each(data.fields_view.arch.children, function(child) { if (child.tag == "template"){ - template_xml = openerp.base.json_node_to_xml(child, true) + self.template_xml = openerp.base.json_node_to_xml(child, true) } }); - - if(template_xml){ + if(this.template_xml){ self.dataset.read_slice([], 0, false, function (records) { - self.on_show_data(records, template_xml); + self.on_show_data([{'records': records, 'value':false}]); }); } }, - on_show_data: function(records, template_xml) { + on_show_data: function(datas) { var self = this; var new_qweb = new QWeb2.Engine(); - new_qweb.add_template('' + template_xml + '') - - self.$element.html(QWeb.render("KanbanBiew", {"records" :records})); - _.each(records, function(record) { - self.$element.find("#data_" + record.id).append(new_qweb.render('custom_template', record)); + new_qweb.add_template('' + this.template_xml + '') + self.$element.html(QWeb.render("KanbanBiew", {"datas" :datas})); + _.each(datas, function(data) { + _.each(data.records, function(record) { + self.$element.find("#data_" + record.id).append(new_qweb.render('custom_template', record)); + }); }); - this.$element.find(".column").sortable({ - connectWith: ".column" + this.$element.find(".oe_column").sortable({ + connectWith: ".oe_column" }); this.$element.find(".portlet").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") .find(".portlet-header") @@ -58,16 +58,56 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ $(this).parents(".portlet:first").find(".portlet-content").toggle(); }); this.$element.find('.portlet .ui-icon-closethick').click(this.on_close_action); - this.$element.find(".column").disableSelection(); + this.$element.find(".oe_column").disableSelection(); this.$element.find(".ui.item").css("background-color","#c3dAf9"); - - //self.$element.find( ".column" ).css("width",column_width); + self.$element.find( ".oe_column" ).css("width", 99 / datas.length +"%"); }, on_close_action: function(e) { $(e.currentTarget).parents('.portlet:first').remove(); }, + do_search: function (domains, contexts, group_by) { + var self = this; + this.rpc('/base/session/eval_domain_and_context', { + domains: domains, + contexts: contexts, + group_by_seq: group_by + }, function (results) { + self.dataset.context = results.context; + self.dataset.domain = results.domain; + self.groups = new openerp.base.DataGroup( + self, self.model, results.domain, results.context, results.group_by); + self.groups.list([], + function (groups) { + self.do_render_group(groups); + }, + function (dataset) { + self.dataset.read_slice(false, false, false, function(records) { + self.on_show_data([{'records': records, 'value':false}]); + }); + }); + }); + }, + + do_render_group : function(datagroups){ + this.columns = []; + var self = this; + _.each(datagroups, function (group) { + self.dataset.context = group.context; + self.dataset.domain = group.domain; + if(!group.value) { + group.value = "Undefined" + } + self.dataset.read_slice(false, false, false, function(records) { + self.columns.push({"value" : group.value, "records": records}); + if (datagroups.length == self.columns.length) { + self.on_show_data(self.columns); + } + }); + }); + }, + do_show: function () { this.$element.show(); }, diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml new file mode 100644 index 00000000000..8a234ed6dae --- /dev/null +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -0,0 +1,21 @@ + \ No newline at end of file From 9bdcc4d37934601f91f4f96eeeae655f8e8f2c0c Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Mon, 1 Aug 2011 17:15:23 +0530 Subject: [PATCH 004/119] [IMP] Improve code. bzr revid: ysa@tinyerp.com-20110801114523-xk5jyx2iwn9ptj9n --- addons/base_kanban/static/src/css/kanban.css | 8 +++--- addons/base_kanban/static/src/js/kanban.js | 26 +++++++++++-------- .../static/src/xml/base_kanban.xml | 6 ++--- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/addons/base_kanban/static/src/css/kanban.css b/addons/base_kanban/static/src/css/kanban.css index 16f46f849a8..6e6a8bebcef 100644 --- a/addons/base_kanban/static/src/css/kanban.css +++ b/addons/base_kanban/static/src/css/kanban.css @@ -4,22 +4,22 @@ padding-bottom: 100px; } -.portlet { +.record { width: 100%; margin: 0 1em 1em 0; } -.portlet-header { +.record-header { margin: 0.3em; padding-bottom: 4px; padding-left: 0.2em; } -.portlet-header .ui-icon { +.record-header .ui-icon { float: right; } -.portlet-content { +.record-content { padding: 0.4em; } diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index ee60d91be35..e03d89c7cdf 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -46,25 +46,25 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ this.$element.find(".oe_column").sortable({ connectWith: ".oe_column" }); - this.$element.find(".portlet").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") - .find(".portlet-header") + this.$element.find(".record").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") + .find(".record-header") .addClass("ui-widget-header ui-corner-all") .prepend( "") .end() - .find( ".portlet-content" ); + .find( ".record-content" ); - this.$element.find(".portlet-header .ui-icon").click(function() { + this.$element.find(".record-header .ui-icon").click(function() { $(this).toggleClass("ui-icon-minusthick").toggleClass("ui-icon-plusthick"); - $(this).parents(".portlet:first").find(".portlet-content").toggle(); + $(this).parents(".record:first").find(".record-content").toggle(); }); - this.$element.find('.portlet .ui-icon-closethick').click(this.on_close_action); + this.$element.find('.record .ui-icon-closethick').click(this.on_close_action); this.$element.find(".oe_column").disableSelection(); - this.$element.find(".ui.item").css("background-color","#c3dAf9"); + this.$element.find(".ui.item").css("background-color","red"); self.$element.find( ".oe_column" ).css("width", 99 / datas.length +"%"); }, on_close_action: function(e) { - $(e.currentTarget).parents('.portlet:first').remove(); + $(e.currentTarget).parents('.record:first').remove(); }, do_search: function (domains, contexts, group_by) { @@ -96,11 +96,15 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ _.each(datagroups, function (group) { self.dataset.context = group.context; self.dataset.domain = group.domain; - if(!group.value) { - group.value = "Undefined" + var group_name = group.value; + if(!group_name) { + group_name = "Undefined" + } + else if(group_name instanceof Array) { + group_name = group_name[1] } self.dataset.read_slice(false, false, false, function(records) { - self.columns.push({"value" : group.value, "records": records}); + self.columns.push({"value" : group_name, "records": records}); if (datagroups.length == self.columns.length) { self.on_show_data(self.columns); } diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml index 8a234ed6dae..a552a93efa3 100644 --- a/addons/base_kanban/static/src/xml/base_kanban.xml +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -8,9 +8,9 @@
-
-
-
+
+
+
From efe8967203af580c69fa3cda873ed592ea993021 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 3 Aug 2011 10:55:08 +0530 Subject: [PATCH 005/119] [IMP] Improve header and css in kanban view. bzr revid: ysa@tinyerp.com-20110803052508-ru7wnpjhfgohxb9u --- addons/base_kanban/static/src/css/kanban.css | 12 +++--------- addons/base_kanban/static/src/js/kanban.js | 1 - addons/base_kanban/static/src/xml/base_kanban.xml | 4 ++-- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/addons/base_kanban/static/src/css/kanban.css b/addons/base_kanban/static/src/css/kanban.css index 6e6a8bebcef..d7344ee1e55 100644 --- a/addons/base_kanban/static/src/css/kanban.css +++ b/addons/base_kanban/static/src/css/kanban.css @@ -1,16 +1,14 @@ .openerp .oe_column { width: 100%; float: left; - padding-bottom: 100px; } .record { - width: 100%; - margin: 0 1em 1em 0; + margin: 0 0 0.5em 0; } .record-header { - margin: 0.3em; + margin: 0.05em; padding-bottom: 4px; padding-left: 0.2em; } @@ -19,10 +17,6 @@ float: right; } -.record-content { - padding: 0.4em; -} - .ui-sortable-placeholder { border: 1px dotted black; visibility: visible !important; @@ -33,7 +27,7 @@ visibility: hidden; } -.openerp .oe_column_heading{ +.openerp .oe_column_heading { color: #000000; font-size: 1.5em; font-weight: bold; diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index e03d89c7cdf..cc6fcfae79a 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -59,7 +59,6 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }); this.$element.find('.record .ui-icon-closethick').click(this.on_close_action); this.$element.find(".oe_column").disableSelection(); - this.$element.find(".ui.item").css("background-color","red"); self.$element.find( ".oe_column" ).css("width", 99 / datas.length +"%"); }, diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml index a552a93efa3..2c4fde2663c 100644 --- a/addons/base_kanban/static/src/xml/base_kanban.xml +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -5,11 +5,11 @@ -
+
()
-
+
From c17a58e199f2f26b40d157bf361899b1d570e390 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 3 Aug 2011 15:56:53 +0530 Subject: [PATCH 006/119] [IMP] change field value based on drag and drop record in kanban view. bzr revid: ysa@tinyerp.com-20110803102653-av8rt9fhcrgjlg4i --- addons/base_kanban/static/src/css/kanban.css | 2 +- addons/base_kanban/static/src/js/kanban.js | 52 +++++++++++++++---- .../static/src/xml/base_kanban.xml | 2 +- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/addons/base_kanban/static/src/css/kanban.css b/addons/base_kanban/static/src/css/kanban.css index d7344ee1e55..b557709dcf0 100644 --- a/addons/base_kanban/static/src/css/kanban.css +++ b/addons/base_kanban/static/src/css/kanban.css @@ -20,7 +20,7 @@ .ui-sortable-placeholder { border: 1px dotted black; visibility: visible !important; - height: 50px !important; + height: 60px !important; } .ui-sortable-placeholder * { diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index cc6fcfae79a..6a5d72ae32b 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -10,6 +10,10 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ this.model = this.dataset.model; this.view_id = view_id; this.element_id = element_id; + this.group_by_field = false; + this.domains = this.dataset.domain; + this.contexts = this.dataset.context; + this.group_by = false; }, start: function() { @@ -27,7 +31,7 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }); if(this.template_xml){ self.dataset.read_slice([], 0, false, function (records) { - self.on_show_data([{'records': records, 'value':false}]); + self.on_show_data([{'records': records, 'value':false, 'header': false}]); }); } }, @@ -42,9 +46,9 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ self.$element.find("#data_" + record.id).append(new_qweb.render('custom_template', record)); }); }); - this.$element.find(".oe_column").sortable({ - connectWith: ".oe_column" + connectWith: ".oe_column", + receive: self.on_recieve_record }); this.$element.find(".record").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") .find(".record-header") @@ -66,7 +70,26 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ $(e.currentTarget).parents('.record:first').remove(); }, + on_recieve_record: function(event, ui) { + if(ui.item.attr("id") && this.group_by_field) { + var value = this.$element.find("#" + ui.item.attr("id")).closest("td").attr("id") + if(value) { + var data_val = {}; + value = value.split("_")[1]; + if(value == 'false') { + value = false; + } + data_val[this.group_by_field] = value; + this.dataset.write(parseInt(ui.item.attr("id").split("_")[1]), data_val); + this.do_search(this.domains, this.contexts, this.group_by); + } + } + }, + do_search: function (domains, contexts, group_by) { + this.contexts = contexts; + this.domains = domains; + this.group_by = group_by; var self = this; this.rpc('/base/session/eval_domain_and_context', { domains: domains, @@ -79,13 +102,17 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ self, self.model, results.domain, results.context, results.group_by); self.groups.list([], function (groups) { - self.do_render_group(groups); + if (group_by.length >= 1) { + self.group_by_field = group_by[0].group_by + self.do_render_group(groups); + } }, function (dataset) { self.dataset.read_slice(false, false, false, function(records) { - self.on_show_data([{'records': records, 'value':false}]); + self.on_show_data([{'records': records, 'value':false, 'header' : false}]); }); - }); + } + ); }); }, @@ -96,14 +123,17 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ self.dataset.context = group.context; self.dataset.domain = group.domain; var group_name = group.value; - if(!group_name) { - group_name = "Undefined" + var group_value = group.value; + if(!group.value) { + group_name = "Undefined"; + group_value = 'false'; } - else if(group_name instanceof Array) { - group_name = group_name[1] + else if(group.value instanceof Array) { + group_name = group.value[1] + group_value = group.value[0] } self.dataset.read_slice(false, false, false, function(records) { - self.columns.push({"value" : group_name, "records": records}); + self.columns.push({"value" : group_value, "records": records, 'header':group_name}); if (datagroups.length == self.columns.length) { self.on_show_data(self.columns); } diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml index 2c4fde2663c..8456add75d4 100644 --- a/addons/base_kanban/static/src/xml/base_kanban.xml +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -5,7 +5,7 @@ -
()
+
()
From 1304203349c4eef2700c42a73c1dcec1e6259703 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Wed, 3 Aug 2011 18:43:37 +0530 Subject: [PATCH 007/119] [IMP] Improve template. bzr revid: ysa@tinyerp.com-20110803131337-2yit2j7y9ekud4q7 --- addons/base_kanban/static/src/css/kanban.css | 1 - addons/base_kanban/static/src/js/kanban.js | 3 ++- addons/base_kanban/static/src/xml/base_kanban.xml | 10 ++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/addons/base_kanban/static/src/css/kanban.css b/addons/base_kanban/static/src/css/kanban.css index b557709dcf0..d194ce62ff1 100644 --- a/addons/base_kanban/static/src/css/kanban.css +++ b/addons/base_kanban/static/src/css/kanban.css @@ -1,5 +1,4 @@ .openerp .oe_column { - width: 100%; float: left; } diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index 6a5d72ae32b..9a9caeee713 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -63,7 +63,8 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }); this.$element.find('.record .ui-icon-closethick').click(this.on_close_action); this.$element.find(".oe_column").disableSelection(); - self.$element.find( ".oe_column" ).css("width", 99 / datas.length +"%"); + this.$element.find( ".oe_column" ).css("width", 99 / datas.length +"%"); + }, on_close_action: function(e) { diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml index 8456add75d4..7947254f1de 100644 --- a/addons/base_kanban/static/src/xml/base_kanban.xml +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -3,10 +3,16 @@ - + + + + +
+ -
()
+ () +
From 75063083b964888176e4e9355a142ff833cfc618 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 4 Aug 2011 16:59:07 +0530 Subject: [PATCH 008/119] [IMP] Improve code. bzr revid: ysa@tinyerp.com-20110804112907-jqoldgypm3xi7k8t --- addons/base_kanban/static/src/css/kanban.css | 1 + addons/base_kanban/static/src/js/kanban.js | 7 +++---- .../base_kanban/static/src/xml/base_kanban.xml | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/addons/base_kanban/static/src/css/kanban.css b/addons/base_kanban/static/src/css/kanban.css index d194ce62ff1..7b8305a762e 100644 --- a/addons/base_kanban/static/src/css/kanban.css +++ b/addons/base_kanban/static/src/css/kanban.css @@ -1,5 +1,6 @@ .openerp .oe_column { float: left; + width: 100%; } .record { diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index 9a9caeee713..9e70a0d62a6 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -46,9 +46,10 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ self.$element.find("#data_" + record.id).append(new_qweb.render('custom_template', record)); }); }); + this.$element.find( ".oe_table_column " ).css("width", 99 / datas.length +"%"); this.$element.find(".oe_column").sortable({ connectWith: ".oe_column", - receive: self.on_recieve_record + stop: self.on_recieve_record, }); this.$element.find(".record").addClass("ui-widget ui-widget-content ui-helper-clearfix ui-corner-all") .find(".record-header") @@ -63,8 +64,6 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }); this.$element.find('.record .ui-icon-closethick').click(this.on_close_action); this.$element.find(".oe_column").disableSelection(); - this.$element.find( ".oe_column" ).css("width", 99 / datas.length +"%"); - }, on_close_action: function(e) { @@ -73,7 +72,7 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ on_recieve_record: function(event, ui) { if(ui.item.attr("id") && this.group_by_field) { - var value = this.$element.find("#" + ui.item.attr("id")).closest("td").attr("id") + var value = ui.item.closest("td").attr("id") if(value) { var data_val = {}; value = value.split("_")[1]; diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml index 7947254f1de..42caccc649b 100644 --- a/addons/base_kanban/static/src/xml/base_kanban.xml +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -3,7 +3,7 @@ - - From 9824b8a3f7d9e2b853f3a4bc2ddaaeb129d9034b Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 4 Aug 2011 18:57:51 +0530 Subject: [PATCH 009/119] [IMP] kanban view:- add drag and drop functionality. drag record and release that record then resequence record list. bzr revid: ysa@tinyerp.com-20110804132751-hugtndsbdpf12stx --- addons/base_kanban/static/src/js/kanban.js | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index 9e70a0d62a6..b0817550cd7 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -38,12 +38,14 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ on_show_data: function(datas) { var self = this; + this.all_records = []; var new_qweb = new QWeb2.Engine(); new_qweb.add_template('' + this.template_xml + '') self.$element.html(QWeb.render("KanbanBiew", {"datas" :datas})); _.each(datas, function(data) { _.each(data.records, function(record) { self.$element.find("#data_" + record.id).append(new_qweb.render('custom_template', record)); + self.all_records.push(record); }); }); this.$element.find( ".oe_table_column " ).css("width", 99 / datas.length +"%"); @@ -71,6 +73,30 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }, on_recieve_record: function(event, ui) { + var self = this; + var from = ui.item.index(), + to = ui.item.prev().index() || 0; + var child_record = ui.item.parent().children(); + child_record.splice(0, to); + + var data, sequence=0, index = to; + if(to >= 0) { + var record_id = parseInt(child_record.attr('id').split("_")[1]); + _.each(this.all_records, function(record){ + if(record_id == record.id && record.sequence) { + sequence = record.sequence; + } + }); + } + + _.each(child_record, function (child) { + var child_id = parseInt($(child).attr("id").split("_")[1]); + self.dataset.write(child_id, {sequence: sequence}); + sequence++; + + }); + this.do_search(this.domains, this.contexts, this.group_by); + if(ui.item.attr("id") && this.group_by_field) { var value = ui.item.closest("td").attr("id") if(value) { From 3eb38c4501f8293bc5114953775fc7c8ba58edbe Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Fri, 5 Aug 2011 14:02:30 +0530 Subject: [PATCH 010/119] [IMP] improve kanban view. resequence field on drag and drop record. bzr revid: ysa@tinyerp.com-20110805083230-c7rue7yxujlskwcf --- addons/base_kanban/static/src/js/kanban.js | 98 +++++++++++-------- .../static/src/xml/base_kanban.xml | 2 +- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index b0817550cd7..850604d6fcd 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -31,7 +31,7 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }); if(this.template_xml){ self.dataset.read_slice([], 0, false, function (records) { - self.on_show_data([{'records': records, 'value':false, 'header': false}]); + self.on_reload_kanban([{'records': records, 'value':false, 'header': false}]); }); } }, @@ -74,31 +74,33 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ on_recieve_record: function(event, ui) { var self = this; - var from = ui.item.index(), - to = ui.item.prev().index() || 0; + var from = ui.item.index(), to = ui.item.prev().index() || 0; var child_record = ui.item.parent().children(); + var data, sequence=1, index = to; + this.flag = false; child_record.splice(0, to); - - var data, sequence=0, index = to; - if(to >= 0) { - var record_id = parseInt(child_record.attr('id').split("_")[1]); - _.each(this.all_records, function(record){ - if(record_id == record.id && record.sequence) { - sequence = record.sequence; - } - }); + if(to >= 0 && child_record) { + var record_id = child_record.attr('id').split("_"); + if(record_id.length >= 2) { + _.each(this.all_records, function(record){ + if(parseInt(record_id[1]) == record.id && record.sequence) { + sequence = record.sequence; + } + }); + } } - _.each(child_record, function (child) { var child_id = parseInt($(child).attr("id").split("_")[1]); - self.dataset.write(child_id, {sequence: sequence}); - sequence++; - + if(child_id) { + self.dataset.write(child_id, {sequence: sequence}); + sequence++; + self.flag = true; + } }); - this.do_search(this.domains, this.contexts, this.group_by); - + console.log(":this.group_by_field:::",this.group_by_field); if(ui.item.attr("id") && this.group_by_field) { var value = ui.item.closest("td").attr("id") + console.log("value:::",value); if(value) { var data_val = {}; value = value.split("_")[1]; @@ -106,42 +108,58 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ value = false; } data_val[this.group_by_field] = value; + console.log("D:D:::::",data_val, parseInt(ui.item.attr("id").split("_")[1])); this.dataset.write(parseInt(ui.item.attr("id").split("_")[1]), data_val); - this.do_search(this.domains, this.contexts, this.group_by); + this.flag = true; } } + if(this.flag) { + this.do_actual_search(this.domains, this.contexts, this.group_by); + } + }, + + on_reload_kanban: function(datas){ + this.$element.find("#kanbanview").remove(); + this.on_show_data(datas); }, do_search: function (domains, contexts, group_by) { - this.contexts = contexts; - this.domains = domains; - this.group_by = group_by; var self = this; this.rpc('/base/session/eval_domain_and_context', { domains: domains, contexts: contexts, group_by_seq: group_by }, function (results) { - self.dataset.context = results.context; - self.dataset.domain = results.domain; - self.groups = new openerp.base.DataGroup( - self, self.model, results.domain, results.context, results.group_by); - self.groups.list([], - function (groups) { - if (group_by.length >= 1) { - self.group_by_field = group_by[0].group_by - self.do_render_group(groups); - } - }, - function (dataset) { - self.dataset.read_slice(false, false, false, function(records) { - self.on_show_data([{'records': records, 'value':false, 'header' : false}]); - }); - } - ); + self.contexts = results.context; + self.domains = results.domain; + self.group_by = results.group_by; + self.do_actual_search(results.domain, results.context, results.group_by); }); }, + do_actual_search: function (domain, context, group_by) { + var self = this; + + this.group_by_field = false; + + self.dataset.context = context; + self.dataset.domain = domain; + this.groups = new openerp.base.DataGroup(this, this.model, domain, context, group_by || []); + this.groups.list([], + function (groups) { + if (group_by.length >= 1) { + self.group_by_field = group_by[0]; + self.do_render_group(groups); + } + }, + function (dataset) { + self.dataset.read_slice(false, false, false, function(records) { + self.on_reload_kanban([{'records': records, 'value':false, 'header' : false}]); + }); + } + ); + + }, do_render_group : function(datagroups){ this.columns = []; var self = this; @@ -161,7 +179,7 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ self.dataset.read_slice(false, false, false, function(records) { self.columns.push({"value" : group_value, "records": records, 'header':group_name}); if (datagroups.length == self.columns.length) { - self.on_show_data(self.columns); + self.on_reload_kanban(self.columns); } }); }); diff --git a/addons/base_kanban/static/src/xml/base_kanban.xml b/addons/base_kanban/static/src/xml/base_kanban.xml index 42caccc649b..4b1ca3f44b4 100644 --- a/addons/base_kanban/static/src/xml/base_kanban.xml +++ b/addons/base_kanban/static/src/xml/base_kanban.xml @@ -1,6 +1,6 @@ \ No newline at end of file + From 0529820361555a87d3e2d6aed2b2a732220f72aa Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 1 Sep 2011 22:24:39 +0200 Subject: [PATCH 058/119] [IMP] Improved record handling + QWeb hook bzr revid: fme@openerp.com-20110901202439-friiek8yi1r0su20 --- addons/base_kanban/static/src/js/kanban.js | 23 ++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/addons/base_kanban/static/src/js/kanban.js b/addons/base_kanban/static/src/js/kanban.js index f4ec3201a03..365c7a9df15 100644 --- a/addons/base_kanban/static/src/js/kanban.js +++ b/addons/base_kanban/static/src/js/kanban.js @@ -17,6 +17,11 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ this.all_display_data = false; this.groups = []; this.qweb = new QWeb2.Engine(); + this.qweb.actions_precedence.push('field'); + this.qweb.compile_action_field = function(value) { + var val = this.node.attributes['name'].value + '.value'; + return this.compile_action_esc(val); + } }, start: function() { return this.rpc("/base_kanban/kanbanview/load", @@ -234,15 +239,11 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ }, on_reload_kanban: function (){ var self = this; - QWeb2.Element.prototype.compile_action_field = function(value) { - debugger; - this.top("r.push(context.engine.tools.html_escape(" + (this.format_expression(value)) + "));"); - }; _.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', record)); + self.$element.find("#main_" + record.id).append(self.qweb.render('kanban-box', self.do_process_record(record))); }); } else { self.$element.find("#column_" + data.value).remove(); @@ -265,7 +266,17 @@ openerp.base_kanban.KanbanView = openerp.base.View.extend({ } }); }, - + do_process_record: function(record) { + var self = this, + new_record = {}; + _.each(record, function(value, name) { + var r = _.clone(self.fields_view.fields[name]); + r.raw_value = value; + r.value = openerp.base.format_value(value, r); + new_record[name] = r; + }); + return new_record; + }, do_search: function (domains, contexts, group_by) { var self = this; this.rpc('/base/session/eval_domain_and_context', { From 49fbb546695a6e3635446a4bc495af9600fdbde4 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Fri, 2 Sep 2011 15:06:11 +0530 Subject: [PATCH 059/119] [Fix] attached events on node dir.code improvement. bzr revid: vda@tinyerp.com-20110902093611-6cxqhgewtbox45qd --- addons/base_diagram/__openerp__.py | 1 + addons/base_diagram/controllers/main.py | 18 +- .../static/src/css/base_diagram.css | 4 - addons/base_diagram/static/src/js/diagram.js | 282 ++++++------------ 4 files changed, 102 insertions(+), 203 deletions(-) diff --git a/addons/base_diagram/__openerp__.py b/addons/base_diagram/__openerp__.py index 0e449206228..d976b0df7a8 100644 --- a/addons/base_diagram/__openerp__.py +++ b/addons/base_diagram/__openerp__.py @@ -6,6 +6,7 @@ 'static/lib/js/raphael-min.js', 'static/lib/js/dracula_graffle.js', 'static/lib/js/dracula_graph.js', + 'static/lib/js/dracula_algorithms.js', 'static/src/js/diagram.js' ], 'css' : [ diff --git a/addons/base_diagram/controllers/main.py b/addons/base_diagram/controllers/main.py index b4ef9bb49c2..f9175ea1b78 100644 --- a/addons/base_diagram/controllers/main.py +++ b/addons/base_diagram/controllers/main.py @@ -8,22 +8,10 @@ class DiagramView(View): def load(self, req, model, view_id): fields_view = self.fields_view_get(req, model, view_id, 'diagram') return {'fields_view': fields_view} - - @openerpweb.jsonrequest - def get_activity(self, req, id, name, kind, active_model, model): - - activity_id = req.session.model(model).search([('name','=',name),('kind','=',kind),('wkf_id','=',active_model)], 0, 0, 0, req.session.context) - ids = req.session.model(model).search([], 0, 0, 0, req.session.context) - return {'activity_id':activity_id, 'ids': ids} @openerpweb.jsonrequest - def get_diagram_info(self, req, **kw): - id = kw['id'] - model = kw['model'] - node = kw['node'] - connector = kw['connector'] - src_node = kw['src_node'] - des_node = kw['des_node'] + def get_diagram_info(self, req, id, model, node, connector, src_node, des_node, **kw): + visible_node_fields = kw.get('visible_node_fields',[]) invisible_node_fields = kw.get('invisible_node_fields',[]) node_fields_string = kw.get('node_fields_string',[]) @@ -127,4 +115,4 @@ class DiagramView(View): out_transition_field = fields.read(out_transition_field_id[0], ['name'], req.session.context)['name'] id_model = req.session.model(model).read([id],['name'], req.session.context)[0]['name'] - return dict(nodes=nodes, conn=connectors, in_transition_field=in_transition_field, out_transition_field=out_transition_field, id_model = id_model) + return dict(nodes=nodes, conn=connectors, id_model = id_model) diff --git a/addons/base_diagram/static/src/css/base_diagram.css b/addons/base_diagram/static/src/css/base_diagram.css index 70b575e6e47..348926d0ba9 100644 --- a/addons/base_diagram/static/src/css/base_diagram.css +++ b/addons/base_diagram/static/src/css/base_diagram.css @@ -16,7 +16,3 @@ .openerp .oe_diagram_buttons { float: left; } - -.openerp .diagram path { - cursor: pointer; -} diff --git a/addons/base_diagram/static/src/js/diagram.js b/addons/base_diagram/static/src/js/diagram.js index bc57bf24cac..22fcbd9269f 100644 --- a/addons/base_diagram/static/src/js/diagram.js +++ b/addons/base_diagram/static/src/js/diagram.js @@ -6,6 +6,7 @@ openerp.base_diagram = function (openerp) { QWeb.add_template('/base_diagram/static/src/xml/base_diagram.xml'); openerp.base.views.add('diagram', 'openerp.base_diagram.DiagramView'); openerp.base_diagram.DiagramView = openerp.base.View.extend({ + searchable: false, init: function(parent, element_id, dataset, view_id, options) { this._super(parent, element_id); this.set_default_options(options); @@ -13,7 +14,6 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ this.dataset = dataset; this.model = this.dataset.model; this.view_id = view_id; - this.name = ""; this.domain = this.dataset._domain || []; this.context = {}; this.ids = this.dataset.ids; @@ -21,7 +21,7 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ start: function() { return this.rpc("/base_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, - + toTitleCase: function(str) { return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); }, @@ -32,69 +32,15 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ if(this.ids && this.ids.length) { this.id = this.ids[self.dataset.index || 0]; } - this.fields_view = result.fields_view; - - this.view_id = this.fields_view.view_id; - this.name = this.fields_view.name; - - this.fields = this.fields_view.fields; - var children = this.fields_view.arch.children; - - /* - * For Nodes (Fields) - */ - this.node = ''; - this.bgcolor = ''; - this.shape = ''; - this.visible_fields_nodes = []; - this.invisible_fields_nodes = []; - this.fields_nodes_string = []; - - /* - * For Arrows (Connector) - */ - this.connector = ''; - this.src_node = ''; - this.des_node = ''; - this.connector_fields = []; - this.fields_connector_string = []; - - for(var ch in children) { - if(children[ch]['tag'] == 'node') { - this.node = children[ch]['attrs']['object']; - this.bgcolor = children[ch]['attrs']['bgcolor'] || ''; - this.shape = children[ch]['attrs']['shape'] || ''; - for(var node_chld in children[ch]['children']) { - if (children[ch]['children'][node_chld]['tag'] = 'field') { - var ch_name = children[ch]['children'][node_chld]['attrs']['name']; - - if (children[ch]['children'][node_chld]['attrs']['invisible']) { - if (children[ch]['children'][node_chld]['attrs']['invisible'] == 1 && children[ch]['children'][node_chld]['attrs']['invisible'] == '1') { - this.invisible_fields_nodes.push(ch_name) - } - } - else { - this.visible_fields_nodes.push(ch_name); - var ch_node_string = this.fields[ch_name]['string'] || this.toTitleCase(ch_name); - this.fields_nodes_string.push(ch_node_string) - } - } - } - } else if(children[ch]['tag'] == 'arrow') { - this.connector = children[ch]['attrs']['object']; - this.src_node = children[ch]['attrs']['source']; - this.des_node = children[ch]['attrs']['destination']; - for (var arrow_chld in children[ch]['children']) { - if (children[ch]['children'][arrow_chld]['tag'] = 'field') { - var arr_ch_name = children[ch]['children'][arrow_chld]['attrs']['name']; - var ch_node_string = this.fields[arr_ch_name]['string'] || this.toTitleCase(arr_ch_name); - this.fields_connector_string.push(ch_node_string); - this.connector_fields.push(arr_ch_name); - } - } - } - } - + + this.fields_view = result.fields_view, + this.view_id = this.fields_view.view_id, + this.fields = this.fields_view.fields, + this.nodes = this.fields_view.arch.children[0], + this.connectors = this.fields_view.arch.children[1], + this.node = this.nodes.attrs.object, + this.connector = this.connectors.attrs.object; + this.$element.html(QWeb.render("DiagramView", this)); this.$element.find('div.oe_diagram_pager button[data-pager-action]').click(function() { @@ -105,37 +51,53 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ this.do_update_pager(); // New Node,Edge - this.$element.find('#new_node.oe_diagram_button_new').click(function(){self.add_edit_node(null, self.node)}); - this.$element.find('#new_edge.oe_diagram_button_new').click(function(){self.add_edit_node(null, self.connector)}); + this.$element.find('#new_node.oe_diagram_button_new').click(function(){self.add_edit_node(null, self.node);}); + this.$element.find('#new_edge.oe_diagram_button_new').click(function(){self.add_edit_node(null, self.connector);}); this.$element.find('#toggle_grid').click(function() { - self.$element.find('.diagram').toggleClass('show_grid') + self.$element.find('.diagram').toggleClass('show_grid'); }); - + if(this.id) { self.get_diagram_info(); } + }, get_diagram_info: function() { var self = this; + var params = { + 'id': this.id, + 'model': this.model, + 'node': this.node, + 'connector': this.connector, + 'bgcolor': this.nodes.attrs.bgcolor, + 'shape': this.nodes.attrs.shape, + 'src_node': this.connectors.attrs.source, + 'des_node': this.connectors.attrs.destination, + 'visible_nodes': [], + 'invisible_nodes': [], + 'node_fields': [], + 'connectors': [], + 'connectors_fields': [] + }; + + _.each(this.nodes.children, function(child) { + if(child.attrs.invisible) + params['invisible_nodes'].push(child.attrs.name); + else { + params['visible_nodes'].push(child.attrs.name); + params['node_fields'].push(self.fields[child.attrs.name]['string']|| this.toTitleCase(child.attrs.name)); + } + }); + + _.each(this.connectors.children, function(conn) { + params['connectors_fields'].push(self.fields[conn.attrs.name]['string']|| this.toTitleCase(conn.attrs.name)); + params['connectors'].push(conn.attrs.name); + }); + this.rpc( - '/base_diagram/diagram/get_diagram_info', - { - 'id': this.id, - 'model': this.model, - 'bgcolor': this.bgcolor, - 'shape': this.shape, - 'node': this.node, - 'connector': this.connector, - 'src_node': this.src_node, - 'des_node': this.des_node, - 'visible_node_fields': this.visible_fields_nodes, - 'invisible_node_fields': this.invisible_fields_nodes, - 'node_fields_string': this.fields_nodes_string, - 'connector_fields': this.connector_fields, - 'connector_fields_string': this.fields_connector_string - }, + '/base_diagram/diagram/get_diagram_info',params, function(result) { self.draw_diagram(result); } @@ -151,11 +113,10 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ }, draw_diagram: function(result) { - var dia = new Graph(); + var diagram = new Graph(); this.active_model = result['id_model']; - this.in_transition_field = result['in_transition_field']; - this.out_transition_field = result['out_transition_field']; + var res_nodes = result['nodes']; var res_connectors = result['conn']; @@ -164,89 +125,60 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ var renderer = function(r, n) { var node; var set; - - // ellipse - if (n.node.shape == 'ellipse') { - node = r.ellipse(n.node.x - 30, n.node.y - 13, 40, 20).attr({ - "fill": n.node.color, - r: "12px", - "stroke-width": n.distance == 0 ? "3px" : "1px" - }); - - set = r.set().push(node).push(r.text(n.node.x - 30, n.node.y - 10, (n.label || n.id))); - } - - // rectangle - else if(n.node.shape == 'rectangle') { - node = r.rect(n.node.x-30, n.node.y-13, 60, 44).attr({ - "fill": n.node.color, - r : "12px", - "stroke-width" : n.distance == 0 ? "3px" : "1px" - }); - set = r.set().push(node).push(r.text(n.node.x , n.node.y+10 , (n.label || n.id))); - } - - // circle - else { - node = r.circle(n.node.x, n.node.y, 150).attr({ - "fill": n.node.color, - r : "30px", - "stroke-width" : n.distance == 0 ? "3px" : "1px" - }); - set = r.set().push(node).push(r.text(n.node.x , n.node.y , (n.label || n.id))); - } - - //Shape Node Event - jQuery(node.node).attr({ - 'id': n.node.id, - 'name': n.id, - 'kind': n.node.options['Kind'] || n.node.options['kind'] - }).dblclick(function() { - var $this = jQuery(this); - self.add_edit_node($this.attr('id'), self.node); - }); - - //Text Node Event - jQuery(node.next.node).attr({ - 'id': n.node.id, - 'name': n.id, - 'kind': n.node.options['Kind'] || n.node.options['kind'] - }).dblclick(function() { - var $this = jQuery(this); - self.add_edit_node($this.attr('id'), self.node); - }); - return set; + var shape = n.node.shape; + if(shape == 'rectangle') + shape = 'rect'; + node = r[shape](n.node.x, n.node.y).attr({ + "fill": n.node.color, + }).dblclick(function() { + self.add_edit_node(n.node.id, self.node); + }); + set = r.set() + .push(node) + .push( + r.text(n.node.x, n.node.y, (n.label || n.id)) + .attr({"cursor":"pointer"}) + .dblclick(function() { + self.add_edit_node(n.node.id, self.node); + }) + ); + node.attr({cursor: "pointer"}); + + if(shape == "ellipse") + node.attr({rx: "40", ry: "20"}); + else if(shape == 'rect') { + node.attr({width: "60", height: "44"}); + node.next.attr({"text-anchor": "middle", x: n.node.x + 20, y: n.node.y + 20}); + } + return set; }; - - for(var node in res_nodes) { - var res_node = res_nodes[node]; - dia.addNode(res_node['name'],{node: res_node,render: renderer}); - } - - // Set Ides for Path(Edges) - var edge_ids = []; - - $.each(res_connectors, function(index, connector) { - edge_ids.push(index); - dia.addEdge(connector['source'], connector['destination'], {directed : true, label: connector['signal']}); + + _.each(res_nodes, function(res_node) { + diagram.addNode(res_node['name'],{node: res_node,render: renderer}); }); - var layouter = new Graph.Layout.Spring(dia); - layouter.layout(); + // Id for Path(Edges) + var edge_ids = []; + + _.each(res_connectors, function(connector, index) { + edge_ids.push(index); + diagram.addEdge(connector['source'], connector['destination'], {directed : true, label: connector['signal']}); + }); + + if ($('div#dia-canvas').children().length > 0) { $('div#dia-canvas').children().remove(); } - var renderer = new Graph.Renderer.Raphael('dia-canvas', dia, $('div#dia-canvas').width(), $('div#dia-canvas').height()); - renderer.draw(); - - //Path(Edges) - $.each(dia.edges, function(index, edge) { - if(edge.connection) - edge.connection.fg.node.id = edge_ids[index]; - }); - - jQuery('path',renderer.r.canvas).dblclick(function() { - self.add_edit_node(this.id, self.connector) + + var layouter = new Graph.Layout.Ordered(diagram, topological_sort(diagram)); + var render_diagram = new Graph.Renderer.Raphael('dia-canvas', diagram, $('div#dia-canvas').width(), $('div#dia-canvas').height()); + + _.each(diagram.edges, function(edge, index) { + if(edge.connection) { + edge.connection.fg.attr({cursor: "pointer"}).dblclick(function() { + self.add_edit_node(edge_ids[index], self.connector); + }); + } }); }, @@ -266,12 +198,10 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ $(this).dialog('destroy'); }, Save : function() { - var form_dataset = action_manager.inner_viewmanager.dataset; var form_view = action_manager.inner_viewmanager.views.form.controller; form_view.do_save(function() { - self.dataset.index = jQuery.inArray(parseInt(self.id,10), self.dataset.ids); - self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded) + self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded); }); $(this).dialog('destroy'); } @@ -323,22 +253,6 @@ openerp.base_diagram.DiagramView = openerp.base.View.extend({ } }, - do_search: function(domains, contexts, groupbys) { - var self = this; - this.rpc('/base/session/eval_domain_and_context', { - domains: domains, - contexts: contexts, - group_by_seq: groupbys - }, function (results) { - // TODO: handle non-empty results.group_by with read_group - self.dataset.context = self.context = results.context; - self.dataset.domain = self.domain = results.domain; - self.dataset.read_slice(self.fields, 0, self.limit,function(events){ - self.schedule_events(events) - }); - }); - }, - on_pager_action: function(action) { switch (action) { case 'first': From b2a55b0531edb934eefdb570d27dc7b141327778 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 2 Sep 2011 11:46:26 +0200 Subject: [PATCH 060/119] [imp] now remembers the password in debug mode bzr revid: nicolas.vanhoren@openerp.com-20110902094626-lwgk6ovdjsgz15lc --- addons/web/static/src/js/chrome.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index fb4104770f5..f0a981b1e6b 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -438,9 +438,9 @@ openerp.web.Login = openerp.web.Widget.extend({ if (this.has_local_storage && this.remember_creditentials) { this.selected_db = localStorage.getItem('last_db_login_success'); this.selected_login = localStorage.getItem('last_login_login_success'); - } - if (jQuery.deparam(jQuery.param.querystring()).debug != undefined) { - this.selected_password = this.selected_password || "a"; + if (jQuery.deparam(jQuery.param.querystring()).debug != undefined) { + this.selected_password = localStorage.getItem('last_password_login_success'); + } } }, start: function() { @@ -495,9 +495,13 @@ openerp.web.Login = openerp.web.Widget.extend({ if(self.remember_creditentials) { localStorage.setItem('last_db_login_success', db); localStorage.setItem('last_login_login_success', login); + if (jQuery.deparam(jQuery.param.querystring()).debug != undefined) { + localStorage.setItem('last_password_login_success', password); + } } else { localStorage.setItem('last_db_login_success', ''); localStorage.setItem('last_login_login_success', ''); + localStorage.setItem('last_password_login_success', ''); } } self.on_login_valid(); From a20d5479b1dca5479223d2a10d08bc0ef131a528 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 2 Sep 2011 14:57:01 +0200 Subject: [PATCH 061/119] [imp] cleaned ie7 css bzr revid: nicolas.vanhoren@openerp.com-20110902125701-qkr1a8j5r4m6lc2r --- addons/web/controllers/main.py | 3 --- addons/web/static/src/css/base-ie7.css | 4 ---- 2 files changed, 7 deletions(-) delete mode 100644 addons/web/static/src/css/base-ie7.css diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index cf5bd2c0f46..5fdbb546028 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -100,9 +100,6 @@ home_template = textwrap.dedent(""" OpenERP %(css)s - %(javascript)s - + @@ -27,6 +27,7 @@ """ data = ufile.file.read() - args = [size, ufile.filename, ufile.headers.getheader('Content-Type'), base64.encodestring(data)] + args = [size, ufile.filename, ufile.headers.getheader('Content-Type'), base64.b64encode(data)] except Exception, e: args = [False, e.message] return out % (simplejson.dumps(callback), simplejson.dumps(args)) From 6d029a49101b289168b3197e1386ff181161151b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:12:26 +0200 Subject: [PATCH 102/119] [IMP] restrict set of exceptions caught when fetching images bzr revid: xmo@openerp.com-20110906111226-hx4zh9rjr2fj5sct --- addons/web/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 7f93fed5ac2..abd9f963041 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -980,7 +980,7 @@ class Binary(openerpweb.Controller): else: res = Model.read([int(id)], [field], context)[0].get(field, '') image_data = base64.b64decode(res) - except: # TODO: what's the exception here? + except (TypeError, xmlrpclib.Fault): image_data = self.placeholder(req) return req.make_response(image_data, [ ('Content-Type', 'image/png'), ('Content-Length', len(image_data))]) From 6452b377aab7c16ea042a5c3493f720c897e7d87 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:27:34 +0200 Subject: [PATCH 103/119] [FIX] nope, base64 has not been renamed web64 bzr revid: xmo@openerp.com-20110906112734-obksfkt2d51kvt6b --- addons/web/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index abd9f963041..6ca5a4f0e35 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1043,7 +1043,7 @@ class Binary(openerpweb.Controller): """ attachment_id = Model.create({ 'name': ufile.filename, - 'datas': web64.encodestring(ufile.file.read()), + 'datas': base64.encodestring(ufile.file.read()), 'res_model': model, 'res_id': int(id) }, context) From ad435f72493fa527f352e1a1f8bb2992d13be557 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:49:21 +0200 Subject: [PATCH 104/119] [FIX] really, base64 has *not* been renamed web64, I swear bzr revid: xmo@openerp.com-20110906114921-q9c13srpjnjouu90 --- addons/web/static/src/js/form.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 7ed149305c0..1ad74b90900 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -2341,7 +2341,7 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({ toggle_progress: function() { this.$element.find('.oe-binary-progress, .oe-binary').toggle(); }, - on_file_uploaded: function(size, name, content_type, file_web64) { + on_file_uploaded: function(size, name, content_type, file_base64) { delete(window[this.iframe]); if (size === false) { this.notification.warn("File Upload", "There was a problem while uploading your file"); @@ -2353,7 +2353,7 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({ } this.toggle_progress(); }, - on_file_uploaded_and_valid: function(size, name, content_type, file_web64) { + on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { }, on_save_as: function() { if (!this.view.datarecord.id) { @@ -2385,7 +2385,7 @@ openerp.web.form.FieldBinaryFile = openerp.web.form.FieldBinary.extend({ var show_value = (value != null && value !== false) ? value : ''; this.$element.find('input').eq(0).val(show_value); }, - on_file_uploaded_and_valid: function(size, name, content_type, file_web64) { + on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { this.value = file_base64; this.binary_value = true; var show_value = this.human_filesize(size); @@ -2429,7 +2429,7 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ this.set_image_maxwidth(); this._super.apply(this, arguments); }, - on_file_uploaded_and_valid: function(size, name, content_type, file_web64) { + on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { this.value = file_base64; this.binary_value = true; this.$image.attr('src', 'data:' + (content_type || 'image/png') + ';base64,' + file_base64); From 05513d924bb0f24fa7e40c0246b2cb570a227052 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:49:45 +0200 Subject: [PATCH 105/119] [IMP] add uploaded files to http handler params bzr revid: xmo@openerp.com-20110906114945-b1nn0rd34fnmwjvb --- addons/web/common/dispatch.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/web/common/dispatch.py b/addons/web/common/dispatch.py index e4ed31e9947..0f2b7fd2293 100644 --- a/addons/web/common/dispatch.py +++ b/addons/web/common/dispatch.py @@ -227,7 +227,10 @@ class HttpRequest(WebRequest): """ Regular GET/POST request """ def dispatch(self, controller, method): - self.init(dict(self.httprequest.args, **self.httprequest.form)) + params = dict(self.httprequest.args) + params.update(self.httprequest.form) + params.update(self.httprequest.files) + self.init(params) akw = {} for key, value in self.httprequest.args.iteritems(): if isinstance(value, basestring) and len(value) < 1024: From cd78e540a259f488873ea1e8fc30fca07d42d666 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:53:16 +0200 Subject: [PATCH 106/119] [FIX] binary uploading not correctly werkzeugified bzr revid: xmo@openerp.com-20110906115316-4kybkc2bowpvkhyn --- addons/web/controllers/main.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 6ca5a4f0e35..9e32569c322 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1004,7 +1004,7 @@ class Binary(openerpweb.Controller): ('Content-Disposition', 'attachment; filename=' + filename)]) @openerpweb.httprequest - def upload(self, req, callback, ufile=None): + def upload(self, req, callback, ufile): headers = {} for key, val in req.httprequest.headers.iteritems(): headers[key.lower()] = val @@ -1023,14 +1023,15 @@ class Binary(openerpweb.Controller): }); } """ - data = ufile.file.read() - args = [size, ufile.filename, ufile.headers.getheader('Content-Type'), base64.b64encode(data)] + data = ufile.read() + args = [ufile.content_length, ufile.filename, + ufile.content_type, base64.b64encode(data)] except Exception, e: args = [False, e.message] return out % (simplejson.dumps(callback), simplejson.dumps(args)) @openerpweb.httprequest - def upload_attachment(self, req, callback, model, id, ufile=None): + def upload_attachment(self, req, callback, model, id, ufile): context = req.session.eval_context(req.context) Model = req.session.model('ir.attachment') try: @@ -1043,7 +1044,7 @@ class Binary(openerpweb.Controller): """ attachment_id = Model.create({ 'name': ufile.filename, - 'datas': base64.encodestring(ufile.file.read()), + 'datas': base64.encodestring(ufile.read()), 'res_model': model, 'res_id': int(id) }, context) From 9b82be28f29b709186e013039f96f01c4877c054 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:55:07 +0200 Subject: [PATCH 107/119] [REM] now-unused code, after correctly using FileStorage data for uploaded file bzr revid: xmo@openerp.com-20110906115507-lo5qblaw4nod11vz --- addons/web/controllers/main.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 9e32569c322..b7c6ac0cfc9 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1005,10 +1005,6 @@ class Binary(openerpweb.Controller): @openerpweb.httprequest def upload(self, req, callback, ufile): - headers = {} - for key, val in req.httprequest.headers.iteritems(): - headers[key.lower()] = val - size = int(headers.get('content-length', 0)) # TODO: might be useful to have a configuration flag for max-length file uploads try: out = """
+ () @@ -12,13 +12,15 @@
- -
-
-
-
-
+
+
+ +
+
+
+
+
+