glib-web 3.14.2 → 3.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/app/channels/glib/channel/appearance_channel.rb +11 -10
  3. data/app/controllers/concerns/glib/auth/policy.rb +4 -0
  4. data/app/controllers/concerns/glib/auth/response.rb +44 -0
  5. data/app/controllers/concerns/glib/json/libs.rb +27 -38
  6. data/app/controllers/concerns/glib/json/new_dynamic_text.rb +0 -0
  7. data/app/helpers/glib/app_feature_support_helper.rb +0 -0
  8. data/app/helpers/glib/dynamic_texts_helper.rb +0 -0
  9. data/app/helpers/glib/enum_helper.rb +1 -7
  10. data/app/helpers/glib/json_ui/action_builder/sheets.rb +0 -0
  11. data/app/helpers/glib/json_ui/action_builder.rb +3 -0
  12. data/app/helpers/glib/json_ui/analytics_helper.rb +0 -0
  13. data/app/helpers/glib/json_ui/generic_builders.rb +0 -0
  14. data/app/helpers/glib/json_ui/page_helper.rb +12 -0
  15. data/app/helpers/glib/json_ui/table_builders.rb +0 -0
  16. data/app/helpers/glib/json_ui/view_builder/fields.rb +51 -5
  17. data/app/helpers/glib/json_ui/view_builder/panels.rb +1 -1
  18. data/app/models/concerns/glib/enum_humanization.rb +14 -5
  19. data/app/models/glib/active_storage/attachment.rb +0 -0
  20. data/app/models/glib/active_storage/blob.rb +0 -0
  21. data/app/models/glib/dynamic_text_record.rb +0 -0
  22. data/app/models/glib/text.rb +0 -0
  23. data/app/validators/email_typo_validator.rb +0 -0
  24. data/app/validators/email_validator.rb +0 -0
  25. data/app/validators/url_validator.rb +0 -0
  26. data/app/views/json_ui/garage/actions/_sheets.json.jbuilder +0 -0
  27. data/app/views/json_ui/garage/actions/_timeouts.json.jbuilder +5 -1
  28. data/app/views/json_ui/garage/actions/dialogs_oauth_post.json.jbuilder +0 -0
  29. data/app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder +0 -0
  30. data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +2 -3
  31. data/app/views/json_ui/garage/forms/generic_post.json.jbuilder +0 -0
  32. data/app/views/json_ui/garage/forms/otp_field.json.jbuilder +0 -4
  33. data/app/views/json_ui/garage/forms/submission_flow.json.jbuilder +0 -0
  34. data/app/views/json_ui/garage/forms/submission_flow_post.json.jbuilder +0 -0
  35. data/app/views/json_ui/garage/forms/submission_indicator.json.jbuilder +0 -0
  36. data/app/views/json_ui/garage/forms/submission_indicator_post.json.jbuilder +0 -0
  37. data/app/views/json_ui/garage/home/blank.json.jbuilder +0 -0
  38. data/app/views/json_ui/garage/home/slow.json.jbuilder +0 -0
  39. data/app/views/json_ui/garage/lists/autoload_all.json.jbuilder +0 -0
  40. data/app/views/json_ui/garage/lists/autoload_as_needed.json.jbuilder +0 -0
  41. data/app/views/json_ui/garage/lists/chat_ui.json.jbuilder +0 -0
  42. data/app/views/json_ui/garage/lists/fab.json.jbuilder +0 -0
  43. data/app/views/json_ui/garage/notifications/action_cable.json.jbuilder +14 -8
  44. data/app/views/json_ui/garage/notifications/web_socket.json.jbuilder +0 -0
  45. data/app/views/json_ui/garage/pages/custom_style_class.json.jbuilder +0 -0
  46. data/app/views/json_ui/garage/pages/full_width.json.jbuilder +0 -0
  47. data/app/views/json_ui/garage/pages/full_width_height.json.jbuilder +0 -0
  48. data/app/views/json_ui/garage/pages/index.json.jbuilder +0 -0
  49. data/app/views/json_ui/garage/pages/layout.json.jbuilder +0 -0
  50. data/app/views/json_ui/garage/pages/lifecycle_hooks.json.jbuilder +0 -0
  51. data/app/views/json_ui/garage/pages/loading_indicator.json.jbuilder +0 -0
  52. data/app/views/json_ui/garage/pages/nested_scroll.json.jbuilder +0 -0
  53. data/app/views/json_ui/garage/pages/redirect_onload.json.jbuilder +0 -0
  54. data/app/views/json_ui/garage/panels/_styled.json.jbuilder +0 -0
  55. data/app/views/json_ui/garage/panels/card.json.jbuilder +0 -0
  56. data/app/views/json_ui/garage/panels/custom.json.jbuilder +0 -0
  57. data/app/views/json_ui/garage/panels/outlined.json.jbuilder +0 -0
  58. data/app/views/json_ui/garage/services/dynamic_text.json.jbuilder +0 -0
  59. data/app/views/json_ui/garage/services/image.json.jbuilder +0 -0
  60. data/app/views/json_ui/garage/services/index.json.jbuilder +0 -0
  61. data/app/views/json_ui/garage/tables/_autoload_section.json.jbuilder +0 -0
  62. data/app/views/json_ui/garage/tables/autoload_all.json.jbuilder +0 -0
  63. data/app/views/json_ui/garage/tables/autoload_as_needed.json.jbuilder +0 -0
  64. data/app/views/json_ui/garage/tables/export_import.json.jbuilder +0 -0
  65. data/app/views/json_ui/garage/tables/index.json.jbuilder +0 -0
  66. data/app/views/json_ui/garage/views/calendar_data.json.jbuilder +0 -0
  67. data/app/views/json_ui/garage/views/charts.json.jbuilder +14 -0
  68. data/app/views/json_ui/garage/views/links.json.jbuilder +0 -0
  69. data/app/views/json_ui/garage/views/map_data.json.jbuilder +0 -0
  70. data/app/views/json_ui/garage/views/multimedia.json.jbuilder +0 -0
  71. data/app/views/layouts/json_ui/no_custom.html.erb +0 -0
  72. data/lib/generators/glib/install_generator.rb +0 -0
  73. data/lib/generators/templates/20191017062519_create_texts.rb +0 -0
  74. data/lib/generators/templates/20191024063257_add_scope_to_texts.rb +0 -0
  75. data/lib/generators/templates/20191112095018_add_lang_to_texts.rb +0 -0
  76. data/lib/generators/templates/20191126071051_create_active_storage_tables.active_storage.rb +0 -0
  77. data/lib/generators/templates/database.yml +0 -0
  78. data/lib/generators/templates/dynamic_text.rb +0 -0
  79. data/lib/glib/crypt/utils.rb +0 -0
  80. data/lib/glib/crypt.rb +0 -0
  81. data/lib/glib/dynamic_text/config.rb +0 -0
  82. data/lib/glib/dynamic_text.rb +0 -0
  83. data/lib/glib/engine.rb +0 -0
  84. data/lib/glib/json_crawler/action_crawler.rb +0 -0
  85. data/lib/glib/json_crawler/action_crawlers/action_http.rb +0 -0
  86. data/lib/glib/json_crawler/action_crawlers/dialogs_alert.rb +0 -0
  87. data/lib/glib/json_crawler/action_crawlers/menu.rb +0 -0
  88. data/lib/glib/json_crawler/action_crawlers/run_multiple.rb +0 -0
  89. data/lib/glib/json_crawler/action_crawlers/windows_open.rb +0 -0
  90. data/lib/glib/json_crawler/coverage.rb +0 -0
  91. data/lib/glib/json_crawler.rb +0 -0
  92. data/lib/glib/mailer_tester.rb +0 -0
  93. data/lib/glib/value.rb +0 -0
  94. data/lib/glib/version.rb +0 -0
  95. data/lib/glib-web.rb +0 -0
  96. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73a7b9c04e171d374cba337720592ea50ac8ef1a7d15d1af315490d7cfa1f044
4
- data.tar.gz: c583570b3b87c94fb65202efbb31fd67a324e1139466154739e2ae0ed0afc3d3
3
+ metadata.gz: 3b8f74c09536b2840e41346cfef87cfe84896e61b4985ee60d45f576ddaf772d
4
+ data.tar.gz: f6f245a390e234a5910803043074638d9e55d72a4fc2c29eb07b570bee810bcb
5
5
  SHA512:
6
- metadata.gz: d117002112d56a0a729cdebf8aca501154597d048df97dfe8de90a4fc11cebe35343fb9a904d9930fbe90bb52b882467f33d4b1207949c1935b1ba0164acae8c
7
- data.tar.gz: 31efc5d359c71fd256e0597ce3396bf5123fe9d70c7f0e3f26f092154fb9ac71b77e18e106d5bcce44bb4f783f7a9640d01ae35af6920b261ce3a0e9cecd36db
6
+ metadata.gz: 07e4d74b157ba6ca4ffd1021806ab589c54750ee308901edb249ecf5af6a2c97ea50c2a779c516ef905751a4bb255a2101e054dfda3de2431749bc4057f0a768
7
+ data.tar.gz: d09d737aff6ddd5938e01d9ef4960ce0106a77cac80d5ca418d4ae8edddac79b9cd69da3d138f751e66f7aea4afa8b2a32a1b4c5d0ece72622739deb0902937b
@@ -9,16 +9,17 @@ module Glib
9
9
  action = {
10
10
  action: 'labels/set',
11
11
  targetId: 'label-1',
12
- text: data['text']
13
- # onSet: {
14
- # action: 'timeouts/set',
15
- # interval: 1000,
16
- # onTimeout: {
17
- # action: 'labels/set',
18
- # targetId: 'label-1',
19
- # text: "Room ##{data['room'].upcase}"
20
- # }
21
- # }
12
+ text: data['text'],
13
+ onSet: {
14
+ action: 'timeouts/set',
15
+ interval: 3000,
16
+ timerId: 'label-1-set',
17
+ onTimeout: {
18
+ action: 'labels/set',
19
+ targetId: 'label-1',
20
+ text: "Room ##{data['room'].upcase}"
21
+ }
22
+ }
22
23
  }
23
24
 
24
25
  broadcast_to("appearance_#{data['room']}", action)
@@ -17,6 +17,10 @@ module Glib::Auth
17
17
  helper_method :policy, :can?, :cannot?
18
18
  end
19
19
 
20
+ def assert_current_user_present
21
+ raise UnauthorizedError unless current_user
22
+ end
23
+
20
24
  module Overrides
21
25
 
22
26
  public # Override
@@ -0,0 +1,44 @@
1
+ module Glib::Auth
2
+ # Keep this module small because it needs to be compatible with Devise::FailureApp, which
3
+ # is not a Rails controller.
4
+ module Response
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ end
9
+
10
+ def glib_json_dialog_mode?
11
+ params[:_dialog].present? # E.g. _dialog=v1
12
+ end
13
+
14
+ def __glib_error_dialog(title, message)
15
+ {
16
+ action: 'dialogs/show',
17
+ # Don't show another dialog, just use the current one since it's a new dialog anyway, which means
18
+ # that it wouldn't contain existing user data.
19
+ updateExisting: glib_json_dialog_mode?,
20
+ title: title,
21
+ body: {
22
+ childViews: [
23
+ {
24
+ "view": "label",
25
+ "text": message
26
+ },
27
+ ],
28
+ "padding": {
29
+ "x": 20,
30
+ "y": 22,
31
+ },
32
+ }
33
+ }
34
+ end
35
+
36
+ def json_ui_401_response
37
+ {
38
+ # Handle dialogs_open and windows_open
39
+ glib_json_dialog_mode? ? :onLoad : :onResponse => __glib_error_dialog(
40
+ 'Your session has ended', 'Please refresh the page and re-login.')
41
+ }
42
+ end
43
+ end
44
+ end
@@ -8,6 +8,8 @@ module Glib::Json::Libs
8
8
  helper_method :json_ui_app_is_android?, :json_ui_app_is_ios?, :json_ui_app_is_web?
9
9
  helper_method :json_ui_redirect_back_or_to
10
10
 
11
+ include Glib::Auth::Response
12
+ helper_method :glib_json_dialog_mode?
11
13
  end
12
14
 
13
15
  def json_ui_app_bundle_id
@@ -77,29 +79,6 @@ module Glib::Json::Libs
77
79
  end
78
80
  end
79
81
 
80
- # The behaviour provided by this convenience method assumes that user is logged in.
81
- # When accessing a forbidden page, redirects to `user_default_url` because we don't
82
- # want the user to get confused in the scenario where after logging in,
83
- # glib_redirect_back_or_to tries to open a page that the user doesn't have access of.
84
- def glib_handle_403(user_default_url)
85
- respond_to do |format|
86
- format.html do
87
- redirect_to user_default_url
88
- end
89
- format.json do
90
- render json: if glib_json_dialog_mode?
91
- { onLoad: __glib_error_dialog('Access denied', "Make sure you're logged in with the correct account.") }
92
- else
93
- {
94
- onResponse: {
95
- action: 'windows/open', url: user_default_url
96
- }
97
- }
98
- end, status: Rails.env.test? ? :forbidden : :ok
99
- end
100
- end
101
- end
102
-
103
82
  def glib_handle_404
104
83
  raise ActionController::RoutingError.new('Not Found')
105
84
 
@@ -122,11 +101,30 @@ module Glib::Json::Libs
122
101
  redirect_to sign_in_url
123
102
  end
124
103
  format.json do
125
- render json: {
126
- # Handle dialogs_open and windows_open
127
- glib_json_dialog_mode? ? :onLoad : :onResponse => __glib_error_dialog(
128
- 'Your session has ended', 'Please refresh the page and re-login.')
129
- }, status: Rails.env.test? ? :unauthorized : :ok
104
+ render json: json_ui_401_response, status: Rails.env.test? ? :unauthorized : :ok
105
+ end
106
+ end
107
+ end
108
+
109
+ # The behaviour provided by this convenience method assumes that user is logged in.
110
+ # When accessing a forbidden page, redirects to `user_default_url` because we don't
111
+ # want the user to get confused in the scenario where after logging in,
112
+ # glib_redirect_back_or_to tries to open a page that the user doesn't have access of.
113
+ def glib_handle_403(user_default_url)
114
+ respond_to do |format|
115
+ format.html do
116
+ redirect_to user_default_url
117
+ end
118
+ format.json do
119
+ render json: if glib_json_dialog_mode?
120
+ { onLoad: __glib_error_dialog('Access denied', "Make sure you're logged in with the correct account.") }
121
+ else
122
+ {
123
+ onResponse: {
124
+ action: 'windows/open', url: user_default_url
125
+ }
126
+ }
127
+ end, status: Rails.env.test? ? :forbidden : :ok
130
128
  end
131
129
  end
132
130
  end
@@ -135,11 +133,6 @@ module Glib::Json::Libs
135
133
  session.delete(REDIRECT_BACK_KEY) || url
136
134
  end
137
135
 
138
- # def glib_redirect_back_or_to(default_url)
139
- # redirect_url = __delete_redirect_back_url(default_url)
140
- # glib_redirect_to redirect_url
141
- # end
142
-
143
136
  def html_ui_redirect_back_or_to(default_url)
144
137
  redirect_url = __delete_redirect_back_url(default_url)
145
138
  redirect_to redirect_url
@@ -152,10 +145,6 @@ module Glib::Json::Libs
152
145
  end
153
146
  end
154
147
 
155
- def glib_json_dialog_mode?
156
- params[:_dialog].present? # E.g. _dialog=v1
157
- end
158
-
159
148
  def __glib_error_dialog(title, message)
160
149
  {
161
150
  action: 'dialogs/show',
@@ -239,7 +228,7 @@ module Glib::Json::Libs
239
228
 
240
229
  def json_libs_rescue_csrf
241
230
  rescue_from ActionController::InvalidAuthenticityToken do |exception|
242
- sign_out(:user)
231
+ # sign_out(:user)
243
232
 
244
233
  # respond_to do |format|
245
234
  # format.json do
File without changes
File without changes
@@ -4,13 +4,7 @@ module Glib
4
4
  enum_name = enum_field.to_s
5
5
  keys ||= clazz.defined_enums[enum_name].keys
6
6
  keys.map do |i|
7
- text = clazz.glib_enum_humanize(enum_field, i)
8
- if include_hints
9
- i18n_key = clazz.model_name.i18n_key
10
- if (hint = I18n.t("dt_models.#{i18n_key}.#{enum_name.pluralize}.#{i}.hint")).present?
11
- text += " #{hint}"
12
- end
13
- end
7
+ text = clazz.glib_enum_humanize(enum_field, i, include_hints: include_hints)
14
8
  { text: text, value: i }
15
9
  end
16
10
  end
File without changes
@@ -110,6 +110,7 @@ module Glib
110
110
 
111
111
  module Timeouts
112
112
  class Set < Action
113
+ string :timerId
113
114
  int :interval # Milliseconds
114
115
  action :onTimeout
115
116
  bool :repeat
@@ -121,6 +122,8 @@ module Glib
121
122
 
122
123
  # FUTURE
123
124
  class Clear < Action
125
+ string :timerId, required: true
126
+ bool :repeat
124
127
  end
125
128
  end
126
129
 
File without changes
File without changes
@@ -106,6 +106,18 @@ module Glib
106
106
  end
107
107
  end
108
108
 
109
+ if (on_open = options[:onOpen])
110
+ json.onOpen do
111
+ on_open.call(@action_builder)
112
+ end
113
+ end
114
+
115
+ if (on_close = options[:onClose])
116
+ json.onClose do
117
+ on_close.call(@action_builder)
118
+ end
119
+ end
120
+
109
121
  json.channels options[:channels]
110
122
  end
111
123
  end
File without changes
@@ -258,19 +258,65 @@ class Glib::JsonUi::ViewBuilder
258
258
  string :fileUrl
259
259
  string :fileTitle
260
260
  string :uploadText
261
- string :uploadIcon
261
+ string :uploadIcon # deprecated
262
262
  hash :placeholderView
263
263
  hash :infoSpec
264
+
265
+ def buttonLabels(obj)
266
+ @buttonLabels = ActiveSupport::HashWithIndifferentAccess.new(obj)
267
+ end
268
+
269
+ def created
270
+ @buttonLabels ||= ActiveSupport::HashWithIndifferentAccess.new
271
+ @buttonLabels['change'] ||= I18n.t('common.change') if I18n.exists?('common.change')
272
+ @buttonLabels['upload'] ||= I18n.t('common.upload') if I18n.exists?('common.upload')
273
+ @buttonLabels['delete'] ||= I18n.t('common.delete') if I18n.exists?('common.delete')
274
+
275
+ json.set! :buttonLabels, @buttonLabels
276
+
277
+ super
278
+ end
264
279
  end
265
280
 
266
- class MultipleUpload < AbstractField
281
+ class MultiUpload < AbstractField
267
282
  hash :accepts
268
283
  array :files
269
284
  string :directUploadUrl
270
- string :title
271
- string :subtitle
272
285
  string :uploadTitle
273
286
  string :uploadFailedText
287
+
288
+ required :accepts, :directUploadUrl
289
+
290
+ # deprecated
291
+ def title(value)
292
+ @placeholder = value
293
+ end
294
+
295
+ # deprecated
296
+ def subtitle(value)
297
+ @hint = value
298
+ end
299
+
300
+ def files(values)
301
+ @files = values
302
+ end
303
+
304
+ def created
305
+ super
306
+
307
+ @placeholder ||= I18n.t('common.multi_upload.placeholder', default: nil)
308
+ @hint ||= I18n.t('common.multi_upload.hint', default: nil)
309
+
310
+ json.placeholder @placeholder if @placeholder
311
+ json.hint @hint if @hint
312
+
313
+ if @prop && (form = page.current_form)
314
+ model = form.instance_variable_get(:@model)
315
+ @files ||= model.send(@prop).to_a.map { |file| { name: file.blob&.filename, signed_id: file.signed_id } }
316
+
317
+ json.files @files if @files.present?
318
+ end
319
+ end
274
320
  end
275
321
 
276
322
  # TODO
@@ -335,7 +381,7 @@ class Glib::JsonUi::ViewBuilder
335
381
  class Otp < AbstractField
336
382
  int :length
337
383
  string :type
338
- string :align
384
+ string :align # deprecated
339
385
  end
340
386
 
341
387
  class Rating < AbstractField
@@ -24,7 +24,7 @@ class Glib::JsonUi::ViewBuilder
24
24
  # false
25
25
 
26
26
  # Not all model is ActiveRecord
27
- model.class.try(:reflect_on_association, prop)&.macro == :has_many
27
+ model.class.try(:reflect_on_association, prop)&.macro == :has_many || model.class.try(:reflect_on_attachment, prop)&.macro == :has_many_attached
28
28
  end
29
29
 
30
30
  def self.is_single_association?(model, prop)
@@ -11,21 +11,30 @@ module Glib
11
11
  extend ClassMethods
12
12
  end
13
13
 
14
- def glib_enum_humanize(enum_name, default_enum_value = nil)
15
- self.class.glib_enum_humanize(enum_name, send(enum_name) || default_enum_value)
14
+ def glib_enum_humanize(enum_name, default_enum_value = nil, include_hints: false)
15
+ self.class.glib_enum_humanize(enum_name, send(enum_name) || default_enum_value, include_hints: include_hints)
16
16
  end
17
17
  end
18
18
 
19
19
  module ClassMethods
20
- def glib_enum_humanize(enum_name, enum_value, default_translation = nil)
20
+ def glib_enum_humanize(enum_name, enum_value, default_translation = nil, include_hints: false)
21
21
  if enum_value
22
22
  translation_key = "activerecord.attributes.#{model_name.i18n_key}.#{enum_name.to_s.pluralize}.#{enum_value}"
23
23
 
24
24
  if default_translation.nil? && Rails.env.development?
25
- I18n.t(translation_key, raise: I18n::MissingTranslationData)
25
+ text = I18n.t(translation_key, raise: I18n::MissingTranslationData)
26
26
  else
27
- I18n.t(translation_key, default: default_translation)
27
+ text = I18n.t(translation_key, default: default_translation)
28
28
  end
29
+
30
+ if include_hints
31
+ i18n_key = self.model_name.i18n_key
32
+ if (hint = I18n.t("dt_models.#{i18n_key}.#{enum_name.to_s.pluralize}.#{enum_value}.hint")).present?
33
+ text += " #{hint}"
34
+ end
35
+ end
36
+
37
+ text
29
38
  end
30
39
  end
31
40
  end
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -11,10 +11,14 @@ section.rows builder: ->(template) do
11
11
  end
12
12
 
13
13
  template.thumbnail title: 'timeouts/set with repeat', onClick: ->(action) do
14
- action.timeouts_set interval: 1000, repeat: true, onTimeout: ->(subaction) do
14
+ action.timeouts_set timerId: 'timeout-1', interval: 1000, repeat: true, onTimeout: ->(subaction) do
15
15
  subaction.snackbars_alert message: 'Timeout elapsed every 1 second'
16
16
  end
17
17
  end
18
+
19
+ template.thumbnail title: 'timeouts/clear stop repeat', onClick: ->(action) do
20
+ action.timeouts_clear timerId: 'timeout-1', repeat: true
21
+ end
18
22
  end
19
23
 
20
24
  # section.rows builder: ->(template) do
@@ -37,11 +37,10 @@ page.form options.merge(childViews: ->(form) do
37
37
  # placeholderView: { type: 'avatar', width: 100, height: 100, url: 'data:image/jpeg;base64,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' }
38
38
 
39
39
  form.spacer height: 16
40
- form.fields_multipleUpload \
40
+ form.fields_multiUpload \
41
41
  name: 'user[multi][]',
42
+ accepts: { fileType: 'image', maxFileSize: 5000 },
42
43
  directUploadUrl: rails_direct_uploads_url,
43
- title: 'Select file or drag and drop here',
44
- subtitle: 'JPG, PNG or PDF, file size no more than 10MB',
45
44
  uploadTitle: 'File added:',
46
45
  uploadFailedText: '(UPLOAD FAILED)',
47
46
  files: [
@@ -45,10 +45,6 @@ page.form \
45
45
  ]
46
46
  }
47
47
 
48
- form.spacer height: 20
49
- form.h2 text: 'OTP with Alignment right'
50
- form.fields_otp name: 'user[otp_summary6]', width: 'matchParent', type: 'text', value: '1234', align: 'right', length: 5
51
-
52
48
  form.spacer height: 20
53
49
  form.fields_submit text: 'Submit'
54
50
  end
File without changes
File without changes
File without changes
File without changes
@@ -18,8 +18,14 @@ if room.present?
18
18
  options: { targetId: 'list-1', room: room }
19
19
  }
20
20
  ],
21
- onError: ->(action) do
21
+ onOpen: ->(action) do
22
+ action.labels_set targetId: 'label-1', text: "Room ##{room.upcase}"
23
+ end,
24
+ onClose: ->(action) do
22
25
  action.labels_set targetId: 'label-1', text: "Room ##{room.upcase} (OFF)"
26
+ end,
27
+ onError: ->(action) do
28
+ action.labels_set targetId: 'label-1', text: "Room ##{room.upcase} (ERROR)"
23
29
  end
24
30
  end
25
31
 
@@ -30,7 +36,7 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
30
36
  form.fields_hidden name: 'chat[room]', value: room
31
37
  form.fields_hidden name: 'chat[user]', value: user
32
38
 
33
- form.p id: 'label-1', text: "Room ##{room.upcase}"
39
+ form.p id: 'label-1', text: 'Loading...'
34
40
 
35
41
  form.panels_list width: 'matchParent', height: 'matchParent', id: 'list-1', sections: [
36
42
  ->(section) do
@@ -47,13 +53,13 @@ page.scroll padding: glib_json_padding_body, childViews: ->(scroll) do
47
53
  event: 'status',
48
54
  channel: 'Glib::Channel::AppearanceChannel',
49
55
  payload: { text: "#{user} is typing", room: room }
50
- end,
51
- onTypeEnd: ->(action) do
52
- action.cables_push \
53
- event: 'status',
54
- channel: 'Glib::Channel::AppearanceChannel',
55
- payload: { text: "Room ##{room.upcase}", room: room }
56
56
  end
57
+ # onTypeEnd: ->(action) do
58
+ # action.cables_push \
59
+ # event: 'status',
60
+ # channel: 'Glib::Channel::AppearanceChannel',
61
+ # payload: { text: "Room ##{room.upcase}", room: room }
62
+ # end
57
63
  end
58
64
  end
59
65
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -124,6 +124,20 @@ else
124
124
  end
125
125
  ], legend: 'bottom'
126
126
 
127
+ scroll.h2 text: 'Donut chart'
128
+ scroll.charts_pie \
129
+ styleClasses: ['donut'],
130
+ dataSeries: [
131
+ -> do
132
+ json.title 'Straberry'
133
+ json.value 25
134
+ end,
135
+ -> do
136
+ json.title 'Banana'
137
+ json.value 25
138
+ end
139
+ ], legend: 'bottom'
140
+
127
141
  scroll.h2 text: 'Area chart'
128
142
  scroll.charts_area dataSeries: [
129
143
  -> do
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/lib/glib/crypt.rb CHANGED
File without changes
File without changes
File without changes
data/lib/glib/engine.rb CHANGED
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
data/lib/glib/value.rb CHANGED
File without changes
data/lib/glib/version.rb CHANGED
File without changes
data/lib/glib-web.rb CHANGED
File without changes
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: 3.14.2
4
+ version: 3.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
@@ -78,6 +78,7 @@ files:
78
78
  - app/channels/glib/channel/online_channel.rb
79
79
  - app/controllers/concerns/glib/analytics/funnel.rb
80
80
  - app/controllers/concerns/glib/auth/policy.rb
81
+ - app/controllers/concerns/glib/auth/response.rb
81
82
  - app/controllers/concerns/glib/json/dynamic_text.rb
82
83
  - app/controllers/concerns/glib/json/libs.rb
83
84
  - app/controllers/concerns/glib/json/new_dynamic_text.rb
@@ -326,7 +327,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
326
327
  - !ruby/object:Gem::Version
327
328
  version: '0'
328
329
  requirements: []
329
- rubygems_version: 3.4.6
330
+ rubyforge_project:
331
+ rubygems_version: 2.7.6
330
332
  signing_key:
331
333
  specification_version: 4
332
334
  summary: ''