super 0.0.3 → 0.0.4

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/super/application.js +60 -10831
  3. data/app/assets/stylesheets/super/application.css +38267 -22475
  4. data/app/controllers/super/application_controller.rb +34 -30
  5. data/app/helpers/super/application_helper.rb +32 -0
  6. data/app/views/layouts/super/application.html.erb +6 -8
  7. data/app/views/super/application/_form.html.erb +13 -10
  8. data/app/views/super/application/_form_field__destroy.html.erb +2 -2
  9. data/app/views/super/application/_form_field_select.html.erb +6 -6
  10. data/app/views/super/application/_form_field_text.html.erb +3 -3
  11. data/app/views/super/application/_form_fieldset.html.erb +1 -1
  12. data/app/views/super/application/_form_has_many.html.erb +4 -4
  13. data/app/views/super/application/_index.html.erb +38 -53
  14. data/app/views/super/application/_resource_header.html.erb +16 -0
  15. data/app/views/super/application/_resources_header.html.erb +16 -0
  16. data/app/views/super/application/_show.html.erb +0 -2
  17. data/app/views/super/application/_super_layout.html.erb +34 -0
  18. data/app/views/super/application/_super_panel.html.erb +11 -0
  19. data/app/views/super/application/edit.html.erb +1 -6
  20. data/app/views/super/application/index.html.erb +1 -1
  21. data/app/views/super/application/new.html.erb +1 -6
  22. data/app/views/super/application/show.html.erb +1 -1
  23. data/frontend/super-frontend/build.js +12 -12
  24. data/frontend/super-frontend/dist/application.css +38267 -22475
  25. data/frontend/super-frontend/dist/application.js +60 -10831
  26. data/frontend/super-frontend/package.json +7 -3
  27. data/frontend/super-frontend/postcss.config.js +4 -4
  28. data/frontend/super-frontend/src/javascripts/super/application.ts +10 -5
  29. data/frontend/super-frontend/src/javascripts/super/apply_template_controller.ts +21 -0
  30. data/frontend/super-frontend/src/javascripts/super/rails__ujs.d.ts +1 -1
  31. data/frontend/super-frontend/src/javascripts/super/toggle_pending_destruction_controller.ts +15 -0
  32. data/frontend/super-frontend/src/stylesheets/super/application.css +63 -0
  33. data/frontend/super-frontend/tailwind.config.js +6 -4
  34. data/frontend/super-frontend/yarn.lock +115 -40
  35. data/lib/super.rb +6 -2
  36. data/lib/super/action.rb +22 -0
  37. data/lib/super/action/step.rb +36 -0
  38. data/lib/super/controls.rb +222 -2
  39. data/lib/super/error.rb +1 -0
  40. data/lib/super/form/schema_types.rb +1 -1
  41. data/lib/super/layout.rb +19 -0
  42. data/lib/super/link.rb +87 -0
  43. data/lib/super/pagination.rb +19 -8
  44. data/lib/super/panel.rb +17 -0
  45. data/lib/super/partial.rb +11 -0
  46. data/lib/super/test_support/copy_app_templates/controllers/members_controller.rb +17 -0
  47. data/lib/super/test_support/copy_app_templates/views/members/_favorite_things.html.erb +11 -0
  48. data/lib/super/test_support/generate_copy_app.rb +1 -0
  49. data/lib/super/version.rb +1 -1
  50. metadata +16 -5
  51. data/frontend/super-frontend/src/javascripts/super/nested_attributes_controller.ts +0 -33
  52. data/lib/super/inline_callback.rb +0 -82
  53. data/lib/super/view.rb +0 -25
@@ -1,11 +1,8 @@
1
1
  module Super
2
2
  # Provides a default implementation for each of the resourceful actions
3
3
  class ApplicationController < ActionController::Base
4
- include Super::InlineCallback
5
4
  include Pluggable.new(:super_application_controller)
6
5
 
7
- register_inline_callback(:index_paginate, on: :index, after: :yield)
8
-
9
6
  helper_method :action_inquirer
10
7
  helper_method :controls
11
8
 
@@ -35,13 +32,31 @@ module Super
35
32
  end
36
33
 
37
34
  def index
38
- with_inline_callbacks do
39
- @resources = controls.scope(action: action_inquirer)
35
+ @super_action = controls.index
36
+ @super_action.steps.each do |step|
37
+ instance_exec(&step)
38
+ end
39
+ end
40
+
41
+ def show
42
+ @super_action = controls.show
43
+ @super_action.steps.each do |step|
44
+ instance_exec(&step)
45
+ end
46
+ end
47
+
48
+ def new
49
+ @super_action = controls.new
50
+ @super_action.steps.each do |step|
51
+ instance_exec(&step)
40
52
  end
41
53
  end
42
54
 
43
55
  def create
44
- @resource = controls.scope(action: action_inquirer).build(create_permitted_params)
56
+ @super_action = controls.create
57
+ @super_action.steps.each do |step|
58
+ instance_exec(&step)
59
+ end
45
60
 
46
61
  if @resource.save
47
62
  redirect_to polymorphic_path(Super.configuration.path_parts(@resource))
@@ -50,20 +65,18 @@ module Super
50
65
  end
51
66
  end
52
67
 
53
- def new
54
- @resource = controls.scope(action: action_inquirer).build
55
- end
56
-
57
68
  def edit
58
- @resource = controls.scope(action: action_inquirer).find(params[:id])
59
- end
60
-
61
- def show
62
- @resource = controls.scope(action: action_inquirer).find(params[:id])
69
+ @super_action = controls.edit
70
+ @super_action.steps.each do |step|
71
+ instance_exec(&step)
72
+ end
63
73
  end
64
74
 
65
75
  def update
66
- @resource = controls.scope(action: action_inquirer).find(params[:id])
76
+ @super_action = controls.update
77
+ @super_action.steps.each do |step|
78
+ instance_exec(&step)
79
+ end
67
80
 
68
81
  if @resource.update(update_permitted_params)
69
82
  redirect_to polymorphic_path(Super.configuration.path_parts(@resource))
@@ -73,7 +86,11 @@ module Super
73
86
  end
74
87
 
75
88
  def destroy
76
- @resource = controls.scope(action: action_inquirer).find(params[:id])
89
+ @super_action = controls.destroy
90
+ @super_action.steps.each do |step|
91
+ instance_exec(&step)
92
+ end
93
+
77
94
  if @resource.destroy
78
95
  redirect_to polymorphic_path(Super.configuration.path_parts(controls.model))
79
96
  else
@@ -83,19 +100,6 @@ module Super
83
100
 
84
101
  private
85
102
 
86
- def index_paginate
87
- @pagination = Pagination.new(
88
- total_count: @resources.size,
89
- limit: Super.configuration.index_resources_per_page,
90
- query_params: request.GET,
91
- page_query_param: :page
92
- )
93
-
94
- @resources = @resources
95
- .limit(@pagination.limit)
96
- .offset(@pagination.offset)
97
- end
98
-
99
103
  def controls
100
104
  Super::Controls.new(new_controls)
101
105
  end
@@ -0,0 +1,32 @@
1
+ module Super
2
+ module ApplicationHelper
3
+ def super_resolve_list_for_rendering(partials, block = -> {})
4
+ block_result = block.call
5
+ if block_result.present?
6
+ partials = [block_result, *partials]
7
+ end
8
+
9
+ partials = partials.map do |partial|
10
+ if partial.is_a?(Symbol)
11
+ instance_variable_get(partial)
12
+ else
13
+ partial
14
+ end
15
+ end
16
+
17
+ partials.compact
18
+ end
19
+
20
+ def super_render_partialish(partialish)
21
+ if partialish.respond_to?(:to_partial_path)
22
+ if partialish.is_a?(Super::Partial)
23
+ render(partialish, partialish.locals)
24
+ else
25
+ render(partialish)
26
+ end
27
+ else
28
+ partialish
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html>
2
- <html class="bg-white">
2
+ <html class="bg-gray-100">
3
3
  <head>
4
4
  <title><%= Super.configuration.title %></title>
5
5
  <%= csrf_meta_tags %>
@@ -7,6 +7,8 @@
7
7
  <%= csp_meta_tag %>
8
8
  <% end -%>
9
9
 
10
+ <meta name="viewport" content="width=device-width, initial-scale=1">
11
+
10
12
  <% if Super.configuration.asset_handler.sprockets? %>
11
13
  <%= stylesheet_link_tag "super/application", media: "all" %>
12
14
  <%= javascript_include_tag "super/application" %>
@@ -16,10 +18,10 @@
16
18
  <% end %>
17
19
  </head>
18
20
 
19
- <body class="font-sans bg-white">
21
+ <body class="font-sans pb-4">
20
22
  <div class="px-4">
21
23
  <header class="pt-4">
22
- <h1 class="text-base font-bold mr-6"><%= Super.configuration.title %></h1>
24
+ <h1 class="text-lg font-bold mr-6 mb-1"><%= Super.configuration.title %></h1>
23
25
  <%
24
26
  route_namespace = Super.configuration.route_namespace.map(&:to_s).join("/")
25
27
  Super::Navigation::Automatic.new(route_namespace: route_namespace).each do |text, href| %>
@@ -29,11 +31,7 @@
29
31
 
30
32
  <%= render "flash" %>
31
33
 
32
- <div class="pt-8"></div>
33
-
34
- <% if content_for?(:header) %>
35
- <%= yield :header %>
36
- <% end %>
34
+ <div class="pt-4"></div>
37
35
 
38
36
  <%= yield %>
39
37
  </div>
@@ -1,14 +1,17 @@
1
1
  <% schema = controls.form_schema(action: action_inquirer) %>
2
2
 
3
- <%= form_for(Super.configuration.path_parts(resource)) do |f| %>
4
- <% schema.fields.each do |field, type| %>
5
- <%= render(
6
- type,
7
- form: f,
8
- column: field
9
- ) %>
10
- <% end %>
11
- <div>
12
- <%= f.submit class: "bg-blue-700 hover:bg-blue-800 text-white py-2 px-4 rounded mt-2" %>
3
+ <%= form_for(Super.configuration.path_parts(@resource)) do |f| %>
4
+ <div class="max-w-3xl">
5
+ <% schema.fields.each do |field, type| %>
6
+ <%= render(
7
+ type,
8
+ form: f,
9
+ column: field
10
+ ) %>
11
+ <% end %>
12
+
13
+ <div>
14
+ <%= f.submit class: "super-button super-button--fill-blue mt-2" %>
15
+ </div>
13
16
  </div>
14
17
  <% end %>
@@ -1,5 +1,5 @@
1
- <div class="lg:w-1/3">
2
- <%= form.check_box(column, data: { action: "nested-attributes#toggleDestruction" }) %>
1
+ <div class="super-field-group">
2
+ <%= form.check_box(column, data: { action: "toggle-pending-destruction#call" }) %>
3
3
  <%= form.label(column) %>
4
4
  <%= render "form_inline_errors", form: form, column: column %>
5
5
  </div>
@@ -1,14 +1,14 @@
1
- <div class="lg:w-1/3">
2
- <%= form.label(column) %>
3
- <div class="relative mt-2">
1
+ <div class="super-field-group">
2
+ <%= form.label(column, class: "block") %>
3
+ <div class="super-input-select mt-1">
4
4
  <%= form.select(
5
5
  column,
6
6
  form_field_select[:collection],
7
7
  { include_blank: true }.merge(form_field_select[:options] || {}),
8
- { class: "appearance-none border rounded w-full py-2 px-2 text-gray-900 leading-tight border border-gray-400 focus:border-blue-400 block" }
8
+ { class: "super-input super-input-select-field" }
9
9
  ) %>
10
- <div class="pointer-events-none absolute inset-y-0 right-0 flex items-center px-2 text-gray-700">
11
- <span class="fill-current h-4 w-4">
10
+ <div class="super-input-select-icon text-gray-700">
11
+ <span class="h-4 w-4">
12
12
  <%= render "super/feather/chevron_down.svg" %>
13
13
  </span>
14
14
  </div>
@@ -1,5 +1,5 @@
1
- <div class="lg:w-1/3">
2
- <%= form.label(column) %>
3
- <%= form.text_field(column, class: "appearance-none border rounded w-full py-2 px-2 text-gray-900 leading-tight border border-gray-400 focus:border-blue-400 mt-2") %>
1
+ <div class="super-field-group">
2
+ <%= form.label(column, class: "block") %>
3
+ <%= form.text_field(column, class: "super-input w-full mt-1") %>
4
4
  <%= render "form_inline_errors", form: form, column: column %>
5
5
  </div>
@@ -1,4 +1,4 @@
1
- <fieldset class="border border-gray-300 rounded p-4">
1
+ <fieldset class="border border-gray-300 rounded pb-4 px-4 mt-4 shadow" data-controller="toggle-pending-destruction">
2
2
  <% if form_fieldset.label.present? %>
3
3
  <legend class="bg-white p-1 -mx-1"><%= form_fieldset.label %></legend>
4
4
  <% end %>
@@ -1,4 +1,4 @@
1
- <div data-controller="nested-attributes">
1
+ <div data-controller="apply-template">
2
2
  <%= form.fields_for(form_has_many.reader) do |ff| %>
3
3
  <%= render "form_fieldset", form_fieldset: form_has_many, form: ff %>
4
4
  <% end %>
@@ -7,15 +7,15 @@
7
7
  form.fields_for(
8
8
  form_has_many.reader,
9
9
  form.object.public_send(form_has_many.reader).build,
10
- child_index: "TEMPLATE"
10
+ child_index: "TEMPLATEINDEX"
11
11
  ) do |ff|
12
12
  %>
13
- <template data-target="nested-attributes.template">
13
+ <template data-target="apply-template.template">
14
14
  <%= render "form_fieldset", form_fieldset: form_has_many, form: ff %>
15
15
  </template>
16
16
  <% end %>
17
17
 
18
- <button data-action="nested-attributes#add" class="bg-blue-700 hover:bg-blue-800 text-white py-2 px-4 rounded mt-2">
18
+ <button data-action="apply-template#call" class="super-button super-button--fill-blue mt-2">
19
19
  Add <%= form_has_many.label %>
20
20
  </button>
21
21
  </div>
@@ -1,60 +1,45 @@
1
1
  <% schema = controls.display_schema(action: action_inquirer) %>
2
2
 
3
- <% content_for(:header) do %>
4
- <header>
5
- <h1 class="text-3xl inline-block">
6
- <%= controls.title %>
7
- </h1>
8
- <%= link_to(
9
- "New #{controls.model.name}",
10
- new_polymorphic_path(Super.configuration.path_parts(controls.model.new)),
11
- class: "inline-block"
12
- ) %>
13
- </header>
14
- <% end %>
15
-
16
- <table class="w-full leading-loose mt-4">
17
- <thead class="border-gray-400 border-solid">
18
- <tr>
19
- <% (schema.field_keys + ["Actions"]).each do |column| %>
20
- <th class="text-left"><%= column.to_s.humanize %></th>
21
- <% end %>
22
- </tr>
23
- </thead>
24
- <tbody>
25
- <% @resources.each.with_index do |resource, index| %>
26
- <tr id="resource-pk-<%= resource.id %>" class="<%= index.even? ? "bg-gray-100" : "" %>" >
3
+ <div class="mt-4 -mx-5">
4
+ <table class="w-full">
5
+ <thead>
6
+ <tr class="text-left text-sm uppercase font-bold tracking-wide">
27
7
  <% schema.field_keys.each do |column| %>
28
- <td><%= Super::Display.format(schema, resource, column) %></td>
8
+ <th class="p-2 first:pl-5"><%= column.to_s.humanize %></th>
29
9
  <% end %>
30
- <td>
31
- <%= link_to(
32
- "View",
33
- polymorphic_path(Super.configuration.path_parts(resource))
34
- ) %>
35
- <%= link_to(
36
- "Edit",
37
- edit_polymorphic_path(Super.configuration.path_parts(resource))
38
- ) %>
39
- <%= link_to(
40
- "Delete",
41
- polymorphic_path(Super.configuration.path_parts(resource)),
42
- method: :delete,
43
- data: { confirm: "Really delete?" }
44
- ) %>
45
- </td>
10
+ <th class="p-2 pr-5">Actions</th>
46
11
  </tr>
47
- <% end %>
48
- </tbody>
49
- </table>
12
+ </thead>
13
+ <tbody class="border-gray-400 border-solid border-t-2">
14
+ <% @resources.each.with_index do |resource, index| %>
15
+ <tr id="resource-pk-<%= resource.id %>" class="border-b border-gray-400">
16
+ <% schema.field_keys.each do |column| %>
17
+ <td class="p-2 first:pl-5"><%= Super::Display.format(schema, resource, column) %></td>
18
+ <% end %>
19
+ <td class="p-2 pr-5" style="word-spacing: 0.25rem">
20
+ <% controls.resource_actions(resource, params: params, action: action_inquirer).each do |link| %>
21
+ <%= link_to(link.text, link.href, link.options) %>
22
+ <% end %>
23
+ </td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ </table>
28
+ </div>
50
29
 
51
- <% @pagination.each do |page_query_params, is_current_page, display| %>
52
- <%= link_to(
53
- display,
54
- polymorphic_path(
55
- Super.configuration.path_parts(controls.model),
56
- page_query_params
57
- ),
58
- class: "#{is_current_page ? " text-gray-900" : ""}"
59
- ) %>
30
+ <% if @pagination.necessary? %>
31
+ <div class="flex justify-end mr-2">
32
+ <div class="mt-4">
33
+ <% @pagination.each do |page_query_params, is_current_page, display| %>
34
+ <%= link_to(
35
+ display,
36
+ polymorphic_path(
37
+ Super.configuration.path_parts(controls.model),
38
+ page_query_params
39
+ ),
40
+ class: "inline-block ml-2 text-lg #{is_current_page ? " text-gray-900" : ""}"
41
+ ) %>
42
+ <% end %>
43
+ </div>
44
+ </div>
60
45
  <% end %>
@@ -0,0 +1,16 @@
1
+ <header class="flex justify-between content-end">
2
+ <h1 class="text-xl">
3
+ <%= controls.title %>
4
+ </h1>
5
+ <div>
6
+ <% controls.resource_actions(@resource, params: params, action: action_inquirer).each do |link| %>
7
+ <%= link_to(
8
+ link.text,
9
+ link.href,
10
+ link.options.reverse_merge(
11
+ class: "super-button super-button--border-blue super-button-sm inline-block ml-2"
12
+ )
13
+ ) %>
14
+ <% end %>
15
+ </div>
16
+ </header>
@@ -0,0 +1,16 @@
1
+ <header class="flex justify-between content-end">
2
+ <h1 class="text-xl">
3
+ <%= controls.title %>
4
+ </h1>
5
+ <div>
6
+ <% controls.resources_actions(params: params, action: action_inquirer).each do |link| %>
7
+ <%= link_to(
8
+ link.text,
9
+ link.href,
10
+ link.options.reverse_merge(
11
+ class: "super-button super-button--border-blue super-button-sm inline-block ml-2"
12
+ )
13
+ ) %>
14
+ <% end %>
15
+ </div>
16
+ </header>
@@ -1,7 +1,5 @@
1
1
  <% schema = controls.display_schema(action: action_inquirer) %>
2
2
 
3
- <h1 class="text-3xl"><%= controls.title %></h1>
4
-
5
3
  <table class="max-w-full leading-loose mt-4">
6
4
  <% schema.field_keys.each do |column| %>
7
5
  <tr>
@@ -0,0 +1,34 @@
1
+ <%
2
+ super_layout_headers = super_resolve_list_for_rendering(super_layout.headers)
3
+ super_layout_asides = super_resolve_list_for_rendering(super_layout.asides)
4
+ super_layout_mains = super_resolve_list_for_rendering(super_layout.mains)
5
+ super_layout_footers = super_resolve_list_for_rendering(super_layout.footers)
6
+ %>
7
+
8
+ <% super_layout_headers.each do |partial| %>
9
+ <%= super_render_partialish(partial) %>
10
+ <% end %>
11
+
12
+ <% if super_layout_asides.empty? %>
13
+ <% super_layout_mains.each do |partial| %>
14
+ <%= super_render_partialish(partial) %>
15
+ <% end %>
16
+ <% else %>
17
+ <div class="clearfix -mx-2">
18
+ <div class="md:float-left md:w-9/12 px-2">
19
+ <% super_layout_mains.each do |partial| %>
20
+ <%= super_render_partialish(partial) %>
21
+ <% end %>
22
+ </div>
23
+
24
+ <div class="md:float-right md:w-3/12 px-2">
25
+ <% super_layout_asides.each do |partial| %>
26
+ <%= super_render_partialish(partial) %>
27
+ <% end %>
28
+ </div>
29
+ </div>
30
+ <% end %>
31
+
32
+ <% super_layout_footers.each do |partial| %>
33
+ <%= super_render_partialish(partial) %>
34
+ <% end %>