super 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +165 -0
  3. data/README.md +102 -8
  4. data/app/assets/config/super_manifest.js +1 -0
  5. data/app/assets/javascripts/super/application.js +3483 -0
  6. data/app/assets/stylesheets/super/application.css +35265 -0
  7. data/app/controllers/super/application_controller.rb +84 -0
  8. data/app/views/layouts/super/application.html.erb +39 -0
  9. data/app/views/super/application/_form.html.erb +13 -0
  10. data/app/views/super/application/_form_field.html.erb +7 -0
  11. data/app/views/super/application/_form_generic_select.html.erb +19 -0
  12. data/app/views/super/application/_form_generic_text.html.erb +7 -0
  13. data/app/views/super/application/_index.html.erb +58 -0
  14. data/app/views/super/application/edit.html.erb +7 -0
  15. data/app/views/super/application/index.html.erb +1 -0
  16. data/app/views/super/application/new.html.erb +7 -0
  17. data/app/views/super/application/show.html.erb +10 -0
  18. data/app/views/super/feather/README.md +32 -0
  19. data/app/views/super/feather/_chevron_down.svg +1 -0
  20. data/frontend/super-frontend/build.js +34 -0
  21. data/frontend/super-frontend/dist/application.css +35265 -0
  22. data/frontend/super-frontend/dist/application.js +3483 -0
  23. data/frontend/super-frontend/package.json +14 -0
  24. data/frontend/super-frontend/postcss.config.js +6 -0
  25. data/frontend/super-frontend/src/javascripts/super/application.js +11 -0
  26. data/frontend/super-frontend/src/stylesheets/super/application.css +14 -0
  27. data/frontend/super-frontend/tailwind.config.js +7 -0
  28. data/frontend/super-frontend/yarn.lock +5355 -0
  29. data/lib/generators/super/install/USAGE +32 -0
  30. data/lib/generators/super/install/install_generator.rb +47 -0
  31. data/lib/generators/super/install/templates/base_controller.rb.tt +2 -0
  32. data/lib/generators/super/install/templates/initializer.rb.tt +5 -0
  33. data/lib/generators/super/resource/USAGE +9 -0
  34. data/lib/generators/super/resource/resource_generator.rb +54 -0
  35. data/lib/generators/super/resource/templates/resource_dashboard.rb.tt +65 -0
  36. data/lib/generators/super/resource/templates/resources_controller.rb.tt +9 -0
  37. data/lib/generators/super/webpacker/USAGE +14 -0
  38. data/lib/generators/super/webpacker/templates/pack_super_application.js.erb.tt +2 -0
  39. data/lib/generators/super/webpacker/webpacker_generator.rb +17 -0
  40. data/lib/super.rb +17 -4
  41. data/lib/super/assets.rb +62 -0
  42. data/lib/super/configuration.rb +88 -0
  43. data/lib/super/controls.rb +25 -0
  44. data/lib/super/display.rb +9 -0
  45. data/lib/super/display/schema_types.rb +41 -0
  46. data/lib/super/engine.rb +5 -0
  47. data/lib/super/error.rb +8 -0
  48. data/lib/super/form/schema_types.rb +47 -0
  49. data/lib/super/inline_callback.rb +82 -0
  50. data/lib/super/navigation/automatic.rb +69 -0
  51. data/lib/super/pagination.rb +59 -0
  52. data/lib/super/plugin.rb +89 -0
  53. data/lib/super/schema.rb +24 -0
  54. data/lib/super/test_support/fixtures/members.yml +336 -0
  55. data/lib/super/test_support/fixtures/ships.yml +10 -0
  56. data/lib/super/test_support/setup.rb +79 -0
  57. data/lib/super/test_support/starfleet_seeder.rb +49 -0
  58. data/lib/super/test_support/templates/20190216224956_create_members.rb +11 -0
  59. data/lib/super/test_support/templates/20190803143320_create_ships.rb +11 -0
  60. data/lib/super/test_support/templates/20190806014121_add_ship_to_members.rb +5 -0
  61. data/lib/super/test_support/templates/admin/members_controller.rb +9 -0
  62. data/lib/super/test_support/templates/admin/ships_controller.rb +9 -0
  63. data/lib/super/test_support/templates/admin_controller.rb +2 -0
  64. data/lib/super/test_support/templates/member.rb +16 -0
  65. data/lib/super/test_support/templates/member_dashboard.rb +90 -0
  66. data/lib/super/test_support/templates/routes.rb +10 -0
  67. data/lib/super/test_support/templates/seeds.rb +2 -0
  68. data/lib/super/test_support/templates/ship.rb +3 -0
  69. data/lib/super/test_support/templates/ship_dashboard.rb +79 -0
  70. data/lib/super/version.rb +1 -1
  71. data/lib/super/view.rb +25 -0
  72. metadata +131 -12
  73. data/LICENSE.txt +0 -40
@@ -0,0 +1,32 @@
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
+ app/super/.keep
24
+
25
+ Example:
26
+ rails generate super:install --controller-namespace badminton
27
+
28
+ This will create:
29
+ config/initializers/super.rb
30
+ app/controllers/badminton_controller.rb
31
+ app/controllers/badminton/.keep
32
+ app/super/.keep
@@ -0,0 +1,47 @@
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 create_directory_for_dashboards_slash_setup
33
+ empty_directory("app/super")
34
+ create_file("app/super/.keep", "")
35
+ end
36
+
37
+ private
38
+
39
+ def controller_namespace
40
+ if options["controller_namespace"].blank?
41
+ "admin"
42
+ else
43
+ options["controller_namespace"]
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,2 @@
1
+ class <%= config[:controller_namespace].classify %>Controller < Super::ApplicationController
2
+ end
@@ -0,0 +1,5 @@
1
+ Super.configuration do |c|
2
+ c.title = "My Admin Site"
3
+ c.controller_namespace = "<%= options["controller_namespace"] %>"
4
+ c.route_namespace = "<%= options["route_namespace"] %>"
5
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Creates a controller and its respective "control".
3
+
4
+ Example:
5
+ rails generate super:resource Thing
6
+
7
+ This will create:
8
+ app/controllers/admin/things_controller.rb
9
+ app/controls/thing_controls.rb
@@ -0,0 +1,54 @@
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
+
18
+ template("resource_dashboard.rb", "app/super/#{file_path}_dashboard.rb")
19
+ end
20
+
21
+ private
22
+
23
+ def wrap_with_configured_module(&block)
24
+ indentation_amount =
25
+ if Super.configuration.controller_namespace.present?
26
+ 2
27
+ else
28
+ 0
29
+ end
30
+
31
+ inner = capture(&block)
32
+ inner = indent(inner, indentation_amount).chomp
33
+
34
+ if Super.configuration.controller_namespace.present?
35
+ concat("module #{Super.configuration.controller_namespace.camelize}\n")
36
+ end
37
+
38
+ concat(inner)
39
+ concat("\n")
40
+
41
+ if Super.configuration.controller_namespace.present?
42
+ concat("end\n")
43
+ end
44
+ end
45
+
46
+ def parent_controller_name
47
+ if Super.configuration.controller_namespace.present?
48
+ "#{Super.configuration.controller_namespace.camelize}Controller"
49
+ else
50
+ "AdminController"
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,65 @@
1
+ class <%= class_name %>Dashboard
2
+ def title
3
+ <%= class_name %>.name.pluralize
4
+ end
5
+
6
+ def model
7
+ <%= class_name %>
8
+ end
9
+
10
+ def index_scope
11
+ <%= class_name %>.all
12
+ end
13
+
14
+ def index_schema
15
+ Super::Schema.new(Super::Display::SchemaTypes.new) do |fields, type|
16
+ end
17
+ end
18
+
19
+ def create_scope
20
+ <%= class_name %>.all
21
+ end
22
+
23
+ def create_permitted_params(params)
24
+ params.require(:<%= file_name %>).permit()
25
+ end
26
+
27
+ def new_scope
28
+ <%= class_name %>.all
29
+ end
30
+
31
+ def new_schema
32
+ Super::Schema.new(Super::Form::SchemaTypes.new) do |fields, type|
33
+ end
34
+ end
35
+
36
+ def edit_scope
37
+ <%= class_name %>.all
38
+ end
39
+
40
+ def edit_schema
41
+ Super::Schema.new(Super::Form::SchemaTypes.new) do |fields, type|
42
+ end
43
+ end
44
+
45
+ def show_scope
46
+ <%= class_name %>.all
47
+ end
48
+
49
+ def show_schema
50
+ Super::Schema.new(Super::Display::SchemaTypes.new) do |fields, type|
51
+ end
52
+ end
53
+
54
+ def update_scope
55
+ <%= class_name %>.all
56
+ end
57
+
58
+ def update_permitted_params(params)
59
+ params.require(:<%= file_name %>).permit()
60
+ end
61
+
62
+ def destroy_scope
63
+ <%= class_name %>.all
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ <% wrap_with_configured_module do -%>
2
+ class <%= class_name.pluralize %>Controller < <%= parent_controller_name %>
3
+ private
4
+
5
+ def dashboard
6
+ <%= class_name %>Dashboard.new
7
+ end
8
+ end
9
+ <% 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,2 @@
1
+ import Super from "<%%= Super::Assets.dist("super", "super-frontend").join("application") %>";
2
+ import "<%%= Super::Assets.dist("super", "super-frontend").join("application.css") %>";
@@ -0,0 +1,17 @@
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 remind_about_erb
13
+ say "Make sure ERB is set up for Webpacker!", :bold
14
+ say "Run if needed: rails webpacker:install:erb", :bold
15
+ end
16
+ end
17
+ end
data/lib/super.rb CHANGED
@@ -1,5 +1,18 @@
1
- require "super/engine"
1
+ require "tsort"
2
+ require "active_support/concern"
2
3
 
3
- module Super
4
- # Your code goes here...
5
- end
4
+ require "super/assets"
5
+ require "super/configuration"
6
+ require "super/controls"
7
+ require "super/engine"
8
+ require "super/error"
9
+ require "super/display"
10
+ require "super/display/schema_types"
11
+ require "super/form/schema_types"
12
+ require "super/inline_callback"
13
+ require "super/navigation/automatic"
14
+ require "super/pagination"
15
+ require "super/plugin"
16
+ require "super/schema"
17
+ require "super/version"
18
+ require "super/view"
@@ -0,0 +1,62 @@
1
+ module Super
2
+ class Assets
3
+ def self.sprockets_available?
4
+ Gem::Dependency.new("sprockets").matching_specs.any?
5
+ end
6
+
7
+ def self.dist(gem_name, package_name)
8
+ gem_name = gem_name.to_s
9
+
10
+ @gem_paths ||= {}
11
+ @gem_paths[gem_name] ||= Pathname.new(Gem.loaded_specs[gem_name].full_gem_path).expand_path
12
+ gem_path = @gem_paths[gem_name]
13
+
14
+ gem_path.join("frontend", package_name, "dist")
15
+ end
16
+
17
+ def self.auto
18
+ @auto ||=
19
+ if Gem::Dependency.new("sprockets", "~> 4.0").matching_specs.any?
20
+ sprockets
21
+ elsif Gem::Dependency.new("sprockets", "~> 3.0").matching_specs.any?
22
+ sprockets
23
+ elsif Gem::Dependency.new("sprockets", "~> 2.0").matching_specs.any?
24
+ sprockets
25
+ elsif Gem::Dependency.new("webpacker", "~> 4.0").matching_specs.any?
26
+ webpacker
27
+ elsif Gem::Dependency.new("webpacker", "~> 3.0").matching_specs.any?
28
+ webpacker
29
+ else
30
+ none
31
+ end
32
+ end
33
+
34
+ def self.sprockets
35
+ new(:sprockets)
36
+ end
37
+
38
+ def self.webpacker
39
+ new(:webpacker)
40
+ end
41
+
42
+ def self.none
43
+ new(:none)
44
+ end
45
+
46
+ def initialize(asset_handler)
47
+ @asset_handler = asset_handler
48
+ end
49
+
50
+ def sprockets?
51
+ @asset_handler == :sprockets
52
+ end
53
+
54
+ def webpacker?
55
+ @asset_handler == :webpacker
56
+ end
57
+
58
+ def none?
59
+ @asset_handler == :none
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,88 @@
1
+ module Super
2
+ def self.configuration
3
+ @configuration ||= Configuration.new
4
+
5
+ if block_given?
6
+ yield(@configuration)
7
+ end
8
+
9
+ @configuration
10
+ end
11
+
12
+ module ConfigurationLogic
13
+ def self.included(base)
14
+ base.extend(ClassMethods)
15
+ end
16
+
17
+ def initialize
18
+ self.class.defaults.each do |key, value|
19
+ if value.respond_to?(:call)
20
+ value = value.call
21
+ end
22
+
23
+ public_send("#{key}=", value)
24
+ end
25
+ end
26
+
27
+ def configured?(attr)
28
+ instance_variable_defined?("@#{attr}")
29
+ end
30
+
31
+ module ClassMethods
32
+ def defaults
33
+ @defaults ||= {}
34
+ end
35
+
36
+ def wraps
37
+ @wraps ||= {}
38
+ end
39
+
40
+ def configure(attr, wrap: nil, enum: nil, **kwargs)
41
+ if kwargs.key?(:default)
42
+ defaults[attr] = kwargs[:default]
43
+ end
44
+
45
+ define_method(attr) do
46
+ if !configured?(attr)
47
+ raise Error::UnconfiguredConfiguration, "unconfigured: #{attr}"
48
+ end
49
+
50
+ result = instance_variable_get("@#{attr}")
51
+
52
+ if wrap.nil?
53
+ result
54
+ else
55
+ wrap.call(result)
56
+ end
57
+ end
58
+
59
+ define_method("#{attr}=") do |value|
60
+ if enum.is_a?(Array)
61
+ if !enum.include?(value)
62
+ raise Error::InvalidConfiguration,
63
+ "tried to set `#{attr}` to `#{value.inspect}`, " \
64
+ "expected: #{enum.join(", ")}"
65
+ end
66
+ end
67
+
68
+ instance_variable_set("@#{attr}", value)
69
+ value
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ class Configuration
76
+ include ConfigurationLogic
77
+
78
+ configure :title
79
+ configure :index_resources_per_page, default: 20
80
+ configure :controller_namespace, default: "admin"
81
+ configure :route_namespace, default: :admin, wrap: -> (val) { [val].flatten }
82
+ configure :asset_handler, default: -> { Super::Assets.auto }
83
+
84
+ def path_parts(*parts)
85
+ route_namespace + parts
86
+ end
87
+ end
88
+ end