diff --git a/server/.settings/org.eclipse.core.resources.prefs b/server/.settings/org.eclipse.core.resources.prefs index cb447b9cc..9ca7cb3c5 100644 --- a/server/.settings/org.eclipse.core.resources.prefs +++ b/server/.settings/org.eclipse.core.resources.prefs @@ -16,7 +16,7 @@ encoding//src/uds/REST/methods/networks.py=utf-8 encoding//src/uds/REST/methods/osmanagers.py=utf-8 encoding//src/uds/REST/methods/providers.py=utf-8 encoding//src/uds/REST/methods/transports.py=utf-8 -encoding//src/uds/REST/methods/users.py=utf-8 +encoding//src/uds/REST/methods/users_groups.py=utf-8 encoding//src/uds/REST/mixins.py=utf-8 encoding//src/uds/REST/processors.py=utf-8 encoding//src/uds/__init__.py=utf-8 diff --git a/server/src/uds/REST/methods/authenticators.py b/server/src/uds/REST/methods/authenticators.py index a6dc3529e..5d22764d7 100644 --- a/server/src/uds/REST/methods/authenticators.py +++ b/server/src/uds/REST/methods/authenticators.py @@ -37,7 +37,7 @@ from uds.models import Authenticator from uds.core import auths -from users import Users +from users_groups import Users, Groups from uds.REST import Handler, NotFound from uds.REST.mixins import ModelHandlerMixin, ModelTypeHandlerMixin, ModelTableHandlerMixin @@ -49,7 +49,7 @@ logger = logging.getLogger(__name__) class Authenticators(ModelHandlerMixin, Handler): model = Authenticator - detail = { 'users': Users } + detail = { 'users': Users, 'groups':Groups } def item_as_dict(self, auth): type_ = auth.getType() @@ -75,7 +75,7 @@ class Types(ModelTypeHandlerMixin, Handler): class TableInfo(ModelTableHandlerMixin, Handler): path = 'authenticators' - detail = { 'users': Users } + detail = { 'users': Users, 'groups':Groups } title = _('Current authenticators') fields = [ diff --git a/server/src/uds/REST/methods/users.py b/server/src/uds/REST/methods/users_groups.py similarity index 75% rename from server/src/uds/REST/methods/users.py rename to server/src/uds/REST/methods/users_groups.py index 361b21384..cfdbd5512 100644 --- a/server/src/uds/REST/methods/users.py +++ b/server/src/uds/REST/methods/users_groups.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- - # # Copyright (c) 2014 Virtual Cable S.L. # All rights reserved. @@ -38,6 +37,7 @@ from uds.core.util.State import State from uds.models import Authenticator +from uds.REST.handlers import HandlerError from uds.REST.mixins import DetailHandler import logging @@ -49,9 +49,6 @@ logger = logging.getLogger(__name__) class Users(DetailHandler): def get(self): - logger.debug(self._parent) - logger.debug(self._kwargs) - # Extract authenticator auth = self._kwargs['parent'] @@ -79,4 +76,30 @@ class Users(DetailHandler): { 'last_access': { 'title': _('Last access'), 'type': 'datetime' } }, ] - \ No newline at end of file +class Groups(DetailHandler): + def get(self): + # Extract authenticator + auth = self._kwargs['parent'] + + try: + if len(self._args) == 0: + return list(auth.groups.all().values('id','name', 'comments','state','is_meta')) + else: + return auth.get(pk=self._args[0]).values('id','name', 'comments','state','is_meta') + except: + logger.exception('REST groups') + raise HandlerError('exception') + + def getTitle(self): + try: + return _('Groups of {0}').format(Authenticator.objects.get(pk=self._kwargs['parent_id']).name) + except: + return _('Current groups') + + def getFields(self): + return [ + { 'name': {'title': _('User Id'), 'visible': True, 'type': 'icon', 'icon': 'fa fa-group text-success' } }, + { 'comments': { 'title': _('Comments') } }, + { 'state': { 'title': _('state'), 'type': 'dict', 'dict': State.dictionary() } }, + ] + \ No newline at end of file diff --git a/server/src/uds/REST/mixins.py b/server/src/uds/REST/mixins.py index 581a63c86..5b5092a76 100644 --- a/server/src/uds/REST/mixins.py +++ b/server/src/uds/REST/mixins.py @@ -146,7 +146,7 @@ class ModelTypeHandlerMixin(object): if self._args[1] == 'gui': gui = self.getGui(self._args[0]) # Add name default description, at top of form - gui.insert(0, { + gui.append({ 'name': 'name', 'value':'', 'gui': { @@ -159,11 +159,11 @@ class ModelTypeHandlerMixin(object): 'tooltip': _('Name of this element'), 'rdonly': False, 'type': 'text', - 'order': 1 + 'order': -2 } }) # And comments - gui.insert(1, { + gui.append({ 'name': 'comments', 'value':'', 'gui': { @@ -176,12 +176,14 @@ class ModelTypeHandlerMixin(object): 'tooltip': _('Comments for this element'), 'rdonly': False, 'type': 'text', - 'order': 1 + 'order': -1 } }) + + logger.debug("GUI: {0}".format(gui)) - return gui + return sorted(gui, key=lambda f: f['gui']['order']); class ModelTableHandlerMixin(object): diff --git a/server/src/uds/static/adm/css/uds-admin.css b/server/src/uds/static/adm/css/uds-admin.css index 907493ca6..32af4fd0b 100644 --- a/server/src/uds/static/adm/css/uds-admin.css +++ b/server/src/uds/static/adm/css/uds-admin.css @@ -36,7 +36,7 @@ body { display: none; } -/* chevrons for collapsable pannels */ +/* collapsable && closeable pannels */ .chevron:before { content: "\f139"; } @@ -48,6 +48,10 @@ body { cursor: pointer; } +#minimized { + margin-top: 0.6em; + margin-bottom: 0.3em; +} /* Edit Below to Customize Widths > 768px */ @media (min-width:768px) { diff --git a/server/src/uds/static/adm/js/api-templates.js b/server/src/uds/static/adm/js/api-templates.js index 8cada6096..207391726 100644 --- a/server/src/uds/static/adm/js/api-templates.js +++ b/server/src/uds/static/adm/js/api-templates.js @@ -19,6 +19,7 @@ return; // Let's check if a "preloaded template" exists } else if( document.getElementById('tmpl_' + name) ) { + $this.cache.put(name, 'tmpl_' + name); // In fact, this is not neccesary... success_fnc('tmpl_' + name); return; } @@ -28,7 +29,7 @@ type : "GET", dataType : "text", success : function(data) { - var cachedId = name; + var cachedId = 'tmpl_' + name; $this.cache.put('_' + cachedId, $this.evaluate(data)); $this.cache.put(name, cachedId); api.doLog('Success getting template "' + name + '".'); diff --git a/server/src/uds/static/adm/js/gui-elements.js b/server/src/uds/static/adm/js/gui-elements.js index 1dc8b1a08..a93c77448 100644 --- a/server/src/uds/static/adm/js/gui-elements.js +++ b/server/src/uds/static/adm/js/gui-elements.js @@ -37,7 +37,13 @@ gui.providers.link = function(event) { onEdit: function(value, event, table) { gui.providers.rest.gui(value.type, { success: function(data){ - gui.fields(data); + var form = gui.fields(data); + gui.appendToWorkspace(gui.modal('edit_modal', gettext('Edit service provider'), form)); + $('#edit_modal').modal() + .on('hidden.bs.modal', function () { + $('#edit_modal').remove(); + }) +; }, }); }, @@ -59,7 +65,8 @@ gui.authenticators.link = function(event) { gui.clearWorkspace(); gui.appendToWorkspace(api.templates.evaluate(tmpl, { auths : 'auths-placeholder', - users : 'users-placeholder' + users : 'users-placeholder', + groups: 'groups-placeholder', })); gui.setLinksEvents(); @@ -71,6 +78,15 @@ gui.authenticators.link = function(event) { api.tools.blockUI(); var id = selected[0].id; var user = new GuiElement(api.authenticators.detail(id, 'users'), 'users'); + var group = new GuiElement(api.authenticators.detail(id, 'groups'), 'groups'); + group.table({ + container : 'groups-placeholder', + rowSelect : 'multi', + buttons : [ 'edit', 'delete', 'xls' ], + onLoad: function(k) { + api.tools.unblockUI(); + }, + }); user.table({ container : 'users-placeholder', rowSelect : 'multi', @@ -85,6 +101,19 @@ gui.authenticators.link = function(event) { onRefresh : function() { $('#users-placeholder').empty(); // Remove detail on parent refresh }, + onEdit: function(value, event, table) { + gui.authenticators.rest.gui(value.type, { + success: function(data){ + var form = gui.fields(data); + gui.appendToWorkspace(gui.modal('edit_modal', gettext('Edit authenticator'), form)); + $('#edit_modal').modal() + .on('hidden.bs.modal', function () { + $('#edit_modal').remove(); + }) + ; + }, + }); + }, }); }); diff --git a/server/src/uds/static/adm/js/gui-fields.js b/server/src/uds/static/adm/js/gui-fields.js index 66c91ee88..a547e252b 100644 --- a/server/src/uds/static/adm/js/gui-fields.js +++ b/server/src/uds/static/adm/js/gui-fields.js @@ -4,41 +4,28 @@ // Returns a form that will manage a gui description (new or edit) gui.fields = function(item_description) { - $.each(item_description, function(index, field){ - gui.doLog(field); + var form = '
'; + // item_description is expected to have fields sorted by .gui.order (REST api returns them sorted) + $.each(item_description, function(index, f){ + + gui.doLog(f); + var editing = false; // Locate real Editing + form += api.templates.evaluate('tmpl_fld_'+f.gui.type, { + value: f.value || f.gui.value || f.gui.defvalue, // If no value present, use default value + values: f.gui.values, + label: f.gui.label, + length: f.gui.length, + multiline: f.gui.multiline, + rdonly: editing ? f.gui.rdonly : false, // rdonly applies just to editing + required: f.gui.required, + tooltip: f.gui.tooltip, + type: f.gui.type, + name: f.name, + }); }); + form += '
'; + return form; }; - gui.fields.config = { - text: { - css: 'form-control' - - }, - textbox: { - css: 'form-control' - }, - numeric: { - css: 'form-control' - }, - password: { - css: 'form-control' - }, - hidden: { - css: '' - }, - choice: { - css: '' - }, - multichoice: { - css: '' - }, - editlist: { - css: '' - }, - checkbox: { - css: 'form-control' - }, - }; - }(window.gui = window.gui || {}, jQuery)); diff --git a/server/src/uds/static/adm/js/gui.js b/server/src/uds/static/adm/js/gui.js index 19cad9e68..bbf68ae4f 100644 --- a/server/src/uds/static/adm/js/gui.js +++ b/server/src/uds/static/adm/js/gui.js @@ -84,13 +84,34 @@ return '
"; }; + + gui.minimizePanel = function(panelId) { + var title = $(panelId).attr('data-minimized'); + $(panelId).hide('slow', function(){ + $(' ' + title + '') + .appendTo('#minimized') + .click(function(){ + this.remove(); + $(panelId).show('slow'); + }); + }); + }; + gui.modal = function(id, title, content) { + return api.templates.evaluate('tmpl_modal', { + id: id, + title: title, + content: content + }); + }; + gui.clearWorkspace = function() { - $('#page-wrapper').empty(); + $('#content').empty(); + $('#minimized').empty(); }; gui.appendToWorkspace = function(data) { - $(data).appendTo('#page-wrapper'); + $(data).appendTo('#content'); }; // Links methods @@ -333,6 +354,7 @@ GuiElement.prototype = { $this.rest.get({ success : function(data) { + var refreshFnc; var table = gui.table(title, tableId); if (options.container === undefined) { gui.appendToWorkspace('
' + table.text + '
'); @@ -376,7 +398,7 @@ GuiElement.prototype = { // What execute on refresh button push var onRefresh = options.onRefresh || function(){}; - var refreshFnc = function() { + refreshFnc = function() { // Refreshes table content var tbl = $('#' + tableId).dataTable(); // Clears selection first diff --git a/server/src/uds/static/css/font-awesome.css b/server/src/uds/static/css/font-awesome.css index 6cc0626bc..048cff973 100644 --- a/server/src/uds/static/css/font-awesome.css +++ b/server/src/uds/static/css/font-awesome.css @@ -1,34 +1,13 @@ /*! - * Font Awesome 4.0.0 - * the iconic font designed for Bootstrap - * ------------------------------------------------------------------------------ - * The full suite of pictographic icons, examples, and documentation can be - * found at http://fontawesome.io. Stay up to date on Twitter at - * http://twitter.com/fontawesome. - * - * License - * ------------------------------------------------------------------------------ - * - The Font Awesome font is licensed under SIL OFL 1.1 - - * http://scripts.sil.org/OFL - * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - - * http://opensource.org/licenses/mit-license.html - * - Font Awesome documentation licensed under CC BY 3.0 - - * http://creativecommons.org/licenses/by/3.0/ - * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: - * "Font Awesome by Dave Gandy - http://fontawesome.io" - * - * Author - Dave Gandy - * ------------------------------------------------------------------------------ - * Email: dave@fontawesome.io - * Twitter: http://twitter.com/davegandy - * Work: Lead Product Designer @ Kyruus - http://kyruus.com + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.0.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.0#fontawesomeregular') format('svg'); + src: url('../fonts/fontawesome-webfont.eot?v=4.0.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } @@ -195,6 +174,7 @@ .fa-stack-1x, .fa-stack-2x { position: absolute; + left: 0; width: 100%; text-align: center; } @@ -414,7 +394,7 @@ .fa-check-square-o:before { content: "\f046"; } -.fa-move:before { +.fa-arrows:before { content: "\f047"; } .fa-step-backward:before { @@ -499,10 +479,10 @@ .fa-share:before { content: "\f064"; } -.fa-resize-full:before { +.fa-expand:before { content: "\f065"; } -.fa-resize-small:before { +.fa-compress:before { content: "\f066"; } .fa-plus:before { @@ -569,10 +549,10 @@ .fa-folder-open:before { content: "\f07c"; } -.fa-resize-vertical:before { +.fa-arrows-v:before { content: "\f07d"; } -.fa-resize-horizontal:before { +.fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before { @@ -666,7 +646,7 @@ .fa-rss:before { content: "\f09e"; } -.fa-hdd:before { +.fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { @@ -717,10 +697,11 @@ .fa-briefcase:before { content: "\f0b1"; } -.fa-fullscreen:before { +.fa-arrows-alt:before { content: "\f0b2"; } -.fa-group:before { +.fa-group:before, +.fa-users:before { content: "\f0c0"; } .fa-chain:before, @@ -751,7 +732,7 @@ .fa-square:before { content: "\f0c8"; } -.fa-reorder:before { +.fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { @@ -888,10 +869,10 @@ .fa-file-text-o:before { content: "\f0f6"; } -.fa-building:before { +.fa-building-o:before { content: "\f0f7"; } -.fa-hospital:before { +.fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { @@ -977,12 +958,6 @@ .fa-folder-open-o:before { content: "\f115"; } -.fa-expand-o:before { - content: "\f116"; -} -.fa-collapse-o:before { - content: "\f117"; -} .fa-smile-o:before { content: "\f118"; } @@ -1097,16 +1072,16 @@ .fa-anchor:before { content: "\f13d"; } -.fa-unlock-o:before { +.fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } -.fa-ellipsis-horizontal:before { +.fa-ellipsis-h:before { content: "\f141"; } -.fa-ellipsis-vertical:before { +.fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { @@ -1358,3 +1333,6 @@ .fa-try:before { content: "\f195"; } +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/server/src/uds/static/css/font-awesome.min.css b/server/src/uds/static/css/font-awesome.min.css index 6dca74acc..449d6ac55 100644 --- a/server/src/uds/static/css/font-awesome.min.css +++ b/server/src/uds/static/css/font-awesome.min.css @@ -1,395 +1,4 @@ -@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale} -.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%} -.fa-2x{font-size:2em} -.fa-3x{font-size:3em} -.fa-4x{font-size:4em} -.fa-5x{font-size:5em} -.fa-fw{width:1.2857142857142858em;text-align:center} -.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative} -.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em} -.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em} -.pull-right{float:right} -.pull-left{float:left} -.fa.pull-left{margin-right:.3em} -.fa.pull-right{margin-left:.3em} -.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear} -@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)} -.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)} -.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)} -.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)} -.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)} -.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle} -.fa-stack-1x,.fa-stack-2x{position:absolute;width:100%;text-align:center} -.fa-stack-1x{line-height:inherit} -.fa-stack-2x{font-size:2em} -.fa-inverse{color:#fff} -.fa-glass:before{content:"\f000"} -.fa-music:before{content:"\f001"} -.fa-search:before{content:"\f002"} -.fa-envelope-o:before{content:"\f003"} -.fa-heart:before{content:"\f004"} -.fa-star:before{content:"\f005"} -.fa-star-o:before{content:"\f006"} -.fa-user:before{content:"\f007"} -.fa-film:before{content:"\f008"} -.fa-th-large:before{content:"\f009"} -.fa-th:before{content:"\f00a"} -.fa-th-list:before{content:"\f00b"} -.fa-check:before{content:"\f00c"} -.fa-times:before{content:"\f00d"} -.fa-search-plus:before{content:"\f00e"} -.fa-search-minus:before{content:"\f010"} -.fa-power-off:before{content:"\f011"} -.fa-signal:before{content:"\f012"} -.fa-gear:before,.fa-cog:before{content:"\f013"} -.fa-trash-o:before{content:"\f014"} -.fa-home:before{content:"\f015"} -.fa-file-o:before{content:"\f016"} -.fa-clock-o:before{content:"\f017"} -.fa-road:before{content:"\f018"} -.fa-download:before{content:"\f019"} -.fa-arrow-circle-o-down:before{content:"\f01a"} -.fa-arrow-circle-o-up:before{content:"\f01b"} -.fa-inbox:before{content:"\f01c"} -.fa-play-circle-o:before{content:"\f01d"} -.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"} -.fa-refresh:before{content:"\f021"} -.fa-list-alt:before{content:"\f022"} -.fa-lock:before{content:"\f023"} -.fa-flag:before{content:"\f024"} -.fa-headphones:before{content:"\f025"} -.fa-volume-off:before{content:"\f026"} -.fa-volume-down:before{content:"\f027"} -.fa-volume-up:before{content:"\f028"} -.fa-qrcode:before{content:"\f029"} -.fa-barcode:before{content:"\f02a"} -.fa-tag:before{content:"\f02b"} -.fa-tags:before{content:"\f02c"} -.fa-book:before{content:"\f02d"} -.fa-bookmark:before{content:"\f02e"} -.fa-print:before{content:"\f02f"} -.fa-camera:before{content:"\f030"} -.fa-font:before{content:"\f031"} -.fa-bold:before{content:"\f032"} -.fa-italic:before{content:"\f033"} -.fa-text-height:before{content:"\f034"} -.fa-text-width:before{content:"\f035"} -.fa-align-left:before{content:"\f036"} -.fa-align-center:before{content:"\f037"} -.fa-align-right:before{content:"\f038"} -.fa-align-justify:before{content:"\f039"} -.fa-list:before{content:"\f03a"} -.fa-dedent:before,.fa-outdent:before{content:"\f03b"} -.fa-indent:before{content:"\f03c"} -.fa-video-camera:before{content:"\f03d"} -.fa-picture-o:before{content:"\f03e"} -.fa-pencil:before{content:"\f040"} -.fa-map-marker:before{content:"\f041"} -.fa-adjust:before{content:"\f042"} -.fa-tint:before{content:"\f043"} -.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"} -.fa-share-square-o:before{content:"\f045"} -.fa-check-square-o:before{content:"\f046"} -.fa-move:before{content:"\f047"} -.fa-step-backward:before{content:"\f048"} -.fa-fast-backward:before{content:"\f049"} -.fa-backward:before{content:"\f04a"} -.fa-play:before{content:"\f04b"} -.fa-pause:before{content:"\f04c"} -.fa-stop:before{content:"\f04d"} -.fa-forward:before{content:"\f04e"} -.fa-fast-forward:before{content:"\f050"} -.fa-step-forward:before{content:"\f051"} -.fa-eject:before{content:"\f052"} -.fa-chevron-left:before{content:"\f053"} -.fa-chevron-right:before{content:"\f054"} -.fa-plus-circle:before{content:"\f055"} -.fa-minus-circle:before{content:"\f056"} -.fa-times-circle:before{content:"\f057"} -.fa-check-circle:before{content:"\f058"} -.fa-question-circle:before{content:"\f059"} -.fa-info-circle:before{content:"\f05a"} -.fa-crosshairs:before{content:"\f05b"} -.fa-times-circle-o:before{content:"\f05c"} -.fa-check-circle-o:before{content:"\f05d"} -.fa-ban:before{content:"\f05e"} -.fa-arrow-left:before{content:"\f060"} -.fa-arrow-right:before{content:"\f061"} -.fa-arrow-up:before{content:"\f062"} -.fa-arrow-down:before{content:"\f063"} -.fa-mail-forward:before,.fa-share:before{content:"\f064"} -.fa-resize-full:before{content:"\f065"} -.fa-resize-small:before{content:"\f066"} -.fa-plus:before{content:"\f067"} -.fa-minus:before{content:"\f068"} -.fa-asterisk:before{content:"\f069"} -.fa-exclamation-circle:before{content:"\f06a"} -.fa-gift:before{content:"\f06b"} -.fa-leaf:before{content:"\f06c"} -.fa-fire:before{content:"\f06d"} -.fa-eye:before{content:"\f06e"} -.fa-eye-slash:before{content:"\f070"} -.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"} -.fa-plane:before{content:"\f072"} -.fa-calendar:before{content:"\f073"} -.fa-random:before{content:"\f074"} -.fa-comment:before{content:"\f075"} -.fa-magnet:before{content:"\f076"} -.fa-chevron-up:before{content:"\f077"} -.fa-chevron-down:before{content:"\f078"} -.fa-retweet:before{content:"\f079"} -.fa-shopping-cart:before{content:"\f07a"} -.fa-folder:before{content:"\f07b"} -.fa-folder-open:before{content:"\f07c"} -.fa-resize-vertical:before{content:"\f07d"} -.fa-resize-horizontal:before{content:"\f07e"} -.fa-bar-chart-o:before{content:"\f080"} -.fa-twitter-square:before{content:"\f081"} -.fa-facebook-square:before{content:"\f082"} -.fa-camera-retro:before{content:"\f083"} -.fa-key:before{content:"\f084"} -.fa-gears:before,.fa-cogs:before{content:"\f085"} -.fa-comments:before{content:"\f086"} -.fa-thumbs-o-up:before{content:"\f087"} -.fa-thumbs-o-down:before{content:"\f088"} -.fa-star-half:before{content:"\f089"} -.fa-heart-o:before{content:"\f08a"} -.fa-sign-out:before{content:"\f08b"} -.fa-linkedin-square:before{content:"\f08c"} -.fa-thumb-tack:before{content:"\f08d"} -.fa-external-link:before{content:"\f08e"} -.fa-sign-in:before{content:"\f090"} -.fa-trophy:before{content:"\f091"} -.fa-github-square:before{content:"\f092"} -.fa-upload:before{content:"\f093"} -.fa-lemon-o:before{content:"\f094"} -.fa-phone:before{content:"\f095"} -.fa-square-o:before{content:"\f096"} -.fa-bookmark-o:before{content:"\f097"} -.fa-phone-square:before{content:"\f098"} -.fa-twitter:before{content:"\f099"} -.fa-facebook:before{content:"\f09a"} -.fa-github:before{content:"\f09b"} -.fa-unlock:before{content:"\f09c"} -.fa-credit-card:before{content:"\f09d"} -.fa-rss:before{content:"\f09e"} -.fa-hdd:before{content:"\f0a0"} -.fa-bullhorn:before{content:"\f0a1"} -.fa-bell:before{content:"\f0f3"} -.fa-certificate:before{content:"\f0a3"} -.fa-hand-o-right:before{content:"\f0a4"} -.fa-hand-o-left:before{content:"\f0a5"} -.fa-hand-o-up:before{content:"\f0a6"} -.fa-hand-o-down:before{content:"\f0a7"} -.fa-arrow-circle-left:before{content:"\f0a8"} -.fa-arrow-circle-right:before{content:"\f0a9"} -.fa-arrow-circle-up:before{content:"\f0aa"} -.fa-arrow-circle-down:before{content:"\f0ab"} -.fa-globe:before{content:"\f0ac"} -.fa-wrench:before{content:"\f0ad"} -.fa-tasks:before{content:"\f0ae"} -.fa-filter:before{content:"\f0b0"} -.fa-briefcase:before{content:"\f0b1"} -.fa-fullscreen:before{content:"\f0b2"} -.fa-group:before{content:"\f0c0"} -.fa-chain:before,.fa-link:before{content:"\f0c1"} -.fa-cloud:before{content:"\f0c2"} -.fa-flask:before{content:"\f0c3"} -.fa-cut:before,.fa-scissors:before{content:"\f0c4"} -.fa-copy:before,.fa-files-o:before{content:"\f0c5"} -.fa-paperclip:before{content:"\f0c6"} -.fa-save:before,.fa-floppy-o:before{content:"\f0c7"} -.fa-square:before{content:"\f0c8"} -.fa-reorder:before{content:"\f0c9"} -.fa-list-ul:before{content:"\f0ca"} -.fa-list-ol:before{content:"\f0cb"} -.fa-strikethrough:before{content:"\f0cc"} -.fa-underline:before{content:"\f0cd"} -.fa-table:before{content:"\f0ce"} -.fa-magic:before{content:"\f0d0"} -.fa-truck:before{content:"\f0d1"} -.fa-pinterest:before{content:"\f0d2"} -.fa-pinterest-square:before{content:"\f0d3"} -.fa-google-plus-square:before{content:"\f0d4"} -.fa-google-plus:before{content:"\f0d5"} -.fa-money:before{content:"\f0d6"} -.fa-caret-down:before{content:"\f0d7"} -.fa-caret-up:before{content:"\f0d8"} -.fa-caret-left:before{content:"\f0d9"} -.fa-caret-right:before{content:"\f0da"} -.fa-columns:before{content:"\f0db"} -.fa-unsorted:before,.fa-sort:before{content:"\f0dc"} -.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"} -.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"} -.fa-envelope:before{content:"\f0e0"} -.fa-linkedin:before{content:"\f0e1"} -.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"} -.fa-legal:before,.fa-gavel:before{content:"\f0e3"} -.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"} -.fa-comment-o:before{content:"\f0e5"} -.fa-comments-o:before{content:"\f0e6"} -.fa-flash:before,.fa-bolt:before{content:"\f0e7"} -.fa-sitemap:before{content:"\f0e8"} -.fa-umbrella:before{content:"\f0e9"} -.fa-paste:before,.fa-clipboard:before{content:"\f0ea"} -.fa-lightbulb-o:before{content:"\f0eb"} -.fa-exchange:before{content:"\f0ec"} -.fa-cloud-download:before{content:"\f0ed"} -.fa-cloud-upload:before{content:"\f0ee"} -.fa-user-md:before{content:"\f0f0"} -.fa-stethoscope:before{content:"\f0f1"} -.fa-suitcase:before{content:"\f0f2"} -.fa-bell-o:before{content:"\f0a2"} -.fa-coffee:before{content:"\f0f4"} -.fa-cutlery:before{content:"\f0f5"} -.fa-file-text-o:before{content:"\f0f6"} -.fa-building:before{content:"\f0f7"} -.fa-hospital:before{content:"\f0f8"} -.fa-ambulance:before{content:"\f0f9"} -.fa-medkit:before{content:"\f0fa"} -.fa-fighter-jet:before{content:"\f0fb"} -.fa-beer:before{content:"\f0fc"} -.fa-h-square:before{content:"\f0fd"} -.fa-plus-square:before{content:"\f0fe"} -.fa-angle-double-left:before{content:"\f100"} -.fa-angle-double-right:before{content:"\f101"} -.fa-angle-double-up:before{content:"\f102"} -.fa-angle-double-down:before{content:"\f103"} -.fa-angle-left:before{content:"\f104"} -.fa-angle-right:before{content:"\f105"} -.fa-angle-up:before{content:"\f106"} -.fa-angle-down:before{content:"\f107"} -.fa-desktop:before{content:"\f108"} -.fa-laptop:before{content:"\f109"} -.fa-tablet:before{content:"\f10a"} -.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"} -.fa-circle-o:before{content:"\f10c"} -.fa-quote-left:before{content:"\f10d"} -.fa-quote-right:before{content:"\f10e"} -.fa-spinner:before{content:"\f110"} -.fa-circle:before{content:"\f111"} -.fa-mail-reply:before,.fa-reply:before{content:"\f112"} -.fa-github-alt:before{content:"\f113"} -.fa-folder-o:before{content:"\f114"} -.fa-folder-open-o:before{content:"\f115"} -.fa-expand-o:before{content:"\f116"} -.fa-collapse-o:before{content:"\f117"} -.fa-smile-o:before{content:"\f118"} -.fa-frown-o:before{content:"\f119"} -.fa-meh-o:before{content:"\f11a"} -.fa-gamepad:before{content:"\f11b"} -.fa-keyboard-o:before{content:"\f11c"} -.fa-flag-o:before{content:"\f11d"} -.fa-flag-checkered:before{content:"\f11e"} -.fa-terminal:before{content:"\f120"} -.fa-code:before{content:"\f121"} -.fa-reply-all:before{content:"\f122"} -.fa-mail-reply-all:before{content:"\f122"} -.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"} -.fa-location-arrow:before{content:"\f124"} -.fa-crop:before{content:"\f125"} -.fa-code-fork:before{content:"\f126"} -.fa-unlink:before,.fa-chain-broken:before{content:"\f127"} -.fa-question:before{content:"\f128"} -.fa-info:before{content:"\f129"} -.fa-exclamation:before{content:"\f12a"} -.fa-superscript:before{content:"\f12b"} -.fa-subscript:before{content:"\f12c"} -.fa-eraser:before{content:"\f12d"} -.fa-puzzle-piece:before{content:"\f12e"} -.fa-microphone:before{content:"\f130"} -.fa-microphone-slash:before{content:"\f131"} -.fa-shield:before{content:"\f132"} -.fa-calendar-o:before{content:"\f133"} -.fa-fire-extinguisher:before{content:"\f134"} -.fa-rocket:before{content:"\f135"} -.fa-maxcdn:before{content:"\f136"} -.fa-chevron-circle-left:before{content:"\f137"} -.fa-chevron-circle-right:before{content:"\f138"} -.fa-chevron-circle-up:before{content:"\f139"} -.fa-chevron-circle-down:before{content:"\f13a"} -.fa-html5:before{content:"\f13b"} -.fa-css3:before{content:"\f13c"} -.fa-anchor:before{content:"\f13d"} -.fa-unlock-o:before{content:"\f13e"} -.fa-bullseye:before{content:"\f140"} -.fa-ellipsis-horizontal:before{content:"\f141"} -.fa-ellipsis-vertical:before{content:"\f142"} -.fa-rss-square:before{content:"\f143"} -.fa-play-circle:before{content:"\f144"} -.fa-ticket:before{content:"\f145"} -.fa-minus-square:before{content:"\f146"} -.fa-minus-square-o:before{content:"\f147"} -.fa-level-up:before{content:"\f148"} -.fa-level-down:before{content:"\f149"} -.fa-check-square:before{content:"\f14a"} -.fa-pencil-square:before{content:"\f14b"} -.fa-external-link-square:before{content:"\f14c"} -.fa-share-square:before{content:"\f14d"} -.fa-compass:before{content:"\f14e"} -.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"} -.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"} -.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"} -.fa-euro:before,.fa-eur:before{content:"\f153"} -.fa-gbp:before{content:"\f154"} -.fa-dollar:before,.fa-usd:before{content:"\f155"} -.fa-rupee:before,.fa-inr:before{content:"\f156"} -.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"} -.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"} -.fa-won:before,.fa-krw:before{content:"\f159"} -.fa-bitcoin:before,.fa-btc:before{content:"\f15a"} -.fa-file:before{content:"\f15b"} -.fa-file-text:before{content:"\f15c"} -.fa-sort-alpha-asc:before{content:"\f15d"} -.fa-sort-alpha-desc:before{content:"\f15e"} -.fa-sort-amount-asc:before{content:"\f160"} -.fa-sort-amount-desc:before{content:"\f161"} -.fa-sort-numeric-asc:before{content:"\f162"} -.fa-sort-numeric-desc:before{content:"\f163"} -.fa-thumbs-up:before{content:"\f164"} -.fa-thumbs-down:before{content:"\f165"} -.fa-youtube-square:before{content:"\f166"} -.fa-youtube:before{content:"\f167"} -.fa-xing:before{content:"\f168"} -.fa-xing-square:before{content:"\f169"} -.fa-youtube-play:before{content:"\f16a"} -.fa-dropbox:before{content:"\f16b"} -.fa-stack-overflow:before{content:"\f16c"} -.fa-instagram:before{content:"\f16d"} -.fa-flickr:before{content:"\f16e"} -.fa-adn:before{content:"\f170"} -.fa-bitbucket:before{content:"\f171"} -.fa-bitbucket-square:before{content:"\f172"} -.fa-tumblr:before{content:"\f173"} -.fa-tumblr-square:before{content:"\f174"} -.fa-long-arrow-down:before{content:"\f175"} -.fa-long-arrow-up:before{content:"\f176"} -.fa-long-arrow-left:before{content:"\f177"} -.fa-long-arrow-right:before{content:"\f178"} -.fa-apple:before{content:"\f179"} -.fa-windows:before{content:"\f17a"} -.fa-android:before{content:"\f17b"} -.fa-linux:before{content:"\f17c"} -.fa-dribbble:before{content:"\f17d"} -.fa-skype:before{content:"\f17e"} -.fa-foursquare:before{content:"\f180"} -.fa-trello:before{content:"\f181"} -.fa-female:before{content:"\f182"} -.fa-male:before{content:"\f183"} -.fa-gittip:before{content:"\f184"} -.fa-sun-o:before{content:"\f185"} -.fa-moon-o:before{content:"\f186"} -.fa-archive:before{content:"\f187"} -.fa-bug:before{content:"\f188"} -.fa-vk:before{content:"\f189"} -.fa-weibo:before{content:"\f18a"} -.fa-renren:before{content:"\f18b"} -.fa-pagelines:before{content:"\f18c"} -.fa-stack-exchange:before{content:"\f18d"} -.fa-arrow-circle-o-right:before{content:"\f18e"} -.fa-arrow-circle-o-left:before{content:"\f190"} -.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"} -.fa-dot-circle-o:before{content:"\f192"} -.fa-wheelchair:before{content:"\f193"} -.fa-vimeo-square:before{content:"\f194"} -.fa-turkish-lira:before,.fa-try:before{content:"\f195"} +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"} \ No newline at end of file diff --git a/server/src/uds/static/fonts/FontAwesome.otf b/server/src/uds/static/fonts/FontAwesome.otf index 4dfe30ac7..8b0f54e47 100644 Binary files a/server/src/uds/static/fonts/FontAwesome.otf and b/server/src/uds/static/fonts/FontAwesome.otf differ diff --git a/server/src/uds/static/fonts/fontawesome-webfont.eot b/server/src/uds/static/fonts/fontawesome-webfont.eot index e054c93d1..7c79c6a6b 100644 Binary files a/server/src/uds/static/fonts/fontawesome-webfont.eot and b/server/src/uds/static/fonts/fontawesome-webfont.eot differ diff --git a/server/src/uds/static/fonts/fontawesome-webfont.svg b/server/src/uds/static/fonts/fontawesome-webfont.svg index 36d43b844..45fdf3383 100644 --- a/server/src/uds/static/fonts/fontawesome-webfont.svg +++ b/server/src/uds/static/fonts/fontawesome-webfont.svg @@ -280,8 +280,8 @@ - - + + @@ -400,7 +400,7 @@ - + diff --git a/server/src/uds/static/fonts/fontawesome-webfont.ttf b/server/src/uds/static/fonts/fontawesome-webfont.ttf index 7ec2e1de8..e89738de5 100644 Binary files a/server/src/uds/static/fonts/fontawesome-webfont.ttf and b/server/src/uds/static/fonts/fontawesome-webfont.ttf differ diff --git a/server/src/uds/static/fonts/fontawesome-webfont.woff b/server/src/uds/static/fonts/fontawesome-webfont.woff index 27d80b123..8c1748aab 100644 Binary files a/server/src/uds/static/fonts/fontawesome-webfont.woff and b/server/src/uds/static/fonts/fontawesome-webfont.woff differ diff --git a/server/src/uds/templates/uds/admin/index.html b/server/src/uds/templates/uds/admin/index.html index 16a566a70..60472627d 100644 --- a/server/src/uds/templates/uds/admin/index.html +++ b/server/src/uds/templates/uds/admin/index.html @@ -35,7 +35,13 @@
+
{% block body %}{% endblock %} +
+
+
+
+
@@ -101,10 +107,24 @@ }); {% block js %}{% endblock %} - {% js_template_path 'uds/admin/tmpl' %} + + {% js_template 'dashboard' %} {% js_template 'authenticators' %} + {% js_template 'table' %} + {% js_template 'modal' %} + + {% js_template 'fld/checkbox' %} + {% js_template 'fld/choice' %} + {% js_template 'fld/editlist' %} + {% js_template 'fld/hidden' %} + {% js_template 'fld/multichoice' %} + {% js_template 'fld/numeric' %} + {% js_template 'fld/password' %} + {% js_template 'fld/text' %} + {% js_template 'fld/textbox' %} + \ No newline at end of file diff --git a/server/src/uds/templates/uds/admin/tmpl/authenticators.html b/server/src/uds/templates/uds/admin/tmpl/authenticators.html index a0e33e1fb..27a4ff66b 100644 --- a/server/src/uds/templates/uds/admin/tmpl/authenticators.html +++ b/server/src/uds/templates/uds/admin/tmpl/authenticators.html @@ -9,10 +9,11 @@
-
-
+
-
-
+
+
+
+
diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/checkbox.html b/server/src/uds/templates/uds/admin/tmpl/fld/checkbox.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/choice.html b/server/src/uds/templates/uds/admin/tmpl/fld/choice.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/editlist.html b/server/src/uds/templates/uds/admin/tmpl/fld/editlist.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/hidden.html b/server/src/uds/templates/uds/admin/tmpl/fld/hidden.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/multichoice.html b/server/src/uds/templates/uds/admin/tmpl/fld/multichoice.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/numeric.html b/server/src/uds/templates/uds/admin/tmpl/fld/numeric.html new file mode 100644 index 000000000..da63fc21d --- /dev/null +++ b/server/src/uds/templates/uds/admin/tmpl/fld/numeric.html @@ -0,0 +1,6 @@ +
+ +
+ +
+
diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/password.html b/server/src/uds/templates/uds/admin/tmpl/fld/password.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/text.html b/server/src/uds/templates/uds/admin/tmpl/fld/text.html new file mode 100644 index 000000000..7de9c981c --- /dev/null +++ b/server/src/uds/templates/uds/admin/tmpl/fld/text.html @@ -0,0 +1,6 @@ +
+ +
+ +
+
diff --git a/server/src/uds/templates/uds/admin/tmpl/fld/textbox.html b/server/src/uds/templates/uds/admin/tmpl/fld/textbox.html new file mode 100644 index 000000000..e69de29bb diff --git a/server/src/uds/templates/uds/admin/tmpl/modal.html b/server/src/uds/templates/uds/admin/tmpl/modal.html new file mode 100644 index 000000000..d370edb75 --- /dev/null +++ b/server/src/uds/templates/uds/admin/tmpl/modal.html @@ -0,0 +1,17 @@ +{% load i18n %} + + diff --git a/server/src/uds/templates/uds/admin/tmpl/table.html b/server/src/uds/templates/uds/admin/tmpl/table.html index 1872ea290..bd414336b 100644 --- a/server/src/uds/templates/uds/admin/tmpl/table.html +++ b/server/src/uds/templates/uds/admin/tmpl/table.html @@ -1,16 +1,15 @@ -
+

<%= title %> + onclick="gui.minimizePanel('#<%= panelId %>');"> + data-target="#<%= panelId %> > div.panel-body">

- +
diff --git a/server/src/uds/templatetags/REST.py b/server/src/uds/templatetags/REST.py index 862bc6570..032ffa0a1 100644 --- a/server/src/uds/templatetags/REST.py +++ b/server/src/uds/templatetags/REST.py @@ -60,6 +60,6 @@ def js_template_path(context, path): @register.simple_tag(name='js_template', takes_context=True) def js_template(context, template_name, template_id = None): - template_id = template_id or 'tmpl_' + template_name + template_id = (template_id or 'tmpl_' + template_name).replace('/', '_') tmpl = template.loader.get_template(context['template_path'] + '/' + template_name + '.html') return ''