Commit c804565a by Nilu

added autosave timer and styling changes

parent 49f2f36c
......@@ -1929,7 +1929,7 @@ table.pos-table{
/*margin-bottom: 87px;*/
}
.main-sc-section-bottom{
padding: 35px 0px;
padding: 20px 0px 0px;
display: inline-block;
width: 100%;
/* margin-bottom: 87px;*/
......@@ -2024,13 +2024,14 @@ table.pos-table{
text-align: center;
}
.section-btn .box-btn-gray {
margin-right: 26px;
/*margin-right: 26px;*/
}
.section-btn{
margin: 20px 0 24px;
/*margin: 20px 0 24px;*/
padding: 20px 0 40px;
}
.main-wc-section {
padding: 17px 70px 62px;
padding: 17px 70px 0px;
background-color: #fbfbfb;
}
.full-width {
......@@ -2064,7 +2065,10 @@ ul.security-level {
font-family: "Usual-Light";
}
.main-rate-section{
padding: 53px 70px 68px;
padding: 53px 70px 0;
background-color: #fbfbfb;
}
.job-match-buttons{
background-color: #fbfbfb;
}
.rateing-title {
......@@ -2131,7 +2135,7 @@ ul.security-level {
color: #4a4a4a;
font-size: 12px;
font-weight: 500;
padding: 53px 0 87px;
padding: 30px 0 30px;
text-align: center;
font-weight: bold;
}
......@@ -4525,7 +4529,7 @@ img.alert-icon {float: left;}
.main-menu li a {padding: 12px 0 12px 12px;}
.form-page-area {padding: 4.89% 8.5%;}
.main-content-area{padding: 3% 8.56% 0;}
.auto-save{padding: 45px 0 70px;}
.auto-save{padding: 40px 0 20px;}
.ips-box {margin-bottom: 15px;}
}
......@@ -4749,7 +4753,7 @@ img.alert-icon {float: left;}
.section-btn .box-btn-gray.half-btn{margin-right: 0; border-radius: 100px 0 0 100px;font-size: 13px;margin-right: -2.5px;border-right: none;padding: 0 0;width: 128px;}
.section-btn .box-btn{font-size: 13px;border-radius: 0 100px 100px 0;margin-left: -2.5px;border:1px solid #03a0e7;padding: 0 0;width: 128px;}
.second-radio-primary.radio label{font-size: 12px;}
.section-btn {margin: 1px 0 7px;}
/*.section-btn {margin: 1px 0 7px;}*/
.main-wc-section{padding : 0 0 64px 0;}
.main-wc-section .selection-form-title{margin-bottom: 21px;}
.main-wc-section .full-width{ margin-bottom: 24px;}
......
......@@ -157,16 +157,11 @@
}
%>
</div>
<div class="section-btn text-center">
<a href="<%= exitPage%>" class="btn box-btn-gray">Save and exit</a>
</div>
<%
}
%>
<div class="auto-save">
<%-- <div>Autosaved 1 min ago.</div> --%>
</div>
</div>
<oneit:button value="Submit Application" name="completeApplication" id="gotoPageNext" cssClass="box-btn hide"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry ("restartProcess", Boolean.TRUE)
......
......@@ -32,29 +32,5 @@
dataMap.removeORMHandlersForObject(answer);
answer.setAnswerNo(answerNo);
if(complete)
{
// jobApplication.setApplicationStatus(ApplicationStatus.SUBMITTED);
// jobApplication.setSubmittedDate(new Date());
//
// AnalysisEngine.analyseAnswers(jobApplication.getCandidate(), jobApplication.getJob().getLevel(), jobApplication.getCompletedAnswers());
// completeProcessRestartAndRestoreAttribs(process, request);
//
// jobApplication = (JobApplication) process.getAttribute("JobApplication");
//
// // Update company in intercom
// if(jobApplication != null && jobApplication.getJob().getCompanyUser() != null)
// {
// IntercomUtils.updateCompany(jobApplication.getJob().getCompanyUser().getCompany());
// }
}
else
{
request.getSession().setAttribute ("historyQstNo", questionNumber + 1);
request.getSession().setAttribute ("historyActualNo", actualNumber);
}
%>
</oneit:form>
\ No newline at end of file
......@@ -9,17 +9,14 @@
String currentPage = WebUtils.getSamePageInRenderMode(request, "JobMatchAssessment");
String nextPage = WebUtils.getSamePageInRenderMode(request, "SubmitApplication");
ObjectTransaction objTran = ObjectTransaction.getTransaction();
Long jobAppId = (Long) process.getAttribute("JobApplicationID");
Long jobAppId = process.getAttribute("JobApplicationID") != null ?
(Long) process.getAttribute("JobApplicationID") :
((JobApplication) process.getAttribute("JobApplication")).getID().longValue();
JobApplication jobApplication = null;
if(jobAppId != null)
{
jobApplication = JobApplication.getJobApplicationByID(objTran, jobAppId);
}
else
{
jobApplication = (JobApplication) process.getAttribute("JobApplication");
process.setAttribute("JobApplicationID" , jobApplication.getID().longValue());
}
......@@ -27,8 +24,8 @@
Job job = jobApplication.getJob();
Candidate candidate = jobApplication.getCandidate();
int questionNumber = process.getAttribute("QuestionNumber")!= null ? (int) process.getAttribute("QuestionNumber") : jobApplication.getQuestionNumber();
int actualNumber = process.getAttribute("ActualNumber")!= null ? (int) process.getAttribute("ActualNumber") : jobApplication.getActualQuestionNumber();
int questionNumber = jobApplication.getQuestionNumber();
int actualNumber = jobApplication.getActualQuestionNumber();
List<Question> totalQuestions = (List<Question>) process.getAttribute("TotalQuestions");
List<Question> allQuestions = (List<Question>) process.getAttribute("AllQuestions");
String exitPage = WebUtils.getArticleLink(request, transaction, WebUtils.APPLY_JOB, "Page") + "&id=" + job.getID() + "&key=" + job.getRandomKey();
......@@ -47,41 +44,6 @@
process.setAttribute("AllQuestions", allQuestions);
}
//to store current question number in history
if(process.getAttribute("QuestionNumber")==null || process.getAttribute("ActualNumber")==null)
{
request.getSession().setAttribute ("historyQstNo", null);
request.getSession().setAttribute ("historyActualNo", null);
}
if(request.getSession().getAttribute("historyQstNo")!=null && process.getAttribute("QuestionNumber")!= null)
{
if((int) process.getAttribute("QuestionNumber") <= (int) request.getSession().getAttribute("historyQstNo"))
{
questionNumber = (int) request.getSession().getAttribute("historyQstNo");
}
}
if(request.getSession().getAttribute("historyActualNo")!=null && process.getAttribute("ActualNumber")!= null)
{
if((int) process.getAttribute("ActualNumber") <= (int) request.getSession().getAttribute("historyActualNo"))
{
actualNumber = (int) request.getSession().getAttribute("historyActualNo");
}
}
request.getSession().setAttribute ("historyQstNo", questionNumber);
request.getSession().setAttribute ("historyActualNo", actualNumber);
// boolean toRedirect = jobApplication.initAssessmentAnswers(allQuestions);
//
// if(toRedirect)
// {
// process.setAttribute("QuestionNumber", questionNumber);
// process.setAttribute("ActualNumber", actualNumber);
//
// }
Question question = (Question) allQuestions.get(questionNumber).getInTransaction (objTran);
QuestionType questionType = question.getQuestionType();
%>
......@@ -94,6 +56,13 @@
$(".ratting-number li.active").removeClass("active" );
$(".ratting-number input[type='radio']:checked").closest('li').addClass("active" );
});
$('.timer').countimer({
displayMode: 1,
initMinutes: 0,
minuteIndicator: ' min ago',
leadingZeros: 0
});
});
function gotoNextQuestion(questionNumber, actualNumber, completeApplication, answerNo)
......@@ -109,15 +78,18 @@
}
},
"POST");
if(completeApplication)
{
$("#gotoPageNext").click();
return false;
}
$('.section-job-match').empty();
ajaxProcessAddJQ ("<%= request.getContextPath() %>/extensions/applicantportal/inc/job_match_questions.jsp", '.section-job-match' , {questionNumber : questionNumber, actualNumber: actualNumber});
$('.job-match-questions').empty();
ajaxProcessAddJQ ("<%= request.getContextPath() %>/extensions/applicantportal/inc/job_match_questions.jsp", '.job-match-questions' , {questionNumber : questionNumber, actualNumber: actualNumber});
$('.timer').countimer('start');
}
</script>
......@@ -158,11 +130,20 @@
<oneit:dynInclude page="/extensions/applicantportal/inc/application_main_tabs.jsp" PageNumber="3" data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="section-page-area section-job-match">
<oneit:dynInclude page="/extensions/applicantportal/inc/job_match_questions.jsp"
actualNumber="<%= actualNumber %>"
questionNumber ="<%= questionNumber %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
<div class="job-match-questions">
<oneit:dynInclude page="/extensions/applicantportal/inc/job_match_questions.jsp"
actualNumber="<%= actualNumber %>"
questionNumber ="<%= questionNumber %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
</div>
<div class="job-match-buttons">
<div class="auto-save">
Autosaved <span class="timer"></span>
</div>
<div class="section-btn text-center">
<a href="<%= exitPage%>" class="btn box-btn-gray">Save and exit</a>
</div>
</div>
</div>
</oneit:form>
</div>
......
......@@ -60,6 +60,19 @@
<script>
$(document.body).addClass('bg-color');
$(document).ready(function()
{
$('.timer').countimer({
useHours: false,
// displayMode: 1,
initMinutes: 0,
initSeconds: 0,
// minuteIndicator: ' min ',
secondIndicator: ' min ago',
leadingZeros: 0
});
});
function gotoNextQuestion()
{
setTimeout(
......@@ -152,6 +165,10 @@
}
%>
</div>
<div class="auto-save">
Autosaved <span class="timer"></span>
</div>
</div>
<div class="selection-br-line"></div>
<div class="main-sc-section-bottom btn-remove-padd">
......
......@@ -21,6 +21,8 @@
<oneit:script src="/scripts/utils.js" />
<oneit:script src="/scripts/recalc.js" />
<oneit:script src="/scripts/jquery.circleProgressBar.min.js"/>
<oneit:script src="/scripts/moment.js"/>
<oneit:script src="/scripts/countimer.js"/>
<oneit:script src="/scripts/slick.min.js"/>
<oneit:script src="/scripts/raphael-min.js"/>
</oneit:script>
......
/**!
* @preserve
*
* Simple jQuery plugin to start a basic count up timer on any HTML element.
*
* I wrote this plugin for using into a personal project but could be useful
* for everyone who needs a simple counter.
*
* Licensed under the MIT license.
*/
;(function ($, window, document, undefined) {
'use strict';
var prefix = 'plugin_';
var pluginName = 'countimer';
var Plugin = function(element, options) {
// Main instance
var plugin = this;
plugin.options = {};
plugin.duration = {};
// Private attributes
const displayMode = {
IN_SECONDS : 0,
IN_MINUTES : 1,
IN_HOURS : 2,
FULL: 3,
MAX_INDEX: 3
};
const eventNames = [
'second',
'minute',
'hour'
];
var defaultSettings = {
displayMode : displayMode.FULL,
enableEvents: false,
autoStart : true,
useHours : true,
minuteIndicator: '',
secondIndicator: '',
separator : ':',
leadingZeros: 2,
initHours : 0,
initMinutes : 0,
initSeconds: 0
};
var elm;
var $elm;
var timer;
var isStopped;
var hasValueAttr;
var refreshMode;
var displayResults;
// Private functions
var leadingZeros = function(num, width) {
var z = '0';
var n = ''.concat(num);
// If the number has the same width only return it again.
return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
};
var format = function(time, withSeparator, overrideZeros){
var finalZeros = overrideZeros? overrideZeros : plugin.options.leadingZeros;
var pre = leadingZeros(time, finalZeros);
return withSeparator? pre.concat(plugin.options.separator) : pre;
};
var fixModeValue = function(value, maxIndex){
var band = (value === '' || value > maxIndex);
return band? maxIndex : value;
};
var getDefaultDuration = function(){
return moment.duration({
seconds : plugin.options.initSeconds,
minutes : plugin.options.initMinutes,
hour : plugin.options.initHours
});
};
var getResponseTimer = function(){
return {
displayedMode: displayResults[plugin.options.displayMode](),
original: $.extend({}, timer)
};
};
var eventHandler = function(refreshConditions){
if(plugin.options.enableEvents){
// Find events to fire up
$.each(refreshConditions, function (index) {
// Trigger events
if(refreshConditions[index]){
$elm.trigger(eventNames[index], getResponseTimer());
}
});
}
};
var mainTimer = function (omitRefresh) {
// Global timer values
timer = {
hours: plugin.duration.hours(),
minutes: plugin.duration.minutes(),
seconds: plugin.duration.seconds()
};
var getObjExpression = function(nf, f){
return {
unformatted: nf,
formatted: f
};
};
// Possible expressions to print
var expressions = {
toSeconds : function(){
var withoutFormat = Math.trunc(plugin.duration.asSeconds());
var formatted = format(withoutFormat).concat(plugin.options.secondIndicator);
return getObjExpression({seconds: withoutFormat}, formatted);
},
toMinutes : function(){
var withoutFormat = Math.trunc(plugin.duration.asMinutes());
var formatted = format(withoutFormat).concat(plugin.options.minuteIndicator);
return getObjExpression({minutes: withoutFormat}, formatted);
},
toHours : function() {
var withoutFormat = Math.trunc(plugin.duration.asHours());
return getObjExpression({hours: withoutFormat}, format(withoutFormat));
},
full : function() {
// Normal display
var normalNf = $.extend({}, timer);
var normal = format(timer.hours, true, 2)
.concat(format(timer.minutes, true, 2))
.concat(format(timer.seconds, false, 2));
normal = normal.concat(plugin.options.secondIndicator);
// Minutes display
var minutesObj = expressions.toMinutes();
var minutesNf = {
minutes: minutesObj.unformatted.minutes,
seconds: timer.seconds
};
var minutes = format(minutesNf.minutes, true).concat(format(minutesNf.seconds, false, 2));
minutes = minutes.concat(plugin.options.secondIndicator);
return (plugin.options.useHours)? getObjExpression(normalNf, normal) : getObjExpression(minutesNf, minutes);
}
};
// Array with refresh conditions
var refreshConditions = [
true, // every second
0 === timer.seconds, // every minute
0 === timer.minutes && 0 === timer.seconds // every hour
];
// Array with each function expression
displayResults = [
expressions.toSeconds,
expressions.toMinutes,
expressions.toHours,
expressions.full
];
// Set final value into element
if(omitRefresh || refreshConditions[refreshMode]){
// Call the method depending of displayMode
var finalValue = displayResults[plugin.options.displayMode]();
hasValueAttr? $elm.val(finalValue.formatted) : $elm.text(finalValue.formatted);
}
// Find events to fire up
eventHandler(refreshConditions);
// Update moment duration
plugin.duration = moment.duration(plugin.duration.asSeconds() + 1, 'seconds');
};
var startTimer = function(){
// Only if the timer is already stopped
if(isStopped){
// First call
mainTimer(true);
// Init interval
plugin.intervalFunction = setInterval(mainTimer, 1000);
isStopped = false;
// In order to allow chaining calls
return plugin;
}
};
// Init function to initialize some awesome stuffs
var init = function() {
// Initialize public variables
plugin.options = $.extend({}, defaultSettings, options);
// Validate the max index
plugin.options.displayMode = fixModeValue(plugin.options.displayMode, displayMode.MAX_INDEX);
// Configure moment duration
plugin.duration = getDefaultDuration();
// Initialize private variables
elm = element;
$elm = $(elm);
isStopped = true;
hasValueAttr = undefined !== $elm.attr('value');
refreshMode = plugin.options.displayMode <= displayMode.IN_HOURS? plugin.options.displayMode : displayMode.IN_SECONDS;
// Start?
if(plugin.options.autoStart){
plugin.start();
}else{
mainTimer(true);
}
};
// Start count timer from initial values
plugin.start = function(){
plugin.duration = getDefaultDuration();
return startTimer();
};
// Resume the counter
plugin.resume = function(){
return startTimer();
};
// Stop the counter
plugin.stop = function(){
if(plugin.intervalFunction){
clearInterval(plugin.intervalFunction);
isStopped = true;
}
// In order to allow chaining calls
return plugin;
};
// Band to know if the counter has been stopped or not
plugin.stopped = function(){
return isStopped;
};
// Return the current time
plugin.current = function(){
return getResponseTimer();
};
// Fire up the plugin calling its "constructor" method
init();
};
// Init jQuery plugin
$.fn[ pluginName ] = function(methodOrOptions) {
var method = ('string' === typeof methodOrOptions) ? methodOrOptions : undefined;
if (method) {
var plugins = [];
// Each HTML elements and get the current plugin instance
this.each(function() {
plugins.push( $(this).data(prefix.concat(pluginName)) );
});
// Retrieve arguments from params
var args = (arguments.length > 1) ? Array.prototype.slice.call(arguments, 1) : undefined;
var results = [];
var applyMethod = function(index) {
var plugin = plugins[index];
// Is plugin already instanced ?
if (!plugin) {
throw new Error(pluginName.concat(' is not instantiated yet'));
}
// Does the method exist?
if ('function' !== typeof plugin[method]) {
throw new Error('Method '.concat(method).concat(' is not defined on ').concat(pluginName));
}
// Call function and preserve result
results.push(plugin[method].apply(plugin, args));
};
// Call the method in each instance
this.each(applyMethod);
// Return one or more results depending of the number of HTML elements
return (results.length > 1) ? results : results[0];
}
// It's not a method
var options = ('object' === typeof methodOrOptions) ? methodOrOptions : undefined;
return this.each( function() {
// If the instance doesn't exist, then initialize it
if ( !$(this).data(prefix.concat(pluginName)) ) {
$(this).data(prefix.concat(pluginName), new Plugin(this, options));
}
});
};
}(jQuery, window, document));
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment