glib-web 0.3.11 → 0.3.12

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/application/json/libs.rb +11 -12
  3. data/app/controllers/concerns/application/json/transformation.rb +1 -1
  4. data/app/controllers/concerns/application/json/ui.rb +3 -3
  5. data/app/controllers/concerns/application/json/validation.rb +1 -1
  6. data/app/helpers/glib/json_ui/abstract_builder.rb +2 -0
  7. data/app/helpers/glib/json_ui/action_builder.rb +25 -32
  8. data/app/helpers/glib/json_ui/list_builders.rb +0 -10
  9. data/app/helpers/glib/json_ui/page_helper.rb +17 -3
  10. data/app/helpers/glib/json_ui/split_builders.rb +0 -7
  11. data/app/helpers/glib/json_ui/view_builder/charts.rb +19 -0
  12. data/app/helpers/glib/json_ui/view_builder/fields.rb +9 -0
  13. data/app/helpers/glib/json_ui/view_builder.rb +18 -9
  14. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +5 -1
  15. data/app/views/json_ui/garage/notifications/index.json.jbuilder +2 -2
  16. data/app/views/json_ui/garage/views/_chart_data.json.jbuilder +17 -0
  17. data/app/views/json_ui/garage/views/charts.json.jbuilder +24 -17
  18. data/lib/glib/json_crawler/http.rb +4 -2
  19. metadata +5 -22
  20. data/app/controllers/concerns/glib/json/libs.rb +0 -93
  21. data/app/controllers/concerns/glib/json/transformation.rb +0 -11
  22. data/app/controllers/concerns/glib/json/ui.rb +0 -66
  23. data/app/controllers/concerns/glib/json/validation.rb +0 -13
  24. data/app/helpers/glib/dynamic_texts_helper.rb +0 -18
  25. data/app/models/glib/dynamic_text_record.rb +0 -6
  26. data/app/models/glib/text.rb +0 -36
  27. data/lib/generators/glib/install_generator.rb +0 -19
  28. data/lib/generators/templates/20191017062519_create_texts.rb +0 -12
  29. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +0 -7
  30. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +0 -7
  31. data/lib/generators/templates/database.yml +0 -107
  32. data/lib/generators/templates/dynamic_text.rb +0 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 69432dcf32db57ac795c618f216d7e2bd36b564b13872700135271b88e80c02c
4
- data.tar.gz: c9adde3694e7663e5dc422bd8271649a9ca07095ba4397f1ccbb80b6b3a4c972
3
+ metadata.gz: 3d9c8901bfee8243bbc64b4693fbd3f3d2395ce3dacfdf394456204ec5c995c9
4
+ data.tar.gz: 3c1fbb85bd85b9b2c58eabb5824cac8dbd94a0b97b815e01b442142ebcff9e80
5
5
  SHA512:
6
- metadata.gz: 9d7b997aa956b6905ee1224f47af35314ed936894acb4f49373c8e0af987c12757e0f9b24983ea6288531bbe64877e9a8dff025c3f38a0e883c592710a4d5097
7
- data.tar.gz: 8f749848943c2d2236a174851947238379c874dc4257359f7e0e6348711809972afaebfd29059e14ced9d2a709317bb9988204a192ce39b9c2ca83c19735f52a
6
+ metadata.gz: 8531f46175119fbc397cda8ee0a7e7c4ad4cecad00a6935973a0d1d25a17b34a8a62680f06e45a099dde054816d6e60c3ed24597b5c2213bb41c1e3658c2a589
7
+ data.tar.gz: 2b78a224ac48364902f42fbc24f6fcce9478e49665f86137aae30167a1d3892ccabab15ee40bfb3c129378956de037b55c20d8e5d9a2d26fc519fb84ad6a3290
@@ -1,5 +1,4 @@
1
- # TODO: Deprecate
2
- module Application::Json::Libs
1
+ module Concerns::Application::Json::Libs
3
2
  extend ActiveSupport::Concern
4
3
 
5
4
  included do
@@ -28,7 +27,7 @@ module Application::Json::Libs
28
27
  def json_ui_app_is_android?
29
28
  json_ui_app_device_os == 'android'
30
29
  end
31
-
30
+
32
31
  def json_ui_app_is_ios?
33
32
  json_ui_app_device_os == 'ios'
34
33
  end
@@ -42,9 +41,9 @@ module Application::Json::Libs
42
41
  module ClassMethods
43
42
 
44
43
  def json_libs_init(options)
45
- include Application::Json::Transformation
46
- include Application::Json::Validation
47
- include Application::Json::Ui
44
+ include Concerns::Application::Json::Transformation
45
+ include Concerns::Application::Json::Validation
46
+ include Concerns::Application::Json::Ui
48
47
 
49
48
  before_action :__json_ui_start
50
49
 
@@ -55,7 +54,7 @@ module Application::Json::Libs
55
54
  after_action :__json_transformation_commit
56
55
  after_action :__json_validate_perform
57
56
  end
58
-
57
+
59
58
  def json_libs_set_locale
60
59
  before_action do
61
60
  # Need to explicitly fallback to EN
@@ -64,7 +63,7 @@ module Application::Json::Libs
64
63
  I18n.locale = :en
65
64
  end
66
65
  end
67
-
66
+
68
67
  def json_libs_force_json_ui
69
68
  before_action do
70
69
  if params[:_render] != 'v1'
@@ -73,17 +72,17 @@ module Application::Json::Libs
73
72
  end
74
73
  end
75
74
 
76
- def json_libs_rescue_csrf
75
+ def json_libs_rescue_csrf
77
76
  rescue_from ActionController::InvalidAuthenticityToken do |exception|
78
77
  sign_out(:user)
79
78
 
80
79
  respond_to do |format|
81
80
  format.json do
82
- render json: {
83
- onResponse: {
81
+ render json: {
82
+ onResponse: {
84
83
  action: 'windows/open-v1',
85
84
  url: root_url
86
- }
85
+ }
87
86
  }
88
87
  end
89
88
  end
@@ -1,4 +1,4 @@
1
- module Application::Json::Transformation
1
+ module Concerns::Application::Json::Transformation
2
2
  def json_transformation_start
3
3
  if request.format == 'json'
4
4
  @__transformed_json ||= JSON.parse(response.body) rescue nil
@@ -1,10 +1,10 @@
1
- module Application::Json::Ui
1
+ module Concerns::Application::Json::Ui
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
5
  rescue_from ActionController::UnknownFormat do |exception|
6
6
  if json_ui_activated?
7
- # Tell `__json_ui_start()` to avoid rendering this page while still retaining the `_render` param
7
+ # Tell `__json_ui_start()` to avoid rendering this page while still retaining the `_render` param
8
8
  # so that the page remains linking to other json_ui pages.
9
9
  redirect_to url_for(format: nil, _skip_render: true)
10
10
  else
@@ -61,6 +61,6 @@ module Application::Json::Ui
61
61
  def __json_ui_vue(hash, options)
62
62
  renderer_path = options[:renderer_path]
63
63
  @__json_ui_orig_page = response.body
64
- response.body = render_to_string(template: renderer_path, layout: false, content_type: 'text/html', locals: { page: hash, options: options })
64
+ response.body = render_to_string(file: renderer_path, layout: false, content_type: 'text/html', locals: { page: hash, options: options })
65
65
  end
66
66
  end
@@ -1,4 +1,4 @@
1
- module Application::Json::Validation
1
+ module Concerns::Application::Json::Validation
2
2
  def __json_validate_perform
3
3
  if Rails.env.development? && params[:_validate] == 'true'
4
4
  if (hash = json_transformation_start).is_a?(Hash)
@@ -18,6 +18,8 @@ module Glib
18
18
  name_components = name.to_s.split('_')
19
19
  json.set! type, "#{name_components.join('/')}" if type
20
20
  args = [yield] if block_given?
21
+
22
+ # TODO: consider caching these instances
21
23
  "#{self.class.name}::#{name_components.map{ |str| capitalize_first_letter_and_leave_others_alone(str) }.join('::')}".constantize.new(json, @page).parse(*args)
22
24
  end
23
25
 
@@ -4,7 +4,7 @@ module Glib
4
4
  def method_missing m, *args
5
5
  add_singleton_element_v1 'action', m, *args
6
6
  end
7
-
7
+
8
8
  class Action < JsonUiElement
9
9
  def analytics(value)
10
10
  if value.is_a?(String)
@@ -43,31 +43,31 @@ module Glib
43
43
  string :message
44
44
  action :onClose
45
45
  end
46
-
46
+
47
47
  # class Confirm < Action
48
48
  # string :message
49
49
  # action :onConfirm
50
50
  # action :onCancel
51
51
  # end
52
-
52
+
53
53
  class Options < Action
54
54
  string :message
55
-
55
+
56
56
  def buttons(block)
57
57
  json.buttons do
58
58
  block.call page.menu_builder
59
59
  end
60
60
  end
61
61
  end
62
-
62
+
63
63
  class Open < Action
64
64
  string :url, cache: true
65
65
  end
66
-
66
+
67
67
  class Close < Action
68
68
  action :onClose
69
69
  end
70
-
70
+
71
71
  # TODO: Deprecate
72
72
  # Consider renaming to ShowSnackbar
73
73
  class Snackbar < Action
@@ -76,16 +76,9 @@ module Glib
76
76
  string :horizontalPosition
77
77
  singleton_array :styleClass, :styleClasses
78
78
  end
79
-
80
- class Notification < Action
81
- string :title
82
- string :body
83
- string :tag
84
- int :timeout
85
- end
86
-
79
+
87
80
  end
88
-
81
+
89
82
  module Snackbars
90
83
  class Alert < Action
91
84
  string :message
@@ -95,20 +88,20 @@ module Glib
95
88
  string :horizontalPosition
96
89
  singleton_array :styleClass, :styleClasses
97
90
  end
98
-
91
+
99
92
  # class Confirm < Action
100
93
  # string :message
101
94
  # action :onConfirm
102
95
  # action :onCancel
103
-
96
+
104
97
  # string :verticalPosition
105
98
  # string :horizontalPosition
106
99
  # singleton_array :styleClass, :styleClasses
107
100
  # end
108
-
101
+
109
102
  class Options < Action
110
103
  string :message
111
-
104
+
112
105
  string :verticalPosition
113
106
  string :horizontalPosition
114
107
  singleton_array :styleClass, :styleClasses
@@ -118,15 +111,15 @@ module Glib
118
111
  block.call page.menu_builder
119
112
  end
120
113
  end
121
-
114
+
122
115
  end
123
-
116
+
124
117
  end
125
118
 
126
119
  module Forms
127
120
  class Submit < Action
128
121
  end
129
-
122
+
130
123
  end
131
124
 
132
125
  module Windows
@@ -137,16 +130,16 @@ module Glib
137
130
  class CloseAll < Action
138
131
  action :onClose
139
132
  end
140
-
133
+
141
134
  class Open < Action
142
135
  string :url, cache: true
143
136
  action :onOpen
144
137
  end
145
-
138
+
146
139
  class OpenWeb < Action
147
140
  string :url
148
141
  end
149
-
142
+
150
143
  class Reload < Action
151
144
  string :url, cache: true
152
145
  end
@@ -158,16 +151,16 @@ module Glib
158
151
  string :token
159
152
  action :onSave
160
153
  end
161
-
154
+
162
155
  end
163
-
156
+
164
157
  # FUTURE
165
158
  module Data
166
159
  class SaveCsrfToken < Action
167
160
  string :token
168
161
  action :onSave
169
162
  end
170
-
163
+
171
164
  class Clear < Action
172
165
  end
173
166
  end
@@ -177,17 +170,17 @@ module Glib
177
170
  string :url, cache: true
178
171
  hash :formData
179
172
  end
180
-
173
+
181
174
  class Patch < Action
182
175
  string :url, cache: true
183
176
  hash :formData
184
177
  end
185
-
178
+
186
179
  class Delete < Action
187
180
  string :url, cache: true
188
181
  hash :formData
189
182
  end
190
-
183
+
191
184
  end
192
185
 
193
186
  ###
@@ -38,11 +38,6 @@ module Glib
38
38
  def header(options = {})
39
39
  json.header do
40
40
  page.vertical_content(options)
41
-
42
- # json.padding options[:padding]
43
- # json.childViews do
44
- # options[:childViews]&.call page.view_builder
45
- # end
46
41
  end
47
42
  end
48
43
 
@@ -62,11 +57,6 @@ module Glib
62
57
  def footer(options = {})
63
58
  json.footer do
64
59
  page.vertical_content(options)
65
-
66
- # json.padding options[:padding]
67
- # json.childViews do
68
- # options[:childViews]&.call page.view_builder
69
- # end
70
60
  end
71
61
  end
72
62
  end
@@ -10,8 +10,10 @@ module Glib
10
10
  )
11
11
  end
12
12
 
13
- def json_ui_page json
14
- yield Page.new(json, self)
13
+ def json_ui_page json, &block
14
+ page = Page.new(json, self)
15
+ block&.call page
16
+ page
15
17
  end
16
18
 
17
19
  class Page
@@ -25,7 +27,7 @@ module Glib
25
27
  @json = json
26
28
  @context = context
27
29
 
28
- @view_builder = ViewBuilder.new(json, self)
30
+ @view_builder = ViewBuilder.new(json, self, true)
29
31
  @action_builder = ActionBuilder.new(json, self)
30
32
  @menu_builder = MenuBuilder.new(json, self)
31
33
 
@@ -57,6 +59,14 @@ module Glib
57
59
  options[:content]&.call drawer_content_builder
58
60
  end
59
61
  end
62
+
63
+ def navBar(options = {})
64
+ json.navBar do
65
+ json.rightItems do
66
+ options[:rightItems]&.call @menu_builder
67
+ end
68
+ end
69
+ end
60
70
 
61
71
  def header(options = {})
62
72
  json.header do
@@ -106,6 +116,10 @@ module Glib
106
116
  end
107
117
  end
108
118
 
119
+ def data(options = {})
120
+ options[:content].call(ViewBuilder.new(json, self, false))
121
+ end
122
+
109
123
  def vertical_content(options)
110
124
  options = options.reverse_merge(width: 'matchParent')
111
125
 
@@ -24,13 +24,6 @@ module Glib
24
24
  json.right do
25
25
  page.vertical_content(options)
26
26
  end
27
-
28
- # json.right do
29
- # json.padding options[:padding]
30
- # json.childViews do
31
- # options[:childViews]&.call page.view_builder
32
- # end
33
- # end
34
27
  end
35
28
  end
36
29
 
@@ -0,0 +1,19 @@
1
+ class Glib::JsonUi::ViewBuilder
2
+ module Charts
3
+ class Line < View
4
+ hash :nextPage
5
+
6
+ def dataSeries(blocks)
7
+ json.dataSeries do
8
+ blocks.each do |block|
9
+ json.child! do
10
+ block.call
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ end
17
+
18
+ end
19
+ end
@@ -85,6 +85,15 @@ class Glib::JsonUi::ViewBuilder
85
85
 
86
86
  class Hidden < Text
87
87
  end
88
+
89
+ # Benefits of using `fields/submit` over `button`
90
+ # - On the web, it translates to input[type=submit] which provides builtin functionality such as
91
+ # submitting upon pressing enter on a field and remembering values for autofill.
92
+ # - We can attach name-value param to it. See https://www.w3schools.com/tags/att_button_value.asp
93
+ # - It has a default onClick so no need to specify `onClick: ->(action) { action.forms_submit }`
94
+ class Submit < AbstractField
95
+ string :text
96
+ end
88
97
 
89
98
  class CheckGroup < AbstractField
90
99
  views :childViews
@@ -1,8 +1,18 @@
1
1
  module Glib
2
2
  module JsonUi
3
3
  class ViewBuilder < AbstractBuilder
4
+ def initialize json, page, multiple
5
+ super(json, page)
6
+
7
+ @multiple = multiple
8
+ end
9
+
4
10
  def add_view name, *args
5
- add_element_to_array_v1 'view', name, *args
11
+ if @multiple
12
+ add_element_to_array_v1 'view', name, *args
13
+ else
14
+ add_singleton_element_v1 'view', name, *args
15
+ end
6
16
  end
7
17
 
8
18
  def method_missing m, *args
@@ -61,9 +71,8 @@ module Glib
61
71
 
62
72
  class P < AbstractText
63
73
  end
64
-
74
+
65
75
  class Label < AbstractText
66
- string :format
67
76
  action :onClick
68
77
  end
69
78
 
@@ -77,7 +86,7 @@ module Glib
77
86
  string :url
78
87
  action :onClick
79
88
  end
80
-
89
+
81
90
  class Icon < View
82
91
  string :name
83
92
  action :onClick
@@ -87,7 +96,7 @@ module Glib
87
96
  # icon :icon
88
97
  # string :text
89
98
  # end
90
-
99
+
91
100
  class Button < View
92
101
  icon :icon, cache: true
93
102
  string :text, cache: true
@@ -112,7 +121,7 @@ module Glib
112
121
  int :zoom
113
122
  string :dataUrl
114
123
  end
115
-
124
+
116
125
  class Chip < View
117
126
  string :text
118
127
  end
@@ -120,10 +129,10 @@ module Glib
120
129
  class Calendar < View
121
130
  string :dataUrl
122
131
  end
123
-
132
+
124
133
  class TabBar < View
125
134
  color :color
126
-
135
+
127
136
  def tabButtons(block)
128
137
  json.tabButtons do
129
138
  block.call page.menu_builder
@@ -141,7 +150,7 @@ module Glib
141
150
  # end
142
151
  # end
143
152
  # end
144
-
153
+
145
154
  end
146
155
 
147
156
  end
@@ -4,7 +4,11 @@ json_ui_page json do |page|
4
4
  render "#{@path_prefix}/nav_menu", json: json, page: page
5
5
 
6
6
  page.form url: json_ui_garage_url(path: 'forms/submission_indicator_post'), method: 'post', padding: { top: 12, left: 20, right: 20, bottom: 12 }, childViews: ->(form) do
7
- form.button text: 'This button gets disabled on submit', onClick: ->(action) { action.forms_submit }
7
+ form.label text: 'These buttons get disabled on submit'
8
+ form.spacer height: 10
9
+ form.button text: 'Normal Button', onClick: ->(action) { action.forms_submit }
10
+ form.spacer height: 10
11
+ form.fields_submit text: 'Submit Button'
8
12
 
9
13
  # This needs to be long enough that the FAB is roughly at the bottom of a mobile screen.
10
14
  # Ideally the spacer can expand dynamically depending on available space.
@@ -2,11 +2,11 @@ json.title 'Notifications'
2
2
 
3
3
  json_ui_page json do |page|
4
4
  render "#{@path_prefix}/nav_menu", json: json, page: page, top_nav: true
5
-
5
+
6
6
  page.list firstSection: ->(section) do
7
7
  section.rows builder: ->(template) do
8
8
  template.thumbnail title: 'Send Desktop Notification', onClick: ->(action) do
9
- action.dialogs_notification title: 'Hello World', body: 'Body Message'
9
+ # TODO: Send and display desktop notification
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,17 @@
1
+ page_index = params[:page].to_i
2
+ next_page = {
3
+ url: json_ui_garage_url(path: 'views/charts', page: page_index + 1, data_only: 'v1'),
4
+ autoload: 'all'
5
+ }
6
+
7
+ if page_index < 3
8
+ builder.charts_line nextPage: next_page, dataSeries: [
9
+ -> do
10
+ json.title "Page #{page_index + 1}"
11
+
12
+ from = page_index + 1
13
+ to = page_index
14
+ json.points (from.month.ago.to_date..to.month.ago.to_date).map { |d| { x: d, y: 100 + rand(40) } }
15
+ end
16
+ ]
17
+ end
@@ -1,16 +1,20 @@
1
- json.title 'Views'
2
1
 
3
- json_ui_page json do |page|
4
- render "#{@path_prefix}/nav_menu", json: json, page: page
5
-
6
- page.scroll padding: {top: 20, left: 20, right: 20, bottom: 20}, childViews: ->(scroll) do
7
- scroll.h1 text: 'Line Chart'
2
+ if params[:data_only].present?
3
+ json_ui_page json do |page|
4
+ page.data content: ->(data) do
5
+ render "#{@path_prefix}/views/chart_data", json: json, builder: data
6
+ end
7
+ end
8
+ else
9
+ json.title 'Views'
8
10
 
9
- json.child! do
10
- json.view 'charts/line-v1'
11
-
12
- json.dataSeries do
13
- json.child! do
11
+ json_ui_page json do |page|
12
+ render "#{@path_prefix}/nav_menu", json: json, page: page
13
+
14
+ page.scroll padding: {top: 20, left: 20, right: 20, bottom: 20}, childViews: ->(scroll) do
15
+ scroll.h1 text: 'Line chart'
16
+ scroll.charts_line dataSeries: [
17
+ -> do
14
18
  json.title 'Line 1'
15
19
 
16
20
  points = {
@@ -22,10 +26,9 @@ json_ui_page json do |page|
22
26
  'Thu, 15 Nov 2018' => 1,
23
27
  'Fri, 16 Nov 2018' => 5,
24
28
  }
25
- json.dataPoints points.map { |k, v| { x: k, y: v } }
26
- end
27
-
28
- json.child! do
29
+ json.points points.map { |k, v| { x: k, y: v } }
30
+ end,
31
+ -> do
29
32
  json.title 'Line 2'
30
33
 
31
34
  points = {
@@ -37,11 +40,15 @@ json_ui_page json do |page|
37
40
  'Thu, 15 Nov 2018' => 5,
38
41
  'Fri, 16 Nov 2018' => 1,
39
42
  }
40
- json.dataPoints points.map { |k, v| { x: k, y: v } }
43
+ json.points points.map { |k, v| { x: k, y: v } }
41
44
  end
45
+ ]
42
46
 
43
- end
47
+ scroll.spacer height: 20
48
+ scroll.h1 text: 'Line chart using remote data'
49
+ render "#{@path_prefix}/views/chart_data", json: json, builder: scroll
44
50
 
45
51
  end
46
52
  end
53
+
47
54
  end
@@ -30,7 +30,7 @@ module Glib
30
30
  # # Allow repeating urls because excluding them makes the test results really hard to analyze.
31
31
  # # if history.include?(url)
32
32
 
33
- # if url.blank?
33
+ # if url.blank?
34
34
  # nil
35
35
  # else
36
36
  # @context.assert_match URI_REGEXP, url
@@ -52,6 +52,7 @@ module Glib
52
52
  # end
53
53
  # end
54
54
  # end
55
+
55
56
  end
56
57
 
57
58
  def post(url, controller, params)
@@ -103,13 +104,14 @@ module Glib
103
104
  else
104
105
  response_times << response.headers['X-Runtime'].to_f
105
106
  @context.assert_includes VALID_RESPONSE_CODES, code, "Expected a valid response but was [#{response.code}] #{Rack::Utils::HTTP_STATUS_CODES[response.code.to_i]}:\n#{url}"
106
- if response.media_type == 'application/json'
107
+ if response.content_type == 'application/json'
107
108
  JSON.parse(response.body)
108
109
  else
109
110
  nil
110
111
  end
111
112
  end
112
113
  end
114
+
113
115
  end
114
116
  end
115
117
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glib-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.11
4
+ version: 0.3.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
@@ -14,22 +14,16 @@ dependencies:
14
14
  name: activestorage
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: 5.2.3
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: 6.1.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: 5.2.3
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: 6.1.0
33
27
  description:
34
28
  email: ''
35
29
  executables: []
@@ -40,12 +34,7 @@ files:
40
34
  - app/controllers/concerns/application/json/transformation.rb
41
35
  - app/controllers/concerns/application/json/ui.rb
42
36
  - app/controllers/concerns/application/json/validation.rb
43
- - app/controllers/concerns/glib/json/libs.rb
44
- - app/controllers/concerns/glib/json/transformation.rb
45
- - app/controllers/concerns/glib/json/ui.rb
46
- - app/controllers/concerns/glib/json/validation.rb
47
37
  - app/controllers/glib/home_controller.rb
48
- - app/helpers/glib/dynamic_texts_helper.rb
49
38
  - app/helpers/glib/json_ui/abstract_builder.rb
50
39
  - app/helpers/glib/json_ui/action_builder.rb
51
40
  - app/helpers/glib/json_ui/list_builders.rb
@@ -57,10 +46,9 @@ files:
57
46
  - app/helpers/glib/json_ui/table_builders.rb
58
47
  - app/helpers/glib/json_ui/view_builder.rb
59
48
  - app/helpers/glib/json_ui/view_builder/banners.rb
49
+ - app/helpers/glib/json_ui/view_builder/charts.rb
60
50
  - app/helpers/glib/json_ui/view_builder/fields.rb
61
51
  - app/helpers/glib/json_ui/view_builder/panels.rb
62
- - app/models/glib/dynamic_text_record.rb
63
- - app/models/glib/text.rb
64
52
  - app/views/app/views/json_ui/vue/renderer.html.erb
65
53
  - app/views/json_ui/garage/_nav_menu.json.jbuilder
66
54
  - app/views/json_ui/garage/actions/index.json.jbuilder
@@ -112,6 +100,7 @@ files:
112
100
  - app/views/json_ui/garage/tables/export_import.json.jbuilder
113
101
  - app/views/json_ui/garage/tables/horizontal_scroll.json.jbuilder
114
102
  - app/views/json_ui/garage/tables/index.json.jbuilder
103
+ - app/views/json_ui/garage/views/_chart_data.json.jbuilder
115
104
  - app/views/json_ui/garage/views/banners.json.jbuilder
116
105
  - app/views/json_ui/garage/views/calendar_data.json.jbuilder
117
106
  - app/views/json_ui/garage/views/carousels.json.jbuilder
@@ -124,12 +113,6 @@ files:
124
113
  - app/views/json_ui/garage/views/misc.json.jbuilder
125
114
  - app/views/json_ui/garage/views/texts.json.jbuilder
126
115
  - config/routes.rb
127
- - lib/generators/glib/install_generator.rb
128
- - lib/generators/templates/20191017062519_create_texts.rb
129
- - lib/generators/templates/20191024063257_add_scope_to_texts.rb
130
- - lib/generators/templates/20191112095018_add_lang_to_texts.rb
131
- - lib/generators/templates/database.yml
132
- - lib/generators/templates/dynamic_text.rb
133
116
  - lib/glib-web.rb
134
117
  - lib/glib/engine.rb
135
118
  - lib/glib/json_crawler.rb
@@ -1,93 +0,0 @@
1
- module Glib::Json::Libs
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- extend ClassMethods
6
-
7
- helper_method :json_ui_app_bundle_id, :json_ui_app_build_version, :json_ui_app_device_os
8
- helper_method :json_ui_app_is_android?, :json_ui_app_is_ios?, :json_ui_app_is_web?
9
- end
10
-
11
- def json_ui_app_bundle_id
12
- @json_ui_app_bundle_id ||= request.headers['JsonUiApp-Bundle-Id']
13
- end
14
-
15
- def json_ui_app_build_version
16
- @json_ui_app_build_version ||= request.headers['JsonUiApp-Build-Version']
17
- @json_ui_app_build_version = params[:build_version] if @json_ui_app_build_version.nil? && Rails.env.development? # For easy testing
18
- @json_ui_app_build_version
19
- end
20
-
21
- def json_ui_app_device_os
22
- @json_ui_app_device_os ||= request.headers['JsonUiApp-Device-Os']
23
- @json_ui_app_device_os = params[:device_os] if @json_ui_app_device_os.nil? && Rails.env.development? # For easy testing
24
- @json_ui_app_device_os || 'web'
25
- end
26
-
27
- def json_ui_app_is_android?
28
- json_ui_app_device_os == 'android'
29
- end
30
-
31
- def json_ui_app_is_ios?
32
- json_ui_app_device_os == 'ios'
33
- end
34
-
35
- def json_ui_app_is_web?
36
- json_ui_app_device_os == 'web'
37
- end
38
-
39
-
40
-
41
- module ClassMethods
42
-
43
- def json_libs_init(options)
44
- include Glib::Json::Transformation
45
- include Glib::Json::Validation
46
- include Glib::Json::Ui
47
-
48
- before_action :__json_ui_start
49
-
50
- # Note that after_action gets executed in reverse
51
- after_action do
52
- __json_ui_commit(options)
53
- end
54
- after_action :__json_transformation_commit
55
- after_action :__json_validate_perform
56
- end
57
-
58
- def json_libs_set_locale
59
- before_action do
60
- # Need to explicitly fallback to EN
61
- I18n.locale = params[:_locale] || :en
62
- rescue
63
- I18n.locale = :en
64
- end
65
- end
66
-
67
- def json_libs_force_json_ui
68
- before_action do
69
- if params[:_render] != 'v1'
70
- redirect_to url_for(params.to_unsafe_h.merge(_render: 'v1'))
71
- end
72
- end
73
- end
74
-
75
- def json_libs_rescue_csrf
76
- rescue_from ActionController::InvalidAuthenticityToken do |exception|
77
- sign_out(:user)
78
-
79
- respond_to do |format|
80
- format.json do
81
- render json: {
82
- onResponse: {
83
- action: 'windows/open-v1',
84
- url: root_url
85
- }
86
- }
87
- end
88
- end
89
- end
90
- end
91
-
92
- end
93
- end
@@ -1,11 +0,0 @@
1
- module Glib::Json::Transformation
2
- def json_transformation_start
3
- if request.format == 'json'
4
- @__transformed_json ||= JSON.parse(response.body) rescue nil
5
- end
6
- end
7
-
8
- def __json_transformation_commit
9
- response.body = @__transformed_json.to_json if @__transformed_json
10
- end
11
- end
@@ -1,66 +0,0 @@
1
- module Glib::Json::Ui
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- rescue_from ActionController::UnknownFormat do |exception|
6
- if json_ui_activated?
7
- # Tell `__json_ui_start()` to avoid rendering this page while still retaining the `_render` param
8
- # so that the page remains linking to other json_ui pages.
9
- redirect_to url_for(format: nil, _skip_render: true)
10
- else
11
- raise exception
12
- end
13
- end
14
- end
15
-
16
- # Override
17
- def form_authenticity_token
18
- Rails.env.test? ? 'test_token' : super
19
- end
20
-
21
- # NOTE: Override default_url_options and call this method
22
- def json_ui_url_options
23
- options = {}
24
- options[:_render] = params[:_render]
25
- options[:_locale] = params[:_locale]
26
- options[:format] = :json if request.format == :json
27
- options
28
- end
29
-
30
- def json_ui_activated?
31
- @__json_ui_activated
32
- end
33
-
34
- def __json_ui_start
35
- @__json_ui_activated = false
36
- @__json_ui_rendering = false
37
- if params[:_render].present?
38
- @__json_ui_activated = true
39
- request.variant = :ui
40
-
41
- if request.format.html? && params[:_skip_render] != 'true'
42
- @__json_ui_rendering = true
43
- request.format = 'json'
44
- end
45
- end
46
- end
47
-
48
- def __json_ui_commit(options)
49
- if @__json_ui_rendering
50
- if (hash = json_transformation_start).is_a?(Hash)
51
- case params[:_render]
52
- when 'v1'
53
- __json_ui_vue(hash, options)
54
- end
55
- end
56
- end
57
- end
58
-
59
- private
60
-
61
- def __json_ui_vue(hash, options)
62
- renderer_path = options[:renderer_path]
63
- @__json_ui_orig_page = response.body
64
- response.body = render_to_string(template: renderer_path, layout: false, content_type: 'text/html', locals: { page: hash, options: options })
65
- end
66
- end
@@ -1,13 +0,0 @@
1
- module Glib::Json::Validation
2
- def __json_validate_perform
3
- if Rails.env.development? && params[:_validate] == 'true'
4
- if (hash = json_transformation_start).is_a?(Hash)
5
- json_validate = JSONValidate.new(hash)
6
- response_message = json_validate.valid?
7
- hash[:_json] = {
8
- validationErrors: response_message
9
- }
10
- end
11
- end
12
- end
13
- end
@@ -1,18 +0,0 @@
1
- module Glib
2
- module DynamicTextsHelper
3
- def dt(key, default_value = '', **args)
4
- new_key = key
5
- options = {
6
- scope: args.fetch(:scope, 'itinerarybuilder'),
7
- lang: args.fetch(:lang, 'en')
8
- }
9
-
10
- if key.starts_with?('.')
11
- new_key = "#{controller_name}.#{action_name}#{key}"
12
- end
13
-
14
- content = Glib::Text.get_content(new_key, default_value, options: options)
15
- content.gsub(/\{\{(\w+)\}\}/) { args.fetch($1.to_sym, "{{#{$1}}}") }
16
- end
17
- end
18
- end
@@ -1,6 +0,0 @@
1
- module Glib
2
- class DynamicTextRecord < ActiveRecord::Base
3
- self.abstract_class = true
4
- connects_to database: { writing: :dynamic_text, reading: :dynamic_text }
5
- end
6
- end
@@ -1,36 +0,0 @@
1
- module Glib
2
- class Text < Glib::DynamicTextRecord
3
- validates :scope, presence: true
4
- validates :lang, presence: true
5
- validates :key, presence: true, uniqueness: { scope: [:scope, :lang] }
6
- validates :content, presence: true
7
-
8
- after_save :update_to_redis
9
-
10
- def self.get_content(key, default_value, options:)
11
- scope_key = "#{options[:scope]}.#{options[:lang]}.#{key}"
12
-
13
- unless content = $dt_redis.get(scope_key)
14
- if text = find_by(scope: options[:scope], lang: options[:lang], key: key)
15
- update_content(scope_key, text.content)
16
- content = text.content
17
- else
18
- create(scope: options[:scope], lang: options[:lang], key: key, content: default_value)
19
- update_content(scope_key, default_value)
20
- content = default_value
21
- end
22
- end
23
-
24
- content
25
- end
26
-
27
- private
28
- def self.update_content(scope_key, content)
29
- $dt_redis.set(scope_key, content)
30
- end
31
-
32
- def update_to_redis
33
- Glib::Text.update_content("#{scope}.#{lang}.#{key}", content)
34
- end
35
- end
36
- end
@@ -1,19 +0,0 @@
1
- module Glib
2
- module Generators
3
- class InstallGenerator < Rails::Generators::Base
4
- source_root File.expand_path('../../templates', __FILE__)
5
-
6
- class_option :redis_env_key, type: :string, default: 'DT_REDIS_URL'
7
- class_option :database_env_key, type: :string, default: 'DT_DATABASE_URL'
8
- class_option :app_name, type: :string, default: Rails.application.class.parent_name
9
-
10
- def copy_initializer
11
- template '20191017062519_create_texts.rb', 'db/dynamic_text_migrate/20191017062519_create_texts.rb'
12
- template '20191024063257_add_scope_to_texts.rb', 'db/dynamic_text_migrate/20191024063257_add_scope_to_texts.rb'
13
- template '20191112095018_add_lang_to_texts.rb', 'db/dynamic_text_migrate/20191112095018_add_lang_to_texts.rb'
14
- template 'dynamic_text.rb', 'config/initializers/dynamic_text.rb'
15
- template 'database.yml', 'config/database.yml'
16
- end
17
- end
18
- end
19
- end
@@ -1,12 +0,0 @@
1
- class CreateTexts < ActiveRecord::Migration[6.0]
2
- def change
3
- create_table :texts do |t|
4
- t.string :key
5
- t.text :content
6
-
7
- t.timestamps
8
- end
9
-
10
- add_index :texts, :key, unique: true
11
- end
12
- end
@@ -1,7 +0,0 @@
1
- class AddScopeToTexts < ActiveRecord::Migration[6.0]
2
- def change
3
- add_column :texts, :scope, :string
4
- remove_index :texts, :key
5
- add_index :texts, [:scope, :key], unique: true
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- class AddLangToTexts < ActiveRecord::Migration[6.0]
2
- def change
3
- add_column :texts, :lang, :string
4
- remove_index :texts, [:scope, :key]
5
- add_index :texts, [:scope, :lang, :key], unique: true
6
- end
7
- end
@@ -1,107 +0,0 @@
1
- # PostgreSQL. Versions 9.1 and up are supported.
2
- #
3
- # Install the pg driver:
4
- # gem install pg
5
- # On OS X with Homebrew:
6
- # gem install pg -- --with-pg-config=/usr/local/bin/pg_config
7
- # On OS X with MacPorts:
8
- # gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
9
- # On Windows:
10
- # gem install pg
11
- # Choose the win32 build.
12
- # Install PostgreSQL and put its /bin directory on your path.
13
- #
14
- # Configure Using Gemfile
15
- # gem 'pg'
16
- #
17
- default: &default
18
- adapter: postgresql
19
- encoding: unicode
20
- # For details on connection pooling, see Rails configuration guide
21
- # http://guides.rubyonrails.org/configuring.html#database-pooling
22
- pool: <%= "\<\%\= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } \%\>" %>
23
- host: <%= "\<\%\= ENV.fetch(\"DATABASE_HOST\") {} \%\>" %>
24
- username: <%= "\<\%\= ENV.fetch(\"DATABASE_USER\") {} \%\>" %>
25
- password: <%= "\<\%\= ENV.fetch(\"DATABASE_PASSWORD\") {} \%\>" %>
26
-
27
- development:
28
- primary:
29
- <<: *default
30
- database: <%= "\<\%\= ENV.fetch(\"DATABASE_NAME\") { \"#{options[:app_name]}\" } + \"_development\" \%\>" %>
31
- dynamic_text:
32
- <<: *default
33
- migrations_paths: db/dynamic_text_migrate
34
- database: <%= "\<\%\= ENV.fetch(\"DT_DATABASE_NAME\") { \"DynamicText\" } + \"_development\" \%\>" %>
35
-
36
- # The specified database role being used to connect to postgres.
37
- # To create additional roles in postgres see `$ createuser --help`.
38
- # When left blank, postgres will use the default role. This is
39
- # the same name as the operating system user that initialized the database.
40
- #username: ItineraryBuilder
41
-
42
- # The password associated with the postgres role (username).
43
- #password:
44
-
45
- # Connect on a TCP socket. Omitted by default since the client uses a
46
- # domain socket that doesn't need configuration. Windows does not have
47
- # domain sockets, so uncomment these lines.
48
- #host: localhost
49
-
50
- # The TCP port the server listens on. Defaults to 5432.
51
- # If your server runs on a different port number, change accordingly.
52
- #port: 5432
53
-
54
- # Schema search path. The server defaults to $user,public
55
- #schema_search_path: myapp,sharedapp,public
56
-
57
- # Minimum log levels, in increasing order:
58
- # debug5, debug4, debug3, debug2, debug1,
59
- # log, notice, warning, error, fatal, and panic
60
- # Defaults to warning.
61
- #min_messages: notice
62
-
63
- # Warning: The database defined as "test" will be erased and
64
- # re-generated from your development database when you run "rake".
65
- # Do not set this db to the same as development or production.
66
- test:
67
- primary:
68
- <<: *default
69
- database: <%= "\<\%\= ENV.fetch(\"DATABASE_NAME\") { \"#{options[:app_name]}\" } + \"_test\" \%\>" %>
70
- dynamic_text:
71
- <<: *default
72
- migrations_paths: db/dynamic_text_migrate
73
- database: <%= "\<\%\= ENV.fetch(\"DT_DATABASE_NAME\") { \"DynamicText\" } + \"_test\" \%\>" %>
74
-
75
- # As with config/secrets.yml, you never want to store sensitive information,
76
- # like your database password, in your source code. If your source code is
77
- # ever seen by anyone, they now have access to your database.
78
- #
79
- # Instead, provide the password as a unix environment variable when you boot
80
- # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
81
- # for a full rundown on how to provide these environment variables in a
82
- # production deployment.
83
- #
84
- # On Heroku and other platform providers, you may have a full connection URL
85
- # available as an environment variable. For example:
86
- #
87
- # DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
88
- #
89
- # You can use this database configuration with:
90
- #
91
- # production:
92
- # url: <%= "\<\%\= ENV[\'DATABASE_URL\'] \%\>" %>
93
- #
94
-
95
- production_default: &production_default
96
- adapter: postgresql
97
- encoding: unicode
98
- pool: <%= "\<\%\= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } \%\>" %>
99
-
100
- production:
101
- primary:
102
- <<: *production_default
103
- url: <%= "\<\%\= ENV[\"DATABASE_URL\"] \%\>" %>
104
- dynamic_text:
105
- <<: *production_default
106
- migrations_paths: db/dynamic_text_migrate
107
- url: <%= "\<\%\= ENV[\"#{options[:database_env_key]}\"] \%\>" %>
@@ -1,2 +0,0 @@
1
- dt_redis_url = ENV.fetch('<%= options[:redis_env_key] %>', 'redis://localhost:6379')
2
- $dt_redis = Redis.new(url: dt_redis_url)