Merge branch 'develop'
|
|
@ -0,0 +1,165 @@
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
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.
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
from . import models
|
||||||
|
|
||||||
|
import base64
|
||||||
|
|
||||||
|
from odoo.tools import file_open
|
||||||
|
|
||||||
|
|
||||||
|
def _setup_module(env):
|
||||||
|
if env.ref('base.main_company', False):
|
||||||
|
with file_open('base/static/img/res_company_logo.png', 'rb') as file:
|
||||||
|
env.ref('base.main_company').write({
|
||||||
|
'appbar_image': base64.b64encode(file.read())
|
||||||
|
})
|
||||||
|
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
{
|
||||||
|
'name': 'MuK AppsBar',
|
||||||
|
'summary': 'Adds a sidebar to the main screen',
|
||||||
|
'description': '''
|
||||||
|
This module adds a sidebar to the main screen. The sidebar has a list
|
||||||
|
of all installed apps similar to the home menu to ease navigation.
|
||||||
|
''',
|
||||||
|
'version': '18.0.1.1.3',
|
||||||
|
'category': 'Tools/UI',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'author': 'MuK IT',
|
||||||
|
'website': 'http://www.mukit.at',
|
||||||
|
'live_test_url': 'https://my.mukit.at/r/f6m',
|
||||||
|
'contributors': [
|
||||||
|
'Mathias Markl <mathias.markl@mukit.at>',
|
||||||
|
],
|
||||||
|
'depends': [
|
||||||
|
'base_setup',
|
||||||
|
'web',
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'templates/webclient.xml',
|
||||||
|
'views/res_users.xml',
|
||||||
|
'views/res_config_settings.xml',
|
||||||
|
],
|
||||||
|
'assets': {
|
||||||
|
'web._assets_primary_variables': [
|
||||||
|
'muk_web_appsbar/static/src/scss/variables.scss',
|
||||||
|
],
|
||||||
|
'web._assets_backend_helpers': [
|
||||||
|
'muk_web_appsbar/static/src/scss/mixins.scss',
|
||||||
|
],
|
||||||
|
'web.assets_web_dark': [
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'muk_web_appsbar/static/src/scss/variables.scss',
|
||||||
|
'muk_web_appsbar/static/src/scss/variables.dark.scss',
|
||||||
|
),
|
||||||
|
],
|
||||||
|
'web.assets_backend': [
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/webclient/webclient.js',
|
||||||
|
'muk_web_appsbar/static/src/webclient/webclient.js',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/webclient/webclient.xml',
|
||||||
|
'muk_web_appsbar/static/src/webclient/webclient.xml',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/webclient/webclient.js',
|
||||||
|
'muk_web_appsbar/static/src/webclient/menus/app_menu_service.js',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/webclient/webclient.js',
|
||||||
|
'muk_web_appsbar/static/src/webclient/appsbar/appsbar.js',
|
||||||
|
),
|
||||||
|
'muk_web_appsbar/static/src/webclient/webclient.scss',
|
||||||
|
'muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml',
|
||||||
|
'muk_web_appsbar/static/src/webclient/appsbar/appsbar.scss',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'images': [
|
||||||
|
'static/description/banner.png',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
'auto_install': False,
|
||||||
|
'post_init_hook': '_setup_module',
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
`1.1.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Use CSS Grid
|
||||||
|
|
||||||
|
`1.0.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Initial Release
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
===========
|
||||||
|
MuK AppsBar
|
||||||
|
===========
|
||||||
|
|
||||||
|
This module adds a sidebar to the main screen. The sidebar has a list
|
||||||
|
of all installed apps similar to the home menu to ease navigation.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
To install this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Afterward, log on to
|
||||||
|
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
|
||||||
|
list by clicking on the "Update Apps List" link. Now install the module by
|
||||||
|
clicking on the install button.
|
||||||
|
|
||||||
|
Upgrade
|
||||||
|
============
|
||||||
|
|
||||||
|
To upgrade this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Restart the server
|
||||||
|
and log on to your Odoo server. Select the Apps menu and upgrade the module by
|
||||||
|
clicking on the upgrade button.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
Each user can define in their profile the display of the sidebar. The options
|
||||||
|
are to show the large version, the small version, or hide the sidebar completely.
|
||||||
|
In addition, an image can be added for each company, which is displayed at the
|
||||||
|
bottom of the sidebar.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=============
|
||||||
|
|
||||||
|
Is the sidebar is activated it will be automatically displayed on the left side of
|
||||||
|
the systems UI.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Mathias Markl <mathias.markl@mukit.at>
|
||||||
|
|
||||||
|
Author & Maintainer
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
This module is maintained by the `MuK IT GmbH <https://www.mukit.at/>`_.
|
||||||
|
|
||||||
|
MuK IT is an Austrian company specialized in customizing and extending Odoo.
|
||||||
|
We develop custom solutions for your individual needs to help you focus on
|
||||||
|
your strength and expertise to grow your business.
|
||||||
|
|
||||||
|
If you want to get in touch please contact us via mail
|
||||||
|
(sale@mukit.at) or visit our website (https://mukit.at).
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * muk_web_appsbar
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 18.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-11-06 14:43+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-11-06 14:43+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_company__appbar_image
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_config_settings__appbar_image
|
||||||
|
msgid "Apps Menu Footer Image"
|
||||||
|
msgstr "Apps Menü Fusszeilen Bild"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_appsbar.view_res_config_settings_form
|
||||||
|
msgid "AppsBar"
|
||||||
|
msgstr "AppsLeiste"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model,name:muk_web_appsbar.model_res_company
|
||||||
|
msgid "Companies"
|
||||||
|
msgstr "Unternehmen"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model,name:muk_web_appsbar.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "Konfigurationseinstellungen"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model,name:muk_web_appsbar.model_ir_http
|
||||||
|
msgid "HTTP Routing"
|
||||||
|
msgstr "HTTP-Routing"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_appsbar.selection__res_users__sidebar_type__invisible
|
||||||
|
msgid "Invisible"
|
||||||
|
msgstr "Unsichtbar"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_appsbar.selection__res_users__sidebar_type__large
|
||||||
|
msgid "Large"
|
||||||
|
msgstr "Groß"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#. odoo-javascript
|
||||||
|
#: code:addons/muk_web_appsbar/static/src/webclient/appsbar/appsbar.xml:0
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_appsbar.view_res_config_settings_form
|
||||||
|
msgid "Set your own Logo for the appsbar"
|
||||||
|
msgstr "Legen Sie ihr eigenes Logo für die Appsleiste fest"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_users__sidebar_type
|
||||||
|
msgid "Sidebar Type"
|
||||||
|
msgstr "Seitenleiste Typ"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_appsbar.selection__res_users__sidebar_type__small
|
||||||
|
msgid "Small"
|
||||||
|
msgstr "Klein"
|
||||||
|
|
||||||
|
#. module: muk_web_appsbar
|
||||||
|
#: model:ir.model,name:muk_web_appsbar.model_res_users
|
||||||
|
msgid "User"
|
||||||
|
msgstr "Benutzer"
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
from . import ir_http
|
||||||
|
from . import res_users
|
||||||
|
from . import res_company
|
||||||
|
from . import res_config_settings
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
from odoo import models
|
||||||
|
from odoo.http import request
|
||||||
|
|
||||||
|
|
||||||
|
class IrHttp(models.AbstractModel):
|
||||||
|
|
||||||
|
_inherit = "ir.http"
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Functions
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
def session_info(self):
|
||||||
|
result = super(IrHttp, self).session_info()
|
||||||
|
if request.env.user._is_internal():
|
||||||
|
for company in request.env.user.company_ids.with_context(bin_size=True):
|
||||||
|
result['user_companies']['allowed_companies'][company.id].update({
|
||||||
|
'has_appsbar_image': bool(company.appbar_image),
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
from odoo import models, fields
|
||||||
|
|
||||||
|
|
||||||
|
class ResCompany(models.Model):
|
||||||
|
|
||||||
|
_inherit = 'res.company'
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Fields
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
appbar_image = fields.Binary(
|
||||||
|
string='Apps Menu Footer Image',
|
||||||
|
attachment=True
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Fields
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
appbar_image = fields.Binary(
|
||||||
|
related='company_id.appbar_image',
|
||||||
|
readonly=False
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
from odoo import models, fields, api
|
||||||
|
|
||||||
|
|
||||||
|
class ResUsers(models.Model):
|
||||||
|
|
||||||
|
_inherit = 'res.users'
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Properties
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SELF_READABLE_FIELDS(self):
|
||||||
|
return super().SELF_READABLE_FIELDS + [
|
||||||
|
'sidebar_type',
|
||||||
|
]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SELF_WRITEABLE_FIELDS(self):
|
||||||
|
return super().SELF_WRITEABLE_FIELDS + [
|
||||||
|
'sidebar_type',
|
||||||
|
]
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Fields
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
sidebar_type = fields.Selection(
|
||||||
|
selection=[
|
||||||
|
('invisible', 'Invisible'),
|
||||||
|
('small', 'Small'),
|
||||||
|
('large', 'Large')
|
||||||
|
],
|
||||||
|
string="Sidebar Type",
|
||||||
|
default='large',
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 100 100" width="100pt" height="100pt"><defs><clipPath id="_clipPath_p05BZdPxwgLyL3qcn83FMFoQSwnyJ0q6"><rect width="100" height="100"/></clipPath></defs><g clip-path="url(#_clipPath_p05BZdPxwgLyL3qcn83FMFoQSwnyJ0q6)"><rect width="100" height="100" style="fill:rgb(0,0,0)" fill-opacity="0"/><g><path d="M 43.48 6.48 L 86.957 6.48 C 94.156 6.48 100 12.324 100 19.523 L 100 81.477 C 100 88.676 94.156 94.52 86.957 94.52 L 43.48 94.52 L 43.48 6.48 Z" style="stroke:none;fill:#FBB945;stroke-miterlimit:10;"/><path d="M 13.044 6.48 L 43.48 6.48 L 43.48 94.52 L 13.044 94.52 C 5.845 94.52 0 88.676 0 81.477 L 0 19.523 C 0 12.324 5.845 6.48 13.044 6.48 Z" style="stroke:none;fill:#144496;stroke-miterlimit:10;"/><path d="M 17.393 18.43 L 26.087 18.43 C 29.085 18.43 31.52 20.623 31.52 23.325 L 31.52 23.325 C 31.52 26.027 29.085 28.22 26.087 28.22 L 17.393 28.22 C 14.395 28.22 11.96 26.027 11.96 23.325 L 11.96 23.325 C 11.96 20.623 14.395 18.43 17.393 18.43 Z" style="stroke:none;fill:#088BF5;stroke-miterlimit:10;"/><path d="M 17.393 36.91 L 26.087 36.91 C 29.085 36.91 31.52 39.103 31.52 41.805 L 31.52 41.805 C 31.52 44.507 29.085 46.7 26.087 46.7 L 17.393 46.7 C 14.395 46.7 11.96 44.507 11.96 41.805 L 11.96 41.805 C 11.96 39.103 14.395 36.91 17.393 36.91 Z" style="stroke:none;fill:#088BF5;stroke-miterlimit:10;"/><path d="M 17.393 56.48 L 26.087 56.48 C 29.085 56.48 31.52 58.671 31.52 61.37 L 31.52 61.37 C 31.52 64.069 29.085 66.26 26.087 66.26 L 17.393 66.26 C 14.395 66.26 11.96 64.069 11.96 61.37 L 11.96 61.37 C 11.96 58.671 14.395 56.48 17.393 56.48 Z" style="stroke:none;fill:#088BF5;stroke-miterlimit:10;"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
|
|
@ -0,0 +1,155 @@
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan">MuK Colors</h2>
|
||||||
|
<h3 class="oe_slogan mb-0">Customize your Odoo colors</h3>
|
||||||
|
<img src="logo.png" style="width: 150px;" class="mx-auto center-block">
|
||||||
|
<h4 class="oe_slogan mt-0" style="font-size: 23px">MuK IT GmbH - www.mukit.at</h4>
|
||||||
|
<div class="mb-4" style="text-align: center;">
|
||||||
|
<span
|
||||||
|
class="btn btn-sm mb-2"
|
||||||
|
style="font-size:14px; font-weight:500; background-color:#243742; color:#fff; cursor:default;"
|
||||||
|
>
|
||||||
|
<i class="fa fa-check"></i> Community
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="btn btn-sm mb-2"
|
||||||
|
style="font-size:14px; font-weight:500; background-color:#5D8DA8; color:#fff; cursor:default;"
|
||||||
|
>
|
||||||
|
<i class="fa fa-check me-1"></i> Enterprise
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="oe_demo oe_screenshot"
|
||||||
|
style="max-width: 84%; margin: 16px 8%">
|
||||||
|
<img src="screenshot.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width: 84%; margin: 16px 8%;">
|
||||||
|
<h3 class="oe_slogan">Overview</h3>
|
||||||
|
<p class="oe_mt32">
|
||||||
|
This module adds a sidebar to the main screen. The sidebar has a list of all
|
||||||
|
installed apps similar to the home menu to ease navigation. Each user can define
|
||||||
|
in their profile the display of the sidebar. The options are to show the large
|
||||||
|
version, the small version, or hide the sidebar completely. In addition, an image
|
||||||
|
can be added for each company, which is displayed at the bottom of the sidebar.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width:84%; margin:16px 8%">
|
||||||
|
<h3 class="oe_slogan">Settings</h3>
|
||||||
|
<p>
|
||||||
|
To set up the sidebar, the user can open their preferences or profile, depending on
|
||||||
|
whether the HR module is installed. The sidebar settings can now be changed via a
|
||||||
|
corresponding field. You will need to refresh your browser for the change to take effect.
|
||||||
|
</p>
|
||||||
|
<div class="oe_demo oe_screenshot mt16">
|
||||||
|
<img src="screenshot_user.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section
|
||||||
|
class="oe_container oe_dark d-flex justify-content-around align-items-lg-center flex-column flex-lg-row">
|
||||||
|
<div class="d-flex flex-column m-3 ms-lg-4">
|
||||||
|
<h3 class="oe_slogan mb-3 mt-3 text-left">
|
||||||
|
<i class="fa fa-comments mr8"></i>Want more?
|
||||||
|
</h3>
|
||||||
|
<p>
|
||||||
|
Are you having troubles with your Odoo integration? Or do you feel
|
||||||
|
your system lacks of essential features? <br>If your answer is <b>YES</b>
|
||||||
|
to one of the above questions, feel free to contact us at anytime
|
||||||
|
with your inquiry. <br>We are looking forward to discuss your
|
||||||
|
needs and plan the next steps with you. <br>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="oe_slogan d-flex flex-column ms-1 me-1 ms-lg-4 me-lg-4 flex-grow-1">
|
||||||
|
<a class="btn btn-primary btn-lg m-3"
|
||||||
|
href="mailto:sale@mukit.at?subject=Request%20Quote%3A%20MuK%20AppsBar"
|
||||||
|
style="font-size: 1.2rem; position: relative; overflow: hidden;">
|
||||||
|
<i class="fa fa-envelope me-1"></i>REQUEST QUOTE
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h3 class="oe_slogan">Our Services</h3>
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_development.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Development
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_integration.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Integration
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_infrastructure.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Infrastructure
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_training.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Training
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_support.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Support
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 358 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,7 @@
|
||||||
|
@mixin mk-disable-scrollbar {
|
||||||
|
scrollbar-width: none;
|
||||||
|
-ms-overflow-style: none;
|
||||||
|
&::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
$mk-appbar-color: #E4E4E4 !default;
|
||||||
|
$mk-appbar-background: #3C3E4B !default;
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
$mk-appbar-color: #dee2e6 !default;
|
||||||
|
$mk-appbar-active: $o-brand-primary !default;
|
||||||
|
$mk-appbar-background: #111827 !default;
|
||||||
|
|
||||||
|
$mk-sidebar-large-width: 146px !default;
|
||||||
|
$mk-sidebar-small-width: 46px !default;
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
import { url } from '@web/core/utils/urls';
|
||||||
|
import { useService } from '@web/core/utils/hooks';
|
||||||
|
|
||||||
|
import { Component, onWillUnmount } from '@odoo/owl';
|
||||||
|
|
||||||
|
export class AppsBar extends Component {
|
||||||
|
static template = 'muk_web_appsbar.AppsBar';
|
||||||
|
static props = {};
|
||||||
|
setup() {
|
||||||
|
this.companyService = useService('company');
|
||||||
|
this.appMenuService = useService('app_menu');
|
||||||
|
if (this.companyService.currentCompany.has_appsbar_image) {
|
||||||
|
this.sidebarImageUrl = url('/web/image', {
|
||||||
|
model: 'res.company',
|
||||||
|
field: 'appbar_image',
|
||||||
|
id: this.companyService.currentCompany.id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const renderAfterMenuChange = () => {
|
||||||
|
this.render();
|
||||||
|
};
|
||||||
|
this.env.bus.addEventListener(
|
||||||
|
'MENUS:APP-CHANGED', renderAfterMenuChange
|
||||||
|
);
|
||||||
|
onWillUnmount(() => {
|
||||||
|
this.env.bus.removeEventListener(
|
||||||
|
'MENUS:APP-CHANGED', renderAfterMenuChange
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
.mk_apps_sidebar_panel {
|
||||||
|
@include mk-disable-scrollbar();
|
||||||
|
background-color: $mk-appbar-background;
|
||||||
|
width: var(--mk-sidebar-width, 0);
|
||||||
|
overflow-y: auto;
|
||||||
|
.mk_apps_sidebar {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
|
white-space: nowrap;
|
||||||
|
.mk_apps_sidebar_menu {
|
||||||
|
padding: 0;
|
||||||
|
> li > a {
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 300;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 8px 11px;
|
||||||
|
text-decoration: none;
|
||||||
|
color: $mk-appbar-color;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
.mk_apps_sidebar_icon {
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
> li.active > a {
|
||||||
|
background: $mk-appbar-active;
|
||||||
|
}
|
||||||
|
> li:hover > a {
|
||||||
|
background: $mk-appbar-active;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mk_sidebar_type_large {
|
||||||
|
--mk-sidebar-width: #{$mk-sidebar-large-width};
|
||||||
|
}
|
||||||
|
|
||||||
|
.mk_sidebar_type_small {
|
||||||
|
--mk-sidebar-width: #{$mk-sidebar-small-width};
|
||||||
|
.mk_apps_sidebar_name {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.mk_apps_sidebar_icon {
|
||||||
|
margin-right: 0 !important;
|
||||||
|
}
|
||||||
|
.mk_apps_sidebar_logo {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mk_sidebar_type_invisible {
|
||||||
|
--mk-sidebar-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor_has_snippets_hide_backend_navbar,
|
||||||
|
.o_home_menu_background,
|
||||||
|
.o_fullscreen {
|
||||||
|
--mk-sidebar-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor_has_snippets_hide_backend_navbar .mk_apps_sidebar_panel {
|
||||||
|
transition: width 300ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
@include media-breakpoint-only(md) {
|
||||||
|
.mk_sidebar_type_large {
|
||||||
|
--mk-sidebar-width: #{$mk-sidebar-small-width};
|
||||||
|
.mk_apps_sidebar_name {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.mk_apps_sidebar_icon {
|
||||||
|
margin-right: 0 !important;
|
||||||
|
}
|
||||||
|
.mk_apps_sidebar_logo {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@include media-breakpoint-down(md) {
|
||||||
|
.mk_sidebar_type_large, .mk_sidebar_type_small {
|
||||||
|
--mk-sidebar-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
|
||||||
|
<t t-name="muk_web_appsbar.AppsBar">
|
||||||
|
<div class="mk_apps_sidebar_panel">
|
||||||
|
<div class="mk_apps_sidebar">
|
||||||
|
<ul class="mk_apps_sidebar_menu">
|
||||||
|
<t t-foreach="this.appMenuService.getAppsMenuItems()" t-as="app" t-key="app.id">
|
||||||
|
<li t-attf-class="nav-item {{ app.id === this.appMenuService.getCurrentApp()?.id ? 'active' : '' }}">
|
||||||
|
<a
|
||||||
|
t-att-href="app.href"
|
||||||
|
t-att-data-menu-id="app.id"
|
||||||
|
t-att-data-menu-xmlid="app.xmlid"
|
||||||
|
t-att-data-action-id="app.actionID"
|
||||||
|
t-on-click.prevent="() => app.action()"
|
||||||
|
class="nav-link"
|
||||||
|
role="menuitem"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
t-if="app.webIconData"
|
||||||
|
class="mk_apps_sidebar_icon"
|
||||||
|
t-att-src="app.webIconData"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
t-else=""
|
||||||
|
class="mk_apps_sidebar_icon"
|
||||||
|
src="/base/static/description/icon.png"
|
||||||
|
/>
|
||||||
|
<span class="mk_apps_sidebar_name">
|
||||||
|
<t t-out="app.name"/>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</t>
|
||||||
|
</ul>
|
||||||
|
<div t-if="sidebarImageUrl" class="mk_apps_sidebar_logo p-2">
|
||||||
|
<img class="img-fluid mx-auto" t-att-src="sidebarImageUrl" alt="Logo"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</templates>
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
import { registry } from "@web/core/registry";
|
||||||
|
|
||||||
|
export const appMenuService = {
|
||||||
|
dependencies: ["menu"],
|
||||||
|
async start(env, { menu }) {
|
||||||
|
return {
|
||||||
|
getCurrentApp () {
|
||||||
|
return menu.getCurrentApp();
|
||||||
|
},
|
||||||
|
getAppsMenuItems() {
|
||||||
|
const menuItems = menu.getApps().map((item) => {
|
||||||
|
const appsMenuItem = {
|
||||||
|
id: item.id,
|
||||||
|
name: item.name,
|
||||||
|
xmlid: item.xmlid,
|
||||||
|
appID: item.appID,
|
||||||
|
actionID: item.actionID,
|
||||||
|
action: () => menu.selectMenu(item),
|
||||||
|
};
|
||||||
|
if (item.webIconData) {
|
||||||
|
const prefix = (
|
||||||
|
item.webIconData.startsWith('P') ?
|
||||||
|
'data:image/svg+xml;base64,' :
|
||||||
|
'data:image/png;base64,'
|
||||||
|
);
|
||||||
|
appsMenuItem.webIconData = (
|
||||||
|
item.webIconData.startsWith('data:image') ?
|
||||||
|
item.webIconData :
|
||||||
|
prefix + item.webIconData.replace(/\s/g, '')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const hrefParts = [`menu_id=${item.id}`];
|
||||||
|
if (item.actionID) {
|
||||||
|
hrefParts.push(`action=${item.actionID}`);
|
||||||
|
}
|
||||||
|
appsMenuItem.href = "#" + hrefParts.join("&");
|
||||||
|
return appsMenuItem;
|
||||||
|
});
|
||||||
|
return menuItems;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
registry.category("services").add("app_menu", appMenuService);
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
import { patch } from '@web/core/utils/patch';
|
||||||
|
|
||||||
|
import { WebClient } from '@web/webclient/webclient';
|
||||||
|
import { AppsBar } from '@muk_web_appsbar/webclient/appsbar/appsbar';
|
||||||
|
|
||||||
|
patch(WebClient, {
|
||||||
|
components: {
|
||||||
|
...WebClient.components,
|
||||||
|
AppsBar,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
.o_web_client {
|
||||||
|
display: grid !important;
|
||||||
|
grid-template-areas:
|
||||||
|
"banner banner"
|
||||||
|
"navbar navbar"
|
||||||
|
"sidebar content"
|
||||||
|
"components components";
|
||||||
|
grid-template-rows: auto auto 1fr auto;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
> div:has(#oe_neutralize_banner) {
|
||||||
|
grid-area: banner;
|
||||||
|
}
|
||||||
|
> .o_navbar {
|
||||||
|
grid-area: navbar;
|
||||||
|
}
|
||||||
|
> .mk_apps_sidebar_panel {
|
||||||
|
grid-area: sidebar;
|
||||||
|
}
|
||||||
|
> .o_action_manager {
|
||||||
|
grid-area: content;
|
||||||
|
}
|
||||||
|
> .o-main-components-container {
|
||||||
|
grid-area: components;
|
||||||
|
}
|
||||||
|
> iframe {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
|
||||||
|
<t
|
||||||
|
t-name="muk_web_appsbar.WebClient"
|
||||||
|
t-inherit="web.WebClient"
|
||||||
|
t-inherit-mode="extension"
|
||||||
|
>
|
||||||
|
<xpath expr="//NavBar" position="after">
|
||||||
|
<AppsBar/>
|
||||||
|
</xpath>
|
||||||
|
</t>
|
||||||
|
|
||||||
|
</templates>
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="webclient_bootstrap" name="Web Client" inherit_id="web.webclient_bootstrap">
|
||||||
|
<xpath expr="//t[@t-set='body_classname']" position="after">
|
||||||
|
<t t-set="body_sidebar_classname" t-value="'mk_sidebar_type_' + request.env.user.sidebar_type or 'large'"/>
|
||||||
|
<t t-set="body_classname" t-value="'%s %s' % (body_classname, body_sidebar_classname)"/>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_res_config_settings_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.form</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//setting[@id='inter_company']" position="before">
|
||||||
|
<setting string="AppsBar" company_dependent="1" help="Set your own Logo for the appsbar">
|
||||||
|
<div class="w-50 row">
|
||||||
|
<field name="appbar_image" widget="image" class="oe_avatar"/>
|
||||||
|
</div>
|
||||||
|
</setting>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_res_users_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.users.form</field>
|
||||||
|
<field name="model">res.users</field>
|
||||||
|
<field name="inherit_id" ref="base.view_users_form_simple_modif" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='tz']" position="after">
|
||||||
|
<field name="sidebar_type" readonly="0"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
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.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
{
|
||||||
|
'name': 'MuK Chatter',
|
||||||
|
'summary': 'Adds options for the chatter',
|
||||||
|
'description': '''
|
||||||
|
This module improves the design of the chatter and adds a user
|
||||||
|
preference to set the position of the chatter in the form view.
|
||||||
|
''',
|
||||||
|
'version': '18.0.1.2.3',
|
||||||
|
'category': 'Tools/UI',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'author': 'MuK IT',
|
||||||
|
'website': 'http://www.mukit.at',
|
||||||
|
'live_test_url': 'https://my.mukit.at/r/f6m',
|
||||||
|
'contributors': [
|
||||||
|
'Mathias Markl <mathias.markl@mukit.at>',
|
||||||
|
],
|
||||||
|
'depends': [
|
||||||
|
'mail',
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'views/res_users.xml',
|
||||||
|
],
|
||||||
|
'assets': {
|
||||||
|
'web._assets_primary_variables': [
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/scss/primary_variables.scss',
|
||||||
|
'muk_web_chatter/static/src/scss/variables.scss'
|
||||||
|
),
|
||||||
|
],
|
||||||
|
'web.assets_backend': [
|
||||||
|
'muk_web_chatter/static/src/core/**/*.*',
|
||||||
|
'muk_web_chatter/static/src/chatter/*.scss',
|
||||||
|
'muk_web_chatter/static/src/chatter/*.xml',
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'mail/static/src/chatter/web_portal/chatter.js',
|
||||||
|
'muk_web_chatter/static/src/chatter/chatter.js'
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'mail/static/src/chatter/web/form_compiler.js',
|
||||||
|
'muk_web_chatter/static/src/views/form/form_compiler.js'
|
||||||
|
),
|
||||||
|
'muk_web_chatter/static/src/views/form/form_renderer.js',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'images': [
|
||||||
|
'static/description/banner.png',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
'auto_install': False,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
`1.2.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Hide Notifications
|
||||||
|
|
||||||
|
`1.1.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Resize Chatter
|
||||||
|
|
||||||
|
|
||||||
|
`1.0.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Initial Release
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
===========
|
||||||
|
MuK Chatter
|
||||||
|
===========
|
||||||
|
|
||||||
|
This module improves the design of the chatter and adds a user
|
||||||
|
preference to set the position of the chatter in the form view.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
To install this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Afterward, log on to
|
||||||
|
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
|
||||||
|
list by clicking on the "Update Apps List" link. Now install the module by
|
||||||
|
clicking on the install button.
|
||||||
|
|
||||||
|
Upgrade
|
||||||
|
============
|
||||||
|
|
||||||
|
To upgrade this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Restart the server
|
||||||
|
and log on to your Odoo server. Select the Apps menu and upgrade the module by
|
||||||
|
clicking on the upgrade button.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
Each user can define in their profile the display of the chatter. The options
|
||||||
|
are to show the chatter on the side or at the bottom.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=============
|
||||||
|
|
||||||
|
The design improvements are automatically activated as soon as the module
|
||||||
|
is installed.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Mathias Markl <mathias.markl@mukit.at>
|
||||||
|
|
||||||
|
Author & Maintainer
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
This module is maintained by the `MuK IT GmbH <https://www.mukit.at/>`_.
|
||||||
|
|
||||||
|
MuK IT is an Austrian company specialized in customizing and extending Odoo.
|
||||||
|
We develop custom solutions for your individual needs to help you focus on
|
||||||
|
your strength and expertise to grow your business.
|
||||||
|
|
||||||
|
If you want to get in touch please contact us via mail
|
||||||
|
(sale@mukit.at) or visit our website (https://mukit.at).
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * muk_web_chatter
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 18.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-11-06 14:05+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-11-06 14:05+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_chatter.selection__res_users__chatter_position__bottom
|
||||||
|
msgid "Bottom"
|
||||||
|
msgstr "Unten"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_chatter.field_res_users__chatter_position
|
||||||
|
msgid "Chatter Position"
|
||||||
|
msgstr "Chatterposition"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#: model:ir.model,name:muk_web_chatter.model_ir_http
|
||||||
|
msgid "HTTP Routing"
|
||||||
|
msgstr "HTTP-Routing"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#. odoo-javascript
|
||||||
|
#: code:addons/muk_web_chatter/static/src/chatter/chatter.xml:0
|
||||||
|
msgid "Log note"
|
||||||
|
msgstr "Log-Notiz"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#. odoo-javascript
|
||||||
|
#: code:addons/muk_web_chatter/static/src/chatter/chatter.xml:0
|
||||||
|
msgid "Send message"
|
||||||
|
msgstr "Nachricht senden"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#. odoo-javascript
|
||||||
|
#: code:addons/muk_web_chatter/static/src/chatter/chatter.xml:0
|
||||||
|
msgid "Show/Hide Notifications"
|
||||||
|
msgstr "Benachrichtigungen ein-/ausblenden"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_chatter.selection__res_users__chatter_position__side
|
||||||
|
msgid "Side"
|
||||||
|
msgstr "Seite"
|
||||||
|
|
||||||
|
#. module: muk_web_chatter
|
||||||
|
#: model:ir.model,name:muk_web_chatter.model_res_users
|
||||||
|
msgid "User"
|
||||||
|
msgstr "Benutzer"
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
from . import ir_http
|
||||||
|
from . import res_users
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
from odoo import models
|
||||||
|
from odoo.http import request
|
||||||
|
|
||||||
|
|
||||||
|
class IrHttp(models.AbstractModel):
|
||||||
|
|
||||||
|
_inherit = "ir.http"
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Functions
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
def session_info(self):
|
||||||
|
result = super(IrHttp, self).session_info()
|
||||||
|
result['chatter_position'] = self.env.user.chatter_position
|
||||||
|
return result
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
from odoo import models, fields, api
|
||||||
|
|
||||||
|
|
||||||
|
class ResUsers(models.Model):
|
||||||
|
|
||||||
|
_inherit = 'res.users'
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Properties
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SELF_READABLE_FIELDS(self):
|
||||||
|
return super().SELF_READABLE_FIELDS + [
|
||||||
|
'chatter_position',
|
||||||
|
]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def SELF_WRITEABLE_FIELDS(self):
|
||||||
|
return super().SELF_WRITEABLE_FIELDS + [
|
||||||
|
'chatter_position',
|
||||||
|
]
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Fields
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
chatter_position = fields.Selection(
|
||||||
|
selection=[
|
||||||
|
('side', 'Side'),
|
||||||
|
('bottom', 'Bottom'),
|
||||||
|
],
|
||||||
|
string="Chatter Position",
|
||||||
|
default='side',
|
||||||
|
required=True,
|
||||||
|
)
|
||||||
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 100 100" width="100pt" height="100pt"><defs><clipPath id="_clipPath_yqfpccvsxizQzJZHXVv2OFvQkATKgzzC"><rect width="100" height="100"/></clipPath></defs><g clip-path="url(#_clipPath_yqfpccvsxizQzJZHXVv2OFvQkATKgzzC)"><rect width="100" height="100" style="fill:rgb(0,0,0)" fill-opacity="0"/><g><path d=" M 32.503 65.001 C 50.457 65.001 65.004 52.688 65.004 37.5 C 65.004 22.312 50.457 9.999 32.503 9.999 C 14.549 9.999 0.002 22.312 0.002 37.5 C 0.002 43.531 2.299 49.109 6.189 53.656 C 5.643 55.125 4.83 56.422 3.971 57.516 C 3.221 58.485 2.455 59.235 1.892 59.75 C 1.611 60 1.377 60.203 1.221 60.328 C 1.142 60.391 1.08 60.438 1.049 60.453 L 1.017 60.485 L 1.017 60.485 L 1.017 60.485 C 0.158 61.125 -0.217 62.25 0.127 63.266 C 0.47 64.282 1.424 65.001 2.502 65.001 C 5.908 65.001 9.346 64.125 12.205 63.047 C 13.643 62.5 14.987 61.891 16.159 61.266 C 20.956 63.641 26.534 65.001 32.503 65.001 Z " fill="rgb(252,134,139)"/><path d=" M 67.471 90.001 C 49.517 90.001 34.97 77.688 34.97 62.5 C 34.97 47.312 49.517 34.999 67.471 34.999 C 85.425 34.999 99.972 47.312 99.972 62.5 C 99.972 68.532 97.675 74.11 93.784 78.657 C 94.331 80.126 95.144 81.423 96.003 82.517 C 96.753 83.486 97.519 84.236 98.081 84.751 C 98.363 85.001 98.597 85.204 98.753 85.329 C 98.831 85.392 98.894 85.439 98.925 85.454 L 98.956 85.486 L 98.956 85.486 L 98.956 85.486 C 99.816 86.126 100.191 87.251 99.847 88.267 C 99.503 89.283 98.55 90.001 97.472 90.001 C 94.066 90.001 90.628 89.126 87.769 88.048 C 86.331 87.501 84.987 86.892 83.815 86.267 C 79.018 88.642 73.44 90.001 67.471 90.001 Z " fill="rgb(152,81,132)"/><path d=" M 35.116 64.896 C 51.85 63.784 65.004 51.942 65.004 37.5 C 65.004 36.69 64.963 35.889 64.858 35.104 C 48.124 36.216 34.97 48.058 34.97 62.5 C 34.97 63.31 35.011 64.111 35.116 64.896 Z " fill-rule="evenodd" fill="rgb(150,43,72)"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
|
|
@ -0,0 +1,171 @@
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan">MuK Chatter</h2>
|
||||||
|
<h3 class="oe_slogan mb-0">Adds options for the chatter</h3>
|
||||||
|
<img src="logo.png" style="width: 150px;" class="mx-auto center-block">
|
||||||
|
<h4 class="oe_slogan mt-0" style="font-size: 23px">MuK IT GmbH - www.mukit.at</h4>
|
||||||
|
<div class="mb-4" style="text-align: center;">
|
||||||
|
<span
|
||||||
|
class="btn btn-sm mb-2"
|
||||||
|
style="font-size:14px; font-weight:500; background-color:#243742; color:#fff; cursor:default;"
|
||||||
|
>
|
||||||
|
<i class="fa fa-check"></i> Community
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="btn btn-sm mb-2"
|
||||||
|
style="font-size:14px; font-weight:500; background-color:#5D8DA8; color:#fff; cursor:default;"
|
||||||
|
>
|
||||||
|
<i class="fa fa-check me-1"></i> Enterprise
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="oe_demo oe_screenshot"
|
||||||
|
style="max-width: 84%; margin: 16px 8%">
|
||||||
|
<img src="screenshot.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width: 84%; margin: 16px 8%;">
|
||||||
|
<h3 class="oe_slogan">Overview</h3>
|
||||||
|
<p class="oe_mt32">
|
||||||
|
This module improves the design of the chatter and adds a user preference
|
||||||
|
to set the position of the chatter in the form view. Each user can define in
|
||||||
|
their profile the display of the chatter. The options are to show the chatter
|
||||||
|
on the side or at the bottom.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width:84%; margin:16px 8%">
|
||||||
|
<h3 class="oe_slogan">Chatter Features</h3>
|
||||||
|
<p>
|
||||||
|
The chat buttons have been improved to become an icon in mobile view to make
|
||||||
|
better use of space. The chat can also be resized by dragging the divider and
|
||||||
|
reset by double-clicking. The top bar icon can be used to hide log entries to
|
||||||
|
improve the readability of the chat.
|
||||||
|
</p>
|
||||||
|
<div class="oe_demo oe_screenshot mt16">
|
||||||
|
<img src="screenshot_sidebar.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width:84%; margin:16px 8%">
|
||||||
|
<h3 class="oe_slogan">User Settings</h3>
|
||||||
|
<p>
|
||||||
|
Each user can individually set whether the chatter should be displayed on
|
||||||
|
the side or below the form view. After changing the setting, a browser
|
||||||
|
refresh is required for the change to become active.
|
||||||
|
</p>
|
||||||
|
<div class="oe_demo oe_screenshot mt16">
|
||||||
|
<img src="screenshot_user.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section
|
||||||
|
class="oe_container oe_dark d-flex justify-content-around align-items-lg-center flex-column flex-lg-row">
|
||||||
|
<div class="d-flex flex-column m-3 ms-lg-4">
|
||||||
|
<h3 class="oe_slogan mb-3 mt-3 text-left">
|
||||||
|
<i class="fa fa-comments mr8"></i>Want more?
|
||||||
|
</h3>
|
||||||
|
<p>
|
||||||
|
Are you having troubles with your Odoo integration? Or do you feel
|
||||||
|
your system lacks of essential features? <br>If your answer is <b>YES</b>
|
||||||
|
to one of the above questions, feel free to contact us at anytime
|
||||||
|
with your inquiry. <br>We are looking forward to discuss your
|
||||||
|
needs and plan the next steps with you. <br>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="oe_slogan d-flex flex-column ms-1 me-1 ms-lg-4 me-lg-4 flex-grow-1">
|
||||||
|
<a class="btn btn-primary btn-lg m-3"
|
||||||
|
href="mailto:sale@mukit.at?subject=Request%20Quote%3A%20MuK%20Chatter"
|
||||||
|
style="font-size: 1.2rem; position: relative; overflow: hidden;">
|
||||||
|
<i class="fa fa-envelope me-1"></i>REQUEST QUOTE
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h3 class="oe_slogan">Our Services</h3>
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_development.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Development
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_integration.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Integration
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_infrastructure.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Infrastructure
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_training.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Training
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_support.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Support
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 407 KiB |
|
After Width: | Height: | Size: 316 KiB |
|
After Width: | Height: | Size: 410 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { patch } from "@web/core/utils/patch";
|
||||||
|
import { browser } from "@web/core/browser/browser";
|
||||||
|
|
||||||
|
import { Chatter } from "@mail/chatter/web_portal/chatter";
|
||||||
|
|
||||||
|
patch(Chatter.prototype, {
|
||||||
|
setup() {
|
||||||
|
super.setup();
|
||||||
|
const showNotificationMessages = browser.localStorage.getItem(
|
||||||
|
'muk_web_chatter.notifications'
|
||||||
|
);
|
||||||
|
this.state.showNotificationMessages = (
|
||||||
|
showNotificationMessages != null ?
|
||||||
|
JSON.parse(showNotificationMessages) : true
|
||||||
|
);
|
||||||
|
},
|
||||||
|
onClickNotificationsToggle() {
|
||||||
|
const showNotificationMessages = !this.state.showNotificationMessages;
|
||||||
|
browser.localStorage.setItem(
|
||||||
|
'muk_web_chatter.notifications', showNotificationMessages
|
||||||
|
);
|
||||||
|
this.state.showNotificationMessages = showNotificationMessages;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
.o-mail-Chatter-top:has(.o-mail-Chatter-sendMessage.active) .o-mail-Composer-send {
|
||||||
|
@extend .btn-danger
|
||||||
|
}
|
||||||
|
|
||||||
|
.o-mail-Form-chatter.o-aside {
|
||||||
|
.mk_chatter_resize {
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
z-index: 1;
|
||||||
|
width: 5px;
|
||||||
|
height: 100%;
|
||||||
|
cursor: col-resize;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
<t
|
||||||
|
t-name="muk_web_theme.Chatter"
|
||||||
|
t-inherit="mail.Chatter"
|
||||||
|
t-inherit-mode="extension"
|
||||||
|
>
|
||||||
|
<xpath expr="//button[hasclass('o-mail-Chatter-sendMessage')]" position="replace">
|
||||||
|
<button
|
||||||
|
class="o-mail-Chatter-sendMessage btn text-nowrap me-1"
|
||||||
|
t-att-class="{
|
||||||
|
'btn-primary': state.composerType !== 'note',
|
||||||
|
'btn-secondary': state.composerType === 'note',
|
||||||
|
'active': state.composerType === 'message',
|
||||||
|
'my-2': !props.compactHeight
|
||||||
|
}"
|
||||||
|
t-att-disabled="!state.thread.hasWriteAccess and !(state.thread.hasReadAccess and state.thread.canPostOnReadonly) and props.threadId"
|
||||||
|
data-hotkey="m"
|
||||||
|
t-on-click="() => this.toggleComposer('message')"
|
||||||
|
>
|
||||||
|
<i class="fa fa-envelope me-sm-1" />
|
||||||
|
<span class="d-none d-sm-inline">Send message</span>
|
||||||
|
</button>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//button[hasclass('o-mail-Chatter-logNote')]" position="replace">
|
||||||
|
<button
|
||||||
|
class="o-mail-Chatter-logNote btn text-nowrap me-1"
|
||||||
|
t-att-class="{
|
||||||
|
'btn-primary active': state.composerType === 'note',
|
||||||
|
'btn-secondary': state.composerType !== 'note',
|
||||||
|
'my-2': !props.compactHeight
|
||||||
|
}"
|
||||||
|
data-hotkey="shift+m"
|
||||||
|
t-on-click="() => this.toggleComposer('note')"
|
||||||
|
>
|
||||||
|
<i class="fa fa-sticky-note me-sm-1" />
|
||||||
|
<span class="d-none d-sm-inline">Log note</span>
|
||||||
|
</button>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//button[hasclass('o-mail-Chatter-activity')]/span" position="before">
|
||||||
|
<i class="fa fa-clock-o me-sm-1"/>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//button[hasclass('o-mail-Chatter-activity')]/span" position="attributes">
|
||||||
|
<attribute name="class" add="d-none d-sm-inline" separator=" " />
|
||||||
|
</xpath>
|
||||||
|
|
||||||
|
<xpath expr="//button[@t-if='props.hasAttachmentPreview and state.thread.attachmentsInWebClientView.length']" position="attributes">
|
||||||
|
<attribute name="t-if">props.isChatterAside and props.hasAttachmentPreview and state.thread.attachmentsInWebClientView.length</attribute>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//button[@t-on-click='onClickSearch']" position="after">
|
||||||
|
<button
|
||||||
|
class="btn btn-link text-action px-1"
|
||||||
|
aria-label="Show/Hide Notifications"
|
||||||
|
title="Show/Hide Notifications"
|
||||||
|
t-on-click="onClickNotificationsToggle"
|
||||||
|
t-att-disabled="state.isSearchOpen"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="fa fa-lg"
|
||||||
|
t-att-class="{
|
||||||
|
'fa-eye': state.showNotificationMessages,
|
||||||
|
'fa-eye-slash': !state.showNotificationMessages,
|
||||||
|
}"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</xpath>
|
||||||
|
<xpath expr="//Thread" position="attributes">
|
||||||
|
<attribute name="showNotificationMessages">state.showNotificationMessages</attribute>
|
||||||
|
</xpath>
|
||||||
|
</t>
|
||||||
|
</templates>
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
import { patch } from "@web/core/utils/patch";
|
||||||
|
|
||||||
|
import { Thread } from '@mail/core/common/thread';
|
||||||
|
|
||||||
|
patch(Thread.prototype, {
|
||||||
|
get displayMessages() {
|
||||||
|
let messages = (
|
||||||
|
this.props.order === 'asc' ?
|
||||||
|
this.props.thread.nonEmptyMessages :
|
||||||
|
[...this.props.thread.nonEmptyMessages].reverse()
|
||||||
|
);
|
||||||
|
if (!this.props.showNotificationMessages) {
|
||||||
|
messages = messages.filter(
|
||||||
|
(msg) => !['user_notification', 'notification'].includes(
|
||||||
|
msg.message_type
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return messages;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
Thread.props = [
|
||||||
|
...Thread.props,
|
||||||
|
'showNotificationMessages?',
|
||||||
|
];
|
||||||
|
Thread.defaultProps = {
|
||||||
|
...Thread.defaultProps,
|
||||||
|
showNotificationMessages: true,
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
|
||||||
|
<templates xml:space="preserve">
|
||||||
|
<t
|
||||||
|
t-name="muk_web_theme.Thread"
|
||||||
|
t-inherit="mail.Thread"
|
||||||
|
t-inherit-mode="extension"
|
||||||
|
>
|
||||||
|
<xpath expr="//t[@t-key='msg.id']" position="attributes">
|
||||||
|
<attribute name="t-foreach">displayMessages</attribute>
|
||||||
|
</xpath>
|
||||||
|
</t>
|
||||||
|
</templates>
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
$o-form-renderer-max-width: 3840px;
|
||||||
|
$o-form-view-sheet-max-width: 2560px;
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
import { session } from '@web/session';
|
||||||
|
import { patch } from '@web/core/utils/patch';
|
||||||
|
import { append, createElement, setAttributes } from '@web/core/utils/xml';
|
||||||
|
|
||||||
|
import {FormCompiler} from '@web/views/form/form_compiler';
|
||||||
|
|
||||||
|
patch(FormCompiler.prototype, {
|
||||||
|
compile(node, params) {
|
||||||
|
const res = super.compile(node, params);
|
||||||
|
const chatterContainerHookXml = res.querySelector(
|
||||||
|
'.o_form_renderer > .o-mail-Form-chatter'
|
||||||
|
);
|
||||||
|
if (!chatterContainerHookXml) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
setAttributes(chatterContainerHookXml, {
|
||||||
|
't-ref': 'chatterContainer',
|
||||||
|
});
|
||||||
|
if (session.chatter_position === 'bottom') {
|
||||||
|
const formSheetBgXml = res.querySelector('.o_form_sheet_bg');
|
||||||
|
if (!chatterContainerHookXml || !formSheetBgXml?.parentNode) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
const webClientViewAttachmentViewHookXml = res.querySelector(
|
||||||
|
'.o_attachment_preview'
|
||||||
|
);
|
||||||
|
const chatterContainerXml = chatterContainerHookXml.querySelector(
|
||||||
|
"t[t-component='__comp__.mailComponents.Chatter']"
|
||||||
|
);
|
||||||
|
const sheetBgChatterContainerHookXml = chatterContainerHookXml.cloneNode(true);
|
||||||
|
const sheetBgChatterContainerXml = sheetBgChatterContainerHookXml.querySelector(
|
||||||
|
"t[t-component='__comp__.mailComponents.Chatter']"
|
||||||
|
);
|
||||||
|
sheetBgChatterContainerHookXml.classList.add('o-isInFormSheetBg', 'w-auto');
|
||||||
|
append(formSheetBgXml, sheetBgChatterContainerHookXml);
|
||||||
|
setAttributes(sheetBgChatterContainerXml, {
|
||||||
|
isInFormSheetBg: 'true',
|
||||||
|
isChatterAside: 'false',
|
||||||
|
});
|
||||||
|
setAttributes(chatterContainerXml, {
|
||||||
|
isInFormSheetBg: 'true',
|
||||||
|
isChatterAside: 'false',
|
||||||
|
});
|
||||||
|
setAttributes(chatterContainerHookXml, {
|
||||||
|
't-if': 'false',
|
||||||
|
});
|
||||||
|
if (webClientViewAttachmentViewHookXml) {
|
||||||
|
setAttributes(webClientViewAttachmentViewHookXml, {
|
||||||
|
't-if': 'false',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setAttributes(chatterContainerHookXml, {
|
||||||
|
't-att-style': '__comp__.chatterState.width ? `width: ${__comp__.chatterState.width}px;` : ""',
|
||||||
|
});
|
||||||
|
const chatterContainerResizeHookXml = createElement('span');
|
||||||
|
chatterContainerResizeHookXml.classList.add('mk_chatter_resize');
|
||||||
|
setAttributes(chatterContainerResizeHookXml, {
|
||||||
|
't-on-mousedown.stop.prevent': '__comp__.onStartChatterResize.bind(__comp__)',
|
||||||
|
't-on-dblclick.stop.prevent': '__comp__.onDoubleClickChatterResize.bind(__comp__)',
|
||||||
|
});
|
||||||
|
append(chatterContainerHookXml, chatterContainerResizeHookXml);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
import { useState, useRef } from '@odoo/owl';
|
||||||
|
import { patch } from '@web/core/utils/patch';
|
||||||
|
import { browser } from "@web/core/browser/browser";
|
||||||
|
|
||||||
|
import { FormRenderer } from '@web/views/form/form_renderer';
|
||||||
|
|
||||||
|
patch(FormRenderer.prototype, {
|
||||||
|
setup() {
|
||||||
|
super.setup();
|
||||||
|
this.chatterState = useState({
|
||||||
|
width: browser.localStorage.getItem('muk_web_chatter.width'),
|
||||||
|
});
|
||||||
|
this.chatterContainer = useRef('chatterContainer');
|
||||||
|
},
|
||||||
|
onStartChatterResize(ev) {
|
||||||
|
if (ev.button !== 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const initialX = ev.pageX;
|
||||||
|
const chatterElement = this.chatterContainer.el;
|
||||||
|
const initialWidth = chatterElement.offsetWidth;
|
||||||
|
const resizeStoppingEvents = [
|
||||||
|
'keydown', 'mousedown', 'mouseup'
|
||||||
|
];
|
||||||
|
const resizePanel = (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
const newWidth = Math.min(
|
||||||
|
Math.max(50, initialWidth - (ev.pageX - initialX)),
|
||||||
|
Math.max(chatterElement.parentElement.offsetWidth - 250, 250)
|
||||||
|
);
|
||||||
|
browser.localStorage.setItem('muk_web_chatter.width', newWidth);
|
||||||
|
this.chatterState.width = newWidth;
|
||||||
|
};
|
||||||
|
const stopResize = (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
ev.stopPropagation();
|
||||||
|
if (ev.type === 'mousedown' && ev.button === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
document.removeEventListener('mousemove', resizePanel, true);
|
||||||
|
resizeStoppingEvents.forEach((stoppingEvent) => {
|
||||||
|
document.removeEventListener(stoppingEvent, stopResize, true);
|
||||||
|
});
|
||||||
|
document.activeElement.blur();
|
||||||
|
};
|
||||||
|
document.addEventListener('mousemove', resizePanel, true);
|
||||||
|
resizeStoppingEvents.forEach((stoppingEvent) => {
|
||||||
|
document.addEventListener(stoppingEvent, stopResize, true);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onDoubleClickChatterResize(ev) {
|
||||||
|
browser.localStorage.removeItem('muk_web_chatter.width');
|
||||||
|
this.chatterState.width = false;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_res_users_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.users.form</field>
|
||||||
|
<field name="model">res.users</field>
|
||||||
|
<field name="inherit_id" ref="base.view_users_form_simple_modif" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='tz']" position="after">
|
||||||
|
<field name="chatter_position" readonly="0"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
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.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
from . import models
|
||||||
|
|
||||||
|
|
||||||
|
def _uninstall_cleanup(env):
|
||||||
|
env['res.config.settings']._reset_light_color_assets()
|
||||||
|
env['res.config.settings']._reset_dark_color_assets()
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
{
|
||||||
|
'name': 'MuK Colors',
|
||||||
|
'summary': 'Customize your Odoo colors',
|
||||||
|
'description': '''
|
||||||
|
This module gives you options to customize the theme colors.
|
||||||
|
''',
|
||||||
|
'version': '18.0.1.0.6',
|
||||||
|
'category': 'Tools/UI',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'author': 'MuK IT',
|
||||||
|
'website': 'http://www.mukit.at',
|
||||||
|
'live_test_url': 'https://my.mukit.at/r/f6m',
|
||||||
|
'contributors': [
|
||||||
|
'Mathias Markl <mathias.markl@mukit.at>',
|
||||||
|
],
|
||||||
|
'depends': [
|
||||||
|
'base_setup',
|
||||||
|
'web_editor',
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'templates/webclient.xml',
|
||||||
|
'views/res_config_settings.xml',
|
||||||
|
],
|
||||||
|
'assets': {
|
||||||
|
'web._assets_primary_variables': [
|
||||||
|
('prepend', 'muk_web_colors/static/src/scss/colors.scss'),
|
||||||
|
(
|
||||||
|
'before',
|
||||||
|
'muk_web_colors/static/src/scss/colors.scss',
|
||||||
|
'muk_web_colors/static/src/scss/colors_light.scss'
|
||||||
|
),
|
||||||
|
],
|
||||||
|
'web.assets_web_dark': [
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'muk_web_colors/static/src/scss/colors.scss',
|
||||||
|
'muk_web_colors/static/src/scss/colors_dark.scss'
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'images': [
|
||||||
|
'static/description/banner.png',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
'auto_install': False,
|
||||||
|
'uninstall_hook': '_uninstall_cleanup',
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
`1.0.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Initial Release
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
==========
|
||||||
|
MuK Colors
|
||||||
|
==========
|
||||||
|
|
||||||
|
This module gives you options to customize the color schema of your Odoo system.
|
||||||
|
You have options to edit the brand and the primary color as well as the context
|
||||||
|
colors (info, success, warning, danger). The options are also available for the
|
||||||
|
dark mode on Odoo Enterprise.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
To install this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Afterward, log on to
|
||||||
|
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
|
||||||
|
list by clicking on the "Update Apps List" link. Now install the module by
|
||||||
|
clicking on the install button.
|
||||||
|
|
||||||
|
Upgrade
|
||||||
|
============
|
||||||
|
|
||||||
|
To upgrade this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Restart the server
|
||||||
|
and log on to your Odoo server. Select the Apps menu and upgrade the module by
|
||||||
|
clicking on the upgrade button.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
The colors can be set in the general settings using a color picker.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=============
|
||||||
|
|
||||||
|
Once the colors a set the system will adapt for all users.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Mathias Markl <mathias.markl@mukit.at>
|
||||||
|
|
||||||
|
Author & Maintainer
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
This module is maintained by the `MuK IT GmbH <https://www.mukit.at/>`_.
|
||||||
|
|
||||||
|
MuK IT is an Austrian company specialized in customizing and extending Odoo.
|
||||||
|
We develop custom solutions for your individual needs to help you focus on
|
||||||
|
your strength and expertise to grow your business.
|
||||||
|
|
||||||
|
If you want to get in touch please contact us via mail
|
||||||
|
(sale@mukit.at) or visit our website (https://mukit.at).
|
||||||
|
|
@ -0,0 +1,151 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * muk_web_colors
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 18.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-11-06 14:36+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-11-06 14:36+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model,name:muk_web_colors.model_web_editor_assets
|
||||||
|
msgid "Assets Utils"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Brand"
|
||||||
|
msgstr "Marke"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_brand_dark
|
||||||
|
msgid "Brand Dark Color"
|
||||||
|
msgstr "Marke dunkle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_brand_light
|
||||||
|
msgid "Brand Light Color"
|
||||||
|
msgstr "Marke helle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Branding"
|
||||||
|
msgstr "Branding"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model,name:muk_web_colors.model_res_config_settings
|
||||||
|
msgid "Config Settings"
|
||||||
|
msgstr "Konfigurationseinstellungen"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Customize the look and feel of the dark mode"
|
||||||
|
msgstr "Passen Sie Aussehen und Handhabung des dunklen Modus an"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Customize the look and feel of the light mode"
|
||||||
|
msgstr "Passen Sie Aussehen und Handhabung des hellen Modus an"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Danger"
|
||||||
|
msgstr "Gefahr"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_danger_dark
|
||||||
|
msgid "Danger Dark Color"
|
||||||
|
msgstr "Gefahr dunkle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_danger_light
|
||||||
|
msgid "Danger Light Color"
|
||||||
|
msgstr "Gefahr helle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Dark Mode Colors"
|
||||||
|
msgstr "Farben dunkler Modus"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Info"
|
||||||
|
msgstr "Information"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_info_dark
|
||||||
|
msgid "Info Dark Color"
|
||||||
|
msgstr "Information dunkle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_info_light
|
||||||
|
msgid "Info Light Color"
|
||||||
|
msgstr "Information helle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Light Mode Colors"
|
||||||
|
msgstr "Farben heller Modus"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Primary"
|
||||||
|
msgstr "Primär"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_primary_dark
|
||||||
|
msgid "Primary Dark Color"
|
||||||
|
msgstr "Primäre dunkle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_primary_light
|
||||||
|
msgid "Primary Light Color"
|
||||||
|
msgstr "Primäre helle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Reset Dark Colors"
|
||||||
|
msgstr "dunkle Farbe zurücksetzen"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Reset Light Colors"
|
||||||
|
msgstr "helle Farbe zurücksetzen"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Success"
|
||||||
|
msgstr "Erfolg"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_success_dark
|
||||||
|
msgid "Success Dark Color"
|
||||||
|
msgstr "Erfolg dunkle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_success_light
|
||||||
|
msgid "Success Light Color"
|
||||||
|
msgstr "Erfolg helle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model_terms:ir.ui.view,arch_db:muk_web_colors.view_res_config_settings_form
|
||||||
|
msgid "Warning"
|
||||||
|
msgstr "Warnung"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_warning_dark
|
||||||
|
msgid "Warning Dark Color"
|
||||||
|
msgstr "Warnung dunkle Farbe"
|
||||||
|
|
||||||
|
#. module: muk_web_colors
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_colors.field_res_config_settings__color_warning_light
|
||||||
|
msgid "Warning Light Color"
|
||||||
|
msgstr "Warnung helle Farbe"
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
from . import res_config_settings
|
||||||
|
from . import web_editor_assets
|
||||||
|
|
@ -0,0 +1,213 @@
|
||||||
|
from odoo import api, fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ResConfigSettings(models.TransientModel):
|
||||||
|
|
||||||
|
_inherit = 'res.config.settings'
|
||||||
|
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
# Properties
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COLOR_FIELDS(self):
|
||||||
|
return [
|
||||||
|
'color_brand',
|
||||||
|
'color_primary',
|
||||||
|
'color_success',
|
||||||
|
'color_info',
|
||||||
|
'color_warning',
|
||||||
|
'color_danger',
|
||||||
|
]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COLOR_ASSET_LIGHT_URL(self):
|
||||||
|
return '/muk_web_colors/static/src/scss/colors_light.scss'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COLOR_BUNDLE_LIGHT_NAME(self):
|
||||||
|
return 'web._assets_primary_variables'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COLOR_ASSET_DARK_URL(self):
|
||||||
|
return '/muk_web_colors/static/src/scss/colors_dark.scss'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def COLOR_BUNDLE_DARK_NAME(self):
|
||||||
|
return 'web.assets_web_dark'
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Fields Light Mode
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
color_brand_light = fields.Char(
|
||||||
|
string='Brand Light Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_primary_light = fields.Char(
|
||||||
|
string='Primary Light Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_success_light = fields.Char(
|
||||||
|
string='Success Light Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_info_light = fields.Char(
|
||||||
|
string='Info Light Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_warning_light = fields.Char(
|
||||||
|
string='Warning Light Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_danger_light = fields.Char(
|
||||||
|
string='Danger Light Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Fields Dark Mode
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
color_brand_dark = fields.Char(
|
||||||
|
string='Brand Dark Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_primary_dark = fields.Char(
|
||||||
|
string='Primary Dark Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_success_dark = fields.Char(
|
||||||
|
string='Success Dark Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_info_dark = fields.Char(
|
||||||
|
string='Info Dark Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_warning_dark = fields.Char(
|
||||||
|
string='Warning Dark Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
color_danger_dark = fields.Char(
|
||||||
|
string='Danger Dark Color'
|
||||||
|
)
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Helper
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
def _get_light_color_values(self):
|
||||||
|
return self.env['web_editor.assets'].get_color_variables_values(
|
||||||
|
self.COLOR_ASSET_LIGHT_URL,
|
||||||
|
self.COLOR_BUNDLE_LIGHT_NAME,
|
||||||
|
self.COLOR_FIELDS
|
||||||
|
)
|
||||||
|
|
||||||
|
def _get_dark_color_values(self):
|
||||||
|
return self.env['web_editor.assets'].get_color_variables_values(
|
||||||
|
self.COLOR_ASSET_DARK_URL,
|
||||||
|
self.COLOR_BUNDLE_DARK_NAME,
|
||||||
|
self.COLOR_FIELDS
|
||||||
|
)
|
||||||
|
|
||||||
|
def _set_light_color_values(self, values):
|
||||||
|
colors = self._get_light_color_values()
|
||||||
|
for var, value in colors.items():
|
||||||
|
values[f'{var}_light'] = value
|
||||||
|
return values
|
||||||
|
|
||||||
|
def _set_dark_color_values(self, values):
|
||||||
|
colors = self._get_dark_color_values()
|
||||||
|
for var, value in colors.items():
|
||||||
|
values[f'{var}_dark'] = value
|
||||||
|
return values
|
||||||
|
|
||||||
|
def _detect_light_color_change(self):
|
||||||
|
colors = self._get_light_color_values()
|
||||||
|
return any(
|
||||||
|
self[f'{var}_light'] != val
|
||||||
|
for var, val in colors.items()
|
||||||
|
)
|
||||||
|
|
||||||
|
def _detect_dark_color_change(self):
|
||||||
|
colors = self._get_dark_color_values()
|
||||||
|
return any(
|
||||||
|
self[f'{var}_dark'] != val
|
||||||
|
for var, val in colors.items()
|
||||||
|
)
|
||||||
|
|
||||||
|
def _replace_light_color_values(self):
|
||||||
|
variables = [
|
||||||
|
{
|
||||||
|
'name': field,
|
||||||
|
'value': self[f'{field}_light']
|
||||||
|
}
|
||||||
|
for field in self.COLOR_FIELDS
|
||||||
|
]
|
||||||
|
return self.env['web_editor.assets'].replace_color_variables_values(
|
||||||
|
self.COLOR_ASSET_LIGHT_URL,
|
||||||
|
self.COLOR_BUNDLE_LIGHT_NAME,
|
||||||
|
variables
|
||||||
|
)
|
||||||
|
|
||||||
|
def _replace_dark_color_values(self):
|
||||||
|
variables = [
|
||||||
|
{
|
||||||
|
'name': field,
|
||||||
|
'value': self[f'{field}_dark']
|
||||||
|
}
|
||||||
|
for field in self.COLOR_FIELDS
|
||||||
|
]
|
||||||
|
return self.env['web_editor.assets'].replace_color_variables_values(
|
||||||
|
self.COLOR_ASSET_DARK_URL,
|
||||||
|
self.COLOR_BUNDLE_DARK_NAME,
|
||||||
|
variables
|
||||||
|
)
|
||||||
|
|
||||||
|
def _reset_light_color_assets(self):
|
||||||
|
self.env['web_editor.assets'].reset_color_asset(
|
||||||
|
self.COLOR_ASSET_LIGHT_URL,
|
||||||
|
self.COLOR_BUNDLE_LIGHT_NAME,
|
||||||
|
)
|
||||||
|
|
||||||
|
def _reset_dark_color_assets(self):
|
||||||
|
self.env['web_editor.assets'].reset_asset(
|
||||||
|
self.COLOR_ASSET_DARK_URL,
|
||||||
|
self.COLOR_BUNDLE_DARK_NAME,
|
||||||
|
)
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Action
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
def action_reset_light_color_assets(self):
|
||||||
|
self._reset_light_color_assets()
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.client',
|
||||||
|
'tag': 'reload',
|
||||||
|
}
|
||||||
|
|
||||||
|
def action_reset_dark_color_assets(self):
|
||||||
|
self._reset_dark_color_assets()
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.client',
|
||||||
|
'tag': 'reload',
|
||||||
|
}
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# Functions
|
||||||
|
#----------------------------------------------------------
|
||||||
|
|
||||||
|
def get_values(self):
|
||||||
|
res = super().get_values()
|
||||||
|
res = self._set_light_color_values(res)
|
||||||
|
res = self._set_dark_color_values(res)
|
||||||
|
return res
|
||||||
|
|
||||||
|
def set_values(self):
|
||||||
|
res = super().set_values()
|
||||||
|
if self._detect_light_color_change():
|
||||||
|
self._replace_light_color_values()
|
||||||
|
if self._detect_dark_color_change():
|
||||||
|
self._replace_dark_color_values()
|
||||||
|
return res
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
import re
|
||||||
|
import base64
|
||||||
|
|
||||||
|
from odoo import models, fields, api
|
||||||
|
from odoo.tools import misc
|
||||||
|
|
||||||
|
from odoo.addons.base.models.assetsbundle import EXTENSIONS
|
||||||
|
|
||||||
|
|
||||||
|
class ScssEditor(models.AbstractModel):
|
||||||
|
|
||||||
|
_inherit = 'web_editor.assets'
|
||||||
|
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
# Helper
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_colors_attachment(self, custom_url):
|
||||||
|
return self.env['ir.attachment'].search([
|
||||||
|
('url', '=', custom_url)
|
||||||
|
])
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_colors_asset(self, custom_url):
|
||||||
|
return self.env['ir.asset'].search([
|
||||||
|
('path', 'like', custom_url)
|
||||||
|
])
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_colors_from_url(self, url, bundle):
|
||||||
|
custom_url = self._make_custom_asset_url(url, bundle)
|
||||||
|
url_info = self._get_data_from_url(custom_url)
|
||||||
|
if url_info['customized']:
|
||||||
|
attachment = self._get_colors_attachment(
|
||||||
|
custom_url
|
||||||
|
)
|
||||||
|
if attachment:
|
||||||
|
return base64.b64decode(attachment.datas)
|
||||||
|
with misc.file_open(url.strip('/'), 'rb', filter_ext=EXTENSIONS) as f:
|
||||||
|
return f.read()
|
||||||
|
|
||||||
|
def _get_color_variable(self, content, variable):
|
||||||
|
value = re.search(fr'\$mk_{variable}\:?\s(.*?);', content)
|
||||||
|
return value and value.group(1)
|
||||||
|
|
||||||
|
def _get_color_variables(self, content, variables):
|
||||||
|
return {
|
||||||
|
var: self._get_color_variable(content, var)
|
||||||
|
for var in variables
|
||||||
|
}
|
||||||
|
|
||||||
|
def _replace_color_variables(self, content, variables):
|
||||||
|
for variable in variables:
|
||||||
|
content = re.sub(
|
||||||
|
fr'{variable["name"]}\:?\s(.*?);',
|
||||||
|
f'{variable["name"]}: {variable["value"]};',
|
||||||
|
content
|
||||||
|
)
|
||||||
|
return content
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _save_color_asset(self, url, bundle, content):
|
||||||
|
custom_url = self._make_custom_asset_url(url, bundle)
|
||||||
|
asset_url = url[1:] if url.startswith(('/', '\\')) else url
|
||||||
|
datas = base64.b64encode((content or "\n").encode("utf-8"))
|
||||||
|
custom_attachment = self._get_colors_attachment(
|
||||||
|
custom_url
|
||||||
|
)
|
||||||
|
if custom_attachment:
|
||||||
|
custom_attachment.write({"datas": datas})
|
||||||
|
self.env.registry.clear_cache('assets')
|
||||||
|
else:
|
||||||
|
attachment_values = {
|
||||||
|
'name': url.split("/")[-1],
|
||||||
|
'type': "binary",
|
||||||
|
'mimetype': 'text/scss',
|
||||||
|
'datas': datas,
|
||||||
|
'url': custom_url,
|
||||||
|
}
|
||||||
|
asset_values = {
|
||||||
|
'path': custom_url,
|
||||||
|
'target': url,
|
||||||
|
'directive': 'replace',
|
||||||
|
}
|
||||||
|
target_asset = self._get_colors_asset(
|
||||||
|
asset_url
|
||||||
|
)
|
||||||
|
if target_asset:
|
||||||
|
asset_values['name'] = '%s override' % target_asset.name
|
||||||
|
asset_values['bundle'] = target_asset.bundle
|
||||||
|
asset_values['sequence'] = target_asset.sequence
|
||||||
|
else:
|
||||||
|
asset_values['name'] = '%s: replace %s' % (
|
||||||
|
bundle, custom_url.split('/')[-1]
|
||||||
|
)
|
||||||
|
asset_values['bundle'] = self.env['ir.asset']._get_related_bundle(
|
||||||
|
url, bundle
|
||||||
|
)
|
||||||
|
self.env['ir.attachment'].create(attachment_values)
|
||||||
|
self.env['ir.asset'].create(asset_values)
|
||||||
|
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
# Functions
|
||||||
|
# ----------------------------------------------------------
|
||||||
|
|
||||||
|
def get_color_variables_values(self, url, bundle, variables):
|
||||||
|
content = self._get_colors_from_url(url, bundle)
|
||||||
|
return self._get_color_variables(
|
||||||
|
content.decode('utf-8'), variables
|
||||||
|
)
|
||||||
|
|
||||||
|
def replace_color_variables_values(self, url, bundle, variables):
|
||||||
|
original = self._get_colors_from_url(url, bundle).decode('utf-8')
|
||||||
|
content = self._replace_color_variables(original, variables)
|
||||||
|
self._save_color_asset(url, bundle, content)
|
||||||
|
|
||||||
|
def reset_color_asset(self, url, bundle):
|
||||||
|
custom_url = self._make_custom_asset_url(url, bundle)
|
||||||
|
self._get_colors_attachment(custom_url).unlink()
|
||||||
|
self._get_colors_asset(custom_url).unlink()
|
||||||
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
|
@ -0,0 +1 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 100 100" width="100pt" height="100pt"><defs><clipPath id="_clipPath_lkJoXu9VmaBssCeh7GSeELcSBzweGhLv"><rect width="100" height="100"/></clipPath></defs><g clip-path="url(#_clipPath_lkJoXu9VmaBssCeh7GSeELcSBzweGhLv)"><rect width="100" height="100" style="fill:rgb(0,0,0)" fill-opacity="0"/><g><path d=" M 44.219 1.172 C 43.926 0.469 43.242 0 42.48 0 L 38.77 0 C 38.008 0 37.305 0.469 37.031 1.172 L 32.988 11.27 C 32.363 12.832 30.137 12.832 29.512 11.27 L 25.469 1.172 C 25.176 0.469 24.492 0 23.73 0 L 21.875 0 C 16.699 0 12.5 4.199 12.5 9.375 L 12.5 43.75 L 12.5 48.125 L 12.5 50 L 14.375 50 L 85.625 50 L 87.5 50 L 87.5 48.125 L 87.5 43.75 L 87.5 9.375 C 87.5 4.199 83.301 0 78.125 0 L 57.52 0 C 56.758 0 56.055 0.469 55.781 1.172 L 51.738 11.27 C 51.113 12.832 48.887 12.832 48.262 11.27 L 44.219 1.172 Z " fill="rgb(8,139,245)"/><path d=" M 12.5 56.25 L 12.5 62.5 C 12.5 69.395 18.105 75 25 75 L 37.5 75 L 37.5 87.5 C 37.5 94.395 43.105 100 50 100 C 56.895 100 62.5 94.395 62.5 87.5 L 62.5 75 L 75 75 C 81.895 75 87.5 69.395 87.5 62.5 L 87.5 56.25 L 12.5 56.25 Z " fill="rgb(20,68,150)"/><path d=" M 50 84.375 C 51.726 84.375 53.125 85.774 53.125 87.5 C 53.125 89.226 51.726 90.625 50 90.625 C 48.274 90.625 46.875 89.226 46.875 87.5 C 46.875 85.774 48.274 84.375 50 84.375 Z " fill="rgb(46,188,250)"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,152 @@
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="oe_slogan">MuK Colors</h2>
|
||||||
|
<h3 class="oe_slogan mb-0">Customize your Odoo colors</h3>
|
||||||
|
<img src="logo.png" style="width: 150px;" class="mx-auto center-block">
|
||||||
|
<h4 class="oe_slogan mt-0" style="font-size: 23px">MuK IT GmbH - www.mukit.at</h4>
|
||||||
|
<div class="mb-4" style="text-align: center;">
|
||||||
|
<span
|
||||||
|
class="btn btn-sm mb-2"
|
||||||
|
style="font-size:14px; font-weight:500; background-color:#243742; color:#fff; cursor:default;"
|
||||||
|
>
|
||||||
|
<i class="fa fa-check"></i> Community
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
class="btn btn-sm mb-2"
|
||||||
|
style="font-size:14px; font-weight:500; background-color:#5D8DA8; color:#fff; cursor:default;"
|
||||||
|
>
|
||||||
|
<i class="fa fa-check me-1"></i> Enterprise
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="oe_demo oe_screenshot"
|
||||||
|
style="max-width: 84%; margin: 16px 8%">
|
||||||
|
<img src="screenshot.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width: 84%; margin: 16px 8%;">
|
||||||
|
<h3 class="oe_slogan">Overview</h3>
|
||||||
|
<p class="oe_mt32">
|
||||||
|
This module gives you options to customize the color schema of your Odoo system.
|
||||||
|
You have options to edit the brand and the primary color as well as the context
|
||||||
|
colors (info, success, warning, danger).
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<div class="text-justify" style="max-width:84%; margin:16px 8%">
|
||||||
|
<h3 class="oe_slogan">Dark Mode</h3>
|
||||||
|
<p>
|
||||||
|
With the Enterprise version, the colours for the dark mode can be changed in
|
||||||
|
the same way as for the light mode.
|
||||||
|
</p>
|
||||||
|
<div class="oe_demo oe_screenshot mt16">
|
||||||
|
<img src="screenshot_dark.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section
|
||||||
|
class="oe_container oe_dark d-flex justify-content-around align-items-lg-center flex-column flex-lg-row">
|
||||||
|
<div class="d-flex flex-column m-3 ms-lg-4">
|
||||||
|
<h3 class="oe_slogan mb-3 mt-3 text-left">
|
||||||
|
<i class="fa fa-comments mr8"></i>Want more?
|
||||||
|
</h3>
|
||||||
|
<p>
|
||||||
|
Are you having troubles with your Odoo integration? Or do you feel
|
||||||
|
your system lacks of essential features? <br>If your answer is <b>YES</b>
|
||||||
|
to one of the above questions, feel free to contact us at anytime
|
||||||
|
with your inquiry. <br>We are looking forward to discuss your
|
||||||
|
needs and plan the next steps with you. <br>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="oe_slogan d-flex flex-column ms-1 me-1 ms-lg-4 me-lg-4 flex-grow-1">
|
||||||
|
<a class="btn btn-primary btn-lg m-3"
|
||||||
|
href="mailto:sale@mukit.at?subject=Request%20Quote%3A%20MuK%20Colors"
|
||||||
|
style="font-size: 1.2rem; position: relative; overflow: hidden;">
|
||||||
|
<i class="fa fa-envelope me-1"></i>REQUEST QUOTE
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h3 class="oe_slogan">Our Services</h3>
|
||||||
|
<div class="d-flex justify-content-between">
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_development.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Development
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_integration.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Integration
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_infrastructure.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Infrastructure
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_training.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Training
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<div style="width: 75px; height: 75px; border-radius: 100%; margin: auto">
|
||||||
|
<img src="/service_support.png" style="width: 100%; border-radius: 100%">
|
||||||
|
</div>
|
||||||
|
<h3
|
||||||
|
class="oe_slogan"
|
||||||
|
style="text-align: center; font-size: 14px; width: 100%; margin: 0; margin-top: 5px; color: #000 !important; opacity: 1 !important; line-height: 17px"
|
||||||
|
>
|
||||||
|
Odoo <br>Support
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 334 KiB |
|
After Width: | Height: | Size: 327 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1 @@
|
||||||
|
// Color Assets
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Colors
|
||||||
|
|
||||||
|
$mk_color_brand: #243742;
|
||||||
|
$mk_color_primary: #5D8DA8;
|
||||||
|
|
||||||
|
$mk_color_success: #1DC959;
|
||||||
|
$mk_color_info: #6AB5FB;
|
||||||
|
$mk_color_warning: #FBB56A;
|
||||||
|
$mk_color_danger: #FF5757;
|
||||||
|
|
||||||
|
// Override
|
||||||
|
|
||||||
|
$o-community-color: $mk-color-brand;
|
||||||
|
$o-enterprise-color: $mk-color-brand;
|
||||||
|
$o-enterprise-action-color: $mk-color-primary;
|
||||||
|
|
||||||
|
$o-brand-odoo: $mk-color-brand;
|
||||||
|
$o-brand-primary: $mk-color-primary;
|
||||||
|
|
||||||
|
$o-success: $mk-color-success;
|
||||||
|
$o-info: $mk-color-info;
|
||||||
|
$o-warning: $mk-color-warning;
|
||||||
|
$o-danger: $mk-color-danger;
|
||||||
|
|
||||||
|
$o-theme-text-colors: (
|
||||||
|
"primary": $mk-color-brand,
|
||||||
|
"success": $o-success,
|
||||||
|
"info": $o-info,
|
||||||
|
"warning": $o-warning,
|
||||||
|
"danger": $o-danger,
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Colors
|
||||||
|
|
||||||
|
$mk_color_brand: #243742;
|
||||||
|
$mk_color_primary: #5D8DA8;
|
||||||
|
|
||||||
|
$mk_color_success: #28A745;
|
||||||
|
$mk_color_info: #17A2B8;
|
||||||
|
$mk_color_warning: #FFAC00;
|
||||||
|
$mk_color_danger: #DC3545;
|
||||||
|
|
||||||
|
// Override
|
||||||
|
|
||||||
|
$o-community-color: $mk-color-brand;
|
||||||
|
$o-enterprise-color: $mk-color-brand;
|
||||||
|
$o-enterprise-action-color: $mk-color-primary;
|
||||||
|
|
||||||
|
$o-brand-odoo: $mk-color-brand;
|
||||||
|
$o-brand-primary: $mk-color-primary;
|
||||||
|
|
||||||
|
$o-success: $mk-color-success;
|
||||||
|
$o-info: $mk-color-info;
|
||||||
|
$o-warning: $mk-color-warning;
|
||||||
|
$o-danger: $mk-color-danger;
|
||||||
|
|
||||||
|
$o-theme-text-colors: (
|
||||||
|
"primary": $mk-color-brand,
|
||||||
|
"success": $o-success,
|
||||||
|
"info": $o-info,
|
||||||
|
"warning": $o-warning,
|
||||||
|
"danger": $o-danger,
|
||||||
|
);
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<template id="webclient_bootstrap" inherit_id="web.webclient_bootstrap">
|
||||||
|
<xpath expr="//meta[@name='theme-color']" position="replace">
|
||||||
|
<meta
|
||||||
|
name="theme-color"
|
||||||
|
t-att-content="'#242733' if request.httprequest.cookies.get('color_scheme') == 'dark' else '#714B67'"
|
||||||
|
/>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<odoo>
|
||||||
|
|
||||||
|
<record id="view_res_config_settings_form" model="ir.ui.view">
|
||||||
|
<field name="name">res.config.settings.form</field>
|
||||||
|
<field name="model">res.config.settings</field>
|
||||||
|
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//block[@id='user_default_rights']" position="before">
|
||||||
|
<block title="Branding" id="branding_settings">
|
||||||
|
<setting string="Light Mode Colors" help="Customize the look and feel of the light mode">
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_brand_light" string="Brand" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_brand_light" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_primary_light" string="Primary" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_primary_light" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_info_light" string="Info" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_info_light" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_success_light" string="Success" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_success_light" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_warning_light" string="Warning" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_warning_light" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_danger_light" string="Danger" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_danger_light" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
name="action_reset_light_color_assets"
|
||||||
|
icon="oi-arrow-right"
|
||||||
|
type="object"
|
||||||
|
string="Reset Light Colors"
|
||||||
|
class="btn-link"
|
||||||
|
/>
|
||||||
|
</setting>
|
||||||
|
<setting string="Dark Mode Colors" help="Customize the look and feel of the dark mode">
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_brand_dark" string="Brand" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_brand_dark" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_primary_dark" string="Primary" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_primary_dark" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_info_dark" string="Info" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_info_dark" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_success_dark" string="Success" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_success_dark" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_warning_dark" string="Warning" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_warning_dark" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<div class="w-50 row">
|
||||||
|
<label for="color_danger_dark" string="Danger" class="d-block w-75 py-2"/>
|
||||||
|
<field name="color_danger_dark" class="d-block w-25 p-0 m-0" widget="color"/>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
name="action_reset_dark_color_assets"
|
||||||
|
icon="oi-arrow-right"
|
||||||
|
type="object"
|
||||||
|
string="Reset Dark Colors"
|
||||||
|
class="btn-link"
|
||||||
|
/>
|
||||||
|
</setting>
|
||||||
|
</block>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
|
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.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
from . import models
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
{
|
||||||
|
'name': 'MuK Dialog',
|
||||||
|
'summary': 'Adds options for the dialogs',
|
||||||
|
'description': '''
|
||||||
|
This module adds an option to dialogs to expand it to full screen mode.
|
||||||
|
Each user can the initial state of the dialogs in their preferences.
|
||||||
|
''',
|
||||||
|
'version': '18.0.1.0.1',
|
||||||
|
'category': 'Tools/UI',
|
||||||
|
'license': 'LGPL-3',
|
||||||
|
'author': 'MuK IT',
|
||||||
|
'website': 'http://www.mukit.at',
|
||||||
|
'live_test_url': 'https://my.mukit.at/r/f6m',
|
||||||
|
'contributors': [
|
||||||
|
'Mathias Markl <mathias.markl@mukit.at>',
|
||||||
|
],
|
||||||
|
'depends': [
|
||||||
|
'web',
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'views/res_users.xml',
|
||||||
|
],
|
||||||
|
'assets': {
|
||||||
|
'web.assets_backend': [
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/core/dialog/dialog.js',
|
||||||
|
'/muk_web_dialog/static/src/core/dialog/dialog.js',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/core/dialog/dialog.scss',
|
||||||
|
'/muk_web_dialog/static/src/core/dialog/dialog.scss',
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'after',
|
||||||
|
'web/static/src/core/dialog/dialog.xml',
|
||||||
|
'/muk_web_dialog/static/src/core/dialog/dialog.xml',
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'images': [
|
||||||
|
'static/description/banner.png',
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'application': False,
|
||||||
|
'auto_install': False,
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
`1.0.0`
|
||||||
|
-------
|
||||||
|
|
||||||
|
- Initial Release
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
==========
|
||||||
|
MuK Dialog
|
||||||
|
==========
|
||||||
|
|
||||||
|
This module adds an option to dialogs to expand it to full screen mode.
|
||||||
|
Each user can the initial state of the dialogs in their preferences.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
To install this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Afterward, log on to
|
||||||
|
your Odoo server and go to the Apps menu. Trigger the debug mode and update the
|
||||||
|
list by clicking on the "Update Apps List" link. Now install the module by
|
||||||
|
clicking on the install button.
|
||||||
|
|
||||||
|
Upgrade
|
||||||
|
============
|
||||||
|
|
||||||
|
To upgrade this module, you need to:
|
||||||
|
|
||||||
|
Download the module and add it to your Odoo addons folder. Restart the server
|
||||||
|
and log on to your Odoo server. Select the Apps menu and upgrade the module by
|
||||||
|
clicking on the upgrade button.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
Each user can define in their profile the default size of the dialogs.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=============
|
||||||
|
|
||||||
|
Each dialog has a new button in the header to expand or compress the dialog.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Contributors
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Mathias Markl <mathias.markl@mukit.at>
|
||||||
|
|
||||||
|
Author & Maintainer
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
This module is maintained by the `MuK IT GmbH <https://www.mukit.at/>`_.
|
||||||
|
|
||||||
|
MuK IT is an Austrian company specialized in customizing and extending Odoo.
|
||||||
|
We develop custom solutions for your individual needs to help you focus on
|
||||||
|
your strength and expertise to grow your business.
|
||||||
|
|
||||||
|
If you want to get in touch please contact us via mail
|
||||||
|
(sale@mukit.at) or visit our website (https://mukit.at).
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Translation of Odoo Server.
|
||||||
|
# This file contains the translation of the following modules:
|
||||||
|
# * muk_web_dialog
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Odoo Server 18.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2024-11-06 14:30+0000\n"
|
||||||
|
"PO-Revision-Date: 2024-11-06 14:30+0000\n"
|
||||||
|
"Last-Translator: \n"
|
||||||
|
"Language-Team: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: \n"
|
||||||
|
"Plural-Forms: \n"
|
||||||
|
|
||||||
|
#. module: muk_web_dialog
|
||||||
|
#: model:ir.model.fields,field_description:muk_web_dialog.field_res_users__dialog_size
|
||||||
|
msgid "Dialog Size"
|
||||||
|
msgstr "Dialoggröße"
|
||||||
|
|
||||||
|
#. module: muk_web_dialog
|
||||||
|
#: model:ir.model,name:muk_web_dialog.model_ir_http
|
||||||
|
msgid "HTTP Routing"
|
||||||
|
msgstr "HTTP-Routing"
|
||||||
|
|
||||||
|
#. module: muk_web_dialog
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_dialog.selection__res_users__dialog_size__maximize
|
||||||
|
msgid "Maximize"
|
||||||
|
msgstr "Maximieren"
|
||||||
|
|
||||||
|
#. module: muk_web_dialog
|
||||||
|
#: model:ir.model.fields.selection,name:muk_web_dialog.selection__res_users__dialog_size__minimize
|
||||||
|
msgid "Minimize"
|
||||||
|
msgstr "Minimieren"
|
||||||
|
|
||||||
|
#. module: muk_web_dialog
|
||||||
|
#: model:ir.model,name:muk_web_dialog.model_res_users
|
||||||
|
msgid "User"
|
||||||
|
msgstr "Benutzer"
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
from . import ir_http
|
||||||
|
from . import res_users
|
||||||