From d7a91efa7b4be2c1ad2abef836e1b5fff81da63c Mon Sep 17 00:00:00 2001 From: supalerk-ar66 Date: Wed, 11 Feb 2026 15:32:31 +0700 Subject: [PATCH] feat: implement user registration page with form validation, authentication integration, and Quasar notifications. --- Frontend-Learner/pages/auth/register.vue | 45 +++++++++++++++++++----- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Frontend-Learner/pages/auth/register.vue b/Frontend-Learner/pages/auth/register.vue index c2993e50..0081ba3d 100644 --- a/Frontend-Learner/pages/auth/register.vue +++ b/Frontend-Learner/pages/auth/register.vue @@ -103,13 +103,40 @@ const onUsernameInput = (val: string | number | null) => { } }; -const onPhoneInput = (val: string | number | null) => { - const value = String(val || '') - registerForm.phone = value; - if (/\D/.test(value)) { - errors.value.phone = 'กรุณากรอกเฉพาะตัวเลข'; - } else { - if (errors.value.phone === 'กรุณากรอกเฉพาะตัวเลข') clearFieldError('phone'); +const onPhoneInput = (e: Event) => { + const input = e.target as HTMLInputElement + let value = input.value + + // กรองทุกอย่างที่ไม่ใช่ตัวเลขออกทันที (เผื่อการ Copy-Paste) + value = value.replace(/\D/g, '') + + // จำกัดไม่เกิน 10 หลัก + if (value.length > 10) { + value = value.substring(0, 10) + } + + // เขียนค่าที่กรองแล้วกลับลงไปที่ Input ทันทีเพื่อไม่ให้เห็นตัวอักษร + input.value = value + registerForm.phone = value + + // ล้าง error ทันทีถ้าถูกต้อง + if (value.length <= 10) { + clearFieldError('phone'); + } +}; + +const onPhoneKeydown = (e: KeyboardEvent) => { + // อนุญาตให้กดปุ่มควบคุมต่างๆ ได้ เช่น Backspace, Tab, Enter, ลูกศร + const controlKeys = ['Backspace', 'Tab', 'Enter', 'Escape', 'ArrowLeft', 'ArrowRight', 'Delete', 'v', 'c', 'a']; + + // เช็คว่าเป็นการกด Ctrl/Command + Key หรือเปล่า (เช่น Ctrl+V) + if (e.ctrlKey || e.metaKey) { + if (controlKeys.includes(e.key.toLowerCase())) return; + } + + // ถ้าไม่ใช่ปุ่มควบคุม และไม่ใช่ตัวเลข ให้ยกเลิกการพิมพ์ + if (!controlKeys.includes(e.key) && !/^\d$/.test(e.key)) { + e.preventDefault(); } }; @@ -325,8 +352,10 @@ const handleRegister = async () => {