diff options
Diffstat (limited to 'core/src/jquery/showpassword.js')
-rw-r--r-- | core/src/jquery/showpassword.js | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/core/src/jquery/showpassword.js b/core/src/jquery/showpassword.js new file mode 100644 index 00000000000..8d938d7853b --- /dev/null +++ b/core/src/jquery/showpassword.js @@ -0,0 +1,132 @@ +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +/** @typedef {import('jquery')} jQuery */ +import $ from 'jquery' + +/** + * @name Show Password + * @description + * @version 1.3.0 + * @requires jQuery 1.5 + * + * @author Jan Jarfalk <jan.jarfalk@unwrongest.com> + * author-website http://www.unwrongest.com + * + * special-thanks Michel Gratton + * + * @license MIT + */ +$.fn.extend({ + showPassword(c) { + + // Setup callback object + const callback = { fn: null, args: {} } + callback.fn = c + + // Clones passwords and turn the clones into text inputs + const cloneElement = function(element) { + + const $element = $(element) + + const $clone = $('<input />') + + // 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 + const update = function(a, b) { + b.val(a.val()) + } + + // Shows a or b depending on checkbox + const 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() { + + const $input = $(this) + const $checkbox = $($input.data('typetoggle')) + + // Create clone + const $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) + } + + }) + }, +}) |