1- import { isEmpty , isNil } from "lodash" ;
1+ import { isEmpty , get , has , set , unset } from "lodash" ;
22import { PubSub } from "./PubSub.js" ;
33
44interface FormStoreOptions {
@@ -74,6 +74,7 @@ export class FormStore extends PubSub {
7474
7575 setField ( name : string , detail : FieldDetail ) {
7676 this . #fields. set ( name , new Field ( name , detail ) ) ;
77+ this . setFieldsValueByInitData ( name ) ;
7778 }
7879 #getAllFields( ) {
7980 return [ ...this . #fields. keys ( ) ] . filter ( ( key ) => {
@@ -83,16 +84,13 @@ export class FormStore extends PubSub {
8384
8485 getAllValues ( ) {
8586 const allFields = this . #getAllFields( ) ;
86- const formData = Object . fromEntries (
87- Object . entries ( this . #formData)
88- . map ( ( [ k , v ] ) => {
89- if ( allFields . includes ( k ) ) {
90- return [ k , v ] ;
91- }
92- return [ ] ;
93- } )
94- . filter ( ( item ) => item . length )
95- ) ;
87+ const formData : Record < string , unknown > = { } ;
88+
89+ allFields . forEach ( ( fieldName ) => {
90+ const value = get ( this . #formData, fieldName ) ;
91+ set ( formData , fieldName , value ) ;
92+ } ) ;
93+
9694 return formData ;
9795 }
9896
@@ -102,35 +100,43 @@ export class FormStore extends PubSub {
102100 }
103101
104102 setFieldsValueByInitData ( name : string ) {
105- const value = this . #initData?. [ name ] ;
106- if ( ! isNil ( value ) ) {
107- this . #formData[ name ] = value ;
103+ const field = this . #fields. get ( name ) ;
104+ if ( field && ! field . detail ?. notRender && has ( this . #initData, name ) ) {
105+ const value = get ( this . #initData, name ) ;
106+ set ( this . #formData, name , value ) ;
108107 this . publish ( `${ name } .init.value` , value ) ;
109108 }
110109 }
111110
112111 setFieldsValue ( values : Record < string , unknown > , isEmitValuseChange = true ) {
113- const newFormData : Record < string , unknown > = {
114- ...this . #formData,
115- } ;
116- Object . entries ( values ) . forEach ( ( [ k , v ] ) => {
117- newFormData [ k ] = v ;
118- this . #initData && ( this . #initData[ k ] = v ) ;
119- this . publish ( `${ k } .init.value` , v ) ;
112+ const newFormData = { ...this . #formData } ;
113+ const changedValues : Record < string , unknown > = { } ;
114+
115+ this . #fields. forEach ( ( field , key ) => {
116+ if ( ! field . detail ?. notRender && has ( values , key ) ) {
117+ const v = get ( values , key ) ;
118+ set ( newFormData , key , v ) ;
119+ if ( this . #initData) {
120+ set ( this . #initData, key , v ) ;
121+ }
122+ this . publish ( `${ key } .init.value` , v ) ;
123+ set ( changedValues , key , v ) ;
124+ }
120125 } ) ;
126+
121127 this . #formData = newFormData ;
122128
123129 if ( isEmitValuseChange ) {
124130 this . #options?. onValuesChanged ?.( {
125- changedValues : values ,
131+ changedValues,
126132 allValues : this . getAllValues ( ) ,
127133 } ) ;
128134 }
129135 }
130136
131137 resetFields ( name ?: string ) {
132138 if ( name ) {
133- delete this . #formData[ name ] ;
139+ unset ( this . #formData, name ) ;
134140 this . publish ( `${ name } .reset.fields` , null ) ;
135141 } else {
136142 this . #formData = { } ;
@@ -141,7 +147,11 @@ export class FormStore extends PubSub {
141147
142148 getFieldsValue ( name ?: string ) {
143149 if ( name ) {
144- return this . #formData[ name ] ;
150+ const field = this . #fields. get ( name ) ;
151+ if ( field && ! field . detail ?. notRender ) {
152+ return get ( this . #formData, name ) ;
153+ }
154+ return undefined ;
145155 }
146156 return this . getAllValues ( ) ;
147157 }
@@ -176,11 +186,21 @@ export class FormStore extends PubSub {
176186 }
177187
178188 validateField ( field : string | FieldDetail ) {
179- const fieldDetail =
180- typeof field === "string" ? this . #fields. get ( field ) ?. detail : field ;
181- if ( ! fieldDetail ) return ;
189+ let fieldDetail ;
190+ let fieldObj ;
191+
192+ if ( typeof field === "string" ) {
193+ fieldObj = this . #fields. get ( field ) ;
194+ fieldDetail = fieldObj ?. detail ;
195+ } else {
196+ fieldDetail = field ;
197+ fieldObj = this . #fields. get ( fieldDetail . name ) ;
198+ }
199+
200+ if ( ! fieldDetail || ( fieldObj && fieldObj . detail ?. notRender ) ) return ;
201+
182202 const { name, label, validate } = fieldDetail ;
183- const validateValue = this . #formData[ name ] ;
203+ const validateValue = get ( this . #formData, name ) ;
184204
185205 const messageBody = ( message : string , type = "error" ) => {
186206 return {
@@ -193,7 +213,7 @@ export class FormStore extends PubSub {
193213
194214 const valid = (
195215 validate : Validate ,
196- value : string | number | null | undefined
216+ value : string | number | null | undefined | object | Array < unknown >
197217 ) : MessageBody => {
198218 const { required, pattern, message, type, min, max, validator } =
199219 validate ;
@@ -271,7 +291,7 @@ export class FormStore extends PubSub {
271291 return messageBody ( "" , "normal" ) ;
272292 } ;
273293
274- const result = { name, ...valid ( validate , validateValue as string ) } ;
294+ const result = { name, ...valid ( validate , validateValue as any ) } ;
275295 this . publish ( `${ name } .validate` , result ) ;
276296 return result ;
277297 }
0 commit comments