From cef22af5d6afd3ad0c13e1dfad90b2e18206657c Mon Sep 17 00:00:00 2001 From: Ilya Shakhat Date: Fri, 12 Jul 2013 12:43:30 +0400 Subject: [PATCH] Implementation of blueprint stackalytics-core This change incorporates the following: * Config for most of OS projects * Configure filtering of robots commits * Clean-up dashboard module * Layout is clean-up * Remove unused styles and scripts * Factories replaced by factory methods Change-Id: I1a719b356a5e3275d14bbceae198a1d0cb6dbbbd --- README.rst | 18 +- dashboard/memory_storage.py | 33 +- dashboard/old_dashboard.py | 987 -------------- .../css/jquery.dataTables_themeroller.css | 244 ---- dashboard/static/css/style.css | 29 +- .../ui-darkness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_30_cccccc_40x100.png | Bin 220 -> 0 bytes .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 230 -> 0 bytes .../images/ui-bg_glass_20_555555_1x400.png | Bin 260 -> 0 bytes .../images/ui-bg_glass_40_0078a3_1x400.png | Bin 342 -> 0 bytes .../images/ui-bg_glass_40_ffc73d_1x400.png | Bin 316 -> 0 bytes .../ui-bg_gloss-wave_25_333333_500x100.png | Bin 3816 -> 0 bytes .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin 276 -> 0 bytes .../ui-bg_inset-soft_25_000000_1x100.png | Bin 275 -> 0 bytes .../ui-bg_inset-soft_30_f58400_1x100.png | Bin 340 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_4b8e0b_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_a83300_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_cccccc_256x240.png | Bin 13950 -> 0 bytes .../images/ui-icons_ffffff_256x240.png | Bin 12598 -> 0 bytes .../ui-darkness/jquery-ui-1.10.1.custom.css | 1175 ----------------- .../jquery-ui-1.10.1.custom.min.css | 5 - dashboard/templates/base.html | 170 +-- dashboard/templates/layout.html | 34 +- dashboard/templates/unmapped.html | 3 - dashboard/web.py | 100 +- etc/dashboard.conf | 5 - etc/default_data.json | 595 ++++++++- scripts/gerrit/parse-reviews.py | 110 -- scripts/grab-all-emails.sh | 11 - scripts/grab-buglist.sh | 6 - scripts/grab-launchpad-ids.sh | 4 - scripts/grab-mailmap.sh | 8 - scripts/grab-unmatched.sh | 35 - scripts/launchpad/buglist.py | 27 - .../launchpad/grab-unmapped-launchpad-ids.py | 35 - scripts/launchpad/map-email-to-lp-name.py | 26 - scripts/pull-repos.sh | 18 - setup.cfg | 1 + stackalytics/processor/commit_processor.py | 5 + stackalytics/processor/main.py | 32 +- stackalytics/processor/persistent_storage.py | 20 +- stackalytics/processor/runtime_storage.py | 15 +- stackalytics/processor/vcs.py | 19 +- tox.ini | 2 +- 45 files changed, 751 insertions(+), 3021 deletions(-) delete mode 100644 dashboard/old_dashboard.py delete mode 100644 dashboard/static/css/jquery.dataTables_themeroller.css delete mode 100644 dashboard/static/css/ui-darkness/images/animated-overlay.gif delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-icons_222222_256x240.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-icons_a83300_256x240.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-icons_cccccc_256x240.png delete mode 100644 dashboard/static/css/ui-darkness/images/ui-icons_ffffff_256x240.png delete mode 100644 dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.css delete mode 100644 dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.min.css delete mode 100644 dashboard/templates/unmapped.html delete mode 100644 scripts/gerrit/parse-reviews.py delete mode 100755 scripts/grab-all-emails.sh delete mode 100755 scripts/grab-buglist.sh delete mode 100755 scripts/grab-launchpad-ids.sh delete mode 100755 scripts/grab-mailmap.sh delete mode 100755 scripts/grab-unmatched.sh delete mode 100644 scripts/launchpad/buglist.py delete mode 100644 scripts/launchpad/grab-unmapped-launchpad-ids.py delete mode 100644 scripts/launchpad/map-email-to-lp-name.py delete mode 100755 scripts/pull-repos.sh diff --git a/README.rst b/README.rst index 0deb3e489..b617401fd 100644 --- a/README.rst +++ b/README.rst @@ -1,9 +1,10 @@ -Stackalytics - OpenStack analytics dashboard -============================================ +Stackalytics +============ Application Features -------------------- -OpenStack Stats is a service that automatically analyzes OpenStack git repos and displays statistics on contribution. The features are: +Stackalytics is a service that automatically analyzes OpenStack +development activities and displays statistics on contribution. The features are: * Extraction of author information from git log, store it in the database; * Calculate metrics on number of lines changed (LOC) and commits; * Mapping authors to companies and launchpad ids; @@ -11,5 +12,14 @@ OpenStack Stats is a service that automatically analyzes OpenStack git repos and * Extract blueprint and bug ids from commit messages; * Auto-update of database. - +Project Info +------------- + * Web-site: http://stackalytics.com/ + * Source Code: http://github.com/stackforge/stackalytics + * Wiki: https://wiki.openstack.org/wiki/Stackalytics + * Launchpad: https://launchpad.net/stackalytics + * Blueprints: https://blueprints.launchpad.net/stackalytics + * Bugs: https://bugs.launchpad.net/stackalytics + * Code Reviews: https://review.openstack.org/#q,status:open+stackalytics,n,z + * IRC: #openstack-stackalytics at freenode diff --git a/dashboard/memory_storage.py b/dashboard/memory_storage.py index 6da2ef56e..40badf001 100644 --- a/dashboard/memory_storage.py +++ b/dashboard/memory_storage.py @@ -1,3 +1,18 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed 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. + from stackalytics.processor import user_utils MEMORY_STORAGE_CACHED = 0 @@ -20,9 +35,8 @@ class CachedMemoryStorage(MemoryStorage): self.release_index = {} self.dates = [] for record in records: - if record['company_name'] != '*robots': # ignore robots - self.records[record['record_id']] = record - self.index(record) + self.records[record['record_id']] = record + self.index(record) self.dates = sorted(self.date_index) self.company_name_mapping = dict((c.lower(), c) for c in self.company_index.keys()) @@ -91,11 +105,8 @@ class CachedMemoryStorage(MemoryStorage): return self.launchpad_id_index.keys() -class MemoryStorageFactory(object): - - @staticmethod - def get_storage(memory_storage_type, records): - if memory_storage_type == MEMORY_STORAGE_CACHED: - return CachedMemoryStorage(records) - else: - raise Exception('Unknown memory storage type') +def get_memory_storage(memory_storage_type, records): + if memory_storage_type == MEMORY_STORAGE_CACHED: + return CachedMemoryStorage(records) + else: + raise Exception('Unknown memory storage type %s' % memory_storage_type) diff --git a/dashboard/old_dashboard.py b/dashboard/old_dashboard.py deleted file mode 100644 index 1ca1d080e..000000000 --- a/dashboard/old_dashboard.py +++ /dev/null @@ -1,987 +0,0 @@ -# Copyright (C) 2013 Mirantis Inc -# -# Author: Ilya Shakhat - -import cgi - -import datetime as DT -import functools -import itertools -import json -import re -import sqlite3 -import time -import urllib - -import flask -from flask.ext import gravatar as gravatar_ext -from werkzeug.contrib import cache as cache_package - -DATABASE = 'stackalytics.sqlite' -LAST_UPDATE = None -DEBUG = False -CACHE_ENABLED = False -CACHE_EXPIRATION = 5 * 60 -CACHE_TYPE = 'simple' - -# create our little application :) -app = flask.Flask(__name__) -app.config.from_object(__name__) -app.config.from_envvar('DASHBOARD_CONF', silent=True) - -if app.config['CACHE_TYPE'] == 'memcached': - cache = cache_package.MemcachedCache(['127.0.0.1:11211']) -else: - cache = cache_package.SimpleCache() - - -# DB COMMON FUNCS ************************************************************ - - -def get_db(): - """Opens a new database connection if there is none yet for the - current application context. - """ - top = flask._app_ctx_stack.top - if not hasattr(top, 'sqlite_db'): - top.sqlite_db = sqlite3.dbapi2.connect(app.config['DATABASE']) - top.sqlite_db.row_factory = sqlite3.dbapi2.Row - return top.sqlite_db - - -@app.teardown_appcontext -def close_database(exception): - """Closes the database again at the end of the request.""" - top = flask._app_ctx_stack.top - if hasattr(top, 'sqlite_db'): - top.sqlite_db.close() - - -def query_db(query, args=(), one=False): - """Queries the database and returns a list of dictionaries.""" - app.logger.debug(query) - cur = get_db().execute(query, args) - rv = cur.fetchall() - return (rv[0] if rv else None) if one else rv - - -# DECORATORS ***************************************************************** - -def cached(timeout=app.config['CACHE_EXPIRATION'], key='view/%s', params=None): - def decorator(f): - @functools.wraps(f) - def decorated_function(*args, **kwargs): - if app.config['CACHE_ENABLED']: - cache_key = key % flask.request.path - if params: - cache_key += '/' + '/'.join( - [param + '=' + (flask.request.args.get(param) or '') - for param in params] - ) - cache_key = cache_key.replace(' ', '+') - app.logger.debug('Cache key %s' % cache_key) - rv = cache.get(cache_key) - app.logger.debug('Got value from the cache \n%s' % rv) - if rv is not None: - return rv - rv = f(*args, **kwargs) - cache.set(cache_key, rv, timeout=timeout) - app.logger.debug('Set the cache \n%s' % rv) - return rv - else: - return f(*args, **kwargs) - return decorated_function - return decorator - - -def templated(template=None): - def decorator(f): - @functools.wraps(f) - def decorated_function(*args, **kwargs): - template_name = template - if template_name is None: - template_name = (flask.request.endpoint.replace('.', '/') + - '.html') - ctx = f(*args, **kwargs) - if ctx is None: - ctx = {} - elif not isinstance(ctx, dict): - return ctx - - # put parameters into template - metric = flask.request.args.get('metric') - if metric not in METRIC_LABELS: - metric = None - ctx['metric'] = metric or DEFAULT_METRIC - - period = flask.request.args.get('period') - if period not in PERIOD_LABELS: - period = None - ctx['period'] = period or DEFAULT_PERIOD - ctx['metric_label'] = METRIC_LABELS[ctx['metric']] - ctx['period_label'] = PERIOD_LABELS[ctx['period']] - - project_type = flask.request.args.get('project_type') - if project_type not in PROJECT_TYPES: - project_type = None - ctx['project_type'] = project_type or DEFAULT_PROJECT_TYPE - - ctx['last_update'] = app.config['LAST_UPDATE'] - - return flask.render_template(template_name, **ctx) - return decorated_function - return decorator - - -def verified(): - def decorator(f): - @functools.wraps(f) - def decorated_function(*args, **kwargs): - if 'project_type' in kwargs: - if kwargs['project_type'] not in ['CORE', 'INCUBATION', 'ALL']: - flask.abort(404) - if 'module' in kwargs: - res = query_db('select 1 from repositories where name = ?', - [kwargs['module'] + '.git']) - if not res: - flask.abort(404) - if 'company' in kwargs: - company = urllib.unquote_plus(kwargs['company']).lower() - res = query_db('select companies.name from people ' - 'join companies ' - 'on people.company_id = companies.id ' - 'where lower(companies.name) = ?', - [company]) - if not res: - flask.abort(404) - kwargs['company'] = res[0][0] - if 'engineer' in kwargs: - res = query_db('select 1 from people where launchpad_id = ?', - [kwargs['engineer']]) - if not res: - flask.abort(404) - return f(*args, **kwargs) - return decorated_function - return decorator - - -# UTIL FUNCS ***************************************************************** - -def clear_text(s): - a = cgi.escape('\n'.join([a.strip() for a in s.split('\n') if a.strip()])) - first, nl, remain = a.partition('\n') - return '' + first + '' + nl + nl + remain - - -def link_blueprint(s, module): - return re.sub(r'(blueprint\s+)([\w-]+)', - r'\1\2', - s) - - -def link_bug(s): - return re.sub(r'([B|b]ug\s+)#?([\d]{5,7})', - r'\1\2', - s) - - -def link_change_id(s): - return re.sub(r'(I[0-9a-f]{40})', - r'\1', - s) - - -def filter_over_limit(data, limit): - if 1 < limit < len(data): - s = 0 - for rec in data[limit - 1:]: - s += rec['rank'] - data[limit - 1] = data[0].copy() - data[limit - 1]['name'] = 'others' - data[limit - 1]['rank'] = s - data = data[:limit] - return data - - -def paste_links(data, base_uri, metric, period, project_type): - for one in data: - if one['name']: - one['link'] = ('' + (one['name']) + '') - else: - one['link'] = 'Unmapped' - return data - - -def index_column(data): - n = 1 - for one in data: - if one['name'] is None or one['name'][0] == '*': - one['index'] = '' - else: - one['index'] = n - n += 1 - return data - -DEFAULT_METRIC = 'loc' -DEFAULT_PERIOD = 'havana' -DEFAULT_PROJECT_TYPE = 'incubation' - -PERIODS = { - 'all': (DT.date(2010, 05, 1), DT.date(2013, 10, 1)), - 'essex': (DT.date(2011, 10, 1), DT.date(2012, 04, 1)), - 'folsom': (DT.date(2012, 04, 1), DT.date(2012, 10, 1)), - 'grizzly': (DT.date(2012, 10, 1), DT.date(2013, 04, 1)), - 'havana': (DT.date(2013, 04, 1), DT.date(2013, 10, 1)), -} - -INDEPENDENT = '*independent' - -METRIC_LABELS = { - 'loc': 'Lines of code', - 'commits': 'Commits', -} - -PERIOD_LABELS = { - 'all': 'All times', - 'six_months': 'Last 6 months', - 'essex': 'Essex', - 'folsom': 'Folsom', - 'grizzly': 'Grizzly', - 'havana': 'Havana', -} - -PROJECT_TYPES = { - 'core': ['core'], - 'incubation': ['core', 'incubation'], - 'all': ['core', 'incubation', 'dev'], -} - -ISSUE_TYPES = ['bug', 'blueprint'] - - -def extract_time_period(period): - begin = DT.date(2010, 2, 1) - end = DT.datetime.now().date() - - if not period or period == 'six_months': - begin = end - DT.timedelta(days=182) - elif period == 'all': - begin = PERIODS[period][0] - elif period in PERIODS: - begin, end = PERIODS[period] - - return begin, end - - -def parse_time_period(period): - begin, end = extract_time_period(period) - return DT.date.isoformat(begin), DT.date.isoformat(end) - - -def parse_date_from_string_to_timestamp(datestring): - d = DT.datetime.strptime(datestring, "%Y-%m-%d %H:%M:%S") - return time.mktime(d.timetuple()) - - -def get_period_filter(period): - return ''' - and scmlog.date > ? and scmlog.date <= ? - ''' - - -def get_metric_filter(metric): - if metric == 'loc': - metric_filter = 'sum(commits_lines.added) + sum(commits_lines.removed)' - else: - metric_filter = 'count(*)' - return metric_filter - - -def get_project_type_filter(project_type): - if not project_type: - project_type = DEFAULT_PROJECT_TYPE - types = PROJECT_TYPES[project_type] - fts = ["repositories.project_type = '%s'" % t for t in types] - return 'and (' + ' or '.join(fts) + ')' - - -def extract_params(): - module = flask.request.args.get('module') - limit = int(flask.request.args.get('limit') or 0) - period = flask.request.args.get('period') or DEFAULT_PERIOD - metric = flask.request.args.get('metric') or DEFAULT_METRIC - project_type = (flask.request.args.get('project_type') - or DEFAULT_PROJECT_TYPE) - return module, limit, period, metric, project_type - - -def row2dict(a): - r = {} - for key in a.keys(): - r.update({key: a[key]}) - return r - - -# UI HANDLERS **************************************************************** -# these handle page rendering - -@app.route('/') -@templated('companies.html') -def overview(): - return {} - - -@app.errorhandler(404) -def page_not_found(e): - return flask.render_template('404.html'), 404 - - -@app.route('/companies') -@app.route('/companies/') -@app.route('/modules') -@app.route('/modules/') -def redirects(): - return flask.redirect(flask.url_for('overview')) - - -@app.route('/companies/') -@templated() -@cached(params=['period', 'project_type']) -@verified() -def company_details(company): - details = contribution_details(flask.request.args.get('period'), - flask.request.args.get('project_type'), - company=company) - details.update({ - 'company': company, - }) - return details - - -@app.route('/engineers/') -@templated() -def engineers(): - return {} - - -@app.route('/modules/') -@templated() -@cached() -@verified() -def module_details(module): - commits_res = query_db(''' -select scmlog.date, scmlog.message, people.launchpad_id, people.name, - people.email, companies.name as company from scmlog - join people on scmlog.author_id = people.id - join companies on people.company_id = companies.id -where - people.launchpad_id not null - and scmlog.id in ( - select actions.commit_id from actions - join branches on branches.id = actions.branch_id - where branches.name = 'master' - ) - and scmlog.repository_id in ( - select repositories.id from repositories - where repositories.name = ? - ) -order by scmlog.date desc -limit 50 - ''', [module + '.git']) - - commits = [] - for record in commits_res: - message = record['message'] - - m = re.search(r'bug\s+(\d{5,7})', message) - if m: - ref = ('Bug: ' + m.group(1) + '') - else: - m = re.search(r'blueprint\s+([\w-]+)', message) - if m: - ref = ('Blueprint: ' - '' + - m.group(1) + '') - else: - ref = None - - m = re.search(r'(I[0-9a-f]{40})', message) - if m: - change_id = m.group(1) - else: - change_id = None - - company = record['company'] - if company == INDEPENDENT: - company = None - - text = message.split('\n')[0].strip() - - commits.append( - {'date': parse_date_from_string_to_timestamp(record['date']), - 'ref': ref, 'text': text, - 'change_id': change_id, - 'launchpad_id': record['launchpad_id'], - 'name': record['name'], 'email': record['email'], - 'company': company}) - - return {'module': module, 'commits': commits} - - -def contribution_details(period, project_type, engineer=None, company=None): - if engineer: - people_filter = 'people.launchpad_id' - people_param = engineer - elif company: - people_filter = 'companies.name' - people_param = company - else: - return None - - time_period = parse_time_period(period) - - commits_res = query_db(''' -select scmlog.message, scmlog.date, repositories.name as repo, - details.change_id, details.issue_type, details.issue_id, - details.commit_type, commits_lines.added, commits_lines.removed - from scmlog - join repositories on scmlog.repository_id = repositories.id - join details on scmlog.id = details.commit_id - join commits_lines on commits_lines.commit_id = scmlog.id -where - scmlog.author_id in ( - select people.id from people - join companies on people.company_id = companies.id - where ''' + people_filter + ''' = ? - ) - and scmlog.id in ( - select actions.commit_id from actions - join branches on branches.id = actions.branch_id - where branches.name = 'master' - ) - ''' + get_period_filter(period) + - get_project_type_filter(project_type) + ''' -order by scmlog.date desc - ''', [people_param, time_period[0], time_period[1]]) - - blueprints = set() - bugs = set() - commits = [] - code_only_commits = 0 - test_only_commits = 0 - code_and_test_commits = 0 - loc = 0 - - for c in commits_res: - module = c['repo'].rpartition('.')[0] - issue_type = c['issue_type'] - issue_id = c['issue_id'] - commit_type = c['commit_type'] - loc += c['added'] + c['removed'] - - is_code = commit_type & 0x1 - if commit_type == 1: - code_only_commits += 1 - is_test = commit_type & 0x2 - if commit_type == 2: - test_only_commits += 1 - if commit_type == 3: - code_and_test_commits += 1 - - if issue_type == 'blueprint': - blueprints.add((issue_id, module)) - elif issue_type == 'bug': - bugs.add((issue_id, is_code, is_test)) - - commits.append({ - 'message': link_change_id(link_bug(link_blueprint( - clear_text(c['message']), module))), - 'date': parse_date_from_string_to_timestamp(c['date']), - 'module': module, - 'is_code': is_code, - 'is_test': is_test, - 'added_loc': c['added'], - 'removed_loc': c['removed'], - }) - - return { - 'commits': commits, - 'blueprints': sorted(blueprints), - 'bugs': sorted(bugs, key=lambda rec: rec[0]), - 'code_only_commits': code_only_commits, - 'test_only_commits': test_only_commits, - 'code_and_test_commits': code_and_test_commits, - 'code_commits': (code_only_commits + test_only_commits + - code_and_test_commits), - 'non_code_commits': (len(commits) - code_only_commits - - test_only_commits - code_and_test_commits), - 'loc': loc, - } - - -@app.route('/engineers/') -@templated() -@cached(params=['period', 'project_type']) -@verified() -def engineer_details(engineer): - details_res = query_db(''' - select people.name, companies.name as company, - launchpad_id, email from people - join companies on people.company_id = companies.id - where people.launchpad_id = ? and end_date is null - ''', [engineer]) - - if not details_res: - flask.abort(404) - - details = row2dict(details_res[0]) - - commits = contribution_details(flask.request.args.get('period'), - flask.request.args.get('project_type'), - engineer=engineer) - commits.update({ - 'engineer': engineer, - 'details': details, - }) - - return commits - - -@app.route('/commits/') -@app.route('/commits/') -@templated() -@cached(params=['module', 'period', 'project_type']) -@verified() -def commits(issue_type=None): - if issue_type is not None and issue_type not in ISSUE_TYPES: - flask.abort(404) - - module, limit, period, metric, project_type = extract_params() - time_period = parse_time_period(period) - - res = query_db(''' -select scmlog.date, scmlog.message, repositories.name as repo, - details.issue_id, details.issue_type, details.change_id, - people.launchpad_id, people.name as author, companies.name as company, - people.email - from scmlog -join people on people.id = scmlog.author_id -join companies on people.company_id = companies.id -join repositories on repositories.id = scmlog.repository_id -join details on details.commit_id = scmlog.id -where - 1 = 1 -''' + get_period_filter(period) + get_project_type_filter(project_type) + ''' -order by scmlog.date desc -limit 2000 - ''', [time_period[0], time_period[1]]) - - issues = {} - for rec in res: - #todo make it right (e.g. paging) - if len(issues) > 200: - break - - if issue_type is not None and issue_type != rec['issue_type']: - continue - - module = rec['repo'].rpartition('.')[0] - timestamp = parse_date_from_string_to_timestamp(rec['date']) - item = { - 'message': link_change_id(link_bug(link_blueprint( - clear_text(rec['message']), module))), - 'date': timestamp, - 'change_id': rec['change_id'], - 'author': rec['author'], - 'company': rec['company'], - 'launchpad_id': rec['launchpad_id'], - 'email': rec['email'], - 'module': module, - } - - if issue_type is None: - key = DT.datetime.utcfromtimestamp(timestamp).strftime('%d %b %Y') - else: - key = rec['issue_id'] - - if key in issues: - issues[key].append(item) - else: - issues[key] = [item] - - return {'issue_type': issue_type, - 'issues': sorted( - [{'issue_id': key, 'items': value} for key, value in - issues.iteritems()], key=lambda rec: rec['items'][0]['date'], - reverse=True)} - - -@app.route('/unmapped') -@templated() -def unmapped(): - res = query_db(''' - select name, email from people - where launchpad_id is null - ''') - - if not res: - flask.abort(404) - - res = [{'name': a['name'], 'email': a['email']} for a in res - if (re.match(r'[\w\d._-]+@[\w\d_.-]+$', a['email']) and - a['name'] and a['name'] != 'root')] - - return {'details': res} - - -# AJAX HANDLERS ************************************************************** -# these handle data retrieval for tables and charts - - -@app.route('/data/companies') -@cached(params=['limit', 'module', 'period', 'metric', 'project_type']) -def get_companies(): - module, limit, period, metric, project_type = extract_params() - - params = [] - - if module: - module_filter = ''' - and scmlog.repository_id in ( - select repositories.id from repositories - where repositories.name = ? - ) - ''' - params.append(module + '.git') - else: - module_filter = '' - - metric_filter = get_metric_filter(metric) - - time_period = parse_time_period(period) - params.append(time_period[0]) - params.append(time_period[1]) - - raw = query_db(''' -select companies.name as company, ''' + metric_filter + ''' as rank from scmlog - join people on scmlog.author_id = people.id - join companies on people.company_id = companies.id - join commits_lines on commits_lines.commit_id = scmlog.id - join repositories on scmlog.repository_id = repositories.id -where - companies.name != '*robots' - and scmlog.id in ( - select actions.commit_id from actions - join branches on branches.id = actions.branch_id - where branches.name = 'master' - )''' + module_filter + get_period_filter(period) + - get_project_type_filter(project_type) + ''' -group by people.company_id -order by rank desc - ''', params) - - data = [{'name': rec['company'], 'rank': rec['rank']} - for rec in raw - if rec['company'] is not None] - data = index_column( - paste_links(filter_over_limit(data, limit), 'companies/', metric, - period, project_type)) - return json.dumps({'aaData': data}) - - -@app.route('/data/companies/') -@cached(params=['limit', 'period', 'metric', 'project_type']) -@verified() -def get_company_details(company): - module, limit, period, metric, project_type = extract_params() - time_period = parse_time_period(period) - - raw = query_db(''' -select ''' + get_metric_filter(metric) + ''' as rank, people.name, - people.launchpad_id from people -left join ( -select * from scmlog - join actions on actions.commit_id = scmlog.id - join branches on branches.id = actions.branch_id - join repositories on scmlog.repository_id = repositories.id - where branches.name = 'master' -''' + get_period_filter(period) + get_project_type_filter(project_type) + ''' -group by scmlog.id -) as scm on people.id = scm.author_id -join commits_lines on commits_lines.commit_id = scm.id -join companies on people.company_id = companies.id -where companies.name = ? -group by people.name -order by rank desc - ''', [time_period[0], time_period[1], company]) - - data = [{'rank': rec[0], 'name': rec[1], 'launchpad_id': rec[2]} - for rec in raw] - data = index_column(filter_over_limit(data, limit)) - for one in data: - if one['launchpad_id']: - one['link'] = ('' + - (one['name']) + '') - else: - one['link'] = one['name'] - return json.dumps({'aaData': data}) - - -@app.route('/data/modules') -@cached(params=['limit', 'company', 'engineer', 'period', 'metric', - 'project_type']) -def get_modules(): - module, limit, period, metric, project_type = extract_params() - company = flask.request.args.get('company') - engineer = flask.request.args.get('engineer') - - params = [] - - if engineer: - eng_filter = "and people.launchpad_id = ?" - params.append(engineer) - else: - eng_filter = '' - if company: - company_filter = "and companies.name = ?" - params.append(company) - else: - # if no company filter out all robots - company_filter = "and companies.name != '*robots'" - - time_period = parse_time_period(period) - params.append(time_period[0]) - params.append(time_period[1]) - - raw = query_db(''' -select repositories.name as repo, ''' + get_metric_filter(metric) + ''' as rank -from scmlog - join people on scmlog.author_id = people.id - join repositories on scmlog.repository_id = repositories.id - join commits_lines on commits_lines.commit_id = scmlog.id - join companies on people.company_id = companies.id -where - scmlog.id in ( - select actions.commit_id from actions - join branches on branches.id = actions.branch_id - where branches.name = 'master' - ) -''' + eng_filter + company_filter + get_period_filter(period) + - get_project_type_filter(project_type) + ''' -group by scmlog.repository_id -order by rank desc - ''', params) - - data = [{'name': rec[0].rpartition('.')[0], 'rank': rec[1]} for rec in raw] - data = index_column( - paste_links(filter_over_limit(data, limit), 'modules/', metric, period, - project_type)) - return json.dumps({'aaData': data}) - - -@app.route('/data/engineers') -@cached(params=['limit', 'module', 'period', 'metric', 'project_type']) -def get_engineers(): - module, limit, period, metric, project_type = extract_params() - - params = [] - - if module: - module_filter = ''' - and scmlog.repository_id in ( - select repositories.id from repositories - where repositories.name = ? - ) - ''' - params.append(module + '.git') - else: - module_filter = '' - - metric_filter = get_metric_filter(metric) - - time_period = parse_time_period(period) - params.append(time_period[0]) - params.append(time_period[1]) - - raw = query_db(''' -select people.name, people.launchpad_id, ''' + metric_filter + ''' as rank -from scmlog - join people on scmlog.author_id = people.id - join commits_lines on commits_lines.commit_id = scmlog.id - join repositories on scmlog.repository_id = repositories.id -where - people.email != 'review@openstack.org' - and people.email != 'jenkins@review.openstack.org' - and people.email != 'jenkins@openstack.org' - and scmlog.id in ( - select actions.commit_id from actions - join branches on branches.id = actions.branch_id - where branches.name = 'master' - )''' + module_filter + get_period_filter(period) + - get_project_type_filter(project_type) + - ''' - group by people.name - order by rank desc - ''', params) - - data = [{'name': rec['name'], 'rank': rec['rank'], - 'launchpad_id': rec['launchpad_id']} for rec in raw] - data = index_column(filter_over_limit(data, limit)) - for one in data: - if one['launchpad_id']: - one['link'] = ('' + - (one['name']) + '') - else: - one['link'] = one['name'] - return json.dumps({'aaData': data}) - - -@app.route('/data/timeline') -@cached(params=['company', 'engineer', 'period', 'metric', 'project_type']) -def get_timeline(): - - company = flask.request.args.get('company') - engineer = flask.request.args.get('engineer') - module, limit, period, metric, project_type = extract_params() - - params = [] - if company: - company_filter = 'and companies.name = ?' - params.append(company) - else: - company_filter = "and companies.name != '*robots'" - - if engineer: - engineer_filter = ''' - and scmlog.author_id in ( - select people.id from people - where people.launchpad_id = ? - ) - ''' - params.append(engineer) - else: - engineer_filter = '' - - if module: - module_filter = ''' - and scmlog.repository_id in ( - select repositories.id from repositories - where repositories.name = ? - ) - ''' - params.append(module + '.git') - else: - module_filter = '' - - records = query_db(''' -select scmlog.date, commits_lines.added + commits_lines.removed as rank -from scmlog -join commits_lines on commits_lines.commit_id = scmlog.id -join people on people.id = scmlog.author_id -join repositories on scmlog.repository_id = repositories.id -join companies on people.company_id = companies.id -where - scmlog.id in ( - select actions.commit_id from actions - join branches on branches.id = actions.branch_id - where branches.name = 'master' - ) -''' + company_filter + engineer_filter + module_filter + - get_project_type_filter(project_type) + ''' -order by scmlog.date - ''', params) - - start_date = DT.date(2010, 5, 1) - - def mkdate2(datestring): - return DT.datetime.strptime(datestring, "%Y-%m-%d %H:%M:%S").date() - - def week(date): - return (date - start_date).days // 7 - - def week_rev(n): - return start_date + DT.timedelta(days=n * 7) - - dct_rank = {} - dct_count = {} - t = map(lambda (rec): [mkdate2(str(rec[0])), rec[1]], records) - - for key, grp in itertools.groupby(t, key=lambda (pair): week(pair[0])): - grp_as_list = list(grp) - dct_rank[key] = sum([x[1] for x in grp_as_list]) - dct_count[key] = len(grp_as_list) - - last = week(DT.datetime.now().date()) - res_rank = [] - res_count = [] - - for n in range(1, last + 1): - if n not in dct_rank: - dct_rank[n] = 0 - dct_count[n] = 0 - - rev = week_rev(n) - res_rank.append([str(rev) + ' 0:00AM', dct_rank[n]]) - res_count.append([str(rev) + ' 0:00AM', dct_count[n]]) - - begin, end = extract_time_period(period) - begin = week(begin) - end = week(end) - u_begin = len(res_count) - 52 - u_end = len(res_count) - - if period == 'all': - begin = 0 - u_begin = 0 - end = u_end - elif period != 'six_months': - if u_end > end + 13: - u_end = end + 13 - u_begin = u_end - 52 - - return json.dumps([res_count[u_begin:u_end], - res_count[begin:end], - res_rank[u_begin:u_end]]) - - -# JINJA FILTERS ************************************************************** -# some useful filters to help with data formatting - -@app.template_filter('datetimeformat') -def format_datetime(timestamp): - return DT.datetime.utcfromtimestamp(timestamp).strftime('%d %b %Y @ %H:%M') - - -@app.template_filter('launchpadmodule') -def format_launchpad_module_link(module): - return '%s' % (module, module) - - -@app.template_filter('encode') -def safe_encode(s): - return urllib.quote_plus(s) - - -gravatar = gravatar_ext.Gravatar(app, - size=100, - rating='g', - default='wavatar', - force_default=False, - force_lower=False) - -# APPLICATION LAUNCHER ******************************************************* - -if __name__ == '__main__': - app.run('0.0.0.0') diff --git a/dashboard/static/css/jquery.dataTables_themeroller.css b/dashboard/static/css/jquery.dataTables_themeroller.css deleted file mode 100644 index cf1d4ed79..000000000 --- a/dashboard/static/css/jquery.dataTables_themeroller.css +++ /dev/null @@ -1,244 +0,0 @@ - - -/* - * Table - */ -table.dataTable { - margin: 0 auto; - clear: both; - width: 100%; - border-collapse: collapse; -} - -table.dataTable thead th { - padding: 3px 0px 3px 10px; - cursor: pointer; - *cursor: hand; -} - -table.dataTable tfoot th { - padding: 3px 10px; -} - -table.dataTable td { - padding: 3px 10px; -} - -table.dataTable td.center, -table.dataTable td.dataTables_empty { - text-align: center; -} - -table.dataTable tr.odd { background-color: #E2E4FF; } -table.dataTable tr.even { background-color: white; } - -table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } -table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } -table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } -table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } -table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } -table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } - - -/* - * Table wrapper - */ -.dataTables_wrapper { - position: relative; - clear: both; - *zoom: 1; -} -.dataTables_wrapper .ui-widget-header { - font-weight: normal; -} -.dataTables_wrapper .ui-toolbar { - padding: 5px; -} - - -/* - * Page length menu - */ -.dataTables_length { - float: left; -} - - -/* - * Filter - */ -.dataTables_filter { - float: right; - text-align: right; -} - - -/* - * Table information - */ -.dataTables_info { - padding-top: 3px; - clear: both; - float: left; -} - - -/* - * Pagination - */ -.dataTables_paginate { - float: right; - text-align: right; -} - -.dataTables_paginate .ui-button { - margin-right: -0.1em !important; -} - -.paging_two_button .ui-button { - float: left; - cursor: pointer; - * cursor: hand; -} - -.paging_full_numbers .ui-button { - padding: 2px 6px; - margin: 0; - cursor: pointer; - * cursor: hand; - color: #333 !important; -} - -/* Two button pagination - previous / next */ -.paginate_disabled_previous, -.paginate_enabled_previous, -.paginate_disabled_next, -.paginate_enabled_next { - height: 19px; - float: left; - cursor: pointer; - *cursor: hand; - color: #111 !important; -} -.paginate_disabled_previous:hover, -.paginate_enabled_previous:hover, -.paginate_disabled_next:hover, -.paginate_enabled_next:hover { - text-decoration: none !important; -} -.paginate_disabled_previous:active, -.paginate_enabled_previous:active, -.paginate_disabled_next:active, -.paginate_enabled_next:active { - outline: none; -} - -.paginate_disabled_previous, -.paginate_disabled_next { - color: #666 !important; -} -.paginate_disabled_previous, -.paginate_enabled_previous { - padding-left: 23px; -} -.paginate_disabled_next, -.paginate_enabled_next { - padding-right: 23px; - margin-left: 10px; -} - -.paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; } -.paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; } -.paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; } - -.paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; } -.paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; } -.paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; } - -/* Full number pagination */ -.paging_full_numbers a:active { - outline: none -} -.paging_full_numbers a:hover { - text-decoration: none; -} - -.paging_full_numbers a.paginate_button, -.paging_full_numbers a.paginate_active { - border: 1px solid #aaa; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - padding: 2px 5px; - margin: 0 3px; - cursor: pointer; - *cursor: hand; - color: #333 !important; -} - -.paging_full_numbers a.paginate_button { - background-color: #ddd; -} - -.paging_full_numbers a.paginate_button:hover { - background-color: #ccc; - text-decoration: none !important; -} - -.paging_full_numbers a.paginate_active { - background-color: #99B3FF; -} - - -/* - * Processing indicator - */ -.dataTables_processing { - position: absolute; - top: 50%; - left: 50%; - width: 250px; - height: 30px; - margin-left: -125px; - margin-top: -15px; - padding: 14px 0 2px 0; - border: 1px solid #ddd; - text-align: center; - color: #999; - font-size: 14px; - background-color: white; -} - - -/* - * Sorting - */ -table.dataTable thead th div.DataTables_sort_wrapper { - position: relative; - padding-right: 20px; -} - -table.dataTable thead th div.DataTables_sort_wrapper span { - position: absolute; - top: 50%; - margin-top: -8px; - right: 0; -} - -table.dataTable th:active { - outline: none; -} - - -/* - * Scrolling - */ -.dataTables_scroll { - clear: both; -} - -.dataTables_scrollBody { - *margin-top: -1px; - -webkit-overflow-scrolling: touch; -} - diff --git a/dashboard/static/css/style.css b/dashboard/static/css/style.css index 345ca542e..8a481448f 100644 --- a/dashboard/static/css/style.css +++ b/dashboard/static/css/style.css @@ -1,7 +1,6 @@ html, body { font-family: 'PT Sans', arial, sans-serif; font-size: 14px; - background: url(../images/osstats_tile.jpg) repeat-x; height: 100%; color: #41454d; margin: 0; @@ -23,12 +22,12 @@ p { margin: 6px 0px 15px 0px; } -div.Xpage { +div.page { width: 960px; margin: 0 auto; } -div.Xpage h2 { +div.page h2 { font-family: 'PT Sans Narrow', 'Arial Narrow', arial, sans-serif; font-size: 23px; font-weight: normal; @@ -70,21 +69,6 @@ input[type="submit"] { box-shadow: inset 2px 2px 7px #D3D8DD; } -div.page { - background: white; - border: 1px solid #e9eaef; - width: 90%; - margin: 10px auto; -} - -div.page h1 { - background: white; - margin: 0; - padding: 0.1em 0.2em; - color: black; - font-weight: normal; -} - div.drops { font-size: 15px; height: 60px; @@ -126,7 +110,6 @@ select { div.aheader { height: 60px; - background: #e0e9f2; text-shadow: 1px 1px 0 #fff; } @@ -303,10 +286,7 @@ a[href^="https://launchpad"]:after { } #analytics_header { - height: 25px; - width: 960px; - margin: 0 auto; - clear: both; + float: left; } #analytics_header h3 { @@ -315,9 +295,8 @@ a[href^="https://launchpad"]:after { font-style: normal; font-size: 24px; color: black; - padding-top: 30px; text-shadow: 1px 1px 0 #fff; - margin: 0px; + margin: 0; } #analytics_header p { diff --git a/dashboard/static/css/ui-darkness/images/animated-overlay.gif b/dashboard/static/css/ui-darkness/images/animated-overlay.gif deleted file mode 100644 index d441f75ebfbdf26a265dfccd670120d25c0a341c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png b/dashboard/static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png deleted file mode 100644 index 9d57f765352e474e034fe9fee450018acd7627fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F0wfqj{vTKlq?nSt-CY>?t&Hpz19_YU9+AaB z+5?Q;PG;Ky8FHR3jv*e$lP#KA4SKlxP~ajahLlrQ(m(7a76DbNmbgZgq$HN4S|t~y z0x1R~14Cn70}u)^w6HQYwK6f&HL$QUFvy*i`Wr<UftDnm{r-UW|F_}Dp diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png b/dashboard/static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png deleted file mode 100644 index cc977f5e91d18fb6fde587d48f925fd4f18406ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$Z+#?aSX9Io$T@JutArb;MKqk4d)lOZ3T*L9X@R*+<7i?OC%*rKFXC8 zN|l(DXSl>C-NQJ|BmVG&j}3~&vd+(115LU*92t^dF$(Rp5jF*ys9NG0QIe8al4_M) zlnSI6j0_Bobqzo$#L&XZ)YQtnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12U#~x;Tb-9DjS>kdHA?r1fF-|KIlnRtF@qpJAIK#A`jlU}YM!$-9f5NHl z((nGuKvVWVX1%yW@zq|9^kks>R7+eVN>UO_QmvAUQh^kMk%6JHt^o*z7+P4Fnp&Bd p=^9vA85rcwO8t$ZAvZrIGp!Q02ASh`-GLeyJYD@<);T3K0RR+(dXoSE diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png b/dashboard/static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png deleted file mode 100644 index b4c7f25e433becb9d534f5bdafcb5b22639a3a22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12U>ST^vI^j=w#>Q1Fn01na}v_k7%ad<)pq79Cv5pmyWRq^Jxg5j8ee zt4t<8*26rq0-sm=uZddrvMxJ{*+GEC@dJCD)I2uXt;QFYuXaq1k_rh*zMv-FynUxc z$kV-!S08=I{zYiHY}U>*NmenAGBvd_wbV7Rure?RuMq7)(U6;;l9^VCTZ5YFS_7a4 N22WQ%mvv4FO#n;MW_kbs diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png b/dashboard/static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png deleted file mode 100644 index 3823bfadb18220ba38d3628724f6f15aa4f803be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3816 zcma)9c{CJWyw{?%2qjClN+kwkNi_CsiEL#k6a8fD*@s~mB@{CK#E?BhmKif)GL;Mw ziOJX*rlH6-g9&4@#5}z7-aGG)cg{QK-uu1xd%oZE{hoWj_w%_o$dzVI@DViH9t|=$R4+ ze;WJgRe0HPtib51CT(D0?)!p4j2GC!T?4V8*h&3Pk6GtT)JaF#3dEJ`Hus4c3AdC9 zxrW6#@A-{6(Q^2qc>ZZHU;WJf>b*bA6rP^s1A>ez`QSZ=-1$GH*a!po{{N;AS252q zWq)N9--+nSB=y<1=;Rn$OnujIv63=dHn10Y?SL0*m96m3@i{kcu!nhR>}!%cYuR+s z`Ldk+SA_|Edr;8I&66BIC6-#8zkG3Dcqdhspw-dI@*S4SQTdiUK3uu-jJB+xuP3

Cf8Yz3x>3AHFBcS0MjcSN*&p%+^B9!?s!4*Asi7xE}+62 zPSh1z$0mFINtX-J6oe!Z3@Okl^3} z`=MK>)Mx@-8RB zhNs-!4&RbC@mteBU>y>X=kX~gr1k!!rcFr3Y-*&+w8U!b;V)@!*vk$p&cUxbHW-Uo zRP-0rw9aDcMgZV>$i=xY=VOc+G7+QpB0;fuXa^|&Ja&k7#kTV?Dj!JH(!4^w@ z;nZ>z-C---GJR_I+6d%75hxSeC9CQZuRO?E?$pE*4CHdp z>z-Wj(Lq}Zo8m=Ao|j#`?CG``&```<()LSZPi-aKZ7MH5OQ#X4P{lr}4(TXiIz>a& z-ha>meJhzdap!A}4^1yDJj#t1wUSl<+DjcWe_<<1;o2@^8tA7^BD^n`$Wg&HOrTGa zC<{JfJ7~mXwxnQ9Kg-cKTE_qJ-<%dF>u2!0+`DL#*g^f%(Uq9u=3!|4`ap_1-O4m7CH??sI=xz9D%xlrm_3CP0+xv0_+(%>sb{6NAP}lko z{2ewPM!*DexCzZ$$Aj&JMiP%W2@Lh(z;aQi=}2AbK;fqEiF?y7AzT?sP1I{_m5$JS z>YM(0CufMZ#>3(HREHC z?{6L)^tUFtW&eGw)|wm97@7QzTR_>4dJt0BoCEnDnZPDrezU$mombom3XWVFBlV5? zKX9D)e81un_g=t%lf^xFB|JRb;9KytP{dY#@v4G5ihOVkE4~n08Cw6xKaF?v<3}?X z$?f*7d2ZQoeh|*tf{IvyWzh7KM^P`h6*G=u`CS{zT#MIk!Cx$x8)DIhdm$8p{IWGP zbAgxEgFG@)qM{eDh}?K0mL3a2di+LIDR9~K*lNV^Vzu;<%z14w5V8z*L)9J~4Rx$P zTmm4@9dGzKIJ8UBow36E?IYrI8@EquK|nj!NZ6Di60nP<2~x4Zpk*9!niIj5Wm{R1 zy&hch`#bL{P$ox?#nqvdoCf40*?2 zuip3sJZpIeL9w?N!=s;7%9Fm+W}kJ47WtBtz*RGL6udnp)pN{&5#adSNXr*p)mG4} zv4Er`^*f~9F|zzN4{IF2f@)QYRUMsVYW>erraD&y@xW~ciir1%-QBApB2Z`A^QU+Kpjr(Z*i(c6Y4O2gOORwRgHlhIfjf>iTGlT3=bgGOnu zq&e$EDp#mK0J3+3lq!&?F+X+)8l89{Xy zmUZ4)q31UmpjYWd#H>ACCKCw~nxFn9lvmnjwm(Z2xORTLm+_R9#6f(854HHt*)vVsEjbeUTVb)ydbT>O1waPX#b%{VSK))<-$*OQhe^ZLyQvGjX|H;Nk z^uJRY-TFn@bngA8ErCQYO%7W?2+|Pzoq$5c@`Tk1|`N((gHUQHut8;dBvR- zn?86XA5_{u0Uh37a8Tr3ry{8eHuynKz%$RnSI$un<>Qy{uBTS%nn3XtU6$4fFQ*4v z>m4ch($9IlAqu!LaAZvMQrY6)Gl?})Sp1ZD%!92D;p^|j$dlf2>{2*D`EY6Jc*;;t z($M})zqHgcqT;2KZW>pk#Q-U5gSV`6-!X`%?&Fb@9>_Z;#3WpUXG1Qt#giFHzdj*z zcdWGCG(=mFcj~D!0E&1tZE7pU1Z!3pdp`1qDU2g$XL}`oC^o0{n7*ly$o!lu9X4jV zRTO-6r)*EP9ZK zAL~dp%FT}4)mZV7APW{%RhvrpKeqZW_TIP6-sbZE&EDXupU#;B0LO&ZwO^RVRl=q2 zv6;En2(Q4kz-SPI__0@rZ9V2Wb|oDw{{faaev9=iGGy@V9qBj9Qb2i#*0+}=+vzN9 zVpauv0`?{3^>i~u8t^GU>$qM zsU_An&cui`bnbxhieW8hvyA-_A+-H{JRfG}9Om&)7!-6r1iCHwG}P2JRn&IcEp;7` umKNyJWfe6Ykeb?q9O%aXa(EEv;o}+ke>+IGF)X$n_$RRV$`)#^V$E5oRTl7m=l?)FK#IZ0z|dIN0E9veEv!t;PU?7bteI(Mh~Y;Q7U_rJFbs1Kw~Do&}#Q1bw=ZXU1M^`>|rN3{r_PX=4MW}R3hUuyW zz2*DsUhb}7dc99VhC%+P8PIjAC9V-ADTyViR>?)FK#IZ0z|dIN0E9veEv!sUtxU{x n4J@n-4030s{zlP|o1c=IR*74K%<;SKKn)C@u6{1-oD!MOt{4q9c^pg%OaK6Yqo^RG1puHty#h|2KYM!0=6gsy z8K9N2ybORo_{i$}QxC&U!O-)`D*V04jXAvq04SIhWh8ZcmyYuM?QKT_N5t*AU(|QC z`lq$EU`=GRI-njZ~u1-;J zSpxW8s+8ZMNsT7C(ScC@%+dXT2`5OBK{NYzHIl}|fVm<#cVSZaTx4gZ#=ndYA?trE z*6TOz8pLN8)cZ%(jWU6016qi+&ST(E3poFxz)GO7?ns4Wd{sg6kxQTmL$*&wk(S=K$M@P?Munwuq zWpM@@uUSqtb(TBVY*0%vp-ci{#N|Bp1#gR2R88&G%GMTNt4dmpUv5q&(y??C+EdGx z^JMZn!W*sC`$Pq%Yy~Hv?6x_%KeSn<0q?>=uGu^SY6-q%nd(JuwichK;boIJ_-fyGyo^c4iY)A4BFhl?YQfV)08Q5_obCJr8fY>U@@(?vtN5m8P`}$qD`_kA>55yU-@P^ZRLJ_laU~!}(Rt(~B z*Pf<2{k90cRH&ln57cc5VTw3tSO#TgPA~;0XZw3MpoF>RcKil}aXxZB{o!lMAco5S zcLq5TI|R6H8NCl?4tr-bwWQr#pSefD;oreJ`lvswaSON4i10%-7mk0?(AG-4immor z9H;RPv``uPMyYGv35PQ3#I&K80$TUcafx9gc$5^QWtc^hKQ^>_pb{zK6I)3dha47l zMOh(I%FYcqR#kVuh}Mk)^S;D)Cxuc!zlK%Dv`iIyE8&+nf*5rtP1BTlyDn^><9K;4 z86HgzNU+-iY)M0k26h`GJbr$2v|jnk6BISCO0}8%9!|oIBbm{1ob>!^6i=MlT|7=*X+;ne9tR&Tj43aU9ArmELhOGSph*ju7e0 zYHszpZ43?at3oE&I`=O4aO;k3@bXQ_KNgrzV&Erv;lH7G_7gT}xW8_3g}$cV)&hx@ zYcUdC{$amhqC{s6*|bQF?YwftfxXdDp3w97O2XZqJ=NlFU1lx+aeT9&2iH2yn07J^ ztU-gzPxI4j#y;Uy{$)I>mqUAdBrF5*7pj+E+*bTTeA=fxIFu=5pGuXB5|)+_+1{r8 zm8$PM6~1?KX=8>&M*M0-XZPlN+&wr&nAHNBaL18_-*@5a^O&O4CPT|wZ3FZnZd-C_ zH%chjeO1Zgy;R2Ck=^a(pJl6MGUyuGHf{?aBrD`Kwg!@e)(OJO8Y`h7o%fL?F#D`N zw01>z0l$1@#M+TJtVZm4=9#)x^#Y(Zl@Ebaem?a_E4>Asn;+5z;n78y2x$|mIz;O> z=LA-DK)*rCDV(<`6`a%5`f$pTt4j6V?re;<6#zlcYS=z~zbMxCn4|Aq`ybn;`Yu(M zRQ7aw=ZAaHH2QDR@p;~L^Ee>-Xs`)p+LnQLdTty4iF-cE$Ip`0&1|%;cot!b=382q zjoCNIppu|H;KaMDM0mG7o<*plHL^)L)BbRn3O93K^U5vlkFT$V*n{J-g=v8HK1iyS zkcDIddGxjI2MhJ*+7Gv159IhVUw>#_3=zn^)~PspO+}59SBd0bC9Yfmh?IbudsuTQ zs>wKH7)IU;lwDck|EfN~QWDkOsu@QFHTkh5@jz->*n>j?y!t-Q25xPj+jMj}qE|L^ zdz)(LOe}E7P|?r?N(=*viyJWUmfwRL*o+Up#fQ*J&V!{MbRu@ASoF4Nl@p4R2!9bJ zR!QjqMZqUY?HLrta{d5Pm)=#eaPlk;$Wm$l%EgbDrB|HE;n+%AL-@KljyJ$BA_iaM zP)Kd7-V-ch+1BL1t>6*m6ZBwdjNj|Fyld1F!?5V>)ldXR>P!Rj3LED89~o@qgh#^3 zKtM4kL=@Dv*QCmt1Bup$INwW$t zL+1r$`czGIu8vi{pV4iS$b6q#J&lwt4t|X@10PiH(e5m&>|mPY|Y-yP{%yD$l=)8rL4gJOpu`d(OFrMe~mjf(@;A$NnP)fU0ZrvGrh5_ zR+kH}c)V1D6I!>%^(53m>chfOlFRwCR6=|mLMblmWoE|kgs%d~H)HWXF|MSZ;o2_} zXoxip6j`P0QN=B~cDr@!Ny#S|(6ZMufMpw&*m_O!&Dzsk0pne$HmbGFW6h>xHpL0$ z^PKoZn-a8}b=lFAzh#=Z&GFFT%|`1$BYV{nbjK7gUq#u^DBp_(fwj`7A>Q4e3i$5gx_ar5~?}| z$Ub&(Fa@w&P3KB4DbMsJCZe}JYcT)=?domj_Rh)E`4#PU_DO`Cgba05#QNE}FioF( z=4Md%aF7NiUxK~b!>ebhc5L^qFwByIXttRI$WT7mp9ikZw?ahlNbP2Ca>QLStmNsM z(!auaRz=i>{(u2B*`{rbsA09d5x7{{z_?Px2h0}Pe2D~p`VlaJ0ES_Thk>=0Rmd3S zYJ5h-tSsZ?2*M(q0V*^3yu+ivH1wBIwn)Zw4qcOPwpKsj#c73oBpt~g@JZl@xaF3p zjp^nk{3z_k9p5BBP@tTLBoD(FE5thlRi{Ke`0dw4x+q_U`=IV7Z27i)h!b{M*PH~O zvP84UTa8k!_`Ve6qw0fXK<<>SsWK2@SAj3bDK!WviJbS^KywBI^3@G#Z6bGw>A)l` zAA-a6kj(}iFX9+o&KZz^9z|pFU@9#Vtqcp^be)t4j2eVO$DsA#jGtLC8C)q?tUev<+IIJeJw3T9Jq6P!x9#p1GC%eb8^%g7!6 z?OZ}**`n3EA`CDV)#}py(4D`5*ptAEAD}=RshDW-m-R z`F&t(TUAhng?~RKl(X|XU0jvrKIhxaj;9yAJf)IDd<|U$T420XAzk6oX*$Au{cOQd zYKnKl`Aj+h$9cvUY@ofkUGFB}1-j%`rnFWpY77eX{szQS;pUo|@Pny%-FjRr_Ph}P ztkuc*^^$OJfH0S1&<8&9HN<|S;_Bk13Sd&{H!grmkE{$UZg#4-ey$jc{p8tsF6!2w z7`t{H-*|Ju7Nm1m*6R`0`WS3{@8D8ZwkC;DU!-W@kL7`q^KhCi_qXF4qELoxv}}t! zhjdI4vD4iOR`iU6<=!d(_Q6*VG3ImELiV0niI9|tyq-8*vfX;O2x&_F*_7=95Q%cD zg_NlR{D?lVr!d@H16ixqJV-g=MHu!%lPcG_qK?OKOf%M=t?)bL+BlQ=I>I-PlwYI| z<9nv1Va@DcVZA$ICZ$ud@3&~a6cu-0v?g&L8;-XXHxMf&#`VZDdh0my=WRtSE&Y;< zVg_7+N=`2pt=<@ea??J{Eo8pV^xkcl5-{y>cEat<*1+zqU+dD*-Jg1CAKeS$qcHW@o|oG89!xPQPd zU=J4_*A#&=u=9@msmvJUmw0|kA;Abe(w2}A7>H21@&B*2Xv#@1)UZ_1d$xdR=0Du(XO=y~j*0KU{3=idQ*cV;P@94qdtTkab}qSRStk zo+LnSpdmLX9#Z+hF1a+r2!UVIgkoiOtHEa4+i+h@1;_N`br*+EPYDDIvIAL;9`fgW zv`3n!m25FWgg%{relJHjtU51_W2G0p+ww`G-U@Nn^$)AGn5R;YH}- zkx2bCjV%Q>D-`$(=xy7mye}|whf8=0p*U|y;s@c3{nM893||#oww%UZ zKGQqQ0mNF-f;|?j+jiJYOcP>u+`YlenadQp5O%s6&_VJyM7x9xowxNLpArM|3nz$W zqvav(0Vew1Cu7%_BPEDk2{Vvh=OCW-FRIfDQR;xNSZ=Uqww6=-hw$Jeo>+WT0KnmlNYsak$hb_KIdXVRrq|4 zc?l!EgE{dGxxYZ+E8~BK2SBtVuHRh|`#D8+iAg8D$Ko*^l`dx{Rx}5xH}$awqp;5^ z!Sjb?OiUDikL(Ag%PyI0zkKmYHH~FQ7P)QGg{VW|i4WHh`CulLA`rhuK6S%n^Q~e8 zGB&(6yFYe{h|U~)r+u3!T?^r}}eT&_*XZsk)gDqoI#goBdqU$eB&8 zADcQBiq`C0s8z}2f24R-qf;lpq5g&SMm1;>_sw1A*VKy&12j49ya&fUirm5+vlz`( zPz+V7TI72^(gP#-&3A4!TVRXUwP_sRH=)Ng(b1O@qu3L<)|}g3&0?{f{sgw05M(5f zfEl$_N3qf~^pkf|C)P#RTMlulrarg046JtX@ezPQ8Au7^WxnrUKcf;<}H4s$6v(9)V1%S6QX+2kM5j_wN&$+H&Ll?PU?h`gC3q=8_Gr}pfn6( zD^qHZLJ|)R9Ni^U0gpI$sh~Sbt`oNlgH*tB%dc|dBJI9SEbHfjVa(dN0vIQ<5489B zUt?1`&EX-;?dI2)ugv&1>#Q2=;~t(t*o-g=&*_OgR6bIl8A$@8&lqNp(u_eX*mukT z@kt{=LVp({=X0XDT9{_0j4hklmuc72Dpr}qTf6dVkHzRWT(_L`dk+e7E5prT{=J7+ zau}%_SG)z*oDcekL5mhi=#Z!wJqlUp=BdY1fjX`H^@0|m#kO=Ozci8%WR%*YFaDk{WIi==sHQdKM-E@nZ~$zoYV{Z$zAr@SXm=Ieg4AiPmFfNJjWYzvFdG zA&;;NZ(4#%_Mm0Y6z5<**tK(1@Fz^J9=6KaPtb7id=(!4(3LBi=!pTkIsw-=m${TB z(u#26e%y8`PZas8ha=O(#@(E-<;+P8}A(sQ|tN^1Y-XY_6{ z4i@bvxR}9%cAo0U4bL#nF8RP{@Vb}iO@(kCmbcx~{SVw#yEH9}&#-l-Q@BB>SM63) z)M8*Q#?r;=@5^PuXzT_+9Iw);!3epn349KNTgXw2BDl^#39d=z40T?)ZeH?j#TWR< zV#2R^_)Br>O6;>UrqGn&SbXGapKO)o>qac~!#5!uLw%~`V?2s}8z1z}lKspGrb(>Q zW!28Hzj|t>gyu;57~@?)?sZ--dTUOT zgPs0iapE~VL7vqWW~T1ynETw ze|$G{1Wj+g$^n`e7_2wkNYt{pviHdQwo*m1pLa=ghj3e}7EV^h=0K($(9ZvciWCNbHa4$!5H} z@Uag+U45D?uq;cWYMb%vf!|+SckQdvN`Hz*nZG)Wu|iV6Eht%=ASH4asU_QSO%V&> zK)P9&^FpxR+ldG$hmRQOv6p6t4D&)pdcqgb1pb9FMGpL3kf2S7AIf>8_5@gljRK0a zuo8%h_4TE&G3_|i8s5kmN5sREEvF^ZpV&;TN}=4aD2EFsm7bNVbW|D;YwS?4zHnOk zRh2=*`eU(1sNXiurRQ-FX-&CUNLT&(^BU3Gm1MX-A#Ry3-5;_0%2QzBK$!bRmR9DD za|pF*NMS730`zczmK)~$ig`Y;iJ{UA_P=mTvIEThFi!YeO={FwGykGpbHhn|wppyS=;NW{OKezi zj!2ZSoc@n7mvY}Y^gR(1mL&a*$(=g3OoVMm6xx^^OnCd6{fh7mACHiAl}_HiQD$Uc zrFFMj=+XE?>Z0qD4*{rUx2f;dx@5j(nsN*OS8cAdS7z1`@!P;TmfUguONB$VdwhK% zos$YG4>4D_?sYd))nMrZb@Ae(!C=;edumLXZ^h~WQh*iL8L7QzF?Z-vu2qt7JdbpS zFf~Wo-1403{&H{q=g0Ys=>hLk#IokWMm?&W^-bk*fc_?<#IrBY6r}2ShlICVkcn{c zdPW(7i&(}tc#oPw25ga|D>6A8Rc`0dT-}~TZxP8Df0p_)yc-j%EA_U!r^X8pCt23Q zi)I*&v@KR({{@KG3Gzy#Qg&#jSDk(PxA>sb2K6WNXBmF>EL?FXyPz(yCvnUh<==#| zQ8MTU8VS>zBhlVdeTVXCxM#c!iv++wbZS7eNcIu#53%vURlwJ;_@D zBDxn|woIw|J7?|q1}EDLG((i=_duGUnx`2+m{fttG2`%ejStF5eEX@wrz&{?7KV8` z&9YImZ&%Z6@NjmzP!{IUan00WfazVIDzm0ryF}hHmFB!n`==y5?-{3R zb-DvwqBJ)Q9&0F+DLhI89+Z}Y#^$uUB-C-MVz6ls7GhBwW>WkFa}wYM}(!*H8ZZ;s71H_{Q&d>X1aCe{>Lo>BgRnjU+x#Iub%bWrCk?Eo8)94 zGN3I@nIw1gGVfjzabx9H+z@G)4<1bDs}yBF7c4twl5_?uWjy}f1szOl^lS+Uaw|cA z*qg|L3HN?s8CLqSeKTRPHf>}sncYz2z-S9R@^7mEAOTC?iE=`egZF42l9-R z2qCk%SD^mlA^bv9^gf%_4@ayP|1p%er#h(hCU%SKh4^t-H9J*ecyEWk(ywYw zi2gO++su-c3H`Za?>+JL;5G*N-UO~Aif+W^i`U&~^k@*}+NLT0jf#X*W_HD&`?Cc* zon5kT9xfLGw084X3;(gEk%G@1gt`R&Z*ja5+oM-BP-u^unAQm-KkNEt9Ok`8EgkiX zNTdGXL+z`l-6wfOB>Hlb9Qr-v%^}%dj6WKcGgamJRvv9_<-rwdBPI&i-=o`j##)=IO5~R!mtE2BOMpe$Ck|v1uyKkgw0yCudF6`J zk$H>43vwO~4vTQ{x8vLxM?C%%nFGj+fEobk8aA1U^E@sd%qN-bCDeC`f6QE%u1n8X%chuzE|55OZ1tEqgxVtWCFJ-41*!|2 zkGcm&d8~?;W9(>R)`2YqEs{B_kylO->cRzZp}AgX3~W01<9zrP9?b2~)D$AGe)9NP z#X#Drknh{m-4Uagtbvz}rI)RUwTJDK0q}D3@NsbSa&YtLaPy1s@rm$ob8riZaC5)1 zfF}Q2fQze*!#ltKKfplDm-8ur{BI*@yT0@CvGlM7NZPns+0rVySlZcY*;?B8xsTb3 QJ~;stWz}Trq%1=J3#jBGg8%>k diff --git a/dashboard/static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png b/dashboard/static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png deleted file mode 100644 index 232832a5aa0a7883c1e0acacfec59e2d1c2088d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4549 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 Fe*nBTDe?dS diff --git a/dashboard/static/css/ui-darkness/images/ui-icons_a83300_256x240.png b/dashboard/static/css/ui-darkness/images/ui-icons_a83300_256x240.png deleted file mode 100644 index bb22520bbb2a0f465c780e096552d6d8df8e51bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4549 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 Q(8Pby#WOVV|BojA14*HTW&i*H diff --git a/dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.css b/dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.css deleted file mode 100644 index 31b21626c..000000000 --- a/dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.css +++ /dev/null @@ -1,1175 +0,0 @@ -/*! jQuery UI - v1.10.1 - 2013-03-04 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=inset_soft&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=glass&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=glass&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px -* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.ui-selectable-helper { - position: absolute; - z-index: 100; - border: 1px dotted black; -} -.ui-accordion .ui-accordion-header { - display: block; - cursor: pointer; - position: relative; - margin-top: 2px; - padding: .5em .5em .5em .7em; - min-height: 0; /* support: IE7 */ -} -.ui-accordion .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-noicons { - padding-left: .7em; -} -.ui-accordion .ui-accordion-icons .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-header .ui-accordion-header-icon { - position: absolute; - left: .5em; - top: 50%; - margin-top: -8px; -} -.ui-accordion .ui-accordion-content { - padding: 1em 2.2em; - border-top: 0; - overflow: auto; -} -.ui-autocomplete { - position: absolute; - top: 0; - left: 0; - cursor: default; -} -.ui-button { - display: inline-block; - position: relative; - padding: 0; - line-height: normal; - margin-right: .1em; - cursor: pointer; - vertical-align: middle; - text-align: center; - overflow: visible; /* removes extra width in IE */ -} -.ui-button, -.ui-button:link, -.ui-button:visited, -.ui-button:hover, -.ui-button:active { - text-decoration: none; -} -/* to make room for the icon, a width needs to be set here */ -.ui-button-icon-only { - width: 2.2em; -} -/* button elements seem to need a little more width */ -button.ui-button-icon-only { - width: 2.4em; -} -.ui-button-icons-only { - width: 3.4em; -} -button.ui-button-icons-only { - width: 3.7em; -} - -/* button text element */ -.ui-button .ui-button-text { - display: block; - line-height: normal; -} -.ui-button-text-only .ui-button-text { - padding: .4em 1em; -} -.ui-button-icon-only .ui-button-text, -.ui-button-icons-only .ui-button-text { - padding: .4em; - text-indent: -9999999px; -} -.ui-button-text-icon-primary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 1em .4em 2.1em; -} -.ui-button-text-icon-secondary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 2.1em .4em 1em; -} -.ui-button-text-icons .ui-button-text { - padding-left: 2.1em; - padding-right: 2.1em; -} -/* no icon support for input elements, provide padding by default */ -input.ui-button { - padding: .4em 1em; -} - -/* button icon element(s) */ -.ui-button-icon-only .ui-icon, -.ui-button-text-icon-primary .ui-icon, -.ui-button-text-icon-secondary .ui-icon, -.ui-button-text-icons .ui-icon, -.ui-button-icons-only .ui-icon { - position: absolute; - top: 50%; - margin-top: -8px; -} -.ui-button-icon-only .ui-icon { - left: 50%; - margin-left: -8px; -} -.ui-button-text-icon-primary .ui-button-icon-primary, -.ui-button-text-icons .ui-button-icon-primary, -.ui-button-icons-only .ui-button-icon-primary { - left: .5em; -} -.ui-button-text-icon-secondary .ui-button-icon-secondary, -.ui-button-text-icons .ui-button-icon-secondary, -.ui-button-icons-only .ui-button-icon-secondary { - right: .5em; -} - -/* button sets */ -.ui-buttonset { - margin-right: 7px; -} -.ui-buttonset .ui-button { - margin-left: 0; - margin-right: -.3em; -} - -/* workarounds */ -/* reset extra padding in Firefox, see h5bp.com/l */ -input.ui-button::-moz-focus-inner, -button.ui-button::-moz-focus-inner { - border: 0; - padding: 0; -} -.ui-datepicker { - width: 17em; - padding: .2em .2em 0; - display: none; -} -.ui-datepicker .ui-datepicker-header { - position: relative; - padding: .2em 0; -} -.ui-datepicker .ui-datepicker-prev, -.ui-datepicker .ui-datepicker-next { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; -} -.ui-datepicker .ui-datepicker-prev-hover, -.ui-datepicker .ui-datepicker-next-hover { - top: 1px; -} -.ui-datepicker .ui-datepicker-prev { - left: 2px; -} -.ui-datepicker .ui-datepicker-next { - right: 2px; -} -.ui-datepicker .ui-datepicker-prev-hover { - left: 1px; -} -.ui-datepicker .ui-datepicker-next-hover { - right: 1px; -} -.ui-datepicker .ui-datepicker-prev span, -.ui-datepicker .ui-datepicker-next span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-title { - margin: 0 2.3em; - line-height: 1.8em; - text-align: center; -} -.ui-datepicker .ui-datepicker-title select { - font-size: 1em; - margin: 1px 0; -} -.ui-datepicker select.ui-datepicker-month-year { - width: 100%; -} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { - width: 49%; -} -.ui-datepicker table { - width: 100%; - font-size: .9em; - border-collapse: collapse; - margin: 0 0 .4em; -} -.ui-datepicker th { - padding: .7em .3em; - text-align: center; - font-weight: bold; - border: 0; -} -.ui-datepicker td { - border: 0; - padding: 1px; -} -.ui-datepicker td span, -.ui-datepicker td a { - display: block; - padding: .2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker .ui-datepicker-buttonpane { - background-image: none; - margin: .7em 0 0 0; - padding: 0 .2em; - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.ui-datepicker .ui-datepicker-buttonpane button { - float: right; - margin: .5em .2em .4em; - cursor: pointer; - padding: .2em .6em .3em .6em; - width: auto; - overflow: visible; -} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { - float: left; -} - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { - width: auto; -} -.ui-datepicker-multi .ui-datepicker-group { - float: left; -} -.ui-datepicker-multi .ui-datepicker-group table { - width: 95%; - margin: 0 auto .4em; -} -.ui-datepicker-multi-2 .ui-datepicker-group { - width: 50%; -} -.ui-datepicker-multi-3 .ui-datepicker-group { - width: 33.3%; -} -.ui-datepicker-multi-4 .ui-datepicker-group { - width: 25%; -} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-buttonpane { - clear: left; -} -.ui-datepicker-row-break { - clear: both; - width: 100%; - font-size: 0; -} - -/* RTL support */ -.ui-datepicker-rtl { - direction: rtl; -} -.ui-datepicker-rtl .ui-datepicker-prev { - right: 2px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next { - left: 2px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-prev:hover { - right: 1px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next:hover { - left: 1px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane { - clear: right; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button { - float: left; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, -.ui-datepicker-rtl .ui-datepicker-group { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} -.ui-dialog { - position: absolute; - top: 0; - left: 0; - padding: .2em; - outline: 0; -} -.ui-dialog .ui-dialog-titlebar { - padding: .4em 1em; - position: relative; -} -.ui-dialog .ui-dialog-title { - float: left; - margin: .1em 0; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-dialog .ui-dialog-titlebar-close { - position: absolute; - right: .3em; - top: 50%; - width: 21px; - margin: -10px 0 0 0; - padding: 1px; - height: 20px; -} -.ui-dialog .ui-dialog-content { - position: relative; - border: 0; - padding: .5em 1em; - background: none; - overflow: auto; -} -.ui-dialog .ui-dialog-buttonpane { - text-align: left; - border-width: 1px 0 0 0; - background-image: none; - margin-top: .5em; - padding: .3em 1em .5em .4em; -} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} -.ui-dialog .ui-dialog-buttonpane button { - margin: .5em .4em .5em 0; - cursor: pointer; -} -.ui-dialog .ui-resizable-se { - width: 12px; - height: 12px; - right: -5px; - bottom: -5px; - background-position: 16px 16px; -} -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} -.ui-menu { - list-style: none; - padding: 2px; - margin: 0; - display: block; - outline: none; -} -.ui-menu .ui-menu { - margin-top: -3px; - position: absolute; -} -.ui-menu .ui-menu-item { - margin: 0; - padding: 0; - width: 100%; -} -.ui-menu .ui-menu-divider { - margin: 5px -2px 5px -2px; - height: 0; - font-size: 0; - line-height: 0; - border-width: 1px 0 0 0; -} -.ui-menu .ui-menu-item a { - text-decoration: none; - display: block; - padding: 2px .4em; - line-height: 1.5; - min-height: 0; /* support: IE7 */ - font-weight: normal; -} -.ui-menu .ui-menu-item a.ui-state-focus, -.ui-menu .ui-menu-item a.ui-state-active { - font-weight: normal; - margin: -1px; -} - -.ui-menu .ui-state-disabled { - font-weight: normal; - margin: .4em 0 .2em; - line-height: 1.5; -} -.ui-menu .ui-state-disabled a { - cursor: default; -} - -/* icon support */ -.ui-menu-icons { - position: relative; -} -.ui-menu-icons .ui-menu-item a { - position: relative; - padding-left: 2em; -} - -/* left-aligned */ -.ui-menu .ui-icon { - position: absolute; - top: .2em; - left: .2em; -} - -/* right-aligned */ -.ui-menu .ui-menu-icon { - position: static; - float: right; -} -.ui-progressbar { - height: 2em; - text-align: left; - overflow: hidden; -} -.ui-progressbar .ui-progressbar-value { - margin: -1px; - height: 100%; -} -.ui-progressbar .ui-progressbar-overlay { - background: url("images/animated-overlay.gif"); - height: 100%; - filter: alpha(opacity=25); - opacity: 0.25; -} -.ui-progressbar-indeterminate .ui-progressbar-value { - background-image: none; -} -.ui-slider { - position: relative; - text-align: left; -} -.ui-slider .ui-slider-handle { - position: absolute; - z-index: 2; - width: 1.2em; - height: 1.2em; - cursor: default; -} -.ui-slider .ui-slider-range { - position: absolute; - z-index: 1; - font-size: .7em; - display: block; - border: 0; - background-position: 0 0; -} - -/* For IE8 - See #6727 */ -.ui-slider.ui-state-disabled .ui-slider-handle, -.ui-slider.ui-state-disabled .ui-slider-range { - filter: inherit; -} - -.ui-slider-horizontal { - height: .8em; -} -.ui-slider-horizontal .ui-slider-handle { - top: -.3em; - margin-left: -.6em; -} -.ui-slider-horizontal .ui-slider-range { - top: 0; - height: 100%; -} -.ui-slider-horizontal .ui-slider-range-min { - left: 0; -} -.ui-slider-horizontal .ui-slider-range-max { - right: 0; -} - -.ui-slider-vertical { - width: .8em; - height: 100px; -} -.ui-slider-vertical .ui-slider-handle { - left: -.3em; - margin-left: 0; - margin-bottom: -.6em; -} -.ui-slider-vertical .ui-slider-range { - left: 0; - width: 100%; -} -.ui-slider-vertical .ui-slider-range-min { - bottom: 0; -} -.ui-slider-vertical .ui-slider-range-max { - top: 0; -} -.ui-spinner { - position: relative; - display: inline-block; - overflow: hidden; - padding: 0; - vertical-align: middle; -} -.ui-spinner-input { - border: none; - background: none; - color: inherit; - padding: 0; - margin: .2em 0; - vertical-align: middle; - margin-left: .4em; - margin-right: 22px; -} -.ui-spinner-button { - width: 16px; - height: 50%; - font-size: .5em; - padding: 0; - margin: 0; - text-align: center; - position: absolute; - cursor: default; - display: block; - overflow: hidden; - right: 0; -} -/* more specificity required here to overide default borders */ -.ui-spinner a.ui-spinner-button { - border-top: none; - border-bottom: none; - border-right: none; -} -/* vertical centre icon */ -.ui-spinner .ui-icon { - position: absolute; - margin-top: -8px; - top: 50%; - left: 0; -} -.ui-spinner-up { - top: 0; -} -.ui-spinner-down { - bottom: 0; -} - -/* TR overrides */ -.ui-spinner .ui-icon-triangle-1-s { - /* need to fix icons sprite */ - background-position: -65px -16px; -} -.ui-tabs { - position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ - padding: .2em; -} -.ui-tabs .ui-tabs-nav { - margin: 0; - padding: .2em .2em 0; -} -.ui-tabs .ui-tabs-nav li { - list-style: none; - float: left; - position: relative; - top: 0; - margin: 1px .2em 0 0; - border-bottom: 0; - padding: 0; - white-space: nowrap; -} -.ui-tabs .ui-tabs-nav li a { - float: left; - padding: .5em 1em; - text-decoration: none; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active { - margin-bottom: -1px; - padding-bottom: 1px; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active a, -.ui-tabs .ui-tabs-nav li.ui-state-disabled a, -.ui-tabs .ui-tabs-nav li.ui-tabs-loading a { - cursor: text; -} -.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { - cursor: pointer; -} -.ui-tabs .ui-tabs-panel { - display: block; - border-width: 0; - padding: 1em 1.4em; - background: none; -} -.ui-tooltip { - padding: 8px; - position: absolute; - z-index: 9999; - max-width: 300px; - -webkit-box-shadow: 0 0 5px #aaa; - box-shadow: 0 0 5px #aaa; -} -body .ui-tooltip { - border-width: 2px; -} - -/* Component containers -----------------------------------*/ -.ui-widget { - font-family: Segoe UI,Arial,sans-serif; - font-size: 1.1em; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input, -.ui-widget select, -.ui-widget textarea, -.ui-widget button { - font-family: Segoe UI,Arial,sans-serif; - font-size: 1em; -} -.ui-widget-content { - border: 1px solid #666666; - background: #000000 url(images/ui-bg_inset-soft_25_000000_1x100.png) 50% bottom repeat-x; - color: #ffffff; -} -.ui-widget-content a { - color: #ffffff; -} -.ui-widget-header { - border: 1px solid #333333; - background: #333333 url(images/ui-bg_gloss-wave_25_333333_500x100.png) 50% 50% repeat-x; - color: #ffffff; - font-weight: bold; -} -.ui-widget-header a { - color: #ffffff; -} - -/* Interaction states -----------------------------------*/ -.ui-state-default, -.ui-widget-content .ui-state-default, -.ui-widget-header .ui-state-default { - border: 1px solid #666666; - background: #555555 url(images/ui-bg_glass_20_555555_1x400.png) 50% 50% repeat-x; - font-weight: bold; - color: #eeeeee; -} -.ui-state-default a, -.ui-state-default a:link, -.ui-state-default a:visited { - color: #eeeeee; - text-decoration: none; -} -.ui-state-hover, -.ui-widget-content .ui-state-hover, -.ui-widget-header .ui-state-hover, -.ui-state-focus, -.ui-widget-content .ui-state-focus, -.ui-widget-header .ui-state-focus { - border: 1px solid #59b4d4; - background: #0078a3 url(images/ui-bg_glass_40_0078a3_1x400.png) 50% 50% repeat-x; - font-weight: bold; - color: #ffffff; -} -.ui-state-hover a, -.ui-state-hover a:hover, -.ui-state-hover a:link, -.ui-state-hover a:visited { - color: #ffffff; - text-decoration: none; -} -.ui-state-active, -.ui-widget-content .ui-state-active, -.ui-widget-header .ui-state-active { - border: 1px solid #ffaf0f; - background: #f58400 url(images/ui-bg_inset-soft_30_f58400_1x100.png) 50% 50% repeat-x; - font-weight: bold; - color: #ffffff; -} -.ui-state-active a, -.ui-state-active a:link, -.ui-state-active a:visited { - color: #ffffff; - text-decoration: none; -} - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, -.ui-widget-content .ui-state-highlight, -.ui-widget-header .ui-state-highlight { - border: 1px solid #cccccc; - background: #eeeeee url(images/ui-bg_highlight-soft_80_eeeeee_1x100.png) 50% top repeat-x; - color: #2e7db2; -} -.ui-state-highlight a, -.ui-widget-content .ui-state-highlight a, -.ui-widget-header .ui-state-highlight a { - color: #2e7db2; -} -.ui-state-error, -.ui-widget-content .ui-state-error, -.ui-widget-header .ui-state-error { - border: 1px solid #ffb73d; - background: #ffc73d url(images/ui-bg_glass_40_ffc73d_1x400.png) 50% 50% repeat-x; - color: #111111; -} -.ui-state-error a, -.ui-widget-content .ui-state-error a, -.ui-widget-header .ui-state-error a { - color: #111111; -} -.ui-state-error-text, -.ui-widget-content .ui-state-error-text, -.ui-widget-header .ui-state-error-text { - color: #111111; -} -.ui-priority-primary, -.ui-widget-content .ui-priority-primary, -.ui-widget-header .ui-priority-primary { - font-weight: bold; -} -.ui-priority-secondary, -.ui-widget-content .ui-priority-secondary, -.ui-widget-header .ui-priority-secondary { - opacity: .7; - filter:Alpha(Opacity=70); - font-weight: normal; -} -.ui-state-disabled, -.ui-widget-content .ui-state-disabled, -.ui-widget-header .ui-state-disabled { - opacity: .35; - filter:Alpha(Opacity=35); - background-image: none; -} -.ui-state-disabled .ui-icon { - filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ -} - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - width: 16px; - height: 16px; - background-position: 16px 16px; -} -.ui-icon, -.ui-widget-content .ui-icon { - background-image: url(images/ui-icons_cccccc_256x240.png); -} -.ui-widget-header .ui-icon { - background-image: url(images/ui-icons_ffffff_256x240.png); -} -.ui-state-default .ui-icon { - background-image: url(images/ui-icons_cccccc_256x240.png); -} -.ui-state-hover .ui-icon, -.ui-state-focus .ui-icon { - background-image: url(images/ui-icons_ffffff_256x240.png); -} -.ui-state-active .ui-icon { - background-image: url(images/ui-icons_222222_256x240.png); -} -.ui-state-highlight .ui-icon { - background-image: url(images/ui-icons_4b8e0b_256x240.png); -} -.ui-state-error .ui-icon, -.ui-state-error-text .ui-icon { - background-image: url(images/ui-icons_a83300_256x240.png); -} - -/* positioning */ -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, -.ui-corner-top, -.ui-corner-left, -.ui-corner-tl { - border-top-left-radius: 6px; -} -.ui-corner-all, -.ui-corner-top, -.ui-corner-right, -.ui-corner-tr { - border-top-right-radius: 6px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-left, -.ui-corner-bl { - border-bottom-left-radius: 6px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-br { - border-bottom-right-radius: 6px; -} - -/* Overlays */ -.ui-widget-overlay { - background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; - opacity: .8; - filter: Alpha(Opacity=80); -} -.ui-widget-shadow { - margin: -7px 0 0 -7px; - padding: 7px; - background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; - opacity: .6; - filter: Alpha(Opacity=60); - border-radius: 8px; -} diff --git a/dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.min.css b/dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.min.css deleted file mode 100644 index f04ce0771..000000000 --- a/dashboard/static/css/ui-darkness/jquery-ui-1.10.1.custom.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! jQuery UI - v1.10.1 - 2013-03-04 -* http://jqueryui.com -* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=gloss_wave&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=inset_soft&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=glass&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=glass&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=inset_soft&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=glass&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=flat&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=flat&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px -* Copyright (c) 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #666;background:#000 url(images/ui-bg_inset-soft_25_000000_1x100.png) 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#333 url(images/ui-bg_gloss-wave_25_333333_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #666;background:#555 url(images/ui-bg_glass_20_555555_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #59b4d4;background:#0078a3 url(images/ui-bg_glass_40_0078a3_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#fff;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #ffaf0f;background:#f58400 url(images/ui-bg_inset-soft_30_f58400_1x100.png) 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url(images/ui-bg_highlight-soft_80_eeeeee_1x100.png) 50% top repeat-x;color:#2e7db2}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url(images/ui-bg_glass_40_ffc73d_1x400.png) 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px;background-position:16px 16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_cccccc_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_cccccc_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_4b8e0b_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_a83300_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{margin:-7px 0 0 -7px;padding:7px;background:#ccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x;opacity:.6;filter:Alpha(Opacity=60);border-radius:8px} \ No newline at end of file diff --git a/dashboard/templates/base.html b/dashboard/templates/base.html index f5940f1dc..d05eb167f 100644 --- a/dashboard/templates/base.html +++ b/dashboard/templates/base.html @@ -1,183 +1,17 @@ - + - - - {% block title %}Welcome{% endblock %} | Stackalytics - OpenStack Analytics Dashboard - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{# #} -{##} -{# #} - - - {% block head %}{% endblock %} - -{# #} -

- - - - - -
Mirantis -
-
- - - -
-
-{##} -{##} -
-
- -
-
- - - -
- -
-

Stackalytics | {{ self.title() }}

-

Community heartbeat

-
- {% block body %}{% endblock %} - - -
-
- - \ No newline at end of file diff --git a/dashboard/templates/layout.html b/dashboard/templates/layout.html index fb970a991..d90bc38fd 100644 --- a/dashboard/templates/layout.html +++ b/dashboard/templates/layout.html @@ -1,6 +1,16 @@ {% extends "base.html" %} {% block head %} + + + +{% block title %}Welcome{% endblock %} | Stackalytics + + + + + + @@ -198,15 +208,9 @@ function make_std_options() { var options = {}; -{# if (getRelease() != 'havana') {#} - options['release'] = getRelease(); -{# }#} -{# if (getMetric() != 'loc') {#} - options['metric'] = getMetric(); -{# }#} -{# if (getProjectType() != 'incubation') {#} - options['project_type'] = getProjectType(); -{# }#} + options['release'] = getRelease(); + options['metric'] = getMetric(); + options['project_type'] = getProjectType(); return options; } @@ -248,8 +252,16 @@ {% endblock %} {% block body %} -
-
+ +
+
+
+

+ Stackalytics + | {{ self.title() }}

+

Community heartbeat

+
+