-
Notifications
You must be signed in to change notification settings - Fork 2
/
module.js
341 lines (295 loc) · 10.9 KB
/
module.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
M.report_unasus = {};
M.report_unasus.init = function(Y) {
// Se javascript for executado ele mostra o botão ocultar/mostrar filtros
var $filter_button = Y.one('#button-mostrar-filtro');
var $filter_div = Y.one('#div_filtro');
if ($filter_button.hasClass('visible')) {
$filter_button.removeClass('hidden');
$filter_div.addClass('hidden');
} else {
$filter_div.addClass('visible');
}
// Ao clicar no botao mostrar/ocultar filtros ele esconde/mostra a barra e troca o seu texto
Y.delegate('click', function(e) {
var $filter_button = Y.one('#button-mostrar-filtro');
var $filter_div = Y.one('#div_filtro');
if ($filter_div.hasClass('visible')) {
$filter_button.set('text', 'Mostrar Filtro');
$filter_div.addClass('hidden');
$filter_div.removeClass('visible');
} else {
$filter_button.set('text', 'Ocultar Filtro');
$filter_div.addClass('visible');
$filter_div.removeClass('hidden');
}
}, document, '#button-mostrar-filtro');
//Botoes de selecionar todos e limpar seleção
Y.delegate('click', function(e) {
select_all('#multiple_cohort', true);
}, document, '#select_all_cohort');
Y.delegate('click', function(e) {
select_all('#multiple_cohort', false);
}, document, '#select_none_cohort');
Y.delegate('click', function(e) {
select_all('#multiple_modulo', true);
}, document, '#select_all_modulo');
Y.delegate('click', function(e) {
select_all('#multiple_modulo', false);
}, document, '#select_none_modulo');
Y.delegate('click', function(e) {
select_all('#multiple_polo', true);
}, document, '#select_all_polo');
Y.delegate('click', function(e) {
select_all('#multiple_polo', false);
}, document, '#select_none_polo');
Y.delegate('click', function(e) {
select_all('#multiple_tutor', true);
}, document, '#select_all_tutor');
Y.delegate('click', function(e) {
select_all('#multiple_tutor', false);
}, document, '#select_none_tutor');
};
/**
* Função que seleciona/desceleciona todos os itens
* @param target id do select box
* @param select boolean -- true para selecionar todos, false para descelecionar
*
*/
function select_all(target, select) {
var multiple = Y.one(target);
multiple.get('options').each(function() {
if (select) {
this.set('selected', true);
} else {
this.set('selected', false);
}
});
multiple.focus();
}
//M.report_unasus.init_date_picker = YUI().use('calendar', function (Y) {
// var hoje = new Date();
// var mes_passado = new Date();
// mes_passado.setMonth( mes_passado.getMonth() - 1 );
//
// // Create a new instance of Calendar, setting its width
// // and height, allowing the dates from the previous
// // and next month to be visible and setting the initial
// // date to be November, 1982.
// var calendar = new Y.Calendar({
// contentBox: "#calendario_inicio",
// height:'225px',
// width:'100%',
// showPrevMonth: true,
// showNextMonth: true,
// date: mes_passado,
// maximumDate: hoje}).render();
//
// var calendarfim = new Y.Calendar({
// contentBox: "#calendario_fim",
// height:'225px',
// width:'100%',
// showPrevMonth: true,
// showNextMonth: true,
// maximumDate: hoje}).render();
//
//});
var chart1;
/**
* Gráfico de Stacked Bars
*
* @param Y objeto da YAHOO javascript
* @param dados_grafico array -- dados que alimentarão o gráfico array([item]=>(int1, int2, int3))
* @param tipos array -- tipos de dados para legenda/cores do gráfico
* @param title String -- titulo do gráfico
* @param porcentagem boolean -- se o gráfico é do tipo porcentagem ou não
*/
M.report_unasus.init_graph = function(Y, dados_grafico, tipos, title, porcentagem) {
var size = Object.keys(dados_grafico).length;
var stack_option = 'normal';
if (porcentagem)
stack_option = 'percent';
var options = {
chart: {
// ID da div para colocar o gráfico
renderTo: 'container',
type: 'bar',
height: 200 + (60 * size)
},
title: {
text: title
},
xAxis: {
categories: []
},
yAxis: {
title: {
text: "Estado das avalições"
}
},
legend: {
reversed: true,
layout: 'vertical'
},
plotOptions: {
series: {
stacking: stack_option
}
},
series: []
};
// se for um gráfico de porcentagem cria uma legenda específica
if (porcentagem) {
options['tooltip'] = {
formatter: function() {
return '<b>' + this.x + '</b>' + '<br><span style="color:' + this.series.color + '">' + this.series.name + '</span>: ' + Math.round(this.percentage * 100) / 100 + ' % (quantidade: ' + this.y + ' de ' + this.total + ')';
}
}
}
// Cria um item no array data para cada tipo de informação
var data = [];
for (tipo in tipos) {
data[tipo] = [];
}
for (tutor in dados_grafico) {
//Plota uma nova linha no gráfico para cada tutor
options.xAxis.categories.push(tutor);
//Para cada informacao de um tutor ele adiciona um novo item no array data
//data = [tipo1] => [dado_tipo1_tutor1, dado_tipo1_tutor2, dado_tipo1_tutor3],
// [tipo2] => [dado_tipo2_tutor1, dado_tipo2_tutor2, dado_tipo2_tutor3]
for (d in data) {
data[d].push(dados_grafico[tutor][d]);
}
}
for (tipo in tipos) {
options.series.push({
name: tipos[tipo],
data: data[tipo]
})
}
chart1 = new Highcharts.Chart(options)
}
/**
* @param Y objeto da Yahoo javascript
* @param dados dados para popular o gráfico, no formato
* array ('tutor 1'=> ('sem1'=> 5,'sem2'=> 12, 'sem3'=> 5 )
* 'tutor 2'=> ('sem1'=> 12,'sem2'=>8, 'sem3'=>20 ))
*
*/
M.report_unasus.init_dot_graph = function(Y, dados) {
// Contadores de dados
// xs = vai de 0 a numero de semanas, repetindo isto para cada tutor
// EX: 3 tutores, 4 semanas xs = [0,1,2,3,0,1,2,3,0,1,2,3]
var xs = [];
// ys = vai de numero de semanas até 1, repete cada numero até acabarem todos os tutores daquela data
// EX: 3 tutores, 4 semanas ys = [3,3,3,3,2,2,2,2,1,1,1,1]
var ys = [];
// Dados de cada tutor por semana
// EX: 3 tutores, 4 semanas xy = [12 ,5 ,7 ,3 ,15 ,8 ,10 ,2 ,10 ,10 ,20 ,12]
// Tutor 1 | Tutor 2 | Tutor 3
// s1,s2,s3,s4 | s1,s2,s3,s4 | s1,s2,s3,s4
var data = [];
//Legendas axisX = Semanas, axisY = Nome dos Tutores
var axisy = [];
var axisx = [];
var count_tutor = objectLength(dados);
var ysize = count_tutor - 1;
var count_semana;
// A legenda do eixo X é pega com os dados correspondentes do promeiro tutor iterado
var primeira_vez = true;
for (tutor in dados) {
count_semana = 0;
axisy.push(tutor);
for (dias in dados[tutor]) {
if (primeira_vez) {
axisx.push(dias);
}
data.push(dados[tutor][dias]);
ys.push(count_tutor);
xs.push(count_semana);
count_semana++;
}
count_tutor--;
primeira_vez = false;
}
axisy = axisy.reverse();
var r = Raphael("container"), xs, ys, data, axisy , axisx;
r.dotchart(10, 10, 620, 260, xs, ys, data, {
//desenho no gráfico, uma bola - só existe essa opcao no GRafael
symbol: "o",
//Tamanho máximo da bola
max: 15,
//colorida
heat: true,
//aonde serao renderizados os eixos, cima, direita, baixo, esquerda
axis: "0 0 1 1",
axisxstep: count_semana - 1,
axisystep: ysize,
axisxlabels: axisx,
//Modo como serão renderizados a ligação entre legenda - linha divisória, neste caso um "+"
axisxtype: "+",
axisytype: "+",
axisylabels: axisy
}).hover(function() {
this.marker = this.marker || r.tag(this.x, this.y, this.value, 0, this.r + 2).insertBefore(this);
this.marker.show();
}, function() {
this.marker && this.marker.hide();
});
};
/**
* @param obj array(array())
* @return int quantidade de itens pai no array, utilizado para saber quantos tutores foram enviados
**/
function objectLength(obj) {
var result = 0;
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
result++;
}
}
return result;
}
M.report_unasus.fixed_columns = function(Y) {
// Grab all cells in the user names column.
var userColumn = Y.all(SELECTORS.USERCELL),
// Create a floating table.
floatingUserColumn = Y.Node.create('<div aria-hidden="true" role="presentation" class="floater sideonly"></div>'),
// Get the XY for the floating element.
coordinates = this._getRelativeXY(this.firstUserCell);
// Generate the new fields.
userColumn.each(function(node) {
var height = node.getComputedStyle(HEIGHT);
// Nasty hack to account for Internet Explorer
if(Y.UA.ie !== 0) {
var allHeight = node.get('offsetHeight');
var marginHeight = parseInt(node.getComputedStyle('marginTop'),10) +
parseInt(node.getComputedStyle('marginBottom'),10);
var paddingHeight = parseInt(node.getComputedStyle('paddingTop'),10) +
parseInt(node.getComputedStyle('paddingBottom'),10);
var borderHeight = parseInt(node.getComputedStyle('borderTopWidth'),10) +
parseInt(node.getComputedStyle('borderBottomWidth'),10);
height = allHeight - marginHeight - paddingHeight - borderHeight;
}
// Create and configure the new container.
var containerNode = Y.Node.create('<div></div>');
containerNode.set('innerHTML', node.get('innerHTML'))
.setAttribute('class', node.getAttribute('class'))
.setAttribute('data-uid', node.ancestor('tr').getData('uid'))
.setStyles({
height: height,
width: node.getComputedStyle(WIDTH)
});
// Add the new nodes to our floating table.
floatingUserColumn.appendChild(containerNode);
}, this);
// Style the floating user container.
floatingUserColumn.setStyles({
left: coordinates[0] + 'px',
position: 'absolute',
top: coordinates[1] + 'px'
});
// Append to the grader region.
this.graderRegion.append(floatingUserColumn);
// Store a reference to this for later - we use it in the event handlers.
this.userColumn = floatingUserColumn;
}