super 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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 %>