# This file is part of NIT ( http://www.nitlanguage.org ).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License
# Shows a meetup and allows to modify its participants
module meetup is i18n
import opportunity_model
import boilerplate
import welcome
import template
# Shows a meetup and allows to modify its participants
class OpportunityMeetupPage
super OpportunityPage
# Meetup the page is supposed to show
var meetup: nullable Meetup = null
# Answer mode for the meetup
var mode = 0
init from_id(id: String) do
var db = new OpportunityDB.open("opportunity")
meetup = db.find_meetup_by_id(id)
db.close
if meetup != null then mode = meetup.answer_mode
init
end
init do
header.page_js = "mode = {mode};\n"
header.page_js += """
function update_scores(){
var anss = $('.answer');
var count = {};
var scores = {};
var answers = [];
var maxscore = 0;
// Pizza ratios
var pizzas = {};
var pizzas_person = {};
var pizzas_total = 0.0;
// Iterate over each participant x possible answers
for(i=0; i < anss.length; i++){
var incscore = 0;
var inccount = 0;
var idparts = anss[i].id.split("_");
var ansid = idparts[1];
var html = anss[i].innerHTML;
if(html === "
✔"){
inccount = 1;
incscore = 2;
}else if(html === "❓"){
incscore = 1;
}
var intansid = parseInt(ansid)
if(answers.indexOf(intansid) == -1){
answers.push(intansid);
}
if(ansid in count){
count[ansid] += inccount;
}else{
count[ansid] = inccount;
}
if(ansid in scores){
scores[ansid] += incscore;
}else{
scores[ansid] = incscore;
}
if(scores[ansid] > maxscore){
maxscore = scores[ansid];
}
if (ansid in pizzas_person) {
// Pizza ratio of previous participant
for (a in pizzas_person) {
var value = pizzas_person[a];
if (value != 0.0 && pizzas_total != 0)
value /= pizzas_total;
if (a in pizzas)
pizzas[a] += value;
else
pizzas[a] = value;
}
// Reset for a new person
pizzas_person = {};
pizzas_total = 0.0;
}
pizzas_total += incscore;
pizzas_person[ansid] = incscore;
}
// Pizza ratio of the last participant
for (a in pizzas_person) {
var value = pizzas_person[a];
if (value != 0.0 && pizzas_total != 0)
value /= pizzas_total;
if (a in pizzas)
pizzas[a] += value;
else
pizzas[a] = value;
}
var pizza_unit = document.getElementById("pizza_unit").value;
if (pizza_unit)
pizza_unit = parseFloat(pizza_unit);
else
pizza_unit = 1;
for(i=0; i < answers.length; i++){
var ansid = answers[i].toString();
var el = $('#total'+ansid)[0];
var ins = ""+count[ansid];
if(scores[ansid] >= maxscore){
ins += "
★";
}
ins += "";
el.innerHTML = ins;
// Pizza ratio
var val = pizzas[ansid] * pizza_unit;
el = $('#pizzas'+ansid)[0];
ins = ""+val.toFixed(1);
ins += "
∇";
ins += "";
el.innerHTML = ins;
}
var pizza_unit = $("#pizza_unit").val();
set_cookie("opportunity_pizza_unit", pizza_unit);
}
function change_answer(ele, id){
// modify only the currently selected entry
if (in_modification_id != id) return;
var e = document.getElementById(ele.id);
var i = e.innerHTML;
var ans = true;"""
if mode == 0 then
header.page_js += """
if(i === "✔"){
ans = 0;
e.innerHTML = "✘"
e.style.color = "red";
}else{
ans = 1;
e.innerHTML = "✔";
e.style.color = "green";
}"""
else
header.page_js += """
if(i === "✔"){
ans = 1;
e.innerHTML = "❓"
e.style.color = "#B8860B";
}else if(i === "❓"){
ans = 0;
e.innerHTML = "✘"
e.style.color = "red";
}else{
ans = 2;
e.innerHTML = "✔";
e.style.color = "green";
}"""
end
header.page_js += """
var a = ele.id.split('_')
var pid = a[1]
var aid = a[2]
update_scores();
$.ajax({
type: "POST",
url: "./rest/answer",
data: {
answer_id: aid,
pers_id: pid,
answer: ans
}
});
}
function change_temp_answer(ele){
var e = document.getElementById(ele.id);
var i = e.innerHTML;"""
if mode == 0 then
header.page_js += """
if(i === "✔"){
e.innerHTML = "✘"
e.style.color = "red";
}else{
e.innerHTML = "✔";
e.style.color = "green";
}
"""
else
header.page_js += """
if(i === "✔"){
e.innerHTML = "❓";
e.style.color = "#B8860B";
}else if(i === "❓"){
e.innerHTML = "✘"
e.style.color = "red";
}else{
e.innerHTML = "✔";
e.style.color = "green";
}
"""
end
header.page_js += """
update_scores();
}
function add_part(ele){
var e = document.getElementById(ele.id);
var pname = document.getElementById("new_name").value;
var arr = e.id.split("_");
var mid = arr[1];
var ans = $('#' + ele.id).parent().parent().parent().children(".answer");
ansmap = {};
for(i=0;i✔"){
ansmap[curr.attr('id')] = 1
}else{
ansmap[curr.attr('id')] = 0
}"""
else
header.page_js += """
if(curr[0].innerHTML === "✔"){
ansmap[curr.attr('id')] = 2
}else if(curr[0].innerHTML === "❓"){
ansmap[curr.attr('id')] = 1
}else{
ansmap[curr.attr('id')] = 0
}"""
end
header.page_js += """
}
$.ajax({
type: "POST",
url: "./rest/meetup/new_pers",
data: {
meetup_id: mid,
persname: pname,
answers: $.param(ansmap)
}
})
.done(function(data){
location.reload();
})
.fail(function(data){
//TODO: Notify of failure
});
// Remember the participant's name client-side
set_cookie("opportunity_participant_name", pname);
}
function remove_people(ele){
var arr = ele.id.split("_")
var pid = arr[1]
$('#' + ele.id).parent().parent().parent().remove();
update_scores();
$.ajax({
type: "POST",
url: "./rest/people",
data: {
method: "DELETE",
p_id: pid
}
});
}
// ID of line currently open for modification
var in_modification_id = null;
function modify_people(ele, id){
if (in_modification_id != null) {
// reset to normal values
$('#modify_'+in_modification_id).text("{{{"Modify or delete"}}}");
$('#modify_'+in_modification_id).attr("class", "btn btn-xs btn-warning");
$('#line_'+in_modification_id).css("background-color", "");
$('#delete_'+in_modification_id).css("display", "none");
}
if (in_modification_id != id) {
// activate modifiable mode
$('#modify_'+id).text("{{{"Done"}}}");
$('#modify_'+id).attr("class", "btn btn-xs btn-success");
$('#line_'+id).css("background-color", "LightYellow");
$('#delete_'+id).show();
in_modification_id = id;
} else {
in_modification_id = null;
}
}
function get_cookie(cookie_name) {
var name = cookie_name + "=";
var ca = document.cookie.split(';');
for(var i = 0; i < ca.length; i ++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1);
if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
}
return "";
}
function set_cookie(cookie_name, value) {
var date = new Date();
date.setTime(date.getTime() + (365*24*60*60*1000));
var expires = "expires="+date.toUTCString();
document.cookie = cookie_name + "=" + value + "; " + expires;
}
// Retrieve the last client-side participant's name
window.onload = function () {
$("#new_name").val(get_cookie("opportunity_participant_name"));
$("#new_name").focus();
$("#pizza_unit").val(get_cookie("opportunity_pizza_unit"));
update_scores();
}
"""
end
redef fun rendering do
if meetup == null then
add((new OpportunityHomePage).write_to_string)
return
end
add header
var db = new OpportunityDB.open("opportunity")
add meetup.to_html(db)
db.close
add footer
end
end
redef class Meetup
# Build the HTML for `self`
fun to_html(db: OpportunityDB): Writable do
var t = new Template
t.add """
"
return t
end
end