feat: membre list filter history

This commit is contained in:
Thibaut Valentin 2025-11-18 15:45:18 +01:00
parent 1b5bf8ba6c
commit b2ad633b21
4 changed files with 56 additions and 38 deletions

View File

@ -7,8 +7,8 @@ const removeDiacritics = str => {
} }
export function SearchBar({search}) { export function SearchBar({search, defaultValue = ""}) {
const [searchInput, setSearchInput] = useState(""); const [searchInput, setSearchInput] = useState(defaultValue);
const handelChange = (e) => { const handelChange = (e) => {
setSearchInput(e.target.value); setSearchInput(e.target.value);
@ -40,4 +40,4 @@ export function SearchBar({search}) {
</button> </button>
</div> </div>
</div> </div>
} }

View File

@ -14,37 +14,52 @@ import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faEuroSign} from "@fortawesome/free-solid-svg-icons"; import {faEuroSign} from "@fortawesome/free-solid-svg-icons";
let lastRefresh = "";
export function MemberList({source}) { export function MemberList({source}) {
const {hash} = useLocation(); const {hash} = useLocation();
const navigate = useNavigate(); const navigate = useNavigate();
let page = Number(hash.substring(1));
page = (page > 0) ? page : 1;
const [memberData, setMemberData] = useState([]); const [memberData, setMemberData] = useState([]);
const [licenceData, setLicenceData] = useState([]); const [licenceData, setLicenceData] = useState([]);
const [showLicenceState, setShowLicenceState] = useState(false); const [showLicenceState, setShowLicenceState] = useState(false);
const [clubFilter, setClubFilter] = useState("");
const [stateFilter, setStateFilter] = useState(4) const setFilter = (filter) => {
const [lastSearch, setLastSearch] = useState(""); navigate("#" + encodeURI(JSON.stringify(filter)))
const [paymentFilter, setPaymentFilter] = useState(2); }
const [order, setOrder] = useState(""); const filter = {
const [catFilter, setCatFilter] = useState(""); page: 1,
search: "",
club: "",
licenceRequest: 4,
payment: 2,
order: "",
categorie: "",
...JSON.parse(decodeURI(hash.substring(1)) || "{}"),
}
const setLoading = useLoadingSwitcher() const setLoading = useLoadingSwitcher()
const { const {
data, data,
error, error,
refresh refresh
} = useFetch(`/member/find/${source}?page=${page}&licenceRequest=${stateFilter}&payment=${paymentFilter}&order=${order}&categorie=${catFilter}`, setLoading, 1) } = useFetch(`/member/find/${source}?page=${filter.page}&search=${filter.search}&club=${filter.club}&licenceRequest=${filter.licenceRequest}&payment=${filter.payment}&order=${filter.order}&categorie=${filter.categorie}`, setLoading, 1)
useEffect(() => { useEffect(() => {
refresh(`/member/find/${source}?page=${page}&search=${lastSearch}&club=${clubFilter}&licenceRequest=${stateFilter}&payment=${paymentFilter}&order=${order}&categorie=${catFilter}`); const tmp = `/member/find/${source}?page=${filter.page}&search=${filter.search}&club=${filter.club}&licenceRequest=${filter.licenceRequest}&payment=${filter.payment}&order=${filter.order}&categorie=${filter.categorie}`;
}, [hash, clubFilter, stateFilter, lastSearch, paymentFilter, order, catFilter]); if (tmp === lastRefresh)
return;
lastRefresh = tmp
refresh(lastRefresh);
}, [hash]);
useEffect(() => { useEffect(() => {
if (!data) if (!data)
return; return;
if (data.page_count < filter.page) {
setFilter({...filter, page: 1});
}
const data2 = []; const data2 = [];
for (const e of data.result) { for (const e of data.result) {
data2.push({ data2.push({
@ -81,23 +96,19 @@ export function MemberList({source}) {
}, [showLicenceState]); }, [showLicenceState]);
const search = (search) => { const search = (search) => {
if (search === lastSearch) if (search === filter.search)
return; return;
setLastSearch(search); setFilter({...filter, search: search});
}
const onOrderChange = (newOrder) => {
setOrder(newOrder.join(","));
} }
return <> return <>
<div> <div>
<div className="row"> <div className="row">
<div className="col-lg-9"> <div className="col-lg-9">
<SearchBar search={search}/> <SearchBar search={search} defaultValue={filter.search}/>
{data {data
? <MakeCentralPanel data={data} visibleMember={memberData} navigate={navigate} showLicenceState={showLicenceState} ? <MakeCentralPanel data={data} visibleMember={memberData} navigate={navigate} showLicenceState={showLicenceState}
page={page} source={source}/> page={filter.page} setPage={e => setFilter({...filter, page: e})} source={source}/>
: error : error
? <AxiosError error={error}/> ? <AxiosError error={error}/>
: <Def/> : <Def/>
@ -117,17 +128,24 @@ export function MemberList({source}) {
<div className="card mb-4"> <div className="card mb-4">
<div className="card-header">Trie</div> <div className="card-header">Trie</div>
<div className="card-body"> <div className="card-body">
<OrderBar onOrderChange={onOrderChange} source={source}/> <OrderBar onOrderChange={e => setFilter({...filter, order: e.join(",")})} defaultValues={filter.order} source={source}/>
</div> </div>
</div> </div>
<div className="card mb-4"> <div className="card mb-4">
<div className="card-header">Filtre</div> <div className="card-header">Filtre</div>
<div className="card-body"> <div className="card-body">
<FiltreBar showLicenceState={showLicenceState} setShowLicenceState={setShowLicenceState} <FiltreBar showLicenceState={showLicenceState}
clubFilter={clubFilter} setClubFilter={setClubFilter} source={source} setShowLicenceState={setShowLicenceState}
stateFilter={stateFilter} setStateFilter={setStateFilter} paymentFilter={paymentFilter} clubFilter={filter.club}
setPaymentFilter={setPaymentFilter} catFilter={catFilter} setCatFilter={setCatFilter}/> setClubFilter={e => setFilter({...filter, club: e})}
source={source}
stateFilter={filter.licenceRequest}
setStateFilter={e => setFilter({...filter, licenceRequest: e})}
paymentFilter={filter.payment}
setPaymentFilter={e => setFilter({...filter, payment: e})}
catFilter={filter.categorie}
setCatFilter={e => setFilter({...filter, categorie: e})}/>
</div> </div>
</div> </div>
@ -355,11 +373,11 @@ function FileInput() {
); );
} }
function MakeCentralPanel({data, visibleMember, navigate, showLicenceState, page, source}) { function MakeCentralPanel({data, visibleMember, navigate, showLicenceState, page, setPage, source}) {
const pages = [] const pages = []
for (let i = 1; i <= data.page_count; i++) { for (let i = 1; i <= data.page_count; i++) {
pages.push(<li key={i} className={"page-item " + ((page === i) ? "active" : "")}> pages.push(<li key={i} className={"page-item " + ((page === i) ? "active" : "")}>
<span className="page-link" onClick={() => navigate("#" + i)}>{i}</span> <span className="page-link" onClick={() => setPage(i)}>{i}</span>
</li>); </li>);
} }
@ -376,10 +394,10 @@ function MakeCentralPanel({data, visibleMember, navigate, showLicenceState, page
<nav aria-label="Page navigation"> <nav aria-label="Page navigation">
<ul className="pagination justify-content-center"> <ul className="pagination justify-content-center">
<li className={"page-item" + ((page <= 1) ? " disabled" : "")}> <li className={"page-item" + ((page <= 1) ? " disabled" : "")}>
<span className="page-link" onClick={() => navigate("#" + (page - 1))}>&laquo;</span></li> <span className="page-link" onClick={() => setPage(page - 1)}>&laquo;</span></li>
{pages} {pages}
<li className={"page-item" + ((page >= data.page_count) ? " disabled" : "")}> <li className={"page-item" + ((page >= data.page_count) ? " disabled" : "")}>
<span className="page-link" onClick={() => navigate("#" + (page + 1))}>&raquo;</span></li> <span className="page-link" onClick={() => setPage(page + 1)}>&raquo;</span></li>
</ul> </ul>
</nav> </nav>
</div> </div>
@ -430,8 +448,8 @@ function MakeRow({member, showLicenceState, navigate, source}) {
} }
} }
function OrderBar({onOrderChange, source}) { function OrderBar({onOrderChange, defaultValues = "", source}) {
const [orderCriteria, setOrderCriteria] = useState(['']); const [orderCriteria, setOrderCriteria] = useState([...defaultValues.split(",").filter(c => c !== ''), '']);
const handleChange = (index, value) => { const handleChange = (index, value) => {
const newCriteria = [...orderCriteria]; const newCriteria = [...orderCriteria];

View File

@ -34,13 +34,13 @@ export function MemberPage() {
} }
} }
).then(_ => { ).then(_ => {
navigate("/admin/member") navigate(-1)
}) })
} }
return <> return <>
<h2>Page membre</h2> <h2>Page membre</h2>
<button type="button" className="btn btn-link" onClick={() => navigate("/admin/member")}> <button type="button" className="btn btn-link" onClick={() => navigate(-1)}>
&laquo; retour &laquo; retour
</button> </button>
{data {data

View File

@ -33,13 +33,13 @@ export function MemberPage() {
} }
} }
).then(_ => { ).then(_ => {
navigate("/club/member") navigate(-1)
}) })
} }
return <> return <>
<h2>Page membre</h2> <h2>Page membre</h2>
<button type="button" className="btn btn-link" onClick={() => navigate("/club/member")}> <button type="button" className="btn btn-link" onClick={() => navigate(-1)}>
&laquo; retour &laquo; retour
</button> </button>
{data {data