ribc/scripts/ribc.min.js
2024-02-24 03:18:30 +05:30

1 line
15 KiB
JavaScript

!function(){const Ribc=window.RIBC={},Admin=Ribc.admin={};Ribc.init=function(isSubAdmin=!1){return new Promise(((resolve,reject)=>{Promise.all([Ribc.refreshObjectData(),Ribc.refreshGeneralData(isSubAdmin)]).then((results=>resolve(results))).catch((error=>reject(error)))}))},Ribc.refreshObjectData=()=>new Promise(((resolve,reject)=>{floCloudAPI.requestObjectData("RIBC").then((result=>{floGlobals.appObjects.RIBC||(floGlobals.appObjects.RIBC={});["projectMap","projectBranches","projectTaskDetails","projectDetails","internList","internRating","internRecord","internsAssigned","projectTaskStatus","displayedTasks"].forEach((obj=>{floGlobals.appObjects.RIBC[obj]||(floGlobals.appObjects.RIBC[obj]={}),_[obj]=floGlobals.appObjects.RIBC[obj]})),resolve("Object Data Refreshed Successfully")})).catch((error=>reject(error)))})),Ribc.refreshGeneralData=isSubAdmin=>new Promise(((resolve,reject)=>{var generalDataList=["InternUpdates"],selfOnlyList=[];(isSubAdmin?generalDataList:selfOnlyList).push("TaskRequests","InternRequests");let promises=[];for(let data of generalDataList)promises.push(floCloudAPI.requestGeneralData(data));for(let data of[])promises.push(floCloudAPI.requestGeneralData(data,{senderID:floGlobals.subAdmins}));for(let data of selfOnlyList)promises.push(floCloudAPI.requestGeneralData(data,{senderID:floDapps.user.id}));Promise.all(promises).then((results=>resolve("General Data Refreshed Successfully"))).catch((error=>reject(error)))}));const _={};Ribc.applyForIntern=details=>new Promise(((resolve,reject)=>{floCloudAPI.sendGeneralData(details,"InternRequests").then((results=>resolve(results))).catch((error=>reject(error)))})),Ribc.postInternUpdate=updates=>new Promise(((resolve,reject)=>{floCloudAPI.sendGeneralData(updates,"InternUpdates").then((results=>resolve(results))).catch((error=>reject(error)))})),Ribc.getInternUpdates=function(count=null){let internUpdates=Object.values(floGlobals.generalDataset("InternUpdates")).map((data=>({floID:data.senderID,update:data.message,time:data.vectorClock.split("_")[0],note:data.note,tag:data.tag})));return internUpdates=internUpdates.filter((data=>data.floID in _.internList)),internUpdates.reverse(),count&&count<internUpdates.length&&(internUpdates=internUpdates.slice(0,count)),internUpdates},Admin.commentInternUpdate=(vectorClock,comment)=>new Promise(((resolve,reject)=>{if(!(vectorClock in floGlobals.generalDataset("InternUpdates")))return reject("Intern update not found");floCloudAPI.noteApplicationData(vectorClock,comment).then((result=>resolve(result))).catch((error=>reject(error)))})),Ribc.applyForTask=details=>new Promise(((resolve,reject)=>{floCloudAPI.sendGeneralData(details,"TaskRequests").then((result=>resolve(result))).catch((error=>reject(error)))})),Ribc.getProjectList=()=>Object.keys(_.projectMap),Ribc.getProjectDetails=project=>_.projectDetails[project],Ribc.getProjectMap=project=>_.projectMap[project],Ribc.getProjectBranches=project=>findAllBranches(project),Ribc.getTaskDetails=taskId=>_.projectTaskDetails[taskId],Ribc.getTaskStatus=taskId=>_.projectTaskStatus[taskId],Ribc.getInternList=()=>_.internList,Ribc.getInternRating=floID=>_.internRating[floID]||0,Ribc.getInternRecord=floID=>_.internRecord[floID]||{},Ribc.getAssignedInterns=taskId=>_.internsAssigned[taskId]||[],Ribc.getAllTasks=()=>_.projectTaskDetails,Ribc.getDisplayedTasks=()=>floGlobals.appObjects.RIBC.displayedTasks||[],Admin.updateObjects=()=>new Promise(((resolve,reject)=>{floCloudAPI.updateObjectData("RIBC").then((result=>resolve(result))).catch((error=>reject(error)))})),Admin.resetObjects=()=>new Promise(((resolve,reject)=>{floCloudAPI.resetObjectData("RIBC").then((result=>resolve(result))).catch((error=>reject(error)))})),Admin.addProjectDetails=function(projectCode,details){if(!(projectCode in _.projectMap))return"Project not Found!";if(projectCode in _.projectDetails&&"object"==typeof projectCode&&"object"==typeof details)for(let d in details)_.projectDetails[projectCode][d]=details[d];else _.projectDetails[projectCode]=details;return"added project details for "+projectCode},Ribc.getInternRequests=function(ignoreProcessed=!0){var internRequests=Object.values(floGlobals.generalDataset("InternRequests")).map((data=>({floID:data.senderID,vectorClock:data.vectorClock,details:data.message,status:data.note})));return internRequests=internRequests.filter((data=>!(data.floID in _.internList))),ignoreProcessed&&(internRequests=internRequests.filter((data=>!data.status))),internRequests},Admin.processInternRequest=function(vectorClock,accept=!0){let request=floGlobals.generalDataset("InternRequests")[vectorClock];return request?(status=accept&&addIntern(request.senderID,request.message[0])?"Accepted":"Rejected",floCloudAPI.noteApplicationData(vectorClock,status).then((_=>null)).catch((e=>console.error(e))),status):"Request not found";var status},Admin.initInternRecord=function(floID){_.internRecord[floID]||(_.internRecord[floID]={active:!0,joined:Date.now(),assignedTasks:{},completedTasks:{},failedTasks:{}})};const addIntern=Admin.addIntern=function(floID,internName){return!(floID in _.internList)&&(_.internList[floID]=internName,_.internRating[floID]=0,Admin.initInternRecord(floID),!0)};Admin.renameIntern=function(floID,newName){return floID in _.internList&&(_.internList[floID]=newName,!0)},Admin.removeIntern=function(floID){if(!(floID in _.internList))return!1;delete _.internList[floID],delete _.internRating[floID],delete _.internRecord[floID];for(const taskKey in _.projectTaskDetails)_.internsAssigned[taskKey].includes(floID)&&(_.internsAssigned[taskKey]=_.internsAssigned[taskKey].filter((id=>id!==floID)));return!0},Admin.addCompletedTask=function(floID,taskKey,points,details={}){if(!(floID in _.internList))return!1;Admin.initInternRecord(floID),_.internRecord[floID].completedTasks[taskKey]={points:points,...details};let totalScore=0;for(const taskKey in _.internRecord[floID].completedTasks)totalScore+=_.internRecord[floID].completedTasks[taskKey].points;const completedTasks=Object.keys(_.internRecord[floID].completedTasks).length,failedTasks=Object.keys(_.internRecord[floID].failedTasks).length;return _.internRating[floID]=parseInt(totalScore/(completedTasks+failedTasks)||1),!0},Admin.addFailedTask=function(floID,taskKey,details={}){return floID in _.internList&&(Admin.initInternRecord(floID),_.internRecord[floID].failedTasks[taskKey]={...details},Admin.unassignInternFromTask(floID,taskKey),!0)},Admin.setInternStatus=function(floID,active=!0){return floID in _.internList&&(_.internRecord[floID].active=active,!0)},Ribc.getTaskRequests=function(ignoreProcessed=!0){var taskRequests=Object.values(floGlobals.generalDataset("TaskRequests")).map((data=>({floID:data.senderID,vectorClock:data.vectorClock,details:data.message,status:data.note})));try{floDapps.user.id&&!floGlobals.subAdmins.includes(floDapps.user.id)&&(taskRequests=taskRequests.filter((data=>data.floID===floDapps.user.id)))}catch(err){return[]}return ignoreProcessed&&(taskRequests=taskRequests.filter((data=>!data.status))),taskRequests},Admin.processTaskRequest=function(vectorClock,accept=!0){let request=floGlobals.generalDataset("TaskRequests")[vectorClock];if(!request)return"Request not found";const{message:{taskId:taskId,name:name},senderID:senderID}=request,[projectCode,branch,taskNumber]=taskId.split("_");var status;return addIntern(senderID,name),status=accept&&assignInternToTask(senderID,projectCode,branch,taskNumber)?"Accepted":"Rejected",floCloudAPI.noteApplicationData(vectorClock,status)};const assignInternToTask=Admin.assignInternToTask=function(floID,projectCode,branch,taskNumber){const key=projectCode+"_"+branch+"_"+taskNumber;return _.internsAssigned[key]||(_.internsAssigned[key]=[]),!_.internsAssigned[key].includes(floID)&&(_.internsAssigned[key].push(floID),_.internRecord[floID].assignedTasks[key]={assignedOn:Date.now()},!0)};Admin.unassignInternFromTask=function(floID,taskKey){return!(!_.internsAssigned[taskKey]||!_.internsAssigned[taskKey].includes(floID))&&(_.internsAssigned[taskKey]=_.internsAssigned[taskKey].filter((id=>id!==floID)),delete _.internRecord[floID].assignedTasks[taskKey],!0)},Admin.putTaskStatus=function(taskStatus,projectCode,branch,taskNumber){_.projectTaskStatus[projectCode+"_"+branch+"_"+taskNumber]=taskStatus},Admin.setDisplayedTasks=function(tasksArr=[]){floGlobals.appObjects.RIBC.displayedTasks=tasksArr},Admin.createProject=function(projectCode){return projectCode in _.projectMap?"Project Name already exists":(addBranch(projectCode),"Project Create: "+projectCode)},Admin.copyBranchToNewProject=function(oldProjectCode,oldBranch,newProjectCode,newBranchConnection,newStartPoint,newEndPoint){if("mainLine"==oldBranch)return"You cannot change mainLine";if(0==_.projectMap.hasOwnProperty(newProjectCode))return"The project does not exist";if(0==_.projectMap[newProjectCode].hasOwnProperty(newBranch))return"The branch does not exist";if(newStartPoint>newEndPoint)return"Startpoint cannot be later than endpoint";var newBranch=addBranch(newProjectCode,newBranchConnection,newStartPoint,newEndPoint);_.projectMap[newProjectCode][newBranch]=_.projectMap[oldProjectCode][oldBranch].slice(),_.projectMap[newProjectCode][newBranch][0]="undefined"==newBranchConnection?"mainLine":"newBranchConnection","undefined"!=newStartPoint&&(_.projectMap[newProjectCode][newBranch][2]=newStartPoint),"undefined"!=newEndPoint&&(_.projectMap[newProjectCode][newBranch][3]=newEndPoint);var p=_.projectTaskDetails;for(var key in p)if(p.hasOwnProperty(key)&&key.contains(oldProjectCode+"_"+oldBranch)){var numberExtract=key.replace(oldProjectCode+"_"+oldBranch+"_","");_.projectTaskDetails[newProjectCode+"_"+newBranch+"_"+numberExtract]=p[key]}return _.projectMap[newProjectCode][newBranch]},Admin.deleteTaskInMap=function(projectCode,branch,taskNumber){for(var currentIndex,arr=_.projectMap[projectCode][branch],i=4;i<arr.length;i++)arr[i]==taskNumber&&(currentIndex=i);var deleteMode,nextIndex=currentIndex+1,previousIndex=currentIndex-1,nextTaskNumber=_.projectMap[projectCode][branch][nextIndex],previousTaskNumber=_.projectMap[projectCode][branch][previousIndex];currentIndex==arr.length-1&&(deleteMode="last"),4==currentIndex&&(deleteMode="first"),currentIndex>4&&currentIndex<arr.length-1&&(deleteMode="normal"),4==currentIndex&&currentIndex==arr.length-1&&(deleteMode="nothingToDelete");var otherBranches=Object.keys(_.projectMap[projectCode]);otherBranches=otherBranches.filter((currBranch=>currBranch!==branch||"mainLine"!==currBranch));for(i=0;i<otherBranches.length;i++){if(_.projectMap[projectCode][otherBranches[i]][2]==taskNumber)if("normal"==deleteMode)_.projectMap[projectCode][otherBranches[i]][2]=previousTaskNumber;else if("last"==deleteMode)_.projectMap[projectCode][otherBranches[i]][2]=previousTaskNumber;else if("first"==deleteMode)_.projectMap[projectCode][otherBranches[i]][2]=nextTaskNumber;else if("undefined"==deleteMode)return" nothing to delete";if(_.projectMap[projectCode][otherBranches[i]][3]==taskNumber)if("normal"==deleteMode)_.projectMap[projectCode][otherBranches[i]][3]=nextTaskNumber;else if("last"==deleteMode)_.projectMap[projectCode][otherBranches[i]][3]=previousTaskNumber;else if("first"==deleteMode)_.projectMap[projectCode][otherBranches[i]][3]=nextTaskNumber;else if("undefined"==deleteMode)return" nothing to delete"}var p=_.projectTaskDetails;for(var key in p)p.hasOwnProperty(key)&&key==projectCode+"_"+branch+"_"+taskNumber&&delete p[key];arr.splice(currentIndex,1),arr[1]=arr[1]-1},Admin.insertTaskInMap=function(projectCode,branchName,insertPoint){for(var lastNumber=findLastTaskNumber(projectCode)[branchName],arr=_.projectMap[projectCode][branchName],addedTaskNumber=lastNumber+1,insertIndex=0,i=4;i<arr.length;i++)arr[i]>=addedTaskNumber&&(addedTaskNumber=arr[i]+1),arr[i]==insertPoint&&(insertIndex=i);return insertIndex>3?(arr.splice(insertIndex+1,0,addedTaskNumber),arr[1]++,addedTaskNumber):"Not possible to insert here.Try another position"},Admin.changeBranchLine=function(projectCode,branch,newConnection,newStartPoint,newEndPoint){return"mainLine"==branch?"You cannot change mainLine":0==_.projectMap.hasOwnProperty(projectCode)?"The project does not exist":0==_.projectMap[projectCode].hasOwnProperty(branch)?"The branch does not exist":0==_.projectMap[projectCode].hasOwnProperty(newConnection)?"The newConnection does not exist":newStartPoint>newEndPoint?"Startpoint cannot be later than endpoint":(_.projectMap[projectCode][branch][0]=newConnection,"undefined"!=newStartPoint&&(_.projectMap[projectCode][branch][2]=newStartPoint),"undefined"!=newEndPoint&&(_.projectMap[projectCode][branch][3]=newEndPoint),_.projectMap[projectCode][branch])},Admin.changeBranchPoint=function(projectCode,branch,newPoint,startOrEnd){var message;return"mainLine"!=branch&&(1==startOrEnd&&(newPoint<=_.projectMap[projectCode][branch][3]?(_.projectMap[projectCode][branch][2]=newPoint,message=newPoint):message="Start point cannot be later than end point"),2==startOrEnd&&(newPoint>=_.projectMap[projectCode][branch][2]?(_.projectMap[projectCode][branch][3]=newPoint,message=newPoint):message="End point cannot be earlier than start point")),"mainLine"==branch&&(message="mainLine cannot be rerouted"),message};const addBranch=Admin.addBranch=function(projectCode1,branch,startPoint,mergePoint){var newBranchName,arr=findAllBranches(projectCode1);if(0==arr)_.projectMap[projectCode1]={},_.projectMap[projectCode1].mainLine=["mainLine",0,"Start","Stop"],newBranchName="mainLine",_.projectBranches[projectCode1]="mainLine";else{var str=arr[arr.length-1];if(str.includes("branch")){var res=str.split("branch"),newNumber=parseFloat(res[1])+1;newBranchName="branch"+newNumber,_.projectMap[projectCode1]["branch"+newNumber]=[branch,0,startPoint,mergePoint],_.projectBranches[projectCode1]=_.projectBranches[projectCode1]+",branch"+newNumber}str.includes("mainLine")&&(newBranchName="branch1",_.projectMap[projectCode1].branch1=["mainLine",0,startPoint,mergePoint],_.projectBranches[projectCode1]="mainLine,branch1")}return newBranchName};function findAllBranches(projectCode){if(_.projectBranches.hasOwnProperty(projectCode))var branch=_.projectBranches[projectCode].split(",");else branch=!1;return branch}function findLastTaskNumber(projectCode){for(var returnData={},branch=_.projectBranches[projectCode].split(","),i=0;i<branch.length;i++)returnData[branch[i]]=_.projectMap[projectCode][branch[i]][1],"Stop"==returnData[branch[i]]&&(returnData[branch[i]]=0);return returnData}Admin.editTaskDetails=function(taskDetails,projectCode,branch,taskNumber){_.projectTaskDetails[projectCode+"_"+branch+"_"+taskNumber]={..._.projectTaskDetails[projectCode+"_"+branch+"_"+taskNumber],...taskDetails}},Admin.addTaskInMap=function(projectCode,branchName){var addedTaskNumber=findLastTaskNumber(projectCode)[branchName]+1;return _.projectMap[projectCode][branchName].push(addedTaskNumber),_.projectMap[projectCode][branchName][1]++,addedTaskNumber}}();