Browse Source

Oct 07: [ADD] Initial commit 'backend_theme_infinito'

pull/338/head
Cybrosys Technologies 7 months ago
parent
commit
c33d527dc5
  1. 45
      backend_theme_infinito/README.rst
  2. 24
      backend_theme_infinito/__init__.py
  3. 98
      backend_theme_infinito/__manifest__.py
  4. 23
      backend_theme_infinito/controllers/__init__.py
  5. 68
      backend_theme_infinito/controllers/base_pwa.py
  6. 585
      backend_theme_infinito/controllers/main.py
  7. 6
      backend_theme_infinito/doc/RELEASE_NOTES.md
  8. 158
      backend_theme_infinito/icon_hooks.py
  9. 26
      backend_theme_infinito/models/__init__.py
  10. 120
      backend_theme_infinito/models/ir_http.py
  11. 35
      backend_theme_infinito/models/menu_bookmark.py
  12. 81
      backend_theme_infinito/models/recent_apps.py
  13. 151
      backend_theme_infinito/models/res_config_settings.py
  14. 56
      backend_theme_infinito/models/res_users.py
  15. BIN
      backend_theme_infinito/static/description/assets/hero.png
  16. BIN
      backend_theme_infinito/static/description/assets/icons/check.png
  17. BIN
      backend_theme_infinito/static/description/assets/icons/chevron.png
  18. BIN
      backend_theme_infinito/static/description/assets/icons/cogs.png
  19. BIN
      backend_theme_infinito/static/description/assets/icons/consultation.png
  20. BIN
      backend_theme_infinito/static/description/assets/icons/ecom-black.png
  21. BIN
      backend_theme_infinito/static/description/assets/icons/education-black.png
  22. BIN
      backend_theme_infinito/static/description/assets/icons/hotel-black.png
  23. BIN
      backend_theme_infinito/static/description/assets/icons/license.png
  24. BIN
      backend_theme_infinito/static/description/assets/icons/lifebuoy.png
  25. BIN
      backend_theme_infinito/static/description/assets/icons/manufacturing-black.png
  26. BIN
      backend_theme_infinito/static/description/assets/icons/pos-black.png
  27. BIN
      backend_theme_infinito/static/description/assets/icons/puzzle.png
  28. BIN
      backend_theme_infinito/static/description/assets/icons/restaurant-black.png
  29. BIN
      backend_theme_infinito/static/description/assets/icons/service-black.png
  30. BIN
      backend_theme_infinito/static/description/assets/icons/trading-black.png
  31. BIN
      backend_theme_infinito/static/description/assets/icons/training.png
  32. BIN
      backend_theme_infinito/static/description/assets/icons/update.png
  33. BIN
      backend_theme_infinito/static/description/assets/icons/user.png
  34. BIN
      backend_theme_infinito/static/description/assets/icons/wrench.png
  35. BIN
      backend_theme_infinito/static/description/assets/screenshots/bookmark.jpg
  36. BIN
      backend_theme_infinito/static/description/assets/screenshots/calendar.jpg
  37. BIN
      backend_theme_infinito/static/description/assets/screenshots/discuss.jpg
  38. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/adv_button.gif
  39. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/adv_list.gif
  40. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/animation.gif
  41. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/app_bar.gif
  42. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/bookmark.gif
  43. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/dark_mode.gif
  44. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/hover_nav.gif
  45. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/preloader.gif
  46. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/recent_apps.gif
  47. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/rtl.gif
  48. BIN
      backend_theme_infinito/static/description/assets/screenshots/gif/side_bar.gif
  49. BIN
      backend_theme_infinito/static/description/assets/screenshots/infinito_adv.jpg
  50. BIN
      backend_theme_infinito/static/description/assets/screenshots/infinito_landing.jpg
  51. BIN
      backend_theme_infinito/static/description/assets/screenshots/infinito_styles.jpg
  52. BIN
      backend_theme_infinito/static/description/assets/screenshots/kanban-1.jpg
  53. BIN
      backend_theme_infinito/static/description/assets/screenshots/kanban-grp.png
  54. BIN
      backend_theme_infinito/static/description/assets/screenshots/kanban-img.png
  55. BIN
      backend_theme_infinito/static/description/assets/screenshots/kanban.jpg
  56. BIN
      backend_theme_infinito/static/description/assets/screenshots/kanban.png
  57. BIN
      backend_theme_infinito/static/description/assets/screenshots/kanban_grp.jpg
  58. BIN
      backend_theme_infinito/static/description/assets/screenshots/list.jpg
  59. BIN
      backend_theme_infinito/static/description/assets/screenshots/list_group.jpg
  60. BIN
      backend_theme_infinito/static/description/assets/screenshots/resp-app_bar.gif
  61. BIN
      backend_theme_infinito/static/description/assets/screenshots/resp-sidebar.gif
  62. BIN
      backend_theme_infinito/static/description/assets/screenshots/sidebar-list.jpg
  63. BIN
      backend_theme_infinito/static/description/assets/screenshots/sidebar-small.jpg
  64. BIN
      backend_theme_infinito/static/description/assets/screenshots/sidebar.jpg
  65. BIN
      backend_theme_infinito/static/description/assets/screenshots/user_edit.jpg
  66. BIN
      backend_theme_infinito/static/description/banner.jpg
  67. BIN
      backend_theme_infinito/static/description/icon.png
  68. 1106
      backend_theme_infinito/static/description/index.html
  69. BIN
      backend_theme_infinito/static/description/theme_screenshot.jpg
  70. 2
      backend_theme_infinito/static/src/css/dynamic_styles.css
  71. 34
      backend_theme_infinito/static/src/css/layout.css
  72. 128
      backend_theme_infinito/static/src/css/loaders.css
  73. 1700
      backend_theme_infinito/static/src/css/style.css
  74. 1201
      backend_theme_infinito/static/src/css/style2.css
  75. 1
      backend_theme_infinito/static/src/img/alignment/align-objects.svg
  76. 6
      backend_theme_infinito/static/src/img/alignment/align-right.svg
  77. 49
      backend_theme_infinito/static/src/img/alignment/center-align.svg
  78. 55
      backend_theme_infinito/static/src/img/alignment/justification (1).svg
  79. 55
      backend_theme_infinito/static/src/img/alignment/left-align.svg
  80. 55
      backend_theme_infinito/static/src/img/alignment/right-align.svg
  81. 8
      backend_theme_infinito/static/src/img/alignment/top-alignment.svg
  82. 2
      backend_theme_infinito/static/src/img/brand_icon/infinity.svg
  83. 86
      backend_theme_infinito/static/src/img/brightness.svg
  84. BIN
      backend_theme_infinito/static/src/img/center-align.png
  85. 0
      backend_theme_infinito/static/src/img/centered-text-of-alignment-button.png
  86. BIN
      backend_theme_infinito/static/src/img/close.png
  87. BIN
      backend_theme_infinito/static/src/img/color_picker/color-picker.png
  88. 1
      backend_theme_infinito/static/src/img/downward-arrow.svg
  89. 1
      backend_theme_infinito/static/src/img/eyedropper.svg
  90. 1
      backend_theme_infinito/static/src/img/gear.svg
  91. BIN
      backend_theme_infinito/static/src/img/icons/apps.png
  92. BIN
      backend_theme_infinito/static/src/img/icons/attendance.png
  93. BIN
      backend_theme_infinito/static/src/img/icons/calendar.png
  94. BIN
      backend_theme_infinito/static/src/img/icons/contact.png
  95. BIN
      backend_theme_infinito/static/src/img/icons/crm.png
  96. BIN
      backend_theme_infinito/static/src/img/icons/dashboard.png
  97. BIN
      backend_theme_infinito/static/src/img/icons/discuss.png
  98. BIN
      backend_theme_infinito/static/src/img/icons/elearning.png
  99. BIN
      backend_theme_infinito/static/src/img/icons/employees.png
  100. BIN
      backend_theme_infinito/static/src/img/icons/events.png

45
backend_theme_infinito/README.rst

@ -0,0 +1,45 @@
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
Backend Theme Infinito
======================
* Backend Theme Infinito module for Odoo 17 community editions
Installation
============
- www.odoo.com/documentation/17.0/setup/install.html
- Install our custom addon
License
-------
General Public License, Version 3 (LGPL v3).
(https://www.odoo.com/documentation/user/16.0/legal/licenses/licenses.html)
Company
-------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>'__
Credits
-------
* 'Cybrosys Techno Solutions <https://cybrosys.com/>'__
Author : Farseen, Musthafa , Gokul , Ajith @Cybrosys
Contacts
--------
* Mail Contact : odoo@cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com
Further information
===================
HTML Description: `<static/description/index.html>`__

24
backend_theme_infinito/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from .icon_hooks import icons_post_init_hook
from . import controllers
from . import models

98
backend_theme_infinito/__manifest__.py

@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
{
"name": "Infinito Backend Theme",
"description": """Utmost and dynamic backend theme for Odoo 17""",
"summary": """The Backend Theme Infinito Is A Dynamic And Ultimate Theme
For Your Odoo V17. This Theme Will Give You A New Experience With Odoo.
Main Highlight Of The Theme Is You Can Dynamically Change The Colors,
Views, Buttons, Different Types Sidebar...Etc""",
"category": "Themes/Backend",
"version": "17.0.1.0.0",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
"depends": ['web', 'mail'],
"data": [
'views/assets.xml',
'views/layout.xml',
'views/base_pwa.xml',
'views/icons.xml',
'views/editor_client_action.xml',
],
'assets': {
'web._assets_primary_variables': {
'backend_theme_infinito/static/src/scss/theme_variables.scss',
},
'web.assets_backend': {
'/backend_theme_infinito/static/src/xml/systray.xml',
'/backend_theme_infinito/static/src/xml/views.xml',
'/backend_theme_infinito/static/src/xml/theme_editor.xml',
'/backend_theme_infinito/static/src/xml/studio_elements.xml',
'/backend_theme_infinito/static/src/xml/ThemeStudioMenu.xml',
'/backend_theme_infinito/static/src/xml/style_add.xml',
'/backend_theme_infinito/static/src/xml/sidebar.xml',
'/backend_theme_infinito/static/src/xml/sidebar_simple_editor.xml',
'/backend_theme_infinito/static/src/xml/MenuBookmark.xml',
'https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap',
'/backend_theme_infinito/static/src/css/style.css',
'/backend_theme_infinito/static/src/css/loaders.css',
'backend_theme_infinito/static/src/scss/sidebar.scss',
'backend_theme_infinito/static/src/scss/responsive.scss',
'backend_theme_infinito/static/src/scss/theme_date_picker.scss',
'backend_theme_infinito/static/src/scss/theme_styles.scss',
'backend_theme_infinito/static/src/scss/theme_rtl.scss',
'backend_theme_infinito/static/src/scss/app_menu.scss',
'backend_theme_infinito/static/src/scss/extra_styles.scss',
'backend_theme_infinito/static/src/scss/views.scss',
'/backend_theme_infinito/static/src/js/checkService.js',
'/backend_theme_infinito/static/src/js/systray.js',
'/backend_theme_infinito/static/src/js/loaders.js',
'/backend_theme_infinito/static/src/js/editor_client_action.js',
'/backend_theme_infinito/static/src/js/ThemeStudioWidget.js',
'/backend_theme_infinito/static/src/js/Tool.js',
'/backend_theme_infinito/static/src/js/VisualEditor.js',
'/backend_theme_infinito/static/src/js/change.js',
'/backend_theme_infinito/static/src/js/style_add.js',
'/backend_theme_infinito/static/src/js/sidebar.js',
'/backend_theme_infinito/static/src/js/navbar.js',
'/backend_theme_infinito/static/src/js/theme_editor_sidebar.js',
'/backend_theme_infinito/static/src/js/recentApps.js',
'/backend_theme_infinito/static/src/js/editor_menu.js',
'/backend_theme_infinito/static/src/js/timepicker.js',
'/backend_theme_infinito/static/src/js/MenuBookmark.js',
'/backend_theme_infinito/static/src/js/SaveChanges.js',
'/backend_theme_infinito/static/src/js/ThemeStudioMenu.js',
'/backend_theme_infinito/static/src/js/variables.js',
},
},
'post_init_hook': 'icons_post_init_hook',
'images': [
'static/description/banner.jpg',
'static/description/theme_screenshot.jpg',
],
'license': 'LGPL-3',
'installable': True,
'application': False,
'auto_install': False,
}

23
backend_theme_infinito/controllers/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import base_pwa
from . import main

68
backend_theme_infinito/controllers/base_pwa.py

@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import json
from odoo import http
from odoo.http import request
class BasePwa(http.Controller):
"""
Controller class for handling Progressive Web App (PWA) related functionalities.
"""
def pwa_data(self):
"""
Define the data required for the PWA manifest file.
Returns:
dict: Dictionary containing PWA manifest data.
"""
return {
'short_name': 'Odoo',
'name': 'Odoo-infinito',
'description': 'PWA provided by backend theme infinito',
'icons': [
{
'src': '/backend_theme_infinito/static/src/img/menu.png',
'type': 'image/png',
'sizes': '144x144',
'purpose': 'any maskable'
},
],
'start_url': 'http://cybrosys:8015/web',
'background_color': 'white',
'display': 'standalone',
'theme_color': 'white',
}
@http.route('/manifest/webmanifest', type='http',
auth='public', website=True, sitemap=False)
def base_pwa_data(self):
"""
Endpoint for serving the PWA manifest file.
Returns:
odoo.http.Response: HTTP response containing the PWA manifest data.
"""
return request.make_response(json.dumps(self.pwa_data()),
headers=[('Content-Type',
'application/json;charset=utf-8')])

585
backend_theme_infinito/controllers/main.py

@ -0,0 +1,585 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import json
import os
import re
from odoo import http
from odoo.http import request
def minify_css(path):
"""
Minify CSS file located at the specified path.
Parameters:
path (str): The file path to the CSS file to be minified.
Returns:
None
This function reads the CSS file specified by the given path, removes
comments,excess whitespace, and redundant CSS properties. It then writes
the minified CSS back to the same file, overwriting its previous contents.
Note:
This function modifies the CSS file in place.
Example:
minify_css('/path/to/style.css')
"""
with open(path, 'r') as f:
css = f.read()
css = re.sub(r'/\*[\s\S]*?\*/', "", css)
css = re.sub(r'url\((["\'])([^)]*)\1\)', r'url(\2)', css)
css = re.sub(r'\s+', ' ', css)
css = re.sub(r'#([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3(\s|;)', r'#\1\2\3\4',
css)
css = re.sub(r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css)
rules = re.findall(r'([^{]+){([^}]*)}', css)
selectors_list = []
css_values = {}
for rule in rules:
selector = rule[0]
content = rule[1]
if selector not in selectors_list:
selectors_list.append(selector)
css_values[selector] = content
else:
css_values[selector] = css_values[selector] + content
with open(path, 'w') as f:
selector_dict = {}
for selector in selectors_list:
rule = css_values[selector].split(';')
dict_rule = {}
for r in rule:
if r:
split_rule = r.split(':')
if len(split_rule) == 2:
dict_rule[split_rule[0].strip()] = split_rule[1]
selector_dict[selector] = dict_rule
f.write('/* This Styles are generated automatically by Theme Studio'
' */\n')
for selector in selector_dict:
f.write(selector + '{')
for rule_data in selector_dict[selector]:
if rule_data != 'pointer-events':
if selector_dict[selector][rule_data].find(
'!important') == -1:
f.write(rule_data + ':' +
selector_dict[selector][rule_data] +
' !important;')
else:
f.write(rule_data + ':' +
selector_dict[selector][rule_data] + ';')
f.write('}')
class ThemeStudio(http.Controller):
"""
Controller class for managing themes in a web application.
This controller handles requests related to managing themes, such as
applying themes, customizing themes, and saving theme settings.
"""
@http.route(['/theme_studio/save_styles'], type="json")
def save_styles(self, kwargs):
"""
Save dynamic styles to a CSS file.
Parameters:
kwargs (dict): A dictionary containing the changed_styles and
object_class.
Returns:
bool: True if the styles are successfully saved, otherwise False.
This function takes the changed_styles and object_class from the
kwargs dictionary and saves them to a CSS file. It appends the styles
to an existing file or creates a new file if it doesn't exist.
After saving the styles, it minifies the CSS file.
Example:
To save styles for a specific object class:
```python
from my_theme_module import save_styles
save_styles({
'changed_styles': {
'color': 'red',
'font-size': '16px'
},
'object_class': 'my-object'
})
```
"""
changed_styles_str = kwargs.get('changed_styles', '{}')
object_class = kwargs.get('object_class', '')
changed_styles = json.loads(changed_styles_str)
working_dir = os.path.dirname(os.path.realpath(__file__))
working_dir = working_dir.replace('/controllers', '')
file_path = working_dir + '/static/src/css/dynamic_styles.css'
style_file = open(file_path, 'a')
if os.stat(file_path).st_size == 0:
style_file.write('/* This file is generated automatically by '
'Theme Infinito */\n')
style_file.write('\n.' + object_class + ' {\n')
for style in changed_styles:
style_file.write(
'\t' + style + ': ' + changed_styles[style] + ';\n')
style_file.write('}\n')
style_file.close()
minify_css(file_path)
return True
@http.route(['/theme_studio/get_current_style'], type="json")
def get_current_style(self, kwargs):
"""
Retrieve the current styles for a given CSS selector.
Parameters:
kwargs (dict): A dictionary containing the 'selector' key
specifying the CSS selector.
Returns:
list or bool: A list of style properties and values for the
specified selector, or False if the selector is not found.
This function reads the CSS file containing dynamic styles and
searches for the specified CSS selector. If the selector is found,
it returns a list of style properties and values associated with that
selector. Each style property-value pair is represented as a list
containing the property and its corresponding value.
If the selector is not found,it returns False.
Example:
To retrieve the current styles for a specific CSS selector:
```python
from my_theme_module import get_current_style
current_styles = get_current_style({
'selector': '.my-selector'
})
print(current_styles)
# Output: [['color', 'red'], ['font-size', '16px']]
```
"""
selector = kwargs.get('selector', '')
working_dir = os.path.dirname(os.path.realpath(__file__))
file_path = working_dir.replace('controllers',
'static/src/css/dynamic_styles.css')
style_file = open(file_path, 'r')
css = style_file.read()
css = re.sub(r'/\*[\s\S]*?\*/', "", css)
css = re.sub(r'url\((["\'])([^)]*)\1\)', r'url(\2)', css)
css = re.sub(r'\s+', ' ', css)
css = re.sub(r'#([0-9a-f])\1([\da-f])\2([0-9a-f])\3(\s|;)',
r'#\1\2\3\4', css)
css = re.sub(r':\s*0(\.\d+([cm]m|e[mx]|in|p[ctx]))\s*;', r':\1;', css)
rules = re.findall(r'([^{]+){([^}]*)}', css)
for rule in rules:
selector_now = rule[0]
content = rule[1]
if selector == selector_now.strip():
contents = content.split(';')
content = []
for c in contents:
c = c.split(':')
if c[0] != '' and len(c) > 1:
content.append(
[c[0], c[1].strip().replace('!important', '')])
return content
return False
@http.route(['/theme_studio/reset_to_default'], type="json")
def reset_to_default(self):
"""
Reset dynamic styles to default.
Returns:
bool: True if the styles are successfully reset, otherwise False.
This function clears the content of the CSS file containing
dynamic styles, effectively resetting all styles to their default
values.
Example:
To reset dynamic styles to default:
```python
from my_theme_module import reset_to_default
reset_to_default()
```
"""
working_dir = os.path.dirname(os.path.realpath(__file__))
file_path = working_dir.replace('controllers',
'static/src/css/dynamic_styles.css')
style_file = open(file_path, 'w')
style_file.write('')
return True
@http.route(['/theme_studio/set_advanced_data'], type="json")
def set_advanced_data(self, args):
"""
Set advanced theme configuration data.
Parameters:
args (list): A list containing a dictionary with the advanced
theme configuration values.
Returns:
bool: True if the configuration data is successfully set,
otherwise False.
This function sets advanced theme configuration data based on the
provided dictionary of values. It updates the configuration
parameters in the database accordingly.
Example:
To set advanced theme configuration data:
```python
from my_theme_module import set_advanced_data
data = [{
'vals': {
'sidebar': True,
'fullscreen': False,
'sidebarIcon': True,
'sidebarName': True,
'sidebarCompany': False,
'sidebarUser': True,
'recentApps': False,
'fullScreenApp': True,
'infinitoRtl': False,
'infinitoDark': True,
'infinitoDarkMode': 'dark',
'infinitoBookmark': True
}
}]
set_advanced_data(data)
```
"""
if args and 'vals' in args[0]:
vals = args[0]['vals']
set_param = request.env['ir.config_parameter'].sudo().set_param
set_param('backend_theme_infinito.is_sidebar_enabled',
vals['sidebar'])
set_param('backend_theme_infinito.is_fullscreen_enabled',
vals['fullscreen'])
set_param('backend_theme_infinito.is_sidebar_icon',
vals['sidebarIcon'])
set_param('backend_theme_infinito.is_sidebar_name',
vals['sidebarName'])
set_param('backend_theme_infinito.is_sidebar_company',
vals['sidebarCompany'])
set_param('backend_theme_infinito.is_sidebar_user',
vals['sidebarUser'])
set_param('backend_theme_infinito.is_recent_apps',
vals['recentApps'])
set_param('backend_theme_infinito.is_fullscreen_app',
vals['fullScreenApp'])
set_param('backend_theme_infinito.is_rtl', vals['infinitoRtl'])
set_param('backend_theme_infinito.is_dark', vals['infinitoDark'])
set_param('backend_theme_infinito.dark_mode',
vals['infinitoDarkMode'])
set_param('backend_theme_infinito.is_menu_bookmark',
vals['infinitoBookmark'])
@http.route(['/theme_studio/set_advanced_data_user'], type="json")
def set_advanced_data_user(self, args):
"""
Set advanced theme configuration data for the current user.
Parameters:
args (list): A list containing a dictionary with the advanced
theme configuration values.
Returns:
bool: True if the configuration data is successfully set for the
user, otherwise False.
This function sets advanced theme configuration data for the current
user based on the provided dictionary of values. It updates the
corresponding fields in the user record accordingly.
Example:
To set advanced theme configuration data for the current user:
```python
from my_theme_module import set_advanced_data_user
data = [{
'vals': {
'sidebar': True,
'fullscreen': False,
'sidebarIcon': True,
'sidebarName': True,
'sidebarCompany': False,
'sidebarUser': True,
'recentApps': False,
'fullScreenApp': True,
'infinitoRtl': False,
'infinitoDark': True,
'infinitoDarkMode': 'dark',
'infinitoBookmark': True,
'loaderClass': 'custom-loader'
}
}]
set_advanced_data_user(data)
```
"""
if args and 'vals' in args[0]:
vals = args[0]['vals']
request.env.user.write({
'is_sidebar_enabled': vals['sidebar'],
'is_fullscreen_enabled': vals['fullscreen'],
'is_sidebar_icon': vals['sidebarIcon'],
'is_sidebar_name': vals['sidebarName'],
'is_sidebar_company': vals['sidebarCompany'],
'is_sidebar_user': vals['sidebarUser'],
'is_recent_apps': vals['recentApps'],
'is_fullscreen_app': vals['fullScreenApp'],
'is_rtl': vals['infinitoRtl'],
'is_dark': vals['infinitoDark'],
'dark_mode': vals['infinitoDarkMode'],
'is_menu_bookmark': vals['infinitoBookmark'],
'loader_class': vals['loaderClass']
})
return True
@http.route(['/theme_studio/add_recent_app'], type="json")
def add_recent_app(self, args):
"""
Add a recent application to the user's recent apps list.
Parameters:
args (list): A list containing a dictionary with the 'appId' key
specifying the ID of the application.
Returns:
bool: True if the recent app is successfully added, otherwise False.
This function adds a recent application to the user's recent apps list
based on the provided application ID. It checks if the provided
arguments are valid and if the user has already reached the maximum
limit of recent apps (5), it removes the oldest one before adding the
new one.
Example:
To add a recent application with ID 123 to the user's recent apps
list:
```python
from my_theme_module import add_recent_app
add_recent_app([{'appId': 123}])
```
"""
if args and isinstance(args, list) and len(args) > 0:
app_id = args[0].get('appId')
if app_id is not None: # Check if appId exists
app_id = int(app_id)
else:
# Handle the case where appId is not provided
# You might want to raise an error, log a message, or handle
# it differently based on your requirements
# For now, I'll assign a default value of 0
app_id = 0
else:
# Handle the case where args is empty or not a list
# You might want to raise an error or handle it differently based
# on your requirements For now, I'll assign a default value of 0
app_id = 0
recent_app = request.env['recent.apps'].sudo()
exist = recent_app.search([
('app_id', '=', app_id),
('user_id', '=', request.env.user.id)
])
exist.unlink() if exist else None
total_recent = recent_app.search(
[('user_id', '=', request.env.user.id)])
if len(total_recent) > 4:
total_recent[0].unlink()
recent_app.create({
'app_id': app_id,
'user_id': request.env.user.id
})
@http.route(['/theme_studio/get_recent_apps'], type="json")
def get_recent_apps(self):
"""
Retrieve the list of recent applications for the current user.
Returns:
list: A list of dictionaries containing the recent applications'
information,
or an empty list if no recent apps are found.
This function retrieves the list of recent applications for the current
user from the database. It returns a list of dictionaries containing the
information of each recent application, such as its ID, name, and other
relevant details.
Example:
To retrieve the list of recent applications for the current user:
```python
from my_theme_module import get_recent_apps
recent_apps = get_recent_apps()
print(recent_apps)
```
"""
recent_app = request.env['recent.apps'].sudo()
return recent_app.search_read([
('user_id', '=', request.env.user.id)
])
@http.route(['/theme_studio/add_menu_bookmarks'], type="json")
def add_menu_bookmarks(self, args):
"""
Add a menu bookmark for the current user.
Parameters:
args (dict): A dictionary containing the menu data including
'actionId' and 'menuUrl'.
Returns:
bool: True if the menu bookmark is successfully added, otherwise
False.
This function adds a menu bookmark for the current user based on the
provided
menu data. It extracts the action ID and URL from the menu data and
creates a
new menu bookmark record in the database.
Example:
To add a menu bookmark with action ID 123 and URL '/dashboard' for
the current user:
```python
from my_theme_module import add_menu_bookmarks
menu_data = {
'actionId': 123,
'menuUrl': '/dashboard'
}
add_menu_bookmarks({'menu': menu_data})
```
"""
menu_data = args.get('menu', {})
action_id = menu_data.get('actionId')
user_id = request.env.user.id
url = menu_data.get('menuUrl')
menu_bookmark = request.env['infinito.menu.bookmark'].sudo()
menu_bookmark.create({
'action_id': int((action_id)),
'user_id': user_id,
'url': url,
})
@http.route(['/theme_studio/remove_menu_bookmarks'], type="json")
def remove_menu_bookmarks(self, args):
"""
Remove a menu bookmark for the current user.
Parameters:
args (dict): A dictionary containing the menu data including
'actionId'.
Returns:
bool: True if the menu bookmark is successfully removed,
otherwise False.
This function removes a menu bookmark for the current user based on
the provided
action ID. It searches for the menu bookmark record in the database and
deletes
it if found.
Example:
To remove a menu bookmark with action ID 123 for the current user:
```python
from my_theme_module import remove_menu_bookmarks
menu_data = {
'actionId': 123
}
remove_menu_bookmarks({'menu': menu_data})
```
"""
menu_data = args.get('menu', {})
action_id = menu_data.get('actionId')
user_id = request.env.user.id
menu_bookmark = request.env['infinito.menu.bookmark'].sudo().search([
('action_id', '=', int(action_id)),
('user_id', '=', user_id)
])
if menu_bookmark:
menu_bookmark.unlink()
@http.route(['/theme_studio/get_presets'], type="json")
def get_presets(self):
"""
Retrieve the list of available presets.
Returns:
list: A list of dictionaries containing the available presets.
This function reads the presets data from a JSON file and returns
it as a list of dictionaries.
Each dictionary in the list represents a preset with
its configuration details.
Example:
To retrieve the list of available presets:
```python
from my_theme_module import get_presets
presets = get_presets()
print(presets)
```
"""
working_dir = os.path.dirname(os.path.realpath(__file__))
working_dir = working_dir.replace('/controllers', '')
file_path = working_dir + '/static/src/json/presets.json'
file = open(file_path, 'r')
presets = json.load(file)
return presets

6
backend_theme_infinito/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <backend_theme_infinito>
#### 03.10.2024
#### Version 17.0.1.0.0
#### ADD
Initial Commit for Infinito Backend Theme

158
backend_theme_infinito/icon_hooks.py

@ -0,0 +1,158 @@
"""Hooks for Changing Menu Web_icon"""
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
import base64
from odoo import api, SUPERUSER_ID
from odoo.modules import get_module_resource
def icons_post_init_hook(cr):
"""post init hook for changing module icons"""
# env = api.Environment(cr, SUPERUSER_ID, {})
menu_item = cr['ir.ui.menu'].search([('parent_id', '=', False)])
for menu in menu_item:
if menu.name == 'Contacts':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'contact.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Link Tracker':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'link-tracker.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Dashboards':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'dashboard.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Sales':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'sales.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Invoicing':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'invoice.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Inventory':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'inventory.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Purchase':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'purchase.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Calendar':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'calendar.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'CRM':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'crm.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Notes':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'notes.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Website':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'website.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Point of Sale':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'pos.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Manufacturing':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'manufacturing.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Repairs':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'repairs.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Email Marketing':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'marketing.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'SMS Marketing':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'sms-marketing.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Project':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'project.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Surveys':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'surveys.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Employees':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'employees.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Recruitment':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'recruitment.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Attendances':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'attendance.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Time Off':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'time-off.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Expenses':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'expense.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Maintenance':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'maintenance.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Live Chat':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'live-chat.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Lunch':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'lunch.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Fleet':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'fleet.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Timesheets':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'timesheets.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Events':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'events.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'eLearning':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'elearning.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})
if menu.name == 'Members':
img_path = get_module_resource(
'backend_theme_infinito', 'static', 'src', 'img', 'icons', 'members.png')
menu.write({'web_icon_data': base64.b64encode(open(img_path, "rb").read())})

26
backend_theme_infinito/models/__init__.py

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from . import ir_http
from . import menu_bookmark
from . import recent_apps
from . import res_config_settings
from . import res_users

120
backend_theme_infinito/models/ir_http.py

@ -0,0 +1,120 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import models
def float_to_time(time):
"""
Convert a floating-point number representing time in hours to a string
formatted as 'HH:MM'.
Parameters:
- time (float): The time in hours to be converted.
Returns:
- str: A string representing the time in the format 'HH:MM'.
"""
return '{0:02.0f}:{1:02.0f}'.format(*divmod(float(time) * 60, 60))
class IrHttp(models.AbstractModel):
"""
Extends the 'ir.http' model to customize session information for the
web client.
"""
_inherit = 'ir.http'
def session_info(self):
"""
Overrides the default session_info method to customize session
information based on user preferences.
Returns:
- dict: A dictionary containing session information customized for
the current user.
"""
res = super(IrHttp, self).session_info()
get_param = self.env['ir.config_parameter'].sudo().get_param
if self.env.user.has_group('base.group_user'):
user_edit = get_param(
'backend_theme_infinito.is_user_edit', default=False)
res['userEdit'] = user_edit
if user_edit:
res['sidebar'] = self.env.user.is_sidebar_enabled
res['fullscreen'] = self.env.user.is_fullscreen_enabled
res['sidebarIcon'] = self.env.user.is_sidebar_icon
res['sidebarName'] = self.env.user.is_sidebar_name
res['sidebarCompany'] = self.env.user.is_sidebar_company
res['sidebarUser'] = self.env.user.is_sidebar_user
res['recentApps'] = self.env.user.is_recent_apps
res['fullScreenApp'] = self.env.user.is_fullscreen_app
res['infinitoRtl'] = self.env.user.is_rtl
res['infinitoDark'] = self.env.user.is_dark
res['infinitoDarkMode'] = self.env.user.dark_mode
res['infinitoDarkStart'] = float_to_time(
self.env.user.dark_start)
res['infinitoDarkEnd'] = float_to_time(self.env.user.dark_end)
res['infinitoBookmark'] = self.env.user.is_menu_bookmark
res['loaderClass'] = self.env.user.loader_class
else:
res['sidebar'] = get_param(
'backend_theme_infinito.is_sidebar_enabled', default=False)
res['fullscreen'] = get_param(
'backend_theme_infinito.is_fullscreen_enabled',
default=False)
res['sidebarIcon'] = get_param(
'backend_theme_infinito.is_sidebar_icon', default=False)
res['sidebarName'] = get_param(
'backend_theme_infinito.is_sidebar_name', default=False)
res['sidebarCompany'] = get_param(
'backend_theme_infinito.is_sidebar_company', default=False)
res['sidebarUser'] = get_param(
'backend_theme_infinito.is_sidebar_user', default=False)
res['recentApps'] = get_param(
'backend_theme_infinito.is_recent_apps', default=False)
res['fullScreenApp'] = get_param(
'backend_theme_infinito.is_fullscreen_app', default=False)
res['infinitoRtl'] = get_param(
'backend_theme_infinito.is_rtl', default=False)
res['infinitoDark'] = get_param(
'backend_theme_infinito.is_dark', default=False)
res['infinitoDarkMode'] = get_param(
'backend_theme_infinito.dark_mode', default=False)
res['infinitoDarkStart'] = float_to_time(get_param(
'backend_theme_infinito.dark_start', default=19.0))
res['infinitoDarkEnd'] = float_to_time(get_param(
'backend_theme_infinito.dark_end', default=5.0))
res['infinitoBookmark'] = get_param(
'backend_theme_infinito.is_menu_bookmark', default=False)
res['loaderClass'] = get_param(
'backend_theme_infinito.loader_class', default=False)
menu_bookmark = self.env['infinito.menu.bookmark'].sudo(). \
search([('user_id', '=', self.env.user.id)])
list_bookmark = []
for bookmark in menu_bookmark:
bkm = bookmark.read(['action_id', 'url', 'name'])[0]
bkm['short_name'] = bkm['name'][:2].upper()
list_bookmark.append(bkm)
res['infinitoBookmarks'] = menu_bookmark.action_id.ids
res['infinitoMenuBookmarks'] = list_bookmark
return res

35
backend_theme_infinito/models/menu_bookmark.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class InfinitoMenuBookmark(models.Model):
"""
Model representing bookmarks for menu items in the Infinito system.
"""
_name = 'infinito.menu.bookmark'
_description = 'Menu Bookmark'
name = fields.Char(related='action_id.name')
action_id = fields.Many2one('ir.actions.act_window')
url = fields.Text('Url')
user_id = fields.Many2one('res.users')

81
backend_theme_infinito/models/recent_apps.py

@ -0,0 +1,81 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import api,fields, models
class RecentApps(models.Model):
"""
Model representing recent applications accessed by users in the system.
"""
_name = 'recent.apps'
_description = 'Recent Apps'
name = fields.Char(compute='_compute_icon', store=True)
app_id = fields.Integer()
icon = fields.Binary(compute='_compute_icon', store=True)
type = fields.Char(compute='_compute_type', store=True)
user_id = fields.Many2one('res.users')
@api.depends('app_id')
def _compute_type(self):
"""
Compute method to determine the type of the recent app based on its
associated menu.
This method computes the type of the recent app by retrieving its
associated menu,
extracting the type information from the menu's web icon, and
updating the 'type'
field accordingly.
"""
menu_ui = self.env['ir.ui.menu']
for rec in self:
app = menu_ui.browse(rec.app_id)
la = str(app.web_icon)
spl_word = '.'
res = la.split(spl_word, 1)
if len(res) > 1:
splitString = res[1]
rec.type = splitString
else:
# Handle the case where splitting doesn't result in two parts
# You might want to set a default value or raise an error, depending on your requirements
# For now, I'll set rec.type to an empty string
rec.type = ""
@api.depends('app_id')
def _compute_icon(self):
"""
Compute method to determine the icon for the recent app based on its associated menu.
This method computes the icon for the recent app by retrieving its associated menu,
extracting the icon information from the menu's web icon, and updating the 'icon'
field accordingly. It also updates the 'name' field with the name of the associated menu.
"""
menu_ui = self.env['ir.ui.menu']
for rec in self:
app = menu_ui.browse(rec.app_id)
rec.icon = app._compute_web_icon_data(app.web_icon)
rec.name = app.name

151
backend_theme_infinito/models/res_config_settings.py

@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import api, fields, models
class ResConfigSettings(models.TransientModel):
"""
Model representing configuration settings for the system.
This model allows the administrator to configure various settings
related to the user interface and system behavior.
"""
_inherit = 'res.config.settings'
is_user_edit = fields.Boolean('User edit', default=False)
is_sidebar_enabled = fields.Boolean('Sidebar Enabled', default=False)
is_fullscreen_enabled = fields.Boolean('Full screen Enabled', default=False)
is_sidebar_icon = fields.Boolean('Sidebar icon Enabled', default=True)
is_sidebar_name = fields.Boolean('Sidebar name Enabled', default=True)
is_sidebar_company = fields.Boolean('Sidebar Company Enabled',
default=False)
is_sidebar_user = fields.Boolean('Sidebar User Enabled', default=False)
is_recent_apps = fields.Boolean('Recent Apps Enabled', default=False)
is_fullscreen_app = fields.Boolean('Full screen Apps Enabled',
default=False)
is_rtl = fields.Boolean('Rtl Enabled', default=False)
is_dark = fields.Boolean('Dark mode Enabled', default=False)
is_menu_bookmark = fields.Boolean('Menu Bookmark mode Enabled',
default=False)
is_chameleon = fields.Boolean('Chameleon mode Enabled', default=False)
dark_mode = fields.Selection([
('all', 'All'),
('schedule', 'Schedule'),
('auto', 'Automatic'),
], default='all')
dark_start = fields.Float('Dark Start', default=19.0)
dark_end = fields.Float('Dark End', default=5.0)
loader_class = fields.Char('Loader', default='default')
@api.model
def get_values(self):
"""
Retrieve the current configuration values for the system.
This method retrieves the current configuration values for the system,
including settings related to the user interface and system behavior.
Returns:
- dict: A dictionary containing the current configuration values.
"""
res = super(ResConfigSettings, self).get_values()
get_param = self.env['ir.config_parameter'].sudo().get_param
res['is_user_edit'] = get_param('backend_theme_infinito.is_user_edit',
default=False)
res['is_sidebar_enabled'] = get_param(
'backend_theme_infinito.is_sidebar_enabled', default=False)
res['is_fullscreen_enabled'] = get_param(
'backend_theme_infinito.is_fullscreen_enabled', default=False)
res['is_sidebar_icon'] = get_param(
'backend_theme_infinito.is_sidebar_icon', default=False)
res['is_sidebar_name'] = get_param(
'backend_theme_infinito.is_sidebar_name', default=False)
res['is_sidebar_company'] = get_param(
'backend_theme_infinito.is_sidebar_company', default=False)
res['is_sidebar_user'] = get_param(
'backend_theme_infinito.is_sidebar_user', default=False)
res['is_recent_apps'] = get_param(
'backend_theme_infinito.is_recent_apps', default=False)
res['is_rtl'] = get_param('backend_theme_infinito.is_rtl',
default=False)
res['is_dark'] = get_param('backend_theme_infinito.is_dark',
default=False)
res['is_menu_bookmark'] = get_param(
'backend_theme_infinito.is_menu_bookmark', default=False)
res['dark_mode'] = get_param('backend_theme_infinito.dark_mode',
default='all')
res['dark_start'] = get_param('backend_theme_infinito.dark_start',
default=19.0)
res['dark_end'] = get_param('backend_theme_infinito.dark_end',
default=5.0)
res['loader_class'] = get_param('backend_theme_infinito.loader_class',
default=5.0)
res['is_chameleon'] = get_param('backend_theme_infinito.is_chameleon',
default=False)
return res
@api.model
def set_values(self):
"""
Update the configuration values for the system.
This method updates the configuration values for the system based on the current
settings provided by the administrator.
"""
set_param = self.env['ir.config_parameter'].sudo().set_param
set_param('backend_theme_infinito.is_user_edit',
self.is_user_edit)
set_param('backend_theme_infinito.is_sidebar_enabled',
self.is_sidebar_enabled)
set_param('backend_theme_infinito.is_fullscreen_enabled',
self.is_fullscreen_enabled)
set_param('backend_theme_infinito.is_sidebar_icon',
self.is_sidebar_icon)
set_param('backend_theme_infinito.is_sidebar_name',
self.is_sidebar_name)
set_param('backend_theme_infinito.is_sidebar_company',
self.is_sidebar_company)
set_param('backend_theme_infinito.is_sidebar_user',
self.is_sidebar_user)
set_param('backend_theme_infinito.is_recent_apps',
self.is_recent_apps)
set_param('backend_theme_infinito.is_rtl',
self.is_rtl)
set_param('backend_theme_infinito.is_dark',
self.is_dark)
set_param('backend_theme_infinito.dark_mode',
self.dark_mode)
set_param('backend_theme_infinito.dark_start',
self.dark_start)
set_param('backend_theme_infinito.dark_end',
self.dark_end)
set_param('backend_theme_infinito.is_menu_bookmark',
self.is_menu_bookmark)
set_param('backend_theme_infinito.loader_class',
self.loader_class)
set_param('backend_theme_infinito.is_chameleon',
self.is_chameleon)
super(ResConfigSettings, self).set_values()

56
backend_theme_infinito/models/res_users.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models
class ResUser(models.Model):
"""
Model representing system users with additional customization options.
This model extends the base 'res.users' model to include additional fields
for customizing user interface preferences and system behavior.
"""
_inherit = 'res.users'
is_sidebar_enabled = fields.Boolean('Sidebar Enabled', default=False)
is_fullscreen_enabled = fields.Boolean('Full screen Enabled', default=False)
is_sidebar_icon = fields.Boolean('Sidebar icon Enabled', default=True)
is_sidebar_name = fields.Boolean('Sidebar name Enabled', default=True)
is_sidebar_company = fields.Boolean('Sidebar Company Enabled',
default=False)
is_sidebar_user = fields.Boolean('Sidebar User Enabled', default=False)
is_recent_apps = fields.Boolean('Recent Apps Enabled', default=False)
is_fullscreen_app = fields.Boolean('Full screen Apps Enabled',
default=False)
is_rtl = fields.Boolean('Rtl Enabled', default=False)
is_dark = fields.Boolean('Dark mode Enabled', default=False)
is_menu_bookmark = fields.Boolean('Menu Bookmark mode Enabled',
default=False)
is_chameleon = fields.Boolean('Chameleon mode Enabled', default=False)
dark_mode = fields.Selection([
('all', 'All'),
('schedule', 'Schedule'),
('auto', 'Automatic'),
], default='all')
dark_start = fields.Float('Dark Start', default=19.0)
dark_end = fields.Float('Dark End', default=5.0)
loader_class = fields.Char('Loader', default='default')

BIN
backend_theme_infinito/static/description/assets/hero.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

BIN
backend_theme_infinito/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
backend_theme_infinito/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
backend_theme_infinito/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
backend_theme_infinito/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
backend_theme_infinito/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
backend_theme_infinito/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
backend_theme_infinito/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
backend_theme_infinito/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
backend_theme_infinito/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
backend_theme_infinito/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
backend_theme_infinito/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
backend_theme_infinito/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
backend_theme_infinito/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
backend_theme_infinito/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
backend_theme_infinito/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
backend_theme_infinito/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
backend_theme_infinito/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
backend_theme_infinito/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
backend_theme_infinito/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/bookmark.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/calendar.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/discuss.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/adv_button.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/adv_list.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/animation.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/app_bar.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/bookmark.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/dark_mode.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/hover_nav.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/preloader.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/recent_apps.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/rtl.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/gif/side_bar.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/infinito_adv.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/infinito_landing.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/infinito_styles.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/kanban-1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/kanban-grp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/kanban-img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/kanban.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/kanban.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/kanban_grp.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/list.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/list_group.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/resp-app_bar.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

BIN
backend_theme_infinito/static/description/assets/screenshots/resp-sidebar.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1012 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/sidebar-list.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/sidebar-small.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/sidebar.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

BIN
backend_theme_infinito/static/description/assets/screenshots/user_edit.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
backend_theme_infinito/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
backend_theme_infinito/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

1106
backend_theme_infinito/static/description/index.html

File diff suppressed because it is too large

BIN
backend_theme_infinito/static/description/theme_screenshot.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

2
backend_theme_infinito/static/src/css/dynamic_styles.css

@ -0,0 +1,2 @@
/* This Styles are generated automatically by Theme Studio */
. {background-color: rgb(250, 0, 0) !important;}

34
backend_theme_infinito/static/src/css/layout.css

@ -0,0 +1,34 @@
.o_web_client {
background-color: var(--bg_white);
}
.o_web_client > header {
margin: 10px 10px 0px 10px;
border-radius: 10px;
box-shadow: 1px 1px 15px 0;
}
.o_main_navbar {
border-radius: 10px;
}
.o_web_client > .o_action_manager, #sidebar_panel, .oe_kanban_card {
margin: 15px;
border-radius: 10px;
box-shadow: 1px 1px 15px 0;
padding: 15px;
background-color: var(--bg_white);
}
#sidebar_panel {
margin-left: 0px;
background-color: var(--nav_bar_color);
}
.o_main_navbar .o_navbar_apps_menu.show .o-dropdown--menu dropdown-menu {
border-radius: 10px 0 10px 10px;
}
.oe_kanban_card {
box-shadow: none;
}

128
backend_theme_infinito/static/src/css/loaders.css

@ -0,0 +1,128 @@
/* Rotation */
.rotating::before{
content: " ";
position: absolute;
top: calc(50% - 25px);
left: calc(50% - 25px);
height: 50px;
width: 50px;
background-image: linear-gradient(to bottom,black 50%, white 50%);
border-radius: 50%;
animation: rotate 1s;
animation-iteration-count: infinite;
}
.rotating::after{
content: " ";
position: absolute;
top: calc(50% - 20px);
left: calc(50% - 20px);
height: 40px;
width: 40px;
background-color: #020202;
border-radius: 50%;
}
/* Blinking */
.blinking::after{
content: " ";
position: absolute;
top: calc(50% - 25px);
left: calc(50% - 25px);
height: 50px;
width: 50px;
border-radius: 50%;
background-color:#fff;
animation: blink 2000ms ease infinite;
}
.blinking-2::after{
background-color: transparent;
border: 2px solid white;
transform: scale(0);
animation: blink-2 2000ms ease-out infinite,blink-2a 2s ease-out infinite;
animation-fill-mode: forwards;
}
.bounce::after{
content: " ";
position: absolute;
top: calc(50% - 50px);
left: calc(50% - 25px);
height: 50px;
width: 50px;
box-sizing: border-box;
background-image: linear-gradient(to bottom,rgb(255, 255, 255) 60%, rgb(235, 235, 235) 80%, rgb(210, 210, 210));
border-radius: 50%;
animation: bounce 2s;
animation-iteration-count: infinite;
}
.ring:after {
content: " ";
display: block;
width: 64px;
height: 64px;
margin: 8px;
border-radius: 50%;
border: 6px solid #fff;
border-color: #fff transparent #fff transparent;
animation: ring 1.2s linear infinite;
}
/* Key frames */
@keyframes rotate{
from{
transform: rotate(0deg);
}
to{
transform: rotate(360deg);
}
}
@keyframes blink{
0%{
transform: scale(1);
}
50%{
transform: scale(1.5);
}
100%{
transform: scale(1);
}
}
@keyframes blink-2{
0%{
transform: scale(0.2);
}
100%{
transform: scale(1.5);
}
}
@keyframes bounce{
0%,100%{
transform: translateY(0);
height: 50px;
width: 50px;
}
50%{
transform: translateY(50px);
height: 45px;
width: 55px;
}
}
@keyframes ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

1700
backend_theme_infinito/static/src/css/style.css

File diff suppressed because it is too large

1201
backend_theme_infinito/static/src/css/style2.css

File diff suppressed because it is too large

1
backend_theme_infinito/static/src/img/alignment/align-objects.svg

@ -0,0 +1 @@
<svg id="Capa_1" enable-background="new 0 0 512 512" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><path d="m268.161 235.27h-190.036v-190.035h190.036z"/><path d="m512 466.765h-433.875v-190.036h433.875z"/><path d="m0 0h30v512h-30z"/></svg>

After

Width:  |  Height:  |  Size: 274 B

6
backend_theme_infinito/static/src/img/alignment/align-right.svg

@ -0,0 +1,6 @@
<svg id="Layer_1" height="512" viewBox="0 0 24 24" width="512"
xmlns="http://www.w3.org/2000/svg" data-name="Layer 1">
<path d="m20 1h2v22h-2z" fill="#fff"/>
<path d="m2 12h17v8h-17z" fill="#fff"/>
<path d="m5 4h14v7h-14z" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 260 B

49
backend_theme_infinito/static/src/img/alignment/center-align.svg

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 334.367 334.367" style="enable-background:new 0 0 334.367 334.367;" xml:space="preserve">
<g>
<g>
<g>
<path d="M10.449,52.245h313.469c5.771,0,10.449-4.678,10.449-10.449s-4.678-10.449-10.449-10.449H10.449
C4.678,31.347,0,36.025,0,41.796S4.678,52.245,10.449,52.245z"/>
<path d="M57.469,114.939c-5.771,0-10.449,4.678-10.449,10.449c0,5.771,4.678,10.449,10.449,10.449h219.429
c5.771,0,10.449-4.678,10.449-10.449c0-5.771-4.678-10.449-10.449-10.449H57.469z"/>
<path d="M323.918,198.531H10.449C4.678,198.531,0,203.209,0,208.98s4.678,10.449,10.449,10.449h313.469
c5.771,0,10.449-4.678,10.449-10.449S329.689,198.531,323.918,198.531z"/>
<path d="M237.714,282.122H96.653c-5.771,0-10.449,4.678-10.449,10.449s4.678,10.449,10.449,10.449h141.061
c5.771,0,10.449-4.678,10.449-10.449S243.485,282.122,237.714,282.122z"/>
</g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

55
backend_theme_infinito/static/src/img/alignment/justification (1).svg

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 333 333" style="enable-background:new 0 0 333 333;" xml:space="preserve">
<g>
<g>
<path d="M323,31.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,31.5,323,31.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,114.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,114.5,323,114.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,198.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,198.5,323,198.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,281.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,281.5,323,281.5z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

55
backend_theme_infinito/static/src/img/alignment/left-align.svg

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 333 333" style="enable-background:new 0 0 333 333;" xml:space="preserve">
<g>
<g>
<path d="M323,31.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,31.5,323,31.5z"/>
</g>
</g>
<g>
<g>
<path d="M230,114.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h220c5.5,0,10-4.5,10-10S235.5,114.5,230,114.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,198.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,198.5,323,198.5z"/>
</g>
</g>
<g>
<g>
<path d="M151,281.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h141c5.5,0,10-4.5,10-10S156.5,281.5,151,281.5z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

55
backend_theme_infinito/static/src/img/alignment/right-align.svg

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 333 333" style="enable-background:new 0 0 333 333;" xml:space="preserve">
<g>
<g>
<path d="M323,31.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,31.5,323,31.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,114.5H104c-5.5,0-10,4.5-10,10s4.5,10,10,10h219c5.5,0,10-4.5,10-10S328.5,114.5,323,114.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,198.5H10c-5.5,0-10,4.5-10,10s4.5,10,10,10h313c5.5,0,10-4.5,10-10S328.5,198.5,323,198.5z"/>
</g>
</g>
<g>
<g>
<path d="M323,281.5H182c-5.5,0-10,4.5-10,10s4.5,10,10,10h141c5.5,0,10-4.5,10-10S328.5,281.5,323,281.5z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

8
backend_theme_infinito/static/src/img/alignment/top-alignment.svg

@ -0,0 +1,8 @@
<svg id="Capa_1" enable-background="new 0 0 512 512" height="512"
viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg">
<g>
<path d="m0 451h512v30h-512z" fill="#fff"/>
<path d="m271 151h150v270h-150z" fill="#fff"/>
<path d="m91 31h150v390h-150z" fill="#fff"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 324 B

2
backend_theme_infinito/static/src/img/brand_icon/infinity.svg

@ -0,0 +1,2 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs" version="1.1" width="512" height="512" x="0" y="0" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><g xmlns="http://www.w3.org/2000/svg"><path d="m392 135.995c-33.74 0-64.22 13.92-86.02 36.33l-29.06 29.87 31.42 32.29 29.92-30.76c13.63-14.01 32.69-22.73 53.74-22.73 41.35 0 75 33.65 75 75.01 0 41.35-33.65 75-75 75-21.05 0-40.11-8.72-53.74-22.74-117.536-120.824-132.066-135.761-132.24-135.94-21.8-22.41-52.28-36.33-86.02-36.33-66.27 0-120 53.73-120 120.01 0 66.27 53.73 120 120 120 33.74 0 64.22-13.92 86.02-36.33l29.06-29.87-31.42-32.29-29.92 30.75c-13.63 14.02-32.69 22.74-53.74 22.74-41.35 0-75-33.65-75-75 0-41.36 33.65-75.01 75-75.01 21.05 0 40.11 8.72 53.74 22.73 5.151 5.296 131.004 134.68 132.24 135.95 21.8 22.41 52.28 36.33 86.02 36.33 66.27 0 120-53.73 120-120 0-66.28-53.73-120.01-120-120.01z" fill="#ffffff" data-original="#000000" class=""/></g></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

86
backend_theme_infinito/static/src/img/brightness.svg

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<g>
<g>
<path d="M256,0c-8.284,0-15,6.716-15,15v32c0,8.284,6.716,15,15,15s15-6.716,15-15V15C271,6.716,264.284,0,256,0z"/>
</g>
</g>
<g>
<g>
<path d="M256,450c-8.284,0-15,6.716-15,15v32c0,8.284,6.716,15,15,15s15-6.716,15-15v-32C271,456.716,264.284,450,256,450z"/>
</g>
</g>
<g>
<g>
<path d="M119.529,98.315L96.901,75.687c-5.858-5.857-15.356-5.857-21.213,0c-5.858,5.858-5.858,15.356,0,21.213l22.628,22.628
c2.928,2.929,6.767,4.394,10.606,4.394s7.678-1.465,10.607-4.394C125.387,113.67,125.387,104.172,119.529,98.315z"/>
</g>
</g>
<g>
<g>
<path d="M436.313,415.099l-22.628-22.628c-5.858-5.857-15.356-5.857-21.213,0c-5.858,5.858-5.858,15.356,0,21.213l22.628,22.628
c2.928,2.929,6.767,4.394,10.606,4.394c3.839,0,7.678-1.465,10.607-4.394C442.171,430.454,442.171,420.956,436.313,415.099z"/>
</g>
</g>
<g>
<g>
<path d="M47,241H15c-8.284,0-15,6.716-15,15s6.716,15,15,15h32c8.284,0,15-6.716,15-15S55.284,241,47,241z"/>
</g>
</g>
<g>
<g>
<path d="M497,241h-32c-8.284,0-15,6.716-15,15s6.716,15,15,15h32c8.284,0,15-6.716,15-15S505.284,241,497,241z"/>
</g>
</g>
<g>
<g>
<path d="M119.529,392.471c-5.858-5.857-15.356-5.857-21.213,0l-22.628,22.628c-5.858,5.858-5.858,15.356,0,21.213
c2.928,2.929,6.767,4.394,10.606,4.394s7.678-1.465,10.606-4.393l22.629-22.629C125.387,407.826,125.387,398.328,119.529,392.471z
"/>
</g>
</g>
<g>
<g>
<path d="M436.313,75.688c-5.858-5.857-15.356-5.857-21.213,0l-22.628,22.627c-5.858,5.858-5.858,15.356,0,21.213
c2.928,2.929,6.767,4.394,10.606,4.394s7.678-1.465,10.607-4.393l22.628-22.628C442.171,91.043,442.171,81.545,436.313,75.688z"/>
</g>
</g>
<g>
<g>
<path d="M256,97c-87.673,0-159,71.327-159,159s71.327,159,159,159s159-71.327,159-159S343.673,97,256,97z M271,384.123V127.877
c64.089,7.456,114,62.066,114,128.123S335.089,376.667,271,384.123z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
backend_theme_infinito/static/src/img/center-align.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

0
backend_theme_infinito/static/src/img/centered-text-of-alignment-button.png

BIN
backend_theme_infinito/static/src/img/close.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

BIN
backend_theme_infinito/static/src/img/color_picker/color-picker.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

1
backend_theme_infinito/static/src/img/downward-arrow.svg

@ -0,0 +1 @@
<svg enable-background="new 0 0 64 64" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g id="Arrow-13"><path d="m54.9210777 20.296875c-.15625-.3701172-.5185547-.6108398-.9208984-.6108398l-44 .0004883c-.4018555 0-.7646484.2407227-.9213867.6108398-.15625.3701172-.0756836.7983398.2045898 1.0864258l22 22.6274414c.1879883.1933594.4467773.3027344.7167969.3027344s.5288086-.109375.7167969-.3027344l22-22.6279297c.2802734-.2885742.3603515-.7163086.2041015-1.0864258z"/></g></svg>

After

Width:  |  Height:  |  Size: 506 B

1
backend_theme_infinito/static/src/img/eyedropper.svg

@ -0,0 +1 @@
<svg id="Capa_1" enable-background="new 0 0 511.978 511.978" height="512" viewBox="0 0 511.978 511.978" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m489.571 22.436c-14.467-14.468-33.703-22.436-54.164-22.436s-39.697 7.968-54.165 22.436l-91.597 91.597c-7.943-6.584-17.836-10.17-28.282-10.17-11.863 0-23.016 4.62-31.403 13.008-8.388 8.388-13.008 19.54-13.008 31.403 0 10.447 3.587 20.34 10.17 28.282l-165.836 165.836c-17.585 17.586-25.402 42.454-21.412 66.649l-26.799 26.798c-8.427 8.427-13.067 19.63-13.067 31.547s4.641 23.121 13.067 31.547c8.697 8.697 20.122 13.045 31.547 13.045s22.85-4.349 31.547-13.046l26.799-26.798c24.191 3.991 49.062-3.827 66.648-21.413l165.836-165.836c7.942 6.584 17.835 10.17 28.283 10.17 11.862 0 23.015-4.619 31.402-13.007 16.31-16.311 17.251-42.252 2.835-59.681l91.601-91.601c29.865-29.867 29.864-78.464-.002-108.33zm-197.178 263.083h-131.808l87.608-87.608 65.904 65.904zm-143.99 143.989c-12.026 12.028-29.659 16.545-46.021 11.785-5.253-1.525-10.925-.074-14.796 3.797l-32.631 32.63c-5.697 5.698-14.971 5.698-20.668 0-5.669-5.439-5.669-15.227 0-20.667l32.631-32.63c3.87-3.87 5.325-9.54 3.797-14.795-4.759-16.36-.243-33.994 11.783-46.022l48.086-48.086h131.808zm225.52-168.673c-5.619 5.619-14.761 5.618-20.38 0-.005 0-102.371-102.371-102.371-102.371-5.618-5.619-5.618-14.761 0-20.38 5.364-5.59 15.017-5.59 20.381 0 0 0 102.37 102.37 102.37 102.371 5.619 5.618 5.619 14.761 0 20.38zm94.436-151.282-91.456 91.456-65.903-65.905 91.455-91.455c18.17-18.169 47.734-18.169 65.904 0 18.169 18.17 18.169 47.734 0 65.904z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

1
backend_theme_infinito/static/src/img/gear.svg

@ -0,0 +1 @@
<svg id="Capa_1" enable-background="new 0 0 512 512" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m256 341c46.869 0 85-38.131 85-85s-38.131-85-85-85-85 38.131-85 85 38.131 85 85 85zm0-140c30.327 0 55 24.673 55 55s-24.673 55-55 55-55-24.673-55-55 24.673-55 55-55z"/><path d="m115.995 299.644c2.632 8.452 6.027 16.639 10.152 24.483l-12.676 20.477c-3.664 5.919-2.775 13.58 2.147 18.502l33.275 33.275c4.922 4.923 12.584 5.812 18.501 2.147l20.477-12.676c7.845 4.125 16.032 7.521 24.483 10.152l5.514 23.431c1.594 6.775 7.64 11.564 14.601 11.564h47.059c6.961 0 13.007-4.789 14.601-11.564l5.514-23.431c8.451-2.632 16.638-6.027 24.483-10.152l20.477 12.676c5.917 3.663 13.58 2.772 18.501-2.147l33.275-33.275c4.922-4.922 5.812-12.583 2.147-18.502l-12.676-20.477c4.125-7.845 7.52-16.032 10.152-24.483l23.431-5.513c6.776-1.595 11.564-7.641 11.564-14.602v-47.059c0-6.961-4.789-13.007-11.564-14.602l-23.431-5.513c-2.632-8.452-6.027-16.639-10.152-24.483l12.676-20.477c3.664-5.919 2.775-13.58-2.147-18.502l-33.275-33.275c-4.922-4.923-12.584-5.812-18.501-2.147l-20.477 12.676c-7.845-4.125-16.032-7.521-24.483-10.152l-5.514-23.431c-1.593-6.775-7.639-11.564-14.6-11.564h-47.059c-6.961 0-13.007 4.789-14.601 11.564l-5.514 23.431c-8.451 2.632-16.638 6.027-24.483 10.152l-20.477-12.676c-5.918-3.665-13.581-2.774-18.501 2.147l-33.275 33.275c-4.922 4.922-5.812 12.583-2.147 18.502l12.676 20.477c-4.125 7.845-7.52 16.031-10.152 24.483l-23.431 5.513c-6.776 1.596-11.565 7.642-11.565 14.603v47.059c0 6.961 4.789 13.007 11.564 14.602zm-4.995-55.293 20.51-4.825c5.504-1.295 9.812-5.575 11.143-11.07 2.83-11.682 7.449-22.821 13.729-33.107 2.947-4.827 2.928-10.902-.049-15.711l-11.1-17.93 16.474-16.475 17.931 11.1c4.809 2.977 10.883 2.995 15.71.049 10.287-6.279 21.426-10.897 33.107-13.728 5.495-1.331 9.775-5.639 11.07-11.143l4.826-20.511h23.299l4.826 20.511c1.295 5.504 5.575 9.812 11.07 11.143 11.681 2.83 22.82 7.448 33.107 13.728 4.828 2.949 10.902 2.929 15.71-.049l17.931-11.1 16.474 16.475-11.1 17.93c-2.977 4.809-2.996 10.884-.049 15.711 6.279 10.286 10.898 21.426 13.729 33.107 1.331 5.495 5.639 9.775 11.143 11.07l20.51 4.825v23.299l-20.51 4.825c-5.504 1.295-9.812 5.575-11.143 11.07-2.83 11.682-7.449 22.82-13.728 33.107-2.947 4.828-2.928 10.902.049 15.711l11.099 17.93-16.474 16.475-17.931-11.1c-4.81-2.978-10.884-2.996-15.71-.049-10.287 6.279-21.426 10.897-33.107 13.728-5.495 1.331-9.775 5.639-11.07 11.143l-4.827 20.51h-23.299l-4.826-20.511c-1.295-5.504-5.575-9.812-11.07-11.143-11.681-2.83-22.82-7.448-33.107-13.728-4.827-2.948-10.902-2.927-15.71.049l-17.931 11.1-16.474-16.475 11.1-17.93c2.977-4.809 2.996-10.884.049-15.711-6.279-10.286-10.898-21.426-13.729-33.107-1.331-5.495-5.639-9.775-11.143-11.07l-20.509-4.825z"/><path d="m256 30c41.254 0 81.612 11.372 116.619 32.464l-20.254 3.572c-8.158 1.438-13.606 9.218-12.167 17.377 1.439 8.158 9.218 13.606 17.377 12.167l55.942-9.865c8.158-1.438 13.606-9.218 12.167-17.377l-9.864-55.94c-1.439-8.158-9.219-13.606-17.377-12.167h-.001c-8.158 1.439-13.606 9.219-12.167 17.377l3.565 20.215c-40.054-24.568-86.426-37.823-133.84-37.823-68.38 0-132.667 26.629-181.02 74.98-48.352 48.353-74.98 112.64-74.98 181.02 0 8.284 6.716 15 15 15s15-6.716 15-15c0-124.617 101.383-226 226-226z"/><path d="m497 241c-8.284 0-15 6.716-15 15 0 124.617-101.383 226-226 226-41.253 0-81.608-11.372-116.613-32.465l20.247-3.57c8.158-1.438 13.606-9.218 12.167-17.377-1.439-8.158-9.218-13.606-17.377-12.167l-55.942 9.865c-8.158 1.438-13.606 9.218-12.167 17.376l9.864 55.94c1.439 8.158 9.219 13.606 17.377 12.167h.001c8.158-1.439 13.606-9.219 12.167-17.377l-3.568-20.235c40.057 24.574 86.426 37.843 133.844 37.843 68.38 0 132.667-26.629 181.02-74.98 48.352-48.353 74.98-112.64 74.98-181.02 0-8.284-6.716-15-15-15z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
backend_theme_infinito/static/src/img/icons/apps.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
backend_theme_infinito/static/src/img/icons/attendance.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
backend_theme_infinito/static/src/img/icons/calendar.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
backend_theme_infinito/static/src/img/icons/contact.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
backend_theme_infinito/static/src/img/icons/crm.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
backend_theme_infinito/static/src/img/icons/dashboard.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
backend_theme_infinito/static/src/img/icons/discuss.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
backend_theme_infinito/static/src/img/icons/elearning.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
backend_theme_infinito/static/src/img/icons/employees.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
backend_theme_infinito/static/src/img/icons/events.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save