Skip to content

Commit 0ad295e

Browse files
paginate reading exercises
1 parent 2ad3592 commit 0ad295e

File tree

4 files changed

+92
-31
lines changed

4 files changed

+92
-31
lines changed

src/store/classroom.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ export const classroom: Module<ClassroomState, RootState> = {
153153

154154
if (pk === undefined) return
155155

156-
console.log(payload)
157156
await Api.classroom.addReadingExercises(pk, payload)
158157
payload.forEach(exercise => {
159158
commit('ADD_READING_EXERCISES_TO_CURRENT_CLASSROOM', exercise)

src/views/classroom/ClassroomCreate.vue

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,7 @@
2626
<p class="font-weight-bold mt-7 mb-0">Add reading exercises</p>
2727
<p class="caption--text">Choose the exercises you want to use in this class.</p>
2828

29-
<v-progress-circular
30-
v-if="loadingExercises"
31-
indeterminate
32-
color="primary"
33-
></v-progress-circular>
34-
35-
<p v-else-if="exercises.length === 0">
29+
<p v-if="exercises.length === 0">
3630
You haven't created any reading exercises yet.
3731
<router-link :to="{ name: 'ReadingExerciseCreate' }">
3832
Create now
@@ -57,7 +51,7 @@
5751

5852
<v-row
5953
no-gutters
60-
class="mt-3"
54+
class="my-3"
6155
>
6256
<v-col
6357
v-for="exercise of localExercises"
@@ -72,6 +66,23 @@
7266
></v-checkbox>
7367
</v-col>
7468
</v-row>
69+
70+
<div v-if="readingPagination.next !== null">
71+
<v-progress-circular
72+
v-if="loadingExercises"
73+
indeterminate
74+
color="primary"
75+
width="2"
76+
size="18"
77+
></v-progress-circular>
78+
<a
79+
v-else
80+
href="#"
81+
@click="loadMoreReading"
82+
>
83+
Load more
84+
</a>
85+
</div>
7586
</div>
7687
</div>
7788

@@ -98,8 +109,10 @@
98109

99110
<script lang="ts">
100111
import { AddReadingExercisesReq, ClassroomCreateReq } from '@/interfaces/api/classroom'
112+
import { PaginatedRes, PaginationQuery } from '@/interfaces/api/common'
101113
import { ReadingExercise } from '@/interfaces/reading-exercise'
102114
import { unexpectedExc } from '@/utils'
115+
import { PAGE_SIZE } from '@/utils/constants'
103116
import { assertErrCode, status } from '@/utils/status-codes'
104117
import { Vue, Component } from 'vue-property-decorator'
105118
import { mapState } from 'vuex'
@@ -111,7 +124,8 @@ declare interface LocalExercise extends ReadingExercise {
111124
@Component({
112125
computed: {
113126
...mapState('readingExercise', {
114-
exercises: 'readingExercises'
127+
exercises: 'readingExercises',
128+
readingPagination: 'exercisePagination'
115129
})
116130
}
117131
})
@@ -130,21 +144,24 @@ export default class ClassroomCreate extends Vue {
130144
*/
131145
exercises!: ReadingExercise[]
132146
localExercises: LocalExercise[] = []
147+
readingPagination!: PaginatedRes
133148
loadingExercises = false
149+
page = 1
134150
135151
created (): void {
136152
this.listExercise()
137153
}
138154
139-
listExercise (): void {
155+
listExercise (query?: PaginationQuery): void {
140156
this.loadingExercises = true
141157
142-
this.$store.dispatch('readingExercise/list')
158+
this.$store.dispatch('readingExercise/list', query)
143159
.then(() => {
144-
this.localExercises = this.exercises.map(exercise => ({
160+
this.localExercises.push(...this.exercises.map(exercise => ({
145161
...exercise,
146162
isChosen: false
147-
}))
163+
})))
164+
this.page++
148165
})
149166
.catch(unexpectedExc)
150167
.finally(() => {
@@ -155,6 +172,13 @@ export default class ClassroomCreate extends Vue {
155172
/**
156173
* Select reading exercises
157174
*/
175+
loadMoreReading (): void {
176+
this.listExercise({
177+
limit: PAGE_SIZE,
178+
offset: (this.page - 1) * PAGE_SIZE
179+
})
180+
}
181+
158182
selectAll (): void {
159183
this.localExercises.forEach(exercise => { exercise.isChosen = true })
160184
}

src/views/classroom/ClassroomExercisesReadingTeacher.vue

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<v-card-subtitle>
77
Choose the exercises you want to use in this class.
88
</v-card-subtitle>
9+
910
<v-card-text>
1011
<v-progress-circular
1112
v-if="loading"
@@ -38,7 +39,7 @@
3839

3940
<v-row
4041
no-gutters
41-
class="mt-3"
42+
class="my-3"
4243
>
4344
<v-col
4445
v-for="exercise of exercises"
@@ -64,24 +65,45 @@
6465
</v-col>
6566
</v-row>
6667

67-
<v-btn
68-
color="primary"
69-
class="mt-5"
70-
:loading="saving"
71-
@click="save"
72-
>
73-
Save
74-
</v-btn>
68+
<div v-if="pagination.next !== null">
69+
<v-progress-circular
70+
v-if="loadingMore"
71+
indeterminate
72+
color="primary"
73+
width="2"
74+
size="18"
75+
></v-progress-circular>
76+
<a
77+
v-else
78+
href="#"
79+
@click="loadMoreReading"
80+
>
81+
Load more
82+
</a>
83+
</div>
7584
</div>
7685
</v-card-text>
86+
87+
<v-card-actions>
88+
<v-btn
89+
color="primary"
90+
:loading="saving"
91+
@click="save"
92+
min-width="110"
93+
>
94+
Save
95+
</v-btn>
96+
</v-card-actions>
7797
</v-card>
7898
</template>
7999

80100
<script lang="ts">
81101
import { AddReadingExercisesReq, RemoveReadingExercisesReq } from '@/interfaces/api/classroom'
102+
import { PaginatedRes, PaginationQuery } from '@/interfaces/api/common'
82103
import { Classroom } from '@/interfaces/classroom'
83104
import { ReadingExercise } from '@/interfaces/reading-exercise'
84105
import { unexpectedExc } from '@/utils'
106+
import { PAGE_SIZE } from '@/utils/constants'
85107
import { Vue, Component } from 'vue-property-decorator'
86108
import { mapState } from 'vuex'
87109
@@ -92,42 +114,59 @@ declare interface _Exercise extends ReadingExercise {
92114
@Component({
93115
computed: {
94116
...mapState('readingExercise', {
95-
exercisesFromStore: 'readingExercises'
117+
exercisesFromStore: 'readingExercises',
118+
pagination: 'exercisePagination'
96119
}),
97120
...mapState('classroom', {
98121
classroom: 'currentClassroom'
99122
})
100123
}
101124
})
102125
export default class ClassroomExercisesReadingTeacher extends Vue {
126+
// eslint-disable-next-line no-undef
127+
[index: string]: unknown
128+
103129
loading = false
130+
loadingMore = false
104131
exercisesFromStore!: ReadingExercise[]
105132
exercises: _Exercise[] = []
133+
pagination!: PaginatedRes
106134
classroom!: Classroom
135+
page = 1
107136
108137
created (): void {
109138
this.setExercises()
110139
}
111140
112-
setExercises (): void {
113-
this.loading = true
114-
this.$store.dispatch('readingExercise/list')
141+
setExercises (query?: PaginationQuery, loadingProp?: string): void {
142+
if (loadingProp === undefined) loadingProp = 'loading'
143+
144+
this[loadingProp] = true
145+
this.$store.dispatch('readingExercise/list', query)
115146
.then(() => {
116147
const existingPks = this.classroom.reading_exercises.map(exercise => exercise.pk)
117-
this.exercises = this.exercisesFromStore.map(exercise => {
148+
this.exercises.push(...this.exercisesFromStore.map(exercise => {
118149
const data = {
119150
...exercise,
120151
isChosen: existingPks.includes(exercise.pk)
121152
}
122153
return data
123-
})
154+
}))
155+
this.page++
124156
})
125157
.catch(unexpectedExc)
126158
.finally(() => {
127-
this.loading = false
159+
this[loadingProp as string] = false
128160
})
129161
}
130162
163+
loadMoreReading (): void {
164+
this.setExercises({
165+
limit: PAGE_SIZE,
166+
offset: (this.page - 1) * PAGE_SIZE
167+
}, 'loadingMore')
168+
}
169+
131170
saving = false
132171
133172
save (): void {

src/views/classroom/ClassroomStudents.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ export default class ClassroomStudents extends Vue {
167167
const adding = this.$route.query.adding
168168
if (adding === 'true') {
169169
this.showAddStudent = true
170-
console.log(this.showAddStudent)
171170
}
172171
}
173172

0 commit comments

Comments
 (0)