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
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
|