feat: membre list filter history
This commit is contained in:
parent
1b5bf8ba6c
commit
b2ad633b21
@ -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>
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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))}>«</span></li>
|
<span className="page-link" onClick={() => setPage(page - 1)}>«</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))}>»</span></li>
|
<span className="page-link" onClick={() => setPage(page + 1)}>»</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];
|
||||||
|
|||||||
@ -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)}>
|
||||||
« retour
|
« retour
|
||||||
</button>
|
</button>
|
||||||
{data
|
{data
|
||||||
|
|||||||
@ -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)}>
|
||||||
« retour
|
« retour
|
||||||
</button>
|
</button>
|
||||||
{data
|
{data
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user