You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

191 lines
6.9 KiB

import { useEffect, useRef } from 'react'
import { useTranslation } from '@/i18n.ts'
import { useStyle } from './style.ts'
import {
Alert,
Button,
Divider,
Form,
Input,
InputNumber,
InputRef,
notification,
Flex
} from 'antd'
import { useAtom, useAtomValue } from 'jotai'
import TwoColPageLayout from '@/layout/TwoColPageLayout.tsx'
import { ProCard } from '@ant-design/pro-components'
import { PlusOutlined } from '@ant-design/icons'
import Glass from '@/components/glass'
import { categoryAtom, saveOrUpdateCategoryAtom } from '@/store/videos/category.ts'
import Switch from '@/components/switch'
import CategoryTree from './components/CategoryTree.tsx'
const Category = () => {
const { t } = useTranslation()
const { styles, cx } = useStyle()
const [ form ] = Form.useForm()
const inputRef = useRef<InputRef>()
const { mutate, isPending, isError, error } = useAtomValue(saveOrUpdateCategoryAtom)
const [ current, setCurrent ] = useAtom(categoryAtom)
useEffect(() => {
if (isError) {
notification.error({
message: t('message.error', '错误'),
description: (error as any).message ?? t('message.saveFail', '保存失败'),
})
}
}, [ isError ])
useEffect(() => {
if (current?.id === 0 && inputRef.current) {
inputRef.current.focus()
}
}, [ current ])
return (
<TwoColPageLayout
leftPanel={<>
<ProCard title={t('videos.category.title', '分类')}>
<CategoryTree form={form}/>
</ProCard>
<div className={styles.treeActions}>
<Divider style={{ flex: 1, margin: '8px 0' }}/>
<Button style={{ flex: 1 }} size={'small'}
block={true} type={'dashed'}
icon={<PlusOutlined/>}
onClick={() => {
const data = {
name: '',
extend: {
class: '',
area: '',
lang: '',
year: '',
tag: '',
state: '',
version: '',
},
sort: 0,
status: 1,
parent_id: 0,
id: 0,
}
setCurrent(data)
form.setFieldsValue(data)
}}
>{t('actions.news')}</Button>
</div>
</>}
>
<Glass
enabled={current?.id === undefined}
description={<>
<Alert
message={t('message.infoTitle', '提示')}
description={t('videos.category.form.empty', '请从左侧选择一行数据操作')}
type="info"
/>
</>}
>
<ProCard title={t('videos.category.setting', '编辑')}>
<Form form={form}
initialValues={current!}
labelAlign="right"
labelWrap
colon={false}
className={cx(styles.form, {
[styles.emptyForm]: current?.id === undefined
})}
>
<Form.Item hidden={true} label={'id'} name={'id'}>
<Input disabled={true}/>
</Form.Item>
<Form.Item
rules={[
{ required: true, message: t('rules.required') }
]}
label={t('videos.category.form.name', '名称')} name={'name'}>
<Input ref={inputRef as any}
placeholder={t('videos.category.form.name', '名称')}/>
</Form.Item>
<Form.Item label={t('videos.category.form.tag', 'Tag')}
name={[ 'extend', 'class' ]}
>
<Input/>
</Form.Item>
<Form.Item label={t('videos.category.form.area', '地区')}
name={[ 'extend', 'area' ]}
>
<Input/>
</Form.Item>
<Form.Item label={t('videos.category.form.lang', '语言')}
name={[ 'extend', 'lang' ]}
>
<Input/>
</Form.Item>
<Form.Item label={t('videos.category.form.year', '年份')}
name={[ 'extend', 'year' ]}
>
<Input/>
</Form.Item>
<Form.Item label={t('videos.category.form.state', '资源')}
name={[ 'extend', 'state' ]}
>
<Input/>
</Form.Item>
<Form.Item label={t('videos.category.form.version', '版本')}
name={[ 'extend', 'version' ]}
>
<Input/>
</Form.Item>
<Flex flex={1}>
<Flex flex={1}>
<Form.Item label={t('videos.category.form.sort', '排序')} name={'sort'}>
<InputNumber/>
</Form.Item>
</Flex>
<Flex flex={1}>
<Form.Item label={t('videos.category.form.status', '状态')}
name={'status'}>
<Switch/>
</Form.Item>
</Flex>
</Flex>
<Form.Item label={' '}>
<Button type="primary"
htmlType={'submit'}
loading={isPending}
onClick={() => {
form.validateFields().then((values) => {
mutate({
...values,
status: values.status ? 1 : 0,
extend: JSON.stringify(values.extend),
})
})
}}
>
{t('videos.category.form.save', '保存')}
</Button>
</Form.Item>
</Form>
</ProCard>
</Glass>
</TwoColPageLayout>
)
}
export default Category