[init/add] generic backend theme
165
muk_web_theme-19/muk_web_appsbar/LICENSE
Normal file
@@ -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.
|
||||
14
muk_web_theme-19/muk_web_appsbar/__init__.py
Normal file
@@ -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())
|
||||
})
|
||||
|
||||
73
muk_web_theme-19/muk_web_appsbar/__manifest__.py
Normal file
@@ -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': '19.0.1.1.1',
|
||||
'category': 'Tools/UI',
|
||||
'license': 'LGPL-3',
|
||||
'author': 'MuK IT',
|
||||
'website': 'http://www.mukit.at',
|
||||
'live_test_url': 'https://youtu.be/kmu69REqKDU',
|
||||
'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',
|
||||
}
|
||||
9
muk_web_theme-19/muk_web_appsbar/doc/changelog.rst
Normal file
@@ -0,0 +1,9 @@
|
||||
`1.1.0`
|
||||
-------
|
||||
|
||||
- Use CSS Grid
|
||||
|
||||
`1.0.0`
|
||||
-------
|
||||
|
||||
- Initial Release
|
||||
59
muk_web_theme-19/muk_web_appsbar/doc/index.rst
Normal file
@@ -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).
|
||||
94
muk_web_theme-19/muk_web_appsbar/i18n/de.po
Normal file
@@ -0,0 +1,94 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * muk_web_appsbar
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 19.0+e\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-11-26 16:53+0000\n"
|
||||
"PO-Revision-Date: 2025-11-26 16:53+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ü Fußzeilenbild"
|
||||
|
||||
#. module: muk_web_appsbar
|
||||
#: model_terms:ir.ui.view,arch_db:muk_web_appsbar.view_res_config_settings_form
|
||||
msgid "AppsBar"
|
||||
msgstr "AppsBar"
|
||||
|
||||
#. 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.fields,field_description:muk_web_appsbar.field_ir_http__display_name
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_company__display_name
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_config_settings__display_name
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_users__display_name
|
||||
msgid "Display Name"
|
||||
msgstr "Anzeigename"
|
||||
|
||||
#. 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,field_description:muk_web_appsbar.field_ir_http__id
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_company__id
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_config_settings__id
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_users__id
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
#. 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 "Setzen Sie Ihr eigenes Logo für die Appsbar ein"
|
||||
|
||||
#. module: muk_web_appsbar
|
||||
#: model:ir.model.fields,field_description:muk_web_appsbar.field_res_users__sidebar_type
|
||||
msgid "Sidebar Type"
|
||||
msgstr "Seitenleisten-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"
|
||||
4
muk_web_theme-19/muk_web_appsbar/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from . import ir_http
|
||||
from . import res_users
|
||||
from . import res_company
|
||||
from . import res_config_settings
|
||||
19
muk_web_theme-19/muk_web_appsbar/models/ir_http.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from odoo import models
|
||||
|
||||
|
||||
class IrHttp(models.AbstractModel):
|
||||
|
||||
_inherit = "ir.http"
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Functions
|
||||
#----------------------------------------------------------
|
||||
|
||||
def session_info(self):
|
||||
result = super().session_info()
|
||||
if self.env.user._is_internal():
|
||||
for company in self.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
|
||||
15
muk_web_theme-19/muk_web_appsbar/models/res_company.py
Normal file
@@ -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
|
||||
)
|
||||
37
muk_web_theme-19/muk_web_appsbar/models/res_users.py
Normal file
@@ -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,
|
||||
)
|
||||
BIN
muk_web_theme-19/muk_web_appsbar/static/description/banner.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 332 KiB |
BIN
muk_web_theme-19/muk_web_appsbar/static/description/icon.png
Normal file
|
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 |
155
muk_web_theme-19/muk_web_appsbar/static/description/index.html
Normal file
@@ -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"
|
||||
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>
|
||||
BIN
muk_web_theme-19/muk_web_appsbar/static/description/logo.png
Normal file
|
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,34 @@
|
||||
import { url } from '@web/core/utils/urls';
|
||||
import { useService } from '@web/core/utils/hooks';
|
||||
import { user } from "@web/core/user";
|
||||
|
||||
import { Component, onWillUnmount } from '@odoo/owl';
|
||||
|
||||
export class AppsBar extends Component {
|
||||
static template = 'muk_web_appsbar.AppsBar';
|
||||
static props = {};
|
||||
setup() {
|
||||
this.appMenuService = useService('app_menu');
|
||||
if (user.activeCompany.has_appsbar_image) {
|
||||
this.sidebarImageUrl = url('/web/image', {
|
||||
model: 'res.company',
|
||||
field: 'appbar_image',
|
||||
id: user.activeCompany.id,
|
||||
});
|
||||
}
|
||||
const renderAfterMenuChange = () => {
|
||||
this.render();
|
||||
};
|
||||
this.env.bus.addEventListener(
|
||||
'MENUS:APP-CHANGED', renderAfterMenuChange
|
||||
);
|
||||
onWillUnmount(() => {
|
||||
this.env.bus.removeEventListener(
|
||||
'MENUS:APP-CHANGED', renderAfterMenuChange
|
||||
);
|
||||
});
|
||||
}
|
||||
_onAppClick(app) {
|
||||
return this.appMenuService.selectApp(app);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
.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="() => this._onAppClick(app)"
|
||||
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.label"/>
|
||||
</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,33 @@
|
||||
import { registry } from "@web/core/registry";
|
||||
import { user } from "@web/core/user";
|
||||
|
||||
import { computeAppsAndMenuItems, reorderApps } from "@web/webclient/menus/menu_helpers";
|
||||
|
||||
export const appMenuService = {
|
||||
dependencies: ["menu"],
|
||||
async start(env, { menu }) {
|
||||
return {
|
||||
getCurrentApp () {
|
||||
return menu.getCurrentApp();
|
||||
},
|
||||
getAppsMenuItems() {
|
||||
const menuItems = computeAppsAndMenuItems(
|
||||
menu.getMenuAsTree('root')
|
||||
)
|
||||
const apps = menuItems.apps;
|
||||
const menuConfig = JSON.parse(
|
||||
user.settings?.homemenu_config || 'null'
|
||||
);
|
||||
if (menuConfig) {
|
||||
reorderApps(apps, menuConfig);
|
||||
}
|
||||
return apps;
|
||||
},
|
||||
selectApp(app) {
|
||||
menu.selectMenu(app);
|
||||
}
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
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>
|
||||
12
muk_web_theme-19/muk_web_appsbar/templates/webclient.xml
Normal file
@@ -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>
|
||||
16
muk_web_theme-19/muk_web_appsbar/views/res_users.xml
Normal file
@@ -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="//group[@name='other_preferences']" position="inside">
|
||||
<field name="sidebar_type" readonly="0"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||