7.7 KiB
7.7 KiB
sub-implementer-frontend-1 — S182 W2 (a-h) lane FE
⚠️ TÊN FILE: TASK text ghi
sub-implementer-frontend-0.md, RUN-TRACE block + structured-output ghisub-implementer-frontend-1.md. Chọn-1(bản RUN-TRACE = bản em main đọc quasubMdPath). Khai ở đây để lead biết.
§0 — Trạng thái lượt (append liên tục, chống-#53)
- Đọc SPEC FINAL MỤC 2 W2 (a-h) + MỤC 1 R-1..R-6
- Đọc file đích + đo tiền-đề từ ĐĨA (line-number trong spec có thể lệch)
- W2a parse kind
- W2b synthetic slice
- W2c lockedCode
- W2d D3=C 6 ô + #4
- W2e menuKeys ×2 app
- W2f ngưỡng CEO
- W2g auto-pin isActive ×2 app
- W2h comment + subtitle
- build fe-admin
- build fe-user
§1 — Đo tiền-đề từ đĩa (TRƯỚC khi gõ)
| # | Tiền-đề spec | Đo trên đĩa | Verdict |
|---|---|---|---|
| P1 | :164-172 TYPE_CODE_TO_INT |
ApprovalWorkflowsV2Page.tsx:164-172 ĐÚNG (TYPE_INT_CONTRACT_SIGNING_PLAN=10 :149) |
HELD |
| P2 | :299-301 currentType |
:299-301 overview.data?.types.find(...) ĐÚNG |
HELD |
| P3 | :357/:620/:650-651/:798/:920-933 |
TypePanel :357 · Designer :620 · defaultCode :650-651 · POST code :798 · ô Mã :920-933 — ĐÚNG cả 5 |
HELD |
| P4 | 6 ô D3 :1235-1266, :1268-1276, :1277-1285, :1320-1328 |
#1 :1232-1240 · #2 :1241-1249 · #3 :1250-1258 · #4 :1259-1267 · #5 :1268-1276 · #6 :1277-1285 · #7 :1292-1302 · #8 :1307-1315 · #9 :1320-1328 |
HELD (số ô #1-#4 lệch ±3 dòng so spec, khớp nội dung) |
| P5 | :944-961 ngưỡng CEO |
:943-961 ĐÚNG |
HELD |
| P6 | menuKeys.ts:31-32 = 2 const AwV2_* |
fe-admin :31-32 + fe-user :31-32 ĐÚNG, 0 key KhkkN |
HELD |
| P7 | BE const để mirror | MenuKeys.cs:127-134 AwV2_KhkkN1..8 (VÀO All) |
HELD |
| P8 | 4-place Layout staticMap | fe-admin/Layout.tsx:188 /^KhkkN[1-8]$/ ĐÃ CÓ (K3 S164/S165) ⇒ chỗ-4 KHÔNG cần chạm |
HELD |
| P9 | khkkGroupWorkflowCode / khkkGroupMenuLabel |
types/khkk.ts:159-168, 2 app SHA identical b26bf674… |
HELD |
| P10 | 🔴 spec W2g "2 file KhkkCreatePage vốn khác nhau — không cần byte-equal" | SAI: sha256sum 2 file = 332986ae6bf1904a4db434c796164caa2768beaaebdc7843dd2b1cdd729d17da BẰNG NHAU + diff 0 dòng |
LỆCH → sửa mirror BYTE-EQUAL, giữ SHA-pair |
| P11 | WorkflowDto (local) có isActive? |
KhkkCreatePage.tsx:57-62 = {id, code, name, isUserSelectable} — THIẾU isActive |
phải thêm field (BE có: DefinitionDto.isActive :79) |
| P12 | 🔴 spec W2h "thêm ~1 prop subtitle" |
components/PageHeader.tsx:3-11 chỉ có title/description/actions (bài S37 lặp lần 3) |
LỆCH → xem §4 FLAG-1 |
| P13 | build = phép thử TS thật | package.json build = tsc -b && vite build, noUnusedLocals+noUnusedParameters+erasableSyntaxOnly ON |
HELD |
§2 — Thay đổi từng task (đã gõ xong, chờ build)
File chạm (4):
fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx(a,b,c,d,f,h)fe-admin/src/lib/menuKeys.ts(e)fe-user/src/lib/menuKeys.ts(e)fe-admin/src/pages/khkk/KhkkCreatePage.tsx+fe-user/…(g,cp→ SHA-pair)
W2a — parse kind
khkkGroupMatch = typeCode?.match(/^KhkkN([1-8])$/) ?? null→khkkGroup: number|nullselectedTypeInt = khkkGroup !== null ? TYPE_INT_CONTRACT_SIGNING_PLAN : typeCode ? TYPE_CODE_TO_INT[typeCode] : null- queryKey GIỮ NGUYÊN (
['approval-workflow-v2-overview', selectedTypeInt]) ⇒ 8 panel nhóm + panel type-10 dùng chung 1 ô cache, invalidate làm tươi cả 9. Khai trong comment. - Regex CHUỖI (không
Number()) —KhkkN03không lọt (bài học L1 #11). - +import
{ khkkGroupMenuLabel, khkkGroupWorkflowCode } from '@/types/khkk'(không chép chuỗiKHKK-N).
W2b — synthetic slice
- Tách
typeBucket(raw BE) ⟂currentType(lát cắt).useMemo([khkkGroup, typeBucket]). versions = typeBucket.history.filter(d => d.code === khkkGroupWorkflowCode(g))·active = versions.find(v=>v.isActive) ?? null· KHÔNG đọctypeBucket.active(1-trong-8).- Giữ shape
TypeSummaryDto⇒ TypePanel/Designer không biết mình đang xem nhóm hay loại.
W2c — lockedCode xuyên suốt
- Page:
lockedCode = khkkGroup !== null ? khkkGroupWorkflowCode(khkkGroup) : null TypePanel({type, lockedCode, onSaved})→<Designer lockedCode={lockedCode} …>defaultCode = lockedCode ?? DEFAULT_CODE_BY_TYPE[applicableType] ?? 'QT-V2-001'— ô hiện ĐÚNG mã sẽ gửi (không hiệnQT-KHKK-V2-001rồi gửiKHKK-N3).- Ô Mã
disabled={isEdit || lockedCode !== null}+ hint "Mã khoá theo nhóm — version tự tăng." - POST
code: lockedCode ?? code(bất-biến theo CẤU TRÚC, không dựa vào input disabled). - +
key={typeCode ?? 'all'}trên<TypePanel>— NGOÀI spec, lý do: chuyển N1→N3 khi Designer đang mở thìcloneFrom/editTarget(state trong TypePanel) còn trỏ bản N1 trong khilockedCodeđã là N3 ⇒ POST đẻKHKK-N3mang ruột N1. Remount xoá state. Khai ở đây.
W2d — D3=C danh-sách-chốt
Cờ chung const isKhkk = applicableType === TYPE_INT_CONTRACT_SIGNING_PLAN (1 nguồn, 8 chỗ dùng).
| Ô | Cờ | Xử lý |
|---|---|---|
| #1 | allowReturnOneLevel | disabled={isKhkk} + title chung + checked={entry.…} GIỮ + mờ text |
| #2 | allowReturnOneStep | ↑ |
| #3 | allowReturnToAssignee | ↑ |
| #4 | allowReturnToDrafter | disabled + checked THẬT + title RIÊNG "KHKK hiện luôn trả về người soạn khi Trả lại — cờ chưa phân nhánh" + KHÔNG mờ (giữ text-slate-700) |
| #5 | allowApproverEditDetails | như #1 |
| #6 | allowApproverEditBudget | như #1 |
| #7 | allowApproverSkipToFinal | GIỮ hành vi (kể cả checked ép-false của K3 S165); chỉ thay 3 biểu thức trùng → isKhkk, giá trị y hệt |
| #8 | allowApproverFinalize | SỐNG — 0 chạm |
| #9 | allowApproverDelete | như #1 (rose→slate khi mờ) |
levelFlagsPayload0 dòng đổi (echo state thật).- +1 dòng giải thích trong hộp tím (chỉ khi
isKhkk) — nói rõ ô mờ vẫn hiện đúng giá trị DB, và 2 ô còn tác dụng.
W2e — menuKeys ×2 app
+8 const AwV2_KhkkN1..8 mirror MenuKeys.cs:127-134, sau :32 cả 2 app. Comment viết theo app (fe-admin trỏ Layout.tsx:188; fe-user khai "cố ý không có Designer") — cố ý lệch chữ, không lệch const.
W2f — Ngưỡng CEO
disabled={isEdit || isKhkk} + helper-text "KHKK không dùng ngưỡng máy — NĐUQ quyết…" + POST ceoApprovalThreshold: isKhkk ? null : (…).
W2g — auto-pin lọc isActive ×2 app
WorkflowDto(local,:57-62) +isActive: boolean— BE có (AwAdminOverviewDto, đối chiếuDefinitionDto.isActive).find(w => w.isActive && code-match); filterisUserSelectableở query GIỮ.- Sửa 2 câu thông báo cho khớp điều-kiện MỚI (3 vế: đúng mã ∧ đang áp dụng ∧ đã ghim) — nếu không sẽ nói "chưa có quy trình" trong khi nó đang nằm đó ở bản archived (sai-thầm-lặng).
cpfe-admin → fe-user, SHA-pair89dfa607…BẰNG NHAU.
W2h — comment + tiêu đề
- Vá comment
:641-644: câu cũ "2 ô duyệt sớm sống cho MỌI loại" SAI — #7 vẫn khoá cho type-10 từ K3 S165. Viết lại + trỏ tại-chỗ. - PageHeader: title =
Quy trình duyệt (Mới): {khkkGroupMenuLabel(g)}· description = phụ đề nghiệp vụ (loại + nhóm N{n} + mã khoá + "7 nhóm còn lại không đổi"). Xem FLAG-1.
§3 — Verify (build ×2 + proof)
(chưa chạy)
§4 — Nợ / FLAG cho lead
(chưa có)