From ed9f59f4045f413a1ef9d1c6c12b139ba0e8084f Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Fri, 22 May 2026 11:07:01 +0800 Subject: [PATCH] feat: add status and role filter on users page --- .../routes/apps.$appId.users.index.tsx | 78 ++++++++++++++----- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/src/frontend/routes/apps.$appId.users.index.tsx b/src/frontend/routes/apps.$appId.users.index.tsx index 23d5a05..a52c092 100644 --- a/src/frontend/routes/apps.$appId.users.index.tsx +++ b/src/frontend/routes/apps.$appId.users.index.tsx @@ -222,6 +222,8 @@ function UsersIndexPage() { const [search, setSearch] = useState('') const [searchQuery, setSearchQuery] = useState('') const [debouncedSearch] = useDebouncedValue(search, 400) + const [filterStatus, setFilterStatus] = useState(null) + const [filterRole, setFilterRole] = useState(null) const isDesaPlus = appId === 'desa-plus' const apiUrl = isDesaPlus ? API_URLS.getUsers(page, searchQuery) : null @@ -229,6 +231,15 @@ function UsersIndexPage() { const { data: response, error, isLoading, mutate } = useSWR(apiUrl, fetcher) const users: APIUser[] = response?.data?.user || [] + const filteredUsers = users.filter((user) => { + if (filterStatus === 'active' && !user.isActive) return false + if (filterStatus === 'inactive' && user.isActive) return false + if (filterRole && user.role !== filterRole) return false + return true + }) + + const roleFilterOptions = Array.from(new Set(users.map((u) => u.role))).map((r) => ({ value: r, label: r })) + useEffect(() => { if (debouncedSearch.length >= 3 || debouncedSearch.length === 0) { setSearchQuery(debouncedSearch) @@ -562,23 +573,50 @@ function UsersIndexPage() { {/* Search / Filter */} - } - size="sm" - rightSection={ - search ? ( - - - - - - ) : null - } - value={search} - onChange={(e) => setSearch(e.currentTarget.value)} - radius="md" - /> + + } + size="sm" + rightSection={ + search ? ( + + + + + + ) : null + } + value={search} + onChange={(e) => setSearch(e.currentTarget.value)} + radius="md" + /> + + {isLoading ? ( @@ -592,12 +630,12 @@ function UsersIndexPage() { Failed to load users from the API. - ) : users.length === 0 ? ( + ) : filteredUsers.length === 0 ? ( - {searchQuery ? 'No users match your search.' : 'No users found.'} + {searchQuery || filterStatus || filterRole ? 'No users match your filters.' : 'No users found.'} @@ -626,7 +664,7 @@ function UsersIndexPage() { - {users.map((user) => ( + {filteredUsers.map((user) => (