Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pagination follow ups #4741

Merged
merged 7 commits into from
Sep 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ function mountComponent(opts = {}) {
namespaced: true,
getters: {
isNodeInCopyingState: () => jest.fn(),
getContentNodesCount: () =>
jest.fn().mockReturnValue({
resource_count: TOPIC_NODE.resource_count,
assessment_item_count: EXERCISE_NODE.assessment_item_count,
}),
},
},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,11 @@
};
},
computed: {
...mapGetters('contentNode', ['isNodeInCopyingState', 'hasNodeCopyingErrored']),
...mapGetters('contentNode', [
'isNodeInCopyingState',
'hasNodeCopyingErrored',
'getContentNodesCount',
]),
isCompact() {
return this.compact || !this.$vuetify.breakpoint.mdAndUp;
},
Expand All @@ -273,14 +277,15 @@
return { title, kind, src, encoding };
},
subtitle() {
const count = this.getContentNodesCount(this.node.id);
switch (this.node.kind) {
case ContentKindsNames.TOPIC:
return this.$tr('resources', {
value: this.node.resource_count || 0,
value: count?.resource_count || 0,
});
case ContentKindsNames.EXERCISE:
return this.$tr('questions', {
value: this.node.assessment_item_count || 0,
value: count?.assessment_item_count || 0,
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,10 @@
this.hideHTMLScroll(false);
this.$router.push({
name: RouteNames.TREE_VIEW,
params: { nodeId: this.$route.params.nodeId },
params: {
nodeId: this.$route.params.nodeId,
addedCount: this.nodeIds.length,
},
});
},
hideHTMLScroll(hidden) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const GETTERS = {
getContentNodeAncestors: () => jest.fn(),
getContentNode: () => jest.fn(),
isNodeInCopyingState: () => jest.fn(),
getContentNodesCount: () => jest.fn(),
},
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
</template>
</VList>
<div class="pagination-container">
<KButton v-if="more" :disabled="moreLoading" @click="loadMore">
<KButton v-if="displayShowMoreButton" :disabled="moreLoading" @click="loadMore">
{{ $tr('showMore') }}
</KButton>
</div>
Expand Down Expand Up @@ -105,16 +105,37 @@
isRoot() {
return this.rootId === this.parentId;
},
addedCount() {
return this.$route.params.addedCount;
},
displayShowMoreButton() {
// Handle inconsistency with this.more that causes double click on "Show more" to load
// more nodes when new nodes(exercises, folders or file uploads) are added to the channel.
// If the addedCount is equal to the children length, force hide the "Show more" button.
const moreAdditions = this.addedCount !== this.children.length ? this.more : null;
return this.addedCount ? moreAdditions : this.more;
},
},
created() {
this.loading = true;
this.loadChildren({ parent: this.parentId }).then(childrenResponse => {
this.loading = false;
this.more = childrenResponse.more || null;
this.clearContentNodes().then(success => {
if (success) {
this.loadChildren({ parent: this.parentId }).then(childrenResponse => {
this.loading = false;
this.more = childrenResponse.more || null;
const children = childrenResponse?.results || [];
this.setContentNodesCount(children);
});
}
});
},
methods: {
...mapActions('contentNode', ['loadChildren', 'loadContentNodes']),
...mapActions('contentNode', [
'loadChildren',
'loadContentNodes',
'setContentNodesCount',
'clearContentNodes',
]),
goToNodeDetail(nodeId) {
if (
this.$route.params.nodeId === this.parentId &&
Expand Down Expand Up @@ -164,6 +185,8 @@
this.loadContentNodes(this.more).then(response => {
this.more = response.more || null;
this.moreLoading = false;
const children = response?.results || [];
this.setContentNodesCount(children);
});
}
},
Expand Down Expand Up @@ -193,8 +216,8 @@

.pagination-container {
display: flex;
justify-content: flex-start;
margin: 4px;
justify-content: space-evenly;
margin: 32px;
}

</style>
Original file line number Diff line number Diff line change
Expand Up @@ -610,3 +610,17 @@ export async function checkSavingProgress(
export function setQuickEditModal(context, open) {
context.commit('SET_QUICK_EDIT_MODAL', open);
}

export function setContentNodesCount(context, nodes) {
for (const node of nodes) {
const { id, assessment_item_count, resource_count } = node;
context.commit('SET_CONTENTNODES_COUNT', { id, resource_count, assessment_item_count });
}
}

export function clearContentNodes(context) {
return new Promise(resolve => {
context.commit('CLEAR_CONTENTNODES');
resolve(true);
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -365,3 +365,9 @@ export function getQuickEditModalOpen(state) {
return state.quickEditModalOpen;
};
}

export function getContentNodesCount(state) {
return function(nodeId) {
return state.contentNodesCountMap[nodeId];
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,17 @@ export default {
* }
*/
previousStepsMap: {},

/**
* A map of node ids to their respective resource or assessment item nodes counts.
*
* For example,
* {
* '<content_node_id_1>': { 'resourceCount': 2 }
* '<content_node_id_2>': { 'assessmentItemCount': 1 }
* }
*/
contentNodesCountMap: {},
};
},
getters,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,23 @@ export function SAVE_NEXT_STEPS(state, { mappings = [] } = {}) {
ADD_PREVIOUS_STEP(state, mapping);
}
}

/**
* Saves the content node count to vuex state.
* @param state - The vuex state
* @param id - The content node id
* @param assessment_item_count - The count of assessment items
* @param resource_count - The count of resources
*/
export function SET_CONTENTNODES_COUNT(state, { id, assessment_item_count, resource_count }) {
Vue.set(state.contentNodesCountMap, id, { resource_count, assessment_item_count });
}

/**
* Clears all content node data (nodes and associated counts) from the vuex state.
* @param state - The vuex state
*/
export function CLEAR_CONTENTNODES(state) {
state.contentNodesMap = {};
state.contentNodesCountMap = {};
}