From f9d8a400386b1c79f2ac1867c296f62f33b926cd Mon Sep 17 00:00:00 2001 From: Zac Sturgess Date: Sun, 1 May 2016 23:04:09 +0100 Subject: [PATCH] Fix #144 Signed-off-by: Zac Sturgess --- src/ResultBundle/Tests/E2E/ViewTestTest.php | 9 +++++++++ src/TestBundle/Tests/E2E/DashboardTest.php | 2 +- web/assets/lib/app.min.js | 2 +- web/assets/lib/src/helpers.js | 7 ++++++- web/assets/styles/app.css | 2 +- web/partials/dashboard.html | 4 ++-- web/partials/viewTest.html | 6 +++--- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/ResultBundle/Tests/E2E/ViewTestTest.php b/src/ResultBundle/Tests/E2E/ViewTestTest.php index b3fce3c..5cc93d3 100644 --- a/src/ResultBundle/Tests/E2E/ViewTestTest.php +++ b/src/ResultBundle/Tests/E2E/ViewTestTest.php @@ -82,6 +82,15 @@ public function testEditDeleteAndRunInsufficentPermissions() $this->assertFalse($this->getActionItem(2)->isDisplayed()); $this->assertFalse($this->getActionItem(3)->isDisplayed()); } + + public function testEditDeleteAndRunAsAdmin() { + $this->logInAsUser('user-3'); + $this->clickThroughToTest(1); + + $this->assertTrue($this->getActionItem(1)->isDisplayed()); + $this->assertTrue($this->getActionItem(2)->isDisplayed()); + $this->assertTrue($this->getActionItem(3)->isDisplayed()); + } private function clickThroughToTest($number) { diff --git a/src/TestBundle/Tests/E2E/DashboardTest.php b/src/TestBundle/Tests/E2E/DashboardTest.php index 4e2cacc..05baa64 100644 --- a/src/TestBundle/Tests/E2E/DashboardTest.php +++ b/src/TestBundle/Tests/E2E/DashboardTest.php @@ -206,7 +206,7 @@ public function testRunTest() $this->assertContains(TestFixtures::$tests['test-1']->getName(), $this->getHeaderText()); $this->assertCount(4, $this->webDriver->findElements( - WebDriverBy::cssSelector('.result span') + WebDriverBy::cssSelector('.result') )); } diff --git a/web/assets/lib/app.min.js b/web/assets/lib/app.min.js index 677329d..2e1bf3c 100644 --- a/web/assets/lib/app.min.js +++ b/web/assets/lib/app.min.js @@ -1 +1 @@ -var overwatchApp=angular.module("overwatch",["ngRoute","angularModalService","ngIdle"]);overwatchApp.run(["$rootScope","$location","$routeParams",function(e,t,r){e.$on("$routeChangeSuccess",function(r,o,n){e.currentPage=t.path()})}]),overwatchApp.config(["$routeProvider","$httpProvider","IdleProvider",function(e,t,r){e.when("/",{title:"Dashboard",templateUrl:"partials/dashboard.html",controller:"DashboardController"}).when("/group/:id",{title:"Edit Group",templateUrl:"partials/editGroup.html",controller:"EditGroupController"}).when("/group/:id/add-test",{title:"Add test",templateUrl:"partials/testForm.html",controller:"AddTestController"}).when("/test/:id",{title:"View test",templateUrl:"partials/viewTest.html",controller:"ViewTestController"}).when("/test/:id/edit",{title:"Edit test",templateUrl:"partials/testForm.html",controller:"EditTestController"}).when("/users",{title:"Manage Users",templateUrl:"partials/manageUsers.html",controller:"ManageUsersController"}).when("/alerts",{title:"Change Alert Settings",templateUrl:"partials/changeAlertSettings.html",controller:"ManageAlertSettingsController"}).when("/my-account",{title:"My Account",templateUrl:"/profile/change-password",controller:"MyAccountController"}).when("/error",{title:"Error",templateUrl:"partials/error.html",controller:function(e,t){t.status={code:"500",text:"Internal Server Error"},e(!1)}}).otherwise({title:"Not Found",templateUrl:"partials/error.html",controller:function(e,t){t.status={code:"404",text:"Not Found"},e(!1)}}),t.interceptors.push("overwatchApiErrorHandler"),r.idle(300),r.timeout(5)}]),overwatchApp.factory("$gravatar",function(){return{fn:function(e,t){var r=function(e){function t(e,t){return e<>>32-t}function r(e,t){var r,o,n,a,s;return n=2147483648&e,a=2147483648&t,r=1073741824&e,o=1073741824&t,s=(1073741823&e)+(1073741823&t),r&o?2147483648^s^n^a:r|o?1073741824&s?3221225472^s^n^a:1073741824^s^n^a:s^n^a}function o(e,t,r){return e&t|~e&r}function n(e,t,r){return e&r|t&~r}function a(e,t,r){return e^t^r}function s(e,t,r){return t^(e|~r)}function u(e,n,a,s,u,i,c){return e=r(e,r(r(o(n,a,s),u),c)),r(t(e,i),n)}function i(e,o,a,s,u,i,c){return e=r(e,r(r(n(o,a,s),u),c)),r(t(e,i),o)}function c(e,o,n,s,u,i,c){return e=r(e,r(r(a(o,n,s),u),c)),r(t(e,i),o)}function l(e,o,n,a,u,i,c){return e=r(e,r(r(s(o,n,a),u),c)),r(t(e,i),o)}function p(e){for(var t,r=e.length,o=r+8,n=(o-o%64)/64,a=16*(n+1),s=Array(a-1),u=0,i=0;r>i;)t=(i-i%4)/4,u=i%4*8,s[t]=s[t]|e.charCodeAt(i)<>>29,s}function d(e){var t,r,o="",n="";for(r=0;3>=r;r++)t=e>>>8*r&255,n="0"+t.toString(16),o+=n.substr(n.length-2,2);return o}function f(e){e=e.replace(/rn/g,"n");for(var t="",r=0;ro?t+=String.fromCharCode(o):o>127&&2048>o?(t+=String.fromCharCode(o>>6|192),t+=String.fromCharCode(63&o|128)):(t+=String.fromCharCode(o>>12|224),t+=String.fromCharCode(o>>6&63|128),t+=String.fromCharCode(63&o|128))}return t}var h,g,m,v,w,_,A,$,y,R=Array(),U=7,S=12,C=17,E=22,T=5,b=9,M=14,N=20,P=4,x=11,L=16,D=23,I=6,G=10,O=15,F=21;for(e=f(e),R=p(e),_=1732584193,A=4023233417,$=2562383102,y=271733878,h=0;h21600)},r.removeTest=function(t){n.confirm("Are you sure you want to remove this test? All historical data for this test will also be deleted.")&&(e(!0),o["delete"](Routing.generate("overwatch_test_testapi_deletetest",{id:t})).success(function(){u()}))},r.removeGroup=function(t){n.confirm("Are you sure you want to remove this group?")&&(e(!0),o["delete"](Routing.generate("overwatch_test_testgroupapi_deletegroup",{id:t})).success(function(){u()}))},r.createGroup=function(){var t=n.prompt("Please enter a name for the new group","Untitled Group");null!==t&&(e(!0),o.post(Routing.generate("overwatch_test_testgroupapi_creategroup"),{name:t}).success(function(){u()}))},r.runTest=function(t){e(!0),o.post(Routing.generate("overwatch_test_testapi_runtest",{id:t}),null).success(function(){a.path("/test/"+t)})},u()}]),overwatchApp.controller("EditGroupController",["showLoading","$scope","overwatchApi","$routeParams","$location","$window","$gravatar",function(e,t,r,o,n,a,s){t.group={};var u=function(){r.get(Routing.generate("overwatch_test_testgroupapi_getgroup",{id:o.id})).success(function(r){t.group=r,e(!1)})};t.userAvatar=function(e,t){return s.fn(e,t)},t.removeUser=function(o){a.confirm("Are you sure you want to remove this user from group '"+t.group.name+"'?")&&(e(!0),r["delete"](Routing.generate("overwatch_test_testgroupapi_removeuserfromgroup",{groupId:t.group.id,userId:o})).success(function(){u()}))},t.addUser=function(){var o=a.prompt("Please enter the e-mail address of the user you wish to add to group '"+t.group.name+"'",currentUser.email);null!==o&&(e(!0),r.get(Routing.generate("overwatch_user_api_finduser",{email:o})).success(function(e){r.post(Routing.generate("overwatch_test_testgroupapi_addusertogroup",{groupId:t.group.id,userId:e.id}),{}).success(function(){u()})}).error(function(){e(!1),a.alert("Could not find user by e-mail address '"+o+"'. Please ensure that they are already registered.")}))},t.renameGroup=function(){var o=a.prompt("Please type a new name for this group",t.group.name);null!==o&&o!==t.group.name&&(e(!0),r.put(Routing.generate("overwatch_test_testgroupapi_updategroup",{id:t.group.id}),{name:o}).success(function(r){t.group=r,currentUser.groups.push(r.name),e(!1)}))},u()}]),overwatchApp.controller("AddTestController",["showLoading","$scope","overwatchApi","$routeParams","$location",function(e,t,r,o,n){t.title="Add test",t.test={},t.expectations=[],r.get(Routing.generate("overwatch_expectation_api_getall")).success(function(r){t.expectations=r,e(!1)}),t.save=function(){e(!0),r.post(Routing.generate("overwatch_test_testapi_createtest",{id:o.id}),t.test).success(function(){n.path("/")})}}]),overwatchApp.controller("ViewTestController",["showLoading","isGranted","$scope","overwatchApi","$routeParams","$interval","$location","$window","$q",function(e,t,r,o,n,a,s,u,i){r.test={},r.test.results={},r.lastRequestedResultSize=0,r.loadResults=function(t){var a=o.get(Routing.generate("overwatch_test_testapi_gettest",{id:n.id})).success(function(e){var t=r.test.results;r.test=e,r.test.results=t}),s=o.get(Routing.generate("overwatch_result_api_getresultsfortest",{id:n.id})+"?pageSize="+t).success(function(e){r.test.results=e,r.lastRequestedResultSize=t});i.all([a,s]).then(function(){e(!1)})},r.loadOlderResults=function(){e(!0),r.loadResults(r.lastRequestedResultSize+10)},r.removeTest=function(t){u.confirm("Are you sure you want to remove this test? All historical data for this test will also be deleted.")&&(e(!0),o["delete"](Routing.generate("overwatch_test_testapi_deletetest",{id:t})).success(function(){s.path("/")}))},r.isGranted=function(e,r){return"undefined"==typeof r?t(e):t(e,r.name)},r.runTest=function(t){e(!0),o.post(Routing.generate("overwatch_test_testapi_runtest",{id:t}),null).success(function(){r.loadResults(r.lastRequestedResultSize)})},r.loadResults(10);var c=a(function(){r.loadResults(r.lastRequestedResultSize)},6e4);r.$on("$destroy",function(){a.cancel(c)})}]),overwatchApp.controller("EditTestController",["showLoading","$scope","overwatchApi","$routeParams","$location","$q",function(e,t,r,o,n,a){t.title="Edit test",t.test={},t.expectations=[];var s=r.get(Routing.generate("overwatch_expectation_api_getall")).success(function(e){t.expectations=e}),u=r.get(Routing.generate("overwatch_test_testapi_gettest",{id:o.id})).success(function(e){t.test=e});a.all([s,u]).then(function(){e(!1)}),t.save=function(){e(!0),r.put(Routing.generate("overwatch_test_testapi_updatetest",{id:o.id}),t.test).success(function(){n.path("/test/"+o.id)})}}]),overwatchApp.controller("ManageUsersController",["showLoading","$scope","overwatchApi","$window","ModalService","$gravatar",function(e,t,r,o,n,a){t.users=[],t.updatedRoles=[],t.currentUserId=currentUser.id;var s=function(){r.get(Routing.generate("overwatch_user_api_getallusers")).success(function(r){t.users=r,e(!1)})};t.createUser=function(){var t=o.prompt("Please type the new user's email address.","");null!==t&&(e(!0),r.post(Routing.generate("overwatch_user_api_createuser",{email:t}),{}).success(function(e){s()}))},t.userAvatar=function(e,t){return a.fn(e,t)},t.updateRole=function(t){n.showModal({templateUrl:"/partials/roleDialog.html",controller:"RoleDialogController"}).then(function(o){o.close.then(function(o){"CANCEL"!==o&&(e(!0),r.put(Routing.generate("overwatch_user_api_setuserrole",{id:t,role:o}),{}).success(function(){s()}))})})},t.lockUser=function(t){e(!0),r.put(Routing.generate("overwatch_user_api_togglelockuser",{id:t}),{}).success(function(){s()})},t.removeUser=function(t){o.confirm("Are you sure you want to permanently remove this user?")&&(e(!0),r["delete"](Routing.generate("overwatch_user_api_deleteuser",{id:t})).success(function(){s()}))},s()}]),overwatchApp.controller("ManageAlertSettingsController",["showLoading","$scope","overwatchApi",function(e,t,r){t.settings=[];var o=function(){r.get(Routing.generate("overwatch_user_api_getalertsettings")).success(function(r){t.settings=r,e(!1)})};t.isUsersSetting=function(e){return currentUser.alertSetting===e},t.saveSetting=function(t){e(!0),r.put(Routing.generate("overwatch_user_api_updateuser"),{alertSetting:t}).success(function(){currentUser.alertSetting=t,e(!1)})},o()}]),overwatchApp.controller("RoleDialogController",["$scope","close",function(e,t){e.close=function(e){t(e)}}]),overwatchApp.controller("MyAccountController",["showLoading","$scope","overwatchApi",function(e,t,r){t.telephoneNumber=currentUser.telephoneNumber,t.apiKeyFieldType="password",t.saveProfile=function(){e(!0),r.put(Routing.generate("overwatch_user_api_updateuser"),{telephoneNumber:t.telephoneNumber}).then(function(t){currentUser.telephoneNumber=t.data.telephoneNumber,e(!1)})["catch"](function(){e(!1),alert("Sorry, there was an error saving your telephone number.")})},t.toggleAPIKeyVisibility=function(){var e="password";"password"===t.apiKeyFieldType&&(e="text"),t.apiKeyFieldType=e},e(!1)}]),overwatchApp.run(["showLoading","$rootScope","$window","Idle",function(e,t,r,o){t.$on("$routeChangeStart",function(){e(!0)}),t.$on("$routeChangeSuccess",function(e,t){t.title?r.document.title=t.title+" - Overwatch":r.document.title="Overwatch"}),t.$on("IdleTimeout",function(){r.location.href="/logout"}),o.watch()}]),overwatchApp.factory("showLoading",["$rootScope",function(e){return function(t){e.isLoading=t}}]),overwatchApp.factory("isGranted",[function(){var e=function(t){return"ROLE_SUPER_ADMIN"!==t&&e("ROLE_SUPER_ADMIN")?!0:-1!==currentUser.roles.indexOf(t)},t=function(t){return e("ROLE_SUPER_ADMIN")?!0:-1!==currentUser.groups.indexOf(t)};return function(r,o){switch(r){case"SUPER_ADMIN":return e("ROLE_SUPER_ADMIN");case"ADMIN":return e("ROLE_ADMIN")&&t(o);case"USER":return t(o);default:return!1}}}]),overwatchApp.factory("overwatchApiAuth",[function(){return{getHttpHeaders:function(){return{"X-Api-User":this.getUser(),"X-Api-Timestamp":this.getTimestamp(),"X-Api-Token":this.getToken()}},getToken:function(){return CryptoJS.HmacSHA256("timestamp="+this.getTimestamp(),currentUser.apiKey)},getUser:function(){return currentUser.id},getTimestamp:function(){return(new Date).getTime().toString().substr(0,10)}}}]),overwatchApp.service("overwatchApi",["overwatchApiAuth","$http",function(e,t){return{call:function(r){return r.hasOwnProperty("headers")?r.headers=angular.merge(r.headers,e.getHttpHeaders()):r.headers=e.getHttpHeaders(),t(r)},transformUrl:function(e){return 0!==e.indexOf("/api/")&&(e=Routing.generate(e)),e},get:function(e){return this.call({method:"GET",url:this.transformUrl(e)})},post:function(e,t){return this.call({method:"POST",data:t,url:this.transformUrl(e)})},put:function(e,t){return this.call({method:"PUT",data:t,url:this.transformUrl(e)})},"delete":function(e){return this.call({method:"DELETE",url:this.transformUrl(e)})}}}]),overwatchApp.factory("overwatchApiErrorHandler",["$location","$window",function(e,t){return{responseError:function(r){401===r.status||403===r.status?t.location.reload():e.url("/error")}}}]),overwatchApp.filter("ucfirst",[function(){return function(e,t){return e.replace(/(?:^|\s)\S/g,function(e){return e.toUpperCase()})}}]),overwatchApp.filter("strLimit",["$filter",function(e){return function(t,r){return t.length<=r?t:e("limitTo")(t,r)+"..."}}]),overwatchApp.filter("timeago",[function(){return function(e,t){var e=1e3*e;if(isNaN(e))return"never";var r,o=function(e,t,r){var o="function"==typeof e?e(t,i):e,n=r.numbers&&r.numbers[t]||t;return o.replace(/%d/i,n)},n=(new Date).getTime(),a=new Date(e).getTime(),s=t||!1,u={prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years"},i=n-a,c=Math.abs(i)/1e3,l=c/60,p=l/60,d=p/24,f=d/365,h=void 0===u.wordSeparator?" ":u.wordSeparator,g=u.prefixAgo,m=u.suffixAgo;return s&&0>i&&(g=u.prefixFromNow,m=u.suffixFromNow),r=45>c&&o(u.seconds,Math.round(c),u)||90>c&&o(u.minute,1,u)||45>l&&o(u.minutes,Math.round(l),u)||90>l&&o(u.hour,1,u)||24>p&&o(u.hours,Math.round(p),u)||42>p&&o(u.day,1,u)||30>d&&o(u.days,Math.round(d),u)||45>d&&o(u.month,1,u)||365>d&&o(u.months,Math.round(d/30),u)||1.5>f&&o(u.year,1,u)||o(u.years,Math.round(f),u),[g,r,m].join(h).trim()}}]),!function(){"use strict";var e=angular.module("angularModalService",[]);e.factory("ModalService",["$document","$compile","$controller","$http","$rootScope","$q","$timeout","$templateCache",function(e,t,r,o,n,a,s,u){function i(){var e=this,i=function(e,t){var r=a.defer();if(e)r.resolve(e);else if(t){var n=u.get(t);void 0!==n?r.resolve(n):o({method:"GET",url:t,cache:!0}).then(function(e){u.put(t,e.data),r.resolve(e.data)})["catch"](function(e){r.reject(e)})}else r.reject("No template or templateUrl has been specified.");return r.promise};e.showModal=function(e){var o=a.defer(),u=e.controller;return u?(i(e.template,e.templateUrl).then(function(i){var l=n.$new(),p=a.defer(),d={$scope:l,close:function(e,t){(void 0===t||null===t)&&(t=0),s(function(){p.resolve(e)},t)}};if(e.inputs)for(var f in e.inputs)d[f]=e.inputs[f];var h=angular.element(i),g=t(h),m=g(l);d.$element=m;var v=r(u,d);e.appendElement?e.appendElement.append(m):c.append(m);var w={controller:v,scope:l,element:m,close:p.promise};w.close.then(function(){l.$destroy(),m.remove()}),o.resolve(w)})["catch"](function(e){o.reject(e)}),o.promise):(o.reject("No controller has been specified."),o.promise)}}var c=e.find("body");return new i}])}(); \ No newline at end of file +var overwatchApp=angular.module("overwatch",["ngRoute","angularModalService","ngIdle"]);overwatchApp.run(["$rootScope","$location","$routeParams",function(e,t,r){e.$on("$routeChangeSuccess",function(r,o,n){e.currentPage=t.path()})}]),overwatchApp.config(["$routeProvider","$httpProvider","IdleProvider",function(e,t,r){e.when("/",{title:"Dashboard",templateUrl:"partials/dashboard.html",controller:"DashboardController"}).when("/group/:id",{title:"Edit Group",templateUrl:"partials/editGroup.html",controller:"EditGroupController"}).when("/group/:id/add-test",{title:"Add test",templateUrl:"partials/testForm.html",controller:"AddTestController"}).when("/test/:id",{title:"View test",templateUrl:"partials/viewTest.html",controller:"ViewTestController"}).when("/test/:id/edit",{title:"Edit test",templateUrl:"partials/testForm.html",controller:"EditTestController"}).when("/users",{title:"Manage Users",templateUrl:"partials/manageUsers.html",controller:"ManageUsersController"}).when("/alerts",{title:"Change Alert Settings",templateUrl:"partials/changeAlertSettings.html",controller:"ManageAlertSettingsController"}).when("/my-account",{title:"My Account",templateUrl:"/profile/change-password",controller:"MyAccountController"}).when("/error",{title:"Error",templateUrl:"partials/error.html",controller:function(e,t){t.status={code:"500",text:"Internal Server Error"},e(!1)}}).otherwise({title:"Not Found",templateUrl:"partials/error.html",controller:function(e,t){t.status={code:"404",text:"Not Found"},e(!1)}}),t.interceptors.push("overwatchApiErrorHandler"),r.idle(300),r.timeout(5)}]),overwatchApp.factory("$gravatar",function(){return{fn:function(e,t){var r=function(e){function t(e,t){return e<>>32-t}function r(e,t){var r,o,n,a,s;return n=2147483648&e,a=2147483648&t,r=1073741824&e,o=1073741824&t,s=(1073741823&e)+(1073741823&t),r&o?2147483648^s^n^a:r|o?1073741824&s?3221225472^s^n^a:1073741824^s^n^a:s^n^a}function o(e,t,r){return e&t|~e&r}function n(e,t,r){return e&r|t&~r}function a(e,t,r){return e^t^r}function s(e,t,r){return t^(e|~r)}function u(e,n,a,s,u,i,c){return e=r(e,r(r(o(n,a,s),u),c)),r(t(e,i),n)}function i(e,o,a,s,u,i,c){return e=r(e,r(r(n(o,a,s),u),c)),r(t(e,i),o)}function c(e,o,n,s,u,i,c){return e=r(e,r(r(a(o,n,s),u),c)),r(t(e,i),o)}function l(e,o,n,a,u,i,c){return e=r(e,r(r(s(o,n,a),u),c)),r(t(e,i),o)}function p(e){for(var t,r=e.length,o=r+8,n=(o-o%64)/64,a=16*(n+1),s=Array(a-1),u=0,i=0;r>i;)t=(i-i%4)/4,u=i%4*8,s[t]=s[t]|e.charCodeAt(i)<>>29,s}function d(e){var t,r,o="",n="";for(r=0;3>=r;r++)t=e>>>8*r&255,n="0"+t.toString(16),o+=n.substr(n.length-2,2);return o}function f(e){e=e.replace(/rn/g,"n");for(var t="",r=0;ro?t+=String.fromCharCode(o):o>127&&2048>o?(t+=String.fromCharCode(o>>6|192),t+=String.fromCharCode(63&o|128)):(t+=String.fromCharCode(o>>12|224),t+=String.fromCharCode(o>>6&63|128),t+=String.fromCharCode(63&o|128))}return t}var h,g,m,v,w,_,A,$,y,R=Array(),U=7,S=12,C=17,E=22,T=5,M=9,b=14,N=20,P=4,L=11,x=16,D=23,I=6,G=10,O=15,F=21;for(e=f(e),R=p(e),_=1732584193,A=4023233417,$=2562383102,y=271733878,h=0;h21600)},r.removeTest=function(t){n.confirm("Are you sure you want to remove this test? All historical data for this test will also be deleted.")&&(e(!0),o["delete"](Routing.generate("overwatch_test_testapi_deletetest",{id:t})).success(function(){u()}))},r.removeGroup=function(t){n.confirm("Are you sure you want to remove this group?")&&(e(!0),o["delete"](Routing.generate("overwatch_test_testgroupapi_deletegroup",{id:t})).success(function(){u()}))},r.createGroup=function(){var t=n.prompt("Please enter a name for the new group","Untitled Group");null!==t&&(e(!0),o.post(Routing.generate("overwatch_test_testgroupapi_creategroup"),{name:t}).success(function(){u()}))},r.runTest=function(t){e(!0),o.post(Routing.generate("overwatch_test_testapi_runtest",{id:t}),null).success(function(){a.path("/test/"+t)})},u()}]),overwatchApp.controller("EditGroupController",["showLoading","$scope","overwatchApi","$routeParams","$location","$window","$gravatar",function(e,t,r,o,n,a,s){t.group={};var u=function(){r.get(Routing.generate("overwatch_test_testgroupapi_getgroup",{id:o.id})).success(function(r){t.group=r,e(!1)})};t.userAvatar=function(e,t){return s.fn(e,t)},t.removeUser=function(o){a.confirm("Are you sure you want to remove this user from group '"+t.group.name+"'?")&&(e(!0),r["delete"](Routing.generate("overwatch_test_testgroupapi_removeuserfromgroup",{groupId:t.group.id,userId:o})).success(function(){u()}))},t.addUser=function(){var o=a.prompt("Please enter the e-mail address of the user you wish to add to group '"+t.group.name+"'",currentUser.email);null!==o&&(e(!0),r.get(Routing.generate("overwatch_user_api_finduser",{email:o})).success(function(e){r.post(Routing.generate("overwatch_test_testgroupapi_addusertogroup",{groupId:t.group.id,userId:e.id}),{}).success(function(){u()})}).error(function(){e(!1),a.alert("Could not find user by e-mail address '"+o+"'. Please ensure that they are already registered.")}))},t.renameGroup=function(){var o=a.prompt("Please type a new name for this group",t.group.name);null!==o&&o!==t.group.name&&(e(!0),r.put(Routing.generate("overwatch_test_testgroupapi_updategroup",{id:t.group.id}),{name:o}).success(function(r){t.group=r,currentUser.groups.push(r.name),e(!1)}))},u()}]),overwatchApp.controller("AddTestController",["showLoading","$scope","overwatchApi","$routeParams","$location",function(e,t,r,o,n){t.title="Add test",t.test={},t.expectations=[],r.get(Routing.generate("overwatch_expectation_api_getall")).success(function(r){t.expectations=r,e(!1)}),t.save=function(){e(!0),r.post(Routing.generate("overwatch_test_testapi_createtest",{id:o.id}),t.test).success(function(){n.path("/")})}}]),overwatchApp.controller("ViewTestController",["showLoading","isGranted","$scope","overwatchApi","$routeParams","$interval","$location","$window","$q",function(e,t,r,o,n,a,s,u,i){r.test={},r.test.results={},r.lastRequestedResultSize=0,r.loadResults=function(t){var a=o.get(Routing.generate("overwatch_test_testapi_gettest",{id:n.id})).success(function(e){var t=r.test.results;r.test=e,r.test.results=t}),s=o.get(Routing.generate("overwatch_result_api_getresultsfortest",{id:n.id})+"?pageSize="+t).success(function(e){r.test.results=e,r.lastRequestedResultSize=t});i.all([a,s]).then(function(){e(!1)})},r.loadOlderResults=function(){e(!0),r.loadResults(r.lastRequestedResultSize+10)},r.removeTest=function(t){u.confirm("Are you sure you want to remove this test? All historical data for this test will also be deleted.")&&(e(!0),o["delete"](Routing.generate("overwatch_test_testapi_deletetest",{id:t})).success(function(){s.path("/")}))},r.isGranted=function(e,r){return"undefined"==typeof r?t(e):t(e,r.name)},r.runTest=function(t){e(!0),o.post(Routing.generate("overwatch_test_testapi_runtest",{id:t}),null).success(function(){r.loadResults(r.lastRequestedResultSize)})},r.loadResults(10);var c=a(function(){r.loadResults(r.lastRequestedResultSize)},6e4);r.$on("$destroy",function(){a.cancel(c)})}]),overwatchApp.controller("EditTestController",["showLoading","$scope","overwatchApi","$routeParams","$location","$q",function(e,t,r,o,n,a){t.title="Edit test",t.test={},t.expectations=[];var s=r.get(Routing.generate("overwatch_expectation_api_getall")).success(function(e){t.expectations=e}),u=r.get(Routing.generate("overwatch_test_testapi_gettest",{id:o.id})).success(function(e){t.test=e});a.all([s,u]).then(function(){e(!1)}),t.save=function(){e(!0),r.put(Routing.generate("overwatch_test_testapi_updatetest",{id:o.id}),t.test).success(function(){n.path("/test/"+o.id)})}}]),overwatchApp.controller("ManageUsersController",["showLoading","$scope","overwatchApi","$window","ModalService","$gravatar",function(e,t,r,o,n,a){t.users=[],t.updatedRoles=[],t.currentUserId=currentUser.id;var s=function(){r.get(Routing.generate("overwatch_user_api_getallusers")).success(function(r){t.users=r,e(!1)})};t.createUser=function(){var t=o.prompt("Please type the new user's email address.","");null!==t&&(e(!0),r.post(Routing.generate("overwatch_user_api_createuser",{email:t}),{}).success(function(e){s()}))},t.userAvatar=function(e,t){return a.fn(e,t)},t.updateRole=function(t){n.showModal({templateUrl:"/partials/roleDialog.html",controller:"RoleDialogController"}).then(function(o){o.close.then(function(o){"CANCEL"!==o&&(e(!0),r.put(Routing.generate("overwatch_user_api_setuserrole",{id:t,role:o}),{}).success(function(){s()}))})})},t.lockUser=function(t){e(!0),r.put(Routing.generate("overwatch_user_api_togglelockuser",{id:t}),{}).success(function(){s()})},t.removeUser=function(t){o.confirm("Are you sure you want to permanently remove this user?")&&(e(!0),r["delete"](Routing.generate("overwatch_user_api_deleteuser",{id:t})).success(function(){s()}))},s()}]),overwatchApp.controller("ManageAlertSettingsController",["showLoading","$scope","overwatchApi",function(e,t,r){t.settings=[];var o=function(){r.get(Routing.generate("overwatch_user_api_getalertsettings")).success(function(r){t.settings=r,e(!1)})};t.isUsersSetting=function(e){return currentUser.alertSetting===e},t.saveSetting=function(t){e(!0),r.put(Routing.generate("overwatch_user_api_updateuser"),{alertSetting:t}).success(function(){currentUser.alertSetting=t,e(!1)})},o()}]),overwatchApp.controller("RoleDialogController",["$scope","close",function(e,t){e.close=function(e){t(e)}}]),overwatchApp.controller("MyAccountController",["showLoading","$scope","overwatchApi",function(e,t,r){t.telephoneNumber=currentUser.telephoneNumber,t.apiKeyFieldType="password",t.saveProfile=function(){e(!0),r.put(Routing.generate("overwatch_user_api_updateuser"),{telephoneNumber:t.telephoneNumber}).then(function(t){currentUser.telephoneNumber=t.data.telephoneNumber,e(!1)})["catch"](function(){e(!1),alert("Sorry, there was an error saving your telephone number.")})},t.toggleAPIKeyVisibility=function(){var e="password";"password"===t.apiKeyFieldType&&(e="text"),t.apiKeyFieldType=e},e(!1)}]),overwatchApp.run(["showLoading","$rootScope","$window","Idle",function(e,t,r,o){t.$on("$routeChangeStart",function(){e(!0)}),t.$on("$routeChangeSuccess",function(e,t){t.title?r.document.title=t.title+" - Overwatch":r.document.title="Overwatch"}),t.$on("IdleTimeout",function(){r.location.href="/logout"}),o.watch()}]),overwatchApp.factory("showLoading",["$rootScope",function(e){return function(t){e.isLoading=t}}]),overwatchApp.factory("isGranted",[function(){var e=function(t){return"ROLE_SUPER_ADMIN"!==t&&e("ROLE_SUPER_ADMIN")?!0:-1!==currentUser.roles.indexOf(t)},t=function(t){return e("ROLE_SUPER_ADMIN")?!0:-1!==currentUser.groups.indexOf(t)};return function(r,o){switch(r){case"SUPER_ADMIN":return e("ROLE_SUPER_ADMIN");case"ADMIN":return"undefined"==typeof o?e("ROLE_ADMIN"):e("ROLE_ADMIN")&&t(o);case"USER":return t(o);default:return!1}}}]),overwatchApp.factory("overwatchApiAuth",[function(){return{getHttpHeaders:function(){return{"X-Api-User":this.getUser(),"X-Api-Timestamp":this.getTimestamp(),"X-Api-Token":this.getToken()}},getToken:function(){return CryptoJS.HmacSHA256("timestamp="+this.getTimestamp(),currentUser.apiKey)},getUser:function(){return currentUser.id},getTimestamp:function(){return(new Date).getTime().toString().substr(0,10)}}}]),overwatchApp.service("overwatchApi",["overwatchApiAuth","$http",function(e,t){return{call:function(r){return r.hasOwnProperty("headers")?r.headers=angular.merge(r.headers,e.getHttpHeaders()):r.headers=e.getHttpHeaders(),t(r)},transformUrl:function(e){return 0!==e.indexOf("/api/")&&(e=Routing.generate(e)),e},get:function(e){return this.call({method:"GET",url:this.transformUrl(e)})},post:function(e,t){return this.call({method:"POST",data:t,url:this.transformUrl(e)})},put:function(e,t){return this.call({method:"PUT",data:t,url:this.transformUrl(e)})},"delete":function(e){return this.call({method:"DELETE",url:this.transformUrl(e)})}}}]),overwatchApp.factory("overwatchApiErrorHandler",["$location","$window",function(e,t){return{responseError:function(r){401===r.status||403===r.status?t.location.reload():e.url("/error")}}}]),overwatchApp.filter("ucfirst",[function(){return function(e,t){return e.replace(/(?:^|\s)\S/g,function(e){return e.toUpperCase()})}}]),overwatchApp.filter("strLimit",["$filter",function(e){return function(t,r){return t.length<=r?t:e("limitTo")(t,r)+"..."}}]),overwatchApp.filter("timeago",[function(){return function(e,t){var e=1e3*e;if(isNaN(e))return"never";var r,o=function(e,t,r){var o="function"==typeof e?e(t,i):e,n=r.numbers&&r.numbers[t]||t;return o.replace(/%d/i,n)},n=(new Date).getTime(),a=new Date(e).getTime(),s=t||!1,u={prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years"},i=n-a,c=Math.abs(i)/1e3,l=c/60,p=l/60,d=p/24,f=d/365,h=void 0===u.wordSeparator?" ":u.wordSeparator,g=u.prefixAgo,m=u.suffixAgo;return s&&0>i&&(g=u.prefixFromNow,m=u.suffixFromNow),r=45>c&&o(u.seconds,Math.round(c),u)||90>c&&o(u.minute,1,u)||45>l&&o(u.minutes,Math.round(l),u)||90>l&&o(u.hour,1,u)||24>p&&o(u.hours,Math.round(p),u)||42>p&&o(u.day,1,u)||30>d&&o(u.days,Math.round(d),u)||45>d&&o(u.month,1,u)||365>d&&o(u.months,Math.round(d/30),u)||1.5>f&&o(u.year,1,u)||o(u.years,Math.round(f),u),[g,r,m].join(h).trim()}}]),!function(){"use strict";var e=angular.module("angularModalService",[]);e.factory("ModalService",["$document","$compile","$controller","$http","$rootScope","$q","$timeout","$templateCache",function(e,t,r,o,n,a,s,u){function i(){var e=this,i=function(e,t){var r=a.defer();if(e)r.resolve(e);else if(t){var n=u.get(t);void 0!==n?r.resolve(n):o({method:"GET",url:t,cache:!0}).then(function(e){u.put(t,e.data),r.resolve(e.data)})["catch"](function(e){r.reject(e)})}else r.reject("No template or templateUrl has been specified.");return r.promise};e.showModal=function(e){var o=a.defer(),u=e.controller;return u?(i(e.template,e.templateUrl).then(function(i){var l=n.$new(),p=a.defer(),d={$scope:l,close:function(e,t){(void 0===t||null===t)&&(t=0),s(function(){p.resolve(e)},t)}};if(e.inputs)for(var f in e.inputs)d[f]=e.inputs[f];var h=angular.element(i),g=t(h),m=g(l);d.$element=m;var v=r(u,d);e.appendElement?e.appendElement.append(m):c.append(m);var w={controller:v,scope:l,element:m,close:p.promise};w.close.then(function(){l.$destroy(),m.remove()}),o.resolve(w)})["catch"](function(e){o.reject(e)}),o.promise):(o.reject("No controller has been specified."),o.promise)}}var c=e.find("body");return new i}])}(); \ No newline at end of file diff --git a/web/assets/lib/src/helpers.js b/web/assets/lib/src/helpers.js index d3ffbb6..1c14e08 100644 --- a/web/assets/lib/src/helpers.js +++ b/web/assets/lib/src/helpers.js @@ -55,7 +55,12 @@ overwatchApp.factory('isGranted', [ return userHasRole('ROLE_SUPER_ADMIN'); break; case 'ADMIN': - return userHasRole('ROLE_ADMIN') && userInGroup(group); + if (typeof group === 'undefined') { + return userHasRole('ROLE_ADMIN'); + } else { + return userHasRole('ROLE_ADMIN') && userInGroup(group); + } + break; case 'USER': return userInGroup(group); diff --git a/web/assets/styles/app.css b/web/assets/styles/app.css index d540e5d..415aa6b 100644 --- a/web/assets/styles/app.css +++ b/web/assets/styles/app.css @@ -1 +1 @@ -@import url("//fonts.googleapis.com/css?family=Open+Sans:400,300,600,700");@import url("//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css");abbr,address,article,aside,audio,b,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,.dialog-bg .dialog,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,samp,section,small,span,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,ul,var,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:0 0}body{line-height:1}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:0 0}ins{background-color:#ff9;color:#000;text-decoration:none}mark{background-color:#ff9;color:#000;font-style:italic;font-weight:700}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box}html,body{background:#E9EEF4;font-family:'Open Sans', sans-serif}img{height:auto;max-width:100%}ul{list-style:none;margin:0;padding:0}a{color:inherit;text-decoration:none}.left{float:left}.right{float:right}.left-align{text-align:left}.right-align{text-align:right}.logo{color:#ffffff;font-size:20px;font-weight:bold;text-transform:uppercase}.content{background:#E9EEF4;float:right;word-wrap:break-word;width:-webkit-calc(100% - 210px);width:calc(100% - 210px)}@media screen and (max-width: 620px){.content{width:-webkit-calc(100% - 60px);width:calc(100% - 60px)}}.content.full-width{width:100%}.row{display:inline-block;width:100%;clear:both;overflow:hidden;margin-bottom:20px}.row:last-child{margin-bottom:0}header{background:#ffffff;float:left;position:fixed;top:0;right:0;width:100%;z-index:10}header .white-label{background:#3ea5e7;position:relative;float:left;max-width:210px;padding:10px;min-height:64px;width:100%;max-height:44px;text-align:center;z-index:11}header .white-label .logo{line-height:44px}main{background:#E9EEF4;float:left;padding:64px 25px 10px;position:relative;width:100%}.sidebar{background:#2A2D33;position:fixed;top:64px;left:0;bottom:0;overflow:hidden;width:210px}@media screen and (max-width: 620px){.sidebar{width:60px}}footer{position:absolute;bottom:0;padding:10px;color:#666666;font-size:11px;line-height:15px;z-index:20}footer a{color:#777}@media screen and (max-width: 620px){footer{display:none}}.settings{display:table;border-spacing:10px 0px;margin-bottom:20px;width:100%}.settings .setting{background:#E0E0E0;border-radius:5px;color:#777;cursor:pointer;display:table-cell;padding:16px 10px;margin-right:1%;text-align:center;width:19%;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}@media screen and (max-width: 850px){.settings .setting{display:inline-block;margin-bottom:10px;width:100%}}.settings .setting.last{margin-right:0}.settings .setting:hover{background:#c7c7c7}.settings .setting.current-setting{background:#279BE4;color:#fff}.settings .setting .icon{font-size:40px;margin-bottom:10px}.btn{border:2px solid transparent;border-radius:3px;box-shadow:none;cursor:pointer;outline:none;display:inline-block;padding:10px 16px;text-decoration:none;text-shadow:none;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.btn.btn-small{font-size:12px;padding:6px 10px}.btn.btn-blue{background:#279BE4;color:#fff}.btn.btn-blue:hover{background:#187fc0}.btn.btn-blue:focus{border:2px solid #279BE4;box-shadow:none}.btn.btn-red{background:#E31B23;color:#fff}.btn.btn-red:hover{background:#b5161c}.btn.btn-red:focus{border:2px solid #E31B23;box-shadow:none}.btn.btn-warning{background:orange;color:#fff}.btn.btn-warning:hover{background:#cc8400}.btn.btn-warning:focus{border:2px solid orange;box-shadow:none}.btn.btn-grey{background:#E0E0E0;color:#777}.btn.btn-grey:hover{background:#c7c7c7}.btn.btn-grey:focus{border:2px solid #E0E0E0;box-shadow:none}.btn.btn-submit{display:block;margin:0 auto;width:100%}.dropbtn{background-color:#4CAF50;color:white;padding:16px;font-size:16px;border:none;cursor:pointer}.dropbtn:hover,.dropbtn:focus{background-color:#3e8e41}.dropdown{position:relative;display:inline-block}.dropdown-content{position:absolute;background-color:#f9f9f9;min-width:160px;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2)}.dropdown-content a{color:black;padding:12px 16px;text-decoration:none;display:block}.dropdown-content a:hover{background-color:#f1f1f1}form,.dialog-bg .dialog{background:#fff;border-radius:5px;display:inline-block;margin-bottom:40px;padding:40px 60px 30px;width:40%}@media screen and (max-width: 768px){form,.dialog-bg .dialog{padding:20px 30px;width:100%}}form.full-width,.dialog-bg .full-width.dialog{width:100%}form.test-form,.dialog-bg .test-form.dialog{text-align:left}form.test-form .control-group input,.dialog-bg .test-form.dialog .control-group input{padding:10px 20px;text-align:left}form.center-form,.dialog-bg .dialog{display:block;margin:60px auto;text-align:center}@media screen and (max-width: 768px){form.center-form,.dialog-bg .dialog{margin:20px auto}}form h1,.dialog-bg .dialog h1,form h2,.dialog-bg .dialog h2{color:#777;font-size:2em;margin:0 0 30px}form .description,.dialog-bg .dialog .description{color:#777;margin-bottom:20px}form .description.warning,.dialog-bg .dialog .description.warning{color:orange}form .description strong,.dialog-bg .dialog .description strong{color:#5e5e5e;font-size:18px;line-height:22px}.control-group{margin-bottom:10px}.control-group.padding{padding:10px 0}.control-group input{text-align:center;background:#E0E0E0;border:2px solid transparent;border-radius:3px;color:#777;font-size:16px;font-weight:200;padding:10px;width:100%;outline:none;-webkit-transition:border 0.3s ease-in-out;-moz-transition:border 0.3s ease-in-out;transition:border 0.3s ease-in-out}.control-group input ::-webkit-input-placeholder{color:#777;font-weight:200}.control-group input :-moz-placeholder{color:#777;font-weight:200}.control-group input ::-moz-placeholder{color:#777;font-weight:200}.control-group input :-ms-input-placeholder{color:#777;font-weight:200}.control-group input :placeholder-shown{color:#777;font-weight:200}.control-group input:focus{border:2px solid #279BE4;box-shadow:none}.control-group .styled-select{background:no-repeat right #E0E0E0;border:2px solid transparent;border-radius:3px;overflow:hidden;display:inline-block;margin-bottom:10px;position:relative;width:100%}.control-group .styled-select:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f0d7";position:absolute;color:#777;right:10px;top:50%;-webkit-transform:translate(0, -50%);-moz-transform:translate(0, -50%);-ms-transform:translate(0, -50%);-o-transform:translate(0, -50%);transform:translate(0, -50%)}.control-group .styled-select select{background:transparent;color:#777;font-size:16;font-weight:200;padding:10px 20px;font-size:16px;line-height:20px;border:0;border-radius:0;outline:none;width:110%;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none}.control-group p{margin-bottom:6px}.control-group label.hide{visibility:hidden}.control-group .password-toggle{position:relative}.control-group .password-toggle input{padding-right:40px}.control-group .password-toggle .toggle-btn{font-size:20px;position:absolute;right:10px;top:50%;-webkit-transform:translate(0, -50%);-moz-transform:translate(0, -50%);-ms-transform:translate(0, -50%);-o-transform:translate(0, -50%);transform:translate(0, -50%)}.checkbox-group input{display:inline-block;width:auto}.checkbox-group label{color:#777;position:relative;top:2px}.bottom-link{color:#777;cursor:pointer;display:block;font-size:12px;margin-top:30px}.intro{background:#fff;border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom:1px solid #ccc;float:left;margin-bottom:15px;padding:15px;overflow:hidden;width:100%}.intro h1{margin:0 0 10px;font-weight:normal;padding-bottom:5px}.intro p{margin:0;padding-left:2px}#loading{color:#fff;font-size:24px;left:230px;position:absolute;top:50%;z-index:10;-webkit-transform:translate(0, -50%);-moz-transform:translate(0, -50%);-ms-transform:translate(0, -50%);-o-transform:translate(0, -50%);transform:translate(0, -50%)}#loading i{-webkit-animation:spinRight 1s linear infinite;-moz-animation:spinRight 1s linear infinite;animation:spinRight 1s linear infinite;-webkit-transform-origin:center center;-moz-transform-origin:center center;-ms-transform-origin:center center;-o-transform-origin:center center;transform-origin:center center}@-webkit-keyframes spinRight{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@-moz-keyframes spinRight{from{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(360deg)}}@keyframes spinRight{from{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.warning-message{background:#fff;border:1px solid orange;color:#eb9800;display:inline-block;line-height:20px;margin:0 0 18px;padding:10px;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.dialog-bg{background:rgba(0,0,0,0.8);bottom:0;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:100}.dialog-bg .dialog{width:60%}.dialog-bg .dialog button{width:32.8%}.sidebar-nav ul li{position:relative}.sidebar-nav ul li a{color:#C2C2C2;font-size:.95em;padding:15px 20px;float:left;width:100%;font-weight:600;position:relative}@media screen and (max-width: 620px){.sidebar-nav ul li a span{display:none}}.sidebar-nav ul li a i{padding-right:8px;font-size:1.3em;color:#60636B;text-align:center;width:25px}.sidebar-nav ul li a:after{content:"";display:inline-block;width:0;height:0;border-style:solid;border-width:12px 14px 12px 0;border-color:transparent transparent transparent transparent;position:absolute;right:0;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}@media screen and (max-width: 620px){.sidebar-nav ul li a:after{display:none}}.sidebar-nav ul li:hover a,.sidebar-nav ul li.active a{background:#fff;color:#333333}.sidebar-nav ul li:hover a:after,.sidebar-nav ul li.active a:after{border-color:transparent #E9EEF4 transparent transparent}.header-nav{background:#279BE4;min-height:64px;position:relative;z-index:1}.header-nav ul{height:64px;float:right}.header-nav ul li{float:left;padding:12px;position:relative}.header-nav ul li:first-child{border-left:none}.header-nav ul li a{color:#fff;float:left}.header-nav .logged-in ul li:hover{background:#01A9F0;color:#fff}.header-nav .nav-profile{background:#1673ae;height:64px;cursor:pointer;position:relative;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.header-nav .nav-profile:hover{background:#156da5}.header-nav .nav-profile .nav-profile-image img{width:39px;height:41px;border-radius:50%;float:left}.header-nav .nav-profile .nav-profile-name{float:right;margin:10px;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width: 620px){.header-nav .nav-profile .nav-profile-name{display:none}}.header-nav .nav-profile .nav-profile-name i{padding:0 0 0 10px}.header-nav .nav-profile ul{background:#279BE4;position:absolute;top:100%;height:auto;right:0;width:100%}@media screen and (max-width: 620px){.header-nav .nav-profile ul{min-width:200px}}.header-nav .nav-profile ul li{float:none;display:block;padding:0;width:100%}.header-nav .nav-profile ul li a{display:block;padding:14px 20px;width:100%;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.header-nav .nav-profile ul li:hover a{background:#187fc0}.results .result,.results .test,.tests .result,.tests .test{border-bottom:1px solid #ededed;display:inline-block;margin-bottom:20px;padding:0 0 10px;width:100%}.results .result .title,.results .test .title,.tests .result .title,.tests .test .title{color:#777;margin:0 0 10px}.results .test h3,.tests .test h3{line-height:20px}.results .test p,.tests .test p{line-height:20px;margin-bottom:6px}.status.passed:after,.status.error:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.status{background:#fff;border-radius:100%;display:inline-block;float:left;margin:6px 8px 0 0;height:30px;line-height:30px;text-align:center;position:relative;vertical-align:middle;width:30px;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.status.passed{border:3px solid #00853F;color:#00853F}.status.passed:after{content:"\f00c"}.status.error{border:3px solid #E31B23;color:#E31B23}.status.error:after{content:"\f12a"}.users .user{border-bottom:1px solid #ededed;display:inline-block;margin-bottom:20px;padding:0 0 10px;width:100%}.users .user .title{color:#777;margin:0 0 10px;text-transform:uppercase}.users .user .avatar{border-radius:100%;border:2px solid;display:inline-block;float:left;height:50px;margin-right:10px;overflow:hidden;width:50px}.users .user .avatar.role_user{border-color:#00853F}.users .user .avatar.role_admin{border-color:orange}.users .user .avatar.role_super_admin{border-color:#E31B23}.users .user .avatar img{width:100%;height:100%}.user-key{border-radius:5px;color:#fff;font-size:12px;padding:2px 6px}.user-key.role_user{background:#00853F}.user-key.role_admin{background:orange}.user-key.role_super_admin{background:#E31B23}.widget-box{background:#fff;border-radius:5px;border:1px solid #E0E0E0;float:left;margin:0 0 15px 0;overflow:hidden;width:100%}.widget-box.half-widget{max-width:49.5%}@media screen and (max-width: 1080px){.widget-box.half-widget{max-width:100%}}.widget-box.half-widget:nth-child(odd){margin-right:1%}.widget-box .widget-header{background:#279BE4;color:#fff;display:inline-block;font-size:20px;line-height:24px;padding:10px 20px;width:100%}.widget-box .widget-header h2{font-size:15px;font-weight:normal;margin:0;padding:11px 15px;color:#F9F9F9;display:inline-block}.widget-box .widget-header a{color:inherit;cursor:pointer;margin-left:6px}.widget-box .widget-content{padding:20px}.widget-box .widget-footer{border-top:1px solid #E0E0E0;color:#777;display:inline-block;padding:14px 20px;width:100%} +@import url("//fonts.googleapis.com/css?family=Open+Sans:400,300,600,700");@import url("//maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css");abbr,address,article,aside,audio,b,blockquote,body,canvas,caption,cite,code,dd,del,details,dfn,div,dl,dt,em,fieldset,figcaption,figure,footer,form,.dialog-bg .dialog,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,p,pre,q,samp,section,small,span,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,ul,var,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:0 0}body{line-height:1}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}nav ul{list-style:none}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:0 0}ins{background-color:#ff9;color:#000;text-decoration:none}mark{background-color:#ff9;color:#000;font-style:italic;font-weight:700}del{text-decoration:line-through}abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}table{border-collapse:collapse;border-spacing:0}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}input,select{vertical-align:middle}/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box}html,body{background:#E9EEF4;font-family:'Open Sans', sans-serif}img{height:auto;max-width:100%}ul{list-style:none;margin:0;padding:0}a{color:inherit;text-decoration:none}.left{float:left}.right{float:right}.left-align{text-align:left}.right-align{text-align:right}.logo{color:#ffffff;font-size:20px;font-weight:bold;text-transform:uppercase}.content{background:#E9EEF4;float:right;word-wrap:break-word;width:-webkit-calc(100% - 210px);width:calc(100% - 210px)}@media screen and (max-width: 620px){.content{width:-webkit-calc(100% - 60px);width:calc(100% - 60px)}}.content.full-width{width:100%}.row{display:inline-block;width:100%;clear:both;overflow:hidden;margin-bottom:20px}.row:last-child{margin-bottom:0}header{background:#ffffff;float:left;position:fixed;top:0;right:0;width:100%;z-index:10}header .white-label{background:#3ea5e7;position:relative;float:left;max-width:210px;padding:10px;min-height:64px;width:100%;max-height:44px;text-align:center;z-index:11}header .white-label .logo{line-height:44px}main{background:#E9EEF4;float:left;padding:64px 25px 10px;position:relative;width:100%}.sidebar{background:#2A2D33;position:fixed;top:64px;left:0;bottom:0;overflow:hidden;width:210px}@media screen and (max-width: 620px){.sidebar{width:60px}}footer{position:absolute;bottom:0;padding:10px;color:#666666;font-size:11px;line-height:15px;z-index:20}footer a{color:#777}@media screen and (max-width: 620px){footer{display:none}}.settings{display:table;border-spacing:10px 0px;margin-bottom:20px;width:100%}.settings .setting{background:#E0E0E0;border-radius:5px;color:#777;cursor:pointer;display:table-cell;padding:16px 10px;margin-right:1%;text-align:center;width:19%;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}@media screen and (max-width: 850px){.settings .setting{display:inline-block;margin-bottom:10px;width:100%}}.settings .setting.last{margin-right:0}.settings .setting:hover{background:#c7c7c7}.settings .setting.current-setting{background:#279BE4;color:#fff}.settings .setting .icon{font-size:40px;margin-bottom:10px}.btn{border:2px solid transparent;border-radius:3px;box-shadow:none;cursor:pointer;outline:none;display:inline-block;padding:10px 16px;text-decoration:none;text-shadow:none;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.btn.btn-small{font-size:12px;padding:6px 10px}.btn.btn-blue{background:#279BE4;color:#fff}.btn.btn-blue:hover{background:#187fc0}.btn.btn-blue:focus{border:2px solid #279BE4;box-shadow:none}.btn.btn-red{background:#E31B23;color:#fff}.btn.btn-red:hover{background:#b5161c}.btn.btn-red:focus{border:2px solid #E31B23;box-shadow:none}.btn.btn-warning{background:orange;color:#fff}.btn.btn-warning:hover{background:#cc8400}.btn.btn-warning:focus{border:2px solid orange;box-shadow:none}.btn.btn-grey{background:#E0E0E0;color:#777}.btn.btn-grey:hover{background:#c7c7c7}.btn.btn-grey:focus{border:2px solid #E0E0E0;box-shadow:none}.btn.btn-submit{display:block;margin:0 auto;width:100%}.dropbtn{background-color:#4CAF50;color:white;padding:16px;font-size:16px;border:none;cursor:pointer}.dropbtn:hover,.dropbtn:focus{background-color:#3e8e41}.dropdown{position:relative;display:inline-block}.dropdown-content{position:absolute;background-color:#f9f9f9;min-width:160px;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2)}.dropdown-content a{color:black;padding:12px 16px;text-decoration:none;display:block}.dropdown-content a:hover{background-color:#f1f1f1}form,.dialog-bg .dialog{background:#fff;border-radius:5px;display:inline-block;margin-bottom:40px;padding:40px 60px 30px;width:40%}@media screen and (max-width: 768px){form,.dialog-bg .dialog{padding:20px 30px;width:100%}}form.full-width,.dialog-bg .full-width.dialog{width:100%}form.test-form,.dialog-bg .test-form.dialog{text-align:left}form.test-form .control-group input,.dialog-bg .test-form.dialog .control-group input{padding:10px 20px;text-align:left}form.center-form,.dialog-bg .dialog{display:block;margin:60px auto;text-align:center}@media screen and (max-width: 768px){form.center-form,.dialog-bg .dialog{margin:20px auto}}form h1,.dialog-bg .dialog h1,form h2,.dialog-bg .dialog h2{color:#777;font-size:2em;margin:0 0 30px}form .description,.dialog-bg .dialog .description{color:#777;margin-bottom:20px}form .description.warning,.dialog-bg .dialog .description.warning{color:orange}form .description strong,.dialog-bg .dialog .description strong{color:#5e5e5e;font-size:18px;line-height:22px}form .description a,.dialog-bg .dialog .description a{color:#5e5e5e;font-style:italic}.control-group{margin-bottom:10px}.control-group.padding{padding:10px 0}.control-group input{text-align:center;background:#E0E0E0;border:2px solid transparent;border-radius:3px;color:#777;font-size:16px;font-weight:200;padding:10px;width:100%;outline:none;-webkit-transition:border 0.3s ease-in-out;-moz-transition:border 0.3s ease-in-out;transition:border 0.3s ease-in-out}.control-group input ::-webkit-input-placeholder{color:#777;font-weight:200}.control-group input :-moz-placeholder{color:#777;font-weight:200}.control-group input ::-moz-placeholder{color:#777;font-weight:200}.control-group input :-ms-input-placeholder{color:#777;font-weight:200}.control-group input :placeholder-shown{color:#777;font-weight:200}.control-group input:focus{border:2px solid #279BE4;box-shadow:none}.control-group .styled-select{background:no-repeat right #E0E0E0;border:2px solid transparent;border-radius:3px;overflow:hidden;display:inline-block;margin-bottom:10px;position:relative;width:100%}.control-group .styled-select:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f0d7";position:absolute;color:#777;right:10px;top:50%;-webkit-transform:translate(0, -50%);-moz-transform:translate(0, -50%);-ms-transform:translate(0, -50%);-o-transform:translate(0, -50%);transform:translate(0, -50%)}.control-group .styled-select select{background:transparent;color:#777;font-size:16;font-weight:200;padding:10px 20px;font-size:16px;line-height:20px;border:0;border-radius:0;outline:none;width:110%;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none}.control-group p{margin-bottom:6px}.control-group label.hide{visibility:hidden}.control-group .password-toggle{position:relative}.control-group .password-toggle input{padding-right:40px}.control-group .password-toggle .toggle-btn{font-size:20px;position:absolute;right:10px;top:50%;-webkit-transform:translate(0, -50%);-moz-transform:translate(0, -50%);-ms-transform:translate(0, -50%);-o-transform:translate(0, -50%);transform:translate(0, -50%)}.checkbox-group input{display:inline-block;width:auto}.checkbox-group label{color:#777;position:relative;top:2px}.bottom-link{color:#777;cursor:pointer;display:block;font-size:12px;margin-top:30px}.intro{background:#fff;border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom:1px solid #ccc;float:left;margin-bottom:15px;padding:15px;overflow:hidden;width:100%}.intro h1{margin:0 0 10px;font-weight:normal;padding-bottom:5px}.intro p{margin:0;padding-left:2px}#loading{color:#fff;font-size:24px;left:230px;position:absolute;top:50%;z-index:10;-webkit-transform:translate(0, -50%);-moz-transform:translate(0, -50%);-ms-transform:translate(0, -50%);-o-transform:translate(0, -50%);transform:translate(0, -50%)}#loading i{-webkit-animation:spinRight 1s linear infinite;-moz-animation:spinRight 1s linear infinite;animation:spinRight 1s linear infinite;-webkit-transform-origin:center center;-moz-transform-origin:center center;-ms-transform-origin:center center;-o-transform-origin:center center;transform-origin:center center}@-webkit-keyframes spinRight{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}@-moz-keyframes spinRight{from{-moz-transform:rotate(0deg)}to{-moz-transform:rotate(360deg)}}@keyframes spinRight{from{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-o-transform:rotate(360deg);transform:rotate(360deg)}}.warning-message{background:#fff;border:1px solid orange;color:#eb9800;display:inline-block;line-height:20px;margin:0 0 18px;padding:10px;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.warning-message a{color:#b87700;font-style:italic}.dialog-bg{background:rgba(0,0,0,0.8);bottom:0;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:100}.dialog-bg .dialog{width:60%}.dialog-bg .dialog button{width:32.8%}.sidebar-nav ul li{position:relative}.sidebar-nav ul li a{color:#C2C2C2;font-size:.95em;padding:15px 20px;float:left;width:100%;font-weight:600;position:relative}@media screen and (max-width: 620px){.sidebar-nav ul li a span{display:none}}.sidebar-nav ul li a i{padding-right:8px;font-size:1.3em;color:#60636B;text-align:center;width:25px}.sidebar-nav ul li a:after{content:"";display:inline-block;width:0;height:0;border-style:solid;border-width:12px 14px 12px 0;border-color:transparent transparent transparent transparent;position:absolute;right:0;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}@media screen and (max-width: 620px){.sidebar-nav ul li a:after{display:none}}.sidebar-nav ul li:hover a,.sidebar-nav ul li.active a{background:#fff;color:#333333}.sidebar-nav ul li:hover a:after,.sidebar-nav ul li.active a:after{border-color:transparent #E9EEF4 transparent transparent}.header-nav{background:#279BE4;min-height:64px;position:relative;z-index:1}.header-nav ul{height:64px;float:right}.header-nav ul li{float:left;padding:12px;position:relative}.header-nav ul li:first-child{border-left:none}.header-nav ul li a{color:#fff;float:left}.header-nav .logged-in ul li:hover{background:#01A9F0;color:#fff}.header-nav .nav-profile{background:#1673ae;height:64px;cursor:pointer;position:relative;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.header-nav .nav-profile:hover{background:#156da5}.header-nav .nav-profile .nav-profile-image img{width:39px;height:41px;border-radius:50%;float:left}.header-nav .nav-profile .nav-profile-name{float:right;margin:10px;color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width: 620px){.header-nav .nav-profile .nav-profile-name{display:none}}.header-nav .nav-profile .nav-profile-name i{padding:0 0 0 10px}.header-nav .nav-profile ul{background:#279BE4;position:absolute;top:100%;height:auto;right:0;width:100%}@media screen and (max-width: 620px){.header-nav .nav-profile ul{min-width:200px}}.header-nav .nav-profile ul li{float:none;display:block;padding:0;width:100%}.header-nav .nav-profile ul li a{display:block;padding:14px 20px;width:100%;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.header-nav .nav-profile ul li:hover a{background:#187fc0}.results .result,.results .test,.tests .result,.tests .test{border-bottom:1px solid #ededed;display:inline-block;margin-bottom:20px;padding:0 0 10px;width:100%}.results .result .title,.results .test .title,.tests .result .title,.tests .test .title{color:#777;margin:0 0 10px}.results .test h3,.tests .test h3{line-height:20px}.results .test p,.tests .test p{line-height:20px;margin-bottom:6px}.status:after,.status.passed:after,.status.failed:after,.status.unsatisfactory:after,.status.error:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"";position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.status{background:#fff;border-radius:100%;border:3px solid grey;color:#777;display:inline-block;float:left;margin:6px 8px 0 0;height:30px;line-height:30px;text-align:center;position:relative;vertical-align:middle;width:30px;-webkit-transition:all 0.3s ease-in-out;-moz-transition:all 0.3s ease-in-out;transition:all 0.3s ease-in-out}.status:after{content:"\f252"}.status.passed{border:3px solid #00853F;color:#00853F}.status.passed:after{content:"\f00c"}.status.failed{border:3px solid #E31B23;color:#E31B23}.status.failed:after{content:"\f12a"}.status.unsatisfactory{border:3px solid orange;color:orange}.status.unsatisfactory:after{content:"\f12a"}.status.error{border:3px solid #E31B23;color:#E31B23}.status.error:after{content:"\f00d"}.users .user{border-bottom:1px solid #ededed;display:inline-block;margin-bottom:20px;padding:0 0 10px;width:100%}.users .user .title{color:#777;margin:0 0 10px;text-transform:uppercase}.users .user .avatar{border-radius:100%;border:2px solid;display:inline-block;float:left;height:50px;margin-right:10px;overflow:hidden;width:50px}.users .user .avatar.role_user{border-color:#00853F}.users .user .avatar.role_admin{border-color:orange}.users .user .avatar.role_super_admin{border-color:#E31B23}.users .user .avatar img{width:100%;height:100%}.user-key{border-radius:5px;color:#fff;font-size:12px;padding:2px 6px}.user-key.role_user{background:#00853F}.user-key.role_admin{background:orange}.user-key.role_super_admin{background:#E31B23}.widget-box{background:#fff;border-radius:5px;border:1px solid #E0E0E0;float:left;margin:0 0 15px 0;overflow:hidden;width:100%}.widget-box.half-widget{max-width:49.5%}@media screen and (max-width: 1080px){.widget-box.half-widget{max-width:100%}}.widget-box.half-widget:nth-child(odd){margin-right:1%}.widget-box .widget-header{background:#279BE4;color:#fff;display:inline-block;font-size:20px;line-height:24px;padding:10px 20px;width:100%}.widget-box .widget-header h2{font-size:15px;font-weight:normal;margin:0;padding:11px 15px;color:#F9F9F9;display:inline-block}.widget-box .widget-header a{color:inherit;cursor:pointer;margin-left:6px}.widget-box .widget-content{padding:20px}.widget-box .widget-footer{border-top:1px solid #E0E0E0;color:#777;display:inline-block;padding:14px 20px;width:100%} diff --git a/web/partials/dashboard.html b/web/partials/dashboard.html index 55cf34b..4cdb5c3 100644 --- a/web/partials/dashboard.html +++ b/web/partials/dashboard.html @@ -23,9 +23,9 @@

Dashboard

  • -
    +
    -

    {{ test.name }} (Last Tested {{ test.result.createdAt|timeago }})

    +

    {{ test.name }} (Last Tested {{ test.result.createdAt|timeago }})

    Expect {{ test.actual }} {{ test.expectation }} {{ test.expected }}

    diff --git a/web/partials/viewTest.html b/web/partials/viewTest.html index b905c54..8b60b7c 100644 --- a/web/partials/viewTest.html +++ b/web/partials/viewTest.html @@ -18,9 +18,9 @@

    View Test '{{ test.name }}'