审批二开
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -0,0 +1,4 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
@@ -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',
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import report_server
|
||||
@@ -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: '}
|
||||
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 66 KiB |
@@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import datasource,report
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 123 KiB |
|
After Width: | Height: | Size: 31 KiB |
@@ -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 |
@@ -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>
|
||||
|
After Width: | Height: | Size: 81 KiB |
@@ -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;
|
||||
});
|
||||
@@ -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
|
||||
*/
|
||||
@@ -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==);
|
||||
}
|
||||
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,5 @@
|
||||
@font-face {
|
||||
font-family: "zh_CN";
|
||||
src: url("simhei.ttf") format('simhei'),
|
||||
url("STSONG.TTF") format('STSONG');
|
||||
}
|
||||
@@ -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=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" />
|
||||
<glyph unicode="" 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="" 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="" glyph-name="text-align-left" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
|
||||
<glyph unicode="" glyph-name="save" d="M896 960h-896v-1024h1024v896l-128 128zM512 832h128v-256h-128v256zM896 64h-768v768h64v-320h576v320h74.978l53.022-53.018v-714.982z" />
|
||||
<glyph unicode="" glyph-name="text-align-center" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
|
||||
<glyph unicode="" glyph-name="text-align-right" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
|
||||
<glyph unicode="" glyph-name="text-align-justify" d="M0 896h1024v-128h-1024zM0 704h1024v-128h-1024zM0 512h1024v-128h-1024zM0 320h1024v-128h-1024zM0 128h1024v-128h-1024z" />
|
||||
<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" glyph-name="border-all" d="M0 64v-128h1024v128h-1024zM896 960v-1024h128v1024h-128zM0 960v-1024h128v1024h-128zM0 960v-128h1024v128h-1024z" />
|
||||
<glyph unicode="" 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="" 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="" 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="" glyph-name="line" d="M0 489.6v-57.6h1024v57.6h-1024z" />
|
||||
<glyph unicode="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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="" 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 |
|
After Width: | Height: | Size: 13 KiB |
|
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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||