glib-web 7.4.0 → 8.1.0
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 +4 -4
- data/app/controllers/glib/glib_direct_uploads_controller.rb +4 -1
- data/app/helpers/glib/json_ui/abstract_builder.rb +22 -0
- data/app/helpers/glib/json_ui/view_builder/charts.rb +27 -0
- data/app/helpers/glib/json_ui/view_builder/fields.rb +3 -47
- data/app/helpers/glib/json_ui/view_builder/panels.rb +1 -0
- data/app/views/json_ui/garage/forms/index.json.jbuilder +0 -3
- data/app/views/json_ui/garage/forms/submit_on_change.json.jbuilder +1 -1
- data/app/views/json_ui/garage/panels/carousel.json.jbuilder +7 -0
- data/app/views/json_ui/garage/test_page/charts.json.jbuilder +20 -0
- data/app/views/json_ui/garage/test_page/fields_upload.json.jbuilder +51 -0
- data/app/views/json_ui/garage/test_page/logics_set.json.jbuilder +35 -0
- data/app/views/json_ui/garage/test_page/panels_association.json.jbuilder +42 -0
- metadata +4 -9
- data/app/views/json_ui/garage/forms/file_upload.json.jbuilder +0 -52
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 22842c76cc4c92471f28991ff906491e61429a891a9da912aff82af48ac90125
|
|
4
|
+
data.tar.gz: dcb1bfce2a976cae302dc39662c3d696a9c951eb0934fdf6e7d0d2257d5ad48e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b094093515f7d56a0d4374779dac06b97ef70ee2bd164507668d03c22e5791913264ed68d3ea1ccf33aeeb7ae36cca6b939f78729c2ca94c228007d97024522f
|
|
7
|
+
data.tar.gz: 86a7cc0bc03aeefd9d96d3cbc06e382e0a9b1b6cb851a4b723dc701b825f474d5aac822151505932e320a166299bc246c722dbd9b5e34685b093bfc6826f1e54
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
module Glib
|
|
2
2
|
class GlibDirectUploadsController < ::ActionController::Base
|
|
3
|
+
include ::ActiveStorage::SetCurrent
|
|
4
|
+
|
|
3
5
|
before_action :authenticate_user!
|
|
4
6
|
|
|
5
7
|
rescue_from StandardError do |e|
|
|
@@ -38,10 +40,11 @@ module Glib
|
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
def direct_upload_json(blob)
|
|
43
|
+
# GlibS3Service returns [url, headers]; other services (e.g. Disk) return just the url
|
|
41
44
|
url, headers = blob.service_url_for_direct_upload
|
|
42
45
|
blob.as_json(root: false, methods: :signed_id).merge(direct_upload: {
|
|
43
46
|
url: url,
|
|
44
|
-
headers: headers.merge(blob.service_headers_for_direct_upload)
|
|
47
|
+
headers: headers.to_h.merge(blob.service_headers_for_direct_upload)
|
|
45
48
|
})
|
|
46
49
|
end
|
|
47
50
|
|
|
@@ -60,6 +60,23 @@ module Glib
|
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
private
|
|
63
|
+
# HashWithIndifferentAccess.new('x') doesn't fail: it yields an empty hash whose
|
|
64
|
+
# *default* is 'x', which serializes as {}, passes every key validation, and makes
|
|
65
|
+
# `h[k] ||= default` a no-op. Reject such values before wrapping them.
|
|
66
|
+
#
|
|
67
|
+
# Returns true when `value` was rejected and the caller should fall back to {}.
|
|
68
|
+
# Raises only in development/test: such pages rendered (as {}) before this check
|
|
69
|
+
# existed, so production reports instead of turning them into 500s.
|
|
70
|
+
def reject_non_hash(propName, value)
|
|
71
|
+
return false if value.respond_to?(:to_hash)
|
|
72
|
+
|
|
73
|
+
message = "Hash property: '#{propName}' must be a hash, got #{value.inspect}"
|
|
74
|
+
raise ArgumentError, message if Rails.env.development? || Rails.env.test?
|
|
75
|
+
|
|
76
|
+
GLog.warn("#{message}; emitting {} instead")
|
|
77
|
+
true
|
|
78
|
+
end
|
|
79
|
+
|
|
63
80
|
def self.component_name
|
|
64
81
|
@component_name ||= self.name.sub('Glib::JsonUi::ActionBuilder::', '')
|
|
65
82
|
end
|
|
@@ -298,6 +315,11 @@ module Glib
|
|
|
298
315
|
define_method(propName) do |value|
|
|
299
316
|
return if value.nil?
|
|
300
317
|
|
|
318
|
+
if reject_non_hash(propName, value)
|
|
319
|
+
json.set! propName, {}
|
|
320
|
+
return
|
|
321
|
+
end
|
|
322
|
+
|
|
301
323
|
value = ActiveSupport::HashWithIndifferentAccess.new(value)
|
|
302
324
|
|
|
303
325
|
required = options[:required] || []
|
|
@@ -34,10 +34,37 @@ class Glib::JsonUi::ViewBuilder
|
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
+
# chart.js turns a falsy legend `position` into a TOP legend, the opposite of what
|
|
38
|
+
# `position: false` senders mean (#499), so translate it to `display: false`.
|
|
39
|
+
module LegendShape
|
|
40
|
+
FALSE_POSITIONS = [false, 'false'].freeze
|
|
41
|
+
|
|
42
|
+
def legend(value)
|
|
43
|
+
super(normalized_legend(value))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
def normalized_legend(value)
|
|
48
|
+
return value if !value.respond_to?(:to_hash)
|
|
49
|
+
|
|
50
|
+
hash = ActiveSupport::HashWithIndifferentAccess.new(value)
|
|
51
|
+
return value if !FALSE_POSITIONS.include?(hash[:position])
|
|
52
|
+
|
|
53
|
+
replacement = hash.except(:position).merge(display: false).symbolize_keys
|
|
54
|
+
GLog.warn(
|
|
55
|
+
"Chart `legend: #{value.inspect}` is deprecated; send `legend: #{replacement.inspect}` instead. " \
|
|
56
|
+
'This will raise ArgumentError in glib-web 8.0.'
|
|
57
|
+
)
|
|
58
|
+
replacement
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
37
62
|
module Attributes
|
|
38
63
|
extend ActiveSupport::Concern
|
|
39
64
|
|
|
40
65
|
included do
|
|
66
|
+
prepend LegendShape
|
|
67
|
+
|
|
41
68
|
array :colors
|
|
42
69
|
string :prefix
|
|
43
70
|
string :suffix
|
|
@@ -787,52 +787,6 @@ class Glib::JsonUi::ViewBuilder
|
|
|
787
787
|
views :childViews
|
|
788
788
|
end
|
|
789
789
|
|
|
790
|
-
# Deprecated
|
|
791
|
-
class File < Text
|
|
792
|
-
# file_rules = { fileType: 'image/*', maxFileSize: 5000 }
|
|
793
|
-
# file_rules = { fileType: 'video/*', maxFileSize: 50000 }
|
|
794
|
-
# file_rules = { fileType: 'application/pdf', maxFileSize: 5000 }
|
|
795
|
-
|
|
796
|
-
include Glib::JsonUi::Upload
|
|
797
|
-
|
|
798
|
-
string :fileUrl
|
|
799
|
-
string :fileTitle
|
|
800
|
-
string :uploadText
|
|
801
|
-
hash :placeholderView # deprecated
|
|
802
|
-
hash :infoSpec # deprecated
|
|
803
|
-
|
|
804
|
-
def buttonLabels(obj)
|
|
805
|
-
@buttonLabels = ActiveSupport::HashWithIndifferentAccess.new(obj)
|
|
806
|
-
end
|
|
807
|
-
|
|
808
|
-
def created
|
|
809
|
-
@buttonLabels ||= ActiveSupport::HashWithIndifferentAccess.new
|
|
810
|
-
@buttonLabels['change'] ||= I18n.t('glib.change') if I18n.exists?('glib.change')
|
|
811
|
-
@buttonLabels['upload'] ||= I18n.t('glib.upload') if I18n.exists?('glib.upload')
|
|
812
|
-
@buttonLabels['delete'] ||= I18n.t('glib.delete') if I18n.exists?('glib.delete')
|
|
813
|
-
|
|
814
|
-
json.set! :buttonLabels, @buttonLabels
|
|
815
|
-
|
|
816
|
-
if @prop && context
|
|
817
|
-
# json.fileTitle context.field_value(@prop).blob&.filename
|
|
818
|
-
|
|
819
|
-
if (value = context.field_value(@prop)).attached?
|
|
820
|
-
json.fileTitle value.blob.filename
|
|
821
|
-
json.fileUrl existing_attachment_url(value.attachment)
|
|
822
|
-
end
|
|
823
|
-
end
|
|
824
|
-
|
|
825
|
-
super
|
|
826
|
-
end
|
|
827
|
-
|
|
828
|
-
@Override
|
|
829
|
-
def determine_value(context, prop)
|
|
830
|
-
if (value = context.field_value(prop)).attached?
|
|
831
|
-
value.signed_id || ''
|
|
832
|
-
end
|
|
833
|
-
end
|
|
834
|
-
end
|
|
835
|
-
|
|
836
790
|
# File upload field with direct-upload support and a progress list of
|
|
837
791
|
# already-attached files.
|
|
838
792
|
#
|
|
@@ -852,7 +806,9 @@ class Glib::JsonUi::ViewBuilder
|
|
|
852
806
|
# multi-file submit collapses to the last file server-side (silently
|
|
853
807
|
# saves one Document per drop instead of one per file).
|
|
854
808
|
bool :multiple, cache: true
|
|
855
|
-
|
|
809
|
+
# `url` is the current file's image; `emptyUrl` is shown whenever there is no file
|
|
810
|
+
# (none attached, or after the field is reset), otherwise a neutral box is shown.
|
|
811
|
+
hash :placeholderView, required: [:type, :width, :height], optional: [:url, :emptyUrl]
|
|
856
812
|
hash :inputView, optional: [:files, :variant]
|
|
857
813
|
hash :clipboardView, optional: [:icon]
|
|
858
814
|
|
|
@@ -70,9 +70,6 @@ page.list sections: [
|
|
|
70
70
|
action.windows_open url: json_ui_garage_url(path: 'forms/checkboxes')
|
|
71
71
|
end
|
|
72
72
|
template.thumbnail title: 'File Upload', onClick: ->(action) do
|
|
73
|
-
action.windows_open url: json_ui_garage_url(path: 'forms/file_upload')
|
|
74
|
-
end
|
|
75
|
-
template.thumbnail title: 'File Upload (NEW)', onClick: ->(action) do
|
|
76
73
|
action.windows_open url: json_ui_garage_url(path: 'forms/file_upload_new')
|
|
77
74
|
end
|
|
78
75
|
template.thumbnail title: 'Floating Submit', onClick: ->(action) do
|
|
@@ -108,7 +108,7 @@ page.scroll childViews: ->(scroll) do
|
|
|
108
108
|
|
|
109
109
|
form.spacer height: 20
|
|
110
110
|
rules = { fileType: 'image', maxFileSize: 5000, maxFileSizeErrorText: 'Too big!' }
|
|
111
|
-
form.
|
|
111
|
+
form.fields_upload \
|
|
112
112
|
name: 'user[photo][]',
|
|
113
113
|
width: 'matchParent',
|
|
114
114
|
label: 'Avatar',
|
|
@@ -34,5 +34,12 @@ json_ui_page json do |page|
|
|
|
34
34
|
panel.image height: height, url: image_url2
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
|
+
|
|
38
|
+
scroll.spacer height: 20
|
|
39
|
+
scroll.h1 text: 'Carousel with cycle'
|
|
40
|
+
scroll.panels_carousel width: 'matchParent', interval: 3000, childViews: ->(carousel) do
|
|
41
|
+
carousel.image url: image_url1, width: 'matchParent'
|
|
42
|
+
carousel.image url: image_url2, width: 'matchParent'
|
|
43
|
+
end
|
|
37
44
|
end
|
|
38
45
|
end
|
|
@@ -335,6 +335,26 @@ page.body childViews: ->(body) do
|
|
|
335
335
|
res.hr width: 'matchParent'
|
|
336
336
|
res.spacer height: 16
|
|
337
337
|
|
|
338
|
+
res.h2 text: 'Legends'
|
|
339
|
+
res.label text: 'Each legend wire shape the renderer must honour.'
|
|
340
|
+
[
|
|
341
|
+
['legend_default', 'Default (no legend option)', nil],
|
|
342
|
+
['legend_hidden', 'Hidden', { display: false }],
|
|
343
|
+
['legend_right', 'Right', { position: 'right' }],
|
|
344
|
+
['legend_bottom_start', 'Bottom, start-aligned', { position: 'bottom', align: 'start' }],
|
|
345
|
+
['legend_override', 'Override (HTML legend plugin)', { override: true }],
|
|
346
|
+
# Legacy shape (#499): the builder translates it to `display: false` and logs a GLog warning.
|
|
347
|
+
['legend_position_false', 'Legacy position: false (hidden)', { position: false }]
|
|
348
|
+
].each do |id, label, legend|
|
|
349
|
+
res.spacer height: 8
|
|
350
|
+
res.label text: label
|
|
351
|
+
res.charts_line id: id, dataSeries: line_series_revenue, colors: ['#79AC78', '#3085C3'], legend: legend
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
res.spacer height: 16
|
|
355
|
+
res.hr width: 'matchParent'
|
|
356
|
+
res.spacer height: 16
|
|
357
|
+
|
|
338
358
|
res.h2 text: 'Edge cases'
|
|
339
359
|
res.label text: 'Confirm empty and zero-value inputs render without errors.'
|
|
340
360
|
res.spacer height: 8
|
|
@@ -102,6 +102,39 @@ page.body(
|
|
|
102
102
|
form.hr width: 'matchParent'
|
|
103
103
|
form.spacer height: 12
|
|
104
104
|
|
|
105
|
+
form.h2 text: 'PlaceholderView emptyUrl'
|
|
106
|
+
form.spacer height: 8
|
|
107
|
+
form.label text: 'Without emptyUrl, a reset field shows a neutral box (see Basic usage). With it, the empty-state image.'
|
|
108
|
+
form.spacer height: 8
|
|
109
|
+
form.panels_flow(
|
|
110
|
+
styleClass: 'align-center',
|
|
111
|
+
xs: { gap: { all: 4 } },
|
|
112
|
+
childViews: ->(flow) do
|
|
113
|
+
flow.fields_upload(
|
|
114
|
+
base_props.merge(
|
|
115
|
+
name: 'user[file_empty_url]',
|
|
116
|
+
id: 'fields_upload_empty_url',
|
|
117
|
+
width: 144,
|
|
118
|
+
placeholderView: {
|
|
119
|
+
type: 'image',
|
|
120
|
+
url: image&.url,
|
|
121
|
+
emptyUrl: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="144" height="144"%3E%3Crect width="144" height="144" fill="%23ccc"/%3E%3C/svg%3E',
|
|
122
|
+
width: 144,
|
|
123
|
+
height: 144
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
flow.button(
|
|
128
|
+
text: 'Reset',
|
|
129
|
+
onClick: ->(action) { action.components_invoke targetId: 'fields_upload_empty_url', name: 'reset' }
|
|
130
|
+
)
|
|
131
|
+
end
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
form.spacer height: 12
|
|
135
|
+
form.hr width: 'matchParent'
|
|
136
|
+
form.spacer height: 12
|
|
137
|
+
|
|
105
138
|
form.h2 text: 'InputView variants'
|
|
106
139
|
form.spacer height: 8
|
|
107
140
|
form.label text: 'Outlined text-field input'
|
|
@@ -164,6 +197,24 @@ page.body(
|
|
|
164
197
|
)
|
|
165
198
|
)
|
|
166
199
|
|
|
200
|
+
form.spacer height: 12
|
|
201
|
+
form.label text: 'onFinishUpload fires once per pick'
|
|
202
|
+
form.spacer height: 4
|
|
203
|
+
# Own props, not base_props: the shared snackbar hook would also fire, and the
|
|
204
|
+
# spec counts this field's posts to check onFinishUpload runs once, not per file.
|
|
205
|
+
form.fields_upload(
|
|
206
|
+
name: 'user[file_finish_once][]',
|
|
207
|
+
id: 'fields_upload_finish_once',
|
|
208
|
+
label: 'Choose files',
|
|
209
|
+
width: 320,
|
|
210
|
+
directUploadUrl: glib_direct_uploads_url,
|
|
211
|
+
inputView: {},
|
|
212
|
+
multiple: true,
|
|
213
|
+
onFinishUpload: ->(action) do
|
|
214
|
+
action.http_post url: json_ui_garage_url(path: 'forms/generic_post')
|
|
215
|
+
end
|
|
216
|
+
)
|
|
217
|
+
|
|
167
218
|
form.spacer height: 12
|
|
168
219
|
form.hr width: 'matchParent'
|
|
169
220
|
form.spacer height: 12
|
|
@@ -153,6 +153,41 @@ page.form(
|
|
|
153
153
|
res.fields_check name: 'user[tags][]', checkValue: 'b', label: 'Tag B', onChange: set_eq_check
|
|
154
154
|
res.spacer height: 8
|
|
155
155
|
res.label id: 'set_eq_status', text: 'PENDING'
|
|
156
|
+
|
|
157
|
+
res.spacer height: 16
|
|
158
|
+
res.h2 text: 'Logics Set - time of day'
|
|
159
|
+
res.spacer height: 8
|
|
160
|
+
# `minutesOfDay` parses a typed time of day exactly as a consuming
|
|
161
|
+
# app's server does and `formatHm` renders the length in explicit
|
|
162
|
+
# units ("4h", "1h 5m"), so a Start/End pair
|
|
163
|
+
# shows its duration live. The `+ 1440` before the `% 1440` keeps
|
|
164
|
+
# json-logic's JS remainder positive when the End is before the
|
|
165
|
+
# Start, which is also when "(next day)" is said. A missing time
|
|
166
|
+
# says a non-breaking space, not an empty string, so the label keeps
|
|
167
|
+
# its height and the page never jumps mid-typing.
|
|
168
|
+
duration_update = ->(action) do
|
|
169
|
+
start_minutes = { 'minutesOfDay' => { 'var' => 'user[start_time]' } }
|
|
170
|
+
end_minutes = { 'minutesOfDay' => { 'var' => 'user[end_time]' } }
|
|
171
|
+
action.logics_set(
|
|
172
|
+
targetId: 'duration_label',
|
|
173
|
+
conditionalData: {
|
|
174
|
+
text: {
|
|
175
|
+
'if' => [
|
|
176
|
+
{ 'or' => [{ '==' => [start_minutes, nil] }, { '==' => [end_minutes, nil] }] }, "\u00a0",
|
|
177
|
+
{
|
|
178
|
+
'cat' => ['Duration ',
|
|
179
|
+
{ 'formatHm' => { '%' => [{ '+' => [{ '-' => [end_minutes, start_minutes] }, 1440] }, 1440] } },
|
|
180
|
+
{ 'if' => [{ '<' => [end_minutes, start_minutes] }, ' (next day)', ''] }]
|
|
181
|
+
}
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
end
|
|
187
|
+
res.fields_text label: 'Start', name: 'user[start_time]', width: 300, onChange: duration_update
|
|
188
|
+
res.fields_text label: 'End', name: 'user[end_time]', width: 300, onChange: duration_update
|
|
189
|
+
res.spacer height: 8
|
|
190
|
+
res.label id: 'duration_label', text: 'PENDING'
|
|
156
191
|
end
|
|
157
192
|
)
|
|
158
193
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
json.title 'Test Page (panels_association)'
|
|
2
|
+
|
|
3
|
+
page = json_ui_page json
|
|
4
|
+
render 'json_ui/garage/test_page/header', json: json, page: page
|
|
5
|
+
|
|
6
|
+
# The panels_association fixture (spec 353, D5): doculocker's submission-form
|
|
7
|
+
# shape on dummy-app models, unpersisted so the page is deterministic against
|
|
8
|
+
# the dummy host's empty database. One un-indexed association (the signature
|
|
9
|
+
# form's singular nested model), two indexed associations each holding an
|
|
10
|
+
# indexed nested association (the qualification form's two-deep shape), a
|
|
11
|
+
# panels_responsive inside one (the signature form nests one), hidden id and
|
|
12
|
+
# visible text props, and a submit.
|
|
13
|
+
page.form \
|
|
14
|
+
url: json_ui_garage_url(path: 'forms/generic_post'),
|
|
15
|
+
model: Post.new(title: 'Fixture post'),
|
|
16
|
+
method: 'post',
|
|
17
|
+
padding: glib_json_padding_body,
|
|
18
|
+
childViews: ->(form) do
|
|
19
|
+
form.fields_text prop: :title, label: 'Post title'
|
|
20
|
+
|
|
21
|
+
form.h3 text: 'Unindexed association'
|
|
22
|
+
form.panels_association model: Comment.new(content: 'Lead comment'), width: 'matchParent', childViews: ->(assoc) do
|
|
23
|
+
assoc.fields_hidden prop: :id
|
|
24
|
+
assoc.panels_responsive width: 'matchParent', childViews: ->(responsive) do
|
|
25
|
+
responsive.fields_text prop: :content, label: 'Lead comment'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
form.h3 text: 'Indexed associations'
|
|
30
|
+
[['First comment', 'first.pdf'], ['Second comment', 'second.pdf']].each_with_index do |(content, filename), index|
|
|
31
|
+
form.panels_association model: Comment.new(content: content), width: 'matchParent', order_index: index,
|
|
32
|
+
childViews: ->(comment) do
|
|
33
|
+
comment.fields_text prop: :content, label: "Comment #{index}"
|
|
34
|
+
comment.panels_association model: CommentFile.new(filename: filename), width: 'matchParent', order_index: 0,
|
|
35
|
+
childViews: ->(file) do
|
|
36
|
+
file.fields_text prop: :filename, label: "Comment #{index} file"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
form.fields_submit text: 'Submit'
|
|
42
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: glib-web
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 8.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- ''
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: activestorage
|
|
@@ -192,7 +191,6 @@ dependencies:
|
|
|
192
191
|
- - ">="
|
|
193
192
|
- !ruby/object:Gem::Version
|
|
194
193
|
version: '0'
|
|
195
|
-
description:
|
|
196
194
|
email: ''
|
|
197
195
|
executables: []
|
|
198
196
|
extensions: []
|
|
@@ -339,7 +337,6 @@ files:
|
|
|
339
337
|
- app/views/json_ui/garage/forms/dynamic_group.json.jbuilder
|
|
340
338
|
- app/views/json_ui/garage/forms/dynamic_select.json.jbuilder
|
|
341
339
|
- app/views/json_ui/garage/forms/dynamic_select_data.json.jbuilder
|
|
342
|
-
- app/views/json_ui/garage/forms/file_upload.json.jbuilder
|
|
343
340
|
- app/views/json_ui/garage/forms/file_upload_new.json.jbuilder
|
|
344
341
|
- app/views/json_ui/garage/forms/floating_submit.json.jbuilder
|
|
345
342
|
- app/views/json_ui/garage/forms/full_page_form.json.jbuilder
|
|
@@ -502,6 +499,7 @@ files:
|
|
|
502
499
|
- app/views/json_ui/garage/test_page/multimedia_video.json.jbuilder
|
|
503
500
|
- app/views/json_ui/garage/test_page/pagination.json.jbuilder
|
|
504
501
|
- app/views/json_ui/garage/test_page/panels.json.jbuilder
|
|
502
|
+
- app/views/json_ui/garage/test_page/panels_association.json.jbuilder
|
|
505
503
|
- app/views/json_ui/garage/test_page/panels_bulkEdit3.json.jbuilder
|
|
506
504
|
- app/views/json_ui/garage/test_page/popovers.json.jbuilder
|
|
507
505
|
- app/views/json_ui/garage/test_page/progressCircle.json.jbuilder
|
|
@@ -609,10 +607,8 @@ files:
|
|
|
609
607
|
- lib/glib/time_returning_mailer.rb
|
|
610
608
|
- lib/glib/value.rb
|
|
611
609
|
- lib/tasks/db.rake
|
|
612
|
-
homepage:
|
|
613
610
|
licenses: []
|
|
614
611
|
metadata: {}
|
|
615
|
-
post_install_message:
|
|
616
612
|
rdoc_options: []
|
|
617
613
|
require_paths:
|
|
618
614
|
- lib
|
|
@@ -627,8 +623,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
627
623
|
- !ruby/object:Gem::Version
|
|
628
624
|
version: '0'
|
|
629
625
|
requirements: []
|
|
630
|
-
rubygems_version:
|
|
631
|
-
signing_key:
|
|
626
|
+
rubygems_version: 4.0.6
|
|
632
627
|
specification_version: 4
|
|
633
628
|
summary: ''
|
|
634
629
|
test_files: []
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
json.title 'Forms'
|
|
2
|
-
|
|
3
|
-
options = {
|
|
4
|
-
url: json_ui_garage_url(path: 'forms/generic_post'),
|
|
5
|
-
method: 'post',
|
|
6
|
-
padding: { top: 12, left: 20, right: 20, bottom: 12 }
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
page = json_ui_page json
|
|
10
|
-
render "#{@path_prefix}/nav_menu", json: json, page: page
|
|
11
|
-
|
|
12
|
-
page.form options.merge(childViews: ->(form) do
|
|
13
|
-
rules = { fileType: 'image', maxFileSize: 5000 }
|
|
14
|
-
form.fields_file name: 'user[photo][]', width: 'matchParent', label: 'Landscape Photo', accepts: rules, directUploadUrl: glib_direct_uploads_url,
|
|
15
|
-
value: 'eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--193dc0d939b9558fc4973fafbba91d989cbb04d4',
|
|
16
|
-
fileUrl: 'https://imageserver-demo.herokuapp.com/image/itinerarybuilder-demo/o6CKzNt67PWnkPdUEnWMt7pr?h=100&w=100',
|
|
17
|
-
fileTitle: '1 month ago',
|
|
18
|
-
placeholderView: { type: 'image', width: 100, height: 75, url: 'https://www.atms.com.au/wp-content/uploads/2019/10/placeholder-1-1024x683.png?x93630' }
|
|
19
|
-
|
|
20
|
-
rules = { fileType: 'image', maxFileSize: 100, maxFileSizeErrorText: 'Too big!' }
|
|
21
|
-
form.fields_file name: 'user[photo][]', width: 'matchParent', label: 'Avatar', accepts: rules, directUploadUrl: glib_direct_uploads_url,
|
|
22
|
-
placeholderView: { type: 'avatar', width: 100, height: 100, url: 'data:image/jpeg;base64,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' }
|
|
23
|
-
|
|
24
|
-
form.fields_file name: 'user[photo1][]', width: 'matchParent', label: 'Avatar without directUploadUrl', accepts: rules,
|
|
25
|
-
placeholderView: { type: 'avatar', width: 100, height: 100, url: 'data:image/jpeg;base64,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' }
|
|
26
|
-
|
|
27
|
-
rules = { fileType: 'pdf', maxFileSize: 5000 }
|
|
28
|
-
form.fields_file name: 'user[pdf1][]', width: 'matchParent', label: 'PDF Document', accepts: rules, directUploadUrl: glib_direct_uploads_url,
|
|
29
|
-
placeholderView: { type: 'image', width: 100, height: 100, url: 'data:image/webp;base64,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' }
|
|
30
|
-
|
|
31
|
-
rules = { fileType: ['pdf', 'image'], maxFileSize: 5000 }
|
|
32
|
-
form.fields_file name: 'user[pdf2][]', width: 'matchParent', label: 'PDF/Image File', accepts: rules, directUploadUrl: glib_direct_uploads_url
|
|
33
|
-
|
|
34
|
-
rules = { fileType: 'zip', maxFileSize: 5000 }
|
|
35
|
-
form.fields_file name: 'user[zip][]', width: 'matchParent', label: 'ZIP Document', accepts: rules, directUploadUrl: glib_direct_uploads_url
|
|
36
|
-
|
|
37
|
-
# TODO
|
|
38
|
-
# rules = { fileType: 'image/*', maxFileSize: 1, maxFileSizeErrorText: 'Too big!' }
|
|
39
|
-
# form.fields_multiImage name: 'user[photos][]', width: 'matchParent', label: 'Avatar', accepts: rules, directUploadUrl: glib_direct_uploads_url,
|
|
40
|
-
# placeholderView: { type: 'avatar', width: 100, height: 100, url: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMREBUREhAWFhUWGBcVFRgXFxUVFxcWGRUWFxYVFRUYHSggGB0lHRgVITEhJSkrLi4uGB8zODMtNygtLisBCgoKBQUFDgUFDisZExkrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK//AABEIAOMA3gMBIgACEQEDEQH/xAAbAAEAAgMBAQAAAAAAAAAAAAAABgcBAwQFAv/EAEAQAAECAwMKAwYEBAYDAAAAAAEAAgMRIQQSMQUGIjJBUWFxgZEHE6FCUnKxwdEUI2LwM4KSskNzg6LC4WOz8f/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC6XuvCQRj7okcUe27UYoxt4TOKDDG3Knkjm3jeGCMdeoeaOcWmQwQZe6/Qc0a+6Lpx+6PbcqOSNbeF44oMMbcqeSOZeN4YIx1+h5oXEG6MEGXuv0HNGuui6cfuvMytl6zWTXi6XuN039hh1koflPxDe4nyILW/qfpO/pFB6oLDhMLTX0XLbLbChmcSNDZ8T2tPqVUNuy/aY38S0PI3A3W/0tkF5qC4bVnZYsPxLT8Ic71AWgZ72ICXmuP+m/7KpUQWzAzzsQP8Y9Ybx9F0szlsb3TFqhjDWJZ6uAVOogvcR2RR+XEa7bouB+S2B0hdOOHCqoVjiDMEg7xQ917FgzqtcHVjucNz9Mf7qjoUFwMFzHahbM3tmPZQfJ3iG10m2mCR+qGZjqw17EqXZNynCtDZwIrXt2gawn7zTUIOt7r1BzRj7ounFHtu1GOCMbeEzigwxtyp5I5t43hgjHXqHmjnXTdGCDL3X6DmjXXRdOP3R7blRyRrZi8cfsgwxtyp5I9t+o5Iw36Hmj3XaDmgMZcqeVEcy8Zj1Rji4yOHZHuLTIYIMvdfoOdUa+6LpxR7btW44b0Y0OEzigwxtyp5URzLxvDD7JDJdR3NRfOnPFlmnBgSfFwJxbD5+87hs27kHt5byzBs7A6M+7ta3F7vhb9cFXeXM9o8abIX5MPc06ZH6n7OQl1UdtdqfFeYkR5c44k4/wDQ4LSgFERAREQEREBERAREQF9wIzmOD2OLXDAtJBHUL4RBOMgZ/OYQ21NvjDzGgB4+Joo7pI81O7PHZHaIsJ7XsO0H0O48FRi78j5Yi2V9+E+XvNNWuG5w+uKC63uv0HOqNfdF04/deLm5nFCtbNDQigacMmstpZ7wXtNaCJnFBhjblTyojmXjeGH2RhvUdz3I5xBujBBl7r9BzqjHXKHnRHi7Vv3Rjb1XY9kBz79BzqjX3KH0R7Q2rce6MaHCbseyDDG3KnlRCy8bw9UYS6jsOyiGfecvkNNlgO/McNNw9hp9kH3j6BBoz2zxul1mszq4RIg2b2sO/edirxEQEREBERAREJQEXZZskx4mpAiO4hpl3NF3Q81LYf8AAI5uYPqg8VF7UTNS1j/AJ5OYfquC05MjQ/4kGI3iWul3wQciIiAiIgIiINlnjuhvD2OLXNMwRQgq0s1M5G2wXHybHaKjY8D2mcd4VUrZZ47ob2vY4tc0zaRiCgvZ7r9BzqjX3RdOPpVeJmtl8WuDeoIzZCI3/m0bj6VXttaCJnH97EGGNuVPKiObfqOVUYb1HfZHuLaNw7oDWXKnlRHMv1HqjCSZOw7I5100Mm4k7BvM0HlZ05ebZbOXgabtGEDtdLWI3DHsqeixC9xc4kucSSTiSaklernXlj8XaHPH8NuhDH6Rt5nHsvHQEREBERARF6WbuSzabQ2H7Os87mjHqcOqDtzczXiWrTcbkL3pVdvDB9fmp7k3INns8rkIXvedpO7nDpJejChhrQ1oAaAAAMABgF9ICIiAiIg8nKeblnjzvQw13vM0XdZUPVQHOHNyJZDenfhkyDwMDsDhsKtRarTZ2xGOhvE2uEiOCClUXblnJ5s8d8I+ydE72mrT2+q4kBERAREQd2RspvssZsZmLcRsc04tPP7K5LFaW2iG2PDM2uAI3jeDxBmFRqmfhxlry4psrzoRKs4RJYfzAdwN6Cx3Ov0HOqNdcoedEeLurj3RgDqux7IDn36Dmoxn/lT8PZfJadOMS2mxntn1A6qUOaBq491UmfWUfPtr5GbYf5bf5dY/1T7BBH0REBERAREQFYfh3YbsB0YisR0h8LafOfZV4VcGQYHl2WC3dDbPmQCfUlB3oiICIiAiIgIiIIX4j2GbYccCoPlu5GrfW93UEVsZ2QA+xRgdjbw5tId9FU6AiIgIiIC+oby0hzTIgggjEEVBC+UQXXkLKYj2dloGLhJwGx4o4dwu5zL9RyUB8MLfpRLM7AjzW8xJrvS72U+eSKNw7oOfKMb8PBiRidRjnDmBQd5Kj3OJMzianmrT8QbW5lhLTjEe1nSrj/bJVWgIiICIiAiIgK3834/mWWC7/wAbQeYF0+oKqBWJ4d2u9Z3wtsN0x8L6/MOQStERAREQEREBERB4+d0e5Yox3tujm4gfVVQp54kWuTIUEe0S88m0HqT2UDQEREBERAREQelm5bvItcGLOQDwHfC7Rd6Eq6L1ynVUKVeOSLQI1nhRTi+Gwmu26J+s0EP8U7RNlnZvMR3a6B/cVXym3ik786CBgIbj3d/0oSgIiICIiAiIgKW+HN/z4khoXJOO4zm35OUSU88NXjy4w9q80nlIgeoKCZoiICIiAiIgIiIK1z/D/wAXNzSG3GhnECcz3J9FGlNfEt4vQBtk8nkS2XyKhSAiIgIiICIiArazFPmWCFXVL29nlVKrP8OHn8CZbIrx/tYfqg8TxRZKPB/yyP8AeVC1O/FKGZ2d53RGnoWEfMqCICIiAiIgIiIC78iZVfZYoiMrsc3Y5u7hzXAiC5cmZQZaITYsMzB7g7WniF1KBeHFuk+JAJ1gHtHFtHS6Ef0qeoCIiAiIgLiyxlRlmhGJE5NAxc7YAu1V14hW6/aGwgaQ21+J1T6BqDwsr5SfaYpivxNABg1owaFxIiAiIgIiICIiArP8M3XbE874zv7If2VYK1/DuEBYGl3tPe6vOX0QcniZDv2VkSWpEAPJzSPmAqzV0Z02QRrFGY2RNwuA4s0h8lS6AiIgIiICIiAiIg6LBa3QYrIrNZhmOO8HgRMdVcFgtbY0NsVh0XCY4bweINFS6n/hvaSYUWGcGOBH8wMx3bPqgmCIiAiIg48rW9tngviuwaKDe40a0cyqgtEd0R7nuM3OJcTxJmpn4k2kzgwtmk88TQDtXuoQgIiICIiAiIgIiICufNixXbFAbgfLDjzdpH5qn7DZjFishDF7mtHUymrxc0iQZgABThRBny7tTUYd1S2X7B+HtMWDsa43fhOk30IV0snPSw4qC+J2TJ+XamCn8N/zYfmOyCAIiICIiAiIgIi3WWyviuDIbC5x2AT77hxQaVaGZmSjZ7PpiT4hvuG4Sk1p4yr1XHm1miIJEWPJ0QVa3FrDv/UfQKVoCIiAiIgjGfeSTGgiIwTdCmSBiWGV6XKQPdVurvUOzlzOvkxbMAHGroeAJ3s3HhhyQQFFsjwXMcWvaWuGIIkR0WtAREQEREBERBK/DfJ/mWvzCKQml38zptb/AMj0Vn37lMdu5R3MfJhgWNplpxT5jt4aRoDtXqVImS9rHjuQYv36YbVz5RsbYsJ9nfqvBE9xOBHEGRXS+Xs48EZKWljxQUZbrI6DFfCeJOYS0/ccCK9VoVjeIWQTEh/imN02CUUe8wYP5t28OSrlARF9wYTnuDWtLnEyAAmSeSD4XRYrDEjOuwobnngKDmcB1UzyFmQAA+0mZx8sGg+Jwx5D1UwgQGw2hrGhrRgGgAdgghOSsxCZOtESX6GVPV+Hbupjk/J8KA27Chho2yxPM4nqulEBERAREQEREBERBxZTyVBtDZRYYduODhycKhQzKuYsRs3QH3x7rpNd0OB9FYCIKWtVlfCddiMcw7nAjtvWlXVarKyK27EY1zdzgD/8UNy5mQKvsx/03H+1x+R7oIOi+osMtcWuBDgZEESIO4hfKAvZzSyP+KtLWEflt04nwj2epp3XjtaSQAJk0AGJJwAVwZpZFbY7PddLzXydE5yo0cB85oPadoV6SwksXL9cNiwyft4cao+fs4cN6DJZcrjsQMv6WCwwEHSw41R4JOjhwogy19+hFNu2YwkQqqz1zbNki32D8l50f0OxuH6cOStV5B1ceFKLTarMyLCdCjCYcJEH0M9h3FBR0GE57gxoJc4gADEk7FaGbGbzbKy8ZOiuGk7d+lvDjtWnIOaX4SO+I43hhBO0NOJduds771IkBERAREQEREBERAREQEREBERAREQeFnPm621MvNAbGA0Xe9+l3DjsVYRoRY4tcCHNJBBxBGIV2Lx7bmpCj2lloiaoGkyX8Rw1Z8N++QQeNmDm7dlbIzf8lp/9h+nfcp5cvaX7osMEtYSGwbByCOBnTV9ONEAOv0w2oX3KY7Vl8jqY8KURhA1seNaIMB9+mG1C+5o4rLyDq48KIwgCTseNUAsuVx2IGXtJYYCNbDjWqOBJm3Dsg+mRL1CFoiwZcv3itzyDq48KUWWOAEjj+5IONF0PgbcDu+y0ESxQYREQEREBERAREQEREBERARfTGE4BdDGNbiaoNbYUhN3QfdbQy9penJYZMGbsONao4EmbcO3OiAHX6YbUL7uj+6rLyDq48KURpAEjj+5VQC25XHYgbfrhsWGAjWw41R4J1cOFKoMllyo5IGX6lYYCDN2HdHgkzbh2QGvv0NNqF93RWXkGjce1EaQBJ2Pf1QC25UV2IGXtL90WGAjWw71RwJM24dudEBrr9DTasRDLRIn819PIOrj2ojSAJOx7+qD4iWbce60uYRiF0MBGth3qskkmYw/exByIustacBPlRa3QW4TIPGvyQaEW91nl7QWPw53hBpRbhZydo7p5FZFwQaUXSYDRiSshu1rRLf8APFBoZDJwC2CEAZEzO4LbEde1T9FgESkdb67KoPqJo1HKWxfIZe0lhgIq7DujgSZtw7eiA11+hptQvu6P7qsvIOrj2ojSAJOx7+qAW3KiuxAy9pfuiwwEa2HeqOBJmMO3OiAHX6Gm1C65QV2rLzPVx7IwgUdj3QfVp1eqWfVREGqy49PskfW7IiDZasOv3WYGr3REGuy49FiPrdkRBstWHX7rMHV7rKINVlx6LEXX7IiDZasBzWYOp3+qyiDVZcTyWIuv2+iIg2WrAc1mHqdD9URB8WXEr5fr9R9ERBttOr1Sz6vdZRBpsuPT7JH1uyIg2WrDqswdTuiINdlxPJYtOt0REH//2Q==' }
|
|
41
|
-
|
|
42
|
-
form.spacer height: 16
|
|
43
|
-
form.label text: 'Sign'
|
|
44
|
-
form.spacer height: 8
|
|
45
|
-
form.fields_sign \
|
|
46
|
-
name: 'user[sign]',
|
|
47
|
-
directUploadUrl: glib_direct_uploads_url,
|
|
48
|
-
width: 300, height: 150,
|
|
49
|
-
validation: { required: { message: 'add your signature!' } }
|
|
50
|
-
form.spacer height: 24
|
|
51
|
-
form.fields_submit text: 'Submit'
|
|
52
|
-
end)
|