diff --git a/server/admin/src/client/App.tsx b/server/admin/src/client/App.tsx index 3377456e..e75551a1 100644 --- a/server/admin/src/client/App.tsx +++ b/server/admin/src/client/App.tsx @@ -25,11 +25,11 @@ import { Dashboard } from './components/Dashboard'; import { discoverFields, fileFields, - groupFields, mailFields, messageFields, } from './fields'; import { i18n } from './i18n'; +import { GroupList } from './resources/group'; import { UserList } from './resources/user'; import { CacheManager } from './routes/cache'; import { TailchatNetwork } from './routes/network'; @@ -70,21 +70,7 @@ function App() { } /> - } - list={ - - } - /> + } list={} /> +) { + const { data } = await request.post('/callAction', { + action: actionName, + params, + }); + + return data; +} diff --git a/server/admin/src/client/resources/group.tsx b/server/admin/src/client/resources/group.tsx new file mode 100644 index 00000000..54deba6f --- /dev/null +++ b/server/admin/src/client/resources/group.tsx @@ -0,0 +1,98 @@ +import React, { useState } from 'react'; +import { + createTextField, + Identifier, + ListTable, + Message, + Modal, + ReferenceFieldEdit, + useEvent, + useTranslation, +} from 'tushan'; +import { groupFields } from '../fields'; +import { callAction } from '../request'; + +export const GroupList: React.FC = React.memo(() => { + const { t } = useTranslation(); + const [modal, contextHolder] = Modal.useModal(); + return ( + <> + {contextHolder} + [ + { + key: 'addGroupMember', + label: t('custom.action.addGroupMember'), + onClick: () => { + let userId: Identifier; + const { close } = modal.confirm({ + title: t('custom.action.addGroupMemberTitle'), + content: ( +
+
{t('custom.action.selectUser')}:
+ (userId = val)} /> +
+ ), + onOk: async () => { + if (!userId) { + Message.error( + t('custom.action.addGroupMemberRequiredTip') + ); + return; + } + + try { + await callAction('group.addMember', { + groupId: record.id, + userId, + }); + Message.success(t('tushan.common.success')); + close(); + } catch (err) { + console.error(err); + Message.error(String(err)); + } + }, + }); + }, + }, + ], + }} + /> + + ); +}); +GroupList.displayName = 'GroupList'; + +export const UserSelector: React.FC<{ onChange: (val: Identifier) => void }> = + React.memo((props) => { + const [userId, setUserId] = useState(''); + + const handleChange = useEvent((val: Identifier) => { + setUserId(val); + props.onChange(val); + }); + + return ( + + ); + }); +UserSelector.displayName = 'UserSelector'; diff --git a/server/admin/src/server/router/api.ts b/server/admin/src/server/router/api.ts index 982fcc73..4ae264e0 100644 --- a/server/admin/src/server/router/api.ts +++ b/server/admin/src/server/router/api.ts @@ -8,6 +8,7 @@ import { fileRouter } from './file'; import dayjs from 'dayjs'; import userModel from '../../../../models/user/user'; import messageModel from '../../../../models/chat/message'; +import groupModel from '../../../../models/group/group'; import { raExpressMongoose } from '../middleware/express-mongoose-ra-json-server'; import { cacheRouter } from './cache'; import discoverModel from '../../../../plugins/com.msgbyte.discover/models/discover'; @@ -50,6 +51,13 @@ router.use('/config', configRouter); router.use('/file', fileRouter); router.use('/cache', cacheRouter); +router.post('/callAction', auth(), async (req, res) => { + const { action, params } = req.body; + const ret = await callBrokerAction(action, params); + + res.json(ret); +}); + router.get('/user/count/summary', auth(), async (req, res) => { // 返回最近14天的用户数统计 const day = 14;