diff --git a/client/src/stores/learningPath.ts b/client/src/stores/learningPath.ts index 8759565f..0f3c5668 100644 --- a/client/src/stores/learningPath.ts +++ b/client/src/stores/learningPath.ts @@ -1,24 +1,69 @@ import * as log from 'loglevel'; import {defineStore} from 'pinia' +import * as _ from 'lodash'; import type {LearningPath, Topic} from '@/types' import {itGet} from '@/fetchHelpers'; import {Circle} from '@/services/circle'; +import learningPathDiagram from "@/components/circle/LearningPathDiagram.vue"; export type LearningPathStoreState = { learningPath: LearningPath | undefined; } + +function getLastCompleted(completionData: any) { + return _.filter(_.orderBy(completionData, ['updated_at'], 'desc'), c =>{return c.completed && c.page_type === "learnpath.LearningContent" })[0] +} + + +function getFirstLearningContent(lastCopleted, learningPathData) { + const circles = _.filter(learningPathData.children, {'type': 'learnpath.Circle'}) + + let currentCircle = Circle.fromJson(circles[0]) + const currentLearningUnit = currentCircle.flatChildren[0] + let currentLearningSequence = currentLearningUnit.parentLearningSequence + return [currentCircle, currentLearningSequence, currentLearningUnit] +} + +function getNextLearningContent(lastCopleted, learningPathData) { + + let currentCircle, currentLearningSequence, currentLearningUnit + + currentLearningUnit = getFirstLearningContent(lastCopleted, learningPathData) + + if (lastCopleted) { + const circles = _.filter(learningPathData.children, {'type': 'learnpath.Circle'}) + _.forEach(circles, circle => { + _.forEach(Circle.fromJson(circle).learningSequences, learningSequence => { + _.forEach(learningSequence.learningUnits, learningUnit => { + _.forEach(learningUnit.learningContents, content => { + if (lastCopleted.page_key === content.translation_key) { + currentCircle = Circle.fromJson(circle) + currentLearningSequence = learningSequence + currentLearningUnit = content + + } + }) + }) + }) + }) + currentLearningUnit = [currentCircle, currentLearningSequence, currentLearningUnit] + } + return currentLearningUnit +} + + export const useLearningPathStore = defineStore({ id: 'learningPath', state: () => { return { learningPath: undefined, + } as LearningPathStoreState; }, - getters: { - }, + getters: {}, actions: { async loadLearningPath(slug: string, reload = false) { if (this.learningPath && !reload) { @@ -30,7 +75,17 @@ export const useLearningPathStore = defineStore({ this.learningPath = learningPathData; + if (this.learningPath) { + this.learningPath.lastCompleted = getLastCompleted(completionData) + const nextLearningContent = getNextLearningContent(this.learningPath.lastCompleted, learningPathData) + + console.log('nextLearningContent', nextLearningContent) + this.learningPath.nextCircle = nextLearningContent[0] + this.learningPath.nextLearningSequence = nextLearningContent[1] + this.learningPath.nextLearningUnit = nextLearningContent[2] + + this.learningPath.topics = []; this.learningPath.circles = []; diff --git a/client/src/types.ts b/client/src/types.ts index f32bea45..3a8ff19b 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -108,6 +108,11 @@ export interface LearningPath extends LearningWagtailPage { children: LearningPathChild[]; topics: Topic[]; circles: Circle[]; + lastCompleted: CircleCompletion; + nextCircle: Circle; + nextLearningSequence: LearningSequence; + nextLearningUnit: LearningContent; + } export interface CircleCompletion { @@ -122,13 +127,13 @@ export interface CircleCompletion { json_data: any; } -export interface CircleDiagramData { - index: number - title: string - icon: string - startAngle: number - endAngle: number - arrowStartAngle: number - arrowEndAngle: number - done: boolean +export interface CircleDiagramData { + index: number + title: string + icon: string + startAngle: number + endAngle: number + arrowStartAngle: number + arrowEndAngle: number + done: boolean } diff --git a/client/src/views/LearningPathView.vue b/client/src/views/LearningPathView.vue index 0d1da953..63462132 100644 --- a/client/src/views/LearningPathView.vue +++ b/client/src/views/LearningPathView.vue @@ -2,7 +2,7 @@ import * as log from 'loglevel'; -import {onMounted} from 'vue' +import {computed, onMounted} from 'vue' import {useLearningPathStore} from '@/stores/learningPath'; import {useUserStore} from '@/stores/user'; @@ -19,16 +19,22 @@ const props = defineProps<{ const learningPathStore = useLearningPathStore(); const userStore = useUserStore(); + +const continueRoute = computed(() => { + return "/circle/" + learningPathStore.learningPath.nextCircle.slug + "/"; +}) + onMounted(async () => { log.info('LearningPathView mounted'); await learningPathStore.loadLearningPath(props.learningPathSlug); + console.log(learningPathStore) });