diff --git a/index.html b/index.html index a52e2c1..74a1088 100644 --- a/index.html +++ b/index.html @@ -793,8 +793,7 @@

- + @@ -1169,16 +1168,21 @@ let hasApplied = false try { floDapps.user.id - hasApplied = [...RIBC.getTaskRequests(), ...sessionTaskRequests].find(({ details }) => { + hasApplied = [...RIBC.getTaskRequests(false), ...sessionTaskRequests].find(({ details }) => { return params.id === details.taskId }) } catch (e) { } + const descriptionTag = createElement('p', { + innerHTML: DOMPurify.sanitize(linkify(description), { ADD_ATTR: ['target'] }), + className: 'ws-pre-line wrap-around' + }) + descriptionTag.id = 'task_description' renderElem(getRef('task_details_wrapper'), html`
${floGlobals.taskCategories[category]}

${title}

-

${description}

+ ${descriptionTag}
${duration ? html` @@ -1214,7 +1218,13 @@ case 'dashboard_page': render.dashProjects(getRef('pinned_projects'), pinnedProjects); // displays recent projects - render.dashProjects(getRef('project_list'), RIBC.getProjectList().filter(project => !pinnedProjects.includes(project)).reverse()) + 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) break; case 'updates_page': { if (!getRef('updates_page__project_selector').children.length) { @@ -1702,8 +1712,7 @@ const status = RIBC.getTaskStatus(appState.params.id, appState.params.branch, task) let applyButton if (!assignedInterns.includes(myFloID)) { - const taskRequests = RIBC.getTaskRequests(); - const hasApplied = [...taskRequests, ...sessionTaskRequests].find(({ details }) => { + const hasApplied = [...RIBC.getTaskRequests(false), ...sessionTaskRequests].find(({ details }) => { return `${appState.params.id}_${appState.params.branch}_${task}` === details.taskId }) applyButton = html` @@ -2597,8 +2606,7 @@ getRef('intern_apply__task').textContent = RIBC.getAllTasks()[taskId].title openPopup('apply_for_task_popup', true) } else if (typeOfUser === 'intern') { - const taskRequests = RIBC.getTaskRequests(); - const hasApplied = [...taskRequests, ...sessionTaskRequests].find(({ details }) => { + const hasApplied = [...RIBC.getTaskRequests(false), ...sessionTaskRequests].find(({ details }) => { return taskId === details.taskId }) if (hasApplied) { @@ -2635,7 +2643,7 @@ } catch (err) { floGlobals.tempUserTaskRequest = btn.dataset.taskId; location.hash = '#/sign_in' - floGlobals.signInNotification = notify('Please login to apply for task.', 'error') + floGlobals.signInNotification = notify('Please login to apply for task.') } } @@ -3010,6 +3018,20 @@ } }); } + // detect url within text and convert to link + function linkify(inputText) { + let replacedText, replacePattern1, replacePattern2, replacePattern3; + //URLs starting with http://, https://, or ftp:// + replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim; + replacedText = inputText.replace(replacePattern1, '$1'); + //URLs starting with "www." (without // before it, or it'd re-link the ones done above). + replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim; + replacedText = replacedText.replace(replacePattern2, '$1$2'); + //Change email addresses to mailto:: links. + replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim; + replacedText = replacedText.replace(replacePattern3, '$1'); + return replacedText; + } diff --git a/scripts/ribc.js b/scripts/ribc.js index 419dfae..25770af 100644 --- a/scripts/ribc.js +++ b/scripts/ribc.js @@ -183,13 +183,13 @@ status: data.note } }) - //filter only requests for logged in intern - // try { - // if (floDapps.user.id) - // taskRequests = taskRequests.filter(data => data.floID === floDapps.user.id) - // } catch (err) { - // return []; - // } + // filter only requests for logged in intern + try { + if (floDapps.user.id && !floGlobals.subAdmins.includes(floDapps.user.id)) + taskRequests = taskRequests.filter(data => data.floID === floDapps.user.id) + } catch (err) { + return []; + } //filter processed requests if (ignoreProcessed) taskRequests = taskRequests.filter(data => !data.status) @@ -240,7 +240,7 @@ return "Project Create: " + projectCode } - Admin.copyBranchtoNewProject = function (oldProjectCode, oldBranch, newProjectCode, newBranchConnection, + Admin.copyBranchToNewProject = function (oldProjectCode, oldBranch, newProjectCode, newBranchConnection, newStartPoint, newEndPoint) { //Make sure new branch is a new text string that does not exist in new project if (oldBranch == "mainLine") { diff --git a/scripts/ribc.min.js b/scripts/ribc.min.js index ba96c83..fd75c70 100644 --- a/scripts/ribc.min.js +++ b/scripts/ribc.min.js @@ -1 +1 @@ -(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.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"];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=[],o=[];(e?r:o).push("TaskRequests","InternRequests");let s=[];for(let e of r)s.push(floCloudAPI.requestGeneralData(e));for(let e of a)s.push(floCloudAPI.requestGeneralData(e,{senderID:floGlobals.subAdmins}));for(let e of o)s.push(floCloudAPI.requestGeneralData(e,{senderID:floDapps.user.id}));Promise.all(s).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),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&&o(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 o=r.addIntern=function(e,t){return!(e in a.internList)&&(a.internList[e]=t,a.internRating[e]=1,!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}));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,p,l]=r.split("_");var u;return o(i,a),u=t&&s(i,c,p,l)?"Accepted":"Rejected",floCloudAPI.noteApplicationData(e,u).then(e=>null).catch(e=>console.error(e)),u};const s=r.assignInternToTask=function(e,t,n,r){var o=t+"_"+n+"_"+r;return Array.isArray(a.internsAssigned[o])||(a.internsAssigned[o]=[]),!a.internsAssigned[o].includes(e)&&(a.internsAssigned[o].push(e),!0)};r.unassignInternFromTask=function(e,t,n,r){const o=t+"_"+n+"_"+r;a.internsAssigned[o]=a.internsAssigned[o].filter(t=>t!=e)},r.putTaskStatus=function(e,t,n,r){a.projectTaskStatus[t+"_"+n+"_"+r]=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,o,s){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(o>s)return"Startpoint cannot be later than endpoint";var c=i(n,r,o,s);a.projectMap[n][c]=a.projectMap[e][t].slice(),a.projectMap[n][c][0]="undefined"==r?"mainLine":"newBranchConnection","undefined"!=o&&(a.projectMap[n][c][2]=o),"undefined"!=s&&(a.projectMap[n][c][3]=s);var p=a.projectTaskDetails;for(var l in p)if(p.hasOwnProperty(l)&&l.contains(e+"_"+t)){var u=l.replace(e+"_"+t+"_","");a.projectTaskDetails[n+"_"+c+"_"+u]=p[l]}return a.projectMap[n][c]},r.deleteTaskInMap=function(e,t,n){for(var r,o=a.projectMap[e][t],s=4;s4&&re!==t||"mainLine"!==e);for(s=0;s=c&&(c=i[l]+1),i[l]==r&&(p=l);return p>3?(i.splice(p+1,0,c),i[1]++,c):"Not possible to insert here.Try another position"},r.changeBranchLine=function(e,t,n,r,o){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>o?"Startpoint cannot be later than endpoint":(a.projectMap[e][t][0]=n,"undefined"!=r&&(a.projectMap[e][t][2]=r),"undefined"!=o&&(a.projectMap[e][t][3]=o),a.projectMap[e][t])},r.changeBranchPoint=function(e,t,n,r){var o;return"mainLine"!=t&&(1==r&&(n<=a.projectMap[e][t][3]?(a.projectMap[e][t][2]=n,o=n):o="Start point cannot be later than end point"),2==r&&(n>=a.projectMap[e][t][2]?(a.projectMap[e][t][3]=n,o=n):o="End point cannot be earlier than start point")),"mainLine"==t&&(o="mainLine cannot be rerouted"),o};const i=r.addBranch=function(t,n,r,o){var s,i=e(t);if(0==i)a.projectMap[t]={},a.projectMap[t].mainLine=["mainLine",0,"Start","Stop"],s="mainLine",a.projectBranches[t]="mainLine";else{var c=i[i.length-1];if(c.includes("branch")){var p=c.split("branch"),l=parseFloat(p[1])+1;s="branch"+l,a.projectMap[t]["branch"+l]=[n,0,r,o],a.projectBranches[t]=a.projectBranches[t]+",branch"+l}c.includes("mainLine")&&(s="branch1",a.projectMap[t].branch1=["mainLine",0,r,o],a.projectBranches[t]="mainLine,branch1")}return s};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 o=r[n],s=o+1;return a.projectMap[e][n].push(s),a.projectMap[e][n][1]++,s}})(); \ 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.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"];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=[],o=[];(e?r:o).push("TaskRequests","InternRequests");let s=[];for(let e of r)s.push(floCloudAPI.requestGeneralData(e));for(let e of a)s.push(floCloudAPI.requestGeneralData(e,{senderID:floGlobals.subAdmins}));for(let e of o)s.push(floCloudAPI.requestGeneralData(e,{senderID:floDapps.user.id}));Promise.all(s).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),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&&o(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 o=r.addIntern=function(e,t){return!(e in a.internList)&&(a.internList[e]=t,a.internRating[e]=1,!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,p,l]=r.split("_");var u;return o(i,a),u=t&&s(i,c,p,l)?"Accepted":"Rejected",floCloudAPI.noteApplicationData(e,u).then(e=>null).catch(e=>console.error(e)),u};const s=r.assignInternToTask=function(e,t,n,r){var o=t+"_"+n+"_"+r;return Array.isArray(a.internsAssigned[o])||(a.internsAssigned[o]=[]),!a.internsAssigned[o].includes(e)&&(a.internsAssigned[o].push(e),!0)};r.unassignInternFromTask=function(e,t,n,r){const o=t+"_"+n+"_"+r;a.internsAssigned[o]=a.internsAssigned[o].filter(t=>t!=e)},r.putTaskStatus=function(e,t,n,r){a.projectTaskStatus[t+"_"+n+"_"+r]=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,o,s){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(o>s)return"Startpoint cannot be later than endpoint";var c=i(n,r,o,s);a.projectMap[n][c]=a.projectMap[e][t].slice(),a.projectMap[n][c][0]="undefined"==r?"mainLine":"newBranchConnection","undefined"!=o&&(a.projectMap[n][c][2]=o),"undefined"!=s&&(a.projectMap[n][c][3]=s);var p=a.projectTaskDetails;for(var l in p)if(p.hasOwnProperty(l)&&l.contains(e+"_"+t)){var u=l.replace(e+"_"+t+"_","");a.projectTaskDetails[n+"_"+c+"_"+u]=p[l]}return a.projectMap[n][c]},r.deleteTaskInMap=function(e,t,n){for(var r,o=a.projectMap[e][t],s=4;s4&&re!==t||"mainLine"!==e);for(s=0;s=c&&(c=i[l]+1),i[l]==r&&(p=l);return p>3?(i.splice(p+1,0,c),i[1]++,c):"Not possible to insert here.Try another position"},r.changeBranchLine=function(e,t,n,r,o){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>o?"Startpoint cannot be later than endpoint":(a.projectMap[e][t][0]=n,"undefined"!=r&&(a.projectMap[e][t][2]=r),"undefined"!=o&&(a.projectMap[e][t][3]=o),a.projectMap[e][t])},r.changeBranchPoint=function(e,t,n,r){var o;return"mainLine"!=t&&(1==r&&(n<=a.projectMap[e][t][3]?(a.projectMap[e][t][2]=n,o=n):o="Start point cannot be later than end point"),2==r&&(n>=a.projectMap[e][t][2]?(a.projectMap[e][t][3]=n,o=n):o="End point cannot be earlier than start point")),"mainLine"==t&&(o="mainLine cannot be rerouted"),o};const i=r.addBranch=function(t,n,r,o){var s,i=e(t);if(0==i)a.projectMap[t]={},a.projectMap[t].mainLine=["mainLine",0,"Start","Stop"],s="mainLine",a.projectBranches[t]="mainLine";else{var c=i[i.length-1];if(c.includes("branch")){var p=c.split("branch"),l=parseFloat(p[1])+1;s="branch"+l,a.projectMap[t]["branch"+l]=[n,0,r,o],a.projectBranches[t]=a.projectBranches[t]+",branch"+l}c.includes("mainLine")&&(s="branch1",a.projectMap[t].branch1=["mainLine",0,r,o],a.projectBranches[t]="mainLine,branch1")}return s};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 o=r[n],s=o+1;return a.projectMap[e][n].push(s),a.projectMap[e][n][1]++,s}})(); \ No newline at end of file