17 KiB
Task: Refactor Employee Directory Filters to Single Select
Objective
ปรับปรุงระบบ Filter ในหน้ารายชื่อพนักงาน (Employee Directory)
ปัจจุบัน Filter
- บริษัท
- ฝ่าย
- ตำแหน่ง
- สถานะ
เป็นรูปแบบที่สามารถเลือกได้หลายค่า (Multi Select)
ต้องการเปลี่ยนให้เป็น Single Select ทั้งหมด โดยสามารถเลือกได้เพียง 1 ค่าในแต่ละ Filter เพื่อให้ UX และมาตรฐานของระบบเหมือนกับหน้าบทเรียนออนไลน์
Requirements
1. เปลี่ยน Filter เป็น Single Select
เปลี่ยน Filter ต่อไปนี้
- บริษัท
- ฝ่าย
- ตำแหน่ง
- สถานะ
จาก
Multi Select
เป็น
Single Select
สามารถเลือกได้เพียงค่าเดียว
ตัวอย่าง
เดิม
บริษัท
☑ ALLA ☑ ONVALLA
ใหม่
บริษัท
○ ALLA ○ ONVALLA
เลือกได้เพียงค่าเดียว
2. ใช้ Component มาตรฐานเดียวกับระบบ
ห้ามสร้าง Component ใหม่
ให้ใช้ Select Component เดียวกับที่ใช้งานใน
- Online Lessons
- Training Records
- Announcement
- Module อื่นที่ใช้ Select
เพื่อให้ UI และ UX เหมือนกันทั้งระบบ
3. Placeholder
แต่ละ Select
บริษัท
เลือกบริษัท
ฝ่าย
เลือกฝ่าย
ตำแหน่ง
เลือกตำแหน่ง
สถานะ
เลือกสถานะ
4. Clear Filter
เมื่อมีการเลือกค่าแล้ว
ต้องสามารถ
Clear
กลับเป็น
ทั้งหมด
ได้
โดยใช้รูปแบบเดียวกับหน้าอื่นของระบบ
5. URL Search Params
ต้องยังรองรับ
Server Side Filtering
เหมือนเดิม
เช่น
?company=1
?department=15
?position=6
?status=active
โดย
แต่ละ parameter
ต้องมีค่าเดียวเท่านั้น
ไม่ต้องรองรับ array
ห้ามส่ง
company=1,2
หรือ
company[]=1
6. Backend
ตรวจสอบ API
ให้รองรับ
Single Value
เท่านั้น
เช่น
company=1
ไม่ต้องรองรับ
company[]=1&company[]=2
หากยังมี Logic Array
ให้ Refactor ออก
7. State Management
State ของ Filter
ควรเป็น
company?: string
department?: string
position?: string
status?: string
ไม่ควรเป็น
string[]
หรือ
Set<string>
8. UX
เมื่อเลือกค่า
ให้ Reload/Search
ทันที
ไม่ต้องกดปุ่ม Search
Behavior ต้องเหมือนหน้า
Online Lessons
9. Performance
ห้าม Fetch Master Data ซ้ำ
หากมี Cache
ให้ใช้ของเดิม
10. Consistency
ตรวจสอบทุกจุดที่ใช้ Employee Directory Filter
ให้เป็นมาตรฐานเดียวกัน
เช่น
- Toolbar
- Search Params
- API
- Table Refresh
- Pagination
ต้องยังทำงานถูกต้องทั้งหมด
Acceptance Criteria
- บริษัทเป็น Single Select
- ฝ่ายเป็น Single Select
- ตำแหน่งเป็น Single Select
- สถานะเป็น Single Select
- เลือกได้เพียง 1 ค่า
- Clear Filter ได้
- URL ใช้ค่าเดียว
- Backend รองรับค่าเดียว
- Pagination ยังทำงาน
- Sorting ยังทำงาน
- Search ยังทำงาน
- Auto Refresh หลังเลือก Filter
- ใช้ Select Component มาตรฐานเดียวกับระบบ
- ไม่สร้าง UI Component ใหม่
- TypeScript ผ่าน
- ESLint ผ่าน
- Build ผ่าน
11. UI/UX Improvement Requirements
นอกจากการเปลี่ยน Filter เป็น Single Select แล้ว ให้ปรับปรุง Layout และประสบการณ์การใช้งาน (UX) ของ Toolbar ให้เป็นมาตรฐานเดียวกับทั้งระบบ
11.1 จัด Layout ใหม่
จัดเรียง Toolbar ใหม่ให้อ่านง่ายและใช้งานสะดวก
ตัวอย่าง
ค้นหา.......................................................
[บริษัท ▼] [ฝ่าย ▼] [ตำแหน่ง ▼] [สถานะ ▼]
[Reset Filter]
ห้ามวาง Filter แบบกระจัดกระจายหรือขนาดไม่เท่ากัน
11.2 ขนาดของ Select
กำหนดขนาดของ Select ทุกตัวให้เท่ากัน
เช่น
min-w-[180px]
หรือ
w-44
แล้วแต่ Design System ของโปรเจกต์
ทุก Filter ต้องมีความสูงและระยะห่างเท่ากัน
11.3 ใช้มาตรฐานเดียวกับระบบ
Select
Search
Toolbar
Spacing
Border Radius
Height
Padding
Typography
ต้องใช้ Component และ Style เดียวกับ
- Online Lessons
- Announcements
- Training Records
- Module อื่นของ Dashboard
ห้ามสร้าง Design ใหม่
11.4 Reset Filters
เพิ่มปุ่ม
ล้างตัวกรอง
หรือ
Reset Filters
แสดงเฉพาะเมื่อมี Filter ถูกเลือก
เมื่อกดแล้ว
- Search Text
- Company
- Department
- Position
- Status
ต้องกลับเป็นค่าเริ่มต้นทั้งหมด
รวมถึง
- URL Search Params
- Pagination
ต้อง Reset กลับหน้าแรก
11.5 Auto Search
เมื่อเลือกค่าใน Select
ให้ระบบ
- Update URL
- Reload Table
- Reset Pagination ไปหน้าแรก
โดยอัตโนมัติ
ไม่ต้องมีปุ่ม Search
Behavior ต้องเหมือนกับ
Online Lessons
11.6 Responsive
บนหน้าจอขนาดเล็ก
Toolbar ต้องสามารถ Wrap ได้
ตัวอย่าง
Search
Company
Department
Position
Status
Reset
โดย Layout ต้องไม่ล้นหน้าจอ
ไม่เกิด Horizontal Scroll
11.7 Empty State
หาก Filter แล้วไม่พบข้อมูล
ให้แสดง Empty State มาตรฐานของระบบ
เช่น
ไม่พบข้อมูลที่ตรงกับเงื่อนไขการค้นหา
พร้อมปุ่ม
ล้างตัวกรอง
11.8 Accessibility
ทุก Select ต้องมี
- Label
- aria-label
- Keyboard Navigation
- Focus Ring
ตามมาตรฐาน shadcn/ui
11.9 Performance
ห้าม Fetch Master Data ใหม่ทุกครั้งที่เปิด Select
Master Data
- Company
- Department
- Position
- Status
ต้องใช้ Cache หรือ Query เดิมที่ระบบมีอยู่
11.10 Consistency Review
หลังจากแก้ไขแล้ว
ตรวจสอบว่า Toolbar ของ Employee Directory มีมาตรฐานเดียวกับทุกหน้าที่มี Filter ในระบบ ได้แก่
- Online Lessons
- Announcements
- Training Records
- Reports
- Employee Directory
หากพบรูปแบบที่แตกต่างกันโดยไม่มีเหตุผล ให้ปรับให้เป็นมาตรฐานเดียวกันทั้งระบบ
Additional Review
หลังจากแก้ไขเสร็จ
ให้ตรวจสอบเพิ่มเติม
- ไม่มี Console Error
- ไม่มี React Warning
- ไม่มี Hydration Error
- ไม่มี TypeScript Error
- ไม่มี ESLint Error
- Build ผ่าน
- Filter ทุกตัวทำงานถูกต้อง
- Search ทำงานร่วมกับ Filter ได้
- Pagination ทำงานถูกต้อง
- Sorting ทำงานถูกต้อง
- URL Search Params ถูกต้อง
- Refresh หน้าแล้ว Filter ยังแสดงค่าที่เลือกอยู่
12. Filter Standardization (System-wide)
Objective
ตรวจสอบและปรับปรุงระบบ Filter ทั้งหมดในโครงการให้เป็นมาตรฐานเดียวกัน (Filter Standardization)
ปัจจุบันแต่ละ Module ใช้รูปแบบ Filter แตกต่างกัน ทั้ง Component, Layout, URL Parameters และพฤติกรรมการทำงาน
ต้องการให้ทุกหน้ามี UX และ Implementation เดียวกัน เพื่อให้ง่ายต่อการดูแลรักษาและขยายระบบในอนาคต
Scope
ตรวจสอบทุกหน้าที่มี Filter อย่างน้อย ได้แก่
- Employee Directory
- Training Records
- Pending Review
- Online Lessons
- Announcements
- Reports
- Employee History
- Master Review
- Employee Import
- Modules อื่นที่มี Filter
หากพบ Module อื่นที่มี Filter ให้รวมอยู่ใน Scope ด้วย
12.1 Filter Component Standard
Filter ทุกตัวต้องใช้ Component เดียวกัน
เช่น
- Select
- Search Input
- Date Picker
- Multi Select (เฉพาะกรณีจำเป็นจริง)
- Combobox (หากระบบใช้เป็นมาตรฐาน)
ห้ามสร้าง Component ใหม่ที่มีหน้าตาแตกต่างจาก Design System
12.2 Single Select Policy
Master Data Filter
- Company
- Department
- Position
- Status
- Category
- Type
- Policy
- Course
ให้ใช้
Single Select
เป็นค่า Default
ห้ามใช้ Multi Select
ยกเว้น
มี Business Requirement ระบุไว้อย่างชัดเจน
12.3 Toolbar Layout Standard
ทุกหน้าต้องใช้ Layout เดียวกัน
ตัวอย่าง
Search
Company
Department
Status
Date
Reset Filter
ลำดับต้องเหมือนกันทุกหน้า
Search อยู่ซ้ายสุด
Reset อยู่ขวาสุด
12.4 Search Behavior
Search ทุกหน้าต้อง
- Debounce
- Update URL
- Reset Pagination
- Reload Data
โดยอัตโนมัติ
ไม่ต้องมีปุ่ม Search
12.5 Filter Behavior
เมื่อเลือก Filter
ต้อง
- Update URL Search Params
- Reload Table
- Reset Pagination
- Preserve Sorting
เหมือนกันทุก Module
12.6 URL Standard
กำหนดมาตรฐานเดียวกัน
เช่น
?page=1
&pageSize=10
&search=...
&company=1
&department=5
&status=active
&sort=name.asc
ห้ามใช้รูปแบบแตกต่างกันระหว่าง Module
เช่น
company[]=1
status[]=...
หากไม่จำเป็น
12.7 Pagination
เมื่อ Filter เปลี่ยน
Pagination
ต้องกลับไป
หน้า 1
ทุกครั้ง
12.8 Reset Filter
ทุกหน้าที่มี Filter
ต้องมี
Reset Filters
เมื่อกดแล้ว
- Clear Search
- Clear Select
- Clear Date
- Reset URL
- Reset Pagination
- Reload Data
12.9 Responsive
Toolbar ทุกหน้า
ต้องรองรับ
Desktop
Tablet
Mobile
โดย
- Wrap ได้
- ไม่ล้น
- ไม่เกิด Horizontal Scroll
12.10 Empty State
ทุกหน้าต้องใช้ Empty State เดียวกัน
เช่น
ไม่พบข้อมูลที่ตรงกับเงื่อนไขการค้นหา
พร้อมปุ่ม
ล้างตัวกรอง
12.11 Accessibility
Filter ทุกตัวต้องรองรับ
- Keyboard Navigation
- Focus Ring
- aria-label
- Screen Reader
ตามมาตรฐาน shadcn/ui
12.12 Performance
Filter ต้อง
- ไม่ Fetch Master Data ซ้ำ
- ใช้ Cache เดิม
- ไม่เกิด Request ซ้ำ
- ไม่เกิด Infinite Render
12.13 Shared Components
หากพบว่ามีการเขียน Toolbar ซ้ำหลายหน้า
ให้ Refactor
สร้าง Shared Component
เช่น
<DataTableToolbar />
<FilterToolbar />
<SearchToolbar />
<ResetFiltersButton />
เพื่อใช้ร่วมกันทั้งระบบ
โดยต้องไม่ทำให้ Feature เดิมเสีย
12.14 Shared Hook
หากพบ Logic ซ้ำ
ให้สร้าง
useTableFilters()
useSearchParams()
useFilterState()
หรือ Shared Hook ที่เหมาะสม
เพื่อให้ทุก Module ใช้มาตรฐานเดียวกัน
12.15 Code Review
ตรวจสอบและลบ
- Duplicate Logic
- Duplicate Components
- Dead Code
- Legacy Filter
- Unused Search Params
Acceptance Criteria
หลังจากแก้ไขแล้ว
✓ ทุกหน้าใช้ Filter มาตรฐานเดียวกัน
✓ Layout เหมือนกัน
✓ Select ใช้ Component เดียวกัน
✓ Search Behavior เหมือนกัน
✓ URL Format เหมือนกัน
✓ Pagination เหมือนกัน
✓ Reset Filter เหมือนกัน
✓ Responsive ทุกหน้า
✓ Accessibility ผ่าน
✓ ไม่มี Duplicate Components
✓ ไม่มี Duplicate Logic
✓ Shared Components ถูกใช้งานร่วมกัน
✓ Shared Hooks ถูกใช้งานร่วมกัน
✓ ไม่มี TypeScript Error
✓ ไม่มี ESLint Error
✓ Build ผ่าน
✓ ทุก Module ทำงานได้เหมือนเดิม (Backward Compatible)
Final Verification
หลังจากดำเนินการเสร็จ ให้จัดทำรายงานสรุปประกอบด้วย
- รายชื่อทุกหน้าที่มีการปรับปรุง Filter
- รายการ Component ที่ถูก Refactor เป็น Shared Component
- รายการ Hook ที่ถูกสร้างหรือปรับใช้ร่วมกัน
- ตารางเปรียบเทียบพฤติกรรมของ Filter ก่อนและหลังการปรับปรุง
- รายการจุดที่ยังไม่สามารถปรับให้เป็นมาตรฐานเดียวได้ พร้อมเหตุผลทางเทคนิคหรือ Business Requirement
- ผลการทดสอบการทำงานของ Search, Filter, Sorting, Pagination และ URL Search Params ในแต่ละ Module
- ยืนยันว่าไม่มี Regression และไม่มีผลกระทบต่อฟังก์ชันเดิมของระบบ