mirror of
				https://github.com/i701/sarlink-portal.git
				synced 2025-11-04 06:26:59 +00:00 
			
		
		
		
	- Updated the title and description in layout.tsx to reflect the new application name. - Replaced the background color in globals.css with a background image for the title section. - Enhanced the Devices and UserDevices pages by adding search and filter components for improved user interaction. - Introduced a new DevicesTable component for displaying device data with pagination. - Updated the Users page to improve layout and added a filter for user status. - Made various UI adjustments across components for better consistency and usability.
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
"use client";
 | 
						|
 | 
						|
import { Input } from "@/components/ui/input";
 | 
						|
import { Loader } from "lucide-react";
 | 
						|
import { usePathname, useRouter, useSearchParams } from "next/navigation";
 | 
						|
import { useRef, useTransition } from "react";
 | 
						|
import { Button } from "./ui/button";
 | 
						|
 | 
						|
export default function Search({ disabled }: { disabled?: boolean }) {
 | 
						|
	const inputRef = useRef<HTMLInputElement>(null);
 | 
						|
	const { replace } = useRouter();
 | 
						|
 | 
						|
	const pathname = usePathname();
 | 
						|
	const [isPending, startTransition] = useTransition();
 | 
						|
	const searchParams = useSearchParams();
 | 
						|
	const searchQuery = searchParams.get("query");
 | 
						|
 | 
						|
	function handleSearch(term: string) {
 | 
						|
		const params = new URLSearchParams(searchParams.toString());
 | 
						|
 | 
						|
		if (term) {
 | 
						|
			params.set("query", term);
 | 
						|
			params.set("page", "1");
 | 
						|
		} else {
 | 
						|
			params.delete("query");
 | 
						|
		}
 | 
						|
 | 
						|
		startTransition(() => {
 | 
						|
			replace(`${pathname}?${params.toString()}`);
 | 
						|
		});
 | 
						|
	}
 | 
						|
 | 
						|
	return (
 | 
						|
		<div className="flex w-full gap-2 items-center justify-between">
 | 
						|
			<Input
 | 
						|
				ref={inputRef}
 | 
						|
				placeholder="Search..."
 | 
						|
				type="text"
 | 
						|
				className="w-full"
 | 
						|
				name="search"
 | 
						|
				id="search"
 | 
						|
				defaultValue={searchQuery ? searchQuery : ""}
 | 
						|
				disabled={disabled}
 | 
						|
				spellCheck={false}
 | 
						|
				onChange={(e) => handleSearch(e.target.value)}
 | 
						|
			/>
 | 
						|
			<Button
 | 
						|
				disabled={isPending}
 | 
						|
				onClick={() => {
 | 
						|
					if (inputRef.current) {
 | 
						|
						inputRef.current.value = "";
 | 
						|
					}
 | 
						|
					replace(pathname);
 | 
						|
				}}
 | 
						|
			>
 | 
						|
				{isPending ? <Loader className="animate-spin" /> : "Reset"}
 | 
						|
			</Button>
 | 
						|
		</div>
 | 
						|
	);
 | 
						|
}
 |