feat: code-first navigation — use resource codes in links and displays
- DashboardPage: show task_code instead of #id, link via code - TasksPage: navigate to tasks via task_code - MilestoneDetailPage: navigate to tasks/supports/meetings via codes - MilestoneDetailPage: display codes in support/meeting tables - Fix support/meeting state types to any[] for code property access
This commit is contained in:
@@ -55,13 +55,13 @@ export default function DashboardPage() {
|
|||||||
<h3>Recent Tasks</h3>
|
<h3>Recent Tasks</h3>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr><th>ID</th><th>Title</th><th>Status</th><th>Priority</th><th>Type</th><th>Subtype</th></tr>
|
<tr><th>Code</th><th>Title</th><th>Status</th><th>Priority</th><th>Type</th><th>Subtype</th></tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{(stats.recent_tasks || []).map((i) => (
|
{(stats.recent_tasks || []).map((i) => (
|
||||||
<tr key={i.id}>
|
<tr key={i.id}>
|
||||||
<td>#{i.id}</td>
|
<td>{i.task_code || `#${i.id}`}</td>
|
||||||
<td><a href={`/tasks/${i.id}`}>{i.title}</a></td>
|
<td><a href={`/tasks/${i.task_code || i.id}`}>{i.title}</a></td>
|
||||||
<td><span className={`badge status-${i.status}`}>{i.status}</span></td>
|
<td><span className={`badge status-${i.status}`}>{i.status}</span></td>
|
||||||
<td><span className={`badge priority-${i.priority}`}>{i.priority}</span></td>
|
<td><span className={`badge priority-${i.priority}`}>{i.priority}</span></td>
|
||||||
<td>{i.task_type}</td><td>{i.task_subtype || "-"}</td>
|
<td>{i.task_type}</td><td>{i.task_subtype || "-"}</td>
|
||||||
|
|||||||
@@ -31,8 +31,8 @@ export default function MilestoneDetailPage() {
|
|||||||
const [members, setMembers] = useState<ProjectMember[]>([])
|
const [members, setMembers] = useState<ProjectMember[]>([])
|
||||||
const [progress, setProgress] = useState<MilestoneProgress | null>(null)
|
const [progress, setProgress] = useState<MilestoneProgress | null>(null)
|
||||||
const [tasks, setTasks] = useState<MilestoneTask[]>([])
|
const [tasks, setTasks] = useState<MilestoneTask[]>([])
|
||||||
const [supports, setSupports] = useState<Task[]>([])
|
const [supports, setSupports] = useState<any[]>([])
|
||||||
const [meetings, setMeetings] = useState<Task[]>([])
|
const [meetings, setMeetings] = useState<any[]>([])
|
||||||
const [activeTab, setActiveTab] = useState<'tasks' | 'supports' | 'meetings'>('tasks')
|
const [activeTab, setActiveTab] = useState<'tasks' | 'supports' | 'meetings'>('tasks')
|
||||||
const [showCreateTask, setShowCreateTask] = useState(false)
|
const [showCreateTask, setShowCreateTask] = useState(false)
|
||||||
const [showEditMilestone, setShowEditMilestone] = useState(false)
|
const [showEditMilestone, setShowEditMilestone] = useState(false)
|
||||||
@@ -141,7 +141,7 @@ export default function MilestoneDetailPage() {
|
|||||||
if (!milestone) return <div className="loading">Loading...</div>
|
if (!milestone) return <div className="loading">Loading...</div>
|
||||||
|
|
||||||
const renderTaskRow = (t: MilestoneTask) => (
|
const renderTaskRow = (t: MilestoneTask) => (
|
||||||
<tr key={t.id} className="clickable" onClick={() => navigate(`/tasks/${t.id}`)}>
|
<tr key={t.id} className="clickable" onClick={() => navigate(`/tasks/${t.task_code || t.id}`)}>
|
||||||
<td>{t.task_code || t.id}</td>
|
<td>{t.task_code || t.id}</td>
|
||||||
<td className="task-title">{t.title}</td>
|
<td className="task-title">{t.title}</td>
|
||||||
<td><span className={`badge status-${t.task_status || t.status}`}>{t.task_status || t.status}</span></td>
|
<td><span className={`badge status-${t.task_status || t.status}`}>{t.task_status || t.status}</span></td>
|
||||||
@@ -352,11 +352,11 @@ export default function MilestoneDetailPage() {
|
|||||||
|
|
||||||
{activeTab === 'supports' && (
|
{activeTab === 'supports' && (
|
||||||
<table>
|
<table>
|
||||||
<thead><tr><th>#</th><th>Title</th><th>Status</th><th>Priority</th></tr></thead>
|
<thead><tr><th>Code</th><th>Title</th><th>Status</th><th>Priority</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{supports.map((i) => (
|
{supports.map((i) => (
|
||||||
<tr key={i.id} className="clickable" onClick={() => navigate(`/supports/${projectCode}/${id}/${i.id}`)}>
|
<tr key={i.id} className="clickable" onClick={() => navigate(`/supports/${projectCode}/${id}/${i.support_code || i.id}`)}>
|
||||||
<td>{i.id}</td>
|
<td>{i.support_code || i.id}</td>
|
||||||
<td className="task-title">{i.title}</td>
|
<td className="task-title">{i.title}</td>
|
||||||
<td><span className={`badge status-${i.status}`}>{i.status}</span></td>
|
<td><span className={`badge status-${i.status}`}>{i.status}</span></td>
|
||||||
<td><span className={`badge priority-${i.priority}`}>{i.priority}</span></td>
|
<td><span className={`badge priority-${i.priority}`}>{i.priority}</span></td>
|
||||||
@@ -369,11 +369,11 @@ export default function MilestoneDetailPage() {
|
|||||||
|
|
||||||
{activeTab === 'meetings' && (
|
{activeTab === 'meetings' && (
|
||||||
<table>
|
<table>
|
||||||
<thead><tr><th>#</th><th>Title</th><th>Status</th><th>Priority</th></tr></thead>
|
<thead><tr><th>Code</th><th>Title</th><th>Status</th><th>Priority</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{meetings.map((i) => (
|
{meetings.map((i) => (
|
||||||
<tr key={i.id} className="clickable" onClick={() => navigate(`/meetings/${projectCode}/${id}/${i.id}`)}>
|
<tr key={i.id} className="clickable" onClick={() => navigate(`/meetings/${projectCode}/${id}/${i.meeting_code || i.id}`)}>
|
||||||
<td>{i.id}</td>
|
<td>{i.meeting_code || i.id}</td>
|
||||||
<td className="task-title">{i.title}</td>
|
<td className="task-title">{i.title}</td>
|
||||||
<td><span className={`badge status-${i.status}`}>{i.status}</span></td>
|
<td><span className={`badge status-${i.status}`}>{i.status}</span></td>
|
||||||
<td><span className={`badge priority-${i.priority}`}>{i.priority}</span></td>
|
<td><span className={`badge priority-${i.priority}`}>{i.priority}</span></td>
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ export default function TasksPage() {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{tasks.map((t) => (
|
{tasks.map((t) => (
|
||||||
<tr key={t.id} onClick={() => navigate(`/tasks/${t.id}`)} className="clickable">
|
<tr key={t.id} onClick={() => navigate(`/tasks/${t.task_code || t.id}`)} className="clickable">
|
||||||
<td>{t.task_code || t.id}</td>
|
<td>{t.task_code || t.id}</td>
|
||||||
<td className="task-title">{t.title}</td>
|
<td className="task-title">{t.title}</td>
|
||||||
<td><span className="badge" style={{ backgroundColor: statusColors[t.status] || '#ccc' }}>{t.status}</span></td>
|
<td><span className="badge" style={{ backgroundColor: statusColors[t.status] || '#ccc' }}>{t.status}</span></td>
|
||||||
|
|||||||
Reference in New Issue
Block a user