diff --git a/messages/en.json b/messages/en.json index 7e4a072..d7cb273 100644 --- a/messages/en.json +++ b/messages/en.json @@ -98,6 +98,7 @@ "admin_tasks_card_updated": "Updated:", "admin_tasks_card_user_prefix": "User #", "admin_tasks_card_view_details": "View Task", + "admin_tasks_card_visible_to_users": "Visible to Users", "admin_tasks_dialog_description": "Upload a task archive to the FileStorage service. The archive should contain all necessary files for the task.", "admin_tasks_dialog_title": "Upload Task", "admin_tasks_form_archive_label": "Task Archive", @@ -106,6 +107,24 @@ "admin_tasks_form_title_label": "Task Title", "admin_tasks_form_title_placeholder": "Enter task title", "admin_tasks_form_upload": "Upload", + "admin_tasks_form_update": "Update", + "admin_tasks_form_updating": "Updating...", + "admin_tasks_form_visible_label": "Make task visible to all users", + "admin_tasks_form_visible_description": "When checked, this task will be visible to all users immediately", + "admin_tasks_visibility_confirm_title": "Confirm Visibility Change", + "admin_tasks_visibility_confirm_enable": "Are you sure you want to make \"{taskTitle}\" visible to all users?", + "admin_tasks_visibility_confirm_disable": "Are you sure you want to hide \"{taskTitle}\" from users?", + "admin_tasks_visibility_confirm": "Confirm", + "admin_tasks_visibility_enabled": "Task is now visible to users", + "admin_tasks_visibility_disabled": "Task is now hidden from users", + "admin_tasks_visibility_error": "Failed to update task visibility", + "admin_tasks_card_edit": "Edit Task", + "admin_tasks_edit_dialog_title": "Edit Task", + "admin_tasks_edit_dialog_description": "Update the task details. Leave fields empty to keep current values.", + "admin_tasks_edit_form_title_note": "Leave empty to keep the current title", + "admin_tasks_edit_form_archive_note": "Optional - only upload if you want to replace the task archive", + "admin_tasks_edit_success": "Task updated successfully!", + "admin_tasks_edit_error": "Failed to update task. Please try again.", "admin_tasks_load_error_title": "Failed to load tasks", "admin_tasks_loading": "Loading tasks...", "admin_tasks_no_tasks_description": "Upload your first task to get started", diff --git a/messages/pl.json b/messages/pl.json index ef78b41..696772d 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -98,6 +98,7 @@ "admin_tasks_card_updated": "Zaktualizowano:", "admin_tasks_card_user_prefix": "Użytkownik #", "admin_tasks_card_view_details": "Zobacz Zadanie", + "admin_tasks_card_visible_to_users": "Widoczne dla użytkowników", "admin_tasks_dialog_description": "Prześlij archiwum zadania do serwisu FileStorage. Archiwum powinno zawierać wszystkie niezbędne pliki zadania.", "admin_tasks_dialog_title": "Prześlij zadanie", "admin_tasks_form_archive_label": "Archiwum Zadania", @@ -106,6 +107,24 @@ "admin_tasks_form_title_label": "Tytuł Zadania", "admin_tasks_form_title_placeholder": "Wprowadź tytuł zadania", "admin_tasks_form_upload": "Prześlij", + "admin_tasks_form_update": "Aktualizuj", + "admin_tasks_form_updating": "Aktualizowanie...", + "admin_tasks_form_visible_label": "Udostępnij zadanie wszystkim użytkownikom", + "admin_tasks_form_visible_description": "Kiedy zaznaczone, to zadanie będzie natychmiast widoczne dla wszystkich użytkowników", + "admin_tasks_visibility_confirm_title": "Potwierdź zmianę widoczności", + "admin_tasks_visibility_confirm_enable": "Czy na pewno chcesz udostępnić zadanie \"{taskTitle}\" wszystkim użytkownikom?", + "admin_tasks_visibility_confirm_disable": "Czy na pewno chcesz ukryć zadanie \"{taskTitle}\" przed użytkownikami?", + "admin_tasks_visibility_confirm": "Potwierdź", + "admin_tasks_visibility_enabled": "Zadanie jest teraz widoczne dla użytkowników", + "admin_tasks_visibility_disabled": "Zadanie jest teraz ukryte przed użytkownikami", + "admin_tasks_visibility_error": "Nie udało się zaktualizować widoczności zadania", + "admin_tasks_card_edit": "Edytuj Zadanie", + "admin_tasks_edit_dialog_title": "Edytuj Zadanie", + "admin_tasks_edit_dialog_description": "Zaktualizuj szczegóły zadania. Pozostaw pola puste, aby zachować obecne wartości.", + "admin_tasks_edit_form_title_note": "Pozostaw puste, aby zachować obecny tytuł", + "admin_tasks_edit_form_archive_note": "Opcjonalne - prześlij tylko jeśli chcesz zastąpić archiwum zadania", + "admin_tasks_edit_success": "Zadanie zostało pomyślnie zaktualizowane!", + "admin_tasks_edit_error": "Nie udało się zaktualizować zadania. Spróbuj ponownie.", "admin_tasks_load_error_title": "Nie udało się załadować zadań", "admin_tasks_loading": "Ładowanie zadań...", "admin_tasks_no_tasks_description": "Prześlij swoje pierwsze zadanie, aby zacząć", diff --git a/src/lib/components/dashboard/admin/contests/AddContestCollaboratorButton.svelte b/src/lib/components/dashboard/admin/contests/AddContestCollaboratorButton.svelte index 1c1f4f7..fe97ec3 100644 --- a/src/lib/components/dashboard/admin/contests/AddContestCollaboratorButton.svelte +++ b/src/lib/components/dashboard/admin/contests/AddContestCollaboratorButton.svelte @@ -11,10 +11,8 @@ import * as m from '$lib/paraglide/messages'; import { Permission } from '$lib/dto/accessControl'; import type { User } from '$lib/dto/user'; - import type { Collaborator } from '$lib/dto/accessControl'; import type { AddCollaboratorForm } from '$routes/dashboard/teacher/contests/[contestId]/collaborators/collaborators.remote'; import { LoadingSpinner } from '$lib/components/common'; - import { UserRole } from '$lib/dto/jwt'; import type { PaginatedData } from '$lib/dto/response'; interface Props { @@ -23,31 +21,17 @@ users: PaginatedData | undefined; usersLoading: boolean; usersError: Error | null; - existingCollaborators: Collaborator[] | undefined; } - let { - contestId, - addCollaborator, - users, - usersLoading, - usersError, - existingCollaborators - }: Props = $props(); + let { contestId, addCollaborator, users, usersLoading, usersError }: Props = $props(); let dialogOpen = $state(false); let searchQuery = $state(''); let selectedUserId = $state(null); let selectedPermission = $state(null); - // Filter out users who are already collaborators and users with student role - let availableUsers = $derived.by(() => { - if (!users) return []; - const collaboratorIds = new Set(existingCollaborators?.map((c) => c.userId) ?? []); - return users.items.filter( - (user) => !collaboratorIds.has(user.id) && user.role !== UserRole.Student - ); - }); + // Backend returns only assignable users (teachers who aren't already collaborators) + let availableUsers = $derived(users?.items ?? []); // Filter users by search query let filteredUsers = $derived.by(() => { diff --git a/src/lib/components/dashboard/admin/contests/EditContestDialog.svelte b/src/lib/components/dashboard/admin/contests/EditContestDialog.svelte index 5ac4f66..26fd5e6 100644 --- a/src/lib/components/dashboard/admin/contests/EditContestDialog.svelte +++ b/src/lib/components/dashboard/admin/contests/EditContestDialog.svelte @@ -252,7 +252,6 @@
@@ -263,7 +262,6 @@
@@ -274,7 +272,6 @@
diff --git a/src/lib/components/dashboard/admin/tasks/AddCollaboratorButton.svelte b/src/lib/components/dashboard/admin/tasks/AddCollaboratorButton.svelte index ca8c357..6aa88a2 100644 --- a/src/lib/components/dashboard/admin/tasks/AddCollaboratorButton.svelte +++ b/src/lib/components/dashboard/admin/tasks/AddCollaboratorButton.svelte @@ -11,10 +11,8 @@ import * as m from '$lib/paraglide/messages'; import { Permission } from '$lib/dto/accessControl'; import type { User } from '$lib/dto/user'; - import type { Collaborator } from '$lib/dto/accessControl'; import type { AddCollaboratorForm } from '$routes/dashboard/teacher/tasks/[taskId]/collaborators/collaborators.remote'; import { LoadingSpinner } from '$lib/components/common'; - import { UserRole } from '$lib/dto/jwt'; import type { PaginatedData } from '$lib/dto/response'; interface Props { @@ -23,25 +21,17 @@ users: PaginatedData | undefined; usersLoading: boolean; usersError: Error | null; - existingCollaborators: Collaborator[] | undefined; } - let { taskId, addCollaborator, users, usersLoading, usersError, existingCollaborators }: Props = - $props(); + let { taskId, addCollaborator, users, usersLoading, usersError }: Props = $props(); let dialogOpen = $state(false); let searchQuery = $state(''); let selectedUserId = $state(null); let selectedPermission = $state(null); - // Filter out users who are already collaborators and users with student role - let availableUsers = $derived.by(() => { - if (!users) return []; - const collaboratorIds = new Set(existingCollaborators?.map((c) => c.userId) ?? []); - return users.items.filter( - (user) => !collaboratorIds.has(user.id) && user.role !== UserRole.Student - ); - }); + // Backend returns only assignable users (teachers who aren't already collaborators) + let availableUsers = $derived(users?.items ?? []); // Filter users by search query let filteredUsers = $derived.by(() => { diff --git a/src/lib/components/dashboard/admin/tasks/TaskVisibilityToggle.svelte b/src/lib/components/dashboard/admin/tasks/TaskVisibilityToggle.svelte new file mode 100644 index 0000000..58be366 --- /dev/null +++ b/src/lib/components/dashboard/admin/tasks/TaskVisibilityToggle.svelte @@ -0,0 +1,86 @@ + + +
+ {#key checkboxKey} + + {/key} + +
+ + + + + {m.admin_tasks_visibility_confirm_title()} + + {pendingVisibility + ? m.admin_tasks_visibility_confirm_enable({ taskTitle }) + : m.admin_tasks_visibility_confirm_disable({ taskTitle })} + + + + + + + + diff --git a/src/lib/components/dashboard/admin/tasks/TasksUploadDialog.svelte b/src/lib/components/dashboard/admin/tasks/TasksUploadDialog.svelte index 2435f3a..4a2ffdb 100644 --- a/src/lib/components/dashboard/admin/tasks/TasksUploadDialog.svelte +++ b/src/lib/components/dashboard/admin/tasks/TasksUploadDialog.svelte @@ -3,6 +3,7 @@ import { Button } from '$lib/components/ui/button'; import { Input } from '$lib/components/ui/input'; import { Label } from '$lib/components/ui/label'; + import { Checkbox } from '$lib/components/ui/checkbox'; import * as Dialog from '$lib/components/ui/dialog'; import { toast } from 'svelte-sonner'; import { isHttpError } from '@sveltejs/kit'; @@ -123,6 +124,21 @@ {/if}
+
+ +
+ +

+ {m.admin_tasks_form_visible_description()} +

+
+
+
+ +
+ {}} + /> +
+