tybo 0.0.31 → 0.0.34

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ac439377b1ab67c01d268ccf0f990c2a14346ec8ff76d6bdc5edd0aab15f60c
4
- data.tar.gz: f64462c5493126d3eec82f0b3644d1ffa7462d29fdc30ef56098df2622976749
3
+ metadata.gz: 889734fddb3c657eab1315d4c5d82008dd7c7c65e0ea20c2a3c2eaf127887cf3
4
+ data.tar.gz: ad256decb0366f3142c1751f59ae2d81de50864fcfebecd3a60d73ee4e617c89
5
5
  SHA512:
6
- metadata.gz: 8dbddf0cf8650483c3d19e1dcd0259545b8fc3e265455c440ad5f02be4649db7a74e6e51df6007e40c0376aed1ed01aa2d2cbdd834c84d7b88931538a3f578f8
7
- data.tar.gz: fae3b6eaf3afd0e1fd56fa55f83c905f7e18ea458ade1892ba8f351426fc2d2de61bb6267ca1d847e0ac905ed114a14aa5108ec1883177e36f2a368b4708b3bf
6
+ metadata.gz: 238d76fed5f190632db7a05f48594b526cb61c4e8727b1ff7bd9e250abfd03c9f818aae5fdafe86719f0d0629dbebcdc007d1cb38ad2001c901181e80efeced9
7
+ data.tar.gz: 4839b92f87f3b21e53a3a33ed4bf52a14d6531c8695d0a0c964f07015477a20220a0f7ea0e937b4616e8878246ac767f2544f64b21aa122ac8afc653e6874740
@@ -0,0 +1,16 @@
1
+ <div class="sm:grid sm:grid-cols-12 sm:items-start sm:gap-4 pt-5">
2
+ <div class="mt-1 sm:col-span-4 sm:mt-">
3
+ <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
4
+ <%= @label %>
5
+ </label>
6
+ </div>
7
+ <div class="mt-1 sm:col-span-3 sm:mt-0">
8
+ <%= @form.date_field @from_field, data: { action: "input->search-form#search" }, class: "rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:text-sm" %>
9
+ </div>
10
+ <div class="mt-1 sm:col-span-2 text-center">
11
+ to
12
+ </div>
13
+ <div class="mt-1 sm:col-span-3 sm:mt-0">
14
+ <%= @form.date_field @to_field, data: { action: "input->search-form#search" }, class: "rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:text-sm" %>
15
+ </div>
16
+ </div>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Forms::SearchDateInputComponent < ViewComponent::Base
4
+ def initialize(label:, form:, field:)
5
+ @label = label
6
+ @field = field
7
+ @form = form
8
+ @from_field = from_field
9
+ @to_field = to_field
10
+ end
11
+
12
+ def from_field
13
+ "#{@field}_from_date".to_sym
14
+ end
15
+
16
+ def to_field
17
+ "#{@field}_to_date".to_sym
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ <div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 pt-5">
2
+ <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
3
+ <%= @label %>
4
+ </label>
5
+ <div class="mt-1 sm:col-span-2 sm:mt-0">
6
+ <%= content %>
7
+ </div>
8
+ </div>
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+ module Forms
3
+ class SearchInputComponent < ViewComponent::Base
4
+ def initialize(label:)
5
+ @label = label
6
+ end
7
+ end
8
+ end
@@ -12,7 +12,7 @@
12
12
  <%= export_button %>
13
13
  <% end %>
14
14
 
15
- <% if add_button? %>
15
+ <% if add_button? %>
16
16
  <%= add_button %>
17
17
  <% end %>
18
18
  </div>
@@ -4,5 +4,4 @@ class IndexHeaderExportComponent < ViewComponent::Base
4
4
  def initialize(path:)
5
5
  @path = path
6
6
  end
7
-
8
7
  end
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1">
6
6
  <%= csrf_meta_tags %>
7
7
  <%= csp_meta_tag %>
8
- <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %>
8
+ <%= stylesheet_link_tag 'tailwind', 'inter-font', 'data-turbo-track': 'reload' %>
9
9
  <%= javascript_importmap_tags %>
10
10
  </head>
11
11
  <body class="h-full">
@@ -8,6 +8,7 @@ class BoGenerator < Rails::Generators::NamedBase
8
8
  class_option :namespace, type: :string, default: 'administrators'
9
9
 
10
10
  def create_bo_file
11
+ check_model_existence
11
12
  # Template method
12
13
  # First argument is the name of the template
13
14
  # Second argument is where to create the resulting file. In this case, app/bo/my_bo.rb
@@ -20,27 +21,35 @@ class BoGenerator < Rails::Generators::NamedBase
20
21
  template 'show.html.erb', File.join("app/views/#{options[:namespace]}", "#{plural_name}/show.html.erb")
21
22
  template 'controller.rb', File.join("app/controllers/#{options[:namespace]}", "#{plural_name}_controller.rb")
22
23
  template 'policy.rb', File.join("app/policies/bo/#{options[:namespace]}", "#{file_name.underscore}_policy.rb")
23
- unless File.exists?("app/policies/bo/#{options[:namespace]}_policy.rb")
24
+ unless File.exist?("app/policies/bo/#{options[:namespace]}_policy.rb")
24
25
  template 'namespace_policy.rb', "app/policies/bo/#{options[:namespace]}_policy.rb"
25
26
  end
26
27
  create_translations
27
28
  end
28
29
 
29
-
30
30
  def add_link_to_side_bar
31
- inject_into_file "app/views/#{options[:namespace]}/layouts/_side_bar.html.erb", before: " <%= sidebar.with_current_user_card(user: current_#{options[:namespace].singularize}) %>\n" do
31
+ inject_into_file "app/views/#{options[:namespace]}/layouts/_side_bar.html.erb", before: " <%= sidebar.with_current_user_card(user: current_#{options[:namespace].singularize}) %>\n" do
32
32
  " <%= sidebar.with_item(path: #{options[:namespace]}_#{plural_name}_path, icon: Icons::UsersComponent, label: I18n.t('bo.#{file_name}.others').capitalize) %>\n"
33
33
  end
34
34
  end
35
35
 
36
36
  def create_routes
37
- inject_into_file 'config/routes.rb', after: " namespace :#{options[:namespace]} do\n" do
38
- " resources :#{plural_name} \n"
37
+ rails_routes = Rails.application.routes.named_routes.names.map(&:to_s)
38
+ return if rails_routes.any?("#{options[:namespace]}_#{plural_name}")
39
+
40
+ inject_into_file 'config/routes.rb', after: " namespace :#{options[:namespace]} do\n" do
41
+ " resources :#{plural_name}\n"
39
42
  end
40
43
  end
41
44
 
42
45
  private
43
46
 
47
+ def check_model_existence
48
+ return if Object.const_defined?(class_name) && Object.const_get(class_name).ancestors.include?(ActiveRecord::Base)
49
+
50
+ raise ArgumentError, "The model #{class_name} does not exist or is not an ActiveRecord model. Ensure the model exists before running the generator."
51
+ end
52
+
44
53
  def bo_model
45
54
  class_name.constantize
46
55
  end
@@ -1,8 +1,8 @@
1
1
  <%%= simple_form_for [:<%= options[:namespace] %>, <%= class_name.underscore %>], html: { class: "<%= class_name.underscore %> form" } do |f| %>
2
- <!-- Model columns -->
2
+ <!-- Model columns -->
3
3
  <%- bo_model.column_names.each do |column| -%>
4
4
  <%- next if excluded_columns.include?(column.to_sym) || bo_model.reflect_on_all_associations.map(&:foreign_key).include?(column) -%>
5
- <%%= f.input :<%= column %>,label: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= column %>') %>
5
+ <%%= f.input :<%= column %>,label: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= column %>') %>
6
6
  <%- end -%>
7
7
  <!-- belongs_to Associations -->
8
8
  <%- belongs_to_assoc.each do |association| -%>
@@ -14,7 +14,7 @@
14
14
  <%%= I18n.t('bo.<%= class_name.underscore %>.attributes.<%=- association.name.to_s.singularize.to_s.remove('rich_text_') -%>') %>
15
15
  </label>
16
16
  <%%= f.rich_text_area :<%= association.name.to_s.singularize.to_s.remove('rich_text_')%> %>
17
- <% end %>
17
+ <%- end -%>
18
18
  <!-- File Associations -->
19
19
  <%- storage_assoc.each do |association| -%>
20
20
  <%%= render(Input::FileComponent.new(item: <%= class_name.underscore %>, field: '<%= association.name.to_s.singularize.to_s.remove('_attachment') %>', form: f)) %>
@@ -40,7 +40,6 @@
40
40
  multiple: true,
41
41
  data: { controller: 'ts--select' } %>
42
42
  <%% end %>
43
-
44
43
  <%- end -%>
45
44
  <%%= render(Forms::SubmitButtonComponent.new) %>
46
45
  <%% end %>
@@ -9,28 +9,18 @@
9
9
  </div>
10
10
  <div data-dropdown-target="menu" class="drop-shadow-md hidden absolute py-5 px-5 left-0 z-10 mt-2 w-[40rem] origin-top-right rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1">
11
11
  <%%= search_form_for [:<%=options[:namespace].underscore %>, @q], method: :post, class: "", data: { controller: "search-form", search_form_target: "form", turbo_frame: '<%=class_name.underscore.pluralize%>' } do |f| %>
12
- <%- bo_model.columns.group_by(&:type).each do |type| -%>
13
12
  <!-- columns -->
13
+ <%- bo_model.columns.group_by(&:type).each do |type| -%>
14
14
  <%- type.second.sort_by(&:type).each do |col| -%>
15
15
  <%- next if bo_model.reflect_on_all_associations.map(&:foreign_key).include?(col.name) -%>
16
16
  <%- if col.type == :string || col.type == :text -%>
17
- <div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 pt-5">
18
- <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
19
- <%%= I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>') %>
20
- </label>
21
- <div class="mt-1 sm:col-span-2 sm:mt-0">
22
- <%%= f.text_field :<%= col.name %>_cont, placeholder: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'), data: { action: "input->search-form#search" }, class: "block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:max-w-xs sm:text-sm" %>
23
- </div>
24
- </div>
17
+ <%%= render(Forms::SearchInputComponent.new(label: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'))) do %>
18
+ <%%= f.text_field :<%= col.name %>_cont, placeholder: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'), data: { action: "input->search-form#search" }, class: "block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:max-w-xs sm:text-sm" %>
19
+ <%% end %>
25
20
  <%- elsif col.type ==:integer -%>
26
- <div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 pt-5">
27
- <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
28
- <%%= I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>') %>
29
- </label>
30
- <div class="mt-1 sm:col-span-2 sm:mt-0">
31
- <%%= f.number_field :<%= col.name %>_eq, placeholder: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'), data: { action: "input->search-form#search" }, class: "block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:max-w-xs sm:text-sm" %>
32
- </div>
33
- </div>
21
+ <%%= render(Forms::SearchInputComponent.new(label: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'))) do %>
22
+ <%%= f.number_field :<%= col.name %>_eq, placeholder: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'), data: { action: "input->search-form#search" }, class: "block w-full max-w-lg rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:max-w-xs sm:text-sm" %>
23
+ <%% end %>
34
24
  <%- elsif col.type == :boolean -%>
35
25
  <div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 pt-5">
36
26
  <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
@@ -60,22 +50,11 @@
60
50
  </div>
61
51
  </div>
62
52
  <%- elsif col.type == :datetime || col.type == :date -%>
63
- <div class="sm:grid sm:grid-cols-12 sm:items-start sm:gap-4 pt-5">
64
- <div class="mt-1 sm:col-span-4 sm:mt-">
65
- <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
66
- <%%= I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>') %>
67
- </label>
68
- </div>
69
- <div class="mt-1 sm:col-span-3 sm:mt-0">
70
- <%%= f.date_field :<%= col.name %>_from_date, data: { action: "input->search-form#search" }, class: "rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:text-sm" %>
71
- </div>
72
- <div class="mt-1 sm:col-span-2 text-center">
73
- to
74
- </div>
75
- <div class="mt-1 sm:col-span-3 sm:mt-0">
76
- <%%= f.date_field :<%= col.name %>_to_date, data: { action: "input->search-form#search" }, class: "rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:text-sm" %>
77
- </div>
78
- </div>
53
+ <%%= render(Forms::SearchDateInputComponent.new(
54
+ label: I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>'),
55
+ form: f,
56
+ field: '<%= col.name %>')
57
+ ) %>
79
58
  <%- end -%>
80
59
  <%- end -%>
81
60
  <%- end -%>
@@ -83,7 +62,7 @@
83
62
  <%- belongs_to_assoc.each do |association| -%>
84
63
  <div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 pt-5">
85
64
  <label for="<%=association.name%>" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
86
- <%%=I18n.t('bo.<%=association.klass.name.underscore%>.one')%>
65
+ <%%= I18n.t('bo.<%=association.klass.name.underscore%>.one') %>
87
66
  </label>
88
67
  <div class="mt-1 sm:col-span-2 sm:mt-0">
89
68
  <%%= f.select :<%= association.foreign_key %>_eq, <%=association.klass.name.constantize%>.all.map { |value| [value.<%=bo_model_title(association.class_name.constantize)%>, value.id] }, { include_blank: true }, { class: "block w-full rounded-md border-gray-300 shadow-sm focus:border-tybo-500 focus:ring-tybo-500 sm:text-sm", data: { action: "input->search-form#search" } } %>
@@ -93,4 +72,3 @@
93
72
  <%% end %>
94
73
  </div>
95
74
  </div>
96
-
@@ -13,13 +13,13 @@
13
13
  <%- end -%>
14
14
  <%%= tr.with_td do %>
15
15
  <%%= link_to <%="#{options[:namespace]}_#{class_name.underscore}_path(#{class_name.underscore})"%>, class: "text-tybo-600 hover:text-tybo-900" do %>
16
- Détails
16
+ <%%= I18n.t('bo.details') %>
17
17
  <%% end %>
18
18
  <%% end %>
19
19
  <%%= tr.with_td do %>
20
20
  <%%= link_to <%="#{options[:namespace]}_#{class_name.underscore}_path(#{class_name.underscore})"%>,
21
21
  class: "text-tybo-600 hover:text-tybo-900",
22
- data: {turbo_method: :delete, turbo_confirm: "êtes-vous sûr ?"} do %>
22
+ data: { turbo_method: :delete, turbo_confirm: I18n.t('bo.confirm_delete') } do %>
23
23
  <%%= render(Icons::TrashComponent.new) %>
24
24
  <%% end %>
25
25
  <%% end %>
@@ -1,5 +1,5 @@
1
1
  <%%= render(IndexComponent.new) do |index| %>
2
- <!-- Header -->
2
+ <!-- Header -->
3
3
  <%%= index.with_header(
4
4
  title: I18n.t('bo.<%= class_name.underscore %>.others').capitalize,
5
5
  subtitle: I18n.t('bo.<%= class_name.underscore %>.subtitle').capitalize,
@@ -7,9 +7,9 @@
7
7
  <%%= header.with_add_button(path: <%="new_#{options[:namespace]}_#{class_name.underscore}_path" %>) %>
8
8
  <%% end %>
9
9
 
10
- <!-- Search Bar -->
10
+ <!-- Search Bar -->
11
11
  <%%= render('search_bar') %>
12
- <!-- Table -->
12
+ <!-- Table -->
13
13
  <%%= turbo_frame_tag "<%= class_name.underscore.pluralize %>", class: "shadow overflow-hidden rounded border-b border-gray-200" do %>
14
14
  <%%= render('table') %>
15
15
  <div class="py-2">
@@ -1,7 +1,5 @@
1
1
  <%%= render(FormComponent.new(item: <%= class_name.underscore %>)) do |form| %>
2
- <%%
3
- current_page = if <%= class_name.underscore
4
- %>.persisted?
2
+ <%% current_page = if <%= class_name.underscore %>.persisted?
5
3
  { label: I18n.t('bo.show'), path: <%= "#{options[:namespace]}_#{class_name.underscore}_path(#{class_name.underscore})"%> }
6
4
  else
7
5
  { label: I18n.t('bo.<%= class_name.underscore %>.new').capitalize, path: <%= "new_#{options[:namespace]}_#{class_name.underscore}_path" %> }
@@ -10,8 +8,7 @@
10
8
  form.with_breadcrumb([
11
9
  { label: I18n.t('bo.<%= class_name.underscore %>.others').capitalize, path: <%= "#{options[:namespace]}_#{class_name.pluralize.underscore}_path"%> },
12
10
  current_page
13
- ])
14
- %>
11
+ ]) %>
15
12
  <br>
16
13
  <%%= render "form", <%= class_name.underscore %>: @<%= class_name.underscore %> %>
17
14
  <%% end %>
@@ -1,19 +1,21 @@
1
1
  {
2
- "id": "identifiant",
3
- "email": "email",
4
- "password": "mot de passe",
5
- "created_at": "date de création",
6
- "updated_at": "date de modification",
7
- "title": "titre",
8
- "content": "contenu",
9
- "description": "description",
10
- "name": "nom",
11
- "position": "position",
12
- "first_name": "prénom",
13
- "last_name": "nom",
14
- "full_name": "nom complet",
15
- "updated": "modification effectuée",
16
- "created": "création effectuée",
17
- "destroyed": "suppression effectuée",
18
- "filters": "filtres"
2
+ "id": "Identifiant",
3
+ "email": "Email",
4
+ "password": "Mot de passe",
5
+ "created_at": "Date de création",
6
+ "updated_at": "Date de modification",
7
+ "title": "Titre",
8
+ "content": "Contenu",
9
+ "description": "Description",
10
+ "name": "Nom",
11
+ "position": "Position",
12
+ "first_name": "Prénom",
13
+ "last_name": "Nom",
14
+ "full_name": "Nom complet",
15
+ "updated": "Modification effectuée",
16
+ "created": "Création effectuée",
17
+ "destroyed": "Suppression effectuée",
18
+ "filters": "Filtres",
19
+ "confirm_delete": "Êtes-vous sûr ?",
20
+ "details": "Détails"
19
21
  }
@@ -8,6 +8,8 @@ def create_translations
8
8
  local => {
9
9
  'bo' => {
10
10
  'filters' => find_existing_translation('filters', local),
11
+ 'details' => find_existing_translation('details', local),
12
+ 'confirm_delete' => find_existing_translation('confirm_delete', local),
11
13
  'record' => {
12
14
  'created' => find_existing_translation('created', local),
13
15
  'updated' => find_existing_translation('updated', local),
@@ -20,21 +22,21 @@ def create_translations
20
22
 
21
23
  yaml_string = File.open locale_file
22
24
  data = YAML.load yaml_string
23
- data[local]['bo'][file_name.underscore.to_s] = {
25
+ data[local]['bo'][file_name.underscore] = {
24
26
  'one' => find_existing_translation(bo_model.to_s.downcase, local),
25
27
  'others' => find_existing_translation(bo_model.to_s.pluralize.downcase, local),
26
28
  'subtitle' => find_existing_translation("list of #{bo_model.to_s.pluralize.downcase}", local),
27
- 'attributes' => model_attributes(local)
29
+ 'attributes' => model_attributes(data, local)
28
30
  }
29
31
  output = YAML.dump data
30
32
  File.write(locale_file, output)
31
33
  end
32
34
  end
33
35
 
34
- def model_attributes(local)
35
- hash = {}
36
+ def model_attributes(data, local)
37
+ hash = data.dig(local, 'bo', file_name.underscore, 'attributes') || {}
36
38
  model_columns.each do |col|
37
- hash[col.to_s] = find_existing_translation(col, local)
39
+ hash[col.to_s] ||= find_existing_translation(col, local)
38
40
  end
39
41
  hash
40
42
  end
data/lib/tybo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tybo
2
- VERSION = '0.0.31'
2
+ VERSION = '0.0.34'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tybo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.31
4
+ version: 0.0.34
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michel Delpierre
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-03-20 00:00:00.000000000 Z
12
+ date: 2023-03-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -20,7 +20,7 @@ dependencies:
20
20
  version: '7.0'
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 7.0.4.1
23
+ version: 7.0.4.3
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,7 +30,7 @@ dependencies:
30
30
  version: '7.0'
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 7.0.4.1
33
+ version: 7.0.4.3
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: puma
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -153,6 +153,10 @@ files:
153
153
  - app/components/forms/has_many_form_component.rb
154
154
  - app/components/forms/has_one_form_component.html.erb
155
155
  - app/components/forms/has_one_form_component.rb
156
+ - app/components/forms/search_date_input_component.html.erb
157
+ - app/components/forms/search_date_input_component.rb
158
+ - app/components/forms/search_input_component.html.erb
159
+ - app/components/forms/search_input_component.rb
156
160
  - app/components/forms/submit_button_component.html.erb
157
161
  - app/components/forms/submit_button_component.rb
158
162
  - app/components/forms/subtitle_component.html.erb