mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-09-30 06:53:12 +00:00
Add assigned to filter on work order list
- Dropdown filter next to status chips with All Assignees, Unassigned, and user list - Filters combine with status filter - Styled as rounded select matching filter bar aesthetic
This commit is contained in:
parent
1ae58e56c3
commit
79f7b4782a
2 changed files with 49 additions and 2 deletions
|
|
@ -1,8 +1,9 @@
|
|||
import { useState } from "react";
|
||||
import { useState, useEffect } from "react";
|
||||
import { useNavigate } from "react-router";
|
||||
import { toast } from "react-toastify";
|
||||
import usePaginatedList from "../../../hooks/usePaginatedList";
|
||||
import { fetchWorkOrdersPaged } from "./api";
|
||||
import { fetchUsers } from "../api";
|
||||
import Table from "./Table";
|
||||
import DeleteModal from "../../../components/DeleteModal";
|
||||
import "./styles.css";
|
||||
|
|
@ -47,8 +48,14 @@ export default function WorkOrdersList() {
|
|||
};
|
||||
|
||||
const [statusFilter, setStatusFilter] = useState("");
|
||||
const [assigneeFilter, setAssigneeFilter] = useState("");
|
||||
const [users, setUsers] = useState([]);
|
||||
const statuses = ["Open", "In Progress", "On Hold", "Done", "Cancelled"];
|
||||
|
||||
useEffect(() => {
|
||||
fetchUsers().then(setUsers).catch(() => {});
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<>
|
||||
<section className="listPage">
|
||||
|
|
@ -86,12 +93,29 @@ export default function WorkOrdersList() {
|
|||
{s}
|
||||
</button>
|
||||
))}
|
||||
<span className="woFilterDivider" />
|
||||
<select
|
||||
className="woFilterSelect"
|
||||
value={assigneeFilter}
|
||||
onChange={(e) => setAssigneeFilter(e.target.value)}
|
||||
>
|
||||
<option value="">All Assignees</option>
|
||||
<option value="__unassigned">Unassigned</option>
|
||||
{users.map((u) => (
|
||||
<option key={u.id} value={u.name}>{u.name}</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<Table
|
||||
loading={loading}
|
||||
error={err}
|
||||
rows={statusFilter ? rows.filter((r) => r.status === statusFilter) : rows}
|
||||
rows={rows.filter((r) => {
|
||||
if (statusFilter && r.status !== statusFilter) return false;
|
||||
if (assigneeFilter === "__unassigned" && r.assignedTo) return false;
|
||||
if (assigneeFilter && assigneeFilter !== "__unassigned" && r.assignedTo !== assigneeFilter) return false;
|
||||
return true;
|
||||
})}
|
||||
onEdit={(item) => navigate(`/workorders/${item.id}`)}
|
||||
onDelete={handleDeleteClick}
|
||||
page={page}
|
||||
|
|
|
|||
|
|
@ -418,6 +418,29 @@
|
|||
border-color: #007bff;
|
||||
}
|
||||
|
||||
.woFilterDivider {
|
||||
width: 1px;
|
||||
height: 20px;
|
||||
background: #ddd;
|
||||
margin: 0 4px;
|
||||
}
|
||||
|
||||
.woFilterSelect {
|
||||
height: 28px;
|
||||
padding: 0 10px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 16px;
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
background: #fff;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.woFilterSelect:focus {
|
||||
border-color: #007bff;
|
||||
}
|
||||
|
||||
/* Table wrapper */
|
||||
.tableContainer {
|
||||
background: white;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue