diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index b96766f..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,28 +0,0 @@ -Changelog -======== -### HEAD -* Not calling window.setTimeout() if options.delay == 0 -* Fixing broken docs example -* Moved docs content to /docs directory of project - -### 0.5.0 -* Adding `remote` validator to send an AJAX request to determine a fields validity. Fixes #2 -* Making the disabled submit button clickable to reveal what errors are keeping the form disabled. Fixes #8 -* Fixing small issue with errored radio buttons that made the form stay disabled until you toggled through each radio button. Fixes #21 - -### 0.4.0 -* Adding `html` option to allow html in error messages. Defaults to false. -* Validator now ignores disabled fields and won't consider them to be invalid. Fixes #13. -* Validator only disables buttons with `[type="submit"]`. Best practice is still to give a `[type="button"]` for all non-submit buttons. Fixes #17. -* Fixing `.noConflict()` as per twbs/bootstrap#11464. -* Namespacing all data attributes the plugin sets with `bs.validator`. - -### 0.3.0 -* Adding support for required radio buttons and checkboxes. Fixes #7. -* Changing jekyll to serve docs from `/` instead of `/validator` when running docs locally - -### 0.2.1 -* Validating fields on blur so empty required fields are subject to validation once they've been touched. Fixes #3. - -### 0.2.0 -* Initial public release \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 22739e4..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,133 +0,0 @@ -/* jshint node: true */ - -module.exports = function(grunt) { - "use strict"; - - // Project configuration. - grunt.initConfig({ - - // Metadata. - pkg: grunt.file.readJSON('package.json'), - banner: '/*!\n' + - ' * Validator v<%= pkg.version %> for Bootstrap 3, by @1000hz\n' + - ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + - ' * Licensed under <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' + - ' *\n' + - ' * https://github.com/1000hz/bootstrap-validator\n' + - ' */\n\n', - - // Task configuration. - jshint: { - options: { - jshintrc: 'js/.jshintrc' - }, - gruntfile: { - src: 'Gruntfile.js' - }, - src: { - src: ['js/*.js'] - }, - test: { - src: ['js/tests/unit/*.js'] - } - }, - - concat: { - options: { - banner: '<%= banner %>', - stripBanners: true - }, - dist: { - src: ['js/validator.js'], - dest: 'dist/validator.js' - } - }, - - copy: { - docs: { - expand: true, - cwd: './dist', - src: '*', - dest: 'docs/dist' - } - }, - - uglify: { - options: { - banner: '<%= banner %>', - report: 'min' - }, - min: { - src: ['js/validator.js'], - dest: 'dist/validator.min.js' - } - }, - - qunit: { - options: { - inject: 'js/tests/unit/phantom.js' - }, - files: ['js/tests/*.html'] - }, - - watch: { - src: { - files: '<%= jshint.src.src %>', - tasks: ['jshint:src', 'qunit'] - }, - test: { - files: '<%= jshint.test.src %>', - tasks: ['jshint:test', 'qunit'] - } - }, - - jekyll: { - docs: {} - }, - - validation: { - options: { - reset: true, - relaxerror: [ - "Bad value X-UA-Compatible for attribute http-equiv on element meta.", - "Element img is missing required attribute src." - ] - }, - files: { - src: ["_gh_pages/**/*.html"] - } - } - }); - - - // These plugins provide necessary tasks. - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-qunit'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-jekyll'); - grunt.loadNpmTasks('grunt-html-validation'); - grunt.loadNpmTasks('grunt-sed'); - - // Docs HTML validation task - grunt.registerTask('validate-html', ['jekyll', 'validation']); - - // Test task. - grunt.registerTask('test', ['jshint', 'qunit']); - - // Docs distribution task. - grunt.registerTask('dist-docs', 'copy:docs'); - - // Distribution task. - grunt.registerTask('dist', ['concat', 'uglify', 'dist-docs']); - - // Default task. - grunt.registerTask('default', ['test', 'dist']); - - // Version numbering task. - // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z - // This can be overzealous, so its changes should always be manually reviewed! - grunt.registerTask('change-version-number', ['sed']); -}; \ No newline at end of file diff --git a/LICENSE b/LICENSE index b30c94f..0334caf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,319 @@ -The MIT License (MIT) - -Copyright (c) 2013 Spiceworks, Inc - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +Creative Commons Legal Code + +Attribution 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined above) for the purposes of this + License. + c. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + d. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + e. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + f. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + g. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + h. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + i. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(b), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(b), as requested. + b. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Section 3(b), in the case of an Adaptation, + a credit identifying the use of the Work in the Adaptation (e.g., + "French translation of the Work by Original Author," or "Screenplay + based on original Work by Original Author"). The credit required by + this Section 4 (b) may be implemented in any reasonable manner; + provided, however, that in the case of a Adaptation or Collection, at + a minimum such credit will appear, if a credit for all contributing + authors of the Adaptation or Collection appears, then as part of these + credits and in a manner at least as prominent as the credits for the + other contributing authors. For the avoidance of doubt, You may only + use the credit required by this Section for the purpose of attribution + in the manner set out above and, by exercising Your rights under this + License, You may not implicitly or explicitly assert or imply any + connection with, sponsorship or endorsement by the Original Author, + Licensor and/or Attribution Parties, as appropriate, of You or Your + use of the Work, without the separate, express prior written + permission of the Original Author, Licensor and/or Attribution + Parties. + c. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of this License. + + Creative Commons may be contacted at http://creativecommons.org/. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 1479aec..0000000 --- a/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Validator, for Bootstrap 3 -The Validator plugin offers automatic form validation configurable via mostly HTML5 standard attributes. -It also provides an unobtrusive user experience, because nobody likes a naggy form. - -## Features -- Configurable via data-api and standard HTML5 attributes -- Patient to inform user of errors and eager to let them know the errors have been resolved -- Submit is disabled until the form is valid and all required fields are complete -- Customizable error messages - - -## Documentation - -See the project docs at http://1000hz.github.io/bootstrap-validator - -## Contributing -#### Found an issue? -Be sure to include a reproducible test case on JSbin with your report. -#### Submitting a pull request? -Fork this repo and create a new branch for your patch. -Try to adhere to the code style of Bootstrap 3's JS as much as possible. -Be sure to add any relevant unit tests. -Make sure everything's still ok by running `grunt test`. -Lastly, don't pollute your patch branch with any unrelated changes. - -## Author - -**Cina Saffary** -- http://twitter.com/1000hz -- http://github.com/1000hz - -Thanks to [@mdo](https://github.com/mdo) and [@fat](https://github.com/fat) for [Bootstrap](http://getbootstrap.com). <3 - -## Copyright and license -Copyright 2013 Spiceworks, Inc under the MIT license. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index d8b25ef..0000000 --- a/_config.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Dependencies -markdown: kramdown -highlighter: pygments - -# Permalinks -permalink: pretty - -# Server -source: docs -destination: _gh_pages -port: 9001 -baseurl: / -encoding: UTF-8 - -repo: https://github.com/1000hz/bootstrap-validator -cdn_bootstrap_css: //netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css -cdn_bootstrap_js: //netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js \ No newline at end of file diff --git a/docs/assets/css/docs.css b/assets/css/docs.css similarity index 98% rename from docs/assets/css/docs.css rename to assets/css/docs.css index c27bdfc..88e44c6 100644 --- a/docs/assets/css/docs.css +++ b/assets/css/docs.css @@ -212,72 +212,6 @@ body { } -/* - * Homepage - * - * Tweaks to the custom homepage and the masthead (main jumbotron). - */ - - /* Masthead (headings and download button) */ - .bs-masthead { - position: relative; - padding: 30px 15px; - text-align: center; - text-shadow: 0 1px 0 rgba(0,0,0,.15); -} -.bs-masthead h1 { - font-size: 50px; - line-height: 1; - color: #fff; -} -.bs-masthead .btn-outline-inverse { - margin: 10px; -} - -/* Links to project-level content like the repo, Expo, etc */ -.bs-masthead-links { - margin-top: 20px; - margin-bottom: 40px; - padding: 0 15px; - list-style: none; - text-align: center; -} -.bs-masthead-links li { - display: inline; -} -.bs-masthead-links li + li { - margin-left: 20px; -} -.bs-masthead-links a { - color: #fff; -} - -@media (min-width: 768px) { - .bs-masthead { - text-align: left; - padding-top: 140px; - padding-bottom: 140px; - } - .bs-masthead h1 { - font-size: 100px; - } - .bs-masthead .lead { - margin-right: 25%; - font-size: 30px; - } - .bs-masthead .btn-outline-inverse { - width: auto; - margin: 20px 5px 20px 0; - padding: 18px 24px; - font-size: 21px; - } - .bs-masthead-links { - padding: 0; - text-align: left; - } -} - - /* * Page headers * @@ -287,7 +221,7 @@ body { /* Page headers */ .bs-header { - padding: 30px 15px 40px; /* side padding builds on .container 15px, so 30px */ + padding: 30px 15px 0px; /* side padding builds on .container 15px, so 30px */ font-size: 16px; text-align: center; text-shadow: 0 1px 0 rgba(0,0,0,.15); @@ -303,8 +237,15 @@ body { position: relative; } +@media (min-width: 480px) { + .bs-header { + padding-bottom: 40px; + } +} + @media (min-width: 768px) { .bs-header { + padding-bottom: 60px; font-size: 21px; text-align: left; } @@ -337,6 +278,54 @@ body { } +/* + * Carbon ads + * + */ + +#carbonads { + display: block; + overflow: hidden; + margin: 50px -30px 0 -30px; + padding: 15px 15px 15px 160px; + font-size: 13px; + line-height: 1.5; + text-align: left; + border: 1px solid #866ab3; +} + +#carbonads a { + color: #fff; +} + +.carbon-img { + float: left; + margin-left: -145px; +} + +.carbon-poweredby { + display: block; + color: #cdbfe3 !important; +} + +@media (min-width: 480px) { + #carbonads { + max-width: 330px; + margin: 50px auto 0; + border-radius: 4px; + } +} + +@media (min-width: 992px) { + #carbonads { + position: absolute; + top: 0; + right: 15px; + margin-top: 0; + } +} + + /* * Side navigation * diff --git a/docs/assets/css/pygments-manni.css b/assets/css/pygments-manni.css similarity index 100% rename from docs/assets/css/pygments-manni.css rename to assets/css/pygments-manni.css diff --git a/docs/assets/ico/apple-touch-icon-144-precomposed.png b/assets/ico/apple-touch-icon-144-precomposed.png similarity index 100% rename from docs/assets/ico/apple-touch-icon-144-precomposed.png rename to assets/ico/apple-touch-icon-144-precomposed.png diff --git a/docs/assets/ico/favicon.png b/assets/ico/favicon.png similarity index 100% rename from docs/assets/ico/favicon.png rename to assets/ico/favicon.png diff --git a/docs/assets/js/application.js b/assets/js/application.js similarity index 95% rename from docs/assets/js/application.js rename to assets/js/application.js index 571a4e9..0174967 100644 --- a/docs/assets/js/application.js +++ b/assets/js/application.js @@ -19,6 +19,8 @@ var navHeight = $('.navbar').outerHeight(true) + 10 + $.fn.validator.Constructor.FOCUS_OFFSET = navHeight + $body.scrollspy({ target: '.bs-sidebar', offset: navHeight diff --git a/bower.json b/bower.json deleted file mode 100644 index 4e2d9bd..0000000 --- a/bower.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "bootstrap-validator", - "version": "0.5.0", - "homepage": "https://github.com/1000hz/bootstrap-validator", - "authors": [ - "Cina Saffary " - ], - "description": "A user-friendly HTML5 Form validator for Bootstrap 3", - "main": "./dist/validator.min.js", - "keywords": [ - "bootstrap", - "bootstrap3", - "jquery", - "form", - "validator", - "validation", - "plugin" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "_*", - "docs-assets", - "js/tests", - "DOCS-LICENSE", - "Gruntfile.js", - "package.json", - "*.html" - ] -} diff --git a/dist/validator.js b/dist/validator.js index f7dc2cd..553c160 100644 --- a/dist/validator.js +++ b/dist/validator.js @@ -1,6 +1,6 @@ /*! - * Validator v0.5.0 for Bootstrap 3, by @1000hz - * Copyright 2014 Spiceworks, Inc. + * Validator v0.11.9 for Bootstrap 3, by @1000hz + * Copyright 2017 Cina Saffary * Licensed under http://opensource.org/licenses/MIT * * https://github.com/1000hz/bootstrap-validator @@ -12,67 +12,127 @@ // VALIDATOR CLASS DEFINITION // ========================== + function getValue($el) { + return $el.is('[type="checkbox"]') ? $el.prop('checked') : + $el.is('[type="radio"]') ? !!$('[name="' + $el.attr('name') + '"]:checked').length : + $el.is('select[multiple]') ? ($el.val() || []).length : + $el.val() + } + var Validator = function (element, options) { - this.$element = $(element) - this.options = options + this.options = options + this.validators = $.extend({}, Validator.VALIDATORS, options.custom) + this.$element = $(element) + this.$btn = $('button[type="submit"], input[type="submit"]') + .filter('[form="' + this.$element.attr('id') + '"]') + .add(this.$element.find('input[type="submit"], button[type="submit"]')) - this.$element.attr('novalidate', true) // disable automatic native validation - this.toggleSubmit() + this.update() - this.$element.on('input.bs.validator change.bs.validator focusout.bs.validator', $.proxy(this.validateInput, this)) + this.$element.on('input.bs.validator change.bs.validator focusout.bs.validator', $.proxy(this.onInput, this)) this.$element.on('submit.bs.validator', $.proxy(this.onSubmit, this)) + this.$element.on('reset.bs.validator', $.proxy(this.reset, this)) this.$element.find('[data-match]').each(function () { var $this = $(this) - var target = $this.data('match') + var target = $this.attr('data-match') $(target).on('input.bs.validator', function (e) { - $this.val() && $this.trigger('input') + getValue($this) && $this.trigger('input.bs.validator') }) }) + + // run validators for fields with values, but don't clobber server-side errors + this.$inputs.filter(function () { + return getValue($(this)) && !$(this).closest('.has-error').length + }).trigger('focusout') + + this.$element.attr('novalidate', true) // disable automatic native validation } + Validator.VERSION = '0.11.9' + + Validator.INPUT_SELECTOR = ':input:not([type="hidden"], [type="submit"], [type="reset"], button)' + + Validator.FOCUS_OFFSET = 20 + Validator.DEFAULTS = { delay: 500, html: false, + disable: true, + focus: true, + custom: {}, errors: { match: 'Does not match', minlength: 'Not long enough' + }, + feedback: { + success: 'glyphicon-ok', + error: 'glyphicon-remove' } } Validator.VALIDATORS = { - native: function ($el) { + 'native': function ($el) { var el = $el[0] - return el.checkValidity ? el.checkValidity() : true + if (el.checkValidity) { + return !el.checkValidity() && !el.validity.valid && (el.validationMessage || "error!") + } }, - match: function ($el) { - var target = $el.data('match') - return !$el.val() || $el.val() === $(target).val() + 'match': function ($el) { + var target = $el.attr('data-match') + return $el.val() !== $(target).val() && Validator.DEFAULTS.errors.match }, - minlength: function ($el) { - var minlength = $el.data('minlength') - return !$el.val() || $el.val().length >= minlength + 'minlength': function ($el) { + var minlength = $el.attr('data-minlength') + return $el.val().length < minlength && Validator.DEFAULTS.errors.minlength } } - Validator.prototype.validateInput = function (e) { - var $el = $(e.target) + Validator.prototype.update = function () { + var self = this + + this.$inputs = this.$element.find(Validator.INPUT_SELECTOR) + .add(this.$element.find('[data-validate="true"]')) + .not(this.$element.find('[data-validate="false"]') + .each(function () { self.clearErrors($(this)) }) + ) + + this.toggleSubmit() + + return this + } + + Validator.prototype.onInput = function (e) { + var self = this + var $el = $(e.target) + var deferErrors = e.type !== 'focusout' + + if (!this.$inputs.is($el)) return + + this.validateInput($el, deferErrors).done(function () { + self.toggleSubmit() + }) + } + + Validator.prototype.validateInput = function ($el, deferErrors) { + var value = getValue($el) var prevErrors = $el.data('bs.validator.errors') - var errors if ($el.is('[type="radio"]')) $el = this.$element.find('input[name="' + $el.attr('name') + '"]') - this.$element.trigger(e = $.Event('validate.bs.validator', {relatedTarget: $el[0]})) - + var e = $.Event('validate.bs.validator', {relatedTarget: $el[0]}) + this.$element.trigger(e) if (e.isDefaultPrevented()) return var self = this - this.runValidators($el).done(function (errors) { + return this.runValidators($el).done(function (errors) { $el.data('bs.validator.errors', errors) - errors.length ? self.showErrors($el) : self.clearErrors($el) + errors.length + ? deferErrors ? self.defer($el, self.showErrors) : self.showErrors($el) + : self.clearErrors($el) if (!prevErrors || errors.toString() !== prevErrors.toString()) { e = errors.length @@ -90,31 +150,52 @@ Validator.prototype.runValidators = function ($el) { - var errors = [] - var validators = [Validator.VALIDATORS.native] - var deferred = $.Deferred() - var options = this.options + var errors = [] + var deferred = $.Deferred() $el.data('bs.validator.deferred') && $el.data('bs.validator.deferred').reject() $el.data('bs.validator.deferred', deferred) + function getValidatorSpecificError(key) { + return $el.attr('data-' + key + '-error') + } + + function getValidityStateError() { + var validity = $el[0].validity + return validity.typeMismatch ? $el.attr('data-type-error') + : validity.patternMismatch ? $el.attr('data-pattern-error') + : validity.stepMismatch ? $el.attr('data-step-error') + : validity.rangeOverflow ? $el.attr('data-max-error') + : validity.rangeUnderflow ? $el.attr('data-min-error') + : validity.valueMissing ? $el.attr('data-required-error') + : null + } + + function getGenericError() { + return $el.attr('data-error') + } + function getErrorMessage(key) { - return $el.data(key + '-error') - || $el.data('error') - || key == 'native' && $el[0].validationMessage - || options.errors[key] + return getValidatorSpecificError(key) + || getValidityStateError() + || getGenericError() } - $.each(Validator.VALIDATORS, $.proxy(function (key, validator) { - if (($el.data(key) || key == 'native') && !validator.call(this, $el)) { - var error = getErrorMessage(key) + $.each(this.validators, $.proxy(function (key, validator) { + var error = null + if ((getValue($el) || $el.attr('required')) && + ($el.attr('data-' + key) !== undefined || key == 'native') && + (error = validator.call(this, $el))) { + error = getErrorMessage(key) || error !~errors.indexOf(error) && errors.push(error) } }, this)) - if (!errors.length && $el.val() && $el.data('remote')) { + if (!errors.length && getValue($el) && $el.attr('data-remote')) { this.defer($el, function () { - $.get($el.data('remote'), [$el.attr('name'), $el.val()].join('=')) + var data = {} + data[$el.attr('name')] = getValue($el) + $.get($el.attr('data-remote'), data) .fail(function (jqXHR, textStatus, error) { errors.push(getErrorMessage('remote') || error) }) .always(function () { deferred.resolve(errors)}) }) @@ -124,42 +205,65 @@ } Validator.prototype.validate = function () { - var delay = this.options.delay + var self = this - this.options.delay = 0 - this.$element.find(':input').trigger('input') - this.options.delay = delay + $.when(this.$inputs.map(function (el) { + return self.validateInput($(this), false) + })).then(function () { + self.toggleSubmit() + self.focusError() + }) return this } + Validator.prototype.focusError = function () { + if (!this.options.focus) return + + var $input = this.$element.find(".has-error:first :input") + if ($input.length === 0) return + + $('html, body').animate({scrollTop: $input.offset().top - Validator.FOCUS_OFFSET}, 250) + $input.focus() + } + Validator.prototype.showErrors = function ($el) { var method = this.options.html ? 'html' : 'text' + var errors = $el.data('bs.validator.errors') + var $group = $el.closest('.form-group') + var $block = $group.find('.help-block.with-errors') + var $feedback = $group.find('.form-control-feedback') - this.defer($el, function () { - var $group = $el.closest('.form-group') - var $block = $group.find('.help-block.with-errors') - var errors = $el.data('bs.validator.errors') - - if (!errors.length) return + if (!errors.length) return - errors = $('