super 0.20.0 → 0.21.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 +1 -1
- data/app/controllers/super/application_controller.rb +8 -17
- data/app/controllers/super/sitewide_controller.rb +33 -0
- data/app/controllers/super/substructure_controller.rb +41 -86
- data/app/controllers/super/view_controller.rb +55 -0
- data/app/views/super/application/_display_index.html.erb +8 -2
- data/app/views/super/application/_display_show.html.erb +10 -2
- data/app/views/super/application/_filter.html.erb +63 -59
- data/app/views/super/application/_layout.html.erb +0 -2
- data/app/views/super/application/_query.html.erb +13 -12
- data/app/views/super/application/_sort.html.erb +18 -14
- data/app/views/super/application/_view_chain.html.erb +23 -4
- data/config/locales/en.yml +3 -0
- data/lib/super/badge.rb +11 -2
- data/lib/super/cheat.rb +6 -1
- data/lib/super/display/schema_types.rb +37 -14
- data/lib/super/display.rb +5 -4
- data/lib/super/error.rb +2 -2
- data/{app/helpers → lib}/super/form_builder_helper.rb +11 -0
- data/lib/super/navigation.rb +40 -40
- data/lib/super/query.rb +61 -0
- data/lib/super/{engine.rb → railtie.rb} +7 -1
- data/lib/super/reset.rb +7 -0
- data/lib/super/schema.rb +8 -2
- data/lib/super/sort.rb +1 -3
- data/lib/super/useful/deprecations.rb +18 -0
- data/lib/super/version.rb +1 -1
- data/lib/super/view_chain.rb +14 -4
- data/lib/super.rb +8 -2
- metadata +9 -49
- data/config/routes.rb +0 -4
- data/lib/super/query/form_object.rb +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8074c717fdd2f747e7d880cdbb02ec13515ec85b3504e7f55f1db526ace24838
|
4
|
+
data.tar.gz: 5d446f1574a35e4ba542281b2edfe5ef36dd588a5c2420b81288702bb96f4607
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adca04cac0470dfe22929b710d331ff651eb53ee0fdf5f88657f9b18094963f09bda9c6b13808bc112a565937851eda14622e8a0d853b992fa5f1551e6daadb0
|
7
|
+
data.tar.gz: b694a20146e50d743fcc7ca5bbf6e67cdd63df3e256352b70a99a5a677ad0f5014f38ca29efe48263d840809d9c4e3f63d1972a28277510c882c0a6023cf55d0
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ changes before 1.0.
|
|
38
38
|
* Builds on top of standard Rails controllers and ERB views
|
39
39
|
* Plenty of escape hatches for those very customized pages
|
40
40
|
* No DSL. Configure your admin pages by setting methods and returning objects
|
41
|
-
* Supports Rails 5.0+, 6.0+
|
41
|
+
* Supports Rails 5.0+, 6.0+, 7.0+
|
42
42
|
* Supports Ruby 2.3+, 3.0+
|
43
43
|
|
44
44
|
|
@@ -22,7 +22,6 @@ module Super
|
|
22
22
|
@records = load_records
|
23
23
|
@display = display_schema.apply(action: current_action, format: request.format)
|
24
24
|
@view = index_view
|
25
|
-
@query_form = initialize_query_form
|
26
25
|
initialize_filter_form
|
27
26
|
initialize_sort_form
|
28
27
|
@records = apply_queries
|
@@ -48,12 +47,9 @@ module Super
|
|
48
47
|
set_record_attributes
|
49
48
|
|
50
49
|
if save_record
|
51
|
-
|
50
|
+
redirect_to_record
|
52
51
|
else
|
53
|
-
|
54
|
-
@form = form_schema
|
55
|
-
@view = new_view
|
56
|
-
render :new, status: :bad_request
|
52
|
+
render_new_as_bad_request
|
57
53
|
end
|
58
54
|
end
|
59
55
|
|
@@ -70,12 +66,9 @@ module Super
|
|
70
66
|
set_record_attributes
|
71
67
|
|
72
68
|
if save_record
|
73
|
-
|
69
|
+
redirect_to_record
|
74
70
|
else
|
75
|
-
|
76
|
-
@form = form_schema
|
77
|
-
@view = edit_view
|
78
|
-
render :edit, status: :bad_request
|
71
|
+
render_edit_as_bad_request
|
79
72
|
end
|
80
73
|
end
|
81
74
|
|
@@ -84,14 +77,12 @@ module Super
|
|
84
77
|
@record = load_record
|
85
78
|
|
86
79
|
if destroy_record
|
87
|
-
|
80
|
+
redirect_to_records
|
88
81
|
else
|
89
|
-
|
90
|
-
redirect_to polymorphic_path(Super::Link.polymorphic_parts(@record))
|
82
|
+
redirect_to_record_with_destroy_failure_message
|
91
83
|
end
|
92
|
-
rescue ActiveRecord::
|
93
|
-
|
94
|
-
redirect_to polymorphic_path(Super::Link.polymorphic_parts(@record))
|
84
|
+
rescue ActiveRecord::ActiveRecordError => e
|
85
|
+
redirect_to_record_with_destroy_failure_message(e)
|
95
86
|
end
|
96
87
|
|
97
88
|
private
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
# Various methods that are useful for all Super admin controllers, regardless
|
5
|
+
# of the controller being a resourceful or non-resourceful.
|
6
|
+
class SitewideController < ActionController::Base
|
7
|
+
private
|
8
|
+
|
9
|
+
helper_method def site_title
|
10
|
+
Super.configuration.title
|
11
|
+
end
|
12
|
+
|
13
|
+
helper_method def site_navigation
|
14
|
+
Super::Navigation.new(&:all)
|
15
|
+
end
|
16
|
+
|
17
|
+
helper_method def document_title
|
18
|
+
if instance_variable_defined?(:@document_title)
|
19
|
+
return @document_title
|
20
|
+
end
|
21
|
+
|
22
|
+
document_title_segments.map(&:presence).compact.join(document_title_separator)
|
23
|
+
end
|
24
|
+
|
25
|
+
def document_title_segments
|
26
|
+
@document_title_segments ||= [page_title, site_title]
|
27
|
+
end
|
28
|
+
|
29
|
+
def document_title_separator
|
30
|
+
@document_title_separator ||= " - "
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Super
|
4
4
|
# Various methods that determine the behavior of your controllers. These
|
5
5
|
# methods can and should be overridden.
|
6
|
-
class SubstructureController <
|
6
|
+
class SubstructureController < ViewController
|
7
7
|
def self.batch(action_name)
|
8
8
|
mod = Module.new do
|
9
9
|
define_method(action_name) do
|
@@ -215,22 +215,55 @@ module Super
|
|
215
215
|
@record.destroy
|
216
216
|
end
|
217
217
|
|
218
|
-
def
|
219
|
-
Super::
|
218
|
+
def redirect_to_record
|
219
|
+
redirect_to polymorphic_path(Super::Link.polymorphic_parts(@record))
|
220
|
+
end
|
221
|
+
|
222
|
+
def redirect_to_records
|
223
|
+
redirect_to polymorphic_path(Super::Link.polymorphic_parts(model))
|
224
|
+
end
|
225
|
+
|
226
|
+
def redirect_to_record_with_destroy_failure_message(error = nil)
|
227
|
+
flash.alert =
|
228
|
+
case error
|
229
|
+
when ActiveRecord::InvalidForeignKey
|
230
|
+
I18n.t("super.destroy_error.invalid_foreign_key")
|
231
|
+
else
|
232
|
+
I18n.t("super.destroy_error.generic")
|
233
|
+
end
|
234
|
+
|
235
|
+
redirect_to polymorphic_path(Super::Link.polymorphic_parts(@record))
|
236
|
+
end
|
237
|
+
|
238
|
+
def render_new_as_bad_request
|
239
|
+
@current_action = ActionInquirer.new!
|
240
|
+
@form = form_schema
|
241
|
+
@view = new_view
|
242
|
+
render :new, status: :bad_request
|
243
|
+
end
|
244
|
+
|
245
|
+
def render_edit_as_bad_request
|
246
|
+
@current_action = ActionInquirer.edit!
|
247
|
+
@form = form_schema
|
248
|
+
@view = edit_view
|
249
|
+
render :edit, status: :bad_request
|
250
|
+
end
|
251
|
+
|
252
|
+
helper_method def query
|
253
|
+
@query ||= Super::Query.new(
|
220
254
|
model: model,
|
221
|
-
params:
|
222
|
-
namespace: :q,
|
255
|
+
params: request.GET,
|
223
256
|
current_path: request.path,
|
224
257
|
)
|
225
258
|
end
|
226
259
|
|
227
260
|
def apply_queries
|
228
|
-
|
261
|
+
query.apply_changes(@records)
|
229
262
|
end
|
230
263
|
|
231
264
|
def initialize_filter_form
|
232
265
|
if filters_enabled?
|
233
|
-
@
|
266
|
+
@filter_form = query.build(
|
234
267
|
Super::Filter::FormObject,
|
235
268
|
namespace: :f,
|
236
269
|
schema: filter_schema
|
@@ -240,7 +273,7 @@ module Super
|
|
240
273
|
|
241
274
|
def initialize_sort_form
|
242
275
|
if sort_enabled?
|
243
|
-
@
|
276
|
+
@sort_form = query.build(
|
244
277
|
Super::Sort::FormObject,
|
245
278
|
namespace: :s,
|
246
279
|
default: default_sort,
|
@@ -290,83 +323,5 @@ module Super
|
|
290
323
|
helper_method def csv_enabled?
|
291
324
|
true
|
292
325
|
end
|
293
|
-
|
294
|
-
def index_view
|
295
|
-
Super::Layout.new(
|
296
|
-
main: Super::ViewChain.new(
|
297
|
-
main_panel: Super::Panel.new,
|
298
|
-
batch_form: Super::Partial.new("batch_form"),
|
299
|
-
main_header: Super::Partial.new("collection_header"),
|
300
|
-
main: :@display
|
301
|
-
),
|
302
|
-
aside: Super::ViewChain.new(
|
303
|
-
main: :@query_form
|
304
|
-
)
|
305
|
-
)
|
306
|
-
end
|
307
|
-
|
308
|
-
def show_view
|
309
|
-
Super::Layout.new(
|
310
|
-
main: Super::ViewChain.new(
|
311
|
-
main_panel: Super::Panel.new,
|
312
|
-
main_header: Super::Partial.new("member_header"),
|
313
|
-
main: :@display
|
314
|
-
)
|
315
|
-
)
|
316
|
-
end
|
317
|
-
|
318
|
-
def new_view
|
319
|
-
Super::Layout.new(
|
320
|
-
main: Super::ViewChain.new(
|
321
|
-
main_panel: Super::Panel.new,
|
322
|
-
main_header: Super::Partial.new("collection_header"),
|
323
|
-
main: :@form
|
324
|
-
)
|
325
|
-
)
|
326
|
-
end
|
327
|
-
|
328
|
-
def edit_view
|
329
|
-
Super::Layout.new(
|
330
|
-
main: Super::ViewChain.new(
|
331
|
-
main_panel: Super::Panel.new,
|
332
|
-
main_header: Super::Partial.new("member_header"),
|
333
|
-
main: :@form
|
334
|
-
)
|
335
|
-
)
|
336
|
-
end
|
337
|
-
|
338
|
-
concerning :Sitewide do
|
339
|
-
included do
|
340
|
-
helper_method :site_title
|
341
|
-
helper_method :site_navigation
|
342
|
-
helper_method :document_title
|
343
|
-
end
|
344
|
-
|
345
|
-
private
|
346
|
-
|
347
|
-
def site_title
|
348
|
-
Super.configuration.title
|
349
|
-
end
|
350
|
-
|
351
|
-
def site_navigation
|
352
|
-
Super::Navigation.new(&:all)
|
353
|
-
end
|
354
|
-
|
355
|
-
def document_title
|
356
|
-
if instance_variable_defined?(:@document_title)
|
357
|
-
return @document_title
|
358
|
-
end
|
359
|
-
|
360
|
-
document_title_segments.map(&:presence).compact.join(document_title_separator)
|
361
|
-
end
|
362
|
-
|
363
|
-
def document_title_segments
|
364
|
-
@document_title_segments ||= [page_title, site_title]
|
365
|
-
end
|
366
|
-
|
367
|
-
def document_title_separator
|
368
|
-
@document_title_separator ||= " - "
|
369
|
-
end
|
370
|
-
end
|
371
326
|
end
|
372
327
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Super
|
4
|
+
# These methods define what each resourceful Super admin page looks like.
|
5
|
+
# Generally, the return value of each of these methods should be set to
|
6
|
+
# `@view`.
|
7
|
+
class ViewController < SitewideController
|
8
|
+
private
|
9
|
+
|
10
|
+
def index_view
|
11
|
+
Super::Layout.new(
|
12
|
+
main: Super::ViewChain.new(
|
13
|
+
main_panel: Super::Panel.new,
|
14
|
+
batch_form: Super::Partial.new("batch_form"),
|
15
|
+
main_header: Super::Partial.new("collection_header"),
|
16
|
+
main: :@display
|
17
|
+
),
|
18
|
+
aside: Super::ViewChain.new(
|
19
|
+
query_panel: Super::Panel.new,
|
20
|
+
query: query,
|
21
|
+
)
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def show_view
|
26
|
+
Super::Layout.new(
|
27
|
+
main: Super::ViewChain.new(
|
28
|
+
main_panel: Super::Panel.new,
|
29
|
+
main_header: Super::Partial.new("member_header"),
|
30
|
+
main: :@display
|
31
|
+
)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def new_view
|
36
|
+
Super::Layout.new(
|
37
|
+
main: Super::ViewChain.new(
|
38
|
+
main_panel: Super::Panel.new,
|
39
|
+
main_header: Super::Partial.new("collection_header"),
|
40
|
+
main: :@form
|
41
|
+
)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def edit_view
|
46
|
+
Super::Layout.new(
|
47
|
+
main: Super::ViewChain.new(
|
48
|
+
main_panel: Super::Panel.new,
|
49
|
+
main_header: Super::Partial.new("member_header"),
|
50
|
+
main: :@form
|
51
|
+
)
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -2,9 +2,15 @@
|
|
2
2
|
<table class="w-full border-separate" cellspacing="0" cellpadding="0">
|
3
3
|
<thead class="">
|
4
4
|
<tr class="">
|
5
|
-
<% display_index.
|
5
|
+
<% display_index.each_attribute do |attribute_name, attribute_definition| %>
|
6
6
|
<th class="p-2 first:pl-6 border-b border-b-2 border-gray-400 text-gray-600 text-left text-sm font-normal bg-white top-0 z-10">
|
7
|
-
<%=
|
7
|
+
<%=
|
8
|
+
if attribute_definition.respond_to?(:attribute_name) && attribute_definition.attribute_name
|
9
|
+
attribute_definition.attribute_name
|
10
|
+
else
|
11
|
+
model.human_attribute_name(attribute_name)
|
12
|
+
end
|
13
|
+
%>
|
8
14
|
</th>
|
9
15
|
<% end %>
|
10
16
|
</tr>
|
@@ -1,7 +1,15 @@
|
|
1
1
|
<table class="max-w-full mt-4">
|
2
|
-
<% display_show.
|
2
|
+
<% display_show.each_attribute do |attribute_name, attribute_definition| %>
|
3
3
|
<tr>
|
4
|
-
<th class="py-1 align-baseline text-right px-4"
|
4
|
+
<th class="py-1 align-baseline text-right px-4">
|
5
|
+
<%=
|
6
|
+
if attribute_definition.respond_to?(:attribute_name) && attribute_definition.attribute_name
|
7
|
+
attribute_definition.attribute_name
|
8
|
+
else
|
9
|
+
model.human_attribute_name(attribute_name)
|
10
|
+
end
|
11
|
+
%>
|
12
|
+
</th>
|
5
13
|
<td class="py-1 align-baseline"><%= display_show.render_attribute(template: self, record: @record, column: attribute_name) %></td>
|
6
14
|
</tr>
|
7
15
|
<% end %>
|
@@ -1,66 +1,70 @@
|
|
1
|
-
<h1 class="text-lg">Filter</h1>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<div>
|
8
|
-
<
|
9
|
-
|
10
|
-
|
1
|
+
<h1 class="text-lg mt-4">Filter</h1>
|
2
|
+
<%= super_fields_for(query.namespace_for(filter), filter) do |form| %>
|
3
|
+
<% filter.each_attribute do |attribute_form_object| %>
|
4
|
+
<div class="mt-4">
|
5
|
+
<%= form.fields_for(attribute_form_object.field_name, attribute_form_object) do |attribute_form| %>
|
6
|
+
<% selected_index = 0 %>
|
7
|
+
<div data-controller="tab-container" data-tab-container-tab-identifier-getter-value="tabIdentifierValue" data-tab-container-tab-controller-name-value="tab">
|
8
|
+
<div>
|
9
|
+
<span class="inline-block"><%= attribute_form_object.humanized_attribute_name %></span>
|
10
|
+
<select data-tab-container-target="control" data-action="tab-container#change" class="super-input super-input-select inline-block">
|
11
|
+
<% selected = false %>
|
12
|
+
<% attribute_form_object.each_operator.with_index do |operator_form_object, index| %>
|
13
|
+
<%
|
14
|
+
selected_attribute =
|
15
|
+
if !selected && operator_form_object.specified?
|
16
|
+
selected = true
|
17
|
+
selected_index = index
|
18
|
+
%(selected=selected)
|
19
|
+
else
|
20
|
+
""
|
21
|
+
end
|
22
|
+
%>
|
23
|
+
<option value="<%= operator_form_object.identifier %>" <%= selected_attribute %>><%= operator_form_object.operator.humanized_operator_name %></option>
|
24
|
+
<% end %>
|
25
|
+
</select>
|
26
|
+
</div>
|
27
|
+
<div>
|
11
28
|
<% attribute_form_object.each_operator.with_index do |operator_form_object, index| %>
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
<% form_html = capture do %>
|
30
|
-
<div data-tab-target="content">
|
31
|
-
<%= attribute_form.fields_for(operator_form_object.identifier, operator_form_object) do |operator_form| %>
|
32
|
-
<div class="flex gap-x-2 mt-2">
|
33
|
-
<% operator_form_object.each_field.with_index do |operator_field_name, index| %>
|
34
|
-
<div class="flex-1">
|
35
|
-
<% if operator_field_name == Super::Filter::FormObject::OperatorForm::NULLARY %>
|
36
|
-
<%= operator_form.super.check_box(operator_field_name, {}, "1", "") %>
|
37
|
-
<%= operator_form.super.label(operator_field_name, nil, super: { class: "select-none ml-1" }) %>
|
38
|
-
<% elsif operator_form_object.operator.respond_to?(:field_transcript) && operator_form_object.operator.field_transcript %>
|
39
|
-
<% field_transcript = operator_form_object.operator.field_transcript %>
|
40
|
-
<% if field_transcript.super? %>
|
41
|
-
<%= operator_form.super.public_send(field_transcript.method_name, operator_field_name, *field_transcript.args, **field_transcript.kwargs) %>
|
29
|
+
<div data-controller="tab" data-tab-tab-container-getter-value="tabContainer" data-tab-container-target="tab" data-tab-identifier-value="<%= operator_form_object.identifier %>">
|
30
|
+
<% form_html = capture do %>
|
31
|
+
<div data-tab-target="content">
|
32
|
+
<%= attribute_form.fields_for(operator_form_object.identifier, operator_form_object) do |operator_form| %>
|
33
|
+
<div class="flex gap-x-2 mt-2">
|
34
|
+
<% operator_form_object.each_field.with_index do |operator_field_name, index| %>
|
35
|
+
<div class="flex-1">
|
36
|
+
<% if operator_field_name == Super::Filter::FormObject::OperatorForm::NULLARY %>
|
37
|
+
<%= operator_form.super.check_box(operator_field_name, {}, "1", "") %>
|
38
|
+
<%= operator_form.super.label(operator_field_name, nil, super: { class: "select-none ml-1" }) %>
|
39
|
+
<% elsif operator_form_object.operator.respond_to?(:field_transcript) && operator_form_object.operator.field_transcript %>
|
40
|
+
<% field_transcript = operator_form_object.operator.field_transcript %>
|
41
|
+
<% if field_transcript.super? %>
|
42
|
+
<%= operator_form.super.public_send(field_transcript.method_name, operator_field_name, *field_transcript.args, **field_transcript.kwargs) %>
|
43
|
+
<% else %>
|
44
|
+
<%= operator_form.public_send(field_transcript.method_name, operator_field_name, *field_transcript.args, **field_transcript.kwargs) %>
|
45
|
+
<% end %>
|
42
46
|
<% else %>
|
43
|
-
<%= operator_form.
|
47
|
+
<%= operator_form.super.text_field(operator_field_name) %>
|
44
48
|
<% end %>
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
<% end %>
|
52
|
-
</div>
|
53
|
-
<% end %>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
52
|
+
<% end %>
|
53
|
+
</div>
|
54
|
+
<% end %>
|
54
55
|
|
55
|
-
|
56
|
+
<%= form_html if index == selected_index %>
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
<template data-tab-target="pocket">
|
59
|
+
<%= form_html %>
|
60
|
+
</template>
|
61
|
+
</div>
|
62
|
+
<% end %>
|
63
|
+
</div>
|
62
64
|
</div>
|
63
|
-
|
64
|
-
|
65
|
-
|
65
|
+
<% end %>
|
66
|
+
</div>
|
67
|
+
<% end %>
|
66
68
|
<% end %>
|
69
|
+
|
70
|
+
<%= yield if block_given? %>
|
@@ -1,18 +1,19 @@
|
|
1
|
-
|
1
|
+
<% if filters_enabled? || sort_enabled? %>
|
2
2
|
<h1 class="text-xl">Query</h1>
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<%= form.fields_for namespace do |addon_form| %>
|
12
|
-
<%= render(addon, form: addon_form) %>
|
3
|
+
|
4
|
+
<%= form_tag(query.path, method: :get, data: { controller: "clean-filter-params", action: "submit->clean-filter-params#call" }) do %>
|
5
|
+
<% if filters_enabled? %>
|
6
|
+
<%= render @filter_form %>
|
7
|
+
<% end %>
|
8
|
+
<% if sort_enabled? %>
|
9
|
+
<% if filters_enabled? %>
|
10
|
+
<div class="mt-6"></div>
|
13
11
|
<% end %>
|
12
|
+
<%= render @sort_form %>
|
14
13
|
<% end %>
|
15
14
|
|
16
|
-
<%=
|
15
|
+
<%= submit_tag("Apply", class: "super-button super-button--border-gray mt-6") %>
|
17
16
|
<% end %>
|
18
17
|
<% end %>
|
18
|
+
|
19
|
+
<%= yield if block_given? %>
|
@@ -1,18 +1,22 @@
|
|
1
1
|
<h1 class="text-lg mt-6">Sort</h1>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<%=
|
2
|
+
<%= super_fields_for(query.namespace_for(sort), sort) do |form| %>
|
3
|
+
<div data-controller="apply-template">
|
4
|
+
<% sort.exprs.each.with_index do |expr, index| %>
|
5
|
+
<%= form.fields_for("exprs[]", expr.with_index(index)) do |expr_fields| %>
|
6
|
+
<%= render "sort_expression", expr_fields: expr_fields, sort: sort %>
|
7
|
+
<% end %>
|
6
8
|
<% end %>
|
7
|
-
<% end %>
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
<%= form.fields_for("exprs[]", sort.new_expr.with_index("TEMPLATEINDEX")) do |expr_fields| %>
|
11
|
+
<template data-apply-template-target="template">
|
12
|
+
<%= render "sort_expression", expr_fields: expr_fields, sort: sort %>
|
13
|
+
</template>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<a href="#" data-action="apply-template#call" class="block mt-2 text-sm">
|
17
|
+
Add
|
18
|
+
</a>
|
19
|
+
</div>
|
20
|
+
<% end %>
|
14
21
|
|
15
|
-
|
16
|
-
Add
|
17
|
-
</a>
|
18
|
-
</div>
|
22
|
+
<%= yield if block_given? %>
|
@@ -1,5 +1,24 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
<%
|
2
|
+
name, current = view_chain.shift
|
3
|
+
current =
|
4
|
+
if current.kind_of?(Symbol)
|
5
|
+
instance_variable_get(current)
|
6
|
+
else
|
7
|
+
current
|
8
|
+
end
|
9
|
+
|
10
|
+
if !current
|
11
|
+
Rails.logger.warn do
|
12
|
+
"Super::ViewChain encountered a nil view: #{name.inspect}."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
%>
|
16
|
+
<% if current %>
|
17
|
+
<% if view_chain.empty? %>
|
18
|
+
<%= render(current) %>
|
19
|
+
<% else %>
|
20
|
+
<%= render(current) do %>
|
21
|
+
<%= render(view_chain) %>
|
22
|
+
<% end %>
|
23
|
+
<% end %>
|
5
24
|
<% end %>
|
data/config/locales/en.yml
CHANGED
@@ -17,3 +17,6 @@ en:
|
|
17
17
|
layout:
|
18
18
|
powered_by_html: "%{env} environment. Powered by Super %{version}. <a href='https://superadministration.github.io/v%{version}/'>Developer docs.</a>"
|
19
19
|
mismatching_package_json_gemfile_versions: "The version of Super specified in your package.json file does not match the version specified in your Gemfile.lock."
|
20
|
+
destroy_error:
|
21
|
+
invalid_foreign_key: Couldn't delete record because other records still refer to this one
|
22
|
+
generic: Couldn't delete record
|
data/lib/super/badge.rb
CHANGED
@@ -12,9 +12,18 @@ module Super
|
|
12
12
|
purple: "bg-purple-800 text-white",
|
13
13
|
}
|
14
14
|
|
15
|
-
def initialize(text, styles: nil)
|
15
|
+
def initialize(text, style: nil, styles: nil)
|
16
16
|
@text = text
|
17
|
-
|
17
|
+
if styles.present?
|
18
|
+
Super::Useful::Deprecation["0.22"].deprecation_warning("styles:", "use `style:` with a single style")
|
19
|
+
end
|
20
|
+
@requested_styles = Array(styles.presence).flatten + Array(style.presence).flatten
|
21
|
+
if @requested_styles.any? { |s| s.is_a?(String) }
|
22
|
+
Super::Useful::Deprecation["0.22"].warn("Super::Badge.new(text, style:) accepts exactly one Symbol style from this list #{STYLES.keys.inspect}")
|
23
|
+
end
|
24
|
+
if @requested_styles.size != 1
|
25
|
+
Super::Useful::Deprecation["0.22"].warn("Super::Badge.new(text, style:) accepts exactly one style, but it received #{@requested_styles.size}")
|
26
|
+
end
|
18
27
|
end
|
19
28
|
|
20
29
|
def styles
|
data/lib/super/cheat.rb
CHANGED
@@ -3,7 +3,12 @@
|
|
3
3
|
module Super
|
4
4
|
class Cheat
|
5
5
|
def controller
|
6
|
-
paths = %w[
|
6
|
+
paths = %w[
|
7
|
+
../../app/controllers/super/application_controller.rb
|
8
|
+
../../app/controllers/super/substructure_controller.rb
|
9
|
+
../../app/controllers/super/view_controller.rb
|
10
|
+
../../app/controllers/super/sitewide_controller.rb
|
11
|
+
]
|
7
12
|
methods =
|
8
13
|
paths
|
9
14
|
.map { |f| File.read(File.expand_path(f, __dir__)) }
|