@@ -4,7 +4,7 @@ import { observer } from 'mobx-react';
44import { ObservedComponent } from 'mobx-react-helper' ;
55import { DataObject , Filter , IDType , ListModel } from 'mobx-restful' ;
66import { FormEvent , Fragment , InputHTMLAttributes , ReactNode } from 'react' ;
7- import { Button , Form , FormGroupProps , FormProps , InputGroup } from 'react-bootstrap' ;
7+ import { Button , ButtonProps , Form , FormGroupProps , FormProps , InputGroup } from 'react-bootstrap' ;
88import { Editor , EditorProps } from 'react-bootstrap-editor' ;
99import { formatDate , formToJSON , isEmpty } from 'web-utility' ;
1010
@@ -46,12 +46,14 @@ export interface FieldBoxProps<D extends DataObject>
4646}
4747
4848export interface RestFormProps < D extends DataObject , F extends Filter < D > = Filter < D > >
49- extends Pick < FormProps , 'className' | 'style' > {
49+ extends Pick < FormProps , 'className' | 'style' > ,
50+ Pick < ButtonProps , 'size' > {
5051 id ?: IDType ;
5152 fields : Field < D > [ ] ;
52- store : ListModel < D , F > ;
53+ store ? : ListModel < D , F > ;
5354 translator : TranslationModel < string , 'submit' | 'cancel' > ;
5455 onSubmit ?: ( data : D ) => any ;
56+ onReset ?: ( data : Partial < D > ) => any ;
5557}
5658
5759@observer
@@ -104,7 +106,7 @@ export class RestForm<
104106 componentDidMount ( ) {
105107 const { id, store } = this . props ;
106108
107- if ( id ) store . getOne ( id ) ;
109+ if ( id ) store ? .getOne ( id ) ;
108110 }
109111
110112 handleSubmit = async ( event : FormEvent < HTMLFormElement > ) => {
@@ -118,16 +120,24 @@ export class RestForm<
118120
119121 if ( valid ) {
120122 const { id, store, onSubmit } = this . props ;
123+ let data = formToJSON < D > ( form ) ;
121124
122- const updated = await store . updateOne ( formToJSON ( form ) , id ) ;
125+ data = await store ? .updateOne ( data , id ) ;
123126
124- onSubmit ?.( updated ) ;
127+ onSubmit ?.( data ) ;
125128
126- store . clearCurrent ( ) ;
129+ store ? .clearCurrent ( ) ;
127130 }
128131 this . validated = false ;
129132 } ;
130133
134+ handleReset = ( { currentTarget } : FormEvent < HTMLFormElement > ) => {
135+ const { onReset, store } = this . props ;
136+
137+ onReset ?.( formToJSON ( currentTarget ) ) ;
138+ store ?. clearCurrent ( ) ;
139+ } ;
140+
131141 @computed
132142 get fields ( ) : Field < D > [ ] {
133143 const { fields } = this . observedProps ;
@@ -163,7 +173,7 @@ export class RestForm<
163173 get fieldReady ( ) {
164174 const { id, store } = this . observedProps ;
165175
166- return ! id || store . downloading < 1 ;
176+ return ! id || store ? .downloading < 1 ;
167177 }
168178
169179 renderFile =
@@ -239,6 +249,7 @@ export class RestForm<
239249 { ...props }
240250 { ...meta }
241251 { ...{ type, step, label } }
252+ size = { this . observedProps . size }
242253 name = { key . toString ( ) }
243254 defaultValue = { RestForm . dateValueOf ( { type, step } , value ) }
244255 />
@@ -259,29 +270,41 @@ export class RestForm<
259270
260271 render ( ) {
261272 const { fields, readOnly, customValidation, validated } = this ,
262- { id, className = '' , store, translator, ...props } = this . observedProps ;
263- const { downloading, uploading, currentOne } = store ,
273+ {
274+ id,
275+ className = 'd-flex flex-column gap-3' ,
276+ size,
277+ store,
278+ translator,
279+ ...props
280+ } = this . props ;
281+ const { downloading, uploading, currentOne = { } as D } = store || { } ,
264282 { t } = translator ;
265283 const loading = downloading > 0 || uploading > 0 ;
266284
267285 return (
268286 < Form
269- className = { `d-flex flex-column gap-3 ${ className } ` }
270287 { ...props }
288+ { ...{ className, validated } }
271289 noValidate = { customValidation }
272- validated = { validated }
273290 onSubmit = { this . handleSubmit }
274- onReset = { ( ) => store . clearCurrent ( ) }
291+ onReset = { this . handleReset }
275292 >
276293 { fields . map ( ( { renderInput, ...meta } ) => (
277294 < Fragment key = { meta . key ?. toString ( ) } > { renderInput ?.( currentOne , meta ) } </ Fragment >
278295 ) ) }
279296 { ! readOnly && (
280297 < footer className = "d-flex gap-3" >
281- < Button className = "flex-fill" type = "submit" disabled = { loading } >
298+ < Button className = "flex-fill" size = { size } type = "submit" disabled = { loading } >
282299 { t ( 'submit' ) }
283300 </ Button >
284- < Button className = "flex-fill" type = "reset" variant = "danger" disabled = { loading } >
301+ < Button
302+ className = "flex-fill"
303+ size = { size }
304+ type = "reset"
305+ variant = "danger"
306+ disabled = { loading }
307+ >
285308 { t ( 'cancel' ) }
286309 </ Button >
287310 </ footer >
0 commit comments