diff --git a/backend_theme_v12/LICENSE.txt b/backend_theme_v12/LICENSE.txt new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/backend_theme_v12/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/backend_theme_v12/__init__.py b/backend_theme_v12/__init__.py new file mode 100644 index 0000000..724cd13 --- /dev/null +++ b/backend_theme_v12/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import models +from . import controllers \ No newline at end of file diff --git a/backend_theme_v12/__manifest__.py b/backend_theme_v12/__manifest__.py new file mode 100644 index 0000000..063fabf --- /dev/null +++ b/backend_theme_v12/__manifest__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright 2016, 2019 Openworx +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + "name": "Obook Openworx Material Backend Theme V12", + "summary": "Oboo Openworx Material Backend Theme V12 ", + "version": "12.0.0.3", + "category": "Theme/Backend", + "website": "http://www.openworx.nl", + "description": """ + Obook Openworx Material Backend theme for Odoo 12.0 community edition. + """, + 'images':[ + 'images/screen.png' + ], + "author": "Openworx", + "license": "LGPL-3", + "installable": True, + "depends": [ + 'web', + 'web_responsive', + + ], + "data": [ + 'views/assets.xml', + 'views/res_company_view.xml', + 'views/users.xml', + 'views/sidebar.xml', + #'views/web.xml', + ], + 'live_test_url': 'https://youtu.be/JX-ntw2ORl8' + +} + diff --git a/backend_theme_v12/__manifest__.py~ b/backend_theme_v12/__manifest__.py~ new file mode 100644 index 0000000..c26d8bc --- /dev/null +++ b/backend_theme_v12/__manifest__.py~ @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright 2016, 2019 Openworx +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + "name": "Openworx Material Backend Theme V12", + "summary": "Openworx Material Backend Theme V12 ", + "version": "12.0.0.3", + "category": "Theme/Backend", + "website": "http://www.openworx.nl", + "description": """ + Openworx Material Backend theme for Odoo 12.0 community edition. + """, + 'images':[ + 'images/screen.png' + ], + "author": "Openworx", + "license": "LGPL-3", + "installable": True, + "depends": [ + 'web', + 'web_responsive', + + ], + "data": [ + 'views/assets.xml', + 'views/res_company_view.xml', + 'views/users.xml', + 'views/sidebar.xml', + #'views/web.xml', + ], + 'live_test_url': 'https://youtu.be/JX-ntw2ORl8' + +} + diff --git a/backend_theme_v12/controllers/__init__.py b/backend_theme_v12/controllers/__init__.py new file mode 100644 index 0000000..cd4d6a8 --- /dev/null +++ b/backend_theme_v12/controllers/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import main \ No newline at end of file diff --git a/backend_theme_v12/controllers/main.py b/backend_theme_v12/controllers/main.py new file mode 100644 index 0000000..e899e58 --- /dev/null +++ b/backend_theme_v12/controllers/main.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Copyright 2016, 2019 Openworx +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +import base64 +from odoo.http import Controller, request, route +from werkzeug.utils import redirect + +DEFAULT_IMAGE = '/backend_theme_v12/static/src/img/material-background.jpg' + +class DasboardBackground(Controller): + + @route(['/dashboard'], type='http', auth='user', website=False) + def dashboard(self, **post): + user = request.env.user + company = user.company_id + if company.dashboard_background: + image = base64.b64decode(company.dashboard_background) + else: + return redirect(DEFAULT_IMAGE) + + return request.make_response( + image, [('Content-Type', 'image')]) \ No newline at end of file diff --git a/backend_theme_v12/images/screen.png b/backend_theme_v12/images/screen.png new file mode 100644 index 0000000..8e746db Binary files /dev/null and b/backend_theme_v12/images/screen.png differ diff --git a/backend_theme_v12/models/__init__.py b/backend_theme_v12/models/__init__.py new file mode 100644 index 0000000..c5e3353 --- /dev/null +++ b/backend_theme_v12/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import res_company +from . import res_users \ No newline at end of file diff --git a/backend_theme_v12/models/res_company.py b/backend_theme_v12/models/res_company.py new file mode 100644 index 0000000..5940bcc --- /dev/null +++ b/backend_theme_v12/models/res_company.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright 2016, 2019 Openworx +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import models, fields + +class ResCompany(models.Model): + + _inherit = 'res.company' + + dashboard_background = fields.Binary(attachment=True) \ No newline at end of file diff --git a/backend_theme_v12/models/res_users.py b/backend_theme_v12/models/res_users.py new file mode 100644 index 0000000..fd3ecd6 --- /dev/null +++ b/backend_theme_v12/models/res_users.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Copyright 2016, 2019 Openworx +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import models, fields + +class ResUsers(models.Model): + + _inherit = 'res.users' + + sidebar_visible = fields.Boolean("Show App Sidebar", default=True) + + def __init__(self, pool, cr): + """ Override of __init__ to add access rights on notification_email_send + and alias fields. Access rights are disabled by default, but allowed + on some specific fields defined in self.SELF_{READ/WRITE}ABLE_FIELDS. + """ + init_res = super(ResUsers, self).__init__(pool, cr) + # duplicate list to avoid modifying the original reference + type(self).SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS) + type(self).SELF_WRITEABLE_FIELDS.extend(['sidebar_visible']) + # duplicate list to avoid modifying the original reference + type(self).SELF_READABLE_FIELDS = list(self.SELF_READABLE_FIELDS) + type(self).SELF_READABLE_FIELDS.extend(['sidebar_visible']) + return init_res \ No newline at end of file diff --git a/backend_theme_v12/static/description/crm.png b/backend_theme_v12/static/description/crm.png new file mode 100644 index 0000000..d191baa Binary files /dev/null and b/backend_theme_v12/static/description/crm.png differ diff --git a/backend_theme_v12/static/description/crm_mobile.png b/backend_theme_v12/static/description/crm_mobile.png new file mode 100644 index 0000000..93ab27a Binary files /dev/null and b/backend_theme_v12/static/description/crm_mobile.png differ diff --git a/backend_theme_v12/static/description/desktop.png b/backend_theme_v12/static/description/desktop.png new file mode 100644 index 0000000..76fa555 Binary files /dev/null and b/backend_theme_v12/static/description/desktop.png differ diff --git a/backend_theme_v12/static/description/icon.png b/backend_theme_v12/static/description/icon.png new file mode 100644 index 0000000..4218e4e Binary files /dev/null and b/backend_theme_v12/static/description/icon.png differ diff --git a/backend_theme_v12/static/description/index.html b/backend_theme_v12/static/description/index.html new file mode 100644 index 0000000..cc7c7d0 --- /dev/null +++ b/backend_theme_v12/static/description/index.html @@ -0,0 +1,51 @@ +
+
+
+

Openworx Material Backend Theme

+

The first Odoo 12.0 community backend theme

+
+

Enterprise look'n'feel and App Sidebar

+

+

App Dashboard

+

+

Quick search in App Dashboard

+

+

Side Chatter on widescreen

+

+

Fully responsive

+

+

+
+
+
+
+ +
+
+ +
+
+
+
+

Remark: It is possible that the Odoo service needs to be restarted after install.

+
+
+
+
+ +
+
+ +
+
+
+
+

Help & Support

+
+ Website: Openworx
+ Contact: Email Support
+
+
+
+
+ diff --git a/backend_theme_v12/static/description/mobile.png b/backend_theme_v12/static/description/mobile.png new file mode 100644 index 0000000..4bcf6a7 Binary files /dev/null and b/backend_theme_v12/static/description/mobile.png differ diff --git a/backend_theme_v12/static/description/search.png b/backend_theme_v12/static/description/search.png new file mode 100644 index 0000000..0054611 Binary files /dev/null and b/backend_theme_v12/static/description/search.png differ diff --git a/backend_theme_v12/static/description/sidebar.png b/backend_theme_v12/static/description/sidebar.png new file mode 100644 index 0000000..022f8d6 Binary files /dev/null and b/backend_theme_v12/static/description/sidebar.png differ diff --git a/backend_theme_v12/static/src/font/Roboto-Regular.ttf b/backend_theme_v12/static/src/font/Roboto-Regular.ttf new file mode 100644 index 0000000..8c082c8 Binary files /dev/null and b/backend_theme_v12/static/src/font/Roboto-Regular.ttf differ diff --git a/backend_theme_v12/static/src/img/checked.svg b/backend_theme_v12/static/src/img/checked.svg new file mode 100644 index 0000000..5125976 --- /dev/null +++ b/backend_theme_v12/static/src/img/checked.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/backend_theme_v12/static/src/img/material-background.jpg b/backend_theme_v12/static/src/img/material-background.jpg new file mode 100644 index 0000000..d38241a Binary files /dev/null and b/backend_theme_v12/static/src/img/material-background.jpg differ diff --git a/backend_theme_v12/static/src/js/sidebar-toggle.js b/backend_theme_v12/static/src/js/sidebar-toggle.js new file mode 100644 index 0000000..2330970 --- /dev/null +++ b/backend_theme_v12/static/src/js/sidebar-toggle.js @@ -0,0 +1,25 @@ +/* Copyright 2017 Openworx. + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +odoo.define('backend_theme_v12.sidebar-toggle', function (require) { + "use strict"; + + var session = require('web.session'); + var rpc = require('web.rpc'); + var id = session.uid; + rpc.query({ + model: 'res.users', + method: 'read', + args: [[id], ['sidebar_visible']], + }).then(function(res) { + var dbfield = res[0]; + var toggle = dbfield.sidebar_visible; + if (toggle === true) { + $("#app-sidebar").removeClass("toggle-sidebar"); + } else { + $("#app-sidebar").addClass("toggle-sidebar"); + }; + }); + +}); + diff --git a/backend_theme_v12/static/src/js/sidebar.js b/backend_theme_v12/static/src/js/sidebar.js new file mode 100644 index 0000000..176d151 --- /dev/null +++ b/backend_theme_v12/static/src/js/sidebar.js @@ -0,0 +1,33 @@ +/* Copyright 2016, 2019 Openworx. + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +// Check if debug mode is active and then add debug into URL when clicking on the App sidebar +odoo.define('backend_theme_v12.Sidebar', function(require) { + "use strict"; + var core = require('web.core'); + var session = require('web.session'); + var Widget = require('web.Widget'); + $(function() { + (function($) { + $.addDebug = function(url) { + url = url.replace(/(.{4})/, "$1?debug"); + return url; + } + $.addDebugWithAssets = function(url) { + url = url.replace(/(.{4})/, "$1?debug=assets"); + return url; + } + $.delDebug = function(url) { + var str = url.match(/web(\S*)#/); + url = url.replace("str/g", ""); + return url; + } + }) (jQuery); + $("#sidebar a").each(function() { + var url = $(this).attr('href'); + if (session.debug == 1) $(this).attr('href', $.addDebug(url)); + if (session.debug == 'assets') $(this).attr('href', $.addDebugWithAssets(url)); + if (session.debug == false) $(this).attr('href', $.delDebug(url)); + }); + }); +}); diff --git a/backend_theme_v12/static/src/scss/sidebar.scss b/backend_theme_v12/static/src/scss/sidebar.scss new file mode 100644 index 0000000..1393964 --- /dev/null +++ b/backend_theme_v12/static/src/scss/sidebar.scss @@ -0,0 +1,69 @@ +/* Copyright 2016, 2018 Openworx. + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +/* App Sidebar Panel */ + +$odoo-sidebar-width: 180px; + +.app-sidebar-panel { + flex: 0 0 $odoo-sidebar-width; + background-color: $gray-base; + height: 100% !important; + overflow-y: auto; + @media (max-width: 768px) { + display: none; + } +} + +/* @media (min-width: 768px) { + .o_menu_apps { + display: none !important; + } +} */ + +//.app-sidebar-panel:hover { +// @include o-flex(0, 0, $odoo-sidebar-width); +//} + +.app-sidebar { + white-space: nowrap; + padding: 0; + .app-sidebar-menu { + list-style: none; + margin: 0; + padding: 0; + >li { + display: block; + margin: 0; + padding: 0; + border: 0px; + >a { + display: block; + position: relative; + margin: 0; + border: 0px; + padding: 8px 15px; + text-decoration: none; + font-size: 13px; + font-weight: 300; + color: $gray-lighter; + overflow: hidden; + text-overflow: ellipsis; + } + } + > li:hover > a{ + background: darken(#0099ff, 15%); + color: #fff; + } + } +} + +.app-sidebar-menuitem { + width: 23px; + height: 22px; + margin-right: 5px; +} + +.toggle-sidebar { + margin-left: 0px - $odoo-sidebar-width; +} \ No newline at end of file diff --git a/backend_theme_v12/static/src/scss/style.scss b/backend_theme_v12/static/src/scss/style.scss new file mode 100644 index 0000000..3cb8088 --- /dev/null +++ b/backend_theme_v12/static/src/scss/style.scss @@ -0,0 +1,492 @@ +/* Copyright 2016, 2019 Openworx. + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + + +@font-face { + font-family: Roboto; + src: url(/backend_theme_v12/static/src/font/Roboto-Regular.ttf) +} + + +$gray-base: #000; +$gray-darker: lighten($gray-base, 13.5%); +$gray-dark: #666; +$gray: #777; +$gray-light: #AEA79F; +$gray-lighter: lighten($gray-base, 93.5%); + + +// Change colors here + +// Odoo EE colors +//$brand-primary: #875a7b; +//$brand-secondary: #00A09D; +//------------------------ +$brand-primary: #008DCA; +$brand-secondary: #5EC269; +//------------------------ + + +$brand-primary-dark: darken($brand-primary, 10%); +$brand-secondary-dark: darken($brand-secondary, 10%); + +body { + + font-family: "Roboto"; +} + +.o_loading { + background-color: $brand-primary; +} + +.o_main_navbar { + background-color : $brand-primary; +} + +.o_main_navbar > a:hover, .o_main_navbar > a:focus, .o_main_navbar > button:hover, .o_main_navbar > button:focus { + + background-color: $brand-primary-dark; + color: inherit; + +} + +.o_main_navbar > ul > li > a:hover, .o_main_navbar > ul > li > label:hover { + background-color: $brand-primary-dark; +} + +.o_main_navbar .show .dropdown-toggle { + + background-color: $brand-primary-dark; + +} + +// Fix color Add file button +.o_control_panel .o_cp_sidebar .o_hidden_input_file .o_form_binary_form span { + color: $gray-dark !important; +} + +// Buttons + +.btn { + border-radius: 0px; +} + +.btn-primary { + + color: #fff; + background-color: $brand-secondary; + border-color: $brand-secondary; + +} + +.btn-primary:hover { + + color: #fff; + background-color: $brand-secondary-dark; + border-color: $brand-secondary-dark; +} + +.btn-secondary { + border: none; +} + +.btn:active, .btn.active { + -webkit-box-shadow: none; + box-shadow: none; + background-color: #eee !important; +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: none; + box-shadow: none; + background-color: #eee !important; +} + + +.btn-link { + color: $brand-secondary; +} + +.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button.btn-primary.disabled { + color: $brand-primary; +} + +.o_form_view .o_form_statusbar > .o_statusbar_status > .o_arrow_button:not(.disabled):hover { + color: $brand-primary; +} + +.o_dropdown_toggler_btn, .o_dropdown_toggler_btn:hover, .o_dropdown_toggler_btn:focus, .o_dropdown_toggler_btn:hover, .o_dropdown_toggler_btn:focus, .btn-icon, .o_graph_button { + text-transform: none !important; + color: $gray-dark !important; + background-color: transparent !important; + border: none !important; +} + +.dropdown-menu { + border-radius: 0px; +} + +oe_highlight { + color: #ffffff !important; + background-color: $brand-primary !important; +} + +.o_external_button { + color: $brand-primary !important; + background: #ffffff; +} + +.o_button_icon { + color: $brand-primary !important; +} + + +// Calendar + +.o_calendar_container .o_calendar_sidebar_container .ui-datepicker table .ui-state-active { + background: none; + background-color: $brand-primary !important; + color: #ffffff !important; +} +.o_calendar_container .o_calendar_sidebar_container .ui-datepicker table .ui-state-default { + color: $brand-primary; +} + +.datepicker { + .table-sm { + > thead { + color: white; + background-color: $brand-primary; + + > tr { + &:first-child { + th:hover { + color: white; + background-color: darken($brand-primary, 10%); + } + } + + &:last-child { + color: $o-datepicker-week-color; + background-color: $o-datepicker-week-bg-color; + } + > th { + border-radius: 0; + } + } + } + + > tbody { + > tr { + > td { + &.active, .active { + background-color: $o-brand-primary; + border-radius: 100px; + } + + &.today:before { + border-bottom-color: $o-brand-primary; + } + } + } + } + } +} + +.datepicker .table-sm > tbody > tr > td.active, .datepicker .table-sm > tbody > tr > td .active { + background-color: $brand-primary; + border-radius: 0; +} + +// Filter search label + +.o_searchview { + .o_searchview_facet { + + background-color: #ffffff; + + .o_searchview_facet_label { + background-color: $brand-primary; + } + } +} + +a { + + color: $brand-secondary; + text-decoration: none; + background-color: transparent; + -webkit-text-decoration-skip: objects; + +} + +a:hover { + + color: $brand-secondary-dark; + text-decoration: none; + +} + + +.o_control_panel { + background-color: #ffffff; +} + +.breadcrumb { + background-color: inherit; +} + +// Input + +input[type="text"], input[type="password"], input[type="number"], +textarea, select, .o_form_view.o_form_editable .o_form_field_many2manytags, +.o_searchview +{ + border: 0; + border-radius: 0; + border-bottom: 1px solid #ccc; +} + +.o_web_client input:focus, .o_web_client textarea:focus, .o_web_client select:focus { + outline: none; + border-bottom: 2px solid $brand-primary; +} + +.o_input { + border: 1px solid #ccc; + border-top-style: none; + border-right-style: none; + border-left-style: none; + color: $gray; +} + +.o_field_widget { + &.o_field_many2one .o_external_button { + color: $brand-secondary + } +} + +.o_required_modifier { + &.o_input, .o_input { + background-color: lighten($brand-primary, 35%) ! important; + } +} + +.input-group-text { + background-color: transparent; + color: #fff; + border: 0px; +} + +// Listview + +.o_list_view.table { + border: none; +} +.o_list_view.table thead, .o_list_view.table tfoot, .o_list_view.table td,.o_list_view.table th { + border: none; +} + +.o_list_view.table thead { + background-color: #e2e2e0; +} + +.o_list_view.table thead > tr > th.o_column_sortable:hover { + background-color: #D6D6D3; +} + +.o_list_view.table tbody tr.o_group_header { + background-color: #dfdfdf; + background-image: none; + border-top: 1px solid #e2e2e0; +} + +.table-striped > tbody > tr:nth-of-type(2n+1) { + background-color: #eef0f0; +} + +.o_list_view tfoot tr:nth-child(1) td { + background-color: $brand-primary !important; + color: #fff !important; +} + + +.ui-autocomplete .ui-menu-item.ui-state-focus { + background-color: #dee2e6; +} + +.ui-menu-item a:hover,.ui-menu-item a:focus { + color: #666666 !important; +} +.ui-autocomplete .ui-menu-item.ui-state-focus a{ + color: #666666 !important; +} + +.o_form_view .oe_button_box .oe_stat_button .o_stat_info .o_stat_value { + color: $brand-primary; +} + +.o_form_view .o_horizontal_separator { + color: #666666; + font-weight: bold; +} + +// Forms + +.o_form_view { + + .o_form_sheet_bg { + background: none !important; + background-color: #F9F9F9 !important; + padding: 0px; + .o_form_sheet { + border: 1px solid #d9d7d7; + box-shadow: 0 5px 20px -15px black; + } + } + + .o_form_statusbar { + //margin: -16px; + + .o_statusbar_status { + > .o_arrow_button { + background: #ffffff; + } + } + } +} + +// App Dashboard + +/* .o_menu_apps .dropdown-menu.show { + background: transparent url('/dashboard') no-repeat scroll center center / cover; + +} */ + +.o_menu_apps .dropdown-menu.show { + background: url(/dashboard); + background-origin: border-box; + background-size: cover; + height: calc(100vh); + max-height: calc(100vh); + border-top: $o-navbar-height solid transparent; + top: 0 !important; +} + +.o_main_navbar > ul.o_menu_systray { + float: right; + position: relative; + z-index: 200; +} + +.fa-th-large::before { + content: "\f00a"; +} + +.o_menu_apps .full { + width: 46px; + font-size: 18px; + text-align: center; + position: relative; + z-index: 200; +} + +.o-app-name { + color: #fff; + font-size: 15px; + font-weight: 400; + text-overflow: ellipsis; + white-space: nowrap; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.45); +} + +.o_menu_apps .dropdown-menu.show .o-app-icon { + padding: 20px 0 0; +} + +.o_menu_apps .dropdown-menu.show .o-app-icon:hover { + box-shadow: 0 8px 15px -10px black; + transform: translateY(-1px); +} + +.dropdown-item.o_app { + background: transparent; +} + +.o-menu-search-result { + color: #fff; +} + +// Chat window + +.o_thread_window .o_thread_window_header { + background-color: $brand-primary; +} + +// Formview + + +$gray-lighter-darker: #d9d7d7; +$o-statbutton-height: 40px; +$o-statbutton-spacing: 6px; + +.o_form_view { + @mixin o-form-sheet-negative-margin() { + margin-left: -$o-horizontal-padding; + margin-right: -$o-horizontal-padding; + margin-top: -#{$o-horizontal-padding +1}; + } + + .o_form_uri { + display: inline-block; + + color: $gray; + + &:first-line { + color: $link-color; + } + + &:hover { + color: darken($link-color, 15%); // hack required on chrome + + &:first-line { + color: darken($link-color, 15%); + } + } + } + + .oe_avatar { + float: right; + + >img { + max-height: 90px; + max-width: 90px; + margin-bottom: 10px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4); + border: none; + } + + +.oe_title { + padding-right: 0px; + padding-left: 0px; + } + } + +} + +// Override `@include media-breakpoint-up` in module `web_responsive` +@include media-breakpoint-up(md) { + .o_form_view .oe_button_box + .oe_avatar + .oe_title { + /* Add 110px in the calculation for the avatar space */ + width: calc(100% - 400px - 110px); + min-width: 400px; + max-width: 650px; + } + /* Same correction for res.users .oe_title div */ + .o_form_view .o_field_integer + .oe_button_box + .o_form_header + .o_field_boolean + + .o_form_header + .oe_avatar + .oe_title { + width: calc(100% - 400px - 110px); + min-width: 400px; + max-width: 650px; + } +} diff --git a/backend_theme_v12/views/assets.xml b/backend_theme_v12/views/assets.xml new file mode 100644 index 0000000..c2c9a0a --- /dev/null +++ b/backend_theme_v12/views/assets.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/base_search_custom_field_filter/views/ir_ui_custom_field_filter_views.xml b/base_search_custom_field_filter/views/ir_ui_custom_field_filter_views.xml new file mode 100644 index 0000000..65c89db --- /dev/null +++ b/base_search_custom_field_filter/views/ir_ui_custom_field_filter_views.xml @@ -0,0 +1,32 @@ + + + + + + ir.ui.custom.field.filter + + + + + + + + + + + + + + + + diff --git a/pos_product_available/README.rst b/pos_product_available/README.rst new file mode 100644 index 0000000..71dcbed --- /dev/null +++ b/pos_product_available/README.rst @@ -0,0 +1,35 @@ +.. image:: https://itpp.dev/images/infinity-readme.png + :alt: Tested and maintained by IT Projects Labs + :target: https://itpp.dev + +.. image:: https://img.shields.io/badge/license-MIT-blue.svg + :target: https://opensource.org/licenses/MIT + :alt: License: MIT + +======================= + POS: show product qty +======================= + +Adds available quantity at products in POS + +Module potentialy isn't compatible with modules that overrides `get_price` method in JS + +Questions? +========== + +To get an assistance on this module contact us by email :arrow_right: help@itpp.dev + +Contributors +============ +* `Ivan Yelizariev `__ + + +Further information +=================== + +Odoo Apps Store: https://apps.odoo.com/apps/modules/12.0/pos_product_available/ + + +Notifications on updates: `via Atom `_, `by Email `_ + +Tested on `Odoo 12.0 `_ diff --git a/pos_product_available/__init__.py b/pos_product_available/__init__.py new file mode 100644 index 0000000..1d99e04 --- /dev/null +++ b/pos_product_available/__init__.py @@ -0,0 +1,3 @@ +# License MIT (https://opensource.org/licenses/MIT). + +from . import models diff --git a/pos_product_available/__manifest__.py b/pos_product_available/__manifest__.py new file mode 100644 index 0000000..d5ef6b3 --- /dev/null +++ b/pos_product_available/__manifest__.py @@ -0,0 +1,30 @@ +# Copyright 2014-2018 Ivan Yelizariev +# Copyright 2017 Gabbasov Dinar +# Copyright 2018-2019 Kolushov Alexandr +# Copyright 2018 Ildar Nasyrov +# License MIT (https://opensource.org/licenses/MIT). +{ + "name": """POS: show product qty""", + "summary": """Adds available quantity at products in POS""", + "category": "Point Of Sale", + # "live_test_url": "http://apps.it-projects.info/shop/product/DEMO-URL?version={ODOO_BRANCH}", + "images": ["images/pos_product_available.jpg"], + "version": "12.0.1.1.1", + "application": False, + "author": "IT-Projects LLC, Ivan Yelizariev", + "support": "apps@itpp.dev", + "website": "https://apps.odoo.com/apps/modules/12.0/pos_product_available/", + "license": "Other OSI approved licence", # MIT + # "price": 9.00, + # "currency": "EUR", + "depends": ["point_of_sale", "stock"], + "external_dependencies": {"python": [], "bin": []}, + "data": ["data.xml", "views/views.xml"], + "qweb": ["static/src/xml/pos.xml"], + "post_load": None, + "pre_init_hook": None, + "post_init_hook": None, + "uninstall_hook": None, + "auto_install": False, + "installable": True, +} diff --git a/pos_product_available/data.xml b/pos_product_available/data.xml new file mode 100644 index 0000000..bcf97fa --- /dev/null +++ b/pos_product_available/data.xml @@ -0,0 +1,34 @@ + + + + + + diff --git a/web_responsive/README.rst b/web_responsive/README.rst new file mode 100644 index 0000000..e5b05c5 --- /dev/null +++ b/web_responsive/README.rst @@ -0,0 +1,190 @@ +============== +Web Responsive +============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/12.0/web_responsive + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-12-0/web-12-0-web_responsive + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds responsiveness to web backend. + +Features for all devices: + +* New navigation with an app drawer + + .. image:: https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif + +* Quick menu search from the app drawer + + .. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif + +Features for mobile: + +* App-specific submenus are shown on full screen when toggling them from the + "hamburger" menu + + .. image:: https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif + +* View type picker dropdown displays confortably + + .. image:: https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif + +* Top app bar is always visible, but the control panel is hidden when + scrolling down, to save some vaulable vertical space + + .. image:: https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif + +* Form status bar action and status buttons are collapsed in dropdowns. + Other control panel buttons use icons to save space. + + .. image:: https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif + +* Breadcrumbs navigation is collapsed with a "back arrow" button. + + .. image:: https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif + +Features for computers: + +* Keyboard shortcuts for easier navigation, **using ``Alt + Shift + [key]``** + combination instead of just ``Alt + [key]``. + See https://github.com/odoo/odoo/issues/30068 to understand why. + + .. image:: https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png + + +* Autofocus on search menu box when opening the drawer + + .. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif + +* Set chatter on the side of the screen, optional per user + + .. image:: https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif + +* Full width form sheets + + .. image:: https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png + +* Sticky chatter topbar + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/chatter_topbar.gif + +* AppMenu waits for action finished to show the view + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/appmenu.gif + +* Sticky header & footer in list view + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/listview.gif + +* Sticky statusbar in form view + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/formview.gif + +* Followers and send button is displayed on mobile. Avatar is hidden. + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/chatter.gif + +* When the chatter is configured on the side part, the document viewer fills that + part for side-by-side reading instead of full screen. You can still put it on full + width preview clicking on the new maximize button. + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/document_viewer.gif + +* Bigger checkboxes in list view + + .. image:: https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/big_checkboxes.gif + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +The following keyboard shortcuts are implemented: + +* Toggle app drawer - ``Alt + Shift + A`` +* Navigate app search results - Arrow keys +* Choose app result - ``Enter`` +* ``Esc`` to close app drawer + + +Also you can access to the user menu, with ``Alt + Shift + U`` + +Known issues / Roadmap +====================== + +* To view the full experience in a device, the page must be loaded with the + device screen size. This means that, if you change the size of your browser, + you should reload the web client to get the full experience for that + new size. This is Odoo's own limitation. +* App navigation with keyboard. +* Make it more beautiful. Maybe OCA-branded? +* Handle long titles on forms in a better way + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* LasLabs +* Tecnativa +* Alexandre Díaz + +Contributors +~~~~~~~~~~~~ + +* Dave Lasley +* Jairo Llopis +* Dennis Sluijk +* Sergio Teruel +* Alexandre Díaz +* Mathias Markl + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_responsive/__init__.py b/web_responsive/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/web_responsive/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_responsive/__manifest__.py b/web_responsive/__manifest__.py new file mode 100644 index 0000000..0e58b12 --- /dev/null +++ b/web_responsive/__manifest__.py @@ -0,0 +1,31 @@ +# Copyright 2016-2017 LasLabs Inc. +# Copyright 2018 Alexandre Díaz +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +{ + "name": "Web Responsive", + "summary": "Responsive web client, community-supported", + "version": "12.0.2.4.0", + "category": "Website", + "website": "https://github.com/OCA/web", + "author": "LasLabs, Tecnativa, Alexandre Díaz, " + "Odoo Community Association (OCA)", + "license": "LGPL-3", + "installable": True, + "depends": [ + 'web', + 'mail', + ], + "data": [ + 'views/assets.xml', + 'views/res_users.xml', + 'views/web.xml', + ], + 'qweb': [ + 'static/src/xml/apps.xml', + 'static/src/xml/form_view.xml', + "static/src/xml/menu.xml", + 'static/src/xml/navbar.xml', + 'static/src/xml/document_viewer.xml', + ], +} diff --git a/web_responsive/i18n/ca.po b/web_responsive/i18n/ca.po new file mode 100644 index 0000000..b30be8c --- /dev/null +++ b/web_responsive/i18n/ca.po @@ -0,0 +1,166 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-02-17 10:45+0000\n" +"Last-Translator: claudiagn \n" +"Language-Team: none\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posició del chatter" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "Tancar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Crear" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Descartar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "Maximitzar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "Minimitzar" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "Normal" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Accions ràpides" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Buscar menús..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "Torn" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "De costat" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Usuaris" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "fals" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" +"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" diff --git a/web_responsive/i18n/da.po b/web_responsive/i18n/da.po new file mode 100644 index 0000000..7b05e3e --- /dev/null +++ b/web_responsive/i18n/da.po @@ -0,0 +1,183 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-11-08 09:16+0000\n" +"Last-Translator: Hans Henrik Gabelgaard \n" +"Language-Team: none\n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Log position" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "Luk" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Opret" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Kassér" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Rediger" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "Maksimer" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "Minimer" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Quick handlinger" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Gem" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Søg menu..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "Side" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Brugere" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" + +#~ msgid "Toggle App Drawer" +#~ msgstr "Skift App skuffe" + +#~ msgid "Toggle Navigation" +#~ msgstr "Skift navigation" + +#~ msgid "Apps" +#~ msgstr "Applikationer" + +#~ msgid "More" +#~ msgstr "Mere" + +#~ msgid "More " +#~ msgstr "Mere " + +#~ msgid "Task" +#~ msgstr "Opgave" diff --git a/web_responsive/i18n/de.po b/web_responsive/i18n/de.po new file mode 100644 index 0000000..ce39568 --- /dev/null +++ b/web_responsive/i18n/de.po @@ -0,0 +1,179 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +# Translators: +# Niki Waibel , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-03 01:37+0000\n" +"PO-Revision-Date: 2017-02-03 01:37+0000\n" +"Last-Translator: Niki Waibel , 2017\n" +"Language-Team: German (https://www.transifex.com/oca/teams/23907/de/)\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" + +#~ msgid "Toggle App Drawer" +#~ msgstr "App Ordner umschalten" + +#~ msgid "Toggle Navigation" +#~ msgstr "Navigation umschalten" + +#~ msgid "Apps" +#~ msgstr "Apps" + +#~ msgid "More " +#~ msgstr "Mehr " diff --git a/web_responsive/i18n/es.po b/web_responsive/i18n/es.po new file mode 100644 index 0000000..5b67baf --- /dev/null +++ b/web_responsive/i18n/es.po @@ -0,0 +1,169 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +# Translators: +# Pedro M. Baeza , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-01-10 10:49+0000\n" +"PO-Revision-Date: 2020-09-16 14:00+0000\n" +"Last-Translator: claudiagn \n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posición del chatter" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "Cerrar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Crear" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Descartar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "Maximizar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "Minimizar" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "Normal" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Acciones rápidas" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Guardar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Buscar menús..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "Cambiar" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "Lateral" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "falso" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" +"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" diff --git a/web_responsive/i18n/fr.po b/web_responsive/i18n/fr.po new file mode 100644 index 0000000..fd66506 --- /dev/null +++ b/web_responsive/i18n/fr.po @@ -0,0 +1,166 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-06-28 14:48+0000\n" +"Last-Translator: Rémi \n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Position du Chatter" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "Fermer" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Créer" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Annuler" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Modifier" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "Agrandir" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "Réduire" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "Normal" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Actions rapides" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Sauvegarder" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Rechercher dans les menus..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "Maj." + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "À coté" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Utilisateurs" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "faux" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" +"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" diff --git a/web_responsive/i18n/hr.po b/web_responsive/i18n/hr.po new file mode 100644 index 0000000..775f7e9 --- /dev/null +++ b/web_responsive/i18n/hr.po @@ -0,0 +1,181 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-04-28 18:03+0000\n" +"PO-Revision-Date: 2019-11-18 14:34+0000\n" +"Last-Translator: Bole \n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Pozicija razgovora" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Kreiraj" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Odbaci" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Uredi" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "Normalno" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Brze radnje" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Spremi" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Pretraži izbornike..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "Bočno" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Korisnici" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" + +#~ msgid "Toggle App Drawer" +#~ msgstr "Izmjeni izbornik aplikacije" + +#~ msgid "Toggle Navigation" +#~ msgstr "Izmjeni navigaciju" + +#~ msgid "Apps" +#~ msgstr "Apikacije" + +#~ msgid "More " +#~ msgstr "Više " diff --git a/web_responsive/i18n/it.po b/web_responsive/i18n/it.po new file mode 100644 index 0000000..4fb2d15 --- /dev/null +++ b/web_responsive/i18n/it.po @@ -0,0 +1,166 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-03-07 18:45+0000\n" +"Last-Translator: Sergio Zanchetta \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posizione chat" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "Chiudi" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Crea" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Modifica" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "Massimizza" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "Minimizza" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Azioni rapide" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Salva" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Ricerca menù..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Utenti" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" +"modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" diff --git a/web_responsive/i18n/pt.po b/web_responsive/i18n/pt.po new file mode 100644 index 0000000..0a0bedc --- /dev/null +++ b/web_responsive/i18n/pt.po @@ -0,0 +1,165 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-08-12 11:44+0000\n" +"Last-Translator: Pedro Castro Silva \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.7.1\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posição do Chatter" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Criar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Descartar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "Normal" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Ações rápidas" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Gravar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Procurar menus..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "Lateralizado" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Utilizadores" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" diff --git a/web_responsive/i18n/pt_BR.po b/web_responsive/i18n/pt_BR.po new file mode 100644 index 0000000..ae08c7c --- /dev/null +++ b/web_responsive/i18n/pt_BR.po @@ -0,0 +1,184 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +# Translators: +# Rodrigo de Almeida Sottomaior Macedo , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-22 08:27+0000\n" +"PO-Revision-Date: 2019-08-30 15:23+0000\n" +"Last-Translator: Rodrigo Macedo \n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/" +"teams/23907/pt_BR/)\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "Posição do Chatter" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "Criar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "Descartar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "Normal" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "Ações rápidas" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "Salvar" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "Pesquisar menus..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "Frente e verso" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "Usuários" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" + +#~ msgid "Toggle App Drawer" +#~ msgstr "Aplicativo Desenhador Alternativo" + +#~ msgid "Toggle Navigation" +#~ msgstr "Navegação Alternativa" + +#~ msgid "Apps" +#~ msgstr "Aplicativos" + +#~ msgid "HTTP routing" +#~ msgstr "roteamento HTTP" + +#~ msgid "More " +#~ msgstr "Mais " diff --git a/web_responsive/i18n/zh_CN.po b/web_responsive/i18n/zh_CN.po new file mode 100644 index 0000000..fbabdad --- /dev/null +++ b/web_responsive/i18n/zh_CN.po @@ -0,0 +1,165 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_responsive +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-09-01 12:52+0000\n" +"Last-Translator: 黎伟杰 <674416404@qq.com>\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.8\n" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:9 +#, python-format +msgid "#menu_id=#{app.menuID}&action_id=#{app.actionID}" +msgstr "#menu_id=#{app.menuID}&action_id=#{app.actionID}" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Alt" +msgstr "" + +#. module: web_responsive +#: model:ir.model.fields,field_description:web_responsive.field_res_users__chatter_position +msgid "Chatter Position" +msgstr "聊天位置" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:18 +#, python-format +msgid "Close" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:40 +#: code:addons/web_responsive/static/src/xml/menu.xml:52 +#, python-format +msgid "Control" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:57 +#: code:addons/web_responsive/static/src/xml/form_view.xml:96 +#, python-format +msgid "Create" +msgstr "创建" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:71 +#: code:addons/web_responsive/static/src/xml/form_view.xml:110 +#, python-format +msgid "Discard" +msgstr "丢弃" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:50 +#, python-format +msgid "Edit" +msgstr "编辑" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:16 +#, python-format +msgid "Maximize" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:17 +#, python-format +msgid "Minimize" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Normal" +msgstr "正常" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:27 +#, python-format +msgid "Quick actions" +msgstr "快捷方式" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/form_view.xml:64 +#: code:addons/web_responsive/static/src/xml/form_view.xml:103 +#, python-format +msgid "Save" +msgstr "保存" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/apps.xml:35 +#, python-format +msgid "Search menus..." +msgstr "搜索菜单..." + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:35 +#, python-format +msgid "Select menu" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:29 +#: code:addons/web_responsive/static/src/xml/menu.xml:37 +#: code:addons/web_responsive/static/src/xml/menu.xml:49 +#, python-format +msgid "Shift" +msgstr "" + +#. module: web_responsive +#: selection:res.users,chatter_position:0 +msgid "Sided" +msgstr "侧面" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/menu.xml:47 +#, python-format +msgid "User menu" +msgstr "" + +#. module: web_responsive +#: model:ir.model,name:web_responsive.model_res_users +msgid "Users" +msgstr "用户" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:9 +#, python-format +msgid "false" +msgstr "" + +#. module: web_responsive +#. openerp-web +#: code:addons/web_responsive/static/src/xml/document_viewer.xml:8 +#, python-format +msgid "modal o_modal_fullscreen o_document_viewer o_responsive_document_viewer" +msgstr "" diff --git a/web_responsive/models/__init__.py b/web_responsive/models/__init__.py new file mode 100644 index 0000000..8835165 --- /dev/null +++ b/web_responsive/models/__init__.py @@ -0,0 +1 @@ +from . import res_users diff --git a/web_responsive/models/res_users.py b/web_responsive/models/res_users.py new file mode 100644 index 0000000..7b80a97 --- /dev/null +++ b/web_responsive/models/res_users.py @@ -0,0 +1,26 @@ +# Copyright 2018 Alexandre Díaz +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ResUsers(models.Model): + _inherit = 'res.users' + + chatter_position = fields.Selection([ + ('normal', 'Normal'), + ('sided', 'Sided'), + ], string="Chatter Position", default='normal') + + def __init__(self, pool, cr): + """ Override of __init__ to add access rights. + Access rights are disabled by default, but allowed on some specific + fields defined in self.SELF_{READ/WRITE}ABLE_FIELDS. + """ + super(ResUsers, self).__init__(pool, cr) + # duplicate list to avoid modifying the original reference + type(self).SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS) + type(self).SELF_WRITEABLE_FIELDS.extend(['chatter_position']) + # duplicate list to avoid modifying the original reference + type(self).SELF_READABLE_FIELDS = list(self.SELF_READABLE_FIELDS) + type(self).SELF_READABLE_FIELDS.extend(['chatter_position']) diff --git a/web_responsive/readme/CONTRIBUTORS.rst b/web_responsive/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..d46ef94 --- /dev/null +++ b/web_responsive/readme/CONTRIBUTORS.rst @@ -0,0 +1,6 @@ +* Dave Lasley +* Jairo Llopis +* Dennis Sluijk +* Sergio Teruel +* Alexandre Díaz +* Mathias Markl diff --git a/web_responsive/readme/DESCRIPTION.rst b/web_responsive/readme/DESCRIPTION.rst new file mode 100644 index 0000000..26ab984 --- /dev/null +++ b/web_responsive/readme/DESCRIPTION.rst @@ -0,0 +1,87 @@ +This module adds responsiveness to web backend. + +Features for all devices: + +* New navigation with an app drawer + + .. image:: https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif + +* Quick menu search from the app drawer + + .. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif + +Features for mobile: + +* App-specific submenus are shown on full screen when toggling them from the + "hamburger" menu + + .. image:: https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif + +* View type picker dropdown displays confortably + + .. image:: https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif + +* Top app bar is always visible, but the control panel is hidden when + scrolling down, to save some vaulable vertical space + + .. image:: https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif + +* Form status bar action and status buttons are collapsed in dropdowns. + Other control panel buttons use icons to save space. + + .. image:: https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif + +* Breadcrumbs navigation is collapsed with a "back arrow" button. + + .. image:: https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif + +Features for computers: + +* Keyboard shortcuts for easier navigation, **using ``Alt + Shift + [key]``** + combination instead of just ``Alt + [key]``. + See https://github.com/odoo/odoo/issues/30068 to understand why. + + .. image:: https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png + + +* Autofocus on search menu box when opening the drawer + + .. image:: https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif + +* Set chatter on the side of the screen, optional per user + + .. image:: https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif + +* Full width form sheets + + .. image:: https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png + +* Sticky chatter topbar + + .. image:: ../static/img/chatter_topbar.gif + +* AppMenu waits for action finished to show the view + + .. image:: ../static/img/appmenu.gif + +* Sticky header & footer in list view + + .. image:: ../static/img/listview.gif + +* Sticky statusbar in form view + + .. image:: ../static/img/formview.gif + +* Followers and send button is displayed on mobile. Avatar is hidden. + + .. image:: ../static/img/chatter.gif + +* When the chatter is configured on the side part, the document viewer fills that + part for side-by-side reading instead of full screen. You can still put it on full + width preview clicking on the new maximize button. + + .. image:: ../static/img/document_viewer.gif + +* Bigger checkboxes in list view + + .. image:: ../static/img/big_checkboxes.gif diff --git a/web_responsive/readme/ROADMAP.rst b/web_responsive/readme/ROADMAP.rst new file mode 100644 index 0000000..f6a669c --- /dev/null +++ b/web_responsive/readme/ROADMAP.rst @@ -0,0 +1,7 @@ +* To view the full experience in a device, the page must be loaded with the + device screen size. This means that, if you change the size of your browser, + you should reload the web client to get the full experience for that + new size. This is Odoo's own limitation. +* App navigation with keyboard. +* Make it more beautiful. Maybe OCA-branded? +* Handle long titles on forms in a better way diff --git a/web_responsive/readme/USAGE.rst b/web_responsive/readme/USAGE.rst new file mode 100644 index 0000000..d340c78 --- /dev/null +++ b/web_responsive/readme/USAGE.rst @@ -0,0 +1,9 @@ +The following keyboard shortcuts are implemented: + +* Toggle app drawer - ``Alt + Shift + A`` +* Navigate app search results - Arrow keys +* Choose app result - ``Enter`` +* ``Esc`` to close app drawer + + +Also you can access to the user menu, with ``Alt + Shift + U`` diff --git a/web_responsive/static/description/icon.png b/web_responsive/static/description/icon.png new file mode 100644 index 0000000..3a0328b Binary files /dev/null and b/web_responsive/static/description/icon.png differ diff --git a/web_responsive/static/description/index.html b/web_responsive/static/description/index.html new file mode 100644 index 0000000..be3f331 --- /dev/null +++ b/web_responsive/static/description/index.html @@ -0,0 +1,521 @@ + + + + + + +Web Responsive + + + +
+

Web Responsive

+ + +

Beta License: LGPL-3 OCA/web Translate me on Weblate Try me on Runbot

+

This module adds responsiveness to web backend.

+

Features for all devices:

+
    +
  • New navigation with an app drawer

    +https://user-images.githubusercontent.com/973709/48417193-09a1e080-e74a-11e8-8a0c-e73eb689b2fb.gif +
  • +
  • Quick menu search from the app drawer

    +https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif +
  • +
+

Features for mobile:

+
    +
  • App-specific submenus are shown on full screen when toggling them from the +“hamburger” menu

    +https://user-images.githubusercontent.com/973709/48417297-51286c80-e74a-11e8-9a47-22c810b18c43.gif +
  • +
  • View type picker dropdown displays confortably

    +https://user-images.githubusercontent.com/973709/50964322-e3d55580-14c6-11e9-8249-48db9539600f.gif +
  • +
  • Top app bar is always visible, but the control panel is hidden when +scrolling down, to save some vaulable vertical space

    +https://user-images.githubusercontent.com/973709/50964496-5cd4ad00-14c7-11e9-9261-fd223a329d02.gif +
  • +
  • Form status bar action and status buttons are collapsed in dropdowns. +Other control panel buttons use icons to save space.

    +https://user-images.githubusercontent.com/973709/50965446-e08f9900-14c9-11e9-92d6-dda472cb6557.gif +
  • +
  • Breadcrumbs navigation is collapsed with a “back arrow” button.

    +https://user-images.githubusercontent.com/973709/50965168-1d0ec500-14c9-11e9-82a0-dfee82ed0861.gif +
  • +
+

Features for computers:

+
    +
  • Keyboard shortcuts for easier navigation, using ``Alt + Shift + [key]`` +combination instead of just Alt + [key]. +See https://github.com/odoo/odoo/issues/30068 to understand why.

    +https://user-images.githubusercontent.com/973709/48417578-ff341680-e74a-11e8-8881-017709e912bc.png +
  • +
  • Autofocus on search menu box when opening the drawer

    +https://user-images.githubusercontent.com/973709/48417213-17576600-e74a-11e8-846a-57691e82636b.gif +
  • +
  • Set chatter on the side of the screen, optional per user

    +https://user-images.githubusercontent.com/973709/48417270-41108d00-e74a-11e8-9172-cba825d027ed.gif +
  • +
  • Full width form sheets

    +https://user-images.githubusercontent.com/973709/48417428-ac5a5f00-e74a-11e8-8839-5bc538c54c1d.png +
  • +
  • Sticky chatter topbar

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/chatter_topbar.gif +
  • +
  • AppMenu waits for action finished to show the view

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/appmenu.gif +
  • +
  • Sticky header & footer in list view

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/listview.gif +
  • +
  • Sticky statusbar in form view

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/formview.gif +
  • +
  • Followers and send button is displayed on mobile. Avatar is hidden.

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/chatter.gif +
  • +
  • When the chatter is configured on the side part, the document viewer fills that +part for side-by-side reading instead of full screen. You can still put it on full +width preview clicking on the new maximize button.

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/document_viewer.gif +
  • +
  • Bigger checkboxes in list view

    +https://raw.githubusercontent.com/OCA/web/12.0/web_responsive/static/img/big_checkboxes.gif +
  • +
+

Table of contents

+ +
+

Usage

+

The following keyboard shortcuts are implemented:

+
    +
  • Toggle app drawer - Alt + Shift + A
  • +
  • Navigate app search results - Arrow keys
  • +
  • Choose app result - Enter
  • +
  • Esc to close app drawer
  • +
+

Also you can access to the user menu, with Alt + Shift + U

+
+
+

Known issues / Roadmap

+
    +
  • To view the full experience in a device, the page must be loaded with the +device screen size. This means that, if you change the size of your browser, +you should reload the web client to get the full experience for that +new size. This is Odoo’s own limitation.
  • +
  • App navigation with keyboard.
  • +
  • Make it more beautiful. Maybe OCA-branded?
  • +
  • Handle long titles on forms in a better way
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • LasLabs
  • +
  • Tecnativa
  • +
  • Alexandre Díaz
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/web project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/web_responsive/static/img/appmenu.gif b/web_responsive/static/img/appmenu.gif new file mode 100644 index 0000000..411937b Binary files /dev/null and b/web_responsive/static/img/appmenu.gif differ diff --git a/web_responsive/static/img/big_checkboxes.gif b/web_responsive/static/img/big_checkboxes.gif new file mode 100644 index 0000000..a346920 Binary files /dev/null and b/web_responsive/static/img/big_checkboxes.gif differ diff --git a/web_responsive/static/img/chatter.gif b/web_responsive/static/img/chatter.gif new file mode 100644 index 0000000..0a2af93 Binary files /dev/null and b/web_responsive/static/img/chatter.gif differ diff --git a/web_responsive/static/img/chatter_topbar.gif b/web_responsive/static/img/chatter_topbar.gif new file mode 100644 index 0000000..e0522c5 Binary files /dev/null and b/web_responsive/static/img/chatter_topbar.gif differ diff --git a/web_responsive/static/img/document_viewer.gif b/web_responsive/static/img/document_viewer.gif new file mode 100644 index 0000000..70b0cb8 Binary files /dev/null and b/web_responsive/static/img/document_viewer.gif differ diff --git a/web_responsive/static/img/formview.gif b/web_responsive/static/img/formview.gif new file mode 100644 index 0000000..688bbc9 Binary files /dev/null and b/web_responsive/static/img/formview.gif differ diff --git a/web_responsive/static/img/listview.gif b/web_responsive/static/img/listview.gif new file mode 100644 index 0000000..ebdcac8 Binary files /dev/null and b/web_responsive/static/img/listview.gif differ diff --git a/web_responsive/static/src/css/web_responsive.scss b/web_responsive/static/src/css/web_responsive.scss new file mode 100644 index 0000000..4c16341 --- /dev/null +++ b/web_responsive/static/src/css/web_responsive.scss @@ -0,0 +1,763 @@ +/* Copyright 2018 Tecnativa - Jairo Llopis + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +$chatter_zone_width: 35%; + +@mixin full-screen-dropdown { + border: none; + box-shadow: none; + display: flex; + flex-direction: column; + height: calc(100vh - #{$o-navbar-height}); + max-height: calc(100vh - #{$o-navbar-height}); + position: fixed; + width: 100vw; + z-index: 100; + // Inline style will override our `top`, so we need !important here + top: $o-navbar-height !important; + transform: none !important; +} + +// Support for long titles +@include media-breakpoint-up(md) { + .o_form_view .oe_button_box + .oe_title, + .o_form_view .oe_button_box + .oe_avatar + .oe_title { + /* Button-box has a hardcoded width of 132px per button and have three columns */ + width: calc(100% - 450px); + } +} + +// Main navbar (with apps menu, user menu, debug menu...) +@include media-breakpoint-down(sm) { + .o_main_navbar { + // This allows to have a sane layout for mobiles + display: flex; + + // Remove clutter to only have small icons that fit in a small screen + > .dropdown { + display: flex; + + .navbar-toggler { + color: white; + } + + .o_menu_sections, + .o_menu_systray, + { + padding: 0; + } + } + + // Whitespace before systray icons + .o_menu_systray { + margin-left: auto; + } + + // Hide big things + .o_menu_brand, + .o_menu_sections, + .oe_topbar_name, + { + display: none; + } + + // Fix toggler button padding + .o-menu-toggle { + cursor: pointer; + padding: 0 $o-horizontal-padding; + } + + // Custom fullscreen layout when showing submenus + .o_menu_sections.show { + @include full-screen-dropdown(); + background-color: $dropdown-bg; + overflow: auto; + + .show { + display: flex; + flex-direction: column; + + .dropdown-menu { + margin-left: 1rem; + min-width: auto; + width: calc(100vw - 2rem); + } + } + + > li, + .o_menu_entry_lvl_1, + .o_menu_header_lvl_1, + { + // Homogeneous background color + background-color: $dropdown-bg; + color: $dropdown-link-color; + + &:hover { + background-color: $dropdown-link-hover-bg; + color: $dropdown-link-hover-color; + } + + // Disable the .o-no-caret class effect, to display the caret + &.o-no-caret::after { + content: ""; + } + + // Fix a strange glitch leaving headers invisible + .dropdown-header { + color: $dropdown-header-color; + } + } + } + + // Custom fullscreen layout for systray items + .o_mail_systray_dropdown.show { + @include full-screen-dropdown(); + + // Fix stretchy images + .o_mail_preview_image { + align-items: center; + display: flex; + flex-direction: row; + + img { + display: block; + height: auto; + } + } + } + + // Higher height for dropdown items, for those with sausage fingers + .dropdown-menu .dropdown-item { + padding: { + bottom: 0.5rem; + top: 0.5rem; + } + } + } +} + +// Iconized full screen apps menu +.o_menu_apps { + + .search-input:focus { + border-color: $o-brand-primary; + } + + .dropdown-menu.show { + @include full-screen-dropdown(); + + // Display apps in a grid + align-content: flex-start; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + + @include media-breakpoint-up(lg) { + padding: { + left: 20vw; + right: 20vw; + } + } + + .o_app { + align-items: center; + display: flex; + flex-direction: column; + justify-content: flex-start; + + // Size depends on screen + width: 33.33333333%; + @include media-breakpoint-up(sm) { + width: 25%; + } + @include media-breakpoint-up(md) { + width: 16.6666666%; + } + } + + // Hide app icons when searching + .has-results ~ .o_app { + display: none; + } + + .o-app-icon { + height: auto; + max-width: 7rem; + } + + // Search input for menus + .form-row { + width: 100%; + } + + .o-menu-search-result { + align-items: center; + background-position: left; + background-repeat: no-repeat; + background-size: contain; + cursor: pointer; + display: flex; + padding-left: 3rem; + white-space: normal; + } + + // Allow to scroll only on results, keeping static search box above + .search-container.has-results { + height: 100%; + + .search-input { + height: 3em; + } + + .search-results { + height: calc(100% - 3em); + overflow: auto; + } + } + } +} + +// Scroll all but top bar +html .o_web_client .o_main .o_main_content { + @include media-breakpoint-down(sm) { + overflow: auto; + + .o_content { + overflow: initial; + } + } + + max-width: 100%; +} + +// Control panel (breadcrumbs, search box, buttons...) +.o_control_panel { + .o_search_options { + flex-grow: 1; + + > div { + width: 100%; + + + > .btn-group { + max-width: 33%; + + .o_dropdown_toggler_btn { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + } + } + } + } + + .o_filters_menu { + .o_menu_item { + @include o-search-options-dropdown-custom-item; + + a { + overflow: hidden; + text-overflow: ellipsis; + } + } + } +} + +.o_pager_counter { + white-space: nowrap; +} + +@include media-breakpoint-down(sm) { + .o_control_panel { + // Arrange buttons to use space better + .breadcrumb, + .o_cp_buttons, + .o_cp_left, + .o_cp_right, + .o_cp_searchview, + { + flex: 1 1 100%; + @include media-breakpoint-up(md) { + flex-basis: 50%; + } + } + + .breadcrumb { + flex-basis: 80%; + } + + .o_cp_searchview, + .o_cp_right, + { + flex-basis: 10%; + } + + .o_cp_left { + flex-basis: 50%; + white-space: nowrap; + } + + .o_cp_pager { + white-space: nowrap; + } + + // Hide all but 2 last breadcrumbs, and render 2nd-to-last as arrow + .breadcrumb-item { + &:not(.active) { + padding-left: 0; + } + + &::before { + content: none; + padding-right: 0; + } + + &:nth-last-of-type(1n+3) { + display: none; + } + + &:nth-last-of-type(2) { + &::before { + color: var(--primary); + content: "\f048"; // .fa-step-backward + cursor: pointer; + font-family: FontAwesome; + } + + a { + display: none; + } + } + } + + // Ellipsize long breadcrumbs + .breadcrumb { + max-width: 100%; + text-overflow: ellipsis; + } + + // Empty sidebar should not break layout + .o_cp_sidebar:blank { + display: none; + } + + // In case you install `mail`, there is a mess on BS vs inline styles + // we need to fix + .o_cp_buttons .btn.d-block:not(.d-none) { + display: inline-block !important; + } + + // Dropdown with buttons to switch the view type + .o_cp_switch_buttons.show { + .dropdown-menu { + align-content: center; + display: flex; + flex-direction: row; + justify-content: space-around; + padding: 0; + + .btn { + border: { + bottom: 0; + radius: 0; + top: 0; + } + } + } + } + } +} + +// Normal views +.o_content, .modal-content { + max-width: 100%; + + // Form views + .o_form_view { + .o_form_sheet { + max-width: calc(100% - 32px); + overflow-x: auto; + + .oe_button_box { + .o_dropdown_more { + padding: 0.1em; + width: min-content; + } + } + } + + // Sticky statusbar + .o_form_statusbar { + position: sticky; + top: 0; + z-index: 2; + } + + // Support for long title (with ellipsis) + .oe_title { + span.o_field_widget { + &:not(.oe_inline) { + max-width: 100%; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + width: initial; + + &:active { + white-space: normal; + } + } + } + } + + @include media-breakpoint-down(sm) { + min-width: auto; + + // Avoid overflow on forms with title and/or button box + .oe_button_box, + .oe_title, + { + max-width: 100%; + } + + .oe_button_box + .oe_title, + .oe_button_box + .oe_avatar + .oe_title { + width: 100%; + } + + // Avoid overflow on modals + .o_form_sheet { + min-width: auto; + } + + // Render website inputs properly in phones + .o_group .o_field_widget.o_text_overflow { + // Overrides another !important + width: auto !important; + } + + // Make all input groups vertical + .o_group_col_6 { + width: 100%; + } + + // Statusbar buttons dropdown for mobiles + .o_statusbar_buttons_dropdown { + border: { + bottom: 0; + radius: 0; + top: 0; + } + height: 100%; + } + .o_statusbar_buttons > .btn { + border-radius: 0; + border: 0; + width: 100%; + margin-bottom: 0.2rem; + + &:last-child { + margin-bottom: 0; + } + } + + .o_statusbar_status { + // Arrow from rightmost button exceeds allowed width + .o_arrow_button:first-child::before { + content: none; + display: none; + } + } + + // Full width in form sheets + .o_form_sheet, + .oe_chatter, + { + min-width: auto; + max-width: 98%; + } + + // Settings pages + .app_settings_block { + .row { + margin: 0; + } + } + + .o_chatter { + // Display send button on small screens + .o_thread_composer { + padding-left: $o-mail-thread-avatar-size*0.5; + + .o_composer_button_send { + display: initial !important; // Forced in core + } + .o_chatter_avatar { + display: none; + } + } + + .o_chatter_topbar { + height: auto; + flex-wrap: wrap-reverse; + + > .o_topbar_right_area { + flex: 1 0 auto; + flex-wrap: wrap; + max-width: 100%; + + // Display followers on small screens + .o_followers { + display: initial !important; // Forced in core + + @include media-breakpoint-down(xs) { + padding-bottom: 50px; + } + } + } + } + } + } + } + + // Sided chatter, if user wants + .o_chatter_position_sided & { + @include media-breakpoint-up(lg) { + .o_form_view:not(.o_form_nosheet) { + display: flex; + flex-flow: row nowrap; + height: 100%; + + .o_form_sheet_bg { + flex: 1 1 auto; + overflow: auto; + + > .o_form_sheet { + min-width: unset; + + .oe_subtotal_footer .popover { + /* This is an inaccurate workaround for a problem with how Odoo places the popover + * See: https://github.com/odoo/odoo/blob/12.0/addons/account/static/src/js/account_payment_field.js#L83 + */ + position: fixed !important; + top: 11.4em !important; + } + } + } + + .o_chatter { + border-left: 1px solid gray('400'); + flex: 0 0 $chatter_zone_width; + max-width: initial; + min-width: initial; + overflow: auto; + + .o_chatter_header_container { + padding-top: $grid-gutter-width * 0.5; + top: 0; + position: sticky; + background-color: $o-view-background-color; + z-index: 1; + + .o_chatter_topbar { + margin-top: 0; + flex-wrap: wrap; + height: auto; + button:last-of-type { + flex: 1 0 auto; + text-align: left; + } + + .o_topbar_right_area { + order: -10; + flex: 0 1 100%; + border-bottom-color: transparent; + } + } + + // Scrollable input text to avoid hide conversation & buttons + .o_composer_text_field { + max-height: 120px; + overflow-y: auto !important; /* Forced because Odoo uses inline style */ + } + .o_attachments_list { + overflow: auto; + max-height: $o-mail-attachment-image-size * 3; + margin-top: 0.4em; + } + .o_attachments_previews { + overflow: auto; + max-height: $o-mail-attachment-image-size * 6; + } + } + } + } + } + } +} + +// Sticky Header & Footer in List View +.table-responsive { + overflow-x: initial; + + .o_list_view { + // th & td are here for compatibility with chrome + thead, thead tr:nth-child(1) th { + position: sticky; + top: 0; + z-index: 1; + } + thead tr:nth-child(1) th { + background-color: $o-list-footer-bg-color; + } + tfoot, tfoot tr:nth-child(1) td { + position: sticky; + bottom: 0; + } + tfoot tr:nth-child(1) td { + background-color: $o-list-footer-bg-color; + } + } +} + +// Big checkboxes +.o_list_view { + .o_list_record_selector { + .custom-checkbox { + margin-right: 10px; + .custom-control-label { + top: -19px; + } + } + } + .o_data_cell:not(.o_boolean_toggle_cell) { + .custom-checkbox .custom-control-label { + top: -6px; + } + } + .custom-checkbox { + margin-right: 10px; + + .custom-control-label { + &::after { + width: 24px; + height: 24px; + } + &::before { + outline: none !important; + border: 1px solid #4c4c4c; + width: 24px; + height: 24px; + } + } + } +} + +// Waiting Cursor +.oe_wait { + cursor: progress; +} + +// Document Viewer +.o_web_client.o_chatter_position_sided { + .o_modal_fullscreen.o_document_viewer { + // On-top of navbar + z-index: 10; + + &.o_responsive_document_viewer { + /* Show sided viewer on large screens */ + @include media-breakpoint-up(lg) { + width: $chatter_zone_width; + margin-left: auto; + + /* Show/Hide control buttons (next, prev, etc..) */ + &:hover .arrow, &:hover .o_viewer_toolbar { + display: unset; + } + .arrow, .o_viewer_toolbar { + display: none; + } + + .o_viewer_img_wrapper { + position: relative; + + .o_viewer_pdf { + width: 95%; + } + } + } + + .o_minimize_btn { + display: none; + } + } + &:not(.o_responsive_document_viewer) { + .o_maximize_btn { + display: none; + } + } + @include media-breakpoint-down(lg) { + .o_minimize_btn, .o_maximize_btn { + display: none; + } + } + } +} +/* Max/Min buttons only are usefull in sided mode */ +.o_web_client:not(.o_chatter_position_sided) { + .o_minimize_btn, .o_maximize_btn { + display: none; + } +} +// Apply improvements for Document Viewer on all modes +.o_modal_fullscreen .o_viewer_content { + .o_viewer-header { + .o_image_caption { + display: contents; + + .o_split_pdf_area { + padding: 16px; + margin-bottom: 0; + position: relative; + top: -5px; + + label { + margin-bottom: unset; + } + + .o_page_number_input { + border: 1px solid white; + border-radius: 3px; + } + } + + /* Hide 'split pdf' feature on small screens */ + @include media-breakpoint-down(xs) { + .o_split_pdf_area { + display: none; + } + } + } + + // Now uses a container to have more buttons + .o_buttons { + min-width: 35px; + text-align: right; + + // Now close button ('X') it's a fa-icon + > .o_close_btn { + top: unset; + left: unset; + bottom: unset; + right: unset; + font-size: unset; + font-weight: unset; + } + } + } + + .o_viewer_toolbar { + width: max-content; + } +} diff --git a/web_responsive/static/src/js/web_responsive.js b/web_responsive/static/src/js/web_responsive.js new file mode 100644 index 0000000..2611f12 --- /dev/null +++ b/web_responsive/static/src/js/web_responsive.js @@ -0,0 +1,561 @@ +/* Copyright 2018 Tecnativa - Jairo Llopis + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +odoo.define('web_responsive', function (require) { + 'use strict'; + + var ActionManager = require('web.ActionManager'); + var AbstractWebClient = require("web.AbstractWebClient"); + var AppsMenu = require("web.AppsMenu"); + var BasicController = require('web.BasicController'); + var config = require("web.config"); + var core = require("web.core"); + var FormRenderer = require('web.FormRenderer'); + var Menu = require("web.Menu"); + var RelationalFields = require('web.relational_fields'); + var Chatter = require('mail.Chatter'); + var DocumentViewer = require('mail.DocumentViewer'); + var ListRenderer = require('web.ListRenderer'); + + + /* Hide AppDrawer in desktop and mobile modes. + * To avoid delays in pages with a lot of DOM nodes we make + * sub-groups' with 'querySelector' to improve the performance. + */ + function closeAppDrawer () { + _.defer(function () { + // Need close AppDrawer? + var menu_apps_dropdown = document.querySelector( + '.o_menu_apps .dropdown'); + $(menu_apps_dropdown).has('.dropdown-menu.show') + .find('> a').dropdown('toggle'); + // Need close Sections Menu? + // TODO: Change to 'hide' in modern Bootstrap >4.1 + var menu_sections = document.querySelector( + '.o_menu_sections li.show .dropdown-toggle'); + $(menu_sections).dropdown('toggle'); + // Need close Mobile? + var menu_sections_mobile = document.querySelector( + '.o_menu_sections.show'); + $(menu_sections_mobile).collapse('hide'); + }); + } + + /** + * Reduce menu data to a searchable format understandable by fuzzy.js + * + * `AppsMenu.init()` gets `menuData` in a format similar to this (only + * relevant data is shown): + * + * ```js + * { + * [...], + * children: [ + * // This is a menu entry: + * { + * action: "ir.actions.client,94", // Or `false` + * children: [... similar to above "children" key], + * name: "Actions", + * parent_id: [146, "Settings/Technical/Actions"], // Or `false` + * }, + * ... + * ] + * } + * ``` + * + * This format is very hard to process to search matches, and it would + * slow down the search algorithm, so we reduce it with this method to be + * able to later implement a simpler search. + * + * @param {Object} memo + * Reference to current result object, passed on recursive calls. + * + * @param {Object} menu + * A menu entry, as described above. + * + * @returns {Object} + * Reduced object, without entries that have no action, and with a + * format like this: + * + * ```js + * { + * "Discuss": {Menu entry Object}, + * "Settings": {Menu entry Object}, + * "Settings/Technical/Actions/Actions": {Menu entry Object}, + * ... + * } + * ``` + */ + function findNames (memo, menu) { + if (menu.action) { + var key = menu.parent_id ? menu.parent_id[1] + "/" : ""; + memo[key + menu.name] = menu; + } + if (menu.children.length) { + _.reduce(menu.children, findNames, memo); + } + return memo; + } + + AppsMenu.include({ + events: _.extend({ + "keydown .search-input input": "_searchResultsNavigate", + "input .search-input input": "_searchMenusSchedule", + "click .o-menu-search-result": "_searchResultChosen", + "shown.bs.dropdown": "_searchFocus", + "hidden.bs.dropdown": "_searchReset", + "hide.bs.dropdown": "_hideAppsMenu", + }, AppsMenu.prototype.events), + + /** + * Rescue some menu data stripped out in original method. + * + * @override + */ + init: function (parent, menuData) { + this._super.apply(this, arguments); + // Keep base64 icon for main menus + for (var n in this._apps) { + this._apps[n].web_icon_data = + menuData.children[n].web_icon_data; + } + // Store menu data in a format searchable by fuzzy.js + this._searchableMenus = _.reduce( + menuData.children, + findNames, + {} + ); + // Search only after timeout, for fast typers + this._search_def = $.Deferred(); + }, + + /** + * @override + */ + start: function () { + this.$search_container = this.$(".search-container"); + this.$search_input = this.$(".search-input input"); + this.$search_results = this.$(".search-results"); + return this._super.apply(this, arguments); + }, + + /** + * Prevent the menu from being opened twice + * + * @override + */ + _onAppsMenuItemClicked: function (ev) { + this._super.apply(this, arguments); + ev.preventDefault(); + ev.stopPropagation(); + }, + + /** + * Get all info for a given menu. + * + * @param {String} key + * Full path to requested menu. + * + * @returns {Object} + * Menu definition, plus extra needed keys. + */ + _menuInfo: function (key) { + var original = this._searchableMenus[key]; + return _.extend({ + action_id: parseInt(original.action.split(',')[1], 10), + }, original); + }, + + /** + * Autofocus on search field on big screens. + */ + _searchFocus: function () { + if (!config.device.isMobile) { + this.$search_input.focus(); + } + }, + + /** + * Reset search input and results + */ + _searchReset: function () { + this.$search_container.removeClass("has-results"); + this.$search_results.empty(); + this.$search_input.val(""); + }, + + /** + * Schedule a search on current menu items. + */ + _searchMenusSchedule: function () { + this._search_def.reject(); + this._search_def = $.Deferred(); + setTimeout(this._search_def.resolve.bind(this._search_def), 50); + this._search_def.done(this._searchMenus.bind(this)); + }, + + /** + * Search among available menu items, and render that search. + */ + _searchMenus: function () { + var query = this.$search_input.val(); + if (query === "") { + this.$search_container.removeClass("has-results"); + this.$search_results.empty(); + return; + } + var results = fuzzy.filter( + query, + _.keys(this._searchableMenus), + { + pre: "", + post: "", + } + ); + this.$search_container.toggleClass( + "has-results", + Boolean(results.length) + ); + this.$search_results.html( + core.qweb.render( + "web_responsive.MenuSearchResults", + { + results: results, + widget: this, + } + ) + ); + }, + + /** + * Use chooses a search result, so we navigate to that menu + * + * @param {jQuery.Event} event + */ + _searchResultChosen: function (event) { + event.preventDefault(); + event.stopPropagation(); + var $result = $(event.currentTarget), + text = $result.text().trim(), + data = $result.data(), + suffix = ~text.indexOf("/") ? "/" : ""; + // Load the menu view + this.trigger_up("menu_clicked", { + action_id: data.actionId, + id: data.menuId, + previous_menu_id: data.parentId, + }); + // Find app that owns the chosen menu + var app = _.find(this._apps, function (_app) { + return text.indexOf(_app.name + suffix) === 0; + }); + // Update navbar menus + core.bus.trigger("change_menu_section", app.menuID); + }, + + /** + * Navigate among search results + * + * @param {jQuery.Event} event + */ + _searchResultsNavigate: function (event) { + // Find current results and active element (1st by default) + var all = this.$search_results.find(".o-menu-search-result"), + pre_focused = all.filter(".active") || $(all[0]), + offset = all.index(pre_focused), + key = event.key; + // Keyboard navigation only supports search results + if (!all.length) { + return; + } + // Transform tab presses in arrow presses + if (key === "Tab") { + event.preventDefault(); + key = event.shiftKey ? "ArrowUp" : "ArrowDown"; + } + switch (key) { + // Pressing enter is the same as clicking on the active element + case "Enter": + pre_focused.click(); + break; + // Navigate up or down + case "ArrowUp": + offset--; + break; + case "ArrowDown": + offset++; + break; + default: + // Other keys are useless in this event + return; + } + // Allow looping on results + if (offset < 0) { + offset = all.length + offset; + } else if (offset >= all.length) { + offset -= all.length; + } + // Switch active element + var new_focused = $(all[offset]); + pre_focused.removeClass("active"); + new_focused.addClass("active"); + this.$search_results.scrollTo(new_focused, { + offset: { + top: this.$search_results.height() * -0.5, + }, + }); + }, + + /* + * Control if AppDrawer can be closed + */ + _hideAppsMenu: function () { + return !this.$('input').is(':focus'); + }, + }); + + BasicController.include({ + + /** + * Close the AppDrawer if the data set is dirty and a discard dialog + * is opened + * + * @override + */ + canBeDiscarded: function (recordID) { + if (this.model.isDirty(recordID || this.handle)) { + closeAppDrawer(); + } + return this._super.apply(this, arguments); + }, + }); + + Menu.include({ + events: _.extend({ + // Clicking a hamburger menu item should close the hamburger + "click .o_menu_sections [role=menuitem]": "_onClickMenuItem", + // Opening any dropdown in the navbar should hide the hamburger + "show.bs.dropdown .o_menu_systray, .o_menu_apps": + "_hideMobileSubmenus", + }, Menu.prototype.events), + + start: function () { + this.$menu_toggle = this.$(".o-menu-toggle"); + return this._super.apply(this, arguments); + }, + + /** + * Hide menus for current app if you're in mobile + */ + _hideMobileSubmenus: function () { + if ( + config.device.isMobile && + this.$menu_toggle.is(":visible") && + this.$section_placeholder.is(":visible") + ) { + this.$section_placeholder.collapse("hide"); + } + }, + + /** + * Prevent hide the menu (should be closed when action is loaded) + * + * @param {ClickEvent} ev + */ + _onClickMenuItem: function (ev) { + ev.stopPropagation(); + }, + + /** + * No menu brand in mobiles + * + * @override + */ + _updateMenuBrand: function () { + if (!config.device.isMobile) { + return this._super.apply(this, arguments); + } + }, + }); + + RelationalFields.FieldStatus.include({ + + /** + * Fold all on mobiles. + * + * @override + */ + _setState: function () { + this._super.apply(this, arguments); + if (config.device.isMobile) { + _.map(this.status_information, function (value) { + value.fold = true; + }); + } + }, + }); + + // Responsive view "action" buttons + FormRenderer.include({ + + /** + * In mobiles, put all statusbar buttons in a dropdown. + * + * @override + */ + _renderHeaderButtons: function () { + var $buttons = this._super.apply(this, arguments); + if ( + !config.device.isMobile || + !$buttons.is(":has(>:not(.o_invisible_modifier))") + ) { + return $buttons; + } + + // $buttons must be appended by JS because all events are bound + $buttons.addClass("dropdown-menu"); + var $dropdown = $(core.qweb.render( + 'web_responsive.MenuStatusbarButtons' + )); + $buttons.addClass("dropdown-menu").appendTo($dropdown); + return $dropdown; + }, + }); + + // Chatter Hide Composer + Chatter.include({ + _openComposer: function (options) { + if (this._composer && + options.isLog === this._composer.options.isLog && + this._composer.$el.is(':visible')) { + this._closeComposer(false); + } else { + this._super.apply(this, arguments); + } + }, + }); + + // Hide AppDrawer or Menu when the action has been completed + ActionManager.include({ + + /** + * @override + */ + _appendController: function () { + this._super.apply(this, arguments); + closeAppDrawer(); + }, + }); + + /** + * Use ALT+SHIFT instead of ALT as hotkey triggerer. + * + * HACK https://github.com/odoo/odoo/issues/30068 - See it to know why. + * + * Cannot patch in `KeyboardNavigationMixin` directly because it's a mixin, + * not a `Class`, and altering a mixin's `prototype` doesn't alter it where + * it has already been used. + * + * Instead, we provide an additional mixin to be used wherever you need to + * enable this behavior. + */ + var KeyboardNavigationShiftAltMixin = { + + /** + * Alter the key event to require pressing Shift. + * + * This will produce a mocked event object where it will seem that + * `Alt` is not pressed if `Shift` is not pressed. + * + * The reason for this is that original upstream code, found in + * `KeyboardNavigationMixin` is very hardcoded against the `Alt` key, + * so it is more maintainable to mock its input than to rewrite it + * completely. + * + * @param {keyEvent} keyEvent + * Original event object + * + * @returns {keyEvent} + * Altered event object + */ + _shiftPressed: function (keyEvent) { + var alt = keyEvent.altKey || keyEvent.key === "Alt", + newEvent = _.extend({}, keyEvent), + shift = keyEvent.shiftKey || keyEvent.key === "Shift"; + // Mock event to make it seem like Alt is not pressed + if (alt && !shift) { + newEvent.altKey = false; + if (newEvent.key === "Alt") { + newEvent.key = "Shift"; + } + } + return newEvent; + }, + + _onKeyDown: function (keyDownEvent) { + return this._super(this._shiftPressed(keyDownEvent)); + }, + + _onKeyUp: function (keyUpEvent) { + return this._super(this._shiftPressed(keyUpEvent)); + }, + }; + + // Include the SHIFT+ALT mixin wherever + // `KeyboardNavigationMixin` is used upstream + AbstractWebClient.include(KeyboardNavigationShiftAltMixin); + + // DocumentViewer: Add support to maximize/minimize + DocumentViewer.include({ + // Widget 'keydown' and 'keyup' events are only dispatched when + // this.$el is active, but now the modal have buttons that can obtain + // the focus. For this reason we now listen core events, that are + // dispatched every time. + events: _.extend(_.omit(DocumentViewer.prototype.events, [ + 'keydown', + 'keyup', + ]), { + 'click .o_maximize_btn': '_onClickMaximize', + 'click .o_minimize_btn': '_onClickMinimize', + 'shown.bs.modal': '_onShownModal', + }), + + start: function () { + core.bus.on('keydown', this, this._onKeydown); + core.bus.on('keyup', this, this._onKeyUp); + return this._super.apply(this, arguments); + }, + + destroy: function () { + core.bus.off('keydown', this, this._onKeydown); + core.bus.off('keyup', this, this._onKeyUp); + this._super.apply(this, arguments); + }, + + _onShownModal: function () { + // Disable auto-focus to allow to use controls in edit mode. + // This only affects the active modal. + // More info: https://stackoverflow.com/a/14795256 + $(document).off('focusin.modal'); + }, + _onClickMaximize: function () { + this.$el.removeClass('o_responsive_document_viewer'); + }, + _onClickMinimize: function () { + this.$el.addClass('o_responsive_document_viewer'); + }, + }); + + // List Renderer: Big checkboxes + ListRenderer.include({ + + /** + * @override + */ + _renderSelector: function () { + var $elm = this._super.apply(this, arguments); + $elm.find(".custom-control-label").html(''); + return $elm; + }, + }); +}); diff --git a/web_responsive/static/src/xml/apps.xml b/web_responsive/static/src/xml/apps.xml new file mode 100644 index 0000000..ccde2be --- /dev/null +++ b/web_responsive/static/src/xml/apps.xml @@ -0,0 +1,65 @@ + + + + diff --git a/web_responsive/static/src/xml/document_viewer.xml b/web_responsive/static/src/xml/document_viewer.xml new file mode 100644 index 0000000..ea1fe33 --- /dev/null +++ b/web_responsive/static/src/xml/document_viewer.xml @@ -0,0 +1,22 @@ + + + + diff --git a/web_responsive/static/src/xml/form_view.xml b/web_responsive/static/src/xml/form_view.xml new file mode 100644 index 0000000..33af95a --- /dev/null +++ b/web_responsive/static/src/xml/form_view.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + e + + + + + d + + + + + + + Edit + + + + + + + Create + + + + + + + Save + + + + + + + Discard + + + + + + + + + + + + + + + + + + d + + + + + + + Create + + + + + + + Save + + + + + + + Discard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + + diff --git a/web_responsive/static/src/xml/menu.xml b/web_responsive/static/src/xml/menu.xml new file mode 100644 index 0000000..4a4b8ee --- /dev/null +++ b/web_responsive/static/src/xml/menu.xml @@ -0,0 +1,58 @@ + + + + + + u + + + +
+ + + e + + + e + + + + + d + + + d + + + + + + Shift + + + + + + Select menu + + Alt + Shift + a + + + Control + Alt + a + + + + + + + User menu + + Alt + Shift + u + + + Control + Alt + u + + + +
+ +
diff --git a/web_responsive/static/src/xml/navbar.xml b/web_responsive/static/src/xml/navbar.xml new file mode 100644 index 0000000..b9acd58 --- /dev/null +++ b/web_responsive/static/src/xml/navbar.xml @@ -0,0 +1,16 @@ + + + + diff --git a/web_responsive/tests/__init__.py b/web_responsive/tests/__init__.py new file mode 100644 index 0000000..03c963d --- /dev/null +++ b/web_responsive/tests/__init__.py @@ -0,0 +1 @@ +from . import test_res_users diff --git a/web_responsive/tests/test_res_users.py b/web_responsive/tests/test_res_users.py new file mode 100644 index 0000000..6f4f032 --- /dev/null +++ b/web_responsive/tests/test_res_users.py @@ -0,0 +1,16 @@ +# Copyright 2018 Alexandre Díaz +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo.tests import common + + +class TestResUsers(common.TransactionCase): + + def test_chatter_position_wr(self): + user_public = self.env.ref('base.public_user') + + self.assertEqual(user_public.chatter_position, 'normal') + user_public.sudo(user_public).write({ + 'chatter_position': 'sided', + }) + self.assertEqual(user_public.chatter_position, 'sided') diff --git a/web_responsive/views/assets.xml b/web_responsive/views/assets.xml new file mode 100644 index 0000000..01bb728 --- /dev/null +++ b/web_responsive/views/assets.xml @@ -0,0 +1,20 @@ + + + + + +