super 0.0.7 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +0 -6
  3. data/CONTRIBUTING.md +56 -0
  4. data/README.md +49 -61
  5. data/Rakefile +16 -14
  6. data/app/assets/javascripts/super/application.js +297 -97
  7. data/app/assets/stylesheets/super/application.css +5600 -0
  8. data/app/controllers/super/application_controller.rb +20 -14
  9. data/app/helpers/super/form_builder_helper.rb +25 -0
  10. data/app/views/layouts/super/application.html.erb +23 -9
  11. data/app/views/super/application/{_super_schema_display_actions.html.erb → _display_actions.html.erb} +0 -0
  12. data/app/views/super/application/{_super_schema_display_index.html.erb → _display_index.html.erb} +6 -6
  13. data/app/views/super/application/_display_rich_text.html.erb +1 -0
  14. data/app/views/super/application/_display_show.html.erb +8 -0
  15. data/app/views/super/application/_filter.html.erb +5 -13
  16. data/app/views/super/application/_filter_type_select.html.erb +9 -19
  17. data/app/views/super/application/_filter_type_text.html.erb +7 -11
  18. data/app/views/super/application/_filter_type_timestamp.html.erb +6 -17
  19. data/app/views/super/application/_form.html.erb +15 -0
  20. data/app/views/super/application/_form_field__destroy.html.erb +1 -9
  21. data/app/views/super/application/_form_field_checkbox.html.erb +1 -0
  22. data/app/views/super/application/_form_field_rich_text_area.html.erb +1 -0
  23. data/app/views/super/application/_form_field_select.html.erb +1 -23
  24. data/app/views/super/application/_form_field_text.html.erb +1 -13
  25. data/app/views/super/application/{_super_layout.html.erb → _layout.html.erb} +7 -7
  26. data/app/views/super/application/{_super_pagination.html.erb → _pagination.html.erb} +1 -1
  27. data/app/views/super/application/{_super_panel.html.erb → _panel.html.erb} +2 -2
  28. data/app/views/super/application/_query.html.erb +18 -0
  29. data/app/views/super/application/_sort.html.erb +18 -0
  30. data/app/views/super/application/_sort_expression.html.erb +25 -0
  31. data/app/views/super/application/edit.html.erb +1 -0
  32. data/app/views/super/application/index.html.erb +1 -0
  33. data/app/views/super/application/new.html.erb +1 -0
  34. data/app/views/super/application/show.html.erb +1 -0
  35. data/app/views/super/feather/README.md +1 -0
  36. data/app/views/super/feather/_x.html +15 -0
  37. data/config/routes.rb +2 -0
  38. data/docs/cheat.md +8 -8
  39. data/frontend/super-frontend/dist/application.css +5600 -0
  40. data/frontend/super-frontend/dist/application.js +297 -97
  41. data/lib/generators/super/action_text/USAGE +23 -0
  42. data/lib/generators/super/action_text/action_text_generator.rb +32 -0
  43. data/lib/generators/super/action_text/templates/pack_super_action_text.css +23 -0
  44. data/lib/generators/super/action_text/templates/pack_super_action_text.js +4 -0
  45. data/lib/generators/super/install/install_generator.rb +18 -7
  46. data/lib/generators/super/install/templates/base_controller.rb.tt +9 -1
  47. data/lib/generators/super/install/templates/initializer.rb.tt +9 -2
  48. data/lib/generators/super/resource/resource_generator.rb +107 -30
  49. data/lib/generators/super/resource/templates/resources_controller.rb.tt +3 -39
  50. data/lib/generators/super/webpacker/USAGE +5 -4
  51. data/lib/generators/super/webpacker/webpacker_generator.rb +5 -2
  52. data/lib/super.rb +17 -0
  53. data/lib/super/action_inquirer.rb +2 -0
  54. data/lib/super/assets.rb +114 -38
  55. data/lib/super/client_error.rb +2 -0
  56. data/lib/super/compatibility.rb +2 -0
  57. data/lib/super/configuration.rb +16 -79
  58. data/lib/super/controls.rb +11 -25
  59. data/lib/super/controls/optional.rb +75 -16
  60. data/lib/super/controls/steps.rb +36 -58
  61. data/lib/super/controls/view.rb +55 -0
  62. data/lib/super/display.rb +88 -0
  63. data/lib/super/display/guesser.rb +36 -0
  64. data/lib/super/display/schema_types.rb +80 -78
  65. data/lib/super/engine.rb +5 -1
  66. data/lib/super/error.rb +21 -0
  67. data/lib/super/filter.rb +7 -130
  68. data/lib/super/filter/form_object.rb +94 -0
  69. data/lib/super/filter/guesser.rb +32 -0
  70. data/lib/super/filter/operator.rb +2 -0
  71. data/lib/super/filter/schema_types.rb +3 -7
  72. data/lib/super/form.rb +29 -40
  73. data/lib/super/form/builder.rb +206 -0
  74. data/lib/super/form/guesser.rb +29 -0
  75. data/lib/super/form/inline_errors.rb +28 -0
  76. data/lib/super/form/schema_types.rb +31 -29
  77. data/lib/super/form/strong_params.rb +31 -0
  78. data/lib/super/layout.rb +3 -1
  79. data/lib/super/link.rb +7 -0
  80. data/lib/super/navigation/automatic.rb +4 -2
  81. data/lib/super/pagination.rb +13 -17
  82. data/lib/super/panel.rb +3 -1
  83. data/lib/super/partial.rb +2 -0
  84. data/lib/super/partial/resolving.rb +2 -0
  85. data/lib/super/plugin.rb +2 -0
  86. data/lib/super/query/form_object.rb +48 -0
  87. data/lib/super/schema.rb +2 -25
  88. data/lib/super/schema/common.rb +27 -0
  89. data/lib/super/schema/guesser.rb +79 -0
  90. data/lib/super/sort.rb +110 -0
  91. data/lib/super/useful/builder.rb +25 -0
  92. data/lib/super/useful/enum.rb +63 -0
  93. data/lib/super/version.rb +3 -1
  94. data/lib/super/view_helper.rb +2 -19
  95. metadata +63 -34
  96. data/app/views/super/application/_form_inline_errors.html.erb +0 -10
  97. data/app/views/super/application/_super_schema_display_show.html.erb +0 -8
  98. data/app/views/super/application/_super_schema_form.html.erb +0 -15
  99. data/docs/README.md +0 -6
  100. data/docs/faq.md +0 -44
  101. data/docs/quick_start.md +0 -45
  102. data/docs/webpacker.md +0 -17
  103. data/docs/yard_customizations.rb +0 -41
  104. data/frontend/super-frontend/build.js +0 -36
  105. data/frontend/super-frontend/package.json +0 -21
  106. data/frontend/super-frontend/postcss.config.js +0 -6
  107. data/frontend/super-frontend/src/javascripts/super/application.ts +0 -18
  108. data/frontend/super-frontend/src/javascripts/super/apply_template_controller.ts +0 -19
  109. data/frontend/super-frontend/src/javascripts/super/rails__ujs.d.ts +0 -1
  110. data/frontend/super-frontend/src/javascripts/super/toggle_pending_destruction_controller.ts +0 -15
  111. data/frontend/super-frontend/src/stylesheets/super/application.css +0 -77
  112. data/frontend/super-frontend/tailwind.config.js +0 -15
  113. data/frontend/super-frontend/tsconfig.json +0 -13
  114. data/frontend/super-frontend/yarn.lock +0 -5448
  115. data/lib/super/controls/required.rb +0 -41
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Super
4
+ class ActionTextGenerator < Rails::Generators::Base
5
+ source_root File.expand_path("templates", __dir__)
6
+
7
+ def copy_the_pack_files
8
+ template(
9
+ "pack_super_action_text.js",
10
+ "app/javascript/packs/super/action_text.js"
11
+ )
12
+ template(
13
+ "pack_super_action_text.css",
14
+ "app/javascript/packs/super/action_text.css"
15
+ )
16
+ end
17
+
18
+ def add_action_text_assets_to_config
19
+ insert_into_file(
20
+ "config/initializers/super.rb",
21
+ " c.javascripts.push(Super::Assets.webpacker(\"super/action_text\"))\n" \
22
+ " c.stylesheets.push(Super::Assets.webpacker(\"super/action_text\"))\n",
23
+ before: /\bend\b/
24
+ )
25
+ end
26
+
27
+ def remind_about_webpacker
28
+ say "Make sure Webpacker is set up on your application!", :bold
29
+ say "Run if needed: bundle exec rails webpacker:install"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ @import "trix/dist/trix";
2
+
3
+ /* This is the SCSS that the ActionText installation generator adds, compiled to CSS */
4
+ .trix-content .attachment-gallery > action-text-attachment,
5
+ .trix-content .attachment-gallery > .attachment {
6
+ flex: 1 0 33%;
7
+ padding: 0 0.5em;
8
+ max-width: 33%; }
9
+ .trix-content .attachment-gallery.attachment-gallery--2 > action-text-attachment,
10
+ .trix-content .attachment-gallery.attachment-gallery--2 > .attachment,
11
+ .trix-content .attachment-gallery.attachment-gallery--4 > action-text-attachment,
12
+ .trix-content .attachment-gallery.attachment-gallery--4 > .attachment {
13
+ flex-basis: 50%;
14
+ max-width: 50%; }
15
+ .trix-content action-text-attachment .attachment {
16
+ padding: 0 !important;
17
+ max-width: 100% !important; }
18
+
19
+ /* This is for getting Tailwind to work with Trix */
20
+ .trix-content ul {
21
+ list-style-type: disc; }
22
+ .trix-content ol {
23
+ list-style-type: decimal; }
@@ -0,0 +1,4 @@
1
+ import * as ActiveStorage from "@rails/activestorage"
2
+ ActiveStorage.start()
3
+ require("trix")
4
+ require("@rails/actiontext")
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Super
2
4
  class InstallGenerator < Rails::Generators::Base
3
5
  source_root File.expand_path("templates", __dir__)
@@ -7,6 +9,12 @@ module Super
7
9
  class_option :route_namespace, type: :string, default: "admin",
8
10
  banner: "Specifies the route namespace for admin controllers"
9
11
 
12
+ def assert_not_controller_namespace_not_super
13
+ if controller_namespace == "super"
14
+ raise Super::Error::ArgumentError, "controller_namespace can not be `super`"
15
+ end
16
+ end
17
+
10
18
  def create_initializer
11
19
  template("initializer.rb", "config/initializers/super.rb")
12
20
  end
@@ -14,8 +22,7 @@ module Super
14
22
  def create_base_admin_controller
15
23
  template(
16
24
  "base_controller.rb",
17
- "app/controllers/#{controller_namespace}_controller.rb",
18
- controller_namespace: controller_namespace
25
+ "app/controllers/#{parent_controller_name}_controller.rb"
19
26
  )
20
27
  end
21
28
 
@@ -51,12 +58,16 @@ module Super
51
58
 
52
59
  private
53
60
 
61
+ def route_namespace
62
+ options[:route_namespace].strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip.underscore
63
+ end
64
+
54
65
  def controller_namespace
55
- if options["controller_namespace"].blank?
56
- "admin"
57
- else
58
- options["controller_namespace"]
59
- end
66
+ options["controller_namespace"].strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip.underscore
67
+ end
68
+
69
+ def parent_controller_name
70
+ controller_namespace.presence || "admin"
60
71
  end
61
72
  end
62
73
  end
@@ -1,2 +1,10 @@
1
- class <%= config[:controller_namespace].classify %>Controller < Super::ApplicationController
1
+ class <%= parent_controller_name.classify %>Controller < Super::ApplicationController
2
+ class <%= parent_controller_name.classify.demodulize %>Controls < Super::Controls
3
+ end
4
+
5
+ private
6
+
7
+ def new_controls
8
+ self.class::Controls.new
9
+ end
2
10
  end
@@ -1,5 +1,12 @@
1
1
  Super.configuration do |c|
2
2
  c.title = "My Admin Site"
3
- c.controller_namespace = "<%= options["controller_namespace"] %>"
4
- c.route_namespace = "<%= options["route_namespace"] %>"
3
+ <% if route_namespace != "admin" -%>
4
+ c.path = "/<%= route_namespace %>"
5
+ <% end -%>
6
+ <% if route_namespace != "admin" -%>
7
+ c.generator_as = "<%= route_namespace.gsub(%r{/}, "_") %>"
8
+ <% end -%>
9
+ <% if controller_namespace != "admin" -%>
10
+ c.generator_module = "<%= controller_namespace %>"
11
+ <% end -%>
5
12
  end
@@ -1,52 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/resource_helpers"
4
+
1
5
  module Super
2
6
  class ResourceGenerator < Rails::Generators::NamedBase
7
+ include Rails::Generators::ResourceHelpers
3
8
  source_root File.expand_path("templates", __dir__)
4
9
 
5
- def create_controller
6
- controller_subdir =
7
- if Super.configuration.controller_namespace.present?
8
- "#{Super.configuration.controller_namespace}/"
9
- else
10
- ""
11
- end
10
+ check_class_collision suffix: "Controller"
11
+
12
+ class_option :skip_routes, type: :boolean, desc: "Don't add routes to config/routes.rb."
13
+
14
+ def initialize(*)
15
+ super
12
16
 
17
+ controller_namespace = Super.configuration.generator_module
18
+ if controller_namespace.present?
19
+ controller_name =
20
+ if controller_namespace.include?("/")
21
+ "#{controller_namespace}/#{name}"
22
+ else
23
+ "#{controller_namespace}::#{name}"
24
+ end
25
+ self.options = options.dup
26
+ options[:model_name] = name
27
+ options.freeze
28
+ assign_names!(name)
29
+ assign_controller_names!(controller_name.pluralize)
30
+ else
31
+ assign_names!(name)
32
+ assign_controller_names!(name.pluralize)
33
+ end
34
+ end
35
+
36
+ def create_controller
13
37
  template(
14
38
  "resources_controller.rb",
15
- "app/controllers/#{controller_subdir}#{file_path.pluralize}_controller.rb"
39
+ File.join("app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
16
40
  )
17
41
  end
18
42
 
19
- private
43
+ def create_route_namespace
44
+ data = route_scope
45
+ return if data.nil?
46
+ return if File.read(File.join(destination_root, "config", "routes.rb")).include?(data)
20
47
 
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
48
+ inject_into_file(
49
+ "config/routes.rb",
50
+ "#{data}\nend\n".indent(2),
51
+ after: /^Rails\.application\.routes\.draw\b.*$\r?\n\r?/,
52
+ verbose: true,
53
+ force: false
54
+ )
55
+ end
28
56
 
29
- inner = capture(&block)
30
- inner = indent(inner, indentation_amount).chomp
57
+ def add_admin_route
58
+ data = route_scope
31
59
 
32
- if Super.configuration.controller_namespace.present?
33
- concat("module #{Super.configuration.controller_namespace.camelize}\n")
60
+ if data.nil?
61
+ route("resources :#{file_name.pluralize}")
62
+ else
63
+ inject_into_file(
64
+ "config/routes.rb",
65
+ "resources :#{file_name.pluralize}\n".indent(4),
66
+ after: /#{data}.*$\r?\n\r?/,
67
+ verbose: true,
68
+ force: false
69
+ )
34
70
  end
71
+ end
35
72
 
36
- concat(inner)
37
- concat("\n")
73
+ private
38
74
 
39
- if Super.configuration.controller_namespace.present?
40
- concat("end\n")
41
- end
75
+ def parent_controller_name
76
+ controller_namespace.presence || "admin"
42
77
  end
43
78
 
44
- def parent_controller_name
45
- if Super.configuration.controller_namespace.present?
46
- "#{Super.configuration.controller_namespace.camelize}Controller"
47
- else
48
- "AdminController"
79
+ def controller_namespace
80
+ Super.configuration.generator_module.strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip.underscore
81
+ end
82
+
83
+ def route_scope
84
+ return nil if no_scope?
85
+
86
+ if use_scope?
87
+ kwargs = []
88
+ kwargs.push(%(path: "/#{g_path}")) if g_path.present?
89
+ kwargs.push(%(module: "#{g_module}")) if g_module.present?
90
+ kwargs.push(%(as: "#{g_as}")) if g_as.present?
91
+ return %(scope #{kwargs.join(", ")} do)
49
92
  end
93
+
94
+ %(namespace :#{g_module} do)
95
+ end
96
+
97
+ def use_scope?
98
+ return true if !same?
99
+ return true if g_module.include?("/")
100
+ return true if g_path.include?("/")
101
+
102
+ false
103
+ end
104
+
105
+ def no_scope?
106
+ g_module.blank? && g_path.blank? && g_as.blank?
107
+ end
108
+
109
+ def same?
110
+ g_module == g_path && g_path == g_as
111
+ end
112
+
113
+ def g_module
114
+ normalized_scope_part(Super.configuration.generator_module || "")
115
+ end
116
+
117
+ def g_path
118
+ normalized_scope_part(Super.configuration.path || "")
119
+ end
120
+
121
+ def g_as
122
+ normalized_scope_part(Super.configuration.generator_as || "")
123
+ end
124
+
125
+ def normalized_scope_part(part)
126
+ part.strip.gsub(%r{\A/+}, "").gsub(%r{/+\z}, "").strip
50
127
  end
51
128
  end
52
129
  end
@@ -1,45 +1,9 @@
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
-
1
+ <% module_namespacing do -%>
2
+ class <%= controller_class_name %>Controller < <%= parent_controller_name.classify %>Controller
3
+ class Controls < <%= parent_controller_name.classify.demodulize %>Controls
14
4
  def model
15
5
  <%= class_name %>
16
6
  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
7
  end
44
8
  end
45
9
  <% end -%>
@@ -1,14 +1,15 @@
1
1
  Description:
2
2
  Creates the necessary files for assets to be served under Webpacker
3
3
 
4
- Webpacker support requires ERB support. There are no other dependencies.
4
+ Webpacker support requires that you install ERB support for Webpacker.
5
5
 
6
6
  Installing ERB on webpacker is usually done by running the command:
7
7
  `rails webpacker:install:erb`
8
8
 
9
9
  Example:
10
10
  rails webpacker:install:erb # if you hadn't set up ERB already
11
- rails generate super:install:webpacker
11
+ rails generate super:webpacker
12
12
 
13
- This will create:
14
- app/javascript/packs/super/application.js.erb
13
+ This will:
14
+ Create app/javascript/packs/super/application.js.erb
15
+ Modify config/initializers/super.rb
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Super
2
4
  class WebpackerGenerator < Rails::Generators::Base
3
5
  source_root File.expand_path("templates", __dir__)
@@ -12,14 +14,15 @@ module Super
12
14
  def set_asset_handler_to_webpacker
13
15
  insert_into_file(
14
16
  "config/initializers/super.rb",
15
- " c.asset_handler = Super::Assets.webpacker\n",
17
+ " c.javascripts = Super::Assets.use_webpacker(c.javascripts)\n" \
18
+ " c.stylesheets = Super::Assets.use_webpacker(c.stylesheets)\n",
16
19
  before: /\bend\b/
17
20
  )
18
21
  end
19
22
 
20
23
  def remind_about_erb
21
24
  say "Make sure ERB is set up for Webpacker!", :bold
22
- say "Run if needed: rails webpacker:install:erb", :bold
25
+ say "Run if needed: bundle exec rails webpacker:install:erb"
23
26
  end
24
27
  end
25
28
  end
data/lib/super.rb CHANGED
@@ -1,20 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "tsort"
2
4
 
3
5
  require "rails/engine"
4
6
 
7
+ require "super/schema/common"
8
+ require "super/useful/builder"
9
+ require "super/useful/enum"
10
+
5
11
  require "super/action_inquirer"
6
12
  require "super/assets"
7
13
  require "super/client_error"
8
14
  require "super/compatibility"
9
15
  require "super/configuration"
10
16
  require "super/controls"
17
+ require "super/display"
18
+ require "super/display/guesser"
11
19
  require "super/display/schema_types"
12
20
  require "super/error"
13
21
  require "super/filter"
22
+ require "super/filter/form_object"
23
+ require "super/filter/guesser"
14
24
  require "super/filter/operator"
15
25
  require "super/filter/schema_types"
16
26
  require "super/form"
27
+ require "super/form/builder"
28
+ require "super/form/guesser"
29
+ require "super/form/inline_errors"
17
30
  require "super/form/schema_types"
31
+ require "super/form/strong_params"
18
32
  require "super/layout"
19
33
  require "super/link"
20
34
  require "super/navigation/automatic"
@@ -22,7 +36,10 @@ require "super/pagination"
22
36
  require "super/panel"
23
37
  require "super/partial"
24
38
  require "super/plugin"
39
+ require "super/query/form_object"
25
40
  require "super/schema"
41
+ require "super/schema/guesser"
42
+ require "super/sort"
26
43
  require "super/version"
27
44
  require "super/view_helper"
28
45
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Super
2
4
  # ```ruby
3
5
  # action = Super::ActionInquirer.new(