thecore_ui_commons 3.3.5 → 3.3.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0b58f423320587051088f25354d36950d9d5fdb366746726e9ddbb4b3104fefd
4
- data.tar.gz: ebe5d1b2767ffafd2e65058762cf8c659a81b58278d2e348c54807884fd448ef
3
+ metadata.gz: 7d1091f859ef05f14096826e8d5cd82712958819de284543dfc26120e90c0dc4
4
+ data.tar.gz: aea72ad38d7f5ac1f53af37faef3fc7f3f5b8d7f0000f918bb568093950433f8
5
5
  SHA512:
6
- metadata.gz: c1ada14a934779f350426cbe6f55930241c6edf9ccab6a95bf48acbca4b858b3fdcd32c8d748f34be12ba32618fa8f4ec1f68b27c789ff5b570392b2b0b0e40f
7
- data.tar.gz: 4db90277e3254f3d8cd5707fdef3876e3f7dea24fd61d2a586106672b4a76e59062b8c2ff9a20483ee2949d77cb43ceb4c1a56b9897e5ad5028e68beadf10a8a
6
+ metadata.gz: 2a7096802f754f1f38d48adaf8491798e61f1cf725d850e53f5f7d40e209ecab3470371e04dc2d4bad5716fa5dcf27f1accfd0cab7c03693d30d54e8e244c9da
7
+ data.tar.gz: acc0f1101c996dab5ccce5673f0e415265fa3e49437c6f7cecba832d96909756e5927ecd2bc39bf3e7b62b00e7e42ed3966881625955974c989ee0b5b08b5b4d
data/README.md CHANGED
@@ -1 +1,27 @@
1
- This is part of Thecore framework: https://github.com/gabrieletassoni/thecore/tree/release/3
1
+ # thecore_ui_commons
2
+
3
+ A Rails engine providing shared UI artifacts for [Thecore](https://github.com/gabrieletassoni/thecore/tree/release/3)-based host applications.
4
+
5
+ ## What it provides
6
+
7
+ - **Layouts** — Devise session page, Swagger UI, mailer (HTML + text)
8
+ - **Partials** — Bootstrap flash alerts, Kaminari pagination, drag-drop file uploader, logos
9
+ - **ECharts helpers** — Ruby classes for building Apache ECharts config server-side (`Vector`, `MultipleVectors`, `Binary`, `BinarySeries`, `Speedometer`, `Map`)
10
+ - **Swagger versioning** — `/info/swagger/:version` with automatic version discovery from mounted routes
11
+ - **Assets** — shared CSS/JS manifests, Active Job monitor, Devise i18n injection
12
+
13
+ ## Installation
14
+
15
+ Add to your host app's `Gemfile`:
16
+
17
+ ```ruby
18
+ gem 'thecore_ui_commons', '~> 3.0'
19
+ ```
20
+
21
+ The engine mounts automatically. No configuration required.
22
+
23
+ ## Swagger UI
24
+
25
+ The Swagger UI is available at `/info/swagger` (redirects to `/info/swagger/v2`).
26
+
27
+ If your app mounts `model_driven_api`, the engine discovers all available API versions at startup by scanning `Rails.application.routes` for paths matching `api/vN/info/swagger`. A version nav banner appears automatically above the Swagger UI — no configuration needed.
@@ -1,8 +1,10 @@
1
1
  class InfoController < ApplicationController
2
- # This is a model-less controller just to render che swagger page using a custom layout
3
2
  layout 'swagger'
4
3
  def swagger
4
+ @version = params[:version].to_s.gsub(/[^a-zA-Z0-9]/, '')
5
+ @versions = ThecoreUiCommons.swagger_api_versions
5
6
  uri = URI(request.url)
6
- @swagger_json_url = "#{uri.scheme}://#{uri.host}#{":#{uri.port}" if uri.port.present?}#{ENV.fetch("RAILS_RELATIVE_URL_ROOT", "")}/api/v2/info/swagger.json"
7
+ @base_url = "#{uri.scheme}://#{uri.host}#{":#{uri.port}" if uri.port.present?}#{ENV.fetch("RAILS_RELATIVE_URL_ROOT", "")}"
8
+ @swagger_json_url = "#{@base_url}/api/#{@version}/info/swagger.json"
7
9
  end
8
- end
10
+ end
@@ -1,28 +1,55 @@
1
- <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui-bundle.js"> </script>
2
- <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui-standalone-preset.js"> </script>
3
- <script>
4
- function get(yourUrl){
5
- var Httpreq = new XMLHttpRequest(); // a new request
6
- Httpreq.open("GET",yourUrl,false);
7
- Httpreq.send(null);
8
- var json_obj = JSON.parse(Httpreq.responseText);
9
- return json_obj;
10
- }
11
- window.onload = function() {
12
- const ui = SwaggerUIBundle({
13
- spec: get('<%= @swagger_json_url %>'),
14
- dom_id: '#swagger-ui',
15
- deepLinking: true,
16
- presets: [
17
- SwaggerUIBundle.presets.apis,
18
- SwaggerUIStandalonePreset
19
- ],
20
- plugins: [
21
- SwaggerUIBundle.plugins.DownloadUrl
22
- ],
23
- layout: "StandaloneLayout"
24
- })
25
-
26
- window.ui = ui
27
- }
28
- </script>
1
+ <% if @versions.length > 1 %>
2
+ <% content_for :version_nav do %>
3
+ <style>
4
+ #version-nav {
5
+ display: flex;
6
+ align-items: center;
7
+ gap: 0.4rem;
8
+ padding: 0.55rem 1rem;
9
+ background: #f1f5f9;
10
+ border-bottom: 1px solid #e2e8f0;
11
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
12
+ font-size: 0.82rem;
13
+ color: #64748b;
14
+ }
15
+ #version-nav .vn-label { margin-right: 0.2rem; }
16
+ #version-nav a {
17
+ display: inline-block;
18
+ padding: 0.22rem 0.7rem;
19
+ border-radius: 999px;
20
+ text-decoration: none;
21
+ border: 1px solid #3b82f6;
22
+ color: #3b82f6;
23
+ font-weight: 500;
24
+ transition: background 0.15s, color 0.15s;
25
+ }
26
+ #version-nav a:hover { background: #3b82f6; color: #fff; }
27
+ #version-nav a.current { background: #3b82f6; color: #fff; pointer-events: none; }
28
+ </style>
29
+ <div id="version-nav">
30
+ <span class="vn-label">API version:</span>
31
+ <% @versions.each do |v| %>
32
+ <% if v == @version %>
33
+ <a href="#" class="current"><%= v %></a>
34
+ <% else %>
35
+ <a href="<%= request.path.sub(/[^\/]+$/, v) %>"><%= v %></a>
36
+ <% end %>
37
+ <% end %>
38
+ </div>
39
+ <% end %>
40
+ <% end %>
41
+
42
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui-bundle.js"></script>
43
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui-standalone-preset.js"></script>
44
+ <script>
45
+ window.addEventListener('load', function () {
46
+ SwaggerUIBundle({
47
+ url: '<%= j @swagger_json_url %>',
48
+ dom_id: '#swagger-ui',
49
+ deepLinking: true,
50
+ presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
51
+ plugins: [SwaggerUIBundle.plugins.DownloadUrl],
52
+ layout: 'StandaloneLayout'
53
+ });
54
+ });
55
+ </script>
@@ -2,14 +2,10 @@
2
2
  <head>
3
3
  <meta charset="UTF-8">
4
4
  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.19.5/swagger-ui.css" >
5
- <style>
6
- .swagger-ui .topbar {
7
- display: none;
8
- }
9
- </style>
10
5
  </head>
11
6
 
12
7
  <body>
8
+ <%= yield :version_nav %>
13
9
  <div id="swagger-ui"></div>
14
10
  <%=yield%>
15
11
  </body>
data/config/routes.rb CHANGED
@@ -3,7 +3,7 @@ Rails.application.routes.draw do
3
3
  controllers = {
4
4
  sessions: "users/sessions"
5
5
  }
6
- controllers[:omniauth_callbacks] = 'users/omniauth_callbacks' if ThecoreAuthCommons.oauth_vars?
6
+ controllers[:omniauth_callbacks] = 'users/omniauth_callbacks' if ThecoreAuthCommons.respond_to?(:oauth_vars?) && ThecoreAuthCommons.oauth_vars?
7
7
  devise_for :users, controllers: controllers
8
8
  end
9
9
 
@@ -14,6 +14,7 @@ Rails.application.routes.draw do
14
14
  end
15
15
 
16
16
  scope ENV.fetch("RAILS_RELATIVE_URL_ROOT", "/") do
17
- get '/info/swagger', to: 'info#swagger'
17
+ get '/info/swagger', to: redirect { |_params, req| "#{req.path}/v2" }
18
+ get '/info/swagger/:version', to: 'info#swagger'
18
19
  end
19
20
  end
@@ -1,3 +1,3 @@
1
1
  module ThecoreUiCommons
2
- VERSION = "3.3.5".freeze
2
+ VERSION = "3.3.6".freeze
3
3
  end
@@ -16,6 +16,25 @@ require "omniauth/rails_csrf_protection"
16
16
  require "thecore_ui_commons/engine"
17
17
 
18
18
  module ThecoreUiCommons
19
+ @swagger_api_versions = nil
20
+
21
+ class << self
22
+ attr_writer :swagger_api_versions
23
+
24
+ def swagger_api_versions
25
+ @swagger_api_versions.nil? ? scan_swagger_routes(Rails.application.routes.routes) : @swagger_api_versions
26
+ end
27
+ end
28
+
29
+ def self.scan_swagger_routes(routes)
30
+ routes
31
+ .map { |r| r.path.spec.to_s }
32
+ .grep(/\/api\/(v\d+)\/info\/swagger/)
33
+ .map { |p| p.match(/\/api\/(v\d+)\/info\/swagger/)[1] }
34
+ .uniq
35
+ .sort_by { |v| v[1..].to_i }
36
+ end
37
+
19
38
  def self.save_files files
20
39
  files.each do |pic|
21
40
  upload_dir = Rails.root.join(Settings.ns(:importer).import_from_folder, 'uploads')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thecore_ui_commons
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.5
4
+ version: 3.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriele Tassoni