Skip to content

Commit 7436a6a

Browse files
committed
feat: filterable
1 parent 3677bee commit 7436a6a

4 files changed

Lines changed: 93 additions & 38 deletions

File tree

components/ClassesFilters.vue

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<v-row justify="center" align="center">
33
<v-col cols="12" sm="12" md="10" lg="8">
4-
<v-card>
4+
<v-card :loading="loading">
55
<v-card-title> Filters </v-card-title>
66
<v-card-actions>
77
<v-container fluid>
@@ -11,6 +11,7 @@
1111
v-model="selectedDepartment"
1212
:items="Object.keys(departments)"
1313
label="Department"
14+
@input="$emit('department:change', $event)"
1415
></v-select>
1516
</v-col>
1617

@@ -29,7 +30,10 @@
2930
<v-col class="d-flex" cols="12" sm="4">
3031
<v-select
3132
:items="semsters"
33+
v-model="selectedSemsters"
3234
label="Semsters"
35+
:clearable="true"
36+
:deletable-chips="true"
3337
:disabled="!selectedMajor"
3438
@input="$emit('semsters:change', $event)"
3539
chips
@@ -43,16 +47,19 @@
4347
</v-col>
4448
</v-row>
4549
</template>
46-
<script lang="ts">
50+
<script>
4751
export default {
4852
props: {
4953
departments: { type: Object },
54+
loading: { type: Boolean, default: false },
55+
selectedSemstersProp: { type: Array },
5056
},
51-
emits: ['major:change', 'semsters:change'],
57+
emits: ['major:change', 'semsters:change', 'department:change'],
5258
data() {
5359
return {
5460
selectedDepartment: null,
5561
selectedMajor: null,
62+
selectedSemsters: this.selectedSemstersProp,
5663
}
5764
},
5865
computed: {

components/ClassesList.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
22
<v-row justify="center" align="center">
33
<v-col cols="12" sm="12" md="10" lg="8">
4-
<v-card>
4+
<v-card :disabled="loading">
55
<v-card-title>
66
<v-text-field
77
v-model="search"

components/snackBar.vue

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<template>
2+
<v-snackbar v-model="snackbar" :timeout="timeout">
3+
{{ text }}
4+
5+
<template v-slot:action="{ attrs }">
6+
<v-btn color="blue" text v-bind="attrs" @click="snackbar = false">
7+
Close
8+
</v-btn>
9+
</template>
10+
</v-snackbar>
11+
</template>
12+
13+
<script>
14+
export default {
15+
props: {
16+
active: { type: Boolean, default: false },
17+
timeout: { type: Number, default: 3000 },
18+
text: { type: String, required: true },
19+
},
20+
data() {
21+
return {
22+
snackbar: false,
23+
}
24+
},
25+
watch: {
26+
active(val, oldVal) {
27+
this.snackbar = val
28+
},
29+
},
30+
}
31+
</script>

pages/index.vue

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,21 @@
22
<div>
33
<!-- <ClassesCalendar /> -->
44
<!-- <ClassesSelectedStats /> -->
5-
<ClassesFilters :departments="departments" />
6-
<ClassesList :classes="classes" />
5+
<ClassesFilters
6+
@major:change="majorChange($event)"
7+
@department:change="departmentChange($event)"
8+
@semsters:change="selectedSemsters = $event"
9+
:selectedSemstersProp="selectedSemsters"
10+
:departments="departments"
11+
/>
12+
<ClassesList :loading="loadingClasses" :classes="filteredClasses" />
13+
<snackBar :text="snackbarText" :active="snackbarActive" />
714
</div>
815
</template>
916

1017
<script>
18+
const axios = require('axios')
19+
1120
export default {
1221
data() {
1322
return {
@@ -38,39 +47,47 @@ export default {
3847
{ name: 'Networking', abbrv: 'Net', sems: [...Array(9).keys()] },
3948
],
4049
},
41-
classes: [
42-
{
43-
code: '00000',
44-
name: 'Course Name',
45-
crn: '01123',
46-
section: '03',
47-
days: 'MWT',
48-
time: '09:30-12:00',
49-
instructor: 'Ins Name',
50-
semster_index: 1,
51-
},
52-
{
53-
code: '00010',
54-
name: 'Course Name',
55-
crn: '01121',
56-
section: '03',
57-
days: 'MWT',
58-
time: '09:30-12:00',
59-
instructor: 'Ins Name',
60-
semster_index: 1,
61-
},
62-
{
63-
code: '00001',
64-
name: 'Course 2',
65-
crn: '01122',
66-
section: '01',
67-
days: 'MWT',
68-
time: '09:30-12:00',
69-
instructor: 'Ins Name2',
70-
semster_index: 2,
71-
},
72-
],
50+
rawClasses: [],
51+
selectedDepartment: null,
52+
selectedMajor: null,
53+
selectedSemsters: [0],
54+
loadingClasses: false,
55+
snackbarText: '',
56+
snackbarActive: false,
7357
}
7458
},
59+
computed: {
60+
filteredClasses() {
61+
return this.rawClasses.filter((c) =>
62+
this.selectedSemsters.includes(c.semster_index)
63+
)
64+
},
65+
},
66+
methods: {
67+
majorChange(e) {
68+
this.selectedMajor = e.abbrv
69+
this.snackbarActive = false
70+
this.getCP()
71+
},
72+
departmentChange(e) {
73+
this.selectedDepartment = e
74+
},
75+
// gets Classs for Plan/Major
76+
async getCP() {
77+
let url = `/CP/${this.selectedDepartment}/${this.selectedMajor}.json`
78+
this.loadingClasses = true
79+
try {
80+
const response = await axios.get(url)
81+
this.rawClasses = response.data
82+
this.loadingClasses = false
83+
} catch (error) {
84+
this.snackbarActive = true
85+
this.snackbarText = `${this.selectedDepartment}, ${this.selectedMajor} Not yet supported!`
86+
this.loadingClasses = false
87+
this.rawClasses = []
88+
console.log(error) //TODO: handle error
89+
}
90+
},
91+
},
7592
}
7693
</script>

0 commit comments

Comments
 (0)