Nghiên cứu & CN cao

src/frontend/app/components/modal/business/AchievementEditor.vuesrc/frontend/app/components/modal/business/AchievementEditor.vuesrc/frontend/app/compo

🏢 Doanh nghiệp: Công ty CP Giải pháp TechViet1 phút đọc
src/frontend/app/components/modal/business/AchievementEditor.vuesrc/frontend/app/components/modal/business/AchievementEditor.vuesrc/frontend/app/compo

M1 · [LOGIC] Profile: regex SĐT /^0\d{9}$/ khóa user cũ. DN đã lưu SĐT không bắt đầu bằng 0 → mở Sửa, field pre-fill fail validate → không lưu được hồ sơ. → xác nhận prod không có SĐT khác 0, hoặc normalize khi load. (Validate FE/BE + message đã khớp — verified.)

M2 · [LOGIC] Achievement: soft-delete giữ file cover nhưng KHÔNG có restore → rò rỉ storage. Cover của thành tích đã xóa mồ côi vĩnh viễn (comment "giữ để restore" nhưng không có endpoint restore). → thêm restore, hoặc vẫn dọn cover + sửa comment.

M3 · [LOGIC] Achievement: hidden_by_cascade chưa hiện "đã ẩn" ở trang chi tiết owner. business/achievements/[id].vue chỉ check === 'hidden' → owner mở thành tích bị ẩn-do-DN-ẩn thấy như bài live, không banner (mâu thuẫn bảng). → coi hidden_by_cascade như hidden.

M4 · [UI/UX] Toast trùng icon ở ResetPassword (ngoài scope popup nên bị bỏ sót): ResetPassword.vue:107 toast.success + title bắt đầu ✓ → hiện 2 dấu check (đúng anti-pattern đợt toast đã dọn). → bỏ ✓ khỏi resetPassword.toast.successTitle (vi+en).

M5 · [UI/UX] BuildingSection: link đã disable nhưng vẫn "trông bấm được". .bld-card còn cursor:pointer + hover nhấc, .bld-cta a vẫn như nút đỏ → hover phản hồi nhưng click vô tác dụng. → khi STORE_URL null: bỏ cursor/hover + ẩn/restyle CTA.

M6 · [UI/UX] Popup Xóa: tên dài ở HEADER chưa truncate. Truncate+tooltip mới áp cho tên ở body (CertificationDelete, DeleteProduct); còn các modal đưa {name}/{title} vào tiêu đề header màu đỏ (DeleteBusiness, DeleteNewsConfirm, ModerationDeleteProduct, DeleteAchievementConfirm, admin/DeleteProduct) → tên rất dài có thể tràn/wrap header. → thêm ellipsis cho .admin-modal__title trong Base.vue.