diff --git a/ts_web/elements/00group-input/dees-input-iban/dees-input-iban.ts b/ts_web/elements/00group-input/dees-input-iban/dees-input-iban.ts index ead91c8..dd1394e 100644 --- a/ts_web/elements/00group-input/dees-input-iban/dees-input-iban.ts +++ b/ts_web/elements/00group-input/dees-input-iban/dees-input-iban.ts @@ -83,7 +83,16 @@ export class DeesInputIban extends DeesInputBase { this.enteredIbanIsValid = ibantools.isValidIBAN(this.enteredString.replace(/ /g, '')); const deesInputText = this.shadowRoot!.querySelector('dees-input-text') as any; if (deesInputText) { - deesInputText.validationText = `IBAN is valid: ${this.enteredIbanIsValid}`; + if (this.enteredIbanIsValid) { + deesInputText.validationState = 'valid'; + deesInputText.validationText = 'IBAN is valid'; + } else if (this.enteredString.length > 0) { + deesInputText.validationState = 'invalid'; + deesInputText.validationText = 'Please enter a valid IBAN'; + } else { + deesInputText.validationState = undefined; + deesInputText.validationText = ''; + } } } diff --git a/ts_web/elements/00group-input/dees-input-text/dees-input-text.demo.ts b/ts_web/elements/00group-input/dees-input-text/dees-input-text.demo.ts index 5c64816..cc3848a 100644 --- a/ts_web/elements/00group-input/dees-input-text/dees-input-text.demo.ts +++ b/ts_web/elements/00group-input/dees-input-text/dees-input-text.demo.ts @@ -210,39 +210,7 @@ export const demoFunc = () => html` - { - // Demonstrate validation states - const requiredInput = elementArg.querySelector('dees-input-text[required]') as DeesInputText; - const disabledInput = elementArg.querySelector('dees-input-text[disabled]') as DeesInputText; - const errorInput = elementArg.querySelector('dees-input-text[validationState="invalid"]') as DeesInputText; - - if (requiredInput) { - // Show validation on blur for empty required field - requiredInput.addEventListener('blur', () => { - if (!requiredInput.getValue()) { - console.log('Required field is empty!'); - } - }); - } - - if (disabledInput) { - console.log('Disabled input cannot be edited'); - } - - if (errorInput) { - console.log('Error input shows validation message:', errorInput.validationText); - - // Simulate fixing the error - errorInput.addEventListener('changeSubject', () => { - const value = errorInput.getValue(); - if (value.includes('@') && value.includes('.')) { - errorInput.validationState = 'valid'; - errorInput.validationText = ''; - console.log('Email validation passed!'); - } - }); - } - }}> +
html` > { + if (value.includes('@') && value.includes('.')) { + return { valid: true, message: 'Email address is valid' }; + } + return { valid: false, message: 'Please enter a valid email address' }; + }} >
diff --git a/ts_web/elements/00group-input/dees-input-text/dees-input-text.ts b/ts_web/elements/00group-input/dees-input-text/dees-input-text.ts index 3e19cb5..5b7b039 100644 --- a/ts_web/elements/00group-input/dees-input-text/dees-input-text.ts +++ b/ts_web/elements/00group-input/dees-input-text/dees-input-text.ts @@ -54,8 +54,8 @@ export class DeesInputText extends DeesInputBase { }) accessor validationText: string = ''; - @property({}) - accessor validationFunction!: (value: string) => boolean; + @property({ attribute: false }) + accessor validationFunction!: (value: string) => { valid: boolean; message?: string }; @property({ type: Boolean, @@ -288,12 +288,21 @@ export class DeesInputText extends DeesInputBase { } firstUpdated() { - // Input event handling is already done in updateValue method + if (this.validationFunction && this.value) { + const result = this.validationFunction(this.value); + this.validationState = result.valid ? 'valid' : 'invalid'; + this.validationText = result.message || ''; + } } public async updateValue(eventArg: Event) { const target: any = eventArg.target; this.value = target.value; + if (this.validationFunction) { + const result = this.validationFunction(this.value); + this.validationState = result.valid ? 'valid' : 'invalid'; + this.validationText = result.message || ''; + } this.changeSubject.next(this); }