diff --git a/apps/classroomio-com/src/blog/custom-domain.md b/apps/classroomio-com/src/blog/custom-domain.md
index 0f71f335..5675edb2 100644
--- a/apps/classroomio-com/src/blog/custom-domain.md
+++ b/apps/classroomio-com/src/blog/custom-domain.md
@@ -6,7 +6,7 @@ date: '2024-10-11'
author: Rotimi Best
avatar: /blog/best.jpg
role: Founder
-tags: ['Launch Week', 'Custom Domains']
+tags: ['Launch Week', 'Custom Domains', 'Company Update']
published: true
---
diff --git a/apps/classroomio-com/src/blog/launch-week-001.md b/apps/classroomio-com/src/blog/launch-week-001.md
index 781ec7c9..338b8bc2 100644
--- a/apps/classroomio-com/src/blog/launch-week-001.md
+++ b/apps/classroomio-com/src/blog/launch-week-001.md
@@ -6,7 +6,7 @@ date: '2024-10-07'
author: Rotimi Best
avatar: /blog/best.jpg
role: Founder
-tags: ['Launch Week']
+tags: ['Launch Week', 'Company Update']
published: true
---
diff --git a/apps/classroomio-com/src/blog/self-host.md b/apps/classroomio-com/src/blog/self-host.md
index 2b8db786..0a5ada7d 100644
--- a/apps/classroomio-com/src/blog/self-host.md
+++ b/apps/classroomio-com/src/blog/self-host.md
@@ -6,7 +6,7 @@ date: '2024-10-09'
author: Rotimi Best
avatar: /blog/best.jpg
role: Founder
-tags: ['Launch Week', 'Self-host']
+tags: ['Launch Week', 'Self-host', 'Company Update']
published: true
---
diff --git a/apps/classroomio-com/src/blog/students-analytics.md b/apps/classroomio-com/src/blog/students-analytics.md
new file mode 100644
index 00000000..8714d4ee
--- /dev/null
+++ b/apps/classroomio-com/src/blog/students-analytics.md
@@ -0,0 +1,59 @@
+---
+title: 'Introducing Student Analytics'
+description: 'You can now view analytics on your students, including their last login date, course completion status, and more.'
+imageUrl: 'https://assets.cdn.clsrio.com/blog/students-analytics.png'
+date: '2024-12-31'
+author: Rotimi Best
+avatar: /blog/best.jpg
+role: Founder
+tags: ['Analytics', 'Company Update']
+published: true
+---
+
+
+_ClassroomIO Students Analytics_
+
+As we end the year, we are excited to announce that we have added student analytics to our platform. This is a feature that we have been working on for a while and we are happy to finally launch it. With this new feature, you can better understand the progress of specific students in your course or your organisation.
+
+## Audience Analytics
+
+The audience page as you already know allows you to view the students in your **organisation**. With audience analytics, you can drill into each registered student of yours to understand the last time they logged in, all the courses they are enrolled in and the progress they have made.
+
+
+
+
+
+## Course Student Analytics
+
+Further more, when you go into any course and go to the people tab, you can view all the students currently enrolled in that course. With this new release, you can now also drill into each enrolled student to see their course progress. You can see:
+
+- The last time they logged in
+- The progress they have made in the course
+- The average grade they have received in the course
+- Their submitted assignments and the score they received
+
+
+
+
+
+## What's Next?
+
+We are working on adding more analytics to the platform to help you better understand what's going on in your organisation. You will know the coutries of your students, their overall performance and more.
+
+Give us feedback on what you think about this feature and what you would like to see next on [Discord](https://classroomio.com/discord).
diff --git a/apps/dashboard/src/lib/components/Org/Audience/AudienceList.svelte b/apps/dashboard/src/lib/components/Org/Audience/AudienceList.svelte
index a2d56f60..baac8150 100644
--- a/apps/dashboard/src/lib/components/Org/Audience/AudienceList.svelte
+++ b/apps/dashboard/src/lib/components/Org/Audience/AudienceList.svelte
@@ -41,7 +41,7 @@
{#if cell.key === 'name'}
diff --git a/apps/dashboard/src/routes/courses/[id]/people/+page.svelte b/apps/dashboard/src/routes/courses/[id]/people/+page.svelte
index fd045b6b..2c9c2f24 100644
--- a/apps/dashboard/src/routes/courses/[id]/people/+page.svelte
+++ b/apps/dashboard/src/routes/courses/[id]/people/+page.svelte
@@ -7,17 +7,16 @@
import DeleteConfirmation from '$lib/components/Course/components/People/DeleteConfirmation.svelte';
import InvitationModal from '$lib/components/Course/components/People/InvitationModal.svelte';
import { deleteMemberModal } from '$lib/components/Course/components/People/store';
- import type { Person, ProfileRole } from '$lib/components/Course/components/People/types';
+ import type { ProfileRole } from '$lib/components/Course/components/People/types';
import { group } from '$lib/components/Course/store';
import Select from '$lib/components/Form/Select.svelte';
import IconButton from '$lib/components/IconButton/index.svelte';
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
import RoleBasedSecurity from '$lib/components/RoleBasedSecurity/index.svelte';
- import { snackbar } from '$lib/components/Snackbar/store';
import { ROLE_LABEL, ROLES } from '$lib/utils/constants/roles';
import { t } from '$lib/utils/functions/translations';
- import { deleteGroupMember, updatedGroupMember } from '$lib/utils/services/courses';
+ import { deleteGroupMember } from '$lib/utils/services/courses';
import { profile } from '$lib/utils/store/user';
import type { GroupPerson } from '$lib/utils/types';
import {
@@ -30,22 +29,12 @@
StructuredListRow
} from 'carbon-components-svelte';
import TrashCanIcon from 'carbon-icons-svelte/lib/TrashCan.svelte';
- import copy from 'copy-to-clipboard';
let people: Array = [];
let member: { id?: string; email?: string; profile?: { email: string } } = {};
- let shouldEditMemberId: string | null = null;
let filterBy: ProfileRole = ROLES[0];
let searchValue = '';
- // function setPeople(people: Array) {
- // if (!Array.isArray(people)) return;
-
- // people = (people || []).sort((a, b) => a.role_id - b.role_id);
- // console.log(`people changed`, people);
- // }
-
- // function for the searchbar
function filterPeople(_query, people) {
const query = _query.toLowerCase();
return people.filter((person) => {
@@ -62,14 +51,6 @@
await deleteGroupMember(member.id);
}
- async function editMemberId(person: Person) {
- await updatedGroupMember(
- { assigned_student_id: person.assigned_student_id },
- { id: person.id }
- );
- shouldEditMemberId = null;
- }
-
function sortAndFilterPeople(_people: Array, filterBy: ProfileRole) {
people = (_people || [])
.filter((person) => {
@@ -98,23 +79,6 @@
return `${obscuredUsername}@${domain}`;
}
- function handleEditStudentIdMode(personId: string) {
- shouldEditMemberId = personId;
- }
-
- function copyToClipboard(studentAssignedId: string | null) {
- snackbar.success(`snackbar.people.success.copied`);
-
- if (studentAssignedId) {
- copy(studentAssignedId);
- }
- }
-
- const handleClick = () => {
- const url = $page.url.href + '?add=true';
- goto(url);
- };
-
function gotoPerson(person) {
goto(`${$page.url.href}/${person.profile_id}`);
}
diff --git a/apps/dashboard/src/routes/courses/[id]/people/[personId]/+page.svelte b/apps/dashboard/src/routes/courses/[id]/people/[personId]/+page.svelte
index b88e91c7..f3e64c2c 100644
--- a/apps/dashboard/src/routes/courses/[id]/people/[personId]/+page.svelte
+++ b/apps/dashboard/src/routes/courses/[id]/people/[personId]/+page.svelte
@@ -196,7 +196,7 @@
: 'bg-yellow-200 text-yellow-700'
}`}
>
- {exercise.isCompleted ? $t('analytics.complete') : $t('analytics.incomplete')}
+ {exercise.isCompleted ? $t('analytics.completed') : $t('analytics.incomplete')}
{/key}
diff --git a/apps/dashboard/src/routes/org/[slug]/audience/[...params]/+page.svelte b/apps/dashboard/src/routes/org/[slug]/audience/[...params]/+page.svelte
index 47323bef..380d52e5 100644
--- a/apps/dashboard/src/routes/org/[slug]/audience/[...params]/+page.svelte
+++ b/apps/dashboard/src/routes/org/[slug]/audience/[...params]/+page.svelte
@@ -186,7 +186,7 @@
}`}
>
{course.lessons_count === course.lessons_completed
- ? $t('analytics.complete')
+ ? $t('analytics.completed')
: $t('analytics.incomplete')}