Implemented new scoring formula

This commit is contained in:
sairaj mote 2022-11-16 02:42:17 +05:30
parent 46c149ceb7
commit c64e9b9b85
4 changed files with 73 additions and 22 deletions

View File

@ -1426,7 +1426,7 @@ ul {
font-size: 0.9rem;
font-weight: 500;
color: var(--green);
background-color: rgba(var(--text-color), 0.06);
border: solid 0.1rem var(--green);
}
.task__branch_container:not(:empty) {
@ -1844,9 +1844,10 @@ ul {
input[type=date] {
display: flex;
width: 100%;
padding: 0.5rem;
padding: 0.8rem 0.6rem;
border: none;
border-radius: 0.5rem;
font-weight: 500;
font-family: inherit;
font-size: inherit;
color: inherit;

2
css/main.min.css vendored

File diff suppressed because one or more lines are too long

View File

@ -1394,7 +1394,7 @@ ul {
font-size: 0.9rem;
font-weight: 500;
color: var(--green);
background-color: rgba(var(--text-color), 0.06);
border: solid 0.1rem var(--green);
}
.task__branch_container {
&:not(:empty) {
@ -1797,9 +1797,10 @@ ul {
input[type="date"] {
display: flex;
width: 100%;
padding: 0.5rem;
padding: 0.8rem 0.6rem;
border: none;
border-radius: 0.5rem;
font-weight: 500;
font-family: inherit;
font-size: inherit;
color: inherit;

View File

@ -1026,6 +1026,29 @@
return timestamp;
}
}
function getObjLength(obj) {
let count = 0
for (var i in obj) count++
return count
}
// obj forEach
function objForEach(obj, callback) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
callback(key, obj[key])
}
}
}
// obj map
function objMap(obj, callback) {
const newObj = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj.push(callback(key, obj[key]))
}
}
return newObj
}
const appState = {
params: {},
@ -1717,7 +1740,7 @@
${maxSlots ? html`
<div class="display-task__detail">
<span class="display-task__detail__title">Slots: </span>
<span class="display-task__detail__value">${maxSlots - Object.keys(assignedInterns).length}</span>
<span class="display-task__detail__value">${maxSlots - getObjLength(assignedInterns)}</span>
</div>
`: ''}
${reward ? html`
@ -1745,7 +1768,7 @@
const assignedInterns = RIBC.getAssignedInterns(projectCode, branch, task);
if (filterCategory && allTasks[taskId].category !== filterCategory) continue;
if (searchQuery && searchQuery !== '' && !allTasks[taskId].title.toLowerCase().includes(searchQuery.toLowerCase())) continue;
if (Object.keys(assignedInterns).length >= allTasks[taskId].maxSlots) continue;
if (getObjLength(assignedInterns) >= allTasks[taskId].maxSlots) continue;
if (userType && userType === 'intern' && floDapps.user.id && assignedInterns.hasOwnProperty(floDapps.user.id)) continue;
filtered.push(render.displayTaskCard(projectCode, branch, task))
}
@ -1807,7 +1830,7 @@
}
})
const assignedInterns = RIBC.getAssignedInterns(appState.params.id, appState.params.branch, task) || []
const assignedInternsCards = Object.keys(assignedInterns).map(internFloId => render.assignedInternCard(internFloId));
const assignedInternsCards = objMap(assignedInterns, internFloId => render.assignedInternCard(internFloId));
const status = RIBC.getTaskStatus(appState.params.id, appState.params.branch, task)
let applyButton
if (!assignedInterns.hasOwnProperty(myFloID) && userType !== 'admin') {
@ -1850,7 +1873,7 @@
${maxSlots ? html`
<div class="display-task__detail">
<span class="display-task__detail__title">Slots: </span>
<span class="display-task__detail__value">${maxSlots - Object.keys(assignedInterns).length}</span>
<span class="display-task__detail__value">${maxSlots - getObjLength(assignedInterns)}</span>
</div>
`: ''}
${reward ? html`
@ -1948,7 +1971,7 @@
const assignedInterns = RIBC.getAssignedInterns(appState.params.id, appState.params.branch, task)
const status = RIBC.getTaskStatus(appState.params.id, appState.params.branch, task)
const taskDetails = { title, description, category, maxSlots, duration, durationType, reward } = RIBC.getTaskDetails(appState.params.id, appState.params.branch, task)
let assignedInternsCards = Object.keys(assignedInterns).map(internFloId => render.assignedInternCard(internFloId, status === 'incomplete'))
let assignedInternsCards = objMap(assignedInterns, internFloId => render.assignedInternCard(internFloId, status === 'incomplete'))
const branches = getAllBranches(appState.params.id)
const branchesButtons = filterMap(branches, (branch) => {
const { branchName, parentBranch, startPoint, endPoint } = branch
@ -2381,7 +2404,7 @@
${maxSlots ? html`
<div class="display-task__detail">
<span class="display-task__detail__title">Slots: </span>
<span class="display-task__detail__value">${maxSlots - Object.keys(assignedInterns).length}</span>
<span class="display-task__detail__value">${maxSlots - getObjLength(assignedInterns)}</span>
</div>
`: ''}
${reward ? html`
@ -2526,6 +2549,13 @@
}
})
function getDaysTaken(start, end = Date.now()) {
const timeTaken = new Date(end) - new Date(start);
const days = Math.floor(timeTaken / (1000 * 60 * 60 * 24));
return days;
}
// opens a popup containing various intern information
function showInternInfo(e) {
const internFloId = e.target.closest('.intern-card').dataset.internFloId;
@ -2543,7 +2573,6 @@
if (splitName.length > 1) {
initials += splitName[splitName.length - 1][0]
}
console.log(joined)
renderElem(getRef('intern_info__wrapper'), html`
<div class="flex flex-direction-column align-items-center gap-1-5">
<div id="intern_info__initials" class="intern-card__initials" style=${`--color: var(${getInternColor(internFloId)})`}>${initials}</div>
@ -2683,21 +2712,28 @@
function initTaskScoring(e) {
currentTask = e.target.closest('.admin-task');
const assignedInterns = RIBC.getAssignedInterns(appState.params.id, appState.params.branch, currentTask.dataset.taskId);
renderElem(getRef('rating_wrapper'), html`
<h4>${currentTask.querySelector('.task-title').textContent}</h4>
<sm-form>
${Object.keys(assignedInterns).map((intern, index) => html`
<div class="flex flex-direction-column gap-0-5 rating-part" data-intern-id=${intern}>
<h4>${RIBC.getInternList()[intern]}</h4>
const taskScoreElems = []
let index = 0;
for (const internId in assignedInterns) {
taskScoreElems.push(html`
<div class="flex flex-direction-column gap-0-5 rating-part" data-intern-id=${internId}>
<h4>${RIBC.getInternList()[internId]}</h4>
<div class="flex gap-0-5">
<sm-input type="number" min="0" max="50" class="flex-1" placeholder="Rate out of 50" error-text="Points must be between 0-50" ?autofocus=${index === 0} required></sm-input>
<sm-input type="number" min="0" max="40" class="flex-1" placeholder="Rate out of 40" error-text="Points must be between 0-40" ?autofocus=${index === 0} required></sm-input>
<input class="flex-1" type="date" value=${formatDate(new Date())} placeholder="Completion date" aria-label="Set date of completion" required>
</div>
</div>
`)}
`)
index++;
}
renderElem(getRef('rating_wrapper'), html`
<h4>${currentTask.querySelector('.task-title').textContent}</h4>
<sm-form>
${taskScoreElems}
<button id="rate_participants_btn" class="button button--primary" type="submit" disabled onclick="rateParticipants()"> Rate </button>
</sm-form>
`)
openPopup('rate_participants_popup')
}
function markTaskAsIncomplete(e) {
@ -2730,8 +2766,21 @@
document.querySelectorAll('.rating-part').forEach((ratingPart) => {
const taskId = `${appState.params.id}_${appState.params.branch}_${currentTask.dataset.taskId}`;
const internId = ratingPart.dataset.internId;
const points = 50 + parseInt(ratingPart.querySelector('sm-input').value.trim());
const completionDate = ratingPart.querySelector('input').value;
const { duration, durationType } = RIBC.getAllTasks()[taskId];
const deadlineDays = durationType === 'days' ? duration : duration * 30;
const daysTaken = getDaysTaken(RIBC.getAssignedInterns(taskId)[internId].assignedOn)
let quicknessScore = 0;
if (daysTaken < deadlineDays * 0.6) {
quicknessScore = 30
} else if (daysTaken < deadlineDays * 0.8) {
quicknessScore = 25
} else if (daysTaken < deadlineDays) {
quicknessScore = 20
}
const completionPoints = 30;
const subjectivePoints = parseFloat(ratingPart.querySelector('sm-input').value.trim());
const points = completionPoints + quicknessScore + subjectivePoints;
const completionDate = new Date(ratingPart.querySelector('input').value).getTime();
RIBC.admin.addTaskScore(internId, taskId, points, { completionDate })
})
markTaskAsCompleted()