@db-ux/ngx-core-components 4.13.1-angular-signal-forms4-d3a9db2 → 4.13.1-angular-signal-forms6-a1510bb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1425,9 +1425,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
1425
1425
|
const defaultProps$B = {};
|
|
1426
1426
|
class DBCheckbox {
|
|
1427
1427
|
hasValidState() {
|
|
1428
|
-
|
|
1428
|
+
if (this.validation() === 'no-validation')
|
|
1429
|
+
return false;
|
|
1430
|
+
return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
|
|
1429
1431
|
}
|
|
1430
1432
|
handleValidation() {
|
|
1433
|
+
// validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
|
|
1434
|
+
if (this.validation() === 'no-validation') {
|
|
1435
|
+
this._valid.set(undefined);
|
|
1436
|
+
this._invalidMessage.set('');
|
|
1437
|
+
this._validMessage.set('');
|
|
1438
|
+
this._descByIds.set(undefined);
|
|
1439
|
+
return;
|
|
1440
|
+
}
|
|
1431
1441
|
// Signal Forms validation bridge: errors InputSignal has priority
|
|
1432
1442
|
const signalFormErrors = this.errors();
|
|
1433
1443
|
if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
|
|
@@ -1441,12 +1451,18 @@ class DBCheckbox {
|
|
|
1441
1451
|
}
|
|
1442
1452
|
return; // Signal Forms errors take priority
|
|
1443
1453
|
}
|
|
1444
|
-
else if (this.
|
|
1445
|
-
// Signal Forms provided errors=[]
|
|
1454
|
+
else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
|
|
1455
|
+
// Signal Forms provided errors=[] after previous invalid state → now valid
|
|
1446
1456
|
this._valid.set('valid');
|
|
1447
1457
|
this._validMessage.set(DEFAULT_VALID_MESSAGE);
|
|
1448
1458
|
this._invalidMessage.set('');
|
|
1449
1459
|
}
|
|
1460
|
+
// If Signal Forms says "valid" but native validation disagrees, reset _valid
|
|
1461
|
+
// so native validation can take over via CSS :user-invalid selectors
|
|
1462
|
+
if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
|
|
1463
|
+
this._valid.set(undefined);
|
|
1464
|
+
this._validMessage.set('');
|
|
1465
|
+
}
|
|
1450
1466
|
/* For a11y reasons we need to map the correct message with the checkbox */
|
|
1451
1467
|
if (!this._ref()?.nativeElement?.validity.valid ||
|
|
1452
1468
|
this.validation() === "invalid") {
|
|
@@ -1754,8 +1770,8 @@ class DBCheckbox {
|
|
|
1754
1770
|
<label [attr.for]="_id()"
|
|
1755
1771
|
><input
|
|
1756
1772
|
type="checkbox"
|
|
1757
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
1758
|
-
[attr.data-custom-validity]="validation()"
|
|
1773
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
1774
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
1759
1775
|
#_ref
|
|
1760
1776
|
[attr.id]="_id()"
|
|
1761
1777
|
[attr.name]="name()"
|
|
@@ -1812,8 +1828,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
1812
1828
|
<label [attr.for]="_id()"
|
|
1813
1829
|
><input
|
|
1814
1830
|
type="checkbox"
|
|
1815
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
1816
|
-
[attr.data-custom-validity]="validation()"
|
|
1831
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
1832
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
1817
1833
|
#_ref
|
|
1818
1834
|
[attr.id]="_id()"
|
|
1819
1835
|
[attr.name]="name()"
|
|
@@ -2901,7 +2917,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
2901
2917
|
const defaultProps$w = {};
|
|
2902
2918
|
class DBInput {
|
|
2903
2919
|
hasValidState() {
|
|
2904
|
-
|
|
2920
|
+
if (this.validation() === 'no-validation')
|
|
2921
|
+
return false;
|
|
2922
|
+
return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
|
|
2905
2923
|
}
|
|
2906
2924
|
getPatternAttr() {
|
|
2907
2925
|
const p = this.pattern();
|
|
@@ -2912,6 +2930,14 @@ class DBInput {
|
|
|
2912
2930
|
return undefined;
|
|
2913
2931
|
}
|
|
2914
2932
|
handleValidation() {
|
|
2933
|
+
// validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
|
|
2934
|
+
if (this.validation() === 'no-validation') {
|
|
2935
|
+
this._valid.set(undefined);
|
|
2936
|
+
this._invalidMessage.set('');
|
|
2937
|
+
this._validMessage.set('');
|
|
2938
|
+
this._descByIds.set(undefined);
|
|
2939
|
+
return;
|
|
2940
|
+
}
|
|
2915
2941
|
// Signal Forms validation bridge: errors InputSignal has priority
|
|
2916
2942
|
const signalFormErrors = this.errors();
|
|
2917
2943
|
if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
|
|
@@ -2925,12 +2951,18 @@ class DBInput {
|
|
|
2925
2951
|
}
|
|
2926
2952
|
return; // Signal Forms errors take priority
|
|
2927
2953
|
}
|
|
2928
|
-
else if (this.
|
|
2929
|
-
// Signal Forms provided errors=[]
|
|
2954
|
+
else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
|
|
2955
|
+
// Signal Forms provided errors=[] after previous invalid state → now valid
|
|
2930
2956
|
this._valid.set('valid');
|
|
2931
2957
|
this._validMessage.set(DEFAULT_VALID_MESSAGE);
|
|
2932
2958
|
this._invalidMessage.set('');
|
|
2933
2959
|
}
|
|
2960
|
+
// If Signal Forms says "valid" but native validation disagrees, reset _valid
|
|
2961
|
+
// so native validation can take over via CSS :user-invalid selectors
|
|
2962
|
+
if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
|
|
2963
|
+
this._valid.set(undefined);
|
|
2964
|
+
this._validMessage.set('');
|
|
2965
|
+
}
|
|
2934
2966
|
/* For a11y reasons we need to map the correct message with the input */
|
|
2935
2967
|
if (!this._ref()?.nativeElement?.validity.valid ||
|
|
2936
2968
|
this.validation() === "invalid") {
|
|
@@ -3285,8 +3317,8 @@ class DBInput {
|
|
|
3285
3317
|
>
|
|
3286
3318
|
<label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
|
|
3287
3319
|
<input
|
|
3288
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
3289
|
-
[attr.data-custom-validity]="validation()"
|
|
3320
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
3321
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
3290
3322
|
[attr.data-field-sizing]="fieldSizing()"
|
|
3291
3323
|
#_ref
|
|
3292
3324
|
[attr.id]="_id()"
|
|
@@ -3374,8 +3406,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
3374
3406
|
>
|
|
3375
3407
|
<label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
|
|
3376
3408
|
<input
|
|
3377
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
3378
|
-
[attr.data-custom-validity]="validation()"
|
|
3409
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
3410
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
3379
3411
|
[attr.data-field-sizing]="fieldSizing()"
|
|
3380
3412
|
#_ref
|
|
3381
3413
|
[attr.id]="_id()"
|
|
@@ -3953,9 +3985,20 @@ class DBCustomSelect {
|
|
|
3953
3985
|
}
|
|
3954
3986
|
}
|
|
3955
3987
|
hasValidState() {
|
|
3956
|
-
|
|
3988
|
+
if (this.validation() === 'no-validation')
|
|
3989
|
+
return false;
|
|
3990
|
+
return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
|
|
3957
3991
|
}
|
|
3958
3992
|
handleValidation() {
|
|
3993
|
+
// validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
|
|
3994
|
+
if (this.validation() === 'no-validation') {
|
|
3995
|
+
this._valid.set(undefined);
|
|
3996
|
+
this._validity.set(undefined);
|
|
3997
|
+
this._invalidMessage.set('');
|
|
3998
|
+
this._validMessage.set('');
|
|
3999
|
+
this._descByIds.set(undefined);
|
|
4000
|
+
return;
|
|
4001
|
+
}
|
|
3959
4002
|
// Signal Forms validation bridge: errors InputSignal has priority
|
|
3960
4003
|
const signalFormErrors = this.errors();
|
|
3961
4004
|
if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
|
|
@@ -3967,14 +4010,23 @@ class DBCustomSelect {
|
|
|
3967
4010
|
this._voiceOverFallback.set(this._invalidMessage());
|
|
3968
4011
|
void delay(() => this._voiceOverFallback.set(""), 1000);
|
|
3969
4012
|
}
|
|
4013
|
+
this._validity.set('invalid');
|
|
3970
4014
|
return; // Signal Forms errors take priority
|
|
3971
4015
|
}
|
|
3972
|
-
else if (this.
|
|
3973
|
-
// Signal Forms provided errors=[]
|
|
4016
|
+
else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
|
|
4017
|
+
// Signal Forms provided errors=[] after previous invalid state → now valid
|
|
3974
4018
|
this._valid.set('valid');
|
|
4019
|
+
this._validity.set('valid');
|
|
3975
4020
|
this._validMessage.set(DEFAULT_VALID_MESSAGE);
|
|
3976
4021
|
this._invalidMessage.set('');
|
|
3977
4022
|
}
|
|
4023
|
+
// If Signal Forms says "valid" but native validation disagrees, reset _valid
|
|
4024
|
+
// so native validation can take over via CSS :user-invalid selectors
|
|
4025
|
+
if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
|
|
4026
|
+
this._valid.set(undefined);
|
|
4027
|
+
this._validity.set(undefined);
|
|
4028
|
+
this._validMessage.set('');
|
|
4029
|
+
}
|
|
3978
4030
|
if (this.selectRef()?.nativeElement) {
|
|
3979
4031
|
this.selectRef().nativeElement.value = this.getNativeSelectValue();
|
|
3980
4032
|
}
|
|
@@ -4536,20 +4588,28 @@ class DBCustomSelect {
|
|
|
4536
4588
|
this._valid = signal(undefined, ...(ngDevMode ? [{ debugName: "_valid" }] : /* istanbul ignore next */ []));
|
|
4537
4589
|
/** Signal Forms alias — maps to 'values' for FormValueControl duck-typing */
|
|
4538
4590
|
this.value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
|
|
4591
|
+
/** @internal Flag to prevent circular sync between value↔values */
|
|
4592
|
+
this._syncing = false;
|
|
4539
4593
|
/** @internal Sync value → values (Signal Forms writes to value) */
|
|
4540
4594
|
this._syncValueToValues = effect(() => {
|
|
4541
4595
|
const v = this.value();
|
|
4596
|
+
if (this._syncing)
|
|
4597
|
+
return;
|
|
4598
|
+
this._syncing = true;
|
|
4542
4599
|
if (v !== undefined) {
|
|
4543
4600
|
this.values.set(Array.isArray(v) ? v : v ? [v] : []);
|
|
4544
4601
|
}
|
|
4602
|
+
this._syncing = false;
|
|
4545
4603
|
}, ...(ngDevMode ? [{ debugName: "_syncValueToValues" }] : /* istanbul ignore next */ []));
|
|
4546
4604
|
/** @internal Sync values → value (CVA/user interaction writes to values) */
|
|
4547
4605
|
this._syncValuesToValue = effect(() => {
|
|
4548
4606
|
const vals = this.values();
|
|
4549
|
-
|
|
4550
|
-
|
|
4551
|
-
|
|
4552
|
-
|
|
4607
|
+
if (this._syncing)
|
|
4608
|
+
return;
|
|
4609
|
+
this._syncing = true;
|
|
4610
|
+
const current = vals && vals.length > 0 ? vals : undefined;
|
|
4611
|
+
this.value.set(current);
|
|
4612
|
+
this._syncing = false;
|
|
4553
4613
|
}, ...(ngDevMode ? [{ debugName: "_syncValuesToValue" }] : /* istanbul ignore next */ []));
|
|
4554
4614
|
if (typeof window !== "undefined") {
|
|
4555
4615
|
effect(() => {
|
|
@@ -7943,9 +8003,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
7943
8003
|
const defaultProps$f = {};
|
|
7944
8004
|
class DBSelect {
|
|
7945
8005
|
hasValidState() {
|
|
7946
|
-
|
|
8006
|
+
if (this.validation() === 'no-validation')
|
|
8007
|
+
return false;
|
|
8008
|
+
return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
|
|
7947
8009
|
}
|
|
7948
8010
|
handleValidation() {
|
|
8011
|
+
// validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
|
|
8012
|
+
if (this.validation() === 'no-validation') {
|
|
8013
|
+
this._valid.set(undefined);
|
|
8014
|
+
this._invalidMessage.set('');
|
|
8015
|
+
this._validMessage.set('');
|
|
8016
|
+
this._descByIds.set(undefined);
|
|
8017
|
+
return;
|
|
8018
|
+
}
|
|
7949
8019
|
// Signal Forms validation bridge: errors InputSignal has priority
|
|
7950
8020
|
const signalFormErrors = this.errors();
|
|
7951
8021
|
if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
|
|
@@ -7959,12 +8029,18 @@ class DBSelect {
|
|
|
7959
8029
|
}
|
|
7960
8030
|
return; // Signal Forms errors take priority
|
|
7961
8031
|
}
|
|
7962
|
-
else if (this.
|
|
7963
|
-
// Signal Forms provided errors=[]
|
|
8032
|
+
else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
|
|
8033
|
+
// Signal Forms provided errors=[] after previous invalid state → now valid
|
|
7964
8034
|
this._valid.set('valid');
|
|
7965
8035
|
this._validMessage.set(DEFAULT_VALID_MESSAGE);
|
|
7966
8036
|
this._invalidMessage.set('');
|
|
7967
8037
|
}
|
|
8038
|
+
// If Signal Forms says "valid" but native validation disagrees, reset _valid
|
|
8039
|
+
// so native validation can take over via CSS :user-invalid selectors
|
|
8040
|
+
if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
|
|
8041
|
+
this._valid.set(undefined);
|
|
8042
|
+
this._validMessage.set('');
|
|
8043
|
+
}
|
|
7968
8044
|
/* For a11y reasons we need to map the correct message with the select */
|
|
7969
8045
|
if (!this._ref()?.nativeElement?.validity.valid ||
|
|
7970
8046
|
this.validation() === "invalid") {
|
|
@@ -8313,8 +8389,8 @@ class DBSelect {
|
|
|
8313
8389
|
>
|
|
8314
8390
|
<label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
|
|
8315
8391
|
<select
|
|
8316
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
8317
|
-
[attr.data-custom-validity]="validation()"
|
|
8392
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
8393
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
8318
8394
|
#_ref
|
|
8319
8395
|
[required]="getBoolean(required(), 'required')"
|
|
8320
8396
|
[disabled]="getBoolean(disabled(), 'disabled')"
|
|
@@ -8417,8 +8493,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
8417
8493
|
>
|
|
8418
8494
|
<label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
|
|
8419
8495
|
<select
|
|
8420
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
8421
|
-
[attr.data-custom-validity]="validation()"
|
|
8496
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
8497
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
8422
8498
|
#_ref
|
|
8423
8499
|
[required]="getBoolean(required(), 'required')"
|
|
8424
8500
|
[disabled]="getBoolean(disabled(), 'disabled')"
|
|
@@ -8636,9 +8712,19 @@ const StackJustifyContentList = ['space-between', 'start', 'end', 'center'];
|
|
|
8636
8712
|
const defaultProps$d = {};
|
|
8637
8713
|
class DBSwitch {
|
|
8638
8714
|
hasValidState() {
|
|
8639
|
-
|
|
8715
|
+
if (this.validation() === 'no-validation')
|
|
8716
|
+
return false;
|
|
8717
|
+
return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
|
|
8640
8718
|
}
|
|
8641
8719
|
handleValidation() {
|
|
8720
|
+
// validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
|
|
8721
|
+
if (this.validation() === 'no-validation') {
|
|
8722
|
+
this._valid.set(undefined);
|
|
8723
|
+
this._invalidMessage.set('');
|
|
8724
|
+
this._validMessage.set('');
|
|
8725
|
+
this._descByIds.set(undefined);
|
|
8726
|
+
return;
|
|
8727
|
+
}
|
|
8642
8728
|
// Signal Forms validation bridge: errors InputSignal has priority
|
|
8643
8729
|
const signalFormErrors = this.errors();
|
|
8644
8730
|
if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
|
|
@@ -8652,12 +8738,18 @@ class DBSwitch {
|
|
|
8652
8738
|
}
|
|
8653
8739
|
return; // Signal Forms errors take priority
|
|
8654
8740
|
}
|
|
8655
|
-
else if (this.
|
|
8656
|
-
// Signal Forms provided errors=[]
|
|
8741
|
+
else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
|
|
8742
|
+
// Signal Forms provided errors=[] after previous invalid state → now valid
|
|
8657
8743
|
this._valid.set('valid');
|
|
8658
8744
|
this._validMessage.set(DEFAULT_VALID_MESSAGE);
|
|
8659
8745
|
this._invalidMessage.set('');
|
|
8660
8746
|
}
|
|
8747
|
+
// If Signal Forms says "valid" but native validation disagrees, reset _valid
|
|
8748
|
+
// so native validation can take over via CSS :user-invalid selectors
|
|
8749
|
+
if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
|
|
8750
|
+
this._valid.set(undefined);
|
|
8751
|
+
this._validMessage.set('');
|
|
8752
|
+
}
|
|
8661
8753
|
if (!this._ref()?.nativeElement?.validity?.valid ||
|
|
8662
8754
|
this.validation() === "invalid") {
|
|
8663
8755
|
this._descByIds.set(this._invalidMessageId());
|
|
@@ -8944,7 +9036,7 @@ class DBSwitch {
|
|
|
8944
9036
|
[attr.data-hide-label]="getHideProp(showLabel())"
|
|
8945
9037
|
[attr.data-variant]="variant()"
|
|
8946
9038
|
[attr.data-hide-asterisk]="getHideProp(showRequiredAsterisk())"
|
|
8947
|
-
[attr.data-custom-validity]="validation()"
|
|
9039
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
8948
9040
|
[class]="cls('db-switch', className())"
|
|
8949
9041
|
>
|
|
8950
9042
|
<label [attr.for]="_id()"
|
|
@@ -8956,7 +9048,7 @@ class DBSwitch {
|
|
|
8956
9048
|
[checked]="getBoolean(checked(), 'checked')"
|
|
8957
9049
|
[value]="value()"
|
|
8958
9050
|
[disabled]="getBoolean(disabled(), 'disabled')"
|
|
8959
|
-
[attr.aria-invalid]="validation() === 'invalid' ? 'true' : undefined"
|
|
9051
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid' ? 'true' : undefined"
|
|
8960
9052
|
[attr.aria-describedby]="_descByIds()"
|
|
8961
9053
|
[attr.name]="name()"
|
|
8962
9054
|
[required]="getBoolean(required(), 'required')"
|
|
@@ -9009,7 +9101,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
9009
9101
|
[attr.data-hide-label]="getHideProp(showLabel())"
|
|
9010
9102
|
[attr.data-variant]="variant()"
|
|
9011
9103
|
[attr.data-hide-asterisk]="getHideProp(showRequiredAsterisk())"
|
|
9012
|
-
[attr.data-custom-validity]="validation()"
|
|
9104
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
9013
9105
|
[class]="cls('db-switch', className())"
|
|
9014
9106
|
>
|
|
9015
9107
|
<label [attr.for]="_id()"
|
|
@@ -9021,7 +9113,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
9021
9113
|
[checked]="getBoolean(checked(), 'checked')"
|
|
9022
9114
|
[value]="value()"
|
|
9023
9115
|
[disabled]="getBoolean(disabled(), 'disabled')"
|
|
9024
|
-
[attr.aria-invalid]="validation() === 'invalid' ? 'true' : undefined"
|
|
9116
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid' ? 'true' : undefined"
|
|
9025
9117
|
[attr.aria-describedby]="_descByIds()"
|
|
9026
9118
|
[attr.name]="name()"
|
|
9027
9119
|
[required]="getBoolean(required(), 'required')"
|
|
@@ -11002,9 +11094,19 @@ const TagBehaviorList = ['static', 'removable'];
|
|
|
11002
11094
|
const defaultProps = {};
|
|
11003
11095
|
class DBTextarea {
|
|
11004
11096
|
hasValidState() {
|
|
11005
|
-
|
|
11097
|
+
if (this.validation() === 'no-validation')
|
|
11098
|
+
return false;
|
|
11099
|
+
return !!(this.validMessage() || this._valid() === 'valid' || this.validation() === "valid");
|
|
11006
11100
|
}
|
|
11007
11101
|
handleValidation() {
|
|
11102
|
+
// validation="no-validation" suppresses ALL validation UI (Signal Forms + native)
|
|
11103
|
+
if (this.validation() === 'no-validation') {
|
|
11104
|
+
this._valid.set(undefined);
|
|
11105
|
+
this._invalidMessage.set('');
|
|
11106
|
+
this._validMessage.set('');
|
|
11107
|
+
this._descByIds.set(undefined);
|
|
11108
|
+
return;
|
|
11109
|
+
}
|
|
11008
11110
|
// Signal Forms validation bridge: errors InputSignal has priority
|
|
11009
11111
|
const signalFormErrors = this.errors();
|
|
11010
11112
|
if (Array.isArray(signalFormErrors) && signalFormErrors.length > 0) {
|
|
@@ -11018,12 +11120,18 @@ class DBTextarea {
|
|
|
11018
11120
|
}
|
|
11019
11121
|
return; // Signal Forms errors take priority
|
|
11020
11122
|
}
|
|
11021
|
-
else if (this.
|
|
11022
|
-
// Signal Forms provided errors=[]
|
|
11123
|
+
else if (Array.isArray(signalFormErrors) && signalFormErrors.length === 0 && this._valid() === 'invalid') {
|
|
11124
|
+
// Signal Forms provided errors=[] after previous invalid state → now valid
|
|
11023
11125
|
this._valid.set('valid');
|
|
11024
11126
|
this._validMessage.set(DEFAULT_VALID_MESSAGE);
|
|
11025
11127
|
this._invalidMessage.set('');
|
|
11026
11128
|
}
|
|
11129
|
+
// If Signal Forms says "valid" but native validation disagrees, reset _valid
|
|
11130
|
+
// so native validation can take over via CSS :user-invalid selectors
|
|
11131
|
+
if (this._valid() === 'valid' && this._ref()?.nativeElement && !this._ref()?.nativeElement?.validity?.valid) {
|
|
11132
|
+
this._valid.set(undefined);
|
|
11133
|
+
this._validMessage.set('');
|
|
11134
|
+
}
|
|
11027
11135
|
/* For a11y reasons we need to map the correct message with the textarea */
|
|
11028
11136
|
if (!this._ref()?.nativeElement?.validity.valid ||
|
|
11029
11137
|
this.validation() === "invalid") {
|
|
@@ -11337,8 +11445,8 @@ class DBTextarea {
|
|
|
11337
11445
|
>
|
|
11338
11446
|
<label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
|
|
11339
11447
|
<textarea
|
|
11340
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
11341
|
-
[attr.data-custom-validity]="validation()"
|
|
11448
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
11449
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
11342
11450
|
[attr.data-field-sizing]="fieldSizing()"
|
|
11343
11451
|
#_ref
|
|
11344
11452
|
[attr.id]="_id()"
|
|
@@ -11406,8 +11514,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
11406
11514
|
>
|
|
11407
11515
|
<label [attr.for]="_id()">{{label() ?? DEFAULT_LABEL}}</label>
|
|
11408
11516
|
<textarea
|
|
11409
|
-
[attr.aria-invalid]="validation() === 'invalid'"
|
|
11410
|
-
[attr.data-custom-validity]="validation()"
|
|
11517
|
+
[attr.aria-invalid]="validation() !== 'no-validation' && (_valid() ?? validation()) === 'invalid'"
|
|
11518
|
+
[attr.data-custom-validity]="validation() === 'no-validation' ? 'no-validation' : (_valid() ?? validation())"
|
|
11411
11519
|
[attr.data-field-sizing]="fieldSizing()"
|
|
11412
11520
|
#_ref
|
|
11413
11521
|
[attr.id]="_id()"
|