super 0.0.6 → 0.0.7
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 +12 -6
- data/app/controllers/super/application_controller.rb +6 -3
- data/app/views/super/application/_filter.html.erb +14 -0
- data/app/views/super/application/_filter_type_select.html.erb +31 -0
- data/app/views/super/application/_filter_type_text.html.erb +22 -0
- data/app/views/super/application/_filter_type_timestamp.html.erb +35 -0
- data/app/views/super/application/_super_layout.html.erb +5 -5
- data/app/views/super/application/_super_pagination.html.erb +16 -0
- data/app/views/super/application/_super_panel.html.erb +1 -1
- data/app/views/super/application/_super_schema_display_index.html.erb +8 -23
- data/app/views/super/application/_super_schema_display_show.html.erb +1 -1
- data/app/views/super/application/edit.html.erb +1 -6
- data/app/views/super/application/index.html.erb +1 -6
- data/app/views/super/application/new.html.erb +1 -6
- data/app/views/super/application/show.html.erb +1 -6
- data/lib/super.rb +8 -2
- data/lib/super/compatibility.rb +13 -1
- data/lib/super/configuration.rb +7 -0
- data/lib/super/controls/optional.rb +0 -11
- data/lib/super/controls/steps.rb +44 -31
- data/lib/super/display/schema_types.rb +31 -1
- data/lib/super/engine.rb +6 -0
- data/lib/super/filter.rb +137 -0
- data/lib/super/filter/operator.rb +103 -0
- data/lib/super/filter/schema_types.rb +118 -0
- data/lib/super/pagination.rb +61 -0
- data/lib/super/partial.rb +12 -0
- data/lib/super/plugin.rb +34 -63
- data/lib/super/schema.rb +1 -0
- data/lib/super/version.rb +1 -1
- data/lib/super/view_helper.rb +1 -1
- metadata +25 -4
- data/app/helpers/super/application_helper.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8e7ba2e6b5845517d94684e487bdfed0779dcade517e3e3e89bff55fee6f258
|
4
|
+
data.tar.gz: 62e2a405ed8d99a95de077babfdc9eb3b654d651b1887e8776d1dba609058f8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76bd34e08d34ea8797f0ed197b062a6be056247204a5f6badfea5a82f119c196d37b04a65ad2b1f25535885c013a1ebed7175399090078888cc528b997b57371
|
7
|
+
data.tar.gz: 5933d518932ea142b70aa5ac3c844d497a5bea951ee7bd72ad1a128fabc911212e2c09b63857900b2eec881a97f28aff5682b6e5c9457a25f2d0dba431887900
|
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Super
|
2
2
|
|
3
3
|
Super is an admin framework for Ruby on Rails applications. Super helps you make
|
4
|
-
powerful admin pages quickly
|
4
|
+
powerful admin pages quickly so that you can concentrate on the parts of your
|
5
|
+
app that make it great.
|
5
6
|
|
6
7
|
Super strives to let engineers build great admin pages quickly and easily by:
|
7
8
|
|
@@ -57,16 +58,21 @@ as ActiveAdmin, but it's nice and feels like developing a normal Rails app.
|
|
57
58
|
There's no DSL.
|
58
59
|
|
59
60
|
|
60
|
-
##
|
61
|
+
## Paid editions
|
61
62
|
|
62
|
-
|
63
|
+
If you have additional requirements, there are some paid editions to consider:
|
64
|
+
|
65
|
+
**Super Premium** provides:
|
63
66
|
|
64
|
-
* Productivity improvements and quality of life features for admins
|
65
67
|
* Priority email support
|
66
|
-
*
|
68
|
+
* Ensuring long term development of Super
|
69
|
+
|
70
|
+
**Super Professional** provides everything in Premium and:
|
71
|
+
|
72
|
+
* Productivity improvements and quality of life features for admins
|
67
73
|
* An LGPL exemption
|
68
74
|
|
69
|
-
|
75
|
+
They aren't available yet. Contact me if you're interested, or subscribe to the
|
70
76
|
[newsletter][newsletter] to be notified of its availability and for brief,
|
71
77
|
occasional updates to Super.
|
72
78
|
|
@@ -2,7 +2,6 @@ module Super
|
|
2
2
|
# Provides a default implementation for each of the resourceful actions
|
3
3
|
class ApplicationController < ActionController::Base
|
4
4
|
include ClientError::Handling
|
5
|
-
include Pluggable.new(:super_application_controller)
|
6
5
|
|
7
6
|
helper_method :action_inquirer
|
8
7
|
helper_method :controls
|
@@ -10,21 +9,22 @@ module Super
|
|
10
9
|
# Displays a list of records to the user
|
11
10
|
def index
|
12
11
|
@records = controls.load_records(action: action_inquirer, params: params)
|
13
|
-
@pagination = controls.initialize_pagination(action: action_inquirer, records: @records, query_params: request.GET)
|
14
|
-
@records = controls.paginate_records(action: action_inquirer, records: @records, pagination: @pagination)
|
15
12
|
@display = controls.display_schema(action: action_inquirer)
|
13
|
+
@view = controls.build_index_view
|
16
14
|
end
|
17
15
|
|
18
16
|
# Displays a specific record to the user
|
19
17
|
def show
|
20
18
|
@record = controls.load_record(action: action_inquirer, params: params)
|
21
19
|
@display = controls.display_schema(action: action_inquirer)
|
20
|
+
@view = controls.build_show_view
|
22
21
|
end
|
23
22
|
|
24
23
|
# Displays a form to allow the user to create a new record
|
25
24
|
def new
|
26
25
|
@record = controls.build_record(action: action_inquirer)
|
27
26
|
@form = controls.form_schema(action: action_inquirer)
|
27
|
+
@view = controls.build_new_view
|
28
28
|
end
|
29
29
|
|
30
30
|
# Creates a record, or shows the validation errors
|
@@ -35,6 +35,7 @@ module Super
|
|
35
35
|
redirect_to polymorphic_path(Super.configuration.path_parts(@record))
|
36
36
|
else
|
37
37
|
@form = controls.form_schema(action: action_inquirer_for("new"))
|
38
|
+
@view = controls.build_new_view
|
38
39
|
render :new, status: :bad_request
|
39
40
|
end
|
40
41
|
end
|
@@ -43,6 +44,7 @@ module Super
|
|
43
44
|
def edit
|
44
45
|
@record = controls.load_record(action: action_inquirer, params: params)
|
45
46
|
@form = controls.form_schema(action: action_inquirer)
|
47
|
+
@view = controls.build_edit_view
|
46
48
|
end
|
47
49
|
|
48
50
|
# Updates a record, or shows validation errors
|
@@ -53,6 +55,7 @@ module Super
|
|
53
55
|
redirect_to polymorphic_path(Super.configuration.path_parts(@record))
|
54
56
|
else
|
55
57
|
@form = controls.form_schema(action: action_inquirer_for("edit"))
|
58
|
+
@view = controls.build_edit_view
|
56
59
|
render :edit, status: :bad_request
|
57
60
|
end
|
58
61
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%= render(Super::Panel.new) do %>
|
2
|
+
<h1 class="text-xl">Filters</h1>
|
3
|
+
<%= form_for(filter, url: filter.url, method: :get, as: :q, html: { class: "mt-4" }) do |form| %>
|
4
|
+
<% filter.each_field do |filter_field| %>
|
5
|
+
<div class="mt-4">
|
6
|
+
<%= render(filter_field, form: form) %>
|
7
|
+
</div>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<div>
|
11
|
+
<%= form.submit "Filter", class: "super-button super-button--border-gray mt-6" %>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<div class="super-field-group">
|
2
|
+
<%= form.fields_for(filter_type_select.field_name, filter_type_select) do |form_field| %>
|
3
|
+
<%= form_field.label(:q, filter_type_select.humanized_field_name) %>
|
4
|
+
<div class="super-input-select inline-block">
|
5
|
+
<%= form_field.select(
|
6
|
+
:op,
|
7
|
+
filter_type_select.operators,
|
8
|
+
{},
|
9
|
+
{ class: "super-input super-input-select-field" }
|
10
|
+
) %>
|
11
|
+
<div class="super-input-select-icon text-gray-700">
|
12
|
+
<span class="h-4 w-4">
|
13
|
+
<%= render "super/feather/chevron_down" %>
|
14
|
+
</span>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="super-input-select mt-3">
|
18
|
+
<%= form_field.select(
|
19
|
+
:q,
|
20
|
+
filter_type_select.field_type.collection,
|
21
|
+
{ include_blank: true },
|
22
|
+
{ class: "super-input super-input-select-field" }
|
23
|
+
) %>
|
24
|
+
<div class="super-input-select-icon text-gray-700">
|
25
|
+
<span class="h-4 w-4">
|
26
|
+
<%= render "super/feather/chevron_down" %>
|
27
|
+
</span>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
<% end %>
|
31
|
+
</div>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<div class="super-field-group">
|
2
|
+
<%= form.fields_for(filter_type_text.field_name, filter_type_text) do |form_field| %>
|
3
|
+
<%= form_field.label(:q, filter_type_text.humanized_field_name) %>
|
4
|
+
<div class="relative inline-block">
|
5
|
+
<%= form_field.select(
|
6
|
+
:op,
|
7
|
+
filter_type_text.operators,
|
8
|
+
{},
|
9
|
+
{ class: "super-input super-input-select-field" }
|
10
|
+
) %>
|
11
|
+
<div class="super-input-select-icon text-gray-700">
|
12
|
+
<span class="h-4 w-4">
|
13
|
+
<%= render "super/feather/chevron_down" %>
|
14
|
+
</span>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<%= form_field.text_field(
|
18
|
+
:q,
|
19
|
+
class: "super-input w-full mt-3"
|
20
|
+
) %>
|
21
|
+
<% end %>
|
22
|
+
</div>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<div class="super-field-group">
|
2
|
+
<%= form.fields_for(filter_type_timestamp.field_name, filter_type_timestamp) do |form_field| %>
|
3
|
+
<%= form_field.label(:q0, filter_type_timestamp.humanized_field_name) %>
|
4
|
+
<div class="relative inline-block mt-2">
|
5
|
+
<%= form_field.select(
|
6
|
+
:op,
|
7
|
+
filter_type_timestamp.operators,
|
8
|
+
{},
|
9
|
+
{ class: "super-input super-input-select-field" }
|
10
|
+
) %>
|
11
|
+
<div class="super-input-select-icon text-gray-700">
|
12
|
+
<span class="h-4 w-4">
|
13
|
+
<%= render "super/feather/chevron_down" %>
|
14
|
+
</span>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
<div class="flex items-center mt-3">
|
18
|
+
<div class="flex-initial">
|
19
|
+
<%= form_field.text_field(
|
20
|
+
:q0,
|
21
|
+
class: "super-input w-full"
|
22
|
+
) %>
|
23
|
+
</div>
|
24
|
+
<div class="flex-initial px-2">
|
25
|
+
–
|
26
|
+
</div>
|
27
|
+
<div class="flex-initial">
|
28
|
+
<%= form_field.text_field(
|
29
|
+
:q1,
|
30
|
+
class: "super-input w-full"
|
31
|
+
) %>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
<% end %>
|
35
|
+
</div>
|
@@ -1,29 +1,29 @@
|
|
1
1
|
<% super_layout.resolve(self) %>
|
2
2
|
|
3
3
|
<% super_layout.resolved_headers.each do |partial| %>
|
4
|
-
<%=
|
4
|
+
<%= Super::Partial.render(partial, template: self) %>
|
5
5
|
<% end %>
|
6
6
|
|
7
7
|
<% if super_layout.resolved_asides.empty? %>
|
8
8
|
<% super_layout.resolved_mains.each do |partial| %>
|
9
|
-
<%=
|
9
|
+
<%= Super::Partial.render(partial, template: self) %>
|
10
10
|
<% end %>
|
11
11
|
<% else %>
|
12
12
|
<div class="clearfix -mx-2">
|
13
13
|
<div class="md:float-left md:w-9/12 px-2">
|
14
14
|
<% super_layout.resolved_mains.each do |partial| %>
|
15
|
-
<%=
|
15
|
+
<%= Super::Partial.render(partial, template: self) %>
|
16
16
|
<% end %>
|
17
17
|
</div>
|
18
18
|
|
19
19
|
<div class="md:float-right md:w-3/12 px-2">
|
20
20
|
<% super_layout.resolved_asides.each do |partial| %>
|
21
|
-
<%=
|
21
|
+
<%= Super::Partial.render(partial, template: self) %>
|
22
22
|
<% end %>
|
23
23
|
</div>
|
24
24
|
</div>
|
25
25
|
<% end %>
|
26
26
|
|
27
27
|
<% super_layout.resolved_footers.each do |partial| %>
|
28
|
-
<%=
|
28
|
+
<%= Super::Partial.render(partial, template: self) %>
|
29
29
|
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if @pagination.necessary? %>
|
2
|
+
<div class="flex justify-end mr-2">
|
3
|
+
<div class="mt-4">
|
4
|
+
<% @pagination.each do |page_query_params, is_current_page, display| %>
|
5
|
+
<%= link_to(
|
6
|
+
display,
|
7
|
+
polymorphic_path(
|
8
|
+
Super.configuration.path_parts(controls.model),
|
9
|
+
page_query_params
|
10
|
+
),
|
11
|
+
class: "inline-block ml-2 text-lg #{is_current_page ? " text-gray-900" : ""}"
|
12
|
+
) %>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% if super_panel.resolve(self, block_given? ? Proc.new : nil).resolved_parts.any? %>
|
2
2
|
<div class="border rounded shadow border-gray-400 bg-white px-5 pt-4 pb-8 mt-6">
|
3
3
|
<% super_panel.resolved_parts.each do |partial| %>
|
4
|
-
<%=
|
4
|
+
<%= Super::Partial.render(partial, template: self) %>
|
5
5
|
<% end %>
|
6
6
|
</div>
|
7
7
|
<% end %>
|
@@ -1,9 +1,11 @@
|
|
1
|
-
<div class="mt-4 overflow-x-auto">
|
2
|
-
<table class="w-full border-separate" cellspacing="0" cellpadding="0">
|
3
|
-
<thead>
|
1
|
+
<div class="mt-4 overflow-x-auto lg:overflow-x-visible">
|
2
|
+
<table class="w-full border-separate relative" cellspacing="0" cellpadding="0">
|
3
|
+
<thead class="">
|
4
4
|
<tr class="">
|
5
5
|
<% super_schema_display_index.field_keys.each do |column| %>
|
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
|
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 sticky top-0 z-10">
|
7
|
+
<%= controls.model.human_attribute_name(column) %>
|
8
|
+
</th>
|
7
9
|
<% end %>
|
8
10
|
</tr>
|
9
11
|
</thead>
|
@@ -11,8 +13,8 @@
|
|
11
13
|
<% @records.each.with_index do |record, row_index| %>
|
12
14
|
<tr id="record-pk-<%= record.id %>" class="group">
|
13
15
|
<% super_schema_display_index.field_keys.each do |column| %>
|
14
|
-
<td class="py-1 px-2 first:pl-5 border-transparent border-t border-b group-hover:bg-blue-200 first:border-l first:rounded-l-lg last:border-r last:rounded-r-lg <%= Super::ViewHelper.classes(["bg-gray-100", row_index.odd?]) %>">
|
15
|
-
<%=
|
16
|
+
<td class="py-1 px-2 first:pl-5 border-transparent border-t border-b group-hover:bg-blue-200 first:border-l first:rounded-l-lg last:border-r last:rounded-r-lg bg-white <%= Super::ViewHelper.classes(["bg-gray-100", row_index.odd?]) %>">
|
17
|
+
<%= super_schema_display_index.schema_type.render_field(template: self, record: record, column: column) %>
|
16
18
|
</td>
|
17
19
|
<% end %>
|
18
20
|
</tr>
|
@@ -20,20 +22,3 @@
|
|
20
22
|
</tbody>
|
21
23
|
</table>
|
22
24
|
</div>
|
23
|
-
|
24
|
-
<% if @pagination.necessary? %>
|
25
|
-
<div class="flex justify-end mr-2">
|
26
|
-
<div class="mt-4">
|
27
|
-
<% @pagination.each do |page_query_params, is_current_page, display| %>
|
28
|
-
<%= link_to(
|
29
|
-
display,
|
30
|
-
polymorphic_path(
|
31
|
-
Super.configuration.path_parts(controls.model),
|
32
|
-
page_query_params
|
33
|
-
),
|
34
|
-
class: "inline-block ml-2 text-lg #{is_current_page ? " text-gray-900" : ""}"
|
35
|
-
) %>
|
36
|
-
<% end %>
|
37
|
-
</div>
|
38
|
-
</div>
|
39
|
-
<% end %>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<% super_schema_display_show.field_keys.each do |column| %>
|
3
3
|
<tr>
|
4
4
|
<th class="text-right px-4"><%= column.to_s.humanize %></th>
|
5
|
-
<td><%=
|
5
|
+
<td><%= super_schema_display_show.schema_type.render_field(template: self, record: @record, column: column) %></td>
|
6
6
|
</tr>
|
7
7
|
<% end %>
|
8
8
|
</table>
|
data/lib/super.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
require "
|
1
|
+
require "tsort"
|
2
|
+
|
3
|
+
require "rails/engine"
|
2
4
|
|
3
5
|
require "super/action_inquirer"
|
4
6
|
require "super/assets"
|
@@ -7,8 +9,10 @@ require "super/compatibility"
|
|
7
9
|
require "super/configuration"
|
8
10
|
require "super/controls"
|
9
11
|
require "super/display/schema_types"
|
10
|
-
require "super/engine"
|
11
12
|
require "super/error"
|
13
|
+
require "super/filter"
|
14
|
+
require "super/filter/operator"
|
15
|
+
require "super/filter/schema_types"
|
12
16
|
require "super/form"
|
13
17
|
require "super/form/schema_types"
|
14
18
|
require "super/layout"
|
@@ -21,3 +25,5 @@ require "super/plugin"
|
|
21
25
|
require "super/schema"
|
22
26
|
require "super/version"
|
23
27
|
require "super/view_helper"
|
28
|
+
|
29
|
+
require "super/engine"
|
data/lib/super/compatibility.rb
CHANGED
@@ -2,12 +2,24 @@ module Super
|
|
2
2
|
module Compatability
|
3
3
|
module_function
|
4
4
|
|
5
|
-
|
5
|
+
# Rails 5.1 and after lets you find field errors using either a string or a
|
6
|
+
# symbol.
|
7
|
+
def errable_fields(field)
|
6
8
|
if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 0
|
7
9
|
[field.to_s, field.to_sym]
|
8
10
|
else
|
9
11
|
field
|
10
12
|
end
|
11
13
|
end
|
14
|
+
|
15
|
+
def sanitize_sql_like(query)
|
16
|
+
if ActiveRecord::VERSION::MAJOR == 4
|
17
|
+
ActiveRecord::Base.send(:sanitize_sql_like, query)
|
18
|
+
elsif ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR <= 1
|
19
|
+
ActiveRecord::Base.send(:sanitize_sql_like, query)
|
20
|
+
else
|
21
|
+
ActiveRecord::Base.sanitize_sql_like(query)
|
22
|
+
end
|
23
|
+
end
|
12
24
|
end
|
13
25
|
end
|
data/lib/super/configuration.rb
CHANGED
@@ -32,6 +32,9 @@ module Super
|
|
32
32
|
|
33
33
|
public_send("#{key}=", value)
|
34
34
|
end
|
35
|
+
|
36
|
+
Plugin::Registry.controller.use(prepend: Super::Filter::ControllerMethods)
|
37
|
+
Plugin::Registry.controller.use(prepend: Super::Pagination::ControllerMethods)
|
35
38
|
end
|
36
39
|
|
37
40
|
def configured?(attr)
|
@@ -95,6 +98,10 @@ module Super
|
|
95
98
|
# @!attribute [rw]
|
96
99
|
configure :asset_handler, default: -> { Super::Assets.auto }
|
97
100
|
|
101
|
+
def controller_plugins
|
102
|
+
Plugin::Registry.controller
|
103
|
+
end
|
104
|
+
|
98
105
|
# @api private
|
99
106
|
def path_parts(*parts)
|
100
107
|
route_namespace + parts
|
@@ -49,17 +49,6 @@ module Super
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
|
-
|
53
|
-
# Specifies how many records to show per page
|
54
|
-
#
|
55
|
-
# @param action [ActionInquirer]
|
56
|
-
# @param query_params [Hash]
|
57
|
-
# @return [ActiveRecord::Relation]
|
58
|
-
def records_per_page(action:, query_params:)
|
59
|
-
default_for(:records_per_page, action: action, query_params: query_params) do
|
60
|
-
Super.configuration.index_records_per_page
|
61
|
-
end
|
62
|
-
end
|
63
52
|
end
|
64
53
|
end
|
65
54
|
end
|