Implement filtering deployments on search (#13)
This commit is contained in:
parent
d04517d9bb
commit
237bd01159
@ -3,7 +3,7 @@ import React, { ChangeEventHandler, forwardRef } from 'react';
|
|||||||
import { Input } from '@material-tailwind/react';
|
import { Input } from '@material-tailwind/react';
|
||||||
|
|
||||||
interface SearchBarProps {
|
interface SearchBarProps {
|
||||||
onChange: ChangeEventHandler<HTMLInputElement>;
|
onChange?: ChangeEventHandler<HTMLInputElement>;
|
||||||
value?: string;
|
value?: string;
|
||||||
placeholder?: string;
|
placeholder?: string;
|
||||||
}
|
}
|
||||||
@ -15,7 +15,6 @@ const SearchBar: React.ForwardRefRenderFunction<
|
|||||||
return (
|
return (
|
||||||
<div className="relative flex w-full gap-2">
|
<div className="relative flex w-full gap-2">
|
||||||
<Input
|
<Input
|
||||||
variant="standard"
|
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
value={value}
|
value={value}
|
||||||
type="search"
|
type="search"
|
||||||
@ -23,7 +22,7 @@ const SearchBar: React.ForwardRefRenderFunction<
|
|||||||
containerProps={{
|
containerProps={{
|
||||||
className: 'min-w-[288px]',
|
className: 'min-w-[288px]',
|
||||||
}}
|
}}
|
||||||
className="pl-9 placeholder:text-blue-gray-300 focus:!border-blue-gray-300"
|
className="!border-t-blue-gray-300 pl-9 placeholder:text-blue-gray-300 focus:!border-blue-gray-300"
|
||||||
labelProps={{
|
labelProps={{
|
||||||
className: 'before:content-none after:content-none',
|
className: 'before:content-none after:content-none',
|
||||||
}}
|
}}
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
import React from 'react';
|
import React, { useCallback, useMemo, useState } from 'react';
|
||||||
|
|
||||||
import deploymentDetails from '../../../assets/deployments.json';
|
import { Button } from '@material-tailwind/react';
|
||||||
|
|
||||||
|
import deploymentData from '../../../assets/deployments.json';
|
||||||
import DeployDetailsCard from './DeploymentDetailsCard';
|
import DeployDetailsCard from './DeploymentDetailsCard';
|
||||||
import Dropdown from '../../Dropdown';
|
import Dropdown from '../../Dropdown';
|
||||||
|
import SearchBar from '../../SearchBar';
|
||||||
|
|
||||||
const STATUS_OPTIONS = [
|
const STATUS_OPTIONS = [
|
||||||
{ value: 'building', label: 'Building' },
|
{ value: 'building', label: 'Building' },
|
||||||
@ -11,14 +14,30 @@ const STATUS_OPTIONS = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const DeploymentsTabPanel = () => {
|
const DeploymentsTabPanel = () => {
|
||||||
|
const [searchedBranch, setSearchedBranch] = useState('');
|
||||||
|
|
||||||
|
const filteredDeployments = useMemo(() => {
|
||||||
|
if (searchedBranch) {
|
||||||
|
return deploymentData.filter((deployment) =>
|
||||||
|
deployment.branch.toLowerCase().includes(searchedBranch.toLowerCase()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return deploymentData;
|
||||||
|
}, [searchedBranch]);
|
||||||
|
|
||||||
|
const handleResetFilters = useCallback(() => {
|
||||||
|
setSearchedBranch('');
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="p-4">
|
<div className="p-4">
|
||||||
<div className="grid grid-cols-4 gap-2 text-sm text-gray-600">
|
<div className="grid grid-cols-4 gap-2 text-sm text-gray-600">
|
||||||
<div className="col-span-2">
|
<div className="col-span-2">
|
||||||
<input
|
<SearchBar
|
||||||
type="text"
|
|
||||||
className="border border-gray-300 rounded p-2 w-full focus:border-blue-300 focus:outline-none focus:shadow-outline-blue"
|
|
||||||
placeholder="Search branches"
|
placeholder="Search branches"
|
||||||
|
value={searchedBranch}
|
||||||
|
onChange={(event) => setSearchedBranch(event.target.value)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-span-1">
|
<div className="col-span-1">
|
||||||
@ -37,9 +56,25 @@ const DeploymentsTabPanel = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-2">
|
<div className="mt-2">
|
||||||
{deploymentDetails.map((deployment, key) => {
|
{Boolean(filteredDeployments.length) ? (
|
||||||
return <DeployDetailsCard deployment={deployment} key={key} />;
|
filteredDeployments.map((deployment, key) => {
|
||||||
})}
|
return <DeployDetailsCard deployment={deployment} key={key} />;
|
||||||
|
})
|
||||||
|
) : (
|
||||||
|
<div className="h-[50vh] bg-gray-100 flex rounded items-center justify-center">
|
||||||
|
<div className="text-center">
|
||||||
|
<h5 className="text-lg font-bold">No deployments found</h5>
|
||||||
|
<p>Please change your search query or filters</p>
|
||||||
|
<Button
|
||||||
|
className="rounded-full mt-5"
|
||||||
|
color="white"
|
||||||
|
onClick={handleResetFilters}
|
||||||
|
>
|
||||||
|
^ Reset filters
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user