Skip to content

UI Spec: Cải thiện UX cài đặt Mã Công Việc / Tiền Tour

Feature slug: settings-ux-subtask-tagVersion: 1.0 Ngày: 2026-03-26


B1) Screen Map

Cấu Hình Nội Bộ > Quản Lý Công Việc
├── SCR-01: TourFeeConfig — Trang Cấu Hình Tiền Tour (NEW, gộp Group + Tag)
│   ├── TourFeeGroupAccordion (per nhóm)
│   │   ├── TourFeeTagTable (bảng tags trong nhóm)
│   │   └── TourFeeUsageExpand ("Đang dùng bởi N mã CV")
│   └── TaskTagForm (side dialog, reuse)
├── SCR-02: SubTaskTable (sửa) — Bảng Mã Công Việc + cột tag + filter
├── SCR-03: SubTaskForm (sửa) — Form Chỉnh sửa Mã Công Việc + enriched chip

Blast radius (ngoài settings):
├── SCR-04: TaskForm (projects, sửa) — Dropdown "Loại tiền tour" enriched
├── SCR-05: OrderTaskLimitForm (ecommerce, sửa) — Tag display enriched
└── SCR-06: ServiceSubtaskItem (ecommerce, sửa) — Tag display enriched

B2) Component Inventory

SCRComponentFileLoạiFR
SCR-01TourFeeConfigsettings/pages/TourFeeConfig.tsxNewFR-001, FR-002, FR-003
SCR-01TourFeeGroupAccordionsettings/components/tour-fee/TourFeeGroupAccordion.tsxNewFR-001
SCR-01TourFeeTagTablesettings/components/tour-fee/TourFeeTagTable.tsxNewFR-002
SCR-01TourFeeUsageExpandsettings/components/tour-fee/TourFeeUsageExpand.tsxNewFR-003
SCR-02SubTaskTablesettings/components/subtask/SubTaskTable.tsxSửaFR-007
SCR-03SubTaskFormsettings/components/subtask/SubTaskForm.tsxSửaFR-004, FR-005, FR-006
SCR-03TaskTagSelectsettings/components/task-tag/TaskTagSelect.tsxSửaFR-004, FR-006
SCR-04TaskForm (section tag)projects/components/TaskForm/index.tsxSửa (indirect)FR-004, FR-006
SCR-05OrderTaskLimitFormecommerce/components/order/OrderForm/OrderTaskLimitForm.tsxSửaFR-004
SCR-06ServiceSubtaskItemecommerce/components/service/ServiceForm/ServiceSubtaskItem.tsxSửaFR-004

B3) User Flows

Flow 1: IT Staff cấu hình tiền tour (tạo tag mới)

[Sidebar] Click "Cấu Hình Tiền Tour"
    → [SCR-01] TourFeeConfig hiện tất cả nhóm
    → Click ▼ nhóm "Tiền tour 2024" → expand
    → Click [+ Thêm tag tiền tour]
    → Side dialog: TaskTagForm mở, nhóm pre-fill "Tiền tour 2024"
    → Nhập mã, tên, bảng tiền tour 5 cấp
    → Click [Lưu]
    → Tag xuất hiện trong bảng nhóm
    → Refresh "Đang dùng bởi" count

Flow 2: IT Staff gán tag vào subtask

[Sidebar] Click "Mã Công Việc"
    → [SCR-02] SubTaskTable hiện 275+ items, có cột "Tag tiền tour"
    → Filter theo [Nhóm tiền tour: Tiền tour 2024 ▼]
    → Click edit SUB280 "Tạo hình tai vểnh"
    → [SCR-03] SubTaskForm mở
    → Field "Tag tiền tour": chip [T08 — 80,000đ ×]
    → Hover chip → tooltip hiện 5 cấp bậc
    → Search thêm tag → dropdown hiện [Mã] [Tên] [Range] [Nhóm]
    → Click [Cập nhật]

Flow 3: KTV chọn tag khi tạo subtask (blast radius)

[Chi tiết khách hàng] Tab Công Việc
    → Click "Thêm công việc" (tạo subtask)
    → [SCR-04] TaskForm mở
    → Field "Loại tiền tour *"
    → Dropdown hiện: T26 100k 100,000đ (Tiền tour 2024)
    → Chọn T26
    → Tiền tour auto-fill theo cấp bậc KTV

B4) Notification Spec

Không có notification trong feature này.


B5) Permission Matrix

Màn hìnhActionIT StaffIT LeaderAdminManagerStaff (KTV)
SCR-01 TourFeeConfigXem nhóm + tagsẨnẨn
SCR-01 TourFeeConfigCRUD nhóm + tagsẨnẨn
SCR-02 SubTaskTableXem listẨnẨn
SCR-02 SubTaskTableCRUD subtaskẨnẨn
SCR-03 SubTaskFormXem + sửaẨnẨn
SCR-04 TaskForm (tag select)Chọn tag khi tạo subtask✅ (subtask mình assign)
SCR-05 OrderTaskLimitFormXem tag display✅ (branch)✅ (order mình)
SCR-06 ServiceSubtaskItemXem tag displayẨnẨn

SCR-01, SCR-02, SCR-03: Giữ nguyên permission UserRole.ITLeader, UserRole.ITStaff từ module.ts. SCR-04, SCR-05, SCR-06: Giữ nguyên permission hiện tại — chỉ sửa display format.


B6) State Matrix

Màn hìnhLoadingEmptyErrorNo Permission
SCR-01 TourFeeConfigSkeleton accordion (3 nhóm placeholder)"Chưa có nhóm tiền tour. Bấm [+ Nhóm] để tạo."Toast "Không thể tải dữ liệu"Ẩn menu hoàn toàn
SCR-01 TourFeeUsageExpandSpinner inline"Chưa có mã công việc nào sử dụng"Toast error
SCR-02 SubTaskTable (cột tag)"..." placeholder"—" (dash)Toast errorẨn menu
SCR-03 SubTaskForm (tag chip)Skeleton chipsText "Chưa chọn tag tiền tour"Toast errorẨn form
SCR-03 TooltipSpinner nhỏ"Chưa có tiền tour""Không thể tải"
SCR-04 TaskForm (tag dropdown)Loading spinner trong dropdownDropdown trốngToast errorẨn field
SCR-05/06 Tag display"...""—""—"Ẩn section

B7) Copy Text Dictionary

Key (i18n)Text (VI)Màn hìnhGhi chú
settings.label.tour_fee_configCấu Hình Tiền TourSCR-01Page title + sidebar
settings.label.tour_fee_group_summary{count} tags · {active} đang hoạt độngSCR-01Collapsed group summary
settings.label.tour_fee_range_flat{amount}đSCR-01Flat-rate display
settings.label.tour_fee_range_multi{min}~SCR-01Multi-rate display
settings.label.tour_fee_detail_flatCĐ1-{n}: đềuSCR-01Flat detail
settings.label.tour_fee_no_configChưa có tiền tourSCR-01Empty tour fee
settings.label.tour_fee_usageĐang dùng bởi: {count} mã công việcSCR-01Usage footer
settings.label.tour_fee_usage_emptyChưa có mã công việc nào sử dụngSCR-01Empty usage
settings.label.tour_fee_add_tagThêm tag tiền tourSCR-01Add button
settings.label.tour_fee_add_groupThêm nhómSCR-01Add group button
settings.label.subtask_menuMã Công ViệcSidebarRename from "Công Việc"
settings.label.subtask_edit_titleCHỈNH SỬA MÃ CÔNG VIỆCSCR-03Rename form title
settings.label.subtask_create_titleTẠO MÃ CÔNG VIỆCSCR-03Rename form title
settings.label.tag_tour_feeTag tiền tourSCR-02, SCR-03Column + field label
settings.label.tag_tour_fee_searchTìm tag tiền tour...SCR-03Search placeholder
settings.label.tooltip_view_detailXem chi tiếtSCR-03Tooltip link
settings.label.tour_fee_group_filterNhóm tiền tourSCR-02Filter label

B8) Analytics Events

EventTriggerDataMục đích
tour_fee_config_viewedIT Staff mở trang Cấu Hình Tiền Tour{ user_role }Track adoption trang mới
tour_fee_group_expandedExpand nhóm{ group_id, tag_count }Track nhóm nào hay dùng
tour_fee_usage_viewedClick "Xem ↗" usage{ group_id, subtask_count }Track nhu cầu traceability
subtask_tag_filter_usedDùng filter tag/nhóm trên SubTaskTable{ filter_type }Track adoption filter mới

B9) Tooltip Dictionary

Màn hìnhField/IconTooltip TextĐiều kiện hiện
SCR-01Range columnKhoảng tiền tour từ cấp thấp nhất đến cao nhấtHover header "Range"
SCR-01Chi tiết columnTiền tour chi tiết theo từng cấp bậcHover header "Chi tiết"
SCR-01"Đang dùng bởi"Số mã công việc (subtask) đang gán tag thuộc nhóm nàyHover text
SCR-03Tag chipBảng tiền tour theo cấp bậc + link xem chi tiếtHover chip tag
SCR-03"Tag tiền tour" labelChọn tag tiền tour để gán cho mã công việc nàyHover label

B-Desktop: Wireframes

SCR-01: TourFeeConfig — Trang gộp

┌─── CẤU HÌNH TIỀN TOUR ────────────────────────────────────────────┐
│                                                                      │
│  [🔍 Tìm theo mã, tên, số tiền...]  [Nhóm: Tất cả ▼]  [+ Nhóm]  │
│                                                                      │
│  ┌─── Tiền tour 2024 ──────────────────────── [Sửa nhóm] [▼] ──┐  │
│  │                                                                │  │
│  │  ┌────┬───────┬─────────┬───────────────────┬───────┬─────┐  │  │
│  │  │ Mã │ Tên   │ Range   │ Chi tiết          │T.thái │     │  │  │
│  │  ├────┼───────┼─────────┼───────────────────┼───────┼─────┤  │  │
│  │  │T26 │ 100k  │100,000đ │ CĐ1-5: đều 100k  │  ✅  │[Sửa]│  │  │
│  │  │T15 │LaserX │50k-120k │ CĐ1:50k CĐ5:120k │  ✅  │[Sửa]│  │  │
│  │  │T08 │ Ok    │ 80,000đ │ CĐ1-5: đều 80k   │  ❌  │[Sửa]│  │  │
│  │  └────┴───────┴─────────┴───────────────────┴───────┴─────┘  │  │
│  │                                                                │  │
│  │  [+ Thêm tag tiền tour]                                      │  │
│  │  Đang dùng bởi: 45 mã công việc                   [Xem ↗]  │  │
│  └────────────────────────────────────────────────────────────────┘  │
│                                                                      │
│  ┌─── Tiền tour 2023 ──────────────────────── [Sửa nhóm] [▶] ──┐  │
│  │  12 tags · 8 đang hoạt động                                    │  │
│  └────────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────────┘

SCR-02: SubTaskTable — Bảng Mã Công Việc (sau)

┌─── MÃ CÔNG VIỆC ─────────────────────────────────────────────────────┐
│                                                                        │
│ [🔍 Tìm kiếm...] [Loại ▼] [Nhóm TT ▼] [Tag TT ▼] [Trạng thái ▼]  │
│                                                                        │
│ ┌────┬────────┬──────────┬───────────────────┬──────────────────┬───┐ │
│ │ #  │ Mã     │ Loại     │ Tên công việc     │ Tag tiền tour    │TT │ │
│ ├────┼────────┼──────────┼───────────────────┼──────────────────┼───┤ │
│ │ 1  │ SUB280 │ Dịch vụ  │ Tạo hình tai vểnh│ T08: 80,000đ    │ ✅│ │
│ │ 2  │ SUB279 │ Dịch vụ  │ BS- Meso da chất │ T26: 100k       │ ✅│ │
│ │ 3  │ SUB278 │ Dịch vụ  │ BS- Meso HA căng │ T26: 100k, T15  │ ✅│ │
│ │ 4  │ SUB089 │ Thủ công │ Chăm sóc cơ bản  │ —               │ ✅│ │
│ └────┴────────┴──────────┴───────────────────┴──────────────────┴───┘ │
└───────────────────────────────────────────────────────────────────────┘

SCR-03: SubTaskForm — Tag chip enriched + tooltip

┌─── CHỈNH SỬA MÃ CÔNG VIỆC ──────────────────────────────────────┐
│                                                                     │
│  Mã công việc *         Mô tả                                     │
│  [SUB280] (readonly)    [Tạo hình tai vểnh                    ]   │
│                                                                     │
│  Loại công việc *       Tag tiền tour *                            │
│  [Làm dịch vụ  ▼]      ┌──────────────────────────────────────┐  │
│                          │ 🔍 Tìm tag tiền tour...             │  │
│  Tên công việc *        │                                      │  │
│  [Tạo hình tai vểnh]   │ [T08 — 80,000đ ×]                   │  │
│                          │                                      │  │
│  Trạng thái             │  ┌─── Tooltip ──────────────────┐   │  │
│  🟢 Đang hoạt động      │  │ T08 — Ok                     │   │  │
│                          │  │ Nhóm: Tiền tour 2024        │   │  │
│                          │  │                               │   │  │
│                          │  │ Cấp độ 1    80,000đ         │   │  │
│                          │  │ Cấp độ 2    80,000đ         │   │  │
│                          │  │ Cấp độ 3    80,000đ         │   │  │
│                          │  │ Cấp độ 4    80,000đ         │   │  │
│                          │  │ Cấp độ 5    80,000đ         │   │  │
│                          │  │                               │   │  │
│                          │  │ [Xem chi tiết ↗]            │   │  │
│                          │  └───────────────────────────────┘   │  │
│                          └──────────────────────────────────────┘  │
│                                                                     │
│                            [Hủy]  [Cập nhật]                      │
└─────────────────────────────────────────────────────────────────────┘

SCR-04: TaskForm (projects) — Dropdown enriched

┌─── TẠO CÔNG VIỆC CON ──────────────────────────────────────────────┐
│                                                                      │
│  Loại tiền tour *                                                   │
│  ┌──────────────────────────────────────────────────────────────┐   │
│  │ T08 — Ok — 80,000đ (Tiền tour 2024)                     ▼  │   │
│  └──────────────────────────────────────────────────────────────┘   │
│                                                                      │
│  Khi dropdown mở:                                                   │
│  ┌──────────────────────────────────────────────────────────────┐   │
│  │ T26  100k          100,000đ  (Tiền tour 2024)               │   │
│  │ T15  Laser CO2     50k~120k  (Tiền tour 2024)               │   │
│  │ T08  Ok             80,000đ  (Tiền tour 2024)               │   │
│  │ T03  Massage        30k~60k  (CHĂM SÓC DA)                 │   │
│  └──────────────────────────────────────────────────────────────┘   │
│       ↑ mã   ↑ tên      ↑ range      ↑ nhóm                       │
└──────────────────────────────────────────────────────────────────────┘

SCR-05/06: OrderTaskLimitForm + ServiceSubtaskItem — Display enriched

TRƯỚC:
  Tag: Ok, 100k            (text xanh link cho IT, đen cho role khác)

SAU:
  Tag: T08 (80,000đ), T26 (100,000đ)    (giữ nguyên màu + link behavior)

B-Edge Cases

#Tình huốngBehaviorSCR
EC-01Nhóm tiền tour rỗng (0 tags)Nhóm vẫn hiện, expand hiện "Chưa có tag. Bấm [+ Thêm tag tiền tour]"SCR-01
EC-02Tag chưa cấu hình tiền tour (0 tour_moneys)Range = "—", Chi tiết = "Chưa có tiền tour", Chip = "[T08 — —]"SCR-01, SCR-03
EC-03Subtask type = "Thủ công" → tag không bắt buộcField "Tag tiền tour" readonly, cột bảng hiện "—"SCR-02, SCR-03
EC-04Subtask có 4+ tags → chips overflowMax-width container, chips wrap to next line. SubTaskTable cột tag hiện 2 tags + "+2 more"SCR-03, SCR-02
EC-05Search tag không tìm thấyDropdown trống + "Không tìm thấy"SCR-03, SCR-04
EC-06Xóa nhóm có tags đang dùngBlock xóa + toast "Nhóm đang có {N} tag. Xóa hoặc chuyển tag trước."SCR-01
EC-07Route cũ /task-tag/abc123Redirect → /tour-fee-config?tag=abc123, auto-expand nhóm chứa tag, highlight tagSCR-01
EC-08Tag disabled → hiện trong chip subtaskChip hiện bình thường (đã gán rồi), dropdown search filter ra disabledSCR-03
EC-09Tất cả cấp bậc tiền tour = 0Range = "0đ", Chi tiết = "CĐ1-5: đều 0"SCR-01
EC-10Group có 50+ tagsBảng tags trong accordion có pagination (20 per page)SCR-01