changeset 303:1de796227531 Dev_main

Bug #1389: Popup now auto-height and auto-scrolling for long options.
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Tue, 15 Sep 2015 10:13:20 +0100
parents ad3111448299
children bcfce203ec91
files core.css core.js
diffstat 2 files changed, 55 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/core.css	Mon Sep 14 17:18:33 2015 +0100
+++ b/core.css	Tue Sep 15 10:13:20 2015 +0100
@@ -37,7 +37,8 @@
 
 div.popupHolder {
 	width: 500px;
-	height: 250px;
+	min-height: 250px;
+	max-height: 400px;
 	background-color: #fff;
 	border-radius: 10px;
 	box-shadow: 0px 0px 50px #000;
@@ -49,7 +50,7 @@
 	 */
 	width: 50px;
 	height: 25px;
-	position: absolute;
+	position: relative;
 	border-radius: 5px;
 	border: #444;
 	border-width: 1px;
--- a/core.js	Mon Sep 14 17:18:33 2015 +0100
+++ b/core.js	Tue Sep 15 10:13:20 2015 +0100
@@ -49,6 +49,8 @@
 	// Creates an object to manage the popup
 	this.popup = null;
 	this.popupContent = null;
+	this.popupTitle = null;
+	this.popupResponse = null;
 	this.buttonProceed = null;
 	this.buttonPrevious = null;
 	this.popupOptions = null;
@@ -70,24 +72,53 @@
 		
 		this.popupContent = document.createElement('div');
 		this.popupContent.id = 'popupContent';
-		this.popupContent.style.marginTop = '25px';
+		this.popupContent.style.marginTop = '20px';
 		this.popupContent.align = 'center';
 		this.popup.appendChild(this.popupContent);
 		
+		var titleHolder = document.createElement('div');
+		titleHolder.id = 'popupTitleHolder';
+		titleHolder.style.width = 'inherit';
+		titleHolder.style.height = '25px';
+		titleHolder.style.marginBottom = '5px';
+		
+		this.popupTitle = document.createElement('span');
+		this.popupTitle.id = 'popupTitle';
+		titleHolder.appendChild(this.popupTitle);
+		this.popupContent.appendChild(titleHolder);
+		
+		this.popupResponse = document.createElement('div');
+		this.popupResponse.id = 'popupResponse';
+		this.popupResponse.style.width = 'inherit';
+		this.popupResponse.style.minHeight = '170px';
+		this.popupResponse.style.maxHeight = '320px';
+		this.popupResponse.style.overflow = 'auto';
+		this.popupContent.appendChild(this.popupResponse);
+		
+		var buttonHolder = document.createElement('div');
+		buttonHolder.id='buttonHolder';
+		buttonHolder.width = 'inherit';
+		buttonHolder.style.height= '30px';
+		buttonHolder.align = 'left';
+		this.popupContent.appendChild(buttonHolder);
+		
 		this.buttonProceed = document.createElement('button');
 		this.buttonProceed.className = 'popupButton';
-		this.buttonProceed.style.left = '440px';
-		this.buttonProceed.style.top = '215px';
+		this.buttonProceed.style.left = '390px';
+		this.buttonProceed.style.top = '2px';
 		this.buttonProceed.innerHTML = 'Next';
 		this.buttonProceed.onclick = function(){popup.proceedClicked();};
 		
 		this.buttonPrevious = document.createElement('button');
 		this.buttonPrevious.className = 'popupButton';
 		this.buttonPrevious.style.left = '10px';
-		this.buttonPrevious.style.top = '215px';
+		this.buttonPrevious.style.top = '2px';
 		this.buttonPrevious.innerHTML = 'Back';
 		this.buttonPrevious.onclick = function(){popup.previousClick();};
 		
+		buttonHolder.appendChild(this.buttonPrevious);
+		buttonHolder.appendChild(this.buttonProceed);
+		
 		this.popup.style.zIndex = -1;
 		this.popup.style.visibility = 'hidden';
 		blank.style.zIndex = -2;
@@ -126,19 +157,17 @@
 		var blank = document.getElementsByClassName('testHalt')[0];
 		blank.style.zIndex = -2;
 		blank.style.visibility = 'hidden';
+		this.buttonPrevious.style.visibility = 'inherit';
 	};
 	
 	this.postNode = function() {
 		// This will take the node from the popupOptions and display it
 		var node = this.popupOptions[this.currentIndex];
-		this.popupContent.innerHTML = null;
+		this.popupResponse.innerHTML = null;
 		if (node.type == 'statement') {
-			var span = document.createElement('span');
-			span.textContent = node.statement;
-			this.popupContent.appendChild(span);
+			this.popupTitle.textContent = node.statement;
 		} else if (node.type == 'question') {
-			var span = document.createElement('span');
-			span.textContent = node.question;
+			this.popupTitle.textContent = node.question;
 			var textArea = document.createElement('textarea');
 			switch (node.boxsize) {
 			case 'small':
@@ -158,18 +187,11 @@
 				textArea.rows = "10";
 				break;
 			}
-			var br = document.createElement('br');
-			this.popupContent.appendChild(span);
-			this.popupContent.appendChild(br);
-			this.popupContent.appendChild(textArea);
-			this.popupContent.childNodes[2].focus();
+			this.popupResponse.appendChild(textArea);
+			textArea.focus();
 		} else if (node.type == 'checkbox') {
-			var span = document.createElement('span');
-			span.textContent = node.statement;
-			this.popupContent.appendChild(span);
-			var optHold = document.createElement('div');
-			optHold.id = 'option-holder';
-			optHold.align = 'left';
+			this.popupTitle.textContent = node.statement;
+			var optHold = this.popupResponse;
 			for (var i=0; i<node.options.length; i++) {
 				var option = node.options[i];
 				var input = document.createElement('input');
@@ -179,22 +201,14 @@
 				span.textContent = option.text;
 				var hold = document.createElement('div');
 				hold.setAttribute('name','option');
-				hold.style.float = 'left';
 				hold.style.padding = '4px';
 				hold.appendChild(input);
 				hold.appendChild(span);
 				optHold.appendChild(hold);
 			}
-			this.popupContent.appendChild(optHold);
 		} else if (node.type == 'radio') {
-			var span = document.createElement('span');
-			span.textContent = node.statement;
-			this.popupContent.appendChild(span);
-			var optHold = document.createElement('div');
-			optHold.id = 'option-holder';
-			optHold.align = 'none';
-			optHold.style.float = 'left';
-			optHold.style.width = "100%";
+			this.popupTitle.textContent = node.statement;
+			var optHold = this.popupResponse;
 			for (var i=0; i<node.options.length; i++) {
 				var option = node.options[i];
 				var input = document.createElement('input');
@@ -210,20 +224,15 @@
 				hold.appendChild(span);
 				optHold.appendChild(hold);
 			}
-			this.popupContent.appendChild(optHold);
 		} else if (node.type == 'number') {
-			var span = document.createElement('span');
-			span.textContent = node.statement;
-			this.popupContent.appendChild(span);
-			this.popupContent.appendChild(document.createElement('br'));
+			this.popupTitle.textContent = node.statement;
 			var input = document.createElement('input');
 			input.type = 'textarea';
 			if (node.min != null) {input.min = node.min;}
 			if (node.max != null) {input.max = node.max;}
 			if (node.step != null) {input.step = node.step;}
-			this.popupContent.appendChild(input);
+			this.popupResponse.appendChild(input);
 		}
-		this.popupContent.appendChild(this.buttonProceed);
 		if(this.currentIndex+1 == this.popupOptions.length) {
 			if (this.responses.nodeName == "PRETEST") {
 				this.buttonProceed.textContent = 'Start';
@@ -234,7 +243,9 @@
 			this.buttonProceed.textContent = 'Next';
 		}
 		if(this.currentIndex > 0)
-			this.popupContent.appendChild(this.buttonPrevious);
+			this.buttonPrevious.style.visibility = 'visible';
+		else
+			this.buttonPrevious.style.visibility = 'hidden';
 	};
 	
 	this.initState = function(node) {
@@ -278,7 +289,7 @@
 			}
 		} else if (node.type == 'checkbox') {
 			// Must extract checkbox data
-			var optHold = document.getElementById('option-holder');
+			var optHold = this.popupResponse;
 			var hold = document.createElement('checkbox');
 			console.log("Checkbox: "+ node.statement);
 			hold.id = node.id;
@@ -293,7 +304,7 @@
 			}
 			this.responses.appendChild(hold);
 		} else if (node.type == "radio") {
-			var optHold = document.getElementById('option-holder');
+			var optHold = this.popupResponse;
 			var hold = document.createElement('radio');
 			var responseID = null;
 			var i=0;