thecore_ui_commons 2.1.5 → 2.1.10

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/thecore_ui_commons_manifest.js +0 -2
  3. data/app/assets/images/android-chrome-192x192.png +0 -0
  4. data/app/assets/images/android-chrome-512x512.png +0 -0
  5. data/app/assets/images/apple-touch-icon.png +0 -0
  6. data/app/assets/images/favicon-16x16.png +0 -0
  7. data/app/assets/images/favicon-32x32.png +0 -0
  8. data/app/assets/images/favicon.ico +0 -0
  9. data/app/assets/images/logo.png +0 -0
  10. data/app/assets/images/mstile-150x150.png +0 -0
  11. data/app/assets/images/safari-pinned-tab.svg +1042 -0
  12. data/app/assets/images/up-arrow.png +0 -0
  13. data/app/assets/javascripts/browserconfig.xml +9 -0
  14. data/app/assets/javascripts/ie.js +19 -0
  15. data/app/assets/javascripts/manifest.json +20 -0
  16. data/app/assets/javascripts/pages.coffee +3 -0
  17. data/app/assets/javascripts/thecore_ui_commons/thecore.js +8 -0
  18. data/app/assets/javascripts/timer.js +135 -0
  19. data/app/assets/stylesheets/thecore_ui_commons/actiontext.scss +19 -20
  20. data/app/assets/stylesheets/thecore_ui_commons/thecore.scss +18 -0
  21. data/app/views/contact_mailer/contact_message.html.erb +5 -0
  22. data/app/views/devise/confirmations/new.html.erb +16 -0
  23. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  24. data/app/views/devise/mailer/password_change.html.erb +5 -0
  25. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  26. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  27. data/app/views/devise/menu/_login_items.html.erb +7 -0
  28. data/app/views/devise/passwords/edit.html.erb +25 -0
  29. data/app/views/devise/passwords/new.html.erb +18 -0
  30. data/app/views/devise/registrations/edit.html.erb +45 -0
  31. data/app/views/devise/registrations/new.html.erb +29 -0
  32. data/app/views/devise/sessions/new.html.erb +28 -0
  33. data/app/views/devise/shared/_links.html.erb +25 -0
  34. data/app/views/devise/unlocks/new.html.erb +16 -0
  35. data/app/views/kaminari/_first_page.html.erb +3 -0
  36. data/app/views/kaminari/_gap.html.erb +3 -0
  37. data/app/views/kaminari/_last_page.html.erb +3 -0
  38. data/app/views/kaminari/_next_page.html.erb +3 -0
  39. data/app/views/kaminari/_page.html.erb +9 -0
  40. data/app/views/kaminari/_paginator.html.erb +15 -0
  41. data/app/views/kaminari/_prev_page.html.erb +3 -0
  42. data/app/views/layouts/_footer.html.erb +3 -0
  43. data/app/views/layouts/_messages.html.erb +9 -0
  44. data/app/views/layouts/_navigation.html.erb +20 -0
  45. data/app/views/layouts/_navigation_links.html.erb +7 -0
  46. data/app/views/layouts/mailer.html.erb +6 -0
  47. data/app/views/layouts/mailer.text.erb +1 -0
  48. data/app/views/layouts/thecore.html.erb +45 -0
  49. data/config/initializers/charts_helper.rb +45 -0
  50. data/config/initializers/thecore_ui_commons_application_config.rb +20 -8
  51. data/config/initializers/thecore_ui_commons_helper.rb +22 -0
  52. data/config/locales/en.ra_settings.yml +4 -0
  53. data/config/locales/en.yml +44 -0
  54. data/config/locales/it.ra_settings.yml +4 -0
  55. data/config/locales/it.yml +44 -0
  56. data/db/migrate/20200515070620_add_username_to_user.rb +53 -0
  57. data/db/migrate/20200515132932_add_rememberable_to_user.rb +5 -0
  58. data/lib/concerns/thecore_ui_commons_user.rb +29 -0
  59. data/lib/thecore_ui_commons.rb +10 -3
  60. data/lib/thecore_ui_commons/version.rb +1 -1
  61. metadata +87 -7
  62. data/app/controllers/pages_controller.rb +0 -43
  63. data/db/migrate/20190920115550_create_action_text_tables.action_text.rb +0 -14
@@ -0,0 +1,28 @@
1
+ <div class="col-md-4 col-md-offset-4">
2
+ <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
3
+ <div class="field">
4
+ <%= f.label :login %><br />
5
+ <%= f.text_field :login, autofocus: true, :class => "form-control" %>
6
+ </div>
7
+
8
+ <div class="field">
9
+ <%= f.label :password %><br />
10
+ <%= f.password_field :password, autocomplete: "off", :class => "form-control" %>
11
+ </div>
12
+
13
+ <% if devise_mapping.rememberable? -%>
14
+ <div class="checkbox">
15
+ <label>
16
+ <%= f.check_box :remember_me %>
17
+ <%=t "activerecord.attributes.user.remember_me" %>
18
+ </label>
19
+ </div>
20
+ <% end -%>
21
+
22
+ <div class="actions">
23
+ <%= f.submit t("devise.sessions.new.sign_in"), :class => "btn btn-warning" %>
24
+
25
+ <%= render "devise/shared/links" %>
26
+ </div>
27
+ <% end %>
28
+ </div>
@@ -0,0 +1,25 @@
1
+ <%- if controller_name != 'sessions' %>
2
+ <%= link_to t("devise.sessions.new.sign_in"), new_session_path(resource_name), :class => "btn btn-success" %><br />
3
+ <% end -%>
4
+
5
+ <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
+ <%= link_to t("devise.registrations.new.sign_up"), new_registration_path(resource_name), :class => "btn btn-success" %><br />
7
+ <% end -%>
8
+
9
+ <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
10
+ <%= link_to t("devise.passwords.new.forgot_your_password"), new_password_path(resource_name), :class => "btn btn-success" %><br />
11
+ <% end -%>
12
+
13
+ <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
+ <%= link_to t("devise.shared.links.didn_t_receive_confirmation_instructions"), new_confirmation_path(resource_name), :class => "btn btn-success" %><br />
15
+ <% end -%>
16
+
17
+ <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
+ <%= link_to t("devise.shared.links.didn_t_receive_unlock_instructions"), new_unlock_path(resource_name), :class => "btn btn-success" %><br />
19
+ <% end -%>
20
+
21
+ <%- if devise_mapping.omniauthable? %>
22
+ <%- resource_class.omniauth_providers.each do |provider| %>
23
+ <%= link_to t("devise.shared.links.sign_in_with_provider", provider: OmniAuth::Utils.camelize(provider)), omniauth_authorize_path(resource_name, provider), :class => "btn btn-success" %><br />
24
+ <% end -%>
25
+ <% end -%>
@@ -0,0 +1,16 @@
1
+ <h2><%=t("devise.unlocks.new.resend_unlock_instructions")%></h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
4
+ <%= devise_error_messages! %>
5
+
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true %>
9
+ </div>
10
+
11
+ <div class="actions">
12
+ <%= f.submit <%=t("devise.unlocks.new.resend_unlock_instructions")%> %>
13
+
14
+ <%= render "devise/shared/links" %>
15
+ </div>
16
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li class='disabled'>
2
+ <%= content_tag :a, raw(t 'views.pagination.truncate') %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
3
+ </li>
@@ -0,0 +1,9 @@
1
+ <% if page.current? %>
2
+ <li class='active'>
3
+ <%= content_tag :a, page, remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)) %>
4
+ </li>
5
+ <% else %>
6
+ <li>
7
+ <%= link_to page, url, remote: remote, rel: (page.next? ? 'next' : (page.prev? ? 'prev' : nil)) %>
8
+ </li>
9
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <%= paginator.render do -%>
2
+ <ul class="pagination">
3
+ <%= first_page_tag unless current_page.first? %>
4
+ <%= prev_page_tag unless current_page.first? %>
5
+ <% each_page do |page| -%>
6
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
7
+ <%= page_tag page %>
8
+ <% elsif !page.was_truncated? -%>
9
+ <%= gap_tag %>
10
+ <% end -%>
11
+ <% end -%>
12
+ <%= next_page_tag unless current_page.last? %>
13
+ <%= last_page_tag unless current_page.last? %>
14
+ </ul>
15
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
3
+ </li>
@@ -0,0 +1,3 @@
1
+ <!-- Arrow to workaround the problem, on android default browser, of input fields being hidden by keyboard /-->
2
+
3
+ <img src="<%= image_url('up-arrow.png') %>" class="img-responsive" id="up-arrow"/>
@@ -0,0 +1,9 @@
1
+ <%# Rails flash messages styled for Bootstrap 3.0 %>
2
+ <% flash.each do |name, msg| %>
3
+ <% if msg.is_a?(String) %>
4
+ <div class="alert alert-<%= name == "notice" ? "success" : "danger" %>">
5
+ <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
6
+ <%= content_tag :div, msg, :id => "flash_#{name}" %>
7
+ </div>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,20 @@
1
+ <nav class="navbar navbar-inverse">
2
+ <div class="container">
3
+ <div class="navbar-header">
4
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
5
+ <span class="sr-only">Toggle navigation</span>
6
+ <span class="icon-bar"></span>
7
+ <span class="icon-bar"></span>
8
+ <span class="icon-bar"></span>
9
+ </button>
10
+ <% if user_signed_in? %>
11
+ <%= link_to t(:dashboard), inside_path, class: 'navbar-brand' %>
12
+ <%end%>
13
+ </div>
14
+ <div class="collapse navbar-collapse">
15
+ <ul class="nav navbar-nav">
16
+ <%= render 'layouts/navigation_links' %>
17
+ </ul>
18
+ </div>
19
+ </div>
20
+ </nav>
@@ -0,0 +1,7 @@
1
+ <% if user_signed_in? %>
2
+ <li><%= link_to t(:contact), contact_path %></li>
3
+
4
+ <li><%= link_to t(:manage), rails_admin_path %></li>
5
+
6
+ <li><%= link_to t(:sign_out), destroy_user_session_path, data:{method: :delete} %></li>
7
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
3
+ <body style="margin: 0;">
4
+ <%= yield %>
5
+ </body>
6
+ </html>
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html>
2
+ <html lang="<%=I18n.locale%>">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="apple-mobile-web-app-capable" content="yes">
6
+
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ <title><%= Settings.app_name rescue "Thecore" %></title>
9
+
10
+ <%= tag("link", rel: "manifest", href: asset_path("manifest.json", skip_pipeline: true)) %>
11
+ <meta name="turbolinks-cache-control" content="no-cache">
12
+
13
+ <%# Getting all the assets needed by thecore from all the gems %>
14
+ <%= get_asset_tags_for("thecore")%>
15
+ <%= stylesheet_link_tag('application', media: 'all', 'data-turbolinks-track' => true) if (Rails.application.assets || ::Sprockets::Railtie.build_environment(Rails.application)).find_asset("application.css")%>
16
+ <%= javascript_include_tag('application', 'data-turbolinks-track' => true) if (Rails.application.assets || ::Sprockets::Railtie.build_environment(Rails.application)).find_asset("application.js") %>
17
+
18
+ <%= favicon_link_tag 'apple-touch-icon.png', rel: 'apple-touch-icon', sizes: "180x180" %>
19
+ <%= favicon_link_tag 'favicon-32x32.png', rel: 'icon', sizes: "32x32" %>
20
+ <%= favicon_link_tag 'favicon-16x16.png', rel: 'icon', sizes: "16x16" %>
21
+ <%= favicon_link_tag 'safari-pinned-tab.svg', rel: 'mask-icon', color: "#5bbad5" %>
22
+ <meta name="theme-color" content="#3b4e59">
23
+
24
+ <%= csrf_meta_tags %>
25
+ <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
26
+ <!--[if lt IE 9]> <%= javascript_include_tag "ie" %> <![endif]-->
27
+ </head>
28
+ <body>
29
+ <div class="jumbotron vertical-center">
30
+ <div class="container">
31
+ <div class="col-md-4 col-md-offset-4 text-center">
32
+ <img class="main-menu-app-logo" style="width: 25%; max-width: 152px" src="<%= image_url('logo.png') %>"/>
33
+ </div>
34
+ <%- unless flash.empty? %>
35
+ <div class="col-md-4 col-md-offset-4" style="margin-top: 1em;">
36
+ <%= render partial: 'shared/flash' %>
37
+ </div>
38
+ <%-end%>
39
+ <%= yield %>
40
+ </div>
41
+ </div>
42
+
43
+ <%= render 'layouts/footer' %>
44
+ </body>
45
+ </html>
@@ -0,0 +1,45 @@
1
+ require 'date'
2
+ module Helpers
3
+ module ChartsHelper
4
+ def candlestick_data
5
+ @acc = rand(6570..6650)
6
+ 60.times.map {|i| [Date.today - 60 + i, ohlc] }.to_h
7
+ end
8
+
9
+ def ohlc
10
+ open = @acc + rand(-20..20)
11
+ high = open + rand(0..100)
12
+ low = open - rand(0..100)
13
+ @acc = close = open + rand(-((high-low)/3)..((high-low)/2))
14
+ [open, high, low, close]
15
+ end
16
+
17
+ ### HIGH PRIORITY CHARTS
18
+ def charts_high_pie_demo
19
+ pie_chart([{name: "Series A", data: 25},{name: "Series B", data: 100},{name: "Series C", data: 200},{name: "Series D", data: 125}], legend: "left")
20
+ end
21
+
22
+ def charts_high_candlestick_demo
23
+ candlestick_options = {plot_options: {candlestick: {colors: {upward: '#3C90EB',downward: '#DF7D46'}}}}
24
+ candlestick_chart(candlestick_data, candlestick_options)
25
+ end
26
+
27
+ ### MEDIUM PRIORITY CHARTS
28
+ def charts_medium_radar_demo
29
+ radar_series = [{name: "What it should be",data: { "Code review"=>10, "Issues"=>5, "Pull request"=>25, "Commits"=>60 }},{name: "What it really is",data: { "Code review"=>1, "Issues"=>3, "Pull request"=>7, "Commits"=>89 }}]
30
+ radar_chart(radar_series,{title: "GitHub Radar", markers: {size: 4}, theme: 'palette4'})
31
+ end
32
+
33
+ def charts_medium_bubble_demo
34
+ bubble_series = (1..4).map do |n|{name: "Bubble#{n}",data: 20.times.map{[rand(750),rand(10..60),rand(70)]}}end
35
+ bubble_chart(bubble_series, data_labels: false, theme: 'palette6')
36
+ end
37
+
38
+ def charts_medium_range_demo
39
+ range_bar_series = [{name: "Series A",data: {'A' => [1, 5],'B' => [4, 6],'C' => [5, 8],'D' => [3, 11]}}, {name: "Series B",data: {'A' => [2, 6],'B' => [1, 3],'C' => [7, 8],'D' => [5, 9]}}]
40
+ range_bar_chart(range_bar_series, theme: 'palette3')
41
+ end
42
+ end
43
+ end
44
+
45
+ ActiveSupport.on_load(:action_view) { include Helpers::ChartsHelper }
@@ -1,5 +1,4 @@
1
1
  Rails.application.configure do
2
- config.assets.precompile += %w( thecore_ui_commons/index.js thecore_ui_commons/index.css )
3
2
  config.assets.precompile += %w( favicon.ico )
4
3
  config.assets.precompile += %w( apple-touch-icon.png )
5
4
  config.assets.precompile += %w( favicon-32x32.png )
@@ -10,26 +9,39 @@ Rails.application.configure do
10
9
  config.assets.precompile += %w( android-chrome-512x512.png )
11
10
  config.assets.precompile += %w( logo.png )
12
11
  config.assets.precompile += %w( up-arrow.png )
13
- # mstile-150x150
14
12
  config.assets.precompile += %w( thecore.js )
15
13
  config.assets.precompile += %w( thecore.css )
16
- # config.assets.precompile += %w( app_logo.png )
17
- # config.assets.precompile += %w( main_app_logo.png )
18
14
  config.assets.precompile += %w( ie.js )
19
15
  config.assets.precompile += %w( manifest.json )
20
16
  config.assets.precompile += %w( browserconfig.xml )
21
-
17
+ config.assets.precompile += %w( thecore_ui_commons/thecore.js )
18
+ config.assets.precompile += %w( thecore_ui_commons/thecore.css )
19
+ # Very important, needed for trix (i.e.)
20
+ config.assets.paths << root.join('node_modules')
21
+ # To store D3 Data
22
+ # https://medium.com/@hguotblog/use-d3-js-for-data-visualisation-with-rails-69b4f030e366
23
+ config.assets.paths << root.join('data')
24
+ # Putting also a reference on the assets foldes in the paths, so to have the
25
+ # stylesheet and javascript hack work proprly in layout
26
+ # config.assets.paths <<
27
+ # root.join("app", "assets", "stylesheets", "thecore_ui_commons")
28
+ # config.assets.paths <<
29
+ # root.join("app", "assets", "javascripts", "thecore_ui_commons")
22
30
  # config.action_controller.asset_host = if ENV['RAILS_URL'].blank? || ENV['RAILS_RELATIVE_URL_ROOT'].blank?
23
31
  # "http://localhost:3000"
24
32
  # else
25
33
  # "#{ENV['RAILS_URL']}#{ENV['RAILS_RELATIVE_URL_ROOT']}"
26
34
  # end
27
-
35
+
28
36
  config.filter_parameters += [:password]
29
-
37
+
30
38
  config.active_record.raise_in_transactional_callbacks = true
31
-
39
+
32
40
  config.serviceworker.routes.draw do
33
41
  match "/manifest.json"
34
42
  end
43
+
44
+ config.after_initialize do
45
+ User.send(:include, ThecoreUiCommonsUser)
46
+ end
35
47
  end
@@ -0,0 +1,22 @@
1
+ module Helpers
2
+ module ThecoreUiCommonsHelper
3
+ def get_asset_tags_for(basename)
4
+ out = []
5
+ # Needs to reverse since Paths are traversed in the order they occur in the search path. By default, this means the files in app/assets take precedence, and will mask corresponding paths in lib and vendor.
6
+ Rails.application.config.assets.paths.reverse.each do |basedir|
7
+ base = "#{basedir}/**/#{basename}"
8
+ base_s = Dir["#{base}.scss"]
9
+ base_j = Dir["#{base}.js"]
10
+ out << stylesheet_link_tag("#{get_folder base_s}/#{basename}", media: 'all', 'data-turbolinks-track' => true) if base_s.any?
11
+ out << javascript_include_tag("#{get_folder base_j}/#{basename}", 'data-turbolinks-track' => true) if base_j.any?
12
+ end
13
+ out.join("\n ").html_safe
14
+ end
15
+
16
+ def get_folder(base)
17
+ base.first.split("/")[-2]
18
+ end
19
+ end
20
+ end
21
+
22
+ ActiveSupport.on_load(:action_view) { include Helpers::ThecoreUiCommonsHelper }
@@ -0,0 +1,4 @@
1
+ en:
2
+ activerecord:
3
+ models:
4
+ rails_admin_settings/setting: Configurations
@@ -0,0 +1,44 @@
1
+ en:
2
+ current_user: Current User
3
+ hello: Hello World
4
+ dashboard: Dashboard
5
+ contact: Help us
6
+ manage: Manage
7
+ sign_out: Sign Out
8
+ advanced: Advanced
9
+ main_records: Registries
10
+ errors:
11
+ messages:
12
+ invalid: Invalid characters
13
+ tiered_times:
14
+ dd:
15
+ zero: "0 Days"
16
+ one: "%{count} Day"
17
+ other: "%{count} Days"
18
+ hh:
19
+ zero: "0 Hours"
20
+ one: "%{count} Hour"
21
+ other: "%{count} Hours"
22
+ mm:
23
+ zero: "0 Minutes"
24
+ one: "%{count} Minute"
25
+ other: "%{count} Minutes"
26
+ ss:
27
+ zero: "0 Seconds"
28
+ one: "%{count} Second"
29
+ other: "%{count} Seconds"
30
+ admin:
31
+ links:
32
+ label: Links
33
+ tools:
34
+ label: Tools
35
+ settings:
36
+ label: Settings
37
+ advanced: Advanced
38
+ registries: Registries
39
+ operations: Operations
40
+ actions:
41
+ charts:
42
+ menu: Analisys
43
+ title: Charts
44
+ breadcrumb: Charts
@@ -0,0 +1,4 @@
1
+ it:
2
+ activerecord:
3
+ models:
4
+ rails_admin_settings/setting: Configurations
@@ -0,0 +1,44 @@
1
+ it:
2
+ current_user: Utente corrente
3
+ hello: "Ciao Mondo"
4
+ dashboard: "Pannello di controllo"
5
+ contact: "Aiutaci a Migliorare"
6
+ manage: "Gestione"
7
+ sign_out: "Uscita"
8
+ advanced: Impostazioni
9
+ main_records: Anagrafiche
10
+ errors:
11
+ messages:
12
+ invalid: contiene caratteri invalidi
13
+ tiered_times:
14
+ dd:
15
+ zero: "0 Giorni"
16
+ one: "%{count} Giorno"
17
+ other: "%{count} Giorni"
18
+ hh:
19
+ zero: "0 Ore"
20
+ one: "%{count} Ora"
21
+ other: "%{count} Ore"
22
+ mm:
23
+ zero: "0 Minuti"
24
+ one: "%{count} Minuto"
25
+ other: "%{count} Minuti"
26
+ ss:
27
+ zero: "0 Secondi"
28
+ one: "%{count} Secondo"
29
+ other: "%{count} Secondi"
30
+ admin:
31
+ links:
32
+ label: Collegamenti
33
+ tools:
34
+ label: "Strumenti"
35
+ settings:
36
+ label: Impostazioni
37
+ advanced: Avanzate
38
+ registries: Anagrafiche
39
+ operations: Operatività
40
+ actions:
41
+ charts:
42
+ menu: Analisi
43
+ title: Grafici
44
+ breadcrumb: Grafici