From 2b46bc9925f09cec83f976b0dfde95e419916f1b Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 28 Jul 2011 15:21:52 +0530 Subject: [PATCH 001/210] [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/210] [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/210] [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/210] [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/210] [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/210] [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/210] [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 f312876e947a1bf9eb0d85cbbb82d3a6bfb40a3a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 8 Sep 2011 16:05:54 +0200 Subject: [PATCH 164/210] [IMP] Avoid browsers cache problem with autoloaded addons in debug mode (part 2) bzr revid: fme@openerp.com-20110908140554-h1ya4l9lctwk2hvm --- addons/web/static/src/js/core.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index da2afae3680..ecf65152e55 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -578,7 +578,7 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web do_load_css: function (files) { _.each(files, function (file) { $('head').append($('', { - 'href': file, + 'href': file + (this.debug ? '?debug=' + (new Date().getTime()) : ''), 'rel': 'stylesheet', 'type': 'text/css' })); @@ -590,7 +590,7 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web var file = files.shift(); var tag = document.createElement('script'); tag.type = 'text/javascript'; - tag.src = file; + tag.src = file + (this.debug ? '?debug=' + (new Date().getTime()) : ''); tag.onload = tag.onreadystatechange = function() { if ( (tag.readyState && tag.readyState != "loaded" && tag.readyState != "complete") || tag.onload_done ) return; From b555988b051b7c15530bd6db6b66a2d205a5a64a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 8 Sep 2011 17:50:07 +0200 Subject: [PATCH 165/210] [IMP] Improved kanban view. Added colors. bzr revid: fme@openerp.com-20110908155007-nwez2t97inc3148n --- addons/web_kanban/static/src/css/kanban.css | 131 +++++++++++++++++--- addons/web_kanban/static/src/js/kanban.js | 25 ++-- 2 files changed, 133 insertions(+), 23 deletions(-) diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index e3fac6dbafe..31f59a91d13 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -31,36 +31,43 @@ .openerp .oe_kanban_box_header { background: #EEE; border-bottom: 1px solid #CCC; - padding: 2px; - height: 2em; - white-space: nowrap; } -.openerp .oe_kanban_box_header h4 { +.openerp .oe_kanban_title1 { font-size: 130%; font-weight: bold; - margin: 0; - padding: 0; + padding: 0 4px 0 4px; } -.openerp .oe_kanban_box_header h5 { +.openerp .oe_kanban_title2 { font-size: 120%; font-weight: bold; - margin: 0; - padding: 2px; + padding: 0 4px 0 4px; } -.openerp .oe_kanban_box_header h6 { +.openerp .oe_kanban_title3 { font-size: 110%; font-weight: normal; - margin: 0; - padding: 2px; + padding: 0 4px 0 4px; } .openerp .oe_kanban_small { font-size: 80%; + font-weight: normal; +} +.openerp .oe_kanban_table { + width: 100%; + border: none; + border-collapse: collapse; + margin: 0; + padding: 0; +} +.openerp .oe_kanban_gravatar { + display: block; + border-radius: 2px; } .openerp .oe_kanban_box_content { padding: 4px; } .openerp .oe_kanban_buttons_set { border-top: 1px dotted #CCC; + white-space: nowrap; } .openerp .oe_kanban_buttons_set .oe_kanban_left a { border-right: 1px dotted #CCC; @@ -86,17 +93,109 @@ cursor: move; } -/* Custom colors */ +/* Custom colors are also present in kanban.js */ +/* Custom color#1 */ .openerp .oe_kanban_color_1 .oe_kanban_color_bglight, .openerp .oe_kanban_color_1.oe_kanban_color_bglight { - background: #F5F7C4; + background: #FFC7C7; } .openerp .oe_kanban_color_1 .oe_kanban_color_bgdark, .openerp .oe_kanban_color_1.oe_kanban_color_bgdark { - background: #EEF093; + background: #FF8F8F; } .openerp .oe_kanban_color_1 .oe_kanban_color_border, .openerp .oe_kanban_color_1.oe_kanban_color_border { - border-color: #DFE32D; + border-color: #D97979; +} + +/* Custom color#2 */ +.openerp .oe_kanban_color_2 .oe_kanban_color_bglight, +.openerp .oe_kanban_color_2.oe_kanban_color_bglight { + background: #FFF1C7; +} +.openerp .oe_kanban_color_2 .oe_kanban_color_bgdark, +.openerp .oe_kanban_color_2.oe_kanban_color_bgdark { + background: #FFE38F; +} +.openerp .oe_kanban_color_2 .oe_kanban_color_border, +.openerp .oe_kanban_color_2.oe_kanban_color_border { + border-color: #D9C179; +} + +/* Custom color#3 */ +.openerp .oe_kanban_color_3 .oe_kanban_color_bglight { + background: #E3FFC7; +} +.openerp .oe_kanban_color_3 .oe_kanban_color_bgdark { + background: #C7FF8F; +} +.openerp .oe_kanban_color_3 .oe_kanban_color_border { + border-color: #A9D979; +} + +/* Custom color#4 */ +.openerp .oe_kanban_color_4 .oe_kanban_color_bglight { + background: #C7FFD5; +} +.openerp .oe_kanban_color_4 .oe_kanban_color_bgdark { + background: #8FFFAB; +} +.openerp .oe_kanban_color_4 .oe_kanban_color_border { + border-color: #79D991; +} + +/* Custom color#5 */ +.openerp .oe_kanban_color_5 .oe_kanban_color_bglight { + background: #C7FFFF; +} +.openerp .oe_kanban_color_5 .oe_kanban_color_bgdark { + background: #8FFFFF; +} +.openerp .oe_kanban_color_5 .oe_kanban_color_border { + border-color: #79D9D9; +} + +/* Custom color#6 */ +.openerp .oe_kanban_color_6 .oe_kanban_color_bglight { + background: #C7D5FF; +} +.openerp .oe_kanban_color_6 .oe_kanban_color_bgdark { + background: #8FABFF; +} +.openerp .oe_kanban_color_6 .oe_kanban_color_border { + border-color: #8FABFF; +} + +/* Custom color#7 */ +.openerp .oe_kanban_color_7 .oe_kanban_color_bglight { + background: #E3C7FF; +} +.openerp .oe_kanban_color_7 .oe_kanban_color_bgdark { + background: #C78FFF; +} +.openerp .oe_kanban_color_7 .oe_kanban_color_border { + border-color: #A979D9; +} + +/* Custom color#8 */ +.openerp .oe_kanban_color_8 .oe_kanban_color_bglight { + background: #FFC7F1; +} +.openerp .oe_kanban_color_8 .oe_kanban_color_bgdark { + background: #FF8FE3; +} +.openerp .oe_kanban_color_8 .oe_kanban_color_border { + border-color: #D979C1; +} + +/* Alert color */ +.openerp .oe_kanban_color_alert .oe_kanban_color_bglight { + background: #C66; +} +.openerp .oe_kanban_color_alert .oe_kanban_color_bgdark { + background: #E99; +} +.openerp .oe_kanban_color_alert .oe_kanban_color_border { + border-color: #999; } diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index d6aff04e471..0253464d351 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -50,8 +50,8 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ } } }, - do_get_kanban_color: function(variable) { - var number_of_color_schemes = 2, + kanban_color: function(variable) { + var number_of_color_schemes = 8, index = 0; switch (typeof(variable)) { case 'string': @@ -67,11 +67,16 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ } return 'oe_kanban_color_' + ((index % number_of_color_schemes) + 1); }, + kanban_gravatar: function(email, size) { + size = size || 22; + var email_md5 = '2eb60ad22dadcf4dc456b28390a80268'; + return 'http://www.gravatar.com/avatar/' + email_md5 + '.png?s=' + size; + }, transform_qweb_template: function(node) { switch (node.tag) { case 'field': node.tag = 't'; - node.attrs['t-esc'] = node.attrs['name'] + '.value'; + node.attrs['t-esc'] = 'record.' + node.attrs['name'] + '.value'; break case 'button': case 'a': @@ -83,7 +88,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ }); if (node.attrs['data-states']) { var states = _.map(node.attrs['data-states'].split(','), function(state) { - return "state.value == '" + _.trim(state) + "'"; + return "record.state.value == '" + _.trim(state) + "'"; }); node.attrs['t-if'] = states.join(' or '); } @@ -174,6 +179,9 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ this.notification.warn("Kanban", "No form view defined for this object"); } }, + do_change_color: function(method) { + var color = '#FFC7C7,#FFF1C7,#E3FFC7,#C7FFD5,#C7FFFF,#C7D5FF,#FFC7F1'.split(','); + }, do_delete: function (id) { var self = this; return $.when(this.dataset.unlink([id])).then(function () { @@ -302,7 +310,11 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ if (data.records.length > 0){ _.each(data.records, function(record) { self.$element.find("#main_" + record.id).children().remove(); - self.$element.find("#main_" + record.id).append(self.qweb.render('kanban-box', self.do_transform_record(record))); + self.$element.find("#main_" + record.id).append(self.qweb.render('kanban-box', { + record: self.do_transform_record(record), + kanban_color: self.kanban_color, + kanban_gravatar: self.kanban_gravatar + })); }); } else { self.$element.find("#column_" + data.value).remove(); @@ -311,7 +323,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ }); this.$element.find('.oe_kanban_action').click(this.on_action_clicked); this.$element.find('.oe_kanban_record').click(function() { - $(this).find('.oe_kanban_box_show_onclick').removeClass('oe_kanban_box_show_onclick'); + $(this).find('.oe_kanban_box_show_onclick').toggle(); }); }, on_action_clicked: function(evt) { @@ -336,7 +348,6 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ r.value = openerp.web.format_value(value, r); new_record[name] = r; }); - new_record.__kanban_color = this.do_get_kanban_color; return new_record; }, do_search: function (domains, contexts, group_by) { From fb8588e3c5f7549a38f3014fbb43ea94fda61e1d Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 7 Sep 2011 16:31:55 +0200 Subject: [PATCH 166/210] [imp] added todo bzr revid: nicolas.vanhoren@openerp.com-20110907143155-66ceqs76hxzjvxtw --- addons/web/static/src/js/views.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index d94c697a2ee..9b2591d14d1 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -444,6 +444,7 @@ openerp.web.Sidebar = openerp.web.Widget.extend({ if (item.action) { var ids = self.widget_parent.get_selected_ids(); if (ids.length == 0) { + //TODO: make prettier warning? $("
").text(_t("You must choose at least one record.")).dialog({ title: _t("Warning"), modal: true From 17d1f78682a15504bf9342c7317f2f68e9608341 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 8 Sep 2011 11:53:27 +0200 Subject: [PATCH 167/210] [imp] updated datas in report bzr revid: nicolas.vanhoren@openerp.com-20110908095327-23inv0pjwljyktdl --- addons/web/controllers/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 647c6155018..ba86713db43 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1363,9 +1363,11 @@ class Reports(View): openerpweb.nonliterals.CompoundContext( req.context or {}, action[ "context"])) - report_data = {"id": context["active_id"], "model": context["active_model"]} + report_data = {} if 'report_type' in action: report_data['report_type'] = action['report_type'] + if 'datas' in action and 'form' in action['datas']: + report_data['form'] = action['datas']['form'] report_id = report_srv.report( req.session._db, req.session._uid, req.session._password, action["report_name"], context["active_ids"], From 4e0412f0c32947ef62860f848a8f252cd5139f33 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 8 Sep 2011 11:54:11 +0200 Subject: [PATCH 168/210] [imp] updated ids in report bzr revid: nicolas.vanhoren@openerp.com-20110908095411-eezf69hw64khlx91 --- addons/web/controllers/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index ba86713db43..5238185f091 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1368,9 +1368,10 @@ class Reports(View): report_data['report_type'] = action['report_type'] if 'datas' in action and 'form' in action['datas']: report_data['form'] = action['datas']['form'] + report_ids = context["active_ids"] report_id = report_srv.report( req.session._db, req.session._uid, req.session._password, - action["report_name"], context["active_ids"], + action["report_name"], report_ids, report_data, context) report_struct = None From cb009f218b7fc6bca057ac931f17fad3738090ee Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 8 Sep 2011 11:55:44 +0200 Subject: [PATCH 169/210] [imp] made ids in report overridable by report action bzr revid: nicolas.vanhoren@openerp.com-20110908095544-77pottqwvarnh2gq --- addons/web/controllers/main.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 5238185f091..922e3ec8e20 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1364,11 +1364,14 @@ class Reports(View): req.context or {}, action[ "context"])) report_data = {} + report_ids = context["active_ids"] if 'report_type' in action: report_data['report_type'] = action['report_type'] - if 'datas' in action and 'form' in action['datas']: - report_data['form'] = action['datas']['form'] - report_ids = context["active_ids"] + if 'datas' in action: + if 'form' in action['datas']: + report_data['form'] = action['datas']['form'] + if 'ids' in action['datas']: + report_ids = action['datas']['ids'] report_id = report_srv.report( req.session._db, req.session._uid, req.session._password, action["report_name"], report_ids, From e60032e11c335472d384921d62c288a84b1ca08a Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 8 Sep 2011 11:59:13 +0200 Subject: [PATCH 170/210] [imp] cosmetic change bzr revid: nicolas.vanhoren@openerp.com-20110908095913-pgpcd0flc57umgno --- addons/web/controllers/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 922e3ec8e20..415db15509d 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1372,6 +1372,7 @@ class Reports(View): report_data['form'] = action['datas']['form'] if 'ids' in action['datas']: report_ids = action['datas']['ids'] + report_id = report_srv.report( req.session._db, req.session._uid, req.session._password, action["report_name"], report_ids, From ee454617c7c27227d7c6fb02ecc622c5ec896dfa Mon Sep 17 00:00:00 2001 From: "Bhumi Thakkar (Open ERP)" Date: Thu, 8 Sep 2011 18:03:35 +0530 Subject: [PATCH 171/210] [IMP] Dynamically listview with theme. bzr revid: bth@tinyerp.com-20110908123335-mdd0o4hbq9c97wwm --- .../web_mobile/static/src/js/chrome_mobile.js | 60 +++++++++---------- .../web_mobile/static/src/js/list_mobile.js | 34 +++++++---- .../web_mobile/static/src/xml/web_mobile.xml | 10 ++-- 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/addons/web_mobile/static/src/js/chrome_mobile.js b/addons/web_mobile/static/src/js/chrome_mobile.js index caf4da7e9e6..2b9d8600fef 100644 --- a/addons/web_mobile/static/src/js/chrome_mobile.js +++ b/addons/web_mobile/static/src/js/chrome_mobile.js @@ -114,15 +114,6 @@ openerp.web_mobile.Shortcuts = openerp.web.Widget.extend({ this.rpc('/web/session/sc_list',{} ,function(res){ self.$element.html(QWeb.render("Shortcuts", {'sc' : res})) self.$element.find('#content').find("a").click(self.on_clicked); - self.$element.find("#header").find('#application').click(function(){ - if(!$('#oe_menu').html().length){ - this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); - this.menu.start(); - } - else{ - self.$element.find("#header").find('#application').attr('href','#oe_menu'); - } - }); self.$element.find("#footer").find('#preference').click(function(){ if(!$('#oe_options').html().length){ this.options = new openerp.web_mobile.Options(self, "oe_options"); @@ -195,10 +186,20 @@ openerp.web_mobile.Menu = openerp.web.Widget.extend({ .removeClass("login_valid") .addClass("secondary_menu"); //.hide(); -// this.header = new openerp.web_mobile.Header(this, "oe_header"); - this.secondary = new openerp.web_mobile.Secondary(this, "oe_sec_menu", this.children); -// this.header.start(); - this.secondary.start(); + if(!$('#oe_sec_menu').html().length){ + this.secondary = new openerp.web_mobile.Secondary(this, "oe_sec_menu", this.children); + this.secondary.start(); + }else{ + this.$element.find("#content").find('a').attr('href','#oe_sec_menu'); + } + /*if(!$('#oe_sec_menu').html().length){ + this.secondary = new openerp.web_mobile.Secondary(this, "oe_sec_menu", this.children); + this.secondary.start(); + }else{ + // self.$element.find("#content").find('a').attr('href','#oe_sec_menu'); + this.$element.add(this.$secondary_menu).find("#content").find('a').attr('href','#oe_sec_menu'); + }*/ + } }); openerp.web_mobile.Secondary = openerp.web.Widget.extend({ @@ -208,19 +209,25 @@ openerp.web_mobile.Secondary = openerp.web.Widget.extend({ }, start: function(ev, id) { var self = this; + // console.log(this.data,this.$element.html().length); + + /* if(this.$element.html().length){ + self.$element.find('[data-role="listview"]').remove(); + + _.each(self.data.children,function(i){ + var newul = '
  • '+ + i.name+'
'; // Create New List Item + self.$element.find('#content').append(newul); + //console.log('in for loop',i.children); + }); + console.log('saaasasaaa',self.$element.find('#content'),self.data); + //self.$element.find('[data-role="listview"]').listview('refresh'); + }else{*/ + var v = { menu : this.data }; this.$element.html(QWeb.render("Menu.secondary", v)); this.$element.find("#header").find("h1").html(this.data.name); this.$element.add(this.$secondary_menu).find('#content').find("a").click(this.on_menu_click); - this.$element.find("#header").find('#application').click(function(){ - if(!$('#oe_menu').html().length){ - this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); - this.menu.start(); - } - else{ - self.$element.find("#header").find('#application').attr('href','#oe_menu'); - } - }); this.$element.find("#footer").find('#shrotcuts').click(function(){ if(!$('#oe_shortcuts').html().length){ this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); @@ -256,15 +263,6 @@ openerp.web_mobile.Options = openerp.web.Widget.extend({ start: function() { var self = this; this.$element.html(QWeb.render("Options", this)); - this.$element.find("#header").find('#application').click(function(){ - if(!$('#oe_menu').html().length){ - this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); - this.menu.start(); - } - else{ - self.$element.find("#header").find('#application').attr('href','#oe_menu'); - } - }); this.$element.find("#footer").find('#shrotcuts').click(function(){ if(!$('#oe_shortcuts').html().length){ this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); diff --git a/addons/web_mobile/static/src/js/list_mobile.js b/addons/web_mobile/static/src/js/list_mobile.js index 328f29e1214..1d4e0d72ca2 100644 --- a/addons/web_mobile/static/src/js/list_mobile.js +++ b/addons/web_mobile/static/src/js/list_mobile.js @@ -24,26 +24,36 @@ openerp.web_mobile.ListView = openerp.web.Widget.extend({ var self = this; var dataset = new openerp.web.DataSetStatic(this, this.action.res_model, this.action.context); dataset.name_search('', [], 'ilike',false ,function(result){ + if(self.$element.html().length){ + self.$element.find('[data-role="listview"]').find('li').remove(); + for(var i=0;i' + result[i][1] + ''; // Create New List Item + self.$element.find('[data-role="listview"]').append(newli); + } + self.$element.find('[data-role="listview"]').listview('refresh'); + }else{ self.$element.html(QWeb.render("ListView", {'records' : result})); self.$element.find("#header").find('h1').html(self.action.name); - self.$element.find("a#list-id").click(self.on_list_click); - self.$element.find("#header").find('#application').click(function(){ - if(!$('#oe_menu').html().length){ - this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); - this.menu.start(); + self.$element.find("#footer").find('#shortcuts').click(function(){ + if(!$('#oe_shortcuts').html().length){ + this.shortcut = new openerp.web_mobile.Options(self, "oe_shortcuts"); + this.options.start(); } else{ - self.$element.find("#header").find('#application').attr('href','#oe_menu'); + self.$element.find("#footer").find('#shrotcuts').attr('href','#oe_shortcuts'); } }); - self.$element.find("#footer").find('#shrotcuts').click(function(){ - this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); - this.shortcuts.start(); - }); self.$element.find("#footer").find('#preference').click(function(){ - this.options = new openerp.web_mobile.Options(self, "oe_options"); - this.options.start(); + if(!$('#oe_options').html().length){ + this.options = new openerp.web_mobile.Options(self, "oe_options"); + this.options.start(); + } + else{ + self.$element.find("#footer").find('#preference').attr('href','#oe_options'); + } }); + } + self.$element.find("a#list-id").click(self.on_list_click); $.mobile.changePage($("#oe_list"), "slide", true, true); }); }, diff --git a/addons/web_mobile/static/src/xml/web_mobile.xml b/addons/web_mobile/static/src/xml/web_mobile.xml index ec5c03bca0a..75d30af55b1 100644 --- a/addons/web_mobile/static/src/xml/web_mobile.xml +++ b/addons/web_mobile/static/src/xml/web_mobile.xml @@ -58,7 +58,7 @@
element bears a foreach, which we have to keep, so can't just insert new tds in the row (they'll get repeated), we can't remove the tr (not without grafting the old attributes), etc... it's really kind-of a pain. Basically, the replaceAll() is used to make the just created replace the matched, the unwrapAll removes the
+ -
()
+ () +
From 75063083b964888176e4e9355a142ff833cfc618 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Thu, 4 Aug 2011 16:59:07 +0530 Subject: [PATCH 008/210] [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/210] [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/210] [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 061/210] [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 062/210] [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 063/210] [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 064/210] [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 103/210] [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 104/210] [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 7d8809d3a8360dab1cc7ee83d9fd11fe4ec80fa8 Mon Sep 17 00:00:00 2001 From: "Bhumi Thakkar (Open ERP)" Date: Tue, 6 Sep 2011 17:01:11 +0530 Subject: [PATCH 105/210] [IMP] Implement footer functionality,on click of menu displayed all sub menus & Relational Fields. bzr revid: bth@tinyerp.com-20110906113111-47qh4pwms82ktfnl --- .../web_mobile/static/src/js/chrome_mobile.js | 92 +++++------- .../web_mobile/static/src/js/form_mobile.js | 53 +++++-- .../web_mobile/static/src/js/list_mobile.js | 11 ++ .../web_mobile/static/src/xml/web_mobile.xml | 140 +++++++++++------- 4 files changed, 177 insertions(+), 119 deletions(-) diff --git a/addons/web_mobile/static/src/js/chrome_mobile.js b/addons/web_mobile/static/src/js/chrome_mobile.js index 15680eebfab..b3246024afc 100644 --- a/addons/web_mobile/static/src/js/chrome_mobile.js +++ b/addons/web_mobile/static/src/js/chrome_mobile.js @@ -74,8 +74,9 @@ openerp.web_mobile.Login = openerp.base.Widget.extend({ .removeClass("login_invalid") .addClass("login_valid"); //.hide(); - this.homepage = new openerp.web_mobile.HomePage(this, "oe_home"); - this.homepage.start(); + + this.menu = new openerp.web_mobile.Menu(this, "oe_menu", "oe_secondary_menu"); + this.menu.start(); }, do_ask_login: function(continuation) { this.on_login_invalid(); @@ -87,27 +88,6 @@ openerp.web_mobile.Login = openerp.base.Widget.extend({ } }); -openerp.web_mobile.HomePage = openerp.base.Widget.extend({ - init: function(session, element_id) { - this._super(session, element_id); - }, - start: function() { - this.$element.html(QWeb.render("HomePage", {})); -// this.header = new openerp.web_mobile.Header(this, "oe_header"); - this.shortcuts = new openerp.web_mobile.Shortcuts(this, "oe_shortcuts"); - this.menu = new openerp.web_mobile.Menu(this, "oe_menu", "oe_secondary_menu"); - this.options = new openerp.web_mobile.Options(this, "oe_options"); -// this.footer = new openerp.web_mobile.Footer(this, "oe_footer"); -// this.header.start(); - this.shortcuts.start(); - this.menu.start(); - this.options.start(); -// this.footer.start(); - this.$element.find("a").click(this.on_clicked); - $.mobile.changePage($("#oe_home"), "slide", true, true); - } -}); - openerp.web_mobile.Header = openerp.base.Widget.extend({ init: function(session, element_id) { this._super(session, element_id); @@ -136,8 +116,13 @@ openerp.web_mobile.Shortcuts = openerp.base.Widget.extend({ var self = this; this.rpc('/base/session/sc_list',{} ,function(res){ self.$element.html(QWeb.render("Shortcuts", {'sc' : res})) - self.$element.find("a").click(self.on_clicked); - }) + self.$element.find('#content').find("a").click(self.on_clicked); + self.$element.find("#footer").find('#preference').click(function(){ + this.options = new openerp.web_mobile.Options(self, "oe_options"); + this.options.start(); + }); + $.mobile.changePage($("#oe_shortcuts"), "slide", true, true); + }); }, on_clicked: function(ev) { $shortcut = $(ev.currentTarget); @@ -162,9 +147,20 @@ openerp.web_mobile.Menu = openerp.base.Widget.extend({ this.rpc("/base/menu/load", {}, this.on_loaded); }, on_loaded: function(data) { + var self = this; this.data = data; this.$element.html(QWeb.render("Menu", this.data)); - this.$element.add(this.$secondary_menu).find("a").click(this.on_menu_click); + + this.$element.find("#footer").find('#shrotcuts').click(function(){ + this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); + this.shortcuts.start(); + }); + this.$element.find("#footer").find('#preference').click(function(){ + this.options = new openerp.web_mobile.Options(self, "oe_options"); + this.options.start(); + }); + this.$element.add(this.$secondary_menu).find("#content").find('a').click(this.on_menu_click); + $.mobile.changePage($("#oe_menu"), "slide", true, true); }, on_menu_click: function(ev, id) { $menu = $(ev.currentTarget); @@ -182,46 +178,35 @@ openerp.web_mobile.Menu = openerp.base.Widget.extend({ this.secondary = new openerp.web_mobile.Secondary(this, "oe_sec_menu", this.children); // this.header.start(); this.secondary.start(); - jQuery("#oe_header").find("h1").html($menu.data('name')); } }); - openerp.web_mobile.Secondary = openerp.base.Widget.extend({ init: function(session, element_id, secondary_menu_id) { this._super(session, element_id); this.data = secondary_menu_id; }, start: function(ev, id) { + var self = this; var v = { menu : this.data }; this.$element.html(QWeb.render("Menu.secondary", v)); - this.$element.add(this.$secondary_menu).find("a").click(this.on_menu_click); + this.$element.find("#header").find("h1").html(this.data.name); + this.$element.add(this.$secondary_menu).find('#content').find("a").click(this.on_menu_click); + this.$element.find("#footer").find('#shrotcuts').click(function(){ + this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); + this.shortcuts.start(); + }); + this.$element.find("#footer").find('#preference').click(function(){ + this.options = new openerp.web_mobile.Options(self, "oe_options"); + this.options.start(); + }); $.mobile.changePage($("#oe_sec_menu"), "slide", true, true); }, on_menu_click: function(ev, id) { $menu = $(ev.currentTarget); id = $menu.data('menu'); - for (var i = 0; i < this.data.children.length; i++) { - if (this.data.children[i].id == id) { - this.children = this.data.children[i]; - } - } - var child_len = this.children.children.length; - if (child_len > 0) { - this.$element - .removeClass("secondary_menu") - .addClass("content_menu"); - //.hide(); -// this.header = new openerp.web_mobile.Header(this, "oe_header"); - this.secondary = new openerp.web_mobile.Secondary(this, "oe_sec_menu_new", this.children); -// this.header.start(); - this.secondary.start(); - $.mobile.changePage($("#oe_sec_menu_new"), "slide", true, true); - } - else { - if (id) { - this.listview = new openerp.web_mobile.ListView(this, "oe_list", id); - this.listview.start(); - } + if (id) { + this.listview = new openerp.web_mobile.ListView(this, "oe_list", id); + this.listview.start(); } jQuery("#oe_header").find("h1").html($menu.data('name')); } @@ -234,6 +219,11 @@ openerp.web_mobile.Options = openerp.base.Widget.extend({ start: function() { var self = this; this.$element.html(QWeb.render("Options", this)); + this.$element.find("#footer").find('#shrotcuts').click(function(){ + this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); + this.shortcuts.start(); + }); + $.mobile.changePage($("#oe_options"), "slide", true, true); } }); diff --git a/addons/web_mobile/static/src/js/form_mobile.js b/addons/web_mobile/static/src/js/form_mobile.js index 40e897299c3..7c66182263a 100644 --- a/addons/web_mobile/static/src/js/form_mobile.js +++ b/addons/web_mobile/static/src/js/form_mobile.js @@ -39,6 +39,8 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({ } } self.$element.html(QWeb.render("FormView", {'get_fields': get_fields, 'notebooks': notebooks || false, 'fields' : fields, 'values' : data })); + + self.$element.find("#header").find('h1').html(self.action.name); self.$element.find('select').change(function(ev){ selection.on_select_option(ev); }); @@ -68,9 +70,12 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({ if (!next.find('.detail').html().length) { for (var i = 0; i < get_fields.length; i++) { if (fields[get_fields[i].attrs.name].type == 'one2many'){ - var get_fields_test = self.get_fields(fields[get_fields[i].attrs.name].views.form.arch.children); - var fields_test = fields[get_fields[i].attrs.name]['views'].form.fields; - var notebook=fields[get_fields[i].attrs.name].views.form.arch; + if(fields[get_fields[i].attrs.name].views.form){ + var get_fields_test = self.get_fields(fields[get_fields[i].attrs.name].views.form.arch.children); + var fields_test = fields[get_fields[i].attrs.name]['views'].form.fields; + var notebook=fields[get_fields[i].attrs.name].views.form.arch; + } + var relational = get_fields[i].attrs.name; } } if(notebook){ @@ -79,18 +84,34 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({ next.find('.detail').append(QWeb.render("FormView", {'get_fields': get_fields,'fields' : result.fields_view.fields, 'values' : data })); } } - next.find('.detail').find('a').click(function(){ - if(next.find('.detail').find('a').next().find('.detail').html().length){ - if (next.find('.detail').find('a').next().hasClass(self.content_collapsed_class)) { - self.collapsed(next.find('.detail').find('a').next(),next.find('.detail').find('a').find('span .ui-icon')); - } - else if (next.find('.detail').find('a').next().hasClass(self.content_expanded_class)) { - self.expanded(next.find('.detail').find('a').next(),next.find('.detail').find('a').find('span .ui-icon')); - } - } - if(!next.find('.detail').find('a').next().find('.detail').html().length){ - next.find('.detail').find('a').next().find('.detail').append(QWeb.render("FormView", {'get_fields': get_fields_test,'fields' : fields_test, 'values' : data })); - self.collapsed(next.find('.detail').find('a').next(),next.find('.detail').find('a').find('span .ui-icon')); + + //$.mobile.changePage($("#oe_form"), "slide", true, true); + next.find('.detail').find('li').click(function(){ + if(data[relational]){ + var dataset = new openerp.base.DataSetStatic(self, result.fields_view.fields[relational].relation, result.fields_view.fields[relational].context); + dataset.domain=[['id', 'in', data[relational]]]; + dataset.name_search('', dataset.domain, 'in',false ,function(res){ + for(var i=0;i
+
+
+
@@ -41,17 +44,16 @@ -
+
-
-
-
+
-
-

Footer

+ @@ -69,61 +71,86 @@ -
+
+
-
-

OpenERP

+ +
+ +
    + +
  • + +
  • + +
  • + + + +
  • +
    +
    +
+
+ + + +
- -
-
-

Footer

-
-
- - +
+
-
-

OpenERP

- +
    @@ -151,13 +181,19 @@
-
-

Footer

+ -
+ +
From ad435f72493fa527f352e1a1f8bb2992d13be557 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 6 Sep 2011 13:49:21 +0200 Subject: [PATCH 106/210] [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 107/210] [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 108/210] [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 109/210] [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 = """'%i for i in jslist]) # css tags csslist = ['/web/webclient/css'] if req.debug: - csslist = manifest_glob(req.config.addons_path, ['web'], 'css') + csslist = [i + '?debug=' + str(time.time()) for i in manifest_glob(req.config.addons_path, ['web'], 'css')] css = "\n ".join([''%i for i in csslist]) r = home_template % { 'javascript': js, From 3d9fb5d4cc7ed3e187ce577d382177818652c08b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 7 Sep 2011 13:02:07 +0200 Subject: [PATCH 135/210] [FIX] Fix bug caused by View#load refactoring bzr revid: fme@openerp.com-20110907110207-lujx2cnhabsbfzgf --- addons/web/static/src/js/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 0b931d7df88..73695e93ea3 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -47,7 +47,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# if (this.embedded_view) { var def = $.Deferred().then(this.on_loaded); var self = this; - setTimeout(function() {def.resolve({fields_view: self.embedded_view});}, 0); + setTimeout(function() {def.resolve(self.embedded_view);}, 0); return def.promise(); } else { var context = new openerp.web.CompoundContext(this.dataset.get_context()); From d874c29edda752b0a207c84ccea3b564820e8b44 Mon Sep 17 00:00:00 2001 From: "Jiten (OpenERP)" Date: Wed, 7 Sep 2011 16:42:25 +0530 Subject: [PATCH 136/210] [IMP] Improved style on xml for pages. bzr revid: jra@tinyerp.com-20110907111225-cnu0kynz3ygfki4r --- .../web_mobile/static/src/js/chrome_mobile.js | 27 ++++ .../web_mobile/static/src/js/list_mobile.js | 11 +- .../web_mobile/static/src/xml/web_mobile.xml | 147 +++++++----------- 3 files changed, 96 insertions(+), 89 deletions(-) diff --git a/addons/web_mobile/static/src/js/chrome_mobile.js b/addons/web_mobile/static/src/js/chrome_mobile.js index 4160ad57f1c..be15d107668 100644 --- a/addons/web_mobile/static/src/js/chrome_mobile.js +++ b/addons/web_mobile/static/src/js/chrome_mobile.js @@ -118,6 +118,15 @@ openerp.web_mobile.Shortcuts = openerp.base.Widget.extend({ this.rpc('/base/session/sc_list',{} ,function(res){ self.$element.html(QWeb.render("Shortcuts", {'sc' : res})) self.$element.find('#content').find("a").click(self.on_clicked); + self.$element.find("#header").find('#application').click(function(){ + if(!$('#oe_menu').html().length){ + this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); + this.menu.start(); + } + else{ + self.$element.find("#header").find('#application').attr('href','#oe_menu'); + } + }); self.$element.find("#footer").find('#preference').click(function(){ if(!$('#oe_options').html().length){ this.options = new openerp.web_mobile.Options(self, "oe_options"); @@ -207,6 +216,15 @@ openerp.web_mobile.Secondary = openerp.base.Widget.extend({ this.$element.html(QWeb.render("Menu.secondary", v)); this.$element.find("#header").find("h1").html(this.data.name); this.$element.add(this.$secondary_menu).find('#content').find("a").click(this.on_menu_click); + this.$element.find("#header").find('#application').click(function(){ + if(!$('#oe_menu').html().length){ + this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); + this.menu.start(); + } + else{ + self.$element.find("#header").find('#application').attr('href','#oe_menu'); + } + }); this.$element.find("#footer").find('#shrotcuts').click(function(){ if(!$('#oe_shortcuts').html().length){ this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); @@ -245,6 +263,15 @@ openerp.web_mobile.Options = openerp.base.Widget.extend({ start: function() { var self = this; this.$element.html(QWeb.render("Options", this)); + this.$element.find("#header").find('#application').click(function(){ + if(!$('#oe_menu').html().length){ + this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); + this.menu.start(); + } + else{ + self.$element.find("#header").find('#application').attr('href','#oe_menu'); + } + }); this.$element.find("#footer").find('#shrotcuts').click(function(){ if(!$('#oe_shortcuts').html().length){ this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); diff --git a/addons/web_mobile/static/src/js/list_mobile.js b/addons/web_mobile/static/src/js/list_mobile.js index 9bb630d6a79..65e96be77a8 100644 --- a/addons/web_mobile/static/src/js/list_mobile.js +++ b/addons/web_mobile/static/src/js/list_mobile.js @@ -22,12 +22,20 @@ openerp.web_mobile.ListView = openerp.base.Widget.extend({ }, on_search_data: function(ev){ var self = this; - var dataset = new openerp.base.DataSetStatic(this, this.action.res_model, this.action.context); dataset.name_search('', [], 'ilike',false ,function(result){ self.$element.html(QWeb.render("ListView", {'records' : result})); self.$element.find("#header").find('h1').html(self.action.name); self.$element.find("a#list-id").click(self.on_list_click); + self.$element.find("#header").find('#application').click(function(){ + if(!$('#oe_menu').html().length){ + this.menu = new openerp.web_mobile.Menu(self, "oe_menu"); + this.menu.start(); + } + else{ + self.$element.find("#header").find('#application').attr('href','#oe_menu'); + } + }); self.$element.find("#footer").find('#shrotcuts').click(function(){ this.shortcuts = new openerp.web_mobile.Shortcuts(self, "oe_shortcuts"); this.shortcuts.start(); @@ -36,7 +44,6 @@ openerp.web_mobile.ListView = openerp.base.Widget.extend({ this.options = new openerp.web_mobile.Options(self, "oe_options"); this.options.start(); }); - $.mobile.changePage($("#oe_list"), "slide", true, true); }); }, diff --git a/addons/web_mobile/static/src/xml/web_mobile.xml b/addons/web_mobile/static/src/xml/web_mobile.xml index 5f5fe6daf6b..a9b606f1f84 100644 --- a/addons/web_mobile/static/src/xml/web_mobile.xml +++ b/addons/web_mobile/static/src/xml/web_mobile.xml @@ -5,7 +5,6 @@
-
@@ -43,134 +42,105 @@
- - -
- -
- -
-

OpenERP

- +
-

Footer

+

-
-

OpenERP

- +
-
    -
  • - Shortcuts -
  • -
  • - - - -
  • -
+
-

OpenERP

- +

Applications

- +
-
'); + if (options.position === 'before') { + $rows.prepend(newcols); + } else { + $rows.append(newcols); + } + }, + /** + * Removes all padding columns of the table + */ + unpad_columns: function () { + this.$element.find('.oe-listview-padding').remove(); + if (this.previous_colspan) { + this.$element + .find('thead tr:first th') + .attr('colspan', this.previous_colspan); + this.previous_colspan = null; + } } }); openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.ListView.List# */{ diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 5ac1929fce3..7a6610850b3 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -566,7 +566,7 @@
+ () @@ -12,13 +12,15 @@
- -
-
-
-
-
+
+
+ +
+
+
+
+
+
'); } }); + // Add columns for the cancel and save buttons, if + // there are none in the list + if (!self.options.selectable) { + self.view.pad_columns( + 1, {except: $new_row, position: 'before'}); + } + if (!self.options.deletable) { + self.view.pad_columns( + 1, {except: $new_row}); + } self.edition_form.do_show(); }); diff --git a/addons/web/static/src/js/list.js b/addons/web/static/src/js/list.js index 6029b30f866..74f6d7b92e5 100644 --- a/addons/web/static/src/js/list.js +++ b/addons/web/static/src/js/list.js @@ -49,6 +49,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; + this.previous_colspan = null; this.columns = []; @@ -603,6 +604,49 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# get_selected_ids: function() { var ids = this.groups.get_selection().ids; return ids; + }, + /** + * Adds padding columns at the start or end of all table rows (including + * field names row) + * + * @param {Number} count number of columns to add + * @param {Object} options + * @param {"before"|"after"} [position="after"] insertion position for the new columns + * @param {Object} [except] content row to not pad + */ + pad_columns: function (count, options) { + options = options || {}; + // padding for action/pager header + var $first_header = this.$element.find('thead tr:first th'); + var colspan = $first_header.attr('colspan'); + if (colspan) { + if (!this.previous_colspan) { + this.previous_colspan = colspan; + } + $first_header.attr('colspan', parseInt(colspan, 10) + count); + } + // Padding for column titles, footer and data rows + var $rows = this.$element + .find('.oe-listview-header-columns, tr:not(thead tr)') + .not(options['except']); + var newcols = new Array(count+1).join('
@@ -1211,21 +1211,11 @@ - - $(document.createElement('t')) - .append(this.contents()) - .attr({ - 't-foreach': this.attr('t-foreach'), - 't-as': this.attr('t-as') - }) - .replaceAll(this) - .after($(document.createElement('td')).append( - $(document.createElement('button')).attr({ - 'class': 'oe-edit-row-save', 'type': 'button'}).text('Save'))) - .before($(document.createElement('td')).append( - $(document.createElement('button')).attr({ - 'class': 'oe-edit-row-cancel', 'type': 'button'}).text('Cancel'))) - .unwrap(); + +
around it all, resulting in a with the buttons inserted before and after it, all landed in the editable-listview-generated-row bzr revid: xmo@openerp.com-20110909134244-mbf5sf4to09fvsyi --- addons/web/static/src/xml/base.xml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 385d7bfd48b..8b0fda2b83f 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1211,11 +1211,21 @@ - - - - - + + $(document.createElement('t')) + .append(this.contents()) + .attr({ + 't-foreach': this.attr('t-foreach'), + 't-as': this.attr('t-as') + }) + .replaceAll(this) + .after($(document.createElement('td')).append( + $(document.createElement('button')).attr({ + 'class': 'oe-edit-row-save', 'type': 'button'}).text('Save'))) + .before($(document.createElement('td')).append( + $(document.createElement('button')).attr({ + 'class': 'oe-edit-row-cancel', 'type': 'button'}).text('Cancel'))) + .unwrap(); From 9c8e5fb0997b788fc0145b652167ad443e3c87cf Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 9 Sep 2011 13:18:03 +0200 Subject: [PATCH 201/210] [imp] changed 'status' widget to 'statusbar' widget bzr revid: nicolas.vanhoren@openerp.com-20110909111803-n10ff50qr8mismjb --- addons/web/static/src/js/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index 512ee1c15ff..d5fa9cdbde6 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -2552,7 +2552,7 @@ openerp.web.form.widgets = new openerp.web.Registry({ 'progressbar': 'openerp.web.form.FieldProgressBar', 'image': 'openerp.web.form.FieldBinaryImage', 'binary': 'openerp.web.form.FieldBinaryFile', - 'status': 'openerp.web.form.FieldStatus' + 'statusbar': 'openerp.web.form.FieldStatus' }); }; From 2ac1bee1463e9bf1fcd7ceb96486c6137249deb6 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 9 Sep 2011 14:13:12 +0200 Subject: [PATCH 202/210] [fix] padding correction for statusbar bzr revid: nicolas.vanhoren@openerp.com-20110909121312-p5smu8m7rrk5wlge --- addons/web/static/src/css/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 4bf923afd71..f7eca2906a0 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1279,6 +1279,7 @@ label.error { ul.oe-arrow-list { padding-left: 0.5em; + margin: 0; } ul.oe-arrow-list li { display: inline-block; From 3875715c80c96ac46e5dc8058823fd7e6fb247fc Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 9 Sep 2011 15:46:04 +0200 Subject: [PATCH 203/210] [fix] some problem in some o2m that made many things fail bzr revid: nicolas.vanhoren@openerp.com-20110909134604-6qgilgf72qchgr2b --- addons/web/static/src/js/form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/form.js b/addons/web/static/src/js/form.js index d5fa9cdbde6..18947d1b788 100644 --- a/addons/web/static/src/js/form.js +++ b/addons/web/static/src/js/form.js @@ -1852,7 +1852,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({ this.viewmanager.views[this.viewmanager.active_view].controller) { var view = this.viewmanager.views[this.viewmanager.active_view].controller; if (this.viewmanager.active_view === "form") { - var res = view.do_save(); + var res = $.when(view.do_save()); if (res === false) { // ignore } else if (res.isRejected()) { From 25237f7178894da666b53d52cd5d47f33523d458 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 9 Sep 2011 16:13:17 +0200 Subject: [PATCH 204/210] [IMP] move webrelease into addons/web bzr revid: al@openerp.com-20110909141317-uvo90sxlg8o5w9dx --- addons/web/__openerp__.py | 1 - webrelease.py => addons/web/common/release.py | 7 +++---- addons/web/controllers/main.py | 7 ++++--- setup.py | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) rename webrelease.py => addons/web/common/release.py (82%) diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 290bca17464..a6e438a75db 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -1,6 +1,5 @@ { "name" : "web", - "version" : "2.0", "depends" : [], 'active': True, 'js' : [ diff --git a/webrelease.py b/addons/web/common/release.py similarity index 82% rename from webrelease.py rename to addons/web/common/release.py index 77eb46dd2c3..47570c032bb 100644 --- a/webrelease.py +++ b/addons/web/common/release.py @@ -1,11 +1,10 @@ - -name = 'openerp-web-proto' +name = 'openerp-web' version = '6.1.0 alpha' description = "Web Client of OpenERP, the Enterprise Management Software" long_description = "OpenERP Web is the web client of the OpenERP, a free enterprise management software" -author = "OpenERP S.A." +author = "OpenERP SA" author_email = "info@openerp.com" support_email = 'support@openerp.com' url = "http://www.openerp.com/" download_url = '' -license = "OEPL" +license = "AGPL" diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 415db15509d..c85072d625b 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -12,17 +12,18 @@ import textwrap import xmlrpclib import time import zlib -import webrelease from xml.etree import ElementTree from cStringIO import StringIO +from babel.messages.pofile import read_po + import web.common.dispatch as openerpweb import web.common.ast import web.common.nonliterals +import web.common.release openerpweb.ast = web.common.ast openerpweb.nonliterals = web.common.nonliterals -from babel.messages.pofile import read_po # Should move to openerpweb.Xml2Json class Xml2Json: @@ -195,7 +196,7 @@ class WebClient(openerpweb.Controller): @openerpweb.jsonrequest def version_info(self, req): return { - "version": webrelease.version + "version": web.common.release.version } class Database(openerpweb.Controller): diff --git a/setup.py b/setup.py index cbbd4697687..45be08ff42b 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,7 @@ import re import sys from setuptools import setup -execfile('webrelease.py') +execfile('addons/web/common/release.py') version_dash_incompatible = False if 'bdist_rpm' in sys.argv: From 99c0bdd0fb1761925ed410e76dbfcfb5b70cbeb6 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 9 Sep 2011 17:05:47 +0200 Subject: [PATCH 205/210] [ADD] web/static: missing icons bzr revid: odo@openerp.com-20110909150547-5z0nn76te15hu2is --- addons/web/static/src/img/icons/gtk-about.png | Bin 0 -> 523 bytes addons/web/static/src/img/icons/gtk-bold.png | Bin 0 -> 604 bytes addons/web/static/src/img/icons/gtk-cdrom.png | Bin 0 -> 711 bytes addons/web/static/src/img/icons/gtk-clear.png | Bin 0 -> 682 bytes .../static/src/img/icons/gtk-color-picker.png | Bin 0 -> 470 bytes addons/web/static/src/img/icons/gtk-connect.png | Bin 0 -> 558 bytes addons/web/static/src/img/icons/gtk-copy.png | Bin 0 -> 339 bytes addons/web/static/src/img/icons/gtk-cut.png | Bin 0 -> 626 bytes .../src/img/icons/gtk-dialog-authentication.png | Bin 0 -> 590 bytes .../static/src/img/icons/gtk-dialog-error.png | Bin 0 -> 559 bytes .../web/static/src/img/icons/gtk-dialog-info.png | Bin 0 -> 687 bytes .../static/src/img/icons/gtk-dialog-question.png | Bin 0 -> 491 bytes .../static/src/img/icons/gtk-dialog-warning.png | Bin 0 -> 428 bytes .../src/img/icons/gtk-directory-remote.png | Bin 0 -> 455 bytes .../web/static/src/img/icons/gtk-directory.png | Bin 0 -> 392 bytes .../web/static/src/img/icons/gtk-disconnect.png | Bin 0 -> 566 bytes .../static/src/img/icons/gtk-dnd-multiple.png | Bin 0 -> 501 bytes addons/web/static/src/img/icons/gtk-file.png | Bin 0 -> 289 bytes .../src/img/icons/gtk-find-and-replace.png | Bin 0 -> 580 bytes addons/web/static/src/img/icons/gtk-floppy.png | Bin 0 -> 565 bytes .../web/static/src/img/icons/gtk-fullscreen.png | Bin 0 -> 450 bytes .../web/static/src/img/icons/gtk-goto-bottom.png | Bin 0 -> 574 bytes .../web/static/src/img/icons/gtk-goto-first.png | Bin 0 -> 573 bytes addons/web/static/src/img/icons/gtk-goto-top.png | Bin 0 -> 580 bytes addons/web/static/src/img/icons/gtk-harddisk.png | Bin 0 -> 354 bytes addons/web/static/src/img/icons/gtk-help.png | Bin 0 -> 789 bytes addons/web/static/src/img/icons/gtk-home.png | Bin 0 -> 477 bytes addons/web/static/src/img/icons/gtk-info.png | Bin 0 -> 738 bytes addons/web/static/src/img/icons/gtk-italic.png | Bin 0 -> 529 bytes .../static/src/img/icons/gtk-justify-center.png | Bin 0 -> 251 bytes .../static/src/img/icons/gtk-justify-left.png | Bin 0 -> 240 bytes .../static/src/img/icons/gtk-justify-right.png | Bin 0 -> 254 bytes .../src/img/icons/gtk-leave-fullscreen.png | Bin 0 -> 448 bytes .../static/src/img/icons/gtk-media-forward.png | Bin 0 -> 704 bytes .../web/static/src/img/icons/gtk-media-next.png | Bin 0 -> 693 bytes .../static/src/img/icons/gtk-media-previous.png | Bin 0 -> 686 bytes .../static/src/img/icons/gtk-media-record.png | Bin 0 -> 594 bytes .../static/src/img/icons/gtk-media-rewind.png | Bin 0 -> 704 bytes .../web/static/src/img/icons/gtk-media-stop.png | Bin 0 -> 421 bytes .../static/src/img/icons/gtk-missing-image.png | Bin 0 -> 330 bytes addons/web/static/src/img/icons/gtk-paste-v.png | Bin 0 -> 689 bytes addons/web/static/src/img/icons/gtk-paste.png | Bin 0 -> 473 bytes .../web/static/src/img/icons/gtk-preferences.png | Bin 0 -> 339 bytes .../static/src/img/icons/gtk-print-preview.png | Bin 0 -> 616 bytes .../web/static/src/img/icons/gtk-properties.png | Bin 0 -> 313 bytes addons/web/static/src/img/icons/gtk-quit.png | Bin 0 -> 394 bytes addons/web/static/src/img/icons/gtk-refresh.png | Bin 0 -> 753 bytes .../static/src/img/icons/gtk-revert-to-saved.png | Bin 0 -> 413 bytes addons/web/static/src/img/icons/gtk-save-as.png | Bin 0 -> 560 bytes .../static/src/img/icons/gtk-select-color.png | Bin 0 -> 656 bytes .../web/static/src/img/icons/gtk-select-font.png | Bin 0 -> 598 bytes .../static/src/img/icons/gtk-sort-ascending.png | Bin 0 -> 371 bytes .../web/static/src/img/icons/gtk-spell-check.png | Bin 0 -> 485 bytes .../static/src/img/icons/gtk-strikethrough.png | Bin 0 -> 459 bytes addons/web/static/src/img/icons/gtk-undelete.png | Bin 0 -> 875 bytes .../web/static/src/img/icons/gtk-underline.png | Bin 0 -> 539 bytes addons/web/static/src/img/icons/gtk-unindent.png | Bin 0 -> 295 bytes addons/web/static/src/img/icons/gtk-zoom-100.png | Bin 0 -> 469 bytes addons/web/static/src/img/icons/gtk-zoom-out.png | Bin 0 -> 463 bytes addons/web/static/src/img/icons/stock.png | Bin 0 -> 953 bytes .../web/static/src/img/icons/stock_calendar.png | Bin 0 -> 454 bytes addons/web/static/src/img/icons/stock_gantt.png | Bin 0 -> 293 bytes addons/web/static/src/img/icons/stock_graph.png | Bin 0 -> 606 bytes addons/web/static/src/img/icons/stock_log.png | Bin 0 -> 748 bytes addons/web/static/src/img/icons/stock_person.png | Bin 0 -> 1074 bytes .../web/static/src/img/icons/stock_translate.png | Bin 0 -> 519 bytes 66 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/web/static/src/img/icons/gtk-about.png create mode 100644 addons/web/static/src/img/icons/gtk-bold.png create mode 100644 addons/web/static/src/img/icons/gtk-cdrom.png create mode 100644 addons/web/static/src/img/icons/gtk-clear.png create mode 100644 addons/web/static/src/img/icons/gtk-color-picker.png create mode 100644 addons/web/static/src/img/icons/gtk-connect.png create mode 100644 addons/web/static/src/img/icons/gtk-copy.png create mode 100644 addons/web/static/src/img/icons/gtk-cut.png create mode 100644 addons/web/static/src/img/icons/gtk-dialog-authentication.png create mode 100644 addons/web/static/src/img/icons/gtk-dialog-error.png create mode 100644 addons/web/static/src/img/icons/gtk-dialog-info.png create mode 100644 addons/web/static/src/img/icons/gtk-dialog-question.png create mode 100644 addons/web/static/src/img/icons/gtk-dialog-warning.png create mode 100644 addons/web/static/src/img/icons/gtk-directory-remote.png create mode 100644 addons/web/static/src/img/icons/gtk-directory.png create mode 100644 addons/web/static/src/img/icons/gtk-disconnect.png create mode 100644 addons/web/static/src/img/icons/gtk-dnd-multiple.png create mode 100644 addons/web/static/src/img/icons/gtk-file.png create mode 100644 addons/web/static/src/img/icons/gtk-find-and-replace.png create mode 100644 addons/web/static/src/img/icons/gtk-floppy.png create mode 100644 addons/web/static/src/img/icons/gtk-fullscreen.png create mode 100644 addons/web/static/src/img/icons/gtk-goto-bottom.png create mode 100644 addons/web/static/src/img/icons/gtk-goto-first.png create mode 100644 addons/web/static/src/img/icons/gtk-goto-top.png create mode 100644 addons/web/static/src/img/icons/gtk-harddisk.png create mode 100644 addons/web/static/src/img/icons/gtk-help.png create mode 100644 addons/web/static/src/img/icons/gtk-home.png create mode 100644 addons/web/static/src/img/icons/gtk-info.png create mode 100644 addons/web/static/src/img/icons/gtk-italic.png create mode 100644 addons/web/static/src/img/icons/gtk-justify-center.png create mode 100644 addons/web/static/src/img/icons/gtk-justify-left.png create mode 100644 addons/web/static/src/img/icons/gtk-justify-right.png create mode 100644 addons/web/static/src/img/icons/gtk-leave-fullscreen.png create mode 100644 addons/web/static/src/img/icons/gtk-media-forward.png create mode 100644 addons/web/static/src/img/icons/gtk-media-next.png create mode 100644 addons/web/static/src/img/icons/gtk-media-previous.png create mode 100644 addons/web/static/src/img/icons/gtk-media-record.png create mode 100644 addons/web/static/src/img/icons/gtk-media-rewind.png create mode 100644 addons/web/static/src/img/icons/gtk-media-stop.png create mode 100644 addons/web/static/src/img/icons/gtk-missing-image.png create mode 100644 addons/web/static/src/img/icons/gtk-paste-v.png create mode 100644 addons/web/static/src/img/icons/gtk-paste.png create mode 100644 addons/web/static/src/img/icons/gtk-preferences.png create mode 100644 addons/web/static/src/img/icons/gtk-print-preview.png create mode 100644 addons/web/static/src/img/icons/gtk-properties.png create mode 100644 addons/web/static/src/img/icons/gtk-quit.png create mode 100644 addons/web/static/src/img/icons/gtk-refresh.png create mode 100644 addons/web/static/src/img/icons/gtk-revert-to-saved.png create mode 100644 addons/web/static/src/img/icons/gtk-save-as.png create mode 100644 addons/web/static/src/img/icons/gtk-select-color.png create mode 100644 addons/web/static/src/img/icons/gtk-select-font.png create mode 100644 addons/web/static/src/img/icons/gtk-sort-ascending.png create mode 100644 addons/web/static/src/img/icons/gtk-spell-check.png create mode 100644 addons/web/static/src/img/icons/gtk-strikethrough.png create mode 100644 addons/web/static/src/img/icons/gtk-undelete.png create mode 100644 addons/web/static/src/img/icons/gtk-underline.png create mode 100644 addons/web/static/src/img/icons/gtk-unindent.png create mode 100644 addons/web/static/src/img/icons/gtk-zoom-100.png create mode 100644 addons/web/static/src/img/icons/gtk-zoom-out.png create mode 100644 addons/web/static/src/img/icons/stock.png create mode 100644 addons/web/static/src/img/icons/stock_calendar.png create mode 100644 addons/web/static/src/img/icons/stock_gantt.png create mode 100644 addons/web/static/src/img/icons/stock_graph.png create mode 100644 addons/web/static/src/img/icons/stock_log.png create mode 100644 addons/web/static/src/img/icons/stock_person.png create mode 100644 addons/web/static/src/img/icons/stock_translate.png diff --git a/addons/web/static/src/img/icons/gtk-about.png b/addons/web/static/src/img/icons/gtk-about.png new file mode 100644 index 0000000000000000000000000000000000000000..1b430a35758de19ab9462366306f904e6bbff22e GIT binary patch literal 523 zcmV+m0`&cfP)`^Fd%|{(KETZ1h0DG|*&MT1LOw=u$~!4Q z#5OT}R!Bx$S#IrtYp8Ew|9S^geh6C*z*dIfls~~Ny+>~Ck(-QOV0^Fw@jwFcpih;S zyBtG%1yh>_%iagu?}3rK1v&v4tqpk)R`CsVWd=W&uRFx!BAs-CYhuKoT3_s_XxoD@ z3R5r+MxgKa!pQblTw9s2_rDPF|B$|1amoMJXW~`6VnU-u-h)7m$Zhhc*>4Qe)K0*r=Z63Q N002ovPDHLkV1gXh_E-P_ literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-bold.png b/addons/web/static/src/img/icons/gtk-bold.png new file mode 100644 index 0000000000000000000000000000000000000000..408f25aa20b26e1d610b0f118892144f8136b9b0 GIT binary patch literal 604 zcmV-i0;BzjP)Qp?p%&=)?ObDr<>JRIhqPl;}DL#aOa zjX$vxs?ptF3&ahBrgH;v?rr8X-hKR%h2G75F^=y37%tWhtSi$8zoutD;Oh818ar8z z(jR$++p$^D9rffa*r5rO*IP!(i-k{c3{OL>>*px#;im{adm(AV}YqP!$PHR<4*l0ZY(v2j$6;M=fn`ulh*Vy8b9ZE^ck~%f`H~PSy`-?llSdIMFA|kK3QcDcdz->b zMYUefs_-^N*ZQLBZqju#g_htWsI6n*wN=PY--Dt(4vCq?_M>h>Gd~Los+_eF;}B`P zl7_*ThAHqE*6V@6+A$xRdM^S(NOIjqm)8eI5Th95g;|4kQu@ z`|l?mu)MqshrP8h#%Ns{QPiuYJ7 zhMk=q`21dMZDp{%y^UhA2(Q18q*NDey(P~w1LHjm!!>+ikwbZAg-G#Z%yJd0p3$b}ft z;M_INHx`}GFiu3bxHn9h< z-%Ma}@dp$|5e#HSuC+z%eDQKTZ5Rd^gy(#8R7N7HVd1+KQ_~-5oU#_+yo?Us~zmXG5ipjg2PLWKAlS3bNTOjaO14WX#M~I002ovPDHLkV1kq(Q5XOK literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-clear.png b/addons/web/static/src/img/icons/gtk-clear.png new file mode 100644 index 0000000000000000000000000000000000000000..b2874fb84fac2c7b8c6acfb4029c0e8d0da617a9 GIT binary patch literal 682 zcmV;b0#*HqP)hP_atBk)7^CcR)av~7N?8Q}X35yx#pg4HRUG_~Fle&VA1Rch0%zvTG;U{#z%R z^=1Yeq4RM7Y%OABw7<#^MXf3fbe<(h+FAkb#-a^qF9}CYK`1D;mgTd6%5rv(6uBzk zdOExEAUkm8{f$jNNNF}V_4GdbMrM%WR|QbZ0aW$LolI_~@oE^V)EwIC61@$E*eL=W zSPigvczA)`tyD9wsr4{iL&d1i-|R6YGn+xj^*n#XiU}6IB7iQ>=rx?!-<5@N;WD~Z zNvKt9gr(seoI(-4wx)VsRIC?yEyq)?VmW|PuVJp1>UgmwV;A1-i-p*q2ibWZva1mC zL<#;n)iAXko#S=E9$w2{lIIX9V39;YNYzeed2=LkUUHT~9xs4A`TwbcJeCc~o`&g> zi*OAVqq{xbTc=k{(`e2m^Hknu$`ADkv+`saRaa8=JfB$}O~LfQZaBVgfzTNaTTeQM z&6mJyxUr>xau!qlIKm^j%Q0_Hfn?hYaVP;3mL0I0qA<`A1nb8@jP~WAvpGqkQC|Cf zRfCo@4|bo0+j`7bapX$`gij$LqffTpQxHt2!E1wNsNhyV0KH7DeHJ7BwiZG#hA$YY z^=LROx#;W4@fvi&e<<(Z!WR5Qtr?9?$#af=C4PR6gWa47#}5^ZZxbcj)+m|dmaK7^ zE+Q#$xThma{?(g{&Za$cRTb+*Uc+kWF3RseSOKz)*5oG8I7v_O_T}>a0r*3eA5tq_ QT>t<807*qoM6N<$f=9kPvH$=8 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-color-picker.png b/addons/web/static/src/img/icons/gtk-color-picker.png new file mode 100644 index 0000000000000000000000000000000000000000..232d54f8f3bc72cc0096b906a272e6112e93c61b GIT binary patch literal 470 zcmV;{0V)28P)i{J|e{xDg^pE``->tZ`&*H6m6k3=$| zPz(#C#ZrZ}R0kSp(3wVqvagWI-YbQ|J49nKP&c5cxPln4p1RoSoG{7Lv&Hyz4$iLf zaCCkPg2WXaj6*_jysiGXU3SDjHS>9#&O`Y00p@no;1L5Qm)qfKI53uFTSQrYJ-o=l zW;9d7ZqZ+IvJ|ap-<-gu_Rlj)B$|cAy%ey5RALy~rU|QE+}j87auv_-Br7b>zflZD zYCct7@IG&x+`;tv-Z#f{H#V=WcIVm)h~7)D;CXSnC{cYjH~nY)0y@sL;Jr;=y8r+H M07*qoM6N<$g7>Z1YybcN literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-connect.png b/addons/web/static/src/img/icons/gtk-connect.png new file mode 100644 index 0000000000000000000000000000000000000000..c820b54abcccfecdcdab558937c2ed6b310a377b GIT binary patch literal 558 zcmV+}0@3}6P)N4m3AIK1fA)^w|Rml1PqHO0hn5Qvw9C=*l6oM~Gkq38+F zsRxj?N@GPg&KK6$ggKg;-=5>l>43tseRgin_j7*F_c^Bwz@-TAe(mi1%wczr7XEa7qmX9BP&)nd{{jkLqhRR%gO-fZq(An&a>LPQ zK}iA%SIL#KA067KxnMAWNOT$N8=nwfS9Jl;)DVruF&M#qNp1qzicB$GGfl#TLzwWck@Ijl#%_tV(; z`UNASZny>=7;teXIQwn+f!zlF#uW_;e`LV_#BsIIvwsh8flO{Xz6HYq<-H)#qT wrBXW=1QkT(Kd3mRoRG{d_*nWQ5B>`N0NAsK6#!Z7MgRZ+07*qoM6N<$f-9B^5&!@I literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-copy.png b/addons/web/static/src/img/icons/gtk-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..3d68da606d2735dd9e2d5e0cb82fc63cdf031c10 GIT binary patch literal 339 zcmV-Z0j&OsP)+@~2?AETAaZ0KHFG2^NbG=8yO9`bV@u zkN?~k5bornL%Sl$Ac06yD6sb_+Lux_V(weM^of*#*)+9ng2L|TMcRAmj(KN4F$D`Y@f6jZ|MJWHr zd@hguK+|bC-Lq9iQ4o+5Ufiy$rjwFtyUB=7!Yvpwur+#KPBpPIA^u~5w+Un`hfX&psR~eY|)@GW`rwfeZW)$ zERhj}dJwpvX?&+_HkXSN69@?RX`K~>3UoSEakxhxF7wCq9Aub#G!4}>3^=a#37qLU z#gh>;h6YKF^U`_?lFI%4^@f4Tw7WAoiQow}=#E6az6=rnO`V>l z?(Y4<_&9<_XB^P%x6D8?8u#SBzF+VIN|U&i!*MBzWe-9u`(5Sy1-7#{y}Khw0{{R3 M07*qoM6N<$f+9RB4FCWD literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-dialog-authentication.png b/addons/web/static/src/img/icons/gtk-dialog-authentication.png new file mode 100644 index 0000000000000000000000000000000000000000..eb411112f838eab26a0a966f028cbb643ce50c61 GIT binary patch literal 590 zcmV-U06vYSK`48yMjVt5El}rDD#x6`uOzKMO$4*1)t{M|<%K$S}LY)Sb6iP(h7-Q6+ z*odhpZJAPtXxgT!O^q{X2bdXP`0#iiCJhza_^~+2%f09P?w$9B1F%IS{0*DKIdn?! zIOm-15sg%Gd-!>(ou}TeU;SMGm*9wxNjLTQs~BeFWLxYk`F#fU-V$W@wgBEWd|^!T z8tH`;!jYgUj=FT(M4t%XHs><$Fz)y1kWB!a z0&5!4=q=E5ArNpvS$_n5BZitjg<|0uA`xG^7Yd1JRNjDPwg6gI4&NIqXjtoLTA$FY zEu&FeLcO|(n)wk`BM-fpg;~zQ+<4Lruu6AfsVC9WMVMdgP#2G3HFFgCYs>t cS%zhQ08rM+0QA*E%>V!Z07*qoM6N<$f*QpUCIA2c literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-dialog-error.png b/addons/web/static/src/img/icons/gtk-dialog-error.png new file mode 100644 index 0000000000000000000000000000000000000000..e97bc43504b6c572f589745f959bbe9b536cad0f GIT binary patch literal 559 zcmV+~0?_@5P)^VpwjAse^9Zs(h7nXg1fHXC|1z7@&$Z?-4&n03vHV=Juz)0 zi24NHea<8yphbJJ14AIpZ@zENoRjz*SBXT4@{+Pm`4(k6`d3PP7hH5L%Wx|dJRKh5 zT#t=`YrcYStfeKqUR=OmS%Eh>2``sJ-!$RoO!OBP;U68LQ7C|G z2b39pp@PS$DLm%$5p1BB&BE1nJY;k@SsmWa4({gWz)UE{C>R+03D55KPJstgL4sG)jWIejmV_m_VQ4VbM`!SV|hATmiG(;O+Ue9@-|$!@^3X(4uWP+uL9^Y;b%+GaGDs zcmsl)G{2}-;|6V?4#hRiU|uJ~Gi&j@owS0sEVFV9H|X14Uynz)6l-hf6^aCF1gjrm zC4^g21Sdz)BC$ra%3zJW694Bf2yzg^3M;3gnWY%Mmy)ncCHxr~0kiQ%x}TqiSF6ER z)d-f^a%el5L}Qea;Lh?gZfRr83|!^A*;({=cVSOY!;%$N4q?isX`oBW5q$IIWBNhrVzXRk?%qBc{|A7Di002ovPDHLkV1kb;0CfNW literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-dialog-info.png b/addons/web/static/src/img/icons/gtk-dialog-info.png new file mode 100644 index 0000000000000000000000000000000000000000..ed46c3ecdb39ee69f315fc025051e65f6c1badb2 GIT binary patch literal 687 zcmV;g0#N;lP)tj)XR+ddk$LwRRb=TSip@^b1Nt~`$ETa#{hoZP- zql6U`)D)w}Kn@(8aRm7aj;J6gf=}mMbV1Ov{&&y&JpbSGf8V{7QYvTjTFY3x1sao| zqp@1@Wo%xcqN-U&`I~4=-huKezF(;u13Zy}TrLlpjZN@}6YxT1hRV||(TeKkgMS1Z zuI7gvZVcAev+hVDrS<p|9QN@4vreL&CoRy9)p(YDFn5h{G2& zqMPzWUXg%NN8q_(8hfTNB3+H`CSgH{7l8|%v3?i<~ zBjld)l1jFZ95OwK+b+L7mbNTj- zLRWE;z4ccl^XvvmPCY0GjZO{&!*bwW7bl6{e#&;l;T+q;ciK-Oe$ zyMUdfK`d^BKJ5dLKEC#E08*qO5Hf8g(>8Fq-);R5po&gEq+&1_aVnMCPu8X8egauD VozoeJcRv6C002ovPDHLkV1g_-LQ((# literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-dialog-question.png b/addons/web/static/src/img/icons/gtk-dialog-question.png new file mode 100644 index 0000000000000000000000000000000000000000..ef68f43f43f2a1c548102d2c230d73e774909991 GIT binary patch literal 491 zcmVri)MSjK? zl~V*B7jIx#4YTO_A*F#)?+lz9HM?Qh=rX5HSOy4-_xkS7DjD2nMr|f2} z?HEl2)=UM_yA~n|UST8&h=Bjqfw>?V-ikp-Kpg?e6yd&giNYj4>!7qq+AeLG7B#pT zVPM1b0W_0U;1Y@JOVUpYtDD%Tu`9ymC3+$u%LHPDu{T$NOC)re-k5oPuLxI{bcwu@ h^ClH~ubsjFHJ_X}r(C1^D;NL(002ovPDHLkV1k!v(wqPQ literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-dialog-warning.png b/addons/web/static/src/img/icons/gtk-dialog-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..65a4d2c72205cae6fe9adb3802a85a5008aca64a GIT binary patch literal 428 zcmV;d0aN~oP)eP%MG8AB3l(og#5MP1 zlP-be==XyX1TVWVFr1n1pVd#_k~Eo-P7z*Fzg6jEPZ}V66qa>wP3qrGP1*UxgyFeG zSuY+*!&0GO2+!@m>$B@p|9*bnf*^3hb0hoD`qi;Cd^tQc&-0w{+{pe~Pi#oNhq*bc zl*<;6$C2~g$msmGesd<->%oClt5x%TAK~4NjLuK%{-)G>jK!>0saUO6vs5aD@a{%N zhwgWHEF(Q%NEYPt)@U@WUawm^oknvTG!kBq`(bX*q(R=d*hTC&@Sf`R1^cCyl7U$Q8Ifqe(h WRfxQE0Tze=00004~(ZTbV!HgdEw6AQ;Ks6pkTpj^~MRJ6%%PC1s1QW&`r%t(=(bkPI_C6tjy z5cmV!L~oymkd(3;H1KdZ-@NCU_l$-!v`yNbgQ&;WZ)I3|%r;G*$mRdq*lprdQw&U1BV7fnn(!jtv#7vD?}P?Jh68@jQk$Rdi0sXyFCu zJ5BKVwrTB#mY)GPzJva?GxQNl(VI5`r-Q@kfT?!?`i?Ge99N}KC@>V|v}Ue1v_oew zqE&Bv)CkMF`2~LrawLIxB8@bKB}szY?MAU!L?)AAd!Fan%;%GkI#CckOqA)JUqeP0 xAre`lL_8B9=xRxbq6k3{-Zyw5%ETQJeg#?5i$w+iEsy{J002ovPDHLkV1oK-!ma=S literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-directory.png b/addons/web/static/src/img/icons/gtk-directory.png new file mode 100644 index 0000000000000000000000000000000000000000..8e41b7878a9da48e086fa91c13e933df8cfeac61 GIT binary patch literal 392 zcmV;30eAk1P)x!gx2`VTFvKDqHFv^8K z2)YFQh_{)Eij^|0Xy9R(;hksR8KJM=GZUEzqmf`p;)p}OpwMivFd^hqs?}2jBoXwI z!KQ*r8~QA%@WfrQMXbxuuTgwF{;}>ZZFfS5&(= z!kUd*h0_W&$bl0qzny1`H%42t1D_urp67fx?>X;b0R9_a&}&!;Eafe>Ta_Ov)pA*- zJAcTV-Q4_$A<dgTu%=_T)WYi4~PAT#h)X!v5v^o5Cn|^U1wNnUeorP7NWMxS5((kS!W`!3 zA7JMGB-DbudIcWu0yf^h!PJZ!uDec*xf}&XM(v>L4y*Pco`@n84nVZqByJPKj-lfT zuHU?hxyQ3GS^7(GIK|@$_`K~7kq#D^EdwwSX6pdl<6|Uf`O|}Q?C^?#^_Lr?q3iOc z9Ph>Cw3`xL7@u&#v%CmFE0?B_3Njeav;A^{I{FXNR+~8=jlIAsO~U72Mm!$nQ>b16 z1(!7F^qLi8Pxs#JqlZ7Ev6oo#EFO{gD=S9j9#EX%oNhcNQ>a>+DQQsOrh84j`6gF3 zH}X4)V(?|!%4R=Ff?A^PAJqP)hLCZ50Z%8b^8sJyU)#NNf@^srivR!s07*qoM6N<$ Ef>Kur1poj5 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-dnd-multiple.png b/addons/web/static/src/img/icons/gtk-dnd-multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4c65ad5b1780ccc931fe5d1212c326285dad1b GIT binary patch literal 501 zcmV4_C{g3lEjQ)at7(-L5?1g<5oO7wP(8>yHt(q9M-E569YBavo$)qn<+y=Gr zCFWkwvxPBww!)wX9&R|f&vkvsv-Ds`j71ySoPwW|p^@YiZtoRAc)ENqfIVz>>ZrG> zs5Q!{)HP_8BATrx#Eod$>-9e3KJ*8C9^cxtRR(CZYB*LuqEI}~i+0x}z-g}yy{bYr zOsu_?;d>*&8%`syYV@6JW`JJ5ONB4}&!`$Yf?^(_0~0Ua8T0mys{$l=@f5fw&X zhiG?9>?jR9c_m}zwM-dHmU#d&6JR{Prh?-*SS%Kp+jGq3GfZbwOePjA>jp|TGyenN znpv`9S=VUuQc@DhbOHydeI$~5h>8)gzvT}IkM97;oOjLkZ}aq*dBV)H&0QeZtm&ou r%$~pOe#ZVUvwPNq0&OC1{$>6FJ;^Bd(&JVi00000NkvXXu0mjfPG#s4 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-file.png b/addons/web/static/src/img/icons/gtk-file.png new file mode 100644 index 0000000000000000000000000000000000000000..fa157156bcc70dfbd251f38754e343c7eeb7c420 GIT binary patch literal 289 zcmV++0p9+JP)k`X4%38#IWG){doe>uX n($Ih44}m3Q0|kR$P$c&oa*(zii?vC000000NkvXXu0mjf$_#lO literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-find-and-replace.png b/addons/web/static/src/img/icons/gtk-find-and-replace.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d8eeec1b2cad2888a6d1f97957660e08ff8424 GIT binary patch literal 580 zcmV-K0=xZ*P)ChBPM^PbbT!Cp6=ZD;QbZdhUChJUR) zcbyj*G&-Fz!_yxTomw>6nBD&?+;*##I!7ln2*y;*f7bAHY84M+Ia-O=C%_-{@`QSV zBXt5cDLgs@aVU>Mc@G=g`^bLXMriyC9>+-nTao0rAgLfSw~p0~A6VPm!`l@N;n{C+ zKUYYwyK7Kb^;|t^eNIh;&RBGlc*AfEX681KAOo=1MT8H2(V4qM$h41fWwBM-r)cgPIf zz@SK-5pcIyU*QBD864>BII;v*3`2+W+6BlXK}g;vf;S6U_yQsrOtFdyO!LSN6L9&` zIkY+&>3T6W2E#Dm5nW7hia?v-*Wuv-7wGy9n?zvZWj|zDMlP2{u~@`CS37%l=9mDs zGEEcJY891Ag`iTY1WnWID>z*z=;{tgHHrP7r@eOg1$ccPcIN2}`6a&p|E)jIWFbYQ Sr@ejv0000gJ5UmtT3v01CME?fG&PqE`{0Bq} zv9U-KPb^eKEUs0HK(4THw@G%{&Cd6YMRLgouE;%Rh6lrYyzjwhb{@QaFCw>@!Lvl2 zANgmkeG`hvt;f69+4=k&RE<{!RlHZjAy);JCHJ0>Hy`oh-M70TfT-u+tEYGo)`i}9 z2tWuJ5#h{}m*D-{29=YA0Zu%p@7(7&kPpA=28xI<8jaQx$8o%pz=$Y85D>@l`U#va z6Ue;0;c&Q?xYz5gc2LdTj+0<@1gGpi`$9AQL69FDtuV7^+B`?rKF`+Kll2k>ra3`= zz_qJah@yx_qp`TwTFSB{%QE)%K9Ox~;anR4dl*Mmu{NO7=`a`!==b}yS}jC`$z;NK zJSNX`FcwwC)kjeAs4B)lyWL)-PLhPOEGdeDq9`cK67M};g{rERIISF^ooz^(rVE2K zO;^N4QQ!eprE+d&V2$~{|L5<;?e1oCl6sOPq1)}^oFhq+6>(7%;NjGXjYR@;`QGbI zWB3|bw|yb}85tAe@yyPAH)=a#@a(%wnV86k_}~8l{qqkxRs1~800000NkvXXu0mjf D^vwPk literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-fullscreen.png b/addons/web/static/src/img/icons/gtk-fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..8ddc31e748131ccf458decb48d074d5521ffdd76 GIT binary patch literal 450 zcmV;z0X_bSP)G?ykYI|n#2|y$EIrk`xALu^H3aJ;RM2KX_m@A zUfjDx-&_(+gK=(9`WVTiu4f&M1DkBz??eYK!H&14%pUwu9Mh)ix-PtL%5UN?By>0h s&x7X`%C2(o%QP`Hwh;6>hsH;vU&Na;x%A8WJpcdz literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-goto-bottom.png b/addons/web/static/src/img/icons/gtk-goto-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..be52840dee1fb4ed6088c43b3a796ff907ce397e GIT binary patch literal 574 zcmV-E0>S->P)=K0L?NiH_-JA}R2!j0OQJz*7Zn!< zbOJs`O?;q<#%IP@td$#K4ch>xHZ7iaa|^P79_nI{0QNvxxe#aar{ zMBZ-B-vW@q^}sk*4@a>0o5B2n6|;MNnDl=WApZsM9@)|9R-w&Vf=@FA(A)Dc;p=(` zzyZsm8tpDQ3^Rq$JEUNLnIE(P0bJW)c&jZsK+;5UR}Ur8Q>W{J33MzdVVo;Q%k(QW zjOBpYY!%+F&Jr*AqNdc85%L_e*f^SmH(-b7FAI}f0pq+3EpsoSU=m>4ZUwVt0Q1uT ztCvR6=cgycE36^WQ7p~8IdkpzqkFjmmK7z;D{|0IG1Oy8C>xDM*+>i&!yH^65B1>Zv%GI2nwy@-V-8ka!}12;_O* zhuDza--WLmO2Jg=On_#Ampc*7To$a`jgZnYAu=1a1>qj%^b^|-jd$);R4pgrEtd@K zk2DPZp;2slCgi@WM$!sfKltLjf42rTo@CT*roi^E7Vn3o=ec^4`~Lqx#Mc$HEUCg4 z-)nU5%Fx4=hk3J*`(8lg9{C^RLjyh?2K`OQZ;rpreN$u@kI|z67m$2pz&^|GV*mgE M07*qoM6N<$f?i$?ng9R* literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-goto-first.png b/addons/web/static/src/img/icons/gtk-goto-first.png new file mode 100644 index 0000000000000000000000000000000000000000..3d00e36d6965aba48b6312ed1deabbbdd0a34f5b GIT binary patch literal 573 zcmV-D0>b@?P)UA~6gLX<+7#2kEy)0>|{S1IeM(c{>mRZ#=|Mq9R7j$^# zSHc>2gq4^Rp_l`K-3fTNKVa$GJMf!hVq6ALYbZ;8S~aHTBX3~!DPi#_!1^D64K{!c z-Ge!F7p6cB`aE*z-8aEU-(~}5H%4F!_n@DzMZfzFj9=?8=&OS%Sc6{Q4Rm>~;+gvr zG>hfXa24R9!`T44U=W}Dbn+S)$7QIT7onUkMKdQsi@OBOk`#}LRKz#WN#KkavjMky zrAhNbQ)(p0;Nir1C>$rzG;>-EP*d*cCcUDOO%d90}t+#`?>Dl!*y}rMdb#8jnu{gkXsV; zpvt63+27v87BizV$y3>0K5f3?l5(Sv==U4a0}&&AAw69lO*-4lzWo=VGzz1p$LgQ% z+1r?Xr!cvX(>K#X^MG!%2vtLy(K`>&AG${m5ATvwyh(bAC&%fH*U;eGLEWUB3)2dm z^Bq!+eYNsruANG8r<6xgh7?}A7)RTLmDrLKF?3QIZVZ&t6e`1=5UIGfX=SZec|{24 z+XJFW2S)!Pw9gdif@SDq+wgwtl!gjfB*Fa6oY35q0C+ zsrAaxX8bq4D8;qVQ8*wlKZJeO!tk7h(T^4!pRG8)SPKLgh2?);UMBG6T>UT6H)L3l SX`GV)0000ik z5)?(ja=C=2X;`n<*zIW7;pV0Mao*T(we0oTCG|keL>`ye3|){Q0>TSU2)Fg$RT9sYUhv}9lFr1j!wQ+ zq}Yh9<;z_XcjrFG_}r`a`@=O#&-U8h@6YFXJ*P&nk z=K8n)M&fpYw0-`0)?B%c)%J{Gc7BlqJ?B2rvE&~^eE8JY!P`iF8}ODMQ=UE3fgjSJx2Rx;F=ayAA?yLzXNnVB^sm|u<4v5(R5VFC*l8>WAlpnN$1 z-=r!;2~;r5SrD30W1}3((e(l`-t>3fO&4g zio?7jxcKF)kwc5&6A*j^BKfNA-87d^?X)sUp+3B5a{u976Op3ji z^5GF8=hgk6r$%XAmE7L)y`GWVOWT=R6$$2fd-F{+jl($@_{Q(lD zqM^^;N5nHNF2PJP4vra6-8#e`2r6Vq?>8;ef7jXBSEMJ;G*h_viS@dV@Rh{NF?HT35Ru&fwHo{htT;MlF3JWeB_CI zK95W$gV*b8UBn1$Ox?d}4fZOb3%!Z4U5uH#m+1oji|jx2pvv=rh=Iv)LqRZNrIm z!G(=YHwAdR3wG(50;_>EIGYQdPKS0$)&h-2gN7cjpg{r7=ER)$mI7w}3d@`W?RMK3 zsMqT>^om=APqb2C$tGabs-7wQOEwr1KXbnT@)ZU_ T^r}MZ00000NkvXXu0mjfXadiT literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-info.png b/addons/web/static/src/img/icons/gtk-info.png new file mode 100644 index 0000000000000000000000000000000000000000..272019f5c99febff0abd9898ac73018b815208ec GIT binary patch literal 738 zcmV<80v-K{P)5y=iO_=3F8A6=6D6Eva?Y%owPyCrK4}2{vlE5Sj|t0GsqNNujZ>lV zn;2sU^AD2GXK0+?v+5?diXYD=>zyIg4=5;YpG{uSPi`^BoI?dvYDafw*>J4Z9)xjh z6-~n{Xc$`ITl$uXC>jP8WR{P_R2oNjikGUKb+*D4Gq_fub1dWLGX?hs-$|l*d<_Oy zMEZ@xVYI$l!@0`Q7&+vUeEg)=v8l5yqP#DN^4=isI+t;OG=d+$cky#;7uMJB=}Y{M zFugbyIpk76muGPQsS#DR9Sf-J53!o8ytMucktf~;~|40At`B%dwQCobdp zZ9Z|FWssYep>+mywgA+k{fnkKT($aeqbq>2o*?%2r2wjJ3Vq^?3-hA7cLCz~0nvfo zTx5NlsIrBSZT3i!D{Wp1rUY1(K5-c@=~;xvGLukUvzxgE)tQo^ZKGI|TAVFMh-4Y( zklo@D0txWRYn`W0T(s{M^9bW~@z6H8@*;_8TJoBw;@mY?$ytp1zaW`}eB8=c-{03eU_HSM@6}jYW`eoZewBIVpjZ$Waln z@qf70>w|GrT-%ALxVlk1aD`DLFvgg}+!XJy-#JrkW>O@6J5@BWN8>j!#t!EH1@(fx U!@~!6wEzGB07*qoM6N<$f^JD-LjV8( literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-italic.png b/addons/web/static/src/img/icons/gtk-italic.png new file mode 100644 index 0000000000000000000000000000000000000000..26c57226a31ea97d155ef323911fab6fea21682a GIT binary patch literal 529 zcmV+s0`C2ZP)q)5Jl3Ya0*(oU?aARVTe~<9olyu`GkhCnY)T!cz9mE_xn8;Psu+UU9ZTTVyCnE z-Te&e&$8S0BG4x&0F>@tysUqF~hkS9+QaWL%+5dHKsW%tK)kS<67z zBNi7>e?wdxbblbR#4Z|c&63(KA3RG*P(Ko`>-O2L!{L4S%KZ@0bxn!d4lnNdH$eTb zu%=yTZ0HY?<*z?5z`d7iJH2T=D;!f_6VUHo2lYc?wUuY|*FD+LN(v)^7_@EfU)AkG zIlY~<@aTTF3hIR$Z+4Ywth^+=*~0kz7Bp=xQe~N}`+cvzI)T>FPoSRPxPdEGTP8C@ z-l*)3Bw@VsT4q|F7X+3fr?pwjHLpY0QgbN(C7-F_)6O=Bpe6D=H}0d&v76&D?i%;j-nd+`~j zdl4uvjY%rQwatD*(4 T{q8%000000NkvXXu0mjfU*hz5 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-justify-center.png b/addons/web/static/src/img/icons/gtk-justify-center.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f514298eba1019fbfb7fd37ed676bccf6b432c GIT binary patch literal 251 zcmVy?>t=AuZf4pul&(w?s;g;W4gwXfz~H#fK<^q_YI zVBzYzw>9hl)09qWo@XA=b={H5fN=~*BETP8APFHdVJ)QyF^)eaATzeX0*b~EJb3Sm z0Q_x=p2>R$&RHHnFXBsd*;)g}3@{9O+Z!H`$0dkcj24XqVgZ{mV4u7AXw+JRQi=s+ z(Y03V<-YGhN=f@gk_F(w8Rf%7dXN68&1SJ3f002ovPDHLkV1iY~ BX43!w literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-justify-left.png b/addons/web/static/src/img/icons/gtk-justify-left.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb76b117ebdf11d2de39c9ea77ea3f894a1143a GIT binary patch literal 240 zcmV$ur2Ln5#mHEzQ5*srNnSDxypNZV=>VV`FT=GT4$va>p!Wg5 zM(a9`J!F7&U8)pgqydaEN>zZ8{sSmRUzPwN%uNY0^E~?^055#Vdk4;0u+}_lR|as- zsbAPZMF2+K<7Nqr(V(>^0ciZXtWs@LZBo7Mm69X?U(8|~^EOH;VVWiq@H4Jb>SYu{ qB;7~=9@HowCLB#{wCHr+#`z8ywq|7c^Wg3P0000qYn)XWSf(@ftwIfl0UL%nqBCO;DL7r zVB_q#<|%oAaU2e5nx=g~S(a23#iqK>Mgh1K(vsl6CG3`BjE({}OR?6#9Q^}N!_ZUT zcRvsl2OuhAY*SjRT>xHOHk>5;cO>CUe?fz-!HwxBfda0x+D*ylh07*qoM6N<$ Ef>f_*NdN!< literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-leave-fullscreen.png b/addons/web/static/src/img/icons/gtk-leave-fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..15bc8ab7d7bf74f32a3452e91cca5a7d46460656 GIT binary patch literal 448 zcmV;x0YCnUP)WMRc-+~+rEq#!!P|QWN_5>7dGK)GpXd2~-}~~l06VNK?R`p_71*SMiv@jJ(+6& zCRPqXXC=-huPUHY5y9d;0JA4412EXo+TINqT#+jFB%ulrMG;D+641ce_fzd@_ zIYH=~_5(IkKt1E0`$vEv2*7b1Fl-Sr7x$3O<>4X!1VxUQ8!P!VODLDiK-08Bxc)Z) q&+}^f9S{zO<#(VaX(4{rxKke_o6GV+%>@x={!3@3lO#*8V^FYQ8l=P~ z1U*D$F7?%5Law?>Ps4*uRJr5g)@J zh~Z-f{3Zh-`opIpG7*w}i&9b!g5u($L4`t5n3$NT7Kua(u~?iemPk?spPijuB$Z0! zh-5S#_g6vg(OjS_E8RS+J455R#+sgvi)51*aR8N~OB|fuXVCTg&RD%ZB$Qr6ra5 z`T6Rq%BnQ1xv2@%)?L{ypr{}WZBmeB8Mv^xz|}Wg-P-F}xbkC}>$=q$Y`)$w+G=bC z7(o!A)!0n)JO}-OZ*XaO0fsh$@Z+ZsY)9t}PVheD7r)O#DinlY=03B1M9MDFRG!X73dgi)sn^?g!$Oox)_~O+ws^8rE)zo#Nib2^=XFyEntp)u#n$OGH`wUH=@bXMLLOn5 mBy7Jx2qlQP7+!?^kNg7iVPtDlEeYQM0000x_??I6$MgKpxj5iolpIs> zo2$fB75!fe7TJLj7u~j^Q(*`@^+o8?Ojh5dn^vpU z`x_b>AlW5{99Iwm>hKJ-Ivs59Xk%D5hfJ2?w87B2qSYQ4ZtrYkIF3W-$H(Z7PQ$8R zuOGu-)L0&%!?(a_G{WxV$CyH)fVl4*ipAFWfua8NiJor01qKYGTp-rLvn_GDkL z5I}mDu?qsT$prfcP6+`tokXb&jq-UG`Ft0)*A+yklIZ=1clp7g(}E}6fp3Aw_a}3Y(!kgoXb#&7` zleJzP=ZRynOVSDS@X3AJ;k13UjF^M~(ml645O}>_Xm?&_$l`+cQSSQmwfOwqxk2aD z6~P5VOWB!OSHd}Eze;u|E}RttNPmiFup9_LoBdL5Zr;s4UU=Yo_1d>H7!1POcib7` zrf<0J`ThP~Z$cpz*`2gmg#gl*mje)lBVp)pPWqOX{Cgtdh>D^j@(4vKh+7OS?xiRS zMk%T~8jV(vU2<50%z$AS_>8Pn2^00000NkvXXu0mjfZJkq3 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-media-previous.png b/addons/web/static/src/img/icons/gtk-media-previous.png new file mode 100644 index 0000000000000000000000000000000000000000..756899e0bc11d43b4a9d3e782461aa23de7e85b0 GIT binary patch literal 686 zcmV;f0#W^mP)ZxP z`F5#Ps+CA2wOXyVo;sQZ)zvj(fgt3>f*Nw`bULWfX!aZG^%IAi4z3Ycl}fd{qM~A- z!Jv1O8#Of_%Fry(>-9wiRrxS+Rg_FS%Xgj;oVX?qo2uutrN<<5$q^ z-I>1Y6W0=R-bY#L9InfVX2IfO0FK#hVgcQYfdG6H3aR~m|E`G}?t3${)7}JANnk!`gKBQPm`NeG_D8RqY567al U1V*p``Tzg`07*qoM6N<$f~FWgr~m)} literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-media-record.png b/addons/web/static/src/img/icons/gtk-media-record.png new file mode 100644 index 0000000000000000000000000000000000000000..904974c81e5c39e7758acc530265109b1f2dc05e GIT binary patch literal 594 zcmV-Y0v#BWY6*ilww-bux3uX`W;f(tJJR&ZZWjxHy~x_kO=~&*L%x|7EuWc+FVNJI0>G z7<)$kIa!e6`!@p6#fKjSAt40<#mvr5ITsE?U0wb4)#=otjD_DbX1*3chmXG4?Rjl~ zAK6F*$*nD@>+48uZzF$j0CjP(6s@W{B$=TCaLAbOp{`EJlTZzXz!w(4=jXxa=D=rX z!Gl3$cXuKBd_{W6(+U99>6iWfVtR8E^27vqAOJo&39iRuV~|HjA(Pkk_V7s%}9jEp6 zIBRT#*xU@s;eg!R3)$mAf_!Rv8sA;60wr`@0lcM={Tv@JOHL=w8X6!rH9=}=f!x}9 zX$gXzTdl~<%;2-tS~_Cv&YwN-p153Eit0Y6?7D!rwc(rWS5o@tFDg! zb&N5S=~Z%Ss+{!sAd{GrP_@~h=#Z{1*06kT*6`BRTaqpZca*?dBMa^Ltfy literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-media-rewind.png b/addons/web/static/src/img/icons/gtk-media-rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..9c22d9e27782525242fc0a63d3d1ba56ac1d6001 GIT binary patch literal 704 zcmV;x0zdtUP)-gAP@@00)Zfj&*#e$5)za$nJh2n zlaqIEUyzfNlc-QAq!}3*M~FOi-|^yOAq0&E_DLj?1F5O0hY3P$Mh+C06s>3P&)!_1 z(P(%Cp%KgFdzBi3Xe~XdU1~S9(j3RZ(o@=yTrO9tR7dNz+T!_!rurbmgyD(O5};D6 zajc@eA|*FBS6Nt8SbpZL?uEXkY1QZVMY#FwMbmR<|M#Sin)?R^h9E&|)yFGXIxe#x!{18`}10eZH4v%V3KB#C2I ztCeT5S|o;!%lckp_q#_=9?${W4;l1gG#Z7SR}E}8*)?}(us`JUuR?aqcXYOap`oGg zElf;KBu!3CN{uG+M*o1>?{rOvVoQvs9xy&Wh7aGfT)5SD(>H2+9FBR?cn#QWw(T{# zT&_5mYgS;l+q3#^o9|nO2bsIp!Sz|EGtKFA;!mGVWsQtJG{-#pRrvYL436y-uh+}- zQdEj##&M|EczudOXAeciQ;VAa mF|fZ0gpj|3i$e&pf6ZrN;$&-i2w9~700006b5kh1cXBjcnIqqv_KU3k07N2iXMP)2;dTMin28Zh-h0VPzr)j+8SZO>yX|(n5$(U&`U02W6qn0o0VjLFsn?6Hf&mN;W9@i6 z9y>r$=jbMUO#q?ah0$1o*?bBsU4`{#4H)n2P$Y=YD9R4_e0~&(g~(QaD1b7RVX>Tp z@vXyVvo?_*0z~6sOw+U-$g(VoC!+)y$bC>gWtcB!plVB4X(}w$F9IY|G0ZTG9VnN} z=r)}ofHV?eqzqtUBGZ{-_88>JkO1jS5|>IPJ5a6FP$ruqfGB-HZ@_~z6s?dm-|G^9 zVefFITCoF-Mgy_A3<0`)2j2L$*=@61(0PA_*4qmK?h9F5uh;EBv&o_S1MB#Vg<=kK z9B2PXq9CBhr~J0~TmYx=ykG(QV;Bb7Mc=h7M?IE?uPB8`T3f|^o^ P00000NkvXXu0mjf&Dpfw literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-missing-image.png b/addons/web/static/src/img/icons/gtk-missing-image.png new file mode 100644 index 0000000000000000000000000000000000000000..cc69ed33e4b87785bd266c7718837d5e10c1622e GIT binary patch literal 330 zcmV-Q0k!^#P)VHP}F#2nB8nnzmvsm35kWq3okx0%+7qXFq_5s#o3a; zOqQJhZQIVlOT3_I8bnca62_Py@HR@E%J2rO_6pZoEJ%1xtm6D^OJ> zn!2WMjk0uYhbVar@6CK$fqdyQ1m8(pc$)?kX{%w9c_tK!{eeerk&f#~?_jBN!^P~QkN~NMp zOVvIy;$Q!*(UhEwN}4e#=?EENQ0^juVz^vQXluJ6nastSv_|%b4jb~Q5-F_DrBX?F zbNqS+dhFS#G%--C)o?g$sI9G$Y`0sbn%T&}ZOg%^<1mbQ^g79=h=8<;vnfCPjhVPy z!5|uqLJ$P_e7+=$wT+Dpn8^WC4VfUh81bGY0IOplYJGi8)}pi=gNgd1+W}JzN0I=; zUN77OZE!rgfV#m#y!iYOo8Kcl2Q04$=zr@(_m`{Szv|(7r9&X}P99*E0o)yQ!Z}tB zevW}Vz@f`uh2^!modH6tLA1Wq!#!(2*Pe`Ptu)E&|A= z-+1z#NBfKxJxeS+0VD1_vtV+1O#Twpw+@`I>B@@V?9E2Wm3+*9`v}*#3H?C}+`=W) zKQBP9m&eo5$MOJk-|?A&1v|#W&1jx1L!<8^`T{m|2!*))hC%yK9TJiSly_#>nugA8 z4J=e+BxJ_}p%R^oMc`*Sw2W4ucbHEKlTVZkP#JcobDF)s>hGVx;8G3l1&h(KQ~=Kh z3trEAu^L{%)>b?bPB`fmQpvyG9I+pSwdELECs=fUvY@E?B(!=4Iz0={poPbpg>Ks^ z$s^W7FeG|GlvY8poPvrl`7|`zG-$5vL)jS`<)$P9SVs1e~e0}gIAh9u^1B4rBdO4 z06H>tt)N^kadS4CHV&v(Ra7cvG8a)S=8?&yaGks~3?TD+*FxbD$(t+4v16Rbkv4#F z9e{Vu=O2(x-$9m-p@mTZneUNG-QqlcifA;fGt&_L4Onu`K&9_*wOX3k&!qgSnKkJE zT{PEEF`Dng)gi3VINP1`KeX>1{#3}*3x~D~Ea*le2;W8nVrG@hd>h{Y+htp-gyFFb P00000NkvXXu0mjfc#YQ? literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-preferences.png b/addons/web/static/src/img/icons/gtk-preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba17a0ab20fa8656c59d5f0e70903d9c0db8188 GIT binary patch literal 339 zcmV-Z0j&OsP)J^0XjZ~X-C2mhEijCZ@<9c4NaB#}!@<$;HUV4h~Q zNV=}enx<8%s&;F@oZ2vqZwV*mIF2w)(`ryONz?`yj^lvqy5M;p!}om%g5WQ7oq<6G zhqFLYlxwi0o6RlHvVf1%S{R0~xqslH(q%!GC6u!uiXyms-tthXxFAUqc-rlGs8qOx ztC*%Keu%bh&!mJ9!27=l@EuSAE9>#)m4}wk1ji#`ZRL5oEQsS6wr}q<(liwou-$ea zG7l!?!Y#1f_VVY9vMm2OL{5-p85BhURaHS<*U+{t^nDMfe?rG$7@+GqXqsjw_<{9t l5nwrASk?i7l@QCalwb1IKIcpBq5=Q_002ovPDHLkV1mA=nhF2_ literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-print-preview.png b/addons/web/static/src/img/icons/gtk-print-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..ab15fcbd307a1bcb481cea1c58a0ec056b1dbbab GIT binary patch literal 616 zcmV-u0+;=XP)H6HJK3`QL*tIO)T zjjO9GP0~>?=X!_9Y(&mxC|49RnJo+^J>hVOL?WSbv%qSz+&1<|B3R)~Fpe~nU~cs* zwOS4JeYIMp*=%xodD&SY8M-gZjn zMc+@CI8hB34$nAlTo8yW^tf`Y#$*!O*bvM?4?RJ+XGT0eB~rxI@C&--&AmaQV6AM+IqM29dn!+uiq@XVZd&GMlzXf7o4A;6N!Wo?PSnu5%o^cb?+{ENr&E` zV|`tG3&$9#R0>Jo-B}Qe#fV0u`1}hvCdNhU=C#wEPNx>iW@QS6f;JcbM7yBTXmD_F zK(Sa_48%B&44xD7Jj1qaF9pC3Vl3aF8jlOzFImKmPlRKSV2Gk$-k_{9JJO~8pffv)R>5VunSrtEg- zW~Oc1QvoOMP!t7JRRzN^pzFFr0pB*Ut}8T61Ey($ZQI~D4g^8)Qh?2T+eBU0M4G1H zx-Nua2vHOr3J^|5aA%_Ldx+y0vMhTF-uD(f&-=Oh8XrAh(mU!77)qKPvuhIn00000 LNkvXXu0mjf&yR#p literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-quit.png b/addons/web/static/src/img/icons/gtk-quit.png new file mode 100644 index 0000000000000000000000000000000000000000..50b5144660b101c42a16cea03313fbebdcc12687 GIT binary patch literal 394 zcmV;50d@X~P)=LFJoaPhQFjI&}ubNt5s1hnt!G~H zk1z!0SZBas3|8DgvG`1YIKdz-_W-{0d5$z1pB$)EUQsF)36SOmOeX{ac*zb22&q=z zJwP}z)S8BqG`8Klp|hRIvmC7#qe+7D-yvI zW3KRZ4yfuS?I5N|*i-`^z!_)Ra|Ub2L2PBmx*Z~6d|t1Ac!2fOaU?Q98#uY&^R;8x zU$zQuz?u`VaV}x!x;sD@so88$@kYz>wfNa2cCTiT)I*&w(x5OPOv#eZdg&}~XF^Ek o!bs_}Nb6Cg?_>h{{h9h7Ked>Kox*O`q5uE@07*qoM6N<$g7ikJ2mk;8 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-refresh.png b/addons/web/static/src/img/icons/gtk-refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..7474728b4c081aa49e8905e5ddf136ed2eb25ade GIT binary patch literal 753 zcmV&(Cw7bKbLxh*q#aRUMt6(!NT_ z&`!jrYrOF)tsQm?{K-H>SZ+SBWyKMbsy-E`r0blZ(uP60aNoG7 zNY^Z&;GCG7rcQ%Rz-F0kPrQobAJ$o@qIHa_+QzBzi=EmnPU;(dwsNlyi4bs(@SY+)Cfs-9sdeX_b}dX5JH#|Spa34x^i_XXE0zV17Fw|OhxYeI_G zLSc7t?Kl4nI%5<`0k@3UdO0a7v}0KJN`Q`Dt^1plTkjK*SMQU4VV#_`1PBs>KmcGJ zj6gK7?LXMbYF9?EyLqy^y=23DFAc*%g_4_OhZ3%+Ks~f0r@TL2YO+yuvOi^Wbq~A9 zG%`z)l8mrXB4g4t&a5)iqvTtLE@^}aF^J6vK_G6|1|^+l2OZDX^Z3GEB*jVu8Ht(I z?vpp0*cS>4rN+SP6 z$_j*(LW2)yI(Xtn!(wCaG?{+PQOoxk(wnBKvTcHjYRq&;GeD2uS_lo8cnz!$Sy%*+44G}%gA)aQ j*tP?i+Bfj;4qfg)L0X0m1`=f800000NkvXXu0mjfLtbX0 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-revert-to-saved.png b/addons/web/static/src/img/icons/gtk-revert-to-saved.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf54584edfd89944ecaab897916cd1e6f9ad39b GIT binary patch literal 413 zcmV;O0b>4%P)o-E z$r|$CoTI~xU5D(#k2^E>oZmU;GRk00t*yr}1~ba2MTfm!Pr`8=#wvW1`8(k|f|{a}G~MB^10(03YYRBq%sbuM8x! z{a|AnXeWm09O1ij0$7V28x-(m6|Uo+gap$3DVNNCf6VQTUxH#ePxs(=^1eVjee>`~ zH74Z_R8@thX~9kidZ#nO6ELgE$Z}9HE+hYgoD2Rz&ddD)o;sOpFv9q900000NkvXX Hu0mjfdIGgu literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-save-as.png b/addons/web/static/src/img/icons/gtk-save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..1831e4e0a4bf1a31bcfa51b0469854c210d99c0f GIT binary patch literal 560 zcmV-00?+-4P)P z$RxRUUD~FgZujmNtgUF&LGy8qtb(Mu!Oh`Yol zfu<{WzPC7CJFR^;+_pw_(&4$-=3N-P75I4JMQr!o2UW+KoW|s;ipwL9%v1JZvt#J| zkv|HgpkvkPsG9<*F_<3#ran)`fs7}>_k_5se`4&hA40PGIwcerel(~iV$9HQdi zw(xc<4*P>yh-=J56Y$J^!nuJ-d{%c*Tg76LCARB55=_&CrfJAzGEfs=(K{YyLI3my z#$LwIB#pwq_?q@9qX{x76boR1co;tn9Hi5Hs0J3adX^5Yrzu+~)Cek-3ikH)vGM*5 z2gV}`oW95}x_ry_1tR(jIDlX{NIghBK)oJa(^;VD y8Z?^e-4ckJo1bk66$@(168yay3S0#K6W34JD$xfrgQ>m%0000 zL+g2Es#UBMk@C_IlJE$H2uUPWI4II5<9KZiSD_qnqfM+#>!YpsW+`HS*FRboO5YcL3x_bn?_Z3S| zn6C)VDz-a1xC3PYdoY?+tc;Dp)FnVRY-BkzAK0F-el095$8bWd#PQRLdM2MRv5s<5EGjEr9g_uxhFu6|5+wgIpot3 zth@SXMvL48SJQc4S=Ml}Soa(0bXR9tvcvlT0000ZLQ$kN zN!y%eGBY`!k4+Qjcdtc)l({hji&=;LfBT=!Y?Ehc(Y*53yDi?j2>fU0J&oB!$?u(C z81x~{YoRp}jT$lO00*%UBJn*$qusNGym# zQlgNR7|fPojNhK5n))=Sb$tN(03NVNjU%B+P?9oK5e%4gV9oD?Yi0(k8$JOD8vwK$ z356&DEv+D#R*}kR3^+A>7Pp*E5mPvE+JZ%|#|Th_SW78Fq#~V7B9luYn@=-fXk?Ut z47Z#g#h7i}0O*M|7Ul{Wcx_X^z?prTk!MO`o=(>I!upbV=dH(_Icc$=g zdK#NwHc_q=3Ba~j*Vpmhx5oL?xjBOawkNAHilsbcMaG1~fm*%FfNM8wxaWGr;=3*v zzW@AT0Py$v{2Q2k_8czZV8nV6;b<7mR)eG7sG(Y`u&Y8TX9R40`-;c2ZY0zMFCMc^ zU?;GP_E8&$?L)L$P3~8!WfaQ=Bf$Uh170pHh#gA!wDlP$&kP|D3Zna`i%#cAKw4-t z>+GUbE*=BuR3y_HUd+#nLv-Sm*9*_`3gVK)r`_px*hL>usg?iz%5UB+ZwEuW81xD5 k1wdN9&Xf##oqHPdU+wHA2o*aW761SM07*qoM6N<$f;vbDT>t<8 literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-sort-ascending.png b/addons/web/static/src/img/icons/gtk-sort-ascending.png new file mode 100644 index 0000000000000000000000000000000000000000..a648fa0d359fe876594385471bfbe0fe2b62871f GIT binary patch literal 371 zcmV-(0gV2MP)u5rwCY(l&z2r2PB}+FHiL1>I_7kOR9pO;y9*=``CvdC4%qh|0=+d zl`WbipAdj)o%JeK$Rmh69excVNQt`g75*i_aH*ihk9Ph@y5_k9qRx7MT47V zwySn(y@Ix*E(gKelIz~jf}K5WrPeE`y2N_Kn;yIlra;5c*;*?!n~lk;`Wt)_bh44h RM0EfF002ovPDHLkV1lP)s`3B; literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-spell-check.png b/addons/web/static/src/img/icons/gtk-spell-check.png new file mode 100644 index 0000000000000000000000000000000000000000..698f7c24a4323e174539df963a9261d7b9471aa3 GIT binary patch literal 485 zcmVXB(GO(ku|c(wFBDAmyiJ4w9~EYQY==nz}2_z#+hm7TC4 zBC)dY7qG0)y_d?UWMa{i{BrJh?svXB!&R!))OkgKiqiKSYPi3}O!WkuoSvX~USOT* z4?-P*&M2AzqSfxe%320v-cgKtMquvkqYF*~ol(?ZQYM(y0T0WW3_O$LKW2VlfEw>q z0gOWN49UeM7F1a_Qn8oYgD)@vwDF_R1WyZ*K7}9hIZRSo)ku$wh2fS`>Z(}w#!;lm6$n9q_J0HcM%gKy$ z@hIkq?zh>H&Fvyo9dLMbfJ7<|tKH5nc+wNeIHVbg=|nn?WLictB|~0_!RB!M4xmCs z6YJWP30+)GYAA0g3CH>mLDAi=uXFW+qJI-ljhdSJ>E2g>qAzbewjg-X0CLIt&WlM? zuiiI<1eRHVThZOn;ns6Iv1ElvG&kE;|FZbkpD{#Px{ bmTOg?1~qU|LRS6%00000NkvXXu0mjf+OXc; literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-strikethrough.png b/addons/web/static/src/img/icons/gtk-strikethrough.png new file mode 100644 index 0000000000000000000000000000000000000000..1c11f214622a3ebb51227d3c846e65a3decfc454 GIT binary patch literal 459 zcmV;+0W|)JP)v|Wk$OiEGz$ShFC|deFb>%;`+@`t+RS-;g^g?;-b0Vc zALlFPtO*b2`oZ;hHyr?8hmGKF%2P^ZR)t*WjWIi6sOfi;Qkexlv#Qrg6jMPEC>esg zDFwXtnW({e1S75x4A@UW>pTae=Mu~tSFpH!3!c3QtDiy5z!nxpzl4ig%w-jwvqa|( zL6wRjR5J}fvAk=Ei1h)sV47eiSy0kS`^6eB$W41dNoi6nw&Z@l5H(6VMQVq4pt8>c z+-BOJG^wV^=ftm4jgv;sFQ6n7V~IU3o8kNmd;q6cBX2M}_p1N^002ovPDHLkV1iSP B#`ypM literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-undelete.png b/addons/web/static/src/img/icons/gtk-undelete.png new file mode 100644 index 0000000000000000000000000000000000000000..c44b940c03b7b61c78e2dc6f4dcba9d42a39c002 GIT binary patch literal 875 zcmV-x1C;!UP)z0^7r5Nd=lrA$d zL}JoKst30uG@3?cj2X>{af^Rvx3PnV|HC=w`+nzq|L;2{0M^Lf$$1ZvlFDRFve;fr z+!MTIwhwoitQQ@q^kH(QBHFtWzdF(EkTWgQ#oc3;#&lg4or%TW>N{v|X+~RnE3TGZ zg&_1K2xytbX3sj(=;b7bVgwvILe&XEL*{eyb+}xZ2Yyfh?CkAeV`~E+E(fC680c~{ z5g-&mEQtlVV9|-;Qo9;3nU$T6Yu8I~v!V>S`Pn!dFF|mK5bhps5C#j7k)=gZ@fGMV z$;rzCDQVsaICz9Qo06)+gPMDIR8xV5#yT`LH{#8k*LcxU`4> zba157=T-y$NM%wKQ@5bx)7IgP?p}+qNdV0Ij(eVyXpFKfgQ2{P0k_<0&aHcI9 z0mQ&^KA#DtXbUc!HpTP0S~R?<$D_wJxKVx``2~4MyQD#)T!xfXHNv7IK|FYC1W1A{ zgz_kJ47_(kaJOiY!orUCBD@e~Lz@O&_ZAO|AU??Fe+*GQLvz-3g;f2vYe++bbWAGCPBVE4u zJ;KM-4<7M_VlXgJ5P+mU|E zTq_lg;gC(*))p7Cb5TZ0(u>M)C?w~8MB7*5{{dfKN6ZxHtx*5~002ovPDHLkV1lYX Bi9G-S literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-underline.png b/addons/web/static/src/img/icons/gtk-underline.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbb5d7e60a8a6c2ba9d2084a7510d7b0666ae2c GIT binary patch literal 539 zcmV+$0_6RPP)%8%7H&hxF;}kxw_Z&q zm=aCtLLx=csaUxPH0>vp7wyKY=)CXK_gt8nGX*{H;XUU$=Xu_*CQ+TY$;pNF1HZ%< z4EL;Q4qF9vvc0`;R$2eH1%`Xp4&&v&pD1b={5c)_4(HI4%0!}{!5Z%l3^;cqc+q_4 z8NL1(hrUi$n8@N+80{k@cBKaf6xxEZ;g@T87_4wINGm|*_=heqA-Xq5fas1lsq zKuMEKV#eR-Z6PwdqsYJBPkg&4AnU3(emk^)TXGC7eXr2|Xa$b&J9Lk&BJlhJ!c$*_ z{stv25oA>M#CMs~Dm=P8i;p@6V$k30Cov-tI%|LooijL7d7s$xCm{W@XTo3~MU`_3 zX_wq|+SGOO-xso`Eq7CC+a&Z2VR7e~*m*&@Ycth&4~*8-<s4TGAm3Zf{HF?X=QZJ`ksEl4~V`fI5~w6QEQkF9XKq@%~^f<$|Bd<-wyMNj{4LCCywL&TI^8Vq!Szqc`ZF-EE=SGC=V#_eTY?&*C6aH=-!Z zex%>cZi&Nj3-7eU-rEHC6_#rk^M!+nW4(F4R9O1jU?9d;aA~s?72eLp=L2yO78AcJ zpjcSQRX~X}Yw~JOt>7GCY@0Bx!Hak99|(cJ$a((-)R`1~V>Zv(2?`obJzxX6p+VE@ tsB2ZIH3gMw`9Vc3@ppo@Erx<*xC1qp>?K@*qDTM$002ovPDHLkV1fr^f5-p; literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-zoom-100.png b/addons/web/static/src/img/icons/gtk-zoom-100.png new file mode 100644 index 0000000000000000000000000000000000000000..5193406b787e95c63d8bc08b841c5f38d2d6a3f2 GIT binary patch literal 469 zcmV;`0V@89P)i4{sTvHO8H)_q0vl~X%ppR-k159vb80OiG1YX&G&qaeXvC=k!em5i9f)B z!zD+T_bPka!TUJaU02=R&vpOq_kP}|AUCFGe3GgMRT+voYX#!a8VgmW*VdO23hyIv z5d+1XHK#oIM9+VK^wzF|)nFXmfg~J@cj#V9p=a?LYX=GNj1W{5L;2G%AU59(}Q(L`JSp4V6jjn}Tw5x!2-zn&E%Fbs!K!*Do$4+4O#9^Jj z)Bqi`NmzX6Xmm$GkL;4Zg#g3wAxskyn5W_zpv9X&(_{?wu8;;0u3#MAL#=!SN14RUs?t#00000 LNkvXXu0mjfD@Wg} literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/gtk-zoom-out.png b/addons/web/static/src/img/icons/gtk-zoom-out.png new file mode 100644 index 0000000000000000000000000000000000000000..0da5ee7ec13d41693499b637065889e78d1fecea GIT binary patch literal 463 zcmV;=0WkiFP)i4{sTvHO8MMkjiP)+Y;9}A%=YqX^vyeNgFK$&(GE zE-2>QbE>`f^kf61RyQ;(gbrYvIfd1C3ESKi?7lMuBZuG_A+lnHUHlt+X!ah%G;@xw zUgk2sU@9_Nc1d2KLD)jny#ic?3e$*m;6CD=wtHo~p zqL_1!omp7dP|q=BknF)C7UvA1ITM6uxj-aXBM~yIX`a3Eg!rfO$OTXV=ev9R^K;YU=F8Vv%Vr2i z!bBnwtp0?2ZjIIDMJ#j1XmpOR2xLiiPfpt%02y$1pSm;|_WL~e{Q%eXu;(`Q;|7K? zK?s2mfRfi)GpEdcElYr~ot5nwGaq z!PuC}cYfHzo;#T4oQY}h)BRr%zD6RICSTa$@Nht_QSFToks=IAfDr*PbJ`5GNWbAzwg<5S9NZQGf-u4_4t>n<%vtvlcB zO>Ntm?(CEdNn#HGKn18BpZ@j9r=P!PT65oZUB_`etJ@oxgWQ^fPI6jb+d|@`N^P8ZCnlXtvx#1dz>s4p`63Ko=O*@E0e*Xlvl05*JydPcV3@b8j^s^kyFprPd^ z&icYiRsRH(uhHoZi4Wr@agX?Q3g_`8xQiqrr+3)l64*Gt#ag67KTkmJl!#DCa~f$K w)a@oQr=i7MY3xA*ql1<)h&dH)5CJvm8}XjbDoaBt5C8xG07*qoM6N<$f(WI^)c^nh literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/stock_gantt.png b/addons/web/static/src/img/icons/stock_gantt.png new file mode 100644 index 0000000000000000000000000000000000000000..585761b9220da3e05ca35ba713564ed9bec8d1d7 GIT binary patch literal 293 zcmV+=0owkFP)LzFt(F?Ru$J+~>IztjeX$l_r z7LK0pKh7``A!My63RI*aWrYhBi%Y%)K@foFc^u#OGjN^57=t*D^99&QDFxfMIgaB9 zxUTzOAf|qjkuVGk1=uJgSDoP3Kfih4bGZpR%S#c(0!+b=tkW4-a)aZQf_b=Slox1= z4QONwV{-@UMCWMws=PoR%%D9)<{&L3zfP598DHhUFyMJkA#bo02_xD_A-qM0 ziE>Szs!Gf>neo8uEeIfkiUEPKS}<9;8K2KPk@LB*bj6KDAB}|zr}44xEZ)@VF-e&| zZ3u|R<0K^FqA^`pgWP2|vK~9$JNMz8gThRE1Kzq1AxgL6<;iBeGVTUz*cmD?2yd;% zmy2CkII$nI$IVC_qcCkZVc64&Yu#P&(Vgfy!BY6Y`Ni@-q(m~(bSLN>6^j^OcdD~=v$##5~p%UN>0=2cP sL7ndVc)5n$SM4VZhE@DgW%$qf0U=ou5}zv60RR9107*qoM6N<$g8GRR7ytkO literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/stock_log.png b/addons/web/static/src/img/icons/stock_log.png new file mode 100644 index 0000000000000000000000000000000000000000..32af4dd6901c1ce3463cef0caca211271497515f GIT binary patch literal 748 zcmVD)UGPH2UeIWzgn@$J0tTxafTpRu%LK3cG0pMB0=`*~O*G?lZv)^ZkUGO?W5 zcOT4b8QtG&Dr0zOVW|lTBs24jxUOsV>WrW)uyYm*OR_#A*S}hWjhk)(K;Fm0{+1&aI`+(5Nb5Byo3Zcftkj-Z)@S9tMIuC5LMcV z$b)FO4XXbYB7s&Oy<^&e*n6x(GMXz5idE2sWu}+Rx{v+=QBx;O2)frJ z^dk=?Co*vU%u=p%8wpG%*2^ql(M3hCt1)Y2N3Gsh;YvqD81Xca6N8Q zhA&ZxBk&K_YL42KQ7Yvd<9K<8rBDW)!Qnbh^_G!?5lUY^wiy?4;dFBbVJ@m9+P^X$W2zC4>BKbw|p zO2q-YWjVB%A4-2AB0q}|3p}N>mz*863pPwDU64gx5AWNbJ%F{0g=9g0h5E2V67`=W zejC)W8_-lI0z);L{CEMJ(m~op3phI7<_D?%15+ckuzCNCw47a==)E5Up|9<9L^kW& zY0O!Y!1l;uQdM)s+(1jsD)7K85h$C&wilbDpJ?C7`2lb6-}n4XZ;DAA3I79q;WW

!5$3|KREQzU>^(VTMM>u6p6a*>=wPKHv9w-{;wT;s5y4kxHe)=~U`D zUw_<4rHHRz3*W=%9k^t1aq)2`lc9$X9#B4?r=z1IIyg9>{r!E)X0x=kw3O%PjOP(t z5Ap5oZ8|(Wq+BjXi^(KSOiWNBk)W-uE!x}LlTB!DAel@)-PqU=Gfk({G&(v;LqkI} zG&o3u1!iYwVFtj&oMypiW@fC(g$25G^Cm4XFHXr~-bLMn^^{F+cxaGXvAp z(}_8r-L<(n5hN0c95XOL0}94CGyVPjA{$sXO$7lcBBkdoeB>Md|(d>k9pt%-qg9#~fh3wnA4JxaQ} zsarw8ur}q$sVpC1146v3OVFjHvy(cNbac@0@GuNGH8Fshpxht~IwXQYK~SQ-UC_>O zb-;vMvr6C{{}D5VxF8S^1SI@^fuCVBsEE&+HX`158LYD(LE72`Z4#}mg4P1qAN`@w zZOywOZ??Aqe}GzAT7Kd4$@mK3K0o*L!g&ndU^!&K>-CbixmnOG(bNQ_CCHqM0Z#WO zHXrK0sj-n7B|IL1hvCe?g!Tq_mcyLlSKJlR;mGZF|DvHm(7>Qfqmc;q1+sLHU;Fz$ zz%%S&o}t{btE;q@&5A%Sr&GoW91ik%y`llFtgO&98^!lVxBEWJl>BjEo6R=Bvw9J1 z57OG&8tv}v5Kcd6G!DC6#tv*Y8JEi?I^#kjL7SVKB3mA}2PSi83hZz=CRy|y8qPWg zzPr1Ne>JpP5zJO!FH;Zd>SXF9tX7yqhZJXn_4RccjKzqxKfCPq-`-KtD+Xv)X3B@$O>9FGP0Vl0H@>;$_XhtLHtx5N6Qddz{}J-|38;F>YX8-^I07*qoM6N<$g1YMW>Hq)$ literal 0 HcmV?d00001 diff --git a/addons/web/static/src/img/icons/stock_translate.png b/addons/web/static/src/img/icons/stock_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab41d49343f608c52de4757b1e7b7328585d36f GIT binary patch literal 519 zcmV+i0{H!jP)cXN;fg+u3A82b+1^X}0TH#;Xf${{hnhx81&P&YS=M002ov JPDHLkV1iQo_6Gm} literal 0 HcmV?d00001 From df5dd1f7b7d4ad8219009d97774b22ddc017d33a Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 9 Sep 2011 18:00:39 +0200 Subject: [PATCH 206/210] [IMP] hack to register the wsgi handler when running embbeded in openerp-server. bzr revid: al@openerp.com-20110909160039-6ddslilpttvhubad --- addons/web/__init__.py | 23 +++++++++++++++++++++++ addons/web/__openerp__.py | 1 + 2 files changed, 24 insertions(+) diff --git a/addons/web/__init__.py b/addons/web/__init__.py index 343b53d050d..5a3f33f8af4 100644 --- a/addons/web/__init__.py +++ b/addons/web/__init__.py @@ -1,5 +1,28 @@ import common import controllers +import common.dispatch + +try: + import openerp + import os + import tempfile + print "embedded mode" + class Options(object): + pass + o = Options() + o.dbfilter = '.*' + o.session_storage = os.path.join(tempfile.gettempdir(), "oe-sessions") + o.addons_path = os.path.dirname(os.path.dirname(__file__)) + o.serve_static = True + o.server_host = '127.0.0.1' + o.server_port = 8069 + + app = common.dispatch.Root(o) + #import openerp.wsgi + openerp.wsgi.register_wsgi_handler(app) + +except ImportError: + print "standalone mode" # TODO # if we detect that we are imported from the openerp server register common.Root() as a wsgi entry point diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index a6e438a75db..dd4d2071f00 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -45,4 +45,5 @@ "static/src/css/base.css", "static/src/css/data_export.css", ], + 'wsgi' : 'app', } From 40ccd8a30750fa17e78b57901817f3ce0ec73d17 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Sat, 10 Sep 2011 05:01:47 +0000 Subject: [PATCH 207/210] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110910050134-g9u7swpuqxjvk2uc bzr revid: launchpad_translations_on_behalf_of_openerp-20110910050147-o7l8x27ph9y63m3r --- addons/base_module_record/i18n/cs.po | 124 ++++++++++++++++----------- openerp/addons/base/i18n/cs.po | 8 +- 2 files changed, 79 insertions(+), 53 deletions(-) diff --git a/addons/base_module_record/i18n/cs.po b/addons/base_module_record/i18n/cs.po index 5b707513588..ac9513d58e9 100644 --- a/addons/base_module_record/i18n/cs.po +++ b/addons/base_module_record/i18n/cs.po @@ -4,27 +4,28 @@ # msgid "" msgstr "" -"Project-Id-Version: OpenERP Server 5.0.4\n" +"Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2009-02-03 06:26+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" +"PO-Revision-Date: 2011-09-09 10:24+0000\n" +"Last-Translator: Jiří Hajda \n" +"Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:09+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-09-10 05:01+0000\n" +"X-Generator: Launchpad (build 13900)\n" +"X-Poedit-Language: Czech\n" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,category:0 msgid "Category" -msgstr "" +msgstr "Kategorie" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 msgid "Information" -msgstr "" +msgstr "Informace" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 @@ -33,54 +34,57 @@ msgid "" "publish it on OpenERP.com, in the 'Modules' section. You can do it through " "the website or using features of the 'base_module_publish' module." msgstr "" +"Pokud si myslíte, že by váš modul mohl zajímat další lidi, byli bychom rádi, " +"kdybyste jej zveřejnili na OpenERP.com v sekci 'Moduly'. Můžete to provést " +"přes webové stránky nebo pomocí funkcí modulu 'base_module_publish'." #. module: base_module_record #: wizard_button:base_module_record.module_record_data,info,end:0 #: wizard_button:base_module_record.module_record_data,save_yaml,end:0 msgid "End" -msgstr "" +msgstr "Ukončit" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,init:0 #: wizard_view:base_module_record.module_record_objects,init:0 msgid "Choose objects to record" -msgstr "" +msgstr "Vyberte objekt pro zaznamenání" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,author:0 msgid "Author" -msgstr "" +msgstr "Autor" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,directory_name:0 msgid "Directory Name" -msgstr "" +msgstr "Jméno adresáře" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,filter_cond:0 #: wizard_field:base_module_record.module_record_objects,init,filter_cond:0 msgid "Records only" -msgstr "" +msgstr "Piouze záznam" #. module: base_module_record #: model:ir.model,name:base_module_record.model_ir_module_record msgid "ir.module.record" -msgstr "" +msgstr "ir.module.record" #. module: base_module_record #: selection:base_module_record.module_record_objects,info,data_kind:0 msgid "Demo Data" -msgstr "" +msgstr "Ukázková data" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,save,module_filename:0 msgid "Filename" -msgstr "" +msgstr "Jméno souboru" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,version:0 msgid "Version" -msgstr "" +msgstr "Verze" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,info:0 @@ -88,13 +92,13 @@ msgstr "" #: wizard_view:base_module_record.module_record_data,save_yaml:0 #: wizard_view:base_module_record.module_record_objects,init:0 msgid "Objects Recording" -msgstr "" +msgstr "Zaznamenávání objektů" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,check_date:0 #: wizard_field:base_module_record.module_record_objects,init,check_date:0 msgid "Record from Date" -msgstr "" +msgstr "Záznam od data" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,end:0 @@ -103,170 +107,170 @@ msgstr "" #: wizard_view:base_module_record.module_record_objects,save:0 #: wizard_view:base_module_record.module_record_objects,save_yaml:0 msgid "Module Recording" -msgstr "" +msgstr "Zaznamenávání modulu" #. module: base_module_record #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record_objects #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_objects msgid "Export Customizations As a Module" -msgstr "" +msgstr "Exportovat vlastní úpravy jako modul" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 msgid "Thanks in advance for your contribution." -msgstr "" +msgstr "Předem díky za váše přispění." #. module: base_module_record #: help:base_module_record.module_record_data,init,objects:0 #: help:base_module_record.module_record_objects,init,objects:0 msgid "List of objects to be recorded" -msgstr "" +msgstr "Seznam objektů k záznamu" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,description:0 msgid "Full Description" -msgstr "" +msgstr "Plný popis" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,name:0 msgid "Module Name" -msgstr "" +msgstr "Jméno modulu" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,objects:0 #: wizard_field:base_module_record.module_record_objects,init,objects:0 msgid "Objects" -msgstr "" +msgstr "Objekty" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,save,module_file:0 #: wizard_field:base_module_record.module_record_objects,save_yaml,yaml_file:0 msgid "Module .zip File" -msgstr "" +msgstr ".ZIP soubor modulu" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 msgid "Module successfully created !" -msgstr "" +msgstr "Modul úspěšně vytvořen !" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save_yaml:0 msgid "YAML file successfully created !" -msgstr "" +msgstr "Soubor YAML úspěšně vytvořen !" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,info:0 #: wizard_view:base_module_record.module_record_data,save_yaml:0 msgid "Result, paste this to your module's xml" -msgstr "" +msgstr "Výsledek, vložte jej do xml modulu" #. module: base_module_record #: selection:base_module_record.module_record_data,init,filter_cond:0 #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Created" -msgstr "" +msgstr "Vytvořeno" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,end:0 #: wizard_view:base_module_record.module_record_objects,end:0 msgid "Thanks For using Module Recorder" -msgstr "" +msgstr "Díky za použití Záznamníku modulů" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,website:0 msgid "Documentation URL" -msgstr "" +msgstr "URL dokumentace" #. module: base_module_record #: selection:base_module_record.module_record_data,init,filter_cond:0 #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Modified" -msgstr "" +msgstr "Změněno" #. module: base_module_record #: wizard_button:base_module_record.module_record_data,init,record:0 #: wizard_button:base_module_record.module_record_objects,init,record:0 msgid "Record" -msgstr "" +msgstr "Zaznamenávat" #. module: base_module_record #: model:ir.module.module,shortdesc:base_module_record.module_meta_information msgid "Module Record" -msgstr "" +msgstr "Záznam modulu" #. module: base_module_record #: wizard_button:base_module_record.module_record_objects,info,save:0 msgid "Continue" -msgstr "" +msgstr "Pokračovat" #. module: base_module_record #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record_data #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_data msgid "Export Customizations As Data File" -msgstr "" +msgstr "Exportovat vlastní úpravy jako datový soubor" #. module: base_module_record #: code:addons/base_module_record/wizard/base_module_save.py:129 #, python-format msgid "Error" -msgstr "" +msgstr "Chyba" #. module: base_module_record #: selection:base_module_record.module_record_objects,info,data_kind:0 msgid "Normal Data" -msgstr "" +msgstr "Běžná data" #. module: base_module_record #: wizard_button:base_module_record.module_record_data,end,end:0 #: wizard_button:base_module_record.module_record_objects,end,end:0 msgid "OK" -msgstr "" +msgstr "OK" #. module: base_module_record #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_mod_rec msgid "Module Creation" -msgstr "" +msgstr "Vytvoření modulu" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,data_kind:0 msgid "Type of Data" -msgstr "" +msgstr "Typ dat" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,info:0 msgid "Module Information" -msgstr "" +msgstr "Informace modulu" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,info_yaml:0 #: wizard_field:base_module_record.module_record_objects,init,info_yaml:0 msgid "YAML" -msgstr "" +msgstr "YAML" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,info,res_text:0 #: wizard_field:base_module_record.module_record_data,save_yaml,res_text:0 msgid "Result" -msgstr "" +msgstr "Výsledek" #. module: base_module_record #: wizard_button:base_module_record.module_record_data,init,end:0 #: wizard_button:base_module_record.module_record_objects,info,end:0 #: wizard_button:base_module_record.module_record_objects,init,end:0 msgid "Cancel" -msgstr "" +msgstr "Zrušit" #. module: base_module_record #: wizard_button:base_module_record.module_record_objects,save,end:0 #: wizard_button:base_module_record.module_record_objects,save_yaml,end:0 msgid "Close" -msgstr "" +msgstr "Uzavřít" #. module: base_module_record #: selection:base_module_record.module_record_data,init,filter_cond:0 #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Created & Modified" -msgstr "" +msgstr "Vytvořeno & upraveno" #. module: base_module_record #: model:ir.module.module,description:base_module_record.module_meta_information @@ -292,3 +296,25 @@ msgid "" "module.\n" " " msgstr "" +"\n" +"Tento modul vám umožňuje vytvořit nový modul bez jakéhokoliv vývoje.\n" +"Zaznamenává všechny operace nad objekty během relace zaznamenávání a\n" +"vytváří .ZIP modul. Díky tomu můžete vytvořit váš vlastní modul přímo z\n" +"klienta OpenERP.\n" +"\n" +"Tato verze pracuje pro vytváření a aktualizaci stávajících záznamů. " +"Přepočítává\n" +"závislosti a propojuje všechny datové typy pomůcek (many2one, many2many, " +"...).\n" +"Podporuje také pracovní toky a demonstrační/aktualziační data.\n" +"\n" +"Měl by vám pomoci jednoduše vytvářet znovu použitelné a zveřejnitelné " +"moduly\n" +"pro vlastní nastavení a demonstrační/testovací data.\n" +"\n" +"Jak jej použít:\n" +"Spusťte průvodce Správa/Přizpůsobení/Vytváření modulů/Exportovat vlastní " +"úpravy jako modul.\n" +"Vyberte častoé kritéria pro záznam a objekty, které mají být zaznamenány a " +"modul záznamu.\n" +" " diff --git a/openerp/addons/base/i18n/cs.po b/openerp/addons/base/i18n/cs.po index dd8b5caee98..bfa8ea8ed25 100644 --- a/openerp/addons/base/i18n/cs.po +++ b/openerp/addons/base/i18n/cs.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: openobject-server\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-09-08 12:09+0000\n" +"PO-Revision-Date: 2011-09-09 10:34+0000\n" "Last-Translator: Jiří Hajda \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-09 04:37+0000\n" +"X-Launchpad-Export-Date: 2011-09-10 05:01+0000\n" "X-Generator: Launchpad (build 13900)\n" "X-Poedit-Language: Czech\n" @@ -885,7 +885,7 @@ msgstr "Znak" #: model:ir.actions.act_window,name:base.action_publisher_warranty_contract_form #: model:ir.ui.menu,name:base.menu_publisher_warranty_contract msgid "Contracts" -msgstr "Kontakty" +msgstr "Smlouvy" #. module: base #: selection:base.language.install,lang:0 @@ -3971,7 +3971,7 @@ msgstr "Neplatné ID pro záznam procházení, máme %r, očekáván integer." #: model:ir.actions.act_window,name:base.action_partner_addess_tree #: view:res.partner:0 msgid "Partner Contacts" -msgstr "Kontakty společníka" +msgstr "Kontakty partnera" #. module: base #: field:base.module.update,add:0 From e37394cd588e47f9adfee1c3c62d78b9237da110 Mon Sep 17 00:00:00 2001 From: fp Date: Sat, 10 Sep 2011 14:43:55 +0200 Subject: [PATCH 208/210] [IMP] useability of timesheet bzr revid: fp@fp-laptop-20110910124355-qkkbtgm3wz6l2w1f --- addons/hr_timesheet/hr_timesheet.py | 4 ++-- .../wizard/hr_timesheet_sign_in_out.py | 2 +- .../hr_timesheet_sheet/hr_timesheet_sheet.py | 10 +++++----- .../hr_timesheet_sheet_view.xml | 20 +++++++++---------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/addons/hr_timesheet/hr_timesheet.py b/addons/hr_timesheet/hr_timesheet.py index 2b33dfbda8d..4613c9251b5 100644 --- a/addons/hr_timesheet/hr_timesheet.py +++ b/addons/hr_timesheet/hr_timesheet.py @@ -66,8 +66,8 @@ class hr_analytic_timesheet(osv.osv): _inherits = {'account.analytic.line': 'line_id'} _order = "id desc" _columns = { - 'line_id': fields.many2one('account.analytic.line', 'Analytic line', ondelete='cascade', required=True), - 'partner_id': fields.related('account_id', 'partner_id', type='many2one', string='Partner Id', relation='res.partner', store=True), + 'line_id': fields.many2one('account.analytic.line', 'Analytic Line', ondelete='cascade', required=True), + 'partner_id': fields.related('account_id', 'partner_id', type='many2one', string='Partner', relation='res.partner', store=True), } def unlink(self, cr, uid, ids, context=None): diff --git a/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py b/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py index 90c9a5d7b8c..e3f7f0c7acb 100644 --- a/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py +++ b/addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py @@ -27,7 +27,7 @@ class hr_so_project(osv.osv_memory): _name = 'hr.sign.out.project' _description = 'Sign Out By Project' _columns = { - 'account_id': fields.many2one('account.analytic.account', 'Analytic Account', domain=[('type','=','normal')]), + 'account_id': fields.many2one('account.analytic.account', 'Project / Analytic Account', domain=[('type','=','normal')]), 'info': fields.char('Work Description', size=256, required=True), 'date_start': fields.datetime('Starting Date', readonly=True), 'date': fields.datetime('Closing Date'), diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index cf4351112a4..4e1eebb5f4c 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -264,7 +264,7 @@ class hr_timesheet_sheet(osv.osv): return self.sign(cr,uid,ids,'sign_out',context=None) _columns = { - 'name': fields.char('Description', size=64, select=1, + 'name': fields.char('Note', size=64, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}), 'employee_id': fields.many2one('hr.employee', 'Employee', required=True), 'user_id': fields.related('employee_id', 'user_id', type="many2one", relation="res.users", store=True, string="User", required=False, readonly=True),#fields.many2one('res.users', 'User', required=True, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}), @@ -280,9 +280,9 @@ class hr_timesheet_sheet(osv.osv): 'attendances_ids' : one2many_mod2('hr.attendance', 'sheet_id', 'Attendances'), 'state' : fields.selection([ ('new', 'New'), - ('draft','Draft'), - ('confirm','Confirmed'), - ('done','Done')], 'State', select=True, required=True, readonly=True, + ('draft','Open'), + ('confirm','Waiting Approval'), + ('done','Approved')], 'State', select=True, required=True, readonly=True, help=' * The \'Draft\' state is used when a user is encoding a new and unconfirmed timesheet. \ \n* The \'Confirmed\' state is used for to confirm the timesheet by user. \ \n* The \'Done\' state is used when users timesheet is accepted by his/her senior.'), @@ -735,7 +735,7 @@ class hr_timesheet_sheet_sheet_account(osv.osv): _auto = False _order='name' _columns = { - 'name': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True), + 'name': fields.many2one('account.analytic.account', 'Project / Analytic Account', readonly=True), 'sheet_id': fields.many2one('hr_timesheet_sheet.sheet', 'Sheet', readonly=True), 'total': fields.float('Total Time', digits=(16,2), readonly=True), 'invoice_rate': fields.many2one('hr_timesheet_invoice.factor', 'Invoice rate', readonly=True), diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index 321e4c2addd..bb18341f8da 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -62,14 +62,14 @@
- - - - + + + + @@ -89,19 +89,19 @@ - -