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

更新master #1

Merged
merged 106 commits into from
Dec 5, 2019
Merged
Changes from 1 commit
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
60c8bd5
[V1 UMBRELLA] (#346)
janryWang Oct 24, 2019
afa1dcf
feat: add schema-editor
Oct 24, 2019
be68d3d
feat: rename schema-editor -> react-schema-editor
Oct 25, 2019
667c9ef
Merge pull request #347 from ascoders/v1
ascoders Oct 25, 2019
1cc755e
Fix CI and some Bugs (#348)
janryWang Oct 25, 2019
209a4da
fix(@uform/react-shared-components): fix text (#349)
janryWang Oct 25, 2019
c0922b2
[UMBRELLA V1] Compat v0 (#351)
janryWang Oct 28, 2019
fc516fb
feat(@uform/react): support filter changed (#353)
janryWang Oct 29, 2019
d71235f
[WIP]feat(core): add lifecycles unit test (#355)
JohnIsOnTheRoad Oct 31, 2019
778a020
feat(core): add graph unit test (#357)
JohnIsOnTheRoad Nov 1, 2019
985aca3
V1 fix subscribe (#358)
janryWang Nov 1, 2019
42952c2
fix(@uform/core): fix process calculation logic
outerkk Nov 1, 2019
ba5678c
fix(@uform/core): fix position of stack counter
outerkk Nov 3, 2019
e7edcfa
feat(core): add model unit test (#359)
JohnIsOnTheRoad Nov 3, 2019
86dd387
fix(@uform/core): fix visible/display behave
outerkk Nov 3, 2019
db68c8d
Merge branch 'v1' of github.com:alibaba/uform into v1_fix_process
outerkk Nov 3, 2019
696bcc6
refactor(@uform/core): merge v1
outerkk Nov 3, 2019
56835f9
refactor(@uform/core): remove processing test case
outerkk Nov 3, 2019
95ee596
fix(@uform/core): fix process calculation logic (#362)
janryWang Nov 3, 2019
c3e42d4
test(@uform/react-schema-renderer): add old test case
Nov 3, 2019
51c0499
test(@uform/react-schema-renderer): add old test case
Nov 3, 2019
df89aa3
Merge pull request #364 from ZirkleTsing/v1
janryWang Nov 3, 2019
e933304
feat: onFieldChange types
Nov 4, 2019
dc4fa80
fix: [onFieldChange] types
Nov 4, 2019
6421b7f
test(@uform/react-schema-renderer): fix test case uncompat bugs (#369)
janryWang Nov 5, 2019
579a91e
V1 (#370)
ZirkleTsing Nov 5, 2019
ff454e9
test(@uform/react-schema-renderer): fix test case uncompat bugs (#373)
janryWang Nov 6, 2019
9cd7272
feat(shared): add unit test (#374)
s0ngyee Nov 6, 2019
dfec008
refactor: improve test case (#375)
janryWang Nov 6, 2019
cf3787b
docs(@uform/core): add docs (#376)
janryWang Nov 7, 2019
4377180
feat: add silent option (#377)
JohnIsOnTheRoad Nov 7, 2019
3ec4f09
feat: add actions test
Nov 7, 2019
c806577
Merge branch 'v1' into v1
Nov 7, 2019
e7e5a80
Merge pull request #378 from jincdream/v1
Nov 7, 2019
a41315a
Revert "V1" (#379)
janryWang Nov 7, 2019
64c527c
Feat support watch (#382)
janryWang Nov 8, 2019
fe4ce56
test(@uform/react-schema-renderer): add old test case (#381)
ZirkleTsing Nov 9, 2019
c69f71a
test(@uform/react-schema-renderer): improve v0 test cases (#384)
janryWang Nov 10, 2019
7a93b73
feat: support formStep component (#385)
janryWang Nov 10, 2019
e49d7be
Fix next item style (#388)
janryWang Nov 11, 2019
646203c
test(@uform/react-schema-renderer): add old test case (#391)
ZirkleTsing Nov 12, 2019
b985265
test(@uform/react-schema-renderer): Compat old test (#392)
janryWang Nov 13, 2019
21ee40b
feat: add react/actions tests
anyuxuan Nov 14, 2019
fa7bae7
feature(@uform/react): add useForm unittest (#393)
JohnIsOnTheRoad Nov 14, 2019
ecff8ef
feat: add docs and some test cases (#395)
janryWang Nov 14, 2019
57ecf3e
docs: improve docs (#396)
janryWang Nov 14, 2019
88fd3eb
Fix docs typo (#397)
janryWang Nov 14, 2019
66e03bc
fix(@uform/antd/next): fix typings (#398)
janryWang Nov 14, 2019
4cf4bb8
feature(@uform/react): finish hook unittest (#400)
JohnIsOnTheRoad Nov 16, 2019
ded9b93
docs(@uform/core): improve docs (#402)
janryWang Nov 19, 2019
570a81c
[WIP]doc(@uform/react): add react doc (#401)
JohnIsOnTheRoad Nov 19, 2019
dff959c
feat: support useFormEffects (#403)
janryWang Nov 19, 2019
7b73255
fix(@uform/core): fix required (#404)
janryWang Nov 20, 2019
70a5b67
docs: fix typo and improve docs (#405)
yujiangshui Nov 21, 2019
7fe8a78
docs(@uform/react): improve docs (#406)
JohnIsOnTheRoad Nov 21, 2019
193b3e3
docs: fix typo and improve docs (#408)
JohnIsOnTheRoad Nov 22, 2019
e17ebae
Fix isFn can't test async function (#411)
javahuang Nov 22, 2019
b5400ef
Improve docs (#407)
janryWang Nov 22, 2019
8dbffb8
Improve docs (#412)
janryWang Nov 22, 2019
66dff2c
Improve docs (#413)
janryWang Nov 22, 2019
29c6846
Improve docs (#414)
janryWang Nov 22, 2019
4be1740
update readme
janryWang Nov 22, 2019
0aeeed9
update readme
janryWang Nov 22, 2019
2f56bf3
update readme
janryWang Nov 22, 2019
d5922f7
core: fix remove function of object field mutator (#410)
JohnIsOnTheRoad Nov 23, 2019
737fa54
Fix remove logics (#415)
janryWang Nov 23, 2019
0fc5f73
Improve docs (#416)
janryWang Nov 23, 2019
623e330
Fix registry (#417)
janryWang Nov 23, 2019
1e5d780
Merge branch 'master' into v1
janryWang Nov 23, 2019
79d7d36
chore(publish): v1.0.0-alpha.0
janryWang Nov 23, 2019
c2ca2ba
fix(@uform/react-shared-components): fix preview (#418)
janryWang Nov 23, 2019
204b2ad
feat(@uform/antd/next): Support error scroll (#419)
janryWang Nov 23, 2019
908882a
feat(@uform/core): support pass visible/display of register method (#…
janryWang Nov 24, 2019
670fadb
feat(@uform/react): remove raf and fix unittest (#422)
JohnIsOnTheRoad Nov 24, 2019
fbf8937
chore(publish): v1.0.0-alpha.1
janryWang Nov 24, 2019
06677ad
fix(@uform/core): fix onsubmit immutable values (#424)
janryWang Nov 24, 2019
a758a1c
Fix schema name (#425)
janryWang Nov 25, 2019
43c30a6
Improve perf (#426)
janryWang Nov 25, 2019
476d4cb
chore(publish): v1.0.0-alpha.2
janryWang Nov 25, 2019
b446c02
feat(@uform/antd/next): improve form step (#431)
janryWang Nov 25, 2019
9440ac4
feat(@uform/react): support useFieldState/useFormState (#433)
janryWang Nov 26, 2019
551d74c
feat(@uform/react): actions support clearErrors (#434)
janryWang Nov 26, 2019
19e2627
fix(@uform/antd): Fix deps (#435)
janryWang Nov 26, 2019
e2aa55e
fix(@uform/react): fix unmount (#436)
janryWang Nov 26, 2019
853e051
test(@uform/react): improve field and virtualField test cases (#438)
javahuang Nov 27, 2019
fd93386
fix(@uform/antd/next/react): doc (#437)
JohnIsOnTheRoad Nov 27, 2019
15b6b43
feat(@uform/next): update next features (#439)
janryWang Nov 27, 2019
3bfe515
fix(@uform/next): formitem compatibility (#440)
JohnIsOnTheRoad Nov 27, 2019
a6ce435
update readme
janryWang Nov 27, 2019
c0701f5
update readme
janryWang Nov 27, 2019
802d2f7
chore(publish): v1.0.0-alpha.3
janryWang Nov 27, 2019
bf14478
表单 editor 新增菜单树功能 (#441)
ascoders Nov 28, 2019
0872f40
fix(@uform/react/antd/next): Fix field state errors (#442)
javahuang Nov 28, 2019
013d427
Fix xeffect (#443)
janryWang Nov 28, 2019
8b3d633
fix(@uform/antd): fix FormItem supports className (#444)
cds803 Nov 28, 2019
15a4147
SchemaEditor MVP版 (#446)
henryybai Nov 29, 2019
2d9b4ba
refactor(readme): update
janryWang Nov 29, 2019
2353a42
chore(publish): v1.0.0-alpha.4
janryWang Nov 29, 2019
fba8e15
fix(@uform/validator): fix minLength is not work (#447)
janryWang Nov 30, 2019
745a0d9
fix: in miniapp (worker runtime) , globalThis is not a function
Dec 3, 2019
4b6a9c0
fix: in miniapp, globalSelf is existing
Dec 3, 2019
785a760
feat: json to basic schema (#450)
welkang Dec 3, 2019
4aa8e74
Fix value sync (#451)
janryWang Dec 3, 2019
25eb8dc
Improve perf (#452)
janryWang Dec 4, 2019
6768dd3
build(@uform/antd/next): fix building (#456)
janryWang Dec 5, 2019
7bf702d
chore(publish): v1.0.0-alpha.5
janryWang Dec 5, 2019
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
Prev Previous commit
Next Next commit
feat(@uform/react): actions support clearErrors (alibaba#434)
janryWang authored Nov 26, 2019
commit 551d74c11ee51e5b74755ceb30fd0056eed82079
49 changes: 35 additions & 14 deletions packages/react-shared-components/src/PreviewText.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useContext, createContext } from 'react'
import { isFn } from '@uform/shared'
import { isFn, isEqual } from '@uform/shared'
import { IPreviewTextProps } from './types'

export interface PreviewTextConfigProps {
@@ -14,20 +14,41 @@ export const PreviewText: React.FC<IPreviewTextProps> & {
const context = useContext(PreviewTextContext) || {}
let value: any
if (props.dataSource && props.dataSource.length) {
let find = props.dataSource.filter(({ value }) =>
Array.isArray(props.value)
? props.value.some(val => val == value)
: props.value == value
)
value = find.reduce((buf, item, index) => {
return buf.concat(item.label, index < find.length - 1 ? ', ' : '')
}, [])
if (Array.isArray(props.value)) {
value = props.value.map((val, index) => {
const finded = props.dataSource.find(item => isEqual(item.value, val))
if (finded) {
return (
<span key={index}>
{finded.label}
{index < props.value.length - 1 ? ' ,' : ''}
</span>
)
}
})
} else {
const fined = props.dataSource.find(item =>
isEqual(item.value, props.value)
)
if (fined) {
value = fined.label
}
}
} else {
value = Array.isArray(props.value)
? props.value.join(' ~ ')
: String(
props.value === undefined || props.value === null ? '' : props.value
if (Array.isArray(props.value)) {
value = props.value.map((val, index) => {
return (
<span key={index}>
{val}
{index < props.value.length - 1 ? '~' : ''}
</span>
)
})
} else {
value = String(
props.value === undefined || props.value === null ? '' : props.value
)
}
}
const placeholder = isFn(context.previewPlaceholder)
? context.previewPlaceholder(props)
@@ -44,7 +65,7 @@ export const PreviewText: React.FC<IPreviewTextProps> & {
value === undefined ||
(Array.isArray(value) && value.length === 0)
? placeholder || 'N/A'
: String(value)}
: value}
{props.addonTextAfter ? ' ' + props.addonTextAfter : ''}
{props.innerAfter ? ' ' + props.innerAfter : ''}
{props.addonAfter ? ' ' + props.addonAfter : ''}
171 changes: 110 additions & 61 deletions packages/react/src/__tests__/useField.spec.tsx
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
import React from 'react'
import { act, renderHook } from '@testing-library/react-hooks'
import FormContext from '../context';
import { render } from '@testing-library/react'
import FormContext from '../context'
import useForm from '../hooks/useForm'
import useField from '../hooks/useField'
import { createForm } from '..';
import { FormLifeCycle, LifeCycleTypes } from '@uform/core';
import { createForm } from '..'
import { FormLifeCycle, LifeCycleTypes } from '@uform/core'

describe('useField hook',()=>{
test('form is required', ()=>{
describe('useField hook', () => {
test('form is required', () => {
expect(() => {
useField({})
}).toThrow()
})

test('basic ', ()=>{
test('basic ', () => {
let globalForm
let globalGraph
const formInstance = createForm({
lifecycles: [
new FormLifeCycle(LifeCycleTypes.ON_FORM_GRAPH_CHANGE, (graph) => {
new FormLifeCycle(LifeCycleTypes.ON_FORM_GRAPH_CHANGE, graph => {
globalGraph = graph
})
]
@@ -28,111 +29,137 @@ describe('useField hook',()=>{
form: formInstance
})
globalForm = form
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const { result } = renderHook(() => useField({ name: 'username' }), { wrapper: formWrapper })
const { result } = renderHook(() => useField({ name: 'username' }), {
wrapper: formWrapper
})
expect(result.current.form).toEqual(globalForm)
expect(result.current.state.props).toEqual({})
expect(result.current.state).toEqual({
...globalGraph.get('username').getState(),
errors: '',
mounted: false,
errors: [],
mounted: false
})
})

test('update', async ()=>{
test('update', async () => {
let globalForm
const formWrapper = ({ children }) => {
const form = useForm({})
globalForm = form
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const { result } = renderHook(() => useField({ name: 'username' }), { wrapper: formWrapper })
const { result } = renderHook(() => useField({ name: 'username' }), {
wrapper: formWrapper
})
expect(result.current.state.value).toEqual(undefined)
act(() => {
globalForm.setFormState(state => state.values.username = 'abcd')
globalForm.setFormState(state => (state.values.username = 'abcd'))
})

expect(result.current.state.value).toEqual('abcd')
})

test('mounted change', async ()=>{
test('mounted change', async () => {
const formWrapper = ({ children }) => {
const form = useForm({})
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const { result, rerender } = renderHook(() => useField({ name: 'username' }), { wrapper: formWrapper })
const { result, rerender } = renderHook(
() => useField({ name: 'username' }),
{ wrapper: formWrapper }
)
expect(result.current.state.mounted).toEqual(false)
rerender()
expect(result.current.state.mounted).toEqual(true)
})

test('dirty', async ()=>{
test('dirty', async () => {
const formWrapper = ({ children }) => {
const formInstance = createForm({
lifecycles: [
new FormLifeCycle(LifeCycleTypes.ON_FIELD_CHANGE, (field) => {

})
new FormLifeCycle(LifeCycleTypes.ON_FIELD_CHANGE, field => {})
]
})
const form = useForm({
form: formInstance
})
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const initialProps = {
name: 'username',
props: { disabled: true },
required: false,
editable: true,
rules: [],
rules: []
}
const { result, rerender } = renderHook(() => useField(initialProps), { wrapper: formWrapper })
const { result, rerender } = renderHook(() => useField(initialProps), {
wrapper: formWrapper
})
expect(result.current.props).toEqual({ disabled: true })
expect(result.current.state.required).toEqual(false)
expect(result.current.state.editable).toEqual(true)
expect(result.current.state.rules).toEqual([])
expect(result.current.state.editable).toEqual(true)
expect(result.current.state.rules).toEqual([])

initialProps.required = true
initialProps.editable = false
initialProps.props = { disabled: false }
initialProps.rules = [() => ({ type: 'warning', message: 'warning msg' })]

expect(result.current.props).toEqual({ disabled: true })
expect(result.current.state.required).toEqual(false)
expect(result.current.state.editable).toEqual(true)
expect(result.current.state.rules).toEqual([])
expect(result.current.state.editable).toEqual(true)
expect(result.current.state.rules).toEqual([])

rerender()

expect(result.current.props).toEqual(initialProps.props)
expect(result.current.state.required).toEqual(initialProps.required)
expect(result.current.state.editable).toEqual(initialProps.editable)
expect(result.current.state.rules).toEqual([...initialProps.rules, { required: true }])
expect(result.current.state.rules).toEqual([
...initialProps.rules,
{ required: true }
])
})

test('extented mutator', ()=>{
test('extented mutator', () => {
const formWrapper = ({ children }) => {
const form = useForm({})
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const getValueFromEvent = (e) => (e.target.value)
const eventValue = { target: { value: 'abc' }}
const { result: result1, rerender: rerender1 } = renderHook(() => useField({ name: 'username' }), { wrapper: formWrapper })
const getValueFromEvent = e => e.target.value
const eventValue = { target: { value: 'abc' } }
const { result: result1, rerender: rerender1 } = renderHook(
() => useField({ name: 'username' }),
{ wrapper: formWrapper }
)
expect(result1.current.state.value).toEqual(undefined)
act(() => {
result1.current.mutators.change(eventValue)
})
rerender1()
expect(result1.current.state.value).toEqual(eventValue)

const { result: result2, rerender: rerender2 } = renderHook(() => useField({ name: 'username', getValueFromEvent }), { wrapper: formWrapper })
const { result: result2, rerender: rerender2 } = renderHook(
() => useField({ name: 'username', getValueFromEvent }),
{ wrapper: formWrapper }
)
expect(result2.current.state.value).toEqual(undefined)
act(() => {
result2.current.mutators.change(eventValue)
@@ -141,61 +168,83 @@ describe('useField hook',()=>{
expect(result2.current.state.value).toEqual('abc')
})

test('triggerType mutator onChange', async()=>{
test('triggerType mutator onChange', async () => {
const formWrapper = ({ children }) => {
const form = useForm({})
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const fieldProps = { name: 'username', required: true }
const { result: result1, rerender } = renderHook(() => useField(fieldProps), { wrapper: formWrapper })
expect(result1.current.state.errors).toEqual('')
const fieldProps = { name: 'username', required: true }
const { result: result1, rerender } = renderHook(
() => useField(fieldProps),
{ wrapper: formWrapper }
)
expect(result1.current.state.errors).toEqual([])
expect(result1.current.state.value).toEqual(undefined)
rerender()
act(() => {
result1.current.mutators.change('')
})

// await waitForNextUpdate1()
expect(result1.current.state.value).toEqual('')
expect(result1.current.state.errors).toEqual('')
expect(result1.current.state.errors).toEqual([])

const { result: result2, waitForNextUpdate: waitForNextUpdate2 } = renderHook(() => useField({ ...fieldProps, triggerType: 'onChange' }), { wrapper: formWrapper })
expect(result2.current.state.errors).toEqual('')
const {
result: result2,
waitForNextUpdate: waitForNextUpdate2
} = renderHook(() => useField({ ...fieldProps, triggerType: 'onChange' }), {
wrapper: formWrapper
})
expect(result2.current.state.errors).toEqual([])
expect(result2.current.state.value).toEqual(undefined)

act(() => {
result2.current.mutators.change('')
})

await waitForNextUpdate2()
expect(result2.current.state.value).toEqual('')
expect(result2.current.state.errors).toEqual('This field is required')
const { queryByText } = render(<div>{result2.current.state.errors}</div>)
expect(queryByText('This field is required')).toBeVisible()
})

test('triggerType mutator onBlur', async()=>{
test('triggerType mutator onBlur', async () => {
const formWrapper = ({ children }) => {
const form = useForm({})
return <FormContext.Provider value={form}>{children}</FormContext.Provider>
return (
<FormContext.Provider value={form}>{children}</FormContext.Provider>
)
}

const fieldProps = { name: 'username', required: true }
const { result: result1, rerender } = renderHook(() => useField(fieldProps), { wrapper: formWrapper })
expect(result1.current.state.errors).toEqual('')
const fieldProps = { name: 'username', required: true }
const { result: result1, rerender } = renderHook(
() => useField(fieldProps),
{ wrapper: formWrapper }
)
expect(result1.current.state.errors).toEqual([])
rerender()
act(() => {
result1.current.mutators.blur()
})

expect(result1.current.state.errors).toEqual('')

const { result: result2, waitForNextUpdate: waitForNextUpdate2 } = renderHook(() => useField({ ...fieldProps, triggerType: 'onBlur' }), { wrapper: formWrapper })
expect(result2.current.state.errors).toEqual('')
expect(result1.current.state.errors).toEqual([])

const {
result: result2,
waitForNextUpdate: waitForNextUpdate2
} = renderHook(() => useField({ ...fieldProps, triggerType: 'onBlur' }), {
wrapper: formWrapper
})
expect(result2.current.state.errors).toEqual([])

act(() => {
result2.current.mutators.blur()
})
await waitForNextUpdate2()
expect(result2.current.state.errors).toEqual('This field is required')
const { queryByText } = render(<div>{result2.current.state.errors}</div>)
expect(queryByText('This field is required')).toBeVisible()
})
})
})
Loading