审批二开

This commit is contained in:
pengyuthon
2024-05-28 20:05:16 +08:00
parent ca79e6c698
commit c93dbedf65
56 changed files with 37300 additions and 5 deletions
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
</project>
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/reportbro.iml" filepath="$PROJECT_DIR$/.idea/reportbro.iml" />
</modules>
</component>
</project>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Web2Py" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/templates" />
</list>
</option>
</component>
</module>
+82
View File
@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="995a0aae-594c-4228-8fd2-ae24ae206fc4" name="Default Changelist" comment="" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="22" />
<option name="width" value="1920" />
<option name="height" value="1040" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane" />
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="995a0aae-594c-4228-8fd2-ae24ae206fc4" name="Default Changelist" comment="" />
<created>1701846826371</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1701846826371</updated>
<workItem from="1701846828758" duration="10000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="10000" />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<layout>
<window_info id="Favorites" side_tool="true" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Database Changes" />
<window_info anchor="bottom" id="Version Control" />
<window_info anchor="bottom" id="Python Console" />
<window_info anchor="bottom" id="Terminal" />
<window_info anchor="bottom" id="Event Log" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
<window_info anchor="right" id="NexChatGPT" />
<window_info anchor="right" id="SciView" />
<window_info anchor="right" id="Database" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
</layout>
</component>
</project>
+4
View File
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import controllers
from . import models
+53
View File
@@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
{
'name': "fast_reportbro",
'version':'1.7',
'summary': """
reportbro Frontend and backend report service storage, output module, support for custom data sources, custom template PDF printing
""",
'description': """
reportbro Frontend and backend report service storage, output module, support for custom data sources, custom template PDF printing
""",
'currency':'USD',
'support':'email:444713077@qq.com',
'author': 'zxltwins',
'website': "www.odoo.com",
'category': 'tools/print',
'depends': ['base'],
"external_dependencies": {"python": ["requests", "reportbro-lib"]},
# always loaded
'data': [
'security/ir.model.access.csv',
'views/templates.xml'
],
'application': True,
'installable': True,
'images':[
'static/description/main_screenshot.png',
'static/description/icon.png',
],
'assets': {
'web._assets_primary_variables': [
],
'web.assets_backend': [
'reportbro/static/src/js/report_designer.js'
],
'web.assets_frontend': [
],
'web.assets_tests': [
],
'web.report_assets_common': [
],
'web.report_assets_pdf': [
],
},
'license': 'LGPL-3',
}
+3
View File
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import report_server
+182
View File
@@ -0,0 +1,182 @@
import uuid, json, werkzeug, werkzeug.utils
from reportbro import Report, ReportBroError
from odoo import http
from odoo.tools import date_utils
from odoo.http import request, Response,JsonRPCDispatcher
from jinja2 import Environment, PackageLoader
from urllib.parse import quote
from werkzeug.exceptions import NotFound
# def _json_response(self, result=None, error=None):
# ir_http = self.request.registry['ir.http']
# try:
# rule, args = ir_http._match(self.request.httprequest.path)
# except NotFound:
# self.params = self.request.get_http_params()
# response = ir_http._serve_fallback()
# if response:
# self.dispatcher.post_dispatch(response)
# return response
# raise
#
#
# if rule.endpoint and rule.endpoint.routing.get('my_json'):
# response = {}
# if error is not None:
# response['error'] = error
# if result is not None:
# response = result
# else:
# # odoo返回的默认数据格式
# response = {
# 'jsonrpc': '2.0',
# 'id': self.jsonrequest.get('id')
# }
# if error is not None:
# response['error'] = error
# if result is not None:
# response['result'] = result
#
# mime = 'application/json'
# body = json.dumps(response, default=date_utils.json_default)
#
# return Response(
# body, status=error and error.pop('http_status', 200) or 200,
# headers=[('Content-Type', mime), ('Content-Length', len(body))]
# )
#
# # 重写JsonRequest中的_json_response方法
#
# setattr(JsonRPCDispatcher, '_response', _json_response)
class WmsReportServer(http.Controller):
@http.route('/report_designer', type='http', auth='public', csrf=False, methods=['Get'], website=True, cors="*")
def report_designer(self, **kw):
env = Environment(loader=PackageLoader('odoo.addons.reportbro', 'templates'))
template = env.get_template('report_designer.html')
return template.render()
@http.route('/api/report/get_report_id', type='json', auth='public', csrf=False, methods=['Post'], website=True,
cors="*", my_json=True)
def get_report_id(self, *args, **kwargs):
res=request.env['report.designer'].sudo().search([],limit=1,order='create_date desc')
id=res.name
#res.sudo().unlink()
return {'id':id,'code':0}
@http.route('/api/report/report_save', type='json', auth='public', csrf=False, methods=['Post'], website=True,
cors="*", my_json=True)
def report_save(self, *args, **kwargs):
data = dict(request.dispatcher.jsonrequest or {})
report_id = data.get('report_id', None)
report_data = data.get('report_data', None)
print(json.dumps(report_data))
if report_data is None or report_id is None:
return {'code': 1, 'msg': '保存失败'}
res = request.env['report.report'].sudo().search([('id', '=', int(report_id))], limit=1)
if res:
res.sudo().write({'report_data': json.dumps(report_data)})
return {'code': 0, 'msg': '保存成功'}
else:
return {'code': 1, 'msg': '保存失败'}
@http.route('/api/report/report_read', type='json', auth='public', csrf=False, methods=['Post'], website=True,cors="*", my_json=True)
def report_read(self, *args, **kwargs):
data = dict(request.dispatcher.jsonrequest or {})
report_id = data.get('report_id', None)
if report_id is None:
return {'code': 1, 'msg': '读取失败'}
res = request.env['report.report'].sudo().search([('id', '=', int(report_id))], limit=1)
if res:
report_data=res.report_data
if res.report_data is False:
report_data =str(json.dumps({'docElements': [], 'parameters': [
{
'id': 1, 'name': 'page_count', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
'nullable': False, 'pattern': '', 'expression': '', 'showOnlyNameType': True,
'testData': '111'
},
{
'id': 2, 'name': 'page_number', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
'nullable': False, 'pattern': '', 'expression': '', 'showOnlyNameType': True,
'testData': '222'
}],
'styles': [], 'version': 3,
'documentProperties': {
'pageFormat': 'A4', 'pageWidth': '', 'pageHeight': '',
'unit': 'mm', 'orientation': 'portrait', 'contentHeight': '',
'marginLeft': '', 'marginTop': '', 'marginRight': '',
'marginBottom': '', 'header': True, 'headerSize': '80',
'headerDisplay': 'always', 'footer': True, 'footerSize': '80',
'footerDisplay': 'always', 'patternLocale': 'en',
'patternCurrencySymbol': '$' }}))
return {'code': 0, 'msg': json.loads(report_data)}
else:
return {'code': 1, 'msg': '模板不存在'}
@http.route('/api/report/report_server/run', type='http', auth='public', methods=['Get', 'Post'], csrf=False,
website=True, cors="*", my_json=True)
def report_run(self, **kw):
add_fonts = [dict(value='msyh', filename='msyh.ttf',bold_filename='msyhbd.ttf',italic_filename='msyh.ttf',bold_italic_filename='msyh.ttf')]
method = str(request.httprequest.method)
if method == 'POST':
json_data = json.loads(kw['data'])
report_definition = json_data.get('report')
output_format = json_data.get('outputFormat')
if output_format not in ('pdf', 'xlsx'):
return {'HttpCode': 400, 'Msg': 'outputFormat parameter missing or invalid'}
data = json_data.get('data')
data=eval(str(json.dumps(data)).replace('False',''))
is_test_data = bool(json_data.get('isTestData'))
try:
report = Report(report_definition, data, is_test_data, additional_fonts=add_fonts)
except Exception as e:
return {'HttpCode': 400, 'Msg': 'failed to initialize report: ' + str(e)}
if report.errors:
return {'HttpCode': 400, 'Msg': 'ReportError: ' + str(report.errors)}
try:
key = str(uuid.uuid4())
report_file_pdf = bytes(report.generate_pdf())
report_file_xlsx = bytes(report.generate_xlsx())
if request.env['wms.print.list'].search_count([('p_key', '=', key)]) == 0:
request.env['wms.print.list'].create({'p_key': key, 'report_file_pdf': report_file_pdf, 'report_file_xlsx': report_file_xlsx})
return request.make_response('key:' + key, headers=[('Content-Type', 'text/html')])
except ReportBroError as err:
return {'HttpCode': 400, 'Msg': 'ReportBroError: ' + str(err.error)}
if method == 'GET':
key = kw['key']
output_format = kw['outputFormat']
report = request.env['wms.print.list'].search([('p_key', '=', key)], limit=1)
fname = 'report'
if 'report_id' in kw:
fname = kw['report_id']
if report:
report_file = report.report_file_pdf
if output_format == 'pdf':
report_headers = [('Content-Type', 'application/pdf'), ('Content-Length', len(report_file)), (
'Content-Disposition',
'inline; filename="%s.pdf"'%(quote(fname)))]
else:
report_file = report.report_file_xlsx
report_headers = [
('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'),
('Content-Length', len(report_file)), ('Content-Disposition',
'inline; filename="%s.xlsx"'%(quote(fname)))]
return werkzeug.wrappers.Response(report_file, status=200, headers=report_headers)
else:
return {'HttpCode': 400, 'Msg': 'ReportBroError: '}
Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

+3
View File
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import datasource,report
+61
View File
@@ -0,0 +1,61 @@
import decimal, json, requests, os, uuid
from odoo import models,fields
from odoo.exceptions import UserError
from PyPDF2 import PdfFileWriter, PdfFileReader
class report_designer(models.Model):
_name = 'report.designer'
_description = 'report id'
name=fields.Char('name')
class wms_datasource(models.TransientModel):
_name = 'wms.datasource'
_description = '报表数据源'
'''
各个报表的数据源,集中写在这里
'''
def get_data(self,report_id,data_id,d_main,d_details,m_key):
'''
自动获取数据源
:param report_id:
:param data_id:
:param d_main:
:param d_details:
:param m_key:
:return:
'''
report_report=self.env['report.report'].sudo().browse(report_id)
report_report_main=self.env['report.report.main'].sudo().search([('report_main_id','=',report_report.id),('is_report','=',True)])
#order_id = 0
res_detail = []
# 行序号 可以单独控制生成样式
index = 1
if d_details:
report_report_detail = self.env['report.report.detail'].sudo().search([('report_detail_id', '=', report_report.id), ('is_report', '=', True)])
data_line = self.env[d_details].sudo().search([(m_key, 'in', data_id)])
for s in data_line:
s_detail = {}
s_detail['index'] = str(index)
for report_detail in report_report_detail:
if report_detail.is_report:
s_detail[report_detail.field_params] = str(eval(report_detail.field_value))
res_detail.append(s_detail)
index += 1
order_id = int(eval('s.' + m_key + '.id'))
else:
order_id = int(data_id[0])
# 主表
p_main = self.env[d_main].sudo().browse(order_id)
data={}
for s in p_main:
for report_main in report_report_main:
if report_main.is_report:
data[report_main.field_params]=str(eval(report_main.field_value))
data['res_detail'] = res_detail
return data
+454
View File
@@ -0,0 +1,454 @@
import json, uuid,requests,os
from odoo import models, fields, api
from odoo.exceptions import UserError
from . import datasource
from PyPDF2 import PdfFileWriter, PdfFileReader
FIELD_TYPES = [(key, key) for key in sorted(fields.Field.by_type)]
import tempfile
#################
dir=tempfile.gettempdir()
#dir='/opt/odoo'
login='admin'
password='admin'
##################
class BaseModelExtend(models.AbstractModel):
_name = 'base.model.extend'
_description = '继承基类模型'
def _register_hook(self):
def GetUrl(self):
self._cr.execute("select value from ir_config_parameter where key ='web.base.url'")
dicts = self._cr.dictfetchall()
return str(dicts[0]['value'])
def getOdooToken(self):
url = GetUrl(self)+"/web/session/authenticate"
# 传入需要访问的数据库名称,登录账号与密码
data = {
"params": {
"db": self._cr.dbname,
"login": login,
"password": password,
}
}
headers = {'Content-type': 'application/json'}
response = requests.post(url, headers=headers, json=data)
return response.cookies["session_id"]
def report_pdf_prints(self, args, types):
'''
PDF打印公共方法
:param self:
:return:
'''
# 模型数据ID
# 模型名称
report_id = args
print_type = 'pdf' if types == 0 else 'xlsx'
data_id = self._context.get('active_ids', None)
report_report = self.env['report.report'].browse(report_id)
data_model=self._context.get('active_model', None)
data_model_details=report_report.model_detail_id.model if report_report.report_type=='bill' else ''
if data_model is None:
raise UserError('获取数据源失败')
res_id=self.env[data_model].read_group([('id','in',data_id)],[report_report.group_field],[report_report.group_field])
headers = {
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',
'Cookie':'session_id='+getOdooToken(self)
}
inFileList = []
for s_code in res_id:
s_id=[]
wheres_id = self.env[data_model].search([('id', 'in', data_id),(report_report.group_field,'=',s_code[report_report.group_field])])
for wid in wheres_id:
s_id.append(wid.id)
dic = {}
dic['report'] = json.loads(report_report.report_data)
dic['data'] = datasource.wms_datasource.get_data(self,report_id,s_id,data_model,data_model_details,report_report.model_main_key)
dic['outputFormat'] = print_type
dic['isTestData'] = True
res = requests.post(self.GetUrl() + '/api/report/report_server/run', data={'data': str(json.dumps(dic))},headers=headers, allow_redirects=True)
print(res.text)
key = str(res.text.split(':')[1])
url=self.GetUrl() + '/api/report/report_server/run?key=' + key + '&outputFormat=' + print_type
r = requests.get(url, stream=True,cookies={'session_id':getOdooToken(self)})
pdf = "/%s.pdf" % key
# 获取temp临时文件路径
pdf = dir + pdf
inFileList.append(pdf)
with open(pdf, "wb") as pdf:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
pdf.write(chunk)
filename = dir + "/print.pdf"
pdfFileWriter = PdfFileWriter()
for inFile in inFileList:
with open(inFile, 'rb') as f:
pdfReader = PdfFileReader(f)
numPages = pdfReader.getNumPages()
for index in range(0, numPages):
pageObj = pdfReader.getPage(index)
pdfFileWriter.addPage(pageObj)
pdfFileWriter.write(open(filename, 'wb'))
os.unlink(inFile)
with open(filename, 'rb') as pdf_document:
pdf_content = pdf_document.read()
os.unlink(filename)
key_uid = str(uuid.uuid4())
self.env['wms.print.list'].create({'p_key': key_uid, 'report_file_pdf': pdf_content})
if print_type == 'pdf':
#打开新页面
# return {
# 'type': 'ir.actions.act_url',
# 'title':'打印预览',
# 'name': '打印预览',
# 'url': self.GetUrl() + '/api/report/report_server/run?key=' +key_uid+'&outputFormat=' + print_type + '&report_id='+str(args),
# 'target': 'new'
#
# }
return {
'type': 'ir.actions.act_window',
'name': '打印预览',
'res_model': 'wms.print.list',
'views': [[False, "form"]],
'target': 'new',
'context': {
'default_name': '<iframe src="' + self.GetUrl() + '/api/report/report_server/run?key=' +key_uid + '&outputFormat=' + print_type + '&report_id='+str(args)+'" marginheight="0" marginwidth="0" width="100%" height="700px" />'}
}
models.BaseModel.GetUrl = GetUrl
models.BaseModel.report_pdf_prints = report_pdf_prints
return super(BaseModelExtend, self)._register_hook()
class wmsprintlist(models.Model):
_name = 'wms.print.list'
_description = '打印服务表'
p_key=fields.Char('内容键')
report_file_pdf= fields.Binary('PDF', attachment=False)
report_file_xlsx = fields.Binary('XLSX',attachment=False)
print_status=fields.Boolean('打印状态',default=False)
name=fields.Html('预览',store=False,sanitize=False)
class ReportReport(models.Model):
_name = "report.report"
_description = "Report"
name = fields.Char(string='报表名称', required=True)
model_id = fields.Many2one('ir.model', string='主表模型', ondelete="cascade", required=True,help='至少要存在一个数据模型')
model_detail_id = fields.Many2one('ir.model', string='明细表模型', ondelete="cascade")
report = fields.Text(string='报表')
model_main_key = fields.Char('主模型Key', help='主数据模型和明细模型的关联字段名称', default='order_id')
model_ids = fields.One2many('report.report.main', 'report_main_id', string='主表字段')
model_detail_ids = fields.One2many('report.report.detail', 'report_detail_id', string='明细字段')
display_complete = fields.Boolean(string='动作添加', default=False)
display_completes = fields.Boolean(string='批量动作添加', default=False)
reset_designer = fields.Boolean(string='重新设计', default=False, help='勾选上会进入空白模板,不再读取存储的配置')
report_data = fields.Text('模板数据')
data_source = fields.Char(string='数据源')
test_data = fields.Text('数据结构')
pdf_name=fields.Text('PDF名称')
report_type=fields.Selection(selection=[('bill','单据'),('report','报表')],string='报表类型',help='一般带主表,明细表模型的为单据类报表,单个模型的为纯报表类型')
group_field=fields.Char(string='套打字段',help='用于批量打印时,区分每页的关键字段')
@api.model
def default_get(self, fields):
res = super(ReportReport, self).default_get(fields)
res['data_source'] = 'a' + ''.join(str(uuid.uuid4()).split('-'))
return res
def add_print_actions(self):
self.del_print_actions()
res = self.env['report.report'].search([('id', '=', self.id)])
if res.group_field is False:
raise UserError('汇总打印字段不能为空')
model = self.env['ir.model'].search([('model', '=', 'report.report')])
res.write({'display_completes': True})
act_type='list,form' if res.report_type=='bill' else 'list'
sql_pdf = "insert into ir_act_server (name,type,binding_model_id,binding_type,binding_view_types,usage,state,sequence,model_id,model_name,code,activity_date_deadline_range_type,activity_user_type) values ('" + json.dumps({'zh_CN':self.name}) + "','ir.actions.server', " + str(
res.model_id.id) + ",'action', '"+act_type+"','ir_actions_server','code',5, " + str(
model.id) + ",'report.report','action = model.report_pdf_prints(" + str(self.id) + ",0)','days','specific');"
self._cr.execute(sql_pdf)
def del_print_actions(self):
res = self.env['report.report'].search([('id', '=', self.id)])
res.write({'display_completes': False})
self._cr.execute('delete from ir_act_server where name=%s',(json.dumps({'zh_CN':self.name}),))
def button_designer(self):
res = self.env['report.report'].search([('id', '=', self.id)])
# 重新设置模板参数
if res.reset_designer:
report_main = self.env['report.report.main'].search(
[('report_main_id', '=', self.id), ('is_report', '=', True)])
report_detail = self.env['report.report.detail'].search(
[('report_detail_id', '=', self.id), ('is_report', '=', True)])
res_main = []
res_detail = []
for r in report_main:
res_main.append(r.field_id.id)
for r2 in report_detail:
res_detail.append(r2.field_id.id)
#report_main_names = self.env['ir.model.fields'].search([('id', 'in', res_main)])
#report_detail_names = self.env['ir.model.fields'].search([('id', 'in', res_detail)])
parameters = [{
'id': 1, 'name': 'page_count', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
'nullable': False, 'pattern': '', 'expression': '', 'showOnlyNameType': True,
'testData': ''
},
{
'id': 2, 'name': 'page_number', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
'nullable': False, 'pattern': '', 'expression': '', 'showOnlyNameType': True,
'testData': ''
}]
data = {}
index = 3
# 主表
for rmn in report_main:
data[rmn.field_params] = ''
parameters.append({
'id': index,
'name': rmn.field_params,
'type': self.get_type(rmn.ttype),
'arrayItemType': self.get_type(rmn.ttype),
'eval': False,
'nullable': False,
'pattern': '',
'expression': '',
'showOnlyNameType': False,
'testData': ''
})
index += 1
# 序号
children = [{
'id': 888,
'name': 'index',
'type': 'string',
'arrayItemType': 'string',
'eval': False,
'nullable': False,
'pattern': '',
'expression': '',
'showOnlyNameType': False,
'testData': ''}]
test_data2 = []
# 明细表
r={}
for rmn in report_detail:
r[rmn.field_params]= ''
children.append({
'id': index,
'name': rmn.field_params,
'type': self.get_type(rmn.ttype),
'arrayItemType':self.get_type(rmn.ttype),
'eval': False,
'nullable': False,
'pattern': '',
'expression': '',
'showOnlyNameType': False,
'testData': ''})
index += 1
test_data2.append(r)
parameters.append({
'id': 9999,
'name': 'res_detail',
'type': 'array',
'arrayItemType': 'array',
'eval': False,
'nullable': False,
'pattern': '',
'expression': '',
'showOnlyNameType': False,
'testData': '',
'children': children
})
data['res_detail'] = test_data2
r_data = res.report_data
if res.report_data is False:
r_data = str(json.dumps({'docElements': [], 'parameters': [
{
'id': 1, 'name': 'page_count', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
'nullable': False, 'pattern': '', 'expression': '', 'showOnlyNameType': True,
'testData': ''
},
{
'id': 2, 'name': 'page_number', 'type': 'number', 'arrayItemType': 'string', 'eval': False,
'nullable': False, 'pattern': '', 'expression': '', 'showOnlyNameType': True,
'testData': ''
}],
'styles': [], 'version': 3,
'documentProperties': {
'pageFormat': 'A4', 'pageWidth': '', 'pageHeight': '',
'unit': 'mm', 'orientation': 'portrait', 'contentHeight': '',
'marginLeft': '', 'marginTop': '', 'marginRight': '',
'marginBottom': '', 'header': True, 'headerSize': '80',
'headerDisplay': 'always', 'footer': True, 'footerSize': '80',
'footerDisplay': 'always', 'patternLocale': 'en',
'patternCurrencySymbol': '$'}}))
report_data = json.loads(r_data)
report_data['parameters'] = parameters
res.write({'report_data': json.dumps(report_data), 'test_data': data, 'reset_designer': False})
self.env['report.designer'].sudo().create({'name': str(self.id)})
return {
'type': 'ir.actions.client',
'name': '报表设计',
'tag': 'report_designer',
'target': 'current',
'params': {
'report_id': self.id
}
}
def get_type(self, type_name):
res = {'char': 'string',
'text': 'string',
'one2many': 'string',
'many2one': 'string',
'many2many': 'string',
'integer': 'number',
'float': 'number',
'datetime': 'string',
'date': 'string',
'boolean': 'boolean',
'selection': 'string',
'monetary': 'number',
'binary': 'string',
'html': 'string',
'reference': 'string',
'image': 'image',
'image_url': 'string',
'json':'string'
}
return res[type_name]
class ReportReportMain(models.Model):
_name = "report.report.main"
_description = "Report Main"
report_main_id = fields.Many2one('report.report', string='Report Main')
model_id = fields.Many2one('ir.model', string='Model', ondelete="cascade")
field_domain = fields.Many2many('ir.model.fields', string='Field Domain', compute='_compute_field_domain')
field_id = fields.Many2one('ir.model.fields', string='字段名称', ondelete="cascade", required=True)
field_description = fields.Char(string='字段', related='field_id.name')
field_params = fields.Char(string='参数')
field_value = fields.Char(string='字段取值', compute='_field_custom',store=True,inverse='_field_custom_inverse')
ttype = fields.Selection(selection=FIELD_TYPES, string='类型', related='field_id.ttype')
is_report = fields.Boolean(string='报表', default=True)
@api.depends('field_id')
def _field_custom(self):
for s in self:
s.field_params=s.field_description
if s.ttype in ['text', 'char','html']:
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
elif s.ttype in ['date', 'datetime', 'boolean']:
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
elif s.ttype in ['integer', 'float', 'monetary']:
s.field_value = "s." + str(s.field_id.name) + " or 0"
elif s.ttype in ['one2many', 'many2one', 'many2many']:
s.field_value = "str(s." + str(s.field_id.name) + ".name) or ''"
elif s.ttype=='selection':
s.field_value = "str(dict(self.env['"+str(s.model_id.model)+"'].fields_get(allfields=['"+str(s.field_id.name)+"'])['"+str(s.field_id.name)+"']['selection'])[s."+str(s.field_id.name)+"]) or ''"
else:
s.field_value = "s." + str(s.field_id.name)
def _field_custom_inverse(self):
pass
@api.depends('model_id')
def _compute_field_domain(self):
for record in self:
fields = []
record.field_domain = self._get_fields(fields=fields, model=record.model_id)
def _get_fields(self, fields=None, model=None):
for field in model.field_id:
if field.ttype != 'one2many':
fields.append(field.id)
return fields
class ReportReportDetail(models.Model):
_name = "report.report.detail"
_description = "Report detail"
report_detail_id = fields.Many2one('report.report', string='Report detail')
model_id = fields.Many2one('ir.model', string='Model', ondelete="cascade")
field_domain = fields.Many2many('ir.model.fields', string='Field Domain', compute='_compute_field_domain')
field_id = fields.Many2one('ir.model.fields', string='字段名称', ondelete="cascade", required=True)
field_description = fields.Char(string='字段', related='field_id.name')
field_params = fields.Char(string='参数')
field_value = fields.Char(string='字段取值',compute='_field_custom',store=True,inverse='_field_custom_inverse')
ttype = fields.Selection(selection=FIELD_TYPES, string='类型', related='field_id.ttype')
is_report = fields.Boolean(string='报表', default=True)
@api.depends('field_id')
def _field_custom(self):
for s in self:
s.field_params = s.field_description
if s.ttype in ['text', 'char', 'html']:
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
elif s.ttype in ['date', 'datetime', 'boolean']:
s.field_value = "str(s." + str(s.field_id.name) + ") or ''"
elif s.ttype in ['integer', 'float', 'monetary']:
s.field_value = "s." + str(s.field_id.name) + " or 0"
elif s.ttype in ['one2many', 'many2one', 'many2many']:
s.field_value = "str(s." + str(s.field_id.name) + ".name) or ''"
elif s.ttype == 'selection':
s.field_value = "str(dict(self.env['" + str(s.model_id.model) + "'].fields_get(allfields=['" + str(
s.field_id.name) + "'])['" + str(s.field_id.name) + "']['selection'])[s." + str(
s.field_id.name) + "]) or ''"
else:
s.field_value = "s." + str(s.field_id.name)
def _field_custom_inverse(self):
pass
@api.depends('model_id')
def _compute_field_domain(self):
for record in self:
fields = []
record.field_domain = self._get_fields(fields=fields, model=record.model_id)
def _get_fields(self, fields=None, model=None):
for field in model.field_id:
if field.ttype != 'one2many':
fields.append(field.id)
return fields
+14
View File
@@ -0,0 +1,14 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_wms_datasource,wms.datasource,model_wms_datasource,,1,1,1,1
access_wms_print_list,wms.print.list,model_wms_print_list,,1,1,1,1
access_report_report,report.report,model_report_report,,1,1,1,1
access_report_report_main,report.report.main,model_report_report_main,,1,1,1,1
access_report_report_detail,report.report.detail,model_report_report_detail,,1,1,1,1
access_report_designer,report.designer,model_report_designer,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_wms_datasource wms.datasource model_wms_datasource 1 1 1 1
3 access_wms_print_list wms.print.list model_wms_print_list 1 1 1 1
4 access_report_report report.report model_report_report 1 1 1 1
5 access_report_report_main report.report.main model_report_report_main 1 1 1 1
6 access_report_report_detail report.report.detail model_report_report_detail 1 1 1 1
7 access_report_designer report.designer model_report_designer 1 1 1 1
Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

+24
View File
@@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="70" height="70" viewBox="0 0 70 70">
<defs>
<path id="icon-a" d="M4 0h61c4 0 5 1 5 5v60c0 4-1 5-5 5H4c-3 0-4-1-4-5V5c0-4 1-5 4-5z"/>
<linearGradient id="icon-c" x1="98.162%" x2="0%" y1="1.838%" y2="100%">
<stop offset="0%" stop-color="#797DA5"/>
<stop offset="50.799%" stop-color="#6D7194"/>
<stop offset="100%" stop-color="#626584"/>
</linearGradient>
<path id="icon-d" d="M56.583 23.333h-3.5c-.518 0-.983.226-1.304.584h-1.715l-2.27-2.647-.012-.013a7.581 7.581 0 0 0-5.707-2.59h-3.394c-1.294 0-2.545.36-3.623 1.021a8.19 8.19 0 0 0-3.95-1.021h-2.342c-2.107 0-4.2.818-5.775 2.391l-2.857 2.859H18.22a1.745 1.745 0 0 0-1.304-.584h-3.5a1.75 1.75 0 0 0-1.75 1.75v17.5c0 .967.783 1.75 1.75 1.75h3.5a1.75 1.75 0 0 0 1.65-1.166h1.37l5.495 4.927c1.862 1.928 4.37 3.24 7.042 3.24 1.195 0 2.354-.281 3.362-.798 1.818.037 3.726-.756 5.036-2.29a7.109 7.109 0 0 0 3.698-2.523c1.53-.32 2.97-1.202 3.896-2.556h2.967a1.75 1.75 0 0 0 1.65 1.166h3.5a1.75 1.75 0 0 0 1.75-1.75v-17.5a1.75 1.75 0 0 0-1.75-1.75zM15.167 42a1.167 1.167 0 1 1 0-2.333 1.167 1.167 0 0 1 0 2.333zm30.08-.42c-1.12 1.042-2.69.826-2.914.583.103.976-1.331 2.993-3.579 2.835-.404 1.351-2.057 2.467-3.754 1.878-.648.648-1.638.957-2.526.957-1.82 0-3.483-1.06-4.604-2.254l-5.928-5.316a2.332 2.332 0 0 0-1.557-.596h-1.718v-12.25h1.95c.619 0 1.212-.246 1.65-.684l3.2-3.2a4.667 4.667 0 0 1 3.3-1.366h2.34c.424 0 .84.057 1.24.167l-3.155 3.682a5.376 5.376 0 0 0-.048 6.96c2.362 2.833 6.663 2.86 9.077.143l1.894-2.193 5.282 6.99c.98 1.065.799 2.781-.15 3.664zm6.086-1.913H49.55a5.985 5.985 0 0 0-1.441-3.967l-5.693-7.534a1.752 1.752 0 0 0-2.907-1.894l-3.911 4.53a2.49 2.49 0 0 1-3.765-.068 1.885 1.885 0 0 1 .016-2.44l4.224-4.928a3.434 3.434 0 0 1 2.608-1.2h3.394c1.175 0 2.293.507 3.068 1.389l3.312 3.862h2.878v12.25zm3.5 2.333a1.167 1.167 0 1 1 0-2.333 1.167 1.167 0 0 1 0 2.333z"/>
</defs>
<g fill="none" fill-rule="evenodd">
<mask id="icon-b" fill="#fff">
<use xlink:href="#icon-a"/>
</mask>
<g mask="url(#icon-b)">
<path fill="url(#icon-c)" d="M0 0H70V70H0z"/>
<path fill="#FFF" fill-opacity=".383" d="M4 1h61c2.667 0 4.333.667 5 2V0H0v3c.667-1.333 2-2 4-2z"/>
<path fill="#000" d="M33.423 69H4.006C2.003 69 0 68.854 0 64.911V38.065l12.348-13.998 8.686.293L29.375 21h14.023l6.01 4.089L58 24.36v19.558L33.423 69z" opacity=".165"/>
<path fill="#000" fill-opacity=".383" d="M4 69h61c2.667 0 4.333-1 5-3v4H0v-4c.667 2 2 3 4 3z"/>
<path fill="#000" fill-rule="nonzero" d="M56.583 25.333h-3.5c-.518 0-.983.226-1.304.584h-1.715l-2.27-2.647-.012-.013a7.581 7.581 0 0 0-5.707-2.59h-3.394c-1.294 0-2.545.36-3.623 1.021a8.19 8.19 0 0 0-3.95-1.021h-2.342c-2.107 0-4.2.818-5.775 2.391l-2.857 2.859H18.22a1.745 1.745 0 0 0-1.304-.584h-3.5a1.75 1.75 0 0 0-1.75 1.75v17.5c0 .967.783 1.75 1.75 1.75h3.5a1.75 1.75 0 0 0 1.65-1.166h1.37l5.495 4.927c1.862 1.928 4.37 3.24 7.042 3.24 1.195 0 2.354-.281 3.362-.798 1.818.037 3.726-.756 5.036-2.29a7.109 7.109 0 0 0 3.698-2.523c1.53-.32 2.97-1.202 3.896-2.556h2.967a1.75 1.75 0 0 0 1.65 1.166h3.5a1.75 1.75 0 0 0 1.75-1.75v-17.5a1.75 1.75 0 0 0-1.75-1.75zM15.167 44a1.167 1.167 0 1 1 0-2.333 1.167 1.167 0 0 1 0 2.333zm30.08-.42c-1.12 1.042-2.69.826-2.914.583.103.976-1.331 2.993-3.579 2.835-.404 1.351-2.057 2.467-3.754 1.878-.648.648-1.638.957-2.526.957-1.82 0-3.483-1.06-4.604-2.254l-5.928-5.316a2.332 2.332 0 0 0-1.557-.596h-1.718v-12.25h1.95c.619 0 1.212-.246 1.65-.684l3.2-3.2a4.667 4.667 0 0 1 3.3-1.366h2.34c.424 0 .84.057 1.24.167l-3.155 3.682a5.376 5.376 0 0 0-.048 6.96c2.362 2.833 6.663 2.86 9.077.143l1.894-2.193 5.282 6.99c.98 1.065.799 2.781-.15 3.664zm6.086-1.913H49.55a5.985 5.985 0 0 0-1.441-3.967l-5.693-7.534a1.752 1.752 0 0 0-2.907-1.894l-3.911 4.53a2.49 2.49 0 0 1-3.765-.068 1.885 1.885 0 0 1 .016-2.44l4.224-4.928a3.434 3.434 0 0 1 2.608-1.2h3.394c1.175 0 2.293.507 3.068 1.389l3.312 3.862h2.878v12.25zm3.5 2.333a1.167 1.167 0 1 1 0-2.333 1.167 1.167 0 0 1 0 2.333z" opacity=".372"/>
<use fill="#FFF" fill-rule="nonzero" xlink:href="#icon-d"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

+65
View File
@@ -0,0 +1,65 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Integrate Odoo with ReportBro New</h2>
<h3 class="oe_slogan"> reportbro Frontend and backend report service storage, output module, support for custom data sources, custom template PDF printing
</h3>
<h2> Please contact us if you need customization/support for this module <a href="mailto:444713077@qq.com">444713077@qq.com</a></h2>
<div class="oe_demo oe_picture oe_screenshot">
<img src="main_screenshot.png">
</div>
</div>
</section>
<br/>
<br/>
<section class="oe_container oe_mt32">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Step 1</h2>
<div class="oe_span12">
<p class="oe_mt32 oe_mb32 text-justify"><h3>Set necessary parameter information.</h3></p>
<div class="oe_demo oe_picture oe_screenshot">
<img class='img-responsive' src="2.png">
</div>
</div>
</div>
</section>
<br/>
<br/>
<section class="oe_container oe_mt32">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Step 2</h2>
<div class="oe_span12">
<p class="oe_mt32 oe_mb32 text-justify"><h3>Enter the design page.</h3></p>
<div class="oe_demo oe_picture oe_screenshot">
<img class='img-responsive' src="3.png">
</div>
</div>
</div>
</section>
<br/>
<br/>
<section class="oe_container oe_mt32">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Step 3</h2>
<div class="oe_span12">
<p class="oe_mt32 oe_mb32 text-justify"><h3>Print test.</h3></p>
<div class="oe_demo oe_picture oe_screenshot">
<img class='img-responsive' src="4.png">
</div>
</div>
</div>
</section>
<br/>
<br/>
<section class="oe_container oe_mt32">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan" style="color:#875A7B;">Step 4</h2>
<div class="oe_span12">
<p class="oe_mt32 oe_mb32 text-justify"><h3>Preview Print Information.</h3></p>
<div class="oe_demo oe_picture oe_screenshot">
<img class='img-responsive' src="5.png">
</div>
</div>
</div>
</section>
Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

File diff suppressed because one or more lines are too long
+292
View File
@@ -0,0 +1,292 @@
/*!
Autosize 3.0.21
license: MIT
http://www.jacklmoore.com/autosize
*/
(function (global, factory) {
if (typeof define === 'function' && define.amd) {
define(['exports', 'module'], factory);
} else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
factory(exports, module);
} else {
var mod = {
exports: {}
};
factory(mod.exports, mod);
global.autosize = mod.exports;
}
})(this, function (exports, module) {
'use strict';
var map = typeof Map === "function" ? new Map() : (function () {
var keys = [];
var values = [];
return {
has: function has(key) {
return keys.indexOf(key) > -1;
},
get: function get(key) {
return values[keys.indexOf(key)];
},
set: function set(key, value) {
if (keys.indexOf(key) === -1) {
keys.push(key);
values.push(value);
}
},
'delete': function _delete(key) {
var index = keys.indexOf(key);
if (index > -1) {
keys.splice(index, 1);
values.splice(index, 1);
}
}
};
})();
var createEvent = function createEvent(name) {
return new Event(name, { bubbles: true });
};
try {
new Event('test');
} catch (e) {
// IE does not support `new Event()`
createEvent = function (name) {
var evt = document.createEvent('Event');
evt.initEvent(name, true, false);
return evt;
};
}
function assign(ta) {
if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return;
var heightOffset = null;
var clientWidth = ta.clientWidth;
var cachedHeight = null;
function init() {
var style = window.getComputedStyle(ta, null);
if (style.resize === 'vertical') {
ta.style.resize = 'none';
} else if (style.resize === 'both') {
ta.style.resize = 'horizontal';
}
if (style.boxSizing === 'content-box') {
heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom));
} else {
heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth);
}
// Fix when a textarea is not on document body and heightOffset is Not a Number
if (isNaN(heightOffset)) {
heightOffset = 0;
}
update();
}
function changeOverflow(value) {
{
// Chrome/Safari-specific fix:
// When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space
// made available by removing the scrollbar. The following forces the necessary text reflow.
var width = ta.style.width;
ta.style.width = '0px';
// Force reflow:
/* jshint ignore:start */
ta.offsetWidth;
/* jshint ignore:end */
ta.style.width = width;
}
ta.style.overflowY = value;
}
function getParentOverflows(el) {
var arr = [];
while (el && el.parentNode && el.parentNode instanceof Element) {
if (el.parentNode.scrollTop) {
arr.push({
node: el.parentNode,
scrollTop: el.parentNode.scrollTop
});
}
el = el.parentNode;
}
return arr;
}
function resize() {
var originalHeight = ta.style.height;
var overflows = getParentOverflows(ta);
var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240)
ta.style.height = 'auto';
var endHeight = ta.scrollHeight + heightOffset;
if (ta.scrollHeight === 0) {
// If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM.
ta.style.height = originalHeight;
return;
}
ta.style.height = endHeight + 'px';
// used to check if an update is actually necessary on window.resize
clientWidth = ta.clientWidth;
// prevents scroll-position jumping
overflows.forEach(function (el) {
el.node.scrollTop = el.scrollTop;
});
if (docTop) {
document.documentElement.scrollTop = docTop;
}
}
function update() {
resize();
var styleHeight = Math.round(parseFloat(ta.style.height));
var computed = window.getComputedStyle(ta, null);
// Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box
var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight;
// The actual height not matching the style height (set via the resize method) indicates that
// the max-height has been exceeded, in which case the overflow should be allowed.
if (actualHeight !== styleHeight) {
if (computed.overflowY === 'hidden') {
changeOverflow('scroll');
resize();
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
}
} else {
// Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands.
if (computed.overflowY !== 'hidden') {
changeOverflow('hidden');
resize();
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight;
}
}
if (cachedHeight !== actualHeight) {
cachedHeight = actualHeight;
var evt = createEvent('autosize:resized');
try {
ta.dispatchEvent(evt);
} catch (err) {
// Firefox will throw an error on dispatchEvent for a detached element
// https://bugzilla.mozilla.org/show_bug.cgi?id=889376
}
}
}
var pageResize = function pageResize() {
if (ta.clientWidth !== clientWidth) {
update();
}
};
var destroy = (function (style) {
window.removeEventListener('resize', pageResize, false);
ta.removeEventListener('input', update, false);
ta.removeEventListener('keyup', update, false);
ta.removeEventListener('autosize:destroy', destroy, false);
ta.removeEventListener('autosize:update', update, false);
Object.keys(style).forEach(function (key) {
ta.style[key] = style[key];
});
map['delete'](ta);
}).bind(ta, {
height: ta.style.height,
resize: ta.style.resize,
overflowY: ta.style.overflowY,
overflowX: ta.style.overflowX,
wordWrap: ta.style.wordWrap
});
ta.addEventListener('autosize:destroy', destroy, false);
// IE9 does not fire onpropertychange or oninput for deletions,
// so binding to onkeyup to catch most of those events.
// There is no way that I know of to detect something like 'cut' in IE9.
if ('onpropertychange' in ta && 'oninput' in ta) {
ta.addEventListener('keyup', update, false);
}
window.addEventListener('resize', pageResize, false);
ta.addEventListener('input', update, false);
ta.addEventListener('autosize:update', update, false);
ta.style.overflowX = 'hidden';
ta.style.wordWrap = 'break-word';
map.set(ta, {
destroy: destroy,
update: update
});
init();
}
function destroy(ta) {
var methods = map.get(ta);
if (methods) {
methods.destroy();
}
}
function update(ta) {
var methods = map.get(ta);
if (methods) {
methods.update();
}
}
var autosize = null;
// Do nothing in Node.js environment and IE8 (or lower)
if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') {
autosize = function (el) {
return el;
};
autosize.destroy = function (el) {
return el;
};
autosize.update = function (el) {
return el;
};
} else {
autosize = function (el, options) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], function (x) {
return assign(x, options);
});
}
return el;
};
autosize.destroy = function (el) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], destroy);
}
return el;
};
autosize.update = function (el) {
if (el) {
Array.prototype.forEach.call(el.length ? el : [el], update);
}
return el;
};
}
module.exports = autosize;
});
File diff suppressed because it is too large Load Diff
+24
View File
@@ -0,0 +1,24 @@
/*!
* Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2021-02-16
*/
/*!
* jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2021-03-02T17:08Z
*/
+507
View File
@@ -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==);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

+5
View File
@@ -0,0 +1,5 @@
@font-face {
font-family: "zh_CN";
src: url("simhei.ttf") format('simhei'),
url("STSONG.TTF") format('STSONG');
}
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,71 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="reportbro" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="960" descent="-64" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
<glyph unicode="&#xe604;" glyph-name="cancel" d="M636.398 447.373l245.645 245.771c20.615 20.617 20.615 54.184 0 75.053l-50.036 50.036c-20.619 20.617-54.182 20.617-75.053 0l-245.647-245.775-244.265 244.265c-20.617 20.617-54.184 20.617-75.053 0l-50.037-50.036c-20.617-20.617-20.617-54.184 0-75.053l244.265-244.262-244.013-243.889c-20.617-20.617-20.617-54.182 0-75.053l50.036-50.036c20.617-20.617 54.184-20.617 75.053 0l244.015 243.887 244.516-244.518c20.619-20.617 54.186-20.617 75.053 0l50.036 50.036c20.619 20.617 20.619 54.184 0 75.053l-244.514 244.518z" />
<glyph unicode="&#xe60c;" glyph-name="arrow-down" d="M466.461 224.45l-354.183 356.135c-23.484 23.635-23.484 61.959 0 85.594 23.482 23.639 61.55 23.639 85.033 0l314.69-316.418 314.686 316.418c23.482 23.639 61.554 23.639 85.035 0 23.482-23.635 23.482-61.959 0-85.594l-354.179-356.135c-12.514-12.597-29.156-18.266-45.543-17.438-16.384-0.828-33.026 4.84-45.539 17.438z" />
<glyph unicode="&#xe611;" glyph-name="plus" d="M872.005 544h-264.006v264.004c0 13.255-10.747 24.001-23.999 24.001h-144.002c-13.255 0-24.001-10.747-24.001-24.001v-264.004h-264.004c-13.255 0-24.001-10.747-24.001-24.001v-144.002c0-13.255 10.747-23.999 24.001-23.999h264.004v-264.006c0-13.255 10.747-23.999 24.001-23.999h144.002c13.255 0 24.001 10.747 24.001 23.999v264.006h264.004c13.255 0 24.001 10.747 24.001 23.999v144.002c-0.002 13.255-10.747 24.001-24.001 24.001z" />
<glyph unicode="&#xe805;" glyph-name="minus" d="M128 520v-144c0-13.254 10.746-24 24-24h720c13.254 0 24 10.746 24 24v144c0 13.254-10.746 24-24 24h-720c-13.254 0-24-10.746-24-24z" />
<glyph unicode="&#xe900;" glyph-name="strikethrough" d="M1024 448v-64h-234.506c27.504-38.51 42.506-82.692 42.506-128 0-70.878-36.66-139.026-100.58-186.964-59.358-44.518-137.284-69.036-219.42-69.036-82.138 0-160.062 24.518-219.42 69.036-63.92 47.938-100.58 116.086-100.58 186.964h128c0-69.382 87.926-128 192-128s192 58.618 192 128c0 69.382-87.926 128-192 128h-512v64h299.518c-2.338 1.654-4.656 3.324-6.938 5.036-63.92 47.94-100.58 116.086-100.58 186.964s36.66 139.024 100.58 186.964c59.358 44.518 137.282 69.036 219.42 69.036 82.136 0 160.062-24.518 219.42-69.036 63.92-47.94 100.58-116.086 100.58-186.964h-128c0 69.382-87.926 128-192 128s-192-58.618-192-128c0-69.382 87.926-128 192-128 78.978 0 154.054-22.678 212.482-64h299.518z" />
<glyph unicode="&#xe901;" glyph-name="settings" d="M933.79 349.75c-53.726 93.054-21.416 212.304 72.152 266.488l-100.626 174.292c-28.75-16.854-62.176-26.518-97.846-26.518-107.536 0-194.708 87.746-194.708 195.99h-201.258c0.266-33.41-8.074-67.282-25.958-98.252-53.724-93.056-173.156-124.702-266.862-70.758l-100.624-174.292c28.97-16.472 54.050-40.588 71.886-71.478 53.638-92.908 21.512-211.92-71.708-266.224l100.626-174.292c28.65 16.696 61.916 26.254 97.4 26.254 107.196 0 194.144-87.192 194.7-194.958h201.254c-0.086 33.074 8.272 66.57 25.966 97.218 53.636 92.906 172.776 124.594 266.414 71.012l100.626 174.29c-28.78 16.466-53.692 40.498-71.434 71.228zM512 240.668c-114.508 0-207.336 92.824-207.336 207.334 0 114.508 92.826 207.334 207.336 207.334 114.508 0 207.332-92.826 207.332-207.334-0.002-114.51-92.824-207.334-207.332-207.334z" />
<glyph unicode="&#xe902;" glyph-name="align-middle" d="M827.078 113.238v315.073h196.922v39.383h-196.922v315.068c0 10.886-8.819 19.694-19.694 19.694h-196.922c-10.876 0-19.694-8.809-19.694-19.694v-315.073h-157.534v196.922c0 10.886-8.819 19.694-19.694 19.694h-196.922c-10.876 0-19.694-8.809-19.694-19.694v-196.922h-196.922v-39.383h196.922v-196.922c0-10.886 8.819-19.694 19.694-19.694h196.922c10.876 0 19.694 8.809 19.694 19.694v196.922h157.544v-315.073c0-10.886 8.819-19.694 19.694-19.694h196.917c10.876 0.010 19.689 8.814 19.689 19.699zM393.855 251.083h-157.534v393.834h157.534v-393.834zM630.16 132.927v630.14h157.534v-630.14h-157.534z" />
<glyph unicode="&#xe903;" glyph-name="align-right" d="M0 478.785v375.903h868.457v-375.917l-868.457 0.014zM829.578 517.664v298.145h-790.699v-298.145h790.699zM359.702 5.692v375.889h508.754v-375.917l-508.754 0.027zM829.578 44.557v298.145h-430.996v-298.145h430.996zM955.952-52.661h68.062v1001.322h-68.062v-1001.322z" />
<glyph unicode="&#xe904;" glyph-name="align-top" d="M481.215 804.457h-375.903v-868.457h375.917l-0.014 868.457zM442.336-25.121h-298.145v790.699h298.145v-790.699zM954.308 804.457h-375.889v-508.754h375.917v508.754h-0.027zM915.443 334.581h-298.145v430.996h298.145v-430.996zM11.339 891.952v68.048h1001.322v-68.048h-1001.322z" />
<glyph unicode="&#xe905;" glyph-name="table" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
<glyph unicode="&#xe906;" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" />
<glyph unicode="&#xe907;" glyph-name="bold" d="M707.88 475.348c37.498 44.542 60.12 102.008 60.12 164.652 0 141.16-114.842 256-256 256h-320v-896h384c141.158 0 256 114.842 256 256 0 92.956-49.798 174.496-124.12 219.348zM384 768h101.5c55.968 0 101.5-57.42 101.5-128s-45.532-128-101.5-128h-101.5v256zM543 128h-159v256h159c58.45 0 106-57.42 106-128s-47.55-128-106-128z" />
<glyph unicode="&#xe908;" glyph-name="underline" d="M704 896h128v-416c0-159.058-143.268-288-320-288-176.73 0-320 128.942-320 288v416h128v-416c0-40.166 18.238-78.704 51.354-108.506 36.896-33.204 86.846-51.494 140.646-51.494s103.75 18.29 140.646 51.494c33.116 29.802 51.354 68.34 51.354 108.506v416zM192 128h640v-128h-640z" />
<glyph unicode="&#xe909;" glyph-name="text-align-left" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe90a;" glyph-name="save" d="M896 960h-896v-1024h1024v896l-128 128zM512 832h128v-256h-128v256zM896 64h-768v768h64v-320h576v320h74.978l53.022-53.018v-714.982z" />
<glyph unicode="&#xe90b;" glyph-name="text-align-center" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe90c;" glyph-name="text-align-right" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe90d;" glyph-name="text-align-justify" d="M0 896h1024v-128h-1024zM0 704h1024v-128h-1024zM0 512h1024v-128h-1024zM0 320h1024v-128h-1024zM0 128h1024v-128h-1024z" />
<glyph unicode="&#xe90e;" glyph-name="undo" d="M761.862-64c113.726 206.032 132.888 520.306-313.862 509.824v-253.824l-384 384 384 384v-248.372c534.962 13.942 594.57-472.214 313.862-775.628z" />
<glyph unicode="&#xe90f;" glyph-name="redo" d="M576 711.628v248.372l384-384-384-384v253.824c-446.75 10.482-427.588-303.792-313.86-509.824-280.712 303.414-221.1 789.57 313.86 775.628z" />
<glyph unicode="&#xe910;" glyph-name="grid" d="M0 960v-1024h1024v1024h-1024zM320 0h-256v256h256v-256zM320 320h-256v256h256v-256zM320 640h-256v256h256v-256zM640 0h-256v256h256v-256zM640 320h-256v256h256v-256zM640 640h-256v256h256v-256zM960 0h-256v256h256v-256zM960 320h-256v256h256v-256zM960 640h-256v256h256v-256z" />
<glyph unicode="&#xe911;" glyph-name="console" d="M0 896v-896h1024v896h-1024zM960 64h-896v768h896v-768zM896 768h-768v-640h768v640zM448 448h-64v-64h-64v-64h-64v64h64v64h64v64h-64v64h-64v64h64v-64h64v-64h64v-64zM704 320h-192v64h192v-64z" />
<glyph unicode="&#xe912;" glyph-name="image" d="M959.884 832c0.040-0.034 0.082-0.076 0.116-0.116v-767.77c-0.034-0.040-0.076-0.082-0.116-0.116h-895.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.772c0.034 0.040 0.076 0.082 0.114 0.114h895.77zM960 896h-896c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v768c0 35.2-28.8 64-64 64v0zM832 672c0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM896 128h-768v128l224 384 256-320h64l224 192z" />
<glyph unicode="&#xe913;" glyph-name="text" d="M246.036 0.020l80.636 268.789h370.654l80.636-268.789h159.078l-268.783 895.963h-312.517l-268.789-895.963h159.084zM461.067 716.789h101.866l80.636-268.789h-263.138l80.636 268.789z" />
<glyph unicode="&#xe914;" glyph-name="border-table-none" d="M0 915.2h64.063v44.8h-64.063zM96.094 915.2h64.062v44.8h-64.062zM192.188 915.2h64.063v44.8h-64.063zM288.282 915.2h64.062v44.8h-64.062zM384.375 915.2h64.063v44.8h-64.063zM480.469 915.2h64.063v44.8h-64.063zM576.563 915.2h64.063v44.8h-64.063zM672.657 915.2h64.063v44.8h-64.063zM768.751 915.2h64.062v44.8h-64.062zM864.844 915.2h64.063v44.8h-64.063zM960.938 915.2h63.062v44.8h-63.062zM0.25 425.6h64v44.8h-64zM96.25 425.6h64v44.8h-64zM192.25 425.6h64v44.8h-64zM288.25 425.6h64v44.8h-64zM384.25 425.6h64v44.8h-64zM480.25 425.6h64v44.8h-64zM576.25 425.6h64v44.8h-64zM672.25 425.6h64v44.8h-64zM768.25 425.6h64v44.8h-64zM864.25 425.6h64v44.8h-64zM960.25 425.6h63.5v44.8h-63.5zM489.6 943.249v-47h44.8v63h-44.8zM489.6 848.249v-48h44.8v64h-44.8zM489.6 752.249v-48h44.8v64h-44.8zM489.6 656.249v-48h44.8v64h-44.8zM489.6 560.249v-48h44.8v64h-44.8zM489.6 464.249v-48h44.8v64h-44.8zM489.6 368.249v-48h44.8v64h-44.8zM489.6 272.249v-48h44.8v64h-44.8zM489.6 176.249v-48h44.8v64h-44.8zM489.6 80.249v-48h44.8v64h-44.8zM489.6-15.751v-48h44.8v64h-44.8zM979.2 943.963v-45.731h44.8v61.768h-44.8zM979.2 850.12v-48.112h44.8v64.149h-44.8zM979.2 753.897v-48.111h44.8v64.148h-44.8zM979.2 657.674v-48.111h44.8v64.148h-44.8zM979.2 561.451v-48.112h44.8v64.149h-44.8zM979.2 465.228v-48.111h44.8v64.148h-44.8zM979.2 369.004v-48.111h44.8v64.148h-44.8zM979.2 272.781v-48.112h44.8v64.149h-44.8zM979.2 176.558v-48.112h44.8v64.149h-44.8zM979.2 80.335v-48.111h44.8v64.148h-44.8zM979.2-15.889v-48.111h44.8v64.148h-44.8zM0-64h64.063v44.8h-64.063zM96.094-64h64.062v44.8h-64.062zM192.188-64h64.063v44.8h-64.063zM288.282-64h64.062v44.8h-64.062zM384.375-64h64.063v44.8h-64.063zM480.469-64h64.063v44.8h-64.063zM576.563-64h64.063v44.8h-64.063zM672.657-64h64.063v44.8h-64.063zM768.751-64h64.062v44.8h-64.062zM864.844-64h64.063v44.8h-64.063zM960.938-64h63.062v44.8h-63.062zM0 943.963v-45.731h44.8v61.768h-44.8zM0 850.12v-48.112h44.8v64.149h-44.8zM0 753.897v-48.111h44.8v64.148h-44.8zM0 657.674v-48.111h44.8v64.148h-44.8zM0 561.451v-48.112h44.8v64.149h-44.8zM0 465.228v-48.111h44.8v64.148h-44.8zM0 369.004v-48.111h44.8v64.148h-44.8zM0 272.781v-48.112h44.8v64.149h-44.8zM0 176.558v-48.112h44.8v64.149h-44.8zM0 80.335v-48.111h44.8v64.148h-44.8zM0-15.889v-48.111h44.8v64.148h-44.8z" />
<glyph unicode="&#xe915;" glyph-name="frame" d="M801.634 960v-86.316h136.049v-136.049h86.316v222.366h-222.366zM0 737.634h86.316v136.049h136.049v86.316h-222.366v-222.366zM0 158.366h86.316v-136.049h136.049v-86.316h-222.366v222.366zM801.634-64v86.316h136.049v136.049h86.316v-222.366h-222.366z" />
<glyph unicode="&#xe916;" glyph-name="border-right" d="M937.599-19.2h-64.73v-44.8h64.73zM840.504-19.2h-64.734v-44.8h64.734zM743.404-19.2h-64.73v-44.8h64.73zM646.308-19.2h-64.733v-44.8h64.733zM549.209-19.2h-64.731v-44.8h64.731zM452.108-19.2h-64.729v-44.8h64.729zM355.014-19.2h-64.733v-44.8h64.733zM257.915-19.2h-64.73v-44.8h64.73zM160.819-19.2h-64.734v-44.8h64.734zM63.719-19.2h-63.72v-44.8h63.72zM44.8-47.964v45.731h-44.8v-61.768h44.8zM44.8 45.879v48.112h-44.8v-64.149h44.8zM44.8 142.102v48.111h-44.8v-64.148h44.8zM44.8 238.326v48.111h-44.8v-64.148h44.8zM44.8 334.548v48.112h-44.8v-64.149h44.8zM44.8 430.772v48.111h-44.8v-64.148h44.8zM44.8 526.995v48.111h-44.8v-64.148h44.8zM44.8 623.218v48.112h-44.8v-64.149h44.8zM44.8 719.441v48.112h-44.8v-64.149h44.8zM44.8 815.665v48.111h-44.8v-64.148h44.8zM44.8 911.888v48.111h-44.8v-64.148h44.8zM937.599 960h-64.73v-44.8h64.73zM840.504 960h-64.734v-44.8h64.734zM743.404 960h-64.73v-44.8h64.73zM646.308 960h-64.734v-44.8h64.734zM549.209 960h-64.73v-44.8h64.73zM452.108 960h-64.728v-44.8h64.728zM355.014 960h-64.733v-44.8h64.733zM257.915 960h-64.73v-44.8h64.73zM160.819 960h-64.734v-44.8h64.734zM63.72 960h-63.72v-44.8h63.72zM1024-63.999v1024h-128v-1024h128z" />
<glyph unicode="&#xe917;" glyph-name="border-left" d="M86.401 915.2h64.73v44.8h-64.73zM183.496 915.2h64.734v44.8h-64.734zM280.596 915.2h64.73v44.8h-64.73zM377.692 915.2h64.733v44.8h-64.733zM474.791 915.2h64.731v44.8h-64.731zM571.892 915.2h64.729v44.8h-64.729zM668.986 915.2h64.733v44.8h-64.733zM766.085 915.2h64.73v44.8h-64.73zM863.181 915.2h64.734v44.8h-64.734zM960.281 915.2h63.72v44.8h-63.72zM979.2 943.964v-45.731h44.8v61.768h-44.8zM979.2 850.121v-48.112h44.8v64.149h-44.8zM979.2 753.898v-48.111h44.8v64.148h-44.8zM979.2 657.674v-48.111h44.8v64.148h-44.8zM979.2 561.452v-48.112h44.8v64.149h-44.8zM979.2 465.228v-48.111h44.8v64.148h-44.8zM979.2 369.005v-48.111h44.8v64.148h-44.8zM979.2 272.782v-48.112h44.8v64.149h-44.8zM979.2 176.559v-48.112h44.8v64.149h-44.8zM979.2 80.335v-48.111h44.8v64.148h-44.8zM979.2-15.888v-48.111h44.8v64.148h-44.8zM86.401-64h64.73v44.8h-64.73zM183.496-64h64.734v44.8h-64.734zM280.596-64h64.73v44.8h-64.73zM377.692-64h64.734v44.8h-64.734zM474.791-64h64.73v44.8h-64.73zM571.892-64h64.728v44.8h-64.728zM668.986-64h64.733v44.8h-64.733zM766.085-64h64.73v44.8h-64.73zM863.181-64h64.734v44.8h-64.734zM960.28-64h63.72v44.8h-63.72zM0 959.999v-1024h128v1024h-128z" />
<glyph unicode="&#xe918;" glyph-name="border-top" d="M979.2 873.599v-64.73h44.8v64.73zM979.2 776.504v-64.734h44.8v64.734zM979.2 679.404v-64.73h44.8v64.73zM979.2 582.308v-64.733h44.8v64.733zM979.2 485.209v-64.731h44.8v64.731zM979.2 388.108v-64.729h44.8v64.729zM979.2 291.014v-64.733h44.8v64.733zM979.2 193.915v-64.73h44.8v64.73zM979.2 96.819v-64.734h44.8v64.734zM979.2-0.281v-63.72h44.8v63.72zM1007.964-19.2h-45.731v-44.8h61.768v44.8zM914.121-19.2h-48.112v-44.8h64.149v44.8zM817.898-19.2h-48.111v-44.8h64.148v44.8zM721.674-19.2h-48.111v-44.8h64.148v44.8zM625.452-19.2h-48.112v-44.8h64.149v44.8zM529.228-19.2h-48.111v-44.8h64.148v44.8zM433.005-19.2h-48.111v-44.8h64.148v44.8zM336.782-19.2h-48.112v-44.8h64.149v44.8zM240.559-19.2h-48.112v-44.8h64.149v44.8zM144.335-19.2h-48.111v-44.8h64.148v44.8zM48.112-19.2h-48.111v-44.8h64.148v44.8zM0 873.599v-64.73h44.8v64.73zM0 776.504v-64.734h44.8v64.734zM0 679.404v-64.73h44.8v64.73zM0 582.308v-64.734h44.8v64.734zM0 485.209v-64.73h44.8v64.73zM0 388.108v-64.728h44.8v64.728zM0 291.014v-64.733h44.8v64.733zM0 193.915v-64.73h44.8v64.73zM0 96.819v-64.734h44.8v64.734zM0-0.28v-63.72h44.8v63.72zM1023.999 960h-1024v-128h1024v128z" />
<glyph unicode="&#xe919;" glyph-name="border-bottom" d="M979.2 22.401v64.73h44.8v-64.73zM979.2 119.496v64.734h44.8v-64.734zM979.2 216.596v64.73h44.8v-64.73zM979.2 313.692v64.733h44.8v-64.733zM979.2 410.791v64.731h44.8v-64.731zM979.2 507.892v64.729h44.8v-64.729zM979.2 604.986v64.733h44.8v-64.733zM979.2 702.085v64.73h44.8v-64.73zM979.2 799.181v64.734h44.8v-64.734zM979.2 896.281v63.72h44.8v-63.72zM1007.964 915.2h-45.731v44.8h61.768v-44.8zM914.121 915.2h-48.112v44.8h64.149v-44.8zM817.898 915.2h-48.111v44.8h64.148v-44.8zM721.674 915.2h-48.111v44.8h64.148v-44.8zM625.452 915.2h-48.112v44.8h64.149v-44.8zM529.228 915.2h-48.111v44.8h64.148v-44.8zM433.005 915.2h-48.111v44.8h64.148v-44.8zM336.782 915.2h-48.112v44.8h64.149v-44.8zM240.559 915.2h-48.112v44.8h64.149v-44.8zM144.335 915.2h-48.111v44.8h64.148v-44.8zM48.112 915.2h-48.111v44.8h64.148v-44.8zM0 22.401v64.73h44.8v-64.73zM0 119.496v64.734h44.8v-64.734zM0 216.596v64.73h44.8v-64.73zM0 313.692v64.734h44.8v-64.734zM0 410.791v64.73h44.8v-64.73zM0 507.892v64.728h44.8v-64.728zM0 604.986v64.733h44.8v-64.733zM0 702.085v64.73h44.8v-64.73zM0 799.181v64.734h44.8v-64.734zM0 896.28v63.72h44.8v-63.72zM1023.999-64h-1024v128h1024v-128z" />
<glyph unicode="&#xe91a;" glyph-name="border-all" d="M0 64v-128h1024v128h-1024zM896 960v-1024h128v1024h-128zM0 960v-1024h128v1024h-128zM0 960v-128h1024v128h-1024z" />
<glyph unicode="&#xe91b;" glyph-name="align-center" d="M846.762 763.078h-315.073v196.922h-39.383v-196.922h-315.068c-10.886 0-19.694-8.819-19.694-19.694v-196.922c0-10.876 8.809-19.694 19.694-19.694h315.073v-157.534h-196.922c-10.886 0-19.694-8.819-19.694-19.694v-196.922c0-10.876 8.809-19.694 19.694-19.694h196.922v-196.922h39.383v196.922h196.922c10.886 0 19.694 8.819 19.694 19.694v196.922c0 10.876-8.809 19.694-19.694 19.694h-196.922v157.544h315.073c10.886 0 19.694 8.819 19.694 19.694v196.917c-0.010 10.876-8.814 19.689-19.699 19.689zM708.917 329.855v-157.534h-393.834v157.534h393.834zM827.073 566.16h-630.14v157.534h630.14v-157.534z" />
<glyph unicode="&#xe91c;" glyph-name="align-bottom" d="M481.215 960h-375.903v-868.457h375.917l-0.014 868.457zM442.336 130.422h-298.145v790.699h298.145v-790.699zM954.308 600.298h-375.889v-508.754h375.917v508.754h-0.027zM915.443 130.422h-298.145v430.996h298.145v-430.996zM1012.661 4.048v-68.062h-1001.322v68.062h1001.322z" />
<glyph unicode="&#xe91d;" glyph-name="align-left" d="M1024 478.785v375.903h-868.457v-375.917l868.457 0.014zM194.422 517.664v298.145h790.699v-298.145h-790.699zM664.298 5.692v375.889h-508.754v-375.917l508.754 0.027zM194.422 44.557v298.145h430.996v-298.145h-430.996zM68.048-52.661h-68.062v1001.322h68.062v-1001.322z" />
<glyph unicode="&#xe91e;" glyph-name="line" d="M0 489.6v-57.6h1024v57.6h-1024z" />
<glyph unicode="&#xe91f;" glyph-name="page-break" d="M0 448h128v-64h-128zM192 448h192v-64h-192zM448 448h128v-64h-128zM640 448h192v-64h-192zM896 448h128v-64h-128zM880 960l16-448h-768l16 448h32l16-384h640l16 384zM144-64l-16 384h768l-16-384h-32l-16 320h-640l-16-320z" />
<glyph unicode="&#xe920;" glyph-name="border-table-frame" d="M0 64v-128h1024v128h-1024zM896 960v-1024h128v1024h-128zM0 960v-1024h128v1024h-128zM128 425.6h48.024v44.8h-48.024zM200.035 425.6h48.024v44.8h-48.024zM272.070 425.6h48.024v44.8h-48.024zM344.106 425.6h48.024v44.8h-48.024zM416.141 425.6h48.024v44.8h-48.024zM488.176 425.6h48.024v44.8h-48.024zM560.211 425.6h48.024v44.8h-48.024zM632.246 425.6h48.024v44.8h-48.024zM704.282 425.6h48.024v44.8h-48.024zM776.317 425.6h48.024v44.8h-48.024zM848.352 425.6h47.648v44.8h-47.648zM0 960v-128h1024v128h-1024zM489.6 819.988v-35.284h44.8v47.296h-44.8zM489.6 748.669v-36.035h44.8v48.047h-44.8zM489.6 676.598v-36.035h44.8v48.047h-44.8zM489.6 604.528v-36.035h44.8v48.047h-44.8zM489.6 532.458v-36.035h44.8v48.047h-44.8zM489.6 460.387v-36.035h44.8v48.047h-44.8zM489.6 388.317v-36.035h44.8v48.047h-44.8zM489.6 316.246v-36.035h44.8v48.047h-44.8zM489.6 244.176v-36.035h44.8v48.047h-44.8zM489.6 172.106v-36.035h44.8v48.047h-44.8zM489.6 100.035v-36.035h44.8v48.047h-44.8z" />
<glyph unicode="&#xe921;" glyph-name="border-table-frame-row" d="M489.6 820v-35.296h44.8v47.296h-44.8zM489.6 748.672v-36.032h44.8v48.032h-44.8zM489.6 676.608v-36.032h44.8v48.032h-44.8zM489.6 604.544v-36.032h44.8v48.032h-44.8zM489.6 532.448v-36.032h44.8v48.032h-44.8zM489.6 460.384v-36.032h44.8v48.032h-44.8zM489.6 388.32v-36.032h44.8v48.032h-44.8zM489.6 316.256v-36.032h44.8v48.032h-44.8zM489.6 244.192v-36.032h44.8v48.032h-44.8zM489.6 172.096v-36.032h44.8v48.032h-44.8zM489.6 100.032v-36.032h44.8v48.032h-44.8zM0 64v-128h1024v128h-1024zM896 960v-1024h128v1024h-128zM0 960v-1024h128v1024h-128zM0 960v-128h1024v128h-1024zM0 512v-128h1024v128h-1024z" />
<glyph unicode="&#xe922;" glyph-name="border-table-row" d="M979.2 820v-35.296h44.8v47.296h-44.8zM979.2 748.672v-36.032h44.8v48.032h-44.8zM979.2 676.608v-36.032h44.8v48.032h-44.8zM979.2 604.544v-36.032h44.8v48.032h-44.8zM979.2 532.448v-36.032h44.8v48.032h-44.8zM979.2 460.384v-36.032h44.8v48.032h-44.8zM979.2 388.32v-36.032h44.8v48.032h-44.8zM979.2 316.256v-36.032h44.8v48.032h-44.8zM979.2 244.192v-36.032h44.8v48.032h-44.8zM979.2 172.096v-36.032h44.8v48.032h-44.8zM979.2 100.032v-36.032h44.8v48.032h-44.8zM0 820v-35.296h44.8v47.296h-44.8zM0 748.672v-36.032h44.8v48.032h-44.8zM0 676.608v-36.032h44.8v48.032h-44.8zM0 604.544v-36.032h44.8v48.032h-44.8zM0 532.448v-36.032h44.8v48.032h-44.8zM0 460.384v-36.032h44.8v48.032h-44.8zM0 388.32v-36.032h44.8v48.032h-44.8zM0 316.256v-36.032h44.8v48.032h-44.8zM0 244.192v-36.032h44.8v48.032h-44.8zM0 172.096v-36.032h44.8v48.032h-44.8zM0 100.032v-36.032h44.8v48.032h-44.8zM489.6 820v-35.296h44.8v47.296h-44.8zM489.6 748.672v-36.032h44.8v48.032h-44.8zM489.6 676.608v-36.032h44.8v48.032h-44.8zM489.6 604.544v-36.032h44.8v48.032h-44.8zM489.6 532.448v-36.032h44.8v48.032h-44.8zM489.6 460.384v-36.032h44.8v48.032h-44.8zM489.6 388.32v-36.032h44.8v48.032h-44.8zM489.6 316.256v-36.032h44.8v48.032h-44.8zM489.6 244.192v-36.032h44.8v48.032h-44.8zM489.6 172.096v-36.032h44.8v48.032h-44.8zM489.6 100.032v-36.032h44.8v48.032h-44.8zM0 64v-128h1024v128h-1024zM0 960v-128h1024v128h-1024zM0 512v-128h1024v128h-1024z" />
<glyph unicode="&#xe923;" glyph-name="refresh" d="M842.47 750.47c-81.907 89.439-199.634 145.53-330.47 145.53-247.424 0-448-200.576-448-448h84c0 201.032 162.968 364 364 364 107.642 0 204.35-46.74 270.984-121.018l-130.984-130.982h308v308l-117.53-117.53zM876 448c0-201.032-162.968-364-364-364-107.642 0-204.35 46.74-270.982 121.018l130.982 130.982h-308v-308l117.53 117.53c81.907-89.439 199.634-145.53 330.47-145.53 247.424 0 448 200.576 448 448h-84z" />
<glyph unicode="&#xe924;" glyph-name="edit" d="M0.024 747.399c0.043 27.040 22.005 49.003 49.088 49.046h525.956l-44.587-98.134h-481.39c-27.072 0.043-49.035 22.005-49.067 49.088zM0.024 144.6c0.043-27.094 22.005-49.003 49.088-49.088h263.66c0.576 32.918 3.829 65.749 9.706 98.166h-273.388c-27.072-0.075-49.035-21.995-49.067-49.077zM49.111 497.69h390.424l44.587 98.134h-435.022c-27.125 0-49.077-21.973-49.077-49.088 0-27.094 21.952-49.046 49.077-49.046zM0.024 346.191c0.043-27.040 22.005-49.003 49.088-49.046h301.421c5.333 14.667 11.285 29.12 17.834 43.414l24.832 54.72h-344.088c-27.094-0.043-49.046-22.005-49.088-49.088zM966.11 688.274l-54.294 24.33 21.333 46.624c15.542 31.083 17.749 67.211 6.123 99.958-11.627 32.8-36.075 59.414-67.744 73.792s-67.84 15.253-100.129 2.421c-32.33-12.832-58.038-38.294-71.211-70.464l-254.21-559.577c-46.453-102.337-59.627-216.716-37.621-326.925 2.038-10.539 9.088-19.456 18.88-23.872 9.749-4.458 21.077-3.915 30.368 1.461 97.462 56.043 174.881 141.249 221.335 243.629l195.756 430.712 53.973-24.427c4.085-1.824 5.867-6.571 4.085-10.667l-105.1-231.436c-5.205-10.997-5.792-23.627-1.621-35.040s12.79-20.672 23.872-25.706c11.040-5.014 23.67-5.386 35.040-1.003 11.339 4.373 20.458 13.12 25.248 24.288l105.088 231.458c22.251 49.621 0.288 107.915-49.173 130.454z" />
<glyph unicode="&#xe925;" glyph-name="select" d="M512 576.746c68.864 0 128.746-59.882 128.746-128.746s-59.882-128.746-128.746-128.746-128.746 59.882-128.746 128.746 59.882 128.746 128.746 128.746zM895.243 576.746c68.864 0 128.746-59.882 128.746-128.746s-59.882-128.746-128.746-128.746-128.746 59.882-128.746 128.746 59.882 128.746 128.746 128.746zM128.757 576.746c68.864 0 128.746-59.882 128.746-128.746s-59.882-128.746-128.746-128.746-128.746 59.882-128.746 128.746 59.882 128.746 128.746 128.746z" />
<glyph unicode="&#xe926;" glyph-name="magnifier" d="M992.256 88.608l-242.56 206.304c-25.088 22.56-51.904 32.928-73.568 31.936 57.248 67.072 91.84 154.080 91.84 249.184 0 212.064-171.936 384-384 384s-384-171.936-384-384 171.936-384 384-384c95.104 0 182.112 34.592 249.184 91.84-0.992-21.664 9.376-48.48 31.936-73.568l206.304-242.56c35.328-39.232 93.024-42.56 128.224-7.36s31.904 92.896-7.36 128.224zM384 320c-141.376 0-256 114.624-256 256s114.624 256 256 256 256-114.624 256-256-114.624-256-256-256z" />
<glyph unicode="&#xe927;" glyph-name="play" d="M170.432 951.712c8.16 4.736 17.28 7.104 26.432 7.104s18.24-2.368 26.432-7.104l630.24-457.92c16.32-9.44 26.432-26.912 26.432-45.792s-10.080-36.352-26.432-45.76l-630.24-457.952c-16.352-9.408-36.512-9.408-52.864 0-16.352 9.472-26.464 26.944-26.464 45.792v915.872c0 18.88 10.080 36.352 26.432 45.792z" />
<glyph unicode="&#xe928;" glyph-name="preview" d="M1004.064 108.608l-82.816 82.816c-9.152 9.152-20.896 14.080-32.832 14.816l-28.128 28.128c41.792 66.464 33.792 155.488-24 213.28-67.104 67.104-176.256 67.104-243.36 0s-67.072-176.256 0-243.36c57.792-57.792 146.816-65.792 213.28-24l28.128-28.128c0.736-11.968 5.696-23.712 14.816-32.832l82.816-82.816c19.904-19.904 52.192-19.904 72.096 0s19.904 52.192 0 72.096v0 0zM800.224 240.384c-47.2-47.2-124.032-47.2-171.264 0s-47.2 124.032 0 171.264c47.2 47.2 124.032 47.2 171.264 0s47.2-124.032 0-171.264v0zM564.128 473.792c39.424 39.424 91.904 61.152 147.776 61.152s108.352-21.696 147.776-61.152c33.664-33.664 54.944-78.272 59.968-125.6 3.84-36.416-1.92-73.376-16.736-106.88l0.512-0.512c15.616-3.808 29.856-11.84 41.248-23.2l8.16-8.192v571.744c0 8.992-4.448 17.44-11.904 22.496-72.992 49.6-155.904 75.808-239.808 75.808-78.176 0-155.488-22.784-224.704-66.016-69.248 43.232-146.592 66.016-224.736 66.016-83.872 0-166.784-26.208-239.776-75.808-7.456-5.056-11.904-13.472-11.904-22.496v-637.344c0-10.080 5.568-19.328 14.464-24.032s19.68-4.128 28 1.536c63.936 43.424 136.256 66.4 209.184 66.4s145.28-22.976 209.248-66.4c4.576-3.136 9.92-4.704 15.264-4.704 0.032 0 0.064 0 0.096 0 5.472-0.064 10.944 1.504 15.648 4.704 27.36 18.592 56.256 33.376 86.048 44.288-4.768 4-9.408 8.192-13.856 12.64-81.504 81.504-81.504 214.080 0 295.584v0zM555.104 696.128c51.008 34.88 120.672 40.064 157.696 40.064s106.688-5.216 157.696-40.064c12.544-8.576 15.776-25.728 7.2-38.272s-25.728-15.776-38.272-7.2c-28.32 19.36-74.464 30.464-126.624 30.464s-98.304-11.104-126.624-30.464c-4.736-3.232-10.176-4.8-15.52-4.8-8.8 0-17.408 4.192-22.752 12-8.576 12.544-5.344 29.696 7.2 38.272v0 0zM555.104 577.024c51.008 34.88 120.672 40.064 157.696 40.064s106.688-5.216 157.696-40.064c12.544-8.576 15.776-25.728 7.2-38.272s-25.728-15.776-38.272-7.2c-28.32 19.36-74.464 30.464-126.624 30.464s-98.304-11.104-126.624-30.464c-4.736-3.232-10.176-4.8-15.52-4.8-8.8 0-17.408 4.192-22.752 12-8.576 12.544-5.344 29.696 7.2 38.272v0zM404.928 300.544c-8.576-12.544-25.728-15.776-38.272-7.2-28.32 19.36-74.464 30.464-126.624 30.464s-98.304-11.104-126.624-30.464c-4.736-3.232-10.176-4.8-15.52-4.8-8.8 0-17.408 4.192-22.752 12-8.576 12.544-5.344 29.696 7.2 38.272 51.008 34.88 120.704 40.064 157.696 40.064s106.688-5.216 157.696-40.064c12.544-8.576 15.776-25.696 7.2-38.24v0zM404.928 419.648c-8.576-12.544-25.728-15.776-38.272-7.2-28.32 19.36-74.464 30.464-126.624 30.464s-98.304-11.104-126.624-30.464c-4.736-3.232-10.176-4.8-15.52-4.8-8.8 0-17.408 4.192-22.752 12-8.576 12.544-5.344 29.696 7.2 38.272 51.008 34.88 120.704 40.064 157.696 40.064s106.688-5.216 157.696-40.064c12.544-8.576 15.776-25.696 7.2-38.272v0zM404.928 538.752c-8.576-12.544-25.728-15.776-38.272-7.2-28.32 19.36-74.464 30.464-126.624 30.464s-98.304-11.104-126.624-30.464c-4.736-3.232-10.176-4.8-15.52-4.8-8.8 0-17.408 4.192-22.752 12-8.576 12.544-5.344 29.696 7.2 38.272 51.008 34.88 120.704 40.064 157.696 40.064s106.688-5.216 157.696-40.064c12.544-8.576 15.776-25.696 7.2-38.272v0 0 0zM404.928 657.856c-8.576-12.544-25.728-15.776-38.272-7.2-28.32 19.36-74.464 30.464-126.624 30.464s-98.304-11.104-126.624-30.464c-4.736-3.232-10.176-4.8-15.52-4.8-8.8 0-17.408 4.192-22.752 12-8.576 12.544-5.344 29.696 7.2 38.272 51.008 34.88 120.704 40.064 157.696 40.064s106.688-5.216 157.696-40.064c12.544-8.576 15.776-25.696 7.2-38.272v0 0z" />
<glyph unicode="&#xe929;" glyph-name="border-table-grid" d="M909.324 503.999v341.326h-341.326v-341.326h341.326zM909.324 50.676v341.326h-341.326v-341.326h341.326zM456.001 503.999v341.326h-341.326v-341.326h341.326zM456.001 50.676v341.326h-341.326v-341.326h341.326zM0.011 959.989h1023.977v-1023.977h-1023.977v1023.977z" />
<glyph unicode="&#xe92a;" glyph-name="barcode" d="M36 45.708h-36v804.571h36v-804.571zM72 46.279h-18.286v804h18.286v-804zM125.714 46.279h-17.714v804h17.714v-804zM215.429 46.279h-17.714v804h17.714v-804zM305.143 46.279h-35.429v804h35.429v-804zM377.143 46.279h-17.714v804h17.714v-804zM413.143 46.279h-17.714v804h17.714v-804zM449.143 46.279h-17.714v804h17.714v-804zM538.857 46.279h-36v804h36v-804zM628.571 46.279h-36v804h36v-804zM700.571 46.279h-36v804h36v-804zM772.571 46.279h-36v804h36v-804zM826.286 46.279h-36v804h36v-804zM934.286 46.279h-53.714v804h53.714v-804zM970.286 46.279h-18.286v804h18.286v-804zM1024 45.708h-36v804.571h36v-804.571z" />
<glyph unicode="&#xe92b;" glyph-name="download" d="M869.728 307.392v-233.92h-715.52v233.92h-137.536v-302.688c0-37.952 30.752-68.736 68.864-68.736h852.832c38.080 0 68.864 30.752 68.864 68.736v302.688h-137.536zM499.392 330.592l-196.896 237.92c0 0-29.952 28.288 2.528 28.288s110.944 0 110.944 0 0 19.040 0 48.352c0 83.648 0 235.904 0 297.952 0 0-4.416 16.864 20.992 16.864 25.632 0 137.824 0 156.16 0 18.304 0 17.888-14.208 17.888-14.208 0-60.192 0-217.696 0-298.624 0-26.24 0-43.232 0-43.232s62.912 0 102.4 0c39.424 0 9.728-29.6 9.728-29.6s-167.52-222.368-190.88-245.696c-16.8-16.896-32.928 1.984-32.928 1.984z" />
<glyph unicode="&#xe92c;" glyph-name="arrow-line-up" d="M556.32-19.68v828.352l197.664-197.664c17.312-17.312 45.376-17.312 62.688 0s17.312 45.376 0 62.688l-273.312 273.312c-17.312 17.312-45.376 17.312-62.688 0l-273.344-273.312c-8.672-8.64-12.992-20-12.992-31.328s4.32-22.688 12.992-31.328c17.312-17.312 45.376-17.312 62.688 0l197.664 197.664v-828.352c0-24.48 19.84-44.32 44.32-44.32s44.32 19.84 44.32 44.32z" />
<glyph unicode="&#xe92d;" glyph-name="xlsx" d="M607.998 559.997h320.176c52.918 0 95.815-42.962 95.815-95.959v-224.073c0-53.008-42.898-95.959-95.815-95.959h-320.176v-64.294c0-34.962-28.616-63.704-63.917-63.704h-480.154c-35.407 0-63.917 28.758-63.917 64.234v735.515c0 35.487 28.692 64.234 64.087 64.234h351.904l191.996-223.995v-95.998zM575.999 144.006h-384.175c-52.918 0-95.815 42.962-95.815 95.959v224.073c0 53.008 42.898 95.959 95.815 95.959h384.175v63.999h-128.064c-35.308 0-63.932 28.369-63.932 64.188v159.807h-320.135c-17.595 0-31.857-14.568-31.857-31.854v-736.275c0-17.593 14.551-31.854 31.998-31.854h479.992c17.672 0 31.998 14.238 31.998 31.788v64.21zM416.002 831.991v-143.716c0-17.828 14.421-32.28 31.895-32.28h118.5l-150.395 175.996zM192.242 527.998c-35.475 0-64.234-28.805-64.234-63.744v-224.506c0-35.204 28.746-63.744 64.234-63.744h735.515c35.475 0 64.234 28.805 64.234 63.744v224.506c0 35.204-28.746 63.744-64.234 63.744h-735.515zM256.006 352.001l-63.999 111.998h31.999l47.999-83.998 47.999 83.998h31.999l-63.999-111.998 63.999-111.998h-31.999l-47.999 83.998-47.999-83.998h-31.999l63.999 111.998zM543.999 272.003v-31.999h-159.996v223.995h31.999v-191.996h127.997zM640.153 463.999c-35.431 0-64.155-28.406-64.155-63.999 0-35.345 28.406-63.999 63.999-63.999h31.699c17.839 0 32.299-14.204 32.299-31.999 0-17.673-14.165-31.999-31.966-31.999h-32.066c-17.655 0-31.966 14.601-31.966 31.856v0.362h-31.999v-0.184c0-35.364 28.604-64.034 64.155-64.034h31.687c35.431 0 64.155 28.406 64.155 63.999 0 35.345-28.406 63.999-63.999 63.999h-31.699c-17.839 0-32.299 14.204-32.299 31.999 0 17.673 14.165 31.999 31.966 31.999h32.066c17.655 0 31.966-14.502 31.966-31.999h31.999c0 35.345-28.604 63.999-64.155 63.999h-31.687zM831.993 352.001l-63.999 111.998h31.999l47.999-83.998 47.999 83.998h31.999l-63.999-111.998 63.999-111.998h-31.999l-47.999 83.998-47.999-83.998h-31.999l63.999 111.998z" />
<glyph unicode="&#xe92e;" glyph-name="section" d="M0 960v-32h1024v32h-1024zM0-32v-32h1024v32h-1024zM992 960v-1024h32v1024h-32zM0 960v-1024h32v1024h-32zM0 640v-64h1024v64h-1024zM0 320v-64h1024v64h-1024z" />
<glyph unicode="&#xe92f;" glyph-name="row-delete" d="M602.814 604.293l-90.711-90.426-90.426 90.711c-4.538 4.552-11.915 4.564-16.467 0.026l-49.478-49.323c-4.552-4.538-4.564-11.915-0.026-16.467l90.426-90.711-90.711-90.426c-4.552-4.538-4.564-11.915-0.026-16.467l49.323-49.478c4.538-4.552 11.915-4.564 16.467-0.026l90.711 90.426 90.426-90.711c4.538-4.552 11.915-4.564 16.467-0.026l49.478 49.323c4.552 4.538 4.564 11.915 0.026 16.467l-90.426 90.711 90.711 90.426c4.552 4.538 4.564 11.915 0.026 16.467l-49.323 49.478c-4.538 4.552-11.915 4.564-16.467 0.026zM960.943 704v-512h64v512h-64zM0.943 704v-64h1024v64h-1024zM0.943 704v-512h64v512h-64zM-0.943 256v-64h1024v64h-1024z" />
<glyph unicode="&#xe930;" glyph-name="column-delete" d="M668.293 357.186l-90.426 90.711 90.711 90.426c4.552 4.538 4.564 11.915 0.026 16.467l-49.323 49.478c-4.538 4.552-11.915 4.564-16.467 0.026l-90.711-90.426-90.426 90.711c-4.538 4.552-11.915 4.564-16.467 0.026l-49.478-49.323c-4.552-4.538-4.564-11.915-0.026-16.467l90.426-90.711-90.711-90.426c-4.552-4.538-4.564-11.915-0.026-16.467l49.323-49.478c4.538-4.552 11.915-4.564 16.467-0.026l90.711 90.426 90.426-90.711c4.538-4.552 11.915-4.564 16.467-0.026l49.478 49.323c4.552 4.538 4.564 11.915 0.026 16.467zM768-0.943h-512v-64h512v64zM768 959.057h-64v-1024h64v1024zM768 959.057h-512v-64h512v64zM320 960.943h-64v-1024h64v1024z" />
<glyph unicode="&#xe931;" glyph-name="row-add-below" d="M0 341.629v-64h224v64h-224zM960 789.629v-512h64v512h-64zM0 791.709v-64h1024v64h-1024zM800 341.629v-64h224v64h-224zM726.86 222.48h-157.564v157.564c0 7.907-6.417 14.324-14.324 14.324h-85.944c-7.907 0-14.324-6.417-14.324-14.324v-157.564h-157.564c-7.907 0-14.324-6.417-14.324-14.324v-85.944c0-7.907 6.417-14.324 14.324-14.324h157.564v-157.564c0-7.907 6.417-14.324 14.324-14.324h85.944c7.907 0 14.324 6.417 14.324 14.324v157.564h157.564c7.907 0 14.324 6.417 14.324 14.324v85.944c0 7.907-6.417 14.324-14.324 14.324zM0 789.629v-512h64v512h-64z" />
<glyph unicode="&#xe932;" glyph-name="row-add-above" d="M0 554.371v64h224v-64h-224zM960 106.371v512h64v-512h-64zM0 104.291v64h1024v-64h-1024zM800 554.371v64h224v-64h-224zM726.86 673.52h-157.564v-157.564c0-7.907-6.417-14.324-14.324-14.324h-85.944c-7.907 0-14.324 6.417-14.324 14.324v157.564h-157.564c-7.907 0-14.324 6.417-14.324 14.324v85.944c0 7.907 6.417 14.324 14.324 14.324h157.564v157.564c0 7.907 6.417 14.324 14.324 14.324h85.944c7.907 0 14.324-6.417 14.324-14.324v-157.564h157.564c7.907 0 14.324-6.417 14.324-14.324v-85.944c0-7.907-6.417-14.324-14.324-14.324zM0 106.371v512h64v-512h-64z" />
<glyph unicode="&#xe933;" glyph-name="column-add-left" d="M405.629 960h-64v-224h64v224zM853.629 0h-512v-64h512v64zM855.709 960h-64v-1024h64v1024zM405.629 160h-64v-224h64v224zM286.48 233.14v157.564h157.564c7.907 0 14.324 6.417 14.324 14.324v85.944c0 7.907-6.417 14.324-14.324 14.324h-157.564v157.564c0 7.907-6.417 14.324-14.324 14.324h-85.944c-7.907 0-14.324-6.417-14.324-14.324v-157.564h-157.564c-7.907 0-14.324-6.417-14.324-14.324v-85.944c0-7.907 6.417-14.324 14.324-14.324h157.564v-157.564c0-7.907 6.417-14.324 14.324-14.324h85.944c7.907 0 14.324 6.417 14.324 14.324zM853.629 960h-512v-64h512v64z" />
<glyph unicode="&#xe934;" glyph-name="column-add-right" d="M618.371-64h64v224h-64v-224zM170.371 896h512v64h-512v-64zM168.291-64h64v1024h-64v-1024zM618.371 736h64v224h-64v-224zM737.52 662.86v-157.564h-157.564c-7.907 0-14.324-6.417-14.324-14.324v-85.944c0-7.907 6.417-14.324 14.324-14.324h157.564v-157.564c0-7.907 6.417-14.324 14.324-14.324h85.944c7.907 0 14.324 6.417 14.324 14.324v157.564h157.564c7.907 0 14.324 6.417 14.324 14.324v85.944c0 7.907-6.417 14.324-14.324 14.324h-157.564v157.564c0 7.907-6.417 14.324-14.324 14.324h-85.944c-7.907 0-14.324-6.417-14.324-14.324zM170.371-64h512v64h-512v-64z" />
<glyph unicode="&#xe935;" glyph-name="arrow-right" d="M732.972 493.539l-356.135 354.183c-23.635 23.484-61.959 23.484-85.594 0-23.639-23.482-23.639-61.55 0-85.033l316.418-314.69-316.418-314.686c-23.639-23.482-23.639-61.554 0-85.035 23.635-23.482 61.959-23.482 85.594 0l356.135 354.179c12.597 12.514 18.266 29.156 17.438 45.543 0.828 16.384-4.84 33.026-17.438 45.539z" />
<glyph unicode="&#xe936;" glyph-name="insert-report" d="M-0.255 806.578c0 56.348 46.103 102.451 102.451 102.451h819.608c56.582 0 102.451-45.869 102.451-102.451v0-717.157c0-56.582-45.869-102.451-102.451-102.451v0h-819.608c-56.582 0-102.451 45.869-102.451 102.451v0 717.157zM102.196 704.127v-614.706h819.608v614.706h-819.608zM512 550.451l204.902-256.127h-409.804l204.902 256.127z" />
<glyph unicode="&#xe937;" glyph-name="delete" d="M219.968-14.592c1.152-27.584 23.872-49.376 51.488-49.376h481.088c27.616 0 50.336 21.792 51.488 49.376l34.368 725.248h-652.768l34.368-725.248zM620.832 530.496c0 11.552 9.376 20.928 20.928 20.928h33.472c11.552 0 20.928-9.376 20.928-20.928v-414.336c0-11.552-9.376-20.928-20.928-20.928h-33.472c-11.552 0-20.928 9.376-20.928 20.928v414.336zM474.336 530.496c0 11.552 9.376 20.928 20.928 20.928h33.472c11.552 0 20.928-9.376 20.928-20.928v-414.336c0-11.552-9.376-20.928-20.928-20.928h-33.472c-11.552 0-20.928 9.376-20.928 20.928v414.336zM327.84 530.496c0 11.552 9.376 20.928 20.928 20.928h33.472c11.552 0 20.928-9.376 20.928-20.928v-414.336c0-11.552-9.376-20.928-20.928-20.928h-33.472c-11.552 0-20.928 9.376-20.928 20.928v414.336zM861.248 907.232h-221.952v41.952c0 5.952-4.832 10.784-10.784 10.784h-233.056c-5.952 0-10.784-4.832-10.784-10.784v-41.952h-221.952c-17.856 0-32.352-14.464-32.352-32.352v-101.6h763.2v101.6c0 17.856-14.464 32.352-32.352 32.352z" />
<glyph unicode="&#xe938;" glyph-name="check" d="M995.357 797.465c38.152-38.152 38.152-99.96 0-138.112l-566.769-566.769c-30.208-30.208-79.145-30.208-109.353 0l-290.604 290.604c-38.152 38.152-38.152 99.96 0 138.112s99.96 38.152 138.112 0l207.168-207.168 483.334 483.334c38.152 38.152 99.96 38.152 138.112 0z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1,15 @@
/** @odoo-module */
import { registry } from "@web/core/registry";
import { Component, xml } from "@odoo/owl";
const actionRegistry = registry.category("actions");
class Dashboard extends Component {}
Dashboard.template = xml`
<t t-name="report_designer">
<iframe marginheight="0" marginwidth="0" width="90%" height="1000px" src="/report_designer" frameborder="0" allowfullscreen="True"></iframe>
</t>`;
actionRegistry.add("report_designer", Dashboard);
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="report_designer">
<iframe marginheight="0" marginwidth="0" width="90%" height="1000px" src="/report_designer" frameborder="0" allowfullscreen="True"></iframe>
</t>
</templates>
+158
View File
@@ -0,0 +1,158 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="0"/>
<title>Index</title>
<script src="/reportbro/static/src/js/dist/ext/jquery.js"></script>
<link rel="stylesheet" href="/reportbro/static/src/js/dist/reportbro.css"/>
<script src="/reportbro/static/src/js/dist/reportbro.js"></script>
<link rel="stylesheet" href="/reportbro/static/src/js/dist/ext/spectrum.css"/>
<script src="/reportbro/static/src/js/dist/ext/autosize.js"></script>
<script src="/reportbro/static/src/js/dist/ext/JsBarcode.all.min.js"></script>
<script src="/reportbro/static/src/js/dist/ext/spectrum.js"></script>
<link rel="stylesheet" href="/reportbro/static/src/js/dist/src/iconfonts/font.css"/>
</head>
<body>
<script type="text/javascript">
$(document).ready(function () {
//var report_id=get_report_id();
//var report_id = getUrlArgs().report_id;
function get_report_id()
{
$.ajax({
url: '/api/report/get_report_id',
dataType: 'json',
contentType: 'application/json',
type: 'post',
data: JSON.stringify({"report_id": ''}),
success: function (res) {
if (res.result.code === 0) {
return res.result.id;
}
else {
alert('错误');
}
}
});
}
//取URL 参数
function getUrlArgs() {
var url = top.location.href;
var i = url.indexOf('#');
if (i == -1) return;
var querystr = url.substr(i + 1);
var arr1 = querystr.split('&');
var arr2 = new Object();
for (i in arr1) {
var t = arr1[i].split('=');
arr2[t[0]] = t[1];
}
return arr2;
}
//读取数据库配置
function report_designer() {
$.ajax({
url: '/api/report/get_report_id',
dataType: 'json',
contentType: 'application/json',
type: 'post',
data: JSON.stringify({"report_id": ''}),
success: function (res) {
if (res.result.code === 0) {
$.ajax({
url: '/api/report/report_read',
dataType: 'json',
contentType: 'application/json',
type: 'post',
data: JSON.stringify({"report_id": res.result.id}),
success: function (r) {
if (r.result.code === 0) {
$('#reportbro').reportBro('load',r.result.msg);
}
else {
alert(r.result.msg)
}
}
});
}
else {
alert('错误');
}
}
});
}
function saveReport() {
var report_data = $('#reportbro').reportBro('getReport');
$.ajax({
url: '/api/report/get_report_id',
dataType: 'json',
contentType: 'application/json',
type: 'post',
data: JSON.stringify({"report_id": ''}),
success: function (res) {
if (res.result.code === 0) {
$.ajax({
url: '/api/report/report_save',
data: JSON.stringify({
'report_id': res.result.id,
'report_data': report_data
}),
dataType: 'json',
type: 'POST',
async: false,
contentType: 'application/json',
success: function (r) {
if (r.result.code == 0) {
alert(r.result.msg);
} else {
alert(r.result.msg);
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert('Save Fail');
},
});
}
else {
alert('错误');
}
}
});
}
$('#reportbro').reportBro({
saveCallback: saveReport,
reportServerUrl: "/api/report/report_server/run",
additionalFonts: [{name: 'Courier', value: 'courier'},{name: 'Helvetica', value: 'helvetica'},{name: 'Times New Roman', value: 'times'},{name: '雅黑常规', value: 'msyh'}]//客户端添加字体及样式里添加,服务端也要添加同样名称字体支持中文
});
report_designer();
});
</script>
<div id="reportbro"></div>
</body>
</html>
+104
View File
@@ -0,0 +1,104 @@
<odoo>
<data>
<record id="view_report_report_tree" model="ir.ui.view">
<field name="name">Report Report Tree</field>
<field name="model">report.report</field>
<field name="arch" type="xml">
<tree>
<field name="name"></field>
<field name="model_id"></field>
</tree>
</field>
</record>
<record id="view_report_report_form" model="ir.ui.view">
<field name="name">Report Report Form</field>
<field name="model">report.report</field>
<field name="arch" type="xml">
<form>
<header>
<button name="button_designer" string="报表设计" type="object" class="oe_highlight"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="add_print_actions" icon="fa-arrows" class="oe_stat_button" invisible="display_completes==True"
string="添加动作" type="object"/>
<button name="del_print_actions" icon="fa-remove" class="oe_stat_button" invisible="display_completes==False" string="删除动作" type="object"/>
</div>
<group>
<group>
<field name="display_complete" invisible="1"/>
<field name="display_completes" invisible="1"/>
<field name="name"/>
<field name="model_main_key"/>
<field name="report_type"/>
<field name="reset_designer"/>
</group>
<group>
<field name="model_id"/>
<field name="model_detail_id"/>
<field name="group_field"/>
</group>
</group>
<notebook>
<page string="主表字段">
<field name="model_ids" widget="one2many" context="{'default_model_id':model_id}">
<tree string="Report Line" editable="bottom">
<field name="model_id" column_invisible="True"/>
<field name="field_domain" column_invisible="True"/>
<field name="field_id" domain="[('id', 'in', field_domain)]" options="{'no_create': True,'no_edit': True}"/>
<field name="field_description" column_invisible="True"/>
<field name="field_params"/>
<field name="field_value"/>
<field name="ttype"/>
<field name="is_report" widget="boolean_toggle"/>
</tree>
</field>
</page>
<page string="明细字段">
<field name="model_detail_ids" widget="one2many"
context="{'default_model_id':model_detail_id}">
<tree string="Report Line" editable="bottom">
<field name="model_id" column_invisible="True"/>
<field name="field_domain" column_invisible="True"/>
<field name="field_id" domain="[('id', 'in', field_domain)]" options="{'no_create': True,'no_edit': True}"/>
<field name="field_description" column_invisible="True"/>
<field name="field_params"/>
<field name="field_value"/>
<field name="ttype"/>
<field name="is_report" widget="boolean_toggle"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="action_report_report" model="ir.actions.act_window">
<field name="name">报表设计</field>
<field name="res_model">report.report</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="wms_report_base_menu" name="报表设计" parent="base_setup.menu_config" sequence="5"
action="action_report_report"/>
<record model="ir.ui.view" id="wms_print_list">
<field name="name">wms_print_list</field>
<field name="model">wms.print.list</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form>
<field name="name"/>
<footer>
<button string="关闭" class="btn-primary" special="cancel"/>
</footer>
</form>
</field>
</record>
</data>
</odoo>
+1
View File
@@ -18,6 +18,7 @@
'views/inherit_approval_request_views.xml',
'views/approval_process_views.xml',
'views/demo_approval_request.xml',
'report/all_demo_report.xml',
'wizard/approval_notice_wizard_views.xml',
],
'installable': True,
@@ -5,7 +5,7 @@ from odoo.exceptions import ValidationError
class DemoApprovalRequest(models.Model):
_inherit = "approval.request"
_description = '默认审批 demo.approval.request'
_description = '默认审批 approval.request'
demo1 = fields.Char(string="demo1")
demo2 = fields.Char(string="demo2")
@@ -7,8 +7,9 @@ class ApprovalCategory(models.Model):
_description = '审批框架拓展'
model_name = fields.Char(string="模型名称")
category_type_number = fields.Char(string="审批类型编号")
approval_process_id = fields.Many2one('approval.process', string='审批流程')
category_type_number = fields.Char(srring='审批视图编号')
approval_department_ids = fields.Many2many('hr.department', string="审批所属部门")
approval_process_id = fields.Many2one('approval.process', string="审批流程")
is_enable = fields.Boolean(string="启用", default=True)
category_start_date = fields.Date(string="开始日期", default=fields.Date.today())
category_end_date = fields.Date(string="结束日期")
@@ -6,6 +6,9 @@ from odoo.exceptions import ValidationError
class ApprovalRequest(models.Model):
_inherit = "approval.request"
def print_approval_report(self):
return self.env.ref('yuthon_approval.all_demo_report_actions').report_action(self)
def action_approve(self):
super(ApprovalRequest, self).action_approve()
return {
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="all_demo_report_actions" model="ir.actions.report">
<field name="name">demo report</field>
<field name="model">approval.request</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">yuthon_approval.all_approval_template</field>
<field name="report_file">yuthon_approval.all_approval_template</field>
<field name="print_report_name">'Demo - %s' % (object.name).replace('/', '')</field>
<!-- <field name="binding_model_id" ref="model_approval_request"/>-->
<field name="binding_model_id" eval="False"/>
<field name="binding_type">report</field>
</record>
<template id="all_approval_template">
<t t-call="web.basic_layout" t-foreach="docs" t-as="doc">
<div class="page">
<h2 style="text-align:center;">
<storng>
<t t-esc="doc.name"/>
</storng>
</h2>
<table width="100%" style="table-layout:fixed;">
<tr colspan="7" rowspan="2">
<td colspan="4">
<strong>申请人:</strong>
<span t-field="doc.request_owner_id"/>
</td>
<td colspan="4">
<strong>确认时间:</strong>
<span t-field="doc.date_confirmed"/>
</td>
</tr>
<tr colspan="7" rowspan="2">
<td colspan="4">
<strong>审批类型:</strong>
<span t-field="doc.category_id.name"/>
</td>
<td colspan="4">
<strong>审批状态:</strong>
<span t-field="doc.request_status"/>
</td>
</tr>
</table>
</div>
</t>
</template>
</odoo>
@@ -20,8 +20,9 @@
<field name="inherit_id" ref="approvals.approval_category_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='description']" position="after">
<field name="category_type_number"/>
<field name="model_name" invisible="1"/>
<field name="category_type_number" column_invisible="True"/>
<field name="approval_department_ids" widget="many2many_tags"/>
<field name="model_name" column_invisible="True"/>
</xpath>
<xpath expr="//field[@name='approver_ids']" position="after">
<field name="approval_process_id" widget="many2one_avatar_user"/>
@@ -8,6 +8,10 @@
<xpath expr="//field[@name='approver_ids']/tree//field[@name='status']" position="after">
<field name="approval_notice"/>
</xpath>
<xpath expr="//button[@name='action_cancel']" position="after">
<button name="print_approval_report" string="打印" type="object"
invisible="request_status in ['new', 'cancel']"/>
</xpath>
</field>
</record>
</odoo>