super 0.19.0 → 0.20.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/README.md +4 -4
- data/app/controllers/super/application_controller.rb +2 -2
- data/app/controllers/super/substructure_controller.rb +24 -1
- data/app/helpers/super/form_builder_helper.rb +4 -4
- data/app/views/super/application/_batch_checkbox.html.erb +4 -0
- data/app/views/super/application/_form.html.erb +1 -1
- data/app/views/super/application/_pagination.html.erb +1 -4
- data/app/views/super/application/_site_footer.html.erb +1 -1
- data/config/locales/en.yml +7 -1
- data/frontend/super-frontend/dist/application.js +6276 -6286
- data/frontend/super-frontend/dist/package.json +2 -2
- data/lib/super/action_inquirer.rb +3 -0
- data/lib/super/error.rb +1 -0
- data/lib/super/form/schema_types.rb +8 -36
- data/lib/super/form_builder/action_text_methods.rb +16 -0
- data/lib/super/form_builder/base_methods.rb +73 -0
- data/lib/super/form_builder/flatpickr_methods.rb +75 -0
- data/lib/super/form_builder/option_methods.rb +73 -0
- data/lib/super/form_builder.rb +143 -0
- data/lib/super/link.rb +47 -63
- data/lib/super/link_builder.rb +24 -43
- data/lib/super/useful/i19.rb +35 -0
- data/lib/super/version.rb +1 -1
- data/lib/super.rb +6 -1
- metadata +13 -8
- data/lib/super/form/builder.rb +0 -289
data/lib/super/link_builder.rb
CHANGED
@@ -2,53 +2,34 @@
|
|
2
2
|
|
3
3
|
module Super
|
4
4
|
class LinkBuilder
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
5
|
+
%i[text href options].each do |method_name|
|
6
|
+
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
7
|
+
def #{method_name}(&block)
|
8
|
+
@#{method_name} = block
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def process_#{method_name}(&block)
|
13
|
+
@process_#{method_name} = block
|
14
|
+
self
|
15
|
+
end
|
16
|
+
RUBY
|
18
17
|
end
|
19
18
|
|
20
|
-
attr_reader :requirements
|
21
|
-
|
22
19
|
def resolve(**kwargs)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
raise Super::Error::IncompleteBuilder, "LinkBuilder requires that #text is set" if @text.nil?
|
21
|
+
raise Super::Error::IncompleteBuilder, "LinkBuilder requires that #href is set" if @href.nil?
|
22
|
+
|
23
|
+
@options ||= -> (**) { {} }
|
24
|
+
@process_text ||= -> (t) { t }
|
25
|
+
@process_href ||= -> (h) { h }
|
26
|
+
@process_options ||= -> (o) { o }
|
27
|
+
|
28
|
+
Super::Link.new(
|
29
|
+
@process_text.call(@text.call(**kwargs)),
|
30
|
+
@process_href.call(@href.call(**kwargs)),
|
31
|
+
**@process_options.call(@options.call(**kwargs))
|
27
32
|
)
|
28
33
|
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def known_requirements
|
33
|
-
%i[params record].freeze
|
34
|
-
end
|
35
|
-
|
36
|
-
def gather_requirements(value_or_proc)
|
37
|
-
return [] if !value_or_proc.is_a?(Proc)
|
38
|
-
|
39
|
-
requirements =
|
40
|
-
value_or_proc
|
41
|
-
.parameters
|
42
|
-
.select { |(kind, name)| kind = :keyreq }
|
43
|
-
.map(&:last)
|
44
|
-
end
|
45
|
-
|
46
|
-
def into_value(value_or_proc, kwargs)
|
47
|
-
if value_or_proc.kind_of?(Proc)
|
48
|
-
value_or_proc.call(**kwargs)
|
49
|
-
else
|
50
|
-
value_or_proc
|
51
|
-
end
|
52
|
-
end
|
53
34
|
end
|
54
35
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
module Useful
|
5
|
+
module I19
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def build_chain(prefix, optional, suffix)
|
9
|
+
prefix = Array(prefix)
|
10
|
+
optional = Array(optional)
|
11
|
+
suffix = Array(suffix)
|
12
|
+
|
13
|
+
result = []
|
14
|
+
|
15
|
+
(optional.size + 1).times do
|
16
|
+
lookup = [prefix, optional, suffix].flatten.join(".").to_sym
|
17
|
+
result.push(lookup)
|
18
|
+
optional.pop
|
19
|
+
end
|
20
|
+
|
21
|
+
result
|
22
|
+
end
|
23
|
+
|
24
|
+
def chain_to_i18n(chain)
|
25
|
+
head, *tail = chain
|
26
|
+
|
27
|
+
[head, { default: tail }]
|
28
|
+
end
|
29
|
+
|
30
|
+
def i18n_with_fallback(prefix, optional, suffix)
|
31
|
+
chain_to_i18n(build_chain(prefix, optional, suffix))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/super/version.rb
CHANGED
data/lib/super.rb
CHANGED
@@ -7,6 +7,7 @@ require "rails/engine"
|
|
7
7
|
require "super/schema/common"
|
8
8
|
require "super/useful/builder"
|
9
9
|
require "super/useful/enum"
|
10
|
+
require "super/useful/i19"
|
10
11
|
|
11
12
|
require "super/action_inquirer"
|
12
13
|
require "super/assets"
|
@@ -24,12 +25,16 @@ require "super/filter/guesser"
|
|
24
25
|
require "super/filter/operator"
|
25
26
|
require "super/filter/schema_types"
|
26
27
|
require "super/form"
|
27
|
-
require "super/form/builder"
|
28
28
|
require "super/form/field_transcript"
|
29
29
|
require "super/form/guesser"
|
30
30
|
require "super/form/inline_errors"
|
31
31
|
require "super/form/schema_types"
|
32
32
|
require "super/form/strong_params"
|
33
|
+
require "super/form_builder"
|
34
|
+
require "super/form_builder/action_text_methods"
|
35
|
+
require "super/form_builder/base_methods"
|
36
|
+
require "super/form_builder/flatpickr_methods"
|
37
|
+
require "super/form_builder/option_methods"
|
33
38
|
require "super/layout"
|
34
39
|
require "super/link"
|
35
40
|
require "super/link_builder"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: super
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Ahn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -332,12 +332,16 @@ files:
|
|
332
332
|
- lib/super/filter/operator.rb
|
333
333
|
- lib/super/filter/schema_types.rb
|
334
334
|
- lib/super/form.rb
|
335
|
-
- lib/super/form/builder.rb
|
336
335
|
- lib/super/form/field_transcript.rb
|
337
336
|
- lib/super/form/guesser.rb
|
338
337
|
- lib/super/form/inline_errors.rb
|
339
338
|
- lib/super/form/schema_types.rb
|
340
339
|
- lib/super/form/strong_params.rb
|
340
|
+
- lib/super/form_builder.rb
|
341
|
+
- lib/super/form_builder/action_text_methods.rb
|
342
|
+
- lib/super/form_builder/base_methods.rb
|
343
|
+
- lib/super/form_builder/flatpickr_methods.rb
|
344
|
+
- lib/super/form_builder/option_methods.rb
|
341
345
|
- lib/super/layout.rb
|
342
346
|
- lib/super/link.rb
|
343
347
|
- lib/super/link_builder.rb
|
@@ -357,6 +361,7 @@ files:
|
|
357
361
|
- lib/super/sort.rb
|
358
362
|
- lib/super/useful/builder.rb
|
359
363
|
- lib/super/useful/enum.rb
|
364
|
+
- lib/super/useful/i19.rb
|
360
365
|
- lib/super/version.rb
|
361
366
|
- lib/super/view_chain.rb
|
362
367
|
- lib/super/view_helper.rb
|
@@ -365,11 +370,11 @@ homepage:
|
|
365
370
|
licenses:
|
366
371
|
- LGPL-3.0-only
|
367
372
|
metadata:
|
368
|
-
bug_tracker_uri: https://github.com/
|
369
|
-
changelog_uri: https://github.com/
|
373
|
+
bug_tracker_uri: https://github.com/superadministration/super/issues
|
374
|
+
changelog_uri: https://github.com/superadministration/super/blob/main/CHANGELOG.md
|
370
375
|
documentation_uri: https://superadministration.github.io/
|
371
|
-
homepage_uri: https://github.com/
|
372
|
-
source_code_uri: https://github.com/
|
376
|
+
homepage_uri: https://github.com/superadministration/super
|
377
|
+
source_code_uri: https://github.com/superadministration/super
|
373
378
|
post_install_message:
|
374
379
|
rdoc_options: []
|
375
380
|
require_paths:
|
@@ -385,7 +390,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
385
390
|
- !ruby/object:Gem::Version
|
386
391
|
version: '0'
|
387
392
|
requirements: []
|
388
|
-
rubygems_version: 3.
|
393
|
+
rubygems_version: 3.3.4
|
389
394
|
signing_key:
|
390
395
|
specification_version: 4
|
391
396
|
summary: A simple, powerful, zero dependency Rails admin framework
|
data/lib/super/form/builder.rb
DELETED
@@ -1,289 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Super
|
4
|
-
class Form
|
5
|
-
# Example
|
6
|
-
#
|
7
|
-
# ```ruby
|
8
|
-
# super_form_for([:admin, @member]) do |f|
|
9
|
-
# # the long way
|
10
|
-
# f.super.label :name
|
11
|
-
# f.super.text_field :name
|
12
|
-
# f.super.inline_errors :name
|
13
|
-
#
|
14
|
-
# # the short way (slightly different from the long way, for alignment)
|
15
|
-
# f.super.text_field! :position
|
16
|
-
# end
|
17
|
-
# ```
|
18
|
-
#
|
19
|
-
# Refer to the Rails docs:
|
20
|
-
# https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html
|
21
|
-
class Builder < ActionView::Helpers::FormBuilder
|
22
|
-
FIELD_ERROR_PROC = proc { |html_tag, instance| html_tag }
|
23
|
-
FORM_BUILDER_DEFAULTS = { builder: self }.freeze
|
24
|
-
|
25
|
-
def super(**options)
|
26
|
-
@super_wrappers ||= Wrappers.new(self, @template)
|
27
|
-
end
|
28
|
-
|
29
|
-
class Wrappers
|
30
|
-
def initialize(builder, template)
|
31
|
-
@builder = builder
|
32
|
-
@template = template
|
33
|
-
end
|
34
|
-
|
35
|
-
def inline_errors(attribute)
|
36
|
-
if @builder.object
|
37
|
-
messages = InlineErrors.error_messages(@builder.object, attribute).map do |msg|
|
38
|
-
error_content_tag(msg)
|
39
|
-
end
|
40
|
-
|
41
|
-
@template.safe_join(messages)
|
42
|
-
else
|
43
|
-
error_content_tag(<<~MSG.html_safe)
|
44
|
-
This form doesn't have an object, so something is probably wrong.
|
45
|
-
Maybe <code>accepts_nested_attributes_for</code> isn't set up?
|
46
|
-
MSG
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def label(attribute, text = nil, options = {}, &block)
|
51
|
-
options, defaults = split_defaults(options, class: "block")
|
52
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
53
|
-
|
54
|
-
@builder.label(attribute, text, options, &block)
|
55
|
-
end
|
56
|
-
|
57
|
-
def check_box(attribute, options = {}, checked_value = "1", unchecked_value = "0")
|
58
|
-
@builder.check_box(attribute, options, checked_value, unchecked_value)
|
59
|
-
end
|
60
|
-
|
61
|
-
def date_flatpickr(attribute, options = {})
|
62
|
-
options, defaults = split_defaults(
|
63
|
-
options,
|
64
|
-
class: "super-input w-full",
|
65
|
-
data: {
|
66
|
-
controller: "flatpickr",
|
67
|
-
flatpickr_options_value: {
|
68
|
-
dateFormat: "Y-m-d",
|
69
|
-
}
|
70
|
-
}
|
71
|
-
)
|
72
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
73
|
-
options[:data] = defaults[:data].deep_merge(options[:data] || {})
|
74
|
-
options[:value] = @builder.object.public_send(attribute).presence
|
75
|
-
options[:value] = options[:value].iso8601 if options[:value].respond_to?(:iso8601)
|
76
|
-
|
77
|
-
@builder.text_field(attribute, options)
|
78
|
-
end
|
79
|
-
|
80
|
-
def datetime_flatpickr(attribute, options = {})
|
81
|
-
options, defaults = split_defaults(
|
82
|
-
options,
|
83
|
-
class: "super-input w-full",
|
84
|
-
data: {
|
85
|
-
controller: "flatpickr",
|
86
|
-
flatpickr_options_value: {
|
87
|
-
enableSeconds: true,
|
88
|
-
enableTime: true,
|
89
|
-
dateFormat: "Z",
|
90
|
-
}
|
91
|
-
}
|
92
|
-
)
|
93
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
94
|
-
options[:data] = defaults[:data].deep_merge(options[:data] || {})
|
95
|
-
options[:value] = @builder.object.public_send(attribute).presence
|
96
|
-
options[:value] = options[:value].iso8601 if options[:value].respond_to?(:iso8601)
|
97
|
-
|
98
|
-
@builder.text_field(attribute, options)
|
99
|
-
end
|
100
|
-
|
101
|
-
def time_flatpickr(attribute, options = {})
|
102
|
-
options, defaults = split_defaults(
|
103
|
-
options,
|
104
|
-
class: "super-input w-full",
|
105
|
-
data: {
|
106
|
-
controller: "flatpickr",
|
107
|
-
flatpickr_options_value: {
|
108
|
-
enableSeconds: true,
|
109
|
-
enableTime: true,
|
110
|
-
noCalendar: true,
|
111
|
-
dateFormat: "H:i:S",
|
112
|
-
}
|
113
|
-
}
|
114
|
-
)
|
115
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
116
|
-
options[:data] = defaults[:data].deep_merge(options[:data] || {})
|
117
|
-
options[:value] = @builder.object.public_send(attribute).presence
|
118
|
-
options[:value] = options[:value].strftime("%H:%M:%S") if options[:value].respond_to?(:strftime)
|
119
|
-
|
120
|
-
@builder.text_field(attribute, options)
|
121
|
-
end
|
122
|
-
|
123
|
-
def password_field(attribute, options = {})
|
124
|
-
options, defaults = split_defaults(options, class: "super-input w-full")
|
125
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
126
|
-
|
127
|
-
@builder.password_field(attribute, options)
|
128
|
-
end
|
129
|
-
|
130
|
-
def rich_text_area(attribute, options = {})
|
131
|
-
options, defaults = split_defaults(options, class: "trix-content super-input w-full")
|
132
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
133
|
-
|
134
|
-
@builder.rich_text_area(attribute, options)
|
135
|
-
end
|
136
|
-
|
137
|
-
def select(attribute, choices, options = {}, html_options = {}, &block)
|
138
|
-
options, defaults = split_defaults(options, include_blank: true)
|
139
|
-
options = defaults.merge(options)
|
140
|
-
html_options, html_defaults = split_defaults(html_options, class: "super-input super-input-select")
|
141
|
-
html_options[:class] = join_classes(html_defaults[:class], html_options[:class])
|
142
|
-
|
143
|
-
@builder.select(attribute, choices, options, html_options, &block)
|
144
|
-
end
|
145
|
-
|
146
|
-
def submit(value = nil, options = {})
|
147
|
-
value, options = nil, value if value.is_a?(Hash)
|
148
|
-
options, defaults = split_defaults(options, class: "super-button")
|
149
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
150
|
-
|
151
|
-
@builder.submit(value, options)
|
152
|
-
end
|
153
|
-
|
154
|
-
def text_field(attribute, options = {})
|
155
|
-
options, defaults = split_defaults(options, class: "super-input w-full")
|
156
|
-
options[:class] = join_classes(defaults[:class], options[:class])
|
157
|
-
|
158
|
-
@builder.text_field(attribute, options)
|
159
|
-
end
|
160
|
-
|
161
|
-
def container(&block)
|
162
|
-
@template.content_tag(:div, class: "super-field-group", &block)
|
163
|
-
end
|
164
|
-
|
165
|
-
def check_box!(attribute, checked_value: "1", unchecked_value: "0", label_text: nil, label: {}, field: {}, show_errors: true)
|
166
|
-
label[:super] ||= {}
|
167
|
-
label[:super] = { class: "select-none ml-1" }.merge(label[:super])
|
168
|
-
container do
|
169
|
-
compact_join([
|
170
|
-
"<div>".html_safe,
|
171
|
-
public_send(:check_box, attribute, field, checked_value, unchecked_value),
|
172
|
-
public_send(:label, attribute, label_text, label),
|
173
|
-
"</div>".html_safe,
|
174
|
-
show_errors && inline_errors(attribute),
|
175
|
-
])
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def date_flatpickr!(attribute, label_text: nil, label: {}, field: {}, show_errors: true)
|
180
|
-
container do
|
181
|
-
compact_join([
|
182
|
-
public_send(:label, attribute, label_text, label),
|
183
|
-
%(<div class="mt-1">).html_safe,
|
184
|
-
public_send(:date_flatpickr, attribute, field),
|
185
|
-
show_errors && inline_errors(attribute),
|
186
|
-
%(</div>).html_safe,
|
187
|
-
])
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
def datetime_flatpickr!(attribute, label_text: nil, label: {}, field: {}, show_errors: true)
|
192
|
-
container do
|
193
|
-
compact_join([
|
194
|
-
public_send(:label, attribute, label_text, label),
|
195
|
-
%(<div class="mt-1">).html_safe,
|
196
|
-
public_send(:datetime_flatpickr, attribute, field),
|
197
|
-
show_errors && inline_errors(attribute),
|
198
|
-
%(</div>).html_safe,
|
199
|
-
])
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
def time_flatpickr!(attribute, label_text: nil, label: {}, field: {}, show_errors: true)
|
204
|
-
container do
|
205
|
-
compact_join([
|
206
|
-
public_send(:label, attribute, label_text, label),
|
207
|
-
%(<div class="mt-1">).html_safe,
|
208
|
-
public_send(:time_flatpickr, attribute, field),
|
209
|
-
show_errors && inline_errors(attribute),
|
210
|
-
%(</div>).html_safe,
|
211
|
-
])
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
def password_field!(attribute, label_text: nil, label: {}, field: {}, show_errors: true)
|
216
|
-
container do
|
217
|
-
compact_join([
|
218
|
-
public_send(:label, attribute, label_text, label),
|
219
|
-
%(<div class="mt-1">).html_safe,
|
220
|
-
public_send(:password_field, attribute, field),
|
221
|
-
show_errors && inline_errors(attribute),
|
222
|
-
%(</div>).html_safe,
|
223
|
-
])
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
def rich_text_area!(attribute, label_text: nil, label: {}, field: {}, show_errors: true)
|
228
|
-
container do
|
229
|
-
compact_join([
|
230
|
-
public_send(:label, attribute, label_text, label),
|
231
|
-
%(<div class="mt-1">).html_safe,
|
232
|
-
public_send(:rich_text_area, attribute, field),
|
233
|
-
show_errors && inline_errors(attribute),
|
234
|
-
%(</div>).html_safe,
|
235
|
-
])
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
def select!(attribute, collection, label_text: nil, label: {}, field: {}, show_errors: true)
|
240
|
-
container do
|
241
|
-
compact_join([
|
242
|
-
public_send(:label, attribute, label_text, label),
|
243
|
-
%(<div class="mt-1">).html_safe,
|
244
|
-
public_send(:select, attribute, collection, field),
|
245
|
-
show_errors && inline_errors(attribute),
|
246
|
-
%(</div>).html_safe,
|
247
|
-
])
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
def text_field!(attribute, label_text: nil, label: {}, field: {}, show_errors: true)
|
252
|
-
container do
|
253
|
-
compact_join([
|
254
|
-
public_send(:label, attribute, label_text, label),
|
255
|
-
%(<div class="mt-1">).html_safe,
|
256
|
-
public_send(:text_field, attribute, field),
|
257
|
-
show_errors && inline_errors(attribute),
|
258
|
-
%(</div>).html_safe,
|
259
|
-
])
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
private
|
264
|
-
|
265
|
-
def split_defaults(options, **internal_defaults)
|
266
|
-
defaults = options.delete(:super) || {}
|
267
|
-
# prefer options set in `defaults`, since they are user overrides
|
268
|
-
defaults = internal_defaults.merge(defaults)
|
269
|
-
|
270
|
-
[options, defaults]
|
271
|
-
end
|
272
|
-
|
273
|
-
def join_classes(*class_lists)
|
274
|
-
class_lists.flatten.map(&:presence).compact
|
275
|
-
end
|
276
|
-
|
277
|
-
def error_content_tag(content)
|
278
|
-
@template.content_tag(:p, content, class: "text-red-400 text-xs italic pt-1")
|
279
|
-
end
|
280
|
-
|
281
|
-
def compact_join(*parts)
|
282
|
-
@template.safe_join(
|
283
|
-
parts.flatten.map(&:presence).compact
|
284
|
-
)
|
285
|
-
end
|
286
|
-
end
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|