fix(ValidateMixin): no dispatch validators on readOnly form items (#2610)

Co-authored-by: Eugenio Páez Casado <eugeniopaezcasado@Mac-mini-de-Eugenio.local>
This commit is contained in:
geniuspacs 2025-11-11 09:44:17 +01:00 committed by GitHub
parent 71d838dcf7
commit 9105f50ef3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 31 additions and 14 deletions

View file

@ -0,0 +1,5 @@
---
'@lion/ui': patch
---
fix(ValidateMixin): no dispatch validators on readOnly form items

View file

@ -1,15 +1,15 @@
/* eslint-disable class-methods-use-this, camelcase, no-param-reassign, max-classes-per-file */ /* eslint-disable class-methods-use-this, camelcase, no-param-reassign, max-classes-per-file */
import { SlotMixin, DisabledMixin } from '@lion/ui/core.js'; import { DisabledMixin, SlotMixin } from '@lion/ui/core.js';
import { dedupeMixin } from '@open-wc/dedupe-mixin'; import { dedupeMixin } from '@open-wc/dedupe-mixin';
// TODO: make form-core independent from localize // TODO: make form-core independent from localize
import { getLocalizeManager } from '@lion/ui/localize-no-side-effects.js'; import { getLocalizeManager } from '@lion/ui/localize-no-side-effects.js';
import { ScopedElementsMixin } from '../../../core/src/ScopedElementsMixin.js'; import { ScopedElementsMixin } from '../../../core/src/ScopedElementsMixin.js';
import { FormControlMixin } from '../FormControlMixin.js';
import { AsyncQueue } from '../utils/AsyncQueue.js'; import { AsyncQueue } from '../utils/AsyncQueue.js';
import { pascalCase } from '../utils/pascalCase.js'; import { pascalCase } from '../utils/pascalCase.js';
import { SyncUpdatableMixin } from '../utils/SyncUpdatableMixin.js'; import { SyncUpdatableMixin } from '../utils/SyncUpdatableMixin.js';
import { LionValidationFeedback } from './LionValidationFeedback.js'; import { LionValidationFeedback } from './LionValidationFeedback.js';
import { Unparseable } from './Unparseable.js'; import { Unparseable } from './Unparseable.js';
import { FormControlMixin } from '../FormControlMixin.js';
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
import { ResultValidator as MetaValidator } from './ResultValidator.js'; import { ResultValidator as MetaValidator } from './ResultValidator.js';
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
@ -399,7 +399,7 @@ export const ValidateMixinImplementation = superclass =>
this.__validateCompleteResolve = resolve; this.__validateCompleteResolve = resolve;
}); });
if (this.disabled) { if (this.disabled || this.readOnly) {
this.__clearValidationResults(); this.__clearValidationResults();
this.__finishValidationPass(); this.__finishValidationPass();
this._updateFeedbackComponent(); this._updateFeedbackComponent();

View file

@ -1,26 +1,26 @@
import { LitElement } from 'lit';
import { aTimeout, defineCE, expect, fixture, html, unsafeStatic } from '@open-wc/testing';
import { import {
getFormControlMembers,
AsyncAlwaysInvalid,
AsyncAlwaysValid,
AlwaysInvalid, AlwaysInvalid,
AlwaysValid, AlwaysValid,
AsyncAlwaysInvalid,
AsyncAlwaysValid,
getFormControlMembers,
} from '@lion/ui/form-core-test-helpers.js'; } from '@lion/ui/form-core-test-helpers.js';
import sinon from 'sinon';
import { import {
ResultValidator,
ValidateMixin,
EqualsLength, EqualsLength,
Unparseable,
MaxLength, MaxLength,
MinLength, MinLength,
Validator,
Required, Required,
ResultValidator,
Unparseable,
ValidateMixin,
Validator,
} from '@lion/ui/form-core.js'; } from '@lion/ui/form-core.js';
import { aTimeout, defineCE, expect, fixture, html, unsafeStatic } from '@open-wc/testing';
import { LitElement } from 'lit';
import sinon from 'sinon';
import '@lion/ui/define/lion-validation-feedback.js';
import '@lion/ui/define/lion-field.js'; import '@lion/ui/define/lion-field.js';
import '@lion/ui/define/lion-validation-feedback.js';
/** /**
* @typedef {import('@lion/ui/form-core.js').LionField} LionField * @typedef {import('@lion/ui/form-core.js').LionField} LionField
@ -631,6 +631,18 @@ export function runValidateMixinSuite(customConfig) {
isCatValidator.param = 'Garfield'; isCatValidator.param = 'Garfield';
expect(catSpy.callCount).to.equal(2); expect(catSpy.callCount).to.equal(2);
}); });
it('Validators will not be called on readOnly fields', async () => {
const el = /** @type {ValidateElement} */ (
await fixture(html`
<${tag} .validators=${[new IsCat()]}>${lightDom}</${tag}>
`)
);
el.readOnly = true;
el.modelValue = 'dog';
expect(el.validationStates.error.IsCat).to.be.undefined;
});
}); });
describe('Async Validator Integration', () => { describe('Async Validator Integration', () => {