tybo 0.0.32 → 0.0.35

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: 820a3568bdf02ff7722f5d5b7e31a76dbc2da30de5ef47002f84a93e0a9d11f0
4
- data.tar.gz: 3c0aacd3db2708b759960999d2c6f05edae6116cea7283e049a96a4cadcff048
3
+ metadata.gz: 1f1a040c49efef7ae924cde3a0bc4cd77622fc8920bd8d376d891c015859c4fa
4
+ data.tar.gz: 2236e0ffe3cf5ff30613aa801c00f341abd8786872ba92ed379c1f196d167869
5
5
  SHA512:
6
- metadata.gz: c48320ea3af74d67e8e059c3bda0ca72de0830f9ab370b662c9036d118b817a15a3c7f83950f23157a522ec8bcd8396cac9a54dd5b13d54d36437d9f61fab36b
7
- data.tar.gz: 4428949fbe3ce2f526d10ca3f2601ff9d59bd74316a25666a557b29a6f63e0c02065c0ef323d3727a690681bfea398c5e30686927bbd95a322035a8d0c8d9794
6
+ metadata.gz: 293a5d9bd5d672671cf4f8cee78a6c641df9bf105e7b262221bfcac4bec6c0961d7b3e982061bbef2e7d5373d69deb3ac10b2496ec43f2e2df6c80aee8df732f
7
+ data.tar.gz: a992ebe8fd5f0bc3bedb135402c126db152f33bcc21a26503398ba05f8320b9ca6748c442d40b7e514685213b75d82236d255c4d12181cf254e2fb9ff77a4ec8
@@ -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
@@ -3,6 +3,6 @@
3
3
  <%= @label %>
4
4
  </label>
5
5
  <div class="mt-1 sm:col-span-2 sm:mt-0">
6
- <%= content %>
6
+ <%= content %>
7
7
  </div>
8
8
  </div>
@@ -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
@@ -1,3 +1,3 @@
1
1
  <td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900">
2
- <%= strip_tags(content) == content ? content.truncate(30) : content %>
2
+ <%= strip_tags(content) == content ? content&.truncate(30) : content %>
3
3
  </td>
@@ -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,8 +9,8 @@
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 -%>
@@ -50,22 +50,11 @@
50
50
  </div>
51
51
  </div>
52
52
  <%- elsif col.type == :datetime || col.type == :date -%>
53
- <div class="sm:grid sm:grid-cols-12 sm:items-start sm:gap-4 pt-5">
54
- <div class="mt-1 sm:col-span-4 sm:mt-">
55
- <label class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
56
- <%%= I18n.t('bo.<%= class_name.underscore %>.attributes.<%= col.name %>') %>
57
- </label>
58
- </div>
59
- <div class="mt-1 sm:col-span-3 sm:mt-0">
60
- <%%= 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" %>
61
- </div>
62
- <div class="mt-1 sm:col-span-2 text-center">
63
- to
64
- </div>
65
- <div class="mt-1 sm:col-span-3 sm:mt-0">
66
- <%%= 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" %>
67
- </div>
68
- </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
+ ) %>
69
58
  <%- end -%>
70
59
  <%- end -%>
71
60
  <%- end -%>
@@ -73,7 +62,7 @@
73
62
  <%- belongs_to_assoc.each do |association| -%>
74
63
  <div class="sm:grid sm:grid-cols-3 sm:items-start sm:gap-4 pt-5">
75
64
  <label for="<%=association.name%>" class="block text-sm font-medium text-gray-700 sm:mt-px sm:pt-2">
76
- <%%=I18n.t('bo.<%=association.klass.name.underscore%>.one')%>
65
+ <%%= I18n.t('bo.<%=association.klass.name.underscore%>.one') %>
77
66
  </label>
78
67
  <div class="mt-1 sm:col-span-2 sm:mt-0">
79
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" } } %>
@@ -83,4 +72,3 @@
83
72
  <%% end %>
84
73
  </div>
85
74
  </div>
86
-
@@ -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.32'
2
+ VERSION = '0.0.35'
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.32
4
+ version: 0.0.35
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-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -153,6 +153,8 @@ 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
156
158
  - app/components/forms/search_input_component.html.erb
157
159
  - app/components/forms/search_input_component.rb
158
160
  - app/components/forms/submit_button_component.html.erb