Commit d8b69c1e by nilu

S51619299 # Client - Incoming Issues #Messaging & Workflow Changes

parent 1dffa8ed
......@@ -622,7 +622,7 @@ public class Job extends BaseJob
public List<WorkFlowStage> getSortedMiddleStages()
{
Filter<WorkFlowStage> filter = WorkFlowStage.SearchByAll().andStageType(new NotInFilter<>(StageType.INITIAL, StageType.UNSUITABLE, StageType.WITHDREW));
Filter<WorkFlowStage> filter = WorkFlowStage.SearchByAll().andStageType(new EqualsFilter<>(StageType.GENERIC));
return ObjstoreUtils.sort(pipelineJob().toWorkFlowTemplate().toWorkFlowStages(filter).uniqueVals(),
new ObjectTransform[]{WorkFlowStage.pipesWorkFlowStage().toSortOrder()},
......
......@@ -796,4 +796,26 @@ public class JobApplication extends BaseJobApplication
{
return isTrue(super.getPreferRemote());
}
public Boolean hasCompletedStep(StepType stepType)
{
if(stepType == StepType.DIVERSITY && isDiversityIncluded())
{
return diversityCompleted();
}
else if(stepType == StepType.REQUIREMENT_FIT)
{
return selectionCompleted();
}
else if(stepType == StepType.CULTURE_FIT)
{
return cultureCompleted();
}
else if(stepType == StepType.ROLE_FIT)
{
return assessmentCompleted();
}
return true;
}
}
\ No newline at end of file
......@@ -41,6 +41,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
public static final String FIELD_Details = "Details";
public static final String FIELD_Filter = "Filter";
public static final String FIELD_ShowIncomplete = "ShowIncomplete";
public static final String SINGLEREFERENCE_Job = "Job";
// Static constants corresponding to searches
......@@ -49,11 +50,13 @@ public abstract class BaseSearchApplicant extends SearchExecutor
// Static constants corresponding to attribute helpers
private static final DefaultAttributeHelper<SearchApplicant> HELPER_Details = DefaultAttributeHelper.INSTANCE;
private static final DelimitedEnumsAttributeHelper HELPER_Filter = new DelimitedEnumsAttributeHelper (AppFilter.FACTORY_AppFilter);
private static final DefaultAttributeHelper<SearchApplicant> HELPER_ShowIncomplete = DefaultAttributeHelper.INSTANCE;
// Private attributes corresponding to business object data
private String _Details;
private Set<AppFilter> _Filter;
private Boolean _ShowIncomplete;
// Private attributes corresponding to single references
......@@ -67,11 +70,13 @@ public abstract class BaseSearchApplicant extends SearchExecutor
private static final Map ATTRIBUTES_METADATA_SearchApplicant = new LinkedHashMap ();
// Arrays of validators for each attribute
private static final AttributeValidator[] FIELD_ShowIncomplete_Validators;
private static final AttributeValidator[] FIELD_Details_Validators;
private static final AttributeValidator[] FIELD_Filter_Validators;
// Arrays of AttributeDecorators for each attribute
private static final AttributeDecorator<SearchApplicant, Boolean>[] FIELD_ShowIncomplete_Decorators;
private static final AttributeDecorator<SearchApplicant, String>[] FIELD_Details_Decorators;
private static final AttributeDecorator<SearchApplicant, Set<AppFilter>>[] FIELD_Filter_Decorators;
......@@ -95,8 +100,10 @@ public abstract class BaseSearchApplicant extends SearchExecutor
Map validatorMapping = ((Map)ConfigMgr.getConfigObject ("CONFIG.ORMVALIDATOR", "ValidatorMapping"));
setupAssocMetaData_Job();
FIELD_ShowIncomplete_Validators = (AttributeValidator[])setupAttribMetaData_ShowIncomplete(validatorMapping).toArray (new AttributeValidator[0]);
FIELD_Details_Validators = (AttributeValidator[])setupAttribMetaData_Details(validatorMapping).toArray (new AttributeValidator[0]);
FIELD_Filter_Validators = (AttributeValidator[])setupAttribMetaData_Filter(validatorMapping).toArray (new AttributeValidator[0]);
FIELD_ShowIncomplete_Decorators = (AttributeDecorator[])AttributeDecoratorUtils.getAttributeDecorators(REFERENCE_SearchApplicant, FIELD_ShowIncomplete).toArray (new AttributeDecorator[0]);
FIELD_Details_Decorators = (AttributeDecorator[])AttributeDecoratorUtils.getAttributeDecorators(REFERENCE_SearchApplicant, FIELD_Details).toArray (new AttributeDecorator[0]);
FIELD_Filter_Decorators = (AttributeDecorator[])AttributeDecoratorUtils.getAttributeDecorators(REFERENCE_SearchApplicant, FIELD_Filter).toArray (new AttributeDecorator[0]);
SINGLEREFERENCE_Job_Decorators = (SingleAssocDecorator[])AttributeDecoratorUtils.getSingleAssocDecorators(REFERENCE_SearchApplicant, SINGLEREFERENCE_Job).toArray (new SingleAssocDecorator[0]);
......@@ -127,6 +134,23 @@ public abstract class BaseSearchApplicant extends SearchExecutor
}
private static List setupAttribMetaData_ShowIncomplete(Map validatorMapping)
{
Map metaInfo = new HashMap ();
metaInfo.put ("defaultValue", "Boolean.FALSE");
metaInfo.put ("name", "ShowIncomplete");
metaInfo.put ("type", "Boolean");
LogMgr.log (BUSINESS_OBJECTS, LogLevel.DEBUG2, "Metadata for SearchApplicant.ShowIncomplete:", metaInfo);
ATTRIBUTES_METADATA_SearchApplicant.put (FIELD_ShowIncomplete, Collections.unmodifiableMap (metaInfo));
List validators = BaseBusinessClass.getAttribValidators(SearchApplicant.class, "ShowIncomplete", metaInfo, validatorMapping);
LogMgr.log (BUSINESS_OBJECTS, LogLevel.DEBUG1, "Validators for SearchApplicant.ShowIncomplete:", validators);
return validators;
}
private static List setupAttribMetaData_Details(Map validatorMapping)
{
Map metaInfo = new HashMap ();
......@@ -188,6 +212,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
_Details = (String)(HELPER_Details.initialise (_Details));
_Filter = (Set<AppFilter>)(HELPER_Filter.initialise (_Filter));
_ShowIncomplete = (Boolean)(Boolean.FALSE);
}
......@@ -411,6 +436,106 @@ public abstract class BaseSearchApplicant extends SearchExecutor
}
}
/**
* Attribute ShowIncomplete
*/
public Boolean getShowIncomplete ()
{
assertValid();
Boolean valToReturn = AttributeDecoratorUtils.getValue (FIELD_ShowIncomplete_Decorators, (SearchApplicant)this, FIELD_ShowIncomplete, _ShowIncomplete);
for (SearchApplicantBehaviourDecorator bhd : SearchApplicant_BehaviourDecorators)
{
valToReturn = bhd.getShowIncomplete ((SearchApplicant)this, valToReturn);
}
return valToReturn;
}
/**
* Called prior to the attribute changing. Subclasses need not call super. If a field exception
* is thrown, the attribute change will fail. The new value is different to the old value.
*/
protected void preShowIncompleteChange (Boolean newShowIncomplete) throws FieldException
{
}
/**
* Called after the attribute changes.
* If a field exception is thrown, the value is still changed, however it
* may lead to the TX being rolled back
*/
protected void postShowIncompleteChange () throws FieldException
{
}
public FieldWriteability getWriteability_ShowIncomplete ()
{
return getFieldWritabilityUtil (FieldWriteability.TRUE);
}
/**
* Set the attribute ShowIncomplete. Checks to ensure a new value
* has been supplied. If so, marks the field as altered and sets the attribute.
*/
public void setShowIncomplete (Boolean newShowIncomplete) throws FieldException
{
newShowIncomplete = AttributeDecoratorUtils.setValue (FIELD_ShowIncomplete_Decorators, (SearchApplicant)this, FIELD_ShowIncomplete, newShowIncomplete);
boolean oldAndNewIdentical = HELPER_ShowIncomplete.compare (_ShowIncomplete, newShowIncomplete);
try
{
for (SearchApplicantBehaviourDecorator bhd : SearchApplicant_BehaviourDecorators)
{
newShowIncomplete = bhd.setShowIncomplete ((SearchApplicant)this, newShowIncomplete);
oldAndNewIdentical = HELPER_ShowIncomplete.compare (_ShowIncomplete, newShowIncomplete);
}
if (FIELD_ShowIncomplete_Validators.length > 0)
{
Object newShowIncompleteObj = HELPER_ShowIncomplete.toObject (newShowIncomplete);
if (newShowIncompleteObj != null)
{
int loopMax = FIELD_ShowIncomplete_Validators.length;
Map metadata = (Map)ATTRIBUTES_METADATA_SearchApplicant.get (FIELD_ShowIncomplete);
for (int v = 0 ; v < loopMax ; ++v)
{
FIELD_ShowIncomplete_Validators[v].checkAttribute (this, FIELD_ShowIncomplete, metadata, newShowIncompleteObj);
}
}
}
}
catch (FieldException e)
{
if (!oldAndNewIdentical)
{
e.setWouldModify ();
}
throw e;
}
if (!oldAndNewIdentical)
{
assertValid();
Debug.assertion (AttributeDecoratorUtils.getWriteability (FIELD_ShowIncomplete_Decorators, (SearchApplicant)this, FIELD_ShowIncomplete ,getWriteability_ShowIncomplete ()) != FieldWriteability.FALSE, "Field ShowIncomplete is not writeable");
preShowIncompleteChange (newShowIncomplete);
markFieldChange (FIELD_ShowIncomplete);
_ShowIncomplete = newShowIncomplete;
postFieldChange (FIELD_ShowIncomplete);
postShowIncompleteChange ();
}
}
/**
......@@ -831,6 +956,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
_Details = sourceSearchApplicant._Details;
_Filter = sourceSearchApplicant._Filter;
_ShowIncomplete = sourceSearchApplicant._ShowIncomplete;
}
}
......@@ -886,6 +1012,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
_Details = (String)(HELPER_Details.readExternal (_Details, vals.get(FIELD_Details))); //
_Filter = (Set<AppFilter>)(HELPER_Filter.readExternal (_Filter, vals.get(FIELD_Filter))); //
_ShowIncomplete = (Boolean)(HELPER_ShowIncomplete.readExternal (_ShowIncomplete, vals.get(FIELD_ShowIncomplete))); //
_Job.readExternalData(vals.get(SINGLEREFERENCE_Job));
}
......@@ -900,6 +1027,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
vals.put (FIELD_Details, HELPER_Details.writeExternal (_Details));
vals.put (FIELD_Filter, HELPER_Filter.writeExternal (_Filter));
vals.put (FIELD_ShowIncomplete, HELPER_ShowIncomplete.writeExternal (_ShowIncomplete));
vals.put (SINGLEREFERENCE_Job, _Job.writeExternalData());
}
......@@ -937,6 +1065,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
{
super.visitAttributes (visitor);
visitor.visitField(this, FIELD_ShowIncomplete, HELPER_ShowIncomplete.toObject(getShowIncomplete()));
}
......@@ -1020,6 +1149,10 @@ public abstract class BaseSearchApplicant extends SearchExecutor
{
return HELPER_Filter.toObject (getFilter ());
}
else if (attribName.equals (FIELD_ShowIncomplete))
{
return HELPER_ShowIncomplete.toObject (getShowIncomplete ());
}
else
{
return super.getAttribute (attribName);
......@@ -1041,6 +1174,10 @@ public abstract class BaseSearchApplicant extends SearchExecutor
{
return HELPER_Filter;
}
else if (attribName.equals (FIELD_ShowIncomplete))
{
return HELPER_ShowIncomplete;
}
else
{
return super.getAttributeHelper (attribName);
......@@ -1062,6 +1199,10 @@ public abstract class BaseSearchApplicant extends SearchExecutor
{
setFilter ((Set<AppFilter>)(HELPER_Filter.fromObject (_Filter, attribValue)));
}
else if (attribName.equals (FIELD_ShowIncomplete))
{
setShowIncomplete ((Boolean)(HELPER_ShowIncomplete.fromObject (_ShowIncomplete, attribValue)));
}
else
{
super.setAttribute (attribName, attribValue);
......@@ -1104,6 +1245,10 @@ public abstract class BaseSearchApplicant extends SearchExecutor
{
return getWriteability_Job ();
}
else if (fieldName.equals (FIELD_ShowIncomplete))
{
return getWriteability_ShowIncomplete ();
}
else
{
return super.getWriteable (fieldName);
......@@ -1123,6 +1268,11 @@ public abstract class BaseSearchApplicant extends SearchExecutor
fields.add (FIELD_Filter);
}
if (getWriteability_ShowIncomplete () != FieldWriteability.TRUE)
{
fields.add (FIELD_ShowIncomplete);
}
super.putUnwriteable (fields);
}
......@@ -1141,6 +1291,7 @@ public abstract class BaseSearchApplicant extends SearchExecutor
result.add(HELPER_Details.getAttribObject (getClass (), _Details, false, FIELD_Details));
result.add(HELPER_Filter.getAttribObject (getClass (), _Filter, false, FIELD_Filter));
result.add(HELPER_ShowIncomplete.getAttribObject (getClass (), _ShowIncomplete, false, FIELD_ShowIncomplete));
return result;
}
......@@ -1234,6 +1385,24 @@ public abstract class BaseSearchApplicant extends SearchExecutor
return newFilter;
}
/**
* Get the attribute ShowIncomplete
*/
public Boolean getShowIncomplete (SearchApplicant obj, Boolean original)
{
return original;
}
/**
* Change the value set for attribute ShowIncomplete.
* May modify the field beforehand
* Occurs before validation.
*/
public Boolean setShowIncomplete (SearchApplicant obj, Boolean newShowIncomplete) throws FieldException
{
return newShowIncomplete;
}
}
@Override
......@@ -1292,6 +1461,10 @@ public abstract class BaseSearchApplicant extends SearchExecutor
public PipeLine<From, ? extends Object> to(String name)
{
if (name.equals ("ShowIncomplete"))
{
return toShowIncomplete ();
}
if (name.equals ("Details"))
{
return toDetails ();
......@@ -1310,6 +1483,8 @@ public abstract class BaseSearchApplicant extends SearchExecutor
}
public PipeLine<From, Boolean> toShowIncomplete () { return pipe(new ORMAttributePipe<Me, Boolean>(FIELD_ShowIncomplete)); }
public PipeLine<From, String> toDetails () { return pipe(new ORMAttributePipe<Me, String>(FIELD_Details)); }
public PipeLine<From, Set<AppFilter>> toFilter () { return pipe(new ORMAttributePipe<Me, Set<AppFilter>>(FIELD_Filter)); }
......@@ -1325,6 +1500,11 @@ public abstract class BaseSearchApplicant extends SearchExecutor
public boolean isTransientAttrib(String attribName)
{
if(CollectionUtils.equals(attribName, "ShowIncomplete"))
{
return true;
}
return super.isTransientAttrib(attribName);
}
......
......@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import oneit.logging.LogLevel;
import oneit.logging.LogMgr;
import oneit.logging.LoggingArea;
......@@ -51,7 +52,22 @@ public class SearchApplicant extends BaseSearchApplicant
app.setApplicationStatus(appStatus);
if(getFilter() != null)
if(!getShowIncomplete())
{
Set<WorkFlowStep> steps = app.pipelineJobApplication().toWorkFlowStage().toSteps().uniqueVals();
for(WorkFlowStep step : steps)
{
skip = !app.hasCompletedStep(step.getStepType());
if(skip)
{
break;
}
}
}
if(!skip && getFilter() != null)
{
skip = applyFilters(app);
}
......
......@@ -8,6 +8,8 @@
<IMPORT value="performa.orm.*"/>
<IMPORT value="performa.orm.types.*"/>
<TRANSIENT name="ShowIncomplete" type="Boolean" defaultValue="Boolean.FALSE"/>
<TABLE tablePrefix="object" polymorphic="FALSE" >
<ATTRIB name="Details" type="String" dbcol="xxxx" />
......
......@@ -108,7 +108,7 @@ public class WorkflowDataMigration
for(JobApplication jobApplication : job.getJobApplicationsSet())
{
jobApplication.setApplicantSource(jobApplication.getIsEmailIngest() ? ApplicantSource.INGEST : ApplicantSource.APPLY_URL);
jobApplication.setApplicantSource(jobApplication.isTrue(jobApplication.getIsEmailIngest()) ? ApplicantSource.INGEST : ApplicantSource.APPLY_URL);
jobApplication.setWorkFlowStage(getWFStageByStatus(wfTemplate, jobApplication.getApplicationStatus()));
}
}
......
......@@ -2735,24 +2735,24 @@ a.forgot-pass {
float: left;
}
.job-post {
width: 32.9%;
width: 45%;
padding-left: 39px;
padding-top: 25px;
padding-bottom: 25px;
border-right: solid 1px rgba(229, 232, 235, 0.5);
}
.job-application {
width: 21.2%;
width: 20%;
padding: 24px 15px 26px 50px;
border-right: solid 1px rgba(229, 232, 235, 0.5);
}
.job-shortlisted{
width: 21.2%;
width: 10%;
padding: 24px 15px 26px 50px;
border-right: solid 1px rgba(229, 232, 235, 0.5);
}
.job-states{
width: 24%;
width: 25%;
padding: 28px 28px;
}
.job-post-name{
......@@ -3041,7 +3041,12 @@ a.forgot-pass {
.shorting-dropdown .search-input {
border : solid 1px #b9bbbd;
}
label.show-incomplete {
margin-right: 20px;
font-size: 13px;
color: #4E5258;
font-family: "Usual-Regular";
}
.select2type .dropdown-toggle {
font-size: 12px;
......@@ -4472,7 +4477,7 @@ no-applicant.inactive a:hover,no-applicant.inactive a:hover span{
color: #4a4a4a;
font-size: 20px;
padding: 14px 0 17px 21px;
width: 22%;
width: 20%;
}
.appli-list-name.wider-box {
width: 37%;
......@@ -4493,13 +4498,21 @@ no-applicant.inactive a:hover,no-applicant.inactive a:hover span{
.diversity .checkbox-list input[type="checkbox"]:disabled + label {
opacity: 1;
}
.appli-message{
width: 5%;
color: #4a4a4a;
font-size: 11px;
letter-spacing: 1px;
padding: 15px 18px 15px;
text-transform: uppercase;
}
.appli-jcs {
color: #4a4a4a;
font-size: 11px;
letter-spacing: 1px;
padding: 26px 18px 5px;
text-transform: uppercase;
width: 15%;
width: 14%;
}
.appli-jcs2 {
color: #4a4a4a;
......@@ -4595,7 +4608,7 @@ no-applicant.inactive a:hover,no-applicant.inactive a:hover span{
.appli-status {
border: medium none;
padding: 15px 23px 0;
width: 15%;
width: 10%;
}
.appli-status.include-diversity {
width: 10%;
......@@ -5478,9 +5491,9 @@ img.alert-icon {float: left;}
.d-three-box {max-width: 100%;width: 32.3%;}
.d-create-job-btn{margin: 15px 0;}
.job-post{width: 100%;border-bottom: 1px solid rgba(229, 232, 235, 0.5);}
.job-application{width: 33.2%}
.job-shortlisted{width: 33.2%}
.job-states{width: 33.2%;padding-top: 24px;padding-bottom: 24px;}
.job-application{width: 40%}
.job-shortlisted{width: 20%}
.job-states{width: 40%;padding-top: 24px;padding-bottom: 24px;}
.job-filter > ul {padding-right: 0;}
.job-filter {display: inline-block;position: relative;top: 0;width: 100%;margin-bottom: 18px;margin-top: 8px;}
.shorting-dropdown {float: right;}
......@@ -5837,7 +5850,8 @@ img.alert-icon {float: left;}
.search-bar {width: 100%;}
.social-login li{width: 31.2%;}
.ratting-box span {display: inline-block;margin: 10px 0;width: 100%;}
.job-application,.job-shortlisted {width: 50%;}
.job-application {width: 70%;}
.job-shortlisted {width: 30%;}
.job-states{width: 100%;border-top: 1px solid rgba(229, 232, 235, 0.5);}
.job-list{border-left: 3px solid #03ac66;}
.all-jobs-title {margin-top: 0;}
......
......@@ -14,9 +14,16 @@
String applicantsPage = WebUtils.getSamePageInRenderMode(request, WebUtils.VIEW_APPLICANTS);
List<JobApplication> applications = (List<JobApplication>) getData(request, "applications");
int noOfIncomplete = job.getNoOfCandidatesFor(job.getWorkFlowByStageType(StageType.INCOMPLETE), job.getWorkFlowByStageType(StageType.POST_INGEST));
int noOfUnsuitable = job.getNoOfCandidatesFor(job.getWorkFlowByStageType(StageType.UNSUITABLE));
int allCandidates = job.getNoOfCandidatesApplied();
WorkFlowStage initialWorkFlow = job.getWorkFlowByStageType(StageType.INITIAL);
WorkFlowStage successfulWorkFlow = job.getWorkFlowByStageType(StageType.SUCCESSFUL);
WorkFlowStage unsuitableWorkFlow = job.getWorkFlowByStageType(StageType.UNSUITABLE);
WorkFlowStage withdrewWorkFlow = job.getWorkFlowByStageType(StageType.WITHDREW);
int noOfIncomplete = job.getNoOfCandidatesFor(initialWorkFlow);
int noOfSuccessful = job.getNoOfCandidatesFor(successfulWorkFlow);
int noOfUnsuitable = job.getNoOfCandidatesFor(unsuitableWorkFlow);
int noOfWithdrew = job.getNoOfCandidatesFor(withdrewWorkFlow);
int allCandidates = job.pipelineJob().toJobApplications().uniqueVals().size();
%>
<oneit:dynIncluded>
......@@ -31,28 +38,28 @@
AppView="<%= appView %>"/>
<div class="int-timeline">
<ul>
<li class="<%= "incomplete " + (noOfIncomplete > 0 ? "has-applicant" : "no-applicant") %> <%= stageType == StageType.INCOMPLETE || stageType == StageType.POST_INGEST ? "active" : "inactive" %>">
<oneit:button id="unsuitableBtn" value=" " name="gotoPage" skin="link" disabled="<%= noOfIncomplete > 0 ? "false" : "true" %>"
<li class="<%= "incomplete " + (allCandidates > 0 ? "has-applicant" : "" )%> <%= (workFlowStage == null) ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= allCandidates > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", applicantsPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", job.getWorkFlowByStageType(StageType.INCOMPLETE)).toMap())
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", null).toMap())
.toMap() %>">
<span>
<oneit:toString value="<%= noOfIncomplete %>" mode="Integer" />
<oneit:toString value="<%= allCandidates %>" mode="Integer" />
</span>
<div class="app-b-title">
<%= job.getWorkFlowStageBySortOrder(1) %>
</div>
<div class="app-b-title">All Applicants</div>
</oneit:button>
</li>
<li class="<%= allCandidates > 0 ? "has-applicant" : "" %> <%= (workFlowStage == null) ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= allCandidates > 0 ? "false" : "true" %>"
<li class="<%= noOfIncomplete > 0 ? "has-applicant" : "no-applicant" %> <%= stageType == StageType.INITIAL ? "active" : "inactive" %>">
<oneit:button id="unsuitableBtn" value=" " name="gotoPage" skin="link" disabled="<%= noOfIncomplete > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", applicantsPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", null).toMap())
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", initialWorkFlow).toMap())
.toMap() %>">
<span>
<oneit:toString value="<%= allCandidates %>" mode="Integer" />
<oneit:toString value="<%= noOfIncomplete %>" mode="Integer" />
</span>
<div class="app-b-title">All Applicants</div>
<div class="app-b-title">
<%= initialWorkFlow %>
</div>
</oneit:button>
</li>
<%
......@@ -60,7 +67,7 @@
{
int noOfCandidates = job.getNoOfCandidatesFor(workflow);
%>
<li class="<%= noOfCandidates > 0 ? "has-applicant" : "" %> <%= workflow.equals(workFlowStage) ? "active" : "inactive" %>">
<li class="<%= noOfCandidates > 0 ? "has-applicant" : "" %> <%= workflow.equals(workFlowStage) && stageType == StageType.GENERIC ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= noOfCandidates > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", applicantsPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", workflow).toMap())
......@@ -78,16 +85,42 @@
%>
</ul>
</div>
<div class="unsutable <%= noOfWithdrew > 0 ? "has-applicant" : "no-applicant" %> <%= stageType == StageType.WITHDREW ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= noOfWithdrew > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", applicantsPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", withdrewWorkFlow).toMap())
.toMap() %>">
<span>
<oneit:toString value="<%= noOfWithdrew %>" mode="Integer" />
</span>
<div class="app-b-title">
<%= withdrewWorkFlow %>
</div>
</oneit:button>
</div>
<div class="unsutable <%= noOfUnsuitable > 0 ? "has-applicant" : "no-applicant" %> <%= stageType == StageType.UNSUITABLE ? "active" : "inactive" %>">
<oneit:button id="unsuitableBtn" value=" " name="gotoPage" skin="link" disabled="<%= noOfUnsuitable > 0 ? "false" : "true" %>"
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= noOfUnsuitable > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", applicantsPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", job.getWorkFlowByStageType(StageType.UNSUITABLE)).toMap())
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", unsuitableWorkFlow).toMap())
.toMap() %>">
<span>
<oneit:toString value="<%= noOfUnsuitable %>" mode="Integer" />
</span>
<div class="app-b-title">
<%= job.getWorkFlowStageBySortOrder(9)%>
<%= unsuitableWorkFlow%>
</div>
</oneit:button>
</div>
<div class="unsutable <%= noOfSuccessful > 0 ? "has-applicant" : "no-applicant" %> <%= stageType == StageType.SUCCESSFUL ? "active" : "inactive" %>">
<oneit:button value=" " name="gotoPage" skin="link" disabled="<%= noOfSuccessful > 0 ? "false" : "true" %>"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", applicantsPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("WorkFlowStage", successfulWorkFlow).toMap())
.toMap() %>">
<span>
<oneit:toString value="<%= noOfSuccessful %>" mode="Integer" />
</span>
<div class="app-b-title">
<%= successfulWorkFlow %>
</div>
</oneit:button>
</div>
......
......@@ -10,7 +10,7 @@
AppSortOption appSortOpt = (AppSortOption) getData(request, "SortOption");
WorkFlowStage workFlowStage = (WorkFlowStage) getData(request, "WorkFlowStage");
StageType stageType = (StageType) getData(request, "StageType");
boolean isDraft = stageType == StageType.INCOMPLETE;
boolean isDraft = stageType == StageType.INITIAL;
ApplicationFilter appFilter = (ApplicationFilter) getData(request, "ApplicationFilter");
Boolean showOrderBy = getData(request, "ShowOrderBy")!= null ? (Boolean) getData(request, "ShowOrderBy") : Boolean.FALSE;
AppView appView = (AppView) getData(request,"AppView");
......@@ -50,6 +50,10 @@
el: '#app',
data: <%= Utils.getApplicantSortingData(searchApplicant)%>
});
$(".switch input[type='checkbox']").change(function() {
$("button[name$='search']").click();
});
});
function enableBulkEdit() {
......@@ -83,14 +87,10 @@
.toMap() %>" />
</div>
<%
if(!(CollectionUtils.equals(stageType, StageType.INCOMPLETE) && hiringTeam.isTrue(hiringTeam.getOnTrial())))
if(hiringTeam.isFalse(hiringTeam.getOnTrial()))
{
%>
<div class="appli-filter">
<%
if(!CollectionUtils.equals(stageType, StageType.INCOMPLETE))
{
%>
<ul class="">
<li class="lable-appli-shorting">View</li>
<li class="<%= (appView == AppView.LIST ? "active" : "" ) + " short-list"%>">
......@@ -112,7 +112,6 @@
.toMap() %>"/>
</li>
</ul>
<% } %>
</div>
<div class="shorting-dropdown application_sorting_bar">
<div class="appli-order-label">Search Applicants</div>
......@@ -160,9 +159,18 @@
}
%>
</div>
<div class="checkbox-list select-all">
<div class="checkbox-list select-all pull-left">
<input type='checkbox' id='select_all' value='select_all' class='norecalc'>
<label for="select_all" class="select-all-jobs">&nbsp;&nbsp;Select all applicants</label>
</div>
<div class="pull-right">
<label class="show-incomplete pull-left">Show Incomplete</label>
<label class="switch">
<oneit:recalcClass htmlTag="span" classScript="searchApplicant.getShowIncomplete() ? 'checkbox checked': 'checkbox unchecked'" searchApplicant="<%= searchApplicant %>">
<oneit:ormInput obj="<%= searchApplicant %>" attributeName="ShowIncomplete" type="checkbox"/>
</oneit:recalcClass>
<div class="slider round"></div>
</label>
</div>
</div>
</oneit:dynIncluded>
......@@ -140,8 +140,6 @@
for(Job job: jobs)
{
int shortlisted = job.getNoOfCandidatesFor(job.getWorkFlowByStageType(StageType.SUCCESSFUL));
int maxShortlist = job.getMaxShortlistApplicants();
String editJobPage = nextPage;
// go to edit job if job is in draft status
......@@ -267,29 +265,10 @@
<div class="ja-icon">
<div class="conic-circle">
<p style="display:none;">
<oneit:toString value="<%= shortlisted * (100 / maxShortlist) %>" mode="PercentageWholeNumber" />
<oneit:toString value="<%= 10 %>" mode="PercentageWholeNumber" />
</p>
<%
if(shortlisted == maxShortlist)
{
%>
<img src="images/stroke-3.svg" class="right-mark-img" />
<%
}
%>
</div>
</div>
<div class="ja-count">
<oneit:button value=" " name="gotoPage" skin="link"
requestAttribs="<%= CollectionUtils.mapEntry("nextPage", nextPage)
.mapEntry("procParams", CollectionUtils.mapEntry("Job", job).mapEntry("ApplicationStatus", StageType.INTERVIEW).toMap())
.toMap() %>" disabled="<%= job.getJobStatus() == JobStatus.DRAFT ? "true" : "false" %>">
<oneit:toString value="<%= shortlisted %>" mode="Integer" nullValue="0"/>
</oneit:button>
/
<oneit:toString value="<%= maxShortlist %>" mode="Integer" nullValue="0"/>
<span class="grey-span">successful</span>
</div>
</div>
</div>
<div class="job-states jl-c wider-select">
......
......@@ -82,6 +82,9 @@
<oneit:toString value="<%= jobApplication.getOverallRank() %>" mode="Integer" />
</div>
</div>
<div class="appli-message appli-l eq-second-height">
<div class="ja-icon"><img src="images/job-list-user.svg"></div>
</div>
<%
String widthClass = (job.showAssessmentCriteriaSection() && job.showCultureCriteriaSection()) ? "appli-jcs" :
(job.showAssessmentCriteriaSection() || job.showCultureCriteriaSection()) ? "appli-jcs2" : "appli-jcs3";
......@@ -129,7 +132,7 @@
</div>
</div>
<span class="<%= missingReq ? "missing-requirements-icon" : "requirements-correct-icon" %>"></span>
<span class="<%= missingReq ? "missing-requirements-icon" : criteriaVal == 100 ? "requirements-correct-icon" : ""%>"></span>
</span>
<span class="<%= missingReq ? "red-requirements" : "" %>">
requirements
......
......@@ -83,8 +83,6 @@
}
StageType stageType = workFlowStage != null ? workFlowStage.getStageType() : null;
boolean isApplicantPage = workFlowStage == null;
boolean isDraftPage = stageType == StageType.INCOMPLETE;
// handle application filter (showing dropdown)
if(parameterMap.containsKey("ApplicationFilter") && !request.getParameter("ApplicationFilter").isEmpty())
......@@ -101,15 +99,14 @@
}
List<JobApplication> applicantList = Arrays.asList(applications);
// WorkFlowStage workflow = job.getWorkFlowByStageType(stageType);
// filter applicants by status
oneit.utils.filter.Filter<JobApplication> filter = JobApplication.SearchByAll().andWorkFlowStage(new EqualsFilter<>(workFlowStage));
oneit.utils.filter.Filter<JobApplication> applicantFilter = JobApplication.SearchByAll().andWorkFlowStage(new NotInFilter<>(job.getIncompleteApplicantStages()));
oneit.utils.filter.Filter<JobApplication> draftFilter = JobApplication.SearchByAll().andWorkFlowStage(new InFilter<>(job.getIncompleteApplicantStages()));
// if Applicant Status, then show all application completed applicants
applicantList = new ArrayList<>(CollectionFilter.filter(applicantList, isDraftPage ? draftFilter : (isApplicantPage ? applicantFilter : filter)));
if(workFlowStage != null)
{
applicantList = new ArrayList<>(CollectionFilter.filter(applicantList, filter));
}
if(appFilter != ApplicationFilter.ALL_APPLICATIONS)
{
......@@ -121,7 +118,7 @@
session.setAttribute("AppView", (AppView) process.getAttribute("AppView"));
}
AppView appView = (session.getAttribute("AppView") != null && !CollectionUtils.equals(stageType,StageType.INCOMPLETE))? (AppView) session.getAttribute("AppView") : AppView.LIST;
AppView appView = (session.getAttribute("AppView") != null && !CollectionUtils.equals(stageType,StageType.INITIAL))? (AppView) session.getAttribute("AppView") : AppView.LIST;
List<JobApplication> sortedApplications = Utils.getApplicationsSorted(applicantList, appSortOpt);
process.setAttribute("AppSortOption", appSortOpt);
......@@ -154,28 +151,14 @@
<%
if(appView == AppView.LIST)
{
if(stageType == StageType.INCOMPLETE)
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/incomplete_applicants_list.jsp"
applications="<%= sortedApplications %>"
currentPage="<%= currentPage %>"
StageType="<%= stageType %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
<%
}
else
{
%>
<oneit:dynInclude page="/extensions/adminportal/inc/view_applicants_list.jsp"
applications="<%= sortedApplications %>"
currentPage="<%= currentPage %>"
StageType="<%= stageType %>"
data="<%= CollectionUtils.EMPTY_MAP%>"/>
<%
}
}
else if(appView == AppView.GRID)
{
%>
......
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