UNPKG

node-red-contrib-chatbot

Version:

REDBot a Chat bot for a full featured chat bot for Telegram, Facebook Messenger and Slack. Almost no coding skills required

167 lines (152 loc) 4.42 kB
import React, { useState, useRef } from 'react'; import { Table, Icon, ButtonGroup, Button } from 'rsuite'; import gql from 'graphql-tag'; const { Column, HeaderCell, Cell } = Table; import PageContainer from '../../../src/components/page-container'; import Breadcrumbs from '../../../src/components/breadcrumbs'; import SmartDate from '../../../src/components/smart-date'; import CustomTable from '../../../src/components/table'; import { Input } from '../../../src/components/table-filters'; import confirm from '../../../src/components/confirm'; import '../styles/admins.scss'; import useAdmins from '../hooks/admins'; import ModalAdmin from '../views/modal-admin'; const ADMINS = gql` query ( $limit: Int, $offset: Int, $order: String, $username: String ) { counters { rows: admins { count(username: $username) } } rows: admins( limit: $limit, offset: $offset, order: $order, username: $username ) { id, username, first_name, last_name, payload, createdAt, email, permissions, chatbotIds } } `; const Admins = () => { const table = useRef(); const [ admin, setAdmin ] = useState(null); const { saving, error, deleteAdmin, editAdmin, createAdmin } = useAdmins(); return ( <PageContainer className="page-users"> <Breadcrumbs pages={['Admins']}/> {admin != null && ( <ModalAdmin admin={admin} error={error} disabled={saving} onCancel={() => setAdmin(null)} onSubmit={async admin => { if (admin.id != null) { await editAdmin({ variables: { id: admin.id, admin }}); } else { await createAdmin({ variables: { admin }}); } setAdmin(null); table.current.refetch(); }} />)} <CustomTable ref={table} query={ADMINS} height={600} labels={{ empty: 'No admins' }} initialSortField="createdAt" initialSortDirection="desc" toolbar={( <div> <Button appearance="primary" onClick={() => { setAdmin({}); }}>Create admin</Button> </div> )} filtersSchema={[ { name: 'username', label: 'Username', control: Input } ]} autoHeight > <Column width={60} align="center"> <HeaderCell>Id</HeaderCell> <Cell dataKey="id" /> </Column> <Column width={140} resizable> <HeaderCell>Subscribed</HeaderCell> <Cell> {({ createdAt }) => <SmartDate date={createdAt} />} </Cell> </Column> <Column width={150} resizable> <HeaderCell>Username</HeaderCell> <Cell dataKey="username"/> </Column> <Column width={200} resizable> <HeaderCell>First Name</HeaderCell> <Cell dataKey="first_name"/> </Column> <Column width={200} resizable> <HeaderCell>Last Name</HeaderCell> <Cell dataKey="last_name"/> </Column> <Column width={300} flexGrow={1}> <HeaderCell>Email</HeaderCell> <Cell dataKey="email"/> </Column> <Column width={80}> <HeaderCell>Action</HeaderCell> <Cell> {admin => ( <ButtonGroup> <Button size="xs" onClick={async () => { const name = [admin.first_name, admin.last_name].join(' '); if (await confirm( <div>Delete admin <strong>{name}</strong> (id: {admin.id})?</div>, { okLabel: 'Yes, delete' } )) { deleteAdmin({ variables: { id: admin.id }}) .then(table.current.refetch); } }} > <Icon icon="trash" /> </Button> <Button size="xs" onClick={() => setAdmin(admin)} > <Icon icon="edit2" /> </Button> </ButtonGroup> )} </Cell> </Column> </CustomTable> </PageContainer> ); }; export default Admins;