Skip to main content

Yêu Cầu Chỉnh Sửa: Tạo Mới Qua Modal/Popup Thay Vì Form Inline

Ngày cập nhật: 24/06/2026
File ảnh gốc: z7970695149099_84414135f42107f9c2e8a2f7c6262586.jpg
Áp dụng cho: Toàn bộ Admin CMS


Vấn Đề Hiện Tại

Trong ảnh ví dụ (màn hình Dịch vụ spa), khi Admin click "+ Tạo service", form nhập liệu đang được mở ra theo kiểu inline/trang mới — Admin bị điều hướng rời khỏi trang danh sách hiện tại, mất context đang làm việc.

Vấn đề này xảy ra tương tự trên tất cả các module có chức năng tạo mới trong Admin CMS.

Màn hình Dịch vụ spa - nút Tạo service


Yêu Cầu Thay Đổi

Nguyên tắc chung (áp dụng toàn CMS)

Tất cả chức năng "Tạo mới" phải mở qua Modal/Popup Dialog, KHÔNG điều hướng sang trang mới hoặc hiển thị form inline phía trên danh sách.

Hiện tạiYêu cầu mới
UX flowClick → chuyển trang / form mở bên trênClick → Modal popup xuất hiện
ContextAdmin rời khỏi trang danh sáchAdmin vẫn nhìn thấy danh sách phía sau modal
Sau khi lưuRedirect về trang danh sáchĐóng modal + refresh danh sách tại chỗ
Hủy bỏBấm Back hoặc CancelClick nút ✕ hoặc click ra ngoài modal

Danh Sách Các Module Cần Áp Dụng

Các module trong Admin CMS có nút Tạo mới cần chuyển sang dạng Modal:

#ModuleNút hiện tạiHành vi mới
1Dịch vụ spa+ Tạo serviceMở modal nhập thông tin service
2Chi nhánh+ Tạo chi nhánhMở modal nhập thông tin chi nhánh
3Slide (Banner)Tạo banner mớiMở modal upload ảnh + cấu hình slide
4Sự kiện (Event)+ Tạo sự kiệnMở modal nhập thông tin event
5Tin tức (News)+ Tạo bài viếtMở modal nhập nội dung bài viết
6BigFan+ Tạo bản ghiMở modal nhập liệu BigFan
7Voucher+ Tạo voucherMở modal nhập thông tin voucher
8Lucky Wheel (Vòng quay)+ Thêm phần thưởngMở modal nhập phần thưởng
9Notifications+ Tạo thông báoMở modal soạn thông báo
10Membership Tiers+ Tạo hạngMở modal cấu hình hạng thành viên

⚠️ Lưu ý: Các module có form nhập liệu phức tạp, nhiều bước (ví dụ: tạo service có nhiều tab — thông tin cơ bản, biến thể, tài nguyên...) có thể dùng dạng Multi-step Modal (modal nhiều bước có thanh tiến trình) thay vì chuyển trang.


Thiết Kế Modal Chuẩn

┌─────────────────────────────────────────────┐
│ [Tiêu đề: Tạo service mới] [✕] │
├─────────────────────────────────────────────┤
│ │
│ Tên dịch vụ * │
│ ┌─────────────────────────────────────┐ │
│ │ Nhập tên dịch vụ... │ │
│ └─────────────────────────────────────┘ │
│ │
│ Danh mục * Thời lượng │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Body Treat ▼ │ │ 60 phút ▼ │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ...các trường khác... │
│ │
├─────────────────────────────────────────────┤
│ [Hủy bỏ] [+ Tạo service] │
└─────────────────────────────────────────────┘

Các quy tắc UX cho Modal

Quy tắcChi tiết
BackdropCó lớp mờ phía sau modal, click ra ngoài = đóng modal (có xác nhận nếu đã nhập dữ liệu)
Kích thướcWidth tối đa 600px (desktop), full-screen trên mobile
ScrollNội dung modal cuộn được nếu dài hơn viewport
Focus trapKeyboard focus bị giữ trong modal khi đang mở
Escape keyNhấn Esc = đóng modal
Loading stateNút "Tạo" chuyển sang loading spinner khi đang gửi request
ValidationHiển thị lỗi inline ngay dưới từng trường, không submit khi còn lỗi
SuccessSau khi tạo thành công: đóng modal + toast notification + tự động reload danh sách

Checklist Kỹ Thuật

  • Tạo component <CreateModal /> dùng chung, nhận fields configonSubmit handler
  • Thay thế tất cả action router.push('/create') hoặc inline form bằng openModal()
  • Implement focus trap và keyboard accessibility (Escape, Tab)
  • Sau khi tạo thành công, gọi refetch() / invalidateQueries() để cập nhật danh sách không cần reload trang
  • Xử lý trường hợp người dùng click ra ngoài modal khi đã có dữ liệu nhập → hiện confirm dialog "Bạn có muốn hủy không?"
  • Test responsive trên mobile (full-screen modal)