super 0.0.0 → 0.0.1

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.
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