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 d441f75eb..000000000 Binary files a/dashboard/static/css/ui-darkness/images/animated-overlay.gif and /dev/null differ 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 9d57f7653..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_flat_30_cccccc_40x100.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png b/dashboard/static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png deleted file mode 100644 index 110058b31..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_flat_50_5c5c5c_40x100.png and /dev/null differ 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 cc977f5e9..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_glass_20_555555_1x400.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png b/dashboard/static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png deleted file mode 100644 index 48bb6d5e9..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_glass_40_0078a3_1x400.png and /dev/null differ 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 b4c7f25e4..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_glass_40_ffc73d_1x400.png and /dev/null differ 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 3823bfadb..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_gloss-wave_25_333333_500x100.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png b/dashboard/static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png deleted file mode 100644 index 8a9305cf6..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png b/dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png deleted file mode 100644 index 7ba06eda6..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_25_000000_1x100.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png b/dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png deleted file mode 100644 index 182fbad3e..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-bg_inset-soft_30_f58400_1x100.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-icons_222222_256x240.png b/dashboard/static/css/ui-darkness/images/ui-icons_222222_256x240.png deleted file mode 100644 index c1cb1170c..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-icons_222222_256x240.png and /dev/null differ 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 232832a5a..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-icons_4b8e0b_256x240.png and /dev/null differ 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 bb22520bb..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-icons_a83300_256x240.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-icons_cccccc_256x240.png b/dashboard/static/css/ui-darkness/images/ui-icons_cccccc_256x240.png deleted file mode 100644 index 571103925..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-icons_cccccc_256x240.png and /dev/null differ diff --git a/dashboard/static/css/ui-darkness/images/ui-icons_ffffff_256x240.png b/dashboard/static/css/ui-darkness/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index da11f0a12..000000000 Binary files a/dashboard/static/css/ui-darkness/images/ui-icons_ffffff_256x240.png and /dev/null differ 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

+
+