lato 3.8.1 → 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d798ee21a2e9f1ebb6667f39ce4de775fa45ab1e4f31769dadf7699ed3bc902c
4
- data.tar.gz: 60876444bb2a4c459913b529c333b1053890c9289875b58ac9167a8909c5c821
3
+ metadata.gz: 661a7fa10069cfd8f228e56bcad9a55c615b055d85b3139ec50e919fad27cbfd
4
+ data.tar.gz: 3e3ea5c20ac55f92fec12241492cb09bc642d05e6ad2e0f5e9ba45c1eec9fe25
5
5
  SHA512:
6
- metadata.gz: 5c14287d5f9366e89a72c4b3c8a7849567218fe143899a3dffe30128f51247831d25834a95dfe6757c2665ff301d0daf0553fae6f6e131efb2f3fea9cf64c351
7
- data.tar.gz: 35a7b17307b370392d54be93cdf509b480f4901dc3a45f4ca37bcba50cb3109dbc5f5daf6fd4138cd3a41d27cdec8062dddc296a30d644cf6bc8088f273ffbbf
6
+ metadata.gz: 3246a40201e0367461efbac8cc4d634e0f32164308d1fbb3c5d9c24f501441773c2ddc880e30b7a67f2e2037276eff0f6d9adf0fcb339a167ec6512b47494543
7
+ data.tar.gz: 61cf36ca2a1087aa804d93335fa4344f2103a7b5b02840e5ed09ec4b8c648bcf03e5307df0d27960f5089d6fbcd6c0f937d3f34aba8a980f051471ed00a7007d
@@ -0,0 +1,115 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+ import _ from 'lodash'
3
+
4
+ export default class extends Controller {
5
+ static values = {
6
+ path: String
7
+ }
8
+
9
+ /**
10
+ * Stimulus
11
+ */
12
+
13
+ connect() {
14
+ this.search = _.debounce(this.search, 500)
15
+
16
+ this.realInput = document.createElement('input')
17
+ this.realInput.type = 'hidden'
18
+ this.realInput.name = this.element.getAttribute('name')
19
+ this.realInput.value = this.element.value
20
+ this.element.insertAdjacentElement('afterend', this.realInput)
21
+
22
+ if (this.element.value) {
23
+ this.setDefaultElementValue()
24
+ }
25
+
26
+ this.element.addEventListener('keyup', (e) => {
27
+ this.search(e.target.value)
28
+ })
29
+
30
+ window.addEventListener('click', this.onWindowClick.bind(this))
31
+ window.addEventListener('scroll', this.onWindowScroll.bind(this))
32
+ window.addEventListener('resize', this.onWindowResize.bind(this))
33
+ }
34
+
35
+ disconnect() {
36
+ this.realInput.remove()
37
+ this.suggestHide()
38
+
39
+ window.removeEventListener('click', this.onWindowClick.bind(this))
40
+ window.removeEventListener('scroll', this.onWindowScroll.bind(this))
41
+ window.removeEventListener('resize', this.onWindowResize.bind(this))
42
+ }
43
+
44
+ async search(value) {
45
+ this.realInput.value = ''
46
+ if (!value || value.length < 3) return
47
+
48
+ try {
49
+ const response = await fetch(this.pathValue + '?q=' + value)
50
+ const data = await response.json()
51
+ this.suggestShow(data)
52
+ } catch (err) {
53
+ console.error(err)
54
+ }
55
+ }
56
+
57
+ suggestShow(data = []) {
58
+ if (this.optionsList) this.optionsList.remove()
59
+ this.optionsList = document.createElement('ul')
60
+ this.optionsList.classList.add('list-group')
61
+ this.optionsList.style.position = 'fixed'
62
+ this.optionsList.style.width = this.element.offsetWidth + 'px'
63
+ this.optionsList.style.maxHeight = '200px'
64
+ this.optionsList.style.overflowY = 'auto'
65
+ this.optionsList.style.zIndex = 9999
66
+
67
+ const elementRect = this.element.getBoundingClientRect()
68
+ this.optionsList.style.top = elementRect.bottom + 'px'
69
+ this.optionsList.style.left = elementRect.left + 'px'
70
+
71
+ data.forEach((option) => {
72
+ const li = document.createElement('li')
73
+ li.classList.add('list-group-item')
74
+ li.classList.add('list-group-item-action')
75
+ li.style.cursor = 'pointer'
76
+ li.innerText = typeof option == 'string' ? option : option.label
77
+ li.addEventListener('click', () => {
78
+ this.element.value = typeof option == 'string' ? option : option.label
79
+ this.realInput.value = typeof option == 'string' ? option : option.value
80
+ this.suggestHide()
81
+ })
82
+ this.optionsList.appendChild(li)
83
+ })
84
+
85
+ document.body.appendChild(this.optionsList)
86
+ }
87
+
88
+ suggestHide() {
89
+ if (this.optionsList) this.optionsList.remove()
90
+ }
91
+
92
+ async setDefaultElementValue() {
93
+ try {
94
+ const response = await fetch(this.pathValue + '?value=' + this.element.value)
95
+ const data = await response.json()
96
+ this.element.value = data?.label || this.element.value
97
+ } catch (err) {
98
+ console.error(err)
99
+ }
100
+ }
101
+
102
+ onWindowClick(event) {
103
+ if (!this.element.contains(event.target)) {
104
+ this.suggestHide()
105
+ }
106
+ }
107
+
108
+ onWindowScroll(event) {
109
+ this.suggestHide()
110
+ }
111
+
112
+ onWindowResize(event) {
113
+ this.suggestHide()
114
+ }
115
+ }
@@ -40,7 +40,7 @@ export default class extends Controller {
40
40
 
41
41
  data.forEach((item) => {
42
42
  const option = document.createElement('option')
43
- option.value = item
43
+ option.value = typeof item === 'string' ? item : item.label
44
44
  this.datalist.appendChild(option)
45
45
  })
46
46
  }
@@ -1,11 +1,11 @@
1
1
  /** Import dependencies */
2
2
 
3
- $primary: #03256c !default;
4
- $secondary: #1768ac !default;
5
- $success: #007a34 !default;
6
- $danger: #f50032 !default;
7
- $warning: #ffcc00 !default;
8
- $info: #0017ed !default;
3
+ $primary: #293b5a !default;
4
+ $secondary: #7b96c4 !default;
5
+ $success: #26b75e !default;
6
+ $danger: #e32908 !default;
7
+ $warning: #ffae03 !default;
8
+ $info: #00c8e7 !default;
9
9
 
10
10
  $gray-100: #ebeff4 !default;
11
11
  $gray-200: #dde3e9 !default;
@@ -7,7 +7,7 @@ module Lato
7
7
 
8
8
  mail(
9
9
  to: @invitation.email,
10
- subject: 'Hai ricevuto un invito',
10
+ subject: I18n.t('lato.invitation_mailer.invite_mail_subject'),
11
11
  template_path: 'lato/mailer/invitation'
12
12
  )
13
13
  end
@@ -8,7 +8,7 @@ module Lato
8
8
 
9
9
  mail(
10
10
  to: @user.email,
11
- subject: 'Conferma il tuo indirizzo email',
11
+ subject: I18n.t('lato.user_mailer.email_verification_mail_subject'),
12
12
  template_path: 'lato/mailer/user'
13
13
  )
14
14
  end
@@ -21,7 +21,20 @@ module Lato
21
21
 
22
22
  mail(
23
23
  to: @user.email,
24
- subject: 'Imposta una nuova password',
24
+ subject: I18n.t('lato.user_mailer.password_update_mail_subject'),
25
+ template_path: 'lato/mailer/user'
26
+ )
27
+ end
28
+
29
+ def signin_success_mail(user_id, ip_address)
30
+ @user = Lato::User.find(user_id)
31
+ @ip_address = ip_address
32
+
33
+ set_user_locale
34
+
35
+ mail(
36
+ to: @user.email,
37
+ subject: I18n.t('lato.user_mailer.signin_success_mail_subject'),
25
38
  template_path: 'lato/mailer/user'
26
39
  )
27
40
  end
@@ -117,6 +117,8 @@ module Lato
117
117
  Rails.logger.error(e)
118
118
  end
119
119
 
120
+ Lato::UserMailer.signin_success_mail(id, params[:ip_address]).deliver_later
121
+
120
122
  true
121
123
  end
122
124
 
@@ -0,0 +1,15 @@
1
+ <% if I18n.locale == 'en' %>
2
+
3
+ An access to your <b><%= Lato.config.application_title %></b> account has been made with the IP address <b><%= @ip_address %></b>.
4
+ <br><br>
5
+ If you have not made this access, we recommend you to change the password of your account and to contact the support.<br>
6
+ Otherwise, ignore this email.
7
+
8
+ <% else %>
9
+
10
+ E' stato effettuato un accesso al tuo account di <b><%= Lato.config.application_title %></b> con l'indirizzo IP <b><%= @ip_address %></b>.
11
+ <br><br>
12
+ Se non sei stato tu a effettuare l'accesso, ti consigliamo di cambiare la password del tuo account e di contattare il supporto.<br>
13
+ Altrimenti, ignora questa email.
14
+
15
+ <% end %>
@@ -39,7 +39,7 @@
39
39
  </aside>
40
40
  <% end %>
41
41
 
42
- <main class="<%= @layout_sidebar && 'layout_sidebar' %>">
42
+ <main class="<%= @layout_sidebar ? 'layout_sidebar' : '' %>">
43
43
  <%= render 'layouts/lato/content' %>
44
44
  </main>
45
45
  </div>
@@ -60,6 +60,13 @@ en:
60
60
  reset_password: Reset your password
61
61
  per_page: Per page
62
62
 
63
+ invitation_mailer:
64
+ invite_mail_subject: You received an invitation
65
+ user_mailer:
66
+ email_verification_mail_subject: Confirm your email address
67
+ password_update_mail_subject: Set a new password
68
+ signin_success_mail_subject: New access to your account
69
+
63
70
  account_controller:
64
71
  update_user_action_notice: Account information properly updated
65
72
  request_verify_email_action_notice: We have sent you an email with the steps to follow to complete the procedure
@@ -62,6 +62,13 @@ it:
62
62
  reset_password: Reimposta la tua password
63
63
  per_page: Per pagina
64
64
 
65
+ invitation_mailer:
66
+ invite_mail_subject: Hai ricevuto un invito
67
+ user_mailer:
68
+ email_verification_mail_subject: Conferma il tuo indirizzo email
69
+ password_update_mail_subject: Imposta una nuova password
70
+ signin_success_mail_subject: Nuovo accesso al tuo account
71
+
65
72
  account_controller:
66
73
  update_user_action_notice: Informazioni account aggiornate correttamente
67
74
  request_verify_email_action_notice: Ti abbiamo inviato una email con i passaggi da seguire per completare la procedura
data/lib/lato/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lato
2
- VERSION = "3.8.1"
2
+ VERSION = "3.10.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lato
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.1
4
+ version: 3.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregorio Galante
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-07 00:00:00.000000000 Z
11
+ date: 2024-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -159,6 +159,7 @@ files:
159
159
  - app/assets/javascripts/lato/controllers/lato_feedback_controller.js
160
160
  - app/assets/javascripts/lato/controllers/lato_form_controller.js
161
161
  - app/assets/javascripts/lato/controllers/lato_hello_controller.js
162
+ - app/assets/javascripts/lato/controllers/lato_input_autocomplete2_controller.js
162
163
  - app/assets/javascripts/lato/controllers/lato_input_autocomplete_controller.js
163
164
  - app/assets/javascripts/lato/controllers/lato_network_controller.js
164
165
  - app/assets/javascripts/lato/controllers/lato_operation_controller.js
@@ -226,6 +227,7 @@ files:
226
227
  - app/views/lato/mailer/invitation/invite_mail.html.erb
227
228
  - app/views/lato/mailer/user/email_verification_mail.html.erb
228
229
  - app/views/lato/mailer/user/password_update_mail.html.erb
230
+ - app/views/lato/mailer/user/signin_success_mail.html.erb
229
231
  - app/views/lato/operations/show.html.erb
230
232
  - app/views/layouts/lato/_action.html.erb
231
233
  - app/views/layouts/lato/_aside-opener.html.erb
@@ -265,12 +267,12 @@ files:
265
267
  - lib/lato/engine.rb
266
268
  - lib/lato/version.rb
267
269
  - lib/tasks/lato_tasks.rake
268
- homepage: https://github.com/GAMS-Software/lato
270
+ homepage: https://github.com/Lato-org/lato
269
271
  licenses:
270
272
  - MIT
271
273
  metadata:
272
- homepage_uri: https://github.com/GAMS-Software/lato
273
- source_code_uri: https://github.com/GAMS-Software/lato
274
+ homepage_uri: https://github.com/Lato-org/lato
275
+ source_code_uri: https://github.com/Lato-org/lato
274
276
  post_install_message:
275
277
  rdoc_options: []
276
278
  require_paths:
@@ -286,7 +288,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
286
288
  - !ruby/object:Gem::Version
287
289
  version: '0'
288
290
  requirements: []
289
- rubygems_version: 3.5.6
291
+ rubygems_version: 3.5.15
290
292
  signing_key:
291
293
  specification_version: 4
292
294
  summary: Basic engine for all Lato projects