Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(generator): restore default when the fieldKey out of focus #145

Merged
merged 3 commits into from
Mar 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions examples/form-generator/src/App/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,4 @@ export default {
type: 'object',
ui: {},
theme: 'antd',
schema: [
{
validateTime: 'submit',
type: 'array',
title: '多选框',
ui: {
type: 'checkbox',
},
fieldKey: 'checkbox_1MURwO',
},
],
}
45 changes: 21 additions & 24 deletions packages/generator/src/App/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ import {
schemaAtom,
DripFormUiComponetsAtom,
sidebarDataAtom,
headerConfigAtom,
viewportConfigAtom,
optionsAtom,
} from '@generator/store'
import '@jdfed/drip-form/dist/index.css'
import '@jdfed/drip-form-theme-antd/dist/index.css'
Expand All @@ -38,47 +37,45 @@ const Generator = forwardRef<GeneratorRef, GeneratorType>(
headerConfig,
viewportConfig,
components,
options,
},
ref
) => {
const formRef = useRef<DripFormRefType>()
const unitedSchema = useRecoilValue(schemaAtom)
const setHeaderConfig = useSetRecoilState(headerConfigAtom)
const setViewportConfig = useSetRecoilState(viewportConfigAtom)
const setOptions = useSetRecoilState(optionsAtom)
const setDripFormUiComonents = useSetRecoilState(DripFormUiComponetsAtom)
const setSidebarData = useSetRecoilState(sidebarDataAtom)

// 设置vieport配置
// 设置全局配置
useEffect(() => {
if (viewportConfig) {
setViewportConfig((oldOption) => {
return {
...oldOption,
setOptions((oldOption) => {
return {
...oldOption,
viewportConfig: {
...oldOption.viewportConfig,
...viewportConfig,
}
})
}
}, [setViewportConfig, viewportConfig])

// 设置header配置
useEffect(() => {
if (customExport || exportText || renderLeftHeader || headerConfig) {
setHeaderConfig((oldOption) => {
return {
...oldOption,
...options?.viewportConfig,
},
headerConfig: {
...oldOption.headerConfig,
...(customExport && { customExport }),
...(exportText && { exportText }),
...(renderLeftHeader && { renderLeftHeader }),
...headerConfig,
}
})
}
...options?.headerConfig,
},
...options,
}
})
}, [
customExport,
exportText,
headerConfig,
options,
renderLeftHeader,
setHeaderConfig,
setOptions,
viewportConfig,
])

// 动态添加图标
Expand Down
17 changes: 10 additions & 7 deletions packages/generator/src/App/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import type {
HeaderConfig,
ComponentsData,
ViewportConfig,
Options,
} from '@generator/store'

export type GeneratorType = {
Expand All @@ -16,17 +17,19 @@ export type GeneratorType = {
customComponents?: Array<Field>
// 组件自定义(自定义左侧组件区域、viewport区域、编辑区域(属性配置、校验配置))
components?: ComponentsData
headerConfig?: HeaderConfig
viewportConfig?: ViewportConfig
options?: Partial<Options>
/**
* 以下API均不推荐 START
* 后续版本会合并以下api;推荐使用headerConfig代替
* v1 废弃API,请使用options代替
*/
// 导出的文案 (推荐使用headerConfig.exportText)
// 即将废弃 头部配置 (推荐用options)
headerConfig?: HeaderConfig
// 即将废弃 可视区配置 (推荐用options)
viewportConfig?: ViewportConfig
// 即将废弃 导出的文案 (推荐使用options)
exportText?: string
// 是否渲染Header (推荐使用headerConfig.renderLeftHeader)
// 即将废弃 是否渲染Header (推荐使用options)
renderLeftHeader?: () => JSX.Element
// 自定义导出JSON事件 (推荐使用headerConfig.customExport)
// 即将废弃 自定义导出JSON事件 (推荐使用options)
customExport?: (innerHandle: () => void) => void
}

Expand Down
22 changes: 12 additions & 10 deletions packages/generator/src/components/Header/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import {
previewVisibleAtom,
exportVisibleAtom,
schemaAtom,
headerConfigAtom,
versionAtom,
optionsAtom,
} from '@generator/store'
import { useSetRecoilState, useRecoilState, useRecoilValue } from 'recoil'
import FileSaver from 'file-saver'
Expand All @@ -25,15 +25,17 @@ const Header = () => {
const setPreviewVisible = useSetRecoilState(previewVisibleAtom)
const setExportVisible = useSetRecoilState(exportVisibleAtom)
const {
customExport,
renderLeftHeader,
exportText,
showLogo,
showUploadJSON,
showEditJSON,
showPreviewForm,
showExportJSON,
} = useRecoilValue(headerConfigAtom)
headerConfig: {
customExport,
renderLeftHeader,
exportText,
showLogo,
showUploadJSON,
showEditJSON,
showPreviewForm,
showExportJSON,
},
} = useRecoilValue(optionsAtom)
const [unitedSchema, setUnitedSchema] = useRecoilState(schemaAtom)
const setVersion = useSetRecoilState(versionAtom)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
import React, { Fragment, memo, useCallback, useEffect, useMemo } from 'react'
import React, {
Fragment,
memo,
useCallback,
useEffect,
useMemo,
useState,
} from 'react'
import DripForm from '@jdfed/drip-form'
import { typeCheck } from '@jdfed/utils'
import { deepClone, deleteDeepProp, isEmpty, setDeepProp } from '@jdfed/utils'
import {
typeCheck,
deepClone,
deleteDeepProp,
isEmpty,
setDeepProp,
} from '@jdfed/utils'
import cx from 'classnames'
import { SettingOutlined } from '@ant-design/icons'
import {
Expand All @@ -17,10 +29,11 @@ import { useGetParentType } from '@generator/hooks'
import useRightSidebar from '../HeadlessComponents'
import styles from '../index.module.css'
import { original, produce } from 'immer'
import type { SetType } from '@jdfed/hooks'
import { Select, Input, Button } from 'antd'
import { CopyOutlined } from '@ant-design/icons'
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
import { usePrevious } from '@jdfed/hooks'
import type { SetType } from '@jdfed/hooks'
import type { Map } from '@jdfed/utils'

const PropertyConfig = () => {
Expand All @@ -31,10 +44,12 @@ const PropertyConfig = () => {
uiSchema,
uiComponents,
} = useRightSidebar()
const parentType = useGetParentType()
const [curEditFieldKey, setCurEditFieldKey] = useRecoilState(
curEditFieldKeyAtom(selectedFieldKey)
)
const [prevEditFieldKey, setPrevEditFieldKey] = useState(curEditFieldKey)
const prevSelectedFieldkey = usePrevious(selectedFieldKey)
const parentType = useGetParentType()
const setUnitedSchema = useSetRecoilState(schemaAtom)
const [globalContainerStyle, setGlobalContainerStyle] = useRecoilState(
globalContainerStyleAtom
Expand Down Expand Up @@ -361,6 +376,7 @@ const PropertyConfig = () => {
)
// 修改全局unitdSchema
unitedSchemaPath &&
value &&
setUnitedSchema((unitedSchema) =>
produce(unitedSchema, (draft) => {
setDeepProp(
Expand All @@ -374,6 +390,22 @@ const PropertyConfig = () => {
[generatorContext, selectedFieldKey, setCurEditFieldKey, setUnitedSchema]
)

useEffect(() => {
if (prevSelectedFieldkey !== selectedFieldKey) {
setPrevEditFieldKey(curEditFieldKey)
}
}, [curEditFieldKey, prevSelectedFieldkey, selectedFieldKey])

// fieldKey必填,所以失焦后自动恢复默认key
const onBlur = useCallback(
(e) => {
if (!e?.target?.value) {
setCurEditFieldKey(prevEditFieldKey)
}
},
[prevEditFieldKey, setCurEditFieldKey]
)

return (
<Fragment>
<div className={styles.panelConfig}>
Expand Down Expand Up @@ -406,6 +438,7 @@ const PropertyConfig = () => {
className={styles.fieldKey}
value={curEditFieldKey}
onChange={changeFieldKey}
onBlur={onBlur}
placeholder="不可包含字符 ."
// 父元素为数组容器无法修改
disabled={parentType === 'array'}
Expand Down
15 changes: 10 additions & 5 deletions packages/generator/src/hooks/useAddField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@
* @Author: jiangxiaowei
* @Date: 2021-10-08 10:20:13
* @Last Modified by: jiangxiaowei
* @Last Modified time: 2022-01-07 16:52:36
* @Last Modified time: 2022-03-04 16:38:05
*/
import { useCallback, useContext } from 'react'
import { nanoid } from 'nanoid'
import { useRecoilState, useSetRecoilState } from 'recoil'
import { selectedAtom, GeneratorContext, curTypeAtom } from '@generator/store'
import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
import {
selectedAtom,
GeneratorContext,
curTypeAtom,
optionsAtom,
} from '@generator/store'
import useDeleteField from './useDeleteField'
import useCanEditJson from './useCanEditJson'
import { message } from 'antd'
Expand All @@ -23,6 +27,7 @@ type AddField = (param: {

const useAddField = (): AddField => {
const generatorContext = useContext(GeneratorContext)
const { fieldKeyFn } = useRecoilValue(optionsAtom)
const [selectedKey, setSelected] = useRecoilState(selectedAtom)
const setCurType = useSetRecoilState(curTypeAtom)
const deleteField = useDeleteField()
Expand All @@ -40,7 +45,7 @@ const useAddField = (): AddField => {
return
}
// 生成当前新增表单项的key
let newFieldKey = `${unitedSchema.ui.type}_${nanoid(6)}`
let newFieldKey = fieldKeyFn(unitedSchema)

// 选中新增的表单项
let selectKey = newFieldKey
Expand Down
Loading