feat: 菜单管理图标选择交互整体优化

develop
zhoux 1 year ago
parent 0ae7e00e05
commit 67fac9673f

@ -0,0 +1,32 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-28 14:13:05
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-28 14:16:48
* @FilePath: \general-ai-platform-web\config\defaultIcon.ts
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A
*/
import { proFormItemStyleProps } from './defaultForm';
// 分步表单统一配置
export const proIconSelectWrapStyle: React.CSSProperties = {
position: 'relative',
width: proFormItemStyleProps.width + 48,
background: 'red',
left: 0,
};
export const proIconSelectStyle: React.CSSProperties = {
position: 'absolute',
left: '0',
padding: 16,
top: '5%',
width: '94%',
height: 500,
zIndex: 9,
boxShadow: '0px 4px 12px 0px rgba(0, 0, 0, 0.30)',
background: '#fff',
borderRadius: 4,
overflowY: 'scroll',
};

@ -40,7 +40,7 @@ const Category: React.FC<CategoryProps> = props => {
return ( return (
<div> <div>
<h4>{intl.formatMessage({ <h4 style={{paddingTop: 16}}>{intl.formatMessage({
id: `app.docs.components.icon.category.${title}`, id: `app.docs.components.icon.category.${title}`,
defaultMessage: '信息', defaultMessage: '信息',
})}</h4> })}</h4>

@ -24,11 +24,16 @@ const CopyableIcon: React.FC<CopyableIconProps> = ({
theme, theme,
}) => { }) => {
const className = classNames({ const className = classNames({
gn: true,
themeBgHover: true,
copied: justCopied === name, copied: justCopied === name,
[theme]: !!theme, [theme]: !!theme,
}); });
return ( return (
<li className={className} <li className={className}
style={{
lineHeight: '48px',
}}
onClick={() => { onClick={() => {
if (onSelect) { if (onSelect) {
onSelect(theme, name); onSelect(theme, name);

@ -92,7 +92,20 @@ const IconSelector: React.FC<IconSelectorProps> = (props) => {
}, [displayState.searchKey, displayState.theme]); }, [displayState.searchKey, displayState.theme]);
return ( return (
<> <>
<div style={{ display: 'flex', justifyContent: 'space-between' }}> <div className='gn' style={{ display: 'flex', justifyContent: 'space-between' }}>
{/*
* //TODO 二级:输入框上方提示文案悬浮会覆盖清空菜单图标项按钮
*/}
<Input.Search
// placeholder={messages['app.docs.components.icon.search.placeholder']}
style={{ marginRight: 12, flex: 1 }}
allowClear
onChange={e => handleSearchIcon(e.currentTarget.value)}
size="large"
autoFocus
suffix={<IconPicSearcher />}
/>
{/* <Icon component={OutlinedIcon} /> <Icon component={FilledIcon} TwoToneIcon /> */}
<Radio.Group <Radio.Group
value={displayState.theme} value={displayState.theme}
onChange={handleChangeTheme} onChange={handleChangeTheme}
@ -101,15 +114,15 @@ const IconSelector: React.FC<IconSelectorProps> = (props) => {
buttonStyle="solid" buttonStyle="solid"
options={[ options={[
{ {
label: <Icon component={OutlinedIcon} />, label: <>线</> ,
value: ThemeType.Outlined value: ThemeType.Outlined
}, },
{ {
label: <Icon component={FilledIcon} />, label: <></> ,
value: ThemeType.Filled value: ThemeType.Filled
}, },
{ {
label: <Icon component={TwoToneIcon} />, label: <></>,
value: ThemeType.TwoTone value: ThemeType.TwoTone
}, },
]} ]}
@ -124,15 +137,7 @@ const IconSelector: React.FC<IconSelectorProps> = (props) => {
<Icon components={TwoToneIcon} /> {messages['app.docs.components.icon.two-tone']} <Icon components={TwoToneIcon} /> {messages['app.docs.components.icon.two-tone']}
</Radio.Button> */} </Radio.Button> */}
</Radio.Group> </Radio.Group>
<Input.Search
// placeholder={messages['app.docs.components.icon.search.placeholder']}
style={{ margin: '0 10px', flex: 1 }}
allowClear
onChange={e => handleSearchIcon(e.currentTarget.value)}
size="large"
autoFocus
suffix={<IconPicSearcher />}
/>
</div> </div>
{renderCategories} {renderCategories}
</> </>

@ -1,3 +1,11 @@
/*
* @Author: zhoux zhouxia@supervision.ltd
* @Date: 2023-11-01 13:56:33
* @LastEditors: zhoux zhouxia@supervision.ltd
* @LastEditTime: 2023-11-28 11:34:00
* @FilePath: \general-ai-platform-web\src\components\RightContent\index.tsx
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { QuestionCircleOutlined } from '@ant-design/icons'; import { QuestionCircleOutlined } from '@ant-design/icons';
import { SelectLang as UmiSelectLang } from '@umijs/max'; import { SelectLang as UmiSelectLang } from '@umijs/max';
import React from 'react'; import React from 'react';
@ -38,7 +46,7 @@ export const SelectRole = () => {
const { currentUser } = initialState || {}; const { currentUser } = initialState || {};
return ( return (
<> <span className='gn'>
{ {
currentUser && ( currentUser && (
<Select <Select
@ -52,7 +60,7 @@ export const SelectRole = () => {
/> />
) )
} }
</> </span>
); );
}; };

@ -170,6 +170,27 @@ a.ant-dropdown-trigger {
.ant-descriptions .ant-descriptions-row > td { .ant-descriptions .ant-descriptions-row > td {
padding-right: 12px; padding-right: 12px;
} }
::-webkit-scrollbar-track-piece {
-webkit-border-radius: 0;
}
::-webkit-scrollbar {
width: 5px;
height: 10px;
}
::-webkit-scrollbar-thumb {
height: 50px;
background-color: #CCC;
-webkit-border-radius: 6px;
outline-offset: -2px;
-moz-opacity: 0.5;
-khtml-opacity: 0.5;
opacity: 0.5;
}
::-webkit-scrollbar-thumb:hover {
height: 50px;
background-color: #878987;
-webkit-border-radius: 6px;
}
.gn { .gn {
/* UI // update 使 /* UI // update 使
@ -199,6 +220,27 @@ a.ant-dropdown-trigger {
.gn .ant-pro-table-list-toolbar-container { .gn .ant-pro-table-list-toolbar-container {
padding-block: 8px; padding-block: 8px;
} }
.gn .ant-pro-global-header-header-actions-item > * {
padding-block: 0;
}
.gn .ant-radio-group-large .ant-radio-button-wrapper {
height: 32px;
line-height: 32px;
}
.gn .ant-input-affix-wrapper-lg {
height: 32px;
line-height: 32px;
font-size: 14px;
}
.gn .ant-btn.ant-btn-lg {
font-size: 14px;
height: 32px;
border-radius: 4px;
}
.gn .ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) {
border-start-start-radius: 4px;
border-end-start-radius: 4px;
}
.gn.h2 { .gn.h2 {
font-size: 18px; font-size: 18px;
} }
@ -220,3 +262,6 @@ a.ant-dropdown-trigger {
.gn .border_bottom_1 { .gn .border_bottom_1 {
border-bottom: 1px solid #E0E0E0; border-bottom: 1px solid #E0E0E0;
} }
.gn.themeBgHover:hover {
background-color: #155BD4;
}

@ -217,6 +217,29 @@ a.ant-dropdown-trigger{
} }
} }
// 美化滚动条
::-webkit-scrollbar-track-piece {
-webkit-border-radius: 0
}
::-webkit-scrollbar {
width: 5px;
height: 10px
}
::-webkit-scrollbar-thumb {
height: 50px;
background-color: #CCC;
-webkit-border-radius: 6px;
outline-offset: -2px;
-moz-opacity: 0.5;
-khtml-opacity: 0.5;
opacity: 0.5
}
::-webkit-scrollbar-thumb:hover {
height: 50px;
background-color: #878987;
-webkit-border-radius: 6px
}
.gn { .gn {
// TODO_update 重置覆盖默认样式使用统一类名gn + 需要覆盖的类名 // TODO_update 重置覆盖默认样式使用统一类名gn + 需要覆盖的类名
.ant-pro-checkcard-content { .ant-pro-checkcard-content {
@ -245,6 +268,29 @@ a.ant-dropdown-trigger{
.ant-pro-table-list-toolbar-container { .ant-pro-table-list-toolbar-container {
padding-block: 8px; padding-block: 8px;
} }
.ant-pro-global-header-header-actions-item >*{
padding-block: 0;
}
.ant-radio-group-large .ant-radio-button-wrapper {
height: 32px;
line-height: 32px;
}
.ant-input-affix-wrapper-lg{
height: 32px;
line-height: 32px;
font-size: 14px;
}
.ant-btn.ant-btn-lg {
font-size: 14px;
height: 32px;
border-radius: 4px;
}
.ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) {
border-start-start-radius: 4px;
border-end-start-radius: 4px;
}
/* UI 规范表 // update 使用中 /* UI 规范表 // update 使用中
适用说明 适用说明
@ -281,6 +327,10 @@ a.ant-dropdown-trigger{
.border_bottom_1 { .border_bottom_1 {
border-bottom: 1px solid #E0E0E0 border-bottom: 1px solid #E0E0E0
} }
&.themeBgHover:hover{
background-color: #155BD4;
}
} }
// .p1{ // .p1{

@ -17,6 +17,7 @@ import { Form, message } from 'antd';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
// 表单宽度 804 两列 // 表单宽度 804 两列
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm'; import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
import { proIconSelectStyle, proIconSelectWrapStyle } from '../../../../../config/defaultIcon';
export type FormValueType = { export type FormValueType = {
target?: string; target?: string;
@ -44,6 +45,7 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
]); ]);
useEffect(() => { useEffect(() => {
setIconSelectorOpen(false);
if (props.values.id !== undefined && props.values.id !== 0) { if (props.values.id !== undefined && props.values.id !== 0) {
setParentId(props.values.id as number); setParentId(props.values.id as number);
setParentSelectOptions([{ label: props.values.title, value: props.values.id }]); setParentSelectOptions([{ label: props.values.title, value: props.values.id }]);
@ -71,6 +73,7 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
}} }}
submitTimeout={2000} submitTimeout={2000}
onFinish={async (values) => { onFinish={async (values) => {
setMenuIconName('');
console.log(values); console.log(values);
postMenuCreateMenu(values) postMenuCreateMenu(values)
.then(() => { .then(() => {
@ -245,7 +248,7 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
hidden={record.type === 'M'} hidden={record.type === 'M'}
// disabled={record.type === 'M'} // disabled={record.type === 'M'}
/> />
{/* TODO 新增图标没有更改 */}
<ProFormSelect <ProFormSelect
width={proFormItemStyleProps.column2Width} width={proFormItemStyleProps.column2Width}
name="icon" name="icon"
@ -257,8 +260,16 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
hidden={parentId !== 0} hidden={parentId !== 0}
addonBefore={createIcon(menuIconName)} addonBefore={createIcon(menuIconName)}
fieldProps={{ fieldProps={{
// suffixIcon: {createIcon(menuIconName)},
// dropdownRender:() => <><QuestionCircleOutlined /></>,
labelInValue: true,
notFoundContent: null, // 将选项内容为空隐去,使用自定义的图标选择组件
filterOption: false,
onClick: () => { onClick: () => {
setIconSelectorOpen(true); setIconSelectorOpen(!iconSelectorOpen);
},
onClear: () => {
setMenuIconName('');
}, },
}} }}
placeholder={`${intl.formatMessage({ placeholder={`${intl.formatMessage({
@ -277,20 +288,21 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
}, },
]} ]}
/> />
<div style={proIconSelectWrapStyle}>
{iconSelectorOpen ? ( {iconSelectorOpen ? (
<> <div style={proIconSelectStyle}>
<IconSelector <IconSelector
onSelect={(name: string) => { onSelect={(name: string) => {
form.setFieldsValue({ icon: name }); form.setFieldsValue({ icon: name });
setMenuIconName(name); setMenuIconName(name);
setIconSelectorOpen(false); setIconSelectorOpen(false);
}} }}
/> />
</> </div>
) : ( ) : (
'' ''
)} )}
</div>
</ProForm.Group> </ProForm.Group>
); );
} }
@ -338,22 +350,6 @@ const CreateForm: React.FC<CreateFormProps> = (props) => {
required={false} required={false}
></ProFormSwitch> ></ProFormSwitch>
</ProForm.Group> </ProForm.Group>
{/* <Modal
width={800}
open={iconSelectorOpen}
onCancel={() => {
setIconSelectorOpen(false);
}}
footer={null}
>
<IconSelector
onSelect={(name: string) => {
form.setFieldsValue({ icon: name });
setMenuIconName(name);
setIconSelectorOpen(false);
}}
/>
</Modal> */}
</ModalForm> </ModalForm>
); );
}; };

@ -1,15 +1,22 @@
import {ModalForm, ProForm, ProFormDependency, ProFormRadio} from '@ant-design/pro-components'; import IconSelector from '@/components/IconSelector';
import {ProFormText} from '@ant-design/pro-components'; import { putMenuUpdateMenu } from '@/services/system/Menu';
import {ProFormSwitch} from '@ant-design/pro-components'; import { createIcon } from '@/utils/IconUtil';
import {ProFormSelect, ProFormDigit} from '@ant-design/pro-components'; import {
import {FormattedMessage, useIntl} from '@umijs/max'; ModalForm,
import React, {useEffect, useState} from 'react'; ProForm,
import {App, Button, Form, message, Modal} from 'antd'; ProFormDependency,
import {putMenuUpdateMenu} from "@/services/system/Menu"; ProFormDigit,
import {createIcon} from "@/utils/IconUtil"; ProFormRadio,
import IconSelector from "@/components/IconSelector"; ProFormSelect,
ProFormSwitch,
ProFormText,
} from '@ant-design/pro-components';
import { FormattedMessage, useIntl } from '@umijs/max';
import { Form, Modal, message } from 'antd';
import React, { useEffect, useState } from 'react';
// 表单宽度 804 两列 // 表单宽度 804 两列
import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm'; import { proFormItemStyleProps, proFormModelWidth } from '../../../../../config/defaultForm';
import { proIconSelectStyle, proIconSelectWrapStyle } from '../../../../../config/defaultIcon';
export type FormValueType = { export type FormValueType = {
target?: string; target?: string;
template?: string; template?: string;
@ -25,17 +32,19 @@ export type UpdateFormProps = {
reload: any; reload: any;
}; };
const UpdateForm: React.FC<UpdateFormProps> = (props) => { const UpdateForm: React.FC<UpdateFormProps> = (props) => {
const intl = useIntl(); const intl = useIntl();
const [form] = Form.useForm<API.Menu>(); const [form] = Form.useForm<API.Menu>();
const [menuIconName, setMenuIconName] = useState<any>(); const [menuIconName, setMenuIconName] = useState<any>();
const [iconSelectorOpen, setIconSelectorOpen] = useState<boolean>(false); const [iconSelectorOpen, setIconSelectorOpen] = useState<boolean>(false);
const [parentId, setParentId] = useState<number>(0); const [parentId, setParentId] = useState<number>(0);
const [parentSelectOptions, setParentSelectOptions] = useState<any[]>([{label: '根节点', value: 0}]); const [parentSelectOptions, setParentSelectOptions] = useState<any[]>([
{ label: '根节点', value: 0 },
]);
useEffect(()=>{ useEffect(() => {
setMenuIconName(props.values.icon) setIconSelectorOpen(false);
}, [props.updateModalOpen]) setMenuIconName(props.values.icon);
}, [props.updateModalOpen]);
return ( return (
<ModalForm<API.Menu> <ModalForm<API.Menu>
@ -53,207 +62,297 @@ const UpdateForm: React.FC<UpdateFormProps> = (props) => {
}} }}
submitTimeout={2000} submitTimeout={2000}
onFinish={async (values) => { onFinish={async (values) => {
console.log(values) setMenuIconName('');
putMenuUpdateMenu(values).then(() => { console.log(values);
message.success(intl.formatMessage({id: 'common.success', defaultMessage: '$$$'})) putMenuUpdateMenu(values)
props.reload() .then(() => {
}).catch(() => { message.success(intl.formatMessage({ id: 'common.success', defaultMessage: '$$$' }));
message.error(intl.formatMessage({id: 'common.error', defaultMessage: '$$$'})) props.reload();
}) })
.catch(() => {
message.error(intl.formatMessage({ id: 'common.error', defaultMessage: '$$$' }));
});
props.handleModal(); props.handleModal();
return true; return true;
}} }}
> >
<ProForm.Group> <ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="id" label="id" disabled={true} initialValue={props.values.id}/> <ProFormText
<ProFormSelect width={proFormItemStyleProps.column2Width} name="parentId" width={proFormItemStyleProps.column2Width}
disabled={true} name="id"
initialValue={parentId} label="id"
request={async () => parentSelectOptions} disabled={true}
label={<FormattedMessage id="system.menu.table.list.parentId" defaultMessage="$$$"/>} initialValue={props.values.id}
placeholder={`${intl.formatMessage({id: 'common.please_select', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.parentId', defaultMessage: '$$$'})}`} />
<ProFormSelect
width={proFormItemStyleProps.column2Width}
name="parentId"
disabled={true}
initialValue={parentId}
request={async () => parentSelectOptions}
label={<FormattedMessage id="system.menu.table.list.parentId" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_select',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.menu.table.list.parentId',
defaultMessage: '$$$',
})}`}
/> />
</ProForm.Group> </ProForm.Group>
<ProForm.Group> <ProForm.Group>
<ProFormRadio.Group width={proFormItemStyleProps.column2Width} name="type" <ProFormRadio.Group
required={true} width={proFormItemStyleProps.column2Width}
label={<FormattedMessage id="system.menu.table.list.type" defaultMessage="$$$"/>} name="type"
initialValue={props.values.type} required={true}
disabled={true} label={<FormattedMessage id="system.menu.table.list.type" defaultMessage="$$$" />}
options={[ initialValue={props.values.type}
{ disabled={true}
label: intl.formatMessage({id: 'system.menu.table.list.type_M', defaultMessage: '$$$'}), options={[
value: 'M', {
}, label: intl.formatMessage({
{ id: 'system.menu.table.list.type_M',
label: intl.formatMessage({id: 'system.menu.table.list.type_C', defaultMessage: '$$$'}), defaultMessage: '$$$',
value: 'C', }),
}, value: 'M',
{ },
label: intl.formatMessage({id: 'system.menu.table.list.type_F', defaultMessage: '$$$'}), {
value: 'F', label: intl.formatMessage({
}, id: 'system.menu.table.list.type_C',
{ defaultMessage: '$$$',
label: intl.formatMessage({id: 'system.menu.table.list.type_E', defaultMessage: '$$$'}), }),
value: 'E', value: 'C',
}, },
]}> {
label: intl.formatMessage({
</ProFormRadio.Group> id: 'system.menu.table.list.type_F',
defaultMessage: '$$$',
}),
value: 'F',
},
{
label: intl.formatMessage({
id: 'system.menu.table.list.type_E',
defaultMessage: '$$$',
}),
value: 'E',
},
]}
></ProFormRadio.Group>
</ProForm.Group> </ProForm.Group>
<ProForm.Group> <ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="title" <ProFormText
label={<FormattedMessage id="system.menu.table.list.title" defaultMessage="$$$"/>} width={proFormItemStyleProps.column2Width}
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.title', defaultMessage: '$$$'})}`} name="title"
required={true} label={<FormattedMessage id="system.menu.table.list.title" defaultMessage="$$$" />}
initialValue={props.values.title} placeholder={`${intl.formatMessage({
rules={[ id: 'common.please_input',
{ defaultMessage: '$$$',
required: true, })}${intl.formatMessage({ id: 'system.menu.table.list.title', defaultMessage: '$$$' })}`}
message: ( required={true}
<FormattedMessage initialValue={props.values.title}
id="system.menu.table.rule.required.name" rules={[
defaultMessage="name is required" {
/> required: true,
), message: (
}, <FormattedMessage
]} id="system.menu.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/> />
<ProFormDigit width={proFormItemStyleProps.column2Width} fieldProps={{precision: 0}} name="sort" <ProFormDigit
label={<FormattedMessage id="system.menu.table.list.sort" defaultMessage="$$$"/>} width={proFormItemStyleProps.column2Width}
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.sort', defaultMessage: '$$$'})}`} fieldProps={{ precision: 0 }}
initialValue={props.values.sort} name="sort"
label={<FormattedMessage id="system.menu.table.list.sort" defaultMessage="$$$" />}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({ id: 'system.menu.table.list.sort', defaultMessage: '$$$' })}`}
initialValue={props.values.sort}
/> />
</ProForm.Group> </ProForm.Group>
<ProFormDependency name={['type']}> <ProFormDependency name={['type']}>
{ {(record) => {
(record) => { let isShow = record.type !== 'F' && record.type !== 'E';
let isShow = (record.type !== 'F' && record.type !== 'E') if (isShow) {
if (isShow) { return (
return ( <ProForm.Group>
<ProForm.Group> <ProFormText
<ProFormText width={proFormItemStyleProps.column2Width} name="name" width={proFormItemStyleProps.column2Width}
label={<FormattedMessage id="system.menu.table.list.name" defaultMessage="$$$"/>} name="name"
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.name', defaultMessage: '$$$'})}`} label={<FormattedMessage id="system.menu.table.list.name" defaultMessage="$$$" />}
required={true} placeholder={`${intl.formatMessage({
initialValue={props.values.name} id: 'common.please_input',
rules={[ defaultMessage: '$$$',
{ })}${intl.formatMessage({
required: true, id: 'system.menu.table.list.name',
message: ( defaultMessage: '$$$',
<FormattedMessage })}`}
id="system.menu.table.rule.required.name" required={true}
defaultMessage="name is required" initialValue={props.values.name}
/> rules={[
), {
}, required: true,
]} message: (
/> <FormattedMessage
<ProFormText width={proFormItemStyleProps.column2Width} name="path" id="system.menu.table.rule.required.name"
label={<FormattedMessage id="system.menu.table.list.path" defaultMessage="$$$"/>} defaultMessage="name is required"
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.path', defaultMessage: '$$$'})}`} />
required={true} ),
initialValue={props.values.path} },
rules={[ ]}
{ />
required: true, <ProFormText
message: ( width={proFormItemStyleProps.column2Width}
<FormattedMessage name="path"
id="system.menu.table.rule.required.name" label={<FormattedMessage id="system.menu.table.list.path" defaultMessage="$$$" />}
defaultMessage="name is required" placeholder={`${intl.formatMessage({
/> id: 'common.please_input',
), defaultMessage: '$$$',
}, })}${intl.formatMessage({
]} id: 'system.menu.table.list.path',
/> defaultMessage: '$$$',
<ProFormText width={proFormItemStyleProps.column2Width} name="component" })}`}
label={<FormattedMessage id="system.menu.table.list.component" defaultMessage="$$$"/>} required={true}
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.component', defaultMessage: '$$$'})}`} initialValue={props.values.path}
required={true} rules={[
initialValue={props.values.component} {
hidden={record.type === 'M'} required: true,
// disabled={record.type === 'M'} message: (
/> <FormattedMessage
id="system.menu.table.rule.required.name"
defaultMessage="name is required"
/>
),
},
]}
/>
<ProFormText
width={proFormItemStyleProps.column2Width}
name="component"
label={
<FormattedMessage id="system.menu.table.list.component" defaultMessage="$$$" />
}
placeholder={`${intl.formatMessage({
id: 'common.please_input',
defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.menu.table.list.component',
defaultMessage: '$$$',
})}`}
required={true}
initialValue={props.values.component}
hidden={record.type === 'M'}
// disabled={record.type === 'M'}
/>
<ProFormSelect <ProFormSelect
width={proFormItemStyleProps.column2Width} width={proFormItemStyleProps.column2Width}
name="icon" name="icon"
label={intl.formatMessage({ label={intl.formatMessage({
id: 'system.menu.table.list.icon', id: 'system.menu.table.list.icon',
defaultMessage: '$$$', defaultMessage: '$$$',
})} })}
valueEnum={{}} valueEnum={{}}
hidden={record.type !== 'M'} hidden={record.type !== 'M'}
addonBefore={createIcon(menuIconName)} addonBefore={createIcon(menuIconName)}
fieldProps={{ fieldProps={{
onClick: () => { labelInValue: true,
setIconSelectorOpen(true); notFoundContent: null, // 将选项内容为空隐去,使用自定义的图标选择组件
}, filterOption: false,
}} onClick: () => {
initialValue={props.values.icon} setIconSelectorOpen(!iconSelectorOpen);
placeholder={`${intl.formatMessage({id: 'common.please_select', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.icon', defaultMessage: '$$$'})}`} },
rules={[ onClear: () => {
{ setMenuIconName('');
required: false, },
message: <FormattedMessage id="请选择菜单图标!" defaultMessage="请选择菜单图标!"/>, }}
}, initialValue={props.values.icon}
]} placeholder={`${intl.formatMessage({
/> id: 'common.please_select',
</ProForm.Group> defaultMessage: '$$$',
) })}${intl.formatMessage({
} id: 'system.menu.table.list.icon',
defaultMessage: '$$$',
})}`}
rules={[
{
required: false,
message: (
<FormattedMessage id="请选择菜单图标!" defaultMessage="请选择菜单图标!" />
),
},
]}
/>
<div style={proIconSelectWrapStyle}>
{iconSelectorOpen ? (
<div style={proIconSelectStyle}>
<IconSelector
onSelect={(name: string) => {
form.setFieldsValue({ icon: name });
setMenuIconName(name);
setIconSelectorOpen(false);
}}
/>
</div>
) : (
''
)}
</div>
</ProForm.Group>
);
} }
} }}
</ProFormDependency> </ProFormDependency>
<ProForm.Group> <ProForm.Group>
<ProFormDependency name={['type']}> <ProFormDependency name={['type']}>
{ {(record) => {
(record) => { return (
return ( <ProFormText
<ProFormText width={proFormItemStyleProps.column2Width} name="permission" width={proFormItemStyleProps.column2Width}
initialValue={props.values.permission} name="permission"
label={<FormattedMessage id="system.menu.table.list.permission" defaultMessage="$$$"/>} initialValue={props.values.permission}
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.permission', defaultMessage: '$$$'})}`} label={
disabled={record.type === 'M'} <FormattedMessage id="system.menu.table.list.permission" defaultMessage="$$$" />
/> }
) placeholder={`${intl.formatMessage({
} id: 'common.please_input',
} defaultMessage: '$$$',
})}${intl.formatMessage({
id: 'system.menu.table.list.permission',
defaultMessage: '$$$',
})}`}
disabled={record.type === 'M'}
/>
);
}}
</ProFormDependency> </ProFormDependency>
</ProForm.Group> </ProForm.Group>
<ProForm.Group> <ProForm.Group>
<ProFormText width={proFormItemStyleProps.column2Width} name="remark" <ProFormText
initialValue={props.values.remark} width={proFormItemStyleProps.column2Width}
label={<FormattedMessage id="system.menu.table.list.remark" defaultMessage="$$$"/>} name="remark"
placeholder={`${intl.formatMessage({id: 'common.please_input', defaultMessage: '$$$'})}${intl.formatMessage({id: 'system.menu.table.list.remark', defaultMessage: '$$$'})}`} initialValue={props.values.remark}
required={false}/> label={<FormattedMessage id="system.menu.table.list.remark" defaultMessage="$$$" />}
<ProFormSwitch width={proFormItemStyleProps.column2Width} name="hidden" initialValue={props.values.hidden} placeholder={`${intl.formatMessage({
label={<FormattedMessage id="system.menu.table.list.hidden" defaultMessage="$$$"/>} id: 'common.please_input',
required={false}> defaultMessage: '$$$',
})}${intl.formatMessage({ id: 'system.menu.table.list.remark', defaultMessage: '$$$' })}`}
</ProFormSwitch> required={false}
</ProForm.Group>
<Modal
width={800}
open={iconSelectorOpen}
onCancel={() => {
setIconSelectorOpen(false);
}}
footer={null}
>
<IconSelector
onSelect={(name: string) => {
form.setFieldsValue({icon: name});
setMenuIconName(name);
setIconSelectorOpen(false);
}}
/> />
</Modal> <ProFormSwitch
width={proFormItemStyleProps.column2Width}
name="hidden"
</ModalForm>) initialValue={props.values.hidden}
} label={<FormattedMessage id="system.menu.table.list.hidden" defaultMessage="$$$" />}
required={false}
></ProFormSwitch>
</ProForm.Group>
</ModalForm>
);
};
export default UpdateForm; export default UpdateForm;

@ -8,7 +8,11 @@ export function getIcon(name: string): React.ReactNode | string {
return icon || ''; return icon || '';
} }
export function createIcon(icon: string | any): React.ReactNode | string { export function createIcon(icon?: string | any): React.ReactNode | string {
if(!icon){
return ''
}
console.log(icon,'createIcon_icon')
if (typeof icon === 'object') { if (typeof icon === 'object') {
return icon; return icon;
} }

Loading…
Cancel
Save