dry_crud 6.0.0 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +2 -2
  3. data/README.rdoc +7 -6
  4. data/VERSION +1 -1
  5. data/app/assets/stylesheets/sample.scss +45 -24
  6. data/app/controllers/crud_controller.rb +19 -19
  7. data/app/controllers/dry_crud/generic_model.rb +2 -4
  8. data/app/controllers/dry_crud/render_callbacks.rb +3 -3
  9. data/app/controllers/list_controller.rb +1 -1
  10. data/app/helpers/actions_helper.rb +7 -7
  11. data/app/helpers/dry_crud/form/builder.rb +40 -43
  12. data/app/helpers/dry_crud/form/control.rb +8 -11
  13. data/app/helpers/dry_crud/table/actions.rb +12 -12
  14. data/app/helpers/dry_crud/table/builder.rb +10 -10
  15. data/app/helpers/dry_crud/table/col.rb +4 -4
  16. data/app/helpers/form_helper.rb +6 -8
  17. data/app/helpers/format_helper.rb +7 -7
  18. data/app/helpers/i18n_helper.rb +5 -5
  19. data/app/helpers/table_helper.rb +15 -16
  20. data/app/helpers/utility_helper.rb +3 -3
  21. data/app/views/crud/new.html.erb +1 -1
  22. data/app/views/crud/new.html.haml +1 -1
  23. data/app/views/layouts/application.html.erb +8 -6
  24. data/app/views/layouts/application.html.haml +6 -5
  25. data/app/views/list/_search.html.erb +1 -3
  26. data/app/views/list/_search.html.haml +1 -2
  27. data/app/views/shared/_error_messages.html.erb +2 -2
  28. data/lib/generators/dry_crud/dry_crud_generator.rb +1 -1
  29. data/lib/generators/dry_crud/templates/spec/controllers/crud_test_models_controller_spec.rb +4 -4
  30. data/lib/generators/dry_crud/templates/spec/helpers/dry_crud/form/builder_spec.rb +3 -3
  31. data/lib/generators/dry_crud/templates/spec/helpers/dry_crud/table/builder_spec.rb +1 -1
  32. data/lib/generators/dry_crud/templates/spec/helpers/form_helper_spec.rb +6 -5
  33. data/lib/generators/dry_crud/templates/spec/helpers/format_helper_spec.rb +2 -2
  34. data/lib/generators/dry_crud/templates/spec/helpers/table_helper_spec.rb +6 -6
  35. data/lib/generators/dry_crud/templates/spec/helpers/utility_helper_spec.rb +2 -2
  36. data/lib/generators/dry_crud/templates/spec/support/crud_controller_examples.rb +4 -6
  37. data/lib/generators/dry_crud/templates/spec/support/crud_controller_test_helper.rb +3 -3
  38. data/lib/generators/dry_crud/templates/test/controllers/crud_test_models_controller_test.rb +1 -1
  39. data/lib/generators/dry_crud/templates/test/helpers/custom_assertions_test.rb +5 -5
  40. data/lib/generators/dry_crud/templates/test/helpers/dry_crud/form/builder_test.rb +3 -3
  41. data/lib/generators/dry_crud/templates/test/helpers/form_helper_test.rb +8 -8
  42. data/lib/generators/dry_crud/templates/test/helpers/table_helper_test.rb +7 -7
  43. data/lib/generators/dry_crud/templates/test/helpers/utility_helper_test.rb +2 -2
  44. data/lib/generators/dry_crud/templates/test/support/crud_test_helper.rb +6 -6
  45. data/lib/generators/dry_crud/templates/test/support/crud_test_model.rb +2 -3
  46. data/lib/generators/dry_crud/templates/test/support/crud_test_models_controller.rb +4 -6
  47. data/lib/generators/dry_crud/templates/test/support/custom_assertions.rb +6 -6
  48. metadata +9 -10
@@ -8,7 +8,7 @@ module DryCrud
8
8
 
9
9
  attr_reader :builder, :attr, :args, :options, :addon, :help
10
10
 
11
- delegate :content_tag, :object,
11
+ delegate :tag, :object, :add_css_class,
12
12
  to: :builder
13
13
 
14
14
  # Html displayed to mark an input as required.
@@ -39,10 +39,10 @@ module DryCrud
39
39
  # (The value for this option usually is 'required').
40
40
  #
41
41
  # All the other options will go to the field_method.
42
- def initialize(builder, attr, *args)
42
+ def initialize(builder, attr, *args, **options)
43
43
  @builder = builder
44
44
  @attr = attr
45
- @options = args.extract_options!
45
+ @options = options
46
46
  @args = args
47
47
 
48
48
  @addon = options.delete(:addon)
@@ -70,11 +70,9 @@ module DryCrud
70
70
 
71
71
  # Create the HTML markup for any labeled content.
72
72
  def labeled
73
- errors = errors? ? ' has-error' : ''
74
-
75
- content_tag(:div, class: "form-group#{errors}") do
76
- builder.label(attr, caption, class: 'col-md-2 control-label') +
77
- content_tag(:div, content, class: "col-md-#{span}")
73
+ tag.div(class: 'row mb-3') do
74
+ builder.label(attr, caption, class: 'col-md-2 col-form-label') +
75
+ tag.div(content, class: "col-md-#{span}")
78
76
  end
79
77
  end
80
78
 
@@ -101,7 +99,8 @@ module DryCrud
101
99
  def input
102
100
  @input ||= begin
103
101
  options[:required] = 'required' if required
104
- builder.send(field_method, attr, *(args << options))
102
+ add_css_class(options, 'is-invalid') if errors?
103
+ builder.send(field_method, attr, *args, **options)
105
104
  end
106
105
  end
107
106
 
@@ -137,7 +136,6 @@ module DryCrud
137
136
 
138
137
  # Defines the field method to use based on the attribute
139
138
  # type, association or name.
140
- # rubocop:disable PerceivedComplexity
141
139
  def detect_field_method
142
140
  if type == :text
143
141
  :text_area
@@ -155,7 +153,6 @@ module DryCrud
155
153
  :text_field
156
154
  end
157
155
  end
158
- # rubocop:enable PerceivedComplexity
159
156
 
160
157
  # The column type of the attribute.
161
158
  def type
@@ -26,13 +26,13 @@ module DryCrud
26
26
  # Action column to show the row entry.
27
27
  # A block may be given to define the link path for the row entry.
28
28
  # If the block returns nil, no link is rendered.
29
- def show_action_col(html_options = {}, &block)
29
+ def show_action_col(**html_options, &block)
30
30
  action_col do |entry|
31
31
  path = action_path(entry, &block)
32
32
  if path
33
33
  table_action_link('zoom-in',
34
34
  path,
35
- html_options.clone)
35
+ **html_options.clone)
36
36
  end
37
37
  end
38
38
  end
@@ -40,12 +40,12 @@ module DryCrud
40
40
  # Action column to edit the row entry.
41
41
  # A block may be given to define the link path for the row entry.
42
42
  # If the block returns nil, no link is rendered.
43
- def edit_action_col(html_options = {}, &block)
43
+ def edit_action_col(**html_options, &block)
44
44
  action_col do |entry|
45
45
  path = action_path(entry, &block)
46
46
  if path
47
- path = path.is_a?(String) ? path : edit_polymorphic_path(path)
48
- table_action_link('pencil', path, html_options.clone)
47
+ path = edit_polymorphic_path(path) unless path.is_a?(String)
48
+ table_action_link('pencil', path, **html_options.clone)
49
49
  end
50
50
  end
51
51
  end
@@ -53,15 +53,15 @@ module DryCrud
53
53
  # Action column to destroy the row entry.
54
54
  # A block may be given to define the link path for the row entry.
55
55
  # If the block returns nil, no link is rendered.
56
- def destroy_action_col(html_options = {}, &block)
56
+ def destroy_action_col(**html_options, &block)
57
57
  action_col do |entry|
58
58
  path = action_path(entry, &block)
59
59
  if path
60
- table_action_link('remove',
60
+ table_action_link('trash',
61
61
  path,
62
- html_options.merge(
63
- data: { confirm: ti(:confirm_delete),
64
- method: :delete }
62
+ **html_options.merge(
63
+ data: { 'turbo-confirm': ti(:confirm_delete),
64
+ 'turbo-method': :delete }
65
65
  ))
66
66
  end
67
67
  end
@@ -74,8 +74,8 @@ module DryCrud
74
74
  end
75
75
 
76
76
  # Generic action link inside a table.
77
- def table_action_link(icon, url, html_options = {})
78
- add_css_class(html_options, "icon icon-#{icon}")
77
+ def table_action_link(icon, url, **html_options)
78
+ add_css_class(html_options, "bi-#{icon}")
79
79
  link_to('', url, html_options)
80
80
  end
81
81
 
@@ -16,11 +16,11 @@ module DryCrud
16
16
 
17
17
  attr_reader :entries, :cols, :options, :template
18
18
 
19
- delegate :content_tag, :format_attr, :column_type, :association, :dom_id,
19
+ delegate :tag, :format_attr, :column_type, :association, :dom_id,
20
20
  :captionize, :add_css_class, :content_tag_nested,
21
21
  to: :template
22
22
 
23
- def initialize(entries, template, options = {})
23
+ def initialize(entries, template, **options)
24
24
  @entries = entries
25
25
  @template = template
26
26
  @options = options
@@ -30,8 +30,8 @@ module DryCrud
30
30
  # Convenience method to directly generate a table. Renders a row for each
31
31
  # entry in entries. Takes a block that gets the table object as parameter
32
32
  # for configuration. Returns the generated html for the table.
33
- def self.table(entries, template, options = {})
34
- t = new(entries, template, options)
33
+ def self.table(entries, template, **options)
34
+ t = new(entries, template, **options)
35
35
  yield t
36
36
  t.to_html
37
37
  end
@@ -39,7 +39,7 @@ module DryCrud
39
39
  # Define a column for the table with the given header, the html_options
40
40
  # used for each td and a block rendering the contents of a cell for the
41
41
  # current entry. The columns appear in the order they are defined.
42
- def col(header = '', html_options = {}, &block)
42
+ def col(header = '', **html_options, &block)
43
43
  @cols << Col.new(header, html_options, @template, block)
44
44
  end
45
45
 
@@ -55,17 +55,17 @@ module DryCrud
55
55
  # Define a column for the given attribute and an optional header.
56
56
  # If no header is given, the attribute name is used. The cell will
57
57
  # contain the formatted attribute value for the current entry.
58
- def attr(attr, header = nil, html_options = {}, &block)
58
+ def attr(attr, header = nil, **html_options, &block)
59
59
  header ||= attr_header(attr)
60
60
  block ||= ->(e) { format_attr(e, attr) }
61
61
  add_css_class(html_options, align_class(attr))
62
- col(header, html_options, &block)
62
+ col(header, **html_options, &block)
63
63
  end
64
64
 
65
65
  # Renders the table as HTML.
66
66
  def to_html
67
- content_tag :table, options do
68
- content_tag(:thead, html_header) +
67
+ tag.table(**options) do
68
+ tag.thead(html_header) +
69
69
  content_tag_nested(:tbody, entries) { |e| html_row(e) }
70
70
  end
71
71
  end
@@ -98,7 +98,7 @@ module DryCrud
98
98
  def html_row(entry)
99
99
  attrs = {}
100
100
  attrs[:id] = dom_id(entry) if entry.respond_to?(:to_key)
101
- content_tag_nested(:tr, cols, attrs) { |c| c.html_cell(entry) }
101
+ content_tag_nested(:tr, cols, **attrs) { |c| c.html_cell(entry) }
102
102
  end
103
103
 
104
104
  # Determines the class of the table entries.
@@ -2,9 +2,9 @@ module DryCrud
2
2
  module Table
3
3
 
4
4
  # Helper class to store column information.
5
- class Col #:nodoc:
5
+ class Col # :nodoc:
6
6
 
7
- delegate :content_tag, :capture, to: :template
7
+ delegate :tag, :capture, to: :template
8
8
 
9
9
  attr_reader :header, :html_options, :template, :block
10
10
 
@@ -22,12 +22,12 @@ module DryCrud
22
22
 
23
23
  # Renders the header cell of the Col.
24
24
  def html_header
25
- content_tag(:th, header, html_options)
25
+ tag.th(header, **html_options)
26
26
  end
27
27
 
28
28
  # Renders a table cell for the given entry.
29
29
  def html_cell(entry)
30
- content_tag(:td, content(entry), html_options)
30
+ tag.td(content(entry), **html_options)
31
31
  end
32
32
 
33
33
  end
@@ -8,14 +8,14 @@
8
8
  module FormHelper
9
9
 
10
10
  # Renders a form using Crud::FormBuilder.
11
- def plain_form(object, options = {}, &block)
11
+ def plain_form(object, **options, &block)
12
12
  options[:html] ||= {}
13
13
  add_css_class(options[:html], 'form-horizontal')
14
14
  options[:html][:role] ||= 'form'
15
15
  options[:builder] ||= DryCrud::Form::Builder
16
16
  options[:cancel_url] ||= polymorphic_path(object, returning: true)
17
17
 
18
- form_for(object, options, &block)
18
+ form_for(object, **options, &block)
19
19
  end
20
20
 
21
21
  # Renders a standard form for the given entry and attributes.
@@ -23,8 +23,8 @@ module FormHelper
23
23
  # If a block is given, custom input fields may be rendered and attrs is
24
24
  # ignored. Before the input fields, the error messages are rendered,
25
25
  # if present. An options hash may be given as the last argument.
26
- def standard_form(object, *attrs, &block)
27
- plain_form(object, attrs.extract_options!) do |form|
26
+ def standard_form(object, *attrs, **options, &block)
27
+ plain_form(object, **options) do |form|
28
28
  content = [form.error_messages]
29
29
 
30
30
  content << if block_given?
@@ -41,11 +41,9 @@ module FormHelper
41
41
  # Renders a crud form for the current entry with default_crud_attrs or the
42
42
  # given attribute array. An options hash may be given as the last argument.
43
43
  # If a block is given, a custom form may be rendered and attrs is ignored.
44
- def crud_form(*attrs, &block)
45
- options = attrs.extract_options!
44
+ def crud_form(*attrs, **options, &block)
46
45
  attrs = default_crud_attrs - %i[created_at updated_at] if attrs.blank?
47
- attrs << options
48
- standard_form(path_args(entry), *attrs, &block)
46
+ standard_form(path_args(entry), *attrs, **options, &block)
49
47
  end
50
48
 
51
49
  end
@@ -10,10 +10,10 @@ module FormatHelper
10
10
  # Formats a basic value based on its Ruby class.
11
11
  def f(value)
12
12
  case value
13
- when Float, BigDecimal then
13
+ when Float, BigDecimal
14
14
  number_with_precision(value, precision: t('number.format.precision'),
15
15
  delimiter: t('number.format.delimiter'))
16
- when Integer then
16
+ when Integer
17
17
  number_with_delimiter(value, delimiter: t('number.format.delimiter'))
18
18
  when Date then l(value)
19
19
  when Time then "#{l(value.to_date)} #{l(value, format: :time)}"
@@ -38,9 +38,9 @@ module FormatHelper
38
38
  # Renders a simple unordered list, which will
39
39
  # simply render all passed items or yield them
40
40
  # to your block.
41
- def simple_list(items, ul_options = {})
42
- content_tag_nested(:ul, items, ul_options) do |item|
43
- content_tag(:li, block_given? ? yield(item) : f(item))
41
+ def simple_list(items, **ul_options)
42
+ content_tag_nested(:ul, items, **ul_options) do |item|
43
+ tag.li(block_given? ? yield(item) : f(item))
44
44
  end
45
45
  end
46
46
 
@@ -119,8 +119,8 @@ module FormatHelper
119
119
  when :time then l(val, format: :time)
120
120
  when :date then f(val.to_date)
121
121
  when :datetime, :timestamp then f(val.time)
122
- when :text then simple_format(h(val))
123
- when :decimal then
122
+ when :text then simple_format(h(val))
123
+ when :decimal
124
124
  number_with_precision(val.to_s.to_f,
125
125
  precision: column_property(obj, attr, :scale),
126
126
  delimiter: t('number.format.delimiter'))
@@ -12,11 +12,11 @@ module I18nHelper
12
12
  # - {parent_controller}.global.{key}
13
13
  # - ...
14
14
  # - global.{key}
15
- def translate_inheritable(key, variables = {})
15
+ def translate_inheritable(key, **variables)
16
16
  partial = defined?(@virtual_path) ? @virtual_path.gsub(/.*\/_?/, '') : nil
17
17
  defaults = inheritable_translation_defaults(key, partial)
18
18
  variables[:default] ||= defaults
19
- t(defaults.shift, variables)
19
+ t(defaults.shift, **variables)
20
20
  end
21
21
 
22
22
  alias ti translate_inheritable
@@ -28,13 +28,13 @@ module I18nHelper
28
28
  # - activerecord.associations.models.{model_name}.{association_name}.{key}
29
29
  # - activerecord.associations.{association_model_name}.{key}
30
30
  # - global.associations.{key}
31
- def translate_association(key, assoc = nil, variables = {})
31
+ def translate_association(key, assoc = nil, **variables)
32
32
  if assoc && assoc.options[:polymorphic].nil?
33
33
  variables[:default] ||= [association_klass_key(assoc, key).to_sym,
34
34
  :"global.associations.#{key}"]
35
- t(association_owner_key(assoc, key), variables)
35
+ t(association_owner_key(assoc, key), **variables)
36
36
  else
37
- t("global.associations.#{key}", variables)
37
+ t("global.associations.#{key}", **variables)
38
38
  end
39
39
  end
40
40
 
@@ -13,11 +13,10 @@ module TableHelper
13
13
  # appended to the attribute columns.
14
14
  # If entries is empty, an appropriate message is rendered.
15
15
  # An options hash may be given as the last argument.
16
- def plain_table(entries, *attrs)
17
- options = attrs.extract_options!
16
+ def plain_table(entries, *attrs, **options)
18
17
  add_css_class(options, 'table table-striped table-hover')
19
18
  builder = options.delete(:builder) || DryCrud::Table::Builder
20
- builder.table(entries, self, options) do |t|
19
+ builder.table(entries, self, **options) do |t|
21
20
  t.attrs(*attrs)
22
21
  yield t if block_given?
23
22
  end
@@ -25,21 +24,21 @@ module TableHelper
25
24
 
26
25
  # Renders a #plain_table for the given entries.
27
26
  # If entries is empty, an appropriate message is rendered.
28
- def plain_table_or_message(entries, *attrs, &block)
27
+ def plain_table_or_message(entries, *attrs, **options, &block)
29
28
  entries.to_a # force evaluation of relations
30
29
  if entries.present?
31
- plain_table(entries, *attrs, &block)
30
+ plain_table(entries, *attrs, **options, &block)
32
31
  else
33
- content_tag(:div, ti(:no_list_entries), class: 'table')
32
+ tag.div(ti(:no_list_entries), class: 'table')
34
33
  end
35
34
  end
36
35
 
37
36
  # Create a table of the +entries+ with the default or
38
37
  # the passed attributes in its columns. An options hash may be given
39
38
  # as the last argument.
40
- def list_table(*attrs, &block)
41
- attrs, options = explode_attrs_with_options(attrs, &block)
42
- plain_table_or_message(entries, options) do |t|
39
+ def list_table(*attrs, **options, &block)
40
+ attrs = attrs_or_default(attrs, &block)
41
+ plain_table_or_message(entries, **options) do |t|
43
42
  t.sortable_attrs(*attrs)
44
43
  yield t if block_given?
45
44
  end
@@ -52,10 +51,10 @@ module TableHelper
52
51
  # If a block is given, the column defined there will be inserted
53
52
  # between the given attributes and the actions.
54
53
  # An options hash for the table builder may be given as the last argument.
55
- def crud_table(*attrs, &block)
56
- attrs, options = explode_attrs_with_options(attrs, &block)
54
+ def crud_table(*attrs, **options, &block)
55
+ attrs = attrs_or_default(attrs, &block)
57
56
  first = attrs.shift
58
- plain_table_or_message(entries, options) do |t|
57
+ plain_table_or_message(entries, **options) do |t|
59
58
  t.attr_with_show_link(first) if first
60
59
  t.sortable_attrs(*attrs)
61
60
  yield t if block_given?
@@ -71,12 +70,12 @@ module TableHelper
71
70
 
72
71
  private
73
72
 
74
- def explode_attrs_with_options(attrs)
75
- options = attrs.extract_options!
73
+ def attrs_or_default(attrs)
76
74
  if !block_given? && attrs.blank?
77
- attrs = default_crud_attrs
75
+ default_crud_attrs
76
+ else
77
+ attrs
78
78
  end
79
- [attrs, options]
80
79
  end
81
80
 
82
81
  end
@@ -8,8 +8,8 @@ module UtilityHelper
8
8
 
9
9
  # Render a content tag with the collected contents rendered
10
10
  # by &block for each item in collection.
11
- def content_tag_nested(tag, collection, options = {}, &block)
12
- content_tag(tag, safe_join(collection, &block), options)
11
+ def content_tag_nested(tag, collection, **options, &block)
12
+ content_tag(tag, safe_join(collection, &block), **options)
13
13
  end
14
14
 
15
15
  # Overridden method that takes a block that is executed for each item in
@@ -30,7 +30,7 @@ module UtilityHelper
30
30
  # Adds a class to the given options, even if there are already classes.
31
31
  def add_css_class(options, classes)
32
32
  if options[:class]
33
- options[:class] += ' ' + classes if classes
33
+ options[:class] += " #{classes}" if classes
34
34
  else
35
35
  options[:class] = classes
36
36
  end
@@ -1,4 +1,4 @@
1
- <% @title ||= ti(:title, model: models_label(false)) -%>
1
+ <% @title ||= ti(:title, model: models_label(plural: false)) -%>
2
2
 
3
3
  <% content_for(:actions, index_action_link) %>
4
4
 
@@ -1,4 +1,4 @@
1
- - @title ||= ti(:title, model: models_label(false))
1
+ - @title ||= ti(:title, model: models_label(plural: false))
2
2
 
3
3
  - content_for(:actions, index_action_link)
4
4
 
@@ -5,31 +5,33 @@
5
5
  <meta charset="utf-8" />
6
6
  <title><%= strip_tags(@title) %> - MyApp</title>
7
7
 
8
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <meta name="viewport" content="width=device-width,initial-scale=1">
9
9
  <%= csrf_meta_tag %>
10
10
  <%= csp_meta_tag %>
11
11
 
12
- <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
13
- <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
12
+ <%= stylesheet_link_tag 'application', 'data-turbo-track': 'reload' %>
13
+ <%= javascript_include_tag 'application', 'data-turbo-track': 'reload', defer: true %>
14
14
 
15
15
  <%= yield :head %>
16
16
  </head>
17
17
  <body>
18
18
 
19
19
  <nav class="navbar navbar-expand-lg navbar-light bg-light mb-4">
20
- <%= render 'layouts/nav' %>
20
+ <div class="container-fluid">
21
+ <%= render 'layouts/nav' %>
22
+ </div>
21
23
  </nav>
22
24
 
23
25
  <div class="container">
24
26
 
25
27
  <h1><%= @title %></h1>
26
28
 
27
- <div class="row actions">
29
+ <div class="row actions mb-3">
28
30
  <div class="col-md-5">
29
31
  <%= yield :tools %>
30
32
  </div>
31
33
  <div class="col-md-7">
32
- <div class="btn-toolbar float-right">
34
+ <div class="btn-toolbar float-end">
33
35
  <%= yield :actions %>
34
36
  </div>
35
37
  </div>
@@ -11,23 +11,24 @@
11
11
  = csrf_meta_tag
12
12
  = csp_meta_tag
13
13
 
14
- = stylesheet_link_tag 'application', :media => 'all', 'data-turbolinks-track': 'reload'
15
- = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload'
14
+ = stylesheet_link_tag 'application', 'data-turbo-track': 'reload'
15
+ = javascript_include_tag 'application', 'data-turbo-track': 'reload', defer: true
16
16
 
17
17
  = yield :head
18
18
 
19
19
  %body
20
20
  %nav.navbar.navbar-expand-lg.navbar-light.bg-light.mb-4
21
- = render 'layouts/nav'
21
+ .container-fluid
22
+ = render 'layouts/nav'
22
23
 
23
24
  .container
24
25
  %h1= @title
25
26
 
26
- .row.actions
27
+ .row.actions.mb-3
27
28
  .col-md-5
28
29
  = yield :tools
29
30
  .col-md-7
30
- .btn-toolbar.float-right
31
+ .btn-toolbar.float-end
31
32
  = yield :actions
32
33
 
33
34
  #flash= render partial: 'layouts/flash', collection: [:notice, :alert], as: :level
@@ -3,8 +3,6 @@
3
3
  <%= hidden_field_tag :page, 1 %>
4
4
  <div class="input-group">
5
5
  <%= search_field_tag :q, params[:q], class: 'form-control' %>
6
- <span class="input-group-append">
7
- <%= submit_tag ti(:"button.search"), class: 'btn btn-outline-secondary' %>
8
- </span>
6
+ <%= submit_tag ti(:"button.search"), class: 'btn btn-outline-secondary' %>
9
7
  </div>
10
8
  <% end %>
@@ -3,5 +3,4 @@
3
3
  = hidden_field_tag :page, 1
4
4
  .input-group
5
5
  = search_field_tag :q, params[:q], class: 'form-control'
6
- %span.input-group-append
7
- = submit_tag ti(:"button.search"), class: 'btn btn-outline-secondary'
6
+ = submit_tag ti(:"button.search"), class: 'btn btn-outline-secondary'
@@ -1,8 +1,8 @@
1
1
  <% if errors.any? %>
2
2
  <div id='error_explanation' class='alert alert-danger'>
3
- <h2>
3
+ <p>
4
4
  <%= ti(:"errors.header", count: errors.count, model: object.to_s) %>
5
- </h2>
5
+ </p>
6
6
  <ul>
7
7
  <% errors.full_messages.each do |msg| %>
8
8
  <li><%= msg %></li>
@@ -1,6 +1,6 @@
1
1
  begin
2
2
  require 'generators/dry_crud/dry_crud_generator_base'
3
- rescue LoadError => _e # rubocop:disable Lint/HandleExceptions
3
+ rescue LoadError => _e
4
4
  # ok, we are in the rake task
5
5
  end
6
6
 
@@ -50,7 +50,7 @@ describe CrudTestModelsController do
50
50
  end
51
51
 
52
52
  it 'has models_label singular' do
53
- expect(controller.models_label(false)).to eq('Crud Test Model')
53
+ expect(controller.models_label(plural: false)).to eq('Crud Test Model')
54
54
  end
55
55
  end
56
56
 
@@ -245,7 +245,7 @@ describe CrudTestModelsController do
245
245
 
246
246
  context 'plain', combine: 'chcp' do
247
247
  it_is_expected_to_respond
248
- it_is_expected_to_persist_entry(false)
248
+ it_is_expected_to_persist_entry(persist: false)
249
249
  it_is_expected_to_have_flash(:alert)
250
250
 
251
251
  it 'sets entry name' do
@@ -292,7 +292,7 @@ describe CrudTestModelsController do
292
292
 
293
293
  context 'plain', combine: 'chip' do
294
294
  it_is_expected_to_respond
295
- it_is_expected_to_persist_entry(false)
295
+ it_is_expected_to_persist_entry(persist: false)
296
296
  it_is_expected_to_not_have_flash(:notice)
297
297
  it_is_expected_to_not_have_flash(:alert)
298
298
 
@@ -316,7 +316,7 @@ describe CrudTestModelsController do
316
316
 
317
317
  context 'plain', combine: 'cjcb' do
318
318
  it_is_expected_to_respond(422)
319
- it_is_expected_to_persist_entry(false)
319
+ it_is_expected_to_persist_entry(persist: false)
320
320
  it_is_expected_to_not_have_flash(:notice)
321
321
  it_is_expected_to_not_have_flash(:alert)
322
322
  it_is_expected_to_render_json
@@ -42,7 +42,7 @@ describe 'DryCrud::Form::Builder' do
42
42
  other_ids: :has_many_field,
43
43
  more_ids: :has_many_field }.each do |attr, method|
44
44
  it "dispatches #{attr} attr to #{method}" do
45
- expect(form).to receive(method).with(attr, {})
45
+ expect(form).to receive(method).with(attr)
46
46
  form.input_field(attr)
47
47
  end
48
48
 
@@ -63,12 +63,12 @@ describe 'DryCrud::Form::Builder' do
63
63
  describe '#labeled_input_field' do
64
64
  context 'when required' do
65
65
  subject { form.labeled_input_field(:name) }
66
- it { is_expected.to include('input-group-append') }
66
+ it { is_expected.to include('input-group-text') }
67
67
  end
68
68
 
69
69
  context 'when not required' do
70
70
  subject { form.labeled_input_field(:remarks) }
71
- it { is_expected.not_to include('input-group-append') }
71
+ it { is_expected.not_to include('input-group-text') }
72
72
  end
73
73
 
74
74
  context 'with help text' do
@@ -8,7 +8,7 @@ describe 'DryCrud::Table::Builder' do
8
8
  let(:entries) { %w[foo bahr] }
9
9
  let(:table) { DryCrud::Table::Builder.new(entries, self) }
10
10
 
11
- def format_size(obj) #:nodoc:
11
+ def format_size(obj) # :nodoc:
12
12
  "#{obj.size} chars"
13
13
  end
14
14
 
@@ -97,7 +97,7 @@ describe FormHelper do
97
97
 
98
98
  it do
99
99
  is_expected.to match(/input .*?type="number"
100
- .*?value=\"9\"
100
+ .*?value="9"
101
101
  .*?name="crud_test_model\[children\]"/x)
102
102
  end
103
103
 
@@ -132,9 +132,10 @@ describe FormHelper do
132
132
  end
133
133
 
134
134
  it do
135
- is_expected.to match(/div\ class="form-group\ has-error"\>.*?
136
- \<input .*?type="text"
137
- .*?name="crud_test_model\[name\]"/x)
135
+ is_expected.to match(/div\ class="row\ mb-3">.*?
136
+ <input .*?class="is-invalid\ form-control"
137
+ .*?type="text"
138
+ .*?name="crud_test_model\[name\]"/x)
138
139
  end
139
140
 
140
141
  it do
@@ -191,7 +192,7 @@ describe FormHelper do
191
192
  end
192
193
 
193
194
  it do
194
- is_expected.to match(/input .*?type="datetime\-local"
195
+ is_expected.to match(/input .*?type="datetime-local"
195
196
  .*?name="crud_test_model\[last_seen\]"/x)
196
197
  end
197
198