tybo 0.0.32 → 0.0.35

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.
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