Files
alla-tms/plans/filter-single-select-plan.md
2026-07-16 09:53:14 +07:00

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 กลับหน้าแรก


เมื่อเลือกค่าใน 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

หลังจากดำเนินการเสร็จ ให้จัดทำรายงานสรุปประกอบด้วย

  1. รายชื่อทุกหน้าที่มีการปรับปรุง Filter
  2. รายการ Component ที่ถูก Refactor เป็น Shared Component
  3. รายการ Hook ที่ถูกสร้างหรือปรับใช้ร่วมกัน
  4. ตารางเปรียบเทียบพฤติกรรมของ Filter ก่อนและหลังการปรับปรุง
  5. รายการจุดที่ยังไม่สามารถปรับให้เป็นมาตรฐานเดียวได้ พร้อมเหตุผลทางเทคนิคหรือ Business Requirement
  6. ผลการทดสอบการทำงานของ Search, Filter, Sorting, Pagination และ URL Search Params ในแต่ละ Module
  7. ยืนยันว่าไม่มี Regression และไม่มีผลกระทบต่อฟังก์ชันเดิมของระบบ