2025-12-22 02:36:48 +01:00
|
|
|
<script lang="ts">
|
|
|
|
|
import * as UnderlineTabs from '@cio/ui/custom/underline-tabs';
|
|
|
|
|
import { CoursesPage } from '$features/course/pages';
|
|
|
|
|
import { profile } from '$lib/utils/store/user';
|
|
|
|
|
import { currentOrg } from '$lib/utils/store/org';
|
|
|
|
|
import { t } from '$lib/utils/functions/translations';
|
2026-03-09 11:18:22 +01:00
|
|
|
import { coursesApi } from '$features/course/api';
|
|
|
|
|
import { calcCourseProgress } from '$features/course/utils/functions';
|
2025-12-22 02:36:48 +01:00
|
|
|
|
|
|
|
|
let searchValue = $state('');
|
|
|
|
|
|
2026-03-09 11:18:22 +01:00
|
|
|
function isCourseComplete(course: (typeof coursesApi.enrolledCourses)[number]): boolean {
|
|
|
|
|
const c = course as { exerciseCount?: number; exercisesCompleted?: number };
|
|
|
|
|
const progress = calcCourseProgress({
|
|
|
|
|
lessonsCompleted: course.progressRate ?? 0,
|
|
|
|
|
totalLessons: course.lessonCount ?? 0,
|
|
|
|
|
exercisesCompleted: typeof c.exercisesCompleted === 'number' ? c.exercisesCompleted : 0,
|
|
|
|
|
totalExercises: typeof c.exerciseCount === 'number' ? c.exerciseCount : 0
|
2025-12-22 02:36:48 +01:00
|
|
|
});
|
2026-03-09 11:18:22 +01:00
|
|
|
return progress >= 100;
|
2025-12-22 02:36:48 +01:00
|
|
|
}
|
|
|
|
|
|
2026-03-09 11:18:22 +01:00
|
|
|
const coursesInProgress = $derived(coursesApi.enrolledCourses.filter((course) => !isCourseComplete(course)));
|
|
|
|
|
const coursesComplete = $derived(coursesApi.enrolledCourses.filter((course) => isCourseComplete(course)));
|
|
|
|
|
|
2025-12-22 02:36:48 +01:00
|
|
|
$effect(() => {
|
2026-03-09 11:18:22 +01:00
|
|
|
if (!$profile.id || !$currentOrg.id) return;
|
|
|
|
|
|
|
|
|
|
coursesApi.getEnrolledCourses();
|
2025-12-22 02:36:48 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let tabs = $derived([
|
|
|
|
|
{
|
2026-03-09 11:18:22 +01:00
|
|
|
label: `${$t('my_learning.progress')} (${coursesInProgress.length})`,
|
2025-12-22 02:36:48 +01:00
|
|
|
value: '1'
|
|
|
|
|
},
|
|
|
|
|
{
|
2026-03-09 11:18:22 +01:00
|
|
|
label: `${$t('my_learning.complete')} (${coursesComplete.length})`,
|
2025-12-22 02:36:48 +01:00
|
|
|
value: '2'
|
|
|
|
|
}
|
|
|
|
|
]);
|
|
|
|
|
let currentTab = $state('1');
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<UnderlineTabs.Root bind:value={currentTab}>
|
|
|
|
|
<UnderlineTabs.List>
|
2026-03-30 08:24:55 +01:00
|
|
|
{#each tabs as tab (tab.value)}
|
2025-12-22 02:36:48 +01:00
|
|
|
<UnderlineTabs.Trigger value={tab.value}>
|
|
|
|
|
{$t(tab.label)}
|
|
|
|
|
</UnderlineTabs.Trigger>
|
|
|
|
|
{/each}
|
|
|
|
|
</UnderlineTabs.List>
|
|
|
|
|
<UnderlineTabs.Content value={tabs[0].value}>
|
|
|
|
|
<CoursesPage
|
|
|
|
|
bind:searchValue
|
2026-03-09 11:18:22 +01:00
|
|
|
courses={coursesInProgress}
|
|
|
|
|
emptyDescription={$t('my_learning.any_progress')}
|
|
|
|
|
emptyTitle={$t('my_learning.not_in_progress')}
|
2025-12-22 02:36:48 +01:00
|
|
|
isLMS={true}
|
2026-03-09 11:18:22 +01:00
|
|
|
isLoading={coursesApi.isLoading}
|
2025-12-22 02:36:48 +01:00
|
|
|
/>
|
|
|
|
|
</UnderlineTabs.Content>
|
|
|
|
|
<UnderlineTabs.Content value={tabs[1].value}>
|
|
|
|
|
<CoursesPage
|
|
|
|
|
bind:searchValue
|
2026-03-09 11:18:22 +01:00
|
|
|
courses={coursesComplete}
|
|
|
|
|
emptyDescription={$t('my_learning.any_course')}
|
|
|
|
|
emptyTitle={$t('my_learning.not_completed')}
|
2025-12-22 02:36:48 +01:00
|
|
|
isLMS={true}
|
2026-03-09 11:18:22 +01:00
|
|
|
isLoading={coursesApi.isLoading}
|
2025-12-22 02:36:48 +01:00
|
|
|
/>
|
|
|
|
|
</UnderlineTabs.Content>
|
|
|
|
|
</UnderlineTabs.Root>
|