lato 0.2.1 → 0.3.1

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: 0022ea0879d81f9d92624508b04419c1949b4528264c0af286852bb1fd2a683e
4
- data.tar.gz: 18676f46ef4c681dac7568843db624d4723a5303c3fa97e82838a6ea9b16b3cf
3
+ metadata.gz: 288d8c5087ad55acbc2bd7e40a3a4dbbea45592d89b1bab4ca04fcbb367876eb
4
+ data.tar.gz: b64204ee59d0ff500f26bd37605a0d903f713dba4e4c9fb9aa6ff25395733f43
5
5
  SHA512:
6
- metadata.gz: d97683db01c97cdd4b8b043488ba26b73aa667720b22184acedcdd837a90735cae3832d75adb94b72df0aee17569a61b353e5e3091739bfacefecf1c710f00c2
7
- data.tar.gz: fbdf84e72347070544d30ce16083f778b3dc27cc2d89eeb2db8bebe061ef78e02c0a42602fdf9769a6b225865d5d657d4bb7eccd1977e07bcf9052e9a6c97cc4
6
+ metadata.gz: b12c8cdbd45308fd565669c44b160f99fcbdf02dab34f554b9bc6b278e000d674111b67ea6d802627cef73d341a8fbd44937e0babdd29f985f1f1b35e40975c5
7
+ data.tar.gz: 453e2ec441176eddaa105606ddf68aed5ae116cbd8b0cfb162bf6029f1eca5fbdd1cc6a29e1349ca6b42dd8b3d9da5a7feea49a9fdb4c4bfc499442e0b78687f
data/README.md CHANGED
@@ -9,7 +9,7 @@ Add required dependencies to your application's Gemfile:
9
9
  gem "importmap-rails" # NOTE: Probably already installed in default rails 7 project
10
10
 
11
11
  # Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev]
12
- gem "turbo-rails"
12
+ gem "turbo-rails" # NOTE: Probably already installed in default rails 7 project
13
13
 
14
14
  # Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev]
15
15
  gem "stimulus-rails" # NOTE: Probably already installed in default rails 7 project
@@ -69,9 +69,19 @@ end
69
69
 
70
70
  ```
71
71
 
72
- ## Development
72
+ ### Extra tasks
73
+ Lato integrates by default a basic PWAs manifest and service worker. To re-generate them with all required assets follow these steps:
74
+
75
+ 1. Complete the configuration of lato on a custom initializer (see [configuration](https://github.com/lato-gam/lato/blob/main/lib/lato/config.rb) options for more details)
76
+ 2. Add an icon.png file on **public/icon.png** with minimum size of 512x512px
77
+ 3. Run the following commands:
78
+
79
+ ```bash
80
+ $ rails lato:generate:favicon
81
+ $ rails lato:generate:pwa
82
+ ```
73
83
 
74
- Be sure to have Redis locally installed and running.
84
+ ## Development
75
85
 
76
86
  Clone repository, install dependencies, run migrations and start:
77
87
 
@@ -5,6 +5,20 @@ import "bootstrap"
5
5
  // Import controllers (stimulus rails)
6
6
  import "controllers"
7
7
 
8
+ /**
9
+ * Include service worker
10
+ */
11
+
12
+ if (navigator.serviceWorker) {
13
+ navigator.serviceWorker.register("/service-worker.js", { scope: "/" })
14
+ .then(() => navigator.serviceWorker.ready)
15
+ .then((registration) => {
16
+ const event = new CustomEvent("service-worker:ready", { detail: registration })
17
+ document.dispatchEvent(event)
18
+ })
19
+ .then(() => console.log("[App]", "Service worker registered! -> listen to 'service-worker:ready' document event to get the registration object"))
20
+ }
21
+
8
22
  /**
9
23
  * Fix form inside turbo-frame tag with redirect
10
24
  * https://github.com/hotwired/turbo-rails/issues/440
@@ -22,15 +36,11 @@ document.addEventListener("turbo:frame-missing", event => {
22
36
  const PAGE_TRANSITION_TIME = 50
23
37
 
24
38
  document.addEventListener('DOMContentLoaded', () => {
25
- console.log('DOMContentLoaded')
26
-
27
39
  // add is-loaded class
28
40
  document.body.classList.add('is-loaded')
29
41
  })
30
42
 
31
43
  document.addEventListener('turbo:load', () => {
32
- console.log('turbo:load')
33
-
34
44
  setTimeout(() => {
35
45
  // add is-loaded class
36
46
  document.body.classList.add('is-loaded')
@@ -0,0 +1,53 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = [
5
+ 'online',
6
+ 'offline'
7
+ ]
8
+
9
+ /**
10
+ * Stimulus
11
+ */
12
+
13
+ connect() {
14
+ window.addEventListener('online', this.onNetworkOnline.bind(this))
15
+ window.addEventListener('offline', this.onNetworkOffline.bind(this))
16
+
17
+ if (!navigator.onLine) {
18
+ this.onNetworkOffline()
19
+ }
20
+ }
21
+
22
+ disconnect() {
23
+ window.removeEventListener('online', this.onNetworkOnline.bind(this))
24
+ window.removeEventListener('offline', this.onNetworkOffline.bind(this))
25
+ if (this.timeout) clearTimeout(this.timeout)
26
+ }
27
+
28
+ /**
29
+ * Events
30
+ */
31
+
32
+ onNetworkOnline() {
33
+ this.element.classList.remove('d-none')
34
+ this.onlineTarget.classList.remove('d-none')
35
+ this.offlineTarget.classList.add('d-none')
36
+
37
+ if (this.timeout) clearTimeout(this.timeout)
38
+ this.timeout = setTimeout(() => {
39
+ this.element.classList.add('d-none')
40
+ }, 5000)
41
+ }
42
+
43
+ onNetworkOffline() {
44
+ this.element.classList.remove('d-none')
45
+ this.onlineTarget.classList.add('d-none')
46
+ this.offlineTarget.classList.remove('d-none')
47
+
48
+ if (this.timeout) clearTimeout(this.timeout)
49
+ this.timeout = setTimeout(() => {
50
+ this.element.classList.add('d-none')
51
+ }, 5000)
52
+ }
53
+ }
@@ -1 +1,13 @@
1
+ <meta name="application-name" content="<%= Lato.config.application_title %>">
2
+ <meta name="theme-color" content="<%= Lato.config.application_brand_color %>">
3
+ <meta name="full-screen" content="yes">
4
+ <meta name="browsermode" content="application">
5
+ <meta name="screen-orientation" content="portrait">
6
+ <meta name="apple-mobile-web-app-capable" content="yes">
7
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
8
+ <meta name="apple-mobile-web-app-title" content="<%= Lato.config.application_title %>">
9
+
10
+ <link rel="icon" href="/favicon.ico">
11
+ <link rel="manifest" href="/manifest.json">
12
+
1
13
  <!-- Free for head tags -->
@@ -0,0 +1,4 @@
1
+ <div class="fixed-bottom p-3 d-none" data-controller="lato-network">
2
+ <span class="badge rounded-pill text-bg-danger fs-6 d-none" data-lato-network-target="offline">You are offline</span>
3
+ <span class="badge rounded-pill text-bg-success fs-6 d-none" data-lato-network-target="online">You are online</span>
4
+ </div>
@@ -7,7 +7,7 @@
7
7
  <%= csrf_meta_tags %>
8
8
  <%= csp_meta_tag %>
9
9
 
10
- <!-- TEMPORARY FIX: Popper js not working using bootstrap-gem -->
10
+ <% # TEMPORARY FIX: Popper js not working using bootstrap-gem %>
11
11
  <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js" integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p" crossorigin="anonymous"></script>
12
12
 
13
13
  <%= render 'layouts/lato/head_content' %>
@@ -36,8 +36,6 @@
36
36
  </main>
37
37
  </div>
38
38
 
39
-
40
-
41
39
  <footer>
42
40
  <%= render 'layouts/lato/footer' %>
43
41
  </footer>
@@ -45,8 +43,10 @@
45
43
  <% if @layout_sidebar %>
46
44
  <%= render 'layouts/lato/aside-opener' %>
47
45
  <% end %>
46
+
48
47
  <%= render 'layouts/lato/feedbacks' %>
49
48
  <%= render 'layouts/lato/action' %>
49
+ <%= render 'layouts/lato/network' %>
50
50
 
51
51
  <%= render 'layouts/lato/foot_content' %>
52
52
  </body>
@@ -57,7 +57,7 @@ it:
57
57
  first_name: Nome
58
58
  last_name: Cognome
59
59
  password_confirmation: Conferma password
60
- email: Indirizzo email
60
+ email: Email
61
61
  accepted_privacy_policy_version: Privacy policy
62
62
  accepted_terms_and_conditions_version: Termini e condizioni
63
63
  errors:
data/lib/lato/config.rb CHANGED
@@ -4,7 +4,7 @@ module Lato
4
4
  ##
5
5
  class Config
6
6
  # Applicaction configs
7
- attr_accessor :application_title, :application_version, :application_company_name, :application_company_url
7
+ attr_accessor :application_title, :application_version, :application_company_name, :application_company_url, :application_brand_color
8
8
 
9
9
  # Session configs
10
10
  attr_accessor :session_lifetime, :session_root_path
@@ -26,6 +26,7 @@ module Lato
26
26
  @application_version = '1.0.0'
27
27
  @application_company_name = 'Lato Team'
28
28
  @application_company_url = 'https://github.com/Lato-GAM'
29
+ @application_brand_color = '#03256c'
29
30
 
30
31
  @auth_disable_signup = false
31
32
  @auth_disable_recover_password = false
data/lib/lato/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lato
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'fileutils'
2
+ require 'json'
2
3
 
3
4
  namespace :lato do
4
5
  namespace :install do
@@ -33,6 +34,145 @@ namespace :lato do
33
34
  gem_concern_path = Lato::Engine.root.join('app', 'models', 'concerns', 'lato_user_application.rb').to_s
34
35
  app_concern_path = Rails.root.join('app', 'models', 'concerns', 'lato_user_application.rb').to_s
35
36
  FileUtils.copy(gem_concern_path, app_concern_path) unless File.exist? app_concern_path
37
+
38
+ # Generate sample manifest.json file in public folder
39
+ ##
40
+
41
+ manifest_path = Rails.root.join('public', 'manifest.json')
42
+ unless File.exist? manifest_path
43
+ manifest = {
44
+ name: "Application",
45
+ short_name: "Application",
46
+ start_url: "/",
47
+ scope: "/",
48
+ display: "standalone",
49
+ orientation: "portrait",
50
+ theme_color: "#000000",
51
+ background_color: "#000000",
52
+ icons: []
53
+ }
54
+ File.open(manifest_path, 'w') { |f| f.write(JSON.pretty_generate(manifest)) }
55
+ end
56
+
57
+ # Generate sample service-worker.js file in public folder
58
+ ##
59
+
60
+ service_worker_path = Rails.root.join('public', 'service-worker.js')
61
+ unless File.exist? service_worker_path
62
+ service_worker = <<-JS
63
+ function onInstall(event) {
64
+ console.log('[Serviceworker]', "Installing!", event);
65
+ }
66
+ function onActivate(event) {
67
+ console.log('[Serviceworker]', "Activating!", event);
68
+ }
69
+ function onFetch(event) {
70
+ console.log('[Serviceworker]', "Fetching!", event);
71
+ }
72
+ self.addEventListener('install', onInstall);
73
+ self.addEventListener('activate', onActivate);
74
+ self.addEventListener('fetch', onFetch);
75
+ JS
76
+ File.open(service_worker_path, 'w') { |f| f.write(service_worker) }
77
+ end
78
+ end
79
+ end
80
+
81
+ namespace :generate do
82
+ desc "Generate PWA icons from a single icon.png file (512x512) that should be placed inside 'public' folder"
83
+ # Usage: rails lato:generate:pwa
84
+ task :pwa do
85
+ # check if icon.png exists
86
+ icon_path = Rails.root.join('public', 'icon.png')
87
+ unless File.exist? icon_path
88
+ puts 'ERROR: icon.png file not found inside public folder'
89
+ return
90
+ end
91
+
92
+ # check MiniMagick is installed
93
+ begin
94
+ require 'mini_magick'
95
+ rescue LoadError
96
+ puts 'ERROR: mini_magick gem not found, please add it to your Gemfile'
97
+ return
98
+ end
99
+
100
+ # be sure icon.png is min 512x512
101
+ image = MiniMagick::Image.open(icon_path)
102
+ if image.width < 512 || image.height < 512 || image.width != image.height
103
+ puts 'ERROR: icon.png image size is not valid, it should be square and min 512x512'
104
+ return
105
+ end
106
+
107
+ # create icons folder if not exists
108
+ icons_path = Rails.root.join('public', 'icons')
109
+ FileUtils.mkdir_p(icons_path) unless File.exist? icons_path
110
+
111
+ # create icons
112
+ sizes = [16, 32, 48, 72, 96, 144, 152, 192, 384, 512]
113
+ sizes.each do |size|
114
+ file_path = "#{icons_path}/icon_#{size}x#{size}.png"
115
+ file_image = MiniMagick::Image.open(icon_path)
116
+ FileUtils.rm(file_path) if File.exist? file_path
117
+ file_image.resize "#{size}x#{size}"
118
+ file_image.write file_path
119
+ end
120
+
121
+ # create manifest.json
122
+ manifest_path = Rails.root.join('public', 'manifest.json')
123
+ manifest = {
124
+ name: Lato.config.application_title,
125
+ short_name: Lato.config.application_title,
126
+ start_url: '/',
127
+ scope: '/',
128
+ display: 'standalone',
129
+ orientation: 'portrait',
130
+ theme_color: Lato.config.application_brand_color,
131
+ background_color: Lato.config.application_brand_color,
132
+ icons: []
133
+ }
134
+ sizes.each do |size|
135
+ manifest[:icons] << {
136
+ src: "/icons/icon_#{size}x#{size}.png",
137
+ sizes: "#{size}x#{size}",
138
+ type: 'image/png'
139
+ }
140
+ end
141
+ FileUtils.rm(manifest_path) if File.exist? manifest_path
142
+ File.open(manifest_path, 'w') { |f| f.write(JSON.pretty_generate(manifest)) }
143
+ end
144
+
145
+ desc "Generate favicon.ico from a single icon.png file (512x512) that should be placed inside 'public' folder"
146
+ # Usage: rails lato:generate:favicon
147
+ task :favicon do
148
+ # check if icon.png exists
149
+ icon_path = Rails.root.join('public', 'icon.png')
150
+ unless File.exist? icon_path
151
+ puts 'ERROR: icon.png file not found inside public folder'
152
+ return
153
+ end
154
+
155
+ # check MiniMagick is installed
156
+ begin
157
+ require 'mini_magick'
158
+ rescue LoadError
159
+ puts 'ERROR: mini_magick gem not found, please add it to your Gemfile'
160
+ return
161
+ end
162
+
163
+ # be sure icon.png is min 512x512
164
+ image = MiniMagick::Image.open(icon_path)
165
+ if image.width < 512 || image.height < 512 || image.width != image.height
166
+ puts 'ERROR: icon.png image size is not valid, it should be square and min 512x512'
167
+ return
168
+ end
169
+
170
+ # create favicon.ico
171
+ file_path = Rails.root.join('public', 'favicon.ico')
172
+ file_image = MiniMagick::Image.open(icon_path)
173
+ FileUtils.rm(file_path) if File.exist? file_path
174
+ file_image.resize '48x48'
175
+ file_image.write file_path
36
176
  end
37
177
  end
38
178
  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: 0.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregorio Galante
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-15 00:00:00.000000000 Z
11
+ date: 2023-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -118,6 +118,7 @@ files:
118
118
  - app/assets/javascripts/lato/controllers/lato_form_controller.js
119
119
  - app/assets/javascripts/lato/controllers/lato_hello_controller.js
120
120
  - app/assets/javascripts/lato/controllers/lato_input_autocomplete_controller.js
121
+ - app/assets/javascripts/lato/controllers/lato_network_controller.js
121
122
  - app/assets/javascripts/lato/controllers/lato_operation_controller.js
122
123
  - app/assets/stylesheets/lato/application.scss
123
124
  - app/controllers/concerns/lato/componentable.rb
@@ -186,6 +187,7 @@ files:
186
187
  - app/views/layouts/lato/_navbar-brand_content.html.erb
187
188
  - app/views/layouts/lato/_navbar-nav_content.html.erb
188
189
  - app/views/layouts/lato/_navbar.html.erb
190
+ - app/views/layouts/lato/_network.html.erb
189
191
  - app/views/layouts/lato/_sidebar-nav_content.html.erb
190
192
  - app/views/layouts/lato/_sidebar.html.erb
191
193
  - app/views/layouts/lato/application.html.erb