diff --git a/.gitmodules b/.gitmodules index 8b846e29..489c0de4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -19,3 +19,6 @@ [submodule "osmtm/static/js/lib/moment"] path = osmtm/static/js/lib/moment url = https://github.com/moment/moment.git +[submodule "osmtm/static/js/lib/colorselector"] + path = osmtm/static/js/lib/colorselector + url = https://github.com/flaute/bootstrap-colorselector.git diff --git a/.travis.yml b/.travis.yml index cd21b01a..7af86769 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,10 +7,15 @@ cache: - $HOME/.cache/pip - $HOME/build/hotosm/osm-tasking-manager2/env -sudo: false +dist: trusty + +addons: + postgresql: "9.3" before_install: - deactivate +- sudo apt-get install --no-install-recommends postgresql-9.3-postgis-2.3 + install: - virtualenv env diff --git a/README.md b/README.md index bc3f0055..ba31aeed 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -# OpenStreetMap Tasking Manager +# OpenStreetMap Tasking Manager v2 [](https://travis-ci.org/hotosm/osm-tasking-manager2) [](https://coveralls.io/r/hotosm/osm-tasking-manager2?branch=master) ## About -OSMTM enables collaborative work on specific areas in OpenStreetMap by defining +OpenStreetMap Tasking Manager enables collaborative work on specific areas in OpenStreetMap by defining clear workflows to be achieved and by breaking tasks down into pieces. -The application is written in Python using the Pyramid framework. +This is version 2.0 of the Tasking Manager. +**[Most development work is now taking place on version 3.0](https://github.com/hotosm/tasking-manager/)** -This is the 2.0 version of the Tasking Manager. - -See a list of Tasking Manager installations [here](http://wiki.openstreetmap.org/wiki/OSM_Tasking_Manager#Operational_installations_of_the_Tasking_Manager). +V2 Tasking Manager still powers [many Tasking Manager installations](https://wiki.openstreetmap.org/wiki/OSM_Tasking_Manager#Operational_installations_of_the_Tasking_Manager). +It is written in Python using the Pyramid framework. ## Installation @@ -33,8 +33,8 @@ To create a virtual Python environment: ### Database -OSMTM requires a PostgreSQL/PostGIS database. Version 2.x of PostGIS is -required. +OSMTM requires a PostgreSQL/PostGIS database. Version 2.3 or higher of PostGIS +is required. First create a database user/role named `www-data`: @@ -45,7 +45,7 @@ Then create a database named `osmtm`: sudo -u postgres createdb -T template0 osmtm -E UTF8 -O www-data sudo -u postgres psql -d osmtm -c "CREATE EXTENSION postgis;" -### Local settings +### Local settings You certainly will need some local specific settings, like the db user or password. For this, you can create a `local.ini` file in the project root, @@ -89,12 +89,12 @@ You need to make the following changes to the osmtm/views/osmauth.py file. import httplib2 httplib2.debuglevel = 4 PROXY = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP_NO_TUNNEL, 'PROXY-SERVER', PROXY-PORT) - -NOTE: Replace the PROXY-SERVER with your proxy server address and PROXY-PORT with the port number on which your proxy is established. - - # then add "proxy_info=PROXY" for every line in oauth.Client. + +NOTE: Replace the PROXY-SERVER with your proxy server address and PROXY-PORT with the port number on which your proxy is established. + + # then add "proxy_info=PROXY" for every line in oauth.Client. client = oauth.Client(consumer, proxy_info=PROXY) - + client = oauth.Client(consumer, token, proxy_info=PROXY) Replace the host address in the development.ini file with your IP address of the system. diff --git a/alembic/versions/11695ee852ff_add_validator_role.py b/alembic/versions/11695ee852ff_add_validator_role.py new file mode 100644 index 00000000..53a39ec0 --- /dev/null +++ b/alembic/versions/11695ee852ff_add_validator_role.py @@ -0,0 +1,28 @@ +"""Add validator role + +Revision ID: 11695ee852ff +Revises: 4fe2d91d0354 +Create Date: 2017-01-03 16:23:51.667472 + +""" + +# revision identifiers, used by Alembic. +revision = '11695ee852ff' +down_revision = '4fe2d91d0354' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + users = sa.sql.table('users', sa.sql.column('role')) + ''' Project managers are validators by default ''' + op.execute(users.update().values(role=users.c.role.op('#')(4)) + .where(users.c.role.op('&')(2)!=0)) + pass + + +def downgrade(): + users = sa.sql.table('users', sa.sql.column('role')) + op.execute(users.update().values(role=users.c.role.op('#')(4))) + pass diff --git a/alembic/versions/1bdc819ae210_adding_experienced_mapper_role.py b/alembic/versions/1bdc819ae210_adding_experienced_mapper_role.py new file mode 100644 index 00000000..8956d310 --- /dev/null +++ b/alembic/versions/1bdc819ae210_adding_experienced_mapper_role.py @@ -0,0 +1,22 @@ +"""Adding experienced mapper role + +Revision ID: 1bdc819ae210 +Revises: 4a5bf96b558d +Create Date: 2017-01-19 14:10:58.578127 + +""" + +# revision identifiers, used by Alembic. +revision = '1bdc819ae210' +down_revision = '4a5bf96b558d' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('project', sa.Column('requires_experienced_mapper_role', sa.Boolean(), nullable=True)) + + +def downgrade(): + op.drop_column('project', 'requires_experienced_mapper_role') diff --git a/alembic/versions/4a5bf96b558d_add_project_labels.py b/alembic/versions/4a5bf96b558d_add_project_labels.py new file mode 100644 index 00000000..5f6ea06c --- /dev/null +++ b/alembic/versions/4a5bf96b558d_add_project_labels.py @@ -0,0 +1,47 @@ +"""Add project labels + +Revision ID: 4a5bf96b558d +Revises: 5581aa8a3cd +Create Date: 2016-06-02 23:42:17.332659 + +""" + +# revision identifiers, used by Alembic. +revision = '4a5bf96b558d' +down_revision = '5581aa8a3cd' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.create_table( + 'label', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('name', sa.Unicode), + sa.Column('color', sa.Unicode), + ) + + + project_labels_table = op.create_table( + 'project_labels', + sa.Column('project', sa.Integer), + sa.Column('label', sa.Integer), + sa.ForeignKeyConstraint(['project'], ['project.id']), + sa.ForeignKeyConstraint(['label'], ['label.id']) + ) + + label_translation_table = op.create_table( + 'label_translation', + sa.Column('id', sa.Integer, nullable=False), + sa.Column('locale', sa.String(10), nullable=False), + sa.Column('description', sa.String), + sa.UniqueConstraint('id', 'locale'), + sa.ForeignKeyConstraint(['id'], ['label.id'], ondelete="CASCADE") + ) + + +def downgrade(): + op.drop_table('project_labels') + op.drop_table('label_translation') + op.drop_table('label') diff --git a/alembic/versions/4fe2d91d0354_update_user_roles.py b/alembic/versions/4fe2d91d0354_update_user_roles.py new file mode 100644 index 00000000..8a4c6cb0 --- /dev/null +++ b/alembic/versions/4fe2d91d0354_update_user_roles.py @@ -0,0 +1,30 @@ +"""Update user roles + +Revision ID: 4fe2d91d0354 +Revises: 5002e75c0604 +Create Date: 2017-01-03 15:24:32.395665 + +""" + +# revision identifiers, used by Alembic. +revision = '4fe2d91d0354' +down_revision = '5002e75c0604' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + users = sa.sql.table('users', sa.sql.column('role')) + ''' No null values for role ''' + op.execute(users.update().values(role=0).where(users.c.role==None)) + ''' Admins are also project managers ''' + op.execute(users.update().values(role=3).where(users.c.role==1)) + pass + + +def downgrade(): + users = sa.sql.table('users', sa.sql.column('role')) + op.execute(users.update().values(role=None).where(users.c.role==0)) + op.execute(users.update().values(role=1).where(users.c.role==3)) + pass diff --git a/alembic/versions/5581aa8a3cd_add_requires_validator_role_in_project_.py b/alembic/versions/5581aa8a3cd_add_requires_validator_role_in_project_.py new file mode 100644 index 00000000..3abe3d59 --- /dev/null +++ b/alembic/versions/5581aa8a3cd_add_requires_validator_role_in_project_.py @@ -0,0 +1,22 @@ +"""Add requires_validator_role in project table + +Revision ID: 5581aa8a3cd +Revises: 11695ee852ff +Create Date: 2017-01-10 11:18:46.081801 + +""" + +# revision identifiers, used by Alembic. +revision = '5581aa8a3cd' +down_revision = '11695ee852ff' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('project', sa.Column('requires_validator_role', sa.Boolean(), nullable=True)) + + +def downgrade(): + op.drop_column('project', 'requires_validator_role') diff --git a/osmtm/__init__.py b/osmtm/__init__.py index 37591840..5c9ffdae 100644 --- a/osmtm/__init__.py +++ b/osmtm/__init__.py @@ -1,4 +1,6 @@ import bleach +import subprocess +import os from pyramid.config import Configurator from pyramid.authentication import AuthTktAuthenticationPolicy from pyramid.authorization import ACLAuthorizationPolicy @@ -27,11 +29,19 @@ scheduler.start() +try: + version = subprocess.check_output(['git', 'describe', '--always'], + cwd=os.path.dirname(__file__)) +except Exception as e: + version = 'N/A' + + def main(global_config, **settings): """ This function returns a Pyramid WSGI application. """ settings['mako.directories'] = 'osmtm:templates' load_local_settings(settings) + settings.update({'version': version}) engine = engine_from_config(settings, 'sqlalchemy.') DBSession.configure(bind=engine) @@ -106,6 +116,9 @@ def main(global_config, **settings): config.add_route('task_validate', '/project/{project:\d+}/task/{task:\d+}/validate', xhr=True) + config.add_route('task_cancel_done', + '/project/{project:\d+}/task/{task:\d+}/cancel_done', + xhr=True) config.add_route('task_comment', '/project/{project:\d+}/task/{task:\d+}/comment', xhr=True) @@ -126,6 +139,11 @@ def main(global_config, **settings): config.add_route('task_users', '/project/{project:\d+}/task/{task:\d+}/users') + config.add_route('labels', '/labels') + config.add_route('label_new', '/label/new') + config.add_route('label_edit', '/label/{label:\d+}/edit') + config.add_route('label_delete', '/label/{label:\d+}/delete') + config.add_route('users', '/users') config.add_route('users_json', '/users.json') config.add_route('user_messages', '/user/messages') @@ -133,6 +151,9 @@ def main(global_config, **settings): config.add_route('user', '/user/{username}') config.add_route('user_admin', '/user/{id:\d+}/admin') config.add_route('user_project_manager', '/user/{id:\d+}/project_manager') + config.add_route('user_validator', '/user/{id:\d+}/validator') + config.add_route('user_experienced_mapper', + '/user/{id:\d+}/experienced_mapper') config.add_route('user_prefered_editor', '/user/prefered_editor/{editor}', xhr=True) config.add_route('user_prefered_language', diff --git a/osmtm/mako_filters.py b/osmtm/mako_filters.py index 28945b71..d89bee22 100644 --- a/osmtm/mako_filters.py +++ b/osmtm/mako_filters.py @@ -37,3 +37,16 @@ def repl(val): return re.sub(p, repl, text) return d + + +def contrast(color): + from colour import Color + '''Returns better constrast color between white and black for the given + color + ''' + color = Color(color) + if (color.red * 256 * 0.299 + color.green * 256 * 0.587 + + color.blue * 256 * 0.114) > 186: + return 'black' + else: + return 'white' diff --git a/osmtm/models.py b/osmtm/models.py index 73e886d0..5cc7dc0a 100644 --- a/osmtm/models.py +++ b/osmtm/models.py @@ -118,6 +118,8 @@ class ST_SetSRID(GenericFunction): # user roles ADMIN = 1 PROJECT_MANAGER = 2 +VALIDATOR = 4 +EXPERIENCED_MAPPER = 8 class User(Base): @@ -126,7 +128,9 @@ class User(Base): username = Column(Unicode) role_admin = ADMIN role_project_manager = PROJECT_MANAGER - role = Column(Integer) + role_validator = VALIDATOR + role_experienced_mapper = EXPERIENCED_MAPPER + role = Column(Integer, default=0) accepted_licenses = relationship("License", secondary=users_licenses_table) private_projects = relationship("Project", @@ -144,18 +148,28 @@ def __init__(self, id, username): @hybrid_property def is_admin(self): - return self.role is self.role_admin + return self.role & self.role_admin @hybrid_property def is_project_manager(self): - return self.role is self.role_project_manager + return self.role & self.role_project_manager + + @hybrid_property + def is_validator(self): + return self.role & self.role_validator + + @hybrid_property + def is_experienced_mapper(self): + return self.role & self.role_experienced_mapper def as_dict(self): return { "id": self.id, "username": self.username, "is_admin": self.is_admin, - "is_project_manager": self.is_project_manager + "is_project_manager": self.is_project_manager, + "is_validator": self.is_validator, + "is_experienced_mapper": self.is_experienced_mapper, } @@ -295,6 +309,9 @@ class Task(Base): parent_id = Column(Integer) + # Note to developers + # If you change this relationship please allow modify `get_task` method + # in `project.py` cur_lock = relationship( TaskLock, primaryjoin=lambda: and_( @@ -310,6 +327,9 @@ class Task(Base): uselist=False ) + # Note to developers + # If you change this relationship please allow modify `get_task` method + # in `project.py` cur_state = relationship( TaskState, primaryjoin=lambda: and_( @@ -476,6 +496,12 @@ def __init__(self, geometry): ) +project_labels_table = Table( + 'project_labels', Base.metadata, + Column('project', Integer, ForeignKey('project.id')), + Column('label', Integer, ForeignKey('label.id'))) + + # A project corresponds to a given mapping job to do on a given area # Example 1: trace the major roads # Example 2: trace the buildings @@ -532,6 +558,14 @@ class Project(Base, Translatable): priority_areas = relationship(PriorityArea, secondary=project_priority_areas) + # whether the validation should require the validator role or not + requires_validator_role = Column(Boolean, default=False) + + labels = relationship("Label", secondary=project_labels_table) + + # whether the validation should require the validator role or not + requires_experienced_mapper_role = Column(Boolean, default=False) + def __init__(self, name, user=None): self.name = name self.author = user @@ -724,6 +758,25 @@ def __init__(self, subject, from_, to, message): self.message = message +class Label(Base, Translatable): + __tablename__ = 'label' + id = Column(Integer, primary_key=True) + name = Column(Unicode, nullable=False) + color = Column(Unicode) + projects = relationship("Project", secondary=project_labels_table) + + locale = 'en' + + def __init__(self): + pass + + +class LabelTranslation(translation_base(Label)): + __tablename__ = 'label_translation' + + description = Column(Unicode, default=u'') + + class ExtendedJSONEncoder(JSONEncoder): def default(self, obj): # pragma: no cover diff --git a/osmtm/scripts/initializedb.py b/osmtm/scripts/initializedb.py index 0922a8c6..caceee5f 100644 --- a/osmtm/scripts/initializedb.py +++ b/osmtm/scripts/initializedb.py @@ -2,7 +2,7 @@ import transaction -from sqlalchemy import engine_from_config, func +from sqlalchemy import engine_from_config from pyramid.paster import ( @@ -14,7 +14,6 @@ DBSession, Area, Project, - Task, License, Base, ) @@ -45,14 +44,6 @@ def main(): }) configure_mappers() - postgis_version = DBSession.execute(func.postgis_version()).scalar() - if not postgis_version.startswith('2.'): - # With PostGIS 1.x the AddGeometryColumn and DropGeometryColumn - # management functions should be used. - Area.__table__.c.geometry.type.management = True - Area.__table__.c.centroid.type.management = True - Task.__table__.c.geometry.type.management = True - Base.metadata.drop_all(engine) Base.metadata.create_all(engine) diff --git a/osmtm/static/css/bootstrap.less b/osmtm/static/css/bootstrap.less index 41de652b..9f5f6d3a 100644 --- a/osmtm/static/css/bootstrap.less +++ b/osmtm/static/css/bootstrap.less @@ -25,7 +25,7 @@ /* @import "../bootstrap/less/breadcrumbs.less"; */ /* @import "../bootstrap/less/pagination.less"; */ /* @import "../bootstrap/less/pager.less"; */ -/* @import "../bootstrap/less/labels.less"; */ +@import "../bootstrap/less/labels.less"; @import "../bootstrap/less/badges.less"; /* @import "../bootstrap/less/jumbotron.less"; */ /*@import "../bootstrap/less/thumbnails.less";*/ diff --git a/osmtm/static/css/main.css b/osmtm/static/css/main.css index 31c6afbf..5fa25679 100644 --- a/osmtm/static/css/main.css +++ b/osmtm/static/css/main.css @@ -1,8 +1,8 @@ @import "../js/lib/At.js/css/jquery.atwho.css"; .navbar-default { - background-image: -webkit-linear-gradient(top, #9b0d0b 0%, #b4242e 100%); - background-image: -o-linear-gradient(top, #9b0d0b 0%, #b4242e 100%); - background-image: linear-gradient(to bottom, #9b0d0b 0%, #b4242e 100%); + background-image: -webkit-linear-gradient(top, #9B0D0B 0%, #B4242E 100%); + background-image: -o-linear-gradient(top, #9B0D0B 0%, #B4242E 100%); + background-image: linear-gradient(to bottom, #9B0D0B 0%, #B4242E 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9b0d0b', endColorstr='#ffb4242e', GradientType=0); } @@ -205,7 +205,7 @@ body { font-size: 14px; line-height: 1.42857143; color: #333333; - background-color: #ffffff; + background-color: #fff; } input, button, @@ -246,8 +246,8 @@ img { .img-thumbnail { padding: 4px; line-height: 1.42857143; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; @@ -659,8 +659,8 @@ code { kbd { padding: 2px 4px; font-size: 90%; - color: #ffffff; - background-color: #333333; + color: #fff; + background-color: #333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } @@ -680,7 +680,7 @@ pre { word-wrap: break-word; color: #333333; background-color: #f5f5f5; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; } pre code { @@ -1388,11 +1388,11 @@ th { padding: 8px; line-height: 1.42857143; vertical-align: top; - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid #dddddd; + border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, @@ -1403,10 +1403,10 @@ th { border-top: 0; } .table > tbody + tbody { - border-top: 2px solid #dddddd; + border-top: 2px solid #ddd; } .table .table { - background-color: #ffffff; + background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, @@ -1417,7 +1417,7 @@ th { padding: 5px; } .table-bordered { - border: 1px solid #dddddd; + border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, @@ -1425,7 +1425,7 @@ th { .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; + border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { @@ -1563,7 +1563,7 @@ table th[class*="col-"] { margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #dddddd; + border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; @@ -1669,15 +1669,15 @@ output { font-size: 14px; line-height: 1.42857143; color: #555555; - background-color: #ffffff; + background-color: #fff; background-image: none; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; @@ -1687,19 +1687,19 @@ output { outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6) 1px 2px 2px #CCC; } .form-control::-moz-placeholder { - color: #999999; + color: #999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #999999; + color: #999; } .form-control::-webkit-input-placeholder { - color: #999999; + color: #999; } .form-control::-ms-expand { border: 0; @@ -1947,17 +1947,17 @@ select[multiple].input-lg { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168 1px 2px 2px #CCC; } .has-success .input-group-addon { color: #3c763d; @@ -1983,17 +1983,17 @@ select[multiple].input-lg { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b 1px 2px 2px #CCC; } .has-warning .input-group-addon { color: #8a6d3b; @@ -2019,17 +2019,17 @@ select[multiple].input-lg { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075) 1px 2px 2px #CCC; } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483 1px 2px 2px #CCC; } .has-error .input-group-addon { color: #a94442; @@ -2172,7 +2172,7 @@ select[multiple].input-lg { .btn:hover, .btn:focus, .btn.focus { - color: #333333; + color: #333; text-decoration: none; } .btn:active, @@ -2181,9 +2181,9 @@ select[multiple].input-lg { background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #cccccc; - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #CCC; + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #CCC; } .btn.disabled, .btn[disabled], @@ -2193,34 +2193,34 @@ fieldset[disabled] .btn { filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; - -webkit-box-shadow: none 1px 2px 2px #cccccc; - -moz-box-shadow: none 1px 2px 2px #cccccc; - box-shadow: none 1px 2px 2px #cccccc; + -webkit-box-shadow: none 1px 2px 2px #CCC; + -moz-box-shadow: none 1px 2px 2px #CCC; + box-shadow: none 1px 2px 2px #CCC; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; + color: #333; + background-color: #fff; + border-color: #ccc; } .btn-default:focus, .btn-default.focus { - color: #333333; + color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { - color: #333333; + color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { - color: #333333; + color: #333; background-color: #e6e6e6; border-color: #adadad; } @@ -2233,7 +2233,7 @@ fieldset[disabled] a.btn { .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { - color: #333333; + color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } @@ -2251,33 +2251,33 @@ fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { - background-color: #ffffff; - border-color: #cccccc; + background-color: #fff; + border-color: #ccc; } .btn-default .badge { - color: #ffffff; - background-color: #333333; + color: #fff; + background-color: #333; } .btn-primary { - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { - color: #ffffff; + color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { - color: #ffffff; + color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { - color: #ffffff; + color: #fff; background-color: #286090; border-color: #204d74; } @@ -2290,7 +2290,7 @@ fieldset[disabled] .btn-default.focus { .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { - color: #ffffff; + color: #fff; background-color: #204d74; border-color: #122b40; } @@ -2313,28 +2313,28 @@ fieldset[disabled] .btn-primary.focus { } .btn-primary .badge { color: #337ab7; - background-color: #ffffff; + background-color: #fff; } .btn-success { - color: #ffffff; + color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { - color: #ffffff; + color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { - color: #ffffff; + color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { - color: #ffffff; + color: #fff; background-color: #449d44; border-color: #398439; } @@ -2347,7 +2347,7 @@ fieldset[disabled] .btn-primary.focus { .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { - color: #ffffff; + color: #fff; background-color: #398439; border-color: #255625; } @@ -2370,28 +2370,28 @@ fieldset[disabled] .btn-success.focus { } .btn-success .badge { color: #5cb85c; - background-color: #ffffff; + background-color: #fff; } .btn-info { - color: #ffffff; + color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { - color: #ffffff; + color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { - color: #ffffff; + color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { - color: #ffffff; + color: #fff; background-color: #31b0d5; border-color: #269abc; } @@ -2404,7 +2404,7 @@ fieldset[disabled] .btn-success.focus { .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { - color: #ffffff; + color: #fff; background-color: #269abc; border-color: #1b6d85; } @@ -2427,28 +2427,28 @@ fieldset[disabled] .btn-info.focus { } .btn-info .badge { color: #5bc0de; - background-color: #ffffff; + background-color: #fff; } .btn-warning { - color: #ffffff; + color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { - color: #ffffff; + color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { - color: #ffffff; + color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { - color: #ffffff; + color: #fff; background-color: #ec971f; border-color: #d58512; } @@ -2461,7 +2461,7 @@ fieldset[disabled] .btn-info.focus { .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { - color: #ffffff; + color: #fff; background-color: #d58512; border-color: #985f0d; } @@ -2484,28 +2484,28 @@ fieldset[disabled] .btn-warning.focus { } .btn-warning .badge { color: #f0ad4e; - background-color: #ffffff; + background-color: #fff; } .btn-danger { - color: #ffffff; + color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { - color: #ffffff; + color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { - color: #ffffff; + color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { - color: #ffffff; + color: #fff; background-color: #c9302c; border-color: #ac2925; } @@ -2518,7 +2518,7 @@ fieldset[disabled] .btn-warning.focus { .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { - color: #ffffff; + color: #fff; background-color: #ac2925; border-color: #761c19; } @@ -2541,7 +2541,7 @@ fieldset[disabled] .btn-danger.focus { } .btn-danger .badge { color: #d9534f; - background-color: #ffffff; + background-color: #fff; } .btn-link { color: #337ab7; @@ -2556,9 +2556,9 @@ fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; - -webkit-box-shadow: none 1px 2px 2px #cccccc; - -moz-box-shadow: none 1px 2px 2px #cccccc; - box-shadow: none 1px 2px 2px #cccccc; + -webkit-box-shadow: none 1px 2px 2px #CCC; + -moz-box-shadow: none 1px 2px 2px #CCC; + box-shadow: none 1px 2px 2px #CCC; } .btn-link, .btn-link:hover, @@ -3480,15 +3480,15 @@ span.twitter-typeahead .tt-dropdown-menu { list-style: none; font-size: 14px; text-align: left; - background-color: #ffffff; - border: 1px solid #cccccc; + background-color: #fff; + border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) 1px 2px 2px #cccccc; - -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) 1px 2px 2px #cccccc; - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) 1px 2px 2px #cccccc; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) 1px 2px 2px #CCC; + -moz-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) 1px 2px 2px #CCC; + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175) 1px 2px 2px #CCC; background-clip: padding-box; } .dropdown-menu.pull-right { @@ -3683,16 +3683,16 @@ span.twitter-typeahead .tt-suggestion:focus { .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #cccccc; - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #CCC; + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125) 1px 2px 2px #CCC; } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; - -webkit-box-shadow: none 1px 2px 2px #cccccc; - -moz-box-shadow: none 1px 2px 2px #cccccc; - box-shadow: none 1px 2px 2px #cccccc; + -webkit-box-shadow: none 1px 2px 2px #CCC; + -moz-box-shadow: none 1px 2px 2px #CCC; + box-shadow: none 1px 2px 2px #CCC; } .btn .caret { margin-left: 0; @@ -3867,7 +3867,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #555555; text-align: center; background-color: #eeeeee; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { @@ -3980,7 +3980,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { max-width: none; } .nav-tabs { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; @@ -3993,14 +3993,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; + border-color: #eeeeee #eeeeee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } @@ -4035,17 +4035,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; + border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; + border-bottom-color: #fff; } } .nav-pills > li { @@ -4060,7 +4060,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #ffffff; + color: #fff; background-color: #337ab7; } .nav-stacked > li { @@ -4103,17 +4103,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #dddddd; + border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; + border-bottom-color: #fff; } } .tab-content > .tab-pane { @@ -4333,9 +4333,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1) 1px 2px 2px #CCC; margin-top: 8px; margin-bottom: 8px; } @@ -4407,9 +4407,9 @@ select[multiple].input-group-sm > .input-group-btn > .btn { padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; - -webkit-box-shadow: none 1px 2px 2px #cccccc; - -moz-box-shadow: none 1px 2px 2px #cccccc; - box-shadow: none 1px 2px 2px #cccccc; + -webkit-box-shadow: none 1px 2px 2px #CCC; + -moz-box-shadow: none 1px 2px 2px #CCC; + box-shadow: none 1px 2px 2px #CCC; } } .navbar-nav > li > .dropdown-menu { @@ -4464,7 +4464,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-color: #e7e7e7; } .navbar-default .navbar-brand { - color: #ffffff; + color: white; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { @@ -4472,37 +4472,37 @@ select[multiple].input-group-sm > .input-group-btn > .btn { background-color: transparent; } .navbar-default .navbar-text { - color: #ffffff; + color: white; } .navbar-default .navbar-nav > li > a { - color: #ffffff; + color: white; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333333; + color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #df8783; + color: #555; + background-color: #DF8783; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; + color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { - border-color: #dddddd; + border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #dddddd; + background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { - background-color: #888888; + background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { @@ -4511,52 +4511,52 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - background-color: #df8783; - color: #555555; + background-color: #DF8783; + color: #555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #ffffff; + color: white; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; + color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #df8783; + color: #555; + background-color: #DF8783; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; + color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { - color: #ffffff; + color: white; } .navbar-default .navbar-link:hover { - color: #333333; + color: #333; } .navbar-default .btn-link { - color: #ffffff; + color: white; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333333; + color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; + color: #ccc; } .navbar-inverse { - background-color: #222222; + background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { @@ -4564,7 +4564,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { @@ -4575,30 +4575,30 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; + color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { - border-color: #333333; + border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333333; + background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; + background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { @@ -4608,7 +4608,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; - color: #ffffff; + color: #fff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { @@ -4622,19 +4622,19 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; + color: #444; background-color: transparent; } } @@ -4642,32 +4642,98 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { - color: #ffffff; + color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #ffffff; + color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444444; + color: #444; } /* @import "../bootstrap/less/breadcrumbs.less"; */ /* @import "../bootstrap/less/pagination.less"; */ /* @import "../bootstrap/less/pager.less"; */ -/* @import "../bootstrap/less/labels.less"; */ +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; - color: #ffffff; + color: #fff; line-height: 1; vertical-align: middle; white-space: nowrap; @@ -4689,14 +4755,14 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } a.badge:hover, a.badge:focus { - color: #ffffff; + color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; - background-color: #ffffff; + background-color: #fff; } .list-group-item > .badge { float: right; @@ -4808,9 +4874,9 @@ a.badge:focus { border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1) 1px 2px 2px #CCC; } .progress-bar { float: left; @@ -4818,14 +4884,14 @@ a.badge:focus { height: 100%; font-size: 12px; line-height: 20px; - color: #ffffff; + color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15) 1px 2px 2px #cccccc; - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15) 1px 2px 2px #CCC; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15) 1px 2px 2px #CCC; -webkit-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; @@ -4885,8 +4951,8 @@ a.badge:focus { display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; } .list-group-item:first-child { border-top-right-radius: 4px; @@ -4899,18 +4965,18 @@ a.badge:focus { } a.list-group-item, button.list-group-item { - color: #555555; + color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { - color: #333333; + color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; - color: #555555; + color: #555; background-color: #f5f5f5; } button.list-group-item { @@ -4938,7 +5004,7 @@ button.list-group-item { .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #337ab7; } @@ -5084,14 +5150,14 @@ button.list-group-item-danger.active:focus { } .panel { margin-bottom: 20px; - background-color: #ffffff; + background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #cccccc; - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #cccccc; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #cccccc; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #CCC; + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #CCC; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #CCC; } .panel-body { padding: 15px; @@ -5121,7 +5187,7 @@ button.list-group-item-danger.active:focus { .panel-footer { padding: 10px 15px; background-color: #f5f5f5; - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } @@ -5235,7 +5301,7 @@ button.list-group-item-danger.active:focus { .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { @@ -5312,37 +5378,37 @@ button.list-group-item-danger.active:focus { } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; } .panel-default { - border-color: #dddddd; + border-color: #ddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; - border-color: #dddddd; + border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #dddddd; + border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #dddddd; + border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #337ab7; } @@ -5351,7 +5417,7 @@ button.list-group-item-danger.active:focus { } .panel-primary > .panel-heading .badge { color: #337ab7; - background-color: #ffffff; + background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; @@ -5437,9 +5503,9 @@ button.list-group-item-danger.active:focus { border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #cccccc; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #cccccc; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #CCC; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #CCC; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05) 1px 2px 2px #CCC; } .well blockquote { border-color: #ddd; @@ -5458,14 +5524,14 @@ button.list-group-item-danger.active:focus { font-size: 21px; font-weight: bold; line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; + color: #000; + text-shadow: 0 1px 0 #fff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { - color: #000000; + color: #000; text-decoration: none; cursor: pointer; opacity: 0.5; @@ -5520,15 +5586,15 @@ button.close { } .modal-content { position: relative; - background-color: #ffffff; - border: 1px solid #999999; + background-color: #fff; + border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5) 1px 2px 2px #cccccc; - -moz-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5) 1px 2px 2px #cccccc; - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5) 1px 2px 2px #cccccc; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5) 1px 2px 2px #CCC; + -moz-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5) 1px 2px 2px #CCC; + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5) 1px 2px 2px #CCC; background-clip: padding-box; outline: 0; } @@ -5539,7 +5605,7 @@ button.close { bottom: 0; left: 0; z-index: 1040; - background-color: #000000; + background-color: #000; } .modal-backdrop.fade { opacity: 0; @@ -5594,9 +5660,9 @@ button.close { .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) 1px 2px 2px #cccccc; - -moz-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) 1px 2px 2px #cccccc; - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) 1px 2px 2px #cccccc; + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) 1px 2px 2px #CCC; + -moz-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) 1px 2px 2px #CCC; + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5) 1px 2px 2px #CCC; } .modal-sm { width: 300px; @@ -5653,9 +5719,9 @@ button.close { .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #ffffff; + color: #fff; text-align: center; - background-color: #000000; + background-color: #000; border-radius: 4px; } .tooltip-arrow { @@ -5670,56 +5736,56 @@ button.close { left: 50%; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: #000000; + border-top-color: #000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000000; + border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000000; + border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: #000000; + border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: #000000; + border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: #000000; + border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000000; + border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000000; + border-bottom-color: #000; } .popover { position: absolute; @@ -5745,16 +5811,16 @@ button.close { word-spacing: normal; word-wrap: normal; font-size: 14px; - background-color: #ffffff; + background-color: #fff; background-clip: padding-box; - border: 1px solid #cccccc; + border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2) 1px 2px 2px #cccccc; - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2) 1px 2px 2px #cccccc; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2) 1px 2px 2px #cccccc; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2) 1px 2px 2px #CCC; + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2) 1px 2px 2px #CCC; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2) 1px 2px 2px #CCC; } .popover.top { margin-top: -10px; @@ -5808,7 +5874,7 @@ button.close { bottom: 1px; margin-left: -10px; border-bottom-width: 0; - border-top-color: #ffffff; + border-top-color: #fff; } .popover.right > .arrow { top: 50%; @@ -5823,7 +5889,7 @@ button.close { left: 1px; bottom: -10px; border-left-width: 0; - border-right-color: #ffffff; + border-right-color: #fff; } .popover.bottom > .arrow { left: 50%; @@ -5838,7 +5904,7 @@ button.close { top: 1px; margin-left: -10px; border-top-width: 0; - border-bottom-color: #ffffff; + border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; @@ -5852,7 +5918,7 @@ button.close { content: " "; right: 1px; border-right-width: 0; - border-left-color: #ffffff; + border-left-color: #fff; bottom: -10px; } /* @import "../bootstrap/less/carousel.less"; */ @@ -6255,10 +6321,9 @@ h1 { #home .archived, #home .draft { background: url(../img/closed_back.gif) transparent; - border-color: #efefef; } -#home .archived a, -#home .draft a { +#home .archived h4 a, +#home .draft h4 a { color: grey; } #home ul.project-stats { @@ -6722,3 +6787,25 @@ h1 { .popover.unread .popover-content { white-space: nowrap; } +.flip-horizontal { + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; +} +.list-underline > li:first-child { + border-top: 1px solid #dfdfdf; +} +.list-underline > li { + padding-top: 5px; + padding-bottom: 5px; + border-bottom: 1px solid #dfdfdf; +} +.navbar-no-margin { + margin: 0; +} +.dropdown-colorselector > .dropdown-menu { + min-width: 226px !important; +} diff --git a/osmtm/static/css/main.less b/osmtm/static/css/main.less index fc269f98..34a13773 100644 --- a/osmtm/static/css/main.less +++ b/osmtm/static/css/main.less @@ -91,9 +91,8 @@ h1 { } .archived, .draft { background: url(../img/closed_back.gif) transparent; - border-color: #efefef; - a { + h4 a { color: grey; } } @@ -583,3 +582,31 @@ h1 { .popover.unread .popover-content { white-space: nowrap; } + +.flip-horizontal { + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; +} + +.list-underline { + > li:first-child { + border-top: 1px solid #dfdfdf; + } + > li { + padding-top: @padding-small-vertical; + padding-bottom: @padding-small-vertical; + border-bottom: 1px solid #dfdfdf; + } +} + +.navbar-no-margin { + margin: 0; +} + +.dropdown-colorselector>.dropdown-menu { + min-width: 226px !important; +} diff --git a/osmtm/static/js/lib/colorselector b/osmtm/static/js/lib/colorselector new file mode 160000 index 00000000..c8ad850a --- /dev/null +++ b/osmtm/static/js/lib/colorselector @@ -0,0 +1 @@ +Subproject commit c8ad850a2f93543a8af1652c701b269332d2362d diff --git a/osmtm/static/js/project.edit.js b/osmtm/static/js/project.edit.js index 42869b79..6b732f9d 100644 --- a/osmtm/static/js/project.edit.js +++ b/osmtm/static/js/project.edit.js @@ -2,56 +2,40 @@ $(document).ready(function() { $('.nav-tabs a:first').tab('show'); $('.nav.languages li:first-of-type a').tab('show'); $('.input-group.date').datepicker({language: locale_name}); - var substringMatcher = function(strs) { - return function findMatches(q, cb) { - var matches, substrRegex; - // an array that will be populated with substring matches - matches = []; - - // regex used to determine if a string contains the substring `q` - substrRegex = new RegExp(q, 'i'); - - // iterate through the pool of strings and for any string that - // contains the substring `q`, add it to the `matches` array - $.each(strs, function(i, str) { - if (substrRegex.test(str)) { - // the typeahead jQuery plugin expects suggestions to a - // JavaScript object, refer to typeahead docs for more info - matches.push({ value: str }); - } - }); - - cb(matches); - }; - }; + var users = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.whitespace, + queryTokenizer: Bloodhound.tokenizers.whitespace, + local: [], + remote: { + url: base_url + 'users.json?q=%QUERY', + wildcard: '%QUERY' + } + }); - $.getJSON(base_url + 'users.json', function(users) { - $('#adduser').typeahead({ - hint: true, - highlight: true, - minLength: 1 + $('#adduser').typeahead({ + hint: true, + highlight: true, + minLength: 1 + }, + { + name: 'states', + limit: 40, + source: users + }).on({ + 'typeahead:selected': function(e, suggestion, name) { + window.setTimeout(function() { + $('#do_add_user').removeClass('disabled'); + }, 200); }, - { - name: 'states', - displayKey: 'value', - source: substringMatcher(users), - limit: 40 - }).on({ - 'typeahead:selected': function(e, suggestion, name) { - window.setTimeout(function() { - $('#do_add_user').removeClass('disabled'); - }, 200); - }, - 'typeahead:autocompleted': function(e, suggestion, name) { - window.setTimeout(function() { - $('#do_add_user').removeClass('disabled'); - }, 200); - }, - 'keyup': function(e) { - $('#do_add_user').addClass('disabled'); - } - }); + 'typeahead:autocompleted': function(e, suggestion, name) { + window.setTimeout(function() { + $('#do_add_user').removeClass('disabled'); + }, 200); + }, + 'keyup': function(e) { + $('#do_add_user').addClass('disabled'); + } }); }); diff --git a/osmtm/static/js/project.js b/osmtm/static/js/project.js index d4b6dc4c..2468cd65 100644 --- a/osmtm/static/js/project.js +++ b/osmtm/static/js/project.js @@ -542,7 +542,7 @@ osmtm.project = (function() { function setPreferedEditor() { if (osmtm.prefered_editor !== '') { $('#prefered_editor').text($('#' + osmtm.prefered_editor + ' a').text()); - $('#josm_task_boundary_tip').toggle(osmtm.prefered_editor == 'josm'); + // $('#josm_task_boundary_tip').toggle(osmtm.prefered_editor == 'josm'); } } diff --git a/osmtm/templates/about.mako b/osmtm/templates/about.mako index 62272d2d..12f3c08d 100644 --- a/osmtm/templates/about.mako +++ b/osmtm/templates/about.mako @@ -14,7 +14,7 @@
${_('OSM Tasking Manager was designed and built for the Humanitarian OpenStreetMap Team.') |n}
-
+
${_('With the invaluable help from:') | n}
-
-
-
-
-
+
+
+
+
+
' + txt + '
' - except: - vertxt = '' -%> - ${vertxt |n} ++ ${request.registry.settings['version']} +