feat: Multi-User/Admin usermanagement + Galaxy Login/Settings + Task detail improvements
- 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:
@@ -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
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user