7
7
}"
8
8
class =" course"
9
9
>
10
+ <save-course-modal
11
+ :courseCode =" courseCode"
12
+ @close-save-course-modal =" closeSaveCourseModal"
13
+ @save-course =" saveCourse"
14
+ @add-collection =" addCollection"
15
+ v-if =" isSaveCourseOpen"
16
+ />
10
17
<edit-color
11
18
:editedColor =" editedColor"
12
19
@color-course =" colorCourse"
42
49
:isCompactView =" true"
43
50
/>
44
51
</div >
45
- <button v-if =" !isReqCourse" class =" course-dotRow" @click =" openMenu" >
52
+ <button
53
+ v-if =" !isReqCourse && isSemesterCourseCard"
54
+ class =" course-dotRow"
55
+ @click =" openMenu"
56
+ >
46
57
<img src =" @/assets/images/dots/threeDots.svg" alt =" open menu for course card" />
47
58
</button >
59
+ <button
60
+ v-else-if =" !isReqCourse && !isSemesterCourseCard"
61
+ class =" course-trash"
62
+ @click.stop =" deleteCourseFromCollection"
63
+ @mouseover =" hoverTrashIcon"
64
+ @mouseleave =" unhoverTrashIcon"
65
+ >
66
+ <img :src =" trashIcon" alt =" delete course from collection" />
67
+ </button >
48
68
</div >
49
69
<div v-if =" !compact" class =" course-name" >{{ courseObj.name }}</div >
50
70
<div v-if =" !compact" class =" course-info" >
60
80
</div >
61
81
<course-menu
62
82
v-if =" menuOpen"
83
+ :courseObj =" courseObj"
63
84
:semesterIndex =" semesterIndex"
64
85
:isCompact =" compact"
65
86
:courseColor =" courseObj.color"
87
+ :courseCode =" courseObj.code"
66
88
@open-edit-color-modal =" openEditColorModal"
67
89
@delete-course =" deleteCourse"
68
90
@edit-course-credit =" editCourseCredit"
91
+ @open-save-course-modal =" openSaveCourseModal"
69
92
:getCreditRange =" getCreditRange || []"
70
93
v-click-outside =" closeMenuIfOpen"
71
94
/>
76
99
import { CSSProperties , PropType , defineComponent } from ' vue' ;
77
100
import CourseMenu from ' @/components/Modals/CourseMenu.vue' ;
78
101
import CourseCaution from ' @/components/Course/CourseCaution.vue' ;
102
+ import SaveCourseModal from ' @/components/Modals/SaveCourseModal.vue' ;
79
103
import {
80
104
addCourseToBottomBar ,
81
105
reportCourseColorChange ,
82
106
reportSubjectColorChange ,
83
107
} from ' @/components/BottomBar/BottomBarState' ;
108
+ import { isCourseConflict } from ' @/store' ;
84
109
import { clickOutside } from ' @/utilities' ;
85
110
import EditColor from ' ../Modals/EditColor.vue' ;
86
- import { isCourseConflict } from ' @/store' ;
111
+ import trashGrayIcon from ' @/assets/images/trash-gray.svg' ;
112
+ import trashRedIcon from ' @/assets/images/trash.svg' ;
87
113
88
114
export default defineComponent ({
89
- components: { CourseCaution , CourseMenu , EditColor },
115
+ components: { CourseCaution , CourseMenu , EditColor , SaveCourseModal },
90
116
props: {
91
117
courseObj: { type: Object as PropType <FirestoreSemesterCourse >, required: true },
92
118
compact: { type: Boolean , required: true },
@@ -95,6 +121,7 @@ export default defineComponent({
95
121
semesterIndex: { type: Number , required: false , default: 0 },
96
122
season: { type: String , required: false , default: ' ' },
97
123
year: { type: Number , required: false , default: 0 },
124
+ isSemesterCourseCard: { type: Boolean , required: true },
98
125
isSchedGenCourse: { type: Boolean , required: false , default: false },
99
126
},
100
127
emits: {
@@ -107,14 +134,28 @@ export default defineComponent({
107
134
' course-on-click' : (course : FirestoreSemesterCourse ) => typeof course === ' object' ,
108
135
' edit-course-credit' : (credit : number , uniqueID : number ) =>
109
136
typeof credit === ' number' && typeof uniqueID === ' number' ,
137
+ ' save-course' : (
138
+ course : FirestoreSemesterCourse ,
139
+ addedToCollections : string [],
140
+ deletedFromCollection : string []
141
+ ) =>
142
+ typeof course === ' object' &&
143
+ typeof addedToCollections === ' object' &&
144
+ typeof deletedFromCollection === ' object' ,
145
+ ' add-collection' : (name : string ) => typeof name === ' string' ,
146
+ ' delete-course-from-collection' : (courseCode : string ) => typeof courseCode === ' string' ,
110
147
},
111
148
data() {
112
149
return {
113
150
menuOpen: false ,
114
151
stopCloseFlag: false ,
115
152
getCreditRange: this .courseObj .creditRange ,
116
153
isEditColorOpen: false ,
154
+ isSaveCourseOpen: false ,
117
155
editedColor: ' ' ,
156
+ deletingCourse: false ,
157
+ trashIcon: trashGrayIcon , // Default icon
158
+ courseCode: ' ' ,
118
159
};
119
160
},
120
161
computed: {
@@ -155,17 +196,35 @@ export default defineComponent({
155
196
this .menuOpen = false ;
156
197
}
157
198
},
199
+ openSaveCourseModal(courseCode : string ) {
200
+ this .courseCode = courseCode ;
201
+ this .isSaveCourseOpen = true ;
202
+ this .closeMenuIfOpen ();
203
+ },
204
+ closeSaveCourseModal() {
205
+ this .isSaveCourseOpen = false ;
206
+ },
158
207
deleteCourse() {
159
208
this .$emit (' delete-course' , this .courseObj .code , this .courseObj .uniqueID );
160
209
this .closeMenuIfOpen ();
161
210
},
211
+ deleteCourseFromCollection() {
212
+ this .$emit (' delete-course-from-collection' , this .courseObj .code );
213
+ },
162
214
openEditColorModal(color : string ) {
163
215
this .editedColor = color ;
164
216
this .isEditColorOpen = true ;
165
217
},
166
218
closeEditColorModal() {
167
219
this .isEditColorOpen = false ;
168
220
},
221
+ addCollection(name : string ) {
222
+ this .$emit (' add-collection' , name );
223
+ },
224
+ saveCourse(addedToCollections : string [], deletedFromCollections : string []) {
225
+ const course = { ... this .courseObj };
226
+ this .$emit (' save-course' , course , addedToCollections , deletedFromCollections );
227
+ },
169
228
colorCourse(color : string ) {
170
229
this .$emit (' color-course' , color , this .courseObj .uniqueID , this .courseObj .code );
171
230
reportCourseColorChange (this .courseObj .uniqueID , color );
@@ -177,7 +236,7 @@ export default defineComponent({
177
236
this .closeMenuIfOpen ();
178
237
},
179
238
courseOnClick() {
180
- if (! this .menuOpen ) {
239
+ if (! this .menuOpen && ! this . deletingCourse ) {
181
240
this .$emit (' course-on-click' , this .courseObj );
182
241
addCourseToBottomBar (this .courseObj , this .season , this .year );
183
242
}
@@ -187,6 +246,12 @@ export default defineComponent({
187
246
this .closeMenuIfOpen ();
188
247
},
189
248
isCourseConflict ,
249
+ hoverTrashIcon() {
250
+ this .trashIcon = trashRedIcon ;
251
+ },
252
+ unhoverTrashIcon() {
253
+ this .trashIcon = trashGrayIcon ;
254
+ },
190
255
},
191
256
directives: {
192
257
' click-outside' : clickOutside ,
@@ -251,6 +316,18 @@ export default defineComponent({
251
316
}
252
317
}
253
318
319
+ & -trash {
320
+ padding : 8px 0 ;
321
+ display : flex ;
322
+ position : relative ;
323
+
324
+ & :hover ,
325
+ & :active ,
326
+ & :focus {
327
+ cursor : pointer ;
328
+ }
329
+ }
330
+
254
331
& -content {
255
332
width : calc (100% - #{$colored-grabber-width } );
256
333
padding : 0 1rem ;
@@ -297,8 +374,7 @@ export default defineComponent({
297
374
display : flex ;
298
375
align-items : center ;
299
376
}
300
-
301
- & -credits {
377
+ port & -credits {
302
378
white-space : nowrap ;
303
379
}
304
380
0 commit comments