mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-12 12:33:02 +00:00
reset offset to 0 on name filter change
move offset to redux state, rather than independent, since it can come from two places (user_page and pagination footer). Keeps things in sync. Adds reducers for setting offset, name filter explicitly.
This commit is contained in:
@@ -1,23 +1,48 @@
|
|||||||
export const initialState = {
|
export const initialState = {
|
||||||
user_data: undefined,
|
user_data: undefined,
|
||||||
user_page: 0,
|
user_page: { offset: 0, limit: window.api_page_limit || 100 },
|
||||||
name_filter: "",
|
name_filter: "",
|
||||||
groups_data: undefined,
|
groups_data: undefined,
|
||||||
groups_page: 0,
|
groups_page: { offset: 0, limit: window.api_page_limit || 100 },
|
||||||
limit: window.api_page_limit,
|
limit: window.api_page_limit || 100,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const reducers = (state = initialState, action) => {
|
export const reducers = (state = initialState, action) => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
// Updates the client user model data and stores the page
|
// Updates the client user model data and stores the page
|
||||||
|
case "USER_OFFSET":
|
||||||
|
return Object.assign({}, state, {
|
||||||
|
user_page: Object.assign({}, state.user_page, {
|
||||||
|
offset: action.value.offset,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
case "USER_NAME_FILTER":
|
||||||
|
// set offset to 0 if name filter changed,
|
||||||
|
// otherwise leave it alone
|
||||||
|
const newOffset =
|
||||||
|
action.value.name_filter !== state.name_filter ? 0 : state.name_filter;
|
||||||
|
return Object.assign({}, state, {
|
||||||
|
user_page: Object.assign({}, state.user_page, {
|
||||||
|
offset: newOffset,
|
||||||
|
}),
|
||||||
|
name_filter: action.value.name_filter,
|
||||||
|
});
|
||||||
|
|
||||||
case "USER_PAGE":
|
case "USER_PAGE":
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
user_page: action.value.page,
|
user_page: action.value.page,
|
||||||
user_data: action.value.data,
|
user_data: action.value.data,
|
||||||
name_filter: action.value.name_filter || "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Updates the client group model data and stores the page
|
// Updates the client group user model data and stores the page
|
||||||
|
case "GROUPS_OFFSET":
|
||||||
|
return Object.assign({}, state, {
|
||||||
|
groups_page: Object.assign({}, state.groups_page, {
|
||||||
|
offset: action.value.offset,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
case "GROUPS_PAGE":
|
case "GROUPS_PAGE":
|
||||||
return Object.assign({}, state, {
|
return Object.assign({}, state, {
|
||||||
groups_page: action.value.page,
|
groups_page: action.value.page,
|
||||||
|
@@ -10,7 +10,16 @@ const Groups = (props) => {
|
|||||||
groups_page = useSelector((state) => state.groups_page),
|
groups_page = useSelector((state) => state.groups_page),
|
||||||
dispatch = useDispatch();
|
dispatch = useDispatch();
|
||||||
|
|
||||||
var [offset, setOffset] = useState(groups_page ? groups_page.offset : 0);
|
var offset = groups_page ? groups_page.offset : 0;
|
||||||
|
|
||||||
|
const setOffset = (offset) => {
|
||||||
|
dispatch({
|
||||||
|
type: "GROUPS_OFFSET",
|
||||||
|
value: {
|
||||||
|
offset: offset,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
var limit = groups_page ? groups_page.limit : window.api_page_limit;
|
var limit = groups_page ? groups_page.limit : window.api_page_limit;
|
||||||
var total = groups_page ? groups_page.total : undefined;
|
var total = groups_page ? groups_page.total : undefined;
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ const ServerDashboard = (props) => {
|
|||||||
user_page = useSelector((state) => state.user_page),
|
user_page = useSelector((state) => state.user_page),
|
||||||
name_filter = useSelector((state) => state.name_filter);
|
name_filter = useSelector((state) => state.name_filter);
|
||||||
|
|
||||||
var [offset, setOffset] = useState(user_page ? user_page.offset : 0);
|
var offset = user_page ? user_page.offset : 0;
|
||||||
var limit = user_page ? user_page.limit : window.api_page_limit;
|
var limit = user_page ? user_page.limit : window.api_page_limit;
|
||||||
var total = user_page ? user_page.total : undefined;
|
var total = user_page ? user_page.total : undefined;
|
||||||
|
|
||||||
@@ -72,12 +72,29 @@ const ServerDashboard = (props) => {
|
|||||||
history,
|
history,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
var dispatchPageUpdate = (data, page, name_filter) => {
|
const dispatchPageUpdate = (data, page) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
type: "USER_PAGE",
|
type: "USER_PAGE",
|
||||||
value: {
|
value: {
|
||||||
data: data,
|
data: data,
|
||||||
page: page,
|
page: page,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const setOffset = (newOffset) => {
|
||||||
|
dispatch({
|
||||||
|
type: "USER_OFFSET",
|
||||||
|
value: {
|
||||||
|
offset: newOffset,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const setNameFilter = (name_filter) => {
|
||||||
|
dispatch({
|
||||||
|
type: "USER_NAME_FILTER",
|
||||||
|
value: {
|
||||||
name_filter: name_filter,
|
name_filter: name_filter,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@@ -85,24 +102,18 @@ const ServerDashboard = (props) => {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
updateUsers(offset, limit, name_filter)
|
updateUsers(offset, limit, name_filter)
|
||||||
.then((data) =>
|
.then((data) => dispatchPageUpdate(data.items, data._pagination))
|
||||||
dispatchPageUpdate(data.items, data._pagination, name_filter)
|
|
||||||
)
|
|
||||||
.catch((err) => setErrorAlert("Failed to update user list."));
|
.catch((err) => setErrorAlert("Failed to update user list."));
|
||||||
}, [offset, limit]);
|
}, [offset, limit, name_filter]);
|
||||||
|
|
||||||
if (!user_data || !user_page) {
|
if (!user_data || !user_page) {
|
||||||
return <div data-testid="no-show"></div>;
|
return <div data-testid="no-show"></div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
let page = offset / limit;
|
|
||||||
var slice = [offset, limit, name_filter];
|
var slice = [offset, limit, name_filter];
|
||||||
|
|
||||||
const handleSearch = debounce(async (event) => {
|
const handleSearch = debounce(async (event) => {
|
||||||
// setNameFilter(event.target.value);
|
setNameFilter(event.target.value);
|
||||||
updateUsers(offset, limit, event.target.value).then((data) =>
|
|
||||||
dispatchPageUpdate(data.items, data._pagination, name_filter)
|
|
||||||
);
|
|
||||||
}, 300);
|
}, 300);
|
||||||
|
|
||||||
if (sortMethod != null) {
|
if (sortMethod != null) {
|
||||||
|
Reference in New Issue
Block a user