Files
grafana/public/app/features/users/state/reducers.ts
T
Alexander Zobnin f1b5014efd Preferences: Add pagination to org configuration page (#60896)
* Add auth labels and access control metadata to org users search results

* Fix search result JSON model

* Org users: Use API for pagination

* Fix default page size

* Refactor: UsersListPage to functional component

* Refactor: update UsersTable component code style

* Add pagination to the /orgs/{org_id}/users endpoint

* Use pagination on the AdminEditOrgPage

* Add /orgs/{org_id}/users/search endpoint to prevent breaking API

* Use existing search store method

* Remove unnecessary error

* Remove unused

* Add query param to search endpoint

* Fix endpoint docs

* Minor refactor

* Fix number of pages calculation

* Use SearchOrgUsers for all org users methods

* Refactor: GetOrgUsers as a service method

* Minor refactor: rename orgId => orgID

* Fix integration tests

* Fix tests
2023-01-09 11:54:33 +03:00

71 lines
1.9 KiB
TypeScript

import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import config from 'app/core/config';
import { OrgUser, UsersState } from 'app/types';
export const initialState: UsersState = {
users: [] as OrgUser[],
searchQuery: '',
page: 0,
perPage: 30,
totalPages: 1,
canInvite: !config.externalUserMngLinkName,
externalUserMngInfo: config.externalUserMngInfo,
externalUserMngLinkName: config.externalUserMngLinkName,
externalUserMngLinkUrl: config.externalUserMngLinkUrl,
isLoading: false,
};
export interface UsersFetchResult {
orgUsers: OrgUser[];
perPage: number;
page: number;
totalCount: number;
}
const usersSlice = createSlice({
name: 'users',
initialState,
reducers: {
usersLoaded: (state, action: PayloadAction<UsersFetchResult>): UsersState => {
const { totalCount, perPage, page, orgUsers } = action.payload;
const totalPages = Math.ceil(totalCount / perPage);
return {
...state,
isLoading: true,
users: orgUsers,
perPage,
page,
totalPages,
};
},
searchQueryChanged: (state, action: PayloadAction<string>): UsersState => {
// reset searchPage otherwise search results won't appear
return { ...state, searchQuery: action.payload, page: initialState.page };
},
setUsersSearchPage: (state, action: PayloadAction<number>): UsersState => {
return { ...state, page: action.payload };
},
pageChanged: (state, action: PayloadAction<number>) => ({
...state,
page: action.payload,
}),
usersFetchBegin: (state) => {
return { ...state, isLoading: true };
},
usersFetchEnd: (state) => {
return { ...state, isLoading: false };
},
},
});
export const { searchQueryChanged, setUsersSearchPage, usersLoaded, usersFetchBegin, usersFetchEnd, pageChanged } =
usersSlice.actions;
export const usersReducer = usersSlice.reducer;
export default {
users: usersReducer,
};