pengyuthon

This commit is contained in:
李鹏宇
2024-11-08 21:16:59 +08:00
parent e0d8de5740
commit 76ad1ca431
192 changed files with 25170 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from . import models
from . import controllers
from . import common_lib
from . import wizard
from odoo.api import Environment, SUPERUSER_ID
def uninstall_hook(env):
# env = Environment(cr, SUPERUSER_ID, {})
for rec in env['ks_dashboard_ninja.board'].search([]):
rec.ks_dashboard_client_action_id.unlink()
rec.ks_dashboard_menu_id.unlink()
+76
View File
@@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
{
'name': 'Dashboard Ninja',
'summary': """
KS Dashboard Ninja
""",
'description': """
Dashboard Ninja v17
""",
'author': 'Ksolves India Ltd.',
'license': 'OPL-1',
'website': 'https://store.ksolves.com/',
'maintainer': 'Ksolves India Ltd.',
'category': 'public_pur',
'version': '17.0.1.8.3',
'support': 'sales@ksolves.com',
'images': ['static/description/Independence_sale.jpg'],
'depends': ['base', 'web', 'base_setup', 'bus', 'base_geolocalize'],
'data': [
'security/ir.model.access.csv',
'security/ks_security_groups.xml',
'data/ks_default_data.xml',
'data/ks_mail_cron.xml',
'data/dn_data.xml',
'data/sequence.xml',
'views/res_settings.xml',
'views/ks_dashboard_ninja_view.xml',
'views/ks_dashboard_ninja_item_view.xml',
'views/ks_dashboard_group_by.xml',
'views/ks_dashboard_csv_group_by.xml',
'views/ks_dashboard_action.xml',
'views/ks_import_dashboard_view.xml',
'wizard/ks_create_dashboard_wiz_view.xml',
'wizard/ks_duplicate_dashboard_wiz_view.xml',
'views/ks_ai_dashboard.xml',
'views/ks_whole_ai_dashboard.xml',
'views/ks_key_fetch.xml'
],
'demo': ['demo/ks_dashboard_ninja_demo.xml'],
'assets': {
'web.assets_backend':[
'ks_dashboard_ninja/static/lib/css/Chart.css',
'ks_dashboard_ninja/static/lib/css/gridstack.min.css',
'ks_dashboard_ninja/static/lib/js/gridstack-h5.js',
'ks_dashboard_ninja/static/lib/js/Chart.bundle.min.js',
'ks_dashboard_ninja/static/src/css/*',
'ks_dashboard_ninja/static/src/scss/*',
'ks_dashboard_ninja/static/src/dashboard/*',
'ks_dashboard_ninja/static/src/items/*',
'ks_dashboard_ninja/static/src/items/**/*',
'ks_dashboard_ninja/static/src/preview/**/*',
'ks_dashboard_ninja/static/src/tools/*',
# 'ks_dashboard_ninja/static/src/**/**/*',
],
},
'external_dependencies': {
'python': ['pandas','xlrd']
},
'uninstall_hook': 'uninstall_hook',
}
@@ -0,0 +1 @@
from . import ks_date_filter_selections
@@ -0,0 +1,342 @@
# -*- coding: utf-8 -*-
from odoo.fields import datetime
from odoo import _
from odoo.exceptions import ValidationError
from datetime import timedelta
import pytz
import os
import os.path
from dateutil import rrule
from dateutil.relativedelta import relativedelta
def ks_get_date(ks_date_filter_selection, self, type):
try:
timezone = self._context.get('tz')
except Exception as e:
timezone = self.env.user.tz
if not timezone:
ks_tzone = os.environ.get('TZ')
if ks_tzone:
timezone = ks_tzone
elif os.path.exists('/etc/timezone'):
ks_tzone = open('/etc/timezone').read()
timezone = ks_tzone[0:-1]
try:
datetime.now(pytz.timezone(timezone))
except Exception as e:
raise ValidationError(_("Please set the local timezone."))
else:
raise ValidationError(_("Please set the local timezone."))
series = ks_date_filter_selection
if ks_date_filter_selection in ['t_fiscal_year', 'n_fiscal_year', 'ls_fiscal_year']:
function_name = globals()["ks_date_series_" + series.split("_")[0]]
return function_name(series.split("_")[1], timezone, type, self)
else:
function_name = globals()["ks_date_series_" + series.split("_")[0]]
return function_name(series.split("_")[1], timezone, type, self)
def ks_date_series_td(ks_date_selection, timezone, type, self=None):
ks_function_name = globals()["ks_get_date_range_from_td_" + ks_date_selection]
return ks_function_name(timezone, type, self)
def ks_get_date_range_from_td_year(timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
year = date.year
start_date = datetime(year, 1, 1)
end_date = date
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_td_month(timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
year = date.year
month = date.month
start_date = datetime(year, month, 1)
end_date = date
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_td_week(timezone, type,self):
ks_date_data = {}
lang = self.env['res.lang']._lang_get(self.env.user.lang)
week_start = lang.week_start
start_Date = rrule.weekday(int(week_start) - 1)
start_date = datetime.today() + relativedelta(weekday=start_Date(-1))
end_date = datetime.now(pytz.timezone(timezone))
start_date = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
if type == 'date':
ks_date_data["selected_start_date"] = start_date
end_date = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = end_date
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_td_quarter(timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
year = date.year
quarter = int((date.month - 1) / 3) + 1
start_date = datetime(year, 3 * quarter - 2, 1)
end_date = date
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
# Last Specific Days Ranges : 7, 30, 90, 365
def ks_date_series_l(ks_date_selection, timezone, type, self=None):
ks_date_data = {}
date_filter_options = {
'day': 0,
'week': 7,
'month': 30,
'quarter': 90,
'year': 365,
'past': False,
'future': False
}
end_time = datetime.strptime(datetime.now(pytz.timezone(timezone)).strftime("%Y-%m-%d 23:59:59"),
'%Y-%m-%d %H:%M:%S')
start_time = datetime.strptime((datetime.now(pytz.timezone(timezone)) - timedelta(
days=date_filter_options[ks_date_selection])).strftime("%Y-%m-%d 00:00:00"), '%Y-%m-%d %H:%M:%S')
if type == 'date':
ks_date_data["selected_end_date"] = datetime.strptime(end_time.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_start_date"] = datetime.strptime(start_time.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_time, timezone)
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_time, timezone)
return ks_date_data
# Current Date Ranges : Week, Month, Quarter, year
def ks_date_series_t(ks_date_selection, timezone, type, self=None):
ks_function_name = globals()["ks_get_date_range_from_" + ks_date_selection]
return ks_function_name("current", timezone, type,self)
# Previous Date Ranges : Week, Month, Quarter, year
def ks_date_series_ls(ks_date_selection, timezone, type,self=None):
ks_function_name = globals()["ks_get_date_range_from_" + ks_date_selection]
return ks_function_name("previous", timezone, type,self)
# Next Date Ranges : Day, Week, Month, Quarter, year
def ks_date_series_n(ks_date_selection, timezone, type,self=None):
ks_function_name = globals()["ks_get_date_range_from_" + ks_date_selection]
return ks_function_name("next", timezone, type, self)
def ks_get_date_range_from_day(date_state, timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
if date_state == "previous":
date = date - timedelta(days=1)
elif date_state == "next":
date = date + timedelta(days=1)
start_date = datetime(date.year, date.month, date.day)
end_date = datetime(date.year, date.month, date.day) + timedelta(days=1, seconds=-1)
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date,timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date,timezone)
return ks_date_data
def ks_get_date_range_from_week(date_state, timezone, type,self):
ks_date_data = {}
# date = datetime.now(pytz.timezone(timezone))
# ks_week = 0
lang = self.env['res.lang']._lang_get(self.env.user.lang)
week_start = lang.week_start
start_Date = rrule.weekday(int(week_start) - 1)
start_date = datetime.today() + relativedelta(weekday=start_Date(-1))
if date_state == "previous":
start_date = datetime.today() - relativedelta(weeks=1, weekday=start_Date(-1))
elif date_state == "next":
start_date = datetime.today() - relativedelta(weeks=-1, weekday=start_Date(-1))
start_date = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
if type == 'date':
ks_date_data["selected_start_date"] = start_date
end_date = start_date + timedelta(days=6, hours=23, minutes=59, seconds=59, milliseconds=59)
ks_date_data["selected_end_date"] = end_date
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
end_date = start_date + timedelta(days=6, hours=23, minutes=59, seconds=59, milliseconds=59)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_month(date_state, timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
year = date.year
month = date.month
if date_state == "previous":
month -= 1
if month == 0:
month = 12
year -= 1
elif date_state == "next":
month += 1
if month == 13:
month = 1
year += 1
end_year = year
end_month = month
if month == 12:
end_year += 1
end_month = 1
else:
end_month += 1
start_date = datetime(year, month, 1)
end_date = datetime(end_year, end_month, 1) - timedelta(seconds=1)
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_quarter(date_state, timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
year = date.year
quarter = int((date.month - 1) / 3) + 1
if date_state == "previous":
quarter -= 1
if quarter == 0:
quarter = 4
year -= 1
elif date_state == "next":
quarter += 1
if quarter == 5:
quarter = 1
year += 1
start_date = datetime(year, 3 * quarter - 2, 1)
month = 3 * quarter
remaining = int(month / 12)
end_date = datetime(year + remaining, month % 12 + 1, 1) - timedelta(seconds=1)
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_year(date_state, timezone, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(timezone))
year = date.year
if date_state == "previous":
year -= 1
elif date_state == "next":
year += 1
start_date = datetime(year, 1, 1)
end_date = datetime(year + 1, 1, 1) - timedelta(seconds=1)
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = datetime.strptime(end_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, timezone)
ks_date_data["selected_end_date"] = ks_convert_into_utc(end_date, timezone)
return ks_date_data
def ks_get_date_range_from_past(date_state, self_tz, type, self):
ks_date_data = {}
date = datetime.now(pytz.timezone(self_tz))
if type == 'date':
ks_date_data["selected_end_date"] = datetime.strptime(date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_end_date"] = ks_convert_into_utc(date, self_tz)
ks_date_data["selected_start_date"] = False
return ks_date_data
def ks_get_date_range_from_pastwithout(date_state, self_tz, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(self_tz))
hour = date.hour + 1
date = date - timedelta(hours=hour)
date = datetime.strptime(date.strftime("%Y-%m-%d 23:59:59"), '%Y-%m-%d %H:%M:%S')
ks_date_data["selected_start_date"] = False
if type == 'date':
ks_date_data["selected_end_date"] = datetime.strptime(date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_end_date"] = ks_convert_into_utc(date, self_tz)
return ks_date_data
def ks_get_date_range_from_future(date_state, self_tz, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(self_tz))
ks_date_data["selected_end_date"] = False
if type == 'date':
ks_date_data["selected_start_date"] = date.strptime(date.strftime("%Y-%m-%d"), '%Y-%m-%d')
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(date,self_tz)
return ks_date_data
def ks_get_date_range_from_futurestarting(date_state, self_tz, type,self):
ks_date_data = {}
date = datetime.now(pytz.timezone(self_tz))
date = date + timedelta(days=1)
start_date = datetime.strptime(date.strftime("%Y-%m-%d 00:00:00"), '%Y-%m-%d %H:%M:%S')
if type == 'date':
ks_date_data["selected_start_date"] = datetime.strptime(start_date.strftime("%Y-%m-%d"), '%Y-%m-%d')
ks_date_data["selected_end_date"] = False
else:
ks_date_data["selected_start_date"] = ks_convert_into_utc(start_date, self_tz)
ks_date_data["selected_end_date"] = False
return ks_date_data
def ks_convert_into_utc(datetime, timezone):
ks_tz = timezone and pytz.timezone(timezone) or pytz.UTC
return ks_tz.localize(datetime.replace(tzinfo=None), is_dst=False).astimezone(pytz.UTC).replace(tzinfo=None)
def ks_convert_into_local(datetime, timezone):
ks_tz = timezone and pytz.timezone(timezone) or pytz.UTC
return pytz.UTC.localize(datetime.replace(tzinfo=None), is_dst=False).astimezone(ks_tz).replace(tzinfo=None)
@@ -0,0 +1,3 @@
from . import ks_chart_export
from . import ks_list_export
from . import ks_dashboard_export
@@ -0,0 +1,115 @@
import re
import datetime
import io
import json
import operator
import logging
from odoo.addons.web.controllers.main import ExportFormat, ExportXlsxWriter
from odoo.tools.translate import _
from werkzeug.exceptions import InternalServerError
from odoo import http
from odoo.http import content_disposition, request
from odoo.tools.misc import xlwt
from odoo.exceptions import UserError
from odoo.tools import pycompat
_logger = logging.getLogger(__name__)
class KsChartExport(http.Controller):
def base(self, data):
params = json.loads(data)
header,chart_data = operator.itemgetter('header','chart_data')(params)
chart_data = json.loads(chart_data)
chart_data['labels'].insert(0,'Measure')
columns_headers = chart_data['labels']
import_data = []
for dataset in chart_data['datasets']:
dataset['data'].insert(0, dataset['label'])
import_data.append(dataset['data'])
return request.make_response(self.from_data(columns_headers, import_data),
headers=[('Content-Disposition',
content_disposition(self.filename(header))),
('Content-Type', self.content_type)],
# cookies={'fileToken': token}
)
class KsChartExcelExport(KsChartExport, http.Controller):
# Excel needs raw data to correctly handle numbers and date values
raw_data = True
@http.route('/ks_dashboard_ninja/export/chart_xls', type='http', auth="user")
def index(self, data):
try:
return self.base(data)
except Exception as exc:
_logger.exception("Exception during request handling.")
payload = json.dumps({
'code': 200,
'message': "Odoo Server Error",
'data': http.serialize_exception(exc)
})
raise InternalServerError(payload) from exc
@property
def content_type(self):
return 'application/vnd.ms-excel'
def filename(self, base):
return base + '.xlsx'
def from_data(self, fields, rows):
with ExportXlsxWriter(fields, len(rows)) as xlsx_writer:
for row_index, row in enumerate(rows):
for cell_index, cell_value in enumerate(row):
xlsx_writer.write_cell(row_index + 1, cell_index, cell_value)
return xlsx_writer.value
class KsChartCsvExport(KsChartExport, http.Controller):
@http.route('/ks_dashboard_ninja/export/chart_csv', type='http', auth="user")
def index(self, data):
try:
return self.base(data)
except Exception as exc:
_logger.exception("Exception during request handling.")
payload = json.dumps({
'code': 200,
'message': "Odoo Server Error",
'data': http.serialize_exception(exc)
})
raise InternalServerError(payload) from exc
@property
def content_type(self):
return 'text/csv;charset=utf8'
def filename(self, base):
return base + '.csv'
def from_data(self, fields, rows):
fp = io.BytesIO()
writer = pycompat.csv_writer(fp, quoting=1)
writer.writerow(fields)
for data in rows:
row = []
for d in data:
# Spreadsheet apps tend to detect formulas on leading =, + and -
if isinstance(d, str) and d.startswith(('=', '-', '+')):
d = "'" + d
row.append(pycompat.to_text(d))
writer.writerow(row)
return fp.getvalue()
@@ -0,0 +1,87 @@
import io
import json
import operator
import logging
from odoo.addons.web.controllers.main import ExportFormat
from odoo import http
from odoo.http import request
from odoo.http import content_disposition,request
from werkzeug.exceptions import InternalServerError
_logger = logging.getLogger(__name__)
class KsDashboardExport(http.Controller):
def base(self, data):
params = json.loads(data)
header, dashboard_data = operator.itemgetter('header', 'dashboard_data')(params)
return request.make_response(self.from_data(dashboard_data),
headers=[('Content-Disposition',
content_disposition(self.filename(header))),
('Content-Type', self.content_type)],
# cookies={'fileToken': token}
)
class KsDashboardJsonExport(KsDashboardExport, http.Controller):
@http.route('/ks_dashboard_ninja/export/dashboard_json', type='http', auth="user")
def index(self, data):
try:
return self.base(data)
except Exception as exc:
_logger.exception("Exception during request handling.")
payload = json.dumps({
'code': 200,
'message': "Odoo Server Error",
'data': http.serialize_exception(exc)
})
raise InternalServerError(payload) from exc
@property
def content_type(self):
return 'text/csv;charset=utf8'
def filename(self, base):
return base + '.json'
def from_data(self, dashboard_data):
fp = io.StringIO()
fp.write(json.dumps(dashboard_data))
return fp.getvalue()
class KsItemJsonExport(KsDashboardExport, http.Controller):
@http.route('/ks_dashboard_ninja/export/item_json', type='http', auth="user")
def index(self, data):
try:
data = json.loads(data)
item_id = data["item_id"]
data['dashboard_data'] = request.env['ks_dashboard_ninja.board'].ks_export_item(item_id)
data = json.dumps(data)
return self.base(data)
except Exception as exc:
_logger.exception("Exception during request handling.")
payload = json.dumps({
'code': 200,
'message': "Odoo Server Error",
'data': http.serialize_exception(exc)
})
raise InternalServerError(payload) from exc
@property
def content_type(self):
return 'text/csv;charset=utf8'
def filename(self, base):
return base + '.json'
def from_data(self, dashboard_data):
fp = io.StringIO()
fp.write(json.dumps(dashboard_data))
return fp.getvalue()
@@ -0,0 +1,204 @@
import re
import io
import json
import operator
import logging
from odoo.addons.web.controllers.main import ExportFormat, ExportXlsxWriter
from odoo.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
import datetime
from odoo import http
from odoo.http import content_disposition, request
from odoo.tools import pycompat
from ..common_lib.ks_date_filter_selections import ks_get_date, ks_convert_into_utc, ks_convert_into_local
import os
import pytz
from werkzeug.exceptions import InternalServerError
_logger = logging.getLogger(__name__)
class KsListExport(http.Controller):
def base(self, data):
params = json.loads(data)
# header,list_data = operator.itemgetter('header','chart_data')(params)
header, list_data, item_id, ks_export_boolean, context, params = operator.itemgetter('header', 'chart_data',
'ks_item_id',
'ks_export_boolean',
'context', 'params')(
params)
list_data = json.loads(list_data)
if ks_export_boolean:
item = request.env['ks_dashboard_ninja.item'].browse(int(item_id))
ks_timezone = item._context.get('tz') or item.env.user.tz
if not ks_timezone:
ks_tzone = os.environ.get('TZ')
if ks_tzone:
ks_timezone = ks_tzone
elif os.path.exists('/etc/timezone'):
ks_tzone = open('/etc/timezone').read()
ks_timezone = ks_tzone[0:-1]
try:
datetime.now(pytz.timezone(ks_timezone))
except Exception as e:
_logger.info('Please set the local timezone')
else:
_logger.info('Please set the local timezone')
orderby = item.ks_sort_by_field.id
sort_order = item.ks_sort_by_order
ks_start_date = context.get('ksDateFilterStartDate', False)
ks_end_date = context.get('ksDateFilterEndDate', False)
ksDateFilterSelection = context.get('ksDateFilterSelection', False)
if context.get('allowed_company_ids', False):
item = item.with_context(allowed_company_ids=context.get('allowed_company_ids'))
if item.ks_data_calculation_type == 'query':
query_start_date = item.ks_query_start_date
query_end_date = item.ks_query_end_date
ks_query = str(item.ks_custom_query)
if ks_start_date and ks_end_date:
ks_start_date = datetime.datetime.strptime(ks_start_date,DEFAULT_SERVER_DATETIME_FORMAT)
ks_end_date = datetime.datetime.strptime(ks_end_date,DEFAULT_SERVER_DATETIME_FORMAT)
item = item.with_context(ksDateFilterStartDate=ks_start_date)
item = item.with_context(ksDateFilterEndDate=ks_end_date)
item = item.with_context(ksDateFilterSelection=ksDateFilterSelection)
if item._context.get('ksDateFilterSelection', False):
ks_date_filter_selection = item._context['ksDateFilterSelection']
if ks_date_filter_selection == 'l_custom':
item = item.with_context(ksDateFilterStartDate=ks_start_date)
item = item.with_context(ksDateFilterEndDate=ks_end_date)
item = item.with_context(ksIsDefultCustomDateFilter=False)
else:
ks_date_filter_selection = item.ks_dashboard_ninja_board_id.ks_date_filter_selection
item = item.with_context(ksDateFilterStartDate=item.ks_dashboard_ninja_board_id.ks_dashboard_start_date)
item = item.with_context(ksDateFilterEndDate=item.ks_dashboard_ninja_board_id.ks_dashboard_end_date)
item = item.with_context(ksDateFilterSelection=ks_date_filter_selection)
item = item.with_context(ksIsDefultCustomDateFilter=True)
if ks_date_filter_selection not in ['l_custom', 'l_none']:
ks_date_data = ks_get_date(ks_date_filter_selection, request, 'datetime')
item = item.with_context(ksDateFilterStartDate=ks_date_data["selected_start_date"])
item = item.with_context(ksDateFilterEndDate=ks_date_data["selected_end_date"])
item_domain = params.get('ks_domain_1', [])
ks_chart_domain = item.ks_convert_into_proper_domain(item.ks_domain, item,item_domain)
# list_data = item.ks_fetch_list_view_data(item,ks_chart_domain, ks_export_all=
if list_data['type'] == 'ungrouped':
list_data = item.ks_fetch_list_view_data(item, ks_chart_domain, ks_export_all=True)
elif list_data['type'] == 'grouped':
list_data = item.get_list_view_record(orderby, sort_order, ks_chart_domain, ks_export_all=True)
elif item.ks_data_calculation_type == 'query':
if ks_start_date or ks_end_date:
query_start_date = ks_start_date
query_end_date = ks_end_date
ks_query_result = item.ks_get_list_query_result(ks_query, query_start_date, query_end_date, ks_offset=0,
ks_export_all=True)
list_data = item.ks_format_query_result(ks_query_result)
# chart_data['labels'].insert(0,'Measure')
columns_headers = list_data['label']
import_data = []
for dataset in list_data['data_rows']:
if not list_data['type'] == 'grouped':
for count, index in enumerate(dataset['ks_column_type']):
if index == 'datetime':
ks_converted_date = False
date_string = dataset['data'][count]
if dataset['data'][count]:
ks_converted_date = ks_convert_into_local(datetime.datetime.strptime(date_string, '%m/%d/%y %H:%M:%S'),ks_timezone)
dataset['data'][count] = ks_converted_date
for ks_count, val in enumerate(dataset['data']):
if isinstance(val, (float, int)):
if val >= 0:
try:
ks_precision = item.sudo().env.ref('ks_dashboard_ninja.ks_dashboard_ninja_precision').digits
except Exception as e:
ks_precision = 2
dataset['data'][ks_count] = item.env['ir.qweb.field.float'].sudo().value_to_html(val,
{'precision': ks_precision})
import_data.append(dataset['data'])
return request.make_response(self.from_data(columns_headers, import_data),
headers=[('Content-Disposition',
content_disposition(self.filename(header))),
('Content-Type', self.content_type)],
# cookies={'fileToken': token}
)
class KsListExcelExport(KsListExport, http.Controller):
# Excel needs raw data to correctly handle numbers and date values
raw_data = True
@http.route('/ks_dashboard_ninja/export/list_xls', type='http', auth="user")
def index(self, data):
try:
return self.base(data)
except Exception as exc:
_logger.exception("Exception during request handling.")
payload = json.dumps({
'code': 200,
'message': "Odoo Server Error",
'data': http.serialize_exception(exc)
})
raise InternalServerError(payload) from exc
@property
def content_type(self):
return 'application/vnd.ms-excel'
def filename(self, base):
return base + '.xlsx'
def from_data(self, fields, rows):
with ExportXlsxWriter(fields, len(rows)) as xlsx_writer:
for row_index, row in enumerate(rows):
for cell_index, cell_value in enumerate(row):
xlsx_writer.write_cell(row_index + 1, cell_index, cell_value)
return xlsx_writer.value
class KsListCsvExport(KsListExport, http.Controller):
@http.route('/ks_dashboard_ninja/export/list_csv', type='http', auth="user")
def index(self, data):
try:
return self.base(data)
except Exception as exc:
_logger.exception("Exception during request handling.")
payload = json.dumps({
'code': 200,
'message': "Odoo Server Error",
'data': http.serialize_exception(exc)
})
raise InternalServerError(payload) from exc
@property
def content_type(self):
return 'text/csv;charset=utf8'
def filename(self, base):
return base + '.csv'
def from_data(self, fields, rows):
fp = io.BytesIO()
writer = pycompat.csv_writer(fp, quoting=1)
writer.writerow(fields)
for data in rows:
row = []
for d in data:
# Spreadsheet apps tend to detect formulas on leading =, + and -
if isinstance(d, str) and d.startswith(('=', '-', '+')):
d = "'" + d
row.append(pycompat.to_text(d))
writer.writerow(row)
return fp.getvalue()
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<record id="config_dn_url" model="ir.config_parameter">
<field name="key">ks_dashboard_ninja.url</field>
<field name="value">https://dn16ai.kappso.in</field>
</record>
</data>
</odoo>
+612
View File
@@ -0,0 +1,612 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Default Templates -->
<record id="ks_blank" model="ks_dashboard_ninja.board_template">
<field name="name">Blank</field>
<field name="ks_item_count">0</field>
</record>
<record id="ks_template_1" model="ks_dashboard_ninja.board_template">
<field name="name">Template 1</field>
<field name="ks_gridstack_config">[
{"item_id":"ks_dashboard_ninja.ks_default_item_1", "data": {"x": 0, "y": 10, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_2", "data": {"x": 0, "y": 8, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_3", "data": {"x": 3, "y": 0, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_4", "data": {"x": 0, "y": 2, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_5", "data": {"x": 6, "y": 12, "w": 6, "h": 6}},
{"item_id":"ks_dashboard_ninja.ks_default_item_6", "data": {"x": 0, "y": 28, "w": 12, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_7", "data": {"x": 0, "y": 43, "w": 5, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_8", "data": {"x": 6, "y": 6, "w": 6, "h": 6}},
{"item_id":"ks_dashboard_ninja.ks_default_item_9", "data": {"x": 5, "y": 36, "w": 7, "h": 7}},
{"item_id":"ks_dashboard_ninja.ks_default_item_10", "data": {"x": 4, "y": 23, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_11", "data": {"x": 6, "y": 18, "w": 6, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_12", "data": {"x": 0, "y": 6, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_13", "data": {"x": 3, "y": 8, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_15", "data": {"x": 0, "y": 18, "w": 6, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_16", "data": {"x": 0, "y": 0, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_17", "data": {"x": 3, "y": 6, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_18", "data": {"x": 3, "y": 4, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_19", "data": {"x": 3, "y": 10, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_20", "data": {"x": 5, "y": 43, "w": 7, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_21", "data": {"x": 0, "y": 12, "w": 6, "h":
6}},
{"item_id":"ks_dashboard_ninja.ks_default_item_22", "data": {"x": 0, "y": 36, "w": 5, "h":
7}},
{"item_id":"ks_dashboard_ninja.ks_default_item_23", "data": {"x": 0, "y": 32, "w": 12, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_24", "data": {"x": 8, "y": 23, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_25", "data": {"x": 0, "y": 23, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_26", "data": {"x": 0, "y": 4, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_27", "data": {"x": 3, "y": 3, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_28", "data": {"x": 6, "y": 0, "w": 6, "h":
6}}
]
</field>
<field name="ks_item_count">7</field>
</record>
<record id="ks_template_2" model="ks_dashboard_ninja.board_template">
<field name="name">Template 2</field>
<field name="ks_gridstack_config">[
{"item_id":"ks_dashboard_ninja.ks_default_item_1", "data": {"x": 0, "y": 0, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_2", "data": {"x": 4, "y": 0, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_3", "data": {"x": 2, "y": 0, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_4", "data": {"x": 8, "y": 0, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_5", "data": {"x": 4, "y": 18, "w": 8, "h": 5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_6", "data": {"x": 8, "y": 27, "w": 4, "h":
6}},
{"item_id":"ks_dashboard_ninja.ks_default_item_7", "data": {"x": 0, "y": 18, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_8", "data": {"x": 4, "y": 27, "w": 4, "h":
6}},
{"item_id":"ks_dashboard_ninja.ks_default_item_9", "data": {"x": 4, "y": 13, "w": 8, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_10", "data": {"x": 0, "y": 23, "w": 4, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_11", "data": {"x": 0, "y": 4, "w": 4, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_12", "data": {"x": 6, "y": 0, "w": 2, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_13", "data": {"x": 10, "y": 2, "w": 2, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_15", "data": {"x":0, "y": 33, "w": 6, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_16", "data": {"x": 2, "y": 2, "w": 2, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_17", "data": {"x": 8, "y": 2, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_18", "data": {"x": 6, "y": 2, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_19", "data": {"x": 0, "y": 2, "w": 2, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_20", "data": {"x": 4, "y": 8, "w": 8, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_21", "data": {"x": 0, "y": 13, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_22", "data": {"x": 4, "y": 23, "w": 8, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_23", "data": {"x": 6, "y": 33, "w": 6, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_24", "data": {"x": 4, "y": 4, "w": 8, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_25", "data": {"x": 0, "y": 8, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_26", "data": {"x": 4, "y": 2, "w": 2, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_27", "data": {"x": 10, "y": 2, "w": 2, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_28", "data": {"x": 0, "y": 27, "w": 4, "h":
6}}
]
</field>
<field name="ks_item_count">7</field>
</record>
<record id="ks_template_3" model="ks_dashboard_ninja.board_template">
<field name="name">Template 3</field>
<field name="ks_gridstack_config">[
{"item_id":"ks_dashboard_ninja.ks_default_item_1", "data": {"x": 0, "y": 0, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_2", "data": {"x": 6, "y": 0, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_3", "data": {"x": 3, "y": 0, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_4", "data": {"x": 0, "y": 2, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_5", "data": {"x": 7, "y": 2, "w": 5, "h": 4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_6", "data": {"x": 0, "y": 28, "w": 12, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_7", "data": {"x": 4, "y": 14, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_8", "data": {"x": 0, "y": 33, "w": 3, "h": 5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_9", "data": {"x": 8, "y": 23, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_10", "data": {"x": 8, "y": 14, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_11", "data": {"x": 0, "y": 23, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_12", "data": {"x": 9, "y": 0, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_13", "data": {"x": 3, "y": 2, "w": 4, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_15", "data": {"x":0, "y": 19, "w": 12, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_16", "data": {"x": 0, "y": 8, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_17", "data": {"x": 3, "y": 4, "w": 4, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_18", "data": {"x": 0, "y": 12, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_19", "data": {"x": 0, "y": 4, "w": 3, "h": 2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_20", "data": {"x": 3, "y": 6, "w": 9, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_21", "data": {"x": 0, "y": 14, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_22", "data": {"x": 6, "y": 33, "w": 6, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_23", "data": {"x": 0, "y": 19, "w": 12, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_24", "data": {"x": 3, "y": 10, "w": 9, "h":
4}},
{"item_id":"ks_dashboard_ninja.ks_default_item_25", "data": {"x": 4, "y": 23, "w": 4, "h":
5}},
{"item_id":"ks_dashboard_ninja.ks_default_item_26", "data": {"x": 0, "y": 8, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_27", "data": {"x": 0, "y": 6, "w": 3, "h":
2}},
{"item_id":"ks_dashboard_ninja.ks_default_item_28", "data": {"x": 3, "y": 33, "w": 3, "h":
5}}
]
</field>
<field name="ks_item_count">7</field>
</record>
<!--Default items (7 right now) created here that will be used for default templates in future dashboards-->
<record id="ks_default_item_1" model="ks_dashboard_ninja.item">
<field name="name">Tile (layout 1)</field>
<field name="ks_dashboard_item_type">ks_tile</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&gt;",150]]</field>
<field name="ks_default_icon">bar-chart</field>
<field name="ks_dashboard_item_theme">blue</field>
<field name="ks_background_color">#337ab7,0.99</field>
<field name="ks_font_color">#ffffff,0.99</field>
<field name="ks_default_icon_color">#ffffff,0.99</field>
<field name="ks_layout">layout1</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_2" model="ks_dashboard_ninja.item">
<field name="name">Tile (layout 3)</field>
<field name="ks_dashboard_item_type">ks_tile</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_default_icon">users</field>
<field name="ks_dashboard_item_theme">red</field>
<field name="ks_background_color">#d9534f,0.99</field>
<field name="ks_font_color">#ffffff,0.99</field>
<field name="ks_default_icon_color">#ffffff,0.99</field>
<field name="ks_layout">layout3</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_3" model="ks_dashboard_ninja.item">
<field name="name">Tile (layout 2)</field>
<field name="ks_dashboard_item_type">ks_tile</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&lt;",50]]</field>
<field name="ks_default_icon">money</field>
<field name="ks_dashboard_item_theme">green</field>
<field name="ks_background_color">#5cb85c,0.99</field>
<field name="ks_font_color">#000000,0.99</field>
<field name="ks_default_icon_color">#ffffff,0.99</field>
<field name="ks_layout">layout2</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_4" model="ks_dashboard_ninja.item">
<field name="name">Tile (layout 5)</field>
<field name="ks_dashboard_item_type">ks_tile</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_default_icon">paper-plane</field>
<field name="ks_dashboard_item_theme">yellow</field>
<field name="ks_background_color">#623D0A,0.99</field>
<field name="ks_font_color">#ffffff,0.99</field>
<field name="ks_default_icon_color">#ffffff,0.99</field>
<field name="ks_layout">layout5</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_5" model="ks_dashboard_ninja.item">
<field name="name">Bar Chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<!-- <field name="ks_chart_measure_field" eval="[ref('base.field_res_country__phone_code')]"/>-->
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",40]]</field>
<field name="ks_chart_item_color">warm</field>
<field name="ks_dashboard_item_type">ks_bar_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_6" model="ks_dashboard_ninja.item">
<field name="name">Line Chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<!-- <field name="ks_chart_measure_field" eval="[ref('base.field_res_country__phone_code')]"/>-->
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">warm</field>
<field name="ks_dashboard_item_type">ks_line_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_7" model="ks_dashboard_ninja.item">
<field name="name">Pie Chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_dashboard_item_type">ks_pie_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_8" model="ks_dashboard_ninja.item">
<field name="name">list view (Un-Grouped)</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_list_view_type">grouped</field>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__phone_code')"/>
<field name="ks_list_view_group_fields" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_dashboard_item_type">ks_list_view</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_9" model="ks_dashboard_ninja.item">
<field name="name">Horizontal Bar</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">neon</field>
<field name="ks_dashboard_item_type">ks_horizontalBar_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_10" model="ks_dashboard_ninja.item">
<field name="name">Polar Area</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">cool</field>
<field name="ks_dashboard_item_type">ks_polarArea_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_11" model="ks_dashboard_ninja.item">
<field name="name">Doughnut chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">neon</field>
<field name="ks_record_data_limit">100</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_dashboard_item_type">ks_doughnut_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_12" model="ks_dashboard_ninja.item">
<field name="name">Tile (layout 4)</field>
<field name="ks_dashboard_item_type">ks_tile</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&lt;",50]]</field>
<field name="ks_default_icon">shopping-cart</field>
<field name="ks_dashboard_item_theme">red</field>
<field name="ks_background_color">#D9534F,0.99</field>
<field name="ks_font_color">#D9534F,0.99</field>
<field name="ks_default_icon_color">#FFFFFF,0.99</field>
<field name="ks_layout">layout4</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_13" model="ks_dashboard_ninja.item">
<field name="name">Tile (layout 6)</field>
<field name="ks_dashboard_item_type">ks_tile</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_default_icon">car</field>
<field name="ks_dashboard_item_theme">red</field>
<field name="ks_background_color">#D9534F,0.53</field>
<field name="ks_font_color">#FFFFFF,0.70</field>
<field name="ks_default_icon_color">#FFFFFF,0.99</field>
<field name="ks_layout">layout6</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_14" model="ks_dashboard_ninja.item">
<field name="name">Pie Chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__currency_id')"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_chart_item_color">neon</field>
<field name="ks_dashboard_item_type">ks_pie_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_15" model="ks_dashboard_ninja.item">
<field name="name">Area Chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__code')"/>
<field name="ks_chart_item_color">neon</field>
<field name="ks_dashboard_item_type">ks_area_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
</data>
<record id="ks_default_item_16" model="ks_dashboard_ninja.item">
<field name="name">Kpi Ratio</field>
<field name="ks_dashboard_item_type">ks_kpi</field>
<field name="ks_record_count_type">count</field>
<field name="ks_record_count_type_2">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
<field name="ks_data_comparison">Ratio</field>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_default_icon">user</field>
<field name="ks_dashboard_item_theme">blue</field>
<field name="ks_background_color">#03104E,0.99</field>
<field name="ks_font_color">#ffffff,0.99</field>
<field name="ks_default_icon_color">#ffffff,0.99</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_17" model="ks_dashboard_ninja.item">
<field name="name">Kpi ( Percentage)</field>
<field name="ks_dashboard_item_type">ks_kpi</field>
<field name="ks_record_count_type">count</field>
<field name="ks_record_count_type_2">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_data_comparison">Percentage</field>
<field name="ks_default_icon">paper-plane</field>
<field name="ks_dashboard_item_theme">red</field>
<field name="ks_background_color">#ED9922,0.99</field>
<field name="ks_font_color">#000000,0.99</field>
<field name="ks_default_icon_color">#000000,0.99</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_18" model="ks_dashboard_ninja.item">
<field name="name">Kpi ( Number)</field>
<field name="ks_dashboard_item_type">ks_kpi</field>
<field name="ks_record_count_type">count</field>
<field name="ks_record_count_type_2">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
<field name="ks_target_view">Number</field>
<field name="ks_goal_enable">1</field>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_data_comparison">Sum</field>
<field name="ks_default_icon">money</field>
<field name="ks_dashboard_item_theme">green</field>
<field name="ks_background_color">#5CB85C,0.63</field>
<field name="ks_font_color">#000000,0.99</field>
<field name="ks_default_icon_color">#000000,0.99</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_19" model="ks_dashboard_ninja.item">
<field name="name">Kpi (sum)</field>
<field name="ks_dashboard_item_type">ks_kpi</field>
<field name="ks_record_count_type">count</field>
<field name="ks_record_count_type_2">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
<field name="ks_data_comparison">Sum</field>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_default_icon">bar-chart</field>
<field name="ks_dashboard_item_theme">yellow</field>
<field name="ks_background_color">#f0ad4e,0.99</field>
<field name="ks_font_color">#ffffff,0.99</field>
<field name="ks_default_icon_color">#ffffff,0.99</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_20" model="ks_dashboard_ninja.item">
<field name="name">Bar Chart With Data Values</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_domain">[["id","&lt;",40]]</field>
<field name="ks_chart_item_color">default</field>
<field name="ks_dashboard_item_type">ks_bar_chart</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_21" model="ks_dashboard_ninja.item">
<field name="name">Semi Circle Pie Chart</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_semi_circle_chart">1</field>
<field name="ks_chart_item_color">warm</field>
<field name="ks_record_data_limit">10</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_dashboard_item_type">ks_pie_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_22" model="ks_dashboard_ninja.item">
<field name="name">Horizontal Bar(sub-group)</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_chart_relation_sub_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_chart_item_color">default</field>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_dashboard_item_type">ks_horizontalBar_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_23" model="ks_dashboard_ninja.item">
<field name="name">Area Chart with data values</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__code')"/>
<field name="ks_chart_item_color">warm</field>
<field name="ks_record_data_limit">25</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_dashboard_item_type">ks_area_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_24" model="ks_dashboard_ninja.item">
<field name="name">Line Chart with values</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_chart_item_color">warm</field>
<field name="ks_record_data_limit">10</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_dashboard_item_type">ks_line_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_25" model="ks_dashboard_ninja.item">
<field name="name">Doughnut semi circle</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_measure_field" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_chart_item_color">neon</field>
<field name="ks_semi_circle_chart">1</field>
<field name="ks_record_data_limit">25</field>
<field name="ks_show_data_value">1</field>
<field name="ks_unit_selection">monetary</field>
<field name="ks_dashboard_item_type">ks_doughnut_chart</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_26" model="ks_dashboard_ninja.item">
<field name="name">Kpi 26(Average)</field>
<field name="ks_dashboard_item_type">ks_kpi</field>
<field name="ks_record_field" eval="ref('base.field_res_country__name')"/>
<field name="ks_record_field_2" eval="ref('base.field_res_country__name')"/>
<field name="ks_data_format">indian</field>
<field name="ks_record_count_type">average</field>
<field name="ks_record_count_type_2">average</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_model_id_2" eval="ref('base.model_res_country')"/>
<field name="ks_target_view">Number</field>
<field name="ks_goal_enable">1</field>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_data_comparison">Sum</field>
<field name="ks_default_icon">money</field>
<field name="ks_dashboard_item_theme">blue</field>
<field name="ks_background_color">#2DC9B3,0.99</field>
<field name="ks_font_color">#000000,0.99</field>
<field name="ks_default_icon_color">#000000,0.99</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_27" model="ks_dashboard_ninja.item">
<field name="name">Kpi (previous)</field>
<field name="ks_dashboard_item_type">ks_kpi</field>
<field name="ks_record_count_type">count</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_domain">[["id","&lt;",100]]</field>
<field name="ks_previous_period">1</field>
<field name="ks_date_filter_selection">t_week</field>
<field name="ks_default_icon">money</field>
<field name="ks_dashboard_item_theme">green</field>
<field name="ks_background_color">#17D817,0.59</field>
<field name="ks_font_color">#000000,0.99</field>
<field name="ks_default_icon_color">#000000,0.99</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_28" model="ks_dashboard_ninja.item">
<field name="name">list view (grouped)</field>
<field name="ks_chart_data_count_type">sum</field>
<field name="ks_chart_groupby_type">relational_type</field>
<field name="ks_model_id" eval="ref('base.model_res_country')"/>
<field name="ks_chart_relation_groupby" eval="ref('base.field_res_country__name')"/>
<field name="ks_list_view_type">ungrouped</field>
<field name="ks_list_view_group_fields" eval="[(6, 0, [ref('base.field_res_country__phone_code')])]"/>
<field name="ks_list_view_fields"
eval="[(6, 0, [ref('base.field_res_country__phone_code'),ref('base.field_res_country__name')])]"/>
<field name="ks_domain">[["id","&lt;",10]]</field>
<field name="ks_dashboard_item_type">ks_list_view</field>
<field name="ks_company_id" eval="0"/>
</record>
<record id="ks_default_item_10_action" model="ks_dashboard_ninja.item_action">
<field name="ks_dashboard_item_id" ref="ks_default_item_10"/>
<field name="ks_chart_type">ks_bar_chart</field>
<field name="ks_item_action_field" ref='base.field_res_country__phone_code'/>
</record>
<record id="ks_default_item_10_action1" model="ks_dashboard_ninja.item_action">
<field name="ks_dashboard_item_id" ref="ks_default_item_10"/>
<field name="ks_chart_type">ks_pie_chart</field>
<field name="ks_item_action_field" ref='base.field_res_country__name'/>
</record>
<!-- Default dashboard Data -->
<data noupdate="1">
<record id="ks_my_default_dashboard_board" model="ks_dashboard_ninja.board">
<field name="name">My Dashboard</field>
<field name="ks_dashboard_state">Locked</field>
<field name="ks_dashboard_menu_name">My Dashboard</field>
<field name="ks_dashboard_active">1</field>
<field name="ks_dashboard_default_template" ref="ks_dashboard_ninja.ks_blank"/>
</record>
<record forcecreate="True" id="ks_dashboard_ninja_precision" model="decimal.precision">
<field name="name">Dashboard Ninja Decimal Precision</field>
<field name="digits" eval="2"/>
</record>
</data>
</odoo>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="ir_cron_send_target_email" model="ir.cron">
<field name="name">Kpi mail cron</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="model_id" ref="model_ks_dashboard_ninja_item"/>
<field name="code">model.check_target()</field>
<field name="state">code</field>
</record>
</odoo>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<record id="ks_dashboard_item_seq" model="ir.sequence">
<field name="name">Dashboard Seq</field>
<field name="code">ks_dashboard_ninja.item</field>
<field name="padding">2</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Three Default Demo Dashboard with Templates : Template1, Template2, Template3-->
<record id="demo_template1_dashboard" model="ks_dashboard_ninja.board">
<field name="name">Template1 Dashboard</field>
<field name="ks_dashboard_menu_name">Template1</field>
<field name="ks_dashboard_top_menu_id" eval="ref('ks_dashboard_ninja.board_menu_root')"/>
<field name="ks_dashboard_default_template" eval="ref('ks_dashboard_ninja.ks_template_1')"/>
<field name="ks_dashboard_active">1</field>
<field name="ks_dashboard_group_access" eval="False"/>
</record>
<record id="demo_template2_dashboard" model="ks_dashboard_ninja.board">
<field name="name">Template2 Dashboard</field>
<field name="ks_dashboard_menu_name">Template2</field>
<field name="ks_dashboard_top_menu_id" eval="ref('ks_dashboard_ninja.board_menu_root')"/>
<field name="ks_dashboard_default_template" eval="ref('ks_dashboard_ninja.ks_template_2')"/>
<field name="ks_dashboard_active">1</field>
<field name="ks_dashboard_group_access" eval="False"/>
</record>
<record id="demo_template3_dashboard" model="ks_dashboard_ninja.board">
<field name="name">Template3 Dashboard</field>
<field name="ks_dashboard_menu_name">Template3</field>
<field name="ks_dashboard_top_menu_id" eval="ref('ks_dashboard_ninja.board_menu_root')"/>
<field name="ks_dashboard_default_template" eval="ref('ks_dashboard_ninja.ks_template_3')"/>
<field name="ks_dashboard_active">1</field>
<field name="ks_dashboard_group_access" eval="False"/>
</record>
</data>
</odoo>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
from odoo import models, fields, api, _
class KpSendMail(models.Model):
_name = 'ks_dashboard_ninja.kpi_mail'
_description = 'Dashboard Ninja Kpi mail'
name = fields.Char(string="Email To:")
+15
View File
@@ -0,0 +1,15 @@
from . import ks_dashboard_ninja
from . import ks_dashboard_ninja_items
from . import ks_item_action
from . import ks_child_dashboard
from . import ks_dashboard_filters
from . import ks_dashboard_templates
from . import ks_dn_to_do_item
from . import ks_import_dashboard
from . import Kpi_mail
from . import res_settings
from . import ks_ai_ninja_dashboard
from . import ks_ai_whole_dashboard
from . import ks_key_fetch
@@ -0,0 +1,222 @@
import json
import logging
import requests
from odoo import http, api, fields, models, _
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class KsDashboardNInjaAI(models.TransientModel):
_name = 'ks_dashboard_ninja.arti_int'
_description = 'AI Dashboard'
ks_type = fields.Selection([('ks_model', 'Model'), ('ks_keyword', 'Keywords')],
string="Ks AI Type", default='ks_model')
ks_import_model_id = fields.Many2one('ir.model', string='Model',
domain="[('access_ids','!=',False),('transient','=',False),"
"('model','not ilike','base_import%'),('model','not ilike','ir.%'),"
"('model','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'),('model','not ilike','ks_to%')]",
help="Data source to fetch and read the data for the creation of dashboard items. ")
ks_import_model = fields.Many2one('ir.model', string='Model',
domain="[('access_ids','!=',False),('transient','=',False),"
"('model','not ilike','base_import%'),('model','not ilike','ir.%'),"
"('model','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'),('model','not ilike','ks_to%')]",
help="Data source to fetch and read the data for the creation of dashboard items. ")
ks_input_keywords = fields.Char("Ks Keywords")
ks_model_show = fields.Boolean(default = False, compute='_compute_show_model')
@api.onchange('ks_input_keywords')
def _compute_show_model(self):
if self.ks_input_keywords and self.ks_type=="ks_keyword":
api_key = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.dn_api_key')
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if api_key and url:
json_data = {'name': api_key,
'type': self.ks_type,
'keyword': self.ks_input_keywords
}
url = url + "/api/v1/ks_dn_keyword_gen"
ks_response = requests.post(url, data=json_data)
if json.loads(ks_response.text) == False:
self.ks_model_show = True
else:
self.ks_model_show = False
else:
raise ValidationError(_("Please enter URL and API Key in General Settings"))
else:
self.ks_model_show = False
@api.model
def ks_get_keywords(self):
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if url:
url = url + "/api/v1/ks_dn_get_keyword"
ks_response = requests.post(url)
if ks_response.status_code == 200:
return json.loads(ks_response.text)
else:
return []
def ks_do_action(self):
headers = {"Content-Type": "application/json",
"Accept": "application/json",
"Catch-Control": "no-cache",
}
if self.ks_import_model_id:
ks_model_name = self.ks_import_model_id.model
ks_fields = self.env[ks_model_name].fields_get()
ks_filtered_fields = {key: val for key, val in ks_fields.items() if val['type'] not in ['many2many', 'one2many', 'binary'] and val['name'] != 'id' and val['name'] != 'sequence' and val['store'] == True}
ks_fields_name = {val['name']:val['type'] for val in ks_filtered_fields.values()}
question = ("columns: "+ f"{ks_fields_name}")
api_key = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.dn_api_key')
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if api_key and url:
json_data = {'name': api_key,
'question':question,
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
'db_name': self.env.cr.dbname
}
url = url+"/api/v1/ks_dn_main_api"
ks_ai_response = requests.post(url, data=json_data)
if ks_ai_response.status_code == 200:
ks_ai_response = json.loads(ks_ai_response.text)
# create dummy dash to create items on the dashboard, later deleted it.
ks_create_record = self.env['ks_dashboard_ninja.board'].create({
'name': 'AI dashboard',
'ks_dashboard_menu_name': 'AI menu',
'ks_dashboard_default_template': self.env.ref('ks_dashboard_ninja.ks_blank', False).id,
'ks_dashboard_top_menu_id': self.env['ir.ui.menu'].search([('name', '=', 'My Dashboard')])[0].id,
})
ks_dash_id = ks_create_record.id
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,
ks_model_name)
context = {'ks_dash_id': self._context['ks_dashboard_id'],
'ks_dash_name': self.env['ks_dashboard_ninja.board'].search([
('id','=',self._context['ks_dashboard_id'])]).name,'ks_delete_dash_id':ks_dash_id }
# return client action created through js for AI dashboard to render items on dummy dashboard
if (ks_result == "success"):
return {
'type': 'ir.actions.client',
'name': context['ks_dash_name'],
'params': {'ks_dashboard_id': ks_create_record.id},
'tag': 'ks_dashboard_ninja_ai',
'target': 'new',
'context': context
}
else:
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
raise ValidationError(_("Items didn't render because AI provides invalid response for this model.Please try again"))
else:
raise ValidationError(_("AI Responds with the following status:- %s") % ks_ai_response.text)
else:
raise ValidationError(_("Please enter URL and API Key in General Settings"))
else:
raise ValidationError(_("Please enter the Model"))
def ks_generate_item(self):
if self.ks_input_keywords:
api_key = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.dn_api_key')
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if api_key and url:
json_data = {'name': api_key,
'type': self.ks_type,
'keyword':self.ks_input_keywords
}
url = url + "/api/v1/ks_dn_keyword_gen"
ks_response = requests.post(url, data=json_data)
else:
raise ValidationError(_("Please put API key and URL"))
if json.loads(ks_response.text) != False and ks_response.status_code==200 :
ks_ai_response = json.loads(ks_response.text)
ks_dash_id = self._context['ks_dashboard_id']
ks_model_name = ks_ai_response[0]['model']
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,
ks_model_name)
if ks_result == "success":
return{
'type': 'ir.actions.client',
'tag': 'reload',
}
else:
raise ValidationError(_("Items didn't render, please try again!"))
else:
ks_model_name = self.ks_import_model.model
ks_fields = self.env[ks_model_name].fields_get()
ks_filtered_fields = {key: val for key, val in ks_fields.items() if
val['type'] not in ['many2many', 'one2many', 'binary'] and val[
'name'] != 'id' and val['name'] != 'sequence' and val['store'] == True}
ks_fields_name = {val['name']: val['type'] for val in ks_filtered_fields.values()}
question = ("schema: " + f"{ks_fields_name}")
model =("model:" + f"{ks_model_name}")
api_key = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.dn_api_key')
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if api_key and url:
json_data = {'name': api_key,
'question': self.ks_input_keywords,
'type':self.ks_type,
'schema':question,
'model':model,
'url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
'db_name': self.env.cr.dbname
}
url = url + "/api/v1/ks_dn_main_api"
ks_ai_response = requests.post(url, data=json_data)
if ks_ai_response.status_code == 200:
ks_ai_response = json.loads(ks_ai_response.text)
ks_dash_id = self._context['ks_dashboard_id']
ks_model_name = (ks_ai_response[0]['model']).lower()
if self.env['ir.model'].search([('model','=',ks_model_name)]).id or self.env['ir.model'].search([('name','=',ks_model_name)]).id:
if self.env['ir.model'].search([('name','=',ks_model_name)]).id:
ks_model_name = self.env['ir.model'].search([('name','=',ks_model_name)]).model
else:
ks_model_name = (ks_ai_response[0]['model']).lower()
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,ks_model_name)
if ks_result == "success":
return {
'type': 'ir.actions.client',
'tag': 'reload',
}
else:
raise ValidationError(_("Items didn't render, please try again!"))
else:
raise ValidationError(_("%s model does not exist.Please install")% ks_model_name)
else:
raise ValidationError(
_("AI Responds with the following status:- %s") % ks_ai_response.text)
else:
raise ValidationError(_("Please enter URL and API Key in General Settings"))
else:
raise ValidationError(_("Enter the input keywords to render the item"))
@@ -0,0 +1,91 @@
import json
import logging
import requests
from odoo import http, api, fields, models, _
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class KsAIDashboardninja(models.TransientModel):
_name = 'ks_dashboard_ninja.ai_dashboard'
_description = 'AI Dashboard'
ks_import_model_id = fields.Many2one('ir.model', string='Model',
domain="[('access_ids','!=',False),('transient','=',False),"
"('model','not ilike','base_import%'),('model','not ilike','ir.%'),"
"('model','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'),('model','not ilike','ks_to%')]",
help="Data source to fetch and read the data for the creation of dashboard items. ", required=True)
ks_dash_name = fields.Char(string="Dashboard Name", required=True)
ks_menu_name = fields.Char(string="Menu Name", required=True)
ks_top_menu_id = fields.Many2one('ir.ui.menu',
domain="[('parent_id','=',False)]",
string="Show Under Menu", required=True,
default=lambda self: self.env['ir.ui.menu'].search(
[('name', '=', 'My Dashboard')])[0])
ks_template = fields.Many2one('ks_dashboard_ninja.board_template',
default=lambda self: self.env.ref('ks_dashboard_ninja.ks_blank',
False),
string="Dashboard Template")
def ks_do_action(self):
headers = {"Content-Type": "application/json",
"Accept": "application/json",
"Catch-Control": "no-cache",
}
if self.ks_import_model_id:
ks_model_name = self.ks_import_model_id.model
ks_fields = self.env[ks_model_name].fields_get()
ks_filtered_fields = {key: val for key, val in ks_fields.items() if val['type'] not in ['many2many', 'one2many', 'binary'] and val['name'] != 'id' and val['name'] != 'sequence' and val['store'] == True}
ks_fields_name = {val['name']:val['type'] for val in ks_filtered_fields.values()}
question = ("columns: "+ f"{ks_fields_name}")
api_key = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.dn_api_key')
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if api_key and url:
json_data = {'name': api_key,
'question':question,
'url':self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
'db_name':self.env.cr.dbname
}
url = url+"/api/v1/ks_dn_main_api"
ks_ai_response = requests.post(url, data=json_data)
if ks_ai_response.status_code == 200:
ks_ai_response = json.loads(ks_ai_response.text)
ks_create_record = self.env['ks_dashboard_ninja.board'].create({
'name': self.ks_dash_name,
'ks_dashboard_menu_name': self.ks_menu_name,
'ks_dashboard_default_template': self.ks_template.id,
'ks_dashboard_top_menu_id': self.ks_top_menu_id.id,
})
ks_dash_id = ks_create_record.id
ks_result = self.env['ks_dashboard_ninja.item'].create_ai_dash(ks_ai_response, ks_dash_id,
ks_model_name)
if (ks_result == "success"):
return {
'type': 'ir.actions.client',
'name': "Dashboard Ninja",
'res_model': 'ks_dashboard_ninja.board',
'params': {'ks_dashboard_id': ks_dash_id},
'tag': 'ks_dashboard_ninja',
}
else:
self.env['ks_dashboard_ninja.board'].browse(ks_dash_id).unlink()
raise ValidationError(_("Items didn't render, please try again!"))
else:
raise ValidationError(_("AI Responds with the following status:- %s") % ks_ai_response.text)
else:
raise ValidationError(_("Please enter URL and API Key in General Settings"))
else:
raise ValidationError(_("Please enter the Model"))
@@ -0,0 +1,21 @@
from odoo import models, fields, api, _
class KsDashboardNinjaBoardItemAction(models.Model):
_name = 'ks_dashboard_ninja.child_board'
_description = 'Dashboard Ninja Child Board'
name = fields.Char()
ks_dashboard_ninja_id = fields.Many2one("ks_dashboard_ninja.board", string="Select Dashboard")
ks_gridstack_config = fields.Char('Item Configurations')
# ks_board_active_user_ids = fields.Many2many('res.users')
ks_active = fields.Boolean("Is Selected")
ks_dashboard_menu_name = fields.Char(string="Menu Name", related='ks_dashboard_ninja_id.ks_dashboard_menu_name', store=True)
board_type = fields.Selection([('default', 'Default'), ('child', 'Child')])
company_id = fields.Many2one('res.company', required=True, default=lambda self: self.env.company)
def set_grid_stack_config(self, dashboard_id, gridstack_config):
return self.search([('ks_dashboard_ninja_id', '=', dashboard_id)]).sudo().write({'ks_gridstack_config': gridstack_config})
@@ -0,0 +1,182 @@
country = {
'AF': ('Afghanistan', (60.5284298033, 29.318572496, 75.1580277851, 38.4862816432)),
'AO': ('Angola', (11.6400960629, -17.9306364885, 24.0799052263, -4.43802336998)),
'AL': ('Albania', (19.3044861183, 39.624997667, 21.0200403175, 42.6882473822)),
'AE': ('United Arab Emirates', (51.5795186705, 22.4969475367, 56.3968473651, 26.055464179)),
'AR': ('Argentina', (-73.4154357571, -55.25, -53.628348965, -21.8323104794)),
'AM': ('Armenia', (43.5827458026, 38.7412014837, 46.5057198423, 41.2481285671)),
'AQ': ('Antarctica', (-180.0, -90.0, 180.0, -63.2706604895)),
'TF': ('Fr. S. and Antarctic Lands', (68.72, -49.775, 70.56, -48.625)),
'AU': ('Australia', (113.338953078, -43.6345972634, 153.569469029, -10.6681857235)),
'AT': ('Austria', (9.47996951665, 46.4318173285, 16.9796667823, 49.0390742051)),
'AZ': ('Azerbaijan', (44.7939896991, 38.2703775091, 50.3928210793, 41.8606751572)),
'BI': ('Burundi', (29.0249263852, -4.49998341229, 30.752262811, -2.34848683025)),
'BE': ('Belgium', (2.51357303225, 49.5294835476, 6.15665815596, 51.4750237087)),
'BJ': ('Benin', (0.772335646171, 6.14215770103, 3.79711225751, 12.2356358912)),
'BF': ('Burkina Faso', (-5.47056494793, 9.61083486576, 2.17710778159, 15.1161577418)),
'BD': ('Bangladesh', (88.0844222351, 20.670883287, 92.6727209818, 26.4465255803)),
'BG': ('Bulgaria', (22.3805257504, 41.2344859889, 28.5580814959, 44.2349230007)),
'BS': ('Bahamas', (-78.98, 23.71, -77.0, 27.04)),
'BA': ('Bosnia and Herz.', (15.7500260759, 42.65, 19.59976, 45.2337767604)),
'BY': ('Belarus', (23.1994938494, 51.3195034857, 32.6936430193, 56.1691299506)),
'BZ': ('Belize', (-89.2291216703, 15.8869375676, -88.1068129138, 18.4999822047)),
'BO': ('Bolivia', (-69.5904237535, -22.8729187965, -57.4983711412, -9.76198780685)),
'BR': ('Brazil', (-73.9872354804, -33.7683777809, -34.7299934555, 5.24448639569)),
'BN': ('Brunei', (114.204016555, 4.007636827, 115.450710484, 5.44772980389)),
'BT': ('Bhutan', (88.8142484883, 26.7194029811, 92.1037117859, 28.2964385035)),
'BW': ('Botswana', (19.8954577979, -26.8285429827, 29.4321883481, -17.6618156877)),
'CF': ('Central African Rep.', (14.4594071794, 2.2676396753, 27.3742261085, 11.1423951278)),
'CA': ('Canada', (-140.99778, 41.6751050889, -52.6480987209, 83.23324)),
'CH': ('Switzerland', (6.02260949059, 45.7769477403, 10.4427014502, 47.8308275417)),
'CL': ('Chile', (-75.6443953112, -55.61183, -66.95992, -17.5800118954)),
'CN': ('China', (73.6753792663, 18.197700914, 135.026311477, 53.4588044297)),
'CI': ('Ivory Coast', (-8.60288021487, 4.33828847902, -2.56218950033, 10.5240607772)),
'CM': ('Cameroon', (8.48881554529, 1.72767263428, 16.0128524106, 12.8593962671)),
'CD': ('Congo (Kinshasa)', (12.1823368669, -13.2572266578, 31.1741492042, 5.25608775474)),
'CG': ('Congo (Brazzaville)', (11.0937728207, -5.03798674888, 18.4530652198, 3.72819651938)),
'CO': ('Colombia', (-78.9909352282, -4.29818694419, -66.8763258531, 12.4373031682)),
'CR': ('Costa Rica', (-85.94172543, 8.22502798099, -82.5461962552, 11.2171192489)),
'CU': ('Cuba', (-84.9749110583, 19.8554808619, -74.1780248685, 23.1886107447)),
'CY': ('Cyprus', (32.2566671079, 34.5718694118, 34.0048808123, 35.1731247015)),
'CZ': ('Czech Rep.', (12.2401111182, 48.5553052842, 18.8531441586, 51.1172677679)),
'DE': ('Germany', (5.98865807458, 47.3024876979, 15.0169958839, 54.983104153)),
'DJ': ('Djibouti', (41.66176, 10.9268785669, 43.3178524107, 12.6996385767)),
'DK': ('Denmark', (8.08997684086, 54.8000145534, 12.6900061378, 57.730016588)),
'DO': ('Dominican Rep.', (-71.9451120673, 17.598564358, -68.3179432848, 19.8849105901)),
'DZ': ('Algeria', (-8.68439978681, 19.0573642034, 11.9995056495, 37.1183806422)),
'EC': ('Ecuador', (-80.9677654691, -4.95912851321, -75.2337227037, 1.3809237736)),
'EG': ('Egypt', (24.70007, 22.0, 36.86623, 31.58568)),
'ER': ('Eritrea', (36.3231889178, 12.4554157577, 43.0812260272, 17.9983074)),
'ES': ('Spain', (-9.39288367353, 35.946850084, 3.03948408368, 43.7483377142)),
'EE': ('Estonia', (23.3397953631, 57.4745283067, 28.1316992531, 59.6110903998)),
'ET': ('Ethiopia', (32.95418, 3.42206, 47.78942, 14.95943)),
'FI': ('Finland', (20.6455928891, 59.846373196, 31.5160921567, 70.1641930203)),
'FJ': ('Fiji', (-180.0, -18.28799, 180.0, -16.0208822567)),
'FK': ('Falkland Is.', (-61.2, -52.3, -57.75, -51.1)),
'FR': ('France', (-54.5247541978, 2.05338918702, 9.56001631027, 51.1485061713)),
'GA': ('Gabon', (8.79799563969, -3.97882659263, 14.4254557634, 2.32675751384)),
'GB': ('United Kingdom', (-7.57216793459, 49.959999905, 1.68153079591, 58.6350001085)),
'GE': ('Georgia', (39.9550085793, 41.0644446885, 46.6379081561, 43.553104153)),
'GH': ('Ghana', (-3.24437008301, 4.71046214438, 1.0601216976, 11.0983409693)),
'GN': ('Guinea', (-15.1303112452, 7.3090373804, -7.83210038902, 12.5861829696)),
'GM': ('Gambia', (-16.8415246241, 13.1302841252, -13.8449633448, 13.8764918075)),
'GW': ('Guinea Bissau', (-16.6774519516, 11.0404116887, -13.7004760401, 12.6281700708)),
'GQ': ('Eq. Guinea', (9.3056132341, 1.01011953369, 11.285078973, 2.28386607504)),
'GR': ('Greece', (20.1500159034, 34.9199876979, 26.6041955909, 41.8269046087)),
'GL': ('Greenland', (-73.297, 60.03676, -12.20855, 83.64513)),
'GT': ('Guatemala', (-92.2292486234, 13.7353376327, -88.2250227526, 17.8193260767)),
'GY': ('Guyana', (-61.4103029039, 1.26808828369, -56.5393857489, 8.36703481692)),
'HN': ('Honduras', (-89.3533259753, 12.9846857772, -83.147219001, 16.0054057886)),
'HR': ('Croatia', (13.6569755388, 42.47999136, 19.3904757016, 46.5037509222)),
'HT': ('Haiti', (-74.4580336168, 18.0309927434, -71.6248732164, 19.9156839055)),
'HU': ('Hungary', (16.2022982113, 45.7594811061, 22.710531447, 48.6238540716)),
'ID': ('Indonesia', (95.2930261576, -10.3599874813, 141.03385176, 5.47982086834)),
'IN': ('India', (68.1766451354, 7.96553477623, 97.4025614766, 35.4940095078)),
'IE': ('Ireland', (-9.97708574059, 51.6693012559, -6.03298539878, 55.1316222195)),
'IR': ('Iran', (44.1092252948, 25.0782370061, 63.3166317076, 39.7130026312)),
'IQ': ('Iraq', (38.7923405291, 29.0990251735, 48.5679712258, 37.3852635768)),
'IS': ('Iceland', (-24.3261840479, 63.4963829617, -13.609732225, 66.5267923041)),
'IL': ('Israel', (34.2654333839, 29.5013261988, 35.8363969256, 33.2774264593)),
'IT': ('Italy', (6.7499552751, 36.619987291, 18.4802470232, 47.1153931748)),
'JM': ('Jamaica', (-78.3377192858, 17.7011162379, -76.1996585761, 18.5242184514)),
'JO': ('Jordan', (34.9226025734, 29.1974946152, 39.1954683774, 33.3786864284)),
'JP': ('Japan', (129.408463169, 31.0295791692, 145.543137242, 45.5514834662)),
'KZ': ('Kazakhstan', (46.4664457538, 40.6623245306, 87.3599703308, 55.3852501491)),
'KE': ('Kenya', (33.8935689697, -4.67677, 41.8550830926, 5.506)),
'KG': ('Kyrgyzstan', (69.464886916, 39.2794632025, 80.2599902689, 43.2983393418)),
'KH': ('Cambodia', (102.3480994, 10.4865436874, 107.614547968, 14.5705838078)),
'KR': ('S. Korea', (126.117397903, 34.3900458847, 129.468304478, 38.6122429469)),
'KW': ('Kuwait', (46.5687134133, 28.5260627304, 48.4160941913, 30.0590699326)),
'LA': ('Laos', (100.115987583, 13.88109101, 107.564525181, 22.4647531194)),
'LB': ('Lebanon', (35.1260526873, 33.0890400254, 36.6117501157, 34.6449140488)),
'LR': ('Liberia', (-11.4387794662, 4.35575511313, -7.53971513511, 8.54105520267)),
'LY': ('Libya', (9.31941084152, 19.58047, 25.16482, 33.1369957545)),
'LK': ('Sri Lanka', (79.6951668639, 5.96836985923, 81.7879590189, 9.82407766361)),
'LS': ('Lesotho', (26.9992619158, -30.6451058896, 29.3251664568, -28.6475017229)),
'LT': ('Lithuania', (21.0558004086, 53.9057022162, 26.5882792498, 56.3725283881)),
'LU': ('Luxembourg', (5.67405195478, 49.4426671413, 6.24275109216, 50.1280516628)),
'LV': ('Latvia', (21.0558004086, 55.61510692, 28.1767094256, 57.9701569688)),
'MA': ('Morocco', (-17.0204284327, 21.4207341578, -1.12455115397, 35.7599881048)),
'MD': ('Moldova', (26.6193367856, 45.4882831895, 30.0246586443, 48.4671194525)),
'MG': ('Madagascar', (43.2541870461, -25.6014344215, 50.4765368996, -12.0405567359)),
'MX': ('Mexico', (-117.12776, 14.5388286402, -86.811982388, 32.72083)),
'MK': ('Macedonia', (20.46315, 40.8427269557, 22.9523771502, 42.3202595078)),
'ML': ('Mali', (-12.1707502914, 10.0963607854, 4.27020999514, 24.9745740829)),
'MM': ('Myanmar', (92.3032344909, 9.93295990645, 101.180005324, 28.335945136)),
'ME': ('Montenegro', (18.45, 41.87755, 20.3398, 43.52384)),
'MN': ('Mongolia', (87.7512642761, 41.5974095729, 119.772823928, 52.0473660345)),
'MZ': ('Mozambique', (30.1794812355, -26.7421916643, 40.7754752948, -10.3170960425)),
'MR': ('Mauritania', (-17.0634232243, 14.6168342147, -4.92333736817, 27.3957441269)),
'MW': ('Malawi', (32.6881653175, -16.8012997372, 35.7719047381, -9.23059905359)),
'MY': ('Malaysia', (100.085756871, 0.773131415201, 119.181903925, 6.92805288332)),
'NA': ('Namibia', (11.7341988461, -29.045461928, 25.0844433937, -16.9413428687)),
'NC': ('New Caledonia', (164.029605748, -22.3999760881, 167.120011428, -20.1056458473)),
'NE': ('Niger', (0.295646396495, 11.6601671412, 15.9032466977, 23.4716684026)),
'NG': ('Nigeria', (2.69170169436, 4.24059418377, 14.5771777686, 13.8659239771)),
'NI': ('Nicaragua', (-87.6684934151, 10.7268390975, -83.147219001, 15.0162671981)),
'NL': ('Netherlands', (3.31497114423, 50.803721015, 7.09205325687, 53.5104033474)),
'NO': ('Norway', (4.99207807783, 58.0788841824, 31.29341841, 80.6571442736)),
'NP': ('Nepal', (80.0884245137, 26.3978980576, 88.1748043151, 30.4227169866)),
'NZ': ('New Zealand', (166.509144322, -46.641235447, 178.517093541, -34.4506617165)),
'OM': ('Oman', (52.0000098, 16.6510511337, 59.8080603372, 26.3959343531)),
'PK': ('Pakistan', (60.8742484882, 23.6919650335, 77.8374507995, 37.1330309108)),
'PA': ('Panama', (-82.9657830472, 7.2205414901, -77.2425664944, 9.61161001224)),
'PE': ('Peru', (-81.4109425524, -18.3479753557, -68.6650797187, -0.0572054988649)),
'PH': ('Philippines', (117.17427453, 5.58100332277, 126.537423944, 18.5052273625)),
'PG': ('Papua New Guinea', (141.000210403, -10.6524760881, 156.019965448, -2.50000212973)),
'PL': ('Poland', (14.0745211117, 49.0273953314, 24.0299857927, 54.8515359564)),
'PR': ('Puerto Rico', (-67.2424275377, 17.946553453, -65.5910037909, 18.5206011011)),
'KP': ('N. Korea', (124.265624628, 37.669070543, 130.780007359, 42.9853868678)),
'PT': ('Portugal', (-9.52657060387, 36.838268541, -6.3890876937, 42.280468655)),
'PY': ('Paraguay', (-62.6850571357, -27.5484990374, -54.2929595608, -19.3427466773)),
'QA': ('Qatar', (50.7439107603, 24.5563308782, 51.6067004738, 26.1145820175)),
'RO': ('Romania', (20.2201924985, 43.6884447292, 29.62654341, 48.2208812526)),
'RU': ('Russia', (-180.0, 41.151416124, 180.0, 81.2504)),
'RW': ('Rwanda', (29.0249263852, -2.91785776125, 30.8161348813, -1.13465911215)),
'SA': ('Saudi Arabia', (34.6323360532, 16.3478913436, 55.6666593769, 32.161008816)),
'SD': ('Sudan', (21.93681, 8.61972971293, 38.4100899595, 22.0)),
'SS': ('S. Sudan', (23.8869795809, 3.50917, 35.2980071182, 12.2480077571)),
'SN': ('Senegal', (-17.6250426905, 12.332089952, -11.4678991358, 16.5982636581)),
'SB': ('Solomon Is.', (156.491357864, -10.8263672828, 162.398645868, -6.59933847415)),
'SL': ('Sierra Leone', (-13.2465502588, 6.78591685631, -10.2300935531, 10.0469839543)),
'SV': ('El Salvador', (-90.0955545723, 13.1490168319, -87.7235029772, 14.4241327987)),
'SO': ('Somalia', (40.98105, -1.68325, 51.13387, 12.02464)),
'RS': ('Serbia', (18.82982, 42.2452243971, 22.9860185076, 46.1717298447)),
'SR': ('Suriname', (-58.0446943834, 1.81766714112, -53.9580446031, 6.0252914494)),
'SK': ('Slovakia', (16.8799829444, 47.7584288601, 22.5581376482, 49.5715740017)),
'SI': ('Slovenia', (13.6981099789, 45.4523163926, 16.5648083839, 46.8523859727)),
'SE': ('Sweden', (11.0273686052, 55.3617373725, 23.9033785336, 69.1062472602)),
'SZ': ('Swaziland', (30.6766085141, -27.2858794085, 32.0716654803, -25.660190525)),
'SY': ('Syria', (35.7007979673, 32.312937527, 42.3495910988, 37.2298725449)),
'TD': ('Chad', (13.5403935076, 7.42192454674, 23.88689, 23.40972)),
'TG': ('Togo', (-0.0497847151599, 5.92883738853, 1.86524051271, 11.0186817489)),
'TH': ('Thailand', (97.3758964376, 5.69138418215, 105.589038527, 20.4178496363)),
'TJ': ('Tajikistan', (67.4422196796, 36.7381712916, 74.9800024759, 40.9602133245)),
'TM': ('Turkmenistan', (52.5024597512, 35.2706639674, 66.5461503437, 42.7515510117)),
'TL': ('East Timor', (124.968682489, -9.39317310958, 127.335928176, -8.27334482181)),
'TT': ('Trinidad and Tobago', (-61.95, 10.0, -60.895, 10.89)),
'TN': ('Tunisia', (7.52448164229, 30.3075560572, 11.4887874691, 37.3499944118)),
'TR': ('Turkey', (26.0433512713, 35.8215347357, 44.7939896991, 42.1414848903)),
'TW': ('Taiwan', (120.106188593, 21.9705713974, 121.951243931, 25.2954588893)),
'TZ': ('Tanzania', (29.3399975929, -11.7209380022, 40.31659, -0.95)),
'UG': ('Uganda', (29.5794661801, -1.44332244223, 35.03599, 4.24988494736)),
'UA': ('Ukraine', (22.0856083513, 44.3614785833, 40.0807890155, 52.3350745713)),
'UY': ('Uruguay', (-58.4270741441, -34.9526465797, -53.209588996, -30.1096863746)),
'US': ('United States', (-171.791110603, 18.91619, -66.96466, 71.3577635769)),
'UZ': ('Uzbekistan', (55.9289172707, 37.1449940049, 73.055417108, 45.5868043076)),
'VE': ('Venezuela', (-73.3049515449, 0.724452215982, -59.7582848782, 12.1623070337)),
'VN': ('Vietnam', (102.170435826, 8.59975962975, 109.33526981, 23.3520633001)),
'VU': ('Vanuatu', (166.629136998, -16.5978496233, 167.844876744, -14.6264970842)),
'PS': ('West Bank', (34.9274084816, 31.3534353704, 35.5456653175, 32.5325106878)),
'YE': ('Yemen', (42.6048726743, 12.5859504257, 53.1085726255, 19.0000033635)),
'ZA': ('South Africa', (16.3449768409, -34.8191663551, 32.830120477, -22.0913127581)),
'ZM': ('Zambia', (21.887842645, -17.9612289364, 33.4856876971, -8.23825652429)),
'ZW': ('Zimbabwe', (25.2642257016, -22.2716118303, 32.8498608742, -15.5077869605)),
}
def get_country_code(country_id):
if country_id in country.keys():
return country.get(country_id)
else:
return {}
@@ -0,0 +1,67 @@
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
from odoo.tools.safe_eval import safe_eval
class KsDashboardNinjaTemplate(models.Model):
_name = 'ks_dashboard_ninja.board_defined_filters'
_description = 'Dashboard Ninja Defined Filters'
name = fields.Char("Filter Label")
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard")
ks_model_id = fields.Many2one('ir.model', string='Model',
domain="[('access_ids','!=',False),('transient','=',False),"
"('model','not ilike','base_import%'),('model','not ilike','ir.%'),"
"('model','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'), ('model','not ilike','ks_to%')]",
help="Data source to fetch and read the data for the creation of dashboard items. ")
ks_domain = fields.Char(string="Domain", help="Define conditions for filter. ")
ks_domain_temp = fields.Char(string="Domain Substitute")
ks_model_name = fields.Char(related='ks_model_id.model', string="Model Name")
display_type = fields.Selection([
('line_section', "Section")], default=False, help="Technical field for UX purpose.")
sequence = fields.Integer(default=10,
help="Gives the sequence order when displaying a list of payment terms lines.")
ks_is_active = fields.Boolean(string="Active")
@api.onchange('ks_domain')
def ks_domain_onchange(self):
for rec in self:
if rec.ks_model_id:
try:
ks_domain = rec.ks_domain
if ks_domain and "%UID" in ks_domain:
ks_domain = ks_domain.replace('"%UID"', str(self.env.user.id))
if ks_domain and "%MYCOMPANY" in ks_domain:
ks_domain = ks_domain.replace('"%MYCOMPANY"', str(self.env.company.id))
self.env[rec.ks_model_id.model].search_count(safe_eval(ks_domain))
except Exception as e:
raise ValidationError(_("Something went wrong . Possibly it is due to wrong input type for domain"))
@api.constrains('ks_domain', 'ks_model_id')
def ks_domain_check(self):
for rec in self:
if rec.ks_model_id and not rec.ks_domain:
raise ValidationError(_("Domain can not be empty"))
class KsDashboardNinjaTemplate(models.Model):
_name = 'ks_dashboard_ninja.board_custom_filters'
_description = 'Dashboard Ninja Custom Filters'
name = fields.Char("Filter Label")
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard")
ks_model_id = fields.Many2one('ir.model', string='Model',
domain="[('access_ids','!=',False),('transient','=',False),"
"('model','not ilike','base_import%'),('model','not ilike','ir.%'),"
"('model','not ilike','web_editor.%'),('model','not ilike','web_tour.%'),"
"('model','!=','mail.thread'),('model','not ilike','ks_dash%'), ('model','not ilike','ks_to%')]",
help="Data source to fetch and read the data for the creation of dashboard items. ")
ks_domain_field_id = fields.Many2one('ir.model.fields',
domain="[('model_id','=',ks_model_id),"
"('name','!=','id'),('store','=',True),"
"('ttype', 'in', ['boolean', 'char', "
"'date', 'datetime', 'float', 'integer', 'html', 'many2many', "
"'many2one', 'monetary', 'one2many', 'text', 'selection'])]",
string="Domain Field")
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,41 @@
from odoo import models, fields, api, _
class KsDashboardNinjaTemplate(models.Model):
_name = 'ks_dashboard_ninja.board_template'
_description = 'Dashboard Ninja Template'
name = fields.Char()
ks_gridstack_config = fields.Char()
ks_item_count = fields.Integer()
ks_template_type = fields.Selection([('ks_default', 'Predefined'), ('ks_custom', 'Custom')],
string="Template Format")
ks_dashboard_item_ids = fields.One2many('ks_dashboard_ninja.item', 'ks_dashboard_board_template_id',
string="Template Type")
ks_dashboard_board_id = fields.Many2one('ks_dashboard_ninja.board', string="Dashboard", help="""
Items Configuration and their position in the dashboard will be copied from the selected dashboard
and will be saved as template.
""")
@api.model_create_multi
def create(self, vals_list):
for val in vals_list:
if val.get('ks_template_type', False) and val.get('ks_dashboard_board_id', False):
dashboard_id = self.env['ks_dashboard_ninja.board'].browse(val.get('ks_dashboard_board_id'))
val['ks_gridstack_config'] = dashboard_id.ks_gridstack_config
val['ks_item_count'] = len(dashboard_id.ks_dashboard_items_ids)
val['ks_dashboard_item_ids'] = [(4, x.copy({'ks_dashboard_ninja_board_id': False}).id) for x in
dashboard_id.ks_dashboard_items_ids]
recs = super(KsDashboardNinjaTemplate, self).create(vals_list)
return recs
def write(self, val):
if val.get('ks_dashboard_board_id', False):
dashboard_id = self.env['ks_dashboard_ninja.board'].browse(val.get('ks_dashboard_board_id'))
val['ks_gridstack_config'] = dashboard_id.ks_gridstack_config
val['ks_item_count'] = len(dashboard_id.ks_dashboard_items_ids)
val['ks_dashboard_item_ids'] = [(6, 0,
[x.copy({'ks_dashboard_ninja_board_id': False}).id for x in
dashboard_id.ks_dashboard_items_ids])]
recs = super(KsDashboardNinjaTemplate, self).write(val)
return recs
@@ -0,0 +1,141 @@
import json
from odoo import models, fields, api, _
import copy
import re
from odoo.exceptions import ValidationError, UserError
class KsDashboardNinjaItems(models.Model):
_inherit = 'ks_dashboard_ninja.item'
ks_to_do_preview = fields.Char("To Do Preview", default="To Do Preview")
ks_dn_header_lines = fields.One2many('ks_to.do.headers', 'ks_dn_item_id')
ks_to_do_data = fields.Char(string="To Do Data in JSon", compute='ks_get_to_do_view_data', compute_sudo=False)
ks_header_bg_color = fields.Char(string="Header Background Color", default="#8e24aa,0.99",
help=' Select the background color with transparency. ')
@api.depends('ks_dn_header_lines', 'ks_dashboard_item_type')
def ks_get_to_do_view_data(self):
for rec in self:
ks_to_do_data = rec._ksGetToDOData()
rec.ks_to_do_data = ks_to_do_data
def _ksGetToDOData(self):
ks_to_do_data = {
'label': [],
'ks_link': [],
'ks_href_id': [],
'ks_section_id': [],
'ks_content': {},
'ks_content_record_id': {},
'ks_content_active': {}
}
if self.ks_dn_header_lines:
for ks_dn_header_line in self.ks_dn_header_lines:
ks_to_do_header_label = ks_dn_header_line.ks_to_do_header[:]
ks_to_do_data['label'].append(ks_to_do_header_label)
ks_dn_header_line_id = str(ks_dn_header_line.id)
if type(ks_dn_header_line.id).__name__ != 'int' and ks_dn_header_line.id.ref != None:
ks_dn_header_line_id = ks_dn_header_line.id.ref
if ' ' in ks_dn_header_line.ks_to_do_header:
ks_temp = ks_dn_header_line.ks_to_do_header.replace(" ", "")
ks_to_do_data['ks_link'].append('#' + ks_temp + ks_dn_header_line_id)
ks_to_do_data['ks_href_id'].append(ks_temp + str(ks_dn_header_line.id))
elif ks_dn_header_line.ks_to_do_header[0].isdigit():
ks_temp = ks_dn_header_line.ks_to_do_header.replace(
ks_dn_header_line.ks_to_do_header[0], 'z')
ks_to_do_data['ks_link'].append('#' + ks_temp + ks_dn_header_line_id)
ks_to_do_data['ks_href_id'].append(ks_temp + str(ks_dn_header_line.id))
else:
ks_to_do_data['ks_link'].append('#' + ks_dn_header_line.ks_to_do_header + ks_dn_header_line_id)
ks_to_do_data['ks_href_id'].append(ks_dn_header_line.ks_to_do_header + str(ks_dn_header_line.id))
ks_to_do_data['ks_section_id'].append(str(ks_dn_header_line.id))
if len(ks_dn_header_line.ks_to_do_description_lines):
for ks_to_do_description_line in ks_dn_header_line.ks_to_do_description_lines:
if ' ' in ks_dn_header_line.ks_to_do_header or ks_dn_header_line.ks_to_do_header[0].isdigit():
if ks_to_do_data['ks_content'].get(ks_temp +
str(ks_dn_header_line.id), False):
ks_to_do_data['ks_content'][ks_temp +
str(ks_dn_header_line.id)].append(
ks_to_do_description_line.ks_description)
ks_to_do_data['ks_content_record_id'][ks_temp +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.id))
ks_to_do_data['ks_content_active'][ks_temp +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.ks_active))
else:
ks_to_do_data['ks_content'][ks_temp +
str(ks_dn_header_line.id)] = [
ks_to_do_description_line.ks_description]
ks_to_do_data['ks_content_record_id'][ks_temp +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.id)]
ks_to_do_data['ks_content_active'][ks_temp +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.ks_active)]
else:
if ks_to_do_data['ks_content'].get(ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id), False):
ks_to_do_data['ks_content'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)].append(
ks_to_do_description_line.ks_description)
ks_to_do_data['ks_content_record_id'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.id))
ks_to_do_data['ks_content_active'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)].append(
str(ks_to_do_description_line.ks_active))
else:
ks_to_do_data['ks_content'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)] = [
ks_to_do_description_line.ks_description]
ks_to_do_data['ks_content_record_id'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.id)]
ks_to_do_data['ks_content_active'][ks_dn_header_line.ks_to_do_header +
str(ks_dn_header_line.id)] = [
str(ks_to_do_description_line.ks_active)]
ks_to_do_data = json.dumps(ks_to_do_data)
else:
ks_to_do_data = False
return ks_to_do_data
class KsToDoheaders(models.Model):
_name = 'ks_to.do.headers'
_description = "to do headers"
ks_dn_item_id = fields.Many2one('ks_dashboard_ninja.item')
ks_to_do_header = fields.Char('Header')
ks_to_do_description_lines = fields.One2many('ks_to.do.description', 'ks_to_do_header_id')
@api.constrains('ks_to_do_header')
def ks_to_do_header_check(self):
for rec in self:
if rec.ks_to_do_header:
ks_check = bool(re.match('^[A-Z, a-z,0-9,_]+$', rec.ks_to_do_header))
if not ks_check:
raise ValidationError(_("Special characters are not allowed only string and digits allow for section header"))
@api.onchange('ks_to_do_header')
def ks_to_do_header_onchange(self):
for rec in self:
if rec.ks_to_do_header:
ks_check = bool(re.match('^[A-Z, a-z,0-9,_]+$', rec.ks_to_do_header))
if not ks_check:
raise ValidationError(_("Special characters are not allowed only string and digits allow for section header"))
class KsToDODescription(models.Model):
_name = 'ks_to.do.description'
_description = 'to do description'
ks_to_do_header_id = fields.Many2one('ks_to.do.headers')
ks_description = fields.Text('Description')
ks_active = fields.Boolean('Active Description', default=True)
@@ -0,0 +1,30 @@
import base64
import logging
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class KsDashboardNInjaImport(models.TransientModel):
_name = 'ks_dashboard_ninja.import'
_description = 'Import Dashboard'
ks_import_dashboard = fields.Binary(string="Upload Dashboard", attachment=True)
ks_top_menu_id = fields.Many2one('ir.ui.menu', string="Show Under Menu", domain="[('parent_id','=',False)]",
required=True,
default=lambda self: self.env['ir.ui.menu'].search(
[('name', '=', 'My Dashboard')]))
def ks_do_action(self):
for rec in self:
try:
ks_result = base64.b64decode(rec.ks_import_dashboard)
self.env['ks_dashboard_ninja.board'].ks_import_dashboard(ks_result, self.ks_top_menu_id)
return {
'type': 'ir.actions.client',
'tag': 'reload',
}
except Exception as E:
_logger.warning(E)
raise ValidationError(_(E))
@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import UserError, ValidationError
class KsDashboardNinjaBoardItemAction(models.TransientModel):
_name = 'ks_ninja_dashboard.item_action'
_description = 'Dashboard Ninja Item Actions'
name = fields.Char()
ks_dashboard_item_ids = fields.Many2many("ks_dashboard_ninja.item", string="Dashboard Items")
ks_action = fields.Selection([('move', 'Move'),
('duplicate', 'Duplicate'),
], string="Action")
ks_dashboard_ninja_id = fields.Many2one("ks_dashboard_ninja.board", string="Select Dashboard")
ks_dashboard_ninja_ids = fields.Many2many("ks_dashboard_ninja.board", string="Select Dashboards")
# Move or Copy item to another dashboard action
def action_item_move_copy_action(self):
if self.ks_action == 'move':
for item in self.ks_dashboard_item_ids:
item.ks_dashboard_ninja_board_id = self.ks_dashboard_ninja_id
elif self.ks_action == 'duplicate':
# Using sudo here to allow creating same item without any security error
for dashboard_id in self.ks_dashboard_ninja_ids:
for item in self.ks_dashboard_item_ids:
item.sudo().copy({'ks_dashboard_ninja_board_id': dashboard_id.id})
+31
View File
@@ -0,0 +1,31 @@
import base64
import logging
import requests
import json
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class KsAIDashboardFetch(models.TransientModel):
_name = 'ks_dashboard_ninja.fetch_key'
_description = 'Fetch API key'
ks_email_id = fields.Char(string="Email ID")
ks_api_key =fields.Char(string="Generated AI API Key")
ks_show_api_key = fields.Boolean(string="Show key",default=False)
def ks_fetch_details(self):
url = self.env['ir.config_parameter'].sudo().get_param(
'ks_dashboard_ninja.url')
if url and self.ks_email_id:
url = url + "/api/v1/ks_dn_fetch_api"
json_data = {'email':self.ks_email_id}
ks_ai_response = requests.post(url,data=json_data)
if ks_ai_response.status_code == 200:
ks_ai_response = json.loads(ks_ai_response.text)
self.ks_api_key = ks_ai_response
self.ks_show_api_key = True
else:
raise ValidationError(_("Error generates with following status %s"),ks_ai_response.status_code)
+50
View File
@@ -0,0 +1,50 @@
from odoo import api, fields, models,_
from odoo.exceptions import ValidationError
import requests
import json
class ResConfig(models.TransientModel):
_inherit = "res.config.settings"
dn_api_key = fields.Char(string="Dashboard AI API Key",store=True,
config_parameter='ks_dashboard_ninja.dn_api_key')
url = fields.Char(string="URL", store=True,
config_parameter="ks_dashboard_ninja.url")
ks_email_id = fields.Char(string="Email ID",store=True,config_parameter="ks_dashboard_ninja.ks_email_id")
def Open_wizard(self):
if self.url and self.ks_email_id:
try:
url = self.url + "/api/v1/ks_dn_fetch_api"
json_data = {'email':self.ks_email_id,
'url':self.env['ir.config_parameter'].sudo().get_param('web.base.url'),
'db_name':self.env.cr.dbname
}
ks_ai_response = requests.post(url,data=json_data)
except Exception as e:
raise ValidationError(_("Please enter correct URL"))
if ks_ai_response.status_code == 200:
try:
ks_ai_response = json.loads(ks_ai_response.text)
except Exception as e:
ks_ai_response = False
if ks_ai_response == "success":
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('Success'),
'message': 'API key sent on Email ID',
'sticky': False,
}
}
elif ks_ai_response == 'key already generated':
raise ValidationError(
_("key already generated.If you need assistance, feel free to contact at sales@ksolves.com"))
else:
raise ValidationError(_("Some problem in sending request. If you need assistance, feel free to contact at sales@ksolves.com"))
else:
raise ValidationError(_("Either you have entered wrong URL path or there is some problem in sending request. If you need assistance, feel free to contact at sales@ksolves.com"))
else:
raise ValidationError(_("Please enter URL and Email ID"))
+26
View File
@@ -0,0 +1,26 @@
# TODO
## 后端部分
1. ks_dashboard_ninja_items.py
注释了
- fields.Many2many.read = ks_read
ks_read中使用了废弃方法_generate_order_by,建议替换为_order_to_sql,但是替换后无法运行服务
- read_group = models.BaseModel._read_group_process_groupby
17版本已删除read_group_process_groupby方法
2. xml中的attrs
使用脚本一键升级,结果不太准确
## 前端部分
1. AI相关内容
2. 日期筛选功能
3. 除tile layout1外的其余图表皆未实现
4. 表单中的预览小部件
5. 颜色选择等小部件
6. 图表顶部的快捷功能
7. 图表点击跳转功能
8. 列表分页
+2
View File
@@ -0,0 +1,2 @@
pandas==2.0.3
xlrd==1.2.0
@@ -0,0 +1,35 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_ks_dashboard_ninja_board,ks_dashboard_ninja.board,model_ks_dashboard_ninja_board,,1,1,1,1
access_ks_dashboard_ninja_kpi_mail,ks_dashboard_ninja.kpi_mail,model_ks_dashboard_ninja_kpi_mail,,1,1,1,1
access_ks_dashboard_ninja_item,ks_dashboard_ninja.item,model_ks_dashboard_ninja_item,,1,1,1,1
access_ks_to_do_headers,ks_to.do.headers,model_ks_to_do_headers,,1,1,1,1
access_ks_to_do_description,ks_to.do.description,model_ks_to_do_description,,1,1,1,1
access_ks_dashboard_ninja_child_board,ks_dashboard_ninja.child_board,model_ks_dashboard_ninja_child_board,,1,1,1,1
access_ks_dashboard_ninja_board_defined_filters,ks_dashboard_ninja.board_defined_filters,model_ks_dashboard_ninja_board_defined_filters,,1,1,1,1
access_ks_dashboard_ninja_board_custom_filters,ks_dashboard_ninja.board_custom_filters,model_ks_dashboard_ninja_board_custom_filters,,1,1,1,1
access_ks_dashboard_ninja_board_template,ks_dashboard_ninja.board_template,model_ks_dashboard_ninja_board_template,,1,1,1,1
access_ks_dashboard_ninja_item_goal,ks_dashboard_ninja_item_goal,model_ks_dashboard_ninja_item_goal,,1,1,1,1
access_ks_dashboard_ninja_item_action,ks_dashboard_ninja_item_action,model_ks_dashboard_ninja_item_action,,1,1,1,1
access_ks_dashboard_item_multiplier,ks_dashboard_item.multiplier,model_ks_dashboard_item_multiplier,,1,1,1,1
access_ks_ninja_dashboard_item_action,ks_ninja_dashboard.item_action,model_ks_ninja_dashboard_item_action,,1,1,1,0
access_ks_dashboard_group_by,ks.dashboard.group.by,model_ks_dashboard_group_by,,1,1,1,1
access_ks_dashboard_csv_group_by,ks.dashboard.csv.group.by,model_ks_dashboard_csv_group_by,,1,1,1,1
access_ks_dashboard_new,ks.dashboard.new,model_ks_dashboard_new,,1,1,1,1
access_ks_dashboard_csv_new,ks.dashboard.csv.new,model_ks_dashboard_csv_new,,1,1,1,1
access_ks_dashboard_ninja_import,ks_dashboard_ninja.import,model_ks_dashboard_ninja_import,base.group_system,1,1,1,0
access_ir_actions_act_window_view,ir.actions.act_window.view,base.model_ir_actions_act_window_view,,1,0,0,0
access_ir_actions_act_window,ir.actions.act_window,base.model_ir_actions_act_window,,1,0,0,0
access_ir_actions_client,ir.actions.client,base.model_ir_actions_client,,1,0,0,0
access_ir_ui_menu,ir.ui.menu,base.model_ir_ui_menu,,1,1,0,0
access_ir_model_group_user,ir.model,base.model_ir_model,base.group_user,1,0,0,0
access_ir_model_fields_group_user,ir.model.fields,base.model_ir_model_fields,base.group_user,1,0,0,0
access_ir_model_ks_dashboard_wizard,ks_dashboard_wizard,model_ks_dashboard_wizard,,1,1,1,1
access_ir_model_ks_duplicate_dashboard_wizard,ks_duplicate_dashboard__wizard,model_ks_dashboard_duplicate_wizard,,1,1,1,1
access_ir_model_ks_delete_dashboard_wizard,ks_delete_dashboard__wizard,model_ks_dashboard_delete_wizard,,1,1,1,1
access_ks_dashboard_ninja_arti_int,ks_dashboard_ninja.arti_int,model_ks_dashboard_ninja_arti_int,,1,1,1,1
access_ks_dashboard_ninja_ai_dashboard,ks_dashboard_ninja.ai_dashboard,model_ks_dashboard_ninja_ai_dashboard,,1,1,1,1
access_ks_dashboard_ninja_fetch_key,ks_dashboard_ninja.fetch_key,model_ks_dashboard_ninja_fetch_key,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_ks_dashboard_ninja_board ks_dashboard_ninja.board model_ks_dashboard_ninja_board 1 1 1 1
3 access_ks_dashboard_ninja_kpi_mail ks_dashboard_ninja.kpi_mail model_ks_dashboard_ninja_kpi_mail 1 1 1 1
4 access_ks_dashboard_ninja_item ks_dashboard_ninja.item model_ks_dashboard_ninja_item 1 1 1 1
5 access_ks_to_do_headers ks_to.do.headers model_ks_to_do_headers 1 1 1 1
6 access_ks_to_do_description ks_to.do.description model_ks_to_do_description 1 1 1 1
7 access_ks_dashboard_ninja_child_board ks_dashboard_ninja.child_board model_ks_dashboard_ninja_child_board 1 1 1 1
8 access_ks_dashboard_ninja_board_defined_filters ks_dashboard_ninja.board_defined_filters model_ks_dashboard_ninja_board_defined_filters 1 1 1 1
9 access_ks_dashboard_ninja_board_custom_filters ks_dashboard_ninja.board_custom_filters model_ks_dashboard_ninja_board_custom_filters 1 1 1 1
10 access_ks_dashboard_ninja_board_template ks_dashboard_ninja.board_template model_ks_dashboard_ninja_board_template 1 1 1 1
11 access_ks_dashboard_ninja_item_goal ks_dashboard_ninja_item_goal model_ks_dashboard_ninja_item_goal 1 1 1 1
12 access_ks_dashboard_ninja_item_action ks_dashboard_ninja_item_action model_ks_dashboard_ninja_item_action 1 1 1 1
13 access_ks_dashboard_item_multiplier ks_dashboard_item.multiplier model_ks_dashboard_item_multiplier 1 1 1 1
14 access_ks_ninja_dashboard_item_action ks_ninja_dashboard.item_action model_ks_ninja_dashboard_item_action 1 1 1 0
15 access_ks_dashboard_group_by ks.dashboard.group.by model_ks_dashboard_group_by 1 1 1 1
16 access_ks_dashboard_csv_group_by ks.dashboard.csv.group.by model_ks_dashboard_csv_group_by 1 1 1 1
17 access_ks_dashboard_new ks.dashboard.new model_ks_dashboard_new 1 1 1 1
18 access_ks_dashboard_csv_new ks.dashboard.csv.new model_ks_dashboard_csv_new 1 1 1 1
19 access_ks_dashboard_ninja_import ks_dashboard_ninja.import model_ks_dashboard_ninja_import base.group_system 1 1 1 0
20 access_ir_actions_act_window_view ir.actions.act_window.view base.model_ir_actions_act_window_view 1 0 0 0
21 access_ir_actions_act_window ir.actions.act_window base.model_ir_actions_act_window 1 0 0 0
22 access_ir_actions_client ir.actions.client base.model_ir_actions_client 1 0 0 0
23 access_ir_ui_menu ir.ui.menu base.model_ir_ui_menu 1 1 0 0
24 access_ir_model_group_user ir.model base.model_ir_model base.group_user 1 0 0 0
25 access_ir_model_fields_group_user ir.model.fields base.model_ir_model_fields base.group_user 1 0 0 0
26 access_ir_model_ks_dashboard_wizard ks_dashboard_wizard model_ks_dashboard_wizard 1 1 1 1
27 access_ir_model_ks_duplicate_dashboard_wizard ks_duplicate_dashboard__wizard model_ks_dashboard_duplicate_wizard 1 1 1 1
28 access_ir_model_ks_delete_dashboard_wizard ks_delete_dashboard__wizard model_ks_dashboard_delete_wizard 1 1 1 1
29 access_ks_dashboard_ninja_arti_int ks_dashboard_ninja.arti_int model_ks_dashboard_ninja_arti_int 1 1 1 1
30 access_ks_dashboard_ninja_ai_dashboard ks_dashboard_ninja.ai_dashboard model_ks_dashboard_ninja_ai_dashboard 1 1 1 1
31 access_ks_dashboard_ninja_fetch_key ks_dashboard_ninja.fetch_key model_ks_dashboard_ninja_fetch_key 1 1 1 1
@@ -0,0 +1,31 @@
<odoo>
<data noupdate="1">
<record id="ir_rule_ks_dashboard_item_company_restrictions" model="ir.rule">
<field name="name">Dashboard Item Company Restriction: User Can only view their company and sub companies
items.
</field>
<field name="model_id" ref="model_ks_dashboard_ninja_item"/>
<field name="domain_force">
['|',('ks_company_id','in', company_ids),('ks_company_id','=',False)]</field>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
</record>
<record model="ir.module.category" id="ks_dashboard_ninja_security_groups">
<field name="name">Dashboard Ninja Rights</field>
</record>
<record model="res.groups" id="ks_dashboard_ninja_group_manager">
<field name="name">Show Full Dashboard Features</field>
<field name="category_id" ref="ks_dashboard_ninja.ks_dashboard_ninja_security_groups"/>
</record>
<record id="base.group_system" model="res.groups">
<field name="implied_ids" eval="[(4, ref('ks_dashboard_ninja.ks_dashboard_ninja_group_manager'))]"/>
</record>
</data>
</odoo>
Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

@@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.33398 19.9997C3.33398 12.1429 3.33398 8.21456 5.77476 5.77378C8.21554 3.33301 12.1439 3.33301 20.0007 3.33301C27.8574 3.33301 31.7858 3.33301 34.2265 5.77378C36.6673 8.21456 36.6673 12.1429 36.6673 19.9997C36.6673 27.8564 36.6673 31.7848 34.2265 34.2256C31.7858 36.6663 27.8574 36.6663 20.0007 36.6663C12.1439 36.6663 8.21554 36.6663 5.77476 34.2256C3.33398 31.7848 3.33398 27.8564 3.33398 19.9997Z" stroke="#1C1C1C" stroke-width="2"/>
<path d="M11.666 23.3337L14.6608 19.7399C15.8476 18.3158 16.4409 17.6037 17.2216 17.6037C18.0022 17.6037 18.5956 18.3158 19.7823 19.7399L20.2164 20.2608C21.4031 21.6849 21.9965 22.3969 22.7771 22.3969C23.5578 22.3969 24.1511 21.6849 25.3379 20.2608L28.3327 16.667" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 875 B

+6
View File
@@ -0,0 +1,6 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.33398 19.9997C3.33398 12.1429 3.33398 8.21456 5.77476 5.77378C8.21554 3.33301 12.1439 3.33301 20.0007 3.33301C27.8574 3.33301 31.7858 3.33301 34.2265 5.77378C36.6673 8.21456 36.6673 12.1429 36.6673 19.9997C36.6673 27.8564 36.6673 31.7848 34.2265 34.2256C31.7858 36.6663 27.8574 36.6663 20.0007 36.6663C12.1439 36.6663 8.21554 36.6663 5.77476 34.2256C3.33398 31.7848 3.33398 27.8564 3.33398 19.9997Z" stroke="#1C1C1C" stroke-width="2"/>
<path d="M11.666 30V15" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M20 30V10" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M28.334 30.0003V21.667" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 805 B

@@ -0,0 +1,6 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.334 21.667C14.2545 21.667 15.0007 20.9208 15.0007 20.0003C15.0007 19.0799 14.2545 18.3337 13.334 18.3337C12.4135 18.3337 11.6673 19.0799 11.6673 20.0003C11.6673 20.9208 12.4135 21.667 13.334 21.667Z" fill="#1C1C1C"/>
<path d="M21.6673 20.0003C21.6673 20.9208 20.9211 21.667 20.0007 21.667C19.0802 21.667 18.334 20.9208 18.334 20.0003C18.334 19.0799 19.0802 18.3337 20.0007 18.3337C20.9211 18.3337 21.6673 19.0799 21.6673 20.0003Z" fill="#1C1C1C"/>
<path d="M26.6673 21.667C27.5878 21.667 28.334 20.9208 28.334 20.0003C28.334 19.0799 27.5878 18.3337 26.6673 18.3337C25.7468 18.3337 25.0007 19.0799 25.0007 20.0003C25.0007 20.9208 25.7468 21.667 26.6673 21.667Z" fill="#1C1C1C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5733 5.41699C13.5104 5.41697 11.0843 5.41695 9.18561 5.67222C7.23158 5.93493 5.65 6.48846 4.40272 7.73573C3.15545 8.983 2.60192 10.5646 2.33921 12.5186C2.08394 14.4173 2.08396 16.8434 2.08398 19.9063V20.0944C2.08396 23.1573 2.08394 25.5833 2.33921 27.482C2.60192 29.4361 3.15545 31.0177 4.40272 32.2649C5.65 33.5122 7.23158 34.0657 9.18561 34.3284C11.0843 34.5837 13.5103 34.5837 16.5732 34.5837H23.428C26.4909 34.5837 28.917 34.5837 30.8157 34.3284C32.7697 34.0657 34.3513 33.5122 35.5986 32.2649C36.8459 31.0177 37.3994 29.4361 37.6621 27.482C37.9174 25.5834 37.9173 23.1573 37.9173 20.0944V19.9063C37.9173 16.8434 37.9174 14.4173 37.6621 12.5186C37.3994 10.5646 36.8459 8.983 35.5986 7.73573C34.3513 6.48846 32.7697 5.93493 30.8157 5.67222C28.917 5.41695 26.491 5.41697 23.428 5.41699H16.5733ZM6.17049 9.5035C6.87584 8.79815 7.84192 8.37537 9.51873 8.14993C11.2315 7.91965 13.4893 7.91699 16.6673 7.91699H23.334C26.512 7.91699 28.7698 7.91965 30.4826 8.14993C32.1594 8.37537 33.1255 8.79815 33.8308 9.5035C34.5362 10.2088 34.9589 11.1749 35.1844 12.8517C35.4147 14.5645 35.4173 16.8223 35.4173 20.0003C35.4173 23.1784 35.4147 25.4361 35.1844 27.1489C34.9589 28.8257 34.5362 29.7918 33.8308 30.4972C33.1255 31.2025 32.1594 31.6253 30.4826 31.8507C28.7698 32.081 26.512 32.0837 23.334 32.0837H16.6673C13.4893 32.0837 11.2315 32.081 9.51873 31.8507C7.84192 31.6253 6.87584 31.2025 6.17049 30.4972C5.46514 29.7918 5.04236 28.8257 4.81692 27.1489C4.58664 25.4361 4.58399 23.1784 4.58399 20.0003C4.58399 16.8223 4.58664 14.5645 4.81692 12.8517C5.04236 11.1749 5.46514 10.2088 6.17049 9.5035Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.0007 2.08301C10.1055 2.08301 2.08398 10.1046 2.08398 19.9997C2.08398 29.8948 10.1055 37.9163 20.0007 37.9163C29.8958 37.9163 37.9173 29.8948 37.9173 19.9997C37.9173 10.1046 29.8958 2.08301 20.0007 2.08301ZM4.58398 19.9997C4.58398 16.1925 5.96405 12.7076 8.25121 10.018L13.5887 15.3554C12.6421 16.66 12.084 18.2647 12.084 19.9997C12.084 21.7347 12.6421 23.3394 13.5886 24.6439L8.2512 29.9813C5.96405 27.2918 4.58398 23.8069 4.58398 19.9997ZM15.3564 13.5877L10.019 8.25023C12.7086 5.96307 16.1934 4.58301 20.0007 4.58301C23.8079 4.58301 27.2927 5.96307 29.9823 8.25023L24.6449 13.5877C23.3403 12.6411 21.7357 12.083 20.0007 12.083C18.2656 12.083 16.661 12.6411 15.3564 13.5877ZM10.019 31.7491C12.7086 34.0363 16.1934 35.4163 20.0007 35.4163C23.8079 35.4163 27.2927 34.0363 29.9823 31.7491L24.6449 26.4117C23.3403 27.3582 21.7357 27.9163 20.0007 27.9163C18.2656 27.9163 16.661 27.3582 15.3564 26.4117L10.019 31.7491ZM26.4127 24.6439L31.7501 29.9813C34.0373 27.2918 35.4173 23.8069 35.4173 19.9997C35.4173 16.1925 34.0373 12.7076 31.7501 10.018L26.4126 15.3554C27.3592 16.66 27.9173 18.2647 27.9173 19.9997C27.9173 21.7347 27.3592 23.3394 26.4127 24.6439ZM14.584 19.9997C14.584 17.0081 17.0091 14.583 20.0007 14.583C22.9922 14.583 25.4173 17.0081 25.4173 19.9997C25.4173 22.9912 22.9922 25.4163 20.0007 25.4163C17.0091 25.4163 14.584 22.9912 14.584 19.9997Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,6 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.76044 33.0423L6.761 33.0428C6.82645 33.1093 6.89234 33.1752 6.95866 33.2405L6.95913 33.241C10.8038 37.0329 17.4193 34.2692 17.4193 28.7803V22.582H11.2211C5.73227 22.582 2.96851 29.1976 6.76044 33.0423ZM17.4193 20.582H11.2211C4.00159 20.582 0.266883 29.3066 5.33649 34.4467C5.40873 34.52 5.48147 34.5927 5.55472 34.6649C10.6948 39.7345 19.4193 35.9998 19.4193 28.7803V22.582V20.582H17.4193Z" fill="#1C1C1C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.4221 6.41028C30.3447 3.37612 25.0176 5.58641 25.0176 10.0103V14.9824H29.9898C34.415 14.9824 36.6243 9.65289 33.5898 6.57783M25.0176 16.9824H29.9898C36.1381 16.9824 39.3319 9.54851 35.0129 5.17258C34.9512 5.11006 34.889 5.04795 34.8265 4.98625C30.4488 0.669851 23.0176 3.86251 23.0176 10.0103V14.9824V16.9824H25.0176ZM33.4222 6.41039C33.4783 6.46572 33.5341 6.52143 33.5895 6.5775L33.4222 6.41039Z" fill="#1C1C1C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.0176 22.4424V20.4424H25.0176H28.2789C32.9246 20.4424 35.3475 26.0624 32.0827 29.3675C32.0357 29.415 31.9885 29.4623 31.9409 29.5092C28.634 32.7704 23.0176 30.3481 23.0176 25.7036V22.4424ZM30.6598 27.962C30.6188 28.0035 30.5775 28.0448 30.536 28.0858L30.6598 27.962ZM30.536 28.0858C28.5346 30.0585 25.0176 28.6316 25.0176 25.7036V22.4424H28.2789C31.2089 22.4424 32.6341 25.9626 30.6603 27.9615" fill="#1C1C1C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.1211 15.6758L21.1211 17.6758L19.1211 17.6758L14.9191 17.6758C9.44285 17.6758 6.58673 11.051 10.4352 7.15495C10.4906 7.09892 10.5463 7.04325 10.6023 6.98795C14.5006 3.14365 21.1211 5.99903 21.1211 11.474L21.1211 15.6758ZM11.8576 8.56092C9.30016 11.1508 11.1585 15.6758 14.9191 15.6758L19.1211 15.6758L19.1211 11.474C19.1211 7.7152 14.5992 5.85532 12.0067 8.41198C11.9569 8.46113 11.9074 8.51062 11.8581 8.56045" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.1515 36.6663C20.7543 36.6663 21.3324 36.4269 21.7586 36.0007C22.1848 35.5745 22.4242 34.9964 22.4242 34.3936V25.583L34.1894 11.7876C34.5283 11.4854 34.8018 11.1172 34.9933 10.7055C35.1848 10.2939 35.2902 9.84745 35.303 9.39361C35.303 5.45422 27.5 3.33301 20.1515 3.33301C12.803 3.33301 5 5.45422 5 9.39361C5.01451 9.84897 5.12137 10.2966 5.31411 10.7095C5.50684 11.1223 5.78143 11.4916 6.12121 11.7951L17.8788 25.583V34.3936C17.8788 34.9964 18.1182 35.5745 18.5445 36.0007C18.9707 36.4269 19.5487 36.6663 20.1515 36.6663ZM20.303 4.99967C28.3409 4.99967 33.3333 7.2421 33.3333 9.39361C33.3096 9.77448 33.1604 10.1368 32.9091 10.4239L32.697 10.6739C31.0152 12.4239 26.5985 13.333 20.1515 13.333C13.7045 13.333 9.18182 12.4239 7.5 10.6815L7.25758 10.4012C7.01389 10.1196 6.87007 9.76538 6.84848 9.39361C6.84848 7.2421 12.2652 4.99967 20.303 4.99967ZM9.93939 13.9391C13.2406 14.9867 16.6884 15.4982 20.1515 15.4542C23.6147 15.4982 27.0624 14.9867 30.3636 13.9391L21.0909 24.8103C20.9736 24.9475 20.9091 25.1221 20.9091 25.3027V34.3936C20.9091 34.5945 20.8293 34.7872 20.6872 34.9293C20.5451 35.0714 20.3524 35.1512 20.1515 35.1512C19.9506 35.1512 19.7579 35.0714 19.6158 34.9293C19.4738 34.7872 19.3939 34.5945 19.3939 34.3936V25.3027C19.394 25.1221 19.3295 24.9475 19.2121 24.8103L9.93939 13.9391Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,6 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.33398 19.9997C3.33398 12.1429 3.33398 8.21456 5.77476 5.77378C8.21554 3.33301 12.1439 3.33301 20.0007 3.33301C27.8574 3.33301 31.7858 3.33301 34.2265 5.77378C36.6673 8.21456 36.6673 12.1429 36.6673 19.9997C36.6673 27.8564 36.6673 31.7848 34.2265 34.2256C31.7858 36.6663 27.8574 36.6663 20.0007 36.6663C12.1439 36.6663 8.21554 36.6663 5.77476 34.2256C3.33398 31.7848 3.33398 27.8564 3.33398 19.9997Z" stroke="#1C1C1C" stroke-width="2"/>
<path d="M12.5 11.667L17.5 11.667" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M12.5 20H22.5" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M12.5 28.334H27.5" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 815 B

+6
View File
@@ -0,0 +1,6 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3 4H36.3333" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M14.666 18.1673L16.8208 16.0125C17.3764 15.4569 17.6542 15.1792 17.9993 15.1792C18.3445 15.1792 18.6223 15.4569 19.1779 16.0125L20.1542 16.9888C20.7097 17.5444 20.9875 17.8221 21.3327 17.8221C21.6779 17.8221 21.9556 17.5444 22.5112 16.9888L24.666 14.834" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M19.666 35.667L19.666 29.0003" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M33.0007 4V18.1667C33.0007 23.2735 33.0007 25.827 31.327 27.4135C29.6533 29 26.9596 29 21.5721 29H17.7626C12.3751 29 9.68134 29 8.00766 27.4135C6.33398 25.827 6.33398 23.2735 6.33398 18.1667V4" stroke="#1C1C1C" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 846 B

@@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M36.6673 36.6663H20.0007C12.1439 36.6663 8.21554 36.6663 5.77476 34.2256C3.33398 31.7848 3.33398 27.8564 3.33398 19.9997V3.33301" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M31.6669 11.667L26.4702 18.211C25.6742 19.2134 25.2762 19.7146 24.8193 19.9589C24.1167 20.3344 23.2772 20.3527 22.559 20.008C22.0919 19.7839 21.6725 19.3005 20.8336 18.3336C19.9947 17.3668 19.5753 16.8834 19.1082 16.6592C18.39 16.3146 17.5505 16.3328 16.8479 16.7084C16.391 16.9527 15.993 17.4538 15.197 18.4562L10 25.0003" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 693 B

@@ -0,0 +1,8 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.33398 19.9997C4.33398 16.043 4.33611 13.1762 4.63016 10.989C4.92035 8.8306 5.47825 7.48451 6.48187 6.48089C7.48549 5.47727 8.83157 4.91938 10.99 4.62919C13.1771 4.33513 16.044 4.33301 20.0007 4.33301C23.9573 4.33301 26.8242 4.33513 29.0113 4.62919C31.1697 4.91938 32.5158 5.47727 33.5194 6.48089C34.5231 7.48451 35.0809 8.8306 35.3711 10.989C35.6652 13.1762 35.6673 16.043 35.6673 19.9997C35.6673 23.9563 35.6652 26.8232 35.3711 29.0104C35.0809 31.1688 34.5231 32.5148 33.5194 33.5185C32.5158 34.5221 31.1697 35.08 29.0113 35.3702C26.8242 35.6642 23.9573 35.6663 20.0007 35.6663C16.044 35.6663 13.1771 35.6642 10.99 35.3702C8.83157 35.08 7.48549 34.5221 6.48187 33.5185C5.47825 32.5148 4.92035 31.1688 4.63016 29.0104C4.33611 26.8232 4.33398 23.9563 4.33398 19.9997Z" stroke="#1C1C1C" stroke-width="2"/>
<path d="M5 16.667H35" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M5 26.667H35" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M11.666 16.667L11.666 35.0003" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M20 16.667L20 35.0003" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M28.334 16.667L28.334 35.0003" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+4
View File
@@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.0007 36.6663C12.1439 36.6663 8.21554 36.6663 5.77476 34.2256C3.33398 31.7848 3.33398 27.8564 3.33398 19.9997C3.33398 12.1429 3.33398 8.21456 5.77476 5.77379C8.21554 3.33301 12.1439 3.33301 20.0007 3.33301C27.8574 3.33301 31.7858 3.33301 34.2265 5.77378C36.6673 8.21456 36.6673 12.1429 36.6673 19.9997C36.6673 27.8564 36.6673 31.7848 34.2265 34.2256C31.7858 36.6663 27.8574 36.6663 20.0007 36.6663Z" stroke="#1C1C1C" stroke-width="2"/>
<path d="M5.83398 34.1663L20.0007 19.9997M34.1673 5.83301L20.0007 19.9997M34.1673 34.1663L20.0007 19.9997" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 717 B

+4
View File
@@ -0,0 +1,4 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M33.334 25.921C31.3778 32.1492 25.5592 36.667 18.6854 36.667C10.207 36.667 3.33398 29.7939 3.33398 21.3156C3.33398 14.4418 7.85174 8.62316 14.08 6.66699" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M36.5225 16.5785C34.7532 10.2403 29.76 5.2471 23.4219 3.47784C20.6825 2.71318 18.334 5.08999 18.334 7.93404V19.0915C18.334 20.5136 19.4868 21.6663 20.9088 21.6663H32.0663C34.9103 21.6663 37.2871 19.3178 36.5225 16.5785Z" stroke="#1C1C1C" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 591 B

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M33.0757 21.0763C32.8834 17.0117 30.9667 13.2617 27.9417 11.0324L29.7405 7.50666L29.2262 7.16991C26.9709 5.69294 24.3989 4.91236 21.7864 4.91236C19.3739 4.91236 16.9989 5.58652 14.8721 6.85202L13.0762 3.33301L12.5608 3.6711C6.8691 7.39688 3.33398 14.3245 3.33398 21.7498V22.4233H14.0739C14.2554 25.0519 15.4899 27.4684 17.4179 28.9649L15.6209 32.4866L16.1352 32.8234C17.856 33.9501 19.8108 34.5462 21.7864 34.5462C23.5637 34.5462 25.3233 34.0599 26.9126 33.1413L28.7114 36.6663L29.2268 36.3282C33.8167 33.3251 36.6673 27.7385 36.6673 21.7498V21.0763H33.0757ZM31.8876 21.0763H22.8173L27.3477 12.1969C30.0078 14.1844 31.6983 17.4906 31.8876 21.0763ZM15.4637 8.01178C17.4096 6.8628 19.5828 6.25935 21.7864 6.25935C23.9899 6.25935 26.1637 6.86347 28.109 8.01178L21.7864 20.4028L17.8739 12.735L15.4637 8.01178ZM12.6471 5.18445L20.7554 21.0763H14.0483H4.53517C4.73458 14.61 7.78994 8.62399 12.6471 5.18445ZM15.2661 22.4233H20.7554L18.7203 26.4117L18.0137 27.7964C16.4507 26.545 15.4423 24.5724 15.2661 22.4233ZM26.3185 31.9775C23.503 33.5797 20.0703 33.579 17.2542 31.9781L18.4346 29.6647L19.2251 28.1163L21.787 23.0967L25.4453 30.2654L26.3185 31.9775ZM29.1399 34.8129L22.8179 22.4233H33.0959H35.4643C35.2679 27.4516 32.8965 32.0987 29.1399 34.8129Z" fill="#1C1C1C" stroke="#1C1C1C" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

@@ -0,0 +1,5 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.0007 3.33301C29.2054 3.33301 36.6673 10.7949 36.6673 19.9997C36.6673 29.2044 29.2054 36.6663 20.0007 36.6663C10.7959 36.6663 3.33398 29.2044 3.33398 19.9997C3.33398 15.3374 5.24838 11.1222 8.33398 8.09729" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M8.33398 19.9997C8.33398 26.443 13.5573 31.6663 20.0007 31.6663C26.444 31.6663 31.6673 26.443 31.6673 19.9997C31.6673 13.5564 26.444 8.33301 20.0007 8.33301" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
<path d="M20 26.6663C23.6819 26.6663 26.6667 23.6816 26.6667 19.9997C26.6667 16.3178 23.6819 13.333 20 13.333" stroke="#1C1C1C" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 777 B

@@ -0,0 +1,10 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M33.5324 30.3975C32.0109 30.3975 30.7361 31.0556 30.4583 32.4997H7.50065V9.54343C8.94469 9.26439 9.60381 7.99321 9.60381 6.46803C9.60381 4.73894 8.19674 3.33301 6.4689 3.33301C4.74106 3.33301 3.33398 4.73894 3.33398 6.46803C3.33398 7.99202 4.42864 9.2632 5.87268 9.54343V33.5313C5.87268 33.8604 6.14098 34.1276 6.4689 34.1276H30.4583C30.7361 35.5716 32.0109 36.6663 33.5324 36.6663C35.2591 36.6663 36.6673 35.2592 36.6673 33.5313C36.6673 31.8034 35.2591 30.3975 33.5324 30.3975ZM4.52642 6.46922C4.52642 5.39838 5.3969 4.52668 6.4689 4.52668C7.5409 4.52668 8.41137 5.39719 8.41137 6.46922C8.41137 7.53888 7.5409 8.41177 6.4689 8.41177C5.3969 8.41177 4.52642 7.54007 4.52642 6.46922ZM33.5324 35.4774C32.4628 35.4774 31.5899 34.6057 31.5899 33.5349C31.5899 32.464 32.4592 31.5912 33.5324 31.5912C34.6056 31.5912 35.4749 32.4629 35.4749 33.5349C35.4749 34.6045 34.602 35.4774 33.5324 35.4774Z" fill="#1C1C1C"/>
<path d="M4.52642 6.46922C4.52642 5.39838 5.3969 4.52668 6.4689 4.52668C7.5409 4.52668 8.41137 5.39719 8.41137 6.46922C8.41137 7.53888 7.5409 8.41177 6.4689 8.41177C5.3969 8.41177 4.52642 7.54007 4.52642 6.46922Z" fill="#1C1C1C"/>
<path d="M33.5324 35.4774C32.4628 35.4774 31.5899 34.6057 31.5899 33.5349C31.5899 32.464 32.4592 31.5912 33.5324 31.5912C34.6056 31.5912 35.4749 32.4629 35.4749 33.5349C35.4749 34.6045 34.602 35.4774 33.5324 35.4774Z" fill="#1C1C1C"/>
<path d="M14.4986 17.3233C15.6171 17.3233 16.5234 16.4146 16.5234 15.2985C16.5234 14.1799 15.6147 13.2725 14.4986 13.2725C13.3825 13.2725 12.4727 14.1811 12.4727 15.2985C12.4727 16.4146 13.3837 17.3233 14.4986 17.3233ZM14.4986 14.4626C14.9601 14.4626 15.3309 14.8358 15.3309 15.2961C15.3309 15.7564 14.9577 16.1284 14.4986 16.1284C14.0395 16.1284 13.6651 15.7552 13.6651 15.2961C13.6651 14.8358 14.0383 14.4626 14.4986 14.4626Z" fill="#1C1C1C"/>
<path d="M23.624 16.5745C24.7413 16.5745 25.65 15.6646 25.65 14.5473C25.65 13.4299 24.739 12.5225 23.624 12.5225C22.5055 12.5225 21.5957 13.4311 21.5957 14.5473C21.5957 15.6646 22.5079 16.5745 23.624 16.5745ZM23.624 13.7149C24.0843 13.7149 24.4575 14.0882 24.4575 14.5473C24.4575 15.0088 24.0843 15.3808 23.624 15.3808C23.1626 15.3808 22.7881 15.0076 22.7881 14.5461C22.7881 14.087 23.1649 13.7149 23.624 13.7149Z" fill="#1C1C1C"/>
<path d="M19.7427 23.6526C20.8589 23.6526 21.7675 22.7428 21.7675 21.6266C21.7675 20.5081 20.8565 19.6006 19.7427 19.6006C18.6242 19.6006 17.7168 20.5093 17.7168 21.6266C17.7168 22.7428 18.6242 23.6526 19.7427 23.6526ZM19.7427 20.7919C20.2018 20.7919 20.5751 21.1651 20.5751 21.6254C20.5751 22.0857 20.2018 22.459 19.7427 22.459C19.2801 22.459 18.9092 22.0857 18.9092 21.6254C18.9092 21.1651 19.2801 20.7919 19.7427 20.7919Z" fill="#1C1C1C"/>
<path d="M30.8424 21.6106C31.9609 21.6106 32.8671 20.7008 32.8671 19.5846C32.8671 18.4661 31.9585 17.5586 30.8424 17.5586C29.7262 17.5586 28.8164 18.4673 28.8164 19.5846C28.8164 20.7008 29.725 21.6106 30.8424 21.6106ZM30.8424 18.7499C31.3038 18.7499 31.6747 19.1231 31.6747 19.5834C31.6747 20.0437 31.3014 20.417 30.8424 20.417C30.3833 20.417 30.0088 20.0437 30.0088 19.5834C30.0088 19.1231 30.3821 18.7499 30.8424 18.7499Z" fill="#1C1C1C"/>
<path d="M32.6826 13.3763C33.7999 13.3763 34.7074 12.4676 34.7074 11.3502C34.7074 10.2329 33.7964 9.32422 32.6826 9.32422C31.5641 9.32422 30.6543 10.2341 30.6543 11.3502C30.6543 12.4688 31.5653 13.3763 32.6826 13.3763ZM32.6826 10.5155C33.1417 10.5155 33.515 10.8888 33.515 11.349C33.515 11.8093 33.1417 12.1826 32.6826 12.1826C32.22 12.1826 31.8467 11.8093 31.8467 11.349C31.8467 10.8888 32.22 10.5155 32.6826 10.5155Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.905 2.08301H20.0963C23.9436 2.08299 26.9587 2.08297 29.3111 2.39925C31.719 2.72299 33.6191 3.39855 35.1104 4.8899C36.6018 6.38125 37.2773 8.28129 37.6011 10.6892C37.9174 13.0417 37.9173 16.0567 37.9173 19.9041V24.9997C37.9173 32.1334 32.1343 37.9163 25.0007 37.9163H19.905C16.0577 37.9164 13.0426 37.9164 10.6902 37.6001C8.28227 37.2764 6.38223 36.6008 4.89088 35.1094C3.39953 33.6181 2.72396 31.7181 2.40023 29.3102C2.08395 26.9577 2.08396 23.9426 2.08398 20.0953V19.904C2.08396 16.0567 2.08395 13.0417 2.40023 10.6892C2.72396 8.28129 3.39953 6.38125 4.89088 4.8899C6.38223 3.39855 8.28227 2.72299 10.6902 2.39925C13.0426 2.08297 16.0577 2.08299 19.905 2.08301ZM11.0233 4.87696C8.89261 5.16342 7.60807 5.70824 6.65865 6.65767C5.70922 7.6071 5.1644 8.89163 4.87794 11.0223C4.58664 13.1889 4.58399 16.036 4.58399 19.9997C4.58399 23.9634 4.58664 26.8104 4.87794 28.977C5.1644 31.1077 5.70922 32.3923 6.65865 33.3417C7.60807 34.2911 8.89261 34.8359 11.0233 35.1224C13.1899 35.4137 16.0369 35.4163 20.0007 35.4163H23.7513C23.7569 33.1392 23.8065 31.6434 24.2197 30.3716C25.1677 27.4541 27.455 25.1667 30.3726 24.2187C31.6444 23.8055 33.1402 23.7559 35.4173 23.7503V19.9997C35.4173 16.036 35.4147 13.1889 35.1234 11.0223C34.8369 8.89163 34.2921 7.6071 33.3427 6.65767C32.3932 5.70824 31.1087 5.16342 28.978 4.87696C26.8114 4.58566 23.9644 4.58301 20.0007 4.58301C16.0369 4.58301 13.1899 4.58566 11.0233 4.87696ZM35.3428 26.2518C33.081 26.2615 32.0108 26.3151 31.1451 26.5964C28.9887 27.297 27.298 28.9877 26.5973 31.1441C26.3161 32.0098 26.2625 33.08 26.2527 35.3419C31.0048 34.7726 34.7735 31.0039 35.3428 26.2518Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,3 @@
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.905 2.08301H20.0963C23.9436 2.08299 26.9587 2.08297 29.3111 2.39925C31.719 2.72299 33.6191 3.39855 35.1104 4.8899C36.6018 6.38125 37.2773 8.28129 37.6011 10.6892C37.9174 13.0417 37.9173 16.0567 37.9173 19.9041V20.0953C37.9173 23.9426 37.9174 26.9577 37.6011 29.3102C37.2773 31.7181 36.6018 33.6181 35.1104 35.1094C33.6191 36.6008 31.719 37.2764 29.3111 37.6001C26.9587 37.9164 23.9436 37.9164 20.0963 37.9163H19.905C16.0577 37.9164 13.0426 37.9164 10.6902 37.6001C8.28227 37.2764 6.38223 36.6008 4.89088 35.1094C3.39953 33.6181 2.72396 31.7181 2.40023 29.3102C2.08395 26.9577 2.08396 23.9426 2.08398 20.0953V19.904C2.08396 16.0567 2.08395 13.0417 2.40023 10.6892C2.72396 8.28129 3.39953 6.38125 4.89088 4.8899C6.38223 3.39855 8.28227 2.72299 10.6902 2.39925C13.0426 2.08297 16.0577 2.08299 19.905 2.08301ZM11.0233 4.87696C8.89261 5.16342 7.60807 5.70824 6.65865 6.65767C5.70922 7.6071 5.1644 8.89163 4.87794 11.0223C4.58664 13.1889 4.58399 16.036 4.58399 19.9997C4.58399 23.9634 4.58664 26.8104 4.87794 28.977C5.1644 31.1077 5.70922 32.3923 6.65865 33.3417C7.60807 34.2911 8.89261 34.8359 11.0233 35.1224C13.1899 35.4137 16.0369 35.4163 20.0007 35.4163C23.9644 35.4163 26.8114 35.4137 28.978 35.1224C31.1087 34.8359 32.3932 34.2911 33.3427 33.3417C34.2921 32.3923 34.8369 31.1077 35.1234 28.977C35.4147 26.8104 35.4173 23.9634 35.4173 19.9997C35.4173 16.036 35.4147 13.1889 35.1234 11.0223C34.8369 8.89163 34.2921 7.6071 33.3427 6.65767C32.3932 5.70824 31.1087 5.16342 28.978 4.87696C26.8114 4.58566 23.9644 4.58301 20.0007 4.58301C16.0369 4.58301 13.1899 4.58566 11.0233 4.87696ZM17.5294 10.7612C18.0293 11.2373 18.0486 12.0285 17.5725 12.5284L12.8106 17.5284C12.5747 17.7761 12.2475 17.9163 11.9054 17.9163C11.5633 17.9163 11.2362 17.7761 11.0002 17.5284L9.09548 15.5284C8.61937 15.0285 8.63867 14.2373 9.13858 13.7612C9.6385 13.2851 10.4297 13.3044 10.9058 13.8043L11.9054 14.8538L15.7621 10.8043C16.2383 10.3044 17.0295 10.2851 17.5294 10.7612ZM20.4173 14.9997C20.4173 14.3093 20.977 13.7497 21.6673 13.7497H30.0007C30.691 13.7497 31.2507 14.3093 31.2507 14.9997C31.2507 15.69 30.691 16.2497 30.0007 16.2497H21.6673C20.977 16.2497 20.4173 15.69 20.4173 14.9997ZM17.5294 22.4278C18.0293 22.9039 18.0486 23.6952 17.5725 24.1951L12.8106 29.1951C12.5747 29.4428 12.2475 29.583 11.9054 29.583C11.5633 29.583 11.2362 29.4428 11.0002 29.1951L9.09548 27.1951C8.61937 26.6952 8.63867 25.9039 9.13858 25.4278C9.6385 24.9517 10.4297 24.971 10.9058 25.4709L11.9054 26.5205L15.7621 22.4709C16.2383 21.971 17.0295 21.9517 17.5294 22.4278ZM20.4173 26.6663C20.4173 25.976 20.977 25.4163 21.6673 25.4163H30.0007C30.691 25.4163 31.2507 25.976 31.2507 26.6663C31.2507 27.3567 30.691 27.9163 30.0007 27.9163H21.6673C20.977 27.9163 20.4173 27.3567 20.4173 26.6663Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -0,0 +1,4 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 17C8 12.7574 8 10.636 9.31802 9.31802C10.636 8 12.7574 8 17 8C21.2426 8 23.364 8 24.682 9.31802C26 10.636 26 12.7574 26 17C26 21.2426 26 23.364 24.682 24.682C23.364 26 21.2426 26 17 26C12.7574 26 10.636 26 9.31802 24.682C8 23.364 8 21.2426 8 17Z" stroke="#1C1C1C" stroke-width="1.5"/>
<path d="M12.5 18.7997L14.1172 16.8591C14.758 16.0901 15.0785 15.7056 15.5 15.7056C15.9215 15.7056 16.242 16.0901 16.8828 16.8591L17.1172 17.1403C17.758 17.9094 18.0785 18.2939 18.5 18.2939C18.9215 18.2939 19.242 17.9094 19.8828 17.1403L21.5 15.1997" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 712 B

@@ -0,0 +1,6 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 17C8 12.7574 8 10.636 9.31802 9.31802C10.636 8 12.7574 8 17 8C21.2426 8 23.364 8 24.682 9.31802C26 10.636 26 12.7574 26 17C26 21.2426 26 23.364 24.682 24.682C23.364 26 21.2426 26 17 26C12.7574 26 10.636 26 9.31802 24.682C8 23.364 8 21.2426 8 17Z" stroke="#1C1C1C" stroke-width="1.5"/>
<path d="M12.5001 22.3998V14.2998" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M17 22.4001V11.6001" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M21.5 22.3999V17.8999" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 680 B

@@ -0,0 +1,3 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M17 8C12.0294 8 8 12.0294 8 17C8 21.9706 12.0294 26 17 26C21.9706 26 26 21.9706 26 17C26 12.0294 21.9706 8 17 8ZM9.25581 17C9.25581 15.0875 9.94906 13.337 11.098 11.9859L13.7791 14.6671C13.3036 15.3224 13.0233 16.1285 13.0233 17C13.0233 17.8715 13.3036 18.6776 13.7791 19.3329L11.098 22.014C9.94905 20.663 9.25581 18.9125 9.25581 17ZM14.6671 13.7791L11.986 11.098C13.337 9.94906 15.0875 9.25581 17 9.25581C18.9125 9.25581 20.663 9.94906 22.014 11.098L19.3329 13.7791C18.6776 13.3036 17.8715 13.0233 17 13.0233C16.1285 13.0233 15.3224 13.3036 14.6671 13.7791ZM11.9859 22.902C13.337 24.0509 15.0875 24.7442 17 24.7442C18.9125 24.7442 20.663 24.0509 22.0141 22.902L19.3329 20.2209C18.6776 20.6964 17.8715 20.9767 17 20.9767C16.1285 20.9767 15.3224 20.6964 14.6671 20.2209L11.9859 22.902ZM20.2209 19.3329L22.902 22.014C24.0509 20.663 24.7442 18.9125 24.7442 17C24.7442 15.0875 24.0509 13.337 22.902 11.9859L20.2209 14.6671C20.6964 15.3224 20.9767 16.1285 20.9767 17C20.9767 17.8715 20.6964 18.6776 20.2209 19.3329ZM14.2791 17C14.2791 15.4973 15.4973 14.2791 17 14.2791C18.5027 14.2791 19.7209 15.4973 19.7209 17C19.7209 18.5027 18.5027 19.7209 17 19.7209C15.4973 19.7209 14.2791 18.5027 14.2791 17Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -0,0 +1,6 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 17C8 12.7574 8 10.636 9.31802 9.31802C10.636 8 12.7574 8 17 8C21.2426 8 23.364 8 24.682 9.31802C26 10.636 26 12.7574 26 17C26 21.2426 26 23.364 24.682 24.682C23.364 26 21.2426 26 17 26C12.7574 26 10.636 26 9.31802 24.682C8 23.364 8 21.2426 8 17Z" stroke="#1C1C1C" stroke-width="1.5"/>
<path d="M12.95 12.5L15.65 12.5" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M12.9501 17H18.3501" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M12.95 21.5H21.05" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 674 B

@@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.00016 14.6654C11.6821 14.6654 14.6668 11.6806 14.6668 7.9987C14.6668 4.3168 11.6821 1.33203 8.00016 1.33203C4.31826 1.33203 1.3335 4.3168 1.3335 7.9987C1.3335 11.6806 4.31826 14.6654 8.00016 14.6654Z" stroke="#B0B0B0"/>
<path d="M8 11.332V7.33203" stroke="#B0B0B0" stroke-linecap="round"/>
<path d="M7.99992 4.66667C8.36811 4.66667 8.66659 4.96514 8.66659 5.33333C8.66659 5.70152 8.36811 6 7.99992 6C7.63173 6 7.33325 5.70152 7.33325 5.33333C7.33325 4.96514 7.63173 4.66667 7.99992 4.66667Z" fill="#B0B0B0"/>
</svg>

After

Width:  |  Height:  |  Size: 624 B

@@ -0,0 +1,3 @@
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Search" fill-rule="evenodd" clip-rule="evenodd" d="M9.47653 11.6407C8.49572 12.3392 7.29583 12.75 6 12.75C2.68629 12.75 0 10.0637 0 6.75C0 3.43629 2.68629 0.75 6 0.75C9.31371 0.75 12 3.43629 12 6.75C12 8.04583 11.5892 9.24572 10.8907 10.2265L13.7071 13.0429C14.0976 13.4334 14.0976 14.0666 13.7071 14.4571C13.3166 14.8476 12.6834 14.8476 12.2929 14.4571L9.47653 11.6407ZM10 6.75C10 8.95914 8.20914 10.75 6 10.75C3.79086 10.75 2 8.95914 2 6.75C2 4.54086 3.79086 2.75 6 2.75C8.20914 2.75 10 4.54086 10 6.75Z" fill="#ccc"/>
</svg>

After

Width:  |  Height:  |  Size: 634 B

@@ -0,0 +1,3 @@
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Search" fill-rule="evenodd" clip-rule="evenodd" d="M9.47653 11.6407C8.49572 12.3392 7.29583 12.75 6 12.75C2.68629 12.75 0 10.0637 0 6.75C0 3.43629 2.68629 0.75 6 0.75C9.31371 0.75 12 3.43629 12 6.75C12 8.04583 11.5892 9.24572 10.8907 10.2265L13.7071 13.0429C14.0976 13.4334 14.0976 14.0666 13.7071 14.4571C13.3166 14.8476 12.6834 14.8476 12.2929 14.4571L9.47653 11.6407ZM10 6.75C10 8.95914 8.20914 10.75 6 10.75C3.79086 10.75 2 8.95914 2 6.75C2 4.54086 3.79086 2.75 6 2.75C8.20914 2.75 10 4.54086 10 6.75Z" fill="#B0B0B0"/>
</svg>

After

Width:  |  Height:  |  Size: 637 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.4 KiB

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 5L9 12L15 19" stroke="#1C1C1C" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 215 B

@@ -0,0 +1,5 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Icon after">
<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M5.528 7.6118C5.40347 7.73773 5.33362 7.90769 5.33362 8.0848C5.33362 8.26191 5.40347 8.43187 5.528 8.5578L7.48734 10.5345C7.63267 10.6778 7.82067 10.7491 8.00667 10.7491C8.19267 10.7491 8.37734 10.6778 8.51934 10.5345L10.4727 8.56446C10.597 8.43845 10.6668 8.26852 10.6668 8.09146C10.6668 7.91441 10.597 7.74448 10.4727 7.61846C10.4115 7.55634 10.3385 7.50701 10.258 7.47334C10.1776 7.43967 10.0912 7.42233 10.004 7.42233C9.91679 7.42233 9.83044 7.43967 9.74998 7.47334C9.66952 7.50701 9.59656 7.55634 9.53534 7.61846L8.00334 9.16313L6.46534 7.6118C6.40398 7.54992 6.33098 7.5008 6.25054 7.46728C6.1701 7.43376 6.08382 7.4165 5.99667 7.4165C5.90953 7.4165 5.82325 7.43376 5.74281 7.46728C5.66237 7.5008 5.58936 7.54992 5.528 7.6118Z" fill="#ccc"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 937 B

@@ -0,0 +1,5 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Icon after">
<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M5.528 7.6118C5.40347 7.73773 5.33362 7.90769 5.33362 8.0848C5.33362 8.26191 5.40347 8.43187 5.528 8.5578L7.48734 10.5345C7.63267 10.6778 7.82067 10.7491 8.00667 10.7491C8.19267 10.7491 8.37734 10.6778 8.51934 10.5345L10.4727 8.56446C10.597 8.43845 10.6668 8.26852 10.6668 8.09146C10.6668 7.91441 10.597 7.74448 10.4727 7.61846C10.4115 7.55634 10.3385 7.50701 10.258 7.47334C10.1776 7.43967 10.0912 7.42233 10.004 7.42233C9.91679 7.42233 9.83044 7.43967 9.74998 7.47334C9.66952 7.50701 9.59656 7.55634 9.53534 7.61846L8.00334 9.16313L6.46534 7.6118C6.40398 7.54992 6.33098 7.5008 6.25054 7.46728C6.1701 7.43376 6.08382 7.4165 5.99667 7.4165C5.90953 7.4165 5.82325 7.43376 5.74281 7.46728C5.66237 7.5008 5.58936 7.54992 5.528 7.6118Z" fill="#666"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 937 B

@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1264_72089)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.83792 1.74779C11.057 0.52873 13.0335 0.52873 14.2525 1.74779C15.4716 2.96686 15.4716 4.94335 14.2525 6.16242L7.92901 12.486C7.56773 12.8473 7.35506 13.0599 7.11846 13.2445C6.8396 13.462 6.53786 13.6485 6.2186 13.8006C5.94774 13.9297 5.66239 14.0248 5.17765 14.1864L2.9569 14.9266L2.42218 15.1049C1.98848 15.2494 1.51031 15.1366 1.18704 14.8133C0.863776 14.49 0.750898 14.0119 0.895467 13.5782L1.81395 10.8227C1.97551 10.338 2.07062 10.0526 2.19971 9.78174C2.35186 9.46248 2.53834 9.16074 2.75585 8.88188C2.94039 8.64528 3.15309 8.4326 3.51441 8.07131L9.83792 1.74779ZM2.93384 13.8802L4.82818 13.2488C5.35559 13.073 5.57968 12.9974 5.78838 12.8979C6.04208 12.777 6.28185 12.6288 6.50344 12.456C6.68574 12.3138 6.85358 12.1472 7.24669 11.7541L12.293 6.70774C11.7672 6.5223 11.0899 6.17858 10.4558 5.5445C9.82176 4.91042 9.47803 4.23309 9.2926 3.70733L4.24628 8.75365C3.85317 9.14676 3.68655 9.31459 3.54436 9.4969C3.37152 9.71849 3.22334 9.95826 3.10243 10.212C3.00297 10.4207 2.92736 10.6447 2.75156 11.1722L2.12011 13.0665L2.93384 13.8802ZM10.1037 2.89619C10.1265 3.01283 10.1651 3.17139 10.2294 3.35675C10.3742 3.77405 10.6476 4.32208 11.1629 4.83739C11.6783 5.3527 12.2263 5.62619 12.6436 5.77096C12.8289 5.83527 12.9875 5.8738 13.1041 5.8966L13.5454 5.45531C14.374 4.62677 14.374 3.28344 13.5454 2.4549C12.7169 1.62636 11.3736 1.62636 10.545 2.4549L10.1037 2.89619Z" fill="#1C1C1C"/>
</g>
<defs>
<clipPath id="clip0_1264_72089">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,9 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Linear / Essentional, UI / Magic Stick 4">
<path id="Vector" d="M2.56302 5.28151C1.81233 4.53082 1.81233 3.31371 2.56302 2.56302C3.31371 1.81233 4.53082 1.81233 5.28151 2.56302L13.437 10.7185C14.1877 11.4692 14.1877 12.6863 13.437 13.437C12.6863 14.1877 11.4692 14.1877 10.7185 13.437L2.56302 5.28151Z" stroke="white" stroke-width="1.5"/>
<path id="Vector_2" d="M4 6.66667L6.66667 4" stroke="white" stroke-width="1.5" stroke-linecap="round"/>
<path id="Vector_3" d="M10.7335 1.53829C10.8408 1.26523 11.2258 1.26523 11.3331 1.53829L11.62 2.26848C11.6528 2.35184 11.7185 2.41784 11.8016 2.45072L12.5291 2.7387C12.8011 2.84639 12.8011 3.23283 12.5291 3.34052L11.8016 3.62851C11.7185 3.66139 11.6528 3.72738 11.62 3.81074L11.3331 4.54093C11.2258 4.81399 10.8408 4.81399 10.7335 4.54094L10.4466 3.81074C10.4138 3.72738 10.3481 3.66139 10.265 3.62851L9.53755 3.34052C9.26548 3.23283 9.26548 2.84639 9.53755 2.7387L10.265 2.45072C10.3481 2.41784 10.4138 2.35184 10.4466 2.26848L10.7335 1.53829Z" stroke="white"/>
<path id="Vector_4" d="M13.3116 6.08614C13.4189 5.81308 13.804 5.81308 13.9112 6.08614L14.0158 6.35237C14.0486 6.43574 14.1144 6.50173 14.1974 6.5346L14.4626 6.6396C14.7347 6.7473 14.7347 7.13377 14.4626 7.24144L14.1974 7.34644C14.1144 7.3793 14.0486 7.4453 14.0158 7.52864L13.9112 7.7949C13.804 8.06797 13.4189 8.06797 13.3116 7.7949L13.207 7.52864C13.1742 7.4453 13.1085 7.3793 13.0254 7.34644L12.7602 7.24144C12.4882 7.13377 12.4882 6.7473 12.7602 6.6396L13.0254 6.5346C13.1085 6.50173 13.1742 6.43574 13.207 6.35237L13.3116 6.08614Z" stroke="white"/>
<path id="Vector_5" d="M3.42197 10.2048C3.52926 9.93173 3.91428 9.93173 4.02158 10.2048L4.12619 10.471C4.15895 10.5544 4.2247 10.6204 4.30776 10.6533L4.573 10.7583C4.84506 10.8659 4.84506 11.2524 4.573 11.3601L4.30776 11.4651C4.2247 11.4979 4.15895 11.5639 4.12619 11.6473L4.02158 11.9135C3.91428 12.1866 3.52926 12.1866 3.42197 11.9135L3.31736 11.6473C3.2846 11.5639 3.21885 11.4979 3.13579 11.4651L2.87054 11.3601C2.59849 11.2524 2.59849 10.8659 2.87054 10.7583L3.13579 10.6533C3.21885 10.6204 3.2846 10.5544 3.31736 10.471L3.42197 10.2048Z" stroke="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.64628 6.98011C9.84155 6.78484 10.1581 6.78484 10.3534 6.98011C10.5487 7.17537 10.5487 7.49195 10.3534 7.68721L8.35339 9.68721C8.15813 9.88247 7.84155 9.88247 7.64628 9.68721L5.64628 7.68721C5.45102 7.49195 5.45102 7.17537 5.64628 6.98011C5.84155 6.78484 6.15813 6.78484 6.35339 6.98011L7.49984 8.12655V2.66699C7.49984 2.39085 7.7237 2.16699 7.99984 2.16699C8.27598 2.16699 8.49984 2.39085 8.49984 2.66699V8.12655L9.64628 6.98011Z" fill="#1C1C1C"/>
<path d="M13.8332 8.00033C13.8332 7.72418 13.6093 7.50033 13.3332 7.50033C13.057 7.50033 12.8332 7.72418 12.8332 8.00033C12.8332 10.6697 10.6692 12.8337 7.99984 12.8337C5.33046 12.8337 3.1665 10.6697 3.1665 8.00033C3.1665 7.72418 2.94265 7.50033 2.6665 7.50033C2.39036 7.50033 2.1665 7.72418 2.1665 8.00033C2.1665 11.222 4.77818 13.8337 7.99984 13.8337C11.2215 13.8337 13.8332 11.222 13.8332 8.00033Z" fill="#1C1C1C"/>
</svg>

After

Width:  |  Height:  |  Size: 982 B

@@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 8.5C1 5.90728 1 4.61091 1.80546 3.80546C2.61091 3 3.90727 3 6.5 3H9.25C11.8427 3 13.1391 3 13.9445 3.80546C14.75 4.61091 14.75 5.90728 14.75 8.5C14.75 11.0927 14.75 12.3891 13.9445 13.1945C13.1391 14 11.8427 14 9.25 14H6.5C3.90727 14 2.61091 14 1.80546 13.1945C1 12.3891 1 11.0927 1 8.5Z" stroke="#1C1C1C"/>
<path d="M3.74951 5.74951L5.23375 6.98638C6.49644 8.03862 7.12778 8.56474 7.87451 8.56474C8.62124 8.56474 9.25258 8.03862 10.5153 6.98638L11.9995 5.74951" stroke="#1C1C1C" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 620 B

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.55237 3.91767C4.74068 3.47627 3.76751 4.05844 3.76751 4.93514L3.7675 12.0649C3.7675 12.9416 4.74068 13.5237 5.55237 13.0823L12.1079 9.51748C12.9263 9.07238 12.9263 7.92762 12.1079 7.48252L5.55237 3.91767ZM3 4.93514C3 3.44874 4.62032 2.53718 5.91903 3.24341L12.4745 6.80827C13.8275 7.54399 13.8275 9.456 12.4745 10.1917L5.91903 13.7566C4.62033 14.4628 3 13.5513 3 12.0649L3 4.93514Z" fill="#1C1C1C" stroke="#1C1C1C" stroke-width="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 591 B

@@ -0,0 +1,10 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1264_72074)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.96358 0.833496H8.03675C8.94847 0.833483 9.68335 0.833472 10.2613 0.911179C10.8614 0.991856 11.3667 1.16445 11.7679 1.56573C12.2613 2.05905 12.4138 2.71694 12.4676 3.53311C12.631 3.54402 12.7843 3.55853 12.928 3.57785C13.5281 3.65852 14.0333 3.83112 14.4346 4.2324C14.8359 4.63367 15.0085 5.13892 15.0891 5.739C15.1669 6.31697 15.1668 7.05186 15.1668 7.96358V8.03674C15.1668 8.94847 15.1669 9.68335 15.0891 10.2613C15.0085 10.8614 14.8359 11.3667 14.4346 11.7679C13.9413 12.2613 13.2834 12.4138 12.4672 12.4676C12.4563 12.631 12.4418 12.7843 12.4225 12.928C12.3418 13.5281 12.1692 14.0333 11.7679 14.4346C11.3667 14.8359 10.8614 15.0085 10.2613 15.0891C9.68335 15.1669 8.94847 15.1668 8.03674 15.1668H7.96358C7.05186 15.1668 6.31697 15.1669 5.739 15.0891C5.13892 15.0085 4.63367 14.8359 4.2324 14.4346C3.83112 14.0333 3.65852 13.5281 3.57784 12.928C3.55853 12.7843 3.54402 12.631 3.53311 12.4676C2.71694 12.4138 2.05905 12.2612 1.56573 11.7679C1.16445 11.3667 0.991856 10.8614 0.911179 10.2613C0.833472 9.68335 0.833483 8.94847 0.833496 8.03675V7.96358C0.833483 7.05185 0.833472 6.31697 0.911179 5.739C0.991856 5.13892 1.16445 4.63367 1.56573 4.2324C1.96701 3.83112 2.47226 3.65852 3.07233 3.57785C3.21599 3.55853 3.36934 3.54402 3.53269 3.53311C3.58651 2.71694 3.73908 2.05905 4.2324 1.56573C4.63367 1.16445 5.13892 0.991856 5.73899 0.911179C6.31697 0.833472 7.05185 0.833483 7.96358 0.833496ZM4.53826 3.50213C4.7762 3.50016 5.02892 3.50016 5.29691 3.50016H10.7034C10.9714 3.50016 11.2241 3.50016 11.4621 3.50213C11.4074 2.82156 11.2845 2.49651 11.0608 2.27284C10.8763 2.08833 10.6173 1.96803 10.1281 1.90226C9.62452 1.83456 8.95711 1.8335 8.00016 1.8335C7.04322 1.8335 6.37581 1.83456 5.87224 1.90226C5.38306 1.96803 5.12401 2.08833 4.9395 2.27284C4.71583 2.49651 4.59289 2.82156 4.53826 3.50213ZM3.50212 11.4621C3.50015 11.2241 3.50016 10.9714 3.50016 10.7034L3.50016 8.75169L3.20496 8.75169C2.95305 8.8648 2.65714 8.75228 2.54403 8.50036C2.43092 8.24844 2.54345 7.95253 2.79536 7.83943L8.00016 7.83943L13.205 7.83943C13.4569 7.95253 13.5694 8.24844 13.4563 8.50036C13.3432 8.75228 13.0473 8.8648 12.7954 8.75169L12.4733 8.75169L12.5002 10.7034C12.5002 10.9714 12.5002 11.2241 12.4982 11.4621C13.1788 11.4074 13.5038 11.2845 13.7275 11.0608C13.912 10.8763 14.0323 10.6173 14.0981 10.1281C14.1658 9.62452 14.1668 8.95711 14.1668 8.00016C14.1668 7.04322 14.1658 6.37581 14.0981 5.87224C14.0323 5.38306 13.912 5.12401 13.7275 4.9395C13.543 4.75499 13.2839 4.6347 12.7947 4.56893C12.2912 4.50123 11.6238 4.50016 10.6668 4.50016H5.3335C4.37655 4.50016 3.70914 4.50123 3.20558 4.56893C2.71639 4.6347 2.45735 4.75499 2.27284 4.9395C2.08833 5.12401 1.96803 5.38306 1.90226 5.87224C1.83456 6.37581 1.8335 7.04322 1.8335 8.00016C1.8335 8.95711 1.83456 9.62452 1.90226 10.1281C1.96803 10.6173 2.08833 10.8763 2.27284 11.0608C2.49651 11.2845 2.82156 11.4074 3.50212 11.4621ZM11.5002 8.95154L8.03675 8.95154H4.50016L4.50016 10.6668C4.50016 11.6238 4.50122 12.2912 4.56893 12.7947C4.6347 13.2839 4.75499 13.543 4.9395 13.7275C5.12401 13.912 5.38306 14.0323 5.87224 14.0981C6.37581 14.1658 7.04322 14.1668 8.00016 14.1668C8.95711 14.1668 9.62452 14.1658 10.1281 14.0981C10.6173 14.0323 10.8763 13.912 11.0608 13.7275C11.2453 13.543 11.3656 13.2839 11.4314 12.7947C11.4991 12.2912 11.5002 11.6238 11.5002 10.6668V8.95154Z" fill="#1C1C1C"/>
</g>
<defs>
<clipPath id="clip0_1264_72074">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,3 @@
<svg width="26" height="30" viewBox="0 0 26 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.46504 0.667046C6.52911 0.667074 6.59413 0.667103 6.66011 0.667103H19.3401C19.4061 0.667103 19.4711 0.667074 19.5351 0.667046C20.8908 0.666453 21.8238 0.666044 22.6095 0.939453C24.0935 1.4558 25.2456 2.65001 25.7396 4.15444L24.7895 4.46639L25.7396 4.15444C26.001 4.9506 26.0006 5.89705 26.0001 7.30239C26.0001 7.36528 26.0001 7.42909 26.0001 7.49385V26.166C26.0001 28.1197 23.6975 29.2828 22.1809 27.895C22.0749 27.798 21.9253 27.798 21.8193 27.895L21.1752 28.4844C19.9376 29.6169 18.0626 29.6169 16.825 28.4844C16.3517 28.0513 15.6485 28.0513 15.1752 28.4844C13.9376 29.6169 12.0626 29.6169 10.825 28.4844C10.3517 28.0513 9.64849 28.0513 9.17518 28.4844C7.93759 29.6169 6.06259 29.6169 4.82501 28.4844L4.18088 27.895C4.07491 27.798 3.92527 27.798 3.8193 27.895C2.30273 29.2828 8.98778e-05 28.1197 8.98778e-05 26.166V7.49385C8.98778e-05 7.42909 6.67512e-05 7.36529 4.39425e-05 7.30239C-0.000465002 5.89705 -0.000807762 4.9506 0.260595 4.15444C0.754543 2.65001 1.90669 1.4558 3.39064 0.939453C4.1764 0.666044 5.10938 0.666453 6.46504 0.667046ZM6.66011 2.6671C5.032 2.6671 4.4712 2.68108 4.0479 2.82837C3.16874 3.13428 2.46558 3.85003 2.1608 4.77833C2.01269 5.22943 2.00009 5.82428 2.00009 7.49385V26.166C2.00009 26.3248 2.07998 26.4218 2.18023 26.4681C2.23245 26.4923 2.28352 26.4985 2.32607 26.4928C2.36359 26.4878 2.41214 26.4717 2.46913 26.4195C3.33937 25.6232 4.66081 25.6232 5.53105 26.4195L6.17517 27.0089C6.64849 27.4421 7.35169 27.4421 7.825 27.0089C9.06259 25.8765 10.9376 25.8765 12.1752 27.0089C12.6485 27.4421 13.3517 27.4421 13.825 27.0089C15.0626 25.8765 16.9376 25.8765 18.1752 27.0089C18.6485 27.4421 19.3517 27.4421 19.825 27.0089L20.4691 26.4195C21.3394 25.6232 22.6608 25.6232 23.531 26.4195C23.588 26.4717 23.6366 26.4878 23.6741 26.4928C23.7167 26.4985 23.7677 26.4923 23.82 26.4682C23.9202 26.4218 24.0001 26.3248 24.0001 26.166V7.49385C24.0001 5.82428 23.9875 5.22943 23.8394 4.77833C23.5346 3.85003 22.8314 3.13428 21.9523 2.82837C21.529 2.68108 20.9682 2.6671 19.3401 2.6671H6.66011ZM5.33342 9.00044C5.33342 8.44815 5.78114 8.00044 6.33342 8.00044H7.00009C7.55237 8.00044 8.00009 8.44815 8.00009 9.00044C8.00009 9.55272 7.55237 10.0004 7.00009 10.0004H6.33342C5.78114 10.0004 5.33342 9.55272 5.33342 9.00044ZM10.0001 9.00044C10.0001 8.44815 10.4478 8.00044 11.0001 8.00044H19.6668C20.219 8.00044 20.6668 8.44815 20.6668 9.00044C20.6668 9.55272 20.219 10.0004 19.6668 10.0004H11.0001C10.4478 10.0004 10.0001 9.55272 10.0001 9.00044ZM5.33342 13.6671C5.33342 13.1148 5.78114 12.6671 6.33342 12.6671H7.00009C7.55237 12.6671 8.00009 13.1148 8.00009 13.6671C8.00009 14.2194 7.55237 14.6671 7.00009 14.6671H6.33342C5.78114 14.6671 5.33342 14.2194 5.33342 13.6671ZM10.0001 13.6671C10.0001 13.1148 10.4478 12.6671 11.0001 12.6671H19.6668C20.219 12.6671 20.6668 13.1148 20.6668 13.6671C20.6668 14.2194 20.219 14.6671 19.6668 14.6671H11.0001C10.4478 14.6671 10.0001 14.2194 10.0001 13.6671ZM5.33342 18.3338C5.33342 17.7815 5.78114 17.3338 6.33342 17.3338H7.00009C7.55237 17.3338 8.00009 17.7815 8.00009 18.3338C8.00009 18.8861 7.55237 19.3338 7.00009 19.3338H6.33342C5.78114 19.3338 5.33342 18.8861 5.33342 18.3338ZM10.0001 18.3338C10.0001 17.7815 10.4478 17.3338 11.0001 17.3338H19.6668C20.219 17.3338 20.6668 17.7815 20.6668 18.3338C20.6668 18.8861 20.219 19.3338 19.6668 19.3338H11.0001C10.4478 19.3338 10.0001 18.8861 10.0001 18.3338Z" fill="#B0B0B0"/>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -0,0 +1,4 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26 26H17C12.7574 26 10.636 26 9.31802 24.682C8 23.364 8 21.2426 8 17V8" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M26 9L22.6422 15.3804C22.1278 16.3577 21.8707 16.8464 21.5754 17.0846C21.1215 17.4508 20.579 17.4686 20.1149 17.1325C19.8131 16.914 19.5421 16.4426 19.0001 15.5C18.4581 14.5573 18.187 14.086 17.8852 13.8674C17.4211 13.5314 16.8787 13.5492 16.4248 13.9154C16.1295 14.1535 15.8724 14.6422 15.358 15.6195L12 22" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 625 B

@@ -0,0 +1,4 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.2 20.1971C23.1437 23.5604 20.0016 26 16.2898 26C11.7114 26 8 22.2885 8 17.7101C8 13.9982 10.4396 10.8561 13.8028 9.7998" stroke="#1C1C1C" stroke-width="1.5" stroke-linecap="round"/>
<path d="M25.9218 15.1526C24.9664 11.73 22.27 9.03362 18.8474 8.07821C17.3682 7.66529 16.1 8.94878 16.1 10.4846V16.5097C16.1 17.2776 16.7225 17.9001 17.4904 17.9001H23.5154C25.0512 17.9001 26.3347 16.6319 25.9218 15.1526Z" stroke="#1C1C1C" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 559 B

@@ -0,0 +1,3 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24.0605 17.5814C23.9567 15.3865 22.9217 13.3615 21.2882 12.1577L22.2595 10.2538L21.9818 10.0719C20.7639 9.27436 19.375 8.85285 17.9643 8.85285C16.6615 8.85285 15.379 9.2169 14.2306 9.90027L13.2608 8L12.9825 8.18257C9.90896 10.1945 8 13.9354 8 17.945V18.3087H13.7995C13.8976 19.7282 14.5642 21.0331 15.6053 21.8412L14.6349 23.743L14.9126 23.9248C15.8419 24.5332 16.8975 24.8551 17.9643 24.8551C18.9241 24.8551 19.8742 24.5925 20.7324 24.0965L21.7038 26L21.9821 25.8174C24.4607 24.1957 26 21.179 26 17.945V17.5814H24.0605ZM23.4189 17.5814H18.521L20.9674 12.7865C22.4039 13.8597 23.3167 15.6451 23.4189 17.5814ZM14.5501 10.5265C15.6008 9.90609 16.7744 9.58022 17.9643 9.58022C19.1542 9.58022 20.3281 9.90645 21.3785 10.5265L17.9643 17.2177L15.8515 13.0771L14.5501 10.5265ZM13.0291 8.99978L17.4076 17.5814H13.7857H8.64864C8.75632 14.0896 10.4062 10.8571 13.0291 8.99978ZM14.4434 18.3087H17.4076L16.3086 20.4625L15.9271 21.2102C15.083 20.5345 14.5385 19.4693 14.4434 18.3087ZM20.4116 23.468C18.8913 24.3332 17.0376 24.3329 15.5169 23.4684L16.1543 22.2191L16.5812 21.383L17.9646 18.6724L19.9401 22.5435L20.4116 23.468ZM21.9352 24.9991L18.5213 18.3087H24.0714H25.3504C25.2443 21.024 23.9638 23.5335 21.9352 24.9991Z" fill="#1C1C1C" stroke="#1C1C1C" stroke-width="0.5" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,47 @@
/*
* DOM element rendering detection
* https://davidwalsh.name/detect-node-insertion
*/
@keyframes chartjs-render-animation {
from { opacity: 0.99; }
to { opacity: 1; }
}
.chartjs-render-monitor {
animation: chartjs-render-animation 0.001s;
}
/*
* DOM element resizing detection
* https://github.com/marcj/css-element-queries
*/
.chartjs-size-monitor,
.chartjs-size-monitor-expand,
.chartjs-size-monitor-shrink {
position: absolute;
direction: ltr;
left: 0;
top: 0;
right: 0;
bottom: 0;
overflow: hidden;
pointer-events: none;
visibility: hidden;
z-index: -1;
}
.chartjs-size-monitor-expand > div {
position: absolute;
width: 1000000px;
height: 1000000px;
left: 0;
top: 0;
}
.chartjs-size-monitor-shrink > div {
position: absolute;
width: 200%;
height: 200%;
left: 0;
top: 0;
}
+1
View File
@@ -0,0 +1 @@
@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,507 @@
/***
Spectrum Colorpicker v1.8.0
https://github.com/bgrins/spectrum
Author: Brian Grinstead
License: MIT
***/
.sp-container {
position:absolute;
top:0;
left:0;
display:inline-block;
*display: inline;
*zoom: 1;
/* https://github.com/bgrins/spectrum/issues/40 */
z-index: 9999994;
overflow: hidden;
}
.sp-container.sp-flat {
position: relative;
}
/* Fix for * { box-sizing: border-box; } */
.sp-container,
.sp-container * {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
.sp-top {
position:relative;
width: 100%;
display:inline-block;
}
.sp-top-inner {
position:absolute;
top:0;
left:0;
bottom:0;
right:0;
}
.sp-color {
position: absolute;
top:0;
left:0;
bottom:0;
right:20%;
}
.sp-hue {
position: absolute;
top:0;
right:0;
bottom:0;
left:84%;
height: 100%;
}
.sp-clear-enabled .sp-hue {
top:33px;
height: 77.5%;
}
.sp-fill {
padding-top: 80%;
}
.sp-sat, .sp-val {
position: absolute;
top:0;
left:0;
right:0;
bottom:0;
}
.sp-alpha-enabled .sp-top {
margin-bottom: 18px;
}
.sp-alpha-enabled .sp-alpha {
display: block;
}
.sp-alpha-handle {
position:absolute;
top:-4px;
bottom: -4px;
width: 6px;
left: 50%;
cursor: pointer;
border: 1px solid black;
background: white;
opacity: .8;
}
.sp-alpha {
display: none;
position: absolute;
bottom: -14px;
right: 0;
left: 0;
height: 8px;
}
.sp-alpha-inner {
border: solid 1px #333;
}
.sp-clear {
display: none;
}
.sp-clear.sp-clear-display {
background-position: center;
}
.sp-clear-enabled .sp-clear {
display: block;
position:absolute;
top:0px;
right:0;
bottom:0;
left:84%;
height: 28px;
}
/* Don't allow text selection */
.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button {
-webkit-user-select:none;
-moz-user-select: -moz-none;
-o-user-select:none;
user-select: none;
}
.sp-container.sp-input-disabled .sp-input-container {
display: none;
}
.sp-container.sp-buttons-disabled .sp-button-container {
display: none;
}
.sp-container.sp-palette-buttons-disabled .sp-palette-button-container {
display: none;
}
.sp-palette-only .sp-picker-container {
display: none;
}
.sp-palette-disabled .sp-palette-container {
display: none;
}
.sp-initial-disabled .sp-initial {
display: none;
}
/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */
.sp-sat {
background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
}
.sp-val {
background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
}
.sp-hue {
background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
}
/* IE filters do not support multiple color stops.
Generate 6 divs, line them up, and do two color gradients for each.
Yes, really.
*/
.sp-1 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
}
.sp-2 {
height:16%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
}
.sp-3 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
}
.sp-4 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
}
.sp-5 {
height:16%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
}
.sp-6 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
}
.sp-hidden {
display: none !important;
}
/* Clearfix hack */
.sp-cf:before, .sp-cf:after { content: ""; display: table; }
.sp-cf:after { clear: both; }
.sp-cf { *zoom: 1; }
/* Mobile devices, make hue slider bigger so it is easier to slide */
@media (max-device-width: 480px) {
.sp-color { right: 40%; }
.sp-hue { left: 63%; }
.sp-fill { padding-top: 60%; }
}
.sp-dragger {
border-radius: 5px;
height: 5px;
width: 5px;
border: 1px solid #fff;
background: #000;
cursor: pointer;
position:absolute;
top:0;
left: 0;
}
.sp-slider {
position: absolute;
top:0;
cursor:pointer;
height: 3px;
left: -1px;
right: -1px;
border: 1px solid #000;
background: white;
opacity: .8;
}
/*
Theme authors:
Here are the basic themeable display options (colors, fonts, global widths).
See http://bgrins.github.io/spectrum/themes/ for instructions.
*/
.sp-container {
border-radius: 0;
background-color: #ECECEC;
border: solid 1px #f0c49B;
padding: 0;
}
.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear {
font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
.sp-top {
margin-bottom: 3px;
}
.sp-color, .sp-hue, .sp-clear {
border: solid 1px #666;
}
/* Input */
.sp-input-container {
float:right;
width: 100px;
margin-bottom: 4px;
}
.sp-initial-disabled .sp-input-container {
width: 100%;
}
.sp-input {
font-size: 12px !important;
border: 1px inset;
padding: 4px 5px;
margin: 0;
width: 100%;
background:transparent;
border-radius: 3px;
color: #222;
}
.sp-input:focus {
border: 1px solid orange;
}
.sp-input.sp-validation-error {
border: 1px solid red;
background: #fdd;
}
.sp-picker-container , .sp-palette-container {
float:left;
position: relative;
padding: 10px;
padding-bottom: 300px;
margin-bottom: -290px;
}
.sp-picker-container {
width: 172px;
border-left: solid 1px #fff;
}
/* Palettes */
.sp-palette-container {
border-right: solid 1px #ccc;
}
.sp-palette-only .sp-palette-container {
border: 0;
}
.sp-palette .sp-thumb-el {
display: block;
position:relative;
float:left;
width: 24px;
height: 15px;
margin: 3px;
cursor: pointer;
border:solid 2px transparent;
}
.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
border-color: orange;
}
.sp-thumb-el {
position:relative;
}
/* Initial */
.sp-initial {
float: left;
border: solid 1px #333;
}
.sp-initial span {
width: 30px;
height: 25px;
border:none;
display:block;
float:left;
margin:0;
}
.sp-initial .sp-clear-display {
background-position: center;
}
/* Buttons */
.sp-palette-button-container,
.sp-button-container {
float: right;
}
/* Replacer (the little preview div that shows up instead of the <input>) */
.sp-replacer {
margin:0;
overflow:hidden;
cursor:pointer;
padding: 4px;
display:inline-block;
*zoom: 1;
*display: inline;
border: solid 1px #91765d;
background: #eee;
color: #333;
vertical-align: middle;
}
.sp-replacer:hover, .sp-replacer.sp-active {
border-color: #F0C49B;
color: #111;
}
.sp-replacer.sp-disabled {
cursor:default;
border-color: silver;
color: silver;
}
.sp-dd {
padding: 2px 0;
height: 16px;
line-height: 16px;
float:left;
font-size:10px;
}
.sp-preview {
position:relative;
width:25px;
height: 20px;
border: solid 1px #222;
margin-right: 5px;
float:left;
z-index: 0;
}
.sp-palette {
*width: 220px;
max-width: 220px;
}
.sp-palette .sp-thumb-el {
width:16px;
height: 16px;
margin:2px 1px;
border: solid 1px #d0d0d0;
}
.sp-container {
padding-bottom:0;
}
/* Buttons: http://hellohappy.org/css3-buttons/ */
.sp-container button {
background-color: #eeeeee;
background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
border: 1px solid #ccc;
border-bottom: 1px solid #bbb;
border-radius: 3px;
color: #333;
font-size: 14px;
line-height: 1;
padding: 5px 4px;
text-align: center;
text-shadow: 0 1px 0 #eee;
vertical-align: middle;
}
.sp-container button:hover {
background-color: #dddddd;
background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
border: 1px solid #bbb;
border-bottom: 1px solid #999;
cursor: pointer;
text-shadow: 0 1px 0 #ddd;
}
.sp-container button:active {
border: 1px solid #aaa;
border-bottom: 1px solid #888;
-webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
}
.sp-cancel {
font-size: 11px;
color: #d93f3f !important;
margin:0;
padding:2px;
margin-right: 5px;
vertical-align: middle;
text-decoration:none;
}
.sp-cancel:hover {
color: #d93f3f !important;
text-decoration: underline;
}
.sp-palette span:hover, .sp-palette span.sp-thumb-active {
border-color: #000;
}
.sp-preview, .sp-alpha, .sp-thumb-el {
position:relative;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
}
.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner {
display:block;
position:absolute;
top:0;left:0;bottom:0;right:0;
}
.sp-palette .sp-thumb-inner {
background-position: 50% 50%;
background-repeat: no-repeat;
}
.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
}
.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
}
.sp-clear-display {
background-repeat:no-repeat;
background-position: center;
background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==);
}
@@ -0,0 +1 @@
"use strict";(self.webpackChunk_am5=self.webpackChunk_am5||[]).push([[4837],{9295:function(t,e,i){i.r(e),i.d(e,{am5themes_Animated:function(){return s}});var a=i(3409);class n extends a.Q{setupDefaultRules(){super.setupDefaultRules(),this.rule("Component").setAll({interpolationDuration:600}),this.rule("Hierarchy").set("animationDuration",600),this.rule("Scrollbar").set("animationDuration",600),this.rule("Tooltip").set("animationDuration",300),this.rule("MapChart").set("animationDuration",1e3),this.rule("MapChart").set("wheelDuration",300),this.rule("Entity").setAll({stateAnimationDuration:600}),this.rule("Sprite").states.create("default",{stateAnimationDuration:600}),this.rule("Tooltip",["axis"]).setAll({animationDuration:200}),this.rule("WordCloud").set("animationDuration",500)}}const s=n}},function(t){var e=(9295,t(t.s=9295)),i=window;for(var a in e)i[a]=e[a];e.__esModule&&Object.defineProperty(i,"__esModule",{value:!0})}]);
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk_am5=self.webpackChunk_am5||[]).push([[7891],{5650:function(e,s,t){t.r(s),t.d(s,{am5themes_Dataviz:function(){return o}});var u=t(1112),l=t(3409);class r extends l.Q{setupDefaultRules(){super.setupDefaultRules(),this.rule("ColorSet").setAll({colors:[u.Il.fromHex(2634320),u.Il.fromHex(9448493),u.Il.fromHex(13976381),u.Il.fromHex(15750208)],reuse:!1,passOptions:{lightness:.05,hue:0}})}}const o=r}},function(e){var s=(5650,e(e.s=5650)),t=window;for(var u in s)t[u]=s[u];s.__esModule&&Object.defineProperty(t,"__esModule",{value:!0})}]);
//# sourceMappingURL=Dataviz.js.map
@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk_am5=self.webpackChunk_am5||[]).push([[4583],{2250:function(e,l,r){r.r(l),r.d(l,{am5themes_Material:function(){return s}});var o=r(1112),f=r(3409);class m extends f.Q{setupDefaultRules(){super.setupDefaultRules(),this.rule("ColorSet").setAll({colors:[o.Il.fromHex(16007990),o.Il.fromHex(15277667),o.Il.fromHex(10233776),o.Il.fromHex(6765239),o.Il.fromHex(4149685),o.Il.fromHex(2201331),o.Il.fromHex(240116),o.Il.fromHex(48340),o.Il.fromHex(38536),o.Il.fromHex(5025616),o.Il.fromHex(9159498),o.Il.fromHex(13491257),o.Il.fromHex(16771899),o.Il.fromHex(16761095),o.Il.fromHex(16750592),o.Il.fromHex(16733986),o.Il.fromHex(7951688),o.Il.fromHex(10395294),o.Il.fromHex(6323595)],reuse:!0})}}const s=m}},function(e){var l=(2250,e(e.s=2250)),r=window;for(var o in l)r[o]=l[o];l.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})}]);
//# sourceMappingURL=Material.js.map
@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk_am5=self.webpackChunk_am5||[]).push([[2480],{8283:function(e,r,l){l.r(r),l.d(r,{am5themes_Moonrise:function(){return f}});var o=l(1112),s=l(3409);class u extends s.Q{setupDefaultRules(){super.setupDefaultRules(),this.rule("ColorSet").setAll({colors:[o.Il.fromHex(3805954),o.Il.fromHex(6296069),o.Il.fromHex(9054989),o.Il.fromHex(13065764),o.Il.fromHex(13082457),o.Il.fromHex(10786154),o.Il.fromHex(8815977),o.Il.fromHex(7696225),o.Il.fromHex(5792096),o.Il.fromHex(6388099)],reuse:!0})}}const f=u}},function(e){var r=(8283,e(e.s=8283)),l=window;for(var o in r)l[o]=r[o];r.__esModule&&Object.defineProperty(l,"__esModule",{value:!0})}]);
//# sourceMappingURL=Moonrise.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

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