/* * @copyright 2018 Christoph Wurst * * @author 2018 Christoph Wurst * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import $ from 'jquery' /* * @name Show Password * @description * @version 1.3 * @requires Jquery 1.5 * * @author Jan Jarfalk * @author-email jan.jarfalk@unwrongest.com * @author-website http://www.unwrongest.com * * @special-thanks Michel Gratton * * @licens MIT License - http://www.opensource.org/licenses/mit-license.php */ $.fn.extend({ showPassword: function (c) { // Setup callback object var callback = {'fn': null, 'args': {}}; callback.fn = c; // Clones passwords and turn the clones into text inputs var cloneElement = function (element) { var $element = $(element); var $clone = $(""); // Name added for JQuery Validation compatibility // Element name is required to avoid script warning. $clone.attr({ 'type': 'text', 'class': $element.attr('class'), 'style': $element.attr('style'), 'size': $element.attr('size'), 'name': $element.attr('name') + '-clone', 'tabindex': $element.attr('tabindex'), 'autocomplete': 'off' }); if ($element.attr('placeholder') !== undefined) { $clone.attr('placeholder', $element.attr('placeholder')); } return $clone; }; // Transfers values between two elements var update = function (a, b) { b.val(a.val()); }; // Shows a or b depending on checkbox var setState = function (checkbox, a, b) { if (checkbox.is(':checked')) { update(a, b); b.show(); a.hide(); } else { update(b, a); b.hide(); a.show(); } }; return this.each(function () { var $input = $(this), $checkbox = $($input.data('typetoggle')); // Create clone var $clone = cloneElement($input); $clone.insertAfter($input); // Set callback arguments if (callback.fn) { callback.args.input = $input; callback.args.checkbox = $checkbox; callback.args.clone = $clone; } $checkbox.bind('click', function () { setState($checkbox, $input, $clone); }); $input.bind('keyup', function () { update($input, $clone); }); $clone.bind('keyup', function () { update($clone, $input); // Added for JQuery Validation compatibility // This will trigger validation if it's ON for keyup event $input.trigger('keyup'); }); // Added for JQuery Validation compatibility // This will trigger validation if it's ON for blur event $clone.bind('blur', function () { $input.trigger('focusout'); }); setState($checkbox, $input, $clone); // set type of password field clone (type=text) to password right on submit // to prevent browser save the value of this field $clone.closest('form').submit(function (e) { // .prop has to be used, because .attr throws // an error while changing a type of an input // element $clone.prop('type', 'password'); }); if (callback.fn) { callback.fn(callback.args); } }); } });