simple_form_password_with_hints 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.eslintrc.yml +183 -0
- data/.gitignore +8 -0
- data/.sass-lint.yml +55 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +202 -0
- data/LICENSE +21 -0
- data/README.md +145 -0
- data/Rakefile +2 -0
- data/assets/images/icon-cancel.svg +1 -0
- data/assets/images/icon-check.svg +3 -0
- data/assets/images/icon-eye-slash.svg +1 -0
- data/assets/images/icon-eye.svg +1 -0
- data/assets/javascripts/simple_form_password_with_hints.js +87 -0
- data/assets/stylesheets/simple_form_password_with_hints.sass +46 -0
- data/config/locales/en.yml +8 -0
- data/lib/simple_form_password_with_hints/password_with_hints_input.rb +76 -0
- data/lib/simple_form_password_with_hints/password_with_sync_input.rb +41 -0
- data/lib/simple_form_password_with_hints/version.rb +3 -0
- data/lib/simple_form_password_with_hints.rb +40 -0
- data/simple_form_password_with_hints.gemspec +25 -0
- metadata +119 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 98458d88dfc28b816842f0dc56ad249d4b54496e05c266d386b80cb2b4f559e4
|
4
|
+
data.tar.gz: 99191725c33b8633b7c2b56d9685201242b4a3e7a793419dea654588ed5d0e0b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 25135c64eafba3a0b3a793c87098ac93fd0d98160effcad1f933c87f7b46745a67ce7b958b71b29d8e12f19e36745d0e9bdc81ec48ea76ce0dcd0b8789f7dc00
|
7
|
+
data.tar.gz: 7128e1b3b8c2fc69e0d9bb64d261854203fdaddbce818f8876d4cfdc640f83fe6088b821e68d3bc74055f177760c296f384025ec81e05f0f29820bcb8f249d7e
|
data/.DS_Store
ADDED
Binary file
|
data/.eslintrc.yml
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
env:
|
2
|
+
browser: true
|
3
|
+
es6: true
|
4
|
+
extends: "eslint:recommended"
|
5
|
+
parserOptions:
|
6
|
+
sourceType: 'script'
|
7
|
+
rules:
|
8
|
+
# key: 0 = allow, 1 = warn, 2 = error
|
9
|
+
|
10
|
+
# Possible Errors
|
11
|
+
no-await-in-loop: 1
|
12
|
+
no-console: 1
|
13
|
+
no-extra-parens: [1, 'all']
|
14
|
+
no-template-curly-in-string: 0
|
15
|
+
|
16
|
+
# Best Practices
|
17
|
+
accessor-pairs: 0
|
18
|
+
array-callback-return: 0
|
19
|
+
block-scoped-var: 1
|
20
|
+
class-methods-use-this: 0
|
21
|
+
complexity: 0
|
22
|
+
consistent-return: 0
|
23
|
+
curly: [1, 'all']
|
24
|
+
default-case: 1
|
25
|
+
dot-location: [1, 'property']
|
26
|
+
dot-notation: 0
|
27
|
+
eqeqeq: 1
|
28
|
+
guard-for-in: 0
|
29
|
+
max-classes-per-file: 0
|
30
|
+
no-alert: 1
|
31
|
+
no-caller: 1
|
32
|
+
no-div-regex: 1
|
33
|
+
no-else-return: 0
|
34
|
+
no-empty-function: 1
|
35
|
+
no-eq-null: 1
|
36
|
+
no-eval: 0
|
37
|
+
no-extend-native: 0
|
38
|
+
no-extra-bind: 0
|
39
|
+
no-extra-label: 1
|
40
|
+
no-floating-decimal: 1
|
41
|
+
no-implicit-coercion: 1
|
42
|
+
no-implied-eval: 1
|
43
|
+
no-invalid-this: 0
|
44
|
+
no-iterator: 1
|
45
|
+
no-labels: 0
|
46
|
+
no-lone-blocks: 1
|
47
|
+
no-loop-func: 1
|
48
|
+
no-magic-numbers: 0
|
49
|
+
no-multi-spaces: 1
|
50
|
+
no-multi-str: 1
|
51
|
+
no-new: 0
|
52
|
+
no-new-func: 1
|
53
|
+
no-new-wrappers: 1
|
54
|
+
no-octal-escape: 1
|
55
|
+
no-param-reassign: 1
|
56
|
+
no-proto: 1
|
57
|
+
no-restricted-globals: 1
|
58
|
+
no-restricted-properties: 0
|
59
|
+
no-return-assign: 1
|
60
|
+
no-return-await: 1
|
61
|
+
no-script-url: 1
|
62
|
+
no-self-compare: 1
|
63
|
+
no-sequences: 1
|
64
|
+
no-throw-literal: 1
|
65
|
+
no-unmodified-loop-condition: 1
|
66
|
+
no-unused-expressions: 1
|
67
|
+
no-useless-call: 1
|
68
|
+
no-useless-concat: 1
|
69
|
+
no-useless-return: 1
|
70
|
+
no-void: 1
|
71
|
+
no-warning-comments: 0
|
72
|
+
prefer-named-capture-group: 0
|
73
|
+
prefer-promise-reject-errors: 1
|
74
|
+
radix: 1
|
75
|
+
require-await: 1
|
76
|
+
require-unicode-regexp: 0
|
77
|
+
vars-on-top: 1
|
78
|
+
wrap-iife: 1
|
79
|
+
yoda: 1
|
80
|
+
|
81
|
+
# Strict Mode
|
82
|
+
strict: [1, 'safe']
|
83
|
+
|
84
|
+
# Variables
|
85
|
+
init-declarations: 0
|
86
|
+
no-label-var: 1
|
87
|
+
no-implicit-globals: 0
|
88
|
+
no-shadow: 1
|
89
|
+
no-undef-init: 1
|
90
|
+
no-undefined: 1
|
91
|
+
no-use-before-define: 1
|
92
|
+
|
93
|
+
# Stylistic Issues
|
94
|
+
array-bracket-newline: 0
|
95
|
+
array-bracket-spacing: [1, 'never']
|
96
|
+
array-element-newline: 0
|
97
|
+
block-spacing: [1, 'always']
|
98
|
+
brace-style: [1, '1tbs']
|
99
|
+
camelcase: 1
|
100
|
+
capitalized-comments: 0
|
101
|
+
comma-dangle: [1, 'never']
|
102
|
+
comma-spacing: [1, { "before": false, "after": true }]
|
103
|
+
comma-style: 1
|
104
|
+
computed-property-spacing: [1, 'never']
|
105
|
+
consistent-this: [1, 'that']
|
106
|
+
eol-last: 1
|
107
|
+
func-call-spacing: [1, 'never']
|
108
|
+
func-name-matching: [1, 'always']
|
109
|
+
func-names: 0
|
110
|
+
func-style: [1, 'expression']
|
111
|
+
function-paren-newline: [1, 'never']
|
112
|
+
id-blacklist: 0
|
113
|
+
id-length: 0
|
114
|
+
id-match: 0
|
115
|
+
implicit-arrow-linebreak: 0
|
116
|
+
indent: [1, 4]
|
117
|
+
jsx-quotes: 0
|
118
|
+
key-spacing: 1
|
119
|
+
keyword-spacing: 1
|
120
|
+
line-comment-position: [1, 'above']
|
121
|
+
linebreak-style: [1, 'unix']
|
122
|
+
lines-around-comment: 0
|
123
|
+
lines-between-class-members: [1, 'always', { exceptAfterSingleLine: true }]
|
124
|
+
max-depth: [1, 4]
|
125
|
+
max-len: 0
|
126
|
+
max-lines: 0
|
127
|
+
max-lines-per-function: 0
|
128
|
+
max-nested-callbacks: 0
|
129
|
+
max-params: [1, 4]
|
130
|
+
max-statements: 0
|
131
|
+
max-statements-per-line: [1, { max: 1 }]
|
132
|
+
multiline-comment-style: 0
|
133
|
+
multiline-ternary: 0
|
134
|
+
new-cap: 1
|
135
|
+
new-parens: 1
|
136
|
+
newline-per-chained-call: 1
|
137
|
+
no-array-constructor: 0
|
138
|
+
no-bitwise: 0
|
139
|
+
no-continue: 0
|
140
|
+
no-inline-comments: 0
|
141
|
+
no-lonely-if: 1
|
142
|
+
no-mixed-operators: 0
|
143
|
+
no-multi-assign: 1
|
144
|
+
no-multiple-empty-lines: 1
|
145
|
+
no-negated-condition: 0
|
146
|
+
no-nested-ternary: 1
|
147
|
+
no-new-object: 0
|
148
|
+
no-plusplus: 1
|
149
|
+
no-restricted-syntax: 0
|
150
|
+
no-tabs: 1
|
151
|
+
no-ternary: 0
|
152
|
+
no-trailing-spaces: 1
|
153
|
+
no-underscore-dangle: 1
|
154
|
+
no-unneeded-ternary: 1
|
155
|
+
no-whitespace-before-property: 1
|
156
|
+
nonblock-statement-body-position: 1
|
157
|
+
object-curly-newline: 0
|
158
|
+
object-curly-spacing: [1, 'always']
|
159
|
+
object-property-newline: 0
|
160
|
+
one-var: [1, 'consecutive']
|
161
|
+
one-var-declaration-per-line: [1, 'always']
|
162
|
+
operator-assignment: [1, 'always']
|
163
|
+
operator-linebreak: 0
|
164
|
+
padded-blocks: [1, 'never']
|
165
|
+
padding-line-between-statements: 0
|
166
|
+
prefer-object-spread: 0
|
167
|
+
quote-props: 0
|
168
|
+
quotes: [1, 'single']
|
169
|
+
semi: [1, 'always']
|
170
|
+
semi-spacing: [1, { before: false, after: true }]
|
171
|
+
semi-style: [1, 'last']
|
172
|
+
sort-keys: 0
|
173
|
+
sort-vars: 0
|
174
|
+
space-before-blocks: [1, 'always']
|
175
|
+
space-before-function-paren: [1, 'always']
|
176
|
+
space-in-parens: [1, 'never']
|
177
|
+
space-infix-ops: 0
|
178
|
+
space-unary-ops: [1, { words: true, nonwords: false }]
|
179
|
+
spaced-comment: [1, 'always', { markers: ["global", "="] }]
|
180
|
+
switch-colon-spacing: [1, { after: true, before: false }]
|
181
|
+
template-tag-spacing: [1, 'always']
|
182
|
+
unicode-bom: [1, 'never']
|
183
|
+
wrap-regex: 1
|
data/.gitignore
ADDED
data/.sass-lint.yml
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Linter Options
|
2
|
+
options:
|
3
|
+
# Don't merge default rules
|
4
|
+
merge-default-rules: false
|
5
|
+
# Set the formatter to 'html'
|
6
|
+
formatter: html
|
7
|
+
# Output file instead of logging results
|
8
|
+
output-file: 'linters/sass-lint.html'
|
9
|
+
# Raise an error if more than 50 warnings are generated
|
10
|
+
max-warnings: 50
|
11
|
+
# File Options
|
12
|
+
files:
|
13
|
+
include:
|
14
|
+
- 'app/assets/stylesheets/**/*.s+(a|c)ss'
|
15
|
+
- 'docs/themes/**/*.s+(a|c)ss'
|
16
|
+
ignore:
|
17
|
+
- 'vendor/**/*.*'
|
18
|
+
# Rule Configuration
|
19
|
+
rules:
|
20
|
+
class-name-format: 0
|
21
|
+
extends-before-mixins: 2
|
22
|
+
extends-before-declarations: 2
|
23
|
+
mixins-before-declarations:
|
24
|
+
- 2
|
25
|
+
-
|
26
|
+
exclude:
|
27
|
+
- breakpoint
|
28
|
+
- breakpoint-next
|
29
|
+
- breakpoint-min
|
30
|
+
- breakpoint-max
|
31
|
+
- breakpoint-infix
|
32
|
+
- media-breakpoint-up
|
33
|
+
- media-breakpoint-down
|
34
|
+
- media-breakpoint-between
|
35
|
+
- media-breakpoint-only
|
36
|
+
- mq
|
37
|
+
no-warn: 1
|
38
|
+
no-debug: 1
|
39
|
+
hex-length:
|
40
|
+
- 2
|
41
|
+
-
|
42
|
+
style: long
|
43
|
+
hex-notation:
|
44
|
+
- 2
|
45
|
+
-
|
46
|
+
style: uppercase
|
47
|
+
indentation:
|
48
|
+
- 4
|
49
|
+
-
|
50
|
+
size: 4
|
51
|
+
property-sort-order:
|
52
|
+
- 1
|
53
|
+
-
|
54
|
+
order: alphabetical
|
55
|
+
ignore-custom-properties: false
|
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
|
4
|
+
|
5
|
+
gem 'simple_form'
|
6
|
+
|
7
|
+
# Specify your gem's dependencies in simple_form_password_with_hints.gemspec
|
8
|
+
gemspec
|
9
|
+
|
10
|
+
gem 'pg', '~> 1.1'
|
11
|
+
gem 'bootsnap', '>= 1.4.4', require: false
|
12
|
+
gem 'devise'
|
13
|
+
gem 'bootstrap'
|
14
|
+
gem 'jquery-rails'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,202 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
simple_form_password_with_hints (0.0.1)
|
5
|
+
rails
|
6
|
+
simple_form
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
actioncable (6.1.4.1)
|
12
|
+
actionpack (= 6.1.4.1)
|
13
|
+
activesupport (= 6.1.4.1)
|
14
|
+
nio4r (~> 2.0)
|
15
|
+
websocket-driver (>= 0.6.1)
|
16
|
+
actionmailbox (6.1.4.1)
|
17
|
+
actionpack (= 6.1.4.1)
|
18
|
+
activejob (= 6.1.4.1)
|
19
|
+
activerecord (= 6.1.4.1)
|
20
|
+
activestorage (= 6.1.4.1)
|
21
|
+
activesupport (= 6.1.4.1)
|
22
|
+
mail (>= 2.7.1)
|
23
|
+
actionmailer (6.1.4.1)
|
24
|
+
actionpack (= 6.1.4.1)
|
25
|
+
actionview (= 6.1.4.1)
|
26
|
+
activejob (= 6.1.4.1)
|
27
|
+
activesupport (= 6.1.4.1)
|
28
|
+
mail (~> 2.5, >= 2.5.4)
|
29
|
+
rails-dom-testing (~> 2.0)
|
30
|
+
actionpack (6.1.4.1)
|
31
|
+
actionview (= 6.1.4.1)
|
32
|
+
activesupport (= 6.1.4.1)
|
33
|
+
rack (~> 2.0, >= 2.0.9)
|
34
|
+
rack-test (>= 0.6.3)
|
35
|
+
rails-dom-testing (~> 2.0)
|
36
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
37
|
+
actiontext (6.1.4.1)
|
38
|
+
actionpack (= 6.1.4.1)
|
39
|
+
activerecord (= 6.1.4.1)
|
40
|
+
activestorage (= 6.1.4.1)
|
41
|
+
activesupport (= 6.1.4.1)
|
42
|
+
nokogiri (>= 1.8.5)
|
43
|
+
actionview (6.1.4.1)
|
44
|
+
activesupport (= 6.1.4.1)
|
45
|
+
builder (~> 3.1)
|
46
|
+
erubi (~> 1.4)
|
47
|
+
rails-dom-testing (~> 2.0)
|
48
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
49
|
+
activejob (6.1.4.1)
|
50
|
+
activesupport (= 6.1.4.1)
|
51
|
+
globalid (>= 0.3.6)
|
52
|
+
activemodel (6.1.4.1)
|
53
|
+
activesupport (= 6.1.4.1)
|
54
|
+
activerecord (6.1.4.1)
|
55
|
+
activemodel (= 6.1.4.1)
|
56
|
+
activesupport (= 6.1.4.1)
|
57
|
+
activestorage (6.1.4.1)
|
58
|
+
actionpack (= 6.1.4.1)
|
59
|
+
activejob (= 6.1.4.1)
|
60
|
+
activerecord (= 6.1.4.1)
|
61
|
+
activesupport (= 6.1.4.1)
|
62
|
+
marcel (~> 1.0.0)
|
63
|
+
mini_mime (>= 1.1.0)
|
64
|
+
activesupport (6.1.4.1)
|
65
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
66
|
+
i18n (>= 1.6, < 2)
|
67
|
+
minitest (>= 5.1)
|
68
|
+
tzinfo (~> 2.0)
|
69
|
+
zeitwerk (~> 2.3)
|
70
|
+
autoprefixer-rails (10.3.3.0)
|
71
|
+
execjs (~> 2)
|
72
|
+
bcrypt (3.1.16)
|
73
|
+
bootsnap (1.9.1)
|
74
|
+
msgpack (~> 1.0)
|
75
|
+
bootstrap (4.6.0)
|
76
|
+
autoprefixer-rails (>= 9.1.0)
|
77
|
+
popper_js (>= 1.14.3, < 2)
|
78
|
+
sassc-rails (>= 2.0.0)
|
79
|
+
builder (3.2.4)
|
80
|
+
concurrent-ruby (1.1.9)
|
81
|
+
crass (1.0.6)
|
82
|
+
devise (4.8.0)
|
83
|
+
bcrypt (~> 3.0)
|
84
|
+
orm_adapter (~> 0.1)
|
85
|
+
railties (>= 4.1.0)
|
86
|
+
responders
|
87
|
+
warden (~> 1.2.3)
|
88
|
+
erubi (1.10.0)
|
89
|
+
execjs (2.8.1)
|
90
|
+
ffi (1.15.4)
|
91
|
+
globalid (0.5.2)
|
92
|
+
activesupport (>= 5.0)
|
93
|
+
i18n (1.8.10)
|
94
|
+
concurrent-ruby (~> 1.0)
|
95
|
+
jquery-rails (4.4.0)
|
96
|
+
rails-dom-testing (>= 1, < 3)
|
97
|
+
railties (>= 4.2.0)
|
98
|
+
thor (>= 0.14, < 2.0)
|
99
|
+
listen (3.7.0)
|
100
|
+
rb-fsevent (~> 0.10, >= 0.10.3)
|
101
|
+
rb-inotify (~> 0.9, >= 0.9.10)
|
102
|
+
loofah (2.12.0)
|
103
|
+
crass (~> 1.0.2)
|
104
|
+
nokogiri (>= 1.5.9)
|
105
|
+
mail (2.7.1)
|
106
|
+
mini_mime (>= 0.1.1)
|
107
|
+
marcel (1.0.2)
|
108
|
+
method_source (1.0.0)
|
109
|
+
mini_mime (1.1.1)
|
110
|
+
mini_portile2 (2.6.1)
|
111
|
+
minitest (5.14.4)
|
112
|
+
msgpack (1.4.2)
|
113
|
+
nio4r (2.5.8)
|
114
|
+
nokogiri (1.12.4)
|
115
|
+
mini_portile2 (~> 2.6.1)
|
116
|
+
racc (~> 1.4)
|
117
|
+
orm_adapter (0.5.0)
|
118
|
+
pg (1.2.3)
|
119
|
+
popper_js (1.16.0)
|
120
|
+
racc (1.5.2)
|
121
|
+
rack (2.2.3)
|
122
|
+
rack-test (1.1.0)
|
123
|
+
rack (>= 1.0, < 3)
|
124
|
+
rails (6.1.4.1)
|
125
|
+
actioncable (= 6.1.4.1)
|
126
|
+
actionmailbox (= 6.1.4.1)
|
127
|
+
actionmailer (= 6.1.4.1)
|
128
|
+
actionpack (= 6.1.4.1)
|
129
|
+
actiontext (= 6.1.4.1)
|
130
|
+
actionview (= 6.1.4.1)
|
131
|
+
activejob (= 6.1.4.1)
|
132
|
+
activemodel (= 6.1.4.1)
|
133
|
+
activerecord (= 6.1.4.1)
|
134
|
+
activestorage (= 6.1.4.1)
|
135
|
+
activesupport (= 6.1.4.1)
|
136
|
+
bundler (>= 1.15.0)
|
137
|
+
railties (= 6.1.4.1)
|
138
|
+
sprockets-rails (>= 2.0.0)
|
139
|
+
rails-dom-testing (2.0.3)
|
140
|
+
activesupport (>= 4.2.0)
|
141
|
+
nokogiri (>= 1.6)
|
142
|
+
rails-html-sanitizer (1.4.2)
|
143
|
+
loofah (~> 2.3)
|
144
|
+
railties (6.1.4.1)
|
145
|
+
actionpack (= 6.1.4.1)
|
146
|
+
activesupport (= 6.1.4.1)
|
147
|
+
method_source
|
148
|
+
rake (>= 0.13)
|
149
|
+
thor (~> 1.0)
|
150
|
+
rake (13.0.6)
|
151
|
+
rb-fsevent (0.11.0)
|
152
|
+
rb-inotify (0.10.1)
|
153
|
+
ffi (~> 1.0)
|
154
|
+
responders (3.0.1)
|
155
|
+
actionpack (>= 5.0)
|
156
|
+
railties (>= 5.0)
|
157
|
+
sassc (2.4.0)
|
158
|
+
ffi (~> 1.9)
|
159
|
+
sassc-rails (2.1.2)
|
160
|
+
railties (>= 4.0.0)
|
161
|
+
sassc (>= 2.0)
|
162
|
+
sprockets (> 3.0)
|
163
|
+
sprockets-rails
|
164
|
+
tilt
|
165
|
+
simple_form (5.1.0)
|
166
|
+
actionpack (>= 5.2)
|
167
|
+
activemodel (>= 5.2)
|
168
|
+
sprockets (4.0.2)
|
169
|
+
concurrent-ruby (~> 1.0)
|
170
|
+
rack (> 1, < 3)
|
171
|
+
sprockets-rails (3.2.2)
|
172
|
+
actionpack (>= 4.0)
|
173
|
+
activesupport (>= 4.0)
|
174
|
+
sprockets (>= 3.0.0)
|
175
|
+
sqlite3 (1.4.2)
|
176
|
+
thor (1.1.0)
|
177
|
+
tilt (2.0.10)
|
178
|
+
tzinfo (2.0.4)
|
179
|
+
concurrent-ruby (~> 1.0)
|
180
|
+
warden (1.2.9)
|
181
|
+
rack (>= 2.0.9)
|
182
|
+
websocket-driver (0.7.5)
|
183
|
+
websocket-extensions (>= 0.1.0)
|
184
|
+
websocket-extensions (0.1.5)
|
185
|
+
zeitwerk (2.4.2)
|
186
|
+
|
187
|
+
PLATFORMS
|
188
|
+
ruby
|
189
|
+
|
190
|
+
DEPENDENCIES
|
191
|
+
bootsnap (>= 1.4.4)
|
192
|
+
bootstrap
|
193
|
+
devise
|
194
|
+
jquery-rails
|
195
|
+
listen
|
196
|
+
pg (~> 1.1)
|
197
|
+
simple_form
|
198
|
+
simple_form_password_with_hints!
|
199
|
+
sqlite3
|
200
|
+
|
201
|
+
BUNDLED WITH
|
202
|
+
2.1.4
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2021 Noesya
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
# simple_form_password_with_hints
|
2
|
+
|
3
|
+
A nice improvement for the password fields in [Simple Form](https://github.com/heartcombo/simple_form).
|
4
|
+
|
5
|
+
**Simple Form Password With Hints** aims to add directs (javascript) controls to your password fields in Simple Form.
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add it to your Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'simple_form_password_with_hints'
|
15
|
+
```
|
16
|
+
|
17
|
+
Run the following command to install it:
|
18
|
+
|
19
|
+
```console
|
20
|
+
bundle install
|
21
|
+
```
|
22
|
+
|
23
|
+
### Bootstrap
|
24
|
+
|
25
|
+
**Simple Form Password With Hints** relies on the [Bootstrap](http://getbootstrap.com/) markup, so it presumes that you installed Simple Form with the Bootstrap option. To do that you have to use the `bootstrap` option in the Simple Form install generator, like this:
|
26
|
+
|
27
|
+
```console
|
28
|
+
rails generate simple_form:install --bootstrap
|
29
|
+
```
|
30
|
+
|
31
|
+
You have to be sure that you added a copy of the [Bootstrap](http://getbootstrap.com/)
|
32
|
+
assets on your application.
|
33
|
+
|
34
|
+
## Usage
|
35
|
+
|
36
|
+
**Simple Form Password With Hints** comes with two new input types. One is meant to replace the standard `:password` field: `:password_with_hints`. The second one is meant to replace the `:password_confirmation` field: `:password_with_sync`.
|
37
|
+
|
38
|
+
To start using **Simple Form Password With Hints** you just have to change the input type of the `:password` / `:password_confirmation` fields.
|
39
|
+
|
40
|
+
So basically your field:
|
41
|
+
```erb
|
42
|
+
<%= f.input :password %>
|
43
|
+
```
|
44
|
+
becomes
|
45
|
+
```erb
|
46
|
+
<%= f.input :password,
|
47
|
+
as: :password_with_hints,
|
48
|
+
validators: {
|
49
|
+
length: 6,
|
50
|
+
uppercase_char: true,
|
51
|
+
lowercase_char: true,
|
52
|
+
numeric_char: true,
|
53
|
+
special_char: '#&@?!'
|
54
|
+
} %>
|
55
|
+
```
|
56
|
+
|
57
|
+
and your field
|
58
|
+
```erb
|
59
|
+
<%= f.input :password_confirmation %>
|
60
|
+
```
|
61
|
+
becomes
|
62
|
+
```erb
|
63
|
+
<%= f.input :password_confirmation,
|
64
|
+
as: :password_with_sync,
|
65
|
+
compare_with_field: :password %>
|
66
|
+
```
|
67
|
+
|
68
|
+
For both kind of fields you can add an option `allow_password_uncloaking: true` which will add an eye on the right side of the field. Clicking on the eye will toggle the visibility of the password field between stars (******) and text (Mypassword!).
|
69
|
+
|
70
|
+
Of course you can add every other current option to your fields.
|
71
|
+
|
72
|
+
For `:password_with_hints` field you can safely ignore every validator you don't want to use. Just set the test to false or delete the line.
|
73
|
+
|
74
|
+
### Model validation
|
75
|
+
|
76
|
+
Please keep in mind that the controls are only indicatives, and don't prevent to submit the fields, even when all checks are not filled.
|
77
|
+
So you will have to ensure of the password complexity in the model file.
|
78
|
+
Basically in your `User` model you will have to add a test like this:
|
79
|
+
```erb
|
80
|
+
validate :password_complexity
|
81
|
+
|
82
|
+
def password_complexity
|
83
|
+
# Regexp extracted from https://stackoverflow.com/questions/19605150/regex-for-password-must-contain-at-least-eight-characters-at-least-one-number-a
|
84
|
+
return if password.blank? || password =~ /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!,@$%^&*+£µ-]).{8,70}$/
|
85
|
+
errors.add :password, 'Your password is not strong enough'
|
86
|
+
end
|
87
|
+
```
|
88
|
+
|
89
|
+
This regex matches the validators:
|
90
|
+
```erb
|
91
|
+
validators: {
|
92
|
+
length: 8,
|
93
|
+
uppercase_char: true,
|
94
|
+
lowercase_char: true,
|
95
|
+
numeric_char: true,
|
96
|
+
special_char: '#?!,@$%^&*+£µ-'
|
97
|
+
}
|
98
|
+
```
|
99
|
+
|
100
|
+
If you use `Devise` you might want to use the gem setup directly. And maybe add the special chars list in the configuration.
|
101
|
+
So in you `config/application.rb` you might add `config.allowed_special_chars = '#?!,@$%^&*+£µ-'`.
|
102
|
+
And then your regex in the model file should look like that:
|
103
|
+
```erb
|
104
|
+
/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#{Rails.application.config.allowed_special_chars}]).{#{Devise.password_length.first},#{Devise.password_length.last}}$/
|
105
|
+
```
|
106
|
+
and the validator:
|
107
|
+
```erb
|
108
|
+
validators: {
|
109
|
+
length: Devise.password_length.first,
|
110
|
+
uppercase_char: true,
|
111
|
+
lowercase_char: true,
|
112
|
+
numeric_char: true,
|
113
|
+
special_char: Rails.application.config.allowed_special_chars
|
114
|
+
}
|
115
|
+
```
|
116
|
+
|
117
|
+
|
118
|
+
## I18n
|
119
|
+
|
120
|
+
**Simple Form With Hints** uses the I18n API to manage the texts displayed. Feel free to overwrite the keys or add languages.
|
121
|
+
|
122
|
+
## Information
|
123
|
+
|
124
|
+
### Supported Ruby / Rails versions
|
125
|
+
|
126
|
+
We intend to maintain support for all Ruby / Rails versions that haven't reached end-of-life.
|
127
|
+
|
128
|
+
For more information about specific versions please check [Ruby](https://www.ruby-lang.org/en/downloads/branches/)
|
129
|
+
and [Rails](https://guides.rubyonrails.org/maintenance_policy.html) maintenance policies, and our test matrix.
|
130
|
+
|
131
|
+
### Bug reports
|
132
|
+
|
133
|
+
If you discover any bugs, feel free to create an issue on GitHub. Please add as much information as
|
134
|
+
possible to help us in fixing the potential bug. We also encourage you to help even more by forking and sending us a pull request.
|
135
|
+
|
136
|
+
https://github.com/noesya/simple_form_password_with_hints/issues
|
137
|
+
|
138
|
+
## Maintainers
|
139
|
+
|
140
|
+
* Pierre-André Boissinot (https://github.com/pabois)
|
141
|
+
|
142
|
+
|
143
|
+
## License
|
144
|
+
|
145
|
+
MIT License.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512.001 512.001"><path fill="#E40000" d="M294.111 256.001L504.109 46.003c10.523-10.524 10.523-27.586 0-38.109-10.524-10.524-27.587-10.524-38.11 0L256 217.892 46.002 7.894C35.478-2.63 18.416-2.63 7.893 7.894s-10.524 27.586 0 38.109l209.998 209.998L7.893 465.999c-10.524 10.524-10.524 27.586 0 38.109 10.524 10.524 27.586 10.523 38.109 0L256 294.11l209.997 209.998c10.524 10.524 27.587 10.523 38.11 0 10.523-10.524 10.523-27.586 0-38.109L294.111 256.001z"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512.001 512.001"><path d="M316.332 195.662c-4.16-4.16-10.923-4.16-15.083 0s-4.16 10.944 0 15.083c12.075 12.075 18.752 28.139 18.752 45.248 0 35.285-28.715 64-64 64-17.109 0-33.173-6.656-45.248-18.752-4.16-4.16-10.923-4.16-15.083 0-4.16 4.139-4.16 10.923 0 15.083 16.085 16.128 37.525 25.003 60.331 25.003 47.061 0 85.333-38.272 85.333-85.333 0-22.807-8.874-44.247-25.002-60.332zM270.87 172.131c-4.843-.853-9.792-1.472-14.869-1.472-47.061 0-85.333 38.272-85.333 85.333 0 5.077.619 10.027 1.493 14.869.917 5.163 5.419 8.811 10.475 8.811.619 0 1.237-.043 1.877-.171 5.781-1.024 9.664-6.571 8.64-12.352-.661-3.627-1.152-7.317-1.152-11.157 0-35.285 28.715-64 64-64 3.84 0 7.531.491 11.157 1.131 5.675 1.152 11.328-2.859 12.352-8.64 1.024-5.781-2.858-11.328-8.64-12.352z"/><path d="M509.462 249.102c-2.411-2.859-60.117-70.208-139.712-111.445-5.163-2.709-11.669-.661-14.379 4.587-2.709 5.227-.661 11.669 4.587 14.379 61.312 31.744 110.293 81.28 127.04 99.371-25.429 27.541-125.504 128-230.997 128-35.797 0-71.872-8.64-107.264-25.707-5.248-2.581-11.669-.341-14.229 4.971-2.581 5.291-.341 11.669 4.971 14.229 38.293 18.496 77.504 27.84 116.523 27.84 131.435 0 248.555-136.619 253.483-142.443 3.369-3.969 3.348-9.793-.023-13.782zM325.996 118.947c-24.277-8.171-47.829-12.288-69.995-12.288-131.435 0-248.555 136.619-253.483 142.443-3.115 3.669-3.371 9.003-.597 12.992 1.472 2.112 36.736 52.181 97.856 92.779a10.48 10.48 0 005.888 1.792c3.435 0 6.827-1.664 8.875-4.8 3.264-4.885 1.92-11.52-2.987-14.763-44.885-29.845-75.605-65.877-87.104-80.533 24.555-26.667 125.291-128.576 231.552-128.576 19.861 0 41.131 3.755 63.189 11.157 5.589 2.005 11.648-1.088 13.504-6.699 1.878-5.589-1.109-11.626-6.698-13.504z"/><path d="M444.865 67.128c-4.16-4.16-10.923-4.16-15.083 0L67.116 429.795c-4.16 4.16-4.16 10.923 0 15.083a10.716 10.716 0 007.552 3.115c2.731 0 5.461-1.045 7.531-3.115L444.865 82.211c4.16-4.16 4.16-10.923 0-15.083z"/></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 511.992 511.992"><path d="M510.096 249.937c-4.032-5.867-100.928-143.275-254.101-143.275-131.435 0-248.555 136.619-253.483 142.443-3.349 3.968-3.349 9.792 0 13.781C7.44 268.71 124.56 405.329 255.995 405.329S504.549 268.71 509.477 262.886c3.094-3.669 3.371-8.981.619-12.949zM255.995 383.996c-105.365 0-205.547-100.48-230.997-128 25.408-27.541 125.483-128 230.997-128 123.285 0 210.304 100.331 231.552 127.424-24.534 26.645-125.291 128.576-231.552 128.576z"/><path d="M255.995 170.662c-47.061 0-85.333 38.272-85.333 85.333s38.272 85.333 85.333 85.333 85.333-38.272 85.333-85.333-38.272-85.333-85.333-85.333zm0 149.334c-35.285 0-64-28.715-64-64s28.715-64 64-64 64 28.715 64 64-28.715 64-64 64z"/></svg>
|
@@ -0,0 +1,87 @@
|
|
1
|
+
/*global $, RegExp */
|
2
|
+
$(function () {
|
3
|
+
'use strict';
|
4
|
+
var getCheckRegex = function (key, $check) {
|
5
|
+
var regex,
|
6
|
+
min,
|
7
|
+
chars;
|
8
|
+
switch (key) {
|
9
|
+
case 'uppercase':
|
10
|
+
regex = '[A-Z]';
|
11
|
+
break;
|
12
|
+
case 'lowercase':
|
13
|
+
regex = '[a-z]';
|
14
|
+
break;
|
15
|
+
case 'number':
|
16
|
+
regex = '[0-9]';
|
17
|
+
break;
|
18
|
+
case 'special':
|
19
|
+
// hyphen must be at the end
|
20
|
+
chars = $check.data('chars');
|
21
|
+
regex = '[' + chars + ']';
|
22
|
+
break;
|
23
|
+
case 'length':
|
24
|
+
min = $check.data('length');
|
25
|
+
regex = '.{' + min + ',128}';
|
26
|
+
break;
|
27
|
+
default:
|
28
|
+
break;
|
29
|
+
}
|
30
|
+
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
|
+
}
|
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);
|
83
|
+
|
84
|
+
$field.on('input', { $field: $field, $target: $target }, compareFields);
|
85
|
+
$target.on('input', { $field: $field, $target: $target }, compareFields);
|
86
|
+
});
|
87
|
+
});
|
@@ -0,0 +1,46 @@
|
|
1
|
+
.password_with_hints, .password_with_sync
|
2
|
+
position: relative
|
3
|
+
.sfpwh
|
4
|
+
&-controls
|
5
|
+
text-align: right
|
6
|
+
-moz-user-select: none !important
|
7
|
+
-ms-user-select: none !important
|
8
|
+
-webkit-user-select: none !important
|
9
|
+
user-select: none !important
|
10
|
+
& ~.invalid-feedback
|
11
|
+
margin-top: -1.275rem
|
12
|
+
&-hint
|
13
|
+
font-size: 11px
|
14
|
+
white-space: nowrap
|
15
|
+
&:not(:first-child)
|
16
|
+
margin-left: 10px
|
17
|
+
&::before
|
18
|
+
background-image: asset-url('icon-check.svg')
|
19
|
+
background-position: center
|
20
|
+
background-repeat: no-repeat
|
21
|
+
background-size: 10px auto
|
22
|
+
content: ''
|
23
|
+
display: inline-block
|
24
|
+
height: 10px
|
25
|
+
margin-right: 4px
|
26
|
+
margin-top: -2px
|
27
|
+
vertical-align: middle
|
28
|
+
width: 10px
|
29
|
+
&--invalid
|
30
|
+
&::before
|
31
|
+
background-image: asset-url('icon-cancel.svg')
|
32
|
+
background-size: 8px auto
|
33
|
+
&-password-toggle
|
34
|
+
cursor: pointer
|
35
|
+
position: absolute
|
36
|
+
right: 10px
|
37
|
+
top: calc(50% - 9px)
|
38
|
+
width: 20px
|
39
|
+
&::before
|
40
|
+
content: asset-url('icon-eye.svg')
|
41
|
+
&-revealed
|
42
|
+
&::before
|
43
|
+
content: asset-url('icon-eye-slash.svg')
|
44
|
+
|
45
|
+
.is-invalid ~ .sfpwh-password-toggle
|
46
|
+
right: 35px
|
@@ -0,0 +1,76 @@
|
|
1
|
+
class PasswordWithHintsInput < SimpleForm::Inputs::Base
|
2
|
+
enable :placeholder, :maxlength, :minlength
|
3
|
+
|
4
|
+
def input(wrapper_options = nil)
|
5
|
+
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
|
6
|
+
merged_input_options[:class] << " js-sfpwh-input js-sfpwh-hints-input "
|
7
|
+
@builder.password_field(attribute_name, merged_input_options) +
|
8
|
+
password_uncloaking_div +
|
9
|
+
template.content_tag(:div, '', class: 'sfpwh-controls js-sfpwh-controls') do
|
10
|
+
[
|
11
|
+
length_div,
|
12
|
+
uppercase_div,
|
13
|
+
lowercase_div,
|
14
|
+
numeric_div,
|
15
|
+
special_char_div,
|
16
|
+
].compact.join.html_safe
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def password_uncloaking_div
|
21
|
+
template.content_tag(
|
22
|
+
:span,
|
23
|
+
'',
|
24
|
+
class: 'sfpwh-password-toggle js-sfpwh-password-toggle'
|
25
|
+
) if options[:allow_password_uncloaking]
|
26
|
+
end
|
27
|
+
|
28
|
+
def length_div
|
29
|
+
template.content_tag(
|
30
|
+
:span,
|
31
|
+
t('simple_form_password_with_hints.test_chars', min_length: options[:validators][:length]),
|
32
|
+
data: { length: options[:validators][:length] },
|
33
|
+
class: 'sfpwh-hint sfpwh-hint--invalid sfpwh-hint--length js-sfpwh-hint-length'
|
34
|
+
) if should_display?(:length)
|
35
|
+
end
|
36
|
+
|
37
|
+
def uppercase_div
|
38
|
+
template.content_tag(
|
39
|
+
:span,
|
40
|
+
t('simple_form_password_with_hints.test_uppercase'),
|
41
|
+
class: 'sfpwh-hint sfpwh-hint--invalid sfpwh-hint--uppercase js-sfpwh-hint-uppercase'
|
42
|
+
) if should_display?(:uppercase_char)
|
43
|
+
end
|
44
|
+
|
45
|
+
def lowercase_div
|
46
|
+
template.content_tag(
|
47
|
+
:span,
|
48
|
+
t('simple_form_password_with_hints.test_lowercase'),
|
49
|
+
class: 'sfpwh-hint sfpwh-hint--invalid sfpwh-hint--lowercase js-sfpwh-hint-lowercase'
|
50
|
+
) if should_display?(:lowercase_char)
|
51
|
+
end
|
52
|
+
|
53
|
+
def numeric_div
|
54
|
+
template.content_tag(
|
55
|
+
:span,
|
56
|
+
t('simple_form_password_with_hints.test_numeric'),
|
57
|
+
class: 'sfpwh-hint sfpwh-hint--invalid sfpwh-hint--number js-sfpwh-hint-number'
|
58
|
+
) if should_display?(:numeric_char)
|
59
|
+
end
|
60
|
+
|
61
|
+
def special_char_div
|
62
|
+
template.content_tag(
|
63
|
+
:span,
|
64
|
+
t('simple_form_password_with_hints.test_special_char'),
|
65
|
+
data: { chars: options[:validators][:special_char] },
|
66
|
+
class: 'sfpwh-hint sfpwh-hint--invalid sfpwh-hint--special js-sfpwh-hint-special'
|
67
|
+
) if should_display?(:special_char)
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def should_display?(test)
|
73
|
+
options.has_key?(:validators) && options[:validators].has_key?(test) && options[:validators][test] != false
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class PasswordWithSyncInput < SimpleForm::Inputs::Base
|
2
|
+
enable :placeholder, :maxlength, :minlength
|
3
|
+
|
4
|
+
def input(wrapper_options = nil)
|
5
|
+
merged_input_options = merge_wrapper_options(input_html_options, wrapper_options)
|
6
|
+
merged_input_options[:class] << " js-sfpwh-input js-sfpwh-sync-input "
|
7
|
+
if options[:compare_with_field]
|
8
|
+
if merged_input_options[:data].nil?
|
9
|
+
merged_input_options[:data] = { link_to: linked_field_name }
|
10
|
+
else
|
11
|
+
merged_input_options[:data][:link_to] = linked_field_name
|
12
|
+
end
|
13
|
+
@builder.password_field(attribute_name, merged_input_options) +
|
14
|
+
password_uncloaking_div +
|
15
|
+
template.content_tag(:div, '', class: 'sfpwh-controls js-sfpwh-controls') do
|
16
|
+
template.content_tag(
|
17
|
+
:span,
|
18
|
+
t('simple_form_password_with_hints.test_fields_matching'),
|
19
|
+
class: 'sfpwh-hint sfpwh-hint--invalid sfpwh-hint--match js-sfpwh-hint-match'
|
20
|
+
)
|
21
|
+
end
|
22
|
+
else
|
23
|
+
@builder.password_field(attribute_name, merged_input_options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def password_uncloaking_div
|
28
|
+
template.content_tag(
|
29
|
+
:span,
|
30
|
+
'',
|
31
|
+
class: 'sfpwh-password-toggle js-sfpwh-password-toggle'
|
32
|
+
) if options[:allow_password_uncloaking]
|
33
|
+
end
|
34
|
+
|
35
|
+
def linked_field_name
|
36
|
+
"#{@builder.object_name}[#{options[:compare_with_field]}]"
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'simple_form_password_with_hints/password_with_hints_input'
|
2
|
+
require 'simple_form_password_with_hints/password_with_sync_input'
|
3
|
+
|
4
|
+
module SimpleFormPasswordWithHints
|
5
|
+
def self.add_paths!
|
6
|
+
Sprockets.append_path stylesheets_path
|
7
|
+
Sprockets.append_path images_path
|
8
|
+
Sprockets.append_path javascripts_path
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.add_locales!
|
12
|
+
I18n.load_path += Dir["#{root_path}/config/locales/*.yml"]
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def self.stylesheets_path
|
18
|
+
File.join assets_path, 'stylesheets'
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.images_path
|
22
|
+
File.join assets_path, 'images'
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.javascripts_path
|
26
|
+
File.join assets_path, 'javascripts'
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.assets_path
|
30
|
+
@assets_path ||= File.join root_path, 'assets'
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.root_path
|
34
|
+
@root_path ||= File.expand_path '..', File.dirname(__FILE__)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
SimpleFormPasswordWithHints.add_paths!
|
40
|
+
SimpleFormPasswordWithHints.add_locales!
|
@@ -0,0 +1,25 @@
|
|
1
|
+
lib = File.expand_path("../lib", __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "simple_form_password_with_hints/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'simple_form_password_with_hints'
|
7
|
+
s.version = SimpleFormPasswordWithHints::VERSION
|
8
|
+
s.summary = "Simple Form Password with Hints"
|
9
|
+
s.description = "Improve Simple Form basic password field, add controls on the field."
|
10
|
+
s.authors = ["Pierre-andré Boissinot"]
|
11
|
+
s.email = 'pa@boissinot.paris'
|
12
|
+
s.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
13
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
14
|
+
end
|
15
|
+
s.require_paths = ['lib']
|
16
|
+
s.homepage =
|
17
|
+
'https://github.com/noesya/simple_form_password_with_hints'
|
18
|
+
s.license = 'MIT'
|
19
|
+
|
20
|
+
s.add_dependency "rails"
|
21
|
+
s.add_dependency "simple_form"
|
22
|
+
|
23
|
+
s.add_development_dependency "listen"
|
24
|
+
s.add_development_dependency "sqlite3"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_form_password_with_hints
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Pierre-andré Boissinot
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-09-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: simple_form
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: listen
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sqlite3
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Improve Simple Form basic password field, add controls on the field.
|
70
|
+
email: pa@boissinot.paris
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- ".DS_Store"
|
76
|
+
- ".eslintrc.yml"
|
77
|
+
- ".gitignore"
|
78
|
+
- ".sass-lint.yml"
|
79
|
+
- Gemfile
|
80
|
+
- Gemfile.lock
|
81
|
+
- LICENSE
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- assets/images/icon-cancel.svg
|
85
|
+
- assets/images/icon-check.svg
|
86
|
+
- assets/images/icon-eye-slash.svg
|
87
|
+
- assets/images/icon-eye.svg
|
88
|
+
- assets/javascripts/simple_form_password_with_hints.js
|
89
|
+
- assets/stylesheets/simple_form_password_with_hints.sass
|
90
|
+
- config/locales/en.yml
|
91
|
+
- lib/simple_form_password_with_hints.rb
|
92
|
+
- lib/simple_form_password_with_hints/password_with_hints_input.rb
|
93
|
+
- lib/simple_form_password_with_hints/password_with_sync_input.rb
|
94
|
+
- lib/simple_form_password_with_hints/version.rb
|
95
|
+
- simple_form_password_with_hints.gemspec
|
96
|
+
homepage: https://github.com/noesya/simple_form_password_with_hints
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubygems_version: 3.1.4
|
116
|
+
signing_key:
|
117
|
+
specification_version: 4
|
118
|
+
summary: Simple Form Password with Hints
|
119
|
+
test_files: []
|