v78 服务端:首页任务改成「就地处理」面板 + 新建任务搬到首页
用户原话: 「网页端,首页点击一个任务后,除了展示信息,应该有相应的功能,可以修改状态: 待办、进行中,可以挪动分组,可以拖动上传附件,可以添加评论,添加子任务等。 其目地,是为了让用户不离开首页,就能对任务进行简单的处理。」 「另外,在全部任务旁边,放一个新建任务的功能,其实就是把任务中的新建和编辑功能, 搬过来,用弹出框来处理。」 一、首页任务浮层由「只读信息」改成「可操作面板」 - 新增 templates/tasks/_panel.php:状态三段 / 看板 chips(带看板色)/ 子任务(复用 _task_check.php)/ 附件拖放框(复用 _attachments.php)/ 讨论 - 新增路由 tasks/panel:只吐一块 HTML(找不到 404) - 既有七个动作路由各加一条 ajax_panel 回包分支(状态 / 挪分组 / 新建子任务 / 评论增删 / 附件增删),没有新开写接口 - helpers.php 新增 task_panel_wanted() / task_panel_json(); fb_entry_json() 的 payload 增加 panel 字段(只有任务会给) - 每次动作回**整块新面板**:一次动作会牵动子任务计数、附件张数、看板选中态, 逐处同步 DOM 必然漏一处 - 拖进来的附件**立刻上传**(任务已存在,不该再让用户点一次保存), 不复用 _stage_drop.php 那套「暂存 + 认领」 二、新建任务搬到首页 - 从 templates/tasks/index.php 抽出公共片段 templates/tasks/_add_modal.php (字段与原来一字未改),首页与任务页共用同一份 - 新增 assets/js/task_add.js 管开关(两页共用,幂等绑定); 打开那一刻才 fbUpgradeRange() + fbBootAntd()(hidden 时宽高为 0,antd 会定位错乱) - App\HomeCards 登记表里加 add => 新建任务,首页卡头与「全部任务」并排 - tasks/create 支持 back=home(白名单),新建完回首页 三、其它 - assets/js/task_panel.js:事件委托;动作后整块换面板; 顺手同步首页那张卡的状态徽标与复选框(关掉浮层不能还是旧状态); 传附件时保住用户写了一半的留言与子任务标题;取不到面板时退回只读信息 - app.css 追加面板样式(含 color-mix 的 @supports 兜底)与卡片窄到宽 2 时允许折行 验证:本地 e2e 1558/0、几何 428/0 + 660/0、v78 反向验证 11/0、 片段作用域体检 35/0、php -l 与 node --check 全过
This commit is contained in:
@@ -42,6 +42,11 @@
|
||||
就地摘一条会漏;且这条系列在视图里可能横跨多天),以及
|
||||
拿不到 JSON(老服务端 / 出错)。
|
||||
⑦ **Esc / 点遮罩只关最上面那层**:antd 面板开着时先让它收(v38/v39 的坑)。
|
||||
⑧ **v78 新增"面板态"**(任务专属):`data-fb-entry` 里带 `panel` 时,正文换成
|
||||
`tasks/panel` 吐的那块**可操作面板**(状态 / 看板 / 子任务 / 附件 / 评论
|
||||
都能就地改),底栏仍是「详情」那颗(跳任务详情页)。
|
||||
面板里的动作由 `task_panel.js` 委托处理 —— **别在这里加**:
|
||||
两个文件各管一段,谁也不会把谁的监听覆盖掉。
|
||||
⚠️ 本脚本**全站加载**(layout.php):三处入口分散在不同页面,按需加载的判据
|
||||
会在这些页面之间来回漏;它只有几 KB,不值得为省这点流量赌漏加载。
|
||||
============================================================================ */
|
||||
@@ -120,7 +125,9 @@
|
||||
var isEvent = (data.source === 'event');
|
||||
if (titleEl()) { titleEl().textContent = data.title || '详情'; }
|
||||
if (bodyEl()) { bodyEl().innerHTML = '<dl class="kv">' + rowsHtml(data.rows) + '</dl>'; }
|
||||
if (panelEl()) { panelEl().classList.remove('is-wide'); }
|
||||
/* 🔴 v78:任务带 `panel`(可就地操作的那块)—— 面板比只读信息宽一号,
|
||||
所以这里按**有没有 panel** 决定宽度,而不是按 source。 */
|
||||
if (panelEl()) { panelEl().classList.toggle('is-wide', !!data.panel); }
|
||||
setTip('');
|
||||
|
||||
/* ⚠️ 顺序要紧:**先** footShow('detail')(它会把所有按钮收掉、只点亮「详情」),
|
||||
@@ -146,6 +153,42 @@
|
||||
if (ed) { ed.hidden = !(isEvent && data.edit); }
|
||||
var de = byId('fbEntryDelete');
|
||||
if (de) { de.hidden = !(isEvent && data.del); }
|
||||
|
||||
/* 🔴 v78:任务面板 —— 把正文换成"能直接动手"的那一块。
|
||||
放在最后(上面的只读 rows 已经画好),取不到就保留那份只读信息。 */
|
||||
if (data.panel) { loadPanel(data.panel, data); }
|
||||
}
|
||||
|
||||
/**
|
||||
* 取回任务面板并塞进正文(v78)。
|
||||
*
|
||||
* 用户原话:「网页端,首页点击一个任务后,除了展示信息,应该有相应的功能…
|
||||
* 其目地,是为了让用户不离开首页,就能对任务进行简单的处理。」
|
||||
*
|
||||
* ⚠️ 失败时**不要清空正文**:退回 `rows` 那份只读信息(用户至少还能看清这条是什么),
|
||||
* 并且把宽度收回去 —— 一块空的宽面板比"只有信息"更像坏了。
|
||||
* ⚠️ 面板里的事件全部由 `task_panel.js` 委托处理(动态换 HTML 不重绑),
|
||||
* 这里只负责"取回来放进去"。
|
||||
*/
|
||||
function loadPanel(url, data) {
|
||||
if (!url || !window.fetch) { return; }
|
||||
if (bodyEl()) { bodyEl().innerHTML = '<p class="empty-hint">正在载入…</p>'; }
|
||||
fetch(url, { credentials: 'same-origin', headers: { 'X-Requested-With': 'XMLHttpRequest' } })
|
||||
.then(function (r) {
|
||||
if (!r.ok) { throw new Error('panel'); }
|
||||
return r.text();
|
||||
})
|
||||
.then(function (html) {
|
||||
if (!bodyEl() || html.indexOf('data-tk-panel') < 0) { throw new Error('panel'); }
|
||||
bodyEl().innerHTML = html;
|
||||
runInlineScripts(bodyEl(), html);
|
||||
})
|
||||
.catch(function () {
|
||||
if (!bodyEl()) { return; }
|
||||
bodyEl().innerHTML = '<dl class="kv">' + rowsHtml(data && data.rows) + '</dl>';
|
||||
if (panelEl()) { panelEl().classList.remove('is-wide'); }
|
||||
setTip('这条任务的快捷面板没载入,先看基本信息。', true);
|
||||
});
|
||||
}
|
||||
|
||||
function restoreDetail() {
|
||||
|
||||
Reference in New Issue
Block a user