From a508564b45e10126d6522baa5ecf926b5912d8a1 Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 13 May 2026 18:59:45 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20FE-Admin:=20Chunk=20C=20=E2=80=94=20?= =?UTF-8?q?ApprovalWorkflowDesigner=20section=20"C=E1=BA=A5u=20h=C3=ACnh?= =?UTF-8?q?=20n=C3=A2ng=20cao"=206=20checkbox=20(F1+F2+F3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thêm section "Cấu hình nâng cao" trong Designer modal (giữa Description và Steps), 3 sub-group 6 checkbox per workflow version: 1. Mode Trả lại (Approver chọn khi nhấn ← Trả lại): - Trả về 1 Cấp trước (peer review chain trong cùng Bước) - Trả về 1 Bước trước (Cấp cuối Bước trước nhận lại) - Trả về Người chỉ định (pick runtime từ list NV đã duyệt) - Trả về Người soạn thảo (default checked = backward compat S17) 2. Drafter gửi duyệt: - Cho phép Drafter gửi thẳng Cấp cuối (F2 skip mọi Bước/Cấp trung gian) 3. Approver chỉnh sửa phiếu: - Cho phép Approver chỉnh sửa Section 2 Hạng mục/NCC/Báo giá (F3, giữ Cấp) DTO types update: - DefinitionDto +6 boolean field (mirror BE AwDefinitionDto) - 6 useState cho 6 flag, default từ cloneFrom (giữ config version trước) hoặc S17 backward compat (chỉ AllowReturnToDrafter=true) - POST body extend 6 field gửi BE Styling: - Container amber-50/30 + border amber-200 (visual distinction với Steps section) - Mỗi checkbox: card border-slate-200 bg-white, hover bg-amber-50/40 - Helper text [10px] text-slate-500 dưới label giải thích mode - Headers [11px] uppercase text-slate-500 group sub-section fe-user KHÔNG mirror — ApprovalWorkflowsV2Page admin-only. PeWorkspaceCreateView chỉ filter IsUserSelectable, không cần Allow* flag lúc create phiếu. Verify: - npm run build fe-admin pass (8.72s, 0 TS6 err) - Warning chunk size pre-existing Pending Chunk D: FE eOffice (Trả lại modal dropdown + Skip submit + Edit Section 2 enable conditional theo workflow.options) mirror 2 app. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../pages/system/ApprovalWorkflowsV2Page.tsx | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx b/fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx index 922e36e..211a868 100644 --- a/fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx +++ b/fe-admin/src/pages/system/ApprovalWorkflowsV2Page.tsx @@ -60,6 +60,13 @@ type DefinitionDto = { description: string | null isActive: boolean isUserSelectable: boolean // Mig 25 — admin toggle cho user pick + // Mig 28 (S21 t4) — 6 advanced options per workflow version + allowReturnOneLevel: boolean + allowReturnOneStep: boolean + allowReturnToAssignee: boolean + allowReturnToDrafter: boolean // default true backward compat S17 + allowDrafterSkipToFinal: boolean + allowApproverEditDetails: boolean activatedAt: string | null createdAt: string steps: StepDto[] @@ -445,6 +452,15 @@ function Designer({ const [description, setDescription] = useState(cloneFrom?.description ?? '') const [steps, setSteps] = useState(initialSteps) + // Mig 28 (S21 t4) — 6 advanced options. Default clone từ cloneFrom (giữ + // config version trước) hoặc backward compat S17 (chỉ Drafter mode). + const [allowReturnOneLevel, setAllowReturnOneLevel] = useState(cloneFrom?.allowReturnOneLevel ?? false) + const [allowReturnOneStep, setAllowReturnOneStep] = useState(cloneFrom?.allowReturnOneStep ?? false) + const [allowReturnToAssignee, setAllowReturnToAssignee] = useState(cloneFrom?.allowReturnToAssignee ?? false) + const [allowReturnToDrafter, setAllowReturnToDrafter] = useState(cloneFrom?.allowReturnToDrafter ?? true) + const [allowDrafterSkipToFinal, setAllowDrafterSkipToFinal] = useState(cloneFrom?.allowDrafterSkipToFinal ?? false) + const [allowApproverEditDetails, setAllowApproverEditDetails] = useState(cloneFrom?.allowApproverEditDetails ?? false) + const usersList = useQuery({ queryKey: ['users-for-approver-v2'], queryFn: async () => @@ -503,6 +519,13 @@ function Designer({ approverUserId: e.approverUserId, })), })), + // Mig 28 (S21 t4) — 6 advanced options + allowReturnOneLevel, + allowReturnOneStep, + allowReturnToAssignee, + allowReturnToDrafter, + allowDrafterSkipToFinal, + allowApproverEditDetails, }) }, onSuccess: () => { @@ -561,6 +584,118 @@ function Designer({ + {/* Mig 28 (S21 t4) — Section Cấu hình nâng cao (F1+F2+F3 advanced options). + 6 checkbox per workflow: 4 mode Trả lại + 1 Skip CEO + 1 Approver edit. */} +
+ +

+ Bật/tắt mode duyệt mở rộng cho workflow này. Mặc định chỉ "Trả về Người soạn thảo" enabled + (tương thích quy trình cũ). Các mode khác opt-in để audit nghiêm. +

+ +
+
+
+ Mode Trả lại (Approver chọn khi nhấn ← Trả lại) +
+
+ + + + +
+
+ +
+
+ Drafter gửi duyệt (Workspace "Lưu & Gửi Duyệt") +
+ +
+ +
+
+ Approver chỉnh sửa phiếu +
+ +
+
+
+