feat(V0.2): 任务模块界面调整 —— 首屏/项目管理/底部安全距离
Docker Build and Push / build-image (push) Successful in 4m8s
Docker Build and Push / build-image (push) Successful in 4m8s
按 2026-10-24 评审的 5 条调整实现 (需求 T-VW-08~10 / T-PJ-11/12 / T-UI-11): 首屏 (T-VW-08/09): - /task 改为「上=最近项目条(3 个+更多入口), 下=当前项目任务管理」 - 完整项目列表迁至 /task/list, 从「更多项目」进入; /task/:pid 保留供深链 最近项目排序 (T-VW-10): - 卡片长按 300ms 拖动换位, 结果存设备端 prefs.recentOrder - 顺序 = 手动排序 > 最近访问(recentIds) > 列表序, 归档项目不展示 项目管理 (T-PJ-11/12): - 新增 ProjectManage: 成员 / 看板列 / 项目信息 三分区统一入口 - 项目信息含 改名 / 归档切换 / 删除(个人项目隐藏) / 退出(仅创建人) - 项目页头部只留「项目管理 + 新增」, 移除散置的成员/列设置按钮 底部安全距离 (T-UI-11): - 任务详情 / 人员选择 / 拷贝弹层 padding-bottom = 安全区 + 20px - 小屏下弹层 maxHeight + 内部滚动, 底部按钮完整可见 已验证: 97 文件语法 0 错误、相对导入 0 缺失
This commit is contained in:
@@ -5,20 +5,19 @@ import { filterVisible, msToNextBoundary } from './date.js'
|
||||
import { getViewMode, setViewMode } from './prefs.js'
|
||||
import ListView from './ListView.jsx'
|
||||
import BoardView from './BoardView.jsx'
|
||||
import ColumnSettings from './ColumnSettings.jsx'
|
||||
import TaskDetail from './TaskDetail.jsx'
|
||||
import ProjectMembers from './ProjectMembers.jsx'
|
||||
import ProjectManage from './ProjectManage.jsx'
|
||||
|
||||
// 项目视图容器: 列表 / 看板 切换 + 数据装载 + 乐观更新
|
||||
export default function ProjectView({ projectId, onBack }) {
|
||||
// 嵌在任务首屏下部 (T-VW-09); 头部仅保留「项目管理」与「+ 新增」(T-PJ-11)
|
||||
export default function ProjectView({ projectId, onProjectChanged, onProjectExited }) {
|
||||
const [project, setProject] = useState(null)
|
||||
const [tasks, setTasks] = useState(null)
|
||||
const [columns, setColumns] = useState([])
|
||||
const [err, setErr] = useState('')
|
||||
const [mode, setMode] = useState(() => getViewMode(projectId) || 'list')
|
||||
const [openTask, setOpenTask] = useState(null)
|
||||
const [showColumns, setShowColumns] = useState(false)
|
||||
const [showMembers, setShowMembers] = useState(false)
|
||||
const [showManage, setShowManage] = useState(false)
|
||||
const [adding, setAdding] = useState(false)
|
||||
const [tick, setTick] = useState(0) // 保留窗口重算触发
|
||||
|
||||
@@ -139,12 +138,8 @@ export default function ProjectView({ projectId, onBack }) {
|
||||
|
||||
if (err) {
|
||||
return (
|
||||
<div className="page-with-navbar">
|
||||
<div className="navbar-sub">
|
||||
<span className="back" onClick={onBack}>‹</span>
|
||||
<span className="title">任务</span>
|
||||
</div>
|
||||
<div className="empty">
|
||||
<div className="pv-embed">
|
||||
<div className="empty" style={{ paddingTop: 40 }}>
|
||||
<div className="ico err">!</div>
|
||||
<p>{err}</p>
|
||||
<div className="mini-btn solid" onClick={load}>重试</div>
|
||||
@@ -155,24 +150,21 @@ export default function ProjectView({ projectId, onBack }) {
|
||||
|
||||
if (!project || !tasks) {
|
||||
return (
|
||||
<div className="page-with-navbar">
|
||||
<div className="navbar-sub">
|
||||
<span className="back" onClick={onBack}>‹</span>
|
||||
<span className="title">任务</span>
|
||||
<div className="pv-embed">
|
||||
<div className="empty" style={{ padding: '40px 20px' }}>
|
||||
<div className="ico">··</div><p>加载中…</p><DotLoading color="#1677ff" />
|
||||
</div>
|
||||
<div className="empty"><div className="ico">··</div><p>加载中…</p><DotLoading color="#1677ff" /></div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="page-with-navbar">
|
||||
<div className="navbar-sub">
|
||||
<span className="back" onClick={onBack}>‹</span>
|
||||
<div className="pv-embed">
|
||||
<div className="navbar-sub task-projbar">
|
||||
<span className="title">{project.name}</span>
|
||||
<div className="right">
|
||||
<span className="mini-btn" onClick={() => setShowMembers(true)}>成员</span>
|
||||
<span className="mini-btn" onClick={() => setAdding((v) => !v)}>+ 新增</span>
|
||||
<span className="mini-btn" onClick={() => setShowManage(true)}>项目管理</span>
|
||||
<span className="mini-btn solid" onClick={() => setAdding((v) => !v)}>+ 新增</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -182,9 +174,6 @@ export default function ProjectView({ projectId, onBack }) {
|
||||
<div className={mode === 'list' ? 'on' : ''} onClick={() => switchMode('list')}>列表</div>
|
||||
<div className={mode === 'board' ? 'on' : ''} onClick={() => switchMode('board')}>看板</div>
|
||||
</div>
|
||||
<div className="right">
|
||||
<span className="mini-btn grey" onClick={() => setShowColumns(true)}>列设置</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{adding && (
|
||||
@@ -234,20 +223,12 @@ export default function ProjectView({ projectId, onBack }) {
|
||||
/>
|
||||
)}
|
||||
|
||||
{showColumns && (
|
||||
<ColumnSettings
|
||||
projectId={projectId}
|
||||
columns={columns}
|
||||
onClose={() => setShowColumns(false)}
|
||||
onSaved={() => { setShowColumns(false); load() }}
|
||||
/>
|
||||
)}
|
||||
|
||||
{showMembers && (
|
||||
<ProjectMembers
|
||||
{showManage && (
|
||||
<ProjectManage
|
||||
project={project}
|
||||
onClose={() => setShowMembers(false)}
|
||||
onChanged={load}
|
||||
onClose={() => setShowManage(false)}
|
||||
onChanged={() => { load(); onProjectChanged?.() }}
|
||||
onExited={() => { setShowManage(false); onProjectExited?.() }}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user