Skip to content

Commit e0577e3

Browse files
committed
Fixes #413
1 parent 984ee7c commit e0577e3

File tree

8 files changed

+41
-17
lines changed

8 files changed

+41
-17
lines changed

client/src/api/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ export function hasProvisionings(manageId) {
185185

186186
//Roles
187187
export function rolesByApplication(force = true, pagination = {}) {
188-
const queryPart = paginationQueryParams(pagination, {force: !!force})
188+
const queryPart = paginationQueryParams(pagination, {force: !!force});
189189
return fetchJson(`/api/v1/roles?${queryPart}`);
190190
}
191191

client/src/components/Entities.jsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {sortObjects, valueForSort} from "../utils/Sort";
66
import {headerIcon} from "../utils/Forms";
77
import "./Entities.scss";
88
import {Button, Loader, Pagination, Tooltip} from "@surfnet/sds";
9-
import {pageCount} from "../utils/Pagination";
9+
import {pageCount, searchParameterFromQueryParams, storeSearchQueryParameter} from "../utils/Pagination";
1010
import {useNavigate} from "react-router-dom";
1111

1212
export const Entities = ({
@@ -41,11 +41,10 @@ export const Entities = ({
4141
busy = false
4242
}) => {
4343

44-
const [initial, setInitial] = useState(!isEmpty(customSearch));
4544
const [query, setQuery] = useState("");
46-
const [sorted, setSorted] = useState(defaultSort);
47-
const [reverse, setReverse] = useState(false);
48-
const [page, setPage] = useState(1);
45+
const [sorted, setSorted] = useState(searchParameterFromQueryParams("sort", false, defaultSort));
46+
const [reverse, setReverse] = useState("DESC" === searchParameterFromQueryParams("sortDirection", false, "ASC"));
47+
const [page, setPage] = useState(searchParameterFromQueryParams("page", true, 1));
4948

5049
const searchRef = useRef();
5150
const navigate = useNavigate();
@@ -126,15 +125,16 @@ export const Entities = ({
126125
const setSortedKey = key => {
127126
const newReserve = (sorted === key ? !reverse : false);
128127
setSorted(key);
128+
storeSearchQueryParameter("sort", key);
129129
setReverse(newReserve);
130+
storeSearchQueryParameter("sortDirection", newReserve ? "ASC" : "DESC");
130131
callCustomSearch(query, key, newReserve, page);
131132
}
132133

133134
const callCustomSearch = (newQuery, newSorted, newReversed, newPage) => {
134135
if (customSearch) {
135136
//Adjust page, as serverSide is zero-based
136137
customSearch(newQuery, newSorted, newReversed, newPage - 1);
137-
setInitial(false);
138138
}
139139
if (searchCallback) {
140140
const searchResult = filterEntities(query);
@@ -206,12 +206,13 @@ export const Entities = ({
206206
</tbody>
207207
</table>
208208
</div>}
209-
{(!hasEntities && !initial && !customEmptySearch && !loading && !hideTitle && !busy) &&
209+
{(!hasEntities && !customEmptySearch && !loading && !hideTitle && !busy) &&
210210
<p className="no-entities">{customNoEntities || I18n.t(`${modelName}.noEntities`)}</p>}
211211
<Pagination currentPage={page}
212212
onChange={nbr => {
213213
setPage(nbr);
214214
callCustomSearch(query, sorted, reverse, nbr);
215+
storeSearchQueryParameter("page", nbr);
215216
}}
216217
total={totalElements || total}
217218
pageCount={pageCount}/>

client/src/tabs/ApplicationUsers.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ export const ApplicationUsers = () => {
4545
}
4646

4747
const search = (query, sorted, reverse, page) => {
48-
if (isEmpty(query) || query.trim().length > 2) {
48+
const paginationQueryParamsChanged = sorted !== paginationQueryParams.sort || reverse !== paginationQueryParams.sortDirection ||
49+
page !== paginationQueryParams.pageNumber;
50+
if ((!isEmpty(query) && query.trim().length > 2) || paginationQueryParamsChanged) {
4951
delayedAutocomplete(query, sorted, reverse, page);
5052
}
5153
};

client/src/tabs/Invitations.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ export const Invitations = ({
7373
[user, paginationQueryParams]) // eslint-disable-line react-hooks/exhaustive-deps
7474

7575
const search = (query, sorted, reverse, page) => {
76-
if (isEmpty(query) || query.trim().length > 2) {
76+
const paginationQueryParamsChanged = sorted !== paginationQueryParams.sort || reverse !== paginationQueryParams.sortDirection ||
77+
page !== paginationQueryParams.pageNumber;
78+
if ((!isEmpty(query) && query.trim().length > 2) || paginationQueryParamsChanged) {
7779
delayedAutocomplete(query, sorted, reverse, page);
7880
}
7981
};

client/src/tabs/Roles.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ export const Roles = () => {
6565
};
6666

6767
const search = (query, sorted, reverse, page) => {
68-
if (isEmpty(query) || query.trim().length > 2) {
68+
const paginationQueryParamsChanged = sorted !== paginationQueryParams.sort || reverse !== paginationQueryParams.sortDirection ||
69+
page !== paginationQueryParams.pageNumber;
70+
if ((!isEmpty(query) && query.trim().length > 2) || paginationQueryParamsChanged) {
6971
delayedAutocomplete(query, sorted, reverse, page);
7072
}
7173
};

client/src/tabs/UserRoles.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ export const UserRoles = ({role, guests}) => {
5858
[guests, user, paginationQueryParams]);// eslint-disable-line react-hooks/exhaustive-deps
5959

6060
const search = (query, sorted, reverse, page) => {
61-
if (isEmpty(query) || query.trim().length > 2) {
61+
const paginationQueryParamsChanged = sorted !== paginationQueryParams.sort || reverse !== paginationQueryParams.sortDirection ||
62+
page !== paginationQueryParams.pageNumber;
63+
if ((!isEmpty(query) && query.trim().length > 2) || paginationQueryParamsChanged) {
6264
delayedAutocomplete(query, sorted, reverse, page);
6365
}
6466
};

client/src/tabs/Users.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const Users = () => {
3535
setSearching(false);
3636
});
3737
},
38-
[paginationQueryParams]);
38+
[paginationQueryParams]);
3939

4040
const openUser = (e, user) => {
4141
const path = `/profile/${user.id}`
@@ -48,7 +48,9 @@ export const Users = () => {
4848
};
4949

5050
const search = (query, sorted, reverse, page) => {
51-
if (isEmpty(query) || query.trim().length > 2) {
51+
const paginationQueryParamsChanged = sorted !== paginationQueryParams.sort || reverse !== paginationQueryParams.sortDirection ||
52+
page !== paginationQueryParams.pageNumber;
53+
if ((!isEmpty(query) && query.trim().length > 2) || paginationQueryParamsChanged) {
5254
delayedAutocomplete(query, sorted, reverse, page);
5355
}
5456
};

client/src/utils/Pagination.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {isEmpty} from "./Utils";
2+
import {getParameterByName} from "./QueryParameters";
23

34
export const pageCount = 10;
45

@@ -32,10 +33,22 @@ export const paginationQueryParams = (page, queryParams = {}) => {
3233
export const defaultPagination = (sort = "name", sortDirection = "ASC") => {
3334
const dp = {
3435
query: "",
35-
pageNumber: 0,
36+
pageNumber: searchParameterFromQueryParams("page", true, 1) - 1,
3637
pageSize: pageCount,
37-
sort: sort,
38-
sortDirection: sortDirection
38+
sort: searchParameterFromQueryParams("sort", false, sort),
39+
sortDirection: searchParameterFromQueryParams("sortDirection", false, sortDirection)
3940
};
4041
return {...dp};
42+
}
43+
44+
export const storeSearchQueryParameter = (parameterName, value) => {
45+
const url = new URL(window.location);
46+
url.searchParams.set(parameterName, value);
47+
window.history.pushState({[parameterName]: value}, "", url);
48+
}
49+
50+
export const searchParameterFromQueryParams = (parameterName, isNumeric, defaultValue) => {
51+
const parameterByName = getParameterByName(parameterName, window.location.search);
52+
const value = parameterByName || defaultValue;
53+
return isNumeric ? parseInt(value, 10) : value;
4154
}

0 commit comments

Comments
 (0)