Bỏ qua, đến nội dung

Câu hỏi thường gặp (FAQ) — Form Drafts

Câu hỏi chung

Draft lưu ở đâu?

Draft lưu trong IndexedDB của trình duyệt (database tên FormDraftsDB). Đây là cơ chế lưu trữ phía client, không đồng bộ giữa các thiết bị hoặc trình duyệt khác nhau.

Dung lượng lưu draft có giới hạn không?

IndexedDB thường có giới hạn ~50MB hoặc không giới hạn tuỳ trình duyệt, lớn hơn nhiều so với localStorage (~5MB). Với form thông thường, bạn không cần lo về dung lượng.

Draft có tự động bật cho tất cả form không?

Không. Sau khi kích hoạt plugin, bạn cần bật switch Enable drafts trong cấu hình Draft settings của từng form block. Điều này cho phép kiểm soát form nào cần lưu nháp.

Đóng tab rồi mở lại, có khôi phục được không?

Có. Khi mở lại cùng form (cùng form block + cùng record), plugin kiểm tra IndexedDB. Nếu tìm thấy draft có dữ liệu, form sẽ được điền lại tự động và hiển thị thông báo cảnh báo.

Tôi submit form thành công, draft có bị xoá không?

Có. Plugin đăng ký behavior deleteDraftBehavior trên event formSubmitSuccess — draft tự động bị xoá ngay sau khi submit thành công.

Draft có riêng cho mỗi user không?

Draft được xác định bằng UID gồm widget_uid + record_id. Vì mỗi user đăng nhập trên trình duyệt riêng, draft tự nhiên tách biệt. Tuy nhiên nếu 2 user dùng chung trình duyệt và cùng profile, draft có thể bị chồng.

Xử lý lỗi thường gặp

Draft không tự động lưu

Nguyên nhân phổ biến:

  1. Chưa bật draft cho form: Kiểm tra cấu hình form block → Draft settings → Enable drafts phải ở trạng thái bật
  2. IndexedDB bị chặn: Một số chế độ duyệt web riêng tư (incognito) có thể giới hạn IndexedDB
  3. Dung lượng IndexedDB đầy: Hiếm xảy ra nhưng có thể xử lý bằng cách xoá dữ liệu trình duyệt

Cách kiểm tra:

  1. Mở DevTools (F12) → tab ApplicationIndexedDB → tìm FormDraftsDB
  2. Xem object store drafts có bản ghi cho form đó không

Xoá cache trình duyệt mất draft

Đây là hành vi đúng. IndexedDB là dữ liệu trình duyệt — khi xoá "Clear browsing data" bao gồm "Site data", IndexedDB sẽ bị xoá cùng. Nếu cần bảo vệ draft:

  • Không chọn "Cookies and other site data" khi xoá cache
  • Hoặc cân nhắc sử dụng giải pháp lưu draft phía server (nếu plugin hỗ trợ trong tương lai)

Form hiển thị dữ liệu cũ không mong muốn

Nếu draft bị "kẹt" với dữ liệu cũ không muốn:

  1. Nhấn nút "Xoá bản nháp" (Delete draft) trên thanh cảnh báo
  2. Hoặc xoá thủ công trong DevTools → Application → IndexedDB → FormDraftsDBdrafts → xoá bản ghi

Draft không khôi phục sau khi đổi URL/route

Draft gắn với widget_uid của form block. Nếu form block thay đổi (bị xoá và tạo lại), UID mới sẽ khác — draft cũ không khớp nữa. Đây là hạn chế thiết kế.

Câu hỏi kỹ thuật

Dữ liệu draft có được mã hoá không?

Không. Dữ liệu lưu dạng plaintext trong IndexedDB. Nếu form chứa thông tin nhạy cảm, cần cân nhắc:

  • Sử dụng HTTPS
  • Không bật draft cho form chứa dữ liệu bí mật
  • Giáo dục user không dùng máy tính công cộng

Kiểu dữ liệu nào không lưu được vào draft?

Plugin clone giá trị form bằng JSON.parse(JSON.stringify(values)), nên các kiểu không serializable sẽ bị mất:

KiểuKết quả
string, number, boolean✅ Lưu bình thường
object, array✅ Lưu bình thường
null✅ Lưu bình thường
Date⚠️ Chuyển thành string ISO
undefined❌ Bị bỏ qua
function❌ Bị bỏ qua
Symbol❌ Bị bỏ qua
Circular reference❌ Gây lỗi

Plugin có hỗ trợ server-side draft không?

Hiện tại không. Phía server (plugin.ts) là shell trống — toàn bộ logic draft nằm ở client và IndexedDB. Nếu cần đồng bộ draft giữa các thiết bị, bạn sẽ phải phát triển thêm phần server.