feat: option filter people based on visibility

Signed-off-by: Varun Raj <varun@skcript.com>
This commit is contained in:
Varun Raj
2025-02-01 09:46:50 +05:30
parent 0c37a08542
commit 506c5a408e
4 changed files with 28 additions and 6 deletions
+21 -3
View File
@@ -15,20 +15,27 @@ import {
import { Input } from "../ui/input";
import { IPersonListFilters } from "@/handlers/api/people.handler";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select";
import { removeNullOrUndefinedProperties } from "@/helpers/data.helper";
import { ParsedUrlQueryInput } from "querystring";
export function PeopleFilters() {
const router = useRouter();
const { updateContext, page, maximumAssetCount, type = "all", query ="" } = usePeopleFilterContext();
const { updateContext, page, maximumAssetCount, type = "all", query = "", visibility = "all" } = usePeopleFilterContext();
const handleChange = (data: Partial<IPersonListFilters>) => {
updateContext(data);
router.push({
pathname: router.pathname,
query: {
query: {
...router.query,
...data,
...data,
page: data.page || undefined,
type: data.type || undefined,
visibility: data.visibility || undefined,
query: data.query || undefined,
maximumAssetCount: data.maximumAssetCount || undefined,
sort: data.sort || undefined,
sortOrder: data.sortOrder || undefined,
},
});
}
@@ -73,6 +80,17 @@ export function PeopleFilters() {
</SelectContent>
</Select>
<Select value={visibility} onValueChange={(value) => handleChange({ visibility: value as "all" | "visible" | "hidden" })}>
<SelectTrigger>
<SelectValue placeholder="Visibility" />
</SelectTrigger>
<SelectContent>
<SelectItem value="all">All</SelectItem>
<SelectItem value="visible">Visible</SelectItem>
<SelectItem value="hidden">Hidden</SelectItem>
</SelectContent>
</Select>
<Button
disabled={prevPage < 1}
onClick={() => handleChange({ page: prevPage })}
+1 -1
View File
@@ -107,7 +107,7 @@ export default function PersonItem({ person, onRemove }: IProps) {
<Button variant="outline" className="!py-0.5 !px-2 text-xs h-7" onClick={() => {
handleHide(!formData.isHidden);
}}>
Hide
{formData.isHidden ? "Show" : "Hide"}
</Button>
<ShareAssetsTrigger filters={{ personIds: [person.id] }} buttonProps={{ variant: "outline", className: "!py-0.5 !px-2 text-xs h-7" }} />
</div>
+1
View File
@@ -14,6 +14,7 @@ export interface IPersonListFilters {
sortOrder?: "asc" | "desc";
type?: string;
query?: string;
visibility?: "all" | "visible" | "hidden";
}
export const listPeople = (filters: IPersonListFilters): Promise<IPeopleListResponse> => {
return API.get(LIST_PEOPLE_PATH, filters).then((response) => {
+5 -2
View File
@@ -29,6 +29,7 @@ interface IQuery {
sort: ISortField;
sortOrder: "asc" | "desc";
query: string;
visibility: "all" | "visible" | "hidden";
}
export default async function handler(
req: NextApiRequest,
@@ -43,19 +44,21 @@ export default async function handler(
sortOrder = "desc",
type = "all",
query = "",
visibility = "all",
} = req.query as any as IQuery;
const currentUser = await getCurrentUser(req);
const maximumAssetCount = !maxValue || maxValue <= 0 ? 1000000 : maxValue;
const whereClause = and(
eq(person.isHidden, false),
isNull(assets.duplicateId),
eq(assets.isVisible, true),
eq(assets.isArchived, false),
eq(assets.ownerId, currentUser.id),
type === "all" ? undefined : (type === "nameless" ? eq(person.name, "") : ne(person.name, "")),
query && query.length > 0 ? ilike(person.name, `%${query}%`) : undefined
query && query.length > 0 ? ilike(person.name, `%${query}%`) : undefined,
visibility === "visible" ? eq(person.isHidden, false) : visibility === "hidden" ? eq(person.isHidden, true) : undefined
);
let dbQuery = db