diff --git a/messages/en.json b/messages/en.json index 7e4a072..4886664 100644 --- a/messages/en.json +++ b/messages/en.json @@ -559,6 +559,17 @@ "admin_tasks_remove_cancel_button": "Cancel", "admin_tasks_remove_success": "Task deleted successfully!", "admin_tasks_remove_error": "Failed to delete task", + "admin_groups_title": "Groups Management", + "admin_groups_all_groups": "All Groups", + "admin_groups_card_created": "Created:", + "admin_groups_card_updated": "Updated:", + "admin_groups_card_created_by": "Created By:", + "admin_groups_card_id_prefix": "#", + "admin_groups_card_user_prefix": "User #", + "admin_groups_card_view_details": "View Group", + "admin_groups_load_error_title": "Failed to load groups", + "admin_groups_no_groups_title": "No groups yet", + "admin_groups_no_groups_description": "Create your first group to get started", "task_collaborators_add_title": "Add Collaborator", "task_collaborators_add_description": "Add a new collaborator to this task", "task_collaborators_add_dialog_title": "Add Collaborator", diff --git a/messages/pl.json b/messages/pl.json index ef78b41..a1bc1c0 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -559,6 +559,17 @@ "admin_tasks_remove_cancel_button": "Anuluj", "admin_tasks_remove_success": "Zadanie zostało pomyślnie usunięte!", "admin_tasks_remove_error": "Nie udało się usunąć zadania", + "admin_groups_title": "Zarządzanie Grupami", + "admin_groups_all_groups": "Wszystkie Grupy", + "admin_groups_card_created": "Utworzono:", + "admin_groups_card_updated": "Zaktualizowano:", + "admin_groups_card_created_by": "Utworzone przez:", + "admin_groups_card_id_prefix": "#", + "admin_groups_card_user_prefix": "Użytkownik #", + "admin_groups_card_view_details": "Zobacz Grupę", + "admin_groups_load_error_title": "Nie udało się załadować grup", + "admin_groups_no_groups_title": "Brak grup", + "admin_groups_no_groups_description": "Utwórz swoją pierwszą grupę, aby zacząć", "task_collaborators_add_title": "Dodaj Współpracownika", "task_collaborators_add_description": "Dodaj nowego współpracownika do tego zadania", "task_collaborators_add_dialog_title": "Dodaj Współpracownika", diff --git a/src/lib/components/dashboard/admin/groups/GroupsList.svelte b/src/lib/components/dashboard/admin/groups/GroupsList.svelte new file mode 100644 index 0000000..59e1181 --- /dev/null +++ b/src/lib/components/dashboard/admin/groups/GroupsList.svelte @@ -0,0 +1,16 @@ + + +
+ {#each groups as group (group.id)} + + {/each} +
diff --git a/src/lib/components/dashboard/admin/groups/index.ts b/src/lib/components/dashboard/admin/groups/index.ts new file mode 100644 index 0000000..47bd09b --- /dev/null +++ b/src/lib/components/dashboard/admin/groups/index.ts @@ -0,0 +1 @@ +export { default as GroupsList } from './GroupsList.svelte'; diff --git a/src/lib/components/dashboard/groups/AdminGroupCard.svelte b/src/lib/components/dashboard/groups/AdminGroupCard.svelte new file mode 100644 index 0000000..b08a08f --- /dev/null +++ b/src/lib/components/dashboard/groups/AdminGroupCard.svelte @@ -0,0 +1,77 @@ + + + + +
+ + +
+ + {m.admin_groups_card_id_prefix()}{group.id} + +
+ + + {group.name} + +
+ + + +
+
+ + {m.admin_groups_card_created()} + {formatDate(group.createdAt)} +
+ +
+ + {m.admin_groups_card_updated()} + {formatDate(group.updatedAt)} +
+ +
+ + {m.admin_groups_card_created_by()} + {m.admin_groups_card_user_prefix()}{group.createdBy} +
+
+ + +
+ +
+
+
diff --git a/src/lib/dto/group.ts b/src/lib/dto/group.ts new file mode 100644 index 0000000..b3142f4 --- /dev/null +++ b/src/lib/dto/group.ts @@ -0,0 +1,7 @@ +export interface Group { + id: number; + name: string; + createdAt: string; + updatedAt: string; + createdBy: number; +} diff --git a/src/lib/services/GroupsManagementService.ts b/src/lib/services/GroupsManagementService.ts new file mode 100644 index 0000000..69da877 --- /dev/null +++ b/src/lib/services/GroupsManagementService.ts @@ -0,0 +1,30 @@ +import { ApiError, type ApiService } from './ApiService'; +import type { ApiResponse } from '../dto/response'; +import type { Group } from '../dto/group'; + +export class GroupsManagementService { + constructor(private apiClient: ApiService) {} + + async getGroups(): Promise<{ + success: boolean; + status: number; + data?: Group[]; + error?: string; + }> { + try { + const response = await this.apiClient.get>({ + url: '/groups-management/groups' + }); + return { success: true, data: response.data, status: 200 }; + } catch (error) { + if (error instanceof ApiError) { + return { + success: false, + error: error.getApiMessage(), + status: error.getStatus() + }; + } + throw error; + } + } +} diff --git a/src/lib/services/index.ts b/src/lib/services/index.ts index 444f203..843b69e 100644 --- a/src/lib/services/index.ts +++ b/src/lib/services/index.ts @@ -6,6 +6,7 @@ export { ContestsManagementService, createContestsManagementService } from './ContestsManagementService'; +export { GroupsManagementService } from './GroupsManagementService'; export { SubmissionService } from './SubmissionService'; export { TaskService, createTaskService } from './TaskService'; export { TasksManagementService } from './TasksManagementService'; diff --git a/src/routes/dashboard/teacher/groups/+page.svelte b/src/routes/dashboard/teacher/groups/+page.svelte new file mode 100644 index 0000000..69811e8 --- /dev/null +++ b/src/routes/dashboard/teacher/groups/+page.svelte @@ -0,0 +1,38 @@ + + +
+
+

{m.admin_groups_title()}

+
+ + +
+

{m.admin_groups_all_groups()}

+ + {#if groupsQuery.error} + groupsQuery.refresh()} + /> + {:else if groupsQuery.loading} + + {:else if groupsQuery.current && groupsQuery.current.length === 0} + + {:else if groupsQuery.current} + + {/if} +
+
diff --git a/src/routes/dashboard/teacher/groups/groups.remote.ts b/src/routes/dashboard/teacher/groups/groups.remote.ts new file mode 100644 index 0000000..dfdd025 --- /dev/null +++ b/src/routes/dashboard/teacher/groups/groups.remote.ts @@ -0,0 +1,17 @@ +import { query, getRequestEvent } from '$app/server'; +import { createApiClient } from '$lib/services/ApiService'; +import { GroupsManagementService } from '$lib/services/GroupsManagementService'; +import { error } from '@sveltejs/kit'; + +export const getGroups = query(async () => { + const event = getRequestEvent(); + const apiClient = createApiClient(event.cookies); + const groupsManagementService = new GroupsManagementService(apiClient); + + const result = await groupsManagementService.getGroups(); + if (!result.success || !result.data) { + error(result.status, { message: result.error || 'Failed to fetch groups.' }); + } + + return result.data; +});