Implemented comprehensive department filtering across multiple pages in the QC
system to enable users to filter data by laboratory department.
## Backend Changes
**Models:**
- MasterControlsModel: Enhanced search() method to accept optional dept_id
parameter, added LEFT JOIN with master_depts to include department info
- MasterTestsModel: Updated search() to support dept_id filtering with JOIN
**Controllers:**
- MasterControlsController: Modified index() to accept and pass dept_id parameter
- MasterTestsController: Modified index() to accept and pass dept_id parameter
- EntryApiController: Updated getControls() to filter by dept_id using model search,
added debug logging for troubleshooting
## Frontend Changes
**Views Updated:**
1. Controls page (/master/control)
- Added department dropdown with DaisyUI styling
- Active filter badge and clear button
- Fetch controls filtered by selected department
- Added department field to control form dialog
2. Tests page (/master/test)
- Added department dropdown with active state indication
- Filter tests by department
- Clear button to reset filter
3. Daily Entry page (/entry/daily)
- Added department dropdown in filter section
- Resets control selection when department changes
- Fetches controls and tests filtered by department
4. Monthly Entry page (/entry/monthly)
- Added department dropdown with month selector
- Resets test selection when department changes
- Fetches tests filtered by department
## Key Features
- Dropdown UI shows "All Departments" as default
- Selected department name displayed in dropdown button
- Clear button appears when filter is active
- Active department highlighted in dropdown menu
- Loading state while fetching departments
- Automatic reset of dependent selections when department changes
- Consistent UI pattern across all pages using DaisyUI components
## Bug Fixes
- Fixed syntax error in MasterControlsModel search() method
- Removed duplicate/corrupted code that was causing incorrect results
- Added proper deptName field to SELECT query in MasterControlsModel
## Important Note: Department IDs Required
**ACTION REQUIRED**: Existing controls and tests in the database must be assigned
to departments for the filter to work correctly.
To update existing records, run:
UPDATE master_controls SET dept_id = 1 WHERE dept_id IS NULL;
UPDATE master_tests SET dept_id = 1 WHERE dept_id IS NULL;
Replace '1' with a valid department ID from master_depts table.
Alternatively, edit each control/test through the UI to assign a department.
## Technical Details
- Alpine.js data binding for reactive department selection
- API expects 'dept_id' query parameter (snake_case)
- Internal state uses camelCase (deptId)
- Departments loaded on init via /api/master/depts
- Search requests include both keyword and dept_id parameters