chore: import upstream snapshot with attribution
This commit is contained in:
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import tornado.web
|
||||
import libs.stock_web_dic as stock_web_dic
|
||||
import libs.common as common
|
||||
import logging
|
||||
|
||||
#基础handler,主要负责检查mysql的数据库链接。
|
||||
class BaseHandler(tornado.web.RequestHandler):
|
||||
def set_default_headers(self):
|
||||
headers = self.request.headers
|
||||
# logging.info('head的类型:',type(headers))
|
||||
origin = headers.get('origin',None)
|
||||
logging.info("######################## BaseHandler ########################")
|
||||
logging.info(origin)
|
||||
|
||||
if origin != None and origin.find("localhost") > 0:
|
||||
self.set_header("Access-Control-Allow-Credentials", "true")
|
||||
self.set_header("Access-Control-Allow-Origin",origin)
|
||||
self.set_header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
|
||||
self.set_header("Access-Control-Allow-Headers", "x-token, authorization, Authorization, Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods")
|
||||
self.set_header("Access-Control-Expose-Headers", "Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma")
|
||||
# 同时定义一个option方法
|
||||
def options(self):
|
||||
self.set_status(204)
|
||||
self.finish()
|
||||
|
||||
@property
|
||||
def db(self):
|
||||
try:
|
||||
# check every time。
|
||||
self.application.db.query("SELECT 1 ")
|
||||
except Exception as e:
|
||||
print(e)
|
||||
self.application.db.reconnect()
|
||||
return self.application.db
|
||||
|
||||
class LeftMenu:
|
||||
def __init__(self, url):
|
||||
self.leftMenuList = stock_web_dic.STOCK_WEB_DATA_LIST
|
||||
self.current_url = url
|
||||
|
||||
# 获得左菜单。
|
||||
def GetLeftMenu(url):
|
||||
return LeftMenu(url)
|
||||
Executable
+50
@@ -0,0 +1,50 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from tornado import gen
|
||||
import libs.stock_web_dic as stock_web_dic
|
||||
import web.base as webBase
|
||||
import libs.common as common
|
||||
import logging
|
||||
import tornado.web
|
||||
import matplotlib
|
||||
matplotlib.use('Agg')
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
import io
|
||||
|
||||
def GenImage(freq):
|
||||
t = np.linspace(0, 10, 500)
|
||||
y = np.sin(t * freq * 2 * 3.141)
|
||||
fig1 = plt.figure()
|
||||
plt.plot(t, y)
|
||||
plt.xlabel('Time [s]')
|
||||
memdata = io.BytesIO()
|
||||
plt.grid(True)
|
||||
plt.savefig(memdata, format='png')
|
||||
image = memdata.getvalue()
|
||||
return image
|
||||
|
||||
|
||||
class ImageHandler(tornado.web.RequestHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
image = GenImage(0.5)
|
||||
self.set_header('Content-type', 'image/png')
|
||||
self.set_header('Content-length', len(image))
|
||||
self.write(image)
|
||||
|
||||
# 获得页面数据。
|
||||
class GetChartHtmlHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
name = self.get_argument("table_name", default=None, strip=False)
|
||||
#stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[name]
|
||||
# self.uri_ = ("self.request.url:", self.request.uri)
|
||||
# print self.uri_
|
||||
logging.info("chart...")
|
||||
self.render("stock_chart.html", entries="",
|
||||
pythonStockVersion=common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
|
||||
Executable
+110
@@ -0,0 +1,110 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from tornado import gen
|
||||
# import sys
|
||||
# import os
|
||||
# sys.path.append(os.path.abspath('/data/stock/libs'))
|
||||
import libs.stock_web_dic as stock_web_dic
|
||||
import web.base as webBase
|
||||
import libs.common as common
|
||||
import logging
|
||||
import re
|
||||
|
||||
# 获得页面数据。
|
||||
class GetEditorHtmlHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
name = self.get_argument("table_name", default=None, strip=False)
|
||||
stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[name]
|
||||
# self.uri_ = ("self.request.url:", self.request.uri)
|
||||
# print self.uri_
|
||||
self.render("data_editor.html", stockWeb=stockWeb,
|
||||
pythonStockVersion=common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
|
||||
|
||||
# 拼接sql,将value的key 和 value 放到一起。
|
||||
def genSql(primary_key, param_map, join_string):
|
||||
tmp_sql = ""
|
||||
idx = 0
|
||||
for tmp_key in primary_key:
|
||||
tmp_val = param_map[tmp_key]
|
||||
if idx == 0:
|
||||
tmp_sql = " `%s` = '%s' " % (tmp_key, tmp_val)
|
||||
else:
|
||||
tmp_sql += join_string + (" `%s` = '%s' " % (tmp_key, tmp_val))
|
||||
idx += 1
|
||||
return tmp_sql
|
||||
|
||||
|
||||
# 获得页面数据。
|
||||
class SaveEditorHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def post(self):
|
||||
action = self.get_argument("action", default=None, strip=False)
|
||||
logging.info(action)
|
||||
table_name = self.get_argument("table_name", default=None, strip=False)
|
||||
stockWeb = stock_web_dic.STOCK_WEB_DATA_MAP[table_name]
|
||||
# 临时map数组。
|
||||
param_map = {}
|
||||
# 支持多排序。使用shift+鼠标左键。
|
||||
for item, val in self.request.arguments.items():
|
||||
# 正则查找 data[1112][code] 里面的code字段
|
||||
item_key = re.search(r"\]\[(.*?)\]", item)
|
||||
if item_key:
|
||||
tmp_1 = item_key.group()
|
||||
if tmp_1:
|
||||
tmp_1 = tmp_1.replace("][", "").replace("]", "")
|
||||
param_map[tmp_1] = val[0].decode("utf-8")
|
||||
#logging.info(param_map)
|
||||
if action == "create":
|
||||
logging.info("###########################create")
|
||||
# 拼接where 和 update 语句。
|
||||
tmp_columns = "`, `".join(stockWeb.columns)
|
||||
tmp_values = []
|
||||
for tmp_key in stockWeb.columns:
|
||||
tmp_values.append(param_map[tmp_key])
|
||||
# 更新sql。
|
||||
tmp_values2 = "', '".join(tmp_values)
|
||||
insert_sql = " INSERT INTO %s (`%s`) VALUES('%s'); " % (stockWeb.table_name, tmp_columns, tmp_values2)
|
||||
logging.info(insert_sql)
|
||||
try:
|
||||
self.db.execute(insert_sql)
|
||||
except Exception as e:
|
||||
err = {"error": str(e)}
|
||||
logging.info(err)
|
||||
self.write(err)
|
||||
return
|
||||
|
||||
elif action == "edit":
|
||||
logging.info("###########################edit")
|
||||
# 拼接where 和 update 语句。
|
||||
tmp_update = genSql(stockWeb.columns, param_map, ",")
|
||||
tmp_where = genSql(stockWeb.primary_key, param_map, "and")
|
||||
# 更新sql。
|
||||
update_sql = " UPDATE %s SET %s WHERE %s " % (stockWeb.table_name, tmp_update, tmp_where)
|
||||
logging.info(update_sql)
|
||||
try:
|
||||
self.db.execute(update_sql)
|
||||
except Exception as e:
|
||||
err = {"error": str(e)}
|
||||
logging.info(err)
|
||||
self.write(err)
|
||||
return
|
||||
elif action == "remove":
|
||||
logging.info("###########################remove")
|
||||
# 拼接where 语句。
|
||||
tmp_where = genSql(stockWeb.primary_key, param_map, "and")
|
||||
# 更新sql。
|
||||
delete_sql = " DELETE FROM %s WHERE %s " % (stockWeb.table_name, tmp_where)
|
||||
logging.info(delete_sql)
|
||||
try:
|
||||
self.db.execute(delete_sql)
|
||||
except Exception as e:
|
||||
err = {"error": str(e)}
|
||||
logging.info(err)
|
||||
self.write(err)
|
||||
return
|
||||
self.write("{\"data\":[{}]}")
|
||||
Executable
+353
@@ -0,0 +1,353 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from tornado import gen
|
||||
import web.base as webBase
|
||||
import logging
|
||||
|
||||
# 首映 bokeh 画图。
|
||||
from bokeh.plotting import figure
|
||||
from bokeh.embed import components
|
||||
import datetime
|
||||
import libs.common as common
|
||||
import stockstats
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from bokeh.layouts import gridplot
|
||||
from bokeh.palettes import Category20
|
||||
from math import radians
|
||||
from bokeh.models import DatetimeTickFormatter
|
||||
|
||||
|
||||
# 获得页面数据。
|
||||
class GetDataIndicatorsHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
code = self.get_argument("code", default=None, strip=False)
|
||||
logging.info(code)
|
||||
# self.uri_ = ("self.request.url:", self.request.uri)
|
||||
# print self.uri_
|
||||
comp_list = []
|
||||
|
||||
try:
|
||||
date_now = datetime.datetime.now()
|
||||
date_end = date_now.strftime("%Y-%m-%d")
|
||||
date_start = (date_now + datetime.timedelta(days=-100)).strftime("%Y-%m-%d")
|
||||
print(code, date_start, date_end)
|
||||
|
||||
# open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20, v_ma5, v_ma10, v_ma20, turnover
|
||||
# 使用缓存方法。加快计算速度。
|
||||
stock = common.get_hist_data_cache(code, date_start, date_end)
|
||||
logging.info(stock.head(1))
|
||||
|
||||
# print(stock) [186 rows x 14 columns]
|
||||
# 初始化统计类
|
||||
# stockStat = stockstats.StockDataFrame.retype(pd.read_csv("002032.csv"))
|
||||
stockStat = stockstats.StockDataFrame.retype(stock)
|
||||
batch_add(comp_list, stockStat)
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logging.info("error :", e)
|
||||
logging.info("#################### GetStockHtmlHandlerEnd ####################")
|
||||
|
||||
self.render("stock_indicators.html", comp_list=comp_list,
|
||||
pythonStockVersion=common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
|
||||
# 全部指标数据汇总
|
||||
indicators_all_dic = [
|
||||
{
|
||||
"title": "1,交易量delta指标分析",
|
||||
"desc": "The Volume Delta (Vol ∆) ",
|
||||
"dic": ["volume", "volume_delta"]
|
||||
}, {
|
||||
"title": "2,计算n天差",
|
||||
"desc": "可以计算,向前n天,和向后n天的差。",
|
||||
"dic": ["close", "close_1_d", "close_2_d", "close_-1_d", "close_-2_d"]
|
||||
}, {
|
||||
"title": "3,n天涨跌百分百计算",
|
||||
"desc": "可以看到,-n天数据和今天数据的百分比。",
|
||||
"dic": ["close", "close_-1_r", "close_-2_r"]
|
||||
}, {
|
||||
"title": "4,CR指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/CR%E6%8C%87%E6%A0%87 价格动量指标
|
||||
4. CR跌穿a、b、c、d四条线,再由低点向上爬升160时,为短线获利的一个良机,应适当卖出股票。
|
||||
5. CR跌至40以下时,是建仓良机。而CR高于300~400时,应注意适当减仓。
|
||||
""",
|
||||
"dic": ["close","cr","cr-ma1","cr-ma2","cr-ma3"]
|
||||
}, {
|
||||
"title": "5,最大值,最小值",
|
||||
"desc": """
|
||||
计算区间最大值
|
||||
volume max of three days ago, yesterday and two days later
|
||||
stock["volume_-3,2,-1_max"]
|
||||
volume min between 3 days ago and tomorrow
|
||||
stock["volume_-3~1_min"]
|
||||
实际使用的时候使用 -2~2 可计算出5天的最大,最小值。
|
||||
""",
|
||||
"dic": ["volume","volume_-2~2_max","volume_-2~2_min"]
|
||||
}, {
|
||||
"title": "6,KDJ指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87
|
||||
随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。
|
||||
(3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度,以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。
|
||||
""",
|
||||
"dic": ["close","kdjk","kdjd","kdjj"]
|
||||
}, {
|
||||
"title": "7,SMA指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/Sma
|
||||
简单移动平均线(Simple Moving Average,SMA)
|
||||
可以动态输入参数,获得几天的移动平均。
|
||||
""",
|
||||
"dic": ["close","close_5_sma","close_10_sma"]
|
||||
}, {
|
||||
"title": "8,MACD指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/MACD
|
||||
平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标
|
||||
MACD
|
||||
stock["macd"]
|
||||
MACD signal line
|
||||
stock["macds"]
|
||||
MACD histogram
|
||||
stock["macdh"]
|
||||
MACD技术分析,运用DIF线与MACD线之相交型态及直线棒高低点与背离现象,作为买卖讯号,尤其当市场股价走势呈一较为明确波段趋势时,
|
||||
MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。
|
||||
当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。
|
||||
""",
|
||||
"dic": ["close","macd","macds","macdh"]
|
||||
}, {
|
||||
"title": "9,BOLL指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/BOLL
|
||||
布林线指标(Bollinger Bands)
|
||||
bolling, including upper band and lower band
|
||||
stock["boll"]
|
||||
stock["boll_ub"]
|
||||
stock["boll_lb"]
|
||||
1、当布林线开口向上后,只要股价K线始终运行在布林线的中轨上方的时候,说明股价一直处在一个中长期上升轨道之中,这是BOLL指标发出的持股待涨信号,如果TRIX指标也是发出持股信号时,这种信号更加准确。此时,投资者应坚决持股待涨。
|
||||
2、当布林线开口向下后,只要股价K线始终运行在布林线的中轨下方的时候,说明股价一直处在一个中长期下降轨道之中,这是BOLL指标发出的持币观望信号,如果TRIX指标也是发出持币信号时,这种信号更加准确。此时,投资者应坚决持币观望。
|
||||
""",
|
||||
"dic": ["close","boll","boll_ub","boll_lb"]
|
||||
}, {
|
||||
"title": "10,RSI指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/RSI
|
||||
相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数
|
||||
6 days RSI
|
||||
stock["rsi_6"]
|
||||
12 days RSI
|
||||
stock["rsi_12"]
|
||||
(2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。
|
||||
(3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。
|
||||
(4)当六日强弱指标下降至20时,表示股市有超卖现象,如果一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会。
|
||||
""",
|
||||
"dic": ["close","rsi_6","rsi_12"]
|
||||
}, {
|
||||
"title": "11,WR指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E5%A8%81%E5%BB%89%E6%8C%87%E6%A0%87
|
||||
威廉指数(Williams%Rate)该指数是利用摆动点来度量市场的超买超卖现象。
|
||||
10 days WR
|
||||
stock["wr_10"]
|
||||
6 days WR
|
||||
stock["wr_6"]
|
||||
""",
|
||||
"dic": ["close","wr_10","wr_6"]
|
||||
}, {
|
||||
"title": "12,CCI指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87
|
||||
顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”,
|
||||
是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。
|
||||
CCI, default to 14 days
|
||||
stock["cci"]
|
||||
20 days CCI
|
||||
stock["cci_20"]
|
||||
1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段,
|
||||
中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。
|
||||
2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束,
|
||||
将进入一个比较长的寻底过程,投资者应以持币观望为主。
|
||||
""",
|
||||
"dic": ["close","cci","cci_20"]
|
||||
}, {
|
||||
"title": "13,TR、ATR指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E5%9D%87%E5%B9%85%E6%8C%87%E6%A0%87
|
||||
均幅指标(Average True Ranger,ATR)
|
||||
均幅指标(ATR)是取一定时间周期内的股价波动幅度的移动平均值,主要用于研判买卖时机。
|
||||
TR (true range)
|
||||
stock["tr"]
|
||||
ATR (Average True Range)
|
||||
stock["atr"]
|
||||
均幅指标无论是从下向上穿越移动平均线,还是从上向下穿越移动平均线时,都是一种研判信号。
|
||||
""",
|
||||
"dic": ["close","tr","atr"]
|
||||
}, {
|
||||
"title": "14,DMA指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/DMA
|
||||
DMA指标(Different of Moving Average)又叫平行线差指标,是目前股市分析技术指标中的一种中短期指标,它常用于大盘指数和个股的研判。
|
||||
DMA, difference of 10 and 50 moving average
|
||||
stock["dma"]
|
||||
""",
|
||||
"dic": ["close","dma"]
|
||||
}, {
|
||||
"title": "15,DMI,+DI,-DI,DX,ADX,ADXR指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/DMI
|
||||
动向指数Directional Movement Index,DMI)
|
||||
http://wiki.mbalib.com/wiki/ADX
|
||||
平均趋向指标(Average Directional Indicator,简称ADX)
|
||||
http://wiki.mbalib.com/wiki/%E5%B9%B3%E5%9D%87%E6%96%B9%E5%90%91%E6%8C%87%E6%95%B0%E8%AF%84%E4%BC%B0
|
||||
平均方向指数评估(ADXR)实际是今日ADX与前面某一日的ADX的平均值。ADXR在高位与ADX同步下滑,可以增加对ADX已经调头的尽早确认。
|
||||
ADXR是ADX的附属产品,只能发出一种辅助和肯定的讯号,并非入市的指标,而只需同时配合动向指标(DMI)的趋势才可作出买卖策略。
|
||||
在应用时,应以ADX为主,ADXR为辅。
|
||||
""",
|
||||
"dic": ["close","pdi","mdi","dx","adx","adxr"]
|
||||
}, {
|
||||
"title": "16,TRIX,MATRIX指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/TRIX
|
||||
TRIX指标又叫三重指数平滑移动平均指标(Triple Exponentially Smoothed Average)
|
||||
""",
|
||||
"dic": ["close","trix","trix_9_sma"]
|
||||
}, {
|
||||
"title": "17,VR,MAVR指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E6%88%90%E4%BA%A4%E9%87%8F%E6%AF%94%E7%8E%87
|
||||
成交量比率(Volumn Ratio,VR)(简称VR),是一项通过分析股价上升日成交额(或成交量,下同)与股价下降日成交额比值,
|
||||
从而掌握市场买卖气势的中期技术指标。
|
||||
VR, default to 26 days
|
||||
stock["vr"]
|
||||
MAVR is the simple moving average of VR
|
||||
stock["vr_6_sma"]
|
||||
""",
|
||||
"dic": ["close","vr","vr_6_sma"]
|
||||
}
|
||||
]
|
||||
# 配置数据
|
||||
indicators_dic = [
|
||||
{
|
||||
"title": "6,KDJ指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E6%8C%87%E6%A0%87
|
||||
随机指标(KDJ)一般是根据统计学的原理,通过一个特定的周期(常为9日、9周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值RSV,然后根据平滑移动平均线的方法来计算K值、D值与J值,并绘成曲线图来研判股票走势。
|
||||
(3)在使用中,常有J线的指标,即3乘以K值减2乘以D值(3K-2D=J),其目的是求出K值与D值的最大乖离程度,以领先KD值找出底部和头部。J大于100时为超买,小于10时为超卖。
|
||||
""",
|
||||
"dic": ["close","kdjk","kdjd","kdjj"]
|
||||
}, {
|
||||
"title": "7,SMA指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/Sma
|
||||
简单移动平均线(Simple Moving Average,SMA)
|
||||
可以动态输入参数,获得几天的移动平均。
|
||||
""",
|
||||
"dic": ["close","close_5_sma","close_10_sma"]
|
||||
}, {
|
||||
"title": "8,MACD指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/MACD
|
||||
平滑异同移动平均线(Moving Average Convergence Divergence,简称MACD指标),也称移动平均聚散指标
|
||||
MACD
|
||||
stock["macd"]
|
||||
MACD signal line
|
||||
stock["macds"]
|
||||
MACD histogram
|
||||
stock["macdh"]
|
||||
MACD技术分析,运用DIF线与MACD线之相交型态及直线棒高低点与背离现象,作为买卖讯号,尤其当市场股价走势呈一较为明确波段趋势时,
|
||||
MACD 则可发挥其应有的功能,但当市场呈牛皮盘整格局,股价不上不下时,MACD买卖讯号较不明显。
|
||||
当用MACD作分析时,亦可运用其他的技术分析指标如短期 K,D图形作为辅助工具,而且也可对买卖讯号作双重的确认。
|
||||
""",
|
||||
"dic": ["close","macd","macds","macdh"]
|
||||
}, {
|
||||
"title": "9,BOLL指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/BOLL
|
||||
布林线指标(Bollinger Bands)
|
||||
bolling, including upper band and lower band
|
||||
stock["boll"]
|
||||
stock["boll_ub"]
|
||||
stock["boll_lb"]
|
||||
1、当布林线开口向上后,只要股价K线始终运行在布林线的中轨上方的时候,说明股价一直处在一个中长期上升轨道之中,这是BOLL指标发出的持股待涨信号,如果TRIX指标也是发出持股信号时,这种信号更加准确。此时,投资者应坚决持股待涨。
|
||||
2、当布林线开口向下后,只要股价K线始终运行在布林线的中轨下方的时候,说明股价一直处在一个中长期下降轨道之中,这是BOLL指标发出的持币观望信号,如果TRIX指标也是发出持币信号时,这种信号更加准确。此时,投资者应坚决持币观望。
|
||||
""",
|
||||
"dic": ["close","boll","boll_ub","boll_lb"]
|
||||
}, {
|
||||
"title": "10,RSI指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/RSI
|
||||
相对强弱指标(Relative Strength Index,简称RSI),也称相对强弱指数、相对力度指数
|
||||
6 days RSI
|
||||
stock["rsi_6"]
|
||||
12 days RSI
|
||||
stock["rsi_12"]
|
||||
(2)强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。
|
||||
(3)强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。
|
||||
(4)当六日强弱指标下降至20时,表示股市有超卖现象,如果一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会。
|
||||
""",
|
||||
"dic": ["close","rsi_6","rsi_12"]
|
||||
},{
|
||||
"title": "12,CCI指标",
|
||||
"desc": """
|
||||
http://wiki.mbalib.com/wiki/%E9%A1%BA%E5%8A%BF%E6%8C%87%E6%A0%87
|
||||
顺势指标又叫CCI指标,其英文全称为“Commodity Channel Index”,
|
||||
是由美国股市分析家唐纳德·蓝伯特(Donald Lambert)所创造的,是一种重点研判股价偏离度的股市分析工具。
|
||||
CCI, default to 14 days
|
||||
stock["cci"]
|
||||
20 days CCI
|
||||
stock["cci_20"]
|
||||
1、当CCI指标从下向上突破﹢100线而进入非常态区间时,表明股价脱离常态而进入异常波动阶段,
|
||||
中短线应及时买入,如果有比较大的成交量配合,买入信号则更为可靠。
|
||||
2、当CCI指标从上向下突破﹣100线而进入另一个非常态区间时,表明股价的盘整阶段已经结束,
|
||||
将进入一个比较长的寻底过程,投资者应以持币观望为主。
|
||||
""",
|
||||
"dic": ["close","cci","cci_20"]
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
# 批量添加数据。
|
||||
def batch_add(comp_list, stockStat):
|
||||
for conf in indicators_dic:
|
||||
logging.info(conf)
|
||||
|
||||
comp_list.append(add_plot(stockStat, conf))
|
||||
|
||||
|
||||
# 增加画图方法
|
||||
def add_plot(stockStat, conf):
|
||||
p_list = []
|
||||
logging.info("############################", type(conf["dic"]))
|
||||
# 循环 多个line 信息。
|
||||
for key, val in enumerate(conf["dic"]):
|
||||
logging.info(key)
|
||||
logging.info(val)
|
||||
|
||||
p1 = figure(width=1000, height=150, x_axis_type="datetime")
|
||||
# add renderers
|
||||
stockStat["date"] = pd.to_datetime(stockStat.index.values)
|
||||
# ["volume","volume_delta"]
|
||||
# 设置20个颜色循环,显示0 2 4 6 号序列。
|
||||
p1.line(stockStat["date"], stockStat[val], color=Category20[20][key * 2])
|
||||
|
||||
# Set date format for x axis 格式化。
|
||||
p1.xaxis.formatter = DatetimeTickFormatter(
|
||||
hours=["%Y-%m-%d"], days=["%Y-%m-%d"],
|
||||
months=["%Y-%m-%d"], years=["%Y-%m-%d"])
|
||||
# p1.xaxis.major_label_orientation = radians(30) #可以旋转一个角度。
|
||||
|
||||
p_list.append([p1])
|
||||
|
||||
gp = gridplot(p_list)
|
||||
script, div = components(gp)
|
||||
return {
|
||||
"script": script,
|
||||
"div": div,
|
||||
"title": conf["title"],
|
||||
"desc": conf["desc"]
|
||||
}
|
||||
Executable
+224
@@ -0,0 +1,224 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
from tornado import gen
|
||||
import libs.common as common
|
||||
import libs.stock_web_dic as stock_web_dic
|
||||
import web.base as webBase
|
||||
import logging
|
||||
import datetime
|
||||
|
||||
# info 蓝色 云财经
|
||||
# success 绿色
|
||||
# danger 红色 东方财富
|
||||
# warning 黄色
|
||||
WEB_EASTMONEY_URL = u"""
|
||||
<a class='btn btn-danger btn-xs tooltip-danger' data-rel="tooltip" data-placement="right" data-original-title="东方财富,股票详细地址,新窗口跳转。"
|
||||
href='http://quote.eastmoney.com/%s.html' target='_blank'>东财</a>
|
||||
|
||||
<a class='btn btn-success btn-xs tooltip-success' data-rel="tooltip" data-placement="right" data-original-title="本地MACD,KDJ等指标,本地弹窗窗口,数据加载中,请稍候。"
|
||||
onclick="showIndicatorsWindow('%s');">指标</a>
|
||||
|
||||
<a class='btn btn-warning btn-xs tooltip-warning' data-rel="tooltip" data-placement="right" data-original-title="东方财富,研报地址,本地弹窗窗口。"
|
||||
onclick="showDFCFWindow('%s');">东研</a>
|
||||
|
||||
|
||||
"""
|
||||
# 和在dic中的字符串一致。字符串前面都不特别声明是u""
|
||||
eastmoney_name = "查看股票"
|
||||
|
||||
|
||||
# 获得页面数据,进入页面中。
|
||||
class GetStockHtmlHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
name = self.get_argument("table_name", default=None, strip=False)
|
||||
tableInfo = stock_web_dic.STOCK_WEB_DATA_MAP[name]
|
||||
# self.uri_ = ("self.request.url:", self.request.uri)
|
||||
# print self.uri_
|
||||
date_now = datetime.datetime.now()
|
||||
date_now_str = date_now.strftime("%Y%m%d")
|
||||
# 每天的 16 点前显示昨天数据。
|
||||
if date_now.hour < 16:
|
||||
date_now_str = (date_now + datetime.timedelta(days=-1)).strftime("%Y%m%d")
|
||||
|
||||
# try:
|
||||
# # 增加columns 字段中的【查看股票 东方财富】
|
||||
# logging.info(eastmoney_name in tableInfo.column_names)
|
||||
# if eastmoney_name in tableInfo.column_names:
|
||||
# tmp_idx = tableInfo.column_names.index(eastmoney_name)
|
||||
# logging.info(tmp_idx)
|
||||
# try:
|
||||
# # 防止重复插入数据。可能会报错。
|
||||
# tableInfo.columns.remove("eastmoney_url")
|
||||
# except Exception as e:
|
||||
# print("error :", e)
|
||||
# tableInfo.columns.insert(tmp_idx, "eastmoney_url")
|
||||
# except Exception as e:
|
||||
# print("error :", e)
|
||||
logging.info("####################GetStockHtmlHandlerEnd")
|
||||
self.render("tableInfo.html", tableInfo=tableInfo, date_now=date_now_str,
|
||||
pythonStockVersion=common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
|
||||
|
||||
# 获得股票数据内容。
|
||||
class GetStockDataHandler(webBase.BaseHandler):
|
||||
def get(self):
|
||||
|
||||
self.set_header('Content-Type', 'application/json;charset=UTF-8')
|
||||
|
||||
logging.info("######################## GetStockDataHandler ########################")
|
||||
# 获得分页参数。
|
||||
page_param = self.get_argument("page", default=0, strip=False)
|
||||
limit_param = self.get_argument("limit", default=10, strip=False)
|
||||
|
||||
name_param = self.get_argument("name", default="stock_zh_ah_name", strip=False)
|
||||
type_param = self.get_argument("type", default=None, strip=False)
|
||||
date_param = self.get_argument("date", default=None, strip=False)
|
||||
code_param = self.get_argument("code", default=None, strip=False)
|
||||
|
||||
logging.info(f"page param: {page_param}, {limit_param}, {type_param}, {date_param}, {code_param}")
|
||||
|
||||
|
||||
if name_param == ":tableName":
|
||||
obj = {
|
||||
"code": 20000,
|
||||
"message": "success",
|
||||
"draw": 0,
|
||||
"data": []
|
||||
}
|
||||
# logging.info("####################")
|
||||
# logging.info(obj)
|
||||
self.write(json.dumps(obj))
|
||||
return
|
||||
|
||||
|
||||
tableInfo = stock_web_dic.STOCK_WEB_DATA_MAP[name_param]
|
||||
|
||||
|
||||
order_by_column = []
|
||||
order_by_dir = []
|
||||
# 支持多排序。使用shift+鼠标左键。
|
||||
for item, val in self.request.arguments.items():
|
||||
# logging.info("item: %s, val: %s" % (item, val) )
|
||||
if str(item).startswith("order["):
|
||||
print("order:", item, ",val:", val[0])
|
||||
if str(item).startswith("order[") and str(item).endswith("[column]"):
|
||||
order_by_column.append(int(val[0]))
|
||||
if str(item).startswith("order[") and str(item).endswith("[dir]"):
|
||||
order_by_dir.append(val[0].decode("utf-8")) # bytes转换字符串
|
||||
|
||||
search_by_column = []
|
||||
search_by_data = []
|
||||
|
||||
# 返回search字段。
|
||||
for item, val in self.request.arguments.items():
|
||||
# logging.info("item: %s, val: %s" % (item, val))
|
||||
if str(item).startswith("columns[") and str(item).endswith("[search][value]"):
|
||||
logging.info("item: %s, val: %s" % (item, val))
|
||||
str_idx = item.replace("columns[", "").replace("][search][value]", "")
|
||||
int_idx = int(str_idx)
|
||||
# 找到字符串
|
||||
str_val = val[0].decode("utf-8")
|
||||
if str_val != "": # 字符串。
|
||||
search_by_column.append(tableInfo.columns[int_idx])
|
||||
search_by_data.append(val[0].decode("utf-8")) # bytes转换字符串
|
||||
|
||||
# 打印日志。
|
||||
search_sql = ""
|
||||
search_idx = 0
|
||||
|
||||
logging.info("################# search_by_column #################")
|
||||
|
||||
logging.info(search_by_column)
|
||||
logging.info(search_by_data)
|
||||
for item in search_by_column:
|
||||
val = search_by_data[search_idx]
|
||||
logging.info("idx: %s, column: %s, value: %s " % (search_idx, item, val))
|
||||
# 查询sql
|
||||
if search_idx == 0:
|
||||
search_sql = " WHERE `%s` = '%s' " % (item, val)
|
||||
else:
|
||||
search_sql = search_sql + " AND `%s` = '%s' " % (item, val)
|
||||
search_idx = search_idx + 1
|
||||
|
||||
if date_param:
|
||||
if "WHERE" not in search_sql:
|
||||
search_sql += f" WHERE `date` = '{date_param}' "
|
||||
else:
|
||||
search_sql += f" AND `date` = '{date_param}' "
|
||||
|
||||
if code_param:
|
||||
if "WHERE" not in search_sql:
|
||||
search_sql += f" WHERE `code` = '{code_param}' "
|
||||
else:
|
||||
search_sql += f" AND `code` = '{code_param}' "
|
||||
|
||||
# print("tableInfo :", stock_web)
|
||||
order_by_sql = ""
|
||||
# 增加排序。
|
||||
if len(order_by_column) != 0 and len(order_by_dir) != 0:
|
||||
order_by_sql = " ORDER BY "
|
||||
idx = 0
|
||||
for key in order_by_column:
|
||||
# 找到排序字段和dir。
|
||||
col_tmp = tableInfo.columns[key]
|
||||
dir_tmp = order_by_dir[idx]
|
||||
if idx != 0:
|
||||
order_by_sql += " , %s %s" % (col_tmp, dir_tmp)
|
||||
else:
|
||||
order_by_sql += " %s %s" % (col_tmp, dir_tmp)
|
||||
idx += 1
|
||||
# 查询数据库。
|
||||
limit_sql = ""
|
||||
if int(limit_param) > 0:
|
||||
start = ( int(page_param) - 1 ) * int(limit_param)
|
||||
limit_sql = f" LIMIT {start} , {limit_param} "
|
||||
sql = " SELECT * FROM `%s` %s %s %s " % (
|
||||
tableInfo.table_name, search_sql, order_by_sql, limit_sql)
|
||||
count_sql = " SELECT count(1) as num FROM `%s` %s " % (tableInfo.table_name, search_sql)
|
||||
|
||||
logging.info("select sql : " + sql)
|
||||
logging.info("count sql : " + count_sql)
|
||||
stock_web_list = self.db.query(sql)
|
||||
|
||||
stock_web_size = self.db.query(count_sql)
|
||||
logging.info("tableInfoList size : %s " % stock_web_size)
|
||||
|
||||
# 动态表格展示:
|
||||
table_columns = []
|
||||
try:
|
||||
tmp_len = len(tableInfo.columns)
|
||||
logging.info("ableInfo.columns tmp_len : %s " % tmp_len)
|
||||
# 循环数据,转换成对象,放入到数组中,方便前端 vue table 循环使用。
|
||||
for tmp_idx in range(0, tmp_len):
|
||||
logging.info(tmp_idx)
|
||||
|
||||
column = tableInfo.columns[tmp_idx]
|
||||
column_name = tableInfo.column_names[tmp_idx]
|
||||
|
||||
tpm_column_obj = {
|
||||
"column": column,
|
||||
"columnName" : column_name
|
||||
}
|
||||
table_columns.append(tpm_column_obj)
|
||||
|
||||
except Exception as e:
|
||||
print("error :", e)
|
||||
|
||||
obj = {
|
||||
"code": 20000,
|
||||
"message": "success",
|
||||
"draw": 0,
|
||||
"tableName" : tableInfo.name,
|
||||
"tableColumns": table_columns,
|
||||
"total": stock_web_size[0]["num"],
|
||||
"recordsTotal": stock_web_size[0]["num"],
|
||||
"recordsFiltered": stock_web_size[0]["num"],
|
||||
"data": stock_web_list
|
||||
}
|
||||
# logging.info("####################")
|
||||
# logging.info(obj)
|
||||
self.write(json.dumps(obj))
|
||||
@@ -0,0 +1,244 @@
|
||||
"""
|
||||
This example demonstrates how to embed matplotlib WebAgg interactive
|
||||
plotting in your own web application and framework. It is not
|
||||
necessary to do all this if you merely want to display a plot in a
|
||||
browser or use matplotlib's built-in Tornado-based server "on the
|
||||
side".
|
||||
|
||||
The framework being used must support web sockets.
|
||||
"""
|
||||
|
||||
import io
|
||||
|
||||
try:
|
||||
import tornado
|
||||
except ImportError:
|
||||
raise RuntimeError("This example requires tornado.")
|
||||
import tornado.web
|
||||
import tornado.httpserver
|
||||
import tornado.ioloop
|
||||
import tornado.websocket
|
||||
|
||||
from matplotlib.backends.backend_webagg_core import (
|
||||
FigureManagerWebAgg, new_figure_manager_given_figure)
|
||||
from matplotlib.figure import Figure
|
||||
|
||||
import numpy as np
|
||||
|
||||
import json
|
||||
|
||||
|
||||
def create_figure():
|
||||
"""
|
||||
Creates a simple example figure.
|
||||
"""
|
||||
fig = Figure()
|
||||
a = fig.add_subplot(111)
|
||||
t = np.arange(0.0, 3.0, 0.01)
|
||||
s = np.sin(2 * np.pi * t)
|
||||
a.plot(t, s)
|
||||
return fig
|
||||
|
||||
|
||||
# The following is the content of the web page. You would normally
|
||||
# generate this using some sort of template facility in your web
|
||||
# framework, but here we just use Python string formatting.
|
||||
html_content = """
|
||||
<html>
|
||||
<head>
|
||||
<!-- TODO: There should be a way to include all of the required javascript
|
||||
and CSS so matplotlib can add to the set in the future if it
|
||||
needs to. -->
|
||||
<link rel="stylesheet" href="_static/css/page.css" type="text/css">
|
||||
<link rel="stylesheet" href="_static/css/boilerplate.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/css/fbm.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/jquery/css/themes/base/jquery-ui.min.css" >
|
||||
<script src="_static/jquery/js/jquery-1.11.3.min.js"></script>
|
||||
<script src="_static/jquery/js/jquery-ui.min.js"></script>
|
||||
<script src="mpl.js"></script>
|
||||
|
||||
<script>
|
||||
/* This is a callback that is called when the user saves
|
||||
(downloads) a file. Its purpose is really to map from a
|
||||
figure and file format to a url in the application. */
|
||||
function ondownload(figure, format) {
|
||||
window.open('download.' + format, '_blank');
|
||||
};
|
||||
|
||||
$(document).ready(
|
||||
function() {
|
||||
/* It is up to the application to provide a websocket that the figure
|
||||
will use to communicate to the server. This websocket object can
|
||||
also be a "fake" websocket that underneath multiplexes messages
|
||||
from multiple figures, if necessary. */
|
||||
var websocket_type = mpl.get_websocket_type();
|
||||
var websocket = new websocket_type("%(ws_uri)sws");
|
||||
|
||||
// mpl.figure creates a new figure on the webpage.
|
||||
var fig = new mpl.figure(
|
||||
// A unique numeric identifier for the figure
|
||||
%(fig_id)s,
|
||||
// A websocket object (or something that behaves like one)
|
||||
websocket,
|
||||
// A function called when a file type is selected for download
|
||||
ondownload,
|
||||
// The HTML element in which to place the figure
|
||||
$('div#figure'));
|
||||
}
|
||||
);
|
||||
</script>
|
||||
|
||||
<title>matplotlib</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="figure">
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
"""
|
||||
|
||||
|
||||
class MyApplication(tornado.web.Application):
|
||||
class MainPage(tornado.web.RequestHandler):
|
||||
"""
|
||||
Serves the main HTML page.
|
||||
"""
|
||||
|
||||
def get(self):
|
||||
manager = self.application.manager
|
||||
ws_uri = "ws://{req.host}/".format(req=self.request)
|
||||
content = html_content % {
|
||||
"ws_uri": ws_uri, "fig_id": manager.num}
|
||||
self.write(content)
|
||||
|
||||
class MplJs(tornado.web.RequestHandler):
|
||||
"""
|
||||
Serves the generated matplotlib javascript file. The content
|
||||
is dynamically generated based on which toolbar functions the
|
||||
user has defined. Call `FigureManagerWebAgg` to get its
|
||||
content.
|
||||
"""
|
||||
|
||||
def get(self):
|
||||
self.set_header('Content-Type', 'application/javascript')
|
||||
js_content = FigureManagerWebAgg.get_javascript()
|
||||
|
||||
self.write(js_content)
|
||||
|
||||
class Download(tornado.web.RequestHandler):
|
||||
"""
|
||||
Handles downloading of the figure in various file formats.
|
||||
"""
|
||||
|
||||
def get(self, fmt):
|
||||
manager = self.application.manager
|
||||
|
||||
mimetypes = {
|
||||
'ps': 'application/postscript',
|
||||
'eps': 'application/postscript',
|
||||
'pdf': 'application/pdf',
|
||||
'svg': 'image/svg+xml',
|
||||
'png': 'image/png',
|
||||
'jpeg': 'image/jpeg',
|
||||
'tif': 'image/tiff',
|
||||
'emf': 'application/emf'
|
||||
}
|
||||
|
||||
self.set_header('Content-Type', mimetypes.get(fmt, 'binary'))
|
||||
|
||||
buff = io.BytesIO()
|
||||
manager.canvas.print_figure(buff, format=fmt)
|
||||
self.write(buff.getvalue())
|
||||
|
||||
class WebSocket(tornado.websocket.WebSocketHandler):
|
||||
"""
|
||||
A websocket for interactive communication between the plot in
|
||||
the browser and the server.
|
||||
|
||||
In addition to the methods required by tornado, it is required to
|
||||
have two callback methods:
|
||||
|
||||
- ``send_json(json_content)`` is called by matplotlib when
|
||||
it needs to send json to the browser. `json_content` is
|
||||
a JSON tree (Python dictionary), and it is the responsibility
|
||||
of this implementation to encode it as a string to send over
|
||||
the socket.
|
||||
|
||||
- ``send_binary(blob)`` is called to send binary image data
|
||||
to the browser.
|
||||
"""
|
||||
supports_binary = True
|
||||
|
||||
def open(self):
|
||||
# Register the websocket with the FigureManager.
|
||||
manager = self.application.manager
|
||||
manager.add_web_socket(self)
|
||||
if hasattr(self, 'set_nodelay'):
|
||||
self.set_nodelay(True)
|
||||
|
||||
def on_close(self):
|
||||
# When the socket is closed, deregister the websocket with
|
||||
# the FigureManager.
|
||||
manager = self.application.manager
|
||||
manager.remove_web_socket(self)
|
||||
|
||||
def on_message(self, message):
|
||||
# The 'supports_binary' message is relevant to the
|
||||
# websocket itself. The other messages get passed along
|
||||
# to matplotlib as-is.
|
||||
|
||||
# Every message has a "type" and a "figure_id".
|
||||
message = json.loads(message)
|
||||
if message['type'] == 'supports_binary':
|
||||
self.supports_binary = message['value']
|
||||
else:
|
||||
manager = self.application.manager
|
||||
manager.handle_json(message)
|
||||
|
||||
def send_json(self, content):
|
||||
self.write_message(json.dumps(content))
|
||||
|
||||
def send_binary(self, blob):
|
||||
if self.supports_binary:
|
||||
self.write_message(blob, binary=True)
|
||||
else:
|
||||
data_uri = "data:image/png;base64,{0}".format(
|
||||
blob.encode('base64').replace('\n', ''))
|
||||
self.write_message(data_uri)
|
||||
|
||||
def __init__(self, figure):
|
||||
self.figure = figure
|
||||
self.manager = new_figure_manager_given_figure(
|
||||
id(figure), figure)
|
||||
|
||||
super(MyApplication, self).__init__([
|
||||
# Static files for the CSS and JS
|
||||
(r'/_static/(.*)',
|
||||
tornado.web.StaticFileHandler,
|
||||
{'path': FigureManagerWebAgg.get_static_file_path()}),
|
||||
|
||||
# The page that contains all of the pieces
|
||||
('/', self.MainPage),
|
||||
|
||||
('/mpl.js', self.MplJs),
|
||||
|
||||
# Sends images and events to the browser, and receives
|
||||
# events from the browser
|
||||
('/ws', self.WebSocket),
|
||||
|
||||
# Handles the downloading (i.e., saving) of static images
|
||||
(r'/download.([a-z0-9.]+)', self.Download),
|
||||
], debug=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
figure = create_figure()
|
||||
application = MyApplication(figure)
|
||||
http_server = tornado.httpserver.HTTPServer(application)
|
||||
http_server.listen(9999)
|
||||
|
||||
print("http://127.0.0.1:9090/")
|
||||
print("Press Ctrl+C to quit")
|
||||
|
||||
tornado.ioloop.IOLoop.instance().start()
|
||||
Executable
+175
@@ -0,0 +1,175 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os.path
|
||||
import torndb
|
||||
import tornado.escape
|
||||
from tornado import gen
|
||||
import tornado.httpserver
|
||||
import tornado.ioloop
|
||||
import tornado.options
|
||||
import libs.common as common
|
||||
import libs.stock_web_dic as stock_web_dic
|
||||
import web.dataTableHandler as dataTableHandler
|
||||
import web.dataEditorHandler as dataEditorHandler
|
||||
import web.dataIndicatorsHandler as dataIndicatorsHandler
|
||||
import web.base as webBase
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import akshare as ak
|
||||
import bokeh as bh
|
||||
import sqlalchemy
|
||||
import json
|
||||
|
||||
class Application(tornado.web.Application):
|
||||
def __init__(self):
|
||||
handlers = [
|
||||
# 设置路由
|
||||
(r"/", HomeHandler),
|
||||
(r"/stock/", HomeHandler),
|
||||
(r"/api/v1/package_verison", PackageVersionHandler),# 包版本
|
||||
(r"/api/v1/menu_list", MenuListHandler), # 菜单接口
|
||||
(r"/test_akshare", TestHandler),# 测试页面,做写js 测试。
|
||||
(r"/test2", Test2Handler),# 测试页面,做写js 测试。
|
||||
# 使用datatable 展示报表数据模块。
|
||||
(r"/api/v1/api_data", dataTableHandler.GetStockDataHandler),
|
||||
(r"/stock/data", dataTableHandler.GetStockHtmlHandler),
|
||||
# 数据修改dataEditor。
|
||||
(r"/data/editor", dataEditorHandler.GetEditorHtmlHandler),
|
||||
(r"/data/editor/save", dataEditorHandler.SaveEditorHandler),
|
||||
# 获得股票指标数据。
|
||||
(r"/api/v1/data/indicators", dataIndicatorsHandler.GetDataIndicatorsHandler),
|
||||
]
|
||||
settings = dict( # 配置
|
||||
template_path=os.path.join(os.path.dirname(__file__), "templates"),
|
||||
static_path=os.path.join(os.path.dirname(__file__), "static"),
|
||||
xsrf_cookies=False, # True,
|
||||
# cookie加密
|
||||
cookie_secret="027bb1b670eddf0392cdda8709268a17b58b7",
|
||||
debug=True,
|
||||
default_encoding="utf-8",
|
||||
)
|
||||
super(Application, self).__init__(handlers, **settings)
|
||||
# Have one global connection to the blog DB across all handlers
|
||||
self.db = torndb.Connection(
|
||||
charset="utf8", max_idle_time=3600, connect_timeout=1000,
|
||||
host=common.MYSQL_HOST, database=common.MYSQL_DB,
|
||||
user=common.MYSQL_USER, password=common.MYSQL_PWD)
|
||||
|
||||
|
||||
# 获得包版本 handler。
|
||||
class PackageVersionHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
pandasVersion = pd.__version__
|
||||
numpyVersion = np.__version__
|
||||
sqlalchemyVersion = sqlalchemy.__version__
|
||||
akshareVersion = ak.__version__
|
||||
bokehVersion = bh.__version__
|
||||
# 返回包的版本信息。
|
||||
obj = {
|
||||
"code": 20000,
|
||||
"message": "success",
|
||||
"pandasVersion" : pandasVersion,
|
||||
"numpyVersion" : numpyVersion,
|
||||
"sqlalchemyVersion" : sqlalchemyVersion,
|
||||
"akshareVersion" : akshareVersion,
|
||||
"bokehVersion" : bokehVersion,
|
||||
"stockstatsVersion": "0.3.2"
|
||||
}
|
||||
# logging.info("####################")
|
||||
# logging.info(obj)
|
||||
self.write(json.dumps(obj))
|
||||
|
||||
|
||||
# 获得菜单列表数据 handler。
|
||||
class MenuListHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
|
||||
leftMenuList = stock_web_dic.STOCK_WEB_DATA_LIST
|
||||
out_data = []
|
||||
menu_name = ''
|
||||
menu_children = []
|
||||
index = 0
|
||||
for table_info in leftMenuList:
|
||||
print(table_info.name)
|
||||
index = index + 1
|
||||
# 使用 children 作为二级菜单。
|
||||
tmp_menu = {
|
||||
"name": table_info.name,
|
||||
"path": "/stock/table/" + table_info.table_name
|
||||
}
|
||||
menu_children.append(tmp_menu)
|
||||
|
||||
# 使用 type作为 一级目录
|
||||
if menu_name != table_info.type or index == len(leftMenuList):
|
||||
# 进行数据循环
|
||||
if menu_name != '' :
|
||||
if index != len(leftMenuList):
|
||||
menu_children.pop() # 删除当前的节点信息。
|
||||
tmp_children = list(menu_children)
|
||||
tmp_menu2 = {
|
||||
"name": menu_name,
|
||||
"path": "#",
|
||||
"children": tmp_children
|
||||
}
|
||||
# 下一个数据清空和放置。
|
||||
menu_children = []
|
||||
menu_children.append(tmp_menu)
|
||||
|
||||
out_data.append(tmp_menu2)
|
||||
menu_name = table_info.type
|
||||
|
||||
obj = {
|
||||
"code": 20000,
|
||||
"message": "success",
|
||||
"data": out_data
|
||||
}
|
||||
print(out_data)
|
||||
# self.write(json.dumps(o
|
||||
self.write(json.dumps(obj))
|
||||
|
||||
|
||||
# 首页handler。
|
||||
class HomeHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
print("################## index.html ##################")
|
||||
pandasVersion = pd.__version__
|
||||
numpyVersion = np.__version__
|
||||
akshareVersion = ak.__version__
|
||||
bokehVersion = bh.__version__
|
||||
#stockstatsVersion = ss.__version__ # 没有这个函数,但是好久不更新了
|
||||
# https://github.com/jealous/stockstats
|
||||
self.render("index.html", pandasVersion=pandasVersion, numpyVersion=numpyVersion,
|
||||
akshareVersion=akshareVersion, bokehVersion=bokehVersion,
|
||||
stockstatsVersion="0.3.2",
|
||||
pythonStockVersion = common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
class TestHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
self.render("test_akshare.html", entries="hello",
|
||||
pythonStockVersion=common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
class Test2Handler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
self.render("test2.html", entries="hello",
|
||||
pythonStockVersion=common.__version__,
|
||||
leftMenu=webBase.GetLeftMenu(self.request.uri))
|
||||
|
||||
def main():
|
||||
tornado.options.parse_command_line()
|
||||
http_server = tornado.httpserver.HTTPServer(Application())
|
||||
port = 9090
|
||||
http_server.listen(port)
|
||||
# tornado.options.options.logging = "debug"
|
||||
tornado.options.parse_command_line()
|
||||
|
||||
tornado.ioloop.IOLoop.current().start()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Executable
+80
@@ -0,0 +1,80 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import os.path
|
||||
import json
|
||||
import subprocess
|
||||
import torndb
|
||||
import tornado.escape
|
||||
from tornado import gen
|
||||
import tornado.httpserver
|
||||
import tornado.ioloop
|
||||
import tornado.options
|
||||
import tornado.web
|
||||
import web.base as webBase
|
||||
import logging
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
from PIL import ImageOps
|
||||
import base64
|
||||
import io #python2 import StringIO
|
||||
|
||||
work_dir = "/data/stock/tf/minst_serving/input_data"
|
||||
out_dir = "/static/img/minst_serving/%s.bmp"
|
||||
|
||||
|
||||
# 获得页面数据。
|
||||
class GetMinstServingHtmlHandler(webBase.BaseHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
# print self.uri_
|
||||
arr = np.arange(30)
|
||||
image_array = []
|
||||
for idx in arr:
|
||||
out_file = out_dir % ("%05d" % idx)
|
||||
print(out_file)
|
||||
image_array.append(out_file)
|
||||
self.render("minst_serving.html", image_array=image_array)
|
||||
|
||||
|
||||
# 获得股票数据内容。
|
||||
class GetPredictionDataHandler(webBase.BaseHandler):
|
||||
def get(self):
|
||||
# 获得分页参数。
|
||||
img_url = self.get_argument("img_url", default=0, strip=False)
|
||||
print(img_url)
|
||||
img_obj = Image.open("/data/stock/web" + img_url)
|
||||
print("img_obj", img_obj)
|
||||
server = "0.0.0.0:8500"
|
||||
prediction = do_inference(server, img_obj)
|
||||
print('######### prediction : ', prediction)
|
||||
self.write(json.dumps(prediction))
|
||||
|
||||
|
||||
# 获得股票数据内容。
|
||||
class GetPrediction2DataHandler(webBase.BaseHandler):
|
||||
def post(self):
|
||||
# 获得分页参数。
|
||||
imgStr = self.get_argument("txt", default="", strip=False)
|
||||
# imgStr.replace(" ", "+")
|
||||
imgStr = base64.b64decode(imgStr)
|
||||
print("imgStr:", type(imgStr))
|
||||
image = Image.open(io.StringIO(imgStr))
|
||||
image.thumbnail((28, 28), Image.ANTIALIAS)
|
||||
image = image.convert('L')
|
||||
image = ImageOps.invert(image)
|
||||
image.save(work_dir + "/web-tmp.bmp", format="BMP") #保存看看,是否
|
||||
#print(image)
|
||||
# img_url = self.get_argument("img_url", default=0, strip=False)
|
||||
# print(img_url)
|
||||
server = "0.0.0.0:8500"
|
||||
prediction = do_inference(server, image)
|
||||
print('######### prediction : ', prediction)
|
||||
self.write(json.dumps(prediction))
|
||||
|
||||
|
||||
|
||||
# 调用 grpc 代码,将图片转换成数组,让后放到 grpc 调用。
|
||||
def do_inference(hostport, img_obj):
|
||||
|
||||
print("############", hostport)
|
||||
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
+9
@@ -0,0 +1,9 @@
|
||||
/*!
|
||||
* Bootstrap Colorpicker
|
||||
* http://mjolnic.github.io/bootstrap-colorpicker/
|
||||
*
|
||||
* Originally written by (c) 2012 Stefan Petre
|
||||
* Licensed under the Apache License v2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.txt
|
||||
*
|
||||
*/.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url(../images/bootstrap-colorpicker/saturation.png)}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-alpha i,.colorpicker-hue i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url(../images/bootstrap-colorpicker/hue.png)}.colorpicker-alpha,.colorpicker-color{background-image:url(../images/bootstrap-colorpicker/alpha.png)}.colorpicker-alpha{display:none}.colorpicker:after,.colorpicker:before{position:absolute;display:inline-block;content:''}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:after,.colorpicker:before{line-height:0}.colorpicker:before{top:-7px;left:6px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2)}.colorpicker:after{clear:both;top:-6px;left:7px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:none}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../images/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../images/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto}
|
||||
+7
File diff suppressed because one or more lines are too long
+5
File diff suppressed because one or more lines are too long
+10
@@ -0,0 +1,10 @@
|
||||
/*!
|
||||
* Timepicker Component for Twitter Bootstrap
|
||||
*
|
||||
* Copyright 2013 Joris de Wit
|
||||
*
|
||||
* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .input-group-addon{cursor:pointer}.bootstrap-timepicker .input-group-addon i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:4px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.timepicker-orient-left:before{left:6px}.bootstrap-timepicker-widget.timepicker-orient-left:after{left:7px}.bootstrap-timepicker-widget.timepicker-orient-right:before{right:6px}.bootstrap-timepicker-widget.timepicker-orient-right:after{right:7px}.bootstrap-timepicker-widget.timepicker-orient-top:before{top:-7px}.bootstrap-timepicker-widget.timepicker-orient-top:after{top:-6px}.bootstrap-timepicker-widget.timepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.bootstrap-timepicker-widget.timepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px solid transparent;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px;font-size:18px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media (min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media (max-width:767px){.bootstrap-timepicker,.bootstrap-timepicker .dropdown-menu{width:100%}}
|
||||
+5
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+11
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+5
File diff suppressed because one or more lines are too long
+4
File diff suppressed because one or more lines are too long
+12
@@ -0,0 +1,12 @@
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: local('Open Sans Light'), local('OpenSans-Light'), url(/static/font-awesome/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: local('Open Sans'), local('OpenSans'), url(/static/font-awesome/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
|
||||
}
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
/*! jQuery UI - v1.11.4 - 2015-09-20
|
||||
* http://jqueryui.com
|
||||
* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, slider.css
|
||||
* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}
|
||||
+4
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}}
|
||||
+4
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 124 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 344 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 111 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 204 KiB |
+5
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+5
File diff suppressed because one or more lines are too long
+6
@@ -0,0 +1,6 @@
|
||||
/*!
|
||||
Autosize 3.0.15
|
||||
license: MIT
|
||||
http://www.jacklmoore.com/autosize
|
||||
*/
|
||||
!function(a,b){if("function"==typeof define&&define.amd)define(["exports","module"],b);else if("undefined"!=typeof exports&&"undefined"!=typeof module)b(exports,module);else{var c={exports:{}};b(c.exports,c),a.autosize=c.exports}}(this,function(a,b){"use strict";function c(a){function b(){var b=window.getComputedStyle(a,null);n=b.overflowY,"vertical"===b.resize?a.style.resize="none":"both"===b.resize&&(a.style.resize="horizontal"),m="content-box"===b.boxSizing?-(parseFloat(b.paddingTop)+parseFloat(b.paddingBottom)):parseFloat(b.borderTopWidth)+parseFloat(b.borderBottomWidth),isNaN(m)&&(m=0),e()}function c(b){var c=a.style.width;a.style.width="0px",a.offsetWidth,a.style.width=c,n=b,l&&(a.style.overflowY=b),d()}function d(){var b=window.pageYOffset,c=document.body.scrollTop,d=a.style.height;a.style.height="auto";var e=a.scrollHeight+m;return 0===a.scrollHeight?void(a.style.height=d):(a.style.height=e+"px",o=a.clientWidth,document.documentElement.scrollTop=b,void(document.body.scrollTop=c))}function e(){var b=a.style.height;d();var e=window.getComputedStyle(a,null);if(e.height!==a.style.height?"visible"!==n&&c("visible"):"hidden"!==n&&c("hidden"),b!==a.style.height){var f=g("autosize:resized");a.dispatchEvent(f)}}var h=void 0===arguments[1]?{}:arguments[1],i=h.setOverflowX,j=void 0===i?!0:i,k=h.setOverflowY,l=void 0===k?!0:k;if(a&&a.nodeName&&"TEXTAREA"===a.nodeName&&!f.has(a)){var m=null,n=null,o=a.clientWidth,p=function(){a.clientWidth!==o&&e()},q=function(b){window.removeEventListener("resize",p,!1),a.removeEventListener("input",e,!1),a.removeEventListener("keyup",e,!1),a.removeEventListener("autosize:destroy",q,!1),a.removeEventListener("autosize:update",e,!1),f["delete"](a),Object.keys(b).forEach(function(c){a.style[c]=b[c]})}.bind(a,{height:a.style.height,resize:a.style.resize,overflowY:a.style.overflowY,overflowX:a.style.overflowX,wordWrap:a.style.wordWrap});a.addEventListener("autosize:destroy",q,!1),"onpropertychange"in a&&"oninput"in a&&a.addEventListener("keyup",e,!1),window.addEventListener("resize",p,!1),a.addEventListener("input",e,!1),a.addEventListener("autosize:update",e,!1),f.add(a),j&&(a.style.overflowX="hidden",a.style.wordWrap="break-word"),b()}}function d(a){if(a&&a.nodeName&&"TEXTAREA"===a.nodeName){var b=g("autosize:destroy");a.dispatchEvent(b)}}function e(a){if(a&&a.nodeName&&"TEXTAREA"===a.nodeName){var b=g("autosize:update");a.dispatchEvent(b)}}var f="function"==typeof Set?new Set:function(){var a=[];return{has:function(b){return Boolean(a.indexOf(b)>-1)},add:function(b){a.push(b)},"delete":function(b){a.splice(a.indexOf(b),1)}}}(),g=function(a){return new Event(a)};try{new Event("test")}catch(h){g=function(a){var b=document.createEvent("Event");return b.initEvent(a,!0,!1),b}}var i=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?(i=function(a){return a},i.destroy=function(a){return a},i.update=function(a){return a}):(i=function(a,b){return a&&Array.prototype.forEach.call(a.length?a:[a],function(a){return c(a,b)}),a},i.destroy=function(a){return a&&Array.prototype.forEach.call(a.length?a:[a],d),a},i.update=function(a){return a&&Array.prototype.forEach.call(a.length?a:[a],e),a}),b.exports=i});
|
||||
+53
File diff suppressed because one or more lines are too long
+74
File diff suppressed because one or more lines are too long
+132
File diff suppressed because one or more lines are too long
+118
File diff suppressed because one or more lines are too long
Vendored
+596
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
+9
File diff suppressed because one or more lines are too long
+18
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Simplified Chinese translation for bootstrap-datepicker
|
||||
* Yuan Cheung <advanimal@gmail.com>
|
||||
*/
|
||||
;(function($){
|
||||
$.fn.datepicker.dates['zh-CN'] = {
|
||||
days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"],
|
||||
daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
|
||||
daysMin: ["日", "一", "二", "三", "四", "五", "六"],
|
||||
months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
|
||||
monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
|
||||
today: "今日",
|
||||
clear: "清除",
|
||||
format: "yyyy年mm月dd日",
|
||||
titleFormat: "yyyy年mm月",
|
||||
weekStart: 1
|
||||
};
|
||||
}(jQuery));
|
||||
+9
File diff suppressed because one or more lines are too long
+11
File diff suppressed because one or more lines are too long
+7
File diff suppressed because one or more lines are too long
+5
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Column visibility buttons for Buttons and DataTables.
|
||||
* 2015 SpryMedia Ltd - datatables.net/license
|
||||
*/
|
||||
!function(a){"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=function(b,c){return b||(b=window),c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$),c.fn.dataTable.Buttons||require("datatables.net-buttons")(b,c),a(c,b,b.document)}:a(jQuery,window,document)}(function(a,b,c,d){"use strict";var e=a.fn.dataTable;return a.extend(e.ext.buttons,{colvis:function(a,b){return{extend:"collection",text:function(a){return a.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:b.columns}]}},columnsToggle:function(a,b){var c=a.columns(b.columns).indexes().map(function(a){return{extend:"columnToggle",columns:a}}).toArray();return c},columnToggle:function(a,b){return{extend:"columnVisibility",columns:b.columns}},columnsVisibility:function(a,b){var c=a.columns(b.columns).indexes().map(function(a){return{extend:"columnVisibility",columns:a,visibility:b.visibility}}).toArray();return c},columnVisibility:{columns:d,text:function(a,b,c){return c._columnText(a,c.columns)},className:"buttons-columnVisibility",action:function(a,b,c,e){var f=b.columns(e.columns),g=f.visible();f.visible(e.visibility!==d?e.visibility:!(g.length?g[0]:!1))},init:function(a,b,c){var d=this,e=a.column(c.columns);a.on("column-visibility.dt"+c.namespace,function(a,b,e,f){b.bDestroying||e!==c.columns||d.active(f)}).on("column-reorder.dt"+c.namespace,function(b,e,f){if(1===a.columns(c.columns).count()){"number"==typeof c.columns&&(c.columns=f.mapping[c.columns]);var g=a.column(c.columns);d.text(c._columnText(a,c.columns)),d.active(g.visible())}}),this.active(e.visible())},destroy:function(a,b,c){a.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(a,b){var c=a.column(b).index();return a.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("buttons.colvisRestore","Restore visibility")},init:function(a,b,c){c._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()},action:function(a,b,c,d){b.columns().every(function(a){var c=b.colReorder&&b.colReorder.transpose?b.colReorder.transpose(a,"toOriginal"):a;this.visible(d._visOriginal[c])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(a,b,c,d){b.columns(d.show).visible(!0),b.columns(d.hide).visible(!1)},show:[],hide:[]}}),e.Buttons});
|
||||
+8
File diff suppressed because one or more lines are too long
+5
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Print button for Buttons and DataTables.
|
||||
* 2015 SpryMedia Ltd - datatables.net/license
|
||||
*/
|
||||
!function(a){"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=function(b,c){return b||(b=window),c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$),c.fn.dataTable.Buttons||require("datatables.net-buttons")(b,c),a(c,b,b.document)}:a(jQuery,window,document)}(function(a,b,c,d){"use strict";var e=a.fn.dataTable,f=c.createElement("a"),g=function(b){var c,d=a(b).clone()[0];return"link"===d.nodeName.toLowerCase()&&(f.href=d.href,c=f.host,-1===c.indexOf("/")&&0!==f.pathname.indexOf("/")&&(c+="/"),d.href=f.protocol+"//"+c+f.pathname+f.search),d.outerHTML};return e.ext.buttons.print={className:"buttons-print",text:function(a){return a.i18n("buttons.print","Print")},action:function(c,d,e,f){var h=d.buttons.exportData(f.exportOptions),i=function(a,b){for(var c="<tr>",d=0,e=a.length;e>d;d++)c+="<"+b+">"+a[d]+"</"+b+">";return c+"</tr>"},j='<table class="'+d.table().node().className+'">';f.header&&(j+="<thead>"+i(h.header,"th")+"</thead>"),j+="<tbody>";for(var k=0,l=h.body.length;l>k;k++)j+=i(h.body[k],"td");j+="</tbody>",f.footer&&(j+="<tfoot>"+i(h.footer,"th")+"</tfoot>");var m=b.open("",""),n=f.title;"function"==typeof n&&(n=n()),-1!==n.indexOf("*")&&(n=n.replace("*",a("title").text())),m.document.close();var o="<title>"+n+"</title>";a("style, link").each(function(){o+=g(this)}),a(m.document.head).html(o),a(m.document.body).html("<h1>"+n+"</h1><div>"+f.message+"</div>"+j),f.customize&&f.customize(m),setTimeout(function(){f.autoPrint&&(m.print(),m.close())},250)},title:"*",message:"",exportOptions:{},header:!0,footer:!1,autoPrint:!0,customize:null},e.Buttons});
|
||||
+1
File diff suppressed because one or more lines are too long
+4
File diff suppressed because one or more lines are too long
+1327
File diff suppressed because one or more lines are too long
+4
File diff suppressed because one or more lines are too long
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"sProcessing": "处理中...",
|
||||
"sLengthMenu": "显示 _MENU_ 项结果",
|
||||
"sZeroRecords": "没有匹配结果",
|
||||
"sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
|
||||
"sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
|
||||
"sInfoFiltered": "(由 _MAX_ 项结果过滤)",
|
||||
"sInfoPostFix": "",
|
||||
"sSearch": "搜索:",
|
||||
"sUrl": "",
|
||||
"sEmptyTable": "表中数据为空",
|
||||
"sLoadingRecords": "载入中...",
|
||||
"sInfoThousands": ",",
|
||||
"oPaginate": {
|
||||
"sFirst": "首页",
|
||||
"sPrevious": "上页",
|
||||
"sNext": "下页",
|
||||
"sLast": "末页"
|
||||
},
|
||||
"oAria": {
|
||||
"sSortAscending": ": 以升序排列此列",
|
||||
"sSortDescending": ": 以降序排列此列"
|
||||
}
|
||||
}
|
||||
+9
File diff suppressed because one or more lines are too long
Executable
+96
@@ -0,0 +1,96 @@
|
||||
|
||||
var drawing = false;
|
||||
|
||||
var context;
|
||||
|
||||
var offset_left = 0;
|
||||
var offset_top = 0;
|
||||
|
||||
|
||||
function start_canvas ()
|
||||
{
|
||||
var scribbler = document.getElementById ("the_stage");
|
||||
context = scribbler.getContext ("2d");
|
||||
scribbler.onmousedown = function (event) {mousedown(event)};
|
||||
scribbler.onmousemove = function (event) {mousemove(event)};
|
||||
scribbler.onmouseup = function (event) {mouseup(event)};
|
||||
for (var o = scribbler; o ; o = o.offsetParent) {
|
||||
offset_left += (o.offsetLeft - o.scrollLeft);
|
||||
offset_top += (o.offsetTop - o.scrollTop);
|
||||
}
|
||||
draw();
|
||||
}
|
||||
|
||||
function getPosition(evt)
|
||||
{
|
||||
evt = (evt) ? evt : ((event) ? event : null);
|
||||
var left = 0;
|
||||
var top = 0;
|
||||
var scribbler = document.getElementById("the_stage");
|
||||
|
||||
if (evt.pageX) {
|
||||
left = evt.pageX;
|
||||
top = evt.pageY;
|
||||
} else if (document.documentElement.scrollLeft) {
|
||||
left = evt.clientX + document.documentElement.scrollLeft;
|
||||
top = evt.clientY + document.documentElement.scrollTop;
|
||||
} else {
|
||||
left = evt.clientX + document.body.scrollLeft;
|
||||
top = evt.clientY + document.body.scrollTop;
|
||||
}
|
||||
left -= offset_left;
|
||||
top -= offset_top;
|
||||
|
||||
return {x : left, y : top};
|
||||
}
|
||||
|
||||
function
|
||||
mousedown(event)
|
||||
{
|
||||
drawing = true;
|
||||
var location = getPosition(event);
|
||||
context.lineWidth = 20.0;
|
||||
context.strokeStyle="#000000";
|
||||
context.beginPath();
|
||||
context.moveTo(location.x,location.y);
|
||||
}
|
||||
|
||||
|
||||
function
|
||||
mousemove(event)
|
||||
{
|
||||
if (!drawing)
|
||||
return;
|
||||
var location = getPosition(event);
|
||||
context.lineTo(location.x,location.y);
|
||||
context.stroke();
|
||||
}
|
||||
|
||||
|
||||
|
||||
function
|
||||
mouseup(event)
|
||||
{
|
||||
if (!drawing)
|
||||
return;
|
||||
mousemove(event);
|
||||
drawing = false;
|
||||
}
|
||||
|
||||
function draw()
|
||||
{
|
||||
|
||||
context.fillStyle = '#ffffff';
|
||||
context.fillRect(0, 0, 400, 400);
|
||||
|
||||
}
|
||||
|
||||
function clearCanvas()
|
||||
{
|
||||
context.clearRect (0, 0, 400, 400);
|
||||
draw();
|
||||
document.getElementById("rec_result").innerHTML = "";
|
||||
}
|
||||
|
||||
onload = start_canvas;
|
||||
|
||||
Executable
+1
@@ -0,0 +1 @@
|
||||
!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery","../grid.base"],a):a(jQuery)}(function(a){a.jgrid=a.jgrid||{},a.jgrid.hasOwnProperty("regional")||(a.jgrid.regional=[]),a.jgrid.regional.en={defaults:{recordtext:"View {0} - {1} of {2}",emptyrecords:"No records to view",loadtext:"Loading...",savetext:"Saving...",pgtext:"Page {0} of {1}",pgfirst:"First Page",pglast:"Last Page",pgnext:"Next Page",pgprev:"Previous Page",pgrecs:"Records per Page",showhide:"Toggle Expand Collapse Grid",pagerCaption:"Grid::Page Settings",pageText:"Page:",recordPage:"Records per Page",nomorerecs:"No more records...",scrollPullup:"Pull up to load more...",scrollPulldown:"Pull down to refresh...",scrollRefresh:"Release to refresh..."},search:{caption:"Search...",Find:"Find",Reset:"Reset",odata:[{oper:"eq",text:"equal"},{oper:"ne",text:"not equal"},{oper:"lt",text:"less"},{oper:"le",text:"less or equal"},{oper:"gt",text:"greater"},{oper:"ge",text:"greater or equal"},{oper:"bw",text:"begins with"},{oper:"bn",text:"does not begin with"},{oper:"in",text:"is in"},{oper:"ni",text:"is not in"},{oper:"ew",text:"ends with"},{oper:"en",text:"does not end with"},{oper:"cn",text:"contains"},{oper:"nc",text:"does not contain"},{oper:"nu",text:"is null"},{oper:"nn",text:"is not null"}],groupOps:[{op:"AND",text:"all"},{op:"OR",text:"any"}],operandTitle:"Click to select search operation.",resetTitle:"Reset Search Value"},edit:{addCaption:"Add Record",editCaption:"Edit Record",bSubmit:"Submit",bCancel:"Cancel",bClose:"Close",saveData:"Data has been changed! Save changes?",bYes:"Yes",bNo:"No",bExit:"Cancel",msg:{required:"Field is required",number:"Please, enter valid number",minValue:"value must be greater than or equal to ",maxValue:"value must be less than or equal to",email:"is not a valid e-mail",integer:"Please, enter valid integer value",date:"Please, enter valid date value",url:"is not a valid URL. Prefix required ('http://' or 'https://')",nodefined:" is not defined!",novalue:" return value is required!",customarray:"Custom function should return array!",customfcheck:"Custom function should be present in case of custom checking!"}},view:{caption:"View Record",bClose:"Close"},del:{caption:"Delete",msg:"Delete selected record(s)?",bSubmit:"Delete",bCancel:"Cancel"},nav:{edittext:"",edittitle:"Edit selected row",addtext:"",addtitle:"Add new row",deltext:"",deltitle:"Delete selected row",searchtext:"",searchtitle:"Find records",refreshtext:"",refreshtitle:"Reload Grid",alertcap:"Warning",alerttext:"Please, select row",viewtext:"",viewtitle:"View selected row",savetext:"",savetitle:"Save row",canceltext:"",canceltitle:"Cancel row editing",selectcaption:"Actions..."},col:{caption:"Select columns",bSubmit:"Ok",bCancel:"Cancel"},errors:{errcap:"Error",nourl:"No url is set",norecords:"No records to process",model:"Length of colNames <> colModel!"},formatter:{integer:{thousandsSeparator:",",defaultValue:"0"},number:{decimalSeparator:".",thousandsSeparator:",",decimalPlaces:2,defaultValue:"0.00"},currency:{decimalSeparator:".",thousandsSeparator:",",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0.00"},date:{dayNames:["Sun","Mon","Tue","Wed","Thr","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],AmPm:["am","pm","AM","PM"],S:function(a){return 11>a||a>13?["st","nd","rd","th"][Math.min((a-1)%10,3)]:"th"},srcformat:"Y-m-d",newformat:"n/j/Y",parseRe:/[#%\\\/:_;.,\t\s-]/,masks:{ISO8601Long:"Y-m-d H:i:s",ISO8601Short:"Y-m-d",ShortDate:"n/j/Y",LongDate:"l, F d, Y",FullDateTime:"l, F d, Y g:i:s A",MonthDay:"F d",ShortTime:"g:i A",LongTime:"g:i:s A",SortableDateTime:"Y-m-d\\TH:i:s",UniversalSortableDateTime:"Y-m-d H:i:sO",YearMonth:"F, Y"},reformatAfterEdit:!1,userLocalTime:!1},baseLinkUrl:"",showAction:"",target:"",checkbox:{disabled:!0},idName:"id"}}});
|
||||
+13
File diff suppressed because one or more lines are too long
+5
File diff suppressed because one or more lines are too long
+8
File diff suppressed because one or more lines are too long
+12
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
+2
@@ -0,0 +1,2 @@
|
||||
/* Set the defaults for DataTables initialisation */
|
||||
$.extend(!0,$.fn.dataTable.defaults,{sDom:"<'row'<'col-xs-6'l><'col-xs-6'f>r>t<'row'<'col-xs-6'i><'col-xs-6'p>>",oLanguage:{sLengthMenu:"Display _MENU_ records"}}),$.extend($.fn.dataTableExt.oStdClasses,{sWrapper:"dataTables_wrapper form-inline",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"}),$.fn.dataTable.Api?($.fn.dataTable.defaults.renderer="bootstrap",$.fn.dataTable.ext.renderer.pageButton.bootstrap=function(a,b,c,d,e,f){var g,h,i=new $.fn.dataTable.Api(a),j=a.oClasses,k=a.oLanguage.oPaginate,l=function(b,d){var m,n,o,p,q=function(a){return a.preventDefault(),$(a.target).parent().hasClass("disabled")?!1:void("ellipsis"!==a.data.action&&i.page(a.data.action).draw(!1))};for(m=0,n=d.length;n>m;m++)if(p=d[m],$.isArray(p))l(b,p);else{switch(g="",h="",p){case"ellipsis":g="…",h="disabled";break;case"first":g=k.sFirst,h=p+(e>0?"":" disabled");break;case"previous":g=k.sPrevious,h=p+(e>0?"":" disabled");break;case"next":g=k.sNext,h=p+(f-1>e?"":" disabled");break;case"last":g=k.sLast,h=p+(f-1>e?"":" disabled");break;default:g=p+1,h=e===p?"active":""}g&&(o=$("<li>",{"class":j.sPageButton+" "+h,"aria-controls":a.sTableId,tabindex:a.iTabIndex,id:0===c&&"string"==typeof p?a.sTableId+"_"+p:null}).append($("<a>",{href:"#"}).html(g)).appendTo(b),a.oApi._fnBindAction(o,{action:p},q))}};l($(b).empty().html('<ul class="pagination"/>').children("ul"),d)}):($.fn.dataTable.defaults.sPaginationType="bootstrap",$.fn.dataTableExt.oApi.fnPagingInfo=function(a){return{iStart:a._iDisplayStart,iEnd:a.fnDisplayEnd(),iLength:a._iDisplayLength,iTotal:a.fnRecordsTotal(),iFilteredTotal:a.fnRecordsDisplay(),iPage:-1===a._iDisplayLength?0:Math.ceil(a._iDisplayStart/a._iDisplayLength),iTotalPages:-1===a._iDisplayLength?0:Math.ceil(a.fnRecordsDisplay()/a._iDisplayLength)}},$.extend($.fn.dataTableExt.oPagination,{bootstrap:{fnInit:function(a,b,c){var d=(a.oLanguage.oPaginate,function(b){alert(1),b.preventDefault(),a.oApi._fnPageChange(a,b.data.action)&&c(a)});$(b).append('<ul class="pagination"><li class="prev disabled"><a href="#"><i class="fa fa-angle-double-left"></i></a></li><li class="prev disabled"><a href="#"><i class="fa fa-angle-left"></i></a></li><li class="next disabled"><a href="#"><i class="fa fa-angle-right"></i></a></li><li class="next disabled"><a href="#"><i class="fa fa-angle-double-right"></i></a></li></ul>');var e=$("a",b);$(e[0]).bind("click.DT",{action:"first"},d),$(e[1]).bind("click.DT",{action:"previous"},d),$(e[2]).bind("click.DT",{action:"next"},d),$(e[3]).bind("click.DT",{action:"last"},d)},fnUpdate:function(a,b){var c,d,e,f,g,h,i=5,j=a.oInstance.fnPagingInfo(),k=a.aanFeatures.p,l=Math.floor(i/2);for(j.iTotalPages<i?(g=1,h=j.iTotalPages):j.iPage<=l?(g=1,h=i):j.iPage>=j.iTotalPages-l?(g=j.iTotalPages-i+1,h=j.iTotalPages):(g=j.iPage-l+1,h=g+i-1),c=0,d=k.length;d>c;c++){for($("li:gt(0)",k[c]).filter(":not(.next,.prev)").remove(),e=g;h>=e;e++)f=e==j.iPage+1?'class="active"':"",$("<li "+f+'><a href="#">'+e+"</a></li>").insertBefore($("li.next:eq(0)",k[c])[0]).bind("click",function(c){c.preventDefault(),a._iDisplayStart=(parseInt($("a",this).text(),10)-1)*j.iLength,b(a)});0===j.iPage?$("li.prev",k[c]).addClass("disabled"):$("li.prev",k[c]).removeClass("disabled"),j.iPage===j.iTotalPages-1||0===j.iTotalPages?$("li.next",k[c]).addClass("disabled"):$("li.next",k[c]).removeClass("disabled")}}}})),$.fn.DataTable.TableTools&&($.extend(!0,$.fn.DataTable.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"},collection:{container:"DTTT_dropdown dropdown-menu",buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info modal"},select:{row:"active"}}),$.extend(!0,$.fn.DataTable.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}));
|
||||
+167
@@ -0,0 +1,167 @@
|
||||
/*!
|
||||
DataTables 1.10.15
|
||||
©2008-2017 SpryMedia Ltd - datatables.net/license
|
||||
*/
|
||||
(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(E){return h(E,window,document)}):"object"===typeof exports?module.exports=function(E,H){E||(E=window);H||(H="undefined"!==typeof window?require("jquery"):require("jquery")(E));return h(H,E,E.document)}:h(jQuery,window,document)})(function(h,E,H,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
|
||||
d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function J(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),J(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&F(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&F(a,a,"sZeroRecords","sLoadingRecords");
|
||||
a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&fb(a)}function gb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
|
||||
a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&J(m.models.oSearch,a[b])}function hb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"===typeof b&&!h.isArray(b)&&(a.aDataSort=[b])}function ib(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:-1*h(E).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",
|
||||
top:1,left:1,width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function jb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==
|
||||
e;)a.hasOwnProperty(d)&&(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:H.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);la(a,d,h(b).data())}function la(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=
|
||||
e.attr("width")||null;var f=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(hb(c),J(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),F(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),F(b,c,"aDataSort"));var g=b.mData,j=R(g),i=b.mRender?R(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};
|
||||
b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return S(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=
|
||||
d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function Z(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ma(a);s(a,null,"column-sizing",[a])}function $(a,b){var c=na(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function aa(a,b){var c=na(a,"bVisible"),c=h.inArray(b,
|
||||
c);return-1!==c?c:null}function ba(a){var b=0;h.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==h(d.nTh).css("display")&&b++});return b}function na(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,r;e=0;for(f=b.length;e<f;e++)if(l=b[e],r=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){r[i]===k&&(r[i]=B(a,i,e,"type"));
|
||||
q=d[g](r[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function kb(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&
|
||||
d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function oa(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,
|
||||
f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(K(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function lb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}
|
||||
function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function R(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=R(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=La(f);
|
||||
for(var i=0,n=j.length;i<n;i++){f=j[i].match(ca);g=j[i].match(V);if(f){j[i]=j[i].replace(ca,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(V,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function S(a){if(h.isPlainObject(a))return S(a._);
|
||||
if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=La(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ca);j=e[i].match(V);if(g){e[i]=e[i].replace(ca,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(V,
|
||||
""),a=a[e[i]](d));if(null===a[e[i]]||a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(V))a[f.replace(V,"")](d);else a[f.replace(ca,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ma(a){return D(a.aoData,"_aData")}function pa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function qa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function da(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
|
||||
c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Na(a,e)}}function Ka(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],r=function(a,b){if("string"===typeof a){var c=a.indexOf("@");
|
||||
-1!==c&&(c=a.substring(c+1),S(a)(d,b.getAttribute(c)))}},m=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(S(j.mData._)(d,n),r(j.mData.sort,a),r(j.mData.type,a),r(j.mData.filter,a)):q?(j._setter||(j._setter=S(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)m(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)m(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&S(a.rowId)(d,b);return{data:d,cells:e}}
|
||||
function Ja(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||H.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Na(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:H.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c&&i.parentNode.removeChild(i);
|
||||
n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}s(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Na(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?sa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function mb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===
|
||||
h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Pa(a,"header")(a,d,f,n);i&&ea(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
|
||||
if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function fa(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);
|
||||
for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function O(a){var b=s(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
|
||||
-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!nb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==e){var r=d[c%e];q._sRowStripe!=r&&(h(l).removeClass(q._sRowStripe).addClass(r),q._sRowStripe=r)}s(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:
|
||||
f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:ba(a),"class":a.oClasses.sRowEmpty}).html(c))[0];s(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,n,i]);s(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));s(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;
|
||||
c.bSort&&ob(a);d?ga(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=!1}function pb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,k=0;k<f.length;k++){g=null;j=f[k];if("<"==j){i=h("<div/>")[0];
|
||||
n=f[k+1];if("'"==n||'"'==n){l="";for(q=2;f[k+q]!=n;)l+=f[k+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;k+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=qb(a);else if("f"==j&&d.bFilter)g=rb(a);else if("r"==j&&d.bProcessing)g=sb(a);else if("t"==j)g=tb(a);else if("i"==j&&d.bInfo)g=ub(a);else if("p"==
|
||||
j&&d.bPaginate)g=vb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function ea(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,k;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");
|
||||
q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;k=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:k},a[f+g].nTr=d}e=e.nextSibling}}}function ta(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],ea(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ua(a,b,c){s(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},
|
||||
e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){s(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&K(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=s(a,null,"xhr",
|
||||
[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?K(a,0,"Invalid JSON response",1):4===b.readyState&&K(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;s(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function nb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,
|
||||
!0),ua(a,wb(a),function(b){xb(a,b)}),!1):!0}function wb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,k=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var r=function(a,b){j.push({name:a,value:b})};r("sEcho",a.iDraw);r("iColumns",c);r("sColumns",D(b,"sName").join(","));r("iDisplayStart",g);r("iDisplayLength",i);var ra={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)n=b[g],
|
||||
l=f[g],i="function"==typeof n.mData?"function":n.mData,ra.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),r("mDataProp_"+g,i),d.bFilter&&(r("sSearch_"+g,l.sSearch),r("bRegex_"+g,l.bRegex),r("bSearchable_"+g,n.bSearchable)),d.bSort&&r("bSortable_"+g,n.bSortable);d.bFilter&&(r("sSearch",e.sSearch),r("bRegex",e.bRegex));d.bSort&&(h.each(k,function(a,b){ra.order.push({column:b.col,dir:b.dir});r("iSortCol_"+a,b.col);r("sSortDir_"+
|
||||
a,b.dir)}),r("iSortingCols",k.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:ra:b?j:ra}function xb(a,b){var c=va(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}pa(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a);a._bInitComplete||
|
||||
wa(a,b);a.bAjaxDataGet=!0;C(a,!1)}function va(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?R(c)(b):b}function rb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?
|
||||
"":this.value;b!=e.sSearch&&(ga(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Qa(f,g):f).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==H.activeElement&&i.val(e.sSearch)}catch(d){}});
|
||||
return b[0]}function ga(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){yb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)zb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);Ab(a)}else f(b);a.bFiltered=!0;s(a,null,"search",[a])}function Ab(a){for(var b=
|
||||
m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function zb(a,b,c,d,e,f){if(""!==b){for(var g=[],j=a.aiDisplay,d=Ra(b,d,e,f),e=0;e<j.length;e++)b=a.aoData[j[e]]._aFilterData[c],d.test(b)&&g.push(j[e]);a.aiDisplay=g}}function yb(a,b,c,d,e,f){var d=Ra(b,d,e,f),f=a.oPreviousSearch.sSearch,g=a.aiDisplayMaster,j,e=[];0!==m.ext.search.length&&(c=!0);j=Bb(a);if(0>=b.length)a.aiDisplay=
|
||||
g.slice();else{if(j||c||f.length>b.length||0!==b.indexOf(f)||a.bSorted)a.aiDisplay=g.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)d.test(a.aoData[b[c]]._sFilterRow)&&e.push(b[c]);a.aiDisplay=e}}function Ra(a,b,c,d){a=b?a:Sa(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function Bb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=m.ext.type.search;c=!1;
|
||||
d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(xa.innerHTML=i,i=$b?xa.textContent:xa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}function Cb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,
|
||||
caseInsensitive:a.bCaseInsensitive}}function Db(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function ub(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Eb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Eb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+
|
||||
1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Fb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Fb(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,
|
||||
f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ha(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){pb(a);mb(a);fa(a,a.aoHeader);fa(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=v(f.sWidth));s(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ua(a,[],function(c){var f=va(a,c);for(b=0;b<f.length;b++)N(a,f[b]);a.iInitDisplayStart=
|
||||
d;T(a);C(a,!1);wa(a,c)},a):(C(a,!1),wa(a))}else setTimeout(function(){ha(a)},200)}function wa(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&Z(a);s(a,null,"plugin-init",[a,b]);s(a,"aoInitComplete","init",[a,b])}function Ta(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Ua(a);s(a,null,"length",[a,c])}function qb(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)e[0][g]=
|
||||
new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).on("change.DT",function(){Ta(a,h(this).val());O(a)});h(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function vb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},b=h("<div/>").addClass(a.oClasses.sPaging+
|
||||
b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Va(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===e?d=0:"number"===typeof b?(d=b*e,d>f&&
|
||||
(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:K(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(s(a,null,"page",[a]),c&&O(a));return b}function sb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");
|
||||
s(a,null,"processing",[a,b])}function tb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",
|
||||
{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:v(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:v(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
|
||||
0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],r=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(r.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=r;a.aoDrawCallback.push({fn:ma,sName:"scrolling"});return i[0]}function ma(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
|
||||
j=a.nScrollBody,l=h(j),q=j.style,r=h(a.nScrollFoot).children("div"),m=r.children("table"),p=h(a.nTHead),o=h(a.nTable),t=o[0],s=t.style,u=a.nTFoot?h(a.nTFoot):null,x=a.oBrowser,U=x.bScrollOversize,ac=D(a.aoColumns,"nTh"),P,L,Q,w,Wa=[],y=[],z=[],A=[],B,C=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};L=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==L&&a.scrollBarVis!==k)a.scrollBarVis=L,Z(a);else{a.scrollBarVis=L;o.children("thead, tfoot").remove();
|
||||
u&&(Q=u.clone().prependTo(o),P=u.find("tr"),Q=Q.find("tr"));w=p.clone().prependTo(o);p=p.find("tr");L=w.find("tr");w.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(ta(a,w),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});u&&I(function(a){a.style.width=""},Q);f=o.outerWidth();if(""===c){s.width="100%";if(U&&(o.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))s.width=v(o.outerWidth()-b);f=o.outerWidth()}else""!==d&&(s.width=
|
||||
v(d),f=o.outerWidth());I(C,L);I(function(a){z.push(a.innerHTML);Wa.push(v(h(a).css("width")))},L);I(function(a,b){if(h.inArray(a,ac)!==-1)a.style.width=Wa[b]},p);h(L).height(0);u&&(I(C,Q),I(function(a){A.push(a.innerHTML);y.push(v(h(a).css("width")))},Q),I(function(a,b){a.style.width=y[b]},P),h(Q).height(0));I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+z[b]+"</div>";a.style.width=Wa[b]},L);u&&I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+
|
||||
A[b]+"</div>";a.style.width=y[b]},Q);if(o.outerWidth()<f){P=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(U&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))s.width=v(P-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else P="100%";q.width=v(P);g.width=v(P);u&&(a.nScrollFoot.style.width=v(P));!e&&U&&(q.height=v(t.offsetHeight+b));c=o.outerWidth();n[0].style.width=v(c);i.width=v(c);d=o.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
|
||||
(x.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=v(c),r[0].style.width=v(c),r[0].style[e]=d?b+"px":"0px");o.children("colgroup").insertBefore(o.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function I(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ha(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,
|
||||
e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=na(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,r=!1,m,p,o=a.oBrowser,d=o.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)p=c[i[m]],null!==p.sWidth&&(p.sWidth=Gb(p.sWidthOrig,k),r=!0);if(d||!r&&!f&&!e&&j==ba(a)&&j==n.length)for(m=0;m<j;m++)i=$(a,m),null!==i&&(c[i].sWidth=v(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var t=h("<tr/>").appendTo(j.find("tbody"));
|
||||
j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=ta(a,j.find("thead")[0]);for(m=0;m<i.length;m++)p=c[i[m]],n[m].style.width=null!==p.sWidthOrig&&""!==p.sWidthOrig?v(p.sWidthOrig):"",p.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:p.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)r=i[m],p=c[r],h(Hb(a,r)).clone(!1).append(p.sContentPadding).appendTo(t);h("[name]",
|
||||
j).removeAttr("name");p=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=o.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=v(k-g);b.style.width=v(e);p.remove()}l&&(b.style.width=
|
||||
v(l));if((l||f)&&!a._reszEvt)b=function(){h(E).on("resize.DT-"+a.sInstance,Qa(function(){Z(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function Gb(a,b){if(!a)return 0;var c=h("<div/>").css("width",v(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Hb(a,b){var c=Ib(a,b);if(0>c)return null;var d=a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Ib(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace(bc,
|
||||
""),c=c.replace(/ /g," "),c.length>d&&(d=c.length,e=f);return e}function v(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||
|
||||
"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function ob(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ia(a);h=W(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Jb(a,j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=
|
||||
0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Kb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,
|
||||
"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Xa(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,
|
||||
D(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Oa(a,b,c,d){var e=a.aoColumns[c];Ya(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Xa(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Xa(a,c,b.shiftKey,d))})}
|
||||
function ya(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=W(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(D(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Jb(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,aa(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],
|
||||
c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function za(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Cb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Cb(a.aoPreSearchCols[d])}})};s(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,
|
||||
b)}}function Lb(a,b,c){var d,e,f=a.aoColumns,b=function(b){if(b&&b.time){var g=s(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===h.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g)&&!(b.columns&&f.length!==b.columns.length))){a.oLoadedState=h.extend(!0,{},b);b.start!==k&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==k&&(a._iDisplayLength=b.length);b.order!==k&&(a.aaSorting=[],h.each(b.order,function(b,c){a.aaSorting.push(c[0]>=f.length?[0,c[1]]:c)}));b.search!==
|
||||
k&&h.extend(a.oPreviousSearch,Db(b.search));if(b.columns){d=0;for(e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==k&&(f[d].bVisible=g.visible),g.search!==k&&h.extend(a.aoPreSearchCols[d],Db(g.search))}s(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==k&&b(g)}else c()}function Aa(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function K(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+
|
||||
" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)E.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&s(a,null,"error",[a,d,c]),"alert"==b)console.log(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function F(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?F(a,b,d[0],d[1]):F(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Mb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],
|
||||
h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Ya(a,b,c){h(a).on("click.DT",b,function(b){a.blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function s(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+
|
||||
".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Ua(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ia(a,b){var c=[],c=Nb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,
|
||||
c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function fb(a){h.each({num:function(b){return Ba(b,a)},"num-fmt":function(b){return Ba(b,a,Za)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Za)}},function(b,c){x.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(x.type.search[b+a]=x.type.search.html)})}function Ob(a){return function(){var b=
|
||||
[Aa(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(Aa(this[x.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};this.fnAdjustColumnSizing=
|
||||
function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ma(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};
|
||||
this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();
|
||||
return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Aa(this[x.iApiIndex])};
|
||||
this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=x.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=x.internal;for(var e in m.ext.internal)e&&(this[e]=Ob(e));this.each(function(){var e={},g=1<d?Mb(e,a,!0):
|
||||
a,j=0,i,e=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())K(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{gb(l);hb(l.column);J(l,l,!0);J(l.column,l.column,!0);J(l,h.extend(g,q.data()));var r=m.settings,j=0;for(i=r.length;j<i;j++){var p=r[j];if(p.nTable==this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){var t=g.bRetrieve!==k?g.bRetrieve:l.bRetrieve;if(c||t)return p.oInstance;if(g.bDestroy!==k?g.bDestroy:l.bDestroy){p.oInstance.fnDestroy();
|
||||
break}else{K(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){r.splice(j,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+m.ext._unique++;var o=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:e,sTableId:e});o.nTable=this;o.oApi=b.internal;o.oInit=g;r.push(o);o.oInstance=1===b.length?b:q.dataTable();gb(g);g.oLanguage&&Fa(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=h.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);
|
||||
g=Mb(h.extend(!0,{},l),g);F(o.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(o,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],
|
||||
["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);F(o.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(o.oLanguage,g,"fnInfoCallback");z(o,"aoDrawCallback",g.fnDrawCallback,"user");z(o,"aoServerParams",g.fnServerParams,"user");z(o,"aoStateSaveParams",g.fnStateSaveParams,"user");z(o,"aoStateLoadParams",g.fnStateLoadParams,"user");z(o,"aoStateLoaded",g.fnStateLoaded,
|
||||
"user");z(o,"aoRowCallback",g.fnRowCallback,"user");z(o,"aoRowCreatedCallback",g.fnCreatedRow,"user");z(o,"aoHeaderCallback",g.fnHeaderCallback,"user");z(o,"aoFooterCallback",g.fnFooterCallback,"user");z(o,"aoInitComplete",g.fnInitComplete,"user");z(o,"aoPreDrawCallback",g.fnPreDrawCallback,"user");o.rowIdFn=R(g.rowId);ib(o);var u=o.oClasses;g.bJQueryUI?(h.extend(u,m.ext.oJUIClasses,g.oClasses),g.sDom===l.sDom&&"lfrtip"===l.sDom&&(o.sDom='<"H"lfr>t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&
|
||||
!o.renderer.header&&(o.renderer.header="jqueryui"):o.renderer="jqueryui":h.extend(u,m.ext.classes,g.oClasses);q.addClass(u.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=g.iDisplayStart,o._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(o.bDeferLoading=!0,e=h.isArray(g.iDeferLoading),o._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,o._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var v=o.oLanguage;h.extend(!0,v,g.oLanguage);v.sUrl&&(h.ajax({dataType:"json",url:v.sUrl,success:function(a){Fa(a);
|
||||
J(l.oLanguage,a);h.extend(true,v,a);ha(o)},error:function(){ha(o)}}),n=!0);null===g.asStripeClasses&&(o.asStripeClasses=[u.sStripeOdd,u.sStripeEven]);var e=o.asStripeClasses,x=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(e,function(a){return x.hasClass(a)}))&&(h("tbody tr",this).removeClass(e.join(" ")),o.asDestroyStripes=e.slice());e=[];r=this.getElementsByTagName("thead");0!==r.length&&(ea(o.aoHeader,r[0]),e=ta(o));if(null===g.aoColumns){r=[];j=0;for(i=e.length;j<i;j++)r.push(null)}else r=
|
||||
g.aoColumns;j=0;for(i=r.length;j<i;j++)Ga(o,e?e[j]:null);kb(o,g.aoColumnDefs,r,function(a,b){la(o,a,b)});if(x.length){var w=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(x[0]).children("th, td").each(function(a,b){var c=o.aoColumns[a];if(c.mData===a){var d=w(b,"sort")||w(b,"order"),e=w(b,"filter")||w(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};la(o,a)}}})}var U=o.oFeatures,
|
||||
e=function(){if(g.aaSorting===k){var a=o.aaSorting;j=0;for(i=a.length;j<i;j++)a[j][1]=o.aoColumns[j].asSorting[0]}ya(o);U.bSort&&z(o,"aoDrawCallback",function(){if(o.bSorted){var a=W(o),b={};h.each(a,function(a,c){b[c.src]=c.dir});s(o,null,"order",[o,a,b]);Kb(o)}});z(o,"aoDrawCallback",function(){(o.bSorted||y(o)==="ssp"||U.bDeferRender)&&ya(o)},"sc");var a=q.children("caption").each(function(){this._captionSide=h(this).css("caption-side")}),b=q.children("thead");b.length===0&&(b=h("<thead/>").appendTo(q));
|
||||
o.nTHead=b[0];b=q.children("tbody");b.length===0&&(b=h("<tbody/>").appendTo(q));o.nTBody=b[0];b=q.children("tfoot");if(b.length===0&&a.length>0&&(o.oScroll.sX!==""||o.oScroll.sY!==""))b=h("<tfoot/>").appendTo(q);if(b.length===0||b.children().length===0)q.addClass(u.sNoFooter);else if(b.length>0){o.nTFoot=b[0];ea(o.aoFooter,o.nTFoot)}if(g.aaData)for(j=0;j<g.aaData.length;j++)N(o,g.aaData[j]);else(o.bDeferLoading||y(o)=="dom")&&oa(o,h(o.nTBody).children("tr"));o.aiDisplay=o.aiDisplayMaster.slice();
|
||||
o.bInitialised=true;n===false&&ha(o)};g.bStateSave?(U.bStateSave=!0,z(o,"aoDrawCallback",za,"state_save"),Lb(o,g,e)):e()}});b=null;return this},x,t,p,u,$a={},Pb=/[\r\n]/g,Ca=/<.*?>/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Za=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Qb=function(a){var b=parseInt(a,10);return!isNaN(b)&&
|
||||
isFinite(a)?b:null},Rb=function(a,b){$a[b]||($a[b]=RegExp(Sa(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace($a[b],"."):a},ab=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Rb(a,b));c&&d&&(a=a.replace(Za,""));return!isNaN(parseFloat(a))&&isFinite(a)},Sb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:ab(a.replace(Ca,""),b,c)?!0:null},D=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<
|
||||
f;e++)a[e]&&d.push(a[e][b]);return d},ja=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},X=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Tb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},sa=function(a){var b;a:{if(!(2>a.length)){b=a.slice().sort();for(var c=b[0],d=1,e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();
|
||||
b=[];var e=a.length,f,g=0,d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b};m.util={throttle:function(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,h=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=k;a.apply(b,h)},c)):(d=g,a.apply(b,h))}},escapeRegex:function(a){return a.replace(dc,"\\$1")}};var A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ca=/\[.*?\]$/,V=/\(\)$/,Sa=m.util.escapeRegex,xa=h("<div>")[0],$b=xa.textContent!==k,bc=
|
||||
/<.*?>/g,Qa=m.util.throttle,Ub=[],w=Array.prototype,ec=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};t=function(a,b){if(!(this instanceof
|
||||
t))return new t(a,b);var c=[],d=function(a){(a=ec(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=sa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};t.extend(this,this,Ub)};m.Api=t;h.extend(t.prototype,{any:function(){return 0!==this.count()},concat:w.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=
|
||||
this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context,b)},flatten:function(){var a=[];return new t(this.context,a.concat.apply(a,this.toArray()))},join:w.join,indexOf:w.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,n,l=this.context,
|
||||
m,p,u=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var s=new t(l[g]);if("table"===b)f=c.call(s,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(s,l[g],this[g],g),f!==k&&e.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){p=this[g];"column-rows"===b&&(m=Da(l[g],u.opts));i=0;for(n=p.length;i<n;i++)f=p[i],f="cell"===b?c.call(s,l[g],f.row,f.column,g,i):c.call(s,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new t(l,a?
|
||||
e.concat.apply([],e):e),b=a.selector,b.rows=u.rows,b.cols=u.cols,b.opts=u.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return jb(this,a,b,0,this.length,
|
||||
1)},reduceRight:w.reduceRight||function(a,b){return jb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,slice:function(){return new t(this.context,this)},sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new t(this.context,sa(this))},unshift:w.unshift});t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=
|
||||
b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=p=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)t.register(a[c],b);else for(var e=a.split("."),f=Ub,g,j,c=0,d=e.length;c<d;c++){g=(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=
|
||||
f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=u=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])?new t(a.context,a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,
|
||||
d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});u("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});u("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});u("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});u("tables().footer()",
|
||||
"table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});u("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table",function(b){"page"===a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Va(b,a)})});p("page.info()",function(){if(0===
|
||||
this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:k:this.iterator("table",function(b){Ta(b,a)})});var Vb=function(a,b,c){if(c){var d=new t(a);
|
||||
d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ua(a,[],function(c){pa(a);for(var c=va(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,b){return this.iterator("table",function(c){Vb(c,!1===b,a)})});p("ajax.url()",function(a){var b=
|
||||
this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Vb(c,!1===b,a)})});var bb=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split&&!b[i].match(/[\[\(:]/)?b[i].split(","):
|
||||
[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=x.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return sa(f)},cb=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},db=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Da=function(a,b){var c,
|
||||
d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:X(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};
|
||||
p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=cb(b),c=this.iterator("table",function(c){var e=b,f;return bb("row",a,function(a){var b=Qb(a);if(b!==null&&!e)return[b];f||(f=Da(c,e));if(b!==null&&h.inArray(b,f)!==-1)return[b];if(a===null||a===k||a==="")return f;if(typeof a==="function")return h.map(f,function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Tb(ja(c.aoData,f,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];
|
||||
b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){var i=c.aIds[a.replace(/^#/,"")];if(i!==k)return[i.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ja(a.aoData,b,"_aData")},
|
||||
1)});u("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});u("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){da(b,c,a)})});u("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});u("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<
|
||||
g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new t(c,b)});u("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(n=l.length;i<n;i++)l[i]._DT_CellIndex.row=g}qa(b.aiDisplayMaster,c);qa(b.aiDisplay,c);qa(a[d],c,!1);Ua(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});
|
||||
this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(oa(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.merge(c,b);return c});p("row()",function(a,b){return db(this.rows(a,b))});p("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:
|
||||
k;b[0].aoData[this[0]]._aData=a;da(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?oa(b,a)[0]:N(b,a)});return this.row(b[0])});var eb=function(a,b){var c=a.context;if(c.length&&(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=
|
||||
k,c._details=k},Wb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new t(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",
|
||||
function(a,b){if(e===b)for(var c,d=ba(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&eb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)eb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,
|
||||
b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=ba(d),e.push(c[0]))};f(a,b);c._details&&c._details.detach();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Wb(this,!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Wb(this,!1);
|
||||
return this});p(["row().child.remove()","row().child().remove()"],function(){eb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var fc=/^([^:]+):(name|visIdx|visible)$/,Xb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=cb(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,
|
||||
j=D(g,"sName"),i=D(g,"nTh");return bb("column",e,function(a){var b=Qb(a);if(a==="")return X(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Xb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(fc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[$(c,b)];case "name":return h.map(j,function(a,b){return a===
|
||||
k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});u("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});u("columns().footer()","column().footer()",
|
||||
function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});u("columns().data()","column().data()",function(){return this.iterator("column-rows",Xb,1)});u("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});u("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return ja(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});u("columns().nodes()",
|
||||
"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,e,"anCells",b)},1)});u("columns().visible()","column().visible()",function(a,b){var c=this.iterator("column",function(b,c){if(a===k)return b.aoColumns[c].bVisible;var f=b.aoColumns,g=f[c],j=b.aoData,i,n,l;if(a!==k&&g.bVisible!==a){if(a){var m=h.inArray(!0,D(f,"bVisible"),c+1);i=0;for(n=j.length;i<n;i++)l=j[i].nTr,f=j[i].anCells,l&&l.insertBefore(f[c],f[m]||null)}else h(D(b.aoData,"anCells",c)).detach();
|
||||
g.bVisible=a;fa(b,b.aoHeader);fa(b,b.aoFooter);za(b)}});a!==k&&(this.iterator("column",function(c,e){s(c,null,"column-visibility",[c,e,a,b])}),(b===k||b)&&this.columns.adjust());return c});u("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?aa(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){Z(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===
|
||||
a||"toData"===a)return $(c,b);if("fromData"===a||"toVisible"===a)return aa(c,b)}});p("column()",function(a,b){return db(this.columns(a,b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=cb(c),f=b.aoData,g=Da(b,e),j=Tb(ja(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,p,u,t,s,v;return bb("cell",d,function(a){var c=typeof a==="function";
|
||||
if(a===null||a===k||c){m=[];p=0;for(u=g.length;p<u;p++){l=g[p];for(t=0;t<n;t++){s={row:l,column:t};if(c){v=f[l];a(s,B(b,l,t),v.anCells?v.anCells[t]:null)&&m.push(s)}else m.push(s)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!a.nodeName)return c;v=h(a).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},b,e)});var d=this.columns(b,c),e=this.rows(a,
|
||||
c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});u("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});u("cells().cache()","cell().cache()",function(a){a=
|
||||
"search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});u("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});u("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:aa(a,c)}},1)});u("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){da(b,c,a,d)})});p("cell()",
|
||||
function(a,b,c){return db(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;lb(b[0],c[0].row,c[0].column,a);da(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:a.length&&!h.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});
|
||||
p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Oa(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,b,c,d){var e=
|
||||
this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&ga(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});u("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?
|
||||
!0:c,bCaseInsensitive:null===d?!0:d}),ga(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){za(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),
|
||||
a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;if(a instanceof m.Api)return!0;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,
|
||||
function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable});return b?new t(c):c};m.camelToHungarian=J;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=h.map(a[0].split(/\s/),function(a){return!a.match(/\.dt\b/)?a+".dt":a}).join(" ");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",
|
||||
function(a){pa(a)})});p("settings()",function(){return new t(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),
|
||||
p;b.bDestroying=!0;s(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.off(".DT").find(":not(tbody *)").off(".DT");h(E).off(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];ya(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+d.sSortIcon+
|
||||
", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column",
|
||||
"row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,m){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,m)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=R(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.15";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,
|
||||
_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults=
|
||||
{aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
|
||||
this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
|
||||
"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
|
||||
sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
|
||||
Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
|
||||
bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
|
||||
aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
|
||||
aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=
|
||||
this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=x={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
|
||||
header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(x,{afnFiltering:x.search,aTypes:x.type.detect,ofnSearch:x.type.search,oSort:x.type.order,afnSortData:x.order,aoFeatures:x.feature,oApi:x.internal,oStdClasses:x.classes,oPagination:x.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
|
||||
sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
|
||||
sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",G=Ea+"ui-state-default",ka=Ea+"css_right ui-icon ui-icon-",Yb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
|
||||
m.ext.classes,{sPageButton:"fg-button ui-button "+G,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:G+" sorting_asc",sSortDesc:G+" sorting_desc",sSortable:G+" sorting",sSortableAsc:G+" sorting_asc_disabled",sSortableDesc:G+" sorting_desc_disabled",sSortableNone:G+" sorting_disabled",sSortJUIAsc:ka+"triangle-1-n",sSortJUIDesc:ka+"triangle-1-s",sSortJUI:ka+"carat-2-n-s",
|
||||
sSortJUIAscAllowed:ka+"carat-1-n",sSortJUIDescAllowed:ka+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+G,sScrollFoot:"dataTables_scrollFoot "+G,sHeaderTH:G,sFooterTH:G,sJUIHeader:Yb+" ui-corner-tl ui-corner-tr",sJUIFooter:Yb+" ui-corner-bl ui-corner-br"});var Nb=m.ext.pager;h.extend(Nb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[ia(a,
|
||||
b)]},simple_numbers:function(a,b){return["previous",ia(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ia(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ia(a,b),"last"]},_numbers:ia,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},m,l,p=0,r=function(b,d){var k,t,u,s,v=function(b){Va(a,b.data.action,true)};k=0;for(t=d.length;k<t;k++){s=d[k];if(h.isArray(s)){u=
|
||||
h("<"+(s.DT_el||"div")+"/>").appendTo(b);r(u,s)}else{m=null;l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">…</span>');break;case "first":m=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":m=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":m=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":m=j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:m=s+1;l=e===s?g.sPageButtonActive:""}if(m!==null){u=h("<a>",{"class":g.sPageButton+
|
||||
" "+l,"aria-controls":a.sTableId,"aria-label":i[s],"data-dt-idx":p,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(m).appendTo(b);Ya(u,{action:s},v);p++}}}},t;try{t=h(b).find(H.activeElement).data("dt-idx")}catch(u){}r(h(b).empty(),d);t!==k&&h(b).find("[data-dt-idx="+t+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return ab(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&!cc.test(a))return null;var b=Date.parse(a);
|
||||
return null!==b&&!isNaN(b)||M(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return ab(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Sb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Sb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Pb," ").replace(Ca,""):""},string:function(a){return M(a)?
|
||||
a:"string"===typeof a?a.replace(Pb," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Rb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(x.type.order,{"date-pre":function(a){return Date.parse(a)||-Infinity},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<
|
||||
b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});fb("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);
|
||||
h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Zb=function(a){return"string"===typeof a?a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,
|
||||
"""):a};m.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Zb(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Zb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Ob,_fnBuildAjax:ua,_fnAjaxUpdate:nb,_fnAjaxParameters:wb,_fnAjaxUpdateDraw:xb,
|
||||
_fnAjaxDataSrc:va,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:Z,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:aa,_fnVisbleColumns:ba,_fnGetColumns:na,_fnColumnTypes:Ia,_fnApplyColumnDefs:kb,_fnHungarianMap:Y,_fnCamelToHungarian:J,_fnLanguageCompat:Fa,_fnBrowserDetect:ib,_fnAddData:N,_fnAddTr:oa,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:lb,
|
||||
_fnSplitObjNotation:La,_fnGetObjectDataFn:R,_fnSetObjectDataFn:S,_fnGetDataMaster:Ma,_fnClearTable:pa,_fnDeleteIndex:qa,_fnInvalidate:da,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:mb,_fnDrawHead:fa,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:pb,_fnDetectHeader:ea,_fnGetUniqueThs:ta,_fnFeatureHtmlFilter:rb,_fnFilterComplete:ga,_fnFilterCustom:Ab,_fnFilterColumn:zb,_fnFilter:yb,_fnFilterCreateSearch:Ra,_fnEscapeRegex:Sa,_fnFilterData:Bb,_fnFeatureHtmlInfo:ub,_fnUpdateInfo:Eb,_fnInfoMacros:Fb,_fnInitialise:ha,
|
||||
_fnInitComplete:wa,_fnLengthChange:Ta,_fnFeatureHtmlLength:qb,_fnFeatureHtmlPaginate:vb,_fnPageChange:Va,_fnFeatureHtmlProcessing:sb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:tb,_fnScrollDraw:ma,_fnApplyToChildren:I,_fnCalculateColumnWidths:Ha,_fnThrottle:Qa,_fnConvertToWidth:Gb,_fnGetWidestNode:Hb,_fnGetMaxLenString:Ib,_fnStringToCss:v,_fnSortFlatten:W,_fnSort:ob,_fnSortAria:Kb,_fnSortListener:Xa,_fnSortAttachListener:Oa,_fnSortingClasses:ya,_fnSortData:Jb,_fnSaveState:za,_fnLoadState:Lb,_fnSettingsFromNode:Aa,
|
||||
_fnLog:K,_fnMap:F,_fnBindAction:Ya,_fnCallbackReg:z,_fnCallbackFire:s,_fnLengthOverflow:Ua,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});
|
||||
+9
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
Executable
+13
@@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
rm -f ./js/bokeh.min.js
|
||||
rm -f ./js/bokeh-api.min.js
|
||||
rm -f ./js/bokeh-gl.min.js
|
||||
rm -f ./js/bokeh-tables.min.js
|
||||
rm -f ./js/bokeh-widgets.min.js
|
||||
|
||||
cp /usr/local/lib/python3.7/site-packages/bokeh/server/static/js/bokeh.min.js ./js/
|
||||
cp /usr/local/lib/python3.7/site-packages/bokeh/server/static/js/bokeh-api.min.js ./js/
|
||||
cp /usr/local/lib/python3.7/site-packages/bokeh/server/static/js/bokeh-gl.min.js ./js/
|
||||
cp /usr/local/lib/python3.7/site-packages/bokeh/server/static/js/bokeh-tables.min.js ./js/
|
||||
cp /usr/local/lib/python3.7/site-packages/bokeh/server/static/js/bokeh-widgets.min.js ./js/
|
||||
@@ -0,0 +1,20 @@
|
||||
<!doctype html>
|
||||
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Embedding a Bokeh Server With {{ framework }}</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
This Bokeh app below served by a Bokeh server that has been embedded
|
||||
in another web app framework. For more information see the section
|
||||
<a target="_blank"
|
||||
href="https://bokeh.pydata.org/en/latest/docs/user_guide/server.html#embedding-bokeh-server-as-a-library">
|
||||
Embedding Bokeh Server as a Library</a>
|
||||
in the User's Guide.
|
||||
</div>
|
||||
{{ script|safe }}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,2 @@
|
||||
{% block footer %}
|
||||
{% end %}
|
||||
@@ -0,0 +1,12 @@
|
||||
{% block header %}
|
||||
<div id="navbar" class="navbar navbar-default ace-save-state">
|
||||
<div class="navbar-container ace-save-state" id="navbar-container">
|
||||
<div class="navbar-header pull-left">
|
||||
<a href="/stock/" class="navbar-brand">
|
||||
<small><i class="fa fa-leaf"></i>开源Python全栈股票系统,数据抓取、统计分析、报表展示 版本:{{ pythonStockVersion }}</small>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div><!-- /.navbar-container -->
|
||||
</div>
|
||||
{% end %}
|
||||
@@ -0,0 +1,64 @@
|
||||
{% block left_menu %}
|
||||
<div id="sidebar" class="sidebar responsive ace-save-state">
|
||||
<script type="text/javascript">
|
||||
try{ace.settings.loadState('sidebar')}catch(e){}
|
||||
</script>
|
||||
|
||||
<ul class="nav nav-list">
|
||||
<li class="">
|
||||
<a href="/">
|
||||
<i class="menu-icon fa fa-tachometer"></i>
|
||||
<span class="menu-text"> Dashboard </span>
|
||||
</a>
|
||||
<b class="arrow"></b>
|
||||
</li>
|
||||
|
||||
<li class="active open">
|
||||
<!--<a href="#" class="dropdown-toggle">-->
|
||||
<!--<i class="menu-icon fa fa-desktop"></i>-->
|
||||
<!--<span class="menu-text">-->
|
||||
<!--股票原始数据-->
|
||||
<!--</span>-->
|
||||
<!--<b class="arrow fa fa-angle-down"></b>-->
|
||||
<!--</a>-->
|
||||
<!--<b class="arrow"></b>-->
|
||||
<li class="submenu">
|
||||
<li class="open" style="display:none;">
|
||||
{% set loopType = "" %}
|
||||
{% for leftMenuTmp in leftMenu.leftMenuList %}
|
||||
|
||||
{% if leftMenuTmp.type != loopType %}
|
||||
</li>
|
||||
<li class="open">
|
||||
{% set loopType = leftMenuTmp.type %}
|
||||
<a href="#" class="dropdown-toggle">
|
||||
<i class="menu-icon fa fa-pencil-square-o"></i>
|
||||
{{ leftMenuTmp.type }}
|
||||
<b class="arrow fa fa-angle-down"></b>
|
||||
</a>
|
||||
<b class="arrow"></b>
|
||||
|
||||
{% end %}
|
||||
|
||||
<ul class="submenu">
|
||||
<li>
|
||||
<a href="{{ leftMenuTmp.url }}">
|
||||
<i class="menu-icon fa fa-caret-right"></i>
|
||||
{{ leftMenuTmp.name }}
|
||||
</a>
|
||||
<b class="arrow"></b>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{% end %}
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</li>
|
||||
</ul><!-- /.nav-list -->
|
||||
|
||||
<div class="sidebar-toggle sidebar-collapse" id="sidebar-collapse">
|
||||
<i id="sidebar-toggle-icon" class="ace-icon fa fa-angle-double-left ace-save-state" data-icon1="ace-icon fa fa-angle-double-left" data-icon2="ace-icon fa fa-angle-double-right"></i>
|
||||
</div>
|
||||
</div>
|
||||
{% end %}
|
||||
@@ -0,0 +1,71 @@
|
||||
{% block meta %}
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
|
||||
<!-- bootstrap & fontawesome -->
|
||||
<link rel="stylesheet" href="/static/css/bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="/static/font-awesome/4.5.0/css/font-awesome.min.css" />
|
||||
<!-- ace styles -->
|
||||
<link rel="stylesheet" href="/static/css/ace.min.css" class="ace-main-stylesheet" id="main-ace-style" />
|
||||
<!-- basic scripts -->
|
||||
<script src="/static/js/jquery-2.1.4.min.js"></script>
|
||||
<script src="/static/js/ace-extra.min.js"></script>
|
||||
<script src="/static/js/bootstrap.min.js"></script>
|
||||
|
||||
<!-- page specific plugin scripts -->
|
||||
<script src="/static/js/jquery.dataTables.min.js"></script>
|
||||
<script src="/static/js/jquery.dataTables.bootstrap.min.js"></script>
|
||||
<script src="/static/js/dataTables.buttons.min.js"></script>
|
||||
<script src="/static/js/dataTables.select.min.js"></script>
|
||||
<!-- ace scripts -->
|
||||
<script src="/static/js/moment.min.js"></script>
|
||||
<script src="/static/js/bootstrap-datepicker.min.js"></script>
|
||||
<script src="/static/js/bootstrap-datetimepicker.min.js"></script>
|
||||
<script src="/static/js/bootstrap-datepicker.zh-CN.js"></script>
|
||||
|
||||
<link rel="stylesheet" href="/static/css/bootstrap-datepicker3.min.css" />
|
||||
<link rel="stylesheet" href="/static/css/bootstrap-datetimepicker.min.css" />
|
||||
|
||||
<script src="/static/js/ace-elements.min.js"></script>
|
||||
<script src="/static/js/ace.min.js"></script>
|
||||
<script src="/static/js/jquery-ui.custom.min.js"></script>
|
||||
<script src="/static/js/bootbox.js"></script>
|
||||
|
||||
<script src="/static/js/buttons.colVis.min.js"></script>
|
||||
<script src="/static/js/buttons.print.min.js"></script>
|
||||
<script src="/static/js/buttons.html5.min.js"></script>
|
||||
|
||||
|
||||
<script type='text/javascript'>
|
||||
jQuery(function($) {
|
||||
//初始化窗口。
|
||||
$('.modal.aside').ace_aside();
|
||||
$('#aside-inside-modal').addClass('aside').ace_aside({container: ""});
|
||||
$(document).one('ajaxloadstart.page', function(e) {
|
||||
$('.modal.aside').remove();
|
||||
$(window).off('.aside')
|
||||
});
|
||||
})
|
||||
$.extend({
|
||||
getUrlVars: function(){
|
||||
var vars = [], hash;
|
||||
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
|
||||
for(var i = 0; i < hashes.length; i++)
|
||||
{
|
||||
hash = hashes[i].split('=');
|
||||
vars.push(hash[0]);
|
||||
vars[hash[0]] = hash[1];
|
||||
}
|
||||
return vars;
|
||||
},
|
||||
getUrlVar: function(name){
|
||||
return $.getUrlVars()[name];
|
||||
}
|
||||
});
|
||||
jQuery(function($) {
|
||||
$('[data-rel=tooltip]').tooltip();
|
||||
$('[data-rel=popover]').popover({html:true});
|
||||
});
|
||||
</script>
|
||||
<style>
|
||||
#dynamic-table_filter {display: none;}
|
||||
</style>
|
||||
{% end %}
|
||||
@@ -0,0 +1,157 @@
|
||||
{% extends "layout/default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<h3 class="header smaller lighter blue">{{ stockWeb.name }}</h3>
|
||||
<div class="table-header">{{ stockWeb.name }}</div>
|
||||
|
||||
<div class="row"> </div>
|
||||
<div class="row">
|
||||
{% for index,element in enumerate(stockWeb.columns) %}
|
||||
<div class="col-md-4" id="filter_col{{ index+1 }}" data-column="{{ index }}">
|
||||
{{ stockWeb.column_names[index] }}
|
||||
<!-- Column - {{ stockWeb.column_names[index] }} - {{ element }} -->
|
||||
<input type="text" class="column_filter input-group-sm form-control" id="col{{ index }}_filter">
|
||||
</div>
|
||||
{% end %}
|
||||
</div>
|
||||
|
||||
<table cellpadding="3" cellspacing="0" border="0" style="width: 67%; margin: 0 auto 2em auto;">
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- div.table-responsive -->
|
||||
<!-- div.dataTables_borderWrap -->
|
||||
<div>
|
||||
<div class="pull-right tableTools-container"></div>
|
||||
<table id="dynamic-table" class="table table-striped table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
{% for column_name in stockWeb.column_names %}
|
||||
<th>{{ column_name }}</th>
|
||||
{% end %}
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- inline scripts related to this page -->
|
||||
<script type="text/javascript">
|
||||
|
||||
jQuery(function($) {
|
||||
editor = new $.fn.dataTable.Editor( {
|
||||
i18n: {
|
||||
create: {
|
||||
button: "新建",
|
||||
title: "创建新数据",
|
||||
submit: "保存"
|
||||
},
|
||||
edit: {
|
||||
button: "修改",
|
||||
title: "修改数据",
|
||||
submit: "保存"
|
||||
},
|
||||
remove: {
|
||||
button: "删除",
|
||||
title: "删除数据",
|
||||
submit: "删除",
|
||||
confirm: {
|
||||
_: "确定删除 %d 条数据?",
|
||||
1: "确定删除 1 条数据?"
|
||||
}
|
||||
},
|
||||
error: {
|
||||
system: "发生了一系统错误,(更多信息)"
|
||||
},
|
||||
datetime: {
|
||||
previous: '前一月',
|
||||
next: '下一月',
|
||||
months: [ '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月' ],
|
||||
weekdays: [ '星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六' ]
|
||||
}
|
||||
},
|
||||
ajax: "/data/editor/save?table_name={{ stockWeb.table_name }}",
|
||||
table: "#dynamic-table",
|
||||
fields: [
|
||||
{% for index,element in enumerate(stockWeb.columns) %}
|
||||
{
|
||||
label: "{{ stockWeb.column_names[index] }}:",
|
||||
name: "{{ element }}"
|
||||
{% if element == "date" %} ,type: "datetime" {% end %}
|
||||
},{% end %}
|
||||
]
|
||||
} );
|
||||
|
||||
var nameParam = $.getUrlVar('table_name');
|
||||
//console.log(nameParam);
|
||||
var myTable = $('#dynamic-table').DataTable( {
|
||||
"dom": "Bfrtip",
|
||||
"bFilter": true,
|
||||
"ordering": true,
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"lengthMenu": [[20, 30, 50, 100,1000, -1], [20, 30, 50, 100,1000, "All"]],
|
||||
"language": {
|
||||
"url": "/static/js/datatables.Chinese.json"
|
||||
},
|
||||
"ajax": "/api/v1/api_data?type=editor&name="+nameParam,
|
||||
"columns": [
|
||||
{
|
||||
"data": "",
|
||||
"defaultContent": "",
|
||||
"className": 'select-checkbox',
|
||||
"orderable": true
|
||||
},
|
||||
{% for column in stockWeb.columns %}
|
||||
{ "data": "{{ column }}" },
|
||||
{% end %}
|
||||
],
|
||||
select: {
|
||||
style: 'os',
|
||||
selector: 'td:first-child'
|
||||
},
|
||||
buttons: [
|
||||
{ extend: "create", editor: editor, text: '新增' },
|
||||
{ extend: "edit", editor: editor, text: '编辑' },
|
||||
{ extend: "remove", editor: editor, text: '删除' }
|
||||
]
|
||||
} );
|
||||
|
||||
$('input.column_filter').on( 'keyup click', function () {
|
||||
var i = $(this).parents('div').attr('data-column') ;
|
||||
//console.log(i,"val:",$(this).val());
|
||||
myTable.column(i).search(
|
||||
$(this).val()
|
||||
).draw();
|
||||
});
|
||||
|
||||
$.fn.dataTable.Buttons.defaults.dom.container.className = 'dt-buttons btn-overlap btn-group btn-overlap';
|
||||
|
||||
new $.fn.dataTable.Buttons( myTable, {
|
||||
buttons: [
|
||||
{
|
||||
"extend": "copy",
|
||||
"text": "<i class='fa fa-copy bigger-110 pink'></i> <span class='hidden'>Copy to clipboard</span>",
|
||||
"className": "btn btn-white btn-primary btn-bold"
|
||||
},
|
||||
{
|
||||
"extend": "csv",
|
||||
"text": "<i class='fa fa-database bigger-110 orange'></i> <span class='hidden'>Export to CSV</span>",
|
||||
"className": "btn btn-white btn-primary btn-bold"
|
||||
},
|
||||
{
|
||||
"extend": "print",
|
||||
"text": "<i class='fa fa-print bigger-110 grey'></i> <span class='hidden'>Print</span>",
|
||||
"className": "btn btn-white btn-primary btn-bold",
|
||||
autoPrint: false,
|
||||
message: 'This print was produced using the Print button for DataTables'
|
||||
}
|
||||
]
|
||||
} );
|
||||
myTable.buttons().container().appendTo( $('.tableTools-container') );
|
||||
})
|
||||
</script>
|
||||
{% end %}
|
||||
@@ -0,0 +1,56 @@
|
||||
{% extends "layout/default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<h3 class="header smaller lighter blue">开源Python全栈股票系统,数据抓取、统计分析、报表展示。</h3>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-left tableTools-container">
|
||||
<h3>基础库版本</h3>
|
||||
<p>1,pandas使用【 {{ pandasVersion }} 】版本, <a href="https://www.pypandas.cn/docs/" target="_blank">中文文档</a> </p>
|
||||
<p>2,numpy使用【 {{ numpyVersion }} 】版本, <a href="https://www.numpy.org.cn/user/" target="_blank">中文文档</a></p>
|
||||
<p>3,akshare使用【 {{ akshareVersion }} 】版本, <a href="https://www.akshare.xyz/" target="_blank">中文文档</a></p>
|
||||
<p>4,bokeh使用【 {{ bokehVersion }} 】版本, <a href="http://docs.bokeh.org/en/latest/" target="_blank">官方文档</a></p>
|
||||
<p>5,stockstats使用【 {{ stockstatsVersion }} 】版本, <a href="https://github.com/jealous/stockstats/" target="_blank">官方文档</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-left tableTools-container">
|
||||
<h3>相关资料信息</h3>
|
||||
<p>1,github项目地址。<a href="https://github.com/pythonstock/stock" target="_blank">pythonstock</a></p>
|
||||
<p>2,博客地址。<a href="https://blog.csdn.net/freewebsys/category_9285317.html" target="_blank">博客地址</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-left tableTools-container">
|
||||
<h3>2021年9月20日更新,发布2.0版本</h3>
|
||||
<p>1,修复bokeh的版本升级问题,可以显示趋势数据了。</p>
|
||||
<p>2,使用 stock_zh_ah_name 做每日数据。</p>
|
||||
<p>3,AkShare 升级到 1.1.9 版本。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-left tableTools-container">
|
||||
<h3>2021年8月31日更新job服务</h3>
|
||||
<p>1,过滤包括:600,6006,601,000,001,002,且不包括ST的股票数据。。</p>
|
||||
<p>2,使用 stock_zh_ah_name 做每日数据。</p>
|
||||
<p>3,AkShare 升级到 1.0.80 版本。</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-left tableTools-container">
|
||||
<h3>2021年6月3日使用 AkShare 做数据抓取服务</h3>
|
||||
<p>1,使用 stock_zh_a_spot 做实时行情数据。</p>
|
||||
<p>2,使用 stock_zh_a_daily 做历史数据统计。</p>
|
||||
<p>3,升级基础镜像使用python3.7,AkShare 的 0.9.65 版本。</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% end %}
|
||||
@@ -0,0 +1,6 @@
|
||||
{% extends "../common/meta.html" %}
|
||||
{% extends "../common/header.html" %}
|
||||
{% extends "../common/footer.html" %}
|
||||
{% extends "../common/left_menu.html" %}
|
||||
|
||||
{% extends "main.html" %}
|
||||
@@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta charset="utf-8" />
|
||||
<title>股票系统</title>
|
||||
{% block meta %}{% end %}
|
||||
</head>
|
||||
|
||||
<body class="no-skin">
|
||||
<div class="main-content">
|
||||
<div class="main-content-inner">
|
||||
<div class="page-content">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{% block main_content %}{% end %}
|
||||
</div>
|
||||
</div><!-- /.row -->
|
||||
</div><!-- /.page-content -->
|
||||
</div>
|
||||
</div><!-- /.main-content -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,3 @@
|
||||
{% extends "../common/meta.html" %}
|
||||
|
||||
{% extends "indicators-main.html" %}
|
||||
@@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta charset="utf-8" />
|
||||
<title>股票系统 {{ pythonStockVersion }}</title>
|
||||
{% block meta %}{% end %}
|
||||
</head>
|
||||
|
||||
<body class="no-skin">
|
||||
|
||||
{% block header %}{% end %}
|
||||
|
||||
<div class="main-container ace-save-state" id="main-container">
|
||||
<script type="text/javascript">
|
||||
try{ace.settings.loadState('main-container')}catch(e){}
|
||||
</script>
|
||||
|
||||
{% block left_menu %}{% end %}
|
||||
|
||||
<div class="main-content">
|
||||
<div class="main-content-inner">
|
||||
<div class="page-content">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{% block main_content %}{% end %}
|
||||
</div>
|
||||
</div><!-- /.row -->
|
||||
</div><!-- /.page-content -->
|
||||
</div>
|
||||
</div><!-- /.main-content -->
|
||||
|
||||
<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
|
||||
<i class="ace-icon fa fa-angle-double-up icon-only bigger-110"></i>
|
||||
</a>
|
||||
</div><!-- /.main-container -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,5 @@
|
||||
{% extends "../common/meta.html" %}
|
||||
{% extends "../common/header.html" %}
|
||||
{% extends "../common/footer.html" %}
|
||||
|
||||
{% extends "single_main.html" %}
|
||||
@@ -0,0 +1,29 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta charset="utf-8" />
|
||||
{% block meta %}{% end %}
|
||||
</head>
|
||||
|
||||
<body class="no-skin">
|
||||
|
||||
<div class="main-container ace-save-state" id="main-container">
|
||||
<div class="main-content">
|
||||
<div class="main-content-inner">
|
||||
<div class="page-content">
|
||||
<div class="row">
|
||||
<div class="col-xs-12">
|
||||
{% block main_content %}{% end %}
|
||||
</div>
|
||||
</div><!-- /.row -->
|
||||
</div><!-- /.page-content -->
|
||||
</div>
|
||||
</div><!-- /.main-content -->
|
||||
|
||||
<a href="#" id="btn-scroll-up" class="btn-scroll-up btn btn-sm btn-inverse">
|
||||
<i class="ace-icon fa fa-angle-double-up icon-only bigger-110"></i>
|
||||
</a>
|
||||
</div><!-- /.main-container -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,80 @@
|
||||
{% extends "layout/single_default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
|
||||
<h3 class="header smaller lighter blue">手写图片识别演示</h3>
|
||||
|
||||
<div class="row clearfix">
|
||||
<div class="col-md-6 column">
|
||||
<canvas id="the_stage" width="280" height="280">your browser don't support canvas!</canvas>
|
||||
<div>
|
||||
<button type="button" class="btn btn-default butt" onclick="clearCanvas()"><strong>删除</strong></button>
|
||||
<button type="button" class="btn btn-default butt" id="recognize" onclick="processImg()"><strong>识别</strong></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 column">
|
||||
<h3>result:</h3>
|
||||
<h2 id="rec_result"></h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3 class="header smaller lighter blue">测试图片识别演示</h3>
|
||||
<div class="row clearfix" style="width:400px;">
|
||||
{% for image in image_array %}
|
||||
<div class="col-md-2" style="margin-top: 15px;">
|
||||
<img src="{{ image }}" alt="" width="50" class="minst_img" height="50" style="1px solid #e1e4e5;cursor: pointer;">
|
||||
</div>
|
||||
{% end %}
|
||||
</div>
|
||||
<div class="col-md-6 column">
|
||||
<h3>结果:</h3>
|
||||
<h2 id="prediction_text">"-1"</h2>
|
||||
</div>
|
||||
<!-- inline scripts related to this page -->
|
||||
<script src="/static/js/mnist-draw.js"></script>
|
||||
<style>
|
||||
#the_stage {
|
||||
border: 1px solid #999;
|
||||
border-radius: 4px;
|
||||
box-shadow: -10px 10px 5px #888888;
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript">
|
||||
jQuery(function($) {
|
||||
$("#recognize").click(
|
||||
//提交数据
|
||||
function () {
|
||||
$("#rec_result").html("connecting...");
|
||||
var scribbler = document.getElementById ("the_stage");
|
||||
var imageData = scribbler.toDataURL('image/png');
|
||||
var dataTemp = imageData.substr(22);
|
||||
|
||||
var sendPackage = {"id": "1", "txt": dataTemp};
|
||||
$.post("/minst_serving/prediction2", sendPackage, function(msg){
|
||||
$("#rec_result").html(msg);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
$(".minst_img").click(
|
||||
//提交数据
|
||||
function () {
|
||||
img_url = $(this).attr("src")
|
||||
console.log("here",);
|
||||
//
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "/minst_serving/prediction",
|
||||
data: "img_url="+img_url,
|
||||
success: function(msg){
|
||||
console.log( "prediction : " + msg );
|
||||
$("#prediction_text").html(msg);
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
});
|
||||
</script>
|
||||
{% end %}
|
||||
@@ -0,0 +1,12 @@
|
||||
{% extends "layout/default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<h3 class="header smaller lighter blue">欢迎使用股票系统。</h3>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-right tableTools-container"></div>
|
||||
<img src="/stock/chart/image1" />
|
||||
</div>
|
||||
{% end %}
|
||||
@@ -0,0 +1,32 @@
|
||||
{% extends "layout/indicators.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<!-- 增加 bokeh 样式。-->
|
||||
<link rel="stylesheet" href="/static/css/bokeh.min.css" type="text/css"/>
|
||||
<link rel="stylesheet" href="/static/css/bokeh-widgets.min.css" type="text/css"/>
|
||||
<link rel="stylesheet" href="/static/css/bokeh-tables.min.css" type="text/css"/>
|
||||
|
||||
<script type="text/javascript" src="/static/js/bokeh.min.js"></script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-widgets.min.js"></script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-tables.min.js"></script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-api.min.js"></script>
|
||||
<script type="text/javascript" src="/static/js/bokeh-gl.min.js"></script>
|
||||
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
Bokeh.set_log_level("info");
|
||||
</script>
|
||||
|
||||
{% for index,element in enumerate(comp_list) %}
|
||||
<h4 class="header smaller lighter blue">{{ element["title"] }}</h4>
|
||||
<div class="row">{{ element["desc"] }}</div>
|
||||
<div class="row" id="_col_{{ index+1 }}" data-column="{{ index }}">
|
||||
{% raw element["div"] %}
|
||||
{% raw element["script"] %}
|
||||
</div>
|
||||
{% end %}
|
||||
|
||||
{% end %}
|
||||
@@ -0,0 +1,175 @@
|
||||
{% extends "layout/default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<h3 class="header smaller lighter blue">{{ stockWeb.name }}</h3>
|
||||
<div class="table-header">{{ stockWeb.name }}</div>
|
||||
|
||||
<div class="row"> </div>
|
||||
<div class="row">
|
||||
{% for index,element in enumerate(stockWeb.columns) %}
|
||||
{% if index < 15 %}
|
||||
{% if element != 'eastmoney_url' %}
|
||||
<div class="col-md-4" id="filter_col{{ index+1 }}" data-column="{{ index }}">
|
||||
{{ stockWeb.column_names[index] }}
|
||||
<!-- Column - {{ stockWeb.column_names[index] }} - {{ element }} -->
|
||||
|
||||
<input type="text" class="column_filter input-group-sm form-control {% if element == 'date' %}date-picker{% end %}"
|
||||
{% if element == 'date' %} value="{{ date_now }}" {% end %}
|
||||
id="col{{ index }}_filter">
|
||||
</div>
|
||||
{% end %}
|
||||
{% end %}{% end %}
|
||||
</div>
|
||||
|
||||
<table cellpadding="3" cellspacing="0" border="0" style="width: 67%; margin: 0 auto 2em auto;">
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- div.table-responsive -->
|
||||
<!-- div.dataTables_borderWrap -->
|
||||
<div>
|
||||
<div class="pull-right tableTools-container"></div>
|
||||
<table id="dynamic-table" class="table table-striped table-bordered table-hover">
|
||||
<thead>
|
||||
<tr>{% for column_name in stockWeb.column_names %}
|
||||
<th>{{ column_name }}</th>
|
||||
{% end %}
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- 定义一个窗口的Div 东方财富股票数据页面 -->
|
||||
<div id="dfcf-window-modal" class="modal fade">
|
||||
<div class="modal-dialog" style="width:1095px;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 class="smaller lighter blue no-margin">东方财富分析</h3>
|
||||
</div>
|
||||
<div class="modal-body" id="dfcf-iframe-body" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 定义一个窗口的Div 指标分析数据页面 -->
|
||||
<div id="indicators-window-modal" class="modal fade">
|
||||
<div class="modal-dialog" style="width:1050px;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 class="smaller lighter blue no-margin">股票数据详细指标分析</h3>
|
||||
</div>
|
||||
<div class="modal-body" id="indicators-window-body" >
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- inline scripts related to this page -->
|
||||
<script type="text/javascript">
|
||||
|
||||
//每次动态加载 指标分析窗口
|
||||
function showIndicatorsWindow(code) {
|
||||
var baseUrl = '/api/v1/data/indicators?code='+code; // 没有跨域问题,直接加载
|
||||
$('#indicators-window-body').html( "<h5>数据加载中...请稍候.</h5>" );
|
||||
$('#indicators-window-body').context = $("#indicators-window-body").load(baseUrl);
|
||||
$('#indicators-window-modal').modal('show');
|
||||
}
|
||||
|
||||
//每次动态加载 东方财富窗口
|
||||
function showDFCFWindow(code) {
|
||||
|
||||
var iframe = document.createElement('iframe')
|
||||
// var baseUrl = 'https://emweb.eastmoney.com/PC_HSF10/ShareholderResearch/Index?type=soft&code='+code;
|
||||
var baseUrl = 'https://emweb.eastmoney.com/PC_HSF10/OperationsRequired/Index?type=soft&code='+code;
|
||||
iframe.src = baseUrl;
|
||||
iframe.width = '1060px';
|
||||
iframe.height = '700px';
|
||||
iframe.frameborder = '0';
|
||||
$('#dfcf-iframe-body').empty(); // 先清空数据
|
||||
document.getElementById("dfcf-iframe-body").appendChild(iframe)
|
||||
$('#dfcf-window-modal').modal('show');
|
||||
}
|
||||
|
||||
jQuery(function($) {
|
||||
|
||||
|
||||
$( ".date-picker" ).datepicker({
|
||||
language: 'zh-CN', //设置语言
|
||||
format:"yyyymmdd",
|
||||
showOtherMonths: true,
|
||||
selectOtherMonths: false,
|
||||
autoclose: true,
|
||||
todayHighlight: true,
|
||||
onSelect: function(selected,evnt) {
|
||||
console.log(selected);
|
||||
}
|
||||
}).on('changeDate', function(ev){
|
||||
$('input.column_filter').click();//触发搜索
|
||||
});
|
||||
|
||||
|
||||
var nameParam = $.getUrlVar('table_name');
|
||||
//console.log(nameParam);
|
||||
var myTable = $('#dynamic-table').DataTable( {
|
||||
"select": true,
|
||||
"bFilter": true,
|
||||
"ordering": true,
|
||||
"processing": true,
|
||||
"serverSide": true,
|
||||
"lengthMenu": [[20, 30, 50, 100,1000, -1], [20, 30, 50, 100,1000, "All"]],
|
||||
"language": {
|
||||
"url": "/static/js/datatables.Chinese.json"
|
||||
},
|
||||
"ajax": "/api/v1/api_data?name="+nameParam,
|
||||
"columns": [
|
||||
{% for column in stockWeb.columns %}
|
||||
{ "data": "{{ column }}" },
|
||||
{% end %}
|
||||
]
|
||||
} );
|
||||
|
||||
$('input.column_filter').on( 'keyup click', function () {
|
||||
var i = $(this).parents('div').attr('data-column') ;
|
||||
//console.log(i,"val:",$(this).val());
|
||||
myTable.column(i).search(
|
||||
$(this).val()
|
||||
).draw();
|
||||
});
|
||||
|
||||
$('input.column_filter').click();//第一次点击执行,读取时间信息。
|
||||
|
||||
$.fn.dataTable.Buttons.defaults.dom.container.className = 'dt-buttons btn-overlap btn-group btn-overlap';
|
||||
|
||||
new $.fn.dataTable.Buttons( myTable, {
|
||||
buttons: [
|
||||
{
|
||||
"extend": "copy",
|
||||
"text": "<i class='fa fa-copy bigger-110 pink'></i> <span class='hidden'>Copy to clipboard</span>",
|
||||
"className": "btn btn-white btn-primary btn-bold"
|
||||
},
|
||||
{
|
||||
"extend": "csv",
|
||||
"text": "<i class='fa fa-database bigger-110 orange'></i> <span class='hidden'>Export to CSV</span>",
|
||||
"className": "btn btn-white btn-primary btn-bold"
|
||||
},
|
||||
{
|
||||
"extend": "print",
|
||||
"text": "<i class='fa fa-print bigger-110 grey'></i> <span class='hidden'>Print</span>",
|
||||
"className": "btn btn-white btn-primary btn-bold",
|
||||
autoPrint: false,
|
||||
message: 'This print was produced using the Print button for DataTables'
|
||||
}
|
||||
]
|
||||
} );
|
||||
myTable.buttons().container().appendTo( $('.tableTools-container') );
|
||||
|
||||
})
|
||||
</script>
|
||||
{% end %}
|
||||
@@ -0,0 +1,52 @@
|
||||
{% extends "layout/default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<h3 class="header smaller lighter blue">欢迎使用股票系统。</h3>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-right tableTools-container"></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-1">
|
||||
<button onclick="showDFCFWindow('SZ000001');" role="button" class="btn btn-sm btn-primary" data-toggle="modal">
|
||||
<i class="ace-icon fa fa-plus"></i>
|
||||
测试弹窗东方财富窗口
|
||||
</button>
|
||||
</div><!-- /.col -->
|
||||
|
||||
<!--<iframe src="https://emweb.eastmoney.com/PC_HSF10/ShareholderResearch/Index?type=soft&code=SZ000001" width="700px" height="700px"></iframe>-->
|
||||
|
||||
<!-- 定义一个窗口的Div 东方财富股票数据页面 -->
|
||||
<div id="dfcf-window-modal" class="modal fade">
|
||||
<div class="modal-dialog" style="width:1010px;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 class="smaller lighter blue no-margin">东方财富分析</h3>
|
||||
</div>
|
||||
<div class="modal-body" id="dfcf-iframe-body" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
//每次动态加载 东方财富窗口
|
||||
function showDFCFWindow(code) {
|
||||
|
||||
var iframe = document.createElement('iframe')
|
||||
var baseUrl = 'https://emweb.eastmoney.com/PC_HSF10/ShareholderResearch/Index?type=soft&code='+code;
|
||||
// var baseUrl = 'https://emweb.eastmoney.com/PC_HSF10/OperationsRequired/Index?type=soft&code=';
|
||||
iframe.src = baseUrl;
|
||||
iframe.width = '980px';
|
||||
iframe.height = '700px';
|
||||
iframe.frameborder = '0';
|
||||
$('#iframe-body').empty(); // 先清空数据
|
||||
document.getElementById("dfcf-iframe-body").appendChild(iframe)
|
||||
$('#dfcf-window-modal').modal('show');
|
||||
}
|
||||
</script>
|
||||
|
||||
{% end %}
|
||||
@@ -0,0 +1,44 @@
|
||||
{% extends "layout/default.html" %}
|
||||
|
||||
|
||||
{% block main_content %}
|
||||
|
||||
<h3 class="header smaller lighter blue">欢迎使用股票系统。</h3>
|
||||
|
||||
<div class="clearfix">
|
||||
<div class="pull-right tableTools-container"></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-1">
|
||||
<button onclick="showIndicatorsWindow('000001');" role="button" class="btn btn-sm btn-primary" data-toggle="modal">
|
||||
<i class="ace-icon fa fa-plus"></i>
|
||||
测试弹窗指标分析窗口
|
||||
</button>
|
||||
</div><!-- /.col -->
|
||||
|
||||
<!--<iframe src="https://emweb.eastmoney.com/PC_HSF10/ShareholderResearch/Index?type=soft&code=SZ000001" width="700px" height="700px"></iframe>-->
|
||||
|
||||
<!-- 定义一个窗口的Div 指标分析数据页面 -->
|
||||
<div id="indicators-window-modal" class="modal fade">
|
||||
<div class="modal-dialog" style="width:1050px;">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||
<h3 class="smaller lighter blue no-margin">股票数据详细指标分析</h3>
|
||||
</div>
|
||||
<div class="modal-body" id="indicators-window-body" >
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
//每次动态加载 指标分析窗口
|
||||
function showIndicatorsWindow(code) {
|
||||
var baseUrl = '/data/indicators?code='+code; // 没有跨域问题,直接加载
|
||||
$('#indicators-window-body').context = $("#indicators-window-body").load(baseUrl);
|
||||
$('#indicators-window-modal').modal('show');
|
||||
}
|
||||
</script>
|
||||
|
||||
{% end %}
|
||||
@@ -0,0 +1,104 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import time
|
||||
from tornado.httpserver import HTTPServer
|
||||
from tornado.ioloop import IOLoop
|
||||
from tornado.web import Application, asynchronous, RequestHandler
|
||||
from multiprocessing.pool import ThreadPool
|
||||
from multiprocessing.pool import ApplyResult
|
||||
from tornado import gen
|
||||
|
||||
# https://gist.github.com/methane/2185380 参考
|
||||
|
||||
|
||||
|
||||
html_content = """
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>任务测试</h1></br>
|
||||
<button id="job">开始</button>
|
||||
</body>
|
||||
</html>
|
||||
<script type="text/javascript">
|
||||
function job_check(timer,tid) {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "job_check?tid="+tid,
|
||||
success: function(msg){
|
||||
console.log(msg);
|
||||
if(msg != ""){
|
||||
alert( "任务结果: " + msg );
|
||||
clearInterval(timer);//结束轮询
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
jQuery(function($) {
|
||||
|
||||
$("#job").click( function () {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "add_job",
|
||||
success: function(tid){
|
||||
alert( "开始任务: " + tid );
|
||||
timer = setInterval(function(){
|
||||
console.log("run.");
|
||||
job_check(timer,tid);
|
||||
},1000);
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
</script>
|
||||
"""
|
||||
|
||||
|
||||
class MainPage(RequestHandler):
|
||||
def get(self):
|
||||
self.write(html_content)
|
||||
|
||||
|
||||
_workers = ThreadPool(10)
|
||||
_result = {}
|
||||
|
||||
|
||||
# 后台任务。
|
||||
def blocking_task(n, tid):
|
||||
time.sleep(n)
|
||||
print(tid)
|
||||
_result[tid] = {"finish"}
|
||||
|
||||
|
||||
class AddJobHandler(RequestHandler):
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
tid = str(int(time.time() * 10000))
|
||||
_workers.apply_async(blocking_task, (10, tid)) # 传递参数 10 秒。
|
||||
self.write(tid)
|
||||
self.finish() # 先finish 掉,然后在后台执行。
|
||||
|
||||
|
||||
class JobCheckHandler(RequestHandler):
|
||||
def get(self):
|
||||
tid = self.get_argument("tid")
|
||||
if tid in _result.keys():
|
||||
out = _result[tid] # 结果
|
||||
del _result[tid] # 删除tid的数据。
|
||||
self.write(str(out))
|
||||
else:
|
||||
self.write("")
|
||||
|
||||
|
||||
# main 启动。
|
||||
if __name__ == "__main__":
|
||||
HTTPServer(Application([
|
||||
("/", MainPage),
|
||||
("/add_job", AddJobHandler),
|
||||
("/job_check", JobCheckHandler)
|
||||
], debug=True)).listen(9090)
|
||||
print("start web .")
|
||||
IOLoop.instance().start()
|
||||
@@ -0,0 +1,104 @@
|
||||
#!/usr/local/bin/python3
|
||||
# -*- coding: utf-8 -*-
|
||||
import time
|
||||
from tornado.httpserver import HTTPServer
|
||||
from tornado.ioloop import IOLoop
|
||||
from tornado.web import Application, asynchronous, RequestHandler
|
||||
from tornado import gen
|
||||
from tornado.concurrent import run_on_executor
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
|
||||
# `pip install futures` for python2
|
||||
|
||||
# https://gist.github.com/methane/2185380 参考
|
||||
|
||||
html_content = """
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>任务测试</h1></br>
|
||||
<button id="job">开始</button>
|
||||
</body>
|
||||
</html>
|
||||
<script type="text/javascript">
|
||||
function job_check(timer,tid) {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "job_check?tid="+tid,
|
||||
success: function(msg){
|
||||
console.log(msg);
|
||||
if(msg != ""){
|
||||
alert( "任务结果: " + msg );
|
||||
clearInterval(timer);//结束轮询
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
jQuery(function($) {
|
||||
|
||||
$("#job").click( function () {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: "add_job",
|
||||
success: function(tid){
|
||||
alert( "开始任务: " + tid );
|
||||
timer = setInterval(function(){
|
||||
console.log("run.");
|
||||
job_check(timer,tid);
|
||||
},1000);
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
</script>
|
||||
"""
|
||||
|
||||
|
||||
class MainPage(RequestHandler):
|
||||
def get(self):
|
||||
self.write(html_content)
|
||||
|
||||
|
||||
MAX_WORKERS = 4
|
||||
_result = {}
|
||||
|
||||
|
||||
class AddJobHandler(RequestHandler):
|
||||
# 必须定义一个executor的属性,然后run_on_executor 注解才管用。
|
||||
executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
|
||||
|
||||
@run_on_executor # 标记成后台程序执行。
|
||||
def background_task(self, tid):
|
||||
time.sleep(10) # 传递参数 10 秒。
|
||||
_result[tid] = {"finish"}
|
||||
|
||||
@gen.coroutine
|
||||
def get(self):
|
||||
tid = str(int(time.time() * 10000))
|
||||
self.background_task(tid)
|
||||
self.write(tid)
|
||||
|
||||
|
||||
class JobCheckHandler(RequestHandler):
|
||||
def get(self):
|
||||
tid = self.get_argument("tid")
|
||||
if tid in _result.keys():
|
||||
out = _result[tid] # 结果
|
||||
del _result[tid] # 删除tid的数据。
|
||||
self.write(str(out))
|
||||
else:
|
||||
self.write("")
|
||||
|
||||
|
||||
# main 启动。
|
||||
if __name__ == "__main__":
|
||||
HTTPServer(Application([
|
||||
("/", MainPage),
|
||||
("/add_job", AddJobHandler),
|
||||
("/job_check", JobCheckHandler)
|
||||
], debug=True)).listen(9999)
|
||||
print("start web .")
|
||||
IOLoop.instance().start()
|
||||
@@ -0,0 +1,70 @@
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
from tornado.web import RequestHandler
|
||||
|
||||
from bokeh.application import Application
|
||||
from bokeh.application.handlers import FunctionHandler
|
||||
from bokeh.embed import server_document
|
||||
from bokeh.layouts import column
|
||||
from bokeh.models import ColumnDataSource, Slider
|
||||
from bokeh.plotting import figure
|
||||
from bokeh.server.server import Server
|
||||
from bokeh.themes import Theme
|
||||
|
||||
from bokeh.sampledata.sea_surface_temperature import sea_surface_temperature
|
||||
|
||||
env = Environment(loader=FileSystemLoader('templates'))
|
||||
server_url = "http://localhost:9090/"
|
||||
|
||||
|
||||
class IndexHandler(RequestHandler):
|
||||
def get(self):
|
||||
print("index ...")
|
||||
template = env.get_template('bokeh_embed.html')
|
||||
script = server_document(server_url + 'bkapp')
|
||||
print(script)
|
||||
self.write(template.render(script=script, template="Tornado"))
|
||||
# self.write(html_content)
|
||||
|
||||
|
||||
def modify_doc(doc):
|
||||
df = sea_surface_temperature.copy()
|
||||
source = ColumnDataSource(data=df)
|
||||
|
||||
plot = figure(x_axis_type='datetime', y_range=(0, 25), y_axis_label='Temperature (Celsius)',
|
||||
title="Sea Surface Temperature at 43.18, -70.43")
|
||||
plot.line('time', 'temperature', source=source)
|
||||
|
||||
def callback(attr, old, new):
|
||||
if new == 0:
|
||||
data = df
|
||||
else:
|
||||
data = df.rolling('{0}D'.format(new)).mean()
|
||||
source.data = ColumnDataSource(data=data).data
|
||||
|
||||
slider = Slider(start=0, end=30, value=0, step=1, title="Smoothing by N Days")
|
||||
slider.on_change('value', callback)
|
||||
|
||||
doc.add_root(column(slider, plot))
|
||||
|
||||
# doc.theme = Theme(filename="theme.yaml")
|
||||
|
||||
|
||||
bokeh_app = Application(FunctionHandler(modify_doc))
|
||||
|
||||
# Setting num_procs here means we can't touch the IOLoop before now, we must
|
||||
# let Server handle that. If you need to explicitly handle IOLoops then you
|
||||
# will need to use the lower level BaseServer class.
|
||||
server = Server(
|
||||
{'/bkapp': bokeh_app}, num_procs=1, port=9999,
|
||||
extra_patterns=[('/', IndexHandler)]
|
||||
)
|
||||
server.start()
|
||||
|
||||
if __name__ == '__main__':
|
||||
from bokeh.util.browser import view
|
||||
|
||||
print('Opening Tornado app with embedded Bokeh application on ' + server_url)
|
||||
|
||||
server.io_loop.add_callback(view, server_url)
|
||||
server.io_loop.start()
|
||||
Reference in New Issue
Block a user