UNCLASSIFIED

Commit 9afde2fe authored by graham.smith's avatar graham.smith
Browse files

Merge branch 'BULL-529' of...

Merge branch 'BULL-529' of https://code.il2.dso.mil/platform-one/products/bullhorn/launchboard-fe into BULL-529
parents b16c0346 8b60c3ee
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -29,38 +29,38 @@ ...@@ -29,38 +29,38 @@
"vuex": "^3.5.1" "vuex": "^3.5.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-transform-strict-mode": "^7.8.3", "@babel/plugin-transform-strict-mode": "^7.12.13",
"@mdi/font": "^5.3.45", "@mdi/font": "^5.9.55",
"@vue/cli-plugin-babel": "^4.5.8", "@vue/cli-plugin-babel": "^4.5.11",
"@vue/cli-plugin-e2e-cypress": "^4.5.8", "@vue/cli-plugin-e2e-cypress": "^4.5.11",
"@vue/cli-plugin-eslint": "^4.5.8", "@vue/cli-plugin-eslint": "^4.5.11",
"@vue/cli-plugin-router": "^4.5.8", "@vue/cli-plugin-router": "^4.5.11",
"@vue/cli-plugin-unit-jest": "^4.5.8", "@vue/cli-plugin-unit-jest": "^4.5.11",
"@vue/cli-service": "^4.5.8", "@vue/cli-service": "^4.5.11",
"@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-prettier": "^6.0.0",
"@vue/test-utils": "^1.1.2", "@vue/test-utils": "^1.1.3",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"cypress": "^5.4.0", "cypress": "^5.4.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"eslint-loader": "^4.0.2", "eslint-loader": "^4.0.2",
"eslint-plugin-prettier": "^3.1.1", "eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-vue": "^6.2.2", "eslint-plugin-vue": "^6.2.2",
"flush-promises": "^1.0.2", "flush-promises": "^1.0.2",
"husky": "^4.3.5", "husky": "^4.3.8",
"pre-commit": "^1.2.2", "pre-commit": "^1.2.2",
"prettier": "^2.2.1", "prettier": "^2.2.1",
"pretty-quick": "^3.1.0", "pretty-quick": "^3.1.0",
"sass": "^1.29.0", "sass": "^1.32.8",
"sass-loader": "^8.0.2", "sass-loader": "^8.0.2",
"style-resources-loader": "^1.3.2", "style-resources-loader": "^1.3.2",
"stylelint": "^13.0.0", "stylelint": "^13.11.0",
"stylelint-webpack-plugin": "^2.1.1", "stylelint-webpack-plugin": "^2.1.1",
"vue-cli-plugin-style-resources-loader": "~0.1.4", "vue-cli-plugin-style-resources-loader": "~0.1.4",
"vue-cli-plugin-vuetify": "~2.0.6", "vue-cli-plugin-vuetify": "^2.0.9",
"vue-loader-v16": "^16.0.0-beta.5.4", "vue-loader-v16": "^16.0.0-beta.5.4",
"vue-svg-loader": "^0.16.0", "vue-svg-loader": "^0.16.0",
"vue-template-compiler": "^2.6.12", "vue-template-compiler": "^2.6.12",
"vuetify-loader": "^1.3.0" "vuetify-loader": "^1.7.2"
}, },
"eslintConfig": { "eslintConfig": {
"root": true, "root": true,
......
...@@ -24,14 +24,20 @@ export default { ...@@ -24,14 +24,20 @@ export default {
} }
}, },
async updateTeam({ id, name, description, capacity }) { async updateTeam(team, addPOC, editedMembers) {
await HTTP.put(`/teams/${id}`, { name, description, capacity }); console.log("UPDATING", team, addPOC, editedMembers);
await HTTP.put(`/teams/${team.id}/members`, editedMembers);
if (addPOC) {
await HTTP.post(`/teams/${team.id}/members`, addPOC);
};
const response = await HTTP.put(`/teams/${team.id}`, team);
return response;
}, },
async deleteMembers(members, teamId) { async deleteMembers(members, teamId) {
for (let i = 0; i < members.length; i++) { await HTTP.delete(`/teams/${teamId}/members`, {
await HTTP.delete(`/teams/${teamId}/members/${members[i].id}`); params: { userIds: `[${members}]` },
} });
}, },
async addMember(member, teamId, teamLead) { async addMember(member, teamId, teamLead) {
await HTTP.post(`/teams/${teamId}/members`, { await HTTP.post(`/teams/${teamId}/members`, {
...@@ -42,7 +48,6 @@ export default { ...@@ -42,7 +48,6 @@ export default {
}); });
}, },
async addMembers(members, teamId) { async addMembers(members, teamId) {
console.log(members);
for (let i = 0; i < members.length; i++) { for (let i = 0; i < members.length; i++) {
console.log("USER", members[i]); console.log("USER", members[i]);
await this.addMember(members[i], teamId, members[i].isTeamLead); await this.addMember(members[i], teamId, members[i].isTeamLead);
......
...@@ -28,4 +28,5 @@ export default { ...@@ -28,4 +28,5 @@ export default {
async updateUserPreferences(preferences) { async updateUserPreferences(preferences) {
return HTTP.post("/users/preferences", preferences); return HTTP.post("/users/preferences", preferences);
}, },
}; }
...@@ -62,7 +62,9 @@ ...@@ -62,7 +62,9 @@
ref="UserSelect" ref="UserSelect"
required required
multiple multiple
label="Select a Team Point of Contact" preload
:preloadData="toAdd.poc"
label="Select a Team Leads"
:rules="[inputRules.required]" :rules="[inputRules.required]"
/> />
</v-form> </v-form>
...@@ -117,6 +119,9 @@ export default { ...@@ -117,6 +119,9 @@ export default {
created() { created() {
if (this.value) { if (this.value) {
this.toAdd = cloneDeep(this.value); this.toAdd = cloneDeep(this.value);
this.toAdd.poc = this.toAdd.members.filter(
(item) => item.TeamMember.isTeamLead === true
);
} }
}, },
methods: { methods: {
...@@ -130,6 +135,7 @@ export default { ...@@ -130,6 +135,7 @@ export default {
this.init(); this.init();
}, },
edit() { edit() {
console.log("Saving", this.toAdd);
this.$emit("edit", this.toAdd); this.$emit("edit", this.toAdd);
this.init(); this.init();
}, },
......
...@@ -75,9 +75,14 @@ export default { ...@@ -75,9 +75,14 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
preload: {
type: Boolean,
default: false,
},
rules: Array, rules: Array,
label: String, label: String,
value: [Object, Array], value: [Object, Array],
preloadData: Array,
}, },
data: () => ({ data: () => ({
loading: false, loading: false,
...@@ -88,7 +93,7 @@ export default { ...@@ -88,7 +93,7 @@ export default {
created() { created() {
if (this.value) { if (this.value) {
this.model = this.value; this.model = this.value;
this.items = [this.value]; this.items = this.value;
} }
}, },
computed: { computed: {
...@@ -151,12 +156,12 @@ export default { ...@@ -151,12 +156,12 @@ export default {
const newItems = await UserService.search({ q: val }); const newItems = await UserService.search({ q: val });
if (this.model) { if (this.model) {
if (Array.isArray(this.model)) { if (Array.isArray(this.model)) {
this.items = uniq([...newItems, ...this.model]); this.items = uniq([...newItems.users, ...this.model]);
} else { } else {
this.items = uniq([...newItems, this.model]); this.items = uniq([...newItems.users, this.model]);
} }
} else { } else {
this.items = newItems; this.items = newItems.users;
} }
} catch (e) { } catch (e) {
console.error("unable to get users", e); console.error("unable to get users", e);
......
...@@ -100,6 +100,7 @@ ...@@ -100,6 +100,7 @@
<UserSelect <UserSelect
ref="userSelect" ref="userSelect"
v-model="memberToAdd" v-model="memberToAdd"
multiple
:rules="[ :rules="[
inputRules.required, inputRules.required,
inputRules.duplicates( inputRules.duplicates(
...@@ -288,6 +289,7 @@ export default { ...@@ -288,6 +289,7 @@ export default {
this.team = await TeamService.getMyTeam(); this.team = await TeamService.getMyTeam();
} }
} else { } else {
console.log("THIS CANNOT BE ME");
await this.getTeams(); await this.getTeams();
} }
} catch (error) { } catch (error) {
...@@ -303,6 +305,7 @@ export default { ...@@ -303,6 +305,7 @@ export default {
} }
try { try {
this.team = await TeamService.getTeam(this.$route.params.teamId); this.team = await TeamService.getTeam(this.$route.params.teamId);
console.log("TEAM", this.team);
} catch (error) { } catch (error) {
console.error("!teams error!", error); console.error("!teams error!", error);
} finally { } finally {
...@@ -312,9 +315,51 @@ export default { ...@@ -312,9 +315,51 @@ export default {
}, },
async editTeam(editedTeam) { async editTeam(editedTeam) {
this.state.isEditingTeamDetailsBusy = true; this.state.isEditingTeamDetailsBusy = true;
console.log("THIS IS EDITTED", editedTeam); //1 filtering out to only get IDs from various groups of users
const editMembersId = editedTeam.members.map((member) => member.id);
const newPOCId = editedTeam.poc.map((member) => member.id);
let currentPOCId = this.team.members.filter(
(member) => member.TeamMember.isTeamLead === true
);
currentPOCId = currentPOCId.map((member) => member.id);
console.log("ID", editMembersId);
const addTeamLeads =[];
const editTeamMembers = [];
//2 sorting throught the new team leads to decide whether or not they need to be added or updated to team leads
for (let i = 0; i < editedTeam.poc.length; i++) {
//adding
if (!editMembersId.includes(editedTeam.poc[i].id)) {
console.log("ADDING", editedTeam.poc[i].name)
addTeamLeads.push({ userId: editedTeam.poc[i].id, isTeamLead: true });
} //upgrading users
else if (
editMembersId.includes(editedTeam.poc[i].id) &&
!currentPOCId.includes(editedTeam.poc[i].id)
) {
console.log("UPGRADING", editedTeam.poc[i].name)
editTeamMembers.push({
userId: editedTeam.poc[i].id,
isTeamLead: true,
});
}
}
//seeing a person needs to be removed from team lead
editTeamMembers.concat(
currentPOCId.map(function (member) {
if (!newPOCId.includes(member)) {
console.log("DEMOTING", member);
return { userId: member, isTeamLead: false };
}
})
);
console.log("addTeamLeads", addTeamLeads);
console.log("REMOVE TEAM LEAD", editTeamMembers);
try { try {
this.team = await TeamService.updateTeam(editedTeam); this.team = await TeamService.updateTeam(
editedTeam,
addTeamLeads,
editTeamMembers
);
// success state // success state
this.snackbars.teamDetails = true; this.snackbars.teamDetails = true;
this.state.showEditDialog = false; this.state.showEditDialog = false;
...@@ -336,7 +381,7 @@ export default { ...@@ -336,7 +381,7 @@ export default {
} }
this.state.isAddingBusy = true; this.state.isAddingBusy = true;
try { try {
await TeamService.addMember(member, this.$route.params.teamId, false); await TeamService.addMembers(member, this.$route.params.teamId, false);
this.memberToAdd = member; this.memberToAdd = member;
this.snackbars.add = true; this.snackbars.add = true;
} catch (e) { } catch (e) {
...@@ -365,7 +410,7 @@ export default { ...@@ -365,7 +410,7 @@ export default {
try { try {
await TeamService.deleteMembers( await TeamService.deleteMembers(
this.deletingMembers, this.deletingMembers.map((item) => item.id),
this.$route.params.teamId this.$route.params.teamId
); );
this.snackbars.delete = true; this.snackbars.delete = true;
......
...@@ -79,15 +79,18 @@ ...@@ -79,15 +79,18 @@
{{ item.name }} {{ item.name }}
</router-link> </router-link>
</template> </template>
<template v-slot:[`item.poc`]="{ item }"> <template v-slot:[`item.poc`]="{ item }" class="team-leads">
<div <div
class="d-flex flex-wrap white-space-nowrap table-no-link" class="d-flex flex-wrap white-space-nowrap table-no-link"
v-for="(lead, index) in item.leads" v-for="(lead, index) in item.leads"
:key="index" :key="index"
> >
<a :href="`mailto:${lead.email}`" target="_blank">{{ <a
lead.name :href="`mailto:${lead.email}`"
}}</a> target="_blank"
class="lead-name"
>{{ lead.name }}</a
>
</div> </div>
</template> </template>
<template v-slot:[`item.startDate`]="{ item }"> <template v-slot:[`item.startDate`]="{ item }">
...@@ -400,6 +403,9 @@ export default { ...@@ -400,6 +403,9 @@ export default {
pointer-events: none; pointer-events: none;
} }
} }
.lead-name {
padding: 12.5px;
}
.v-skeleton-loader__table-row .v-skeleton-loader__table-cell, .v-skeleton-loader__table-row .v-skeleton-loader__table-cell,
.v-skeleton-loader__table-thead .v-skeleton-loader__heading { .v-skeleton-loader__table-thead .v-skeleton-loader__heading {
......
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