diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..978bc43f5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [staabm, Arkni] diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 478023c77..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,23 +0,0 @@ - - -### Subject of the issue - - -### Your environment -* version of `jquery-validate`: -* which browser and its version: - -### Steps to reproduce - - -### Expected behaviour - - -### Actual behaviour - diff --git a/.github/ISSUE_TEMPLATE/01_bug_report.md b/.github/ISSUE_TEMPLATE/01_bug_report.md new file mode 100644 index 000000000..e0a6968ea --- /dev/null +++ b/.github/ISSUE_TEMPLATE/01_bug_report.md @@ -0,0 +1,25 @@ +--- +name: Bug report +about: Report something that's broken. Please ensure that you're using the latest version. +labels: ["Type: Bug", "Status: Unverified"] + +--- + +## Your environment +* Version of `jquery-validate`: +* Browser name and version: + +## Current behavior + + + +## Expected behavior + + + +## Live demo + + diff --git a/.github/ISSUE_TEMPLATE/02_feature_request.md b/.github/ISSUE_TEMPLATE/02_feature_request.md new file mode 100644 index 000000000..03feaaf61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/02_feature_request.md @@ -0,0 +1,18 @@ +--- +name: Feature request +about: Wouldn't it be nice if jquery-validate could ... +labels: ["Type: Feature"] + +--- + +## New feature motivation + + + +## New feature description + + + +## New feature implementation + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..ff16301d5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Support Questions & Other + url: https://stackoverflow.com/questions/ask?tags=jquery-validate + about: 'This repository is only for reporting bugs. If you have a question or need help using the library, click:' + - name: Documentation issue + url: https://github.com/jquery-validation/validation-content + about: For documentation issues, open a pull request at the jquery-validation/validation-content repository diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index c6fd0c20b..000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,24 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 60 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - bug - - "help wanted" - - "MERGE ME" - - "NEEDS REVIEW" -# Ignore issues in a milestone -exemptMilestones: true -# Label to use when marking an issue as stale -staleLabel: stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue/proposal has been automatically marked as idle and stale because it hasn't - had any recent activity. It will be automtically closed if no further activity - occurs. If you think this is wrong, or the problem still persists, just pop - a reply in the comments and one of the maintainers will (try!) to follow up. - - Thank you for contributing :) -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..7b3883f6f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,18 @@ +name: ci + +on: + push: + pull_request: + +jobs: + linux_tests: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Run tests + run: npm install diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..7ef364fb7 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,72 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ "master" ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "master" ] + schedule: + - cron: '19 23 * * 1' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 000000000..6332ce773 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,39 @@ +# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. +# +# You can adjust the behavior by modifying this file. +# For more information, see: +# https://github.com/actions/stale +name: Mark stale issues and pull requests + +on: + schedule: + - cron: '10 05 * * *' + +jobs: + stale: + + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + + steps: + - uses: actions/stale@v5 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: > + This issue lacks verification. Please provide a reproduction link. + + Thank you for contributing :) + stale-pr-message: > + This issue/proposal has been automatically marked as idle and stale because it hasn't + had any recent activity. It will be automatically closed if no further activity + occurs. If you think this is wrong, or the problem still persists, just pop + a reply in the comments and one of the maintainers will (try!) to follow up. + + Thank you for contributing :) + stale-issue-label: 'stale' + stale-pr-label: 'stale' + exempt-all-milestones: true + 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/.travis.yml b/.travis.yml deleted file mode 100644 index e328e33da..000000000 --- a/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: node_js -node_js: - - 6 - -sudo: false - -install: - - npm install - -cache: - directories: - - node_modules diff --git a/Gruntfile.js b/Gruntfile.js index c5fe1df1e..2f4e3ea6c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -107,6 +107,7 @@ grunt.initConfig( { "Gruntfile.js", "lib/**/*.*", "package.json", + "LICENSE.md", "README.md", "src/**/*.*", "test/**/*.*" @@ -114,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/README.md b/README.md index f02786c1c..1515afe5f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ================================ [](https://github.com/jquery-validation/jquery-validation/releases/latest) -[](https://travis-ci.org/jquery-validation/jquery-validation) +[](https://github.com/jquery-validation/jquery-validation/actions/workflows/ci.yml) [](https://david-dm.org/jquery-validation/jquery-validation#info=devDependencies) [](https://www.jsdelivr.com/package/npm/jquery-validation) @@ -73,6 +73,27 @@ $("#myForm").validate({ }); ``` +## Accessibility +For an invalid field, the default output for the jQuery Validation Plugin is an error message in a `
diff --git a/package.json b/package.json index 3ad550d54..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.19.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/additional/alphanumeric.js b/src/additional/alphanumeric.js index 79e54e0a1..50790d61a 100644 --- a/src/additional/alphanumeric.js +++ b/src/additional/alphanumeric.js @@ -1,3 +1,3 @@ $.validator.addMethod( "alphanumeric", function( value, element ) { return this.optional( element ) || /^\w+$/i.test( value ); -}, "Letters, numbers, and underscores only please" ); +}, "Letters, numbers, and underscores only please." ); diff --git a/src/additional/bankaccountNL.js b/src/additional/bankaccountNL.js index 1671f4980..d9a0d234f 100644 --- a/src/additional/bankaccountNL.js +++ b/src/additional/bankaccountNL.js @@ -23,4 +23,4 @@ $.validator.addMethod( "bankaccountNL", function( value, element ) { sum = sum + factor * digit; } return sum % 11 === 0; -}, "Please specify a valid bank account number" ); +}, "Please specify a valid bank account number." ); diff --git a/src/additional/bankorgiroaccountNL.js b/src/additional/bankorgiroaccountNL.js index b224f45b1..17eec5335 100644 --- a/src/additional/bankorgiroaccountNL.js +++ b/src/additional/bankorgiroaccountNL.js @@ -2,4 +2,4 @@ $.validator.addMethod( "bankorgiroaccountNL", function( value, element ) { return this.optional( element ) || ( $.validator.methods.bankaccountNL.call( this, value, element ) ) || ( $.validator.methods.giroaccountNL.call( this, value, element ) ); -}, "Please specify a valid bank or giro account number" ); +}, "Please specify a valid bank or giro account number." ); diff --git a/src/additional/bic.js b/src/additional/bic.js index 49f137fa5..4f65c59b5 100644 --- a/src/additional/bic.js +++ b/src/additional/bic.js @@ -15,4 +15,4 @@ */ $.validator.addMethod( "bic", function( value, element ) { return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() ); -}, "Please specify a valid BIC code" ); +}, "Please specify a valid BIC code." ); diff --git a/src/additional/cnhBR.js b/src/additional/cnhBR.js index 67ea7965a..92e45e779 100644 --- a/src/additional/cnhBR.js +++ b/src/additional/cnhBR.js @@ -46,4 +46,4 @@ $.validator.addMethod( "cnhBR", function( value ) { return ( String( firstCN ).concat( secondCN ) === value.substr( -2 ) ); -}, "Please specify a valid CNH number" ); +}, "Please specify a valid CNH number." ); diff --git a/src/additional/cnpjBR.js b/src/additional/cnpjBR.js index 43e3bfcf6..cbe89adb3 100644 --- a/src/additional/cnpjBR.js +++ b/src/additional/cnpjBR.js @@ -71,4 +71,4 @@ $.validator.addMethod( "cnpjBR", function( value, element ) { return true; -}, "Please specify a CNPJ value number" ); +}, "Please specify a CNPJ value number." ); diff --git a/src/additional/cpfBR.js b/src/additional/cpfBR.js index a2b1611b3..78e0da2d8 100644 --- a/src/additional/cpfBR.js +++ b/src/additional/cpfBR.js @@ -62,4 +62,4 @@ $.validator.addMethod( "cpfBR", function( value, element ) { } return false; -}, "Please specify a valid CPF number" ); +}, "Please specify a valid CPF number." ); diff --git a/src/additional/currency.js b/src/additional/currency.js index 76197df5a..d593790e3 100644 --- a/src/additional/currency.js +++ b/src/additional/currency.js @@ -38,4 +38,4 @@ $.validator.addMethod( "currency", function( value, element, param ) { regex = new RegExp( regex ); return this.optional( element ) || regex.test( value ); -}, "Please specify a valid currency" ); +}, "Please specify a valid currency." ); diff --git a/src/additional/giroaccountNL.js b/src/additional/giroaccountNL.js index 0cfd04cd6..26ea14fba 100644 --- a/src/additional/giroaccountNL.js +++ b/src/additional/giroaccountNL.js @@ -3,4 +3,4 @@ */ $.validator.addMethod( "giroaccountNL", function( value, element ) { return this.optional( element ) || /^[0-9]{1,7}$/.test( value ); -}, "Please specify a valid giro account number" ); +}, "Please specify a valid giro account number." ); diff --git a/src/additional/iban.js b/src/additional/iban.js index 0a2bfbeec..94c610d8f 100644 --- a/src/additional/iban.js +++ b/src/additional/iban.js @@ -133,4 +133,4 @@ $.validator.addMethod( "iban", function( value, element ) { cRest = cOperator % 97; } return cRest === 1; -}, "Please specify a valid IBAN" ); +}, "Please specify a valid IBAN." ); diff --git a/src/additional/integer.js b/src/additional/integer.js index 779431d72..ad0dab2fa 100644 --- a/src/additional/integer.js +++ b/src/additional/integer.js @@ -1,3 +1,3 @@ $.validator.addMethod( "integer", function( value, element ) { return this.optional( element ) || /^-?\d+$/.test( value ); -}, "A positive or negative non-decimal number please" ); +}, "A positive or negative non-decimal number please." ); diff --git a/src/additional/lettersonly.js b/src/additional/lettersonly.js index 893b487a8..82857661b 100644 --- a/src/additional/lettersonly.js +++ b/src/additional/lettersonly.js @@ -1,3 +1,3 @@ $.validator.addMethod( "lettersonly", function( value, element ) { return this.optional( element ) || /^[a-z]+$/i.test( value ); -}, "Letters only please" ); +}, "Letters only please." ); diff --git a/src/additional/letterswithbasicpunc.js b/src/additional/letterswithbasicpunc.js index 9bbb4d9d9..0e90c0555 100644 --- a/src/additional/letterswithbasicpunc.js +++ b/src/additional/letterswithbasicpunc.js @@ -1,3 +1,3 @@ $.validator.addMethod( "letterswithbasicpunc", function( value, element ) { return this.optional( element ) || /^[a-z\-.,()'"\s]+$/i.test( value ); -}, "Letters or punctuation only please" ); +}, "Letters or punctuation only please." ); diff --git a/src/additional/mobileNL.js b/src/additional/mobileNL.js index 3f1f45a75..12092e2ea 100644 --- a/src/additional/mobileNL.js +++ b/src/additional/mobileNL.js @@ -1,3 +1,3 @@ $.validator.addMethod( "mobileNL", function( value, element ) { return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test( value ); -}, "Please specify a valid mobile number" ); +}, "Please specify a valid mobile number." ); diff --git a/src/additional/mobileRU.js b/src/additional/mobileRU.js index 7006d09b4..c135be752 100644 --- a/src/additional/mobileRU.js +++ b/src/additional/mobileRU.js @@ -1,4 +1,4 @@ $.validator.addMethod( "mobileRU", function( phone_number, element ) { var ruPhone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); return this.optional( element ) || ruPhone_number.length > 9 && /^((\+7|7|8)+([0-9]){10})$/.test( ruPhone_number ); -}, "Please specify a valid mobile number" ); +}, "Please specify a valid mobile number." ); diff --git a/src/additional/mobileUK.js b/src/additional/mobileUK.js index e1c5ce3b2..e2d02ae9b 100644 --- a/src/additional/mobileUK.js +++ b/src/additional/mobileUK.js @@ -10,4 +10,4 @@ $.validator.addMethod( "mobileUK", function( phone_number, element ) { phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); return this.optional( element ) || phone_number.length > 9 && phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ ); -}, "Please specify a valid mobile number" ); +}, "Please specify a valid mobile number." ); diff --git a/src/additional/nisBR.js b/src/additional/nisBR.js index 7a685d1cb..3d305787d 100644 --- a/src/additional/nisBR.js +++ b/src/additional/nisBR.js @@ -54,4 +54,4 @@ $.validator.addMethod( "nisBR", function( value ) { } else { return false; } -}, "Please specify a valid NIS/PIS number" ); +}, "Please specify a valid NIS/PIS number." ); diff --git a/src/additional/nowhitespace.js b/src/additional/nowhitespace.js index 7f6c3bd43..86a3b9703 100644 --- a/src/additional/nowhitespace.js +++ b/src/additional/nowhitespace.js @@ -1,3 +1,3 @@ $.validator.addMethod( "nowhitespace", function( value, element ) { return this.optional( element ) || /^\S+$/i.test( value ); -}, "No white space please" ); +}, "No white space please." ); diff --git a/src/additional/phonePL.js b/src/additional/phonePL.js index cca314df4..f62f5fcb3 100644 --- a/src/additional/phonePL.js +++ b/src/additional/phonePL.js @@ -20,4 +20,4 @@ $.validator.addMethod( "phonePL", function( phone_number, element ) { phone_number = phone_number.replace( /\s+/g, "" ); var regexp = /^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/; return this.optional( element ) || regexp.test( phone_number ); -}, "Please specify a valid phone number" ); +}, "Please specify a valid phone number." ); diff --git a/src/additional/phoneUK.js b/src/additional/phoneUK.js index b97866f09..af53bf1f6 100644 --- a/src/additional/phoneUK.js +++ b/src/additional/phoneUK.js @@ -10,4 +10,4 @@ $.validator.addMethod( "phoneUK", function( phone_number, element ) { phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); return this.optional( element ) || phone_number.length > 9 && phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/ ); -}, "Please specify a valid phone number" ); +}, "Please specify a valid phone number." ); diff --git a/src/additional/phoneUS.js b/src/additional/phoneUS.js index 894a25c67..ed1c3d2fd 100644 --- a/src/additional/phoneUS.js +++ b/src/additional/phoneUS.js @@ -18,4 +18,4 @@ $.validator.addMethod( "phoneUS", function( phone_number, element ) { phone_number = phone_number.replace( /\s+/g, "" ); return this.optional( element ) || phone_number.length > 9 && phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/ ); -}, "Please specify a valid phone number" ); +}, "Please specify a valid phone number." ); diff --git a/src/additional/phonesUK.js b/src/additional/phonesUK.js index fa04167d5..e5678d612 100644 --- a/src/additional/phonesUK.js +++ b/src/additional/phonesUK.js @@ -12,4 +12,4 @@ $.validator.addMethod( "phonesUK", function( phone_number, element ) { phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" ); return this.optional( element ) || phone_number.length > 9 && phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ ); -}, "Please specify a valid uk phone number" ); +}, "Please specify a valid uk phone number." ); diff --git a/src/additional/postalCodeCA.js b/src/additional/postalCodeCA.js index ba3bb4a4e..7082d967e 100644 --- a/src/additional/postalCodeCA.js +++ b/src/additional/postalCodeCA.js @@ -13,4 +13,4 @@ */ $.validator.addMethod( "postalCodeCA", function( value, element ) { return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value ); -}, "Please specify a valid postal code" ); +}, "Please specify a valid postal code." ); diff --git a/src/additional/postalcodeIT.js b/src/additional/postalcodeIT.js index 38ea89d2b..a229956e6 100644 --- a/src/additional/postalcodeIT.js +++ b/src/additional/postalcodeIT.js @@ -1,4 +1,4 @@ /* Matches Italian postcode (CAP) */ $.validator.addMethod( "postalcodeIT", function( value, element ) { return this.optional( element ) || /^\d{5}$/.test( value ); -}, "Please specify a valid postal code" ); +}, "Please specify a valid postal code." ); diff --git a/src/additional/postalcodeNL.js b/src/additional/postalcodeNL.js index 38a547623..78707fd39 100644 --- a/src/additional/postalcodeNL.js +++ b/src/additional/postalcodeNL.js @@ -1,3 +1,3 @@ $.validator.addMethod( "postalcodeNL", function( value, element ) { return this.optional( element ) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test( value ); -}, "Please specify a valid postal code" ); +}, "Please specify a valid postal code." ); diff --git a/src/additional/postcodeUK.js b/src/additional/postcodeUK.js index 26a4743c8..b5d2618a8 100644 --- a/src/additional/postcodeUK.js +++ b/src/additional/postcodeUK.js @@ -1,4 +1,4 @@ // Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK) $.validator.addMethod( "postcodeUK", function( value, element ) { return this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test( value ); -}, "Please specify a valid UK postcode" ); +}, "Please specify a valid UK postcode." ); diff --git a/src/additional/statesUS.js b/src/additional/statesUS.js index 015894f3b..b26c33743 100644 --- a/src/additional/statesUS.js +++ b/src/additional/statesUS.js @@ -51,4 +51,4 @@ $.validator.addMethod( "stateUS", function( value, element, options ) { regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" ); return this.optional( element ) || regex.test( value ); -}, "Please specify a valid state" ); +}, "Please specify a valid state." ); diff --git a/src/additional/strippedminlength.js b/src/additional/strippedminlength.js index e5bf73434..0b7006deb 100644 --- a/src/additional/strippedminlength.js +++ b/src/additional/strippedminlength.js @@ -1,4 +1,4 @@ // TODO check if value starts with <, otherwise don't try stripping anything $.validator.addMethod( "strippedminlength", function( value, element, param ) { return $( value ).text().length >= param; -}, $.validator.format( "Please enter at least {0} characters" ) ); +}, $.validator.format( "Please enter at least {0} characters." ) ); diff --git a/src/additional/time.js b/src/additional/time.js index 2bcbce13e..82c9806d0 100644 --- a/src/additional/time.js +++ b/src/additional/time.js @@ -1,3 +1,3 @@ $.validator.addMethod( "time", function( value, element ) { return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value ); -}, "Please enter a valid time, between 00:00 and 23:59" ); +}, "Please enter a valid time, between 00:00 and 23:59." ); diff --git a/src/additional/time12h.js b/src/additional/time12h.js index fcd3fa288..402e4d2da 100644 --- a/src/additional/time12h.js +++ b/src/additional/time12h.js @@ -1,3 +1,3 @@ $.validator.addMethod( "time12h", function( value, element ) { return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value ); -}, "Please enter a valid time in 12-hour am/pm format" ); +}, "Please enter a valid time in 12-hour am/pm format." ); diff --git a/src/additional/url2.js b/src/additional/url2.js index 2baaf617f..e7c8f42df 100644 --- a/src/additional/url2.js +++ b/src/additional/url2.js @@ -1,4 +1,4 @@ // Same as url, but TLD is optional $.validator.addMethod( "url2", function( value, element ) { - return this.optional( element ) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value ); + return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?)|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff])|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62}\.)))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value ); }, $.validator.messages.url ); diff --git a/src/additional/vinUS.js b/src/additional/vinUS.js index 15460d725..3fd2d128b 100644 --- a/src/additional/vinUS.js +++ b/src/additional/vinUS.js @@ -11,44 +11,37 @@ * @cat Plugins/Validate/Methods */ $.validator.addMethod( "vinUS", function( v ) { - if ( v.length !== 17 ) { - return false; - } + if ( v.length !== 17 ) { + return false; + } - var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ], - VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ], - FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ], - rs = 0, - i, n, d, f, cd, cdv; + var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ], + VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ], + FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ], + rs = 0, + i, n, d, f, cd, cdv; - for ( i = 0; i < 17; i++ ) { - f = FL[ i ]; - d = v.slice( i, i + 1 ); - if ( i === 8 ) { - cdv = d; - } - if ( !isNaN( d ) ) { - d *= f; - } else { - for ( n = 0; n < LL.length; n++ ) { - if ( d.toUpperCase() === LL[ n ] ) { - d = VL[ n ]; - d *= f; - if ( isNaN( cdv ) && n === 8 ) { - cdv = LL[ n ]; - } - break; - } - } - } - rs += d; - } - cd = rs % 11; - if ( cd === 10 ) { - cd = "X"; - } - if ( cd === cdv ) { - return true; - } - return false; + for ( i = 0; i < 17; i++ ) { + f = FL[ i ]; + d = v.slice( i, i + 1 ); + if ( isNaN( d ) ) { + d = d.toUpperCase(); + n = VL[ LL.indexOf( d ) ]; + } else { + n = parseInt( d, 10 ); + } + if ( i === 8 ) + { + cdv = n; + if ( d === "X" ) { + cdv = 10; + } + } + rs += n * f; + } + cd = rs % 11; + if ( cd === cdv ) { + return true; + } + return false; }, "The specified vehicle identification number (VIN) is invalid." ); diff --git a/src/additional/zipcodeUS.js b/src/additional/zipcodeUS.js index 8d52ac0b5..15c85dd58 100644 --- a/src/additional/zipcodeUS.js +++ b/src/additional/zipcodeUS.js @@ -1,3 +1,3 @@ $.validator.addMethod( "zipcodeUS", function( value, element ) { return this.optional( element ) || /^\d{5}(-\d{4})?$/.test( value ); -}, "The specified US ZIP Code is invalid" ); +}, "The specified US ZIP Code is invalid." ); diff --git a/src/additional/ziprange.js b/src/additional/ziprange.js index 48dc6836d..7e501d5b1 100644 --- a/src/additional/ziprange.js +++ b/src/additional/ziprange.js @@ -1,3 +1,3 @@ $.validator.addMethod( "ziprange", function( value, element ) { return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value ); -}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx" ); +}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx." ); diff --git a/src/ajax.js b/src/ajax.js index fb56de4b3..5f87bed20 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -1,5 +1,6 @@ // Ajax mode: abort // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); +// $.ajaxAbort( port ); // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() var pendingRequests = {}, @@ -10,9 +11,7 @@ if ( $.ajaxPrefilter ) { $.ajaxPrefilter( function( settings, _, xhr ) { var port = settings.port; if ( settings.mode === "abort" ) { - if ( pendingRequests[ port ] ) { - pendingRequests[ port ].abort(); - } + $.ajaxAbort( port ); pendingRequests[ port ] = xhr; } } ); @@ -24,12 +23,18 @@ if ( $.ajaxPrefilter ) { var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, port = ( "port" in settings ? settings : $.ajaxSettings ).port; if ( mode === "abort" ) { - if ( pendingRequests[ port ] ) { - pendingRequests[ port ].abort(); - } + $.ajaxAbort( port ); pendingRequests[ port ] = ajax.apply( this, arguments ); return pendingRequests[ port ]; } return ajax.apply( this, arguments ); }; } + +// Abort the previous request without sending a new one +$.ajaxAbort = function( port ) { + if ( pendingRequests[ port ] ) { + pendingRequests[ port ].abort(); + delete pendingRequests[ port ]; + } +}; diff --git a/src/core.js b/src/core.js index ccb8d4cbe..240e2737b 100644 --- a/src/core.js +++ b/src/core.js @@ -198,18 +198,25 @@ $.extend( $.fn, { } } ); +// JQuery trim is deprecated, provide a trim method based on String.prototype.trim +var trim = function( str ) { + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim#Polyfill + return str.replace( /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "" ); +}; + // Custom selectors $.extend( $.expr.pseudos || $.expr[ ":" ], { // '|| $.expr[ ":" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support // https://jqueryvalidation.org/blank-selector/ blank: function( a ) { - return !$.trim( "" + $( a ).val() ); + return !trim( "" + $( a ).val() ); }, // https://jqueryvalidation.org/filled-selector/ filled: function( a ) { var val = $( a ).val(); - return val !== null && !!$.trim( "" + val ); + return val !== null && !!trim( "" + val ); }, // https://jqueryvalidation.org/unchecked-selector/ @@ -268,6 +275,7 @@ $.extend( $.validator, { onsubmit: true, ignore: ":hidden", ignoreTitle: false, + customElements: [], onfocusin: function( element ) { this.lastActive = element; @@ -415,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 ); @@ -622,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() { @@ -749,6 +758,9 @@ $.extend( $.validator, { val = this.elementValue( element ), result, method, rule, normalizer; + // Abort any pending Ajax request from a previous call to this method. + this.abortRequest( element ); + // Prioritize the local normalizer defined for this element over the global one // if the former exists, otherwise user the global one in case it exists. if ( typeof rules.normalizer === "function" ) { @@ -935,14 +947,23 @@ $.extend( $.validator, { error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); // Replace message on existing label - error.html( message ); + if ( this.settings && this.settings.escapeHtml ) { + error.text( message || "" ); + } else { + error.html( message || "" ); + } } else { // Create error element error = $( "<" + this.settings.errorElement + ">" ) .attr( "id", elementID + "-error" ) - .addClass( this.settings.errorClass ) - .html( message || "" ); + .addClass( this.settings.errorClass ); + + if ( this.settings && this.settings.escapeHtml ) { + error.text( message || "" ); + } else { + error.html( message || "" ); + } // Maintain reference to the element to be placed into the DOM place = error; @@ -1025,6 +1046,10 @@ $.extend( $.validator, { // meta-characters that should be escaped in order to be used with JQuery // as a literal part of a name/id or any selector. escapeCssMeta: function( string ) { + if ( string === undefined ) { + return ""; + } + return string.replace( /([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g, "\\$1" ); }, @@ -1084,6 +1109,10 @@ $.extend( $.validator, { return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch"; }, + elementAjaxPort: function( element ) { + return "validate" + element.name; + }, + startRequest: function( element ) { if ( !this.pending[ element.name ] ) { this.pendingRequest++; @@ -1101,8 +1130,8 @@ $.extend( $.validator, { } delete this.pending[ element.name ]; $( element ).removeClass( this.settings.pendingClass ); - if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { - $( this.currentForm ).submit(); + if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() && this.pendingRequest === 0 ) { + $( this.currentForm ).trigger( "submit" ); // Remove the hidden input that was used as a replacement for the // missing submit button. The hidden input is added by `handle()` @@ -1119,6 +1148,25 @@ $.extend( $.validator, { } }, + abortRequest: function( element ) { + var port; + + if ( this.pending[ element.name ] ) { + port = this.elementAjaxPort( element ); + $.ajaxAbort( port ); + + this.pendingRequest--; + + // Sometimes synchronization fails, make sure pendingRequest is never < 0 + if ( this.pendingRequest < 0 ) { + this.pendingRequest = 0; + } + + delete this.pending[ element.name ]; + $( element ).removeClass( this.settings.pendingClass ); + } + }, + previousValue: function( element, method ) { method = typeof method === "string" && method || "remote"; @@ -1207,7 +1255,7 @@ $.extend( $.validator, { // Exception: the jquery validate 'range' method // does not test for the html5 'range' type - rules[ method ] = true; + rules[ type === "date" ? "dateISO" : method ] = true; } }, @@ -1306,7 +1354,7 @@ $.extend( $.validator, { // Evaluate parameters $.each( rules, function( rule, parameter ) { - rules[ rule ] = $.isFunction( parameter ) && rule !== "normalizer" ? parameter( element ) : parameter; + rules[ rule ] = typeof parameter === "function" && rule !== "normalizer" ? parameter( element ) : parameter; } ); // Clean number parameters @@ -1318,7 +1366,7 @@ $.extend( $.validator, { $.each( [ "rangelength", "range" ], function() { var parts; if ( rules[ this ] ) { - if ( $.isArray( rules[ this ] ) ) { + if ( Array.isArray( rules[ this ] ) ) { rules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ]; } else if ( typeof rules[ this ] === "string" ) { parts = rules[ this ].replace( /[\[\]]/g, "" ).split( /[\s,]+/ ); @@ -1405,7 +1453,7 @@ $.extend( $.validator, { // https://gist.github.com/dperini/729294 // see also https://mathiasbynens.be/demo/url-regex // modified to allow protocol-relative URLs - return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value ); + return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value ); }, // https://jqueryvalidation.org/date-method/ @@ -1437,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/ @@ -1447,19 +1495,19 @@ $.extend( $.validator, { // https://jqueryvalidation.org/minlength-method/ minlength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength( value, element ); + var length = Array.isArray( value ) ? value.length : this.getLength( value, element ); return this.optional( element ) || length >= param; }, // https://jqueryvalidation.org/maxlength-method/ maxlength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength( value, element ); + var length = Array.isArray( value ) ? value.length : this.getLength( value, element ); return this.optional( element ) || length <= param; }, // https://jqueryvalidation.org/rangelength-method/ rangelength: function( value, element, param ) { - var length = $.isArray( value ) ? value.length : this.getLength( value, element ); + var length = Array.isArray( value ) ? value.length : this.getLength( value, element ); return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] ); }, @@ -1548,18 +1596,19 @@ $.extend( $.validator, { param = typeof param === "string" && { url: param } || param; optionDataString = $.param( $.extend( { data: value }, param.data ) ); - if ( previous.old === optionDataString ) { + if ( previous.valid !== null && previous.old === optionDataString ) { return previous.valid; } previous.old = optionDataString; + previous.valid = null; validator = this; this.startRequest( element ); data = {}; data[ element.name ] = value; $.ajax( $.extend( true, { mode: "abort", - port: "validate" + element.name, + port: this.elementAjaxPort( element ), dataType: "json", data: data, context: validator.currentForm, @@ -1570,7 +1619,6 @@ $.extend( $.validator, { validator.settings.messages[ element.name ][ method ] = previous.originalMessage; if ( valid ) { submitted = validator.formSubmitted; - validator.resetInternals(); validator.toHide = validator.errorsFor( element ); validator.formSubmitted = submitted; validator.successList.push( element ); diff --git a/src/localization/messages_ar.js b/src/localization/messages_ar.js index dad165e58..d6e1433b1 100644 --- a/src/localization/messages_ar.js +++ b/src/localization/messages_ar.js @@ -19,5 +19,34 @@ $.extend( $.validator.messages, { rangelength: $.validator.format( "عدد الحروف يجب أن يكون بين {0} و {1}" ), range: $.validator.format( "رجاء إدخال عدد قيمته بين {0} و {1}" ), max: $.validator.format( "رجاء إدخال عدد أقل من أو يساوي {0}" ), - min: $.validator.format( "رجاء إدخال عدد أكبر من أو يساوي {0}" ) + min: $.validator.format( "رجاء إدخال عدد أكبر من أو يساوي {0}" ), + step: $.validator.format( "يرجى تقديم قيمة من مضاعفات {0}" ), + maxWords: $.validator.format( "يرجى تقديم ما لا يزيد عن {0} كلمات" ), + minWords: $.validator.format( "يرجى تقديم {0} كلمات على الأقل" ), + rangeWords: $.validator.format( "يرجى تقديم ما بين {0} و{1} كلمة" ), + letterswithbasicpunc: "يرجى تقديم الحروف وعلامات الترقيم فقط", + alphanumeric: "يرجى تقديم الحروف والأرقام والمسافات والتسطير فقط", + lettersonly: "يرجى تقديم الحروف فقط", + nowhitespace: "من فضلك لا تدخل المساحات البيضاء", + ziprange: "يرجى تقديم الرمز البريدي بين 902xx-xxxx و905-xx-xxxx", + integer: "يرجى تقديم رقم غير عشري موجب أو سالب", + vinUS: "يرجى تقديم رقم تعريف المركبة (VIN)", + dateITA: "يرجى تقديم تاريخ صالح", + time: "يرجى تقديم وقت صالح بين 00:00 و23:59", + phoneUS: "الرجاء تقديم رقم هاتف صالح", + phoneUK: "الرجاء تقديم رقم هاتف صالح", + mobileUK: "يرجى تقديم رقم هاتف محمول صالح", + strippedminlength: $.validator.format( "يرجى تقديم {0} حرفًا على الأقل" ), + email2: "يرجى تقديم عنوان بريد إلكتروني صالح", + url2: "يرجى إدخال عنوان بريد إلكتروني صحيح", + creditcardtypes: "يرجى تقديم رقم بطاقة ائتمان صالح", + currency: "يرجى تقديم عملة صالحة", + ipv4: "يرجى تقديم عنوان IP v4 صالح", + ipv6: "يرجى تقديم عنوان IP v6 صالح", + require_from_group: $.validator.format( "يرجى تقديم ما لا يقل عن {0} من هذه الحقول" ), + nifES: "يرجى تقديم رقم TIN صالح", + nieES: "يرجى تقديم رقم NIE صالح", + cifES: "يرجى تقديم رقم CIF صالح", + postalCodeCA: "يرجى تقديم رمز بريدي صالح", + pattern: "التنسيق غير صالح" } ); diff --git a/src/localization/messages_az.js b/src/localization/messages_az.js index 61956a2d4..f629c8080 100644 --- a/src/localization/messages_az.js +++ b/src/localization/messages_az.js @@ -19,5 +19,5 @@ $.extend( $.validator.messages, { rangelength: $.validator.format( "Zəhmət olmasa, {0} - {1} aralığında uzunluğa malik simvol daxil edin." ), range: $.validator.format( "Zəhmət olmasa, {0} - {1} aralığında rəqəm daxil edin." ), max: $.validator.format( "Zəhmət olmasa, {0} və ondan kiçik rəqəm daxil edin." ), - min: $.validator.format( "Zəhmət olmasa, {0} və ondan böyük rəqəm daxil edin" ) + min: $.validator.format( "Zəhmət olmasa, {0} və ondan böyük rəqəm daxil edin." ) } ); diff --git a/src/localization/messages_ca.js b/src/localization/messages_ca.js index 2d650bc86..0c9184ac8 100644 --- a/src/localization/messages_ca.js +++ b/src/localization/messages_ca.js @@ -5,7 +5,7 @@ $.extend( $.validator.messages, { required: "Aquest camp és obligatori.", remote: "Si us plau, omple aquest camp.", - email: "Si us plau, escriu una adreça de correu-e vàlida", + email: "Si us plau, escriu una adreça de correu-e vàlida.", url: "Si us plau, escriu una URL vàlida.", date: "Si us plau, escriu una data vàlida.", dateISO: "Si us plau, escriu una data (ISO) vàlida.", diff --git a/src/localization/messages_da.js b/src/localization/messages_da.js index 4c0efcc1b..b41079412 100644 --- a/src/localization/messages_da.js +++ b/src/localization/messages_da.js @@ -4,7 +4,7 @@ */ $.extend( $.validator.messages, { required: "Dette felt er påkrævet.", - remote: "Ret venligst dette felt", + remote: "Ret venligst dette felt.", email: "Indtast en gyldig email-adresse.", url: "Indtast en gyldig URL.", date: "Indtast en gyldig dato.", @@ -16,18 +16,18 @@ $.extend( $.validator.messages, { ipv4: "Angiv venligst en gyldig IPv4-adresse.", ipv6: "Angiv venligst en gyldig IPv6-adresse.", require_from_group: $.validator.format( "Angiv mindst {0} af disse felter." ), - extension: "Indtast venligst en værdi med en gyldig endelse", - pattern: "Ugyldigt format", + extension: "Indtast venligst en værdi med en gyldig endelse.", + pattern: "Ugyldigt format.", lettersonly: "Angiv venligst kun bogstaver.", - nowhitespace: "Må ikke indholde mellemrum", + nowhitespace: "Må ikke indholde mellemrum.", maxlength: $.validator.format( "Indtast højst {0} tegn." ), minlength: $.validator.format( "Indtast mindst {0} tegn." ), rangelength: $.validator.format( "Indtast mindst {0} og højst {1} tegn." ), range: $.validator.format( "Angiv en værdi mellem {0} og {1}." ), max: $.validator.format( "Angiv en værdi der højst er {0}." ), min: $.validator.format( "Angiv en værdi der mindst er {0}." ), - minWords: $.validator.format( "Indtast venligst mindst {0} ord" ), - maxWords: $.validator.format( "Indtast venligst højst {0} ord" ), + minWords: $.validator.format( "Indtast venligst mindst {0} ord." ), + maxWords: $.validator.format( "Indtast venligst højst {0} ord." ), step: $.validator.format( "Angiv en værdi gange {0}." ), notEqualTo: "Angiv en anden værdi, værdierne må ikke være det samme.", integer: "Angiv et ikke-decimaltal, der er positivt eller negativt." diff --git a/src/localization/messages_fa.js b/src/localization/messages_fa.js index 234687bd7..c323a8119 100644 --- a/src/localization/messages_fa.js +++ b/src/localization/messages_fa.js @@ -14,7 +14,7 @@ $.extend( $.validator.messages, { digits: "لطفا تنها رقم وارد کنید.", creditcard: "لطفا کریدیت کارت صحیح وارد کنید.", equalTo: "لطفا مقدار برابری وارد کنید.", - extension: "لطفا مقداری وارد کنید که", + extension: "لطفا مقداری وارد کنید که.", alphanumeric: "لطفا مقدار را عدد (انگلیسی) وارد کنید.", maxlength: $.validator.format( "لطفا بیشتر از {0} حرف وارد نکنید." ), minlength: $.validator.format( "لطفا کمتر از {0} حرف وارد نکنید." ), diff --git a/src/localization/messages_fr.js b/src/localization/messages_fr.js index 0f804632a..dc23300ad 100644 --- a/src/localization/messages_fr.js +++ b/src/localization/messages_fr.js @@ -41,11 +41,13 @@ $.extend( $.validator.messages, { email2: "Veuillez fournir une adresse électronique valide.", url2: "Veuillez fournir une adresse URL valide.", creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.", + currency: "Veuillez fournir une monnaie valide.", ipv4: "Veuillez fournir une adresse IP v4 valide.", ipv6: "Veuillez fournir une adresse IP v6 valide.", require_from_group: $.validator.format( "Veuillez fournir au moins {0} de ces champs." ), nifES: "Veuillez fournir un numéro NIF valide.", nieES: "Veuillez fournir un numéro NIE valide.", cifES: "Veuillez fournir un numéro CIF valide.", - postalCodeCA: "Veuillez fournir un code postal valide." + postalCodeCA: "Veuillez fournir un code postal valide.", + pattern: "Format non valide." } ); diff --git a/src/localization/messages_ge.js b/src/localization/messages_ge.js index 95c40d4fa..bfcd3f5e1 100644 --- a/src/localization/messages_ge.js +++ b/src/localization/messages_ge.js @@ -4,7 +4,7 @@ * Locale: GE (Georgian; ქართული) */ $.extend( $.validator.messages, { - required: "ეს ველი სავალდებულოა", + required: "ეს ველი სავალდებულოა.", remote: "გთხოვთ შეასწოროთ.", email: "გთხოვთ შეიყვანოთ სწორი ფორმატით.", url: "გთხოვთ შეიყვანოთ სწორი ფორმატით.", diff --git a/src/localization/messages_hi.js b/src/localization/messages_hi.js new file mode 100644 index 000000000..72bf4a149 --- /dev/null +++ b/src/localization/messages_hi.js @@ -0,0 +1,42 @@ +/* + * Translated default messages for the jQuery validation plugin. + * Locale: Hindi; हिंदी + */ +$.extend( $.validator.messages, { + required: "आवश्यक फ़ील्ड।", + remote:"इस फ़ील्ड को जांचें।", + email: "एक वैध ई - मेल पते की प्रविष्टि करें।", + url: "कृपया एक वैध वेब पता दर्ज करें।", + date: "कृपया कोई मान्य दिनांक दर्ज करें।", + dateISO: "कृपया एक मान्य दिनांक (ISO) दर्ज करें।", + number: "कृपया सही अंक दर्ज करें।", + digits: "केवल संख्याएं दर्ज करें।", + creditcard: "कृपया एक वैध क्रेडिट कार्ड नंबर डालें।", + equalTo: "मेल नहीं खाता।", + extension: "कृपया एक मान्य एक्सटेंशन वाला मान दर्ज करें।", + maxlength: $.validator.format( "अधिक दर्ज न करें {0} वर्णों में से" ), + minlength: $.validator.format( "कृपया कम से कम {0} वर्ण दर्ज करें।" ), + rangelength: $.validator.format( "कृपया {0} और {1} वर्णों के बीच एक मान दर्ज करें।" ), + range: $.validator.format( "कृपया {0} और {1} के बीच एक मान दर्ज करें।" ), + max: $.validator.format( "कृपया {0} से कम या उसके बराबर मान दर्ज करें।" ), + min: $.validator.format( "कृपया {0} से अधिक या उसके बराबर मान दर्ज करें।" ), + nieES: "कृपया एक मान्य NIE दर्ज करें।", + cifES: "कृपया एक मान्य CIF दर्ज करें.", + currency: "कृपया एक मान्य मुद्रा दर्ज करें।.", + step: $.validator.format( "{0} का गुणज होना चाहिए।" ), + abaRoutingNumber:"कृपया एक मान्य रूटिंग नंबर दर्ज करें।", + accept:"कृपया एक मान्य माइमटाइप वाला मान दर्ज करें।", + alphanumeric:"कृपया, केवल अक्षर, संख्याएं और अंडरस्कोर।", + bankaccountNL:"कृपया एक वैध बैंक खाता संख्या निर्दिष्ट करें।", + bankorgiroaccountNL:"कृपया एक वैध बैंक या जीरो खाता संख्या निर्दिष्ट करें।", + bic:"कृपया कोई मान्य BIC कोड निर्दिष्ट करें।", + ziprange:"आपका ज़िप कोड 902xx-xxxx से 905xx-xxxx की सीमा में होना चाहिए।", + zipcodeUS:"निर्दिष्ट यूएस ज़िप कोड अमान्य है।", + vinUS:"निर्दिष्ट वाहन पहचान संख्या (VIN) अमान्य है।", + time12h:"कृपया 12 घंटे पूर्वाह्न/अपराह्न प्रारूप में मान्य समय दर्ज करें।", + time:"कृपया 00:00 और 23:59 के बीच एक वैध समय दर्ज करें।", + strippedminlength:"कृपया कम से कम {0} वर्ण दर्ज करें।", + stateUS:"कृपया एक वैध प्रदेश निर्दिष्ट करें।", + skip_or_fill_minimum:"कृपया या तो इन फ़ील्ड को छोड़ दें या उनमें से कम से कम {0} भरें।", + require_from_group:"कृपया इनमें से कम से कम {0} को भरें।" +} ); diff --git a/src/localization/messages_it.js b/src/localization/messages_it.js index 54f07e106..111509454 100644 --- a/src/localization/messages_it.js +++ b/src/localization/messages_it.js @@ -3,25 +3,25 @@ * Locale: IT (Italian; Italiano) */ $.extend( $.validator.messages, { - required: "Campo obbligatorio", - remote: "Controlla questo campo", - email: "Inserisci un indirizzo email valido", - url: "Inserisci un indirizzo web valido", - date: "Inserisci una data valida", - dateISO: "Inserisci una data valida (ISO)", - number: "Inserisci un numero valido", - digits: "Inserisci solo numeri", - creditcard: "Inserisci un numero di carta di credito valido", - equalTo: "Il valore non corrisponde", - extension: "Inserisci un valore con un'estensione valida", - maxlength: $.validator.format( "Non inserire più di {0} caratteri" ), - minlength: $.validator.format( "Inserisci almeno {0} caratteri" ), - rangelength: $.validator.format( "Inserisci un valore compreso tra {0} e {1} caratteri" ), - range: $.validator.format( "Inserisci un valore compreso tra {0} e {1}" ), - max: $.validator.format( "Inserisci un valore minore o uguale a {0}" ), - min: $.validator.format( "Inserisci un valore maggiore o uguale a {0}" ), - nifES: "Inserisci un NIF valido", - nieES: "Inserisci un NIE valido", - cifES: "Inserisci un CIF valido", - currency: "Inserisci una valuta valida" + required: "Campo obbligatorio.", + remote: "Controlla questo campo.", + email: "Inserisci un indirizzo email valido.", + url: "Inserisci un indirizzo web valido.", + date: "Inserisci una data valida.", + dateISO: "Inserisci una data valida (ISO).", + number: "Inserisci un numero valido.", + digits: "Inserisci solo numeri.", + creditcard: "Inserisci un numero di carta di credito valido.", + equalTo: "Il valore non corrisponde.", + extension: "Inserisci un valore con un'estensione valida.", + maxlength: $.validator.format( "Non inserire più di {0} caratteri." ), + minlength: $.validator.format( "Inserisci almeno {0} caratteri." ), + rangelength: $.validator.format( "Inserisci un valore compreso tra {0} e {1} caratteri." ), + range: $.validator.format( "Inserisci un valore compreso tra {0} e {1}." ), + max: $.validator.format( "Inserisci un valore minore o uguale a {0}." ), + min: $.validator.format( "Inserisci un valore maggiore o uguale a {0}." ), + nifES: "Inserisci un NIF valido.", + nieES: "Inserisci un NIE valido.", + cifES: "Inserisci un CIF valido.", + currency: "Inserisci una valuta valida." } ); diff --git a/src/localization/messages_mk.js b/src/localization/messages_mk.js index 21da3282f..24fb59785 100644 --- a/src/localization/messages_mk.js +++ b/src/localization/messages_mk.js @@ -4,10 +4,10 @@ */ $.extend( $.validator.messages, { required: "Полето е задолжително.", - remote: "Поправете го ова поле", - email: "Внесете правилна e-mail адреса", + remote: "Поправете го ова поле.", + email: "Внесете правилна e-mail адреса.", url: "Внесете правилен URL.", - date: "Внесете правилен датум", + date: "Внесете правилен датум.", dateISO: "Внесете правилен датум (ISO).", number: "Внесете правилен број.", digits: "Внесете само бројки.", @@ -19,5 +19,5 @@ $.extend( $.validator.messages, { rangelength: $.validator.format( "Внесете вредност со должина помеѓу {0} и {1} знаци." ), range: $.validator.format( "Внесете вредност помеѓу {0} и {1}." ), max: $.validator.format( "Внесете вредност помала или еднаква на {0}." ), - min: $.validator.format( "Внесете вредност поголема или еднаква на {0}" ) + min: $.validator.format( "Внесете вредност поголема или еднаква на {0}." ) } ); 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/src/localization/messages_pl.js b/src/localization/messages_pl.js index 1f77009ec..c67b396d3 100644 --- a/src/localization/messages_pl.js +++ b/src/localization/messages_pl.js @@ -15,7 +15,7 @@ $.extend( $.validator.messages, { equalTo: "Proszę o podanie tej samej wartości ponownie.", extension: "Proszę o podanie wartości z prawidłowym rozszerzeniem.", nipPL: "Proszę o podanie prawidłowego numeru NIP.", - phonePL: "Proszę o podanie prawidłowego numeru telefonu", + phonePL: "Proszę o podanie prawidłowego numeru telefonu.", maxlength: $.validator.format( "Proszę o podanie nie więcej niż {0} znaków." ), minlength: $.validator.format( "Proszę o podanie przynajmniej {0} znaków." ), rangelength: $.validator.format( "Proszę o podanie wartości o długości od {0} do {1} znaków." ), diff --git a/src/localization/messages_pt_BR.js b/src/localization/messages_pt_BR.js index cfd018de8..42cd4a6bd 100644 --- a/src/localization/messages_pt_BR.js +++ b/src/localization/messages_pt_BR.js @@ -6,7 +6,7 @@ $.extend( $.validator.messages, { // Core - required: "Este campo é requerido.", + required: "Este campo é obrigatório.", remote: "Por favor, corrija este campo.", email: "Por favor, forneça um endereço de email válido.", url: "Por favor, forneça uma URL válida.", @@ -71,9 +71,9 @@ $.extend( $.validator.messages, { url2: "Por favor, forneça uma URL válida.", vinUS: "O número de identificação de veículo informado (VIN) é inválido.", zipcodeUS: "Por favor, forneça um código postal americano válido.", - ziprange: "O código postal deve estar entre 902xx-xxxx e 905xx-xxxx", + ziprange: "O código postal deve estar entre 902xx-xxxx e 905xx-xxxx.", cpfBR: "Por favor, forneça um CPF válido.", - nisBR: "Por favor, forneça um NIS/PIS válido", + nisBR: "Por favor, forneça um NIS/PIS válido.", cnhBR: "Por favor, forneça um CNH válido.", cnpjBR: "Por favor, forneça um CNPJ válido." } ); diff --git a/src/localization/messages_ro.js b/src/localization/messages_ro.js index 7ea626b42..4b3190b79 100644 --- a/src/localization/messages_ro.js +++ b/src/localization/messages_ro.js @@ -5,7 +5,7 @@ $.extend( $.validator.messages, { required: "Acest câmp este obligatoriu.", remote: "Te rugăm să completezi acest câmp.", - email: "Te rugăm să introduci o adresă de email validă", + email: "Te rugăm să introduci o adresă de email validă.", url: "Te rugăm sa introduci o adresă URL validă.", date: "Te rugăm să introduci o dată corectă.", dateISO: "Te rugăm să introduci o dată (ISO) corectă.", diff --git a/src/localization/messages_sr_lat.js b/src/localization/messages_sr_lat.js index 43666f98d..07b74137b 100644 --- a/src/localization/messages_sr_lat.js +++ b/src/localization/messages_sr_lat.js @@ -5,7 +5,7 @@ $.extend( $.validator.messages, { required: "Polje je obavezno.", remote: "Sredite ovo polje.", - email: "Unesite ispravnu e-mail adresu", + email: "Unesite ispravnu e-mail adresu.", url: "Unesite ispravan URL.", date: "Unesite ispravan datum.", dateISO: "Unesite ispravan datum (ISO).", diff --git a/src/localization/messages_tj.js b/src/localization/messages_tj.js index 4bbb4d2c4..c540461d9 100644 --- a/src/localization/messages_tj.js +++ b/src/localization/messages_tj.js @@ -13,7 +13,7 @@ $.extend( $.validator.messages, { digits: "Илтимос, танҳо рақам ворид кунед.", creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.", equalTo: "Илтимос, миқдори баробар ворид кунед.", - extension: "Илтимос, қофияи файлро дуруст интихоб кунед", + extension: "Илтимос, қофияи файлро дуруст интихоб кунед.", maxlength: $.validator.format( "Илтимос, бештар аз {0} рамз ворид накунед." ), minlength: $.validator.format( "Илтимос, камтар аз {0} рамз ворид накунед." ), rangelength: $.validator.format( "Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед." ), diff --git a/src/localization/messages_tr.js b/src/localization/messages_tr.js index 1ca35e22c..509c6f5f6 100644 --- a/src/localization/messages_tr.js +++ b/src/localization/messages_tr.js @@ -8,12 +8,13 @@ $.extend( $.validator.messages, { email: "Lütfen geçerli bir e-posta adresi giriniz.", url: "Lütfen geçerli bir web adresi (URL) giriniz.", date: "Lütfen geçerli bir tarih giriniz.", - dateISO: "Lütfen geçerli bir tarih giriniz(ISO formatında)", + dateISO: "Lütfen geçerli bir tarih giriniz(ISO formatında).", number: "Lütfen geçerli bir sayı giriniz.", digits: "Lütfen sadece sayısal karakterler giriniz.", creditcard: "Lütfen geçerli bir kredi kartı giriniz.", equalTo: "Lütfen aynı değeri tekrar giriniz.", extension: "Lütfen geçerli uzantıya sahip bir değer giriniz.", + phone: "Lütfen geçerli bir telefon numarası giriniz.", maxlength: $.validator.format( "Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz." ), minlength: $.validator.format( "Lütfen en az {0} karakter uzunluğunda bir değer giriniz." ), rangelength: $.validator.format( "Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz." ), diff --git a/test/additional/vinUS.js b/test/additional/vinUS.js new file mode 100644 index 000000000..3311b0111 --- /dev/null +++ b/test/additional/vinUS.js @@ -0,0 +1,11 @@ +QUnit.test( "vinUS", function( assert ) { + var method = methodTest( "vinUS" ); + assert.ok( method( "11111111111111111" ), "Valid test VIN number" ); + assert.ok( method( "1FTFX1CT9CFD06231" ), "Valid US VIN number" ); + assert.ok( method( "2FTHF26F8SCA68695" ), "Valid CAN VIN number" ); + assert.ok( method( "LJCPCBLCX11000237" ), "Valid VIN with X check digit" ); + assert.ok( !method( "LJCPCBLC011000237" ), "Invalid VIN with 0 check digit" ); + assert.ok( !method( "2FTHF26F8" ), "InValid VIN number" ); + assert.ok( !method( "11111111X1111111" ), "Invalid test VIN" ); + assert.ok( !method( "1111111101111111" ), "Invalid test VIN" ); +} ); 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/error-placement.js b/test/error-placement.js index 7c00ce0cd..05e5c565f 100644 --- a/test/error-placement.js +++ b/test/error-placement.js @@ -440,3 +440,60 @@ QUnit.test( "#1632: Error hidden, but input error class not removed", function( assert.equal( v.numberOfInvalids(), 0, "There is no error" ); assert.equal( box2.hasClass( "error" ), false, "Box2 should not have an error class" ); } ); + +QUnit.test( "test settings.escapeHtml undefined", function( assert ) { + var form = $( "#escapeHtmlForm1" ), + field = $( "#escapeHtmlForm1text" ); + + form.validate( { + messages: { + escapeHtmlForm1text: { + required: "" + } + } + } ); + + assert.ok( !field.valid() ); + assert.hasError( field, "required" ); + + var label = form.find( "label" ); + assert.equal( label.length, 1 ); + assert.equal( label.html(), "" ); + + label.html( "" ); + assert.ok( !field.valid() ); + assert.equal( label.html(), "" ); + + field.val( "foo" ); + assert.ok( field.valid() ); + assert.noErrorFor( field ); +} ); + +QUnit.test( "test settings.escapeHtml true", function( assert ) { + var form = $( "#escapeHtmlForm2" ), + field = $( "#escapeHtmlForm2text" ); + + form.validate( { + escapeHtml: true, + messages: { + escapeHtmlForm2text: { + required: "" + } + } + } ); + + assert.ok( !field.valid() ); + assert.hasError( field, "required" ); + + var label = form.find( "label" ); + assert.equal( label.length, 1 ); + assert.equal( label.html(), "<script>console.log('!!!');</script>" ); + + label.html( "" ); + assert.ok( !field.valid() ); + assert.equal( label.html(), "<script>console.log('!!!');</script>" ); + + field.val( "foo" ); + assert.ok( field.valid() ); + assert.noErrorFor( field ); +} ); diff --git a/test/index.html b/test/index.html index bf22a640a..e23e52dfc 100644 --- a/test/index.html +++ b/test/index.html @@ -11,6 +11,7 @@ + @@ -19,6 +20,7 @@ + @@ -71,6 +73,10 @@
+ + + +