[AIRFLOW-3303] Deprecate old UI in favor of FAB (#4339)
This commit is contained in:
Родитель
08eba5241c
Коммит
c030729dcb
|
@ -22,4 +22,4 @@ omit =
|
|||
scripts/*
|
||||
dev/*
|
||||
airflow/migrations/*
|
||||
airflow/www_rbac/node_modules/**
|
||||
airflow/www/node_modules/**
|
||||
|
|
|
@ -355,9 +355,9 @@ $ alembic revision -m "add new field to db"
|
|||
~/airflow/airflow/migrations/versions/12341123_add_new_field_to_db.py
|
||||
```
|
||||
|
||||
## Setting up the node / npm javascript environment (ONLY FOR www_rbac)
|
||||
## Setting up the node / npm javascript environment
|
||||
|
||||
`airflow/www_rbac/` contains all npm-managed, front end assets.
|
||||
`airflow/www/` contains all npm-managed, front end assets.
|
||||
Flask-Appbuilder itself comes bundled with jQuery and bootstrap.
|
||||
While these may be phased out over time, these packages are currently not
|
||||
managed with npm.
|
||||
|
@ -389,12 +389,12 @@ export PATH="$HOME/.npm-packages/bin:$PATH"
|
|||
#### npm packages
|
||||
|
||||
To install third party libraries defined in `package.json`, run the
|
||||
following within the `airflow/www_rbac/` directory which will install them in a
|
||||
new `node_modules/` folder within `www_rbac/`.
|
||||
following within the `airflow/www/` directory which will install them in a
|
||||
new `node_modules/` folder within `www/`.
|
||||
|
||||
```bash
|
||||
# from the root of the repository, move to where our JS package.json lives
|
||||
cd airflow/www_rbac/
|
||||
cd airflow/www/
|
||||
# run npm install to fetch all the dependencies
|
||||
npm install
|
||||
```
|
||||
|
|
10
MANIFEST.in
10
MANIFEST.in
|
@ -21,14 +21,12 @@ include LICENSE
|
|||
include CHANGELOG.txt
|
||||
include README.md
|
||||
graft licenses/
|
||||
graft airflow/www/templates
|
||||
graft airflow/www
|
||||
graft airflow/www/static
|
||||
graft airflow/www_rbac
|
||||
graft airflow/www_rbac/static
|
||||
graft airflow/www_rbac/templates
|
||||
graft airflow/www_rbac/translations
|
||||
graft airflow/www/templates
|
||||
graft airflow/www/translations
|
||||
include airflow/alembic.ini
|
||||
graft scripts/systemd
|
||||
graft scripts/upstart
|
||||
graft airflow/config_templates
|
||||
recursive-exclude airflow/www_rbac/node_modules *
|
||||
recursive-exclude airflow/www/node_modules *
|
||||
|
|
|
@ -24,6 +24,13 @@ assists users migrating to a new version.
|
|||
|
||||
## Airflow Master
|
||||
|
||||
### Deprecate legacy UI in favor of FAB RBAC UI
|
||||
Previously we were using two versions of UI, which were hard to maintain as we need to implement/update the same feature
|
||||
in both versions. With this change we've removed the older UI in favor of Flask App Builder RBAC UI. No need to set the
|
||||
RBAC UI explicitly in the configuration now as this is the only default UI.
|
||||
Please note that that custom auth backends will need re-writing to target new FAB based UI.
|
||||
|
||||
|
||||
#### SLUGIFY_USES_TEXT_UNIDECODE or AIRFLOW_GPL_UNIDECODE no longer required
|
||||
|
||||
It is no longer required to set one of the environment variables to avoid
|
||||
|
|
|
@ -63,10 +63,7 @@ from airflow.utils import cli as cli_utils, db
|
|||
from airflow.utils.net import get_hostname
|
||||
from airflow.utils.log.logging_mixin import (LoggingMixin, redirect_stderr,
|
||||
redirect_stdout)
|
||||
from airflow.www.app import (cached_app, create_app)
|
||||
from airflow.www_rbac.app import cached_app as cached_app_rbac
|
||||
from airflow.www_rbac.app import create_app as create_app_rbac
|
||||
from airflow.www_rbac.app import cached_appbuilder
|
||||
from airflow.www.app import cached_app, create_app, cached_appbuilder
|
||||
|
||||
from sqlalchemy.orm import exc
|
||||
|
||||
|
@ -842,16 +839,13 @@ def webserver(args):
|
|||
print(
|
||||
"Starting the web server on port {0} and host {1}.".format(
|
||||
args.port, args.hostname))
|
||||
if settings.RBAC:
|
||||
app, _ = create_app_rbac(conf, testing=conf.get('core', 'unit_test_mode'))
|
||||
else:
|
||||
app = create_app(conf, testing=conf.get('core', 'unit_test_mode'))
|
||||
app, _ = create_app(conf, testing=conf.get('core', 'unit_test_mode'))
|
||||
app.run(debug=True, use_reloader=False if app.config['TESTING'] else True,
|
||||
port=args.port, host=args.hostname,
|
||||
ssl_context=(ssl_cert, ssl_key) if ssl_cert and ssl_key else None)
|
||||
else:
|
||||
os.environ['SKIP_DAGS_PARSING'] = 'True'
|
||||
app = cached_app_rbac(conf) if settings.RBAC else cached_app(conf)
|
||||
app = cached_app(conf)
|
||||
pid, stdout, stderr, log_file = setup_locations(
|
||||
"webserver", args.pid, args.stdout, args.stderr, args.log_file)
|
||||
os.environ.pop('SKIP_DAGS_PARSING')
|
||||
|
@ -878,7 +872,6 @@ def webserver(args):
|
|||
'-b', args.hostname + ':' + str(args.port),
|
||||
'-n', 'airflow-webserver',
|
||||
'-p', str(pid),
|
||||
'-c', 'python:airflow.www.gunicorn_config',
|
||||
]
|
||||
|
||||
if args.access_logfile:
|
||||
|
@ -893,7 +886,7 @@ def webserver(args):
|
|||
if ssl_cert:
|
||||
run_args += ['--certfile', ssl_cert, '--keyfile', ssl_key]
|
||||
|
||||
webserver_module = 'www_rbac' if settings.RBAC else 'www'
|
||||
webserver_module = 'www'
|
||||
run_args += ["airflow." + webserver_module + ".app:cached_app()"]
|
||||
|
||||
gunicorn_master_proc = None
|
||||
|
@ -1078,7 +1071,7 @@ def worker(args):
|
|||
|
||||
def initdb(args):
|
||||
print("DB: " + repr(settings.engine.url))
|
||||
db.initdb(settings.RBAC)
|
||||
db.initdb()
|
||||
print("Done.")
|
||||
|
||||
|
||||
|
@ -1087,7 +1080,7 @@ def resetdb(args):
|
|||
if args.yes or input("This will drop existing tables "
|
||||
"if they exist. Proceed? "
|
||||
"(y/n)").upper() == "Y":
|
||||
db.resetdb(settings.RBAC)
|
||||
db.resetdb()
|
||||
else:
|
||||
print("Bail.")
|
||||
|
||||
|
@ -1445,12 +1438,9 @@ def list_dag_runs(args, dag=None):
|
|||
|
||||
@cli_utils.action_logging
|
||||
def sync_perm(args):
|
||||
if settings.RBAC:
|
||||
appbuilder = cached_appbuilder()
|
||||
print('Update permission, view-menu for all existing roles')
|
||||
appbuilder.sm.sync_roles()
|
||||
else:
|
||||
print('The sync_perm command only works for rbac UI.')
|
||||
appbuilder = cached_appbuilder()
|
||||
print('Update permission, view-menu for all existing roles')
|
||||
appbuilder.sm.sync_roles()
|
||||
|
||||
|
||||
Arg = namedtuple(
|
||||
|
|
|
@ -313,9 +313,6 @@ hide_paused_dags_by_default = False
|
|||
# Consistent page size across all listing views in the UI
|
||||
page_size = 100
|
||||
|
||||
# Use FAB-based webserver with RBAC feature
|
||||
rbac = False
|
||||
|
||||
# Define the color of navigation bar
|
||||
navbar_color = #007A87
|
||||
|
||||
|
|
|
@ -77,7 +77,6 @@ dag_default_view = tree
|
|||
log_fetch_timeout_sec = 5
|
||||
hide_paused_dags_by_default = False
|
||||
page_size = 100
|
||||
rbac = False
|
||||
|
||||
[email]
|
||||
email_backend = airflow.utils.email.send_email_smtp
|
||||
|
|
|
@ -528,16 +528,14 @@ conf = AirflowConfigParser(default_config=parameterized_config(DEFAULT_CONFIG))
|
|||
|
||||
conf.read(AIRFLOW_CONFIG)
|
||||
|
||||
DEFAULT_WEBSERVER_CONFIG = _read_default_config_file('default_webserver_config.py')
|
||||
|
||||
if conf.getboolean('webserver', 'rbac'):
|
||||
DEFAULT_WEBSERVER_CONFIG = _read_default_config_file('default_webserver_config.py')
|
||||
WEBSERVER_CONFIG = AIRFLOW_HOME + '/webserver_config.py'
|
||||
|
||||
WEBSERVER_CONFIG = AIRFLOW_HOME + '/webserver_config.py'
|
||||
|
||||
if not os.path.isfile(WEBSERVER_CONFIG):
|
||||
log.info('Creating new FAB webserver config file in: %s', WEBSERVER_CONFIG)
|
||||
with open(WEBSERVER_CONFIG, 'w') as f:
|
||||
f.write(DEFAULT_WEBSERVER_CONFIG)
|
||||
if not os.path.isfile(WEBSERVER_CONFIG):
|
||||
log.info('Creating new FAB webserver config file in: %s', WEBSERVER_CONFIG)
|
||||
with open(WEBSERVER_CONFIG, 'w') as f:
|
||||
f.write(DEFAULT_WEBSERVER_CONFIG)
|
||||
|
||||
if conf.getboolean('core', 'unit_test_mode'):
|
||||
conf.load_test_config()
|
||||
|
|
|
@ -29,6 +29,7 @@ from airflow.hooks.mysql_hook import MySqlHook
|
|||
from airflow.hooks.presto_hook import PrestoHook
|
||||
from airflow.plugins_manager import AirflowPlugin
|
||||
from airflow.www import utils as wwwutils
|
||||
from airflow.www.decorators import gzipped
|
||||
|
||||
METASTORE_CONN_ID = 'metastore_default'
|
||||
METASTORE_MYSQL_CONN_ID = 'metastore_mysql'
|
||||
|
@ -86,7 +87,7 @@ class MetastoreBrowserView(BaseView, wwwutils.DataProfilingMixin):
|
|||
return self.render(
|
||||
"metastore_browser/db.html", tables=tables, db=db)
|
||||
|
||||
@wwwutils.gzipped
|
||||
@gzipped
|
||||
@expose('/partitions/')
|
||||
def partitions(self):
|
||||
schema, table = request.args.get("table").split('.')
|
||||
|
@ -114,7 +115,7 @@ class MetastoreBrowserView(BaseView, wwwutils.DataProfilingMixin):
|
|||
index=False,
|
||||
na_rep='',)
|
||||
|
||||
@wwwutils.gzipped
|
||||
@gzipped
|
||||
@expose('/objects/')
|
||||
def objects(self):
|
||||
where_clause = ''
|
||||
|
@ -142,7 +143,7 @@ class MetastoreBrowserView(BaseView, wwwutils.DataProfilingMixin):
|
|||
for row in h.get_records(sql)]
|
||||
return json.dumps(d)
|
||||
|
||||
@wwwutils.gzipped
|
||||
@gzipped
|
||||
@expose('/data/')
|
||||
def data(self):
|
||||
table = request.args.get("table")
|
||||
|
|
|
@ -885,44 +885,26 @@ class TaskInstance(Base, LoggingMixin):
|
|||
@property
|
||||
def log_url(self):
|
||||
iso = quote(self.execution_date.isoformat())
|
||||
BASE_URL = configuration.conf.get('webserver', 'BASE_URL')
|
||||
if settings.RBAC:
|
||||
return BASE_URL + (
|
||||
"/log?"
|
||||
"execution_date={iso}"
|
||||
"&task_id={self.task_id}"
|
||||
"&dag_id={self.dag_id}"
|
||||
).format(**locals())
|
||||
else:
|
||||
return BASE_URL + (
|
||||
"/admin/airflow/log"
|
||||
"?dag_id={self.dag_id}"
|
||||
"&task_id={self.task_id}"
|
||||
"&execution_date={iso}"
|
||||
).format(**locals())
|
||||
base_url = configuration.conf.get('webserver', 'BASE_URL')
|
||||
return base_url + (
|
||||
"/log?"
|
||||
"execution_date={iso}"
|
||||
"&task_id={self.task_id}"
|
||||
"&dag_id={self.dag_id}"
|
||||
).format(**locals())
|
||||
|
||||
@property
|
||||
def mark_success_url(self):
|
||||
iso = quote(self.execution_date.isoformat())
|
||||
BASE_URL = configuration.conf.get('webserver', 'BASE_URL')
|
||||
if settings.RBAC:
|
||||
return BASE_URL + (
|
||||
"/success"
|
||||
"?task_id={self.task_id}"
|
||||
"&dag_id={self.dag_id}"
|
||||
"&execution_date={iso}"
|
||||
"&upstream=false"
|
||||
"&downstream=false"
|
||||
).format(**locals())
|
||||
else:
|
||||
return BASE_URL + (
|
||||
"/admin/airflow/success"
|
||||
"?task_id={self.task_id}"
|
||||
"&dag_id={self.dag_id}"
|
||||
"&execution_date={iso}"
|
||||
"&upstream=false"
|
||||
"&downstream=false"
|
||||
).format(**locals())
|
||||
base_url = configuration.conf.get('webserver', 'BASE_URL')
|
||||
return base_url + (
|
||||
"/success"
|
||||
"?task_id={self.task_id}"
|
||||
"&dag_id={self.dag_id}"
|
||||
"&execution_date={iso}"
|
||||
"&upstream=false"
|
||||
"&downstream=false"
|
||||
).format(**locals())
|
||||
|
||||
@provide_session
|
||||
def current_state(self, session=None):
|
||||
|
|
|
@ -38,7 +38,6 @@ from airflow.utils.sqlalchemy import setup_event_handlers
|
|||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
RBAC = conf.getboolean('webserver', 'rbac')
|
||||
|
||||
TIMEZONE = pendulum.timezone('UTC')
|
||||
try:
|
||||
|
|
|
@ -83,7 +83,7 @@ def merge_conn(conn, session=None):
|
|||
session.commit()
|
||||
|
||||
|
||||
def initdb(rbac=False):
|
||||
def initdb():
|
||||
session = settings.Session()
|
||||
|
||||
from airflow import models
|
||||
|
@ -314,10 +314,8 @@ def initdb(rbac=False):
|
|||
session.add(chart)
|
||||
session.commit()
|
||||
|
||||
if rbac:
|
||||
from flask_appbuilder.security.sqla import models
|
||||
from flask_appbuilder.models.sqla import Base
|
||||
Base.metadata.create_all(settings.engine)
|
||||
from flask_appbuilder.models.sqla import Base
|
||||
Base.metadata.create_all(settings.engine)
|
||||
|
||||
|
||||
def upgradedb():
|
||||
|
@ -336,7 +334,7 @@ def upgradedb():
|
|||
command.upgrade(config, 'heads')
|
||||
|
||||
|
||||
def resetdb(rbac):
|
||||
def resetdb():
|
||||
"""
|
||||
Clear out the database
|
||||
"""
|
||||
|
@ -352,10 +350,7 @@ def resetdb(rbac):
|
|||
if mc._version.exists(settings.engine):
|
||||
mc._version.drop(settings.engine)
|
||||
|
||||
if rbac:
|
||||
# drop rbac security tables
|
||||
from flask_appbuilder.security.sqla import models
|
||||
from flask_appbuilder.models.sqla import Base
|
||||
Base.metadata.drop_all(settings.engine)
|
||||
from flask_appbuilder.models.sqla import Base
|
||||
Base.metadata.drop_all(settings.engine)
|
||||
|
||||
initdb(rbac)
|
||||
initdb()
|
||||
|
|
|
@ -16,20 +16,22 @@
|
|||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
from flask import (
|
||||
g, Blueprint, jsonify, request, url_for
|
||||
)
|
||||
|
||||
import airflow.api
|
||||
from airflow.api.common.experimental import delete_dag as delete
|
||||
from airflow.api.common.experimental import pool as pool_api
|
||||
from airflow.api.common.experimental import trigger_dag as trigger
|
||||
from airflow.api.common.experimental.get_dag_runs import get_dag_runs
|
||||
from airflow.api.common.experimental.get_task import get_task
|
||||
from airflow.api.common.experimental.get_task_instance import get_task_instance
|
||||
from airflow.api.common.experimental.get_dag_run_state import get_dag_run_state
|
||||
from airflow.exceptions import AirflowException
|
||||
from airflow.utils import timezone
|
||||
from airflow.utils.log.logging_mixin import LoggingMixin
|
||||
from airflow.utils import timezone
|
||||
from airflow.www.app import csrf
|
||||
from airflow import models
|
||||
from airflow.utils.db import create_session
|
||||
|
||||
from flask import g, Blueprint, jsonify, request, url_for
|
||||
|
||||
_log = LoggingMixin().log
|
||||
|
||||
|
@ -66,8 +68,8 @@ def trigger_dag(dag_id):
|
|||
except ValueError:
|
||||
error_message = (
|
||||
'Given execution date, {}, could not be identified '
|
||||
'as a date. Example date format: 2015-11-16T14:34:15+00:00'.format(
|
||||
execution_date))
|
||||
'as a date. Example date format: 2015-11-16T14:34:15+00:00'
|
||||
.format(execution_date))
|
||||
_log.info(error_message)
|
||||
response = jsonify({'error': error_message})
|
||||
response.status_code = 400
|
||||
|
@ -106,6 +108,28 @@ def delete_dag(dag_id):
|
|||
return jsonify(message="Removed {} record(s)".format(count), count=count)
|
||||
|
||||
|
||||
@api_experimental.route('/dags/<string:dag_id>/dag_runs', methods=['GET'])
|
||||
@requires_authentication
|
||||
def dag_runs(dag_id):
|
||||
"""
|
||||
Returns a list of Dag Runs for a specific DAG ID.
|
||||
:query param state: a query string parameter '?state=queued|running|success...'
|
||||
:param dag_id: String identifier of a DAG
|
||||
:return: List of DAG runs of a DAG with requested state,
|
||||
or all runs if the state is not specified
|
||||
"""
|
||||
try:
|
||||
state = request.args.get('state')
|
||||
dagruns = get_dag_runs(dag_id, state)
|
||||
except AirflowException as err:
|
||||
_log.info(err)
|
||||
response = jsonify(error="{}".format(err))
|
||||
response.status_code = 400
|
||||
return response
|
||||
|
||||
return jsonify(dagruns)
|
||||
|
||||
|
||||
@api_experimental.route('/test', methods=['GET'])
|
||||
@requires_authentication
|
||||
def test():
|
||||
|
@ -131,6 +155,28 @@ def task_info(dag_id, task_id):
|
|||
return jsonify(fields)
|
||||
|
||||
|
||||
# ToDo: Shouldn't this be a PUT method?
|
||||
@api_experimental.route('/dags/<string:dag_id>/paused/<string:paused>', methods=['GET'])
|
||||
@requires_authentication
|
||||
def dag_paused(dag_id, paused):
|
||||
"""(Un)pauses a dag"""
|
||||
|
||||
DagModel = models.DagModel
|
||||
with create_session() as session:
|
||||
orm_dag = (
|
||||
session.query(DagModel)
|
||||
.filter(DagModel.dag_id == dag_id).first()
|
||||
)
|
||||
if paused == 'true':
|
||||
orm_dag.is_paused = True
|
||||
else:
|
||||
orm_dag.is_paused = False
|
||||
session.merge(orm_dag)
|
||||
session.commit()
|
||||
|
||||
return jsonify({'response': 'ok'})
|
||||
|
||||
|
||||
@api_experimental.route(
|
||||
'/dags/<string:dag_id>/dag_runs/<string:execution_date>/tasks/<string:task_id>',
|
||||
methods=['GET'])
|
||||
|
@ -149,8 +195,8 @@ def task_instance_info(dag_id, execution_date, task_id):
|
|||
except ValueError:
|
||||
error_message = (
|
||||
'Given execution date, {}, could not be identified '
|
||||
'as a date. Example date format: 2015-11-16T14:34:15+00:00'.format(
|
||||
execution_date))
|
||||
'as a date. Example date format: 2015-11-16T14:34:15+00:00'
|
||||
.format(execution_date))
|
||||
_log.info(error_message)
|
||||
response = jsonify({'error': error_message})
|
||||
response.status_code = 400
|
||||
|
@ -172,6 +218,43 @@ def task_instance_info(dag_id, execution_date, task_id):
|
|||
return jsonify(fields)
|
||||
|
||||
|
||||
@api_experimental.route(
|
||||
'/dags/<string:dag_id>/dag_runs/<string:execution_date>',
|
||||
methods=['GET'])
|
||||
@requires_authentication
|
||||
def dag_run_status(dag_id, execution_date):
|
||||
"""
|
||||
Returns a JSON with a dag_run's public instance variables.
|
||||
The format for the exec_date is expected to be
|
||||
"YYYY-mm-DDTHH:MM:SS", for example: "2016-11-16T11:34:15". This will
|
||||
of course need to have been encoded for URL in the request.
|
||||
"""
|
||||
|
||||
# Convert string datetime into actual datetime
|
||||
try:
|
||||
execution_date = timezone.parse(execution_date)
|
||||
except ValueError:
|
||||
error_message = (
|
||||
'Given execution date, {}, could not be identified '
|
||||
'as a date. Example date format: 2015-11-16T14:34:15+00:00'.format(
|
||||
execution_date))
|
||||
_log.info(error_message)
|
||||
response = jsonify({'error': error_message})
|
||||
response.status_code = 400
|
||||
|
||||
return response
|
||||
|
||||
try:
|
||||
info = get_dag_run_state(dag_id, execution_date)
|
||||
except AirflowException as err:
|
||||
_log.info(err)
|
||||
response = jsonify(error="{}".format(err))
|
||||
response.status_code = err.status_code
|
||||
return response
|
||||
|
||||
return jsonify(info)
|
||||
|
||||
|
||||
@api_experimental.route('/latest_runs', methods=['GET'])
|
||||
@requires_authentication
|
||||
def latest_dag_runs():
|
||||
|
@ -186,7 +269,7 @@ def latest_dag_runs():
|
|||
'execution_date': dagrun.execution_date.isoformat(),
|
||||
'start_date': ((dagrun.start_date or '') and
|
||||
dagrun.start_date.isoformat()),
|
||||
'dag_run_url': url_for('airflow.graph', dag_id=dagrun.dag_id,
|
||||
'dag_run_url': url_for('Airflow.graph', dag_id=dagrun.dag_id,
|
||||
execution_date=dagrun.execution_date)
|
||||
})
|
||||
return jsonify(items=payload) # old flask versions dont support jsonifying arrays
|
||||
|
|
|
@ -17,49 +17,46 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
import logging
|
||||
import socket
|
||||
import six
|
||||
|
||||
from flask import Flask
|
||||
from flask_admin import Admin, base
|
||||
from flask_appbuilder import AppBuilder, SQLA
|
||||
from flask_caching import Cache
|
||||
from flask_wtf.csrf import CSRFProtect
|
||||
from six.moves.urllib.parse import urlparse
|
||||
from werkzeug.wsgi import DispatcherMiddleware
|
||||
from werkzeug.contrib.fixers import ProxyFix
|
||||
|
||||
import airflow
|
||||
from airflow import configuration as conf
|
||||
from airflow import models, LoggingMixin
|
||||
from airflow.models.connection import Connection
|
||||
from airflow.settings import Session
|
||||
|
||||
from airflow.www.blueprints import routes
|
||||
from airflow.logging_config import configure_logging
|
||||
from airflow import jobs
|
||||
from airflow import settings
|
||||
from airflow import configuration
|
||||
from airflow.utils.net import get_hostname
|
||||
from airflow import configuration as conf
|
||||
from airflow.logging_config import configure_logging
|
||||
from airflow.www.static_config import configure_manifest_files
|
||||
|
||||
app = None
|
||||
appbuilder = None
|
||||
csrf = CSRFProtect()
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
def create_app(config=None, testing=False):
|
||||
|
||||
log = LoggingMixin().log
|
||||
|
||||
def create_app(config=None, session=None, testing=False, app_name="Airflow"):
|
||||
global app, appbuilder
|
||||
app = Flask(__name__)
|
||||
if configuration.conf.getboolean('webserver', 'ENABLE_PROXY_FIX'):
|
||||
if conf.getboolean('webserver', 'ENABLE_PROXY_FIX'):
|
||||
app.wsgi_app = ProxyFix(app.wsgi_app)
|
||||
app.secret_key = configuration.conf.get('webserver', 'SECRET_KEY')
|
||||
app.config['LOGIN_DISABLED'] = not configuration.conf.getboolean(
|
||||
'webserver', 'AUTHENTICATE')
|
||||
app.secret_key = conf.get('webserver', 'SECRET_KEY')
|
||||
|
||||
airflow_home_path = conf.get('core', 'AIRFLOW_HOME')
|
||||
webserver_config_path = airflow_home_path + '/webserver_config.py'
|
||||
app.config.from_pyfile(webserver_config_path, silent=True)
|
||||
app.config['APP_NAME'] = app_name
|
||||
app.config['TESTING'] = testing
|
||||
|
||||
csrf.init_app(app)
|
||||
|
||||
app.config['TESTING'] = testing
|
||||
|
||||
airflow.load_login()
|
||||
airflow.login.login_manager.init_app(app)
|
||||
db = SQLA(app)
|
||||
|
||||
from airflow import api
|
||||
api.load_auth()
|
||||
|
@ -68,104 +65,131 @@ def create_app(config=None, testing=False):
|
|||
# flake8: noqa: F841
|
||||
cache = Cache(app=app, config={'CACHE_TYPE': 'filesystem', 'CACHE_DIR': '/tmp'})
|
||||
|
||||
from airflow.www.blueprints import routes
|
||||
app.register_blueprint(routes)
|
||||
|
||||
configure_logging()
|
||||
configure_manifest_files(app)
|
||||
|
||||
with app.app_context():
|
||||
from airflow.www import views
|
||||
|
||||
admin = Admin(
|
||||
app, name='Airflow',
|
||||
static_url_path='/admin',
|
||||
index_view=views.HomeView(endpoint='', url='/admin', name="DAGs"),
|
||||
template_mode='bootstrap3',
|
||||
)
|
||||
av = admin.add_view
|
||||
vs = views
|
||||
av(vs.Airflow(name='DAGs', category='DAGs'))
|
||||
from airflow.www.security import AirflowSecurityManager
|
||||
security_manager_class = app.config.get('SECURITY_MANAGER_CLASS') or \
|
||||
AirflowSecurityManager
|
||||
|
||||
if not conf.getboolean('core', 'secure_mode'):
|
||||
av(vs.QueryView(name='Ad Hoc Query', category="Data Profiling"))
|
||||
av(vs.ChartModelView(
|
||||
models.Chart, Session, name="Charts", category="Data Profiling"))
|
||||
av(vs.SlaMissModelView(
|
||||
models.SlaMiss,
|
||||
Session, name="SLA Misses", category="Browse"))
|
||||
av(vs.TaskInstanceModelView(models.TaskInstance,
|
||||
Session, name="Task Instances", category="Browse"))
|
||||
av(vs.LogModelView(
|
||||
models.Log, Session, name="Logs", category="Browse"))
|
||||
av(vs.JobModelView(
|
||||
jobs.BaseJob, Session, name="Jobs", category="Browse"))
|
||||
av(vs.PoolModelView(
|
||||
models.Pool, Session, name="Pools", category="Admin"))
|
||||
av(vs.ConfigurationView(
|
||||
name='Configuration', category="Admin"))
|
||||
av(vs.UserModelView(
|
||||
models.User, Session, name="Users", category="Admin"))
|
||||
av(vs.ConnectionModelView(
|
||||
Connection, Session, name="Connections", category="Admin"))
|
||||
av(vs.VariableView(
|
||||
models.Variable, Session, name="Variables", category="Admin"))
|
||||
av(vs.XComView(
|
||||
models.XCom, Session, name="XComs", category="Admin"))
|
||||
if not issubclass(security_manager_class, AirflowSecurityManager):
|
||||
raise Exception(
|
||||
"""Your CUSTOM_SECURITY_MANAGER must now extend AirflowSecurityManager,
|
||||
not FAB's security manager.""")
|
||||
|
||||
admin.add_link(base.MenuLink(
|
||||
category='Docs', name='Documentation',
|
||||
url='https://airflow.apache.org/'))
|
||||
admin.add_link(
|
||||
base.MenuLink(category='Docs',
|
||||
name='Github',
|
||||
url='https://github.com/apache/airflow'))
|
||||
appbuilder = AppBuilder(
|
||||
app,
|
||||
db.session if not session else session,
|
||||
security_manager_class=security_manager_class,
|
||||
base_template='appbuilder/baselayout.html')
|
||||
|
||||
av(vs.VersionView(name='Version', category="About"))
|
||||
def init_views(appbuilder):
|
||||
from airflow.www import views
|
||||
appbuilder.add_view_no_menu(views.Airflow())
|
||||
appbuilder.add_view_no_menu(views.DagModelView())
|
||||
appbuilder.add_view_no_menu(views.ConfigurationView())
|
||||
appbuilder.add_view_no_menu(views.VersionView())
|
||||
appbuilder.add_view(views.DagRunModelView,
|
||||
"DAG Runs",
|
||||
category="Browse",
|
||||
category_icon="fa-globe")
|
||||
appbuilder.add_view(views.JobModelView,
|
||||
"Jobs",
|
||||
category="Browse")
|
||||
appbuilder.add_view(views.LogModelView,
|
||||
"Logs",
|
||||
category="Browse")
|
||||
appbuilder.add_view(views.SlaMissModelView,
|
||||
"SLA Misses",
|
||||
category="Browse")
|
||||
appbuilder.add_view(views.TaskInstanceModelView,
|
||||
"Task Instances",
|
||||
category="Browse")
|
||||
appbuilder.add_link("Configurations",
|
||||
href='/configuration',
|
||||
category="Admin",
|
||||
category_icon="fa-user")
|
||||
appbuilder.add_view(views.ConnectionModelView,
|
||||
"Connections",
|
||||
category="Admin")
|
||||
appbuilder.add_view(views.PoolModelView,
|
||||
"Pools",
|
||||
category="Admin")
|
||||
appbuilder.add_view(views.VariableModelView,
|
||||
"Variables",
|
||||
category="Admin")
|
||||
appbuilder.add_view(views.XComModelView,
|
||||
"XComs",
|
||||
category="Admin")
|
||||
appbuilder.add_link("Documentation",
|
||||
href='https://airflow.apache.org/',
|
||||
category="Docs",
|
||||
category_icon="fa-cube")
|
||||
appbuilder.add_link("Github",
|
||||
href='https://github.com/apache/airflow',
|
||||
category="Docs")
|
||||
appbuilder.add_link('Version',
|
||||
href='/version',
|
||||
category='About',
|
||||
category_icon='fa-th')
|
||||
|
||||
av(vs.DagRunModelView(
|
||||
models.DagRun, Session, name="DAG Runs", category="Browse"))
|
||||
av(vs.DagModelView(models.DagModel, Session, name=None))
|
||||
# Hack to not add this view to the menu
|
||||
admin._menu = admin._menu[:-1]
|
||||
def integrate_plugins():
|
||||
"""Integrate plugins to the context"""
|
||||
from airflow.plugins_manager import (
|
||||
flask_appbuilder_views, flask_appbuilder_menu_links)
|
||||
|
||||
def integrate_plugins():
|
||||
"""Integrate plugins to the context"""
|
||||
from airflow.plugins_manager import (
|
||||
admin_views, flask_blueprints, menu_links)
|
||||
for v in admin_views:
|
||||
log.debug('Adding view %s', v.name)
|
||||
admin.add_view(v)
|
||||
for bp in flask_blueprints:
|
||||
log.debug('Adding blueprint %s', bp.name)
|
||||
app.register_blueprint(bp)
|
||||
for ml in sorted(menu_links, key=lambda x: x.name):
|
||||
log.debug('Adding menu link %s', ml.name)
|
||||
admin.add_link(ml)
|
||||
for v in flask_appbuilder_views:
|
||||
log.debug("Adding view %s", v["name"])
|
||||
appbuilder.add_view(v["view"],
|
||||
v["name"],
|
||||
category=v["category"])
|
||||
for ml in sorted(flask_appbuilder_menu_links, key=lambda x: x["name"]):
|
||||
log.debug("Adding menu link %s", ml["name"])
|
||||
appbuilder.add_link(ml["name"],
|
||||
href=ml["href"],
|
||||
category=ml["category"],
|
||||
category_icon=ml["category_icon"])
|
||||
|
||||
integrate_plugins()
|
||||
integrate_plugins()
|
||||
# Garbage collect old permissions/views after they have been modified.
|
||||
# Otherwise, when the name of a view or menu is changed, the framework
|
||||
# will add the new Views and Menus names to the backend, but will not
|
||||
# delete the old ones.
|
||||
|
||||
import airflow.www.api.experimental.endpoints as e
|
||||
init_views(appbuilder)
|
||||
|
||||
security_manager = appbuilder.sm
|
||||
security_manager.sync_roles()
|
||||
|
||||
from airflow.www.api.experimental import endpoints as e
|
||||
# required for testing purposes otherwise the module retains
|
||||
# a link to the default_auth
|
||||
if app.config['TESTING']:
|
||||
six.moves.reload_module(e)
|
||||
if six.PY2:
|
||||
reload(e) # noqa
|
||||
else:
|
||||
import importlib
|
||||
importlib.reload(e)
|
||||
|
||||
app.register_blueprint(e.api_experimental, url_prefix='/api/experimental')
|
||||
|
||||
@app.context_processor
|
||||
def jinja_globals():
|
||||
return {
|
||||
'hostname': get_hostname(),
|
||||
'navbar_color': configuration.get('webserver', 'NAVBAR_COLOR'),
|
||||
'hostname': socket.getfqdn(),
|
||||
'navbar_color': conf.get('webserver', 'NAVBAR_COLOR'),
|
||||
}
|
||||
|
||||
@app.teardown_appcontext
|
||||
def shutdown_session(exception=None):
|
||||
settings.Session.remove()
|
||||
|
||||
return app
|
||||
|
||||
|
||||
app = None
|
||||
return app, appbuilder
|
||||
|
||||
|
||||
def root_app(env, resp):
|
||||
|
@ -173,13 +197,19 @@ def root_app(env, resp):
|
|||
return [b'Apache Airflow is not at this location']
|
||||
|
||||
|
||||
def cached_app(config=None, testing=False):
|
||||
global app
|
||||
if not app:
|
||||
base_url = urlparse(configuration.conf.get('webserver', 'base_url'))[2]
|
||||
def cached_app(config=None, session=None, testing=False):
|
||||
global app, appbuilder
|
||||
if not app or not appbuilder:
|
||||
base_url = urlparse(conf.get('webserver', 'base_url'))[2]
|
||||
if not base_url or base_url == '/':
|
||||
base_url = ""
|
||||
|
||||
app = create_app(config, testing)
|
||||
app, _ = create_app(config, session, testing)
|
||||
app = DispatcherMiddleware(root_app, {base_url: app})
|
||||
return app
|
||||
|
||||
|
||||
def cached_appbuilder(config=None, testing=False):
|
||||
global appbuilder
|
||||
cached_app(config, testing)
|
||||
return appbuilder
|
||||
|
|
|
@ -17,56 +17,11 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
from datetime import timedelta
|
||||
from flask import (
|
||||
url_for, Blueprint, redirect,
|
||||
)
|
||||
from sqlalchemy import func
|
||||
|
||||
from airflow import configuration as conf
|
||||
from airflow import jobs, settings
|
||||
from airflow.utils import timezone
|
||||
from airflow.www import utils as wwwutils
|
||||
from flask import Blueprint, redirect
|
||||
|
||||
routes = Blueprint('routes', __name__)
|
||||
|
||||
|
||||
@routes.route('/')
|
||||
def index():
|
||||
return redirect(url_for('admin.index'))
|
||||
|
||||
|
||||
@routes.route('/health')
|
||||
def health():
|
||||
"""
|
||||
An endpoint helping check the health status of the Airflow instance,
|
||||
including metadatabase and scheduler.
|
||||
"""
|
||||
session = settings.Session()
|
||||
BJ = jobs.BaseJob
|
||||
payload = {}
|
||||
scheduler_health_check_threshold = timedelta(seconds=conf.getint('scheduler',
|
||||
'scheduler_health_check_threshold'
|
||||
))
|
||||
|
||||
latest_scheduler_heartbeat = None
|
||||
payload['metadatabase'] = {'status': 'healthy'}
|
||||
try:
|
||||
latest_scheduler_heartbeat = session.query(func.max(BJ.latest_heartbeat)). \
|
||||
filter(BJ.state == 'running', BJ.job_type == 'SchedulerJob'). \
|
||||
scalar()
|
||||
except Exception:
|
||||
payload['metadatabase']['status'] = 'unhealthy'
|
||||
|
||||
if not latest_scheduler_heartbeat:
|
||||
scheduler_status = 'unhealthy'
|
||||
else:
|
||||
if timezone.utcnow() - latest_scheduler_heartbeat <= scheduler_health_check_threshold:
|
||||
scheduler_status = 'healthy'
|
||||
else:
|
||||
scheduler_status = 'unhealthy'
|
||||
|
||||
payload['scheduler'] = {'status': scheduler_status,
|
||||
'latest_scheduler_heartbeat': str(latest_scheduler_heartbeat)}
|
||||
|
||||
return wwwutils.json_response(payload)
|
||||
return redirect('/home')
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
set -e
|
||||
|
||||
# first bump up package.json manually, commit and tag
|
||||
if [ -d airflow/www_rbac/static/dist ]; then
|
||||
rm airflow/www_rbac/static/dist/*
|
||||
if [ -d airflow/www/static/dist ]; then
|
||||
rm airflow/www/static/dist/*
|
||||
fi
|
||||
|
||||
cd airflow/www_rbac/
|
||||
cd airflow/www/
|
||||
npm install
|
||||
npm run build
|
||||
cd ../..
|
|
@ -22,14 +22,23 @@ from __future__ import division
|
|||
from __future__ import print_function
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from airflow.models.connection import Connection
|
||||
from airflow.utils import timezone
|
||||
from flask_admin.form import DateTimePickerWidget
|
||||
from wtforms import DateTimeField, SelectField
|
||||
|
||||
from flask_appbuilder.forms import DynamicForm
|
||||
from flask_appbuilder.fieldwidgets import (BS3TextFieldWidget, BS3TextAreaFieldWidget,
|
||||
BS3PasswordFieldWidget, Select2Widget,
|
||||
DateTimePickerWidget)
|
||||
from flask_babel import lazy_gettext
|
||||
from flask_wtf import FlaskForm
|
||||
|
||||
from wtforms import validators
|
||||
from wtforms.fields import (IntegerField, SelectField, TextAreaField, PasswordField,
|
||||
StringField, DateTimeField, BooleanField)
|
||||
|
||||
|
||||
class DateTimeForm(FlaskForm):
|
||||
# Date filter form for task views
|
||||
# Date filter form needed for task views
|
||||
execution_date = DateTimeField(
|
||||
"Execution date", widget=DateTimePickerWidget())
|
||||
|
||||
|
@ -51,3 +60,81 @@ class DateTimeWithNumRunsForm(FlaskForm):
|
|||
class DateTimeWithNumRunsWithDagRunsForm(DateTimeWithNumRunsForm):
|
||||
# Date time and number of runs and dag runs form for graph and gantt view
|
||||
execution_date = SelectField("DAG run")
|
||||
|
||||
|
||||
class DagRunForm(DynamicForm):
|
||||
dag_id = StringField(
|
||||
lazy_gettext('Dag Id'),
|
||||
validators=[validators.DataRequired()],
|
||||
widget=BS3TextFieldWidget())
|
||||
start_date = DateTimeField(
|
||||
lazy_gettext('Start Date'),
|
||||
widget=DateTimePickerWidget())
|
||||
end_date = DateTimeField(
|
||||
lazy_gettext('End Date'),
|
||||
widget=DateTimePickerWidget())
|
||||
run_id = StringField(
|
||||
lazy_gettext('Run Id'),
|
||||
widget=BS3TextFieldWidget())
|
||||
state = SelectField(
|
||||
lazy_gettext('State'),
|
||||
choices=(('success', 'success'), ('running', 'running'), ('failed', 'failed'),),
|
||||
widget=Select2Widget())
|
||||
execution_date = DateTimeField(
|
||||
lazy_gettext('Execution Date'),
|
||||
widget=DateTimePickerWidget())
|
||||
external_trigger = BooleanField(
|
||||
lazy_gettext('External Trigger'))
|
||||
|
||||
|
||||
class ConnectionForm(DynamicForm):
|
||||
conn_id = StringField(
|
||||
lazy_gettext('Conn Id'),
|
||||
widget=BS3TextFieldWidget())
|
||||
conn_type = SelectField(
|
||||
lazy_gettext('Conn Type'),
|
||||
choices=Connection._types,
|
||||
widget=Select2Widget())
|
||||
host = StringField(
|
||||
lazy_gettext('Host'),
|
||||
widget=BS3TextFieldWidget())
|
||||
schema = StringField(
|
||||
lazy_gettext('Schema'),
|
||||
widget=BS3TextFieldWidget())
|
||||
login = StringField(
|
||||
lazy_gettext('Login'),
|
||||
widget=BS3TextFieldWidget())
|
||||
password = PasswordField(
|
||||
lazy_gettext('Password'),
|
||||
widget=BS3PasswordFieldWidget())
|
||||
port = IntegerField(
|
||||
lazy_gettext('Port'),
|
||||
validators=[validators.Optional()],
|
||||
widget=BS3TextFieldWidget())
|
||||
extra = TextAreaField(
|
||||
lazy_gettext('Extra'),
|
||||
widget=BS3TextAreaFieldWidget())
|
||||
|
||||
# Used to customized the form, the forms elements get rendered
|
||||
# and results are stored in the extra field as json. All of these
|
||||
# need to be prefixed with extra__ and then the conn_type ___ as in
|
||||
# extra__{conn_type}__name. You can also hide form elements and rename
|
||||
# others from the connection_form.js file
|
||||
extra__jdbc__drv_path = StringField(
|
||||
lazy_gettext('Driver Path'),
|
||||
widget=BS3TextFieldWidget())
|
||||
extra__jdbc__drv_clsname = StringField(
|
||||
lazy_gettext('Driver Class'),
|
||||
widget=BS3TextFieldWidget())
|
||||
extra__google_cloud_platform__project = StringField(
|
||||
lazy_gettext('Project Id'),
|
||||
widget=BS3TextFieldWidget())
|
||||
extra__google_cloud_platform__key_path = StringField(
|
||||
lazy_gettext('Keyfile Path'),
|
||||
widget=BS3TextFieldWidget())
|
||||
extra__google_cloud_platform__keyfile_dict = PasswordField(
|
||||
lazy_gettext('Keyfile JSON'),
|
||||
widget=BS3PasswordFieldWidget())
|
||||
extra__google_cloud_platform__scope = StringField(
|
||||
lazy_gettext('Scopes (comma separated)'),
|
||||
widget=BS3TextFieldWidget())
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import setproctitle
|
||||
from airflow import settings
|
||||
|
||||
|
||||
def post_worker_init(dummy_worker):
|
||||
setproctitle.setproctitle(
|
||||
settings.GUNICORN_WORKER_READY_PREFIX + setproctitle.getproctitle()
|
||||
)
|
|
@ -25,7 +25,7 @@ from flask_appbuilder.security.sqla.manager import SecurityManager
|
|||
from sqlalchemy import or_
|
||||
|
||||
from airflow import models
|
||||
from airflow.www_rbac.app import appbuilder
|
||||
from airflow.www.app import appbuilder
|
||||
from airflow.utils.db import provide_session
|
||||
|
||||
###########################################################################
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,28 +0,0 @@
|
|||
/*! ========================================================================
|
||||
* Bootstrap Toggle: bootstrap-toggle.css v2.2.0
|
||||
* http://www.bootstraptoggle.com
|
||||
* ========================================================================
|
||||
* Copyright 2014 Min Hur, The New York Times Company
|
||||
* Licensed under MIT
|
||||
* ======================================================================== */
|
||||
.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}
|
||||
.toggle{position:relative;overflow:hidden}
|
||||
.toggle input[type=checkbox]{display:none}
|
||||
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}
|
||||
.toggle.off .toggle-group{left:-100%}
|
||||
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}
|
||||
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}
|
||||
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px}
|
||||
.toggle.btn{min-width:59px;min-height:34px}
|
||||
.toggle-on.btn{padding-right:24px}
|
||||
.toggle-off.btn{padding-left:24px}
|
||||
.toggle.btn-lg{min-width:79px;min-height:45px}
|
||||
.toggle-on.btn-lg{padding-right:31px}
|
||||
.toggle-off.btn-lg{padding-left:31px}
|
||||
.toggle-handle.btn-lg{width:40px}
|
||||
.toggle.btn-sm{min-width:50px;min-height:30px}
|
||||
.toggle-on.btn-sm{padding-right:20px}
|
||||
.toggle-off.btn-sm{padding-left:20px}
|
||||
.toggle.btn-xs{min-width:35px;min-height:22px}
|
||||
.toggle-on.btn-xs{padding-right:12px}
|
||||
.toggle-off.btn-xs{padding-left:12px}
|
|
@ -1,9 +0,0 @@
|
|||
/*! ========================================================================
|
||||
* Bootstrap Toggle: bootstrap-toggle.js v2.2.0
|
||||
* http://www.bootstraptoggle.com
|
||||
* ========================================================================
|
||||
* Copyright 2014 Min Hur, The New York Times Company
|
||||
* Licensed under MIT
|
||||
* ======================================================================== */
|
||||
+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="2.2.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b+" active"),e=a('<span class="toggle-handle btn btn-default">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.outerWidth(),d.outerWidth())+e.outerWidth()/2,i=this.options.height||Math.max(c.outerHeight(),d.outerHeight());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(a||this.trigger()))},c.prototype.off=function(a){return this.$element.prop("disabled")?!1:(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(a||this.trigger()))},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){var c=a(this).find("input[type=checkbox]");c.bootstrapToggle("toggle"),b.preventDefault()})}(jQuery);
|
||||
//# sourceMappingURL=bootstrap-toggle.min.js.map
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -1,109 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Created by janomar on 23/07/15.
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
var config = {
|
||||
jdbc: {
|
||||
hidden_fields: ['port', 'schema', 'extra'],
|
||||
relabeling: {'host': 'Connection URL'},
|
||||
},
|
||||
google_cloud_platform: {
|
||||
hidden_fields: ['host', 'schema', 'login', 'password', 'port', 'extra'],
|
||||
relabeling: {},
|
||||
},
|
||||
cloudant: {
|
||||
hidden_fields: ['port', 'extra'],
|
||||
relabeling: {
|
||||
'host': 'Account',
|
||||
'login': 'Username (or API Key)',
|
||||
'schema': 'Database'
|
||||
}
|
||||
},
|
||||
jenkins: {
|
||||
hidden_fields: ['schema'],
|
||||
relabeling: {
|
||||
'login': 'Username',
|
||||
'password': 'API token or password',
|
||||
'extra': 'Use https (true/false, default false)'
|
||||
}
|
||||
},
|
||||
docker: {
|
||||
hidden_fields: ['port', 'schema'],
|
||||
relabeling: {
|
||||
'host': 'Registry URL',
|
||||
'login': 'Username',
|
||||
}
|
||||
},
|
||||
qubole: {
|
||||
hidden_fields: ['login', 'schema', 'port', 'extra'],
|
||||
relabeling: {
|
||||
'host': 'API Endpoint',
|
||||
'password': 'Auth Token',
|
||||
},
|
||||
placeholders: {
|
||||
'host': 'https://<env>.qubole.com/api'
|
||||
}
|
||||
},
|
||||
ssh: {
|
||||
hidden_fields: ['schema'],
|
||||
relabeling: {
|
||||
'login': 'Username',
|
||||
}
|
||||
},
|
||||
}
|
||||
function connTypeChange(connectionType) {
|
||||
$("div.form-group").removeClass("hide");
|
||||
$.each($("[id^='extra__']"), function() {
|
||||
$(this).parent().parent().addClass('hide')
|
||||
});
|
||||
// Somehow the previous command doesn't honor __
|
||||
$("#extra").parent().parent().removeClass('hide')
|
||||
$.each($("[id^='extra__"+connectionType+"']"), function() {
|
||||
$(this).parent().parent().removeClass('hide')
|
||||
});
|
||||
$("label[orig_text]").each(function(){
|
||||
$(this).text($(this).attr("orig_text"));
|
||||
});
|
||||
$(".form-control").each(function(){$(this).attr('placeholder', '')});
|
||||
|
||||
if (config[connectionType] != undefined){
|
||||
$.each(config[connectionType].hidden_fields, function(i, field){
|
||||
$("#" + field).parent().parent().addClass('hide')
|
||||
});
|
||||
$.each(config[connectionType].relabeling, function(k, v){
|
||||
lbl = $("label[for='" + k + "']")
|
||||
lbl.attr("orig_text", lbl.text());
|
||||
$("label[for='" + k + "']").text(v);
|
||||
});
|
||||
$.each(config[connectionType].placeholders, function(k, v){
|
||||
$("#" + k).attr('placeholder', v);
|
||||
});
|
||||
}
|
||||
}
|
||||
var connectionType=$("#conn_type").val();
|
||||
$("#conn_type").on('change', function(e) {
|
||||
connectionType = $("#conn_type").val();
|
||||
connTypeChange(connectionType);
|
||||
});
|
||||
connTypeChange(connectionType);
|
||||
});
|
|
@ -1,302 +0,0 @@
|
|||
/**
|
||||
* The MIT License (MIT)
|
||||
* Copyright (c) 2013 Justin Palmer
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is furnished to do
|
||||
* so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
// d3.tip
|
||||
// Copyright (c) 2013 Justin Palmer
|
||||
//
|
||||
// Tooltips for d3.js SVG visualizations
|
||||
|
||||
// Public - contructs a new tooltip
|
||||
//
|
||||
// Returns a tip
|
||||
d3.tip = function() {
|
||||
var direction = d3_tip_direction,
|
||||
offset = d3_tip_offset,
|
||||
html = d3_tip_html,
|
||||
node = initNode(),
|
||||
svg = null,
|
||||
point = null,
|
||||
target = null
|
||||
|
||||
function tip(vis) {
|
||||
svg = getSVGNode(vis)
|
||||
point = svg.createSVGPoint()
|
||||
document.body.appendChild(node)
|
||||
}
|
||||
|
||||
// Public - show the tooltip on the screen
|
||||
//
|
||||
// Returns a tip
|
||||
tip.show = function() {
|
||||
var args = Array.prototype.slice.call(arguments)
|
||||
if(args[args.length - 1] instanceof SVGElement) target = args.pop()
|
||||
|
||||
var content = html.apply(this, args),
|
||||
poffset = offset.apply(this, args),
|
||||
dir = direction.apply(this, args),
|
||||
nodel = d3.select(node), i = 0,
|
||||
coords
|
||||
|
||||
nodel.html(content)
|
||||
.style({ opacity: 1, 'pointer-events': 'all' })
|
||||
|
||||
while(i--) nodel.classed(directions[i], false)
|
||||
coords = direction_callbacks.get(dir).apply(this)
|
||||
nodel.classed(dir, true).style({
|
||||
top: (coords.top + poffset[0]) + 'px',
|
||||
left: (coords.left + poffset[1]) + 'px'
|
||||
})
|
||||
|
||||
return tip
|
||||
}
|
||||
|
||||
// Public - hide the tooltip
|
||||
//
|
||||
// Returns a tip
|
||||
tip.hide = function() {
|
||||
nodel = d3.select(node)
|
||||
nodel.style({ opacity: 0, 'pointer-events': 'none' })
|
||||
return tip
|
||||
}
|
||||
|
||||
// Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value.
|
||||
//
|
||||
// n - name of the attribute
|
||||
// v - value of the attribute
|
||||
//
|
||||
// Returns tip or attribute value
|
||||
tip.attr = function(n, v) {
|
||||
if (arguments.length < 2 && typeof n === 'string') {
|
||||
return d3.select(node).attr(n)
|
||||
} else {
|
||||
var args = Array.prototype.slice.call(arguments)
|
||||
d3.selection.prototype.attr.apply(d3.select(node), args)
|
||||
}
|
||||
|
||||
return tip
|
||||
}
|
||||
|
||||
// Public: Proxy style calls to the d3 tip container. Sets or gets a style value.
|
||||
//
|
||||
// n - name of the property
|
||||
// v - value of the property
|
||||
//
|
||||
// Returns tip or style property value
|
||||
tip.style = function(n, v) {
|
||||
if (arguments.length < 2 && typeof n === 'string') {
|
||||
return d3.select(node).style(n)
|
||||
} else {
|
||||
var args = Array.prototype.slice.call(arguments)
|
||||
d3.selection.prototype.style.apply(d3.select(node), args)
|
||||
}
|
||||
|
||||
return tip
|
||||
}
|
||||
|
||||
// Public: Set or get the direction of the tooltip
|
||||
//
|
||||
// v - One of n(north), s(south), e(east), or w(west), nw(northwest),
|
||||
// sw(southwest), ne(northeast) or se(southeast)
|
||||
//
|
||||
// Returns tip or direction
|
||||
tip.direction = function(v) {
|
||||
if (!arguments.length) return direction
|
||||
direction = v == null ? v : d3.functor(v)
|
||||
|
||||
return tip
|
||||
}
|
||||
|
||||
// Public: Sets or gets the offset of the tip
|
||||
//
|
||||
// v - Array of [x, y] offset
|
||||
//
|
||||
// Returns offset or
|
||||
tip.offset = function(v) {
|
||||
if (!arguments.length) return offset
|
||||
offset = v == null ? v : d3.functor(v)
|
||||
|
||||
return tip
|
||||
}
|
||||
|
||||
// Public: sets or gets the html value of the tooltip
|
||||
//
|
||||
// v - String value of the tip
|
||||
//
|
||||
// Returns html value or tip
|
||||
tip.html = function(v) {
|
||||
if (!arguments.length) return html
|
||||
html = v == null ? v : d3.functor(v)
|
||||
|
||||
return tip
|
||||
}
|
||||
|
||||
function d3_tip_direction() { return 'n' }
|
||||
function d3_tip_offset() { return [0, 0] }
|
||||
function d3_tip_html() { return ' ' }
|
||||
|
||||
var direction_callbacks = d3.map({
|
||||
n: direction_n,
|
||||
s: direction_s,
|
||||
e: direction_e,
|
||||
w: direction_w,
|
||||
nw: direction_nw,
|
||||
ne: direction_ne,
|
||||
sw: direction_sw,
|
||||
se: direction_se
|
||||
}),
|
||||
|
||||
directions = direction_callbacks.keys()
|
||||
|
||||
function direction_n() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.n.y - node.offsetHeight,
|
||||
left: bbox.n.x - node.offsetWidth / 2
|
||||
}
|
||||
}
|
||||
|
||||
function direction_s() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.s.y,
|
||||
left: bbox.s.x - node.offsetWidth / 2
|
||||
}
|
||||
}
|
||||
|
||||
function direction_e() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.e.y - node.offsetHeight / 2,
|
||||
left: bbox.e.x
|
||||
}
|
||||
}
|
||||
|
||||
function direction_w() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.w.y - node.offsetHeight / 2,
|
||||
left: bbox.w.x - node.offsetWidth
|
||||
}
|
||||
}
|
||||
|
||||
function direction_nw() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.nw.y - node.offsetHeight,
|
||||
left: bbox.nw.x - node.offsetWidth
|
||||
}
|
||||
}
|
||||
|
||||
function direction_ne() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.ne.y - node.offsetHeight,
|
||||
left: bbox.ne.x
|
||||
}
|
||||
}
|
||||
|
||||
function direction_sw() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.sw.y,
|
||||
left: bbox.sw.x - node.offsetWidth
|
||||
}
|
||||
}
|
||||
|
||||
function direction_se() {
|
||||
var bbox = getScreenBBox()
|
||||
return {
|
||||
top: bbox.se.y,
|
||||
left: bbox.e.x
|
||||
}
|
||||
}
|
||||
|
||||
function initNode() {
|
||||
var node = d3.select(document.createElement('div'))
|
||||
node.style({
|
||||
position: 'absolute',
|
||||
opacity: 0,
|
||||
pointerEvents: 'none',
|
||||
boxSizing: 'border-box'
|
||||
})
|
||||
|
||||
return node.node()
|
||||
}
|
||||
|
||||
function getSVGNode(el) {
|
||||
el = el.node()
|
||||
if(el.tagName.toLowerCase() == 'svg')
|
||||
return el
|
||||
|
||||
return el.ownerSVGElement
|
||||
}
|
||||
|
||||
// Private - gets the screen coordinates of a shape
|
||||
//
|
||||
// Given a shape on the screen, will return an SVGPoint for the directions
|
||||
// n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest),
|
||||
// sw(southwest).
|
||||
//
|
||||
// +-+-+
|
||||
// | |
|
||||
// + +
|
||||
// | |
|
||||
// +-+-+
|
||||
//
|
||||
// Returns an Object {n, s, e, w, nw, sw, ne, se}
|
||||
function getScreenBBox() {
|
||||
var targetel = target || d3.event.target,
|
||||
bbox = {},
|
||||
matrix = targetel.getScreenCTM(),
|
||||
tbbox = targetel.getBBox(),
|
||||
width = tbbox.width,
|
||||
height = tbbox.height,
|
||||
x = tbbox.x,
|
||||
y = tbbox.y,
|
||||
scrollTop = document.documentElement.scrollTop || document.body.scrollTop,
|
||||
scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft
|
||||
|
||||
|
||||
point.x = x + scrollLeft
|
||||
point.y = y + scrollTop
|
||||
bbox.nw = point.matrixTransform(matrix)
|
||||
point.x += width
|
||||
bbox.ne = point.matrixTransform(matrix)
|
||||
point.y += height
|
||||
bbox.se = point.matrixTransform(matrix)
|
||||
point.x -= width
|
||||
bbox.sw = point.matrixTransform(matrix)
|
||||
point.y -= height / 2
|
||||
bbox.w = point.matrixTransform(matrix)
|
||||
point.x += width
|
||||
bbox.e = point.matrixTransform(matrix)
|
||||
point.x -= width / 2
|
||||
point.y -= height / 2
|
||||
bbox.n = point.matrixTransform(matrix)
|
||||
point.y += height
|
||||
bbox.s = point.matrixTransform(matrix)
|
||||
|
||||
return bbox
|
||||
}
|
||||
|
||||
return tip
|
||||
};
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -1,38 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
svg {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.node rect {
|
||||
stroke: #333;
|
||||
stroke-width: 1px;
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.edgeLabel rect {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
.edgePath {
|
||||
stroke: #333;
|
||||
stroke-width: 1px;
|
||||
fill: none;
|
||||
}
|
|
@ -1,333 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
div.dataTables_length label {
|
||||
font-weight: normal;
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
div.dataTables_length select {
|
||||
width: 75px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
div.dataTables_filter {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.dataTables_filter label {
|
||||
font-weight: normal;
|
||||
white-space: nowrap;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.dataTables_filter input {
|
||||
margin-left: 0.5em;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
div.dataTables_info {
|
||||
padding-top: 8px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
div.dataTables_paginate {
|
||||
margin: 0;
|
||||
white-space: nowrap;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.dataTables_paginate ul.pagination {
|
||||
margin: 2px 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
div.dataTables_length,
|
||||
div.dataTables_filter,
|
||||
div.dataTables_info,
|
||||
div.dataTables_paginate {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
table.dataTable td,
|
||||
table.dataTable th {
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
|
||||
table.dataTable {
|
||||
clear: both;
|
||||
margin-top: 6px !important;
|
||||
margin-bottom: 6px !important;
|
||||
max-width: none !important;
|
||||
}
|
||||
|
||||
table.dataTable thead .sorting,
|
||||
table.dataTable thead .sorting_asc,
|
||||
table.dataTable thead .sorting_desc,
|
||||
table.dataTable thead .sorting_asc_disabled,
|
||||
table.dataTable thead .sorting_desc_disabled {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
table.dataTable thead .sorting { background: url('../images/sort_both.png') no-repeat center right; }
|
||||
table.dataTable thead .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; }
|
||||
table.dataTable thead .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; }
|
||||
|
||||
table.dataTable thead .sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; }
|
||||
table.dataTable thead .sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; }
|
||||
|
||||
table.dataTable thead > tr > th {
|
||||
padding-left: 18px;
|
||||
padding-right: 18px;
|
||||
}
|
||||
|
||||
table.dataTable th:active {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
/* Scrolling */
|
||||
div.dataTables_scrollHead table {
|
||||
margin-bottom: 0 !important;
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
div.dataTables_scrollHead table thead tr:last-child th:first-child,
|
||||
div.dataTables_scrollHead table thead tr:last-child td:first-child {
|
||||
border-bottom-left-radius: 0 !important;
|
||||
border-bottom-right-radius: 0 !important;
|
||||
}
|
||||
|
||||
div.dataTables_scrollBody table {
|
||||
border-top: none;
|
||||
margin-top: 0 !important;
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
|
||||
div.dataTables_scrollBody tbody tr:first-child th,
|
||||
div.dataTables_scrollBody tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
div.dataTables_scrollFoot table {
|
||||
margin-top: 0 !important;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
|
||||
width calculations when using scrolling impossible to align columns. We have
|
||||
to use separate
|
||||
*/
|
||||
table.table-bordered.dataTable {
|
||||
border-collapse: separate !important;
|
||||
}
|
||||
table.table-bordered thead th,
|
||||
table.table-bordered thead td {
|
||||
border-left-width: 0;
|
||||
border-top-width: 0;
|
||||
}
|
||||
table.table-bordered tbody th,
|
||||
table.table-bordered tbody td {
|
||||
border-left-width: 0;
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
table.table-bordered th:last-child,
|
||||
table.table-bordered td:last-child {
|
||||
border-right-width: 0;
|
||||
}
|
||||
div.dataTables_scrollHead table.table-bordered {
|
||||
border-bottom-width: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* TableTools styles
|
||||
*/
|
||||
.table.dataTable tbody tr.active td,
|
||||
.table.dataTable tbody tr.active th {
|
||||
background-color: #08C;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.table.dataTable tbody tr.active:hover td,
|
||||
.table.dataTable tbody tr.active:hover th {
|
||||
background-color: #0075b0 !important;
|
||||
}
|
||||
|
||||
.table.dataTable tbody tr.active th > a,
|
||||
.table.dataTable tbody tr.active td > a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.table-striped.dataTable tbody tr.active:nth-child(odd) td,
|
||||
.table-striped.dataTable tbody tr.active:nth-child(odd) th {
|
||||
background-color: #017ebc;
|
||||
}
|
||||
|
||||
table.DTTT_selectable tbody tr {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
div.DTTT .btn:hover {
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
ul.DTTT_dropdown.dropdown-menu {
|
||||
z-index: 2003;
|
||||
}
|
||||
|
||||
ul.DTTT_dropdown.dropdown-menu a {
|
||||
color: #333 !important; /* needed only when demo_page.css is included */
|
||||
}
|
||||
|
||||
ul.DTTT_dropdown.dropdown-menu li {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
ul.DTTT_dropdown.dropdown-menu li:hover a {
|
||||
background-color: #0088cc;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
div.DTTT_collection_background {
|
||||
z-index: 2002;
|
||||
}
|
||||
|
||||
/* TableTools information display */
|
||||
div.DTTT_print_info {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 400px;
|
||||
height: 150px;
|
||||
margin-left: -200px;
|
||||
margin-top: -75px;
|
||||
text-align: center;
|
||||
color: #333;
|
||||
padding: 10px 30px;
|
||||
opacity: 0.95;
|
||||
|
||||
background-color: white;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
border-radius: 6px;
|
||||
|
||||
-webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
div.DTTT_print_info h6 {
|
||||
font-weight: normal;
|
||||
font-size: 28px;
|
||||
line-height: 28px;
|
||||
margin: 1em;
|
||||
}
|
||||
|
||||
div.DTTT_print_info p {
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
div.dataTables_processing {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 100%;
|
||||
height: 60px;
|
||||
margin-left: -50%;
|
||||
margin-top: -25px;
|
||||
padding-top: 20px;
|
||||
padding-bottom: 20px;
|
||||
text-align: center;
|
||||
font-size: 1.2em;
|
||||
background-color: white;
|
||||
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
|
||||
background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
|
||||
background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
|
||||
background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
|
||||
background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
|
||||
background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* FixedColumns styles
|
||||
*/
|
||||
div.DTFC_LeftHeadWrapper table,
|
||||
div.DTFC_LeftFootWrapper table,
|
||||
div.DTFC_RightHeadWrapper table,
|
||||
div.DTFC_RightFootWrapper table,
|
||||
table.DTFC_Cloned tr.even {
|
||||
background-color: white;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
div.DTFC_RightHeadWrapper table ,
|
||||
div.DTFC_LeftHeadWrapper table {
|
||||
border-bottom: none !important;
|
||||
margin-bottom: 0 !important;
|
||||
border-top-right-radius: 0 !important;
|
||||
border-bottom-left-radius: 0 !important;
|
||||
border-bottom-right-radius: 0 !important;
|
||||
}
|
||||
|
||||
div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
|
||||
div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
|
||||
div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
|
||||
div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
|
||||
border-bottom-left-radius: 0 !important;
|
||||
border-bottom-right-radius: 0 !important;
|
||||
}
|
||||
|
||||
div.DTFC_RightBodyWrapper table,
|
||||
div.DTFC_LeftBodyWrapper table {
|
||||
border-top: none;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
div.DTFC_RightBodyWrapper tbody tr:first-child th,
|
||||
div.DTFC_RightBodyWrapper tbody tr:first-child td,
|
||||
div.DTFC_LeftBodyWrapper tbody tr:first-child th,
|
||||
div.DTFC_LeftBodyWrapper tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
div.DTFC_RightFootWrapper table,
|
||||
div.DTFC_LeftFootWrapper table {
|
||||
border-top: none;
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FixedHeader styles
|
||||
*/
|
||||
div.FixedHeader_Cloned table {
|
||||
margin: 0 !important
|
||||
}
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
g.node rect {
|
||||
stroke-width: 3;
|
||||
stroke: white;
|
||||
cursor: pointer;
|
||||
}
|
||||
g.node text {
|
||||
cursor: pointer;
|
||||
}
|
||||
g.node.success rect {
|
||||
stroke: green;
|
||||
}
|
||||
g.node.up_for_retry rect {
|
||||
stroke: gold;
|
||||
}
|
||||
g.node.queued rect {
|
||||
stroke: grey;
|
||||
}
|
||||
g.node.up_for_reschedule rect{
|
||||
stroke: turquoise;
|
||||
}
|
||||
g.node.running rect{
|
||||
stroke: lime;
|
||||
}
|
||||
g.node.failed rect {
|
||||
stroke: red;
|
||||
}
|
||||
g.node.shutdown rect{
|
||||
stroke: blue;
|
||||
}
|
||||
g.node.upstream_failed rect{
|
||||
stroke: orange;
|
||||
}
|
||||
g.node.skipped rect{
|
||||
stroke: pink;
|
||||
}
|
||||
div#svg_container {
|
||||
border: 1px solid black;
|
||||
background-color: #EEE;
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
#refresh_button {
|
||||
top: 15px;
|
||||
right: 15px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#loading {
|
||||
margin: auto;
|
||||
display: none;
|
||||
position: relative;
|
||||
width: 100px;
|
||||
top: -550px;
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
/**
|
||||
* jQuery Clock plugin
|
||||
* Copyright (c) 2010 John R D'Orazio (priest@johnromanodorazio.com)
|
||||
* Licensed under the Apache 2.0 license:
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*/
|
||||
Date.prototype.hasOwnProperty("stdTimezoneOffset")||(Date.prototype.stdTimezoneOffset=function(){var b=this.getFullYear();if(!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(b)){for(var d=(new Date(b,0,1)).getTimezoneOffset(),h=[6,7,5,8,4,9,3,10,2,11,1],a=0;12>a;a++){var m=(new Date(b,h[a],1)).getTimezoneOffset();if(m!=d){d=Math.max(d,m);break}}Date.prototype.stdTimezoneOffset.cache[b]=d}return Date.prototype.stdTimezoneOffset.cache[b]},Date.prototype.stdTimezoneOffset.cache={});
|
||||
Date.prototype.hasOwnProperty("isDST")||(Date.prototype.isDST=function(){return this.getTimezoneOffset()<this.stdTimezoneOffset()});Date.prototype.hasOwnProperty("isLeapYear")||(Date.prototype.isLeapYear=function(){var b=this.getFullYear();return 0!=(b&3)?!1:0!=b%100||0==b%400});Date.prototype.hasOwnProperty("getDOY")||(Date.prototype.getDOY=function(){var b=this.getMonth(),d=this.getDate(),d=[0,31,59,90,120,151,181,212,243,273,304,334][b]+d;1<b&&this.isLeapYear()&&d++;return d});
|
||||
Date.prototype.hasOwnProperty("daysInMonth")||(Date.prototype.daysInMonth=function(){return[31,this.isLeapYear()?29:28,31,30,31,30,31,31,30,31,30,31][this.getMonth()]});Date.prototype.hasOwnProperty("getWOY")||(Date.prototype.getWOY=function(b){var d=new Date(+this);d.setHours(0,0,0,0);d.setDate(d.getDate()+4-(d.getDay()||7));return b?d.getFullYear():Math.ceil(((d-new Date(d.getFullYear(),0,1))/864E5+1)/7)});
|
||||
Date.prototype.hasOwnProperty("swatchTime")||(Date.prototype.swatchTime=function(){return("00"+Math.floor((60*((this.getUTCHours()+1)%24*60+this.getUTCMinutes())+this.getUTCSeconds()+.001*this.getUTCMilliseconds())/86.4)).slice(-3)});String.prototype.padStart||(String.prototype.padStart=function(b,d){b>>=0;d=String(d||" ");if(this.length>b)return String(this);b-=this.length;b>d.length&&(d+=d.repeat(b/d.length));return d.slice(0,b)+String(this)});
|
||||
(function(b,d){b.clock={version:"2.3.0",options:[{type:"string",value:"destroy",description:"Passing in 'destroy' to an already initialized clock will remove the setTimeout for that clock to stop it from ticking, and remove all html markup and data associated with the plugin instance on the dom elements"},{type:"string",value:"stop",description:"Passing in 'stop' to an already initialized clock will clear the setTimeout for that clock to stop it from ticking"},{type:"string",value:"start",description:"Passing in 'start' to an already initialized clock will restart the setTimeout for that clock to get it ticking again, as though it had never lost time"},
|
||||
{type:"object",description:"option set {}",values:[{name:"timestamp",description:"Either a javascript timestamp as produces by [JAVASCRIPT new Date().getTime()] or a php timestamp as produced by [PHP time()] ",type:"unix timestamp",values:["javascript timestamp","php timestamp"]},{name:"langSet",description:"two letter locale to be used for the translation of Day names and Month names",type:"String",values:"am ar bn bg ca zh hr cs da nl en et fi fr de el gu hi hu id it ja kn ko lv lt ms ml mr mo ps fa pl pt ro ru sr sk sl es sw sv ta te th tr uk vi".split(" ")},
|
||||
{name:"calendar",description:"Whether the date should be displayed together with the time",type:"Boolean",values:[!0,!1]},{name:"dateFormat",description:"PHP Style Format string for formatting a local date, see http://php.net/manual/en/function.date.php",type:"String",values:"dDjlNSwzWFmMntLoYy".split("")},{name:"timeFormat",description:"PHP Style Format string for formatting a local date, see http://php.net/manual/en/function.date.php",type:"String",values:"aABgGhHisveIOPZcrU".split("")},{name:"isDST",
|
||||
description:"When a client side timestamp is used, whether DST is active will be automatically determined. However this cannot be determined for a server-side timestamp which must be passed in as UTC, in that can case it can be set with this option",type:"Boolean",values:[!0,!1]},{name:"rate",description:"Defines the rate at which the clock will update, in milliseconds",type:"Integer",values:"1 - 9007199254740991 (recommended 10-60000)"}]}],methods:{destroy:"Chaining clock().destroy() has the same effect as passing the 'destroy' option as in clock('destroy')",
|
||||
stop:"Chaining clock().stop() has the same effect as passing the 'stop' option as in clock('stop')",start:"Chaining clock().start() has the same effect as passing the 'start' option as in clock('start')"}};Object.freeze(b.clock);var h=h||{};b.fn.clock=function(a){var m=this;this.initialize=function(){return this};this.destroy=function(){return m.each(function(a){a=b(this).attr("id");h.hasOwnProperty(a)&&(clearTimeout(h[a]),delete h[a]);b(this).html("");b(this).hasClass("jqclock")&&b(this).removeClass("jqclock");
|
||||
b(this).removeData("clockoptions")})};this.stop=function(){return m.each(function(a){a=b(this).attr("id");h.hasOwnProperty(a)&&(clearTimeout(h[a]),delete h[a])})};this.start=function(){return m.each(function(a){a=b(this).attr("id");var c=b(this).data("clockoptions");if(c!==d&&!1===h.hasOwnProperty(a)){var g=this;h[a]=setTimeout(function(){x(b(g))},c.rate)}})};var B=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0;return("x"==a?b:b&3|8).toString(16)}).toUpperCase()},
|
||||
x=function(a){var c=b(a).data("clockoptions"),d=(new Date).getTime()+c.sysdiff,k=new Date(d),g=k.getHours(),m=k.getMinutes(),C=k.getSeconds(),B=k.getMilliseconds(),e=k.getDay(),l=k.getDate(),D=k.getMonth(),y=k.getFullYear(),p=k.isLeapYear(),w=k.getDOY(),q=k.getWOY(),v=k.getWOY(!0),G=k.daysInMonth(),H=k.swatchTime(),n=parseInt(c.tzOffset/60),z=parseInt(60*c.tzOffset),E="AM",f="",r="";11<g&&(E="PM");r=g;12<r?r-=12:0===r&&(r=12);if(!0===c.calendar){for(var f="",t=0;t<=c.dateFormat.length;t++){var F=
|
||||
c.dateFormat.charAt(t);switch(F){case "d":f+=(""+l).padStart(2,"0");break;case "D":f+=(new Intl.DateTimeFormat(c.langSet,{weekday:"short"})).format(k);break;case "j":f+=l;break;case "l":f+=(new Intl.DateTimeFormat(c.langSet,{weekday:"long"})).format(k);break;case "N":f+=0===e?7:e;break;case "S":f+=1===l||1===l%10&&11!=l?"st":2===l||2===l%10&&12!=l?"nd":3===l||3===l%10&&13!=l?"rd":"th";break;case "w":f+=e;break;case "z":f+=w-1;break;case "W":f+=q;break;case "F":f+=(new Intl.DateTimeFormat(c.langSet,
|
||||
{month:"long"})).format(k);break;case "m":f+=(D+1+"").padStart(2,"0");break;case "M":f+=(new Intl.DateTimeFormat(c.langSet,{month:"short"})).format(k);break;case "n":f+=D+1;break;case "t":f+=G;break;case "L":f+=p?1:0;break;case "o":f+=v;break;case "Y":f+=y;break;case "y":f+=y.toString().substr(2,2);break;case String.fromCharCode(92):f+=c.dateFormat.charAt(++t);break;case "%":for(var u=t+1,A=c.dateFormat;u<A.length&&"%"!=A.charAt(u);)u++;u>t+1&&u!=A.length?(f+=A.substring(t+1,u),t+=u-t):f+=F;break;
|
||||
default:f+=F}}f='<span class="clockdate">'+f+"</span>"}e="";for(p=0;p<=c.timeFormat.length;p++)switch(w=c.timeFormat.charAt(p),w){case "a":e+=E.toLowerCase();break;case "A":e+=E;break;case "B":e+=H;break;case "g":e+=r;break;case "G":e+=g;break;case "h":e+=(""+r).padStart(2,"0");break;case "H":e+=(""+g).padStart(2,"0");break;case "i":e+=(""+m).padStart(2,"0");break;case "s":e+=(""+C).padStart(2,"0");break;case "v":e+=(""+B).padStart(3,"0");break;case "e":e+=c.timezone;break;case "I":e+=c.isDST?"DST":
|
||||
"";break;case "O":e+=(0>n?"+"+(""+Math.abs(n)).padStart(2,"0"):0<n?(""+-1*n).padStart(2,"0"):"+00")+"00";break;case "P":e+=(0>n?"+"+(""+Math.abs(n)).padStart(2,"0"):0<n?(""+-1*n).padStart(2,"0"):"+00")+":00";break;case "Z":e+=0>z?""+Math.abs(z):0<z?""+-1*z:"0";break;case "c":e+=y+"-"+(D+1+"").padStart(2,"0")+"-"+(""+l).padStart(2,"0")+"T"+(""+g).padStart(2,"0")+":"+(""+m).padStart(2,"0")+":"+(""+C).padStart(2,"0")+(0>n?"+"+(""+Math.abs(n)).padStart(2,"0"):0<tzh?(""+-1*tzh).padStart(2,"0"):"+00")+
|
||||
":00";break;case "r":e+=(new Intl.DateTimeFormat(c.langSet,{weekday:"short"})).format(k)+", "+l+" "+(new Intl.DateTimeFormat(c.langSet,{month:"short"})).format(k)+" "+y+" "+(""+g).padStart(2,"0")+":"+(""+m).padStart(2,"0")+":"+(""+C).padStart(2,"0")+" "+(0>n?"+"+(""+Math.abs(n)).padStart(2,"0"):0<tzh?(""+-1*tzh).padStart(2,"0"):"+00")+"00";break;case "U":e+=Math.floor(d/1E3);break;case String.fromCharCode(92):e+=c.timeFormat.charAt(++p);break;case "%":q=p+1;for(v=c.timeFormat;q<v.length&&"%"!=v.charAt(q);)q++;
|
||||
q>p+1&&q!=v.length?(e+=v.substring(p+1,q),p+=q-p):e+=w;break;default:e+=w}r='<span class="clocktime">'+e+"</span>";b(a).html(f+r);d=b(a).attr("id");h[d]=setTimeout(function(){x(b(a))},c.rate)};this.each(function(g){if("undefined"===typeof a||"object"===typeof a){g=new Date;a=a||{};a.timestamp=a.timestamp||"localsystime";a.langSet=a.langSet||"en";a.calendar=a.hasOwnProperty("calendar")?a.calendar:!0;a.dateFormat=a.dateFormat||("en"==a.langSet?"l, F j, Y":"l, j F Y");a.timeFormat=a.timeFormat||("en"==
|
||||
a.langSet?"h:i:s A":"H:i:s");a.timezone=a.timezone||"localsystimezone";a.isDST=a.hasOwnProperty("isDST")?a.isDST:g.isDST();a.rate=a.rate||500;"string"!==typeof a.langSet&&(a.langSet=""+a.langSet);"string"===typeof a.calendar?a.calendar="false"==a.calendar?!1:!0:"boolean"!==typeof a.calendar&&(a.calendar=!!a.calendar);"string"!==typeof a.dateFormat&&(a.dateFormat=""+a.dateFormat);"string"!==typeof a.timeFormat&&(a.timeFormat=""+a.dateFormat);"string"!==typeof a.timezone&&(a.timezone=""+a.timezone);
|
||||
"string"===typeof a.isDST?a.isDST="true"==a.isDST?!0:!1:"boolean"!==typeof a.isDST&&(a.isDST=!!a.isDST);"number"!==typeof a.rate&&(a.rate=parseInt(a.rate));a.tzOffset=g.getTimezoneOffset();var c=a.tzOffset/60;a.sysdiff=0;"localsystime"!=a.timestamp?2<(g.getTime()+"").length-(a.timestamp+"").length?(a.timestamp*=1E3,a.sysdiff=a.timestamp-g.getTime()+6E4*a.tzOffset):(a.sysdiff=a.timestamp-g.getTime(),"localsystimezone"==a.timezone&&(a.timezone="UTC",0>c?a.timezone+="+"+Math.abs(c):0<c&&(a.timezone+=
|
||||
-1*c))):"localsystimezone"==a.timezone&&(a.timezone="UTC",0>c?a.timezone+="+"+Math.abs(c):0<c&&(a.timezone+=-1*c));b(this).hasClass("jqclock")||b(this).addClass("jqclock");b(this).is("[id]")||b(this).attr("id",B());b(this).data("clockoptions",a);!1===h.hasOwnProperty(b(this).attr("id"))&&x(b(this))}else if("string"===typeof a)switch(g=b(this).attr("id"),a){case "destroy":h.hasOwnProperty(g)&&(clearTimeout(h[g]),delete h[g]);b(this).html("");b(this).hasClass("jqclock")&&b(this).removeClass("jqclock");
|
||||
b(this).removeData("clockoptions");break;case "stop":h.hasOwnProperty(g)&&(clearTimeout(h[g]),delete h[g]);break;case "start":var m=this,c=b(this).data("clockoptions");c!==d&&!1===h.hasOwnProperty(g)&&(h[g]=setTimeout(function(){x(b(m))},c.rate))}});return this.initialize()};return this})(jQuery);
|
|
@ -1,495 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Table styles
|
||||
*/
|
||||
table.dataTable {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
clear: both;
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
/*
|
||||
* Header and footer styles
|
||||
*/
|
||||
/*
|
||||
* Body styles
|
||||
*/
|
||||
}
|
||||
table.dataTable thead th,
|
||||
table.dataTable tfoot th {
|
||||
font-weight: bold;
|
||||
}
|
||||
table.dataTable thead th,
|
||||
table.dataTable thead td {
|
||||
padding: 10px 18px;
|
||||
border-bottom: 1px solid #111111;
|
||||
}
|
||||
table.dataTable thead th:active,
|
||||
table.dataTable thead td:active {
|
||||
outline: none;
|
||||
}
|
||||
table.dataTable tfoot th,
|
||||
table.dataTable tfoot td {
|
||||
padding: 10px 18px 6px 18px;
|
||||
border-top: 1px solid #111111;
|
||||
}
|
||||
table.dataTable thead .sorting_asc,
|
||||
table.dataTable thead .sorting_desc,
|
||||
table.dataTable thead .sorting {
|
||||
cursor: pointer;
|
||||
*cursor: hand;
|
||||
}
|
||||
table.dataTable thead .sorting {
|
||||
background: url("../images/sort_both.png") no-repeat center right;
|
||||
}
|
||||
table.dataTable thead .sorting_asc {
|
||||
background: url("../images/sort_asc.png") no-repeat center right;
|
||||
}
|
||||
table.dataTable thead .sorting_desc {
|
||||
background: url("../images/sort_desc.png") no-repeat center right;
|
||||
}
|
||||
table.dataTable thead .sorting_asc_disabled {
|
||||
background: url("../images/sort_asc_disabled.png") no-repeat center right;
|
||||
}
|
||||
table.dataTable thead .sorting_desc_disabled {
|
||||
background: url("../images/sort_desc_disabled.png") no-repeat center right;
|
||||
}
|
||||
table.dataTable tbody tr {
|
||||
background-color: white;
|
||||
}
|
||||
table.dataTable tbody tr.selected {
|
||||
background-color: #b0bed9;
|
||||
}
|
||||
table.dataTable tbody th,
|
||||
table.dataTable tbody td {
|
||||
padding: 8px 10px;
|
||||
}
|
||||
table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
|
||||
border-top: 1px solid #dddddd;
|
||||
}
|
||||
table.dataTable.row-border tbody tr:first-child th,
|
||||
table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
|
||||
table.dataTable.display tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
|
||||
border-top: 1px solid #dddddd;
|
||||
border-right: 1px solid #dddddd;
|
||||
}
|
||||
table.dataTable.cell-border tbody tr th:first-child,
|
||||
table.dataTable.cell-border tbody tr td:first-child {
|
||||
border-left: 1px solid #dddddd;
|
||||
}
|
||||
table.dataTable.cell-border tbody tr:first-child th,
|
||||
table.dataTable.cell-border tbody tr:first-child td {
|
||||
border-top: none;
|
||||
}
|
||||
table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
|
||||
background-color: #abb9d3;
|
||||
}
|
||||
table.dataTable.hover tbody tr:hover,
|
||||
table.dataTable.hover tbody tr.odd:hover,
|
||||
table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
|
||||
table.dataTable.display tbody tr.odd:hover,
|
||||
table.dataTable.display tbody tr.even:hover {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
table.dataTable.hover tbody tr:hover.selected,
|
||||
table.dataTable.hover tbody tr.odd:hover.selected,
|
||||
table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
|
||||
table.dataTable.display tbody tr.odd:hover.selected,
|
||||
table.dataTable.display tbody tr.even:hover.selected {
|
||||
background-color: #a9b7d1;
|
||||
}
|
||||
table.dataTable.order-column tbody tr > .sorting_1,
|
||||
table.dataTable.order-column tbody tr > .sorting_2,
|
||||
table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
|
||||
table.dataTable.display tbody tr > .sorting_2,
|
||||
table.dataTable.display tbody tr > .sorting_3 {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
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.display tbody tr.selected > .sorting_1,
|
||||
table.dataTable.display tbody tr.selected > .sorting_2,
|
||||
table.dataTable.display tbody tr.selected > .sorting_3 {
|
||||
background-color: #acbad4;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
|
||||
background-color: #f3f3f3;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
|
||||
background-color: #a6b3cd;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
|
||||
background-color: #a7b5ce;
|
||||
}
|
||||
table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
|
||||
background-color: #a9b6d0;
|
||||
}
|
||||
table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
|
||||
background-color: #fbfbfb;
|
||||
}
|
||||
table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
|
||||
background-color: #fdfdfd;
|
||||
}
|
||||
table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
|
||||
background-color: #acbad4;
|
||||
}
|
||||
table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
|
||||
background-color: #adbbd6;
|
||||
}
|
||||
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:hover > .sorting_1,
|
||||
table.dataTable.display tbody tr.odd:hover > .sorting_1,
|
||||
table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
|
||||
table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
|
||||
table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
|
||||
background-color: #eaeaea;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover > .sorting_2,
|
||||
table.dataTable.display tbody tr.odd:hover > .sorting_2,
|
||||
table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
|
||||
table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
|
||||
table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
|
||||
background-color: #ebebeb;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover > .sorting_3,
|
||||
table.dataTable.display tbody tr.odd:hover > .sorting_3,
|
||||
table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
|
||||
table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
|
||||
table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover.selected > .sorting_1,
|
||||
table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
|
||||
table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
|
||||
table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
|
||||
table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
|
||||
background-color: #a1aec7;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover.selected > .sorting_2,
|
||||
table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
|
||||
table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
|
||||
table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
|
||||
table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
|
||||
background-color: #a2afc8;
|
||||
}
|
||||
table.dataTable.display tbody tr:hover.selected > .sorting_3,
|
||||
table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
|
||||
table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
|
||||
table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
|
||||
table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
|
||||
background-color: #a4b2cb;
|
||||
}
|
||||
table.dataTable.no-footer {
|
||||
border-bottom: 1px solid #111111;
|
||||
}
|
||||
table.dataTable.nowrap th, table.dataTable.nowrap td {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable.compact thead th,
|
||||
table.dataTable.compact thead td {
|
||||
padding: 5px 9px;
|
||||
}
|
||||
table.dataTable.compact tfoot th,
|
||||
table.dataTable.compact tfoot td {
|
||||
padding: 5px 9px 3px 9px;
|
||||
}
|
||||
table.dataTable.compact tbody th,
|
||||
table.dataTable.compact tbody td {
|
||||
padding: 4px 5px;
|
||||
}
|
||||
table.dataTable th.dt-left,
|
||||
table.dataTable td.dt-left {
|
||||
text-align: left;
|
||||
}
|
||||
table.dataTable th.dt-center,
|
||||
table.dataTable td.dt-center,
|
||||
table.dataTable td.dataTables_empty {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable th.dt-right,
|
||||
table.dataTable td.dt-right {
|
||||
text-align: right;
|
||||
}
|
||||
table.dataTable th.dt-justify,
|
||||
table.dataTable td.dt-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
table.dataTable th.dt-nowrap,
|
||||
table.dataTable td.dt-nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable thead th.dt-head-left,
|
||||
table.dataTable thead td.dt-head-left,
|
||||
table.dataTable tfoot th.dt-head-left,
|
||||
table.dataTable tfoot td.dt-head-left {
|
||||
text-align: left;
|
||||
}
|
||||
table.dataTable thead th.dt-head-center,
|
||||
table.dataTable thead td.dt-head-center,
|
||||
table.dataTable tfoot th.dt-head-center,
|
||||
table.dataTable tfoot td.dt-head-center {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable thead th.dt-head-right,
|
||||
table.dataTable thead td.dt-head-right,
|
||||
table.dataTable tfoot th.dt-head-right,
|
||||
table.dataTable tfoot td.dt-head-right {
|
||||
text-align: right;
|
||||
}
|
||||
table.dataTable thead th.dt-head-justify,
|
||||
table.dataTable thead td.dt-head-justify,
|
||||
table.dataTable tfoot th.dt-head-justify,
|
||||
table.dataTable tfoot td.dt-head-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
table.dataTable thead th.dt-head-nowrap,
|
||||
table.dataTable thead td.dt-head-nowrap,
|
||||
table.dataTable tfoot th.dt-head-nowrap,
|
||||
table.dataTable tfoot td.dt-head-nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-left,
|
||||
table.dataTable tbody td.dt-body-left {
|
||||
text-align: left;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-center,
|
||||
table.dataTable tbody td.dt-body-center {
|
||||
text-align: center;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-right,
|
||||
table.dataTable tbody td.dt-body-right {
|
||||
text-align: right;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-justify,
|
||||
table.dataTable tbody td.dt-body-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
table.dataTable tbody th.dt-body-nowrap,
|
||||
table.dataTable tbody td.dt-body-nowrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
table.dataTable,
|
||||
table.dataTable th,
|
||||
table.dataTable td {
|
||||
-webkit-box-sizing: content-box;
|
||||
-moz-box-sizing: content-box;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/*
|
||||
* Control feature layout
|
||||
*/
|
||||
.dataTables_wrapper {
|
||||
position: relative;
|
||||
clear: both;
|
||||
*zoom: 1;
|
||||
zoom: 1;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_length {
|
||||
float: left;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_filter {
|
||||
float: right;
|
||||
text-align: right;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_filter input {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_info {
|
||||
clear: both;
|
||||
float: left;
|
||||
padding-top: 0.755em;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
float: right;
|
||||
text-align: right;
|
||||
padding-top: 0.25em;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button {
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
min-width: 1.5em;
|
||||
padding: 0.5em 1em;
|
||||
margin-left: 2px;
|
||||
text-align: center;
|
||||
text-decoration: none !important;
|
||||
cursor: pointer;
|
||||
*cursor: hand;
|
||||
color: #333333 !important;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
|
||||
color: #333333 !important;
|
||||
border: 1px solid #cacaca;
|
||||
background-color: white;
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, gainsboro));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, white 0%, gainsboro 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(top, white 0%, gainsboro 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(top, white 0%, gainsboro 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(top, white 0%, gainsboro 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to bottom, white 0%, gainsboro 100%);
|
||||
/* W3C */
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
|
||||
cursor: default;
|
||||
color: #666 !important;
|
||||
border: 1px solid transparent;
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
|
||||
color: white !important;
|
||||
border: 1px solid #111111;
|
||||
background-color: #585858;
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111111));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, #585858 0%, #111111 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(top, #585858 0%, #111111 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(top, #585858 0%, #111111 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(top, #585858 0%, #111111 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to bottom, #585858 0%, #111111 100%);
|
||||
/* W3C */
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate .paginate_button:active {
|
||||
outline: none;
|
||||
background-color: #2b2b2b;
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
|
||||
/* W3C */
|
||||
box-shadow: inset 0 0 3px #111;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_processing {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
margin-left: -50%;
|
||||
margin-top: -25px;
|
||||
padding-top: 20px;
|
||||
text-align: center;
|
||||
font-size: 1.2em;
|
||||
background-color: white;
|
||||
background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
|
||||
/* Chrome,Safari4+ */
|
||||
background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
/* Chrome10+,Safari5.1+ */
|
||||
background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
/* FF3.6+ */
|
||||
background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
/* IE10+ */
|
||||
background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
/* Opera 11.10+ */
|
||||
background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
|
||||
/* W3C */
|
||||
}
|
||||
.dataTables_wrapper .dataTables_length,
|
||||
.dataTables_wrapper .dataTables_filter,
|
||||
.dataTables_wrapper .dataTables_info,
|
||||
.dataTables_wrapper .dataTables_processing,
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
color: #333333;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll {
|
||||
clear: both;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
|
||||
*margin-top: -1px;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
|
||||
.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
.dataTables_wrapper.no-footer .dataTables_scrollBody {
|
||||
border-bottom: 1px solid #111111;
|
||||
}
|
||||
.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
|
||||
.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
|
||||
border-bottom: none;
|
||||
}
|
||||
.dataTables_wrapper:after {
|
||||
visibility: hidden;
|
||||
display: block;
|
||||
content: "";
|
||||
clear: both;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
.dataTables_wrapper .dataTables_info,
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
float: none;
|
||||
text-align: center;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_paginate {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 640px) {
|
||||
.dataTables_wrapper .dataTables_length,
|
||||
.dataTables_wrapper .dataTables_filter {
|
||||
float: none;
|
||||
text-align: center;
|
||||
}
|
||||
.dataTables_wrapper .dataTables_filter {
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
}
|
|
@ -1,189 +0,0 @@
|
|||
/*
|
||||
* This combined file was created by the DataTables downloader builder:
|
||||
* https://datatables.net/download
|
||||
*
|
||||
* To rebuild or modify this file with the latest versions of the included
|
||||
* software please visit:
|
||||
* https://datatables.net/download/#bs/dt-1.10.10
|
||||
*
|
||||
* Included libraries:
|
||||
* DataTables 1.10.10
|
||||
*/
|
||||
|
||||
/*!
|
||||
DataTables 1.10.10
|
||||
©2008-2015 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)&&db(a)}function eb(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 fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,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 hb(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&&(fb(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=Q(g),i=b.mRender?Q(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.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 R(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 U(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)&&Z(a);v(a,null,"column-sizing",[a])}function $(a,b){var c=aa(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function ba(a,b){var c=aa(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function ca(a){return aa(a,
|
||||
"bVisible").length}function aa(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,u;e=0;for(f=b.length;e<f;e++)if(l=b[e],u=[],!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++){u[i]===k&&(u[i]=B(a,i,e,"type"));q=d[g](u[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 ib(a,
|
||||
b,c,d){var e,f,g,j,i,o,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){o=b[e];var q=o.targets!==k?o.targets:o.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],o)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],o);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,o)}}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 ma(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)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(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 Q(a){if(h.isPlainObject(a)){var b=
|
||||
{};h.each(a,function(a,c){c&&(b[a]=Q(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,o=j.length;i<o;i++){f=j[i].match(da);g=j[i].match(V);if(f){j[i]=j[i].replace(da,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=
|
||||
j.join(".");if(h.isArray(a)){i=0;for(o=a.length;i<o;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 R(a){if(h.isPlainObject(a))return R(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,o=e.length-1;i<o;i++){g=e[i].match(da);j=e[i].match(V);if(g){e[i]=e[i].replace(da,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(o=d.length;j<o;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(da,"")]=
|
||||
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 na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(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 ea(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,o,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],u=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},S=function(a){if(c===k||
|
||||
c===i)j=l[i],o=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,o),u(j.mData.sort,a),u(j.mData.type,a),u(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,o)):d[i]=o;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)S(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)S(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(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,h,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++){h=a.aoColumns[l];i=c?d[l]:H.createElement(h.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if(!c||h.mRender||h.mData!==l)i.innerHTML=B(a,b,l,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&&i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}v(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?pa(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 kb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=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,o);i&&fa(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(o.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 ga(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,o;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(o=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+o]!==k&&g[d][f].cell==g[d][f+o].cell;){for(c=
|
||||
0;c<i;c++)j[d+c][f+o]=1;o++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function O(a){var b=v(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,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&
|
||||
!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;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 u=d[c%e];q._sRowStripe!=u&&(h(l).removeClass(q._sRowStripe).addClass(u),q._sRowStripe=u)}v(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:ca(a),
|
||||
"class":a.oClasses.sRowEmpty}).html(c))[0];v(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,o,i]);v(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,o,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));v(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&&mb(a);d?ha(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=
|
||||
!1}function nb(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,o,l,q,u=0;u<f.length;u++){g=null;j=f[u];if("<"==j){i=h("<div/>")[0];o=f[u+1];if("'"==o||'"'==o){l="";for(q=2;f[u+q]!=o;)l+=f[u+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(o=l.split("."),
|
||||
i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;u+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==j&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(o=i.length;q<o;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 fa(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,o,l,q,u;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++;o=g;u=1===l?!0:!1;for(j=0;j<l;j++)for(g=
|
||||
0;g<q;g++)a[f+g][o+j]={cell:e,unique:u},a[f+g].nTr=d}e=e.nextSibling}}}function qa(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],fa(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 ra(a,b,c){v(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){v(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var o=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&o?o:h.extend(!0,b,o);delete g.data}o={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=v(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;v(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(o,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(o,g)),g.data=f)}function lb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,!0),ra(a,ub(a),function(b){vb(a,b)}),!1):!0}function ub(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o,
|
||||
l,q=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",D(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var S={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)o=b[g],l=f[g],i="function"==typeof o.mData?"function":o.mData,S.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:l.sSearch,
|
||||
regex:l.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,l.sSearch),k("bRegex_"+g,l.bRegex),k("bSearchable_"+g,o.bSearchable)),d.bSort&&k("bSortable_"+g,o.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(h.each(q,function(a,b){S.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+a,b.dir)}),k("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:S:b?j:S}function vb(a,b){var c=sa(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}na(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||ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(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?Q(c)(b):b}function pb(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&&(ha(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).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("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 ha(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)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)xb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);yb(a)}else f(b);a.bFiltered=!0;v(a,null,"search",[a])}function yb(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,o=c.length;i<o;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 xb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Qa(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function wb(a,b,c,d,e,f){var d=Qa(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&(c=!0);g=zb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=
|
||||
c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,d){a=b?a:va(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 va(a){return a.replace(Yb,"\\$1")}function zb(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("&")&&(wa.innerHTML=i,i=Zb?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c}function Ab(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Bb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,
|
||||
bCaseInsensitive:a.caseInsensitive}}function sb(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:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Cb(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=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(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 ia(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);ga(a,a.aoHeader);ga(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=w(f.sWidth));v(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)N(a,f[b]);a.iInitDisplayStart=d;T(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a))}else setTimeout(function(){ia(a)},200)}
|
||||
function ta(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&U(a);v(a,null,"plugin-init",[a,b]);v(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);v(a,null,"length",[a,c])}function ob(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).bind("change.DT",function(){Ra(a,h(this).val());O(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function tb(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 Ta(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&&(v(a,null,"page",[a]),c&&O(a));return b}function qb(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");v(a,null,"processing",[a,b])}function rb(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)),o=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:w(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:w(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:w(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.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],u=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(u.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=u;a.aoDrawCallback.push({fn:Z,sName:"scrolling"});return i[0]}function Z(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,o=j.children("table"),j=a.nScrollBody,l=h(j),q=j.style,u=h(a.nScrollFoot).children("div"),
|
||||
m=u.children("table"),n=h(a.nTHead),p=h(a.nTable),t=p[0],v=t.style,r=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,Ua=Eb.bScrollOversize,s,L,P,x,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,U(a);else{a.scrollBarVis=L;p.children("thead, tfoot").remove();x=n.clone().prependTo(p);n=n.find("tr");L=x.find("tr");x.find("th, td").removeAttr("tabindex");
|
||||
r&&(P=r.clone().prependTo(p),s=r.find("tr"),P=P.find("tr"));c||(q.width="100%",f[0].style.width="100%");h.each(qa(a,x),function(b,c){B=$(a,b);c.style.width=a.aoColumns[B].sWidth});r&&I(function(a){a.style.width=""},P);f=p.outerWidth();if(""===c){v.width="100%";if(Ua&&(p.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))v.width=w(p.outerWidth()-b);f=p.outerWidth()}else""!==d&&(v.width=w(d),f=p.outerWidth());I(C,L);I(function(a){A.push(a.innerHTML);y.push(w(h(a).css("width")))},
|
||||
L);I(function(a,b){a.style.width=y[b]},n);h(L).height(0);r&&(I(C,P),I(function(a){z.push(w(h(a).css("width")))},P),I(function(a,b){a.style.width=z[b]},s),h(P).height(0));I(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+A[b]+"</div>";a.style.width=y[b]},L);r&&I(function(a,b){a.innerHTML="";a.style.width=z[b]},P);if(p.outerWidth()<f){s=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(Ua&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))v.width=
|
||||
w(s-b);(""===c||""!==d)&&K(a,1,"Possible column misalignment",6)}else s="100%";q.width=w(s);g.width=w(s);r&&(a.nScrollFoot.style.width=w(s));!e&&Ua&&(q.height=w(t.offsetHeight+b));c=p.outerWidth();o[0].style.width=w(c);i.width=w(c);d=p.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+(Eb.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";r&&(m[0].style.width=w(c),u[0].style.width=w(c),u[0].style[e]=d?b+"px":"0px");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=aa(a,"bVisible"),o=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,u=!1,m,n,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)n=c[i[m]],null!==n.sWidth&&
|
||||
(n.sWidth=Fb(n.sWidthOrig,k),u=!0);if(d||!u&&!f&&!e&&j==ca(a)&&j==o.length)for(m=0;m<j;m++)i=$(a,m),null!==i&&(c[i].sWidth=w(o.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","");o=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)n=c[i[m]],o[m].style.width=null!==n.sWidthOrig&&
|
||||
""!==n.sWidthOrig?w(n.sWidthOrig):"",n.sWidthOrig&&f&&h(o[m]).append(h("<div/>").css({width:n.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)u=i[m],n=c[u],h(Gb(a,u)).clone(!1).append(n.sContentPadding).appendTo(t);n=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(o[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(o[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=w(k-g);b.style.width=w(e);n.remove()}l&&(b.style.width=w(l));if((l||f)&&!a._reszEvt)b=function(){h(E).bind("resize.DT-"+a.sInstance,ua(function(){U(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=
|
||||
k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}}function Fb(a,b){if(!a)return 0;var c=h("<div/>").css("width",w(a)).appendTo(b||H.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(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 Hb(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($b,""),c=c.replace(/ /g," "),c.length>d&&(d=c.length,e=f);return e}function w(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 o=[];f=function(a){a.length&&!h.isArray(a[0])?o.push(a):h.merge(o,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<o.length;a++){i=o[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||"string",o[a]._idx===k&&(o[a]._idx=h.inArray(o[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:o[a][1],
|
||||
index:o[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function mb(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++,Ib(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 Jb(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 Va(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];Wa(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Va(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Va(a,c,b.shiftKey,d))})}function xa(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 Ib(a,b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ba(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 ya(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:Ab(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Ab(a.aoPreSearchCols[d])}})};v(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=v(a,"aoStateLoadParams",
|
||||
"stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);e.start!==k&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start);e.length!==k&&(a._iDisplayLength=e.length);e.order!==k&&(a.aaSorting=[],h.each(e.order,function(b,c){a.aaSorting.push(c[0]>=d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];f.visible!==
|
||||
k&&(d[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Bb(f.search))}v(a,"aoStateLoaded","stateLoaded",[a,e])}}}function za(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&&v(a,null,"error",[a,d,c]),"alert"==
|
||||
b)alert(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 Lb(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 Wa(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",
|
||||
b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function v(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 Sa(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 Aa(a,b){var c=[],c=Mb.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 db(a){h.each({num:function(b){return Ba(b,
|
||||
a)},"num-fmt":function(b){return Ba(b,a,Xa)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Xa)}},function(b,c){s.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(s.type.search[b+a]=s.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,s,t,p,r,Ya={},Ob=/[\r\n]/g,Ca=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)",
|
||||
"g"),Xa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===
|
||||
typeof a)?null:Za(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},Sb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);
|
||||
return b},pa=function(a){var b=[],c,d,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},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},da=/\[.*?\]$/,V=/\(\)$/,wa=h("<div>")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;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(za(this[s.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)&&Z(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 za(this[s.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=
|
||||
s.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=s.internal;for(var e in m.ext.internal)e&&(this[e]=Nb(e));this.each(function(){var e={},e=1<d?Lb(e,a,!0):a,g=0,j,i=this.getAttribute("id"),o=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())K(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);J(l,l,!0);J(l.column,l.column,!0);J(l,h.extend(e,q.data()));var u=m.settings,g=0;for(j=u.length;g<j;g++){var p=u[g];if(p.nTable==
|
||||
this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){g=e.bRetrieve!==k?e.bRetrieve:l.bRetrieve;if(c||g)return p.oInstance;if(e.bDestroy!==k?e.bDestroy:l.bDestroy){p.oInstance.fnDestroy();break}else{K(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){u.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var n=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});n.nTable=this;n.oApi=b.internal;
|
||||
n.oInit=e;u.push(n);n.oInstance=1===b.length?b:q.dataTable();eb(e);e.oLanguage&&Fa(e.oLanguage);e.aLengthMenu&&!e.iDisplayLength&&(e.iDisplayLength=h.isArray(e.aLengthMenu[0])?e.aLengthMenu[0][0]:e.aLengthMenu[0]);e=Lb(h.extend(!0,{},l),e);F(n.oFeatures,e,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));F(n,e,["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(n.oScroll,e,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);F(n.oLanguage,e,"fnInfoCallback");z(n,"aoDrawCallback",
|
||||
e.fnDrawCallback,"user");z(n,"aoServerParams",e.fnServerParams,"user");z(n,"aoStateSaveParams",e.fnStateSaveParams,"user");z(n,"aoStateLoadParams",e.fnStateLoadParams,"user");z(n,"aoStateLoaded",e.fnStateLoaded,"user");z(n,"aoRowCallback",e.fnRowCallback,"user");z(n,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(n,"aoHeaderCallback",e.fnHeaderCallback,"user");z(n,"aoFooterCallback",e.fnFooterCallback,"user");z(n,"aoInitComplete",e.fnInitComplete,"user");z(n,"aoPreDrawCallback",e.fnPreDrawCallback,
|
||||
"user");n.rowIdFn=Q(e.rowId);gb(n);i=n.oClasses;e.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,e.oClasses),e.sDom===l.sDom&&"lfrtip"===l.sDom&&(n.sDom='<"H"lfr>t<"F"ip>'),n.renderer)?h.isPlainObject(n.renderer)&&!n.renderer.header&&(n.renderer.header="jqueryui"):n.renderer="jqueryui":h.extend(i,m.ext.classes,e.oClasses);q.addClass(i.sTable);n.iInitDisplayStart===k&&(n.iInitDisplayStart=e.iDisplayStart,n._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(n.bDeferLoading=!0,g=h.isArray(e.iDeferLoading),
|
||||
n._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading,n._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var t=n.oLanguage;h.extend(!0,t,e.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){Fa(a);J(l.oLanguage,a);h.extend(true,t,a);ia(n)},error:function(){ia(n)}}),o=!0);null===e.asStripeClasses&&(n.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=n.asStripeClasses,r=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return r.hasClass(a)}))&&
|
||||
(h("tbody tr",this).removeClass(g.join(" ")),n.asDestroyStripes=g.slice());u=[];g=this.getElementsByTagName("thead");0!==g.length&&(fa(n.aoHeader,g[0]),u=qa(n));if(null===e.aoColumns){p=[];g=0;for(j=u.length;g<j;g++)p.push(null)}else p=e.aoColumns;g=0;for(j=p.length;g<j;g++)Ga(n,u?u[g]:null);ib(n,e.aoColumnDefs,p,function(a,b){la(n,a,b)});if(r.length){var s=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(r[0]).children("th, td").each(function(a,b){var c=n.aoColumns[a];if(c.mData===
|
||||
a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(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(n,a)}}})}var w=n.oFeatures;e.bStateSave&&(w.bStateSave=!0,Kb(n,e),z(n,"aoDrawCallback",ya,"state_save"));if(e.aaSorting===k){u=n.aaSorting;g=0;for(j=u.length;g<j;g++)u[g][1]=n.aoColumns[g].asSorting[0]}xa(n);w.bSort&&z(n,"aoDrawCallback",function(){if(n.bSorted){var a=W(n),b={};h.each(a,function(a,
|
||||
c){b[c.src]=c.dir});v(n,null,"order",[n,a,b]);Jb(n)}});z(n,"aoDrawCallback",function(){(n.bSorted||y(n)==="ssp"||w.bDeferRender)&&xa(n)},"sc");g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));n.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));n.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==n.oScroll.sX||""!==n.oScroll.sY))j=h("<tfoot/>").appendTo(this);
|
||||
0===j.length||0===j.children().length?q.addClass(i.sNoFooter):0<j.length&&(n.nTFoot=j[0],fa(n.aoFooter,n.nTFoot));if(e.aaData)for(g=0;g<e.aaData.length;g++)N(n,e.aaData[g]);else(n.bDeferLoading||"dom"==y(n))&&ma(n,h(n.nTBody).children("tr"));n.aiDisplay=n.aiDisplayMaster.slice();n.bInitialised=!0;!1===o&&ia(n)}});b=null;return this};var Tb=[],x=Array.prototype,cc=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=cc(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=pa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};
|
||||
t.extend(this,this,Tb)};m.Api=t;h.extend(t.prototype,{any:function(){return 0!==this.count()},concat:x.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(x.filter)b=x.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:x.join,indexOf:x.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,o,l=this.context,m,p,r=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var n=new t(l[g]);if("table"===b)f=c.call(n,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(n,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],r.opts));i=0;for(o=p.length;i<o;i++)f=p[i],f="cell"===b?c.call(n,l[g],f.row,f.column,g,i):c.call(n,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=r.rows,b.cols=r.cols,b.opts=r.opts,a):this},lastIndexOf:x.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(x.map)b=
|
||||
x.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:x.pop,push:x.push,reduce:x.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:x.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:x.reverse,selector:null,shift:x.shift,sort:x.sort,splice:x.splice,toArray:function(){return x.slice.call(this)},to$:function(){return h(this)},
|
||||
toJQuery:function(){return h(this)},unique:function(){return new t(this.context,pa(this))},unshift:x.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=Tb,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 k=f.length;i<k;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=r=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});r("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});r("tables().body()",
|
||||
"table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});r("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});r("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});r("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){Ta(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){Ra(b,a)})});var Ub=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();ra(a,[],function(c){na(a);for(var c=sa(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){Ub(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){Ub(c,!1===b,a)})});var $a=function(a,b,c,d,e){var f=[],g,j,i,o,l,m;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(o=b.length;i<o;i++){j=b[i]&&b[i].split?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=s.selector[a];if(a.length){i=0;for(o=a.length;i<o;i++)f=a[i](d,e,f)}return pa(f)},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",
|
||||
order:"current",page:"all"},a)},bb=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=ab(b),c=this.iterator("table",function(c){var e=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!e)return[b];var j=Da(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,
|
||||
function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Sb(ja(c.aoData,j,"nTr"));if(a.nodeName&&h.inArray(a,b)!==-1)return[a._DT_RowIndex];if(typeof a==="string"&&a.charAt(0)==="#"){j=c.aIds[a.replace(/^#/,"")];if(j!==k)return[j.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)});r("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)});r("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ea(b,c,a)})});r("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});r("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)});r("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,o,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(o=l.length;i<o;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);
|
||||
Sa(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(ma(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 bb(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;ea(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()?ma(b,a)[0]:N(b,a)});return this.row(b[0])});var cb=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},Vb=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=ca(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&&cb(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)cb(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=ca(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Vb(this,
|
||||
!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()","row().child().remove()"],function(){cb(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 dc=/^(.+):(name|visIdx|visible)$/,Wb=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=ab(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return $a("column",e,function(a){var b=Pb(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,Wb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";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})}else return h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});r("columns().header()","column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});r("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});r("columns().data()",
|
||||
"column().data()",function(){return this.iterator("column-rows",Wb,1)});r("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});r("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)});r("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ja(a.aoData,
|
||||
e,"anCells",b)},1)});r("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,d){if(a===k)return c.aoColumns[d].bVisible;var e=c.aoColumns,f=e[d],g=c.aoData,j,i,m;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,D(e,"bVisible"),d+1);j=0;for(i=g.length;j<i;j++)m=g[j].nTr,e=g[j].anCells,m&&m.insertBefore(e[d],e[l]||null)}else h(D(c.aoData,"anCells",d)).detach();f.bVisible=a;ga(c,c.aoHeader);ga(c,c.aoFooter);if(b===k||b)U(c),(c.oScroll.sX||c.oScroll.sY)&&
|
||||
Z(c);v(c,null,"column-visibility",[c,d,a,b]);ya(c)}})});r("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ba(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){U(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 ba(c,b)}});p("column()",function(a,b){return bb(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=ab(c),f=b.aoData,g=Da(b,e),j=Sb(ja(f,g,"anCells")),i=h([].concat.apply([],j)),l,m=b.aoColumns.length,o,p,t,r,s,v;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){o=[];p=0;for(t=g.length;p<t;p++){l=g[p];for(r=0;r<m;r++){s={row:l,column:r};if(c){v=f[l];a(s,B(b,l,r),v.anCells?
|
||||
v.anCells[r]:null)&&o.push(s)}else o.push(s)}}return o}return h.isPlainObject(a)?[a]:i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray()},b,e)});var d=this.columns(b,c),e=this.rows(a,c),f,g,j,i,m,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(m=d[b].length;i<m;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});r("cells().nodes()","cell().node()",function(){return this.iterator("cell",
|
||||
function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});r("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)});r("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});r("cells().indexes()","cell().index()",function(){return this.iterator("cell",
|
||||
function(a,b,c){return{row:b,column:c,columnVisible:ba(a,c)}},1)});r("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ea(b,c,a,d)})});p("cell()",function(a,b,c){return bb(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;jb(b[0],c[0].row,c[0].column,a);ea(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]]: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&&ha(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});r("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}),ha(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){ya(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;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.util={throttle:ua,escapeRegex:va};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].match(/\.dt\b/)||(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",function(a){na(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;v(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(E).unbind(".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=[];xa(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=Q(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.10";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=s={buttons:{},classes:{},build:"bs/dt-1.10.10",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(s,{afnFiltering:s.search,aTypes:s.type.detect,ofnSearch:s.type.search,oSort:s.type.order,afnSortData:s.order,aoFeatures:s.feature,oApi:s.internal,oStdClasses:s.classes,
|
||||
oPagination:s.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-",Xb=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:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+
|
||||
" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[Aa(a,b)]},simple_numbers:function(a,b){return["previous",Aa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Aa(a,b),"next","last"]},_numbers:Aa,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||
|
||||
{},k,l,m=0,p=function(b,d){var n,r,t,s,v=function(b){Ta(a,b.data.action,true)};n=0;for(r=d.length;n<r;n++){s=d[n];if(h.isArray(s)){t=h("<"+(s.DT_el||"div")+"/>").appendTo(b);p(t,s)}else{k=null;l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">…</span>');break;case "first":k=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":k=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":k=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":k=
|
||||
j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:k=s+1;l=e===s?g.sPageButtonActive:""}if(k!==null){t=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(k).appendTo(b);Wa(t,{action:s},v);m++}}}},r;try{r=h(b).find(H.activeElement).data("dt-idx")}catch(n){}p(h(b).empty(),d);r&&h(b).find("[data-dt-idx="+r+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=
|
||||
b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.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 Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(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(Ob," ").replace(Ca,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(s.type.order,{"date-pre":function(a){return Date.parse(a)||0},"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}});db("");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)}})}}});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 f;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:function(a){return"string"===typeof a?a.replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):
|
||||
a}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ga,_fnColumnOptions:la,_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:$,_fnColumnIndexToVisible:ba,_fnVisbleColumns:ca,_fnGetColumns:aa,_fnColumnTypes:Ia,_fnApplyColumnDefs:ib,_fnHungarianMap:Y,_fnCamelToHungarian:J,_fnLanguageCompat:Fa,_fnBrowserDetect:gb,_fnAddData:N,_fnAddTr:ma,_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:jb,_fnSplitObjNotation:La,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,_fnGetDataMaster:Ma,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ea,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:kb,_fnDrawHead:ga,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:fa,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:ha,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Qa,
|
||||
_fnEscapeRegex:va,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ia,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:Z,_fnApplyToChildren:I,_fnCalculateColumnWidths:Ha,_fnThrottle:ua,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:w,_fnSortFlatten:W,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Va,
|
||||
_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:K,_fnMap:F,_fnBindAction:Wa,_fnCallbackReg:z,_fnCallbackFire:v,_fnLengthOverflow:Sa,_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});
|
||||
|
||||
|
||||
/*!
|
||||
DataTables Bootstrap 3 integration
|
||||
©2011-2015 SpryMedia Ltd - datatables.net/license
|
||||
*/
|
||||
(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,e){a||(a=window);if(!e||!e.fn.dataTable)e=require("datatables.net")(a,e).$;return b(e,a,a.document)}:b(jQuery,window,document)})(function(b,a,e){var d=b.fn.dataTable;b.extend(!0,d.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(d.ext.classes,
|
||||
{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm",sProcessing:"dataTables_processing panel panel-default"});d.ext.renderer.pageButton.bootstrap=function(a,h,r,m,j,n){var o=new d.Api(a),s=a.oClasses,k=a.oLanguage.oPaginate,t=a.oLanguage.oAria.paginate||{},f,g,p=0,q=function(d,e){var l,h,i,c,m=function(a){a.preventDefault();!b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};
|
||||
l=0;for(h=e.length;l<h;l++)if(c=e[l],b.isArray(c))q(d,c);else{g=f="";switch(c){case "ellipsis":f="…";g="disabled";break;case "first":f=k.sFirst;g=c+(0<j?"":" disabled");break;case "previous":f=k.sPrevious;g=c+(0<j?"":" disabled");break;case "next":f=k.sNext;g=c+(j<n-1?"":" disabled");break;case "last":f=k.sLast;g=c+(j<n-1?"":" disabled");break;default:f=c+1,g=j===c?"active":""}f&&(i=b("<li>",{"class":s.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("<a>",{href:"#",
|
||||
"aria-controls":a.sTableId,"aria-label":t[c],"data-dt-idx":p,tabindex:a.iTabIndex}).html(f)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(e.activeElement).data("dt-idx")}catch(u){}q(b(h).empty().html('<ul class="pagination"/>').children("ul"),m);i&&b(h).find("[data-dt-idx="+i+"]").focus()};d.TableTools&&(b.extend(!0,d.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"},select:{row:"active"}}),b.extend(!0,d.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}));return d});
|
||||
|
||||
|
|
@ -1,268 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
body { padding-top: 70px; }
|
||||
.container {
|
||||
width: 100%;
|
||||
}
|
||||
a.navbar-brand span {
|
||||
color: white;
|
||||
}
|
||||
.modal-backdrop{
|
||||
z-index: 0;
|
||||
position: fixed;
|
||||
}
|
||||
.modal-content{
|
||||
z-index: 5;
|
||||
}
|
||||
nav{
|
||||
-webkit-box-shadow: 0px 3px 3px #AAA;
|
||||
-moz-box-shadow: 0px 3px 3px #AAA;
|
||||
box-shadow: 0px 3px 3px #AAA;
|
||||
z-index:999;
|
||||
}
|
||||
a.navbar-brand {
|
||||
cursor: default;
|
||||
}
|
||||
td>span.glyphicon{
|
||||
padding-left: 3px;
|
||||
padding-top: 3px;
|
||||
}
|
||||
button.btn {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
div.rich_doc {
|
||||
padding: 5px 10px;
|
||||
border: 1px solid #dddddd;
|
||||
background: white;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
span.status_square {
|
||||
width:10px;
|
||||
height:10px;
|
||||
border:1px solid grey;
|
||||
display:inline-block;
|
||||
padding-left: 0px;
|
||||
cursor: pointer;
|
||||
}
|
||||
div.squares{
|
||||
float:right;
|
||||
font-size: 1;
|
||||
}
|
||||
div.task_row{
|
||||
}
|
||||
span.success{
|
||||
background-color: green;
|
||||
}
|
||||
span.up_for_retry{
|
||||
background-color: gold;
|
||||
}
|
||||
span.up_for_reschedule{
|
||||
background-color: turquoise;
|
||||
}
|
||||
span.started{
|
||||
background-color: lime;
|
||||
}
|
||||
span.error{
|
||||
background-color: red;
|
||||
}
|
||||
span.queued{
|
||||
background-color: gray;
|
||||
}
|
||||
span.upstream_failed{
|
||||
background-color: orange;
|
||||
}
|
||||
span.skipped{
|
||||
background-color: pink;
|
||||
}
|
||||
.tooltip-inner {
|
||||
max-width: 500px;
|
||||
text-align:left !important;
|
||||
font-size: 12px;
|
||||
}
|
||||
input#execution_date {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
table.highlighttable{
|
||||
width: 100%;
|
||||
table-layout:fixed;
|
||||
}
|
||||
div.linenodiv {
|
||||
padding-right: 1px !important;
|
||||
}
|
||||
.linenos {
|
||||
width: 50px;
|
||||
border: none;
|
||||
}
|
||||
div.linenodiv pre {
|
||||
padding-left: 4px;
|
||||
padding-right: 4px;
|
||||
color: #AAA;
|
||||
background-color: #FCFCFC;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
pre {
|
||||
overflow: auto;
|
||||
word-wrap: normal;
|
||||
white-space: pre;
|
||||
}
|
||||
pre code {
|
||||
overflow-wrap: normal;
|
||||
white-space: pre;
|
||||
}
|
||||
input, select {
|
||||
margin: 0px;
|
||||
}
|
||||
.code {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
#sql {
|
||||
border: 1px solid #CCC;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.ace_editor div {
|
||||
font: inherit!important
|
||||
}
|
||||
#ace_container {
|
||||
margin: 10px 0px;
|
||||
}
|
||||
#sql_ace {
|
||||
visibility: hidden;
|
||||
}
|
||||
table.dataframe {
|
||||
font-size: 12px;
|
||||
}
|
||||
table.dataframe tbody tr td {
|
||||
padding: 2px;
|
||||
}
|
||||
table thead th {
|
||||
background-color: #F3F3F3;
|
||||
}
|
||||
table.dataframe.dataTable thead > tr > th {
|
||||
padding: 10px 20px 10px 10px;
|
||||
}
|
||||
table.dataTable.dataframe thead .sorting {
|
||||
background: url('sort_both.png') no-repeat center right
|
||||
}
|
||||
table.dataTable.dataframe thead .sorting_desc {
|
||||
background: url('sort_desc.png') no-repeat center right
|
||||
}
|
||||
table.dataTable.dataframe thead .sorting_asc {
|
||||
background: url('sort_asc.png') no-repeat center right
|
||||
}
|
||||
.no-wrap {
|
||||
white-space: nowrap;
|
||||
}
|
||||
div.form-inline{
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
body div.panel {
|
||||
padding: 0px;
|
||||
}
|
||||
.blur {
|
||||
filter:url(#blur-effect-1);
|
||||
}
|
||||
div.legend_item {
|
||||
-moz-border-radius: 5px/5px;
|
||||
-webkit-border-radius: 5px 5px;
|
||||
border-radius: 5px/5px;
|
||||
float:right;
|
||||
margin: 0px 3px 0px 0px;
|
||||
padding:0px 3px;
|
||||
border:solid 2px grey;
|
||||
font-size: 11px;
|
||||
}
|
||||
div.legend_circle{
|
||||
-moz-border-radius: 10px/10px;
|
||||
-webkit-border-radius: 10px 10px;
|
||||
border-radius: 10px/10px;
|
||||
width:15px;
|
||||
height:15px;
|
||||
border:1px solid grey;
|
||||
float:left;
|
||||
margin-top: 2px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
div.square {
|
||||
width:12px;
|
||||
height:12px;
|
||||
float: right;
|
||||
margin-top: 2px;
|
||||
border:1px solid black;
|
||||
}
|
||||
.btn:active, .btn.active {
|
||||
box-shadow: inset 0 6px 6px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.hll { background-color: #ffffcc }
|
||||
.c { color: #408080; font-style: italic } /* Comment */
|
||||
.err { border: 1px solid #FF0000 } /* Error */
|
||||
.k { color: #008000; font-weight: bold } /* Keyword */
|
||||
.o { color: #666666 } /* Operator */
|
||||
.cm { color: #408080; font-style: italic } /* Comment.Multiline */
|
||||
.cp { color: #BC7A00 } /* Comment.Preproc */
|
||||
.c1 { color: #408080; font-style: italic } /* Comment.Single */
|
||||
.cs { color: #408080; font-style: italic } /* Comment.Special */
|
||||
.gd { color: #A00000 } /* Generic.Deleted */
|
||||
.ge { font-style: italic } /* Generic.Emph */
|
||||
.gr { color: #FF0000 } /* Generic.Error */
|
||||
.gh { color: #000080; font-weight: bold } /* Generic.Heading */
|
||||
.gi { color: #00A000 } /* Generic.Inserted */
|
||||
.go { color: #888888 } /* Generic.Output */
|
||||
.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
|
||||
.gs { font-weight: bold } /* Generic.Strong */
|
||||
.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
|
||||
.gt { color: #0044DD } /* Generic.Traceback */
|
||||
.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
|
||||
.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
|
||||
.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
|
||||
.kp { color: #008000 } /* Keyword.Pseudo */
|
||||
.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
|
||||
.kt { color: #B00040 } /* Keyword.Type */
|
||||
.m { color: #666666 } /* Literal.Number */
|
||||
.s { color: #BA2121 } /* Literal.String */
|
||||
.na { color: #7D9029 } /* Name.Attribute */
|
||||
.nb { color: #008000 } /* Name.Builtin */
|
||||
.nc { color: #0000FF; font-weight: bold } /* Name.Class */
|
||||
.no { color: #880000 } /* Name.Constant */
|
||||
.nd { color: #AA22FF } /* Name.Decorator */
|
||||
.ni { color: #999999; font-weight: bold } /* Name.Entity */
|
||||
.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
|
||||
.nf { color: #0000FF } /* Name.Function */
|
||||
.nl { color: #A0A000 } /* Name.Label */
|
||||
.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
|
||||
.nt { color: #008000; font-weight: bold } /* Name.Tag */
|
||||
.nv { color: #19177C } /* Name.Variable */
|
||||
.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
|
||||
.w { color: #bbbbbb } /* Text.Whitespace */
|
||||
.mb { color: #666666 } /* Literal.Number.Bin */
|
||||
.mf { color: #666666 } /* Literal.Number.Float */
|
||||
.mh { color: #666666 } /* Literal.Number.Hex */
|
||||
.mi { color: #666666 } /* Literal.Number.Integer */
|
||||
.mo { color: #666666 } /* Literal.Number.Oct */
|
||||
.sb { color: #BA2121 } /* Literal.String.Backtick */
|
||||
.sc { color: #BA2121 } /* Literal.String.Char */
|
||||
.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
|
||||
.s2 { color: #BA2121 } /* Literal.String.Double */
|
||||
.s1 { color: #BA2121 } /* Literal.String.Single */
|
|
@ -1,111 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
define("ace/mode/sql_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
|
||||
|
||||
var SqlHighlightRules = function() {
|
||||
|
||||
var keywords = (
|
||||
"select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" +
|
||||
"when|else|end|type|left|right|join|on|outer|desc|asc|union"
|
||||
);
|
||||
|
||||
var builtinConstants = (
|
||||
"true|false|null"
|
||||
);
|
||||
|
||||
var builtinFunctions = (
|
||||
"count|min|max|avg|sum|rank|now|coalesce"
|
||||
);
|
||||
|
||||
var keywordMapper = this.createKeywordMapper({
|
||||
"support.function": builtinFunctions,
|
||||
"keyword": keywords,
|
||||
"constant.language": builtinConstants
|
||||
}, "identifier", true);
|
||||
|
||||
this.$rules = {
|
||||
"start" : [ {
|
||||
token : "comment",
|
||||
regex : "--.*$"
|
||||
}, {
|
||||
token : "comment",
|
||||
start : "/\\*",
|
||||
end : "\\*/"
|
||||
}, {
|
||||
token : "string", // " string
|
||||
regex : '".*?"'
|
||||
}, {
|
||||
token : "string", // ' string
|
||||
regex : "'.*?'"
|
||||
}, {
|
||||
token : "constant.numeric", // float
|
||||
regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"
|
||||
}, {
|
||||
token : keywordMapper,
|
||||
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b"
|
||||
}, {
|
||||
token : "keyword.operator",
|
||||
regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|="
|
||||
}, {
|
||||
token : "paren.lparen",
|
||||
regex : "[\\(]"
|
||||
}, {
|
||||
token : "paren.rparen",
|
||||
regex : "[\\)]"
|
||||
}, {
|
||||
token : "text",
|
||||
regex : "\\s+"
|
||||
} ]
|
||||
};
|
||||
this.normalizeRules();
|
||||
};
|
||||
|
||||
oop.inherits(SqlHighlightRules, TextHighlightRules);
|
||||
|
||||
exports.SqlHighlightRules = SqlHighlightRules;
|
||||
});
|
||||
|
||||
define("ace/mode/sql",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/sql_highlight_rules","ace/range"], function(require, exports, module) {
|
||||
"use strict";
|
||||
|
||||
var oop = require("../lib/oop");
|
||||
var TextMode = require("./text").Mode;
|
||||
var SqlHighlightRules = require("./sql_highlight_rules").SqlHighlightRules;
|
||||
var Range = require("../range").Range;
|
||||
|
||||
var Mode = function() {
|
||||
this.HighlightRules = SqlHighlightRules;
|
||||
};
|
||||
oop.inherits(Mode, TextMode);
|
||||
|
||||
(function() {
|
||||
|
||||
this.lineCommentStart = "--";
|
||||
|
||||
this.$id = "ace/mode/sql";
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
|
||||
});
|
|
@ -1,788 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
|
||||
/********************
|
||||
* HTML CSS
|
||||
*/
|
||||
|
||||
|
||||
.chartWrap {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/********************
|
||||
Box shadow and border radius styling
|
||||
*/
|
||||
.nvtooltip.with-3d-shadow, .with-3d-shadow .nvtooltip {
|
||||
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
|
||||
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
|
||||
box-shadow: 0 5px 10px rgba(0,0,0,.2);
|
||||
|
||||
-webkit-border-radius: 6px;
|
||||
-moz-border-radius: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
/********************
|
||||
* TOOLTIP CSS
|
||||
*/
|
||||
|
||||
.nvtooltip {
|
||||
position: absolute;
|
||||
background-color: rgba(255,255,255,1.0);
|
||||
padding: 1px;
|
||||
border: 1px solid rgba(0,0,0,.2);
|
||||
z-index: 10000;
|
||||
|
||||
font-family: Arial;
|
||||
font-size: 13px;
|
||||
text-align: left;
|
||||
pointer-events: none;
|
||||
|
||||
white-space: nowrap;
|
||||
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
/*Give tooltips that old fade in transition by
|
||||
putting a "with-transitions" class on the container div.
|
||||
*/
|
||||
.nvtooltip.with-transitions, .with-transitions .nvtooltip {
|
||||
transition: opacity 250ms linear;
|
||||
-moz-transition: opacity 250ms linear;
|
||||
-webkit-transition: opacity 250ms linear;
|
||||
|
||||
transition-delay: 250ms;
|
||||
-moz-transition-delay: 250ms;
|
||||
-webkit-transition-delay: 250ms;
|
||||
}
|
||||
|
||||
.nvtooltip.x-nvtooltip,
|
||||
.nvtooltip.y-nvtooltip {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.nvtooltip h3 {
|
||||
margin: 0;
|
||||
padding: 4px 14px;
|
||||
line-height: 18px;
|
||||
font-weight: normal;
|
||||
background-color: rgba(247,247,247,0.75);
|
||||
text-align: center;
|
||||
|
||||
border-bottom: 1px solid #ebebeb;
|
||||
|
||||
-webkit-border-radius: 5px 5px 0 0;
|
||||
-moz-border-radius: 5px 5px 0 0;
|
||||
border-radius: 5px 5px 0 0;
|
||||
}
|
||||
|
||||
.nvtooltip p {
|
||||
margin: 0;
|
||||
padding: 5px 14px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.nvtooltip span {
|
||||
display: inline-block;
|
||||
margin: 2px 0;
|
||||
}
|
||||
|
||||
.nvtooltip table {
|
||||
margin: 6px;
|
||||
border-spacing:0;
|
||||
}
|
||||
|
||||
|
||||
.nvtooltip table td {
|
||||
padding: 2px 9px 2px 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.nvtooltip table td.key {
|
||||
font-weight:normal;
|
||||
}
|
||||
.nvtooltip table td.value {
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nvtooltip table tr.highlight td {
|
||||
padding: 1px 9px 1px 0;
|
||||
border-bottom-style: solid;
|
||||
border-bottom-width: 1px;
|
||||
border-top-style: solid;
|
||||
border-top-width: 1px;
|
||||
}
|
||||
|
||||
.nvtooltip table td.legend-color-guide div {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.nvtooltip .footer {
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
.nvtooltip-pending-removal {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
|
||||
/********************
|
||||
* SVG CSS
|
||||
*/
|
||||
|
||||
|
||||
svg {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
/* Trying to get SVG to act like a greedy block in all browsers */
|
||||
display: block;
|
||||
width:100%;
|
||||
height:100%;
|
||||
}
|
||||
|
||||
|
||||
svg text {
|
||||
font: normal 12px Arial;
|
||||
}
|
||||
|
||||
svg .title {
|
||||
font: bold 14px Arial;
|
||||
}
|
||||
|
||||
.nvd3 .nv-background {
|
||||
fill: white;
|
||||
fill-opacity: 0;
|
||||
/*
|
||||
pointer-events: none;
|
||||
*/
|
||||
}
|
||||
|
||||
.nvd3.nv-noData {
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
/**********
|
||||
* Brush
|
||||
*/
|
||||
|
||||
.nv-brush .extent {
|
||||
fill-opacity: .125;
|
||||
shape-rendering: crispEdges;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Legend
|
||||
*/
|
||||
|
||||
.nvd3 .nv-legend .nv-series {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.nvd3 .nv-legend .disabled circle {
|
||||
fill-opacity: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Axes
|
||||
*/
|
||||
.nvd3 .nv-axis {
|
||||
pointer-events:none;
|
||||
}
|
||||
|
||||
.nvd3 .nv-axis path {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
stroke-opacity: .75;
|
||||
shape-rendering: crispEdges;
|
||||
}
|
||||
|
||||
.nvd3 .nv-axis path.domain {
|
||||
stroke-opacity: .75;
|
||||
}
|
||||
|
||||
.nvd3 .nv-axis.nv-x path.domain {
|
||||
stroke-opacity: 0;
|
||||
}
|
||||
|
||||
.nvd3 .nv-axis line {
|
||||
fill: none;
|
||||
stroke: #e5e5e5;
|
||||
shape-rendering: crispEdges;
|
||||
}
|
||||
|
||||
.nvd3 .nv-axis .zero line,
|
||||
/*this selector may not be necessary*/ .nvd3 .nv-axis line.zero {
|
||||
stroke-opacity: .75;
|
||||
}
|
||||
|
||||
.nvd3 .nv-axis .nv-axisMaxMin text {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nvd3 .x .nv-axis .nv-axisMaxMin text,
|
||||
.nvd3 .x2 .nv-axis .nv-axisMaxMin text,
|
||||
.nvd3 .x3 .nv-axis .nv-axisMaxMin text {
|
||||
text-anchor: middle
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Brush
|
||||
*/
|
||||
|
||||
.nv-brush .resize path {
|
||||
fill: #eee;
|
||||
stroke: #666;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Bars
|
||||
*/
|
||||
|
||||
.nvd3 .nv-bars .negative rect {
|
||||
zfill: brown;
|
||||
}
|
||||
|
||||
.nvd3 .nv-bars rect {
|
||||
zfill: steelblue;
|
||||
fill-opacity: .75;
|
||||
|
||||
transition: fill-opacity 250ms linear;
|
||||
-moz-transition: fill-opacity 250ms linear;
|
||||
-webkit-transition: fill-opacity 250ms linear;
|
||||
}
|
||||
|
||||
.nvd3 .nv-bars rect.hover {
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
.nvd3 .nv-bars .hover rect {
|
||||
fill: lightblue;
|
||||
}
|
||||
|
||||
.nvd3 .nv-bars text {
|
||||
fill: rgba(0,0,0,0);
|
||||
}
|
||||
|
||||
.nvd3 .nv-bars .hover text {
|
||||
fill: rgba(0,0,0,1);
|
||||
}
|
||||
|
||||
|
||||
/**********
|
||||
* Bars
|
||||
*/
|
||||
|
||||
.nvd3 .nv-multibar .nv-groups rect,
|
||||
.nvd3 .nv-multibarHorizontal .nv-groups rect,
|
||||
.nvd3 .nv-discretebar .nv-groups rect {
|
||||
stroke-opacity: 0;
|
||||
|
||||
transition: fill-opacity 250ms linear;
|
||||
-moz-transition: fill-opacity 250ms linear;
|
||||
-webkit-transition: fill-opacity 250ms linear;
|
||||
}
|
||||
|
||||
.nvd3 .nv-multibar .nv-groups rect:hover,
|
||||
.nvd3 .nv-multibarHorizontal .nv-groups rect:hover,
|
||||
.nvd3 .nv-discretebar .nv-groups rect:hover {
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
.nvd3 .nv-discretebar .nv-groups text,
|
||||
.nvd3 .nv-multibarHorizontal .nv-groups text {
|
||||
font-weight: bold;
|
||||
fill: rgba(0,0,0,1);
|
||||
stroke: rgba(0,0,0,0);
|
||||
}
|
||||
|
||||
/***********
|
||||
* Pie Chart
|
||||
*/
|
||||
|
||||
.nvd3.nv-pie path {
|
||||
stroke-opacity: 0;
|
||||
transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear;
|
||||
-moz-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear;
|
||||
-webkit-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear;
|
||||
|
||||
}
|
||||
|
||||
.nvd3.nv-pie .nv-slice text {
|
||||
stroke: #000;
|
||||
stroke-width: 0;
|
||||
}
|
||||
|
||||
.nvd3.nv-pie path {
|
||||
stroke: #fff;
|
||||
stroke-width: 1px;
|
||||
stroke-opacity: 1;
|
||||
}
|
||||
|
||||
.nvd3.nv-pie .hover path {
|
||||
fill-opacity: .7;
|
||||
}
|
||||
.nvd3.nv-pie .nv-label {
|
||||
pointer-events: none;
|
||||
}
|
||||
.nvd3.nv-pie .nv-label rect {
|
||||
fill-opacity: 0;
|
||||
stroke-opacity: 0;
|
||||
}
|
||||
|
||||
/**********
|
||||
* Lines
|
||||
*/
|
||||
|
||||
.nvd3 .nv-groups path.nv-line {
|
||||
fill: none;
|
||||
stroke-width: 1.5px;
|
||||
/*
|
||||
stroke-linecap: round;
|
||||
shape-rendering: geometricPrecision;
|
||||
|
||||
transition: stroke-width 250ms linear;
|
||||
-moz-transition: stroke-width 250ms linear;
|
||||
-webkit-transition: stroke-width 250ms linear;
|
||||
|
||||
transition-delay: 250ms
|
||||
-moz-transition-delay: 250ms;
|
||||
-webkit-transition-delay: 250ms;
|
||||
*/
|
||||
}
|
||||
|
||||
.nvd3 .nv-groups path.nv-line.nv-thin-line {
|
||||
stroke-width: 1px;
|
||||
}
|
||||
|
||||
|
||||
.nvd3 .nv-groups path.nv-area {
|
||||
stroke: none;
|
||||
/*
|
||||
stroke-linecap: round;
|
||||
shape-rendering: geometricPrecision;
|
||||
|
||||
stroke-width: 2.5px;
|
||||
transition: stroke-width 250ms linear;
|
||||
-moz-transition: stroke-width 250ms linear;
|
||||
-webkit-transition: stroke-width 250ms linear;
|
||||
|
||||
transition-delay: 250ms
|
||||
-moz-transition-delay: 250ms;
|
||||
-webkit-transition-delay: 250ms;
|
||||
*/
|
||||
}
|
||||
|
||||
.nvd3 .nv-line.hover path {
|
||||
stroke-width: 6px;
|
||||
}
|
||||
|
||||
/*
|
||||
.nvd3.scatter .groups .point {
|
||||
fill-opacity: 0.1;
|
||||
stroke-opacity: 0.1;
|
||||
}
|
||||
*/
|
||||
|
||||
.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point {
|
||||
fill-opacity: 0;
|
||||
stroke-opacity: 0;
|
||||
}
|
||||
|
||||
.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point {
|
||||
fill-opacity: .5 !important;
|
||||
stroke-opacity: .5 !important;
|
||||
}
|
||||
|
||||
|
||||
.with-transitions .nvd3 .nv-groups .nv-point {
|
||||
transition: stroke-width 250ms linear, stroke-opacity 250ms linear;
|
||||
-moz-transition: stroke-width 250ms linear, stroke-opacity 250ms linear;
|
||||
-webkit-transition: stroke-width 250ms linear, stroke-opacity 250ms linear;
|
||||
|
||||
}
|
||||
|
||||
.nvd3.nv-scatter .nv-groups .nv-point.hover,
|
||||
.nvd3 .nv-groups .nv-point.hover {
|
||||
stroke-width: 7px;
|
||||
fill-opacity: .95 !important;
|
||||
stroke-opacity: .95 !important;
|
||||
}
|
||||
|
||||
|
||||
.nvd3 .nv-point-paths path {
|
||||
stroke: #aaa;
|
||||
stroke-opacity: 0;
|
||||
fill: #eee;
|
||||
fill-opacity: 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.nvd3 .nv-indexLine {
|
||||
cursor: ew-resize;
|
||||
}
|
||||
|
||||
|
||||
/**********
|
||||
* Distribution
|
||||
*/
|
||||
|
||||
.nvd3 .nv-distribution {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Scatter
|
||||
*/
|
||||
|
||||
/* **Attempting to remove this for useVoronoi(false), need to see if it's required anywhere
|
||||
.nvd3 .nv-groups .nv-point {
|
||||
pointer-events: none;
|
||||
}
|
||||
*/
|
||||
|
||||
.nvd3 .nv-groups .nv-point.hover {
|
||||
stroke-width: 20px;
|
||||
stroke-opacity: .5;
|
||||
}
|
||||
|
||||
.nvd3 .nv-scatter .nv-point.hover {
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
/*
|
||||
.nv-group.hover .nv-point {
|
||||
fill-opacity: 1;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/**********
|
||||
* Stacked Area
|
||||
*/
|
||||
|
||||
.nvd3.nv-stackedarea path.nv-area {
|
||||
fill-opacity: .7;
|
||||
/*
|
||||
stroke-opacity: .65;
|
||||
fill-opacity: 1;
|
||||
*/
|
||||
stroke-opacity: 0;
|
||||
|
||||
transition: fill-opacity 250ms linear, stroke-opacity 250ms linear;
|
||||
-moz-transition: fill-opacity 250ms linear, stroke-opacity 250ms linear;
|
||||
-webkit-transition: fill-opacity 250ms linear, stroke-opacity 250ms linear;
|
||||
|
||||
/*
|
||||
transition-delay: 500ms;
|
||||
-moz-transition-delay: 500ms;
|
||||
-webkit-transition-delay: 500ms;
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
.nvd3.nv-stackedarea path.nv-area.hover {
|
||||
fill-opacity: .9;
|
||||
/*
|
||||
stroke-opacity: .85;
|
||||
*/
|
||||
}
|
||||
/*
|
||||
.d3stackedarea .groups path {
|
||||
stroke-opacity: 0;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
.nvd3.nv-stackedarea .nv-groups .nv-point {
|
||||
stroke-opacity: 0;
|
||||
fill-opacity: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
.nvd3.nv-stackedarea .nv-groups .nv-point.hover {
|
||||
stroke-width: 20px;
|
||||
stroke-opacity: .75;
|
||||
fill-opacity: 1;
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Line Plus Bar
|
||||
*/
|
||||
|
||||
.nvd3.nv-linePlusBar .nv-bar rect {
|
||||
fill-opacity: .75;
|
||||
}
|
||||
|
||||
.nvd3.nv-linePlusBar .nv-bar rect:hover {
|
||||
fill-opacity: 1;
|
||||
}
|
||||
|
||||
|
||||
/**********
|
||||
* Bullet
|
||||
*/
|
||||
|
||||
.nvd3.nv-bullet { font: 10px sans-serif; }
|
||||
.nvd3.nv-bullet .nv-measure { fill-opacity: .8; }
|
||||
.nvd3.nv-bullet .nv-measure:hover { fill-opacity: 1; }
|
||||
.nvd3.nv-bullet .nv-marker { stroke: #000; stroke-width: 2px; }
|
||||
.nvd3.nv-bullet .nv-markerTriangle { stroke: #000; fill: #fff; stroke-width: 1.5px; }
|
||||
.nvd3.nv-bullet .nv-tick line { stroke: #666; stroke-width: .5px; }
|
||||
.nvd3.nv-bullet .nv-range.nv-s0 { fill: #eee; }
|
||||
.nvd3.nv-bullet .nv-range.nv-s1 { fill: #ddd; }
|
||||
.nvd3.nv-bullet .nv-range.nv-s2 { fill: #ccc; }
|
||||
.nvd3.nv-bullet .nv-title { font-size: 14px; font-weight: bold; }
|
||||
.nvd3.nv-bullet .nv-subtitle { fill: #999; }
|
||||
|
||||
|
||||
.nvd3.nv-bullet .nv-range {
|
||||
fill: #bababa;
|
||||
fill-opacity: .4;
|
||||
}
|
||||
.nvd3.nv-bullet .nv-range:hover {
|
||||
fill-opacity: .7;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Sparkline
|
||||
*/
|
||||
|
||||
.nvd3.nv-sparkline path {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus g.nv-hoverValue {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus .nv-hoverValue line {
|
||||
stroke: #333;
|
||||
stroke-width: 1.5px;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus,
|
||||
.nvd3.nv-sparklineplus g {
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
.nvd3 .nv-hoverArea {
|
||||
fill-opacity: 0;
|
||||
stroke-opacity: 0;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus .nv-xValue,
|
||||
.nvd3.nv-sparklineplus .nv-yValue {
|
||||
/*
|
||||
stroke: #666;
|
||||
*/
|
||||
stroke-width: 0;
|
||||
font-size: .9em;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus .nv-yValue {
|
||||
stroke: #f66;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus .nv-maxValue {
|
||||
stroke: #2ca02c;
|
||||
fill: #2ca02c;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus .nv-minValue {
|
||||
stroke: #d62728;
|
||||
fill: #d62728;
|
||||
}
|
||||
|
||||
.nvd3.nv-sparklineplus .nv-currentValue {
|
||||
/*
|
||||
stroke: #444;
|
||||
fill: #000;
|
||||
*/
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
/**********
|
||||
* historical stock
|
||||
*/
|
||||
|
||||
.nvd3.nv-ohlcBar .nv-ticks .nv-tick {
|
||||
stroke-width: 2px;
|
||||
}
|
||||
|
||||
.nvd3.nv-ohlcBar .nv-ticks .nv-tick.hover {
|
||||
stroke-width: 4px;
|
||||
}
|
||||
|
||||
.nvd3.nv-ohlcBar .nv-ticks .nv-tick.positive {
|
||||
stroke: #2ca02c;
|
||||
}
|
||||
|
||||
.nvd3.nv-ohlcBar .nv-ticks .nv-tick.negative {
|
||||
stroke: #d62728;
|
||||
}
|
||||
|
||||
.nvd3.nv-historicalStockChart .nv-axis .nv-axislabel {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.nvd3.nv-historicalStockChart .nv-dragTarget {
|
||||
fill-opacity: 0;
|
||||
stroke: none;
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
.nvd3 .nv-brush .extent {
|
||||
/*
|
||||
cursor: ew-resize !important;
|
||||
*/
|
||||
fill-opacity: 0 !important;
|
||||
}
|
||||
|
||||
.nvd3 .nv-brushBackground rect {
|
||||
stroke: #000;
|
||||
stroke-width: .4;
|
||||
fill: #fff;
|
||||
fill-opacity: .7;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********
|
||||
* Indented Tree
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* TODO: the following 3 selectors are based on classes used in the example. I should either make them standard and leave them here, or move to a CSS file not included in the library
|
||||
*/
|
||||
.nvd3.nv-indentedtree .name {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.nvd3.nv-indentedtree .clickable {
|
||||
color: #08C;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.nvd3.nv-indentedtree span.clickable:hover {
|
||||
color: #005580;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
|
||||
.nvd3.nv-indentedtree .nv-childrenCount {
|
||||
display: inline-block;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.nvd3.nv-indentedtree .nv-treeicon {
|
||||
cursor: pointer;
|
||||
/*
|
||||
cursor: n-resize;
|
||||
*/
|
||||
}
|
||||
|
||||
.nvd3.nv-indentedtree .nv-treeicon.nv-folded {
|
||||
cursor: pointer;
|
||||
/*
|
||||
cursor: s-resize;
|
||||
*/
|
||||
}
|
||||
|
||||
/**********
|
||||
* Parallel Coordinates
|
||||
*/
|
||||
|
||||
.nvd3 .background path {
|
||||
fill: none;
|
||||
stroke: #ccc;
|
||||
stroke-opacity: .4;
|
||||
shape-rendering: crispEdges;
|
||||
}
|
||||
|
||||
.nvd3 .foreground path {
|
||||
fill: none;
|
||||
stroke: steelblue;
|
||||
stroke-opacity: .7;
|
||||
}
|
||||
|
||||
.nvd3 .brush .extent {
|
||||
fill-opacity: .3;
|
||||
stroke: #fff;
|
||||
shape-rendering: crispEdges;
|
||||
}
|
||||
|
||||
.nvd3 .axis line, .axis path {
|
||||
fill: none;
|
||||
stroke: #000;
|
||||
shape-rendering: crispEdges;
|
||||
}
|
||||
|
||||
.nvd3 .axis text {
|
||||
text-shadow: 0 1px 0 #fff;
|
||||
}
|
||||
|
||||
/****
|
||||
Interactive Layer
|
||||
*/
|
||||
.nvd3 .nv-interactiveGuideLine {
|
||||
pointer-events:none;
|
||||
}
|
||||
.nvd3 line.nv-guideline {
|
||||
stroke: #ccc;
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,260 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
html, body {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
font-family: Ubuntu, Tahoma, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
line-height: 1.4em;
|
||||
background: #f7f7f7;
|
||||
color: #404040;
|
||||
}
|
||||
body.dark {
|
||||
background: #131313;
|
||||
color: #e3e3e3;
|
||||
}
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
.dark a {
|
||||
color: #5ae;
|
||||
}
|
||||
#wrap {
|
||||
padding: 0 3.5%;
|
||||
}
|
||||
svg {
|
||||
font-family: Ubuntu, Tahoma, Helvetica, sans-serif;
|
||||
}
|
||||
canvas, svg {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
#chart {
|
||||
position: relative;
|
||||
}
|
||||
.brush rect.extent {
|
||||
fill: rgba(100,100,100,0.15);
|
||||
stroke: #fff;
|
||||
}
|
||||
.dark .brush rect.extent {
|
||||
fill: rgba(100,100,100,0.15);
|
||||
stroke: #ddd;
|
||||
}
|
||||
.brush:hover rect.extent {
|
||||
stroke: #222;
|
||||
stroke-dasharray: 5,5;
|
||||
}
|
||||
.brush rect.extent:hover {
|
||||
stroke-dasharray: none;
|
||||
}
|
||||
.resize rect {
|
||||
fill: none;
|
||||
}
|
||||
.background {
|
||||
fill: none;
|
||||
}
|
||||
.dark .background {
|
||||
fill: none;
|
||||
}
|
||||
.axis line, .axis path {
|
||||
fill: none;
|
||||
stroke: #777;
|
||||
stroke-width: 1;
|
||||
}
|
||||
.dark .axis line, .dark .axis path {
|
||||
stroke: #777;
|
||||
}
|
||||
.axis .tick {
|
||||
width: 200px;
|
||||
}
|
||||
.axis text {
|
||||
fill: #111;
|
||||
text-anchor: right;
|
||||
font-size: 11px;
|
||||
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
|
||||
}
|
||||
.axis text.label {
|
||||
font-size: 12px;
|
||||
cursor: move;
|
||||
padding-bottom: 24px;
|
||||
}
|
||||
.dark .axis text {
|
||||
fill: #f2f2f2;
|
||||
text-shadow: 0 1px 0 #000, 1px 0 0 #000, 0 -1px 0 #000, -1px 0 0 #000;
|
||||
}
|
||||
.dark .axis text.label {
|
||||
fill: #ddd;
|
||||
}
|
||||
.quarter, .third, .half {
|
||||
float: left;
|
||||
}
|
||||
.quarter {
|
||||
width: 23%;
|
||||
margin: 0 1%;
|
||||
}
|
||||
.third {
|
||||
width: 31.3%;
|
||||
margin: 0 1%;
|
||||
}
|
||||
.half {
|
||||
width: 48%;
|
||||
margin: 0 1%;
|
||||
}
|
||||
h3 {
|
||||
margin: 12px 0 9px;
|
||||
}
|
||||
h3 small {
|
||||
color: #888;
|
||||
font-weight: normal;
|
||||
}
|
||||
p {
|
||||
margin: 0.6em 0;
|
||||
}
|
||||
small {
|
||||
line-height: 1.2em;
|
||||
}
|
||||
button[disabled=disabled] {
|
||||
color: #555 !important;
|
||||
opacity: 0.4;
|
||||
}
|
||||
.settings button[disabled=disabled] {
|
||||
display: none;
|
||||
}
|
||||
.dark button[disabled=disabled] {
|
||||
opacity: 0.2;
|
||||
}
|
||||
button#keep-data,
|
||||
button#exclude-data {
|
||||
font-weight:bold
|
||||
}
|
||||
button#keep-data:hover {
|
||||
color: #080;
|
||||
}
|
||||
button#exclude-data:hover {
|
||||
color: #900;
|
||||
}
|
||||
#food-list {
|
||||
width: 100%;
|
||||
height: 460px;
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#legend {
|
||||
text-align: left;
|
||||
overflow-y: auto;
|
||||
border-left: 1px solid rgba(140,140,140,0.5);
|
||||
}
|
||||
.row {
|
||||
cursor: pointer;
|
||||
}
|
||||
.row:hover {
|
||||
font-size: 16px;
|
||||
line-height: 1.3em;
|
||||
}
|
||||
.off {
|
||||
color: #999;
|
||||
}
|
||||
.dark .off {
|
||||
color: #555;
|
||||
}
|
||||
.dark #legend {
|
||||
border-left: 1px solid #777;
|
||||
}
|
||||
.color-block, .color-bar {
|
||||
display: inline-block;
|
||||
height: 8px;
|
||||
width: 8px;
|
||||
margin: 1px 4px 1px 0px;
|
||||
}
|
||||
#rendered-bar,
|
||||
#selected-bar {
|
||||
width:0%;
|
||||
font-weight: bold;
|
||||
}
|
||||
#rendered-bar {
|
||||
background: #888;
|
||||
border-right: 1px solid #666;
|
||||
}
|
||||
#selected-bar {
|
||||
background: rgba(160,160,160,0.5);
|
||||
border-right: 1px solid #999;
|
||||
}
|
||||
.fillbar {
|
||||
height: 12px;
|
||||
line-height: 12px;
|
||||
border:1px solid rgba(120,120,120,0.5);
|
||||
width: 120px;
|
||||
display: inline-block;
|
||||
}
|
||||
.little-box {
|
||||
width: 268px;
|
||||
float: left;
|
||||
}
|
||||
#header {
|
||||
border-bottom: 1px solid rgba(100,100,100,0.35);
|
||||
background: #e2e2e2;
|
||||
padding: 6px 24px 4px;
|
||||
line-height: 24px;
|
||||
}
|
||||
.dark #header {
|
||||
background: #040404;
|
||||
color: #f3f3f3;
|
||||
}
|
||||
#header h1 {
|
||||
display: inline-block;
|
||||
margin: 0px 14px 0 0;
|
||||
}
|
||||
#header button select {
|
||||
vertical-align: top;
|
||||
}
|
||||
.controls {
|
||||
float: right;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
/* Scrollbars */
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: #ddd;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
background: #b5b5b5;
|
||||
border-radius: 12px;
|
||||
}
|
||||
.dark ::-webkit-scrollbar-track {
|
||||
background: #222;
|
||||
}
|
||||
.dark ::-webkit-scrollbar-thumb {
|
||||
background: #444;
|
||||
}
|
|
@ -1,760 +0,0 @@
|
|||
// Parallel Coordinates
|
||||
// Copyright (c) 2012, Kai Chang
|
||||
// Released under the BSD License: http://opensource.org/licenses/BSD-3-Clause
|
||||
|
||||
var width = document.body.clientWidth,
|
||||
height = d3.max([document.body.clientHeight-540, 400]);
|
||||
|
||||
var m = [60, 0, 10, 0],
|
||||
w = width - m[1] - m[3],
|
||||
h = height - m[0] - m[2],
|
||||
xscale = d3.scale.ordinal().rangePoints([0, w], 1),
|
||||
yscale = {},
|
||||
dragging = {},
|
||||
line = d3.svg.line(),
|
||||
axis = d3.svg.axis().orient("left").ticks(1+height/50),
|
||||
data,
|
||||
foreground,
|
||||
background,
|
||||
highlighted,
|
||||
dimensions,
|
||||
legend,
|
||||
render_speed = 50,
|
||||
brush_count = 0,
|
||||
excluded_groups = [];
|
||||
|
||||
var bnb_colors = [
|
||||
[255, 90, 95],
|
||||
[123, 0, 81],
|
||||
[0, 122, 135],
|
||||
[0, 209, 193],
|
||||
[140, 224, 113],
|
||||
[255, 180, 0],
|
||||
[255, 170, 145],
|
||||
[180, 167, 108],
|
||||
[156, 162, 153],
|
||||
[86, 90, 92],
|
||||
];
|
||||
|
||||
var colors = {};
|
||||
|
||||
// Scale chart and canvas height
|
||||
d3.select("#chart")
|
||||
.style("height", (h + m[0] + m[2]) + "px")
|
||||
|
||||
d3.selectAll("canvas")
|
||||
.attr("width", w)
|
||||
.attr("height", h)
|
||||
.style("padding", m.join("px ") + "px");
|
||||
|
||||
// Foreground canvas for primary view
|
||||
var canvas = document.getElementById('foreground');
|
||||
WebGL2D.enable(canvas)
|
||||
foreground = canvas.getContext('webgl-2d');
|
||||
foreground.strokeStyle = "rgba(0,100,160,0.1)";
|
||||
foreground.lineWidth = 1.7;
|
||||
foreground.fillText("Loading...",w/2,h/2);
|
||||
|
||||
// Highlight canvas for temporary interactions
|
||||
highlighted = document.getElementById('highlight').getContext('2d');
|
||||
highlighted.strokeStyle = "rgba(0,100,160,1)";
|
||||
highlighted.lineWidth = 4;
|
||||
|
||||
// SVG for ticks, labels, and interactions
|
||||
var svg = d3.select("svg")
|
||||
.attr("width", w + m[1] + m[3])
|
||||
.attr("height", h + m[0] + m[2])
|
||||
.append("svg:g")
|
||||
.attr("transform", "translate(" + m[3] + "," + m[0] + ")");
|
||||
|
||||
// Load the data and visualization
|
||||
//d3.csv("/admin/airflow/chart_data?chart_id={{ chart.chart_id }}&iteration_no={{ chart.iteration_no }}", function(raw_data) {
|
||||
url = window.location.pathname + location.search
|
||||
url = url.replace("/chart?", "/chart_data?");
|
||||
d3.csv(url, function(raw_data) {
|
||||
// Populating field list
|
||||
fields = Object.keys(raw_data[0]).slice(2);
|
||||
fields.push("group");
|
||||
d3.select("#fields")
|
||||
.on("change", function(){
|
||||
var sel = document.getElementById('fields');
|
||||
field = sel.options[sel.selectedIndex].value;
|
||||
set_color_scaler(field);
|
||||
brush();
|
||||
})
|
||||
.selectAll("option").data(fields).enter()
|
||||
.append("option")
|
||||
.attr("value", function(d) {return d;})
|
||||
.text(function(d) {return d;});
|
||||
|
||||
// Convert quantitative scales to floats
|
||||
data = raw_data.map(function(d) {
|
||||
for (var k in d) {
|
||||
if (!_.isNaN(raw_data[0][k] - 0) && k != 'id') {
|
||||
d[k] = parseFloat(d[k]) || 0;
|
||||
}
|
||||
};
|
||||
return d;
|
||||
});
|
||||
|
||||
// Extract the list of numerical dimensions and create a scale for each.
|
||||
xscale.domain(dimensions = d3.keys(data[0]).filter(function(k) {
|
||||
return (_.isNumber(data[0][k])) && (yscale[k] = d3.scale.linear()
|
||||
.domain(d3.extent(data, function(d) { return +d[k]; }))
|
||||
.range([h, 0]));
|
||||
}).sort());
|
||||
|
||||
// Add a group element for each dimension.
|
||||
var g = svg.selectAll(".dimension")
|
||||
.data(dimensions)
|
||||
.enter().append("svg:g")
|
||||
.attr("class", "dimension")
|
||||
.attr("transform", function(d) { return "translate(" + xscale(d) + ")"; })
|
||||
.call(d3.behavior.drag()
|
||||
.on("dragstart", function(d) {
|
||||
dragging[d] = this.__origin__ = xscale(d);
|
||||
this.__dragged__ = false;
|
||||
d3.select("#foreground").style("opacity", "0.35");
|
||||
})
|
||||
.on("drag", function(d) {
|
||||
dragging[d] = Math.min(w, Math.max(0, this.__origin__ += d3.event.dx));
|
||||
dimensions.sort(function(a, b) { return position(a) - position(b); });
|
||||
xscale.domain(dimensions);
|
||||
g.attr("transform", function(d) { return "translate(" + position(d) + ")"; });
|
||||
brush_count++;
|
||||
this.__dragged__ = true;
|
||||
|
||||
// Feedback for axis deletion if dropped
|
||||
if (dragging[d] < 12 || dragging[d] > w-12) {
|
||||
d3.select(this).select(".background").style("fill", "#b00");
|
||||
} else {
|
||||
d3.select(this).select(".background").style("fill", null);
|
||||
}
|
||||
})
|
||||
.on("dragend", function(d) {
|
||||
if (!this.__dragged__) {
|
||||
// no movement, invert axis
|
||||
var extent = invert_axis(d);
|
||||
|
||||
} else {
|
||||
// reorder axes
|
||||
d3.select(this).transition().attr("transform", "translate(" + xscale(d) + ")");
|
||||
|
||||
var extent = yscale[d].brush.extent();
|
||||
}
|
||||
|
||||
// remove axis if dragged all the way left
|
||||
if (dragging[d] < 12 || dragging[d] > w-12) {
|
||||
remove_axis(d,g);
|
||||
}
|
||||
|
||||
// TODO required to avoid a bug
|
||||
xscale.domain(dimensions);
|
||||
update_ticks(d, extent);
|
||||
|
||||
// rerender
|
||||
d3.select("#foreground").style("opacity", null);
|
||||
brush();
|
||||
delete this.__dragged__;
|
||||
delete this.__origin__;
|
||||
delete dragging[d];
|
||||
}))
|
||||
|
||||
// Add an axis and title.
|
||||
g.append("svg:g")
|
||||
.attr("class", "axis")
|
||||
.attr("transform", "translate(0,0)")
|
||||
.each(function(d) { d3.select(this).call(axis.scale(yscale[d])); })
|
||||
.append("svg:text")
|
||||
.attr("text-anchor", "middle")
|
||||
.attr("y", function(d,i) { return i%2 == 0 ? -14 : -30 } )
|
||||
.attr("x", 0)
|
||||
.attr("class", "label")
|
||||
.text(String)
|
||||
.append("title")
|
||||
.text("Click to invert. Drag to reorder");
|
||||
|
||||
// Add and store a brush for each axis.
|
||||
g.append("svg:g")
|
||||
.attr("class", "brush")
|
||||
.each(function(d) { d3.select(this).call(yscale[d].brush = d3.svg.brush().y(yscale[d]).on("brush", brush)); })
|
||||
.selectAll("rect")
|
||||
.style("visibility", null)
|
||||
.attr("x", -23)
|
||||
.attr("width", 36)
|
||||
.append("title")
|
||||
.text("Drag up or down to brush along this axis");
|
||||
|
||||
g.selectAll(".extent")
|
||||
.append("title")
|
||||
.text("Drag or resize this filter");
|
||||
|
||||
legend = create_legend(colors,brush);
|
||||
|
||||
// Render full foreground
|
||||
brush();
|
||||
legend = create_legend(colors,brush);
|
||||
//ici
|
||||
set_color_scaler("group");
|
||||
brush();
|
||||
|
||||
});
|
||||
|
||||
// copy one canvas to another, grayscale
|
||||
function gray_copy(source, target) {
|
||||
var pixels = source.getImageData(0,0,w,h);
|
||||
target.putImageData(grayscale(pixels),0,0);
|
||||
}
|
||||
|
||||
// http://www.html5rocks.com/en/tutorials/canvas/imagefilters/
|
||||
function grayscale(pixels, args) {
|
||||
var d = pixels.data;
|
||||
for (var i=0; i<d.length; i+=4) {
|
||||
var r = d[i];
|
||||
var g = d[i+1];
|
||||
var b = d[i+2];
|
||||
// CIE luminance for the RGB
|
||||
// The human eye is bad at seeing red and blue, so we de-emphasize them.
|
||||
var v = 0.2126*r + 0.7152*g + 0.0722*b;
|
||||
d[i] = d[i+1] = d[i+2] = v
|
||||
}
|
||||
return pixels;
|
||||
};
|
||||
|
||||
function create_legend(colors,brush) {
|
||||
// create legend
|
||||
var legend_data = d3.select("#legend")
|
||||
.html("")
|
||||
.selectAll(".row")
|
||||
.data( _.keys(colors).sort() )
|
||||
|
||||
// filter by group
|
||||
var legend = legend_data
|
||||
.enter().append("div")
|
||||
.attr("title", "Hide group")
|
||||
.on("click", function(d) {
|
||||
// toggle food group
|
||||
if (_.contains(excluded_groups, d)) {
|
||||
d3.select(this).attr("title", "Hide group")
|
||||
excluded_groups = _.difference(excluded_groups,[d]);
|
||||
brush();
|
||||
} else {
|
||||
d3.select(this).attr("title", "Show group")
|
||||
excluded_groups.push(d);
|
||||
brush();
|
||||
}
|
||||
});
|
||||
|
||||
legend
|
||||
.append("span")
|
||||
.style("background", function(d,i) { return color_cat(d,0.85)})
|
||||
.attr("class", "color-bar");
|
||||
|
||||
legend
|
||||
.append("span")
|
||||
.attr("class", "tally")
|
||||
.text(function(d,i) { return 0});
|
||||
|
||||
legend
|
||||
.append("span")
|
||||
.text(function(d,i) { return " " + d});
|
||||
|
||||
return legend;
|
||||
}
|
||||
|
||||
// render polylines i to i+render_speed
|
||||
function render_range(selection, i, max, opacity) {
|
||||
selection.slice(i,max).forEach(function(d) {
|
||||
path(d, foreground, color(d,opacity));
|
||||
});
|
||||
};
|
||||
|
||||
// simple data table
|
||||
function data_table(sample) {
|
||||
// sort by first column
|
||||
var sample = sample.sort(function(a,b) {
|
||||
var col = d3.keys(a)[0];
|
||||
return a[col] < b[col] ? -1 : 1;
|
||||
});
|
||||
|
||||
var table = d3.select("#food-list")
|
||||
.html("")
|
||||
.selectAll(".row")
|
||||
.data(sample)
|
||||
.enter().append("div")
|
||||
.on("mouseover", highlight)
|
||||
.on("mouseout", unhighlight);
|
||||
|
||||
table
|
||||
.append("span")
|
||||
.attr("class", "color-block")
|
||||
.style("background", function(d) { return color(d,0.85) })
|
||||
|
||||
table
|
||||
.append("span")
|
||||
.text(function(d) { return d.name; })
|
||||
}
|
||||
|
||||
// Adjusts rendering speed
|
||||
function optimize(timer) {
|
||||
var delta = (new Date()).getTime() - timer;
|
||||
render_speed = Math.max(Math.ceil(render_speed * 30 / delta), 8);
|
||||
render_speed = Math.min(render_speed, 300);
|
||||
return (new Date()).getTime();
|
||||
}
|
||||
|
||||
// Feedback on selection
|
||||
function selection_stats(opacity, n, total) {
|
||||
d3.select("#data-count").text(total);
|
||||
d3.select("#selected-count").text(n);
|
||||
d3.select("#selected-bar").style("width", (100*n/total) + "%");
|
||||
d3.select("#opacity").text((""+(opacity*100)).slice(0,4) + "%");
|
||||
}
|
||||
|
||||
// Highlight single polyline
|
||||
function highlight(d) {
|
||||
d3.select("#foreground").style("opacity", "0.25");
|
||||
d3.selectAll(".row").style("opacity", function(p) { return (d.group == p) ? null : "0.3" });
|
||||
path(d, highlighted, color(d,1));
|
||||
}
|
||||
|
||||
// Remove highlight
|
||||
function unhighlight() {
|
||||
d3.select("#foreground").style("opacity", null);
|
||||
d3.selectAll(".row").style("opacity", null);
|
||||
highlighted.clearRect(0,0,w,h);
|
||||
}
|
||||
|
||||
function invert_axis(d) {
|
||||
// save extent before inverting
|
||||
if (!yscale[d].brush.empty()) {
|
||||
var extent = yscale[d].brush.extent();
|
||||
}
|
||||
if (yscale[d].inverted == true) {
|
||||
yscale[d].range([h, 0]);
|
||||
d3.selectAll('.label')
|
||||
.filter(function(p) { return p == d; })
|
||||
.style("text-decoration", null);
|
||||
yscale[d].inverted = false;
|
||||
} else {
|
||||
yscale[d].range([0, h]);
|
||||
d3.selectAll('.label')
|
||||
.filter(function(p) { return p == d; })
|
||||
.style("text-decoration", "underline");
|
||||
yscale[d].inverted = true;
|
||||
}
|
||||
return extent;
|
||||
}
|
||||
|
||||
// Draw a single polyline
|
||||
function path(d, ctx, color) {
|
||||
if (color) ctx.strokeStyle = color;
|
||||
var x = xscale(0)-15;
|
||||
y = yscale[dimensions[0]](d[dimensions[0]]); // left edge
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(x,y);
|
||||
dimensions.map(function(p,i) {
|
||||
x = xscale(p),
|
||||
y = yscale[p](d[p]);
|
||||
ctx.lineTo(x, y);
|
||||
});
|
||||
ctx.lineTo(x+15, y); // right edge
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
/*
|
||||
function path(d, ctx, color) {
|
||||
if (color) ctx.strokeStyle = color;
|
||||
ctx.beginPath();
|
||||
var x0 = xscale(0)-15,
|
||||
y0 = yscale[dimensions[0]](d[dimensions[0]]); // left edge
|
||||
ctx.moveTo(x0,y0);
|
||||
dimensions.map(function(p,i) {
|
||||
var x = xscale(p),
|
||||
y = yscale[p](d[p]);
|
||||
var cp1x = x - 0.88*(x-x0);
|
||||
var cp1y = y0;
|
||||
var cp2x = x - 0.12*(x-x0);
|
||||
var cp2y = y;
|
||||
ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
|
||||
x0 = x;
|
||||
y0 = y;
|
||||
});
|
||||
ctx.lineTo(x0+15, y0); // right edge
|
||||
ctx.stroke();
|
||||
};
|
||||
*/
|
||||
var color_scaler;
|
||||
var color_column = 'group';
|
||||
function set_color_scaler(field) {
|
||||
color_column = field;
|
||||
selected = actives();
|
||||
ext = d3.extent(selected, function(d){return d[color_column]});
|
||||
med = d3.median(selected, function(d){return d[color_column]});
|
||||
arr = [ext[0], med, ext[1]];
|
||||
color_scaler = d3.scale.linear().range(['#FF5A5F', 'grey', '#007A87']).domain(arr);
|
||||
}
|
||||
|
||||
function color(d, a){
|
||||
if(color_column=="group"){
|
||||
col = color_cat(d.group, a);
|
||||
return col;
|
||||
}
|
||||
else{
|
||||
c = d3.rgb(color_scaler(d[color_column]));
|
||||
return ["rgba(",c.r,",",c.g,",",c.b,",",a,")"].join("");
|
||||
}
|
||||
|
||||
}
|
||||
var ci = 0;
|
||||
function color_cat(cat,a) {
|
||||
if (!(cat in colors)){
|
||||
colors[cat] = bnb_colors[ci];
|
||||
ci++;
|
||||
if(ci == bnb_colors.length)
|
||||
ci = 0;
|
||||
}
|
||||
var c = colors[cat];
|
||||
col = ["rgba(",c[0],",",c[1],",",c[2],",",a,")"].join("")
|
||||
|
||||
return col;
|
||||
}
|
||||
|
||||
function position(d) {
|
||||
var v = dragging[d];
|
||||
return v == null ? xscale(d) : v;
|
||||
}
|
||||
|
||||
// Handles a brush event, toggling the display of foreground lines.
|
||||
// TODO refactor
|
||||
function brush() {
|
||||
brush_count++;
|
||||
var actives = dimensions.filter(function(p) { return !yscale[p].brush.empty(); }),
|
||||
extents = actives.map(function(p) { return yscale[p].brush.extent(); });
|
||||
|
||||
// hack to hide ticks beyond extent
|
||||
var b = d3.selectAll('.dimension')[0]
|
||||
.forEach(function(element, i) {
|
||||
var dimension = d3.select(element).data()[0];
|
||||
if (_.include(actives, dimension)) {
|
||||
var extent = extents[actives.indexOf(dimension)];
|
||||
d3.select(element)
|
||||
.selectAll('text')
|
||||
.style('font-weight', 'bold')
|
||||
.style('font-size', '13px')
|
||||
.style('display', function() {
|
||||
var value = d3.select(this).data();
|
||||
return extent[0] <= value && value <= extent[1] ? null : "none"
|
||||
});
|
||||
} else {
|
||||
d3.select(element)
|
||||
.selectAll('text')
|
||||
.style('font-size', null)
|
||||
.style('font-weight', null)
|
||||
.style('display', null);
|
||||
}
|
||||
d3.select(element)
|
||||
.selectAll('.label')
|
||||
.style('display', null);
|
||||
});
|
||||
;
|
||||
|
||||
// bold dimensions with label
|
||||
d3.selectAll('.label')
|
||||
.style("font-weight", function(dimension) {
|
||||
if (_.include(actives, dimension)) return "bold";
|
||||
return null;
|
||||
});
|
||||
|
||||
// Get lines within extents
|
||||
var selected = [];
|
||||
data
|
||||
.filter(function(d) {
|
||||
return !_.contains(excluded_groups, d.group);
|
||||
})
|
||||
.map(function(d) {
|
||||
return actives.every(function(p, dimension) {
|
||||
return extents[dimension][0] <= d[p] && d[p] <= extents[dimension][1];
|
||||
}) ? selected.push(d) : null;
|
||||
});
|
||||
|
||||
// free text search
|
||||
var query = d3.select("#search")[0][0].value;
|
||||
if (query.length > 0) {
|
||||
selected = search(selected, query);
|
||||
}
|
||||
|
||||
if (selected.length < data.length && selected.length > 0) {
|
||||
d3.select("#keep-data").attr("disabled", null);
|
||||
d3.select("#exclude-data").attr("disabled", null);
|
||||
} else {
|
||||
d3.select("#keep-data").attr("disabled", "disabled");
|
||||
d3.select("#exclude-data").attr("disabled", "disabled");
|
||||
};
|
||||
|
||||
// total by food group
|
||||
var tallies = _(selected)
|
||||
.groupBy(function(d) { return d.group; })
|
||||
|
||||
// include empty groups
|
||||
//
|
||||
_(colors).each(function(v,k) { tallies[k] = tallies[k] || []; });
|
||||
legend
|
||||
.style("text-decoration", function(d) { return _.contains(excluded_groups,d) ? "line-through" : null; })
|
||||
.attr("class", function(d) {
|
||||
return (tallies[d].length > 0)
|
||||
? "row"
|
||||
: "row off";
|
||||
});
|
||||
|
||||
legend.selectAll(".color-bar")
|
||||
.style("width", function(d) {
|
||||
return Math.ceil(600*tallies[d].length/data.length) + "px"
|
||||
});
|
||||
|
||||
legend.selectAll(".tally")
|
||||
.text(function(d,i) { return tallies[d].length });
|
||||
|
||||
// Render selected lines
|
||||
paths(selected, foreground, brush_count, true);
|
||||
}
|
||||
|
||||
// render a set of polylines on a canvas
|
||||
function paths(selected, ctx, count) {
|
||||
var n = selected.length,
|
||||
opacity = d3.min([2/Math.pow(n,0.3),1]),
|
||||
timer = (new Date()).getTime();
|
||||
|
||||
selection_stats(opacity, n, data.length)
|
||||
|
||||
shuffled_data = _.shuffle(selected);
|
||||
|
||||
data_table(shuffled_data.slice(0,25));
|
||||
|
||||
ctx.clearRect(0,0,w+1,h+1);
|
||||
|
||||
render_range(shuffled_data, 0, n, opacity);
|
||||
}
|
||||
|
||||
// transition ticks for reordering, rescaling and inverting
|
||||
function update_ticks(d, extent) {
|
||||
// update brushes
|
||||
if (d) {
|
||||
var brush_el = d3.selectAll(".brush")
|
||||
.filter(function(key) { return key == d; });
|
||||
// single tick
|
||||
if (extent) {
|
||||
// restore previous extent
|
||||
brush_el.call(yscale[d].brush = d3.svg.brush().y(yscale[d]).extent(extent).on("brush", brush));
|
||||
} else {
|
||||
brush_el.call(yscale[d].brush = d3.svg.brush().y(yscale[d]).on("brush", brush));
|
||||
}
|
||||
} else {
|
||||
// all ticks
|
||||
d3.selectAll(".brush")
|
||||
.each(function(d) { d3.select(this).call(yscale[d].brush = d3.svg.brush().y(yscale[d]).on("brush", brush)); })
|
||||
}
|
||||
|
||||
brush_count++;
|
||||
|
||||
show_ticks();
|
||||
|
||||
// update axes
|
||||
d3.selectAll(".axis")
|
||||
.each(function(d,i) {
|
||||
// hide lines for better performance
|
||||
d3.select(this).selectAll('line').style("display", "none");
|
||||
|
||||
// transition axis numbers
|
||||
d3.select(this)
|
||||
.transition()
|
||||
.duration(720)
|
||||
.call(axis.scale(yscale[d]));
|
||||
|
||||
// bring lines back
|
||||
d3.select(this).selectAll('line').transition().delay(800).style("display", null);
|
||||
|
||||
d3.select(this)
|
||||
.selectAll('text')
|
||||
.style('font-weight', null)
|
||||
.style('font-size', null)
|
||||
.style('display', null);
|
||||
});
|
||||
}
|
||||
|
||||
// Rescale to new dataset domain
|
||||
function rescale() {
|
||||
// reset yscales, preserving inverted state
|
||||
dimensions.forEach(function(d,i) {
|
||||
if (yscale[d].inverted) {
|
||||
yscale[d] = d3.scale.linear()
|
||||
.domain(d3.extent(data, function(p) { return +p[d]; }))
|
||||
.range([0, h]);
|
||||
yscale[d].inverted = true;
|
||||
} else {
|
||||
yscale[d] = d3.scale.linear()
|
||||
.domain(d3.extent(data, function(p) { return +p[d]; }))
|
||||
.range([h, 0]);
|
||||
}
|
||||
});
|
||||
|
||||
update_ticks();
|
||||
|
||||
// Render selected data
|
||||
paths(data, foreground, brush_count);
|
||||
}
|
||||
|
||||
// Get polylines within extents
|
||||
function actives() {
|
||||
var actives = dimensions.filter(function(p) { return !yscale[p].brush.empty(); }),
|
||||
extents = actives.map(function(p) { return yscale[p].brush.extent(); });
|
||||
|
||||
// filter extents and excluded groups
|
||||
var selected = [];
|
||||
data
|
||||
.filter(function(d) {
|
||||
return !_.contains(excluded_groups, d.group);
|
||||
})
|
||||
.map(function(d) {
|
||||
return actives.every(function(p, i) {
|
||||
return extents[i][0] <= d[p] && d[p] <= extents[i][1];
|
||||
}) ? selected.push(d) : null;
|
||||
});
|
||||
|
||||
// free text search
|
||||
var query = d3.select("#search")[0][0].value;
|
||||
if (query > 0) {
|
||||
selected = search(selected, query);
|
||||
}
|
||||
|
||||
return selected;
|
||||
}
|
||||
|
||||
// Export data
|
||||
function export_csv() {
|
||||
var keys = d3.keys(data[0]);
|
||||
var rows = actives().map(function(row) {
|
||||
return keys.map(function(k) { return row[k]; })
|
||||
});
|
||||
var csv = d3.csv.format([keys].concat(rows)).replace(/\n/g,"<br/>\n");
|
||||
var styles = "<style>body { font-family: sans-serif; font-size: 12px; }</style>";
|
||||
window.open("text/csv").document.write(styles + csv);
|
||||
}
|
||||
|
||||
// scale to window size
|
||||
window.onresize = function() {
|
||||
width = document.body.clientWidth,
|
||||
height = d3.max([document.body.clientHeight-500, 400]);
|
||||
|
||||
w = width - m[1] - m[3],
|
||||
h = height - m[0] - m[2];
|
||||
|
||||
d3.select("#chart")
|
||||
.style("height", (h + m[0] + m[2]) + "px")
|
||||
|
||||
d3.selectAll("canvas")
|
||||
.attr("width", w)
|
||||
.attr("height", h)
|
||||
.style("padding", m.join("px ") + "px");
|
||||
|
||||
d3.select("svg")
|
||||
.attr("width", w + m[1] + m[3])
|
||||
.attr("height", h + m[0] + m[2])
|
||||
.select("g")
|
||||
.attr("transform", "translate(" + m[3] + "," + m[0] + ")");
|
||||
|
||||
xscale = d3.scale.ordinal().rangePoints([0, w], 1).domain(dimensions);
|
||||
dimensions.forEach(function(d) {
|
||||
yscale[d].range([h, 0]);
|
||||
});
|
||||
|
||||
d3.selectAll(".dimension")
|
||||
.attr("transform", function(d) { return "translate(" + xscale(d) + ")"; })
|
||||
// update brush placement
|
||||
d3.selectAll(".brush")
|
||||
.each(function(d) { d3.select(this).call(yscale[d].brush = d3.svg.brush().y(yscale[d]).on("brush", brush)); })
|
||||
brush_count++;
|
||||
|
||||
// update axis placement
|
||||
axis = axis.ticks(1+height/50),
|
||||
d3.selectAll(".axis")
|
||||
.each(function(d) { d3.select(this).call(axis.scale(yscale[d])); });
|
||||
|
||||
// render data
|
||||
brush();
|
||||
};
|
||||
|
||||
// Remove all but selected from the dataset
|
||||
function keep_data() {
|
||||
new_data = actives();
|
||||
if (new_data.length == 0) {
|
||||
alert("I don't mean to be rude, but I can't let you remove all the data.\n\nTry removing some brushes to get your data back. Then click 'Keep' when you've selected data you want to look closer at.");
|
||||
return false;
|
||||
}
|
||||
data = new_data;
|
||||
rescale();
|
||||
}
|
||||
|
||||
// Exclude selected from the dataset
|
||||
function exclude_data() {
|
||||
new_data = _.difference(data, actives());
|
||||
if (new_data.length == 0) {
|
||||
alert("I don't mean to be rude, but I can't let you remove all the data.\n\nTry selecting just a few data points then clicking 'Exclude'.");
|
||||
return false;
|
||||
}
|
||||
data = new_data;
|
||||
rescale();
|
||||
}
|
||||
|
||||
function remove_axis(d,g) {
|
||||
dimensions = _.difference(dimensions, [d]);
|
||||
xscale.domain(dimensions);
|
||||
g.attr("transform", function(p) { return "translate(" + position(p) + ")"; });
|
||||
g.filter(function(p) { return p == d; }).remove();
|
||||
update_ticks();
|
||||
}
|
||||
|
||||
d3.select("#keep-data").on("click", keep_data);
|
||||
d3.select("#exclude-data").on("click", exclude_data);
|
||||
d3.select("#export-data").on("click", export_csv);
|
||||
d3.select("#search").on("keyup", brush);
|
||||
|
||||
|
||||
// Appearance toggles
|
||||
d3.select("#hide-ticks").on("click", hide_ticks);
|
||||
d3.select("#show-ticks").on("click", show_ticks);
|
||||
d3.select("#dark-theme").on("click", dark_theme);
|
||||
d3.select("#light-theme").on("click", light_theme);
|
||||
|
||||
function hide_ticks() {
|
||||
d3.selectAll(".axis g").style("display", "none");
|
||||
//d3.selectAll(".axis path").style("display", "none");
|
||||
d3.selectAll(".background").style("visibility", "hidden");
|
||||
d3.selectAll("#hide-ticks").attr("disabled", "disabled");
|
||||
d3.selectAll("#show-ticks").attr("disabled", null);
|
||||
};
|
||||
|
||||
function show_ticks() {
|
||||
d3.selectAll(".axis g").style("display", null);
|
||||
//d3.selectAll(".axis path").style("display", null);
|
||||
d3.selectAll(".background").style("visibility", null);
|
||||
d3.selectAll("#show-ticks").attr("disabled", "disabled");
|
||||
d3.selectAll("#hide-ticks").attr("disabled", null);
|
||||
};
|
||||
|
||||
function dark_theme() {
|
||||
d3.select("body").attr("class", "dark");
|
||||
d3.selectAll("#dark-theme").attr("disabled", "disabled");
|
||||
d3.selectAll("#light-theme").attr("disabled", null);
|
||||
}
|
||||
|
||||
function light_theme() {
|
||||
d3.select("body").attr("class", null);
|
||||
d3.selectAll("#light-theme").attr("disabled", "disabled");
|
||||
d3.selectAll("#dark-theme").attr("disabled", null);
|
||||
}
|
||||
|
||||
function search(selection,str) {
|
||||
pattern = new RegExp(str,"i")
|
||||
return _(selection).filter(function(d) { return pattern.exec(d.name); });
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,137 +0,0 @@
|
|||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
|
||||
exports.isDark = false;
|
||||
exports.cssText = ".ace-crimson-editor .ace_gutter {\
|
||||
background: #ebebeb;\
|
||||
color: #333;\
|
||||
overflow : hidden;\
|
||||
}\
|
||||
.ace-crimson-editor .ace_gutter-layer {\
|
||||
width: 100%;\
|
||||
text-align: right;\
|
||||
}\
|
||||
.ace-crimson-editor .ace_print-margin {\
|
||||
width: 1px;\
|
||||
background: #e8e8e8;\
|
||||
}\
|
||||
.ace-crimson-editor {\
|
||||
background-color: #FFFFFF;\
|
||||
color: rgb(64, 64, 64);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_cursor {\
|
||||
color: black;\
|
||||
}\
|
||||
.ace-crimson-editor .ace_invisible {\
|
||||
color: rgb(191, 191, 191);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_identifier {\
|
||||
color: black;\
|
||||
}\
|
||||
.ace-crimson-editor .ace_keyword {\
|
||||
color: blue;\
|
||||
}\
|
||||
.ace-crimson-editor .ace_constant.ace_buildin {\
|
||||
color: rgb(88, 72, 246);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_constant.ace_language {\
|
||||
color: rgb(255, 156, 0);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_constant.ace_library {\
|
||||
color: rgb(6, 150, 14);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_invalid {\
|
||||
text-decoration: line-through;\
|
||||
color: rgb(224, 0, 0);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_fold {\
|
||||
}\
|
||||
.ace-crimson-editor .ace_support.ace_function {\
|
||||
color: rgb(192, 0, 0);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_support.ace_constant {\
|
||||
color: rgb(6, 150, 14);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_support.ace_type,\
|
||||
.ace-crimson-editor .ace_support.ace_class {\
|
||||
color: rgb(109, 121, 222);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_keyword.ace_operator {\
|
||||
color: rgb(49, 132, 149);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_string {\
|
||||
color: rgb(128, 0, 128);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_comment {\
|
||||
color: rgb(76, 136, 107);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_comment.ace_doc {\
|
||||
color: rgb(0, 102, 255);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\
|
||||
color: rgb(128, 159, 191);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_constant.ace_numeric {\
|
||||
color: rgb(0, 0, 64);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_variable {\
|
||||
color: rgb(0, 64, 128);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_xml-pe {\
|
||||
color: rgb(104, 104, 91);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_marker-layer .ace_selection {\
|
||||
background: rgb(181, 213, 255);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_marker-layer .ace_step {\
|
||||
background: rgb(252, 255, 0);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_marker-layer .ace_stack {\
|
||||
background: rgb(164, 229, 101);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_marker-layer .ace_bracket {\
|
||||
margin: -1px 0 0 -1px;\
|
||||
border: 1px solid rgb(192, 192, 192);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_marker-layer .ace_active-line {\
|
||||
background: rgb(232, 242, 254);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_gutter-active-line {\
|
||||
background-color : #dcdcdc;\
|
||||
}\
|
||||
.ace-crimson-editor .ace_meta.ace_tag {\
|
||||
color:rgb(28, 2, 255);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_marker-layer .ace_selected-word {\
|
||||
background: rgb(250, 250, 255);\
|
||||
border: 1px solid rgb(200, 200, 250);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_string.ace_regex {\
|
||||
color: rgb(192, 0, 192);\
|
||||
}\
|
||||
.ace-crimson-editor .ace_indent-guide {\
|
||||
background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
|
||||
}";
|
||||
|
||||
exports.cssClass = "ace-crimson-editor";
|
||||
|
||||
var dom = require("../lib/dom");
|
||||
dom.importCssString(exports.cssText, exports.cssClass);
|
||||
});
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,113 +0,0 @@
|
|||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
{% extends 'admin/base.html' %}
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link href="{{ url_for('static', filename='bootstrap-theme.css') }}" rel="stylesheet">
|
||||
<link rel="icon" type="image/png" href="{{ url_for("static", filename="pin_30.png") }}">
|
||||
<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="main.css") }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block tail_js %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='jqClock.min.js') }}" type="text/javascript"></script>
|
||||
<script>
|
||||
x = new Date()
|
||||
var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000);
|
||||
$("#clock").clock({
|
||||
"dateFormat":"Y-m-d ",
|
||||
"timeFormat":"H:i:s %UTC%",
|
||||
"timestamp":UTCseconds
|
||||
}).click(function(){
|
||||
alert('{{ hostname }}');
|
||||
});
|
||||
$('span').tooltip();
|
||||
|
||||
$.ajaxSetup({
|
||||
beforeSend: function(xhr, settings) {
|
||||
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
|
||||
xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token() }}");
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block page_body %}
|
||||
<div class="container">
|
||||
|
||||
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation" style="background-color: {{ navbar_color }};">
|
||||
<div class="container">
|
||||
<!-- Brand and toggle get grouped for better mobile display -->
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#admin-navbar-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" rel="home" href="{{ url_for('admin.index') }}" style="cursor: pointer;">
|
||||
<img style="float: left; width:35px; margin-top: -7px;"
|
||||
src="{{ url_for("static", filename="pin_100.png") }}"
|
||||
{% if current_user.user is defined %}
|
||||
title="{{ current_user.user.username }}"
|
||||
{% else %}
|
||||
title="{{ current_user.username }}"
|
||||
{% endif %}>
|
||||
<span>Airflow</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- navbar content -->
|
||||
<div class="collapse navbar-collapse" id="admin-navbar-collapse">
|
||||
{% block main_menu %}
|
||||
<ul class="nav navbar-nav">
|
||||
{{ layout.menu() }}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% block menu_links %}
|
||||
<ul class="nav navbar-right">
|
||||
{{ layout.menu_links() }}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
<!-- clock and logout -->
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a id="clock"></a></li>
|
||||
{% if current_user.is_authenticated %}
|
||||
<li class="never_active"><a href="{{ url_for('airflow.logout') }}"><span data-toggle="tooltip" data-placement="left" title="Logout" class="glyphicon glyphicon-log-out"></span></a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a id="clock"></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
{% block messages %}
|
||||
{{ layout.messages() }}
|
||||
{% endblock %}
|
||||
|
||||
{# store the jinja2 context for form_rules rendering logic #}
|
||||
{% set render_ctx = h.resolve_ctx() %}
|
||||
{% block body %}
|
||||
{{ content }}
|
||||
{% endblock %}
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -21,17 +21,17 @@
|
|||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for('static', filename='tree.css') }}">
|
||||
<link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css') }}" rel="stylesheet">
|
||||
href="{{ url_for('static', filename='css/tree.css') }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="dataTables.bootstrap.css") }}">
|
||||
href="{{ url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.css')}}" >
|
||||
<link href="{{ url_for_asset('dataTables.bootstrap.min.css') }}" rel="stylesheet" type="text/css" >
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="nv.d3.css") }}">
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='nv.d3.js') }}"></script>
|
||||
href="{{ url_for_asset('nv.d3.min.css') }}">
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('nv.d3.min.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<div style="float: left" class="form-inline">
|
||||
<form method="get" style="float:left;">
|
||||
|
@ -52,7 +52,5 @@
|
|||
{{ super() }}
|
||||
<div class="container"></div>
|
||||
|
||||
<script src="{{ admin_static.url(
|
||||
filename='vendor/bootstrap-daterangepicker/daterangepicker.js') }}">
|
||||
</script>
|
||||
<script src="{{url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.js')}}"></script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/model/create.html' %}
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='ace.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='mode-sql.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='theme-crimson_editor.js') }}"></script>
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
var sql_clone = $('#sql').clone().attr('id', 'sql_clone').appendTo($('#sql').parent());
|
||||
var textarea = $('#sql').hide();
|
||||
var editor = ace.edit("sql_clone");
|
||||
editor.setTheme("ace/theme/crimson_editor");
|
||||
editor.setOptions({
|
||||
minLines: 3,
|
||||
maxLines: Infinity,
|
||||
});
|
||||
editor.getSession().setMode("ace/mode/sql");
|
||||
editor.getSession().on('change', function(){
|
||||
textarea.val(editor.getSession().getValue());
|
||||
});
|
||||
editor.focus();
|
||||
$(":checkbox").removeClass("form-control");
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -1,51 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/model/edit.html' %}
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='ace.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='mode-sql.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='theme-crimson_editor.js') }}"></script>
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
var sql_clone = $('#sql').clone().attr('id', 'sql_clone').appendTo($('#sql').parent());
|
||||
var textarea = $('#sql').hide();
|
||||
var editor = ace.edit("sql_clone");
|
||||
editor.setTheme("ace/theme/crimson_editor");
|
||||
editor.setOptions({
|
||||
minLines: 3,
|
||||
maxLines: Infinity,
|
||||
});
|
||||
editor.getSession().setMode("ace/mode/sql");
|
||||
editor.getSession().on('change', function(){
|
||||
textarea.val(editor.getSession().getValue());
|
||||
});
|
||||
editor.focus();
|
||||
|
||||
// Getting column_descriptions in tooltips
|
||||
$(":checkbox").removeClass("form-control");
|
||||
$("span.help-block").each(function(){
|
||||
$(this).parent().attr("title", $(this).text());
|
||||
$(this).parent().attr("data-toggle", "tooltip");
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
$('[data-toggle="tooltip"]').tooltip();
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -1,13 +1,13 @@
|
|||
{#
|
||||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -26,7 +26,7 @@
|
|||
<svg></svg>
|
||||
|
||||
</div>
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script>
|
||||
var height =700;
|
||||
var width = document.getElementById("div_svg").offsetWidth;
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
{{ title }}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h2>{{ title }}</h2>
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
{{ title }}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h2>{{ title }}</h2>
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h2>Wait a minute.</h2>
|
||||
<div class="panel">
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
{#
|
||||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -15,9 +15,9 @@
|
|||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'airflow/model_create.html' %}
|
||||
{% extends 'appbuilder/general/model/add.html' %}
|
||||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='connection_form.js') }}"></script>
|
||||
<script src="{{ url_for_asset('connectionForm.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
{#
|
||||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -15,9 +15,9 @@
|
|||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'airflow/model_edit.html' %}
|
||||
{% extends 'appbuilder/general/model/edit.html' %}
|
||||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='connection_form.js') }}"></script>
|
||||
<script src="{{ url_for_asset('static', filename='connectionForm.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'airflow/model_list.html' %}
|
||||
|
||||
{% block model_menu_bar %}
|
||||
{% if not admin_view.is_secure() %}
|
||||
<div class="alert alert-danger"><b>Warning:</b> Connection passwords are stored in plaintext until you install the Python "cryptography" library. You can find installation instructions here: <a href=https://cryptography.io/en/latest/installation/>https://cryptography.io/en/latest/installation/</a>. Once installed, instructions for creating an encryption key will be displayed the next time you import Airflow. </div>
|
||||
{% endif %}
|
||||
{% if admin_view.alert_fernet_key() %}
|
||||
<div class="alert alert-danger"><b>Warning:</b>
|
||||
Airflow is currently storing passwords in <b>plain text</b>.
|
||||
To turn on password encryption for connections, you need to add a
|
||||
"fernet_key" option to the "core" section of your airflow.cfg file.
|
||||
To generate a key, you can call the function
|
||||
<code>airflow.configuration.generate_fernet_key()</code>
|
||||
</div>
|
||||
{% endif %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
|
@ -16,18 +16,16 @@
|
|||
|
||||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
{% import 'admin/lib.html' as lib with context %}
|
||||
|
||||
{% block title %}Airflow - DAG {{ dag.dag_id }}{% endblock %}
|
||||
|
||||
{% block head_css %}
|
||||
{{ lib.form_css() }}
|
||||
{{ super() }}
|
||||
<link href="{{ url_for("static", filename="bootstrap-toggle.min.css") }}" rel="stylesheet" type="text/css">
|
||||
<link href="{{ url_for_asset('bootstrap-toggle.min.css') }}" rel="stylesheet" type="text/css">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<div>
|
||||
{% block content %}
|
||||
<div>
|
||||
<h3 class="pull-left">
|
||||
{% if dag.parent_dag %}
|
||||
<span style='color:#AAA;'>SUBDAG: </span> <span> {{ dag.dag_id }}</span>
|
||||
|
@ -40,68 +38,77 @@
|
|||
{% endif %}
|
||||
</h3>
|
||||
<h4 class="pull-right">
|
||||
<a class="label label-default" href="/admin/dagrun/?flt2_dag_id_equals={{ dag.dag_id }}">
|
||||
<a class="label label-default" href="{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}">
|
||||
schedule: {{ dag.schedule_interval }}
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
<div>
|
||||
{% set base_date_arg = request.args.get('base_date') %}
|
||||
{% set num_runs_arg = request.args.get('num_runs') %}
|
||||
<ul class="nav nav-pills">
|
||||
{% if dag.parent_dag %}
|
||||
<li class="never_active"><a href="{{ url_for('airflow.' + dag.get_default_view(), dag_id=dag.parent_dag.dag_id) }}">
|
||||
<li class="never_active"><a href="{{ url_for('Airflow.' + dag.get_default_view(), dag_id=dag.parent_dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
|
||||
Back to {{ dag.parent_dag.dag_id }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li><a href="{{ url_for("airflow.graph", dag_id=dag.dag_id, root=root, execution_date=execution_date) }}">
|
||||
<li><a href="{{ url_for('Airflow.graph', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
Graph View</a></li>
|
||||
<li><a href="{{ url_for("airflow.tree", dag_id=dag.dag_id, num_runs=num_runs, root=root) }}">
|
||||
<li><a href="{{ url_for('Airflow.tree', dag_id=dag.dag_id, num_runs=num_runs_arg, root=root, base_date=base_date_arg) }}">
|
||||
<span class="glyphicon glyphicon-tree-deciduous" aria-hidden="true"></span>
|
||||
Tree View
|
||||
</a></li>
|
||||
<li><a href="{{ url_for("airflow.duration", dag_id=dag.dag_id, days=30, root=root) }}">
|
||||
<li><a href="{{ url_for('Airflow.duration', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
|
||||
<span class="glyphicon glyphicon-stats" aria-hidden="true"></span>
|
||||
Task Duration
|
||||
</a></li>
|
||||
<li><a href="{{ url_for("airflow.tries", dag_id=dag.dag_id, days=30, root=root) }}">
|
||||
<li><a href="{{ url_for('Airflow.tries', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
|
||||
<span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span>
|
||||
Task Tries
|
||||
</a></li>
|
||||
<li>
|
||||
<a href="{{ url_for("airflow.landing_times", dag_id=dag.dag_id, days=30, root=root) }}">
|
||||
<a href="{{ url_for('Airflow.landing_times', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
|
||||
<span class="glyphicon glyphicon-plane" aria-hidden="true"></span>
|
||||
Landing Times
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for("airflow.gantt", dag_id=dag.dag_id, root=root) }}">
|
||||
<a href="{{ url_for('Airflow.gantt', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
|
||||
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
|
||||
<i class="icon-align-left"></i>
|
||||
Gantt
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for("airflow.dag_details", dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for('Airflow.dag_details', dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-list" aria-hidden="true"></span>
|
||||
Details
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for("airflow.code", dag_id=dag.dag_id, root=root) }}">
|
||||
<a href="{{ url_for('Airflow.code', dag_id=dag.dag_id, root=root) }}">
|
||||
<span class="glyphicon glyphicon-file" aria-hidden="true"></span>
|
||||
Code
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for("airflow.refresh", dag_id=dag.dag_id) }}" title="Refresh">
|
||||
<a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin="/tree?dag_id="+dag.dag_id) }}"
|
||||
onclick="return confirmTriggerDag('{{ dag.safe_dag_id }}')">
|
||||
<span class="glyphicon glyphicon-play-circle" aria-hidden="true"></span>
|
||||
Trigger DAG
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for('Airflow.refresh', dag_id=dag.dag_id) }}" title="Refresh">
|
||||
<span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
|
||||
Refresh
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for("airflow.delete", dag_id=dag.dag_id) }}"
|
||||
<a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id) }}"
|
||||
onclick="return confirmDeleteDag('{{ dag.safe_dag_id }}')">
|
||||
<span class="glyphicon glyphicon-remove-circle" style="color:red" aria-hidden="true"></span>
|
||||
Delete
|
||||
|
@ -282,9 +289,8 @@
|
|||
</div>
|
||||
{% endblock %}
|
||||
{% block tail %}
|
||||
{{ lib.form_js() }}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='bootstrap-toggle.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('bootstrap-toggle.min.js') }}"></script>
|
||||
<script>
|
||||
function updateQueryStringParameter(uri, key, value) {
|
||||
var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
|
||||
|
@ -305,6 +311,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
|
||||
var id = '';
|
||||
var dag_id = '{{ dag.dag_id }}';
|
||||
var dagTZ = '{{ dag.timezone.name }}'; // Being used in datetime-utils.js
|
||||
var task_id = '';
|
||||
var exection_date = '';
|
||||
var subdag_id = '';
|
||||
|
@ -328,9 +335,9 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
}
|
||||
|
||||
$("#try_index > li").remove();
|
||||
var startIndex = (try_numbers > 2 ? 0 : 1);
|
||||
var startIndex = (try_numbers > 2 ? 0 : 1)
|
||||
for (var index = startIndex; index < try_numbers; index++) {
|
||||
var url = "{{ url_for('airflow.get_logs_with_metadata') }}" +
|
||||
var url = "{{ url_for('Airflow.get_logs_with_metadata') }}" +
|
||||
"?dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&task_id=" + encodeURIComponent(task_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date) +
|
||||
|
@ -359,6 +366,10 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
$("#dagModal").css("margin-top","0px");
|
||||
}
|
||||
|
||||
function confirmTriggerDag(dag_id){
|
||||
return confirm("Are you sure you want to run '"+dag_id+"' now?");
|
||||
}
|
||||
|
||||
function confirmDeleteDag(dag_id){
|
||||
return confirm("Are you sure you want to delete '"+dag_id+"' now?\n\
|
||||
This option will delete ALL metadata, DAG runs, etc.\n\
|
||||
|
@ -367,7 +378,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
}
|
||||
|
||||
$("#btn_rendered").click(function(){
|
||||
url = "{{ url_for('airflow.rendered') }}" +
|
||||
url = "{{ url_for('Airflow.rendered') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date);
|
||||
|
@ -375,23 +386,22 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_subdag").click(function(){
|
||||
url = "{{ url_for( 'airflow.' + dag.get_default_view() ) }}" +
|
||||
url = "{{ url_for( 'Airflow.' + dag.get_default_view() ) }}" +
|
||||
"?dag_id=" + encodeURIComponent(subdag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date);
|
||||
window.location = url;
|
||||
});
|
||||
|
||||
$("#btn_log").click(function(){
|
||||
url = "{{ url_for('airflow.log') }}" +
|
||||
url = "{{ url_for('Airflow.log') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date) +
|
||||
"&format=json";
|
||||
"&execution_date=" + encodeURIComponent(execution_date);
|
||||
window.location = url;
|
||||
});
|
||||
|
||||
$("#btn_task").click(function(){
|
||||
url = "{{ url_for('airflow.task') }}" +
|
||||
url = "{{ url_for('Airflow.task') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date);
|
||||
|
@ -399,15 +409,15 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_ti").click(function(){
|
||||
url = "/admin/taskinstance/" +
|
||||
"?flt1_dag_id_equals=" + encodeURIComponent(dag_id) +
|
||||
"&flt2_task_id_equals=" + encodeURIComponent(task_id) +
|
||||
"&sort=3&desc=1";
|
||||
url = "{{ url_for('TaskInstanceModelView.list') }}" +
|
||||
"?flt1_dag_id_equals=" + dag_id +
|
||||
"&_flt_3_task_id=" + task_id +
|
||||
"&_oc_TaskInstanceModelView=execution_date";
|
||||
window.location = url;
|
||||
});
|
||||
|
||||
$("#btn_run").click(function(){
|
||||
url = "{{ url_for('airflow.run') }}" +
|
||||
url = "{{ url_for('Airflow.run') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&ignore_all_deps=" + $('#btn_ignore_all_deps').hasClass('active') +
|
||||
|
@ -419,7 +429,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_clear").click(function(){
|
||||
url = "{{ url_for('airflow.clear') }}" +
|
||||
url = "{{ url_for('Airflow.clear') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&future=" + $('#btn_future').hasClass('active') +
|
||||
|
@ -433,7 +443,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_dagrun_clear").click(function(){
|
||||
url = "{{ url_for('airflow.dagrun_clear') }}" +
|
||||
url = "{{ url_for('Airflow.dagrun_clear') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date) +
|
||||
|
@ -442,7 +452,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_failed").click(function(){
|
||||
url = "{{ url_for('airflow.failed') }}" +
|
||||
url = "{{ url_for('Airflow.failed') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&upstream=" + $('#btn_failed_upstream').hasClass('active') +
|
||||
|
@ -456,7 +466,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_success").click(function(){
|
||||
url = "{{ url_for('airflow.success') }}" +
|
||||
url = "{{ url_for('Airflow.success') }}" +
|
||||
"?task_id=" + encodeURIComponent(task_id) +
|
||||
"&dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&upstream=" + $('#btn_success_upstream').hasClass('active') +
|
||||
|
@ -470,7 +480,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$('#btn_dagrun_failed').click(function(){
|
||||
url = "{{ url_for('airflow.dagrun_failed') }}" +
|
||||
url = "{{ url_for('Airflow.dagrun_failed') }}" +
|
||||
"?dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date) +
|
||||
"&origin=" + encodeURIComponent(window.location);
|
||||
|
@ -478,7 +488,7 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$('#btn_dagrun_success').click(function(){
|
||||
url = "{{ url_for('airflow.dagrun_success') }}" +
|
||||
url = "{{ url_for('Airflow.dagrun_success') }}" +
|
||||
"?dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date) +
|
||||
"&origin=" + encodeURIComponent(window.location);
|
||||
|
@ -486,32 +496,32 @@ function updateQueryStringParameter(uri, key, value) {
|
|||
});
|
||||
|
||||
$("#btn_gantt").click(function(){
|
||||
url = "{{ url_for('airflow.gantt') }}" +
|
||||
url = "{{ url_for('Airflow.gantt') }}" +
|
||||
"?dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date);
|
||||
window.location = url;
|
||||
});
|
||||
|
||||
$("#btn_graph").click(function(){
|
||||
url = "{{ url_for('airflow.graph') }}" +
|
||||
url = "{{ url_for('Airflow.graph') }}" +
|
||||
"?dag_id=" + encodeURIComponent(dag_id) +
|
||||
"&execution_date=" + encodeURIComponent(execution_date);
|
||||
window.location = url;
|
||||
});
|
||||
|
||||
$("#pause_resume").change(function() {
|
||||
var dag_id = $(this).attr('dag_id');
|
||||
var dag_id = $(this).attr('dag_id');
|
||||
if ($(this).prop('checked')) {
|
||||
is_paused = 'true'
|
||||
} else {
|
||||
is_paused = 'false'
|
||||
}
|
||||
url = "{{ url_for('airflow.paused') }}" + '?is_paused=' + is_paused + '&dag_id=' + encodeURIComponent(dag_id);
|
||||
url = "{{ url_for('Airflow.paused') }}" + '?is_paused=' + is_paused + '&dag_id=' + encodeURIComponent(dag_id);
|
||||
$.post(url);
|
||||
});
|
||||
|
||||
$('#btn_edit_dagrun').click(function(){
|
||||
window.location = '/admin/dagrun/edit/?id=' + id;
|
||||
$('#btn_edit_dagrun').click(function() {
|
||||
window.location = "{{ url_for('DagModelView.show', pk=dag.dag_id) }}";
|
||||
});
|
||||
|
||||
</script>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
{% extends "airflow/dag.html" %}
|
||||
{% block title %}Airflow - DAGs{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h4>{{ title }}</h4>
|
||||
{{ html_code|safe }}
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
{#
|
||||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -21,7 +21,7 @@
|
|||
{{ title }}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h2>{{ title }}</h2>
|
||||
<div>
|
||||
|
@ -29,7 +29,7 @@
|
|||
<a
|
||||
class="btn"
|
||||
style="border: none; background-color:{{ State.color(state)}}; color: {{ State.color_fg(state) }};"
|
||||
href="{{ url_for('taskinstance.index_view') }}?flt0_dag_id_equals={{ dag.dag_id }}&flt2_state_equals={{ state }}">
|
||||
href="/taskinstance/list/?_flt_3_dag_id={{ dag.dag_id }}&_flt_3_state={{ state }}">
|
||||
{{ state }} <span class="badge">{{ count }}</span>
|
||||
</a>
|
||||
{% endfor %}
|
||||
|
|
|
@ -21,11 +21,11 @@
|
|||
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link href="{{ url_for("static", filename="dataTables.bootstrap.css") }}" rel="stylesheet" type="text/css" >
|
||||
<link href="{{ url_for("static", filename="bootstrap-toggle.min.css") }}" rel="stylesheet" type="text/css">
|
||||
<link href="{{ url_for_asset('dataTables.bootstrap.min.css') }}" rel="stylesheet" type="text/css" >
|
||||
<link href="{{ url_for_asset('bootstrap-toggle.min.css') }}" rel="stylesheet" type="text/css">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
<h2>DAGs</h2>
|
||||
|
||||
<div id="main_content">
|
||||
|
@ -67,27 +67,27 @@
|
|||
<tr>
|
||||
<!-- Column 1: Edit dag -->
|
||||
<td class="text-center" style="width:10px;">
|
||||
<a href="{{ url_for('dagmodel.edit_view') }}?id={{ dag.dag_id }}" title="Info">
|
||||
<a href="{{ url_for('DagModelView.show', pk=dag.dag_id) }}" title="Info">
|
||||
<span class="glyphicon glyphicon-edit" aria-hidden="true"></span>
|
||||
</a>
|
||||
</td>
|
||||
|
||||
<!-- Column 2: Turn dag on/off -->
|
||||
<td>
|
||||
<input id="toggle-{{ dag.dag_id }}" dag_id="{{ dag.dag_id }}" type="checkbox" {{ "checked" if not dag.is_paused else "" }} data-toggle="toggle" data-size="mini" method="post">
|
||||
<input id="toggle-{{ dag.dag_id }}" dag_id="{{ dag.dag_id }}" type="checkbox" {{ "checked" if not dag.is_paused else "" }} data-toggle="toggle" data-size="mini" method="post">
|
||||
</td>
|
||||
|
||||
<!-- Column 3: Name -->
|
||||
<td>
|
||||
<a href="{{ url_for('airflow.'+ dag.get_default_view(), dag_id=dag.dag_id) }}" title="{{ dag.description }}">
|
||||
{{ dag.dag_id }}
|
||||
</a>
|
||||
<a href="{{ url_for('Airflow.'+ dag.get_default_view(), dag_id=dag.dag_id) }}" title="{{ dag.description }}">
|
||||
{{ dag.dag_id }}
|
||||
</a>
|
||||
</td>
|
||||
|
||||
<!-- Column 4: Dag Schedule -->
|
||||
<td>
|
||||
<a class="label label-default schedule {{ dag.dag_id }}" href="{{ url_for('dagrun.index_view') }}?flt2_dag_id_equals={{ dag.dag_id }}">
|
||||
{{ dag.schedule_interval | string }}
|
||||
<a class="label label-default schedule {{ dag.dag_id }}" href="{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}">
|
||||
{{ dag.schedule_interval }}
|
||||
</a>
|
||||
</td>
|
||||
|
||||
|
@ -105,7 +105,7 @@
|
|||
<td class="text-nowrap latest_dag_run {{ dag.dag_id }}">
|
||||
{% set last_run = dag.get_last_dagrun(include_externally_triggered=True) %}
|
||||
{% if last_run and last_run.execution_date %}
|
||||
<a href="{{ url_for('airflow.graph', dag_id=dag.dag_id, execution_date=last_run.execution_date) }}">
|
||||
<a href="{{ url_for('Airflow.graph', dag_id=dag.dag_id, execution_date=last_run.execution_date) }}">
|
||||
{{ last_run.execution_date.strftime("%Y-%m-%d %H:%M") }}
|
||||
</a>
|
||||
<span aria-hidden="true" id="statuses_info" title="Start Date: {{ last_run.start_date.strftime("%Y-%m-%d %H:%M") }}" class="glyphicon glyphicon-info-sign"></span>
|
||||
|
@ -122,60 +122,60 @@
|
|||
{% if dag %}
|
||||
|
||||
<!-- Trigger Dag -->
|
||||
<a href="{{ url_for('airflow.trigger', dag_id=dag.dag_id) }}"
|
||||
<a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id) }}"
|
||||
onclick="return confirmTriggerDag('{{ dag.safe_dag_id }}')">
|
||||
<span class="glyphicon glyphicon-play-circle" aria-hidden="true" data-original-title="Trigger Dag"></span>
|
||||
</a>
|
||||
|
||||
<!-- Tree -->
|
||||
<a href="{{ url_for('airflow.tree', dag_id=dag.dag_id, num_runs=num_runs) }}">
|
||||
<a href="{{ url_for('Airflow.tree', dag_id=dag.dag_id, num_runs=num_runs) }}">
|
||||
<span class="glyphicon glyphicon-tree-deciduous" aria-hidden="true" data-original-title="Tree View"></span>
|
||||
</a>
|
||||
|
||||
<!-- Graph -->
|
||||
<a href="{{ url_for('airflow.graph', dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for('Airflow.graph', dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true" data-original-title="Graph View"></span>
|
||||
</a>
|
||||
|
||||
<!-- Duration -->
|
||||
<a href="{{ url_for('airflow.duration', dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for('Airflow.duration', dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-stats" aria-hidden="true" data-original-title="Tasks Duration"></span>
|
||||
</a>
|
||||
|
||||
<!-- Retries -->
|
||||
<a href="{{ url_for('airflow.tries', dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for('Airflow.tries', dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-duplicate" aria-hidden="true" data-original-title="Task Tries"></span>
|
||||
</a>
|
||||
|
||||
<!-- Landing Times -->
|
||||
<a href="{{ url_for("airflow.landing_times", dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for("Airflow.landing_times", dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-plane" aria-hidden="true" data-original-title="Landing Times"></span>
|
||||
</a>
|
||||
|
||||
<!-- Gantt -->
|
||||
<a href="{{ url_for("airflow.gantt", dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for("Airflow.gantt", dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-align-left" aria-hidden="true" data-original-title="Gantt View"></span>
|
||||
</a>
|
||||
|
||||
<!-- Code -->
|
||||
<a href="{{ url_for("airflow.code", dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for("Airflow.code", dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-file" aria-hidden="true" data-original-title="Code View"></span>
|
||||
</a>
|
||||
|
||||
<!-- Logs -->
|
||||
<a href="{{ url_for('log.index_view') }}?sort=1&desc=1&flt1_dag_id_equals={{ dag.dag_id }}">
|
||||
<a href="{{ url_for('LogModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}&_od_LogModelView=desc&_oc_LogModelView=dttm">
|
||||
<span class="glyphicon glyphicon-align-justify" aria-hidden="true" data-original-title="Logs"></span>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
<!-- Refresh -->
|
||||
<a href="{{ url_for("airflow.refresh", dag_id=dag.dag_id) }}">
|
||||
<a href="{{ url_for("Airflow.refresh", dag_id=dag.dag_id) }}">
|
||||
<span class="glyphicon glyphicon-refresh" aria-hidden="true" data-original-title="Refresh"></span>
|
||||
</a>
|
||||
|
||||
<!-- Delete -->
|
||||
<!-- Use dag_id instead of dag.dag_id, because the DAG might not exist in the webserver's DagBag -->
|
||||
<a href="{{ url_for('airflow.delete', dag_id=dag.dag_id) }}"
|
||||
<a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id) }}"
|
||||
onclick="return confirmDeleteDag('{{ dag.dag_id }}')">
|
||||
<span class="glyphicon glyphicon-remove-circle" style="color:red" aria-hidden="true" data-original-title="Delete Dag"></span>
|
||||
</a>
|
||||
|
@ -198,22 +198,23 @@
|
|||
|
||||
</div>
|
||||
{% if not hide_paused %}
|
||||
<a href="{{ url_for('admin.index') }}?showPaused=False">Hide Paused DAGs</a>
|
||||
<a href="{{ url_for('Airflow.index') }}?showPaused=False">Hide Paused DAGs</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('admin.index') }}?showPaused=True">Show Paused DAGs</a>
|
||||
<a href="{{ url_for('Airflow.index') }}?showPaused=True">Show Paused DAGs</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='jquery.dataTables.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='bootstrap-toggle.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='bootstrap3-typeahead.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('jquery.dataTables.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('dataTables.bootstrap.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('bootstrap-toggle.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('bootstrap3-typeahead.min.js') }}"></script>
|
||||
<script>
|
||||
|
||||
const DAGS_INDEX = "{{ url_for('admin.index') }}";
|
||||
const DAGS_INDEX = "{{ url_for('Airflow.index') }}";
|
||||
const ENTER_KEY_CODE = 13;
|
||||
|
||||
$('#dag_query').on('keypress', function (e) {
|
||||
|
@ -230,16 +231,16 @@
|
|||
window.location = DAGS_INDEX + "?page_size=" + p_size;
|
||||
});
|
||||
|
||||
function confirmTriggerDag(dag_id){
|
||||
return confirm("Are you sure you want to run '"+dag_id+"' now?");
|
||||
}
|
||||
|
||||
function confirmDeleteDag(dag_id){
|
||||
return confirm("Are you sure you want to delete '"+dag_id+"' now?\n\
|
||||
This option will delete ALL metadata, DAG runs, etc.\n\
|
||||
EXCEPT Log.\n\
|
||||
This cannot be undone.");
|
||||
}
|
||||
|
||||
function confirmTriggerDag(dag_id){
|
||||
return confirm("Are you sure you want to run '"+dag_id+"' now?");
|
||||
}
|
||||
all_dags = $("[id^=toggle]");
|
||||
$.each(all_dags, function(i,v) {
|
||||
$(v).change (function() {
|
||||
|
@ -249,7 +250,7 @@
|
|||
} else {
|
||||
is_paused = 'false'
|
||||
}
|
||||
url = 'airflow/paused?is_paused=' + is_paused + '&dag_id=' + dag_id;
|
||||
url = 'paused?is_paused=' + is_paused + '&dag_id=' + dag_id;
|
||||
$.post(url);
|
||||
});
|
||||
});
|
||||
|
@ -274,9 +275,8 @@
|
|||
|
||||
$input.change(function() {
|
||||
var current = $input.typeahead("getActive");
|
||||
});
|
||||
|
||||
$input.attr("autocomplete", "off");
|
||||
});
|
||||
|
||||
$('#dags').dataTable({
|
||||
"iDisplayLength": 500,
|
||||
|
@ -291,7 +291,7 @@
|
|||
circle_margin = 4;
|
||||
stroke_width = 2;
|
||||
stroke_width_hover = 6;
|
||||
d3.json("{{ url_for('airflow.blocked') }}", function(error, json) {
|
||||
d3.json("{{ url_for('Airflow.blocked') }}", function(error, json) {
|
||||
$.each(json, function() {
|
||||
$('.label.schedule.' + this.dag_id)
|
||||
.attr('title', this.active_dag_run + '/' + this.max_active_runs + ' active dag runs')
|
||||
|
@ -302,7 +302,7 @@
|
|||
}
|
||||
});
|
||||
});
|
||||
d3.json("{{ url_for('airflow.dag_stats') }}", function(error, json) {
|
||||
d3.json("{{ url_for('Airflow.dag_stats') }}", function(error, json) {
|
||||
for(var dag_id in json) {
|
||||
states = json[dag_id];
|
||||
g = d3.select('svg#dag-run-' + dag_id)
|
||||
|
@ -350,7 +350,7 @@
|
|||
})
|
||||
.on('click', function(d, i) {
|
||||
if (d.count > 0)
|
||||
window.location = "{{ url_for('dagrun.index_view') }}?flt1_dag_id_equals=" + d.dag_id + "&flt2_state_equals=" + d.state;
|
||||
window.location = "{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id=" + d.dag_id + "&_flt_3_state=" + d.state;
|
||||
})
|
||||
.on('mouseover', function(d, i) {
|
||||
if (d.count > 0) {
|
||||
|
@ -381,7 +381,7 @@
|
|||
container: "body",
|
||||
});
|
||||
});
|
||||
d3.json("{{ url_for('airflow.task_stats') }}", function(error, json) {
|
||||
d3.json("{{ url_for('Airflow.task_stats') }}", function(error, json) {
|
||||
for(var dag_id in json) {
|
||||
states = json[dag_id];
|
||||
g = d3.select('svg#task-run-' + dag_id)
|
||||
|
@ -429,7 +429,7 @@
|
|||
})
|
||||
.on('click', function(d, i) {
|
||||
if (d.count > 0)
|
||||
window.location = "{{ url_for('taskinstance.index_view') }}?flt1_dag_id_equals=" + d.dag_id + "&flt2_state_equals=" + d.state;
|
||||
window.location = "{{ url_for('TaskInstanceModelView.list') }}?_flt_3_dag_id=" + d.dag_id + "&_flt_3_state=" + d.state;
|
||||
})
|
||||
.on('mouseover', function(d, i) {
|
||||
if (d.count > 0) {
|
||||
|
|
|
@ -21,17 +21,17 @@
|
|||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for('static', filename='tree.css') }}">
|
||||
<link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css') }}" rel="stylesheet">
|
||||
href="{{ url_for('static', filename='css/tree.css') }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="dataTables.bootstrap.css") }}">
|
||||
href="{{url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.css')}}" >
|
||||
<link href="{{ url_for_asset('dataTables.bootstrap.min.css') }}" rel="stylesheet" type="text/css" >
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="nv.d3.css") }}">
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='nv.d3.js') }}"></script>
|
||||
href="{{ url_for_asset('nv.d3.min.css') }}">
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('nv.d3.min.js') }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<div>
|
||||
<label for="isCumulative">Cumulative Duration</label>
|
||||
|
@ -71,7 +71,6 @@
|
|||
handleCheck();
|
||||
});
|
||||
</script>
|
||||
<script src="{{ admin_static.url(
|
||||
filename='vendor/bootstrap-daterangepicker/daterangepicker.js') }}"></script>
|
||||
<script src="{{url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.js')}}"></script>
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
|
|
|
@ -19,12 +19,13 @@
|
|||
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css') }}" rel="stylesheet"/>
|
||||
<link type="text/css" href="{{ url_for('static', filename='gantt.css') }}" rel="stylesheet" />
|
||||
<link type="text/css" href="{{ url_for('static', filename='tree.css') }}" rel="stylesheet" />
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.css')}}" >
|
||||
<link type="text/css" href="{{ url_for('static', filename='css/gantt.css') }}" rel="stylesheet" />
|
||||
<link type="text/css" href="{{ url_for('static', filename='css/tree.css') }}" rel="stylesheet" />
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<form method="get">
|
||||
<div class="form-inline">
|
||||
|
@ -45,11 +46,10 @@
|
|||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ admin_static.url(
|
||||
filename='vendor/bootstrap-daterangepicker/daterangepicker.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='d3.tip.v0.6.3.js') }}"></script>/
|
||||
<script src="{{ url_for('static', filename='gantt-chart-d3v2.js') }}"></script>
|
||||
<script src="{{ url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.js') }}"></script>
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('d3-tip.js') }}"></script>/
|
||||
<script src="{{ url_for_asset('ganttChartD3v2.js') }}"></script>
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
var dag_id = '{{ dag.dag_id }}';
|
||||
|
|
|
@ -16,20 +16,16 @@
|
|||
|
||||
#}
|
||||
{% extends "airflow/dag.html" %}
|
||||
{% import 'admin/lib.html' as lib with context %}
|
||||
{% import 'admin/static.html' as admin_static with context %}
|
||||
|
||||
{% block title %}Airflow - DAGs{% endblock %}
|
||||
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for('static', filename='dagre.css') }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for('static', filename='graph.css') }}">
|
||||
href="{{ url_for('static', filename='css/graph.css') }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
{% if doc_md %}
|
||||
<div class="rich_doc" style="margin-bottom: 15px;">{{ doc_md|safe }}</div>
|
||||
|
@ -98,32 +94,70 @@
|
|||
{% block tail %}
|
||||
{{ super() }}
|
||||
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='dagre-d3.js') }}"></script>
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('dagre-d3.min.js') }}"></script>
|
||||
<script>
|
||||
|
||||
var highlight_color = "#000000";
|
||||
var upstream_color = "#2020A0";
|
||||
var downstream_color = "#0000FF";
|
||||
var initialStrokeWidth = '3px';
|
||||
var highlightStrokeWidth = '5px';
|
||||
|
||||
var nodes = {{ nodes|safe }};
|
||||
var edges = {{ edges|safe }};
|
||||
var tasks = {{ tasks|safe }};
|
||||
var task_instances = {{ task_instances|safe }};
|
||||
var execution_date = "{{ execution_date }}";
|
||||
var arrange = "{{ arrange }}";
|
||||
var g = dagreD3.json.decode(nodes, edges);
|
||||
|
||||
// Below variables are being used in dag.js
|
||||
var tasks = {{ tasks|safe }};
|
||||
var task_instances = {{ task_instances|safe }};
|
||||
var getTaskInstanceURL = '{{ url_for("Airflow.task_instances", dag_id='+
|
||||
dag.dag_id + ', execution_date=' + execution_date + ') }}';
|
||||
|
||||
var duration = 500;
|
||||
var stateFocusMap = {
|
||||
'no status':false, 'failed':false, 'running':false,
|
||||
'queued': false, 'success': false};
|
||||
|
||||
// Preparation of DagreD3 data structures
|
||||
var g = new dagreD3.graphlib.Graph().setGraph({
|
||||
nodesep: 15,
|
||||
ranksep: 15,
|
||||
rankdir: arrange,
|
||||
})
|
||||
.setDefaultEdgeLabel(function() { return { lineInterpolate: 'basis' } });
|
||||
|
||||
var layout = dagreD3.layout().rankDir(arrange).nodeSep(15).rankSep(15);
|
||||
var renderer = new dagreD3.Renderer();
|
||||
renderer.layout(layout).run(g, d3.select("#dig"));
|
||||
// Set all nodes and styles
|
||||
nodes.forEach(function(node) {
|
||||
g.setNode(node.id, node.value)
|
||||
});
|
||||
|
||||
// Set edges
|
||||
edges.forEach(function(edge) {
|
||||
g.setEdge(edge.u, edge.v)
|
||||
});
|
||||
|
||||
var render = dagreD3.render(),
|
||||
svg = d3.select("svg"),
|
||||
innerSvg = d3.select("svg g");
|
||||
|
||||
innerSvg.call(render, g);
|
||||
|
||||
function setUpZoomSupport() {
|
||||
// Set up zoom support for Graph
|
||||
var zoom = d3.behavior.zoom().on("zoom", function() {
|
||||
innerSvg.attr("transform", "translate(" + d3.event.translate + ")" +
|
||||
"scale(" + d3.event.scale + ")");
|
||||
});
|
||||
svg.call(zoom);
|
||||
}
|
||||
|
||||
// Centering the DAG on load (Not implemented yet)
|
||||
// https://github.com/dagrejs/dagre-d3/issues/245
|
||||
|
||||
setUpZoomSupport();
|
||||
inject_node_ids(tasks);
|
||||
update_nodes_states(task_instances);
|
||||
|
||||
d3.selectAll("g.node").on("click", function(d){
|
||||
task = tasks[d];
|
||||
|
@ -136,14 +170,14 @@
|
|||
|
||||
function highlight_nodes(nodes, color) {
|
||||
nodes.forEach (function (nodeid) {
|
||||
my_node = d3.select('#' + nodeid + ' rect');
|
||||
my_node.style("stroke", color) ;
|
||||
my_node = d3.select('#' + nodeid).node().parentNode;
|
||||
d3.select(my_node).selectAll("rect").style("stroke", color) ;
|
||||
})
|
||||
}
|
||||
|
||||
d3.selectAll("g.node").on("mouseover", function(d){
|
||||
d3.select(this).selectAll("rect").style("stroke", highlight_color) ;
|
||||
highlight_nodes(g.predecessors(d), upstream_color)
|
||||
highlight_nodes(g.predecessors(d), upstream_color);
|
||||
highlight_nodes(g.successors(d), downstream_color)
|
||||
|
||||
});
|
||||
|
@ -212,7 +246,7 @@
|
|||
.transition().duration(duration)
|
||||
.style("opacity", 1)
|
||||
.selectAll("rect")
|
||||
.style("stroke-width", "2px");
|
||||
.style("stroke-width", initialStrokeWidth);
|
||||
}
|
||||
else{
|
||||
d3.select("g.edgePaths")
|
||||
|
@ -225,17 +259,21 @@
|
|||
.transition().duration(duration)
|
||||
.style("opacity", 1)
|
||||
.selectAll("rect")
|
||||
.style("stroke-width", "10px");
|
||||
.style("stroke-width", highlightStrokeWidth);
|
||||
}
|
||||
else {
|
||||
d3.select(this)
|
||||
.transition()
|
||||
.style("opacity", 0.2).duration(duration)
|
||||
.selectAll("rect")
|
||||
.style("stroke-width", "2px");
|
||||
.style("stroke-width", initialStrokeWidth);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// This moves the matched node in the center of the graph area
|
||||
// ToDo: Should we keep this here as it has no added value
|
||||
// and does not fit the graph on small screens, and has to scroll
|
||||
if(match) {
|
||||
var transform = d3.transform(d3.select(match).attr("transform"));
|
||||
transform.translate = [
|
||||
|
@ -247,8 +285,8 @@
|
|||
d3.select("g.zoom")
|
||||
.transition()
|
||||
.attr("transform", transform.toString());
|
||||
renderer.zoom_obj.translate(transform.translate);
|
||||
renderer.zoom_obj.scale(1);
|
||||
innerSvg.attr("transform", "translate(" + transform.translate + ")" +
|
||||
"scale(1)");
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -264,50 +302,13 @@
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
// Assigning css classes based on state to nodes
|
||||
function update_nodes_states(task_instances) {
|
||||
$.each(task_instances, function(task_id, ti) {
|
||||
$('tspan').filter(function(index) { return $(this).text() === task_id; })
|
||||
.parent().parent().parent()
|
||||
.attr("class", "node enter " + ti.state)
|
||||
.attr("data-toggle", "tooltip")
|
||||
.attr("data-original-title", function(d) {
|
||||
// Tooltip
|
||||
task = tasks[task_id];
|
||||
tt = "Task_id: " + ti.task_id + "<br>";
|
||||
tt += "Run: " + ti.execution_date + "<br>";
|
||||
if(ti.run_id != undefined){
|
||||
tt += "run_id: <nobr>" + ti.run_id + "</nobr><br>";
|
||||
}
|
||||
tt += "Operator: " + task.task_type + "<br>";
|
||||
tt += "Started: " + ti.start_date + "<br>";
|
||||
tt += "Ended: " + ti.end_date + "<br>";
|
||||
tt += "Duration: " + secondsToString(ti.duration) + "<br>";
|
||||
tt += "State: " + ti.state + "<br>";
|
||||
return tt;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function secondsToString(seconds) {
|
||||
var numdays = Math.floor((seconds % 31536000) / 86400);
|
||||
var numhours = Math.floor(((seconds % 31536000) % 86400) / 3600);
|
||||
var numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);
|
||||
var numseconds = Math.floor((((seconds % 31536000) % 86400) % 3600) % 60);
|
||||
return (numdays > 0 ? numdays + (numdays === 1 ? " day " : " days ") : "") +
|
||||
(numhours > 0 ? numhours + (numhours === 1 ? " hour " : " hours ") : "") +
|
||||
(numminutes > 0 ? numminutes + (numminutes === 1 ? " minute " : " minutes ") : "") +
|
||||
(numseconds > 0 ? numseconds + (numseconds === 1 ? " second" : " seconds") : "");
|
||||
}
|
||||
|
||||
function clearFocus(){
|
||||
d3.selectAll("g.node")
|
||||
.transition(duration)
|
||||
.style("opacity", 1);
|
||||
d3.selectAll("g.node rect")
|
||||
.transition(duration)
|
||||
.style("stroke-width", "2px");
|
||||
.style("stroke-width", initialStrokeWidth);
|
||||
d3.select("g.edgePaths")
|
||||
.transition().duration(duration)
|
||||
.style("opacity", 1);
|
||||
|
@ -324,7 +325,7 @@
|
|||
.style("opacity", 1);
|
||||
d3.selectAll("g.node." + state + " rect")
|
||||
.transition(duration)
|
||||
.style("stroke-width", "10px")
|
||||
.style("stroke-width", highlightStrokeWidth)
|
||||
.style("opacity", 1);
|
||||
d3.select("g.edgePaths")
|
||||
.transition().duration(duration)
|
||||
|
@ -350,36 +351,8 @@
|
|||
}
|
||||
return false
|
||||
}
|
||||
|
||||
function error(msg){
|
||||
$('#error_msg').html(msg);
|
||||
$('#error').show();
|
||||
$('#loading').hide();
|
||||
$('#chart_section').hide(1000);
|
||||
$('#datatable_section').hide(1000);
|
||||
}
|
||||
|
||||
d3.select("#refresh_button").on("click",
|
||||
function() {
|
||||
$("#loading").css("display", "block");
|
||||
$("div#svg_container").css("opacity", "0.2");
|
||||
$.get(
|
||||
"{{ url_for('airflow.task_instances') }}",
|
||||
{dag_id : "{{ dag.dag_id }}", execution_date : "{{ execution_date }}"})
|
||||
.done(
|
||||
function(task_instances) {
|
||||
update_nodes_states(JSON.parse(task_instances));
|
||||
$("#loading").hide();
|
||||
$("div#svg_container").css("opacity", "1");
|
||||
$('#error').hide();
|
||||
}
|
||||
).fail(function(jqxhr, textStatus, err) {
|
||||
error(textStatus + ': ' + err);
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
</script>
|
||||
<script src="{{ url_for_asset('graph.js') }}"></script>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,303 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/master.html' %}
|
||||
{% import 'admin/lib.html' as lib with context %}
|
||||
{% import 'admin/static.html' as admin_static with context%}
|
||||
{% import 'admin/model/layout.html' as model_layout with context %}
|
||||
{% import 'admin/actions.html' as actionlib with context %}
|
||||
|
||||
{% block head %}
|
||||
{{ super() }}
|
||||
{{ lib.form_css() }}
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<h2>DAGs</h2>
|
||||
{% block model_menu_bar %}
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active">
|
||||
<a href="javascript:void(0)">{{ _gettext('List') }} ({{ count }})</a>
|
||||
</li>
|
||||
{% if admin_view.can_create %}
|
||||
<li>
|
||||
<a href="{{ get_url('.create_view', url=return_url) }}" title="{{ _gettext('Create new record') }}">{{ _gettext('Create') }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if filters %}
|
||||
<li class="dropdown">
|
||||
{{ model_layout.filter_options() }}
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if actions %}
|
||||
<li class="dropdown">
|
||||
{{ actionlib.dropdown(actions) }}
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if search_supported %}
|
||||
<li>
|
||||
{{ model_layout.search_form() }}
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
{% if filters %}
|
||||
{{ model_layout.filter_form() }}
|
||||
<div class="clearfix"></div>
|
||||
{% endif %}
|
||||
|
||||
{% block model_list_table %}
|
||||
<table class="table table-striped table-bordered table-hover model-list">
|
||||
<thead>
|
||||
<tr>
|
||||
{% block list_header scoped %}
|
||||
{% if actions %}
|
||||
<th class="list-checkbox-column">
|
||||
<input type="checkbox" name="rowtoggle" class="action-rowtoggle" title="{{ _gettext('Select all records') }}" />
|
||||
</th>
|
||||
{% endif %}
|
||||
{% block list_row_actions_header %}
|
||||
<th class="col-md-1"> </th>
|
||||
{% endblock %}
|
||||
{% set column = 0 %}
|
||||
{% for c, name in list_columns %}
|
||||
<th class="column-header">
|
||||
{% if admin_view.is_sortable(c) %}
|
||||
{% if sort_column == column %}
|
||||
<a href="{{ sort_url(column, True) }}" title="{{ _gettext('Sort by %(name)s', name=name) }}">
|
||||
{{ name }}
|
||||
{% if sort_desc %}
|
||||
<span class="glyphicon glyphicon-chevron-up"></span>
|
||||
{% else %}
|
||||
<span class="glyphicon glyphicon-chevron-down"></span>
|
||||
{% endif %}
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{{ sort_url(column) }}" title="{{ _gettext('Sort by %(name)s', name=name) }}">{{ name }}</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{{ name }}
|
||||
{% endif %}
|
||||
{% if admin_view.column_descriptions.get(c) %}
|
||||
<a class="glyphicon glyphicon-question-sign"
|
||||
title="{{ admin_view.column_descriptions[c] }}"
|
||||
href="javascript:void(0)" data-role="tooltip"
|
||||
></a>
|
||||
{% endif %}
|
||||
</th>
|
||||
{% set column = column + 1 %}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
<th style="width:80px;">Statuses</th>
|
||||
<th style="width:160px;">Links</th>
|
||||
</tr>
|
||||
</thead>
|
||||
{% for row in data %}
|
||||
<tr>
|
||||
{% block list_row scoped %}
|
||||
{% if actions %}
|
||||
<td>
|
||||
<input type="checkbox" name="rowid" class="action-checkbox" value="{{ get_pk_value(row) }}" title="{{ _gettext('Select record') }}" />
|
||||
</td>
|
||||
{% endif %}
|
||||
{% block list_row_actions_column scoped %}
|
||||
<td>
|
||||
{% block list_row_actions scoped %}
|
||||
{%- if admin_view.can_edit -%}
|
||||
<a class="icon" href="{{ get_url('.edit_view', id=get_pk_value(row), url=return_url) }}" title="{{ _gettext('Edit record') }}">
|
||||
<span class="glyphicon glyphicon-pencil"></span>
|
||||
</a>
|
||||
{%- endif -%}
|
||||
{%- if admin_view.can_delete -%}
|
||||
<form class="icon" method="POST" action="{{ get_url('.delete_view', id=get_pk_value(row), url=return_url) }}">
|
||||
{% if csrf_token %}
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
|
||||
{% endif %}
|
||||
<button onclick="return confirm('{{ _gettext('Are you sure you want to delete this record?') }}');" title="Delete record">
|
||||
<span class="glyphicon glyphicon-trash"></span>
|
||||
</button>
|
||||
</form>
|
||||
{%- endif -%}
|
||||
{% endblock %}
|
||||
</td>
|
||||
{% endblock %}
|
||||
{% for c, name in list_columns %}
|
||||
<td>{{ get_value(row, c) }}</td>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
<td style="padding:0px; width:90px; height:10px;">
|
||||
<svg height="10" width="10" id='dag-{{ row.dag_id }}' style="display: block;"></svg>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for("airflow.tree", dag_id=row.dag_id, num_runs=num_runs) }}" title="Tree View">
|
||||
<span class="glyphicon glyphicon-tree-deciduous" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.graph", dag_id=row.dag_id) }}" title="Graph View">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.tries", dag_id=row.dag_id) }}" title="Task Tries">
|
||||
<span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.duration", dag_id=row.dag_id) }}" title="Tasks Duration">
|
||||
<span class="glyphicon glyphicon-stats" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.landing_times", dag_id=row.dag_id) }}" title="Landing Times">
|
||||
<span class="glyphicon glyphicon-plane" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.gantt", dag_id=row.dag_id) }}" title="Gantt View">
|
||||
<span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
|
||||
<i class="icon-align-left"></i>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.code", dag_id=row.dag_id) }}" title="Code View">
|
||||
<span class="glyphicon glyphicon-file" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for("airflow.refresh", dag_id=row.dag_id) }}" title="Refresh">
|
||||
<span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
|
||||
</a>
|
||||
<a href="{{ url_for('log.index_view') }}?sort=1&desc=1&flt1_dag_id_equals={{ row.dag_id }}" title="Logs">
|
||||
<i class="icon-list"></i>
|
||||
<span class="glyphicon glyphicon-align-justify" aria-hidden="true"></span>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="999">
|
||||
{% block empty_list_message %}
|
||||
<div class="text-center">
|
||||
{{ admin_view.get_empty_list_message() }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{{ lib.pager(page, num_pages, pager_url) }}
|
||||
{% endblock %}
|
||||
|
||||
{{ actionlib.form(actions, get_url('.action_view')) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ admin_static.url(filename='admin/js/filters.js') }}"></script>
|
||||
{{ lib.form_js() }}
|
||||
|
||||
{{ actionlib.script(_gettext('Please select at least one record.'),
|
||||
actions,
|
||||
actions_confirmation) }}
|
||||
|
||||
<script language="javascript">
|
||||
(function($) {
|
||||
$('[data-role=tooltip]').tooltip({
|
||||
html: true,
|
||||
placement: 'bottom'
|
||||
});
|
||||
{% if filter_groups %}
|
||||
var filter = new AdminFilters(
|
||||
'#filter_form', '.field-filters',
|
||||
{{ filter_groups|tojson|safe }},
|
||||
{{ active_filters|tojson|safe }}
|
||||
);
|
||||
{% endif %}
|
||||
})(jQuery);
|
||||
</script>
|
||||
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script>
|
||||
d3.selectAll("span.glyphicon-pencil").attr("class", "glyphicon glyphicon-search");
|
||||
diameter = 25;
|
||||
circle_margin = 4;
|
||||
stroke_width = 2;
|
||||
stroke_width_hover = 6;
|
||||
d3.json("{{ url_for('airflow.dag_stats') }}", function(error, json) {
|
||||
for(var dag_id in json) {
|
||||
states = json[dag_id];
|
||||
g = d3.select('svg#dag-' + dag_id)
|
||||
.attr('height', diameter + (stroke_width_hover * 2))
|
||||
.attr('width', '90px')
|
||||
.selectAll("g")
|
||||
.data(states)
|
||||
.enter()
|
||||
.append('g')
|
||||
.attr('transform', function(d, i) {
|
||||
x = (i * (diameter + circle_margin)) + (diameter/2 + circle_margin);
|
||||
y = (diameter/2) + stroke_width_hover;
|
||||
return 'translate(' + x + ',' + y + ')';
|
||||
});
|
||||
|
||||
g.append('text')
|
||||
.attr('fill', 'black')
|
||||
.attr('text-anchor', 'middle')
|
||||
.attr('vertical-align', 'middle')
|
||||
.attr('font-size', 8)
|
||||
.attr('y', 3)
|
||||
.text(function(d){ return d.count; });
|
||||
|
||||
g.append('circle')
|
||||
.attr('stroke-width', function(d) {
|
||||
if (d.count > 0)
|
||||
return stroke_width;
|
||||
else {
|
||||
return 1;
|
||||
}
|
||||
})
|
||||
.attr('stroke', function(d) {
|
||||
if (d.count > 0)
|
||||
return d.color;
|
||||
else {
|
||||
return 'grey';
|
||||
}
|
||||
})
|
||||
.attr('fill-opacity', 0)
|
||||
.attr('r', diameter/2)
|
||||
.attr('title', function(d) {return d.state})
|
||||
.attr('style', function(d) {
|
||||
if (d.count > 0)
|
||||
return"cursor:pointer;"
|
||||
})
|
||||
.on('click', function(d, i) {
|
||||
if (d.count > 0)
|
||||
window.location = "{{ url_for('taskinstance.index_view') }}?flt1_dag_id_equals=" + d.dag_id + "&flt2_state_equals=" + d.state;
|
||||
})
|
||||
.on('mouseover', function(d, i) {
|
||||
if (d.count > 0) {
|
||||
d3.select(this).transition().duration(400)
|
||||
.attr('fill-opacity', 0.3)
|
||||
.style("stroke-width", stroke_width_hover);
|
||||
}
|
||||
})
|
||||
.on('mouseout', function(d, i) {
|
||||
if (d.count > 0) {
|
||||
d3.select(this).transition().duration(400)
|
||||
.attr('fill-opacity', 0)
|
||||
.style("stroke-width", stroke_width);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$("circle").tooltip({
|
||||
html: true,
|
||||
container: "body",
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -1,46 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{{ super() }}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-6 col-md-4 col-md-offset-4">
|
||||
<h1 class="text-center login-title">Sign in to Airflow</h1>
|
||||
<div class="text-center account-wall">
|
||||
<img src="{{ url_for("static", filename="pin_100.png") }}" />
|
||||
<form class="form-signin" method="post" action="{{ url_for('airflow.login') }}">
|
||||
<input type="text" class="form-control" placeholder="Username" name="username" required autofocus>
|
||||
<input type="password" class="form-control" placeholder="Password" name="password" required>
|
||||
<button class="btn btn-lg btn-primary btn-block" type="submit">
|
||||
Sign in</button>
|
||||
<label class="checkbox pull-left">
|
||||
<input type="checkbox" value="remember-me">
|
||||
Remember me
|
||||
</label>
|
||||
<input name="_csrf_token" type="hidden" value="{{ csrf_token() }}">
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
|
@ -15,4 +15,4 @@
|
|||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends "admin/master.html" %}
|
||||
{% extends "appbuilder/baselayout.html" %}
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/model/create.html' %}
|
||||
|
||||
{% block body %}
|
||||
{% if admin_view.verbose_name %}
|
||||
<h2>
|
||||
{{ admin_view.verbose_name|title }}
|
||||
<small>[create]</small>
|
||||
</h2>
|
||||
<hr/>
|
||||
{% endif %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
|
@ -1,29 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/model/edit.html' %}
|
||||
|
||||
{% block body %}
|
||||
{% if admin_view.verbose_name %}
|
||||
<h2>
|
||||
{{ admin_view.verbose_name|title }}
|
||||
<small>[edit]</small>
|
||||
</h2>
|
||||
<hr/>
|
||||
{% endif %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
|
@ -15,12 +15,79 @@
|
|||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/model/list.html' %}
|
||||
|
||||
{% block model_menu_bar %}
|
||||
{% if admin_view.verbose_name_plural %}
|
||||
<h2>{{ admin_view.verbose_name_plural|title }}</h2>
|
||||
<hr/>
|
||||
{% endif %}
|
||||
{{ super() }}
|
||||
{% endblock %}
|
||||
{% import 'appbuilder/general/lib.html' as lib %}
|
||||
{% extends 'appbuilder/general/widgets/base_list.html' %}
|
||||
|
||||
|
||||
{% block begin_content scoped %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-hover">
|
||||
{% endblock %}
|
||||
|
||||
{% block begin_loop_header scoped %}
|
||||
<thead>
|
||||
<tr>
|
||||
{% if actions %}
|
||||
<th class="action_checkboxes">
|
||||
<input id="check_all" class="action_check_all" name="check_all" type="checkbox">
|
||||
</th>
|
||||
{% endif %}
|
||||
|
||||
{% if can_show or can_edit or can_delete %}
|
||||
<th class="col-md-1 col-lg-1 col-sm-1" ></th>
|
||||
{% endif %}
|
||||
|
||||
{% for item in include_columns %}
|
||||
{% if item in order_columns %}
|
||||
{% set res = item | get_link_order(modelview_name) %}
|
||||
{% if res == 2 %}
|
||||
<th><a href={{ item | link_order(modelview_name) }}>{{label_columns.get(item)}}
|
||||
<i class="fa fa-chevron-up pull-right"></i></a></th>
|
||||
{% elif res == 1 %}
|
||||
<th><a href={{ item | link_order(modelview_name) }}>{{label_columns.get(item)}}
|
||||
<i class="fa fa-chevron-down pull-right"></i></a></th>
|
||||
{% else %}
|
||||
<th><a href={{ item | link_order(modelview_name) }}>{{label_columns.get(item)}}
|
||||
<i class="fa fa-arrows-v pull-right"></i></a></th>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<th>{{label_columns.get(item)}}</th>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
{% endblock %}
|
||||
|
||||
{% block begin_loop_values %}
|
||||
{% for item in value_columns %}
|
||||
{% set pk = pks[loop.index-1] %}
|
||||
<tr>
|
||||
{% if actions %}
|
||||
<td>
|
||||
<input id="{{pk}}" class="action_check" name="rowid" value="{{pk}}" type="checkbox">
|
||||
</td>
|
||||
{% endif %}
|
||||
{% if can_show or can_edit or can_delete %}
|
||||
<td><center>
|
||||
{{ lib.btn_crud(can_show, can_edit, can_delete, pk, modelview_name, filters) }}
|
||||
</center></td>
|
||||
{% endif %}
|
||||
{% for value in include_columns %}
|
||||
{% set formatter = formatters_columns.get(value) %}
|
||||
{% if formatter and formatter(item) %}
|
||||
<td>{{ formatter(item) }}</td>
|
||||
{% elif item[value] != None %}
|
||||
<td>{{ item[value]|safe }}</td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
{% block end_content scoped %}
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
{% block title %}Chart{% endblock %}
|
||||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='highcharts.js') }}"></script>
|
||||
<script src="/ck/static/chartkick.js"></script>
|
||||
<div class="container">
|
||||
{% if show_chart %}
|
||||
<h2>{{ label }}</h2>
|
||||
{% if chart.chart_type == "area_chart" %}
|
||||
{% area_chart data with height=height library=chart_options%}
|
||||
{% elif chart.chart_type == "line_chart" %}
|
||||
{% line_chart data with height=height library=chart_options%}
|
||||
{% elif chart.chart_type == "bar_chart" %}
|
||||
{% bar_chart data with height=height library=chart_options%}
|
||||
{% elif chart.chart_type == "column_chart" %}
|
||||
{% column_chart data with height=height library=chart_options%}
|
||||
{% endif %}
|
||||
{% if chart.show_datatable %}
|
||||
<h4>Data</h4>
|
||||
{{ table }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% if show_sql %}
|
||||
<h4>SQL</h4>
|
||||
<pre><code>{{ sql }}</code></pre>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -19,6 +19,6 @@
|
|||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
You don't seem to have access. Please contact your administrator.
|
||||
{% endblock %}
|
||||
|
|
|
@ -1,192 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="main.css") }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="dataTables.bootstrap.css") }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="nv.d3.css") }}">
|
||||
<style>
|
||||
pre {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border: none;
|
||||
background: none;
|
||||
background-color: #FFF;
|
||||
}
|
||||
.panel-heading .accordion-toggle:after {
|
||||
/* symbol for "opening" panels */
|
||||
font-family: 'Glyphicons Halflings'; /* essential for enabling glyphicon */
|
||||
content: "\e114"; /* adjust as needed, taken from bootstrap.css */
|
||||
float: right; /* adjust as needed */
|
||||
color: grey; /* adjust as needed */
|
||||
}
|
||||
.panel-heading .accordion-toggle.collapsed:after {
|
||||
/* symbol for "collapsed" panels */
|
||||
content: "\e080"; /* adjust as needed, taken from bootstrap.css */
|
||||
}
|
||||
{% if embed %}
|
||||
/* override padding formatting for flush margins */
|
||||
.container {
|
||||
padding: 0px;
|
||||
}
|
||||
body {
|
||||
padding: 0px;
|
||||
background-color: #fff;
|
||||
}
|
||||
.navbar {
|
||||
display: none;
|
||||
}
|
||||
{% endif %}
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block title %}
|
||||
{{ title }}
|
||||
{% endblock %}
|
||||
{% block body %}
|
||||
{{ super() }}
|
||||
{% if embed %}
|
||||
<div id="chart_body">
|
||||
<img src="{{ url_for('static', filename='loading.gif') }}" width="50px">
|
||||
</div>
|
||||
{% else %}
|
||||
<div id="container">
|
||||
<h2>
|
||||
<span id="label">{{ label }}</span>
|
||||
<a href="{{ url_for('chart.edit_view') }}?id={{ chart.id }}" >
|
||||
<span class="glyphicon glyphicon-edit" aria-hidden="true" ></span>
|
||||
</a>
|
||||
</h2>
|
||||
<div id="error" style="display: none;" class="alert alert-danger" role="alert">
|
||||
<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>
|
||||
<span id="error_msg">Oops.</span>
|
||||
</div>
|
||||
{% if chart.show_sql %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading" role="tab" id="headingTwo">
|
||||
<h4 class="panel-title">
|
||||
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#sql_panel" aria-expanded="true" aria-controls="sql_panel">
|
||||
SQL
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
<div id="sql_panel" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingTwo">
|
||||
<div class="panel-body" id="sql_panel_body">
|
||||
{{ sql }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if chart.chart_type != "datatable" %}
|
||||
<div id="chart_section" class="panel panel-default">
|
||||
<div class="panel-heading" role="tab" id="headingTwo">
|
||||
<h4 class="panel-title">
|
||||
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#chart_panel" aria-expanded="true" aria-controls="chart_panel">
|
||||
Chart
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
<div id="chart_panel" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingTwo">
|
||||
<div class="panel-body">
|
||||
<div id="chart_body">
|
||||
<img src="{{ url_for('static', filename='loading.gif') }}" width="50px">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if chart.show_datatable or chart.chart_type == "datatable" %}
|
||||
<div id="datatable_section" class="panel panel-default">
|
||||
<div class="panel-heading" role="tab" id="headingTwo">
|
||||
<h4 class="panel-title">
|
||||
<a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#datatable_panel" aria-expanded="true" aria-controls="datatable_panel">
|
||||
Data
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
<div id="datatable_panel" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingTwo">
|
||||
<div class="panel-body" id="datatable_panel_body">
|
||||
<table id="datatable" class="dataframe table table-bordered table-striped no-wrap"></table>
|
||||
<img id="loading" src="{{ url_for('static', filename='loading.gif') }}" width="50px">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='jquery.dataTables.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='nv.d3.js') }}"></script>
|
||||
<script>
|
||||
function error(msg){
|
||||
$('#error_msg').html(msg);
|
||||
$('#error').show();
|
||||
$('#loading').hide();
|
||||
$('#chart_section').hide(1000);
|
||||
$('#datatable_section').hide(1000);
|
||||
}
|
||||
function warn(msg){
|
||||
$('#error_msg').html(msg);
|
||||
$('#error').show();
|
||||
}
|
||||
$( document ).ready(function() {
|
||||
colors: [
|
||||
"#FF5A5F", "#007A87", "#7B0051", "#00D1C1", "#8CE071", "#FFB400",
|
||||
"#FFAA91", "#B4A76C", "#9CA299", "#565A5C"
|
||||
];
|
||||
url = "{{ url_for('airflow.chart_data') }}" + location.search;
|
||||
$.getJSON(url, function(payload) {
|
||||
$('#loading').hide();
|
||||
if (payload.error !== undefined) {
|
||||
$('#chart_body').html('<div class="alert alert-danger">' + payload.error + '</div>');
|
||||
}
|
||||
$("#sql_panel_body").html(payload.sql_html);
|
||||
$("#label").html(payload.label);
|
||||
if (payload.state == "SUCCESS") {
|
||||
{% if chart.chart_type != "datatable" %}
|
||||
$('#chart_body').css('width', '100%');
|
||||
console.log(payload);
|
||||
$('#chart_body').html(payload.htmlcontent);
|
||||
{% endif %}
|
||||
{% if chart.show_datatable or chart.chart_type == "datatable" %}
|
||||
$('#datatable').dataTable( {
|
||||
"data": payload.data.data,
|
||||
"columns": payload.data.columns,
|
||||
"scrollX": true,
|
||||
"iDisplayLength": 100,
|
||||
});
|
||||
{% endif %}
|
||||
}
|
||||
else {
|
||||
error(payload.error);
|
||||
}
|
||||
if ('warning' in payload)
|
||||
warn(payload.warning);
|
||||
}).fail(function(jqxhr, textStatus, err) {
|
||||
error( textStatus + ': ' + err );
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
|
@ -1,99 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
|
||||
<title>{{ chart.label }}</title>
|
||||
<link rel="stylesheet" type="text/css" href="/static/para/parallel.css" />
|
||||
</head>
|
||||
<body class="dark">
|
||||
<div id="header">
|
||||
<h1>{{ chart.label }}</h1>
|
||||
<button title="Zoom in on selected data" id="keep-data" disabled="disabled">Keep</button>
|
||||
<button title="Remove selected data" id="exclude-data" disabled="disabled">Exclude</button>
|
||||
<button title="Export data as CSV" id="export-data">Export</button>
|
||||
Color based on: <select id="fields"></select>
|
||||
<div class="controls">
|
||||
<strong id="selected-count"></strong><!--<strong id="data-count"></strong>-->
|
||||
<div class="fillbar"><div id="selected-bar"><div id="rendered-bar"> </div></div></div>
|
||||
Lines at <strong id="opacity"></strong> opacity.
|
||||
<span class="settings">
|
||||
<button id="hide-ticks">Hide Ticks</button>
|
||||
<button id="show-ticks" disabled="disabled">Show Ticks</button>
|
||||
<button id="dark-theme" disabled="disabled">Dark</button>
|
||||
<button id="light-theme">Light</button>
|
||||
</span>
|
||||
</div>
|
||||
<div style="clear:both;"></div>
|
||||
</div>
|
||||
<div id="chart">
|
||||
<canvas id="background"></canvas>
|
||||
<canvas id="foreground"></canvas>
|
||||
<canvas id="highlight"></canvas>
|
||||
<svg></svg>
|
||||
</div>
|
||||
<div id="wrap">
|
||||
<div class="third" id="controls">
|
||||
|
||||
<div class="little-box">
|
||||
<h3>Controls</h3>
|
||||
<p>
|
||||
<strong>Brush</strong>: Drag vertically along an axis.<br/>
|
||||
<strong>Remove Brush</strong>: Tap the axis background.<br/>
|
||||
<strong>Reorder Axes</strong>: Drag a label horizontally.<br/>
|
||||
<strong>Invert Axis</strong>: Tap an axis label.<br/>
|
||||
<strong>Remove Axis</strong>: Drag axis label to the left edge.<br/>
|
||||
</p>
|
||||
</div>
|
||||
<div class="little-box">
|
||||
<h3>Credits & License</h3>
|
||||
<p>
|
||||
<a href="https://github.com/gameclosure/webgl-2d">Webgl-2d</a>
|
||||
</p>
|
||||
<p>
|
||||
Adapted from examples by<br/>
|
||||
<a href="http://bl.ocks.org/1341021">Mike Bostock</a> and <a href="http://bl.ocks.org/1341281">Jason Davies</a><br/>
|
||||
</p>
|
||||
<p>
|
||||
Copyright © 2012, Kai Chang<br/>
|
||||
All rights reserved. Released under the <a href="http://opensource.org/licenses/bsd-3-clause">BSD License</a>.
|
||||
</p>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="third">
|
||||
<small>
|
||||
<!--Last rendered <strong id="render-speed"></strong> lines-->
|
||||
</small>
|
||||
<h3>Categories</h3>
|
||||
<p id="legend">
|
||||
</p>
|
||||
</div>
|
||||
<div class="third">
|
||||
<h3>Sample of 25 entries <input type="text" id="search" placeholder="Search..."></input></h3>
|
||||
<p id="food-list">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
<script src="/static/d3.v3.min.js"></script>
|
||||
<script src="/static/underscore.js"></script>
|
||||
<script src="/static/para/webgl-2d.js"></script>
|
||||
<script src="/static/para/parallel.js"></script>
|
||||
</html>
|
|
@ -1,86 +0,0 @@
|
|||
{#
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright ownership.
|
||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
(the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
|
||||
{% block title %}{{ title }}{% endblock %}
|
||||
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="main.css") }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for("static", filename="dataTables.bootstrap.css") }}">
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
<h2>Ad Hoc Query</h2>
|
||||
<form method="post" id="query_form">
|
||||
<div class="form-inline">
|
||||
<input name="_csrf_token" type="hidden" value="{{ csrf_token() }}">
|
||||
{{ form.conn_id }}
|
||||
<input type="submit" class="btn btn-default" value="Run!" id="submit_without_csv">
|
||||
<input type="submit" class="btn btn-default" value=".csv" id="submit_with_csv">
|
||||
<span id="results"></span><br>
|
||||
<div id='ace_container'>
|
||||
{{ form.sql(rows=10) }}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{{ results|safe }}
|
||||
{% endblock %}
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='ace.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='mode-sql.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='jquery.dataTables.min.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='theme-crimson_editor.js') }}"></script>
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
var editor = ace.edit("sql");
|
||||
var textarea = $('textarea[name="sql"]').hide();
|
||||
function sync() {
|
||||
textarea.val(editor.getSession().getValue());
|
||||
}
|
||||
editor.setTheme("ace/theme/crimson_editor");
|
||||
editor.setOptions({
|
||||
minLines: 3,
|
||||
maxLines: Infinity,
|
||||
});
|
||||
editor.getSession().setMode("ace/mode/sql");
|
||||
editor.getSession().on('change', sync);
|
||||
editor.focus();
|
||||
$('table.dataframe').dataTable({
|
||||
"scrollX": true,
|
||||
"iDisplayLength": 100,
|
||||
"aaSorting": [],
|
||||
});
|
||||
$('select').addClass("form-control");
|
||||
sync();
|
||||
$("#submit_without_csv").submit(function(event){
|
||||
$("#results").html("<img width='25'src='{{ url_for('static', filename='loading.gif') }}'>");
|
||||
});
|
||||
$("#submit_with_csv").click(function(){
|
||||
$("#csv_value").remove();
|
||||
$("#query_form").append('<input name="csv" type="hidden" value="true" id="csv_value">');
|
||||
});
|
||||
$("#submit_without_csv").click(function(){
|
||||
$("#csv_value").remove();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
|
@ -18,7 +18,7 @@
|
|||
{% extends "airflow/task_instance.html" %}
|
||||
{% block title %}Airflow - DAGs{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h4>{{ title }}</h4>
|
||||
<div>
|
||||
|
|
|
@ -22,10 +22,11 @@
|
|||
|
||||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css') }}" rel="stylesheet">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.css')}}" >
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h4>
|
||||
<form method="get" id="daform">
|
||||
|
@ -42,16 +43,16 @@
|
|||
</form>
|
||||
</h4>
|
||||
<ul class="nav nav-pills">
|
||||
<li><a href="{{ url_for("airflow.task", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<li><a href="{{ url_for("Airflow.task", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
Task Instance Details</a></li>
|
||||
<li><a href="{{ url_for("airflow.rendered", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<li><a href="{{ url_for("Airflow.rendered", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
Rendered Template</a></li>
|
||||
<li><a href="{{ url_for("airflow.log", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<li><a href="{{ url_for("Airflow.log", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
Log</a></li>
|
||||
<li><a href="{{ url_for("airflow.xcom", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<li><a href="{{ url_for("Airflow.xcom", dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}">
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
XCom</a></li>
|
||||
</ul>
|
||||
|
@ -59,8 +60,7 @@
|
|||
{% endblock %}
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker.js') }}"></script>
|
||||
<script src="{{ admin_static.url(filename='admin/js/form-1.0.0.js') }}"></script>
|
||||
<script src="{{ url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.js')}}"></script>
|
||||
<script>
|
||||
$( document ).ready(function() {
|
||||
function date_change(){
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
{% extends "airflow/task_instance.html" %}
|
||||
{% block title %}Airflow - DAGs{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h4>{{ title }}</h4>
|
||||
{% for k, v in html_dict.items() %}
|
||||
|
|
|
@ -18,7 +18,7 @@ limitations under the License.
|
|||
{% extends "airflow/task_instance.html" %}
|
||||
{% block title %}Airflow - DAGs{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h4>{{ title }}</h4>
|
||||
<ul class="nav nav-pills" role="tablist">
|
||||
|
@ -77,7 +77,7 @@ limitations under the License.
|
|||
|
||||
return Promise.resolve(
|
||||
$.ajax({
|
||||
url: "{{ url_for("airflow.get_logs_with_metadata") }}",
|
||||
url: "{{ url_for("Airflow.get_logs_with_metadata") }}",
|
||||
data: {
|
||||
dag_id: "{{ dag_id }}",
|
||||
task_id: "{{ task_id }}",
|
||||
|
|
|
@ -21,11 +21,12 @@
|
|||
{% block head_css %}
|
||||
{{ super() }}
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ url_for('static', filename='tree.css') }}">
|
||||
<link href="{{ admin_static.url(filename='vendor/bootstrap-daterangepicker/daterangepicker-bs2.css') }}" rel="stylesheet">
|
||||
href="{{ url_for('static', filename='css/tree.css') }}">
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{url_for('appbuilder.static',filename='datepicker/bootstrap-datepicker.css')}}" >
|
||||
{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<div style="float: left" class="form-inline">
|
||||
<form method="get" style="float:left;">
|
||||
|
@ -78,7 +79,7 @@
|
|||
|
||||
{% block tail %}
|
||||
{{ super() }}
|
||||
<script src="{{ url_for('static', filename='d3.v3.min.js') }}"></script>
|
||||
<script src="{{ url_for_asset('d3.min.js') }}"></script>
|
||||
<script>
|
||||
$('span.status_square').tooltip({html: true});
|
||||
|
||||
|
|
|
@ -15,13 +15,10 @@
|
|||
limitations under the License.
|
||||
|
||||
#}
|
||||
{% extends 'admin/model/list.html' %}
|
||||
{% extends 'appbuilder/general/model/list.html' %}
|
||||
|
||||
{% block model_menu_bar %}
|
||||
{% if admin_view.verbose_name_plural %}
|
||||
<h2>{{ admin_view.verbose_name_plural|title }}</h2>
|
||||
{% endif %}
|
||||
<form class="form-inline" action="{{ url_for("airflow.varimport") }}" method=post enctype=multipart/form-data style="margin-top: 50px;">
|
||||
{% block content %}
|
||||
<form class="form-inline" action="{{ url_for('VariableModelView.varimport') }}" method=post enctype=multipart/form-data style="margin-top: 50px;">
|
||||
{% if csrf_token %}
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
|
||||
{% endif %}
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
|
||||
# Variable Editor
|
||||
|
||||
This folder contains forms used to edit values in the "Variable" key-value
|
||||
store. This data can be edited under the "Admin" admin tab, but sometimes
|
||||
it is preferable to use a form that can perform checking and provide a nicer
|
||||
interface.
|
||||
|
||||
## Adding a new form
|
||||
|
||||
1. Create an html template in `templates/variables` folder
|
||||
1. Provide an interface for the user to provide input data
|
||||
1. Submit a post request that adds the data as json.
|
||||
|
||||
An example ajax POST request is provided below:
|
||||
|
||||
```js
|
||||
$("#submit-btn").click(function() {
|
||||
form_data = getData()
|
||||
if (isValid(form_data)) {
|
||||
$.ajax({
|
||||
method: "POST",
|
||||
url: "backfill",
|
||||
data: JSON.stringify(form_data),
|
||||
dataType: "json",
|
||||
contentType: "application/json",
|
||||
success: function(response_data) {
|
||||
console.log("success.")
|
||||
},
|
||||
failure: function(response_data) {
|
||||
console.log("post error.")
|
||||
}
|
||||
})
|
||||
}
|
||||
else {
|
||||
console.log("input error.")
|
||||
}
|
||||
});
|
||||
```
|
|
@ -20,7 +20,7 @@
|
|||
#}
|
||||
{% extends "airflow/master.html" %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h2>{{ title }}</h2>
|
||||
{% set version_label = 'Version' %}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
{% extends "airflow/task_instance.html" %}
|
||||
{% block title %}Airflow - DAGs{% endblock %}
|
||||
|
||||
{% block body %}
|
||||
{% block content %}
|
||||
{{ super() }}
|
||||
<h4>{{ title }}</h4>
|
||||
<div>
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче