|
|
@@ -10,9 +10,19 @@ export function AdminOrganizations() {
|
|
|
async function load() { try { setOrganizations((await api.admin.organizations()).organizations) } catch (e) { setError((e as Error).message) } }
|
|
|
useEffect(() => { load() }, [])
|
|
|
async function create(e: FormEvent<HTMLFormElement>) {
|
|
|
- e.preventDefault(); const form = new FormData(e.currentTarget)
|
|
|
- try { await api.admin.createOrganization(String(form.get('name')), String(form.get('slug'))); setMessage('组织已创建'); (e.currentTarget as HTMLFormElement).reset(); await load() }
|
|
|
- catch (x) { setError((x as Error).message) }
|
|
|
+ e.preventDefault()
|
|
|
+ const formElement = e.currentTarget
|
|
|
+ const form = new FormData(formElement)
|
|
|
+ setError('')
|
|
|
+ setMessage('')
|
|
|
+ try {
|
|
|
+ await api.admin.createOrganization(String(form.get('name')), String(form.get('slug')))
|
|
|
+ setMessage('组织已创建')
|
|
|
+ formElement.reset()
|
|
|
+ await load()
|
|
|
+ } catch (x) {
|
|
|
+ setError((x as Error).message)
|
|
|
+ }
|
|
|
}
|
|
|
return <div className="page admin-page"><div className="admin-header-row"><div><h2>组织管理</h2><p>创建组织并管理成员与积分</p></div></div>
|
|
|
{error && <div className="notice notice-error">{error}</div>}{message && <div className="notice notice-success">{message}</div>}
|
|
|
@@ -35,27 +45,57 @@ export function AdminOrganizationDetail() {
|
|
|
async function load() { try { setData(await api.admin.organization(id)) } catch (x) { setError((x as Error).message) } }
|
|
|
useEffect(() => { load() }, [id])
|
|
|
async function setMember(e: FormEvent<HTMLFormElement>) {
|
|
|
- e.preventDefault(); const f = new FormData(e.currentTarget)
|
|
|
+ e.preventDefault()
|
|
|
+ const formElement = e.currentTarget
|
|
|
+ const f = new FormData(formElement)
|
|
|
+ setError('')
|
|
|
+ setMessage('')
|
|
|
const phone = String(f.get('phone'))
|
|
|
try {
|
|
|
const person = (await api.admin.listUsers(phone)).users.find((u) => u.phone === phone)
|
|
|
if (!person) return setError('未找到该手机号对应的用户')
|
|
|
await api.admin.setOrganizationMember(id, person.id, String(f.get('role')) as 'MEMBER' | 'MANAGER')
|
|
|
- setMessage('成员关系已更新'); await load()
|
|
|
+ setMessage('成员关系已更新')
|
|
|
+ formElement.reset()
|
|
|
+ setUsers([])
|
|
|
+ await load()
|
|
|
}
|
|
|
catch (x) { setError((x as Error).message) }
|
|
|
}
|
|
|
async function search(phone: string) { try { setUsers((await api.admin.listUsers(phone)).users) } catch (x) { setError((x as Error).message) } }
|
|
|
- async function review(applicationId: string, approve: boolean) { try { await api.admin.reviewOrganizationApplication(id, applicationId, approve); await load() } catch (x) { setError((x as Error).message) } }
|
|
|
+ async function review(applicationId: string, approve: boolean) {
|
|
|
+ setError('')
|
|
|
+ setMessage('')
|
|
|
+ try { await api.admin.reviewOrganizationApplication(id, applicationId, approve); await load() } catch (x) { setError((x as Error).message) }
|
|
|
+ }
|
|
|
async function points(e: FormEvent<HTMLFormElement>) {
|
|
|
- e.preventDefault(); const f = new FormData(e.currentTarget)
|
|
|
- try { await api.admin.adjustOrganizationPoints(id, Number(f.get('amount')), String(f.get('reason'))); setMessage('积分已调整'); await load() }
|
|
|
+ e.preventDefault()
|
|
|
+ const formElement = e.currentTarget
|
|
|
+ const f = new FormData(formElement)
|
|
|
+ setError('')
|
|
|
+ setMessage('')
|
|
|
+ try {
|
|
|
+ await api.admin.adjustOrganizationPoints(id, Number(f.get('amount')), String(f.get('reason')))
|
|
|
+ setMessage('积分已调整')
|
|
|
+ formElement.reset()
|
|
|
+ await load()
|
|
|
+ }
|
|
|
catch (x) { setError((x as Error).message) }
|
|
|
}
|
|
|
- async function rename(e: FormEvent<HTMLFormElement>) { e.preventDefault(); const f = new FormData(e.currentTarget)
|
|
|
- try { await api.admin.renameOrganization(id, String(f.get('name'))); setMessage('组织名称已更新'); await load() } catch (x) { setError((x as Error).message) } }
|
|
|
- async function updateSlug(e: FormEvent<HTMLFormElement>) { e.preventDefault(); const f = new FormData(e.currentTarget)
|
|
|
- try { await api.admin.updateOrganizationSlug(id, String(f.get('slug'))); setMessage('公开页面访问后缀已更新'); await load() } catch (x) { setError((x as Error).message) } }
|
|
|
+ async function rename(e: FormEvent<HTMLFormElement>) {
|
|
|
+ e.preventDefault()
|
|
|
+ const f = new FormData(e.currentTarget)
|
|
|
+ setError('')
|
|
|
+ setMessage('')
|
|
|
+ try { await api.admin.renameOrganization(id, String(f.get('name'))); setMessage('组织名称已更新'); await load() } catch (x) { setError((x as Error).message) }
|
|
|
+ }
|
|
|
+ async function updateSlug(e: FormEvent<HTMLFormElement>) {
|
|
|
+ e.preventDefault()
|
|
|
+ const f = new FormData(e.currentTarget)
|
|
|
+ setError('')
|
|
|
+ setMessage('')
|
|
|
+ try { await api.admin.updateOrganizationSlug(id, String(f.get('slug'))); setMessage('公开页面访问后缀已更新'); await load() } catch (x) { setError((x as Error).message) }
|
|
|
+ }
|
|
|
if (!data) return <div className="page admin-page">{error || '正在加载组织…'}</div>
|
|
|
return <div className="page admin-page"><Link className="back-link" to="/admin/organizations">← 全部组织</Link><h2>{data.organization.name} · {data.organization.is_active ? '正常' : '已停用'}</h2>
|
|
|
{error && <div className="notice notice-error">{error}</div>}{message && <div className="notice notice-success">{message}</div>}
|