Connected filter searchbox for groups, users & user creation groups (#20)

* Connected group selector list

* Added groups filtering for create user form

* connected groups input filter

* Connected users input

Co-authored-by: Benjamin Perez <benjamin@bexsoft.net>
This commit is contained in:
Alex
2020-04-03 15:24:04 -06:00
committed by GitHub
parent fbd19f9fa9
commit 9c43c8894a
4 changed files with 66 additions and 15 deletions

View File

@@ -107,6 +107,7 @@ const Groups = ({
const [rowsPerPage, setRowsPerPage] = useState<number>(10);
const [page, setPage] = useState<number>(0);
const [error, setError] = useState<string>("");
const [filter, setFilter] = useState<string>("");
const handleChangePage = (event: unknown, newPage: number) => {
setPage(newPage);
@@ -171,6 +172,8 @@ const Groups = ({
}
};
const filteredRecords = records.filter((elementItem) => elementItem.includes(filter));
return (<React.Fragment>
{ addGroupOpen &&
<AddGroup
@@ -207,6 +210,9 @@ const Groups = ({
</InputAdornment>
),
}}
onChange={(e) => {
setFilter(e.target.value);
}}
/>
<Button
variant="contained"
@@ -236,7 +242,7 @@ const Groups = ({
</TableRow>
</TableHead>
<TableBody>
{records.map(group => (
{filteredRecords.map(group => (
<TableRow key={`user-${group}`}>
<TableCell className={classes.wrapCell}>
{group}

View File

@@ -233,6 +233,9 @@ class AddUserContent extends React.Component<
records={groupsList}
/>
</Grid>
<Grid item xs={12}>
<br />
</Grid>
<Grid item xs={12}>
<Button
type="submit"

View File

@@ -14,7 +14,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
import React from "react";
import React, {useEffect, useState} from "react";
import { createStyles, Theme, withStyles } from "@material-ui/core/styles";
import { LinearProgress } from "@material-ui/core";
import Table from "@material-ui/core/Table";
@@ -29,6 +29,10 @@ import InputAdornment from "@material-ui/core/InputAdornment";
import SearchIcon from "@material-ui/icons/Search";
import TextField from "@material-ui/core/TextField";
import Checkbox from "@material-ui/core/Checkbox";
import api from "../../../common/api";
import {UsersList} from "./types";
import {groupsSort, usersSort} from "../../../utils/sortFunctions";
import {GroupsList} from "../Groups/types";
interface IGroupsProps {
classes: any;
@@ -96,12 +100,37 @@ const GroupsSelectors = ({
classes,
selectedGroups,
setSelectedGroups,
records,
loading
}: IGroupsProps) => {
if (!records) {
return null;
}
// Local State
const [records, setRecords] = useState<any[]>([]);
const [loading, isLoading] = useState<boolean>(false);
const [error, setError] = useState<string>("");
const [filter, setFilter] = useState<string>("");
//Effects
useEffect(() => {
isLoading(true);
}, []);
useEffect(() => {
if(loading) {
fetchGroups();
}
},[loading]);
const fetchGroups = () => {
api
.invoke("GET", `/api/v1/groups`)
.then((res: GroupsList) => {
setRecords(res.groups.sort(groupsSort));
setError("");
isLoading(false);
})
.catch(err => {
setError(err);
isLoading(false);
});
};
const selectionChanged = (e: React.ChangeEvent<HTMLInputElement>) => {
const targetD = e.target;
@@ -122,6 +151,8 @@ const GroupsSelectors = ({
return elements;
};
const filteredRecords = records.filter((elementItem) => elementItem.includes(filter));
return (
<React.Fragment>
<Title>Groups</Title>
@@ -144,6 +175,9 @@ const GroupsSelectors = ({
</InputAdornment>
)
}}
onChange={(e) => {
setFilter(e.target.value);
}}
/>
</Grid>
<Table size="medium">
@@ -154,21 +188,21 @@ const GroupsSelectors = ({
</TableRow>
</TableHead>
<TableBody>
{records.map(row => (
<TableRow key={`group-${row.groupName}`}>
{filteredRecords.map(groupName => (
<TableRow key={`group-${groupName}`}>
<TableCell padding="checkbox">
<Checkbox
value={row.groupName}
value={groupName}
color="primary"
inputProps={{
"aria-label": "secondary checkbox"
}}
onChange={selectionChanged}
checked={selectedGroups.includes(row.groupName)}
checked={selectedGroups.includes(groupName)}
/>
</TableCell>
<TableCell className={classes.wrapCell}>
{row.groupName}
{groupName}
</TableCell>
</TableRow>
))}

View File

@@ -111,6 +111,7 @@ interface IUsersState {
deleteOpen: boolean;
selectedUser: User | null;
addGroupOpen: boolean;
filter: string;
}
class Users extends React.Component<IUsersProps, IUsersState> {
@@ -125,7 +126,8 @@ class Users extends React.Component<IUsersProps, IUsersState> {
rowsPerPage: 10,
deleteOpen: false,
selectedUser: null,
addGroupOpen: false
addGroupOpen: false,
filter: "",
};
fetchRecords() {
@@ -188,7 +190,8 @@ class Users extends React.Component<IUsersProps, IUsersState> {
page,
rowsPerPage,
deleteOpen,
selectedUser
selectedUser,
filter,
} = this.state;
const handleChangePage = (event: unknown, newPage: number) => {
@@ -206,6 +209,8 @@ class Users extends React.Component<IUsersProps, IUsersState> {
});
};
const filteredRecords = records.filter((elementItem) => elementItem.accessKey.includes(filter));
return (
<React.Fragment>
<AddUser
@@ -237,6 +242,9 @@ class Users extends React.Component<IUsersProps, IUsersState> {
</InputAdornment>
)
}}
onChange={(e) => {
this.setState({filter: e.target.value});
}}
/>
<Button
variant="contained"
@@ -281,7 +289,7 @@ class Users extends React.Component<IUsersProps, IUsersState> {
</TableRow>
</TableHead>
<TableBody>
{records.map(row => (
{filteredRecords.map(row => (
<TableRow key={`user-${row.accessKey}`}>
<TableCell padding="checkbox">
<Checkbox