diff --git a/src/components/APIErrorCard.vue b/src/components/APIErrorCard.vue index 162756abab62fc5b323c3a0d316a8bea61110c31..b35b6f3b3d42476ce3a80bce0067d8c2920e7793 100644 --- a/src/components/APIErrorCard.vue +++ b/src/components/APIErrorCard.vue @@ -19,7 +19,7 @@ Submit Ticket @@ -39,7 +39,7 @@ Submit Ticket diff --git a/src/components/CourseSelect.vue b/src/components/CourseSelect.vue new file mode 100644 index 0000000000000000000000000000000000000000..0db2adfc39fa45262e0db71c5d303a8b08807a05 --- /dev/null +++ b/src/components/CourseSelect.vue @@ -0,0 +1,175 @@ + + + + diff --git a/src/views/Team.vue b/src/views/Team.vue index 4478231f25a5988808ed616b0d80c65bb670e857..5d10df656d494932604b93cc062a8ca1bebca919 100644 --- a/src/views/Team.vue +++ b/src/views/Team.vue @@ -104,52 +104,82 @@ - - Add new member to {{ team.name }} + +
+ Platform One Smokey +
+

Add to Course

+ + + + + You have + {{ availableCourseSeats }} + available seat reservation{{ + availableCourseSeats === 1 ? "" : "s" + }} + - - + Cancel - Add Member + Add to Course
@@ -190,7 +220,7 @@ Remove Selected
mdi-email Email Selected + + mdi-plus-circle + Add to Course + @@ -252,15 +291,17 @@ import Vue from "vue"; import TeamService from "@/api/services/team"; import UserSelect from "@/components/UserSelect"; +import CourseSelect from "@/components/CourseSelect"; import AddTeam from "@/components/AddTeam"; import { defaultSnackbarTimeout } from "@/config/config"; import inputRules from "@/utils/inputRules"; import Permission from "@/config/user-permissions"; +import TrainingService from "@/api/services/training"; import ErrorMessage from "@/components/APIErrorDialog"; import { SET_ERROR_MESSAGE, SET_ERROR_DIALOG } from "@/store/mutation-types"; export default { - components: { UserSelect, AddTeam, ErrorMessage }, + components: { UserSelect, CourseSelect, AddTeam, ErrorMessage }, data: () => ({ editValid: false, editValues: {}, @@ -276,6 +317,15 @@ export default { teamDetails: false, timeout: defaultSnackbarTimeout, }, + addBusy: false, + addToCourse: { + course: null, + className: "", + startDate: "", + selectedCourse: "", + alreadyRegisteredUsers: [], + }, + startDateList: [], state: { // edit team details flags showEditDialog: false, @@ -290,6 +340,7 @@ export default { isAdding: false, isAddingDuplicate: false, isAddingBusy: false, + isAddingCourse: false, }, headers: [ { text: "Name", value: "name", width: "200px", fixed: true }, @@ -300,12 +351,50 @@ export default { selectedMembers: [], deletingMembers: [], membersToAdd: null, + membersToAddToCourse: null, inputRules, }), async mounted() { this.init(); }, methods: { + cancelAddUsersToCourse() { + this.state.isAddingCourse = false; + this.addToCourse.startDate = ""; + this.membersToAddToCourse = null; + }, + async addUsersToCourse() { + this.addBusy = true; + try { + const courseId = this.coursesByName.find( + ({ startDate }) => this.addToCourse.startDate === startDate + ).id; + await TrainingService.addStudents(courseId, this.membersToAddToCourse); + } catch (error) { + this.$store.commit(SET_ERROR_MESSAGE, error); + } + this.addBusy = false; + this.cancelAddUsersToCourse(); + }, + async onCourseChange(course) { + try { + this.addToCourse.startDate = ""; + if (course && course.name) { + const response = await TrainingService.getCourses({ + q: course.name, + registrations: true, + }); + this.coursesByName = response.courses; + this.startDateList = this.coursesByName + ? this.coursesByName.map(({ startDate }) => startDate) + : []; + } else { + this.startDateList = []; + } + } catch (error) { + this.$store.commit(SET_ERROR_MESSAGE, error); + } + }, async init() { let isTeamLead = false; try { @@ -449,6 +538,13 @@ export default { }, }, computed: { + availableCourseSeats() { + return this.addToCourse?.course?.registeredCount !== undefined && + this.addToCourse?.course?.capacity !== undefined + ? this.addToCourse.course.capacity - + this.addToCourse.course.registeredCount + : null; + }, canEdit() { // TODO: pull this from user info return true; diff --git a/src/views/super-admin/Training.vue b/src/views/super-admin/Training.vue index 06e7d7486a41906c956cc37fa2d2a137d89a99fc..eb6ac4e87d34623fb28c17a0003f771cd302ca22 100644 --- a/src/views/super-admin/Training.vue +++ b/src/views/super-admin/Training.vue @@ -90,6 +90,7 @@ @change="fetchDebounced()" v-model="filter.courseType" label="Filter by Course Type" + class="mt-3" >
@@ -490,10 +491,6 @@ export default { };