Skip to content

Commit 2ad3592

Browse files
pagination classroom and exercise
1 parent ef6c9e6 commit 2ad3592

File tree

9 files changed

+85
-22
lines changed

9 files changed

+85
-22
lines changed

src/api/classroom.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ import Vue from 'vue'
22
import { ClassroomListRes, ClassroomDetailRes, ClassroomCreateReq, AddStudentReq, RemoveStudentReq, AddReadingExercisesReq, RemoveReadingExercisesReq, ReadingExerciseReportRes, GetStudentReportReq, ClassroomUpdateReq, ResendPasswordEmailReq } from '@/interfaces/api/classroom'
33
import { Classroom } from '@/interfaces/classroom'
44
import { endpoints, replacePk } from './endpoints'
5+
import { PaginationQuery } from '@/interfaces/api/common'
56

67
export const classroom = {
7-
async list (): Promise<ClassroomListRes> {
8-
const res = await Vue.axios.get(endpoints.classroom.classroomList)
8+
async list (query?: PaginationQuery): Promise<ClassroomListRes> {
9+
const res = await Vue.axios.get(endpoints.classroom.classroomList, {
10+
params: query
11+
})
912
return res.data
1013
},
1114

src/api/reading-exercise.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ import Vue from 'vue'
22
import { ReadingExerciseCreateReq, ReadingExerciseDetailRes, ReadingExerciseListRes, ReadingExerciseSubmitAnswersReq, ReadingExerciseUpdateReq } from '@/interfaces/api/reading-exercise'
33
import { ReadingExercise } from '@/interfaces/reading-exercise'
44
import { endpoints, replacePk } from './endpoints'
5+
import { PaginationQuery } from '@/interfaces/api/common'
56

67
export const readingExercise = {
7-
async list (): Promise<ReadingExerciseListRes> {
8-
const res = await Vue.axios.get(endpoints.readingExercise.list)
8+
async list (query: PaginationQuery): Promise<ReadingExerciseListRes> {
9+
const res = await Vue.axios.get(endpoints.readingExercise.list, {
10+
params: query
11+
})
912
return res.data
1013
},
1114

src/interfaces/api/common.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@ export declare interface PaginatedRes {
44
previous: string | null;
55
results?: unknown[];
66
}
7+
8+
export declare interface PaginationQuery {
9+
limit: number;
10+
offset: number;
11+
}

src/mixins/pagination-mixin.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { PaginatedRes, PaginationQuery } from '@/interfaces/api/common'
2+
import { PAGE_SIZE } from '@/utils/constants'
3+
import Vue from 'vue'
4+
import { Component, Watch } from 'vue-property-decorator'
5+
6+
@Component
7+
export class PaginationMixin extends Vue {
8+
page = 1
9+
pagination!: PaginatedRes
10+
11+
get paginationLength (): number {
12+
return Math.ceil(this.pagination.count / PAGE_SIZE)
13+
}
14+
15+
getList (query?: PaginationQuery): void {
16+
throw Error('You must implement `getList` function when using `PaginationMixin`')
17+
}
18+
19+
@Watch('page')
20+
onPageChange (page: number) {
21+
this.getList({
22+
limit: PAGE_SIZE,
23+
offset: (page - 1) * PAGE_SIZE
24+
})
25+
}
26+
}

src/store/classroom.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Api } from '@/api'
22
import { AddReadingExercisesReq, AddStudentReq, ClassroomCreateReq, ClassroomUpdateReq, RemoveReadingExercisesReq, RemoveStudentReq } from '@/interfaces/api/classroom'
3-
import { PaginatedRes } from '@/interfaces/api/common'
3+
import { PaginatedRes, PaginationQuery } from '@/interfaces/api/common'
44
import { Classroom } from '@/interfaces/classroom'
55
import { Module } from 'vuex'
66
import { RootState } from './index'
@@ -90,8 +90,8 @@ export const classroom: Module<ClassroomState, RootState> = {
9090
},
9191

9292
actions: {
93-
async list ({ commit }): Promise<void> {
94-
const data = await Api.classroom.list()
93+
async list ({ commit }, query?: PaginationQuery): Promise<void> {
94+
const data = await Api.classroom.list(query)
9595
const classrooms = data.results
9696
const pagination: PaginatedRes = { ...data }
9797
delete pagination.results

src/store/reading-exercises.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Api } from '@/api'
2-
import { PaginatedRes } from '@/interfaces/api/common'
2+
import { PaginatedRes, PaginationQuery } from '@/interfaces/api/common'
33
import { ReadingExerciseCreateReq, ReadingExerciseUpdateReq } from '@/interfaces/api/reading-exercise'
44
import { ReadingQuestionCreateReq, ReadingQuestionUpdateReq } from '@/interfaces/api/reading-question'
55
import { ReadingExercise } from '@/interfaces/reading-exercise'
@@ -74,8 +74,8 @@ export const readingExercise: Module<ReadingExerciseState, RootState> = {
7474
},
7575

7676
actions: {
77-
async list ({ commit }): Promise<void> {
78-
const data = await Api.readingExercise.list()
77+
async list ({ commit }, query: PaginationQuery): Promise<void> {
78+
const data = await Api.readingExercise.list(query)
7979
const readingExercises = data.results
8080
const pagination: PaginatedRes = { ...data }
8181
delete pagination.results

src/utils/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const PAGE_SIZE = 2

src/views/classroom/ClassroomList.vue

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
</v-row>
4747
<v-divider class="mt-3"></v-divider>
4848
</v-card-subtitle>
49+
4950
<v-card-text>
5051
<v-row>
5152
<v-col
@@ -66,28 +67,40 @@
6667
</v-col>
6768
</v-row>
6869
</v-card-text>
70+
71+
<v-card-actions>
72+
<v-spacer></v-spacer>
73+
<v-pagination
74+
v-model="page"
75+
:length="paginationLength"
76+
total-visible="7"
77+
></v-pagination>
78+
</v-card-actions>
6979
</v-card>
7080
</v-container>
7181
</template>
7282

7383
<script lang="ts">
84+
import { PaginationQuery } from '@/interfaces/api/common'
7485
import { Classroom } from '@/interfaces/classroom'
7586
import { unexpectedExc } from '@/utils'
76-
import { Vue, Component, Watch } from 'vue-property-decorator'
87+
import { Mixins, Component, Watch } from 'vue-property-decorator'
7788
import { Location } from 'vue-router'
7889
import { mapGetters, mapState } from 'vuex'
90+
import { PaginationMixin } from '@/mixins/pagination-mixin'
7991
8092
@Component({
8193
computed: {
8294
...mapState('classroom', [
83-
'classrooms'
95+
'classrooms',
96+
'pagination'
8497
]),
8598
...mapGetters('account', [
8699
'isTeacher'
87100
])
88101
}
89102
})
90-
export default class ClassroomList extends Vue {
103+
export default class ClassroomList extends Mixins(PaginationMixin) {
91104
// eslint-disable-next-line no-undef
92105
[key: string]: unknown
93106
@@ -116,7 +129,7 @@ export default class ClassroomList extends Vue {
116129
}
117130
118131
created (): void {
119-
this.listClassroom()
132+
this.getList()
120133
}
121134
122135
getClassroomLink (classroom: Classroom): Location {
@@ -142,10 +155,10 @@ export default class ClassroomList extends Vue {
142155
*/
143156
loading = true
144157
145-
listClassroom (): void {
158+
getList (query?: PaginationQuery): void {
146159
this.loading = true
147160
148-
this.$store.dispatch('classroom/list')
161+
this.$store.dispatch('classroom/list', query)
149162
.then(() => {
150163
this.localClassrooms = this.classrooms
151164
})

src/views/reading-exercise/ReadingExerciseList.vue

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,24 +77,36 @@
7777
</v-col>
7878
</v-row>
7979
</v-card-text>
80+
81+
<v-card-actions>
82+
<v-spacer></v-spacer>
83+
<v-pagination
84+
v-model="page"
85+
:length="paginationLength"
86+
total-visible="7"
87+
></v-pagination>
88+
</v-card-actions>
8089
</v-card>
8190
</v-container>
8291
</template>
8392

8493
<script lang="ts">
94+
import { PaginationQuery } from '@/interfaces/api/common'
8595
import { ReadingExercise } from '@/interfaces/reading-exercise'
96+
import { PaginationMixin } from '@/mixins/pagination-mixin'
8697
import { unexpectedExc } from '@/utils'
87-
import { Vue, Component, Watch } from 'vue-property-decorator'
98+
import { Component, Watch, Mixins } from 'vue-property-decorator'
8899
import { mapState } from 'vuex'
89100
90101
@Component({
91102
computed: {
92103
...mapState('readingExercise', {
93-
exercises: 'readingExercises'
104+
exercises: 'readingExercises',
105+
pagination: 'exercisePagination'
94106
})
95107
}
96108
})
97-
export default class ReadingExerciseList extends Vue {
109+
export default class ReadingExerciseList extends Mixins(PaginationMixin) {
98110
// eslint-disable-next-line no-undef
99111
[key: string]: unknown
100112
@@ -114,7 +126,7 @@ export default class ReadingExerciseList extends Vue {
114126
}
115127
116128
created (): void {
117-
this.listExercise()
129+
this.getList()
118130
}
119131
120132
get exercisesCol1 (): ReadingExercise[] {
@@ -130,10 +142,10 @@ export default class ReadingExerciseList extends Vue {
130142
*/
131143
loading = false
132144
133-
listExercise (): void {
145+
getList (query?: PaginationQuery): void {
134146
this.loading = true
135147
136-
this.$store.dispatch('readingExercise/list')
148+
this.$store.dispatch('readingExercise/list', query)
137149
.then(() => {
138150
this.localExercises = this.exercises
139151
})

0 commit comments

Comments
 (0)