mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			377 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			377 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 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
 | |
| 
 | |
| 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;
 | |
| 			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 === "<center>✔</center>"){
 | |
| 					inccount = 1;
 | |
| 					incscore = 2;
 | |
| 				}else if(html === "<center>❓</center>"){
 | |
| 					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];
 | |
| 				}
 | |
| 			}
 | |
| 			for(i=0; i < answers.length; i++){
 | |
| 				var ansid = answers[i].toString();
 | |
| 				var el = $('#total'+ansid)[0];
 | |
| 				var ins = "<center>"+count[ansid];
 | |
| 				if(scores[ansid] >= maxscore){
 | |
| 					ins += "<br/><span style=\\"color:blue\\">★</span>";
 | |
| 				}
 | |
| 				ins += "</center>";
 | |
| 				el.innerHTML = ins;
 | |
| 			}
 | |
| 		}
 | |
| 		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 === "<center>✔</center>"){
 | |
| 				ans = 0;
 | |
| 				e.innerHTML = "<center>✘</center>"
 | |
| 				e.style.color = "red";
 | |
| 			}else{
 | |
| 				ans = 1;
 | |
| 				e.innerHTML = "<center>✔</center>";
 | |
| 				e.style.color = "green";
 | |
| 			}"""
 | |
| 
 | |
| 		else
 | |
| 			header.page_js += """
 | |
| 			if(i === "<center>✔</center>"){
 | |
| 				ans = 1;
 | |
| 				e.innerHTML = "<center>❓</center>"
 | |
| 				e.style.color = "#B8860B";
 | |
| 			}else if(i === "<center>❓</center>"){
 | |
| 				ans = 0;
 | |
| 				e.innerHTML = "<center>✘</center>"
 | |
| 				e.style.color = "red";
 | |
| 			}else{
 | |
| 				ans = 2;
 | |
| 				e.innerHTML = "<center>✔</center>";
 | |
| 				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 === "<center>✔</center>"){
 | |
| 				e.innerHTML = "<center>✘</center>"
 | |
| 				e.style.color = "red";
 | |
| 			}else{
 | |
| 				e.innerHTML = "<center>✔</center>";
 | |
| 				e.style.color = "green";
 | |
| 			}
 | |
| 			"""
 | |
| 		else
 | |
| 			header.page_js += """
 | |
| 			if(i === "<center>✔</center>"){
 | |
| 				e.innerHTML = "<center>❓</center>";
 | |
| 				e.style.color = "#B8860B";
 | |
| 			}else if(i === "<center>❓</center>"){
 | |
| 				e.innerHTML = "<center>✘</center>"
 | |
| 				e.style.color = "red";
 | |
| 			}else{
 | |
| 				e.innerHTML = "<center>✔</center>";
 | |
| 				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<ans.length;i++){
 | |
| 				var curr = ans.eq(i)
 | |
| 			"""
 | |
| 		if mode == 0 then
 | |
| 			header.page_js += """
 | |
| 				if(curr[0].innerHTML === "<center>✔</center>"){
 | |
| 					ansmap[curr.attr('id')] = 1
 | |
| 				}else{
 | |
| 					ansmap[curr.attr('id')] = 0
 | |
| 				}"""
 | |
| 		else
 | |
| 			header.page_js += """
 | |
| 				if(curr[0].innerHTML === "<center>✔</center>"){
 | |
| 					ansmap[curr.attr('id')] = 2
 | |
| 				}else if(curr[0].innerHTML === "<center>❓</center>"){
 | |
| 					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
 | |
| 				});
 | |
| 		}
 | |
| 		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;
 | |
| 			}
 | |
| 		}
 | |
| 		"""
 | |
| 	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): Streamable do
 | |
| 		var t = new Template
 | |
| 		t.add """
 | |
| <div class="container">
 | |
| <div class="page-header">
 | |
| 	<center><h1>{{{name}}}</h1></center>
 | |
| """
 | |
| 		if not date.is_empty then t.add """
 | |
| 	<center><h4>When: {{{date}}}</h4></center>"""
 | |
| 
 | |
| 		if not place.is_empty then t.add """
 | |
| 	<center><h4>Where: {{{place}}}</h4></center>"""
 | |
| 
 | |
| 		t.add """
 | |
| </div>
 | |
| <table class="table">
 | |
| """
 | |
| 		t.add "<th>Participant name</th>"
 | |
| 		for i in answers(db) do
 | |
| 			t.add "<th class=\"text-center\">"
 | |
| 			t.add i.to_s
 | |
| 			t.add "</th>"
 | |
| 		end
 | |
| 		t.add "<th></th>"
 | |
| 		t.add "</tr>"
 | |
| 		for i in participants(db) do
 | |
| 			i.load_answers(db, self)
 | |
| 			t.add "<tr id=\"line_{i.id}\">"
 | |
| 			t.add "<td>"
 | |
| 			t.add i.to_s
 | |
| 			t.add "</td>"
 | |
| 			for j, k in i.answers do
 | |
| 				var color
 | |
| 				if answer_mode == 0 then
 | |
| 					if k == 1 then
 | |
| 						color = "green"
 | |
| 					else
 | |
| 						color = "red"
 | |
| 					end
 | |
| 				else
 | |
| 					if k == 2 then
 | |
| 						color = "green"
 | |
| 					else if k == 1 then
 | |
| 						color = "#B8860B"
 | |
| 					else
 | |
| 						color = "red"
 | |
| 					end
 | |
| 				end
 | |
| 				t.add """<td class="answer" onclick="change_answer(this, {{{i.id}}})" id="answer_{{{j.id}}}_{{{i.id}}}" style="color:{{{color}}}">"""
 | |
| 				t.add "<center>"
 | |
| 				if answer_mode == 0 then
 | |
| 					if k == 1 then
 | |
| 						t.add "✔"
 | |
| 					else
 | |
| 						t.add "✘"
 | |
| 					end
 | |
| 				else
 | |
| 					if k == 2 then
 | |
| 						t.add "✔"
 | |
| 					else if k == 1 then
 | |
| 						t.add "❓"
 | |
| 					else
 | |
| 						t.add "✘"
 | |
| 					end
 | |
| 				end
 | |
| 				t.add "</center></td>"
 | |
| 			end
 | |
| 			t.add """<td class="opportunity-action"><center><button class="btn btn-xs btn-warning" type="button" onclick="modify_people(this, {{{i.id}}})" id="modify_{{{i.id}}}">Modify or delete</button> """
 | |
| 			t.add """<button class="btn btn-xs btn-danger" type="button" onclick="remove_people(this)" id="delete_{{{i.id}}}" style="display: none;">Delete</button></center></td>"""
 | |
| 			t.add "</tr>"
 | |
| 		end
 | |
| 		t.add """
 | |
| <tr id="newrow" style="background-color: LightYellow">
 | |
| 	<td><input id="new_name" type="text" placeholder="Your name" class="input-large"></td>
 | |
| 		"""
 | |
| 		for i in answers(db) do
 | |
| 			t.add "<td class=\"answer\" id=\"newans_{i.id}\" onclick=\"change_temp_answer(this)\" style=\"color:red;\"><center>✘</center></td>"
 | |
| 		end
 | |
| 		t.add """
 | |
| 	<td><center><span id="add_{{{id}}}" onclick="add_part(this)" style="color:green;" class="action"><button class="btn btn-xs btn-success" type="button">Done</button></span></center></td>"""
 | |
| 		t.add "</tr>"
 | |
| 		# Compute score for each answer
 | |
| 		var scores = new HashMap[Int, Int]
 | |
| 		var maxsc = 0
 | |
| 		for i in answers(db) do
 | |
| 			scores[i.id] = i.score(db)
 | |
| 			if scores[i.id] > maxsc then maxsc = scores[i.id]
 | |
| 		end
 | |
| 		t.add """
 | |
| <tr id="total">
 | |
| 	<th>Total</th>
 | |
| 		"""
 | |
| 		for i in answers(db) do
 | |
| 			t.add """<th id="total{{{i.id}}}"><center>{{{i.count(db)}}}"""
 | |
| 			if scores.has_key(i.id) and scores[i.id] >= maxsc then
 | |
| 				t.add """<br/><span style="color:blue">★</span>"""
 | |
| 			end
 | |
| 			t.add "</center></th>"
 | |
| 		end
 | |
| 		t.add "</th>"
 | |
| 		t.add """
 | |
| 		<th></th>
 | |
| </tr>"""
 | |
| 		t.add "</table>"
 | |
| 		t.add "</div>"
 | |
| 		return t
 | |
| 	end
 | |
| end
 |