ditty 0.4.1 → 0.6.0

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/Readme.md +3 -12
  4. data/ditty.gemspec +4 -1
  5. data/exe/ditty +4 -0
  6. data/lib/ditty/cli.rb +44 -0
  7. data/lib/ditty/controllers/application.rb +3 -4
  8. data/lib/ditty/controllers/component.rb +38 -14
  9. data/lib/ditty/controllers/main.rb +115 -34
  10. data/lib/ditty/controllers/users.rb +7 -10
  11. data/lib/ditty/db.rb +6 -1
  12. data/lib/ditty/emails/base.rb +74 -0
  13. data/lib/ditty/emails/forgot_password.rb +15 -0
  14. data/lib/ditty/helpers/authentication.rb +2 -2
  15. data/lib/ditty/helpers/component.rb +7 -4
  16. data/lib/ditty/helpers/views.rb +5 -2
  17. data/lib/ditty/listener.rb +41 -7
  18. data/lib/ditty/models/user.rb +8 -4
  19. data/lib/ditty/policies/identity_policy.rb +2 -2
  20. data/lib/ditty/rake_tasks.rb +6 -5
  21. data/lib/ditty/services/authentication.rb +55 -0
  22. data/lib/ditty/services/email.rb +18 -20
  23. data/lib/ditty/services/logger.rb +10 -8
  24. data/lib/ditty/services/pagination_wrapper.rb +82 -0
  25. data/lib/ditty/services/settings.rb +45 -0
  26. data/lib/ditty/version.rb +1 -1
  27. data/migrate/20180307_password_reset.rb +10 -0
  28. data/views/audit_logs/index.haml +1 -1
  29. data/views/emails/base.haml +2 -0
  30. data/views/emails/forgot_password.haml +26 -0
  31. data/views/emails/layouts/action.haml +68 -0
  32. data/views/emails/layouts/alert.haml +88 -0
  33. data/views/emails/layouts/billing.haml +108 -0
  34. data/views/identity/forgot.haml +16 -0
  35. data/views/identity/login.haml +16 -5
  36. data/views/identity/register.haml +8 -0
  37. data/views/identity/reset.haml +20 -0
  38. data/views/layout.haml +2 -0
  39. metadata +62 -5
  40. data/lib/ditty/helpers/wisper.rb +0 -14
@@ -0,0 +1,108 @@
1
+ !!!
2
+ %html{:style => "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;", :xmlns => "http://www.w3.org/1999/xhtml"}
3
+ %head
4
+ %meta{:content => "width=device-width", :name => "viewport"}/
5
+ %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
6
+ %title Billing e.g. invoices and receipts
7
+ :css
8
+ img {
9
+ max-width: 100%;
10
+ }
11
+ body {
12
+ -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em;
13
+ }
14
+ body {
15
+ background-color: #f6f6f6;
16
+ }
17
+ @media only screen and (max-width: 640px) {
18
+ body {
19
+ padding: 0 !important;
20
+ }
21
+ h1 {
22
+ font-weight: 800 !important; margin: 20px 0 5px !important;
23
+ }
24
+ h2 {
25
+ font-weight: 800 !important; margin: 20px 0 5px !important;
26
+ }
27
+ h3 {
28
+ font-weight: 800 !important; margin: 20px 0 5px !important;
29
+ }
30
+ h4 {
31
+ font-weight: 800 !important; margin: 20px 0 5px !important;
32
+ }
33
+ h1 {
34
+ font-size: 22px !important;
35
+ }
36
+ h2 {
37
+ font-size: 18px !important;
38
+ }
39
+ h3 {
40
+ font-size: 16px !important;
41
+ }
42
+ .container {
43
+ padding: 0 !important; width: 100% !important;
44
+ }
45
+ .content {
46
+ padding: 0 !important;
47
+ }
48
+ .content-wrap {
49
+ padding: 10px !important;
50
+ }
51
+ .invoice {
52
+ width: 100% !important;
53
+ }
54
+ }
55
+ %body{:bgcolor => "#f6f6f6", :itemscope => "", :itemtype => "http://schema.org/EmailMessage", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em; background-color: #f6f6f6; margin: 0;"}
56
+ %table.body-wrap{:bgcolor => "#f6f6f6", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;"}
57
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
58
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;", :valign => "top"}
59
+ %td.container{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; margin: 0 auto;", :valign => "top", :width => "600"}
60
+ .content{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 20px;"}
61
+ %table.main{:bgcolor => "#fff", :cellpadding => "0", :cellspacing => "0", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;", :width => "100%"}
62
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
63
+ %td.content-wrap.aligncenter{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: center; margin: 0; padding: 20px;", :valign => "top"}
64
+ %table{:cellpadding => "0", :cellspacing => "0", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;", :width => "100%"}
65
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
66
+ %td.content-block{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;", :valign => "top"}
67
+ %h1.aligncenter{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,'Lucida Grande',sans-serif; box-sizing: border-box; font-size: 32px; color: #000; line-height: 1.2em; font-weight: 500; text-align: center; margin: 40px 0 0;"} $33.98 Paid
68
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
69
+ %td.content-block{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;", :valign => "top"}
70
+ %h2.aligncenter{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,'Lucida Grande',sans-serif; box-sizing: border-box; font-size: 24px; color: #000; line-height: 1.2em; font-weight: 400; text-align: center; margin: 40px 0 0;"} Thanks for using Acme Inc.
71
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
72
+ %td.content-block.aligncenter{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: center; margin: 0; padding: 0 0 20px;", :valign => "top"}
73
+ %table.invoice{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; text-align: left; width: 80%; margin: 40px auto;"}
74
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
75
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 5px 0;", :valign => "top"}
76
+ Lee Munroe
77
+ %br{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}>/
78
+ Invoice #12345
79
+ %br{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}>/
80
+ June 01 2014
81
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
82
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 5px 0;", :valign => "top"}
83
+ %table.invoice-items{:cellpadding => "0", :cellspacing => "0", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; margin: 0;"}
84
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
85
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;", :valign => "top"} Service 1
86
+ %td.alignright{:align => "right", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: right; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;", :valign => "top"} $ 19.99
87
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
88
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;", :valign => "top"} Service 2
89
+ %td.alignright{:align => "right", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: right; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;", :valign => "top"} $ 9.99
90
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
91
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;", :valign => "top"} Service 3
92
+ %td.alignright{:align => "right", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: right; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;", :valign => "top"} $ 4.00
93
+ %tr.total{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
94
+ %td.alignright{:align => "right", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: right; border-top-width: 2px; border-top-color: #333; border-top-style: solid; border-bottom-color: #333; border-bottom-width: 2px; border-bottom-style: solid; font-weight: 700; margin: 0; padding: 5px 0;", :valign => "top", :width => "80%"} Total
95
+ %td.alignright{:align => "right", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: right; border-top-width: 2px; border-top-color: #333; border-top-style: solid; border-bottom-color: #333; border-bottom-width: 2px; border-bottom-style: solid; font-weight: 700; margin: 0; padding: 5px 0;", :valign => "top"} $ 33.98
96
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
97
+ %td.content-block.aligncenter{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: center; margin: 0; padding: 0 0 20px;", :valign => "top"}
98
+ %a{:href => "http://www.mailgun.com", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;"} View in browser
99
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
100
+ %td.content-block.aligncenter{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: center; margin: 0; padding: 0 0 20px;", :valign => "top"}
101
+ Acme Inc. 123 Van Ness, San Francisco 94102
102
+ .footer{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;"}
103
+ %table{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;", :width => "100%"}
104
+ %tr{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;"}
105
+ %td.aligncenter.content-block{:align => "center", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0 0 20px;", :valign => "top"}
106
+ Questions? Email
107
+ %a{:href => "mailto:", :style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;"} support@acme.inc
108
+ %td{:style => "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;", :valign => "top"}
@@ -0,0 +1,16 @@
1
+ .row
2
+ .col-md-4
3
+ .col-md-4
4
+ .panel.panel-default
5
+ .panel-body
6
+ %p.text-center
7
+ Enter your email address and we will send you a link to reset your password if you've registered on the system.
8
+ %form.form-horizontal{ method: 'post', action: "#{settings.map_path}/auth/identity/forgot" }
9
+ .form-group
10
+ .col-sm-12
11
+ %input.form-control{ name: 'email', type: 'text', placeholder: 'Enter your email address' }
12
+ .row.text-right
13
+ .col-md-12
14
+ %button.btn.btn-primary.btn-block{ type: 'submit' }
15
+ Email password reset link
16
+ .col-md-4
@@ -6,13 +6,24 @@
6
6
  %form{ method: 'post', action: "#{settings.map_path}/auth/identity/callback" }
7
7
  .form-group
8
8
  %label.control-label Email
9
- %input.form-control.border-input{ name: 'username' }
9
+ %input.form-control.border-input{ name: 'username', tabindex: '1' }
10
10
  .form-group
11
- %label.control-label Password
12
- %input.form-control.border-input{ name: 'password', type: 'password' }
13
- %button.btn.btn-primary{ type: 'submit' } Log In
11
+ %label.control-label{ style: 'display: block' }
12
+ Password
13
+ %a{ href: "#{settings.map_path}/auth/identity/forgot", style: 'float: right', tabindex: '5' }
14
+ Forgot?
15
+ %input.form-control.border-input{ name: 'password', type: 'password', tabindex: '2' }
16
+ %button.btn.btn-primary{ type: 'submit', tabindex: '3' } Log In
14
17
  - if policy(::Ditty::Identity).register?
15
18
  .pull-right
16
19
  No account yet?
17
- %a.btn.btn-default{ href: "#{settings.map_path}/auth/identity/register" } Register
20
+ %a.btn.btn-default{ href: "#{settings.map_path}/auth/identity/register", tabindex: '4' } Register
21
+ .row
22
+ .col-sm-12= "&nbsp"
23
+ - if Ditty::Services::Authentication.provides? 'google_oauth2'
24
+ .row
25
+ .col-sm-8.col-sm-push-2
26
+ %a.btn.btn-block.btn-default{ href: "#{settings.map_path}/auth/google_oauth2" }
27
+ %i.fa.fa-google
28
+ Log in with Google
18
29
  .col-sm-3
@@ -18,4 +18,12 @@
18
18
 
19
19
  - if policy(::Ditty::Identity).register?
20
20
  %button.btn.btn-primary{ type: 'submit' } Register
21
+ .row
22
+ .col-sm-12= "&nbsp"
23
+ - if Ditty::Services::Authentication.provides? 'google_oauth2'
24
+ .row
25
+ .col-sm-8.col-sm-push-2
26
+ %a.btn.btn-block.btn-default{ href: "#{settings.map_path}/auth/google_oauth2" }
27
+ %i.fa.fa-google
28
+ Register with Google
21
29
  .col-md-2
@@ -0,0 +1,20 @@
1
+ .row
2
+ .col-md-2
3
+ .col-md-8
4
+ .panel.panel-default
5
+ .panel-body
6
+ %form.form-horizontal{ method: 'post', action: "#{settings.map_path}/auth/identity/reset" }
7
+ %input{ name: '_method', value: 'PUT', type: 'hidden' }
8
+ %input{ name: 'token', value: params['token'], type: 'hidden' }
9
+ - if identity.errors[:password] && identity.errors[:password].include?('is not strong enough')
10
+ .alert.alert-warning
11
+ %p Make sure your password is at least 8 characters long, and including the following
12
+ %ul
13
+ %li Upper- and lowercase letters
14
+ %li Numbers
15
+ %li Special Characters
16
+ = form_control(:password, identity, type: 'password', placeholder: 'Your password', group: 'identity')
17
+ = form_control(:password_confirmation, identity, type: 'password', label: 'Confirm Password', placeholder: 'Confirm your password', group: 'identity')
18
+ %button.btn.btn-primary{ type: 'submit' }
19
+ Reset Password
20
+ .col-md-2
data/views/layout.haml CHANGED
@@ -53,8 +53,10 @@
53
53
  %script{ type: 'text/javascript', src: 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js' }
54
54
  %script{ type: 'text/javascript', src: 'https://cdnjs.cloudflare.com/ajax/libs/react/15.4.1/react.min.js' }
55
55
  %script{ type: 'text/javascript', src: 'https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.bundle.min.js' }
56
+ %script{ type: 'text/javascript', src: 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js' }
56
57
  :javascript
57
58
  $(function() {
58
59
  $('.sidebar-nav').metisMenu();
60
+ $('.select2').select2();
59
61
  });
60
62
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ditty
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jurgens du Toit
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-30 00:00:00.000000000 Z
11
+ date: 2018-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '2.14'
181
+ - !ruby/object:Gem::Dependency
182
+ name: mail
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '1.7'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '1.7'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: omniauth
183
197
  requirement: !ruby/object:Gem::Requirement
@@ -318,6 +332,34 @@ dependencies:
318
332
  - - ">="
319
333
  - !ruby/object:Gem::Version
320
334
  version: '2'
335
+ - !ruby/object:Gem::Dependency
336
+ name: thor
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0.20'
342
+ type: :runtime
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0.20'
349
+ - !ruby/object:Gem::Dependency
350
+ name: will_paginate
351
+ requirement: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - ">="
354
+ - !ruby/object:Gem::Version
355
+ version: '3.1'
356
+ type: :runtime
357
+ prerelease: false
358
+ version_requirements: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - ">="
361
+ - !ruby/object:Gem::Version
362
+ version: '3.1'
321
363
  - !ruby/object:Gem::Dependency
322
364
  name: wisper
323
365
  requirement: !ruby/object:Gem::Requirement
@@ -335,7 +377,8 @@ dependencies:
335
377
  description: Sinatra Based Application Framework
336
378
  email:
337
379
  - jrgns@jadeit.co.za
338
- executables: []
380
+ executables:
381
+ - ditty
339
382
  extensions: []
340
383
  extra_rdoc_files: []
341
384
  files:
@@ -351,7 +394,9 @@ files:
351
394
  - Readme.md
352
395
  - config.ru
353
396
  - ditty.gemspec
397
+ - exe/ditty
354
398
  - lib/ditty.rb
399
+ - lib/ditty/cli.rb
355
400
  - lib/ditty/components/app.rb
356
401
  - lib/ditty/controllers/application.rb
357
402
  - lib/ditty/controllers/audit_logs.rb
@@ -360,12 +405,13 @@ files:
360
405
  - lib/ditty/controllers/roles.rb
361
406
  - lib/ditty/controllers/users.rb
362
407
  - lib/ditty/db.rb
408
+ - lib/ditty/emails/base.rb
409
+ - lib/ditty/emails/forgot_password.rb
363
410
  - lib/ditty/helpers/authentication.rb
364
411
  - lib/ditty/helpers/component.rb
365
412
  - lib/ditty/helpers/pundit.rb
366
413
  - lib/ditty/helpers/response.rb
367
414
  - lib/ditty/helpers/views.rb
368
- - lib/ditty/helpers/wisper.rb
369
415
  - lib/ditty/listener.rb
370
416
  - lib/ditty/middleware/error_catchall.rb
371
417
  - lib/ditty/models/audit_log.rb
@@ -380,12 +426,16 @@ files:
380
426
  - lib/ditty/policies/user_policy.rb
381
427
  - lib/ditty/rake_tasks.rb
382
428
  - lib/ditty/seed.rb
429
+ - lib/ditty/services/authentication.rb
383
430
  - lib/ditty/services/email.rb
384
431
  - lib/ditty/services/logger.rb
432
+ - lib/ditty/services/pagination_wrapper.rb
433
+ - lib/ditty/services/settings.rb
385
434
  - lib/ditty/version.rb
386
435
  - migrate/20170207_base_tables.rb
387
436
  - migrate/20170208_audit_log.rb
388
437
  - migrate/20170416_audit_log_details.rb
438
+ - migrate/20180307_password_reset.rb
389
439
  - public/browserconfig.xml
390
440
  - public/images/apple-icon.png
391
441
  - public/images/favicon-16x16.png
@@ -398,10 +448,17 @@ files:
398
448
  - public/manifest.json
399
449
  - views/404.haml
400
450
  - views/audit_logs/index.haml
451
+ - views/emails/base.haml
452
+ - views/emails/forgot_password.haml
453
+ - views/emails/layouts/action.haml
454
+ - views/emails/layouts/alert.haml
455
+ - views/emails/layouts/billing.haml
401
456
  - views/embedded.haml
402
457
  - views/error.haml
458
+ - views/identity/forgot.haml
403
459
  - views/identity/login.haml
404
460
  - views/identity/register.haml
461
+ - views/identity/reset.haml
405
462
  - views/index.haml
406
463
  - views/layout.haml
407
464
  - views/partials/actions.haml
@@ -447,7 +504,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
447
504
  version: '0'
448
505
  requirements: []
449
506
  rubyforge_project:
450
- rubygems_version: 2.7.6
507
+ rubygems_version: 2.7.7
451
508
  signing_key:
452
509
  specification_version: 4
453
510
  summary: Sinatra Based Application Framework
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'wisper'
4
-
5
- module Ditty
6
- module Helpers
7
- module Wisper
8
- def log_action(action, args = {})
9
- args[:user] = current_user unless args.key? :user
10
- broadcast(action, args)
11
- end
12
- end
13
- end
14
- end