${icon}
@@ -2250,6 +2231,29 @@
${RIBC.getTaskDetails(projectCode, branch, task).title}
`;
+ },
+ settings() {
+ return html`
+
+
+
FLO address
+
+
+
+
+
+
+
Secure private key
+
+ You can set a password to secure your private key and use the password instead of private key. This is applied to this browser only.
+
+
+
+
+ `;
}
}
const selectedColors = [
@@ -2360,7 +2364,7 @@
}
function hideTaskDetails() {
if (getRef('task_details').classList.contains('hidden')) return;
- history.replaceState(null, null, `#/${appState.currentPage}`);
+ history.replaceState(null, null, location.hash.split('?')[0]);
const animOptions = {
duration: floGlobals.prefersReducedMotion ? 0 : 300,
easing: 'ease',
@@ -2391,12 +2395,18 @@
function handleDashboardViewChange(e) {
document.querySelectorAll('.dashboard-view__item').forEach(item => {
- if (item.id === 'best_interns_container')
+ if (item.id === 'intern_leaderboard_container')
item.classList.add('hide-on-mobile')
else
item.classList.add('hidden')
})
document.querySelector(`#${e.target.value}`).classList.remove('hide-on-mobile', 'hidden')
+ const dashboardPages = {
+ 'intern_view': 'my_tasks',
+ 'dashboard_tasks_wrapper': 'all_tasks',
+ 'projects_wrapper': 'projects'
+ }
+ location.hash = `#/${appState.currentPage}/${dashboardPages[e.target.value]}`
}
@@ -2455,7 +2465,8 @@
})
// opens a popup containing various intern information
- function showInternInfo(internFloId) {
+ function showInternInfo(e) {
+ const internFloId = e.target.closest('.intern-card').dataset.internFloId;
const internName = RIBC.getInternList()[internFloId]
getRef('intern_info__initials').textContent = internName.split(' ').map(v => v.charAt(0)).join('');
getRef('intern_info__initials').style.setProperty('--color', `var(${getInternColor(internFloId)})`)
@@ -2543,6 +2554,9 @@
const newViewIndex = parseInt(e.target.value);
showChildElement(getRef('admin_views'), newViewIndex, { entry: newViewIndex > currentViewIndex ? slideInLeft : slideInRight, exit: newViewIndex > currentViewIndex ? slideOutLeft : slideOutRight });
currentViewIndex = parseInt(e.target.value);
+ const viewIds = ['projects', 'interns', 'task_display', 'requests']
+ location.hash = `#/${appState.currentPage}/${viewIds[e.target.value]}`
+ getRef('admin_page_nav_button').href = `#/${appState.currentPage}/${viewIds[e.target.value]}`
})
function toggleEditing(target) {
@@ -2947,14 +2961,7 @@
pinnedProjects.push(projectCode)
}
localStorage.setItem(`${myFloID}_pinned_projects`, pinnedProjects.join())
- render.dashProjects(getRef('pinned_projects'), pinnedProjects)
- const unpinnedProjects = RIBC.getProjectList().filter(project => !pinnedProjects.includes(project)).reverse()
- if (unpinnedProjects.length > 0) {
- getRef('project_list_container').classList.remove('hidden')
- } else {
- getRef('project_list_container').classList.add('hidden')
- }
- render.dashProjects(getRef('project_list'), unpinnedProjects)
+ renderElem(getRef('projects_wrapper'), render.dashProjects())
}
let sessionTaskRequests = new Set();
@@ -3012,13 +3019,6 @@
function toggleUpdatesFilter() {
getRef('update_filters_wrapper').classList.toggle('hide-on-mobile')
}
- // Event listeners
- delegate(getRef('all_interns_page'), 'click', '.intern-card', e => {
- showInternInfo(e.delegateTarget.dataset.internFloId)
- })
- delegate(getRef('admin_page__intern_list'), 'click', '.intern-card', e => {
- showInternInfo(e.delegateTarget.dataset.internFloId)
- })
document.addEventListener('popupopened', e => {
getRef('main_page').setAttribute('inert', '')
@@ -3048,7 +3048,8 @@
let sortedProjectList = getSortedProjectList()
document.querySelectorAll('.open-first-project').forEach(link => {
- link.href = `${link.href}/project?id=${sortedProjectList[0]}&branch=mainLine`
+ const adminPage = link.id === 'admin_page_nav_button'
+ link.href = adminPage ? `${link.href}/projects?id=${sortedProjectList[0]}&branch=mainLine` : `${link.href}/project?id=${sortedProjectList[0]}&branch=mainLine`
})
pinnedProjects = localStorage.getItem(`${myFloID}_pinned_projects`) ? localStorage.getItem(`${myFloID}_pinned_projects`).split(',') : []
@@ -3125,7 +3126,6 @@
delegate(getRef('explorer_task_list'), 'click', '.apply-button', e => {
requestForTask(e.delegateTarget)
})
- getRef('user_flo_id').value = myFloID;
}
let currentTaskId;
@@ -3245,13 +3245,11 @@
getRef('private_key_field').removeAttribute('data-private-key');
getRef('private_key_field').setAttribute('placeholder', 'Password');
getRef('private_key_field').customValidation = null
- getRef('secure_pwd_button').closest('.card').classList.add('hidden');
} else {
floGlobals.isPrivKeySecured = false;
getRef('private_key_field').dataset.privateKey = ''
getRef('private_key_field').setAttribute('placeholder', 'FLO private key');
getRef('private_key_field').customValidation = floCrypto.getPubKeyHex;
- getRef('secure_pwd_button').closest('.card').classList.remove('hidden');
}
if (!generalPages.find(page => window.location.hash.includes(page))) {
location.hash = floGlobals.isPrivKeySecured ? '#/sign_in' : `#/landing`;
diff --git a/scripts/ribc.js b/scripts/ribc.js
index cb57494..043830c 100644
--- a/scripts/ribc.js
+++ b/scripts/ribc.js
@@ -105,7 +105,7 @@
Ribc.getInternRating = (floID) => _.internRating[floID];
Ribc.getAssignedInterns = (projectCode, branch, taskNumber) => _.internsAssigned[projectCode + "_" + branch + "_" + taskNumber]
Ribc.getAllTasks = () => _.projectTaskDetails
- Ribc.getDisplayedTasks = () => floGlobals.appObjects.RIBC.displayedTasks.filter(v => v)
+ Ribc.getDisplayedTasks = () => floGlobals.appObjects.RIBC.displayedTasks.filter(v => v) || [];
Admin.updateObjects = () => new Promise((resolve, reject) => {
floCloudAPI.updateObjectData("RIBC")
@@ -168,6 +168,18 @@
return true;
}
+ Admin.removeIntern = function (floID) {
+ if (!(floID in _.internList))
+ return false
+ delete _.internList[floID]
+ delete _.internRating[floID]
+ for (const taskId in _.projectTaskDetails) {
+ if (_.internsAssigned[taskId].includes(floID))
+ _.internsAssigned[taskId] = _.internsAssigned[taskId].filter(id => id != floID)
+ }
+ return true;
+ }
+
Admin.updateInternRating = function (floID, change = 0) {
if (!(floID in _.internList))
return "Intern not found!"
diff --git a/scripts/ribc.min.js b/scripts/ribc.min.js
index f22f07b..d21f4a5 100644
--- a/scripts/ribc.min.js
+++ b/scripts/ribc.min.js
@@ -1 +1 @@
-(function(){function e(e){if(r.projectBranches.hasOwnProperty(e))var t=r.projectBranches[e].split(",");else t=!1;return t}function t(e){for(var t={},n=r.projectBranches[e].split(","),a=0;a
{Promise.all([n.refreshObjectData(),n.refreshGeneralData(e)]).then(e=>t(e)).catch(e=>a(e))})},n.refreshObjectData=(()=>new Promise((e,t)=>{floCloudAPI.requestObjectData("RIBC").then(t=>{floGlobals.appObjects.RIBC||(floGlobals.appObjects.RIBC={});var n=["projectMap","projectBranches","projectTaskDetails","projectDetails","internList","internRating","internsAssigned","projectTaskStatus","displayedTasks"];n.forEach(e=>{floGlobals.appObjects.RIBC[e]||(floGlobals.appObjects.RIBC[e]={}),r[e]=floGlobals.appObjects.RIBC[e]}),e("Object Data Refreshed Successfully")}).catch(e=>t(e))})),n.refreshGeneralData=(e=>new Promise((t,n)=>{var a=["InternUpdates"],r=[],s=[];(e?a:s).push("TaskRequests","InternRequests");let o=[];for(let e of a)o.push(floCloudAPI.requestGeneralData(e));for(let e of r)o.push(floCloudAPI.requestGeneralData(e,{senderID:floGlobals.subAdmins}));for(let e of s)o.push(floCloudAPI.requestGeneralData(e,{senderID:floDapps.user.id}));Promise.all(o).then(e=>t("General Data Refreshed Successfully")).catch(e=>n(e))}));const r={};n.applyForIntern=(e=>new Promise((t,n)=>{floCloudAPI.sendGeneralData(e,"InternRequests").then(e=>t(e)).catch(e=>n(e))})),n.postInternUpdate=(e=>new Promise((t,n)=>{floCloudAPI.sendGeneralData(e,"InternUpdates").then(e=>t(e)).catch(e=>n(e))})),n.getInternUpdates=function(e=null){let t=Object.values(floGlobals.generalDataset("InternUpdates")).map(e=>({floID:e.senderID,update:e.message,time:e.vectorClock.split("_")[0],note:e.note}));return t=t.filter(e=>e.floID in r.internList),t.reverse(),e&&enew Promise((n,a)=>{if(!(e in floGlobals.generalDataset("InternUpdates")))return a("Intern update not found");floCloudAPI.noteApplicationData(e,t).then(e=>n(e)).catch(e=>a(e))})),n.applyForTask=(e=>new Promise((t,n)=>{floCloudAPI.sendGeneralData(e,"TaskRequests").then(e=>t(e)).catch(e=>n(e))})),n.getProjectList=(()=>Object.keys(r.projectMap)),n.getProjectDetails=(e=>r.projectDetails[e]),n.getProjectMap=(e=>r.projectMap[e]),n.getProjectBranches=(t=>e(t)),n.getTaskDetails=((e,t,n)=>r.projectTaskDetails[e+"_"+t+"_"+n]),n.getTaskStatus=((e,t,n)=>r.projectTaskStatus[e+"_"+t+"_"+n]),n.getInternList=(()=>r.internList),n.getInternRating=(e=>r.internRating[e]),n.getAssignedInterns=((e,t,n)=>r.internsAssigned[e+"_"+t+"_"+n]),n.getAllTasks=(()=>r.projectTaskDetails),n.getDisplayedTasks=(()=>floGlobals.appObjects.RIBC.displayedTasks.filter(e=>e)),a.updateObjects=(()=>new Promise((e,t)=>{floCloudAPI.updateObjectData("RIBC").then(t=>e(t)).catch(e=>t(e))})),a.resetObjects=(()=>new Promise((e,t)=>{floCloudAPI.resetObjectData("RIBC").then(t=>e(t)).catch(e=>t(e))})),a.addProjectDetails=function(e,t){if(!(e in r.projectMap))return"Project not Found!";if(e in r.projectDetails&&"object"==typeof e&&"object"==typeof t)for(let n in t)r.projectDetails[e][n]=t[n];else r.projectDetails[e]=t;return"added project details for "+e},n.getInternRequests=function(e=!0){var t=Object.values(floGlobals.generalDataset("InternRequests")).map(e=>({floID:e.senderID,vectorClock:e.vectorClock,details:e.message,status:e.note}));return t=t.filter(e=>!(e.floID in r.internList)),e&&(t=t.filter(e=>!e.status)),t},a.processInternRequest=function(e,t=!0){let n=floGlobals.generalDataset("InternRequests")[e];return n?(a=t&&s(n.senderID,n.message[0])?"Accepted":"Rejected",floCloudAPI.noteApplicationData(e,a).then(e=>null).catch(e=>console.error(e)),a):"Request not found";var a};const s=a.addIntern=function(e,t){return!(e in r.internList)&&(r.internList[e]=t,r.internRating[e]=1,!0)};a.updateInternRating=function(e,t=0){return e in r.internList?(r.internRating[e]+=t,"Intern rating Updated"):"Intern not found!"},n.getTaskRequests=function(e=!0){var t=Object.values(floGlobals.generalDataset("TaskRequests")).map(e=>({floID:e.senderID,vectorClock:e.vectorClock,details:e.message,status:e.note}));try{floDapps.user.id&&!floGlobals.subAdmins.includes(floDapps.user.id)&&(t=t.filter(e=>e.floID===floDapps.user.id))}catch(e){return[]}return e&&(t=t.filter(e=>!e.status)),t},a.processTaskRequest=function(e,t=!0){let n=floGlobals.generalDataset("TaskRequests")[e];if(!n)return"Request not found";const{message:{taskId:a,name:r},senderID:i}=n,[c,l,p]=a.split("_");var u;return s(i,r),u=t&&o(i,c,l,p)?"Accepted":"Rejected",floCloudAPI.noteApplicationData(e,u).then(e=>null).catch(e=>console.error(e)),u};const o=a.assignInternToTask=function(e,t,n,a){var s=t+"_"+n+"_"+a;return Array.isArray(r.internsAssigned[s])||(r.internsAssigned[s]=[]),!r.internsAssigned[s].includes(e)&&(r.internsAssigned[s].push(e),!0)};a.unassignInternFromTask=function(e,t,n,a){const s=t+"_"+n+"_"+a;r.internsAssigned[s]=r.internsAssigned[s].filter(t=>t!=e)},a.putTaskStatus=function(e,t,n,a){r.projectTaskStatus[t+"_"+n+"_"+a]=e},a.setDisplayedTasks=function(e=[]){floGlobals.appObjects.RIBC.displayedTasks=e},a.createProject=function(e){return e in r.projectMap?"Project Name already exists":(i(e),"Project Create: "+e)},a.copyBranchToNewProject=function(e,t,n,a,s,o){if("mainLine"==t)return"You cannot change mainLine";if(0==r.projectMap.hasOwnProperty(n))return"The project does not exist";if(0==r.projectMap[n].hasOwnProperty(c))return"The branch does not exist";if(s>o)return"Startpoint cannot be later than endpoint";var c=i(n,a,s,o);r.projectMap[n][c]=r.projectMap[e][t].slice(),r.projectMap[n][c][0]="undefined"==a?"mainLine":"newBranchConnection","undefined"!=s&&(r.projectMap[n][c][2]=s),"undefined"!=o&&(r.projectMap[n][c][3]=o);var l=r.projectTaskDetails;for(var p in l)if(l.hasOwnProperty(p)&&p.contains(e+"_"+t)){var u=p.replace(e+"_"+t+"_","");r.projectTaskDetails[n+"_"+c+"_"+u]=l[p]}return r.projectMap[n][c]},a.deleteTaskInMap=function(e,t,n){for(var a,s=r.projectMap[e][t],o=4;o4&&ae!==t||"mainLine"!==e);for(o=0;o=c&&(c=i[p]+1),i[p]==a&&(l=p);return l>3?(i.splice(l+1,0,c),i[1]++,c):"Not possible to insert here.Try another position"},a.changeBranchLine=function(e,t,n,a,s){return"mainLine"==t?"You cannot change mainLine":0==r.projectMap.hasOwnProperty(e)?"The project does not exist":0==r.projectMap[e].hasOwnProperty(t)?"The branch does not exist":0==r.projectMap[e].hasOwnProperty(n)?"The newConnection does not exist":a>s?"Startpoint cannot be later than endpoint":(r.projectMap[e][t][0]=n,"undefined"!=a&&(r.projectMap[e][t][2]=a),"undefined"!=s&&(r.projectMap[e][t][3]=s),r.projectMap[e][t])},a.changeBranchPoint=function(e,t,n,a){var s;return"mainLine"!=t&&(1==a&&(n<=r.projectMap[e][t][3]?(r.projectMap[e][t][2]=n,s=n):s="Start point cannot be later than end point"),2==a&&(n>=r.projectMap[e][t][2]?(r.projectMap[e][t][3]=n,s=n):s="End point cannot be earlier than start point")),"mainLine"==t&&(s="mainLine cannot be rerouted"),s};const i=a.addBranch=function(t,n,a,s){var o,i=e(t);if(0==i)r.projectMap[t]={},r.projectMap[t].mainLine=["mainLine",0,"Start","Stop"],o="mainLine",r.projectBranches[t]="mainLine";else{var c=i[i.length-1];if(c.includes("branch")){var l=c.split("branch"),p=parseFloat(l[1])+1;o="branch"+p,r.projectMap[t]["branch"+p]=[n,0,a,s],r.projectBranches[t]=r.projectBranches[t]+",branch"+p}c.includes("mainLine")&&(o="branch1",r.projectMap[t].branch1=["mainLine",0,a,s],r.projectBranches[t]="mainLine,branch1")}return o};a.editTaskDetails=function(e,t,n,a){r.projectTaskDetails[t+"_"+n+"_"+a]={...r.projectTaskDetails[t+"_"+n+"_"+a],...e}},a.addTaskInMap=function(e,n){var a=[];a=t(e);var s=a[n],o=s+1;return r.projectMap[e][n].push(o),r.projectMap[e][n][1]++,o}})();
\ No newline at end of file
+(function(){function e(e){if(a.projectBranches.hasOwnProperty(e))var t=a.projectBranches[e].split(",");else t=!1;return t}function t(e){for(var t={},n=a.projectBranches[e].split(","),r=0;r{Promise.all([n.refreshObjectData(),n.refreshGeneralData(e)]).then(e=>t(e)).catch(e=>r(e))})},n.refreshObjectData=(()=>new Promise((e,t)=>{floCloudAPI.requestObjectData("RIBC").then(t=>{floGlobals.appObjects.RIBC||(floGlobals.appObjects.RIBC={});var n=["projectMap","projectBranches","projectTaskDetails","projectDetails","internList","internRating","internsAssigned","projectTaskStatus","displayedTasks"];n.forEach(e=>{floGlobals.appObjects.RIBC[e]||(floGlobals.appObjects.RIBC[e]={}),a[e]=floGlobals.appObjects.RIBC[e]}),e("Object Data Refreshed Successfully")}).catch(e=>t(e))})),n.refreshGeneralData=(e=>new Promise((t,n)=>{var r=["InternUpdates"],a=[],s=[];(e?r:s).push("TaskRequests","InternRequests");let o=[];for(let e of r)o.push(floCloudAPI.requestGeneralData(e));for(let e of a)o.push(floCloudAPI.requestGeneralData(e,{senderID:floGlobals.subAdmins}));for(let e of s)o.push(floCloudAPI.requestGeneralData(e,{senderID:floDapps.user.id}));Promise.all(o).then(e=>t("General Data Refreshed Successfully")).catch(e=>n(e))}));const a={};n.applyForIntern=(e=>new Promise((t,n)=>{floCloudAPI.sendGeneralData(e,"InternRequests").then(e=>t(e)).catch(e=>n(e))})),n.postInternUpdate=(e=>new Promise((t,n)=>{floCloudAPI.sendGeneralData(e,"InternUpdates").then(e=>t(e)).catch(e=>n(e))})),n.getInternUpdates=function(e=null){let t=Object.values(floGlobals.generalDataset("InternUpdates")).map(e=>({floID:e.senderID,update:e.message,time:e.vectorClock.split("_")[0],note:e.note}));return t=t.filter(e=>e.floID in a.internList),t.reverse(),e&&enew Promise((n,r)=>{if(!(e in floGlobals.generalDataset("InternUpdates")))return r("Intern update not found");floCloudAPI.noteApplicationData(e,t).then(e=>n(e)).catch(e=>r(e))})),n.applyForTask=(e=>new Promise((t,n)=>{floCloudAPI.sendGeneralData(e,"TaskRequests").then(e=>t(e)).catch(e=>n(e))})),n.getProjectList=(()=>Object.keys(a.projectMap)),n.getProjectDetails=(e=>a.projectDetails[e]),n.getProjectMap=(e=>a.projectMap[e]),n.getProjectBranches=(t=>e(t)),n.getTaskDetails=((e,t,n)=>a.projectTaskDetails[e+"_"+t+"_"+n]),n.getTaskStatus=((e,t,n)=>a.projectTaskStatus[e+"_"+t+"_"+n]),n.getInternList=(()=>a.internList),n.getInternRating=(e=>a.internRating[e]),n.getAssignedInterns=((e,t,n)=>a.internsAssigned[e+"_"+t+"_"+n]),n.getAllTasks=(()=>a.projectTaskDetails),n.getDisplayedTasks=(()=>floGlobals.appObjects.RIBC.displayedTasks.filter(e=>e)||[]),r.updateObjects=(()=>new Promise((e,t)=>{floCloudAPI.updateObjectData("RIBC").then(t=>e(t)).catch(e=>t(e))})),r.resetObjects=(()=>new Promise((e,t)=>{floCloudAPI.resetObjectData("RIBC").then(t=>e(t)).catch(e=>t(e))})),r.addProjectDetails=function(e,t){if(!(e in a.projectMap))return"Project not Found!";if(e in a.projectDetails&&"object"==typeof e&&"object"==typeof t)for(let n in t)a.projectDetails[e][n]=t[n];else a.projectDetails[e]=t;return"added project details for "+e},n.getInternRequests=function(e=!0){var t=Object.values(floGlobals.generalDataset("InternRequests")).map(e=>({floID:e.senderID,vectorClock:e.vectorClock,details:e.message,status:e.note}));return t=t.filter(e=>!(e.floID in a.internList)),e&&(t=t.filter(e=>!e.status)),t},r.processInternRequest=function(e,t=!0){let n=floGlobals.generalDataset("InternRequests")[e];return n?(r=t&&s(n.senderID,n.message[0])?"Accepted":"Rejected",floCloudAPI.noteApplicationData(e,r).then(e=>null).catch(e=>console.error(e)),r):"Request not found";var r};const s=r.addIntern=function(e,t){return!(e in a.internList)&&(a.internList[e]=t,a.internRating[e]=1,!0)};r.removeIntern=function(e){if(!(e in a.internList))return!1;delete a.internList[e],delete a.internRating[e];for(const t in a.projectTaskDetails)a.internsAssigned[t].includes(e)&&(a.internsAssigned[t]=a.internsAssigned[t].filter(t=>t!=e));return!0},r.updateInternRating=function(e,t=0){return e in a.internList?(a.internRating[e]+=t,"Intern rating Updated"):"Intern not found!"},n.getTaskRequests=function(e=!0){var t=Object.values(floGlobals.generalDataset("TaskRequests")).map(e=>({floID:e.senderID,vectorClock:e.vectorClock,details:e.message,status:e.note}));try{floDapps.user.id&&!floGlobals.subAdmins.includes(floDapps.user.id)&&(t=t.filter(e=>e.floID===floDapps.user.id))}catch(e){return[]}return e&&(t=t.filter(e=>!e.status)),t},r.processTaskRequest=function(e,t=!0){let n=floGlobals.generalDataset("TaskRequests")[e];if(!n)return"Request not found";const{message:{taskId:r,name:a},senderID:i}=n,[c,l,p]=r.split("_");var u;return s(i,a),u=t&&o(i,c,l,p)?"Accepted":"Rejected",floCloudAPI.noteApplicationData(e,u).then(e=>null).catch(e=>console.error(e)),u};const o=r.assignInternToTask=function(e,t,n,r){var s=t+"_"+n+"_"+r;return Array.isArray(a.internsAssigned[s])||(a.internsAssigned[s]=[]),!a.internsAssigned[s].includes(e)&&(a.internsAssigned[s].push(e),!0)};r.unassignInternFromTask=function(e,t,n,r){const s=t+"_"+n+"_"+r;a.internsAssigned[s]=a.internsAssigned[s].filter(t=>t!=e)},r.putTaskStatus=function(e,t,n,r){a.projectTaskStatus[t+"_"+n+"_"+r]=e},r.setDisplayedTasks=function(e=[]){floGlobals.appObjects.RIBC.displayedTasks=e},r.createProject=function(e){return e in a.projectMap?"Project Name already exists":(i(e),"Project Create: "+e)},r.copyBranchToNewProject=function(e,t,n,r,s,o){if("mainLine"==t)return"You cannot change mainLine";if(0==a.projectMap.hasOwnProperty(n))return"The project does not exist";if(0==a.projectMap[n].hasOwnProperty(c))return"The branch does not exist";if(s>o)return"Startpoint cannot be later than endpoint";var c=i(n,r,s,o);a.projectMap[n][c]=a.projectMap[e][t].slice(),a.projectMap[n][c][0]="undefined"==r?"mainLine":"newBranchConnection","undefined"!=s&&(a.projectMap[n][c][2]=s),"undefined"!=o&&(a.projectMap[n][c][3]=o);var l=a.projectTaskDetails;for(var p in l)if(l.hasOwnProperty(p)&&p.contains(e+"_"+t)){var u=p.replace(e+"_"+t+"_","");a.projectTaskDetails[n+"_"+c+"_"+u]=l[p]}return a.projectMap[n][c]},r.deleteTaskInMap=function(e,t,n){for(var r,s=a.projectMap[e][t],o=4;o4&&re!==t||"mainLine"!==e);for(o=0;o=c&&(c=i[p]+1),i[p]==r&&(l=p);return l>3?(i.splice(l+1,0,c),i[1]++,c):"Not possible to insert here.Try another position"},r.changeBranchLine=function(e,t,n,r,s){return"mainLine"==t?"You cannot change mainLine":0==a.projectMap.hasOwnProperty(e)?"The project does not exist":0==a.projectMap[e].hasOwnProperty(t)?"The branch does not exist":0==a.projectMap[e].hasOwnProperty(n)?"The newConnection does not exist":r>s?"Startpoint cannot be later than endpoint":(a.projectMap[e][t][0]=n,"undefined"!=r&&(a.projectMap[e][t][2]=r),"undefined"!=s&&(a.projectMap[e][t][3]=s),a.projectMap[e][t])},r.changeBranchPoint=function(e,t,n,r){var s;return"mainLine"!=t&&(1==r&&(n<=a.projectMap[e][t][3]?(a.projectMap[e][t][2]=n,s=n):s="Start point cannot be later than end point"),2==r&&(n>=a.projectMap[e][t][2]?(a.projectMap[e][t][3]=n,s=n):s="End point cannot be earlier than start point")),"mainLine"==t&&(s="mainLine cannot be rerouted"),s};const i=r.addBranch=function(t,n,r,s){var o,i=e(t);if(0==i)a.projectMap[t]={},a.projectMap[t].mainLine=["mainLine",0,"Start","Stop"],o="mainLine",a.projectBranches[t]="mainLine";else{var c=i[i.length-1];if(c.includes("branch")){var l=c.split("branch"),p=parseFloat(l[1])+1;o="branch"+p,a.projectMap[t]["branch"+p]=[n,0,r,s],a.projectBranches[t]=a.projectBranches[t]+",branch"+p}c.includes("mainLine")&&(o="branch1",a.projectMap[t].branch1=["mainLine",0,r,s],a.projectBranches[t]="mainLine,branch1")}return o};r.editTaskDetails=function(e,t,n,r){a.projectTaskDetails[t+"_"+n+"_"+r]={...a.projectTaskDetails[t+"_"+n+"_"+r],...e}},r.addTaskInMap=function(e,n){var r=[];r=t(e);var s=r[n],o=s+1;return a.projectMap[e][n].push(o),a.projectMap[e][n][1]++,o}})();
\ No newline at end of file