simple_form_password_with_hints 0.0.2 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa987a3f0944df96e0d63ed2f89c86e23e4a690373b2342921180e451d834464
4
- data.tar.gz: d03d14601c03cab7357f4cf5d026ebcceace5f5e75a6fbe00efd5a1a8e4d4713
3
+ metadata.gz: 411165d58276c0c20a5597ff5fdc7fb019952929d639770ea8d64bcd41ec6289
4
+ data.tar.gz: e4cd204922a412f181ba7bb598908a4c4daaa5902c86ebbf1707dc0a96cc906f
5
5
  SHA512:
6
- metadata.gz: 4d61860cc6cffb85b508074e41768194177d6137146915d76a63ab7832902bc0dcd7a072bbaa6f82c7d1872999cee49de0059e49d8002961b48bfaacfa634a33
7
- data.tar.gz: b652cd9d96fdcb914df2f78d60631a77a7078b7d1d9148c56de75071a26ecdb75057f88ff7099304c18f810445df3db13e767b875e969d6a82ed79c5cfedf495
6
+ metadata.gz: 0ff1c838a6d2a72d3232987fb7d6356b9e4122d15fc06321e0e089f951c6da79731ddc26052658c2f080f19d1ed73d5d169e2fe041f557a8aa6fb11b3332bf18
7
+ data.tar.gz: fecbacc41e06e575a289357e6e846fa993f41d2d5060e2504b6eaa64942d947acf1c1cda115450467354cac6301c30339c64056021d523b0efe29b45daca466d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_form_password_with_hints (0.0.2)
4
+ simple_form_password_with_hints (0.0.6)
5
5
  rails
6
6
  simple_form
7
7
 
@@ -106,12 +106,12 @@ GEM
106
106
  mini_mime (>= 0.1.1)
107
107
  marcel (1.0.2)
108
108
  method_source (1.0.0)
109
- mini_mime (1.1.1)
109
+ mini_mime (1.1.2)
110
110
  mini_portile2 (2.6.1)
111
111
  minitest (5.14.4)
112
112
  msgpack (1.4.2)
113
113
  nio4r (2.5.8)
114
- nokogiri (1.12.4)
114
+ nokogiri (1.12.5)
115
115
  mini_portile2 (~> 2.6.1)
116
116
  racc (~> 1.4)
117
117
  orm_adapter (0.5.0)
@@ -1,10 +1,130 @@
1
- /*global $, RegExp */
2
- $(function () {
1
+ Element.prototype.parents = function (selector) {
3
2
  'use strict';
4
- var getCheckRegex = function (key, $check) {
3
+
4
+ var elements = [],
5
+ // eslint-disable-next-line consistent-this
6
+ elem = this,
7
+ ishaveselector = typeof selector !== 'undefined';
8
+
9
+ while ((elem = elem.parentElement) !== null) {
10
+ if (elem.nodeType !== Node.ELEMENT_NODE) {
11
+ continue;
12
+ }
13
+
14
+ if (!ishaveselector || elem.matches(selector)) {
15
+ elements.push(elem);
16
+ }
17
+ }
18
+
19
+ return elements;
20
+ };
21
+
22
+ Element.prototype.parent = function (selector) {
23
+ 'use strict';
24
+ var elements = this.parents(selector);
25
+
26
+ if (elements.length > 0) {
27
+ return elements[0];
28
+ } else {
29
+ return null;
30
+ }
31
+ };
32
+
33
+ (function () {
34
+ 'use strict';
35
+ var initialized = false,
36
+ simpleFormPasswordWithHints;
37
+
38
+ simpleFormPasswordWithHints = {
39
+ init: function () {
40
+ var inputs = document.querySelectorAll('.js-sfpwh-hints-input'),
41
+ togglers = document.querySelectorAll('.js-sfpwh-password-toggle'),
42
+ syncInputs = document.querySelectorAll('.js-sfpwh-sync-input'),
43
+ i = 0;
44
+
45
+ if (initialized) {
46
+ return false;
47
+ }
48
+ initialized = true;
49
+
50
+ this.listen(inputs, 'input', this.onInput.bind(this));
51
+ this.listen(togglers, 'click', this.onClickToggler);
52
+
53
+ for (i = 0; i < syncInputs.length; i +=1) {
54
+ this.bindEquality(syncInputs[i]);
55
+ }
56
+ },
57
+
58
+ listen: function (elements, action, callback) {
59
+ var i;
60
+ for (i = 0; i < elements.length; i +=1) {
61
+ elements[i].addEventListener(action, callback.bind(this, elements[i]));
62
+ }
63
+ },
64
+
65
+ onInput: function (element) {
66
+ var container = element.parent('.password_with_hints'),
67
+ checks = ['length', 'uppercase', 'lowercase', 'number', 'special'],
68
+ i;
69
+ for (i = 0; i < checks.length; i += 1) {
70
+ this.check(container, checks[i], element.value);
71
+ }
72
+ },
73
+
74
+ check: function (container, key, value) {
75
+ var check = container.querySelector('.js-sfpwh-hint-' + key),
76
+ regexKey,
77
+ regex;
78
+
79
+ if (check) {
80
+ regexKey = this.getRegex(key, check);
81
+ regex = new RegExp(regexKey);
82
+ if (value.match(regex)) {
83
+ check.classList.remove('sfpwh-hint--invalid');
84
+ } else {
85
+ check.classList.add('sfpwh-hint--invalid');
86
+ }
87
+ }
88
+ },
89
+
90
+ bindEquality: function (input) {
91
+ var form = input.parent('form'),
92
+ target = form.querySelector('input[name="' + input.getAttribute('data-link-to') + '"]');
93
+ input.addEventListener('input', this.compare.bind(this, input, target));
94
+ target.addEventListener('input', this.compare.bind(this, input, target));
95
+ },
96
+
97
+ compare: function (field, target) {
98
+ var container = field.parent('.password_with_sync'),
99
+ check;
100
+
101
+ if (container) {
102
+ check = container.querySelector('.js-sfpwh-hint-match');
103
+ }
104
+
105
+ if (field.value !== '' && field.value === target.value) {
106
+ check.classList.remove('sfpwh-hint--invalid');
107
+ } else {
108
+ check.classList.add('sfpwh-hint--invalid');
109
+ }
110
+ },
111
+
112
+ onClickToggler: function (element) {
113
+ var container = element.parent('.password_with_hints, .password_with_sync'),
114
+ input = container.querySelector('.js-sfpwh-input');
115
+
116
+ element.classList.toggle('sfpwh-password-toggle-revealed');
117
+
118
+ input.type = input.type === 'text' ? 'password' : 'text';
119
+ },
120
+
121
+ // HELPERS
122
+
123
+ getRegex: function (key, element) {
5
124
  var regex,
6
125
  min,
7
126
  chars;
127
+
8
128
  switch (key) {
9
129
  case 'uppercase':
10
130
  regex = '[A-Z]';
@@ -17,71 +137,25 @@ $(function () {
17
137
  break;
18
138
  case 'special':
19
139
  // hyphen must be at the end
20
- chars = $check.data('chars');
140
+ chars = element.getAttribute('data-chars');
21
141
  regex = '[' + chars + ']';
22
142
  break;
23
143
  case 'length':
24
- min = $check.data('length');
144
+ min = element.getAttribute('data-length');
25
145
  regex = '.{' + min + ',128}';
26
146
  break;
27
147
  default:
28
148
  break;
29
149
  }
30
150
  return regex;
31
- },
32
- performCheck = function ($container, key, password) {
33
- var $check = $('.js-sfpwh-hint-' + key, $container),
34
- regexKey = getCheckRegex(key, $check),
35
- regex = new RegExp(regexKey);
36
- if ($check.length) {
37
- if (password.match(regex)) {
38
- $check.removeClass('sfpwh-hint--invalid');
39
- } else {
40
- $check.addClass('sfpwh-hint--invalid');
41
- }
42
- }
43
- },
44
- compareFields = function (e) {
45
- var $field = $(e.data.$field),
46
- $target = $(e.data.$target),
47
- $container = $field.parents('.password_with_sync'),
48
- $check = $('.js-sfpwh-hint-match', $container);
49
-
50
- if ($field.val() !== '' && $field.val() === $target.val()) {
51
- $check.removeClass('sfpwh-hint--invalid');
52
- } else {
53
- $check.addClass('sfpwh-hint--invalid');
54
- }
55
- };
56
-
57
- $('.js-sfpwh-hints-input').on('input', function () {
58
- var $container = $(this).parents('.password_with_hints'),
59
- checks = ['length', 'uppercase', 'lowercase', 'number', 'special'],
60
- password = $(this).val(),
61
- i;
62
- for (i = 0; i < checks.length; i += 1) {
63
- performCheck($container, checks[i], password);
64
- }
65
- });
66
-
67
- $('.js-sfpwh-password-toggle').on('click', function () {
68
- var $container = $(this).parents('.password_with_hints, .password_with_sync'),
69
- $input = $('.js-sfpwh-input', $container),
70
- type = $input.attr('type');
71
- $(this).toggleClass('sfpwh-password-toggle-revealed');
72
- if (type === 'text') {
73
- $input.attr('type', 'password');
74
- } else {
75
- $input.attr('type', 'text');
76
151
  }
77
- });
78
-
79
- $('.js-sfpwh-sync-input').each(function (index, value) {
80
- var $field = $(value),
81
- $form = $field.parents('form'),
82
- $target = $('input[name="' + $field.data('link-to') + '"]', $form);
152
+ };
83
153
 
84
- $field.on('input', { $field: $field, $target: $target }, compareFields);
85
- $target.on('input', { $field: $field, $target: $target }, compareFields);
86
- });
87
- });
154
+ if (document.readyState === 'complete' || document.readyState === 'interactive') {
155
+ simpleFormPasswordWithHints.init();
156
+ } else {
157
+ window.addEventListener('DOMContentLoaded', () => {
158
+ simpleFormPasswordWithHints.init();
159
+ });
160
+ }
161
+ }());
@@ -10,6 +10,7 @@
10
10
  & ~.invalid-feedback
11
11
  margin-top: -1.275rem
12
12
  &-hint
13
+ display: inline-block
13
14
  font-size: 11px
14
15
  white-space: nowrap
15
16
  &:not(:first-child)
@@ -1,3 +1,3 @@
1
1
  module SimpleFormPasswordWithHints
2
- VERSION = "0.0.2".freeze
2
+ VERSION = "0.0.6".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_form_password_with_hints
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre-andré Boissinot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-22 00:00:00.000000000 Z
11
+ date: 2021-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails