Commit 977fb6e3c633cd63606ac5b241dc7e65fa0619e8

Authored by Adabriand Furtado
1 parent 3d5def44
Exists in master

Adicionado o Ranking e reorganização do projeto.

Showing 63 changed files with 840 additions and 245 deletions   Show diff stats
validador.py
... ... @@ -35,7 +35,7 @@ class Validador:
35 35 def __update_project_info(self, project):
36 36 template = self.env.get_template('template.html')
37 37 project.info['task_presenter'] = template.render(server=self.config['HOST_STATIC_FILES_ENDPOINT'], server_backend=self.config['HOST_ENDPOINT'], app_shortname=self.config['PYBOSSA_APP_SHORT_NAME'])
38   - project.info['thumbnail'] = self.config['HOST_STATIC_FILES_ENDPOINT'] + "/img/thumbnail.png"
  38 + project.info['thumbnail'] = self.config['HOST_STATIC_FILES_ENDPOINT'] + "/assets/img/thumbnail.png"
39 39 project.info['sched'] = "incremental"
40 40 project.info['published'] = True
41 41 project.allow_anonymous_contributors = False
... ... @@ -98,7 +98,6 @@ class Validador:
98 98 task_id = request.form['task_id']
99 99 project_id = request.form['project_id']
100 100 sign_name = request.form['sign_name']
101   - api_host = self.config['API_HOST']
102 101 api_dbhost = self.config['API_DB_HOST']
103 102 number_of_approval = int(request.form['number_of_approval'])
104 103 number_of_avatar_disapproval = int(request.form['number_of_avatar_disapproval'])
... ...
view/assets/css/main.css
  1 +@import url("ranking.css");
  2 +
1 3 @font-face {
2 4 font-family: 'Titillium Web';
3   - src: url('../fonts/TitilliumWeb-SemiBold.ttf') format('truetype');
  5 + src: url('../fonts/titilliumweb/TitilliumWeb-SemiBold.ttf')
  6 + format('truetype');
  7 +}
  8 +
  9 +#alert-container {
  10 + padding: 0px;
  11 +}
  12 +
  13 +#alert-container .alert-actions a {
  14 + padding: 10px 15px 10px 0px;
  15 +}
  16 +
  17 +#main-container {
  18 + font-family: 'Titillium Web', sans-serif;
  19 +}
  20 +
  21 +/* Navbar */
  22 +#validador-navbar {
  23 + padding-top: 10px;
  24 +}
  25 +
  26 +#validador-navbar .ranking-button {
  27 + font-size: 20px;
  28 + font-weight: bold;
4 29 }
5 30  
  31 +/* Validador */
6 32 .video-body {
7 33 height: 338px;
8 34 width: 85%;
... ... @@ -19,39 +45,31 @@
19 45 margin-right: 0%;
20 46 }
21 47  
22   -/* Sombras */
23 48 .line-separator, .btn-default {
24 49 box-shadow: 2px 2px 2px rgba(215, 217, 221, 1.0);
25 50 -webkit-box-shadow: 2px 2px 2px rgba(215, 217, 221, 1.0);
26 51 -moz-box-shadow: 2px 2px 2px rgba(215, 217, 221, 1.0);
27 52 }
28 53  
29   -/* Fontes */
30   -.btn-default, .finish-task-button, .radio-options span, h1,
31   - h2, h3, h4, h5, h6 {
32   - font-family: 'Titillium Web', sans-serif;
  54 +#validador-header {
  55 + padding-left: 15px;
33 56 }
34 57  
35   -/* Header */
36   -#validador-header {
37   - padding: 1px;
38   - background: rgba(255, 255, 255, 1.0);
  58 +#validador-header .validador-question {
  59 + margin-top: 0px;
39 60 }
40 61  
41   -/* Body */
42 62 .body-container {
43 63 background: rgba(236, 238, 242, 1.0);
44   - padding-bottom: 10px;
  64 + padding: 0px 0px 10px 0px;
45 65 }
46 66  
47   -/* Linha */
48 67 .line-separator {
49 68 height: 2px;
50 69 width: 100%;
51 70 background-color: rgba(145, 200, 206, 1.0);
52 71 }
53 72  
54   -/* Texto */
55 73 h1, h2, h3, h4, h5, h6 {
56 74 color: rgba(144, 164, 174, 1.0);
57 75 }
... ... @@ -74,7 +92,7 @@ h6 {
74 92 }
75 93  
76 94 #finish-task-container {
77   - padding-right: 40px;
  95 + padding-right: 15px;
78 96 }
79 97  
80 98 .finish-padding-top {
... ... @@ -142,11 +160,11 @@ h6 {
142 160 #loading-container {
143 161 display: none;
144 162 position: fixed;
145   - top: 0;
146   - right: 0;
147   - bottom: 0;
148   - left: 0;
149   - z-index: 1040;
  163 + top: 0;
  164 + right: 0;
  165 + bottom: 0;
  166 + left: 0;
  167 + z-index: 1040;
150 168 }
151 169  
152 170 #loading-container img {
... ...
view/assets/css/ranking.css 0 → 100644
... ... @@ -0,0 +1,124 @@
  1 +@font-face {
  2 + font-family: 'Roboto';
  3 + src: url('../fonts/roboto/Roboto-Light.ttf') format('truetype');
  4 +}
  5 +
  6 +#ranking-container {
  7 + display: none;
  8 + background-color: #ffffff;
  9 + border-radius: 5px;
  10 + -moz-border-radius: 5px;
  11 + -webkit-border-radius: 5px;
  12 + padding-right: 0px;
  13 + overflow: hidden;
  14 + font-family: 'Roboto';
  15 + padding-left: 15px;
  16 + margin: 10px 15px 5px 15px;
  17 +}
  18 +
  19 +#ranking-info-container {
  20 + padding-left: 0px;
  21 +}
  22 +
  23 +#ranking-info-container .title {
  24 + color: #000000;
  25 + font-size: 50px;
  26 +}
  27 +
  28 +#ranking-info-container .avatar-info {
  29 + text-align: center;
  30 + padding-top: 30px;
  31 +}
  32 +
  33 +#ranking-info-container .avatar-container {
  34 + display: none;
  35 +}
  36 +
  37 +#ranking-info-container .avatar-info img {
  38 + width: 100%;
  39 +}
  40 +
  41 +#ranking-info-container .achievement-info {
  42 + color: #028c12;
  43 +}
  44 +
  45 +#ranking-info-container .progress-container {
  46 + padding-left: 100px;
  47 + margin-top: 10px;
  48 +}
  49 +
  50 +#ranking-info-container .achievements-container {
  51 + position: relative;
  52 + padding: 10px 0px 0px 0px;
  53 + word-wrap: break-word;
  54 +}
  55 +
  56 +#ranking-info-container .progress-label {
  57 + position: absolute;
  58 + left: 0px;
  59 +}
  60 +
  61 +#ranking-info-container .done-tasks {
  62 + color: #84DC76;
  63 +}
  64 +
  65 +#ranking-info-container .total-tasks {
  66 + color: #f0ad4e;
  67 +}
  68 +
  69 +#ranking-info-container .tooltip-inner {
  70 + font-size: 16px;
  71 + max-width: 220px;
  72 +}
  73 +
  74 +#leaderboard-container {
  75 + background-color: #fefcfc;
  76 + padding: 0px;
  77 + min-height: 560px;
  78 +}
  79 +
  80 +#leaderboard-container table {
  81 + margin-bottom: 0px;
  82 +}
  83 +
  84 +#leaderboard-container .table-striped>tbody>tr:nth-of-type(odd) {
  85 + background-color: #f1f2f2;
  86 +}
  87 +
  88 +#leaderboard-container .table-striped>tbody>tr:hover {
  89 + background-color: #e0e0e0;
  90 +}
  91 +
  92 +#leaderboard-container .table-striped>tbody>tr.highlight {
  93 + background-color: #fbefa3;
  94 +}
  95 +
  96 +#leaderboard-container .table-striped>tbody>tr.highlight:hover {
  97 + background-color: #f7e783;
  98 +}
  99 +
  100 +#leaderboard-container th {
  101 + text-align: center;
  102 + border: 0px;
  103 + padding-bottom: 15px;
  104 +}
  105 +
  106 +#leaderboard-container td {
  107 + text-align: center;
  108 + border: 0px;
  109 +}
  110 +
  111 +#leaderboard-container td:nth-of-type(1), #leaderboard-container td:nth-of-type(2)
  112 + {
  113 + width: 75px;
  114 +}
  115 +
  116 +#leaderboard-container td:nth-of-type(2), #leaderboard-container th:nth-of-type(2),
  117 + #leaderboard-container td:nth-of-type(3), #leaderboard-container th:nth-of-type(3)
  118 + {
  119 + text-align: left;
  120 +}
  121 +
  122 +#leaderboard-container th:nth-of-type(3) img {
  123 + padding-left: 20px;
  124 +}
0 125 \ No newline at end of file
... ...
view/assets/fonts/Helvetica.otf
No preview for this file type
view/assets/fonts/TitilliumWeb-Black.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-Bold.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-BoldItalic.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-ExtraLight.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-ExtraLightItalic.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-Italic.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-Light.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-LightItalic.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-Regular.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-SemiBold.ttf
No preview for this file type
view/assets/fonts/TitilliumWeb-SemiBoldItalic.ttf
No preview for this file type
view/assets/fonts/roboto/Roboto-Black.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-BlackItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-Bold.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-BoldItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-Italic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-Light.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-LightItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-Medium.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-MediumItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-Regular.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-Thin.ttf 0 → 100644
No preview for this file type
view/assets/fonts/roboto/Roboto-ThinItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-Black.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-Bold.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-BoldItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-ExtraLight.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-ExtraLightItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-Italic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-Light.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-LightItalic.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-Regular.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-SemiBold.ttf 0 → 100644
No preview for this file type
view/assets/fonts/titilliumweb/TitilliumWeb-SemiBoldItalic.ttf 0 → 100644
No preview for this file type
view/assets/img/correct.png 0 → 100755

4.98 KB

view/assets/img/finish.svg 0 → 100755
... ... @@ -0,0 +1,17 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  3 +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100px" height="100px" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
  4 +viewBox="0 0 100 100"
  5 + xmlns:xlink="http://www.w3.org/1999/xlink">
  6 + <defs>
  7 + <style type="text/css">
  8 + <![CDATA[
  9 + .fil0 {fill:#5EC7BD;fill-rule:nonzero}
  10 + ]]>
  11 + </style>
  12 + </defs>
  13 + <g id="finish">
  14 + <metadata id="finish"/>
  15 + <path class="fil0" d="M44 79c-4,4 -10,4 -13,0l-20 -20c-2,-2 -3,-4 -3,-6 0,-3 1,-5 3,-7 3,-3 9,-3 13,0l12 12c0,1 2,1 3,0l37 -37c2,-2 5,-3 7,-3l0 0c2,0 5,1 6,3 2,1 3,4 3,6 0,3 -1,5 -3,7l-45 45z"/>
  16 + </g>
  17 +</svg>
... ...
view/assets/img/incorrect.png 0 → 100755

4.88 KB

view/assets/img/loading.gif 0 → 100755

78 KB

view/assets/img/ranking/bronze-star-icon.png 0 → 100644

343 Bytes

view/assets/img/ranking/gold-star-icon.png 0 → 100644

338 Bytes

view/assets/img/ranking/signs-icon.png 0 → 100644

2.07 KB

view/assets/img/ranking/silver-star-icon.png 0 → 100644

337 Bytes

view/assets/img/ranking/trophy-icon.png 0 → 100644

1.36 KB

view/assets/img/ranking/user-shape.png 0 → 100644

4.08 KB

view/assets/img/skip.svg 0 → 100755
... ... @@ -0,0 +1,17 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  3 +<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100px" height="100px" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
  4 +viewBox="0 0 100 100"
  5 + xmlns:xlink="http://www.w3.org/1999/xlink">
  6 + <defs>
  7 + <style type="text/css">
  8 + <![CDATA[
  9 + .fil0 {fill:#5EC7BD;fill-rule:nonzero}
  10 + ]]>
  11 + </style>
  12 + </defs>
  13 + <g id="skip">
  14 + <metadata id="skip"/>
  15 + <path class="fil0" d="M10 24c1,-1 23,-17 45,0 8,6 12,15 13,26l22 0 -34 34 -34 -34 22 0c0,-1 1,-3 1,-4 -2,-29 -19,-26 -35,-22z"/>
  16 + </g>
  17 +</svg>
... ...
view/assets/img/thumbnail.png 0 → 100755

34.6 KB

view/assets/js/external-libs/js.cookie.js 0 → 100755
... ... @@ -0,0 +1,145 @@
  1 +/*!
  2 + * JavaScript Cookie v2.0.4
  3 + * https://github.com/js-cookie/js-cookie
  4 + *
  5 + * Copyright 2006, 2015 Klaus Hartl & Fagner Brack
  6 + * Released under the MIT license
  7 + */
  8 +(function (factory) {
  9 + if (typeof define === 'function' && define.amd) {
  10 + define(factory);
  11 + } else if (typeof exports === 'object') {
  12 + module.exports = factory();
  13 + } else {
  14 + var _OldCookies = window.Cookies;
  15 + var api = window.Cookies = factory();
  16 + api.noConflict = function () {
  17 + window.Cookies = _OldCookies;
  18 + return api;
  19 + };
  20 + }
  21 +}(function () {
  22 + function extend () {
  23 + var i = 0;
  24 + var result = {};
  25 + for (; i < arguments.length; i++) {
  26 + var attributes = arguments[ i ];
  27 + for (var key in attributes) {
  28 + result[key] = attributes[key];
  29 + }
  30 + }
  31 + return result;
  32 + }
  33 +
  34 + function init (converter) {
  35 + function api (key, value, attributes) {
  36 + var result;
  37 +
  38 + // Write
  39 +
  40 + if (arguments.length > 1) {
  41 + attributes = extend({
  42 + path: '/'
  43 + }, api.defaults, attributes);
  44 +
  45 + if (typeof attributes.expires === 'number') {
  46 + var expires = new Date();
  47 + expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
  48 + attributes.expires = expires;
  49 + }
  50 +
  51 + try {
  52 + result = JSON.stringify(value);
  53 + if (/^[\{\[]/.test(result)) {
  54 + value = result;
  55 + }
  56 + } catch (e) {}
  57 +
  58 + if (!converter.write) {
  59 + value = encodeURIComponent(String(value))
  60 + .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
  61 + } else {
  62 + value = converter.write(value, key);
  63 + }
  64 +
  65 + key = encodeURIComponent(String(key));
  66 + key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
  67 + key = key.replace(/[\(\)]/g, escape);
  68 +
  69 + return (document.cookie = [
  70 + key, '=', value,
  71 + attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE
  72 + attributes.path && '; path=' + attributes.path,
  73 + attributes.domain && '; domain=' + attributes.domain,
  74 + attributes.secure ? '; secure' : ''
  75 + ].join(''));
  76 + }
  77 +
  78 + // Read
  79 +
  80 + if (!key) {
  81 + result = {};
  82 + }
  83 +
  84 + // To prevent the for loop in the first place assign an empty array
  85 + // in case there are no cookies at all. Also prevents odd result when
  86 + // calling "get()"
  87 + var cookies = document.cookie ? document.cookie.split('; ') : [];
  88 + var rdecode = /(%[0-9A-Z]{2})+/g;
  89 + var i = 0;
  90 +
  91 + for (; i < cookies.length; i++) {
  92 + var parts = cookies[i].split('=');
  93 + var name = parts[0].replace(rdecode, decodeURIComponent);
  94 + var cookie = parts.slice(1).join('=');
  95 +
  96 + if (cookie.charAt(0) === '"') {
  97 + cookie = cookie.slice(1, -1);
  98 + }
  99 +
  100 + try {
  101 + cookie = converter.read ?
  102 + converter.read(cookie, name) : converter(cookie, name) ||
  103 + cookie.replace(rdecode, decodeURIComponent);
  104 +
  105 + if (this.json) {
  106 + try {
  107 + cookie = JSON.parse(cookie);
  108 + } catch (e) {}
  109 + }
  110 +
  111 + if (key === name) {
  112 + result = cookie;
  113 + break;
  114 + }
  115 +
  116 + if (!key) {
  117 + result[name] = cookie;
  118 + }
  119 + } catch (e) {}
  120 + }
  121 +
  122 + return result;
  123 + }
  124 +
  125 + api.get = api.set = api;
  126 + api.getJSON = function () {
  127 + return api.apply({
  128 + json: true
  129 + }, [].slice.call(arguments));
  130 + };
  131 + api.defaults = {};
  132 +
  133 + api.remove = function (key, attributes) {
  134 + api(key, '', extend(attributes, {
  135 + expires: -1
  136 + }));
  137 + };
  138 +
  139 + api.withConverter = init;
  140 +
  141 + return api;
  142 + }
  143 +
  144 + return init(function () {});
  145 +}));
... ...
view/assets/js/helpers/load-html-helper.js 0 → 100644
... ... @@ -0,0 +1,21 @@
  1 +(function(loadHtmlHelper, $, undefined) {
  2 +
  3 + var baseUrl = '';
  4 +
  5 + function _preprocessHtml(data) {
  6 + return data.replace(/{{ server }}/g, baseUrl);
  7 + }
  8 +
  9 + loadHtmlHelper.load = function(target, url, callback) {
  10 + var completeUrl = baseUrl + url;
  11 + $.get(completeUrl, function(data) {
  12 + $(target).html(_preprocessHtml(data));
  13 + callback && callback();
  14 + });
  15 + }
  16 +
  17 + loadHtmlHelper.setup = function(url) {
  18 + baseUrl = url;
  19 + };
  20 +
  21 +}(window.loadHtmlHelper = window.loadHtmlHelper || {}, jQuery));
... ...
view/assets/js/helpers/pybossa-api-helper.js 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +(function(pybossaApiHelper, $, undefined) {
  2 +
  3 + var pybossaEndpoint = '';
  4 + var projectName = '';
  5 +
  6 + function _getProjectId() {
  7 + return $.ajax({
  8 + url : pybossaEndpoint + '/api/project?short_name=' + projectName
  9 + });
  10 + }
  11 +
  12 + function _getUserProgress() {
  13 + return $.ajax({
  14 + url : pybossaEndpoint + '/api/project/' + projectName + '/userprogress',
  15 + cache : false,
  16 + dataType : 'json'
  17 + });
  18 + }
  19 +
  20 + function _getAnswers(projectId, userId) {
  21 + return $.ajax({
  22 + url : pybossaEndpoint + '/api/taskrun?project_id=' + projectId
  23 + + '&user_id=' + userId
  24 + });
  25 + }
  26 +
  27 + pybossaApiHelper.setup = function(endpoint, name) {
  28 + pybossaEndpoint = endpoint;
  29 + projectName = name;
  30 + }
  31 +
  32 + pybossaApiHelper.getProjectId = function() {
  33 + return _getProjectId();
  34 + }
  35 +
  36 + pybossaApiHelper.getUserProgress = function() {
  37 + return _getUserProgress();
  38 + }
  39 +
  40 + pybossaApiHelper.getAnswers = function(projectId, userId) {
  41 + return _getAnswers(projectId, userId);
  42 + }
  43 +
  44 +}(window.pybossaApiHelper = window.pybossaApiHelper || {}, jQuery));
... ...
view/assets/js/ranking.js 0 → 100644
... ... @@ -0,0 +1,163 @@
  1 +(function(ranking, $, undefined) {
  2 +
  3 + var NUMBER_OF_TOP_USERS = 10;
  4 + var STARS_MAP = ['', 'gold', 'silver', 'bronze'];
  5 + var baseUrl = '';
  6 + var pybossaEndpoint = '';
  7 + var projectName = '';
  8 + var loggedUser = {};
  9 + var totalTasks = 0;
  10 + var doneTasks = 0;
  11 + var showingRanking = false;
  12 + var tasksEnded = false;
  13 +
  14 + function _getRankingData(callback) {
  15 + $.ajax({
  16 + url : pybossaEndpoint + '/api/leaderboard?limit='
  17 + + NUMBER_OF_TOP_USERS,
  18 + success : function(response) {
  19 + callback(typeof response == 'object' ? response[projectName]
  20 + : '');
  21 + },
  22 + error : function(xhr, textStatus, error) {
  23 + alert(xhr.responseText);
  24 + }
  25 + });
  26 + }
  27 +
  28 + function _processRankingRow(rowData) {
  29 + var rank = rowData.rank;
  30 + if (rank < 0) {
  31 + return '';
  32 + }
  33 + var starHTML = '';
  34 + if (rank > 0 && rank < 4) {
  35 + starHTML = '<img src="' + baseUrl + '/assets/img/ranking/'
  36 + + STARS_MAP[rank] + '-star-icon.png">';
  37 + }
  38 + var trHTML = '<tr>';
  39 + if (rowData.name === loggedUser.name) {
  40 + trHTML = '<tr class="warning">';
  41 + loggedUser.rank = rowData.rank;
  42 + }
  43 + rank = rank == 0 ? '-' : rank + '.';
  44 + return trHTML + '<td>' + starHTML + '</td><td>' + rank
  45 + + '</td><td><a href="/pybossa/account/' + rowData.name
  46 + + '/" target="_blank">' + rowData.fullname + '</a></td><td>'
  47 + + rowData.score + '</td></tr>';
  48 + }
  49 +
  50 + function _updateRanking() {
  51 + _getRankingData(function(data) {
  52 + if (data === '')
  53 + return;
  54 +
  55 + var rowsHTML = '';
  56 + for (var i = 0; i < data.length; i++) {
  57 + rowsHTML += _processRankingRow(data[i]);
  58 + }
  59 + $('#leaderboard-container tbody').html(rowsHTML);
  60 + $('#ranking-info-container .rank-position').html(loggedUser.rank);
  61 + $('#ranking-info-container .username').html(loggedUser.fullName);
  62 + if (loggedUser.avatarUrl != '') {
  63 + $('#ranking-info-container .avatar-container img').attr('src',
  64 + loggedUser.avatarUrl);
  65 + $('#ranking-info-container .avatar-placeholder').hide();
  66 + $('#ranking-info-container .avatar-container').show();
  67 + }
  68 + if (loggedUser.rank === 0) {
  69 + $('#ranking-info-container .rank-position-container').hide();
  70 + }
  71 + _updateProgress();
  72 + });
  73 + }
  74 +
  75 + function _getUserData() {
  76 + return $.ajax({
  77 + url : pybossaEndpoint + '/api/user?name=' + loggedUser.name
  78 + });
  79 + }
  80 +
  81 + function _getAvatarUrl(data) {
  82 + return !data || typeof data.avatar === 'undefined' || typeof data.container === 'undefined' ?
  83 + '' : pybossaEndpoint + '/uploads/' + data.container + '/' + data.avatar;
  84 + }
  85 +
  86 + function _updateProgress() {
  87 + pybossaApiHelper
  88 + .getUserProgress()
  89 + .done(
  90 + function(response) {
  91 + totalTasks = response.total;
  92 + doneTasks = response.done;
  93 + var percentage = (doneTasks / totalTasks) * 100;
  94 + $('#ranking-info-container .progress-bar').attr(
  95 + 'aria-valuenow', percentage).css('width',
  96 + percentage + '%');
  97 + $('#ranking-container [data-toggle="tooltip"]')
  98 + .tooltip(
  99 + {
  100 + title : '<strong><span class="done-tasks">'
  101 + + doneTasks
  102 + + '</span> / <span class="total-tasks">'
  103 + + totalTasks
  104 + + '</span> sinais ensinados.</strong>',
  105 + placement : 'bottom',
  106 + trigger : 'manual'
  107 + });
  108 + });
  109 + }
  110 +
  111 + function _loadRankingData() {
  112 + _getUserData().done(function(response) {
  113 + if (typeof response == 'undefined' || response.length < 1) {
  114 + return;
  115 + }
  116 + loggedUser.fullName = response[0].fullname;
  117 + loggedUser.avatarUrl = _getAvatarUrl(response[0].info);
  118 + _updateRanking();
  119 + });
  120 + }
  121 +
  122 + function _showRanking() {
  123 + $('#validador-container').hide();
  124 + $('#ranking-container').show();
  125 + $('#validador-navbar .ranking-button').html("Voltar");
  126 + if (doneTasks > 0) {
  127 + $('#ranking-container [data-toggle="tooltip"]').tooltip('show');
  128 + }
  129 + showingRanking = true;
  130 + }
  131 +
  132 + function _hideRanking() {
  133 + $('#ranking-container').hide();
  134 + $('#validador-navbar .ranking-button').html("Ver Ranking");
  135 + showingRanking = false;
  136 +
  137 + if (!tasksEnded) {
  138 + $('#validador-container').show();
  139 + }
  140 + }
  141 +
  142 + ranking.toggle = function() {
  143 + if (showingRanking) {
  144 + _hideRanking();
  145 + } else {
  146 + _showRanking();
  147 + }
  148 + };
  149 +
  150 + ranking.tasksEnded = function() {
  151 + tasksEnded = true;
  152 + };
  153 +
  154 + ranking.setup = function(serverUrl, endpoint, name, user) {
  155 + baseUrl = serverUrl;
  156 + pybossaEndpoint = endpoint;
  157 + projectName = name;
  158 + loggedUser.name = user;
  159 + loadHtmlHelper.load('#ranking-container', '/assets/templates/ranking/ranking.html',
  160 + _loadRankingData);
  161 + };
  162 +
  163 +}(window.ranking = window.ranking || {}, jQuery));
... ...
view/assets/js/validador.js
1 1 (function(validador, $, undefined) {
2 2  
3   - var videos_url = "";
4   - var base_url = "";
5   - var server_backend_url = '';
6   - var current_task_id = -1;
  3 + var baseUrl = '';
  4 + var serverBackendUrl = '';
  5 + var videosUrl = '';
  6 + var pybossaEndpoint = '';
  7 + var projectName = '';
  8 + var currentTaskId = -1;
  9 +
  10 + function _getLoggedUser() {
  11 + var pybossaRememberToken = Cookies.get('remember_token');
  12 + var splittedTokenId = pybossaRememberToken.split('|');
  13 + return splittedTokenId.length > 0 ? splittedTokenId[0] : 'anonymous';
  14 + }
7 15  
8 16 function _disableFinishButton() {
9   - $("#finish-button").off("click");
10   - $("#finish-button").removeClass("enabled-button");
11   - $("#finish-button").addClass("disabled-button");
  17 + $('#finish-button').off('click');
  18 + $('#finish-button').removeClass('enabled-button');
  19 + $('#finish-button').addClass('disabled-button');
12 20 }
13 21  
14 22 function _enableFinishButton(task, deferred) {
15   - $("#finish-button").removeClass("disabled-button");
16   - $("#finish-button").addClass("enabled-button");
17   - $("#finish-button").off("click").on("click", function() {
  23 + $('#finish-button').removeClass('disabled-button');
  24 + $('#finish-button').addClass('enabled-button');
  25 + $('#finish-button').off('click').on('click', function() {
18 26 _readAnswer(task, deferred, false);
19 27 });
20 28 }
21 29  
22 30 function _hideCommentAvatar() {
23   - $("#comment-avatar").hide();
24   - $("#finish-task-container").removeClass("finish-padding-top-adjust");
  31 + $('#comment-avatar').hide();
  32 + $('#finish-task-container').removeClass('finish-padding-top-adjust');
25 33 }
26 34  
27 35 function _hideCommentRef() {
28   - $("#comment-ref").hide();
  36 + $('#comment-ref').hide();
29 37 }
30 38  
31 39 function resetComments() {
32   - $("#comment-avatar textarea").val("")
33   - $("#comment-ref textarea").val("");
  40 + $('#comment-avatar textarea').val('')
  41 + $('#comment-ref textarea').val('');
34 42 _hideCommentAvatar();
35 43 _hideCommentRef();
36 44 }
37 45  
38 46 function _enableLoading() {
39   - $("#loading-container").show();
40   - $("#main-container").addClass("mask");
  47 + $('#loading-container').show();
  48 + $('#main-container').addClass('mask');
41 49 }
42 50  
43 51 function _disableLoading() {
44   - $("#loading-container").hide();
45   - $("#main-container").removeClass("mask");
  52 + $('#loading-container').hide();
  53 + $('#main-container').removeClass('mask');
46 54 }
47 55  
48 56 function _handleAvatarRadioClick(el, task, deferred) {
49   - var is_incorrect_button = $(el).val() == "INCORRECT";
50   - if (is_incorrect_button) {
  57 + var isIncorrectButton = $(el).val() == 'INCORRECT';
  58 + if (isIncorrectButton) {
51 59 _hideCommentRef();
52   - $("#comment-avatar").show();
53   - $("#finish-task-container").addClass("finish-padding-top-adjust");
  60 + $('#comment-avatar').show();
  61 + $('#finish-task-container').addClass('finish-padding-top-adjust');
54 62 } else {
55 63 _hideCommentAvatar();
56 64 }
57   - var isRefChecked = $("#ref-radio-answers input[type=radio]").is(
58   - ":checked");
  65 + var isRefChecked = $('#ref-radio-answers input[type=radio]').is(
  66 + ':checked');
59 67 if (isRefChecked) {
60 68 _enableFinishButton(task, deferred);
61 69 } else {
... ... @@ -64,23 +72,24 @@
64 72 }
65 73  
66 74 function _handleRefRadioClick(el, task, deferred) {
67   - var is_incorrect_button = $(el).val() == "INCORRECT";
68   - if (is_incorrect_button) {
69   - $("#incorrect-avatar-button").prop("checked", true);
70   - $("#comment-ref").show();
  75 + var isIncorrectButton = $(el).val() == 'INCORRECT';
  76 + if (isIncorrectButton) {
  77 + $('#incorrect-avatar-button').prop('checked', true);
  78 + $('#comment-ref').show();
71 79 _hideCommentAvatar();
72 80 } else {
73   - var is_avatar_disabled = $("#avatar-radio-answers input[type=radio]").is(":disabled");
74   - if (is_avatar_disabled) {
75   - $("#incorrect-avatar-button").prop("checked", false);
  81 + var isAvatarDisabled = $('#avatar-radio-answers input[type=radio]')
  82 + .is(':disabled');
  83 + if (isAvatarDisabled) {
  84 + $('#incorrect-avatar-button').prop('checked', false);
76 85 }
77 86 _hideCommentRef();
78 87 }
79   - $("#avatar-radio-answers input[type=radio]").prop("disabled",
80   - is_incorrect_button);
81   - var is_avatar_checked = $("#avatar-radio-answers input[type=radio]").is(
82   - ":checked");
83   - if (is_avatar_checked) {
  88 + $('#avatar-radio-answers input[type=radio]').prop('disabled',
  89 + isIncorrectButton);
  90 + var isAvatarChecked = $('#avatar-radio-answers input[type=radio]').is(
  91 + ':checked');
  92 + if (isAvatarChecked) {
84 93 _enableFinishButton(task, deferred);
85 94 } else {
86 95 _disableFinishButton();
... ... @@ -90,69 +99,68 @@
90 99 function _setupGUI(task, deferred) {
91 100 resetComments();
92 101 _disableFinishButton();
93   - $("#avatar-radio-answers input[type=radio]").prop("disabled", false);
94   - $("#avatar-radio-answers input[type=radio]").prop("checked", false);
95   - $("#ref-radio-answers input[type=radio]").prop("checked", false);
96   - $("#avatar-radio-answers input[type=radio]").off("click").on("click",
  102 + $('#avatar-radio-answers input[type=radio]').prop('disabled', false);
  103 + $('#avatar-radio-answers input[type=radio]').prop('checked', false);
  104 + $('#ref-radio-answers input[type=radio]').prop('checked', false);
  105 + $('#avatar-radio-answers input[type=radio]').off('click').on('click',
97 106 function() {
98 107 _handleAvatarRadioClick(this, task, deferred);
99 108 });
100   - $("#ref-radio-answers input[type=radio]").off("click").on("click",
  109 + $('#ref-radio-answers input[type=radio]').off('click').on('click',
101 110 function() {
102 111 _handleRefRadioClick(this, task, deferred);
103 112 });
104   - $("#skip-button").off("click").on("click", function() {
  113 + $('#skip-button').off('click').on('click', function() {
105 114 _readAnswer(task, deferred, true);
106 115 });
107 116 }
108 117  
109   - function _readAnswer(task, deferred, has_skipped) {
110   - var status = "";
111   - var avatar_answer = $("#avatar-radio-answers input[type=radio]:checked")
112   - .val();
113   - var ref_answer = $("#ref-radio-answers input[type=radio]:checked")
  118 + function _readAnswer(task, deferred, hasSkipped) {
  119 + var status = '';
  120 + var avatarAnswer = $('#avatar-radio-answers input[type=radio]:checked')
114 121 .val();
115   - if (has_skipped) {
116   - status = "SKIPPED";
117   - } else if (ref_answer == "INCORRECT") {
118   - status = "REF_DISAPPROVED";
119   - } else if (avatar_answer == "INCORRECT") {
120   - status = "AVATAR_DISAPPROVED";
  122 + var refAnswer = $('#ref-radio-answers input[type=radio]:checked').val();
  123 + if (hasSkipped) {
  124 + status = 'SKIPPED';
  125 + } else if (refAnswer == 'INCORRECT') {
  126 + status = 'REF_DISAPPROVED';
  127 + } else if (avatarAnswer == 'INCORRECT') {
  128 + status = 'AVATAR_DISAPPROVED';
121 129 } else {
122   - status = "AVATAR_APPROVED";
  130 + status = 'AVATAR_APPROVED';
123 131 }
124   - _submitAnswer(task, deferred, status, has_skipped);
  132 + _submitAnswer(task, deferred, status, hasSkipped);
125 133 }
126 134  
127 135 function _createAnswer(task, status) {
128 136 var answer = {};
129   - var last_answer = task.info.last_answer;
130   - var hasLastAnswer = typeof last_answer != "undefined";
  137 + var lastAnswer = task.info.last_answer;
  138 + var hasLastAnswer = typeof lastAnswer != 'undefined';
131 139 if (hasLastAnswer) {
132   - answer = last_answer;
  140 + answer = lastAnswer;
133 141 } else {
134 142 answer = {
135   - "number_of_approval" : 0,
136   - "number_of_avatar_disapproval" : 0,
137   - "number_of_ref_disapproval" : 0
  143 + 'number_of_approval' : 0,
  144 + 'number_of_avatar_disapproval' : 0,
  145 + 'number_of_ref_disapproval' : 0
138 146 };
139 147 }
140   - answer["status"] = status;
141   - answer["comment_avatar"] = "";
142   - answer["comment_ref"] = "";
143   - if (status == "AVATAR_APPROVED") {
144   - answer["number_of_approval"] = answer.number_of_approval + 1;
145   - } else if (status == "AVATAR_DISAPPROVED") {
146   - answer["number_of_avatar_disapproval"] = answer.number_of_avatar_disapproval + 1;
147   - var comment_avatar = $("#comment-avatar textarea").val();
148   - if (comment_avatar.trim() != "") {
149   - answer["comment_avatar"] = comment_avatar;
  148 + answer['status'] = status;
  149 + answer['comment_avatar'] = '';
  150 + answer['comment_ref'] = '';
  151 + if (status == 'AVATAR_APPROVED') {
  152 + answer['number_of_approval'] = answer.number_of_approval + 1;
  153 + } else if (status == 'AVATAR_DISAPPROVED') {
  154 + answer['number_of_avatar_disapproval'] = answer.number_of_avatar_disapproval + 1;
  155 + var commentAvatar = $('#comment-avatar textarea').val();
  156 + if (commentAvatar.trim() != '') {
  157 + answer['comment_avatar'] = commentAvatar;
150 158 }
151   - } else if (status == "REF_DISAPPROVED") {
152   - answer["number_of_ref_disapproval"] = answer.number_of_ref_disapproval + 1;
153   - var comment_ref = $("#comment-ref textarea").val();
154   - if (comment_ref.trim() != "") {
155   - answer["comment_ref"] = comment_ref;
  159 + } else if (status == 'REF_DISAPPROVED') {
  160 + answer['number_of_ref_disapproval'] = answer.number_of_ref_disapproval + 1;
  161 + var comment_ref = $('#comment-ref textarea').val();
  162 + if (comment_ref.trim() != '') {
  163 + answer['comment_ref'] = comment_ref;
156 164 }
157 165 }
158 166 return answer;
... ... @@ -162,21 +170,21 @@
162 170 _enableLoading();
163 171 $
164 172 .ajax({
165   - type : "POST",
166   - url : server_backend_url + "/finish_task",
  173 + type : 'POST',
  174 + url : serverBackendUrl + '/finish_task',
167 175 data : {
168   - "task_id" : task.id,
169   - "project_id" : task.project_id,
170   - "sign_name" : task.info.sign_name,
171   - "number_of_approval" : answer.number_of_approval,
172   - "number_of_avatar_disapproval" : answer.number_of_avatar_disapproval,
173   - "number_of_ref_disapproval" : answer.number_of_ref_disapproval
  176 + 'task_id' : task.id,
  177 + 'project_id' : task.project_id,
  178 + 'sign_name' : task.info.sign_name,
  179 + 'number_of_approval' : answer.number_of_approval,
  180 + 'number_of_avatar_disapproval' : answer.number_of_avatar_disapproval,
  181 + 'number_of_ref_disapproval' : answer.number_of_ref_disapproval
174 182 },
175 183 success : function(response) {
176 184 pybossa.saveTask(task.id, answer).done(function() {
177 185 _disableLoading();
178   - $("#success").fadeIn(500);
179   - $("#main-container").hide();
  186 + $('#success').fadeIn(500);
  187 + $('#validador-container').hide();
180 188 setTimeout(function() {
181 189 deferred.resolve();
182 190 }, 2000);
... ... @@ -187,12 +195,11 @@
187 195 alert(xhr.responseText);
188 196 }
189 197 });
190   -
191 198 }
192 199  
193   - function _submitAnswer(task, deferred, status, has_skipped) {
  200 + function _submitAnswer(task, deferred, status, hasSkipped) {
194 201 var answer = _createAnswer(task, status);
195   - if (has_skipped) {
  202 + if (hasSkipped) {
196 203 _saveAnswer(task, deferred, answer);
197 204 } else {
198 205 _finishTask(task, deferred, answer);
... ... @@ -201,8 +208,8 @@
201 208  
202 209 function _saveAnswer(task, deferred, answer) {
203 210 pybossa.saveTask(task.id, answer).done(function() {
204   - $("#success").fadeIn(500);
205   - $("#main-container").hide();
  211 + $('#success').fadeIn(500);
  212 + $('#validador-container').hide();
206 213 setTimeout(function() {
207 214 deferred.resolve();
208 215 }, 2000);
... ... @@ -210,39 +217,49 @@
210 217 }
211 218  
212 219 function _loadTaskInfo(task) {
213   - current_task_id = task.id;
214   - var sign_name = task.info.sign_name;
215   - var avatar_vid_link = videos_url + sign_name + "_AVATAR.webm";
216   - var ref_vid_link = videos_url + sign_name + "_REF.webm";
217   - $(".sign-label").text(sign_name);
218   - $("#avatar-video").attr("src", avatar_vid_link);
219   - $("#ref-video").attr("src", ref_vid_link);
  220 + currentTaskId = task.id;
  221 + var signName = task.info.sign_name;
  222 + var avatarVidLink = videosUrl + signName + '_AVATAR.webm';
  223 + var refVidLink = videosUrl + signName + '_REF.webm';
  224 + $('.sign-label').text(signName);
  225 + $('#avatar-video').attr('src', avatarVidLink);
  226 + $('#ref-video').attr('src', refVidLink);
  227 + }
  228 +
  229 + function _loadMainComponents() {
  230 + pybossaApiHelper.setup(pybossaEndpoint, projectName);
  231 + loadHtmlHelper.setup(baseUrl);
  232 + ranking.setup(baseUrl, pybossaEndpoint, projectName, _getLoggedUser());
220 233 }
221 234  
222 235 pybossa.presentTask(function(task, deferred) {
223   - if (!$.isEmptyObject(task) && current_task_id != task.id) {
  236 + _loadMainComponents();
  237 + if (!$.isEmptyObject(task) && currentTaskId != task.id) {
224 238 _loadTaskInfo(task);
225 239 _setupGUI(task, deferred);
226   - $("#success").hide();
227   - $("#main-container").fadeIn(500);
  240 + $('#success').hide();
  241 + $('#validador-container').fadeIn(500);
228 242 } else {
229   - $("#main-container").hide();
230   - $("#finish").fadeIn(500);
  243 + $('#validador-container').hide();
  244 + $('#finish').fadeIn(500);
  245 + ranking.tasksEnded();
231 246 }
232 247 });
233 248  
234 249 // Private methods
235 250 function _run(projectname) {
236   - pybossa.setEndpoint("/pybossa");
  251 + pybossa.setEndpoint(pybossaEndpoint);
237 252 pybossa.run(projectname);
238 253 }
239 254  
240 255 // Public methods
241   - validador.run = function(serverhost, serverbackend, projectname) {
242   - base_url = serverhost;
243   - server_backend_url = serverbackend;
244   - videos_url = base_url + "/videos/";
245   - _run(projectname);
  256 + validador.run = function(serverhost, serverbackend, projname) {
  257 + baseUrl = serverhost;
  258 + serverBackendUrl = serverbackend;
  259 + videosUrl = baseUrl + '/videos/';
  260 + pybossaEndpoint = '/pybossa';
  261 + projectName = projname;
  262 + _run(projectName);
246 263 };
247 264  
248 265 }(window.validador = window.validador || {}, jQuery));
249 266 \ No newline at end of file
... ...
view/assets/templates/ranking/ranking.html 0 → 100644
... ... @@ -0,0 +1,47 @@
  1 +<div id="ranking-info-container" class="col-sm-4">
  2 + <div class="title">WikiRanking</div>
  3 + <div>Lorem Ipsum é apenas uma simulação de texto da indústria
  4 + tipográfica e de impressos, e vem sendo utilizado desde o século XVI.</div>
  5 + <div class="avatar-info col-sm-12">
  6 + <div class="avatar-placeholder col-sm-6 col-sm-offset-3">
  7 + <img src="{{ server }}/assets/img/ranking/user-shape.png">
  8 + </div>
  9 + <div class="avatar-container col-sm-8 col-sm-offset-2">
  10 + <img src="">
  11 + </div>
  12 + <div class="col-sm-12">
  13 + <div class="username"></div>
  14 + <div class="rank-position-container">
  15 + <strong><span class="rank-position"></span>º Posição</strong>
  16 + </div>
  17 + </div>
  18 + </div>
  19 + <div class="achievements-container col-sm-12">
  20 + <div class="progress-container col-sm-12">
  21 + <div class="progress">
  22 + <div class="progress-bar" role="progressbar" aria-valuenow="0"
  23 + aria-valuemin="0" aria-valuemax="100" data-toggle="tooltip"
  24 + data-html="true"></div>
  25 + </div>
  26 + </div>
  27 + <div class="progress-label">
  28 + <span><strong>Progresso:</strong></span>
  29 + </div>
  30 + </div>
  31 +</div>
  32 +<div id="leaderboard-container" class="col-sm-8">
  33 + <table class="table table-striped table-hover">
  34 + <thead>
  35 + <tr>
  36 + <th></th>
  37 + <th>#</th>
  38 + <th><img src="{{ server }}/assets/img/ranking/trophy-icon.png">
  39 + <div>Membro</div></th>
  40 + <th><img src="{{ server }}/assets/img/ranking/signs-icon.png">
  41 + <div>Sinais</div></th>
  42 + </tr>
  43 + </thead>
  44 + <tbody>
  45 + </tbody>
  46 + </table>
  47 +</div>
0 48 \ No newline at end of file
... ...
view/img/correct.png

4.98 KB

view/img/finish.svg
... ... @@ -1,17 +0,0 @@
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3   -<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100px" height="100px" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
4   -viewBox="0 0 100 100"
5   - xmlns:xlink="http://www.w3.org/1999/xlink">
6   - <defs>
7   - <style type="text/css">
8   - <![CDATA[
9   - .fil0 {fill:#5EC7BD;fill-rule:nonzero}
10   - ]]>
11   - </style>
12   - </defs>
13   - <g id="finish">
14   - <metadata id="finish"/>
15   - <path class="fil0" d="M44 79c-4,4 -10,4 -13,0l-20 -20c-2,-2 -3,-4 -3,-6 0,-3 1,-5 3,-7 3,-3 9,-3 13,0l12 12c0,1 2,1 3,0l37 -37c2,-2 5,-3 7,-3l0 0c2,0 5,1 6,3 2,1 3,4 3,6 0,3 -1,5 -3,7l-45 45z"/>
16   - </g>
17   -</svg>
view/img/incorrect.png

4.88 KB

view/img/loading.gif

78 KB

view/img/skip.svg
... ... @@ -1,17 +0,0 @@
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3   -<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100px" height="100px" version="1.1" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd"
4   -viewBox="0 0 100 100"
5   - xmlns:xlink="http://www.w3.org/1999/xlink">
6   - <defs>
7   - <style type="text/css">
8   - <![CDATA[
9   - .fil0 {fill:#5EC7BD;fill-rule:nonzero}
10   - ]]>
11   - </style>
12   - </defs>
13   - <g id="skip">
14   - <metadata id="skip"/>
15   - <path class="fil0" d="M10 24c1,-1 23,-17 45,0 8,6 12,15 13,26l22 0 -34 34 -34 -34 22 0c0,-1 1,-3 1,-4 -2,-29 -19,-26 -35,-22z"/>
16   - </g>
17   -</svg>
view/img/thumbnail.png

34.6 KB

view/template.html
1 1 <link rel="stylesheet" href="{{ server }}/assets/css/main.css">
2 2  
  3 +<script src="{{ server }}/assets/js/external-libs/js.cookie.js"></script>
  4 +<script src="{{ server }}/assets/js/helpers/pybossa-api-helper.js"></script>
  5 +<script src="{{ server }}/assets/js/helpers/load-html-helper.js"></script>
  6 +<script src="{{ server }}/assets/js/ranking.js"></script>
3 7 <script src="{{ server }}/assets/js/validador.js"></script>
4 8  
5   -<div class="row">
6   - <div id="success" class="alert alert-success" style="display: none;">
7   - <strong>Parabéns!</strong> <span>Tarefa concluída.</span>
8   - </div>
9   - <div id="finish" class="alert alert-success" style="display: none;">
10   - <strong>Parabéns!</strong> <span> Você completou todas as
11   - tarefas disponíveis! </span> <br />
12   - <div class="alert-actions">
13   - <a class="btn small" href="/">Voltar</a> <a class="btn small"
14   - href="/pybossa/project">ou, olhar outros projetos.</a>
  9 +<div id="alert-container" class="container">
  10 + <div class="row">
  11 + <div id="success" class="alert alert-success" style="display: none;">
  12 + <a class="close" data-dismiss="alert" href="#">×</a> <strong>Parabéns!</strong>
  13 + <span>Tarefa concluída.</span>
  14 + </div>
  15 + <div id="finish" class="alert alert-success" style="display: none;">
  16 + <a class="close" data-dismiss="alert" href="#">×</a> <strong>Que
  17 + pena,</strong> <span> não há mais tarefas disponíveis! </span> <br />
  18 + <div class="alert-actions">
  19 + <a class="btn small" href="/">Voltar</a> <a class="btn small"
  20 + href="/pybossa/project">ou, olhar outros projetos.</a>
  21 + </div>
15 22 </div>
16 23 </div>
17 24 </div>
18 25 <div id="loading-container">
19   - <img src="{{ server }}/img/loading.gif">
  26 + <img src="{{ server }}/assets/img/loading.gif">
20 27 </div>
21   -<div id="main-container" class="container">
22   - <div id="validador-header">
23   - <h2>
24   - A animação do sinal "<span class="sign-label"></span>" está correta?
25   - </h2>
  28 +<div id="main-container" class="container body-container">
  29 + <div id="validador-navbar" class="row">
  30 + <div class="col-sm-12">
  31 + <div class="btn btn-warning ranking-button pull-right"
  32 + onclick="ranking.toggle()">Ver Ranking</div>
  33 + </div>
26 34 </div>
27   - <div class="line-separator"></div>
28   - <div id="corretor-container" class="row body-container">
29   - <div id="avatar-container" class="col-sm-6 video-container">
30   - <div class="row">
31   - <h6>
32   - ANIMAÇÃO "<span class="sign-label"></span>":
33   - </h6>
34   - </div>
35   - <div class="row">
36   - <video id="avatar-video" src="" preload="metadata"
37   - class="video-body" autoplay loop controls>
38   - <source type="video/webm">
39   - </video>
40   - </div>
41   - <div id="avatar-radio-answers" class="row radio-options">
42   - <div class="correct-answer-container"">
43   - <span class="correct-answer-label">ESTÁ CORRETO</span><img
44   - class="icon" src="{{ server }}/img/correct.png"></img><input
45   - value="CORRECT" type="radio" name="avatar-answers">
  35 + <div id="validador-container" class="row">
  36 + <div id="validador-header">
  37 + <h2 class="validador-question">
  38 + A animação do sinal "<span class="sign-label"></span>" está correta?
  39 + </h2>
  40 + </div>
  41 + <div class="line-separator"></div>
  42 + <div class="row">
  43 + <div id="avatar-container" class="col-sm-6 video-container">
  44 + <div class="row">
  45 + <h6>
  46 + ANIMAÇÃO "<span class="sign-label"></span>":
  47 + </h6>
46 48 </div>
47   - <div>
48   - <span class="incorrect-answer-label">ESTÁ ERRADO</span><img
49   - class="icon" src="{{ server }}/img/incorrect.png"></img><input
50   - id="incorrect-avatar-button" value="INCORRECT" type="radio"
51   - name="avatar-answers">
  49 + <div class="row">
  50 + <video id="avatar-video" src="" preload="metadata"
  51 + class="video-body" autoplay loop controls>
  52 + <source type="video/webm">
  53 + </video>
52 54 </div>
53   - </div>
54   - <div id="comment-avatar" class="form-group">
55   - <h6>ENVIAR COMENTÁRIO SOBRE A ANIMAÇÃO:</h6>
56   - <textarea class="form-control" rows="2"></textarea>
57   - </div>
58   - </div>
59   - <div id="ref-container" class="col-sm-6 video-container">
60   - <div class="row">
61   - <h6>
62   - VÍDEO DE REFERÊNCIA “<span class="sign-label"></span>”:
63   - </h6>
64   - </div>
65   - <div class="row">
66   - <video id="ref-video" src="" preload="metadata" class="video-body"
67   - autoplay loop controls>
68   - <source type="video/webm">
69   - </video>
70   - </div>
71   - <div id="ref-radio-answers" class="row radio-options">
72   - <div class="correct-answer-container"">
73   - <span class="correct-answer-label">ESTÁ CORRETO</span><img
74   - class="icon" src="{{ server }}/img/correct.png"></img><input
75   - value="CORRECT" type="radio" name="ref-answers">
  55 + <div id="avatar-radio-answers" class="row radio-options">
  56 + <div class="correct-answer-container"">
  57 + <span class="correct-answer-label">ESTÁ CORRETO</span><img
  58 + class="icon" src="{{ server }}/assets/img/correct.png"></img><input
  59 + value="CORRECT" type="radio" name="avatar-answers">
  60 + </div>
  61 + <div>
  62 + <span class="incorrect-answer-label">ESTÁ ERRADO</span><img
  63 + class="icon" src="{{ server }}/assets/img/incorrect.png"></img><input
  64 + id="incorrect-avatar-button" value="INCORRECT" type="radio"
  65 + name="avatar-answers">
  66 + </div>
76 67 </div>
77   - <div>
78   - <span class="incorrect-answer-label">ESTÁ ERRADO</span><img
79   - class="icon" src="{{ server }}/img/incorrect.png"></img><input
80   - id="incorrect-ref-button" value="INCORRECT" type="radio"
81   - name="ref-answers">
  68 + <div id="comment-avatar" class="form-group">
  69 + <h6>ENVIAR COMENTÁRIO SOBRE A ANIMAÇÃO:</h6>
  70 + <textarea class="form-control" rows="2"></textarea>
82 71 </div>
83 72 </div>
84   - <div id="comment-ref" class="form-group">
85   - <h6>ENVIAR COMENTÁRIO SOBRE O VÍDEO DE REFERÊNCIA:</h6>
86   - <textarea class="form-control" rows="2"></textarea>
87   - </div>
88   - <div id="finish-task-container" class="row finish-padding-top">
89   - <div id="finish-button" class="finish-task-button enabled-button">
90   - <span id="finish-button-text">ENVIAR ANÁLISE E FINALIZAR</span><img
91   - class="icon" src="{{ server }}/img/finish.svg"></img>
  73 + <div id="ref-container" class="col-sm-6 video-container">
  74 + <div class="row">
  75 + <h6>
  76 + VÍDEO DE REFERÊNCIA “<span class="sign-label"></span>”:
  77 + </h6>
  78 + </div>
  79 + <div class="row">
  80 + <video id="ref-video" src="" preload="metadata" class="video-body"
  81 + autoplay loop controls>
  82 + <source type="video/webm">
  83 + </video>
  84 + </div>
  85 + <div id="ref-radio-answers" class="row radio-options">
  86 + <div class="correct-answer-container"">
  87 + <span class="correct-answer-label">ESTÁ CORRETO</span><img
  88 + class="icon" src="{{ server }}/assets/img/correct.png"></img><input
  89 + value="CORRECT" type="radio" name="ref-answers">
  90 + </div>
  91 + <div>
  92 + <span class="incorrect-answer-label">ESTÁ ERRADO</span><img
  93 + class="icon" src="{{ server }}/assets/img/incorrect.png"></img><input
  94 + id="incorrect-ref-button" value="INCORRECT" type="radio"
  95 + name="ref-answers">
  96 + </div>
  97 + </div>
  98 + <div id="comment-ref" class="form-group">
  99 + <h6>ENVIAR COMENTÁRIO SOBRE O VÍDEO DE REFERÊNCIA:</h6>
  100 + <textarea class="form-control" rows="2"></textarea>
92 101 </div>
93   - <div id="skip-button" class="finish-task-button enabled-button">
94   - PULAR<img class="icon" src="{{ server }}/img/skip.svg"></img>
  102 + <div id="finish-task-container" class="row finish-padding-top">
  103 + <div id="finish-button" class="finish-task-button enabled-button">
  104 + <span id="finish-button-text">ENVIAR ANÁLISE E FINALIZAR</span><img
  105 + class="icon" src="{{ server }}/assets/img/finish.svg"></img>
  106 + </div>
  107 + <div id="skip-button" class="finish-task-button enabled-button">
  108 + PULAR<img class="icon" src="{{ server }}/assets/img/skip.svg"></img>
  109 + </div>
95 110 </div>
96 111 </div>
97 112 </div>
98 113 </div>
  114 + <div id="ranking-container" class="row"></div>
99 115 </div>
100 116  
101 117 <script type="text/javascript">
102   - validador.run("{{ server }}", "{{ server_backend }}", "{{ app_shortname }}");
  118 + validador
  119 + .run("{{ server }}", "{{ server_backend }}", "{{ app_shortname }}");
103 120 </script>
... ...