# UICONV — Quy ước giao diện — | | | |---|---| | **Version** | 1.0 | | **Date** | YYYY-MM-DD | | **Author** | (skill ba-3-specification, activity `uiconv`) | | **Status** | 🟡 Draft | | **Approved by** | Designer: — · PO: — | | **Source** | | | **Scope** | Toàn project — mọi `SRS` và `WF` có `PRODUCT = screen` | | **Profile** | `screen · … · …` | ## Change Log | Version | Date | Người sửa | Thay đổi | CR | |---|---|---|---|---| | 1.0 | | | Bản đầu | — | > **Vai trò của tài liệu này.** Một project có nhiều `SRS`, mỗi lần chạy tối đa 3 US. Không có > tài liệu này thì mỗi `SRS` tự đặt một kiểu phân trang, một vị trí toast, một định dạng ngày. > `SRS` và `WF` **tham chiếu** mục ở đây thay vì định nghĩa lại; muốn lệch phải ghi vào §12. > > **Thứ tự ưu tiên khi lệch:** Design system của dự án (nếu có) > Prototype đã duyệt > `UICONV` > > `SRS` từng US. `SRS` chỉ được ghi khác `UICONV` khi có dòng ở §12. --- ## 0. Nguồn | | | |---|---| | **Design system** | *(tên + version + link, hoặc "Chưa có — dev chọn theo NFR, quy ước ở đây là ràng buộc tối thiểu")* | | **Prototype tham chiếu** | *(đường dẫn / URL / mục SAD, phiên bản, ngày)* | | **Guideline sẵn có của dự án** | *(vd: GLOBAL_UI_CONVENTION.md — nếu có thì file này chỉ bổ khuyết, không chép lại)* | | **Ai sở hữu quy ước** | BA đề xuất · **Designer duyệt** · PO duyệt phần text/giọng văn | | **Nền tảng** | Web desktop / web responsive / app di động — *(theo BRIEF)* | ## 1. Khung layout | | | |---|---| | **Grid** | *(số cột · gutter px · max-width px)* | | **Header cố định** | Có / Không — chứa: *(logo, tìm kiếm toàn cục, ngôn ngữ, tài khoản…)* | | **Sidebar / menu** | Trái cố định / thu gọn được / không có | | **Footer** | Có / Không — chứa: | | Breakpoint | Khoảng (px) | Sidebar | Bảng dữ liệu | Form | |---|---|---|---|---| | Desktop | ≥ 1024 | Hiện | Bảng | 2 cột | | Tablet | 768–1023 | Thu gọn icon | Bảng cuộn ngang | 1 cột | | Mobile | < 768 | Ẩn sau nút menu | **Card** | 1 cột | ## 2. Điều hướng | Câu hỏi | Quy ước | |---|---| | Quay lại từ màn hình chi tiết/form | Nút Back **và** breadcrumb — cả hai | | Quay lại có giữ trạng thái danh sách (trang, bộ lọc, sắp xếp)? | ✅ Giữ, qua query string | | Vào bằng URL trực tiếp với id không tồn tại | Trang trạng thái "Không tìm thấy" + nút về danh sách | | Vào bằng URL trực tiếp không có quyền | Trang "Không có quyền" + nút về trang chủ; **không** lộ tên bản ghi | | Rời màn hình khi form đang dở | Modal xác nhận "Rời trang? Thay đổi chưa lưu sẽ mất." | | Menu với chức năng không có quyền | ❌ Ẩn (W7) | | Mở chi tiết | Cùng tab, đổi URL | ## 3. Danh sách | | | |---|---| | **Kiểu phân trang** | Offset (`page`, `size`) / Cursor / Cuộn vô hạn | | **Số dòng mỗi trang** | Mặc định … · tuỳ chọn … | | **Sắp xếp mặc định** | *(vd: ngày tạo giảm dần)* | | **Bấm vào dòng** | Mở chi tiết / Chỉ nút "Chi tiết" mới mở | | **Cột hành động** | Cột cuối, icon + tooltip / Menu ⋯ | | **Chọn nhiều dòng** | Checkbox cột đầu, thanh hành động hàng loạt xuất hiện phía trên | | **Tìm kiếm** | Gõ rồi Enter / Gợi ý sau khi ngừng gõ … ms | | **Bộ lọc** | Thanh ngang trên bảng (desktop) · nút "Lọc" mở bottom-sheet (mobile) | | **Cột trên mobile** | Bảng → card; card hiện tối đa … trường: *(liệt kê thứ tự ưu tiên chung)* | ## 4. Form | | | |---|---| | **Vị trí nút** | Lưu (nút chính) **bên phải**, Huỷ (nút phụ) bên trái nút Lưu | | **Đánh dấu bắt buộc** | Dấu `*` màu cảnh báo sau nhãn | | **Thời điểm validate** | Khi rời field (blur) **và** khi bấm Lưu | | **Vị trí message lỗi** | Ngay dưới field, thay chỗ hint; field viền cảnh báo | | **Lỗi nhiều field** | Focus vào field lỗi đầu tiên, cuộn tới nó | | **Lỗi từ server không gắn field** | Banner đầu form | | **Sau lỗi mạng/5xx** | 🔴 **Giữ nguyên dữ liệu đã nhập**, mở lại nút Lưu | | **Đang gửi** | Khoá toàn form, spinner trong nút Lưu, nhãn đổi "Đang lưu…" | | **Huỷ khi có thay đổi** | Modal xác nhận | | **Nhãn field** | Trên field (không đặt cạnh trái) | | **Nút Lưu khi form chưa hợp lệ** | Bấm được, hiện lỗi / 🔒 disable — *(chọn một)* | ## 5. Phản hồi hệ thống | Loại | Dùng khi | Vị trí | Thời lượng | Có nút đóng | |---|---|---|---|---| | **Toast thành công** | Lưu/xoá thành công | Góc trên phải (desktop) · trên cùng (mobile) | 3 s tự đóng | ✅ | | **Toast lỗi** | Lỗi không gắn field, có thể thử lại | Như trên | Không tự đóng | ✅ | | **Modal xác nhận** | Hành động không hoàn tác được (xoá, gửi duyệt) | Giữa màn | — | Nút chính bên **phải**; hành động nguy hiểm dùng nút nguy hiểm | | **Inline dưới field** | Lỗi validation | Dưới field | Tới khi sửa | — | | **Banner trong vùng** | Lỗi tải một vùng dữ liệu | Trong vùng đó | Tới khi thử lại | Nút Thử lại | | **Trang trạng thái** | 404 / 403 / lỗi toàn trang | Toàn trang | — | Nút về danh sách/trang chủ | ## 6. Trạng thái chuẩn | Trạng thái | Hiển thị | Text mặc định (VI) | Text (EN) | Nút | |---|---|---|---|---| | Đang tải danh sách | Skeleton … dòng | — | — | — | | Đang tải chi tiết/form | Skeleton theo bố cục | — | — | — | | Đang tải cục bộ (dropdown, tính lại) | Spinner nhỏ tại chỗ | — | — | — | | **Rỗng — chưa có dữ liệu nào** | Minh hoạ + câu dẫn + nút chính | "Chưa có <đối tượng> nào." | | Tạo mới | | **Rỗng — bộ lọc không khớp** | Câu dẫn + nút phụ *(không minh hoạ, để khác loại trên)* | "Không tìm thấy kết quả phù hợp với bộ lọc." | | Xoá lọc | | Lỗi tải | Banner trong vùng | "Không tải được dữ liệu." | | Thử lại | | Không có quyền | Trang trạng thái | "Bạn không có quyền truy cập nội dung này." | | Về trang chủ | | Không tìm thấy | Trang trạng thái | "Không tìm thấy nội dung yêu cầu." | | Về danh sách | `SRS` §2.3.6 chỉ ghi **phần khác** với bảng này (vd: câu dẫn riêng cho đối tượng), còn lại tham chiếu. ## 7. Ẩn · khoá · read-only *(quy tắc W7)* | Trạng thái | Trình bày | Bắt buộc kèm | |---|---|---| | `❌ ẩn` | Không render | — | | `🔒 disable` | Mờ 45%, con trỏ mặc định | **Tooltip nêu lý do** khi hover/focus | | `👁 read-only` | Giá trị dạng text, không viền ô nhập, nhãn giữ nguyên | — | ## 8. Định dạng hiển thị *`SRS` §4.3 tham chiếu bảng này; chỉ ghi khác khi có dòng ở §12.* | Loại | Định dạng | Ví dụ | Ghi chú | |---|---|---|---| | Ngày | `dd/MM/yyyy` | 30/08/2026 | | | Ngày giờ | `dd/MM/yyyy HH:mm` | 30/08/2026 14:05 | **Múi giờ hiển thị:** … *(theo người dùng / cố định UTC+7)* | | Lưu trữ thời gian | ISO-8601 UTC | | Khớp `API` §1 | | Số | `#,##0` | 1.234.567 | Dấu phân cách: … | | Tiền | `#,##0 ₫` | 1.234.567 ₫ | Làm tròn: … · đa tiền tệ: … | | Phần trăm | `0,0 %` | 12,5 % | | | Rỗng / null | `—` | | Thống nhất toàn hệ thống | | Số lớn (id) | Hiển thị nguyên văn chuỗi | | Không format | ## 9. Ngôn ngữ và giọng văn | | | |---|---| | **Ngôn ngữ hỗ trợ** | VI (mặc định) · EN · … — thiếu bản dịch ⇒ hiện **khoá** hay **VI**? *(chọn một)* | | **Xưng hô** | "bạn" / không xưng hô | | **Thông điệp lỗi** | Nói **vì sao** và **làm gì tiếp**; không mã kỹ thuật; kết thúc bằng dấu chấm | | **Nhãn nút** | Động từ, viết hoa chữ đầu: "Tạo mới", "Lưu", "Huỷ" | | **Tiêu đề màn hình** | Danh từ: "Danh sách cửa hàng" | | **Độ dài nhãn tối đa** | … ký tự — để không vỡ ở ngôn ngữ dài (KO/DE) | | **Khoá i18n** | `..` — vd `scr01.search.ph` | ## 10. Dãy mã lỗi | Dãy | Module / phạm vi | Số kế tiếp chưa dùng | Ai cấp | |---|---|---|---| | `E--` | | 0001 | BA | ## 11. Từ vựng thành phần *`WF` §3.x.2 cột "Kiểu trình bày" chỉ dùng từ ở cột đầu. Cột thứ hai map sang design system khi có.* | Kiểu trình bày | Component trong design system | Dùng khi | |---|---|---| | Nút chính | | Một hành động chính mỗi màn hình | | Nút phụ | | Huỷ, hành động thứ cấp | | Nút nguy hiểm | | Xoá, huỷ đơn — luôn kèm modal xác nhận | | Liên kết | | Điều hướng trong text | | Ô nhập | | | | Ô nhập số | | | | Chọn 1 | | ≤ 7 lựa chọn: radio · > 7: dropdown có tìm | | Chọn nhiều | | | | Chọn ngày / khoảng ngày | | | | Công tắc | | Bật/tắt có hiệu lực ngay | | Bảng | | Desktop | | Card | | Mobile, hoặc dữ liệu ít cột | | Badge trạng thái | | Trạng thái vòng đời (BR §3) | | Tab | | Nhóm nội dung cùng cấp trong một màn hình | | Modal | | Form ngắn ≤ 6 field, xác nhận | | Drawer | | Form dài, chi tiết nhanh | | Bottom-sheet | | Bộ lọc trên mobile | | Toast | | §5 | | Skeleton | | §6 | ## 12. Ngoại lệ đã duyệt *`SRS`/`WF` lệch quy ước ⇒ phải có dòng ở đây. Không có dòng ⇒ lệch là lỗi, không phải quyết định.* | # | Tài liệu | Mục lệch | Quy ước | Thực tế | Vì sao | Ai duyệt | Ngày | |---|---|---|---|---|---|---|---| ## 13. Open Questions | ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì | |---|---|---|---|---| --- ## Tự chấm | # | Tiêu chí | ☐/✅ | |---|---|---| | 1 | Mọi ô "chọn một" đã chọn, không còn dấu `/` giữa các phương án | | | 2 | §6 có hai trạng thái rỗng **trông khác nhau** | | | 3 | §8 có múi giờ hiển thị và quy tắc làm tròn tiền | | | 4 | §11 mọi kiểu trình bày dùng trong `WF` hiện có đều có dòng | | | 5 | Có chữ ký Designer (hoặc ghi rõ dự án không có Designer ⇒ PO ký thay, `DEC-nn`) | |