super 0.0.0 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +10 -0
- data/LICENSE +165 -0
- data/README.md +66 -18
- data/Rakefile +3 -1
- data/app/assets/config/super_manifest.js +2 -0
- data/app/assets/javascripts/super/application.js +3618 -0
- data/app/assets/stylesheets/super/application.css +98584 -0
- data/app/controllers/super/application_controller.rb +103 -0
- data/app/helpers/super/application_helper.rb +32 -0
- data/app/views/layouts/super/application.html.erb +39 -0
- data/app/views/super/application/_flash.html.erb +17 -0
- data/app/views/super/application/_form.html.erb +17 -0
- data/app/views/super/application/_form_field__destroy.html.erb +9 -0
- data/app/views/super/application/_form_field_select.html.erb +23 -0
- data/app/views/super/application/_form_field_text.html.erb +13 -0
- data/app/views/super/application/_form_fieldset.html.erb +8 -0
- data/app/views/super/application/_form_has_many.html.erb +21 -0
- data/app/views/super/application/_form_has_one.html.erb +11 -0
- data/app/views/super/application/_form_inline_errors.html.erb +10 -0
- data/app/views/super/application/_index.html.erb +45 -0
- data/app/views/super/application/_resource_header.html.erb +16 -0
- data/app/views/super/application/_resources_header.html.erb +16 -0
- data/app/views/super/application/_show.html.erb +10 -0
- data/app/views/super/application/_super_layout.html.erb +34 -0
- data/app/views/super/application/_super_panel.html.erb +11 -0
- data/app/views/super/application/edit.html.erb +6 -0
- data/app/views/super/application/index.html.erb +6 -0
- data/app/views/super/application/new.html.erb +6 -0
- data/app/views/super/application/nothing.html.erb +0 -0
- data/app/views/super/application/show.html.erb +6 -0
- data/app/views/super/feather/README.md +32 -0
- data/app/views/super/feather/_chevron_down.svg +1 -0
- data/docs/README.md +6 -0
- data/docs/controls.md +39 -0
- data/docs/faq.md +44 -0
- data/docs/quick_start.md +45 -0
- data/docs/webpacker.md +17 -0
- data/docs/yard_customizations.rb +41 -0
- data/frontend/super-frontend/build.js +36 -0
- data/frontend/super-frontend/dist/application.css +98584 -0
- data/frontend/super-frontend/dist/application.js +3618 -0
- data/frontend/super-frontend/package.json +21 -0
- data/frontend/super-frontend/postcss.config.js +6 -0
- data/frontend/super-frontend/src/javascripts/super/application.ts +18 -0
- data/frontend/super-frontend/src/javascripts/super/apply_template_controller.ts +21 -0
- data/frontend/super-frontend/src/javascripts/super/rails__ujs.d.ts +1 -0
- data/frontend/super-frontend/src/javascripts/super/toggle_pending_destruction_controller.ts +15 -0
- data/frontend/super-frontend/src/stylesheets/super/application.css +77 -0
- data/frontend/super-frontend/tailwind.config.js +9 -0
- data/frontend/super-frontend/tsconfig.json +13 -0
- data/frontend/super-frontend/yarn.lock +5540 -0
- data/lib/generators/super/install/USAGE +34 -0
- data/lib/generators/super/install/install_generator.rb +46 -0
- data/lib/generators/super/install/templates/base_controller.rb.tt +2 -0
- data/lib/generators/super/install/templates/initializer.rb.tt +5 -0
- data/lib/generators/super/resource/USAGE +8 -0
- data/lib/generators/super/resource/resource_generator.rb +52 -0
- data/lib/generators/super/resource/templates/resources_controller.rb.tt +45 -0
- data/lib/generators/super/webpacker/USAGE +14 -0
- data/lib/generators/super/webpacker/templates/pack_super_application.js.erb.tt +2 -0
- data/lib/generators/super/webpacker/webpacker_generator.rb +25 -0
- data/lib/super.rb +22 -4
- data/lib/super/action_inquirer.rb +101 -0
- data/lib/super/assets.rb +63 -0
- data/lib/super/compatibility.rb +13 -0
- data/lib/super/configuration.rb +103 -0
- data/lib/super/controls.rb +120 -0
- data/lib/super/display.rb +9 -0
- data/lib/super/display/schema_types.rb +40 -0
- data/lib/super/engine.rb +6 -0
- data/lib/super/error.rb +18 -0
- data/lib/super/form/schema_types.rb +115 -0
- data/lib/super/layout.rb +19 -0
- data/lib/super/link.rb +87 -0
- data/lib/super/navigation/automatic.rb +71 -0
- data/lib/super/pagination.rb +70 -0
- data/lib/super/panel.rb +17 -0
- data/lib/super/partial.rb +11 -0
- data/lib/super/plugin.rb +89 -0
- data/lib/super/schema.rb +73 -0
- data/lib/super/step.rb +36 -0
- data/lib/super/version.rb +1 -1
- data/lib/super/view_helper.rb +43 -0
- metadata +215 -14
- data/LICENSE.txt +0 -40
@@ -0,0 +1,34 @@
|
|
1
|
+
Description:
|
2
|
+
Set up all required files for the Super admin framework.
|
3
|
+
|
4
|
+
Options:
|
5
|
+
--controller-namespace
|
6
|
+
This specifies the directory into which generated controllers should be
|
7
|
+
placed. This also specifies the parent controller that all Super admin
|
8
|
+
pages would inherit from (see examples). Generated controllers will
|
9
|
+
automatically inherit from the controller that is specified through this
|
10
|
+
option.
|
11
|
+
|
12
|
+
--route-namespace
|
13
|
+
Since this generator only creates one inheritable parent controller,
|
14
|
+
this option only affects the generated initializer.
|
15
|
+
|
16
|
+
Example:
|
17
|
+
rails generate super:install
|
18
|
+
|
19
|
+
This will create:
|
20
|
+
config/initializers/super.rb
|
21
|
+
app/controllers/admin_controller.rb
|
22
|
+
app/controllers/admin/.keep
|
23
|
+
|
24
|
+
This will also update your Sprockets manifest as necessary.
|
25
|
+
|
26
|
+
Example:
|
27
|
+
rails generate super:install --controller-namespace badminton
|
28
|
+
|
29
|
+
This will create:
|
30
|
+
config/initializers/super.rb
|
31
|
+
app/controllers/badminton_controller.rb
|
32
|
+
app/controllers/badminton/.keep
|
33
|
+
|
34
|
+
This will also update your Sprockets manifest as necessary.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Super
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("templates", __dir__)
|
4
|
+
|
5
|
+
class_option :controller_namespace, type: :string, default: "admin",
|
6
|
+
banner: "Specifies where to place generated admin controllers"
|
7
|
+
class_option :route_namespace, type: :string, default: "admin",
|
8
|
+
banner: "Specifies the route namespace for admin controllers"
|
9
|
+
|
10
|
+
def create_initializer
|
11
|
+
template("initializer.rb", "config/initializers/super.rb")
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_base_admin_controller
|
15
|
+
template(
|
16
|
+
"base_controller.rb",
|
17
|
+
"app/controllers/#{controller_namespace}_controller.rb",
|
18
|
+
controller_namespace: controller_namespace
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_directory_for_admin_controllers
|
23
|
+
if options["controller_namespace"].blank?
|
24
|
+
empty_directory("app/controllers")
|
25
|
+
return
|
26
|
+
end
|
27
|
+
|
28
|
+
empty_directory("app/controllers/#{controller_namespace}")
|
29
|
+
create_file("app/controllers/#{controller_namespace}/.keep", "")
|
30
|
+
end
|
31
|
+
|
32
|
+
def setup_sprockets4_manifest
|
33
|
+
append_to_file "app/assets/config/manifest.js", "//= link super_manifest.js\n"
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def controller_namespace
|
39
|
+
if options["controller_namespace"].blank?
|
40
|
+
"admin"
|
41
|
+
else
|
42
|
+
options["controller_namespace"]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Super
|
2
|
+
class ResourceGenerator < Rails::Generators::NamedBase
|
3
|
+
source_root File.expand_path("templates", __dir__)
|
4
|
+
|
5
|
+
def create_controller
|
6
|
+
controller_subdir =
|
7
|
+
if Super.configuration.controller_namespace.present?
|
8
|
+
"#{Super.configuration.controller_namespace}/"
|
9
|
+
else
|
10
|
+
""
|
11
|
+
end
|
12
|
+
|
13
|
+
template(
|
14
|
+
"resources_controller.rb",
|
15
|
+
"app/controllers/#{controller_subdir}#{file_path.pluralize}_controller.rb"
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def wrap_with_configured_module(&block)
|
22
|
+
indentation_amount =
|
23
|
+
if Super.configuration.controller_namespace.present?
|
24
|
+
2
|
25
|
+
else
|
26
|
+
0
|
27
|
+
end
|
28
|
+
|
29
|
+
inner = capture(&block)
|
30
|
+
inner = indent(inner, indentation_amount).chomp
|
31
|
+
|
32
|
+
if Super.configuration.controller_namespace.present?
|
33
|
+
concat("module #{Super.configuration.controller_namespace.camelize}\n")
|
34
|
+
end
|
35
|
+
|
36
|
+
concat(inner)
|
37
|
+
concat("\n")
|
38
|
+
|
39
|
+
if Super.configuration.controller_namespace.present?
|
40
|
+
concat("end\n")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def parent_controller_name
|
45
|
+
if Super.configuration.controller_namespace.present?
|
46
|
+
"#{Super.configuration.controller_namespace.camelize}Controller"
|
47
|
+
else
|
48
|
+
"AdminController"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
<% wrap_with_configured_module do -%>
|
2
|
+
class <%= class_name.pluralize %>Controller < <%= parent_controller_name %>
|
3
|
+
private
|
4
|
+
|
5
|
+
def new_controls
|
6
|
+
Controls.new
|
7
|
+
end
|
8
|
+
|
9
|
+
class Controls
|
10
|
+
def title
|
11
|
+
<%= class_name %>.name.pluralize
|
12
|
+
end
|
13
|
+
|
14
|
+
def model
|
15
|
+
<%= class_name %>
|
16
|
+
end
|
17
|
+
|
18
|
+
def scope(action:)
|
19
|
+
if action.read?
|
20
|
+
<%= class_name %>.all
|
21
|
+
else
|
22
|
+
<%= class_name %>.all
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def permitted_params(params, action:)
|
27
|
+
if action.create?
|
28
|
+
params.require(:<%= file_name %>).permit()
|
29
|
+
else
|
30
|
+
params.require(:<%= file_name %>).permit()
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def display_schema(action:)
|
35
|
+
Super::Schema.new(Super::Display::SchemaTypes.new) do |fields, type|
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def form_schema(action:)
|
40
|
+
Super::Schema.new(Super::Form::SchemaTypes.new) do |fields, type|
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
<% end -%>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Description:
|
2
|
+
Creates the necessary files for assets to be served under Webpacker
|
3
|
+
|
4
|
+
Webpacker support requires ERB support. There are no other dependencies.
|
5
|
+
|
6
|
+
Installing ERB on webpacker is usually done by running the command:
|
7
|
+
`rails webpacker:install:erb`
|
8
|
+
|
9
|
+
Example:
|
10
|
+
rails webpacker:install:erb # if you hadn't set up ERB already
|
11
|
+
rails generate super:install:webpacker
|
12
|
+
|
13
|
+
This will create:
|
14
|
+
app/javascript/packs/super/application.js.erb
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Super
|
2
|
+
class WebpackerGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path("templates", __dir__)
|
4
|
+
|
5
|
+
def copy_the_pack_file
|
6
|
+
template(
|
7
|
+
"pack_super_application.js.erb",
|
8
|
+
"app/javascript/packs/super/application.js.erb"
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def set_asset_handler_to_webpacker
|
13
|
+
insert_into_file(
|
14
|
+
"config/initializers/super.rb",
|
15
|
+
" c.asset_handler = Super::Assets.webpacker\n",
|
16
|
+
before: /\bend\b/
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
def remind_about_erb
|
21
|
+
say "Make sure ERB is set up for Webpacker!", :bold
|
22
|
+
say "Run if needed: rails webpacker:install:erb", :bold
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/super.rb
CHANGED
@@ -1,5 +1,23 @@
|
|
1
|
-
require "
|
1
|
+
require "active_support/concern"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require "super/action_inquirer"
|
4
|
+
require "super/assets"
|
5
|
+
require "super/compatibility"
|
6
|
+
require "super/configuration"
|
7
|
+
require "super/controls"
|
8
|
+
require "super/display"
|
9
|
+
require "super/display/schema_types"
|
10
|
+
require "super/engine"
|
11
|
+
require "super/error"
|
12
|
+
require "super/form/schema_types"
|
13
|
+
require "super/layout"
|
14
|
+
require "super/link"
|
15
|
+
require "super/navigation/automatic"
|
16
|
+
require "super/pagination"
|
17
|
+
require "super/panel"
|
18
|
+
require "super/partial"
|
19
|
+
require "super/plugin"
|
20
|
+
require "super/schema"
|
21
|
+
require "super/step"
|
22
|
+
require "super/version"
|
23
|
+
require "super/view_helper"
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Super
|
2
|
+
# ```ruby
|
3
|
+
# action = Super::ActionInquirer.new(
|
4
|
+
# Super::ActionInquirer.default_resources,
|
5
|
+
# :index
|
6
|
+
# )
|
7
|
+
#
|
8
|
+
# action.read? # => true
|
9
|
+
# action.index? # => true
|
10
|
+
# action.show? # => false
|
11
|
+
# action.write? # => false
|
12
|
+
# ```
|
13
|
+
class ActionInquirer
|
14
|
+
attr_reader :action
|
15
|
+
|
16
|
+
# @return [Hash<Symbol, Array<Symbol>>] default settings for initialization
|
17
|
+
#
|
18
|
+
def self.default_resources
|
19
|
+
{
|
20
|
+
read: %i[index show new edit],
|
21
|
+
write: %i[create update destroy],
|
22
|
+
delete: %i[destroy]
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(categories_and_their_actions, action)
|
27
|
+
@categories = categories_and_their_actions.keys.map(&:to_s)
|
28
|
+
@actions = categories_and_their_actions.values.flatten.uniq.map(&:to_s)
|
29
|
+
@actions_categories = {}
|
30
|
+
|
31
|
+
categories_and_their_actions.each do |c, actions|
|
32
|
+
c = c.to_s
|
33
|
+
|
34
|
+
actions.each do |a|
|
35
|
+
a = a.to_s
|
36
|
+
@actions_categories[a] ||= []
|
37
|
+
@actions_categories[a].push(c)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
intersection = @categories & @actions
|
42
|
+
if intersection.any?
|
43
|
+
raise Error::ActionInquirerError,
|
44
|
+
"Found shared elements between categories and actions: #{intersection.join(", ")}"
|
45
|
+
end
|
46
|
+
|
47
|
+
self.action = action
|
48
|
+
end
|
49
|
+
|
50
|
+
def action=(new_action)
|
51
|
+
new_action = new_action.to_s
|
52
|
+
if !@actions.include?(new_action)
|
53
|
+
raise Error::ActionInquirerError, "Unknown action: #{new_action}"
|
54
|
+
end
|
55
|
+
|
56
|
+
@action = new_action
|
57
|
+
end
|
58
|
+
|
59
|
+
def respond_to_missing?(method_name, *)
|
60
|
+
inquiry = parse_inquiry(method_name)
|
61
|
+
|
62
|
+
return super if !inquiry
|
63
|
+
|
64
|
+
@actions.include?(inquiry) || @categories.include?(inquiry) || super
|
65
|
+
end
|
66
|
+
|
67
|
+
def method_missing(method_name, *)
|
68
|
+
inquiry = parse_inquiry(method_name)
|
69
|
+
|
70
|
+
return super if !inquiry
|
71
|
+
|
72
|
+
if @actions.include?(inquiry)
|
73
|
+
matches_action?(inquiry)
|
74
|
+
elsif @categories.include?(inquiry)
|
75
|
+
matches_category?(inquiry)
|
76
|
+
else
|
77
|
+
super
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def parse_inquiry(method_name)
|
84
|
+
inquiry = method_name.to_s
|
85
|
+
|
86
|
+
if inquiry[-1] != "?"
|
87
|
+
return nil
|
88
|
+
end
|
89
|
+
|
90
|
+
inquiry.chomp("?")
|
91
|
+
end
|
92
|
+
|
93
|
+
def matches_action?(inquiry)
|
94
|
+
@action == inquiry
|
95
|
+
end
|
96
|
+
|
97
|
+
def matches_category?(inquiry)
|
98
|
+
@actions_categories[@action].include?(inquiry)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/super/assets.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
module Super
|
2
|
+
# Utilities for determining whether to use Sprockets or Webpacker
|
3
|
+
class Assets
|
4
|
+
def self.sprockets_available?
|
5
|
+
Gem::Dependency.new("sprockets").matching_specs.any?
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.dist(gem_name, package_name)
|
9
|
+
gem_name = gem_name.to_s
|
10
|
+
|
11
|
+
@gem_paths ||= {}
|
12
|
+
@gem_paths[gem_name] ||= Pathname.new(Gem.loaded_specs[gem_name].full_gem_path).expand_path
|
13
|
+
gem_path = @gem_paths[gem_name]
|
14
|
+
|
15
|
+
gem_path.join("frontend", package_name, "dist")
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.auto
|
19
|
+
@auto ||=
|
20
|
+
if Gem::Dependency.new("sprockets", "~> 4.0").matching_specs.any?
|
21
|
+
sprockets
|
22
|
+
elsif Gem::Dependency.new("sprockets", "~> 3.0").matching_specs.any?
|
23
|
+
sprockets
|
24
|
+
elsif Gem::Dependency.new("sprockets", "~> 2.0").matching_specs.any?
|
25
|
+
sprockets
|
26
|
+
elsif Gem::Dependency.new("webpacker", "~> 4.0").matching_specs.any?
|
27
|
+
webpacker
|
28
|
+
elsif Gem::Dependency.new("webpacker", "~> 3.0").matching_specs.any?
|
29
|
+
webpacker
|
30
|
+
else
|
31
|
+
none
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.sprockets
|
36
|
+
new(:sprockets)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.webpacker
|
40
|
+
new(:webpacker)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.none
|
44
|
+
new(:none)
|
45
|
+
end
|
46
|
+
|
47
|
+
def initialize(asset_handler)
|
48
|
+
@asset_handler = asset_handler
|
49
|
+
end
|
50
|
+
|
51
|
+
def sprockets?
|
52
|
+
@asset_handler == :sprockets
|
53
|
+
end
|
54
|
+
|
55
|
+
def webpacker?
|
56
|
+
@asset_handler == :webpacker
|
57
|
+
end
|
58
|
+
|
59
|
+
def none?
|
60
|
+
@asset_handler == :none
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|