dappros/ethora

View on GitHub
client-web/build/static/js/50.57553c55.chunk.js.map

Summary

Maintainability
Test Coverage
{"version":3,"file":"static/js/50.57553c55.chunk.js","mappings":"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","sources":["components/NoDataImage.tsx","pages/Owner/NewUserModal.tsx","components/EditAcl.tsx","pages/Owner/Users.tsx"],"sourcesContent":["import * as React from 'react'\nimport './NoDataImage.scss'\n\nexport default function NoDataImage() {\n  return <div className='noDataImg'></div>\n}","import React, { useState } from \"react\";\nimport Dialog from \"@mui/material/Dialog\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport { useFormik } from \"formik\";\nimport TextField from \"@mui/material/TextField\";\nimport { useStoreState } from \"../../store\";\nimport FormControl from \"@mui/material/FormControl\";\nimport InputLabel from \"@mui/material/InputLabel\";\nimport LoadingButton from \"@mui/lab/LoadingButton\";\nimport * as http from \"../../http\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogContentText from \"@mui/material/DialogContentText\";\nimport Button from \"@mui/material/Button\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport { NativeSelect } from \"@mui/material\";\n\ntype TProps = {\n  open: boolean;\n  setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n  setUsers: React.Dispatch<React.SetStateAction<any>>;\n};\n\nexport default function NewUserModal({ open, setOpen, setUsers }: TProps) {\n  const apps = useStoreState((state) => state.apps);\n  const addAppUsers = useStoreState((state) => state.addAppUsers);\n  const [loading, setLoading] = useState(false);\n\n  const formik = useFormik({\n    initialValues: {\n      firstName: \"\",\n      lastName: \"\",\n      username: \"\",\n      password: \"\",\n      appId: apps[0]?._id,\n    },\n    validate: (values) => {\n      const errors: Record<string, string> = {};\n\n      if (!values.firstName) {\n        errors.firstName = \"Required\";\n      }\n\n      if (!values.lastName) {\n        errors.lastName = \"Required\";\n      }\n\n      if (!values.username) {\n        errors.username = \"Required\";\n      }\n\n      if (!values.password) {\n        errors.password = \"Required\";\n      }\n\n      return errors;\n    },\n    onSubmit: ({ username, firstName, lastName, password, appId }) => {\n      setLoading(true);\n      const app = apps.find((el) => el._id === appId);\n      http\n        .registerUsername(\n          username,\n          password,\n          firstName,\n          lastName,\n          app?.appToken\n        )\n        .then((result) => {\n          setUsers((old) => {\n            return [...old, result.data.user];\n          });\n          setOpen(false);\n        });\n    },\n  });\n\n  if (apps.length === 0) {\n    return (\n      <Dialog\n        open={open}\n        onClose={() => {}}\n        aria-labelledby=\"responsive-dialog-title\"\n      >\n        <DialogTitle id=\"responsive-dialog-title\">There is no apps</DialogTitle>\n        <DialogContent>\n          <DialogContentText>\n            You should create app first please!\n          </DialogContentText>\n        </DialogContent>\n        <DialogActions>\n          <Button\n            disabled={loading}\n            variant=\"contained\"\n            autoFocus\n            onClick={() => setOpen(false)}\n          >\n            Close\n          </Button>\n        </DialogActions>\n      </Dialog>\n    );\n  }\n\n  return (\n    <Dialog onClose={() => {}} open={open}>\n      <Box style={{ width: \"400px\" }}>\n        <DialogTitle\n          style={{ display: \"flex\", justifyContent: \"space-between\" }}\n        >\n          New User\n          <IconButton disabled={loading} onClick={() => setOpen(false)}>\n            <CloseIcon />\n          </IconButton>\n        </DialogTitle>\n        <Box sx={{ width: \"100%\", typography: \"body1\", padding: 1 }}>\n          <form onSubmit={formik.handleSubmit}>\n            <Box>\n              <FormControl fullWidth>\n                <InputLabel variant=\"standard\" htmlFor=\"uncontrolled-native\">\n                  App\n                </InputLabel>\n                <NativeSelect\n                  inputProps={{\n                    name: \"appName\",\n                    id: \"uncontrolled-native\",\n                  }}\n                  onChange={(e) => {\n                    formik.setFieldValue(\"appId\", e.target.value);\n                  }}\n                >\n                  {apps.map((app) => {\n                    return (\n                      <option key={app._id} value={app._id}>\n                        {app.appName}\n                      </option>\n                    );\n                  })}\n                </NativeSelect>\n              </FormControl>\n            </Box>\n            <Box>\n              <TextField\n                fullWidth\n                error={\n                  formik.touched.firstName && formik.errors.firstName\n                    ? true\n                    : false\n                }\n                helperText={\n                  formik.touched.firstName && formik.errors.firstName\n                    ? formik.errors.firstName\n                    : \"\"\n                }\n                margin=\"dense\"\n                label=\"First Name\"\n                name=\"firstName\"\n                variant=\"standard\"\n                onChange={formik.handleChange}\n                onBlur={formik.handleBlur}\n                value={formik.values.firstName}\n              />\n              <TextField\n                fullWidth\n                error={\n                  formik.touched.lastName && formik.errors.lastName\n                    ? true\n                    : false\n                }\n                helperText={\n                  formik.touched.lastName && formik.errors.lastName\n                    ? formik.errors.lastName\n                    : \"\"\n                }\n                margin=\"dense\"\n                label=\"Last Name\"\n                name=\"lastName\"\n                variant=\"standard\"\n                onChange={formik.handleChange}\n                onBlur={formik.handleBlur}\n                value={formik.values.lastName}\n              />\n              <TextField\n                fullWidth\n                error={\n                  formik.touched.lastName && formik.errors.username\n                    ? true\n                    : false\n                }\n                helperText={\n                  formik.touched.username && formik.errors.username\n                    ? formik.errors.username\n                    : \"\"\n                }\n                margin=\"dense\"\n                label=\"Username\"\n                name=\"username\"\n                variant=\"standard\"\n                onChange={formik.handleChange}\n                onBlur={formik.handleBlur}\n                value={formik.values.username}\n              />\n              <TextField\n                fullWidth\n                error={\n                  formik.touched.password && formik.errors.password\n                    ? true\n                    : false\n                }\n                helperText={\n                  formik.touched.password && formik.errors.password\n                    ? formik.errors.password\n                    : \"\"\n                }\n                margin=\"dense\"\n                label=\"Password\"\n                name=\"password\"\n                variant=\"standard\"\n                onChange={formik.handleChange}\n                onBlur={formik.handleBlur}\n                value={formik.values.password}\n              />\n            </Box>\n            <Box\n              style={{\n                display: \"inline-flex\",\n                margin: \"0 auto\",\n                flexDirection: \"column\",\n              }}\n            >\n              <LoadingButton\n                loading={loading}\n                variant=\"contained\"\n                style={{ marginTop: \"15px\" }}\n                type=\"submit\"\n                disabled={loading}\n              >\n                Create New User\n              </LoadingButton>\n            </Box>\n          </form>\n        </Box>\n      </Box>\n    </Dialog>\n  );\n}\n","import React, { useEffect, useState } from \"react\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport Paper from \"@mui/material/Paper\";\nimport { Button, Checkbox, Typography } from \"@mui/material\";\nimport {\n  getUserAcl,\n  IAclBody,\n  IUserAcl,\n  TPermission,\n  updateUserAcl,\n} from \"../http\";\nimport { Box } from \"@mui/system\";\nimport { FullPageSpinner } from \"./FullPageSpinner\";\nimport { useStoreState } from \"../store\";\n\nexport interface IEditAcl {\n  userId: string;\n  updateData?(user: IUserAcl): void;\n}\n\nconst label = { inputProps: { \"aria-label\": \"Checkbox\" } };\ntype TKeys =\n  | \"appCreate\"\n  | \"appPush\"\n  | \"appSettings\"\n  | \"appStats\"\n  | \"appTokens\"\n  | \"appUsers\";\n\nconst checkDisabled = (arr: Array<string> | undefined, property: string) => {\n  if (!arr) return false;\n  return !!arr.find((item) => item === property);\n};\nconst checkAdminEnabled = (acl: TPermission) => {\n  if (!acl) return false;\n  return !!Object.entries(acl).find((item) => item[0] === \"admin\" && !!item[1]);\n};\nconst Row = ({\n  name,\n  row,\n  onChange,\n  disableAllRow,\n}: {\n  name: TKeys;\n  row: TPermission;\n  disableAllRow: boolean;\n  onChange: (\n    e: React.ChangeEvent<HTMLInputElement>,\n    keyToChange: TKeys\n  ) => void;\n}) => {\n  const isOwner = useStoreState((state) => state.user?.ACL.ownerAccess);\n  return (\n    <TableRow\n      sx={{\n        \"&:last-child td, &:last-child th\": { border: 0 },\n      }}\n    >\n      <TableCell component=\"th\" scope=\"row\">\n        {name}\n      </TableCell>\n      <TableCell\n        style={{\n          backgroundColor: !checkDisabled(row?.disabled, \"create\")\n            ? \"white\"\n            : \"lightgrey\",\n        }}\n        align=\"left\"\n      >\n        <Checkbox\n          checked={row?.create}\n          name={\"create\"}\n          disabled={\n            (checkDisabled(row?.disabled, \"create\") || disableAllRow) &&\n            !isOwner\n          }\n          onChange={(e) => onChange(e, name)}\n          {...label}\n        />\n      </TableCell>\n      <TableCell\n        style={{\n          backgroundColor: !checkDisabled(row?.disabled, \"read\")\n            ? \"white\"\n            : \"lightgrey\",\n        }}\n        align=\"left\"\n      >\n        <Checkbox\n          name={\"read\"}\n          onChange={(e) => onChange(e, name)}\n          disabled={checkDisabled(row?.disabled, \"read\") || disableAllRow}\n          checked={row?.read}\n          {...label}\n        />\n      </TableCell>\n      <TableCell\n        style={{\n          backgroundColor: !checkDisabled(row?.disabled, \"update\")\n            ? \"white\"\n            : \"lightgrey\",\n        }}\n        align=\"left\"\n      >\n        <Checkbox\n          name={\"update\"}\n          onChange={(e) => onChange(e, name)}\n          disabled={checkDisabled(row?.disabled, \"update\") || disableAllRow}\n          checked={row?.update}\n          {...label}\n        />\n      </TableCell>\n      <TableCell\n        style={{\n          backgroundColor: !checkDisabled(row?.disabled, \"delete\")\n            ? \"white\"\n            : \"lightgrey\",\n        }}\n        align=\"left\"\n      >\n        <Checkbox\n          name={\"delete\"}\n          onChange={(e) => onChange(e, name)}\n          disabled={checkDisabled(row?.disabled, \"delete\") || disableAllRow}\n          checked={row?.delete}\n          {...label}\n        />\n      </TableCell>\n      <TableCell\n        style={{\n          backgroundColor: !checkDisabled(row?.disabled, \"admin\")\n            ? \"white\"\n            : \"lightgrey\",\n        }}\n        align=\"left\"\n      >\n        <Checkbox\n          name={\"admin\"}\n          onChange={(e) => onChange(e, name)}\n          disabled={checkDisabled(row?.disabled, \"admin\") || disableAllRow}\n          checked={row?.admin}\n          {...label}\n        />\n      </TableCell>\n    </TableRow>\n  );\n};\n\nexport const EditAcl: React.FC<IEditAcl> = ({ userId, updateData }) => {\n  const [userAcl, setUserAcl] = useState<IUserAcl>();\n  const [userAclApplicationKeys, setUserAclApplicationKeys] = useState<\n    Array<TKeys>\n  >([]);\n  const [userAclNetworkKeys, setUserAclNetworkKeys] = useState<Array<TKeys>>(\n    []\n  );\n  const myAcl = useStoreState((state) => state.ACL);\n  const [loading, setLoading] = useState(false);\n\n  useEffect(() => {\n    console.log(\"userAclApplicationKeys \", userAclApplicationKeys);\n  }, [userAclApplicationKeys]);\n\n  const getAcl = async () => {\n    setLoading(true);\n    try {\n      const { data } = await getUserAcl(userId);\n      console.log(\"getAcl \", data);\n      setUserAcl(data);\n      const appKeys = Object.keys(data.result.application) as TKeys[];\n      const networkKeys = Object.keys(data.result.network) as TKeys[];\n\n      setUserAclApplicationKeys(appKeys);\n      setUserAclNetworkKeys(networkKeys);\n    } catch (error) {\n      console.log(error);\n    }\n    setLoading(false);\n  };\n\n  const onApplicationAclChange = (\n    e: React.ChangeEvent<HTMLInputElement>,\n    keyToChange: TKeys\n  ) => {\n    setUserAcl((prev) => ({\n      result: {\n        ...prev!.result,\n        application: {\n          ...prev!.result!.application,\n          [keyToChange]: {\n            ...prev!.result!.application[keyToChange],\n            [e.target.name]: e.target.checked,\n          },\n        },\n      },\n    }));\n  };\n  const onNetworkAclChange = (\n    e: React.ChangeEvent<HTMLInputElement>,\n    keyToChange: TKeys\n  ) => {\n    setUserAcl((prev) => ({\n      result: {\n        ...prev!.result,\n        network: {\n          ...prev!.result!.network,\n          netStats: {\n            ...prev!.result!.network.netStats,\n            [e.target.name]: e.target.checked,\n          },\n        },\n      },\n    }));\n  };\n\n  const updateAcl = async () => {\n    setLoading(true);\n    try {\n      const filteredApplication = Object.fromEntries(\n        Object.entries(userAcl!.result!.application).map((item) => {\n          delete item[1].disabled;\n          return item;\n        })\n      );\n      const filteredNetwork = Object.fromEntries(\n        Object.entries(userAcl!.result!.network).map((item) => {\n          delete item[1].disabled;\n          return item;\n        })\n      );\n\n      const body = {\n        application: filteredApplication,\n        network: filteredNetwork,\n      } as IAclBody;\n\n      const aclRes = await updateUserAcl(userId, body);\n      const updatedUserAcl = aclRes.data as IUserAcl;\n      if (updateData) {\n        updateData(updatedUserAcl);\n      }\n    } catch (error) {\n      console.log(error);\n    }\n    setLoading(false);\n  };\n  useEffect(() => {\n    getAcl();\n  }, []);\n\n  if (loading) {\n    return <FullPageSpinner />;\n  }\n\n  return (\n    <>\n      <Typography marginBottom={\"10px\"} fontWeight={\"bold\"}>\n        Applications\n      </Typography>\n\n      <TableContainer component={Paper}>\n        <Table size={\"small\"} sx={{ minWidth: 650 }} aria-label=\"simple table\">\n          <TableHead>\n            <TableRow>\n              <TableCell>Name</TableCell>\n              <TableCell>Create</TableCell>\n              <TableCell align=\"left\">Read</TableCell>\n              <TableCell align=\"left\">Update</TableCell>\n              <TableCell align=\"left\">Delete</TableCell>\n              <TableCell align=\"left\">Admin</TableCell>\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {myAcl.result &&\n              userAclApplicationKeys.map((row) => {\n                const application = userAcl!.result.application[row];\n                const myApplicationAcl = myAcl!.result.application[row];\n\n                return (\n                  <Row\n                    disableAllRow={!checkAdminEnabled(myApplicationAcl)}\n                    // disableAllRow={false}\n                    onChange={onApplicationAclChange}\n                    name={row}\n                    row={application}\n                    key={row}\n                  />\n                );\n              })}\n          </TableBody>\n        </Table>\n      </TableContainer>\n      <Typography marginBottom={\"10px\"} marginTop={\"10px\"} fontWeight={\"bold\"}>\n        Networks\n      </Typography>\n\n      <TableContainer component={Paper}>\n        <Table size={\"small\"} sx={{ minWidth: 650 }} aria-label=\"simple table\">\n          <TableHead>\n            <TableRow>\n              <TableCell>Name</TableCell>\n\n              <TableCell>Create</TableCell>\n              <TableCell align=\"left\">Read</TableCell>\n              <TableCell align=\"left\">Update</TableCell>\n              <TableCell align=\"left\">Delete</TableCell>\n              <TableCell align=\"left\">Admin</TableCell>\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {userAclNetworkKeys.map((row) => {\n              const network = userAcl!.result.network.netStats;\n              const myNetworkAcl = myAcl!.result.network.netStats;\n\n              return (\n                <Row\n                  disableAllRow={!checkAdminEnabled(myNetworkAcl)}\n                  // disableAllRow={false}\n                  onChange={onNetworkAclChange}\n                  name={row}\n                  row={network}\n                  key={row}\n                />\n              );\n            })}\n          </TableBody>\n        </Table>\n      </TableContainer>\n      <Box\n        sx={{\n          display: \"flex\",\n          width: \"100%\",\n          justifyContent: \"flex-end\",\n          marginTop: \"20px\",\n        }}\n      >\n        <Button variant=\"contained\" onClick={updateAcl}>\n          Update Acl\n        </Button>\n      </Box>\n    </>\n  );\n};\n","import * as React from \"react\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport Paper from \"@mui/material/Paper\";\nimport Box from \"@mui/material/Box\";\nimport { IconButton, Modal, Typography } from \"@mui/material\";\nimport AddCircleIcon from \"@mui/icons-material/AddCircle\";\nimport Select, { SelectChangeEvent } from \"@mui/material/Select\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { useStoreState } from \"../../store\";\nimport NoDataImage from \"../../components/NoDataImage\";\nimport NewUserModal from \"./NewUserModal\";\nimport FormControl from \"@mui/material/FormControl\";\nimport InputLabel from \"@mui/material/InputLabel\";\nimport Pagination from \"@mui/material/Pagination\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport * as http from \"../../http\";\nimport { EditAcl } from \"../../components/EditAcl\";\n\nconst boxStyle = {\n  position: \"absolute\" as \"absolute\",\n  top: \"50%\",\n  left: \"50%\",\n  transform: \"translate(-50%, -50%)\",\n  width: \"70vw\",\n  bgcolor: \"background.paper\",\n  boxShadow: 24,\n  borderRadius: \"10px\",\n  p: 4,\n};\n\nfunction hasACLAdmin(acl: http.IUserAcl): boolean {\n  const appKeys = Object.keys(acl.result.application);\n  let hasAdmin = false;\n  for (let i = 0; i < appKeys.length; i++) {\n    if (acl.result.application[appKeys[i]].admin === true) {\n      hasAdmin = true;\n      break;\n    }\n  }\n\n  return hasAdmin;\n}\n\nexport default function UsersTable() {\n  const apps = useStoreState((state) => state.apps);\n  const ownerAccess = useStoreState((state) => state.user.ACL.ownerAccess);\n  const user = useStoreState((state) => state.user);\n  const [showNewUser, setShowNewUser] = React.useState(false);\n  const [users, setUsers] = React.useState<[] | http.IUser[]>([]);\n  const [currentApp, setCurrentApp] = React.useState<string>();\n  const [aclEditData, setAclEditData] = React.useState({\n    modalOpen: false,\n    userId: \"\",\n  });\n  const [hasAdmin, setHasAdmin] = React.useState(false);\n  const ACL = useStoreState((state) => state.ACL);\n\n  React.useEffect(() => {\n    setHasAdmin(hasACLAdmin(ACL));\n  }, [ACL]);\n\n  const [pagination, setPagination] = React.useState<{\n    total: number;\n    limit: number;\n    offset: number;\n  }>();\n\n  const getUsers = async (\n    appId: string | null,\n    limit: number = 10,\n    offset: number = 0\n  ) => {\n    try {\n      if (appId) {\n        console.log(appId);\n        const getUsersResp = await http.getAppUsers(appId, limit, offset);\n        const { data } = getUsersResp;\n        setPagination({\n          limit: data.limit,\n          offset: data.offset,\n          total: data.total,\n        });\n        return data.items;\n      }\n    } catch (e) {}\n    return [];\n  };\n\n  React.useEffect(() => {\n    if (ownerAccess) {\n      if (apps.length) {\n        setCurrentApp(apps[0]._id);\n        getUsers(apps[0]._id).then((users) => {\n          setUsers(users);\n        });\n      }\n    }\n  }, [apps]);\n\n  React.useEffect(() => {\n    if (!ownerAccess) {\n      setCurrentApp(user.appId);\n      getUsers(user.appId).then((users) => {\n        setUsers(users);\n      });\n    }\n  }, []);\n\n  React.useEffect(() => {\n    console.log(\"Users mount\");\n  }, []);\n\n  const onAppSelectChange = (e: SelectChangeEvent) => {\n    setCurrentApp(e.target.value);\n    getUsers(e.target.value).then((users) => {\n      setUsers(users);\n    });\n  };\n\n  const onPagination = (event: React.ChangeEvent<unknown>, page: number) => {\n    // page = 1 => offset 0\n    // page = 2 => offset 10\n    // page = 3 => offset 20\n    let offset = 0;\n    if (page - 1 > 0) {\n      offset = (page - 1) * (pagination?.limit || 10);\n    }\n\n    getUsers(currentApp || null, pagination?.limit || 10, offset).then(\n      (users) => setUsers(users)\n    );\n  };\n\n  const handleAclEditOpen = (userId: string) =>\n    setAclEditData({ modalOpen: true, userId: userId });\n\n  const handleAclEditClose = () =>\n    setAclEditData({ modalOpen: false, userId: \"\" });\n\n  const updateUserDataAfterAclChange = (user: http.IUserAcl) => {\n    const oldUsers = users;\n    const indexToUpdate = oldUsers.findIndex(\n      (item) => item._id === aclEditData.userId\n    );\n    if (indexToUpdate !== -1) {\n    }\n    oldUsers[indexToUpdate]._id = user.result.userId;\n    setUsers(oldUsers);\n  };\n\n  return (\n    <TableContainer component={Paper} style={{ margin: \"0 auto\" }}>\n      <Box style={{ display: \"flex\", alignItems: \"center\" }}>\n        <Typography variant=\"h6\" style={{ margin: \"16px\" }}>\n          Users\n        </Typography>\n        {currentApp && ownerAccess ? (\n          <FormControl variant=\"standard\" sx={{ m: 1, minWidth: 120 }}>\n            <InputLabel id=\"demo-simple-select-label\">App</InputLabel>\n            <Select\n              labelId=\"demo-simple-select-label\"\n              id=\"demo-simple-select\"\n              label=\"App\"\n              value={currentApp}\n              onChange={onAppSelectChange}\n            >\n              {apps.map((app) => {\n                return (\n                  <MenuItem key={app._id} value={app._id}>\n                    {app.appName}\n                  </MenuItem>\n                );\n              })}\n            </Select>\n          </FormControl>\n        ) : null}\n\n        {(ownerAccess || ACL.result.application.appUsers.create) && (\n          <IconButton onClick={() => setShowNewUser(true)} size=\"large\">\n            <AddCircleIcon fontSize=\"large\"></AddCircleIcon>\n          </IconButton>\n        )}\n      </Box>\n      {users.length === 0 && (\n        <Box\n          style={{\n            display: \"flex\",\n            flexDirection: \"column\",\n            alignItems: \"center\",\n          }}\n        >\n          <NoDataImage></NoDataImage>\n          <Typography style={{ marginTop: \"20px\", marginBottom: \"20px\" }}>\n            Users not found.\n          </Typography>\n        </Box>\n      )}\n\n      {users.length > 0 && (\n        <Table aria-label=\"simple table\">\n          <TableHead>\n            <TableRow>\n              <TableCell width={200}>appId</TableCell>\n              <TableCell align=\"right\">firstName</TableCell>\n              <TableCell align=\"right\">lastName</TableCell>\n              <TableCell align=\"right\">username</TableCell>\n              <TableCell align=\"right\">email</TableCell>\n              <TableCell align=\"right\">Actions</TableCell>\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {users.map((user) => (\n              <TableRow\n                key={user._id}\n                sx={{ \"&:last-child td, &:last-child th\": { border: 0 } }}\n              >\n                <TableCell component=\"th\" scope=\"row\">\n                  {user.appId}\n                </TableCell>\n                <TableCell align=\"right\">{user.firstName}</TableCell>\n                <TableCell align=\"right\">{user.lastName}</TableCell>\n                <TableCell align=\"right\">\n                  {user.username ? user.username : \"-\"}\n                </TableCell>\n                <TableCell align=\"right\">\n                  {user.email ? user.email : \"-\"}\n                </TableCell>\n                <TableCell align=\"right\">\n                  <Box sx={{ width: \"200px\" }}>\n                    {ACL.result.application.appUsers.update && (\n                      <Typography>Edit</Typography>\n                    )}\n\n                    {hasAdmin && (\n                      <Typography\n                        style={{\n                          cursor: \"pointer\",\n                          textDecoration: \"underline\",\n                        }}\n                        onClick={() => handleAclEditOpen(user._id)}\n                      >\n                        Edit ACL\n                      </Typography>\n                    )}\n                  </Box>\n                </TableCell>\n              </TableRow>\n            ))}\n            {pagination?.total && (\n              <TableRow>\n                <TableCell colSpan={6}>\n                  <Pagination\n                    onChange={onPagination}\n                    count={Math.ceil(pagination.total / pagination.limit)}\n                  />\n                </TableCell>\n              </TableRow>\n            )}\n          </TableBody>\n        </Table>\n      )}\n      <NewUserModal\n        open={showNewUser}\n        setUsers={setUsers}\n        setOpen={setShowNewUser}\n      />\n      <Modal\n        open={aclEditData.modalOpen}\n        onClose={handleAclEditClose}\n        aria-labelledby=\"modal-modal-title\"\n        aria-describedby=\"modal-modal-description\"\n      >\n        <Box sx={boxStyle}>\n          <EditAcl\n            updateData={updateUserDataAfterAclChange}\n            userId={aclEditData.userId}\n          />\n          <IconButton\n            onClick={handleAclEditClose}\n            sx={{ position: \"absolute\", top: 0, right: 0, color: \"black\" }}\n          >\n            <CloseIcon fontSize={\"large\"} />\n          </IconButton>\n        </Box>\n      </Modal>\n    </TableContainer>\n  );\n}\n"],"names":["NoDataImage","className","NewUserModal","open","setOpen","setUsers","apps","useStoreState","state","addAppUsers","useState","loading","setLoading","formik","useFormik","initialValues","firstName","lastName","username","password","appId","_id","validate","values","errors","onSubmit","app","find","el","http","appToken","then","result","old","data","user","length","Dialog","onClose","DialogTitle","id","DialogContent","DialogContentText","DialogActions","Button","disabled","variant","autoFocus","onClick","Box","style","width","display","justifyContent","IconButton","Close","sx","typography","padding","handleSubmit","FormControl","fullWidth","InputLabel","htmlFor","NativeSelect","inputProps","name","onChange","e","setFieldValue","target","value","map","appName","TextField","error","touched","helperText","margin","label","handleChange","onBlur","handleBlur","flexDirection","LoadingButton","marginTop","type","checkDisabled","arr","property","item","checkAdminEnabled","acl","Object","entries","Row","row","disableAllRow","isOwner","ACL","ownerAccess","TableRow","border","TableCell","component","scope","backgroundColor","align","Checkbox","checked","create","read","update","delete","admin","EditAcl","userId","updateData","userAcl","setUserAcl","userAclApplicationKeys","setUserAclApplicationKeys","userAclNetworkKeys","setUserAclNetworkKeys","myAcl","useEffect","console","log","getAcl","getUserAcl","appKeys","keys","application","networkKeys","network","onApplicationAclChange","keyToChange","prev","onNetworkAclChange","netStats","updateAcl","filteredApplication","fromEntries","filteredNetwork","body","updateUserAcl","aclRes","updatedUserAcl","FullPageSpinner","Typography","marginBottom","fontWeight","TableContainer","Paper","Table","size","minWidth","TableHead","TableBody","myApplicationAcl","myNetworkAcl","boxStyle","position","top","left","transform","bgcolor","boxShadow","borderRadius","p","UsersTable","React","showNewUser","setShowNewUser","users","currentApp","setCurrentApp","modalOpen","aclEditData","setAclEditData","hasAdmin","setHasAdmin","i","hasACLAdmin","pagination","setPagination","getUsers","limit","offset","getUsersResp","total","items","handleAclEditClose","alignItems","m","Select","labelId","MenuItem","appUsers","AddCircle","fontSize","email","cursor","textDecoration","colSpan","Pagination","event","page","count","Math","ceil","Modal","oldUsers","indexToUpdate","findIndex","right","color"],"sourceRoot":""}