@ -7,7 +7,9 @@ import { DeesInputRadio } from './dees-input-radio';
import * as domtools from '@designestate/dees-domtools' ;
import { DeesFormSubmit } from './dees-form-submit' ;
export type TFormElement = Array <DeesInputCheckbox | DeesInputText | DeesInputQuantitySelector | DeesInputRadio > ;
export type TFormElement = Array <
DeesInputCheckbox | DeesInputText | DeesInputQuantitySelector | DeesInputRadio
> ;
declare global {
interface HTMLElementTagNameMap {
@ -18,18 +20,25 @@ declare global {
@customElement ( 'dees-form' )
export class DeesForm extends DeesElement {
public static demo = ( ) = > html `
<dees-form style="display: block; margin:auto; max-width: 500px; padding: 20px" @formData= ${ async ( eventArg ) = > {
const form : DeesForm = eventArg . currentTarget ;
form. setStatus ( 'pending' , 'authenticating...' ) ;
await domtools . plugins . smartdelay . delayFor ( 1000 ) ;
form . setStatus ( 'success ' , 'authenticated! ' ) ;
} }>
<dees-form
style="display: block; margin:auto; max-width: 500px; padding: 20px"
@ formData= ${ async ( eventArg ) = > {
const form : DeesForm = eventArg . currentTarget ;
form . setStatus ( 'pending ' , 'authenticating... ' ) ;
await domtools . plugins . smartdelay . delayFor ( 1000 ) ;
form . setStatus ( 'success' , 'authenticated!' ) ;
} }
>
<dees-input-text .required=" ${ true } " key="hello1" label="a text"></dees-input-text>
<dees-input-text .required=" ${ true } " key="hello2" label="also a text"></dees-input-text>
<dees-input-checkbox .required=" ${ true } " key="hello3" label="another text"></dees-input-checkbox>
<dees-input-checkbox
.required=" ${ true } "
key="hello3"
label="another text"
></dees-input-checkbox>
<dees-form-submit>Submit</dees-form-submit>
</dees-form>
` ;
` ;
public name : string = 'myform' ;
public changeSubject = new domtools . rxjs . Subject ( ) ;
@ -61,9 +70,13 @@ export class DeesForm extends DeesElement {
public getFormChildren() {
const children : Array < DeesElement > = this . children as any ;
const formChildren : TFormElement = [ ] ;
for ( const child of children ) {
if ( child instanceof DeesInputCheckbox || child instanceof DeesInputText || child instanceof DeesInputQuantitySelector ) {
if (
child instanceof DeesInputCheckbox ||
child instanceof DeesInputText ||
child instanceof DeesInputQuantitySelector
) {
formChildren . push ( child ) ;
}
}
@ -74,7 +87,7 @@ export class DeesForm extends DeesElement {
const children : Array < DeesElement > = this . children as any ;
let submitButton : DeesFormSubmit ;
for ( const childArg of children ) {
if ( childArg instanceof DeesFormSubmit ) {
if ( childArg instanceof DeesFormSubmit ) {
submitButton = childArg ;
}
}
@ -82,9 +95,8 @@ export class DeesForm extends DeesElement {
}
public async checkRequiredStatus() {
console . log ( 'checking the required status.' )
console . log ( 'checking the required status.' ) ;
let requiredOK = true ;
for ( const childArg of this . getFormChildren ( ) ) {
if ( childArg . required && ! childArg . value ) {
@ -96,7 +108,7 @@ export class DeesForm extends DeesElement {
public async gatherData() {
const children = this . getFormChildren ( ) ;
const valueObject : { [ key : string ] : string | number | boolean } = { } ;
const valueObject : { [ key : string ] : string | number | boolean } = { } ;
for ( const child of children ) {
valueObject [ child . key ] = child . value ;
}
@ -107,20 +119,23 @@ export class DeesForm extends DeesElement {
const valueObject = await this . gatherData ( ) ;
const formDataEvent = new CustomEvent ( 'formData' , {
detail : {
data : valueObject
data : valueObject ,
} ,
bubbles : true
bubbles : true ,
} ) ;
this . dispatchEvent ( formDataEvent ) ;
console . log ( 'dispatched data:' )
console . log ( 'dispatched data:' ) ;
console . log ( valueObject ) ;
}
public setStatus ( visualStateArg : 'normal' | 'pending' | 'error' | 'success' , textStateArg : string ) {
public setStatus (
visualStateArg : 'normal' | 'pending' | 'error' | 'success' ,
textStateArg : string
) {
const inputChildren = this . getFormChildren ( ) ;
const submitButton = this . getSubmitButton ( ) ;
switch ( visualStateArg ) {
switch ( visualStateArg ) {
case 'pending' :
submitButton . disabled = true ;
submitButton . status = 'pending' ;
@ -135,9 +150,15 @@ export class DeesForm extends DeesElement {
inputChild . disabled = true ;
}
break ;
case 'error' :
submitButton . disabled = true ;
submitButton . status = 'error' ;
for ( const inputChild of inputChildren ) {
inputChild . disabled = true ;
}
break ;
}
submitButton . text = textStateArg ;
}
}
}