feat: 管理项目面板改为右侧fixed弹窗(与视图选项同锚点往下展开)

This commit is contained in:
Aisland
2026-08-17 21:50:55 +08:00
parent bb3227482c
commit d3a393e663
3 changed files with 31 additions and 1 deletions
+2 -1
View File
@@ -957,8 +957,9 @@ function WorktableSection(props: any) {
</div> </div>
)} )}
{managing && <div className="dsh-wt_popBackdrop" onClick={() => setManaging(false)} />}
{managing && ( {managing && (
<div className="dsh-wt_manage"> <div className="dsh-wt_manage dsh-wt_pop" style={{ position: 'fixed', left: popLeft, top: popTop, width: 316, zIndex: 80 }}>
<div className="dsh-wt_manageHead"> <div className="dsh-wt_manageHead">
<span className="dsh-wt_manageTitle">{t('manage.title')}</span> <span className="dsh-wt_manageTitle">{t('manage.title')}</span>
<button type="button" className="dsh-wt_manageDone" onClick={() => setManaging(false)}>{t('manage.done')}</button> <button type="button" className="dsh-wt_manageDone" onClick={() => setManaging(false)}>{t('manage.done')}</button>
@@ -545,3 +545,12 @@
dsh-wt_menu dsh-wt_pop fixed 定位 width 200 + 透明遮罩点击关闭;与 + 弹窗互斥不变。 dsh-wt_menu dsh-wt_pop fixed 定位 width 200 + 透明遮罩点击关闭;与 + 弹窗互斥不变。
- 验证:functional-diag STEP8 menuPos=fixed、menuLeft=288(侧栏右缘+8)、 - 验证:functional-diag STEP8 menuPos=fixed、menuLeft=288(侧栏右缘+8)、
遮罩点击关闭 PASS;全 STEP 回归 ERROR_COUNT: 0。纯客户端改动,F5 生效。 遮罩点击关闭 PASS;全 STEP 回归 ERROR_COUNT: 0。纯客户端改动,F5 生效。
## 补记(管理项目改右侧弹窗展开)
- 用户反馈:点「管理项目…」后,管理面板应从新弹出的界面(同锚点)往下展开,
而不是从工作台原位内联展开。
- 处理:managing 时 dsh-wt_manage 加 dsh-wt_pop + fixed 定位(popLeft/popTop 与视图选项
弹窗同一锚点,宽 316),加透明遮罩点击关闭;完成按钮关闭不变;
项目卡区 data-managing 弱化保持。
- 验证:functional-diag STEP9 managePos=fixed、manageLeft=288(同弹窗锚点)、rows=3、
遮罩关闭 PASS;全 STEP 回归 ERROR_COUNT: 0。纯客户端改动,F5 生效。
+20
View File
@@ -167,6 +167,26 @@ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
})()`); })()`);
console.log('STEP8:', JSON.stringify(step8)); console.log('STEP8:', JSON.stringify(step8));
// 管理项目:从视图选项弹窗同锚点往下展开为 fixed 面板(不再内联展开)
const step9 = await evaluate(`(async function(){
var out={};
var btn=document.querySelector('.dsh-wt_actions .dsh-wt_iconBtn:nth-child(2)');
if(btn){ btn.click(); }
await new Promise(function(r){setTimeout(r,250)});
var items=document.querySelectorAll('.dsh-wt_menu.dsh-wt_pop .dsh-wt_menuItem');
var manageItem=items[items.length-1];
if(manageItem){ manageItem.click(); }
await new Promise(function(r){setTimeout(r,300)});
var mp=document.querySelector('.dsh-wt_manage.dsh-wt_pop');
if(mp){ var cs=getComputedStyle(mp); out.managePos=cs.position; out.manageLeft=mp.getBoundingClientRect().left; out.manageTop=mp.getBoundingClientRect().top; out.rows=mp.querySelectorAll('.dsh-wt_manageRow').length; }
var bd=document.querySelector('.dsh-wt_popBackdrop');
if(bd){ bd.click(); }
await new Promise(function(r){setTimeout(r,200)});
out.closedAfterBackdrop=!document.querySelector('.dsh-wt_manage.dsh-wt_pop');
return JSON.stringify(out);
})()`);
console.log('STEP9:', JSON.stringify(step9));
const errors = events.filter((e) => const errors = events.filter((e) =>
e.method === 'Runtime.exceptionThrown' || e.method === 'Runtime.exceptionThrown' ||
(e.method === 'Log.entryAdded' && e.params.entry.level === 'error') || (e.method === 'Log.entryAdded' && e.params.entry.level === 'error') ||