diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb9551a9c..7b3883f6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ on: jobs: linux_tests: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 3e3c347e7..6332ce773 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -35,5 +35,5 @@ jobs: stale-issue-label: 'stale' stale-pr-label: 'stale' exempt-all-milestones: true - exempt-issue-labels: 'Status: Verified' + exempt-issue-labels: 'Status: Verified, Type: Feature' exempt-pr-labels: 'MERGE ME, NEEDS REVIEW' diff --git a/.jscsrc b/.jscsrc index d50b36c38..018d8ca09 100644 --- a/.jscsrc +++ b/.jscsrc @@ -1,5 +1,8 @@ { "preset": "jquery", "maximumLineLength": null, - "requireCamelCaseOrUpperCaseIdentifiers": null + "requireCamelCaseOrUpperCaseIdentifiers": null, + "excludeFiles": [ + "test/custom-elements.js" + ] } diff --git a/.jshintignore b/.jshintignore index ffdbea7be..420537ee7 100644 --- a/.jshintignore +++ b/.jshintignore @@ -4,3 +4,4 @@ test/qunit/ dist/ demo/ *.min.js +test/custom-elements.js diff --git a/Gruntfile.js b/Gruntfile.js index 18cd73e33..2f4e3ea6c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -115,7 +115,17 @@ grunt.initConfig( { } }, qunit: { - files: "test/index.html" + files: "test/index.html", + options: { + puppeteer: { + args: [ + "--headless", + "--disable-web-security", + "--allow-file-access-from-files" + ] + }, + timeout: 10000 + } }, jshint: { options: { diff --git a/changelog.md b/changelog.md index 4680381ae..65b392ff8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,12 @@ +1.20.1 / 2024-06-13 +=================== + +## Core + * Fix remote validation when input is the same as in aborted request [#2481](https://github.com/jquery-validation/jquery-validation/pull/2481) + +## Localisation + * Update Arabic translations [#2485](https://github.com/jquery-validation/jquery-validation/pull/2485) + 1.20.0 / 2023-10-10 =================== diff --git a/package.json b/package.json index f1a027aa7..7fd85ca91 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-validation", "title": "jQuery Validation Plugin", "description": "Client-side form validation made easy", - "version": "1.20.1-pre", + "version": "1.21.1-pre", "homepage": "https://jqueryvalidation.org/", "license": "MIT", "author": { @@ -45,7 +45,7 @@ "grunt-contrib-concat": "1.0.1", "grunt-contrib-copy": "1.0.0", "grunt-contrib-jshint": "1.0.0", - "grunt-contrib-qunit": "1.2.0", + "grunt-contrib-qunit": "10.0.0", "grunt-contrib-uglify": "1.0.1", "grunt-contrib-watch": "1.0.0", "grunt-jscs": "2.8.0", diff --git a/src/core.js b/src/core.js index 426b2551a..240e2737b 100644 --- a/src/core.js +++ b/src/core.js @@ -275,6 +275,7 @@ $.extend( $.validator, { onsubmit: true, ignore: ":hidden", ignoreTitle: false, + customElements: [], onfocusin: function( element ) { this.lastActive = element; @@ -422,17 +423,17 @@ $.extend( $.validator, { settings[ eventType ].call( validator, this, event ); } } - + var focusListeners = [ ":text", "[type='password']", "[type='file']", "select", "textarea", "[type='number']", "[type='search']", + "[type='tel']", "[type='url']", "[type='email']", "[type='datetime']", "[type='date']", "[type='month']", + "[type='week']", "[type='time']", "[type='datetime-local']", "[type='range']", "[type='color']", + "[type='radio']", "[type='checkbox']", "[contenteditable]", "[type='button']" ]; + var clickListeners = [ "select", "option", "[type='radio']", "[type='checkbox']" ]; $( this.currentForm ) - .on( "focusin.validate focusout.validate keyup.validate", - ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " + - "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " + - "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " + - "[type='radio'], [type='checkbox'], [contenteditable], [type='button']", delegate ) + .on( "focusin.validate focusout.validate keyup.validate", focusListeners.concat( this.settings.customElements ).join( ", " ), delegate ) // Support: Chrome, oldIE // "select" is provided as event.target when clicking a option - .on( "click.validate", "select, option, [type='radio'], [type='checkbox']", delegate ); + .on( "click.validate", clickListeners.concat( this.settings.customElements ).join( ", " ), delegate ); if ( this.settings.invalidHandler ) { $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler ); @@ -629,11 +630,12 @@ $.extend( $.validator, { elements: function() { var validator = this, - rulesCache = {}; + rulesCache = {}, + selectors = [ "input", "select", "textarea", "[contenteditable]" ]; // Select all valid inputs inside the form (no submit or reset buttons) return $( this.currentForm ) - .find( "input, select, textarea, [contenteditable]" ) + .find( selectors.concat( this.settings.customElements ).join( ", " ) ) .not( ":submit, :reset, :image, :disabled" ) .not( this.settings.ignore ) .filter( function() { @@ -1483,7 +1485,7 @@ $.extend( $.validator, { // https://jqueryvalidation.org/number-method/ number: function( value, element ) { - return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value ); + return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:-?\.\d+)?$/.test( value ); }, // https://jqueryvalidation.org/digits-method/ diff --git a/src/localization/messages_nl.js b/src/localization/messages_nl.js index 2d6a6970e..abee59f9e 100644 --- a/src/localization/messages_nl.js +++ b/src/localization/messages_nl.js @@ -30,5 +30,45 @@ $.extend( $.validator.messages, { postalcodeNL: "Vul hier een geldige postcode in.", bankaccountNL: "Vul hier een geldig bankrekeningnummer in.", giroaccountNL: "Vul hier een geldig gironummer in.", - bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in." + bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in.", + + maxWords: $.validator.format( "Vul hier maximaal {0} woorden in." ), + minWords: $.validator.format( "Vul hier minimaal {0} woorden in." ), + rangeWords: $.validator.format( "Vul hier tussen {0} en {1} woorden in." ), + accept: "Vul hier een waarde in met een geldig MIME-type.", + alphanumeric: "Vul hier alleen letters, cijfers of underscores in.", + bic: "Vul hier een geldige BIC-code in.", + creditcardtypes: "Vul hier een geldig creditcardnummer in.", + currency: "Vul hier een geldige valuta in.", + integer: "Vul hier een geheel getal in.", + ipv4: "Vul hier een geldig IPv4-adres in.", + ipv6: "Vul hier een geldig IPv6-adres in.", + lettersonly: "Vul hier alleen letters in.", + letterswithbasicpunc: "Vul hier alleen letters of leestekens in.", + netmask: "Vul hier een geldig netmasker in.", + notEqualTo: "Vul hier een andere waarde in. De waarden mogen niet gelijk zijn.", + nowhitespace: "Spaties zijn niet toegestaan.", + pattern: "Ongeldig formaat.", + require_from_group: $.validator.format( "Vul minimaal {0} van deze velden in." ), + skip_or_fill_minimum: $.validator.format( "Sla deze velden over of vul er minimaal {0} van in." ), + strippedminlength: $.validator.format( "Vul hier minimaal {0} tekens in." ), + time: "Vul hier een geldige tijd in tussen 00:00 en 23:59.", + time12h: "Vul hier een geldige tijd in (12-uursnotatie).", + cifES: "Vul hier een geldig CIF-nummer in.", + cpfBR: "Vul hier een geldig CPF-nummer in.", + mobileUK: "Vul hier een geldig Brits mobiel nummer in.", + nieES: "Vul hier een geldig NIE-nummer in.", + nifES: "Vul hier een geldig NIF-nummer in.", + nipPL: "Vul hier een geldig NIP-nummer in.", + phonesUK: "Vul hier een geldig Brits telefoonnummer in.", + phoneUK: "Vul hier een geldig Brits telefoonnummer in.", + phoneUS: "Vul hier een geldig Amerikaans telefoonnummer in.", + postalcodeBR: "Vul hier een geldige Braziliaanse postcode in.", + postalCodeCA: "Vul hier een geldige Canadese postcode in.", + postalcodeIT: "Vul hier een geldige Italiaanse postcode in.", + postcodeUK: "Vul hier een geldige Britse postcode in.", + stateUS: "Vul hier een geldige Amerikaanse staat in.", + vinUS: "Het opgegeven voertuigidentificatienummer (VIN) is ongeldig.", + zipcodeUS: "De opgegeven Amerikaanse postcode is ongeldig.", + ziprange: "Uw postcode moet binnen het bereik 902xx-xxxx tot 905xx-xxxx liggen." } ); diff --git a/test/custom-elements.js b/test/custom-elements.js new file mode 100644 index 000000000..7a4afc327 --- /dev/null +++ b/test/custom-elements.js @@ -0,0 +1,17 @@ +class CustomTextElement extends HTMLElement { + static formAssociated = true; + static observedAttributes = ["name", "id"]; + + constructor() { + super(); + this.internals_ = this.attachInternals(); + } + get form() { + return this.internals_ != null ? this.internals_.form : null; + } + get name() { + return this.getAttribute("name"); + } +} + +window.customElements.define("custom-text", CustomTextElement); diff --git a/test/index.html b/test/index.html index 601f6a505..e23e52dfc 100644 --- a/test/index.html +++ b/test/index.html @@ -11,6 +11,7 @@ + @@ -472,6 +473,9 @@
+