feat: Multi-User/Admin usermanagement + Galaxy Login/Settings + Task detail improvements
CI - Build & Test / Backend (.NET) (push) Successful in 35s
CI - Build & Test / Frontend (Vue/TS) (push) Successful in 20s
CI - Build & Test / Security Check (push) Successful in 4s

- Backend: NEW AdminController with user CRUD (GET/POST/DELETE /api/v1/admin/users)
- Backend: NEW GET /api/dashboard/tasks/{id} single task endpoint
- Backend: NEW POST /api/dashboard/tasks/{id}/activity comment endpoint
- Backend: IUserRepository + UserRepository extended with GetAllAsync, DeleteAsync
- Backend: Admin DTOs (AdminUserInfo, AdminCreateUserRequest, AdminUpdateRoleRequest)
- Frontend: NEW TaskDetailView.vue — URL-based (/tasks/:id) Galaxy-themed task detail
  with subtask create/edit/delete, activity with comments, property sidebar
- Frontend: LoginView.vue — полностью Galaxy theme redesign with GalaxyBackground,
  glass-morphism card, password toggle, consistent brand
- Frontend: SettingsView.vue — Galaxy theme redesign with glass cards,
  admin user management section (create/list users, visible only to owner role)
- Frontend: TaskBoardView.vue — added "Full View" link to URL-based detail page
- Frontend: Router — added /tasks/:id route for TaskDetailView
- Frontend: App.vue — added TaskDetail to standaloneViews whitelist
- Frontend: tasks store — stable

Auth: Admin creates accounts, users log in with existing /api/v1/auth/login.
Login/Settings deliver visible Galaxy-consistent design with nexus-tokens.css tokens.
This commit is contained in:
2026-06-20 14:24:40 +02:00
parent dcc8450c62
commit e4091eee80
15 changed files with 2950 additions and 701 deletions
+28 -3
View File
@@ -4,7 +4,7 @@
* Fetches tasks from /api/dashboard/tasks and /api/dashboard/tasks/board
* and maps them into TaskItem[] format for the TaskStrip component.
*
* Board state: grouped by column (offen, inProgress, review, done, blocked)
* Board state: grouped by column (offen, inProgress, delegated, review, done, blocked)
* Auto-refresh: every 30 seconds.
*/
import { defineStore } from 'pinia'
@@ -13,7 +13,7 @@ import type { TaskItem } from '../components/dashboard/v2/types'
/* ── API Response Shapes ──────────────────────────── */
interface DashboardTaskDto {
export interface DashboardTaskDto {
id: string
title: string
detail: string | null
@@ -21,6 +21,8 @@ interface DashboardTaskDto {
state: string
priority: string
assignedTo: string | null
parentTaskId?: string | null
dueDate?: string | null
createdAt: string
updatedAt: string
}
@@ -228,7 +230,7 @@ export const useTaskStore = defineStore('tasks', {
},
/* ── API: Update task ─────────────────────────── */
async updateTask(id: string, updates: { title?: string; detail?: string; priority?: string; assignedTo?: string }) {
async updateTask(id: string, updates: { title?: string; detail?: string | null; priority?: string; assignedTo?: string | null; dueDate?: string | null }) {
try {
const res = await apiFetch(`/api/dashboard/tasks/${id}`, {
method: 'PUT',
@@ -239,6 +241,29 @@ export const useTaskStore = defineStore('tasks', {
await this.fetchBoard()
} catch (err) {
console.warn('[TaskStore] updateTask failed', err)
throw err
}
},
async fetchTaskChildren(id: string) {
try {
const res = await apiFetch(`/api/dashboard/tasks/${id}/children`)
if (!res.ok) throw new Error(`HTTP ${res.status}`)
return await res.json() as DashboardTaskDto[]
} catch (err) {
console.warn('[TaskStore] fetchTaskChildren failed', err)
throw err
}
},
async fetchTaskActivity(id: string) {
try {
const res = await apiFetch(`/api/dashboard/tasks/${id}/activity`)
if (!res.ok) throw new Error(`HTTP ${res.status}`)
return await res.json() as Array<{ id?: string; message?: string; type?: string; createdAt?: string; timestamp?: string }>
} catch (err) {
console.warn('[TaskStore] fetchTaskActivity failed', err)
throw err
}
},