inline_forms 8.1.58 → 8.1.60

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: e989cef82d52e8f127898955b5741aa163ac8018c5d376a1031d2b7fc4606b36
4
- data.tar.gz: 1dd15f90a192376d102aa5247502537a4427388517601dd3b4daba091a4a7385
3
+ metadata.gz: 51bf71fc0e838244f70a9a53db6cfe0a3515cda9e43086bfded9a08c9b56b144
4
+ data.tar.gz: 85796e1ea1d4dcc5d1afb094e67e045279ba862590e7bb25472e496eadd628ae
5
5
  SHA512:
6
- metadata.gz: aef0b60a06a818a73ebc92defa6d2466f94aede8a39865870b3b3365e508b00642afafe05614addcc3ac0e3b2bf67a0bf3659531ef834c44050014e2bf2e3401
7
- data.tar.gz: 4b478b2e1854e9c6427e13014f0694883f362184c86b6dfecfa25e9c3ef71752ca60c807c66b2d00f78eaa69dbed73b29afdc1138caece51e818ac340b9e3542
6
+ metadata.gz: 0b674c30e72e0ac91aebe7cbe9c619cece169be0098faa9a1e50693831eb937ae4f572b363beb26678f9caa3d6c4ceb7f368aa9127ebd310f22a996b6d36fc4a
7
+ data.tar.gz: e08e0398a885ca964e6403f379e4d293da09d02b204728f709aaf728ed2ee873666899f87d1408843152d3e089aa8ff3c12a9fb028246194a0df8f0b64400b0e
data/CHANGELOG.md CHANGED
@@ -4,6 +4,53 @@ All notable changes to this project are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [8.1.60] - 2026-10-28
8
+
9
+ Fixes from a review of 8.1.58 and 8.1.59.
10
+
11
+ ### Fixed
12
+
13
+ - **Dropdowns take only the order from `inline_forms_list`.** 8.1.59's rule 3 merged the whole `inline_forms_list` scope into `dropdown` and `dropdown_with_other`, so a `where` or `joins` there hid records from the dropdown. A record whose current value was hidden showed the first option instead, and saving the inline form silently changed it. Rule 3 now uses only the scope's ORDER BY (added to a `default_scope` order, as the merge did). The scope still filters `/index`.
14
+ - **`check_list` keeps the `inline_forms_list` filter.** Under rules 1 and 2 (a declared order or a `dropdown_order` column) 8.1.59 skipped the scope, so `check_list` listed records its `where` used to hide. It now applies the scope's filter under every rule, as before 8.1.59; the order is still `InlineForms::DropdownOrder`'s.
15
+ - **A `dropdown` whose lookup defines `disabled_for_dropdown?` loads the lookup once.** 8.1.59 loaded it to find the disabled options and again, ordered, for the options.
16
+ - **Installer: a gem path with a space no longer breaks the Dart Sass build.** 8.1.58's initializer put the gem's stylesheet dir first as a `build_options` entry, and dartsass-rails splits those on whitespace, so a gem installed under e.g. `/Users/John Doe/…` gave Sass two broken arguments. `config/initializers/inline_forms_dartsass_builds.rb` now prepends the dir to `Dartsass::Runner`'s own `--load-path` list as a separate argument, still ahead of `app/assets/builds`. Apps generated with 8.1.58 or 8.1.59 can copy the new initializer from the installer's `lib/installer_templates/dartsass/`.
17
+ - **Example app: rolling back the seed migration works.** Its `down` destroyed the seeded owners while the seeded apartments still pointed at them, and `apartments.owner_id` / `apartments.phase_id` have foreign keys, so `Owner#destroy` raised `ActiveRecord::InvalidForeignKey`. It now sets those columns to NULL on every apartment that points at a seeded owner or phase before destroying it.
18
+ - The installer's `ApplicationRecord` template says rule 3 is the ORDER BY of `inline_forms_list`.
19
+
20
+ ### Tests
21
+
22
+ - `dropdown_test`: a filtering `inline_forms_list` orders a dropdown without hiding records, `check_list` keeps that filter under a declared order, and `disabled_for_dropdown?` costs no second query.
23
+ - Example app: `example_app_dartsass_build_test` checks that the gem's stylesheet dir is the first `--load-path` and a separate argument.
24
+
25
+ ### Lockstep
26
+
27
+ - validation_hints 8.1.60, inline_forms_installer 8.1.60, inline_forms_schema_edit 8.1.60.
28
+
29
+ ## [8.1.59] - 2026-10-22
30
+
31
+ ### Fixed
32
+
33
+ - **Dropdowns follow the model's order again, with one rule for every table-backed list.** 8.1.58 made `dropdown` sort its options alphabetically by presentation. That overrode the order lookups depend on, such as '---' / 'onbekend' first and process phases in process order. Before that, from 2017 to 8.1.57, the sort was discarded and dropdowns showed database order. Until 2015 they used the model's `order_by_clause`. `dropdown_with_other` used database order, and `check_list` used `inline_forms_list`. All three now use `InlineForms::DropdownOrder`; the first match wins:
34
+ 1. the model declares **`inline_forms_dropdown_order :column`** (or `:column, :desc`);
35
+ 2. the table has a **`dropdown_order`** column, used ascending: give '---' 0 and the phases 10, 20, 30;
36
+ 3. the model's `inline_forms_list` scope (its list order; unchanged for `check_list`);
37
+ 4. database order, including a `default_scope` order.
38
+
39
+ Rules 1 and 2 replace any `default_scope` order, put NULLs last (a record nobody has numbered yet goes to the end) and break ties on `id`.
40
+ - The macro is on every Active Record model (engine initializer `inline_forms.dropdown_order`), so hosts need no `ApplicationRecord` change. An unknown direction raises `ArgumentError` when the class loads; an unknown column raises when the dropdown renders.
41
+ - **Hosts:** lookups that declare nothing keep their `inline_forms_list` order. StProject's lookups declare `order(:name, :id)`, so they stay alphabetical; Scouting's `default_scope { order(name: :asc) }` still applies. A lookup that needs a fixed order gets a `dropdown_order` integer column, or `inline_forms_dropdown_order`. Papiamentu's `def self.order_by_clause` is still not read; use the macro instead.
42
+ - The installer's `ApplicationRecord` template documents the rule.
43
+ - **Example app: a `Phase` lookup shows the rule.** `inline_forms create … --example` generates `Phase` (`name`, `dropdown_order`), gives Apartment a `phase` dropdown below `owner`, and seeds `---` 0, helprequest 10, decision 20, admittance 30, created in neither order. On an apartment the dropdown reads ---, helprequest, decision, admittance, while `/phases` lists them alphabetically (`_list_order:name`). The seeded apartments get helprequest, decision and ---.
44
+
45
+ ### Tests
46
+
47
+ - `dropdown_test`: each rule, desc, declared column over `dropdown_order`, NULLs last, `id` tie-break, `dropdown_with_other` and `check_list`, bad direction or column. The dummy app gains a `Phase` lookup with a `dropdown_order` column (`Part belongs_to :phase`).
48
+ - Example app: `example_app_phase_dropdown_test` checks the apartment's phase dropdown order, that choosing a phase saves it, and that `/phases` keeps its alphabetical list order.
49
+
50
+ ### Lockstep
51
+
52
+ - validation_hints 8.1.59, inline_forms_installer 8.1.59, inline_forms_schema_edit 8.1.59.
53
+
7
54
  ## [8.1.58] - 2026-10-21
8
55
 
9
56
  Three gem issues found in the StProject review (2026-10-04). The fourth it listed, the CSS `@import` of `http://fonts.googleapis.com`, was already fixed in 8.1.22 (self-hosted Open Sans). Also the first step of the Sass `@import` → `@use` move.
@@ -26,6 +26,16 @@ class ApplicationRecord < ActiveRecord::Base
26
26
  # `unscope`/`reorder` cleanly.
27
27
  scope :inline_forms_list, -> { all }
28
28
 
29
+ # Dropdowns, dropdown_with_other and check_list offer a model's records in
30
+ # this order (first match wins; InlineForms::DropdownOrder):
31
+ # 1. inline_forms_dropdown_order :col # or :col, :desc
32
+ # 2. a `dropdown_order` integer column, ascending (e.g. '---' 0,
33
+ # 'helprequest' 10, 'decision' 20, 'admittance' 30)
34
+ # 3. the order of inline_forms_list above (only its ORDER BY: a where
35
+ # there filters #index, not the dropdowns)
36
+ # 4. database order
37
+ # 1 and 2 put NULLs last and break ties on id.
38
+
29
39
  # Wrapper for @model.human_attribute_name -> Model.human_attribute_name
30
40
  def human_attribute_name(*args)
31
41
  self.class.human_attribute_name(*args)
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module InlineForms
4
+ # The order in which a table-backed form element (dropdown,
5
+ # dropdown_with_other, check_list) offers its records. First match wins:
6
+ #
7
+ # 1. the model declares `inline_forms_dropdown_order :column, :asc|:desc`;
8
+ # 2. the table has a `dropdown_order` column (ascending), so a lookup can
9
+ # put '---' / 'onbekend' first and process phases in process order;
10
+ # 3. the ORDER BY of the model's `inline_forms_list` scope (its list order;
11
+ # only the order: a where/joins in that scope does not hide records here);
12
+ # 4. database order (a default_scope order included).
13
+ #
14
+ # 1 and 2 replace any default_scope order, put NULLs last (a record nobody
15
+ # numbered yet goes to the end) and break ties on the primary key. 3 adds to
16
+ # a default_scope order, as merging the scope did.
17
+ #
18
+ # The macro is on every Active Record model (engine initializer), so hosts
19
+ # need no ApplicationRecord change.
20
+ module DropdownOrder
21
+ COLUMN = "dropdown_order"
22
+ DIRECTIONS = %i[asc desc].freeze
23
+
24
+ module ClassMethods
25
+ def inline_forms_dropdown_order(column, direction = :asc)
26
+ direction = direction.to_s.downcase.to_sym
27
+ unless DIRECTIONS.include?(direction)
28
+ raise ArgumentError, "inline_forms_dropdown_order: direction must be :asc or :desc, got #{direction.inspect}"
29
+ end
30
+
31
+ @inline_forms_dropdown_order = [ column.to_s, direction ].freeze
32
+ end
33
+
34
+ # [column, direction] declared on this class or an ancestor, or nil.
35
+ def inline_forms_dropdown_order_spec
36
+ return @inline_forms_dropdown_order if defined?(@inline_forms_dropdown_order)
37
+
38
+ superclass.inline_forms_dropdown_order_spec if superclass.respond_to?(:inline_forms_dropdown_order_spec)
39
+ end
40
+ end
41
+
42
+ def self.apply(relation)
43
+ klass = relation.klass
44
+ column, direction = klass.inline_forms_dropdown_order_spec if klass.respond_to?(:inline_forms_dropdown_order_spec)
45
+ column, direction = COLUMN, :asc if column.nil? && klass.column_names.include?(COLUMN)
46
+
47
+ if column
48
+ unless klass.column_names.include?(column)
49
+ raise ArgumentError, "#{klass.name}.inline_forms_dropdown_order: #{klass.table_name} has no column #{column.inspect}"
50
+ end
51
+
52
+ table = klass.arel_table
53
+ keys = [ table[column].public_send(direction).nulls_last ]
54
+ keys << table[klass.primary_key].asc if klass.primary_key && klass.primary_key != column
55
+ relation.reorder(*keys)
56
+ elsif (list_order = list_order_values(klass)).any?
57
+ relation.order(*list_order)
58
+ else
59
+ relation
60
+ end
61
+ end
62
+
63
+ def self.list_order_values(klass)
64
+ klass.respond_to?(:inline_forms_list) ? klass.inline_forms_list.order_values : []
65
+ end
66
+ end
67
+ end
@@ -21,7 +21,10 @@ module InlineForms
21
21
  object.send(attribute).build if object.send(attribute).empty?
22
22
  klass = object.send(attribute).first.class
23
23
  values = cancan_enabled? ? klass.accessible_by(current_ability) : klass.all
24
- values = values.merge(klass.inline_forms_list) if klass.respond_to?(:inline_forms_list)
24
+ # check_list has always applied the list scope's filter (a where in
25
+ # inline_forms_list hides records here); the order is DropdownOrder's.
26
+ values = values.merge(klass.inline_forms_list.unscope(:order)) if klass.respond_to?(:inline_forms_list)
27
+ values = InlineForms::DropdownOrder.apply(values)
25
28
  out = ''
26
29
  values.each do | item |
27
30
  out << "<div class='row #{cycle('odd', 'even')}'>"
@@ -25,11 +25,12 @@ module InlineForms
25
25
  else
26
26
  values = klass.all
27
27
  end
28
+ values = InlineForms::DropdownOrder.apply(values)
28
29
  options_disabled = nil
29
30
  if klass.method_defined? :disabled_for_dropdown?
31
+ # loads values; collection_select below reuses the loaded records
30
32
  options_disabled = values.map{|v| v.id if v.disabled_for_dropdown?}.compact
31
33
  end
32
- values = values.sort_by {|v|v.send presentation}
33
34
  # the leading underscore is to avoid name conflicts, like 'email' and 'email_type' will result in 'email' and 'email[email_type_id]' in the form!
34
35
  collection_select( ('_' + object.class.to_s.underscore).to_sym,
35
36
  attribute.to_s.foreign_key.to_sym,
@@ -31,6 +31,7 @@ module InlineForms
31
31
  o = attribute.camelcase.constantize
32
32
  values = o.all
33
33
  values = o.accessible_by(current_ability) if cancan_enabled?
34
+ values = InlineForms::DropdownOrder.apply(values)
34
35
 
35
36
  current =
36
37
  if object[foreign_key].to_i == 0
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module InlineForms
4
- VERSION = "8.1.58"
4
+ VERSION = "8.1.60"
5
5
  end
data/lib/inline_forms.rb CHANGED
@@ -10,6 +10,7 @@ require "inline_forms/schema_apply"
10
10
  require "inline_forms/schema_label"
11
11
  require "inline_forms/form_element_from_callee"
12
12
  require "inline_forms/searchable"
13
+ require "inline_forms/dropdown_order"
13
14
  require "inline_forms/archived_form_elements"
14
15
  require "inline_forms/form_element_registry"
15
16
  require "inline_forms/form_elements"
@@ -359,6 +360,14 @@ module InlineForms
359
360
  end
360
361
  end
361
362
 
363
+ # `inline_forms_dropdown_order` on every model (InlineForms::DropdownOrder),
364
+ # so hosts need no ApplicationRecord change to declare a dropdown order.
365
+ initializer "inline_forms.dropdown_order" do
366
+ ActiveSupport.on_load(:active_record) do
367
+ extend InlineForms::DropdownOrder::ClassMethods
368
+ end
369
+ end
370
+
362
371
  initializer "inline_forms.assets.precompile" do |app|
363
372
  # Skip when the host has no Sprockets-style pipeline (e.g. the test/dummy
364
373
  # harness); generated apps always bundle sprockets-rails.
@@ -3,6 +3,7 @@
3
3
  # Child of Machine (see machine.rb); shaped like the example app's Photo.
4
4
  class Part < ApplicationRecord
5
5
  belongs_to :machine, optional: true
6
+ belongs_to :phase, optional: true
6
7
 
7
8
  def _presentation
8
9
  "#{name}"
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Lookup with a dropdown_order column: dropdowns offer its records in that
4
+ # order (InlineForms::DropdownOrder). Part belongs_to it.
5
+ class Phase < ApplicationRecord
6
+ def _presentation
7
+ name
8
+ end
9
+ end
@@ -2,16 +2,145 @@
2
2
 
3
3
  require_relative "../integration_test_helper"
4
4
 
5
- # dropdown_edit sorts its options by presentation; the sort_by result used to
6
- # be discarded, so the options came out in id order.
5
+ # Order of the records table-backed form elements offer
6
+ # (InlineForms::DropdownOrder): the model's inline_forms_dropdown_order, else
7
+ # a dropdown_order column, else inline_forms_list, else database order.
7
8
  class DropdownTest < InlineFormsIntegrationTestCase
8
- test "dropdown_edit lists the options sorted by presentation" do
9
- %w[Zeta Alpha Mu].each { |name| Machine.create!(name: name) }
10
- part = Part.create!(name: "Gear")
9
+ teardown do
10
+ [ Phase, Machine, Kind, Part ].each do |klass|
11
+ klass.remove_instance_variable(:@inline_forms_dropdown_order) if klass.instance_variable_defined?(:@inline_forms_dropdown_order)
12
+ end
13
+ # Back to ApplicationRecord's `inline_forms_list -> { all }`.
14
+ [ Kind, Part ].each do |klass|
15
+ klass.singleton_class.remove_method(:inline_forms_list) if klass.singleton_class.method_defined?(:inline_forms_list, false)
16
+ end
17
+ Phase.remove_method(:disabled_for_dropdown?) if Phase.method_defined?(:disabled_for_dropdown?, false)
18
+ end
11
19
 
20
+ def view
12
21
  get machines_path
13
- html = controller.view_context.dropdown_edit(part, :machine)
22
+ controller.view_context
23
+ end
24
+
25
+ def option_texts(html)
26
+ html.scan(%r{<option(?: [^>]*)?>([^<]*)</option>}).flatten
27
+ end
28
+
29
+ def create_phases
30
+ Phase.create!(name: "admittance", dropdown_order: 30)
31
+ Phase.create!(name: "nieuw")
32
+ Phase.create!(name: "decision", dropdown_order: 20)
33
+ Phase.create!(name: "---", dropdown_order: 0)
34
+ Phase.create!(name: "helprequest", dropdown_order: 10)
35
+ end
36
+
37
+ test "a dropdown_order column orders the dropdown, NULLs last" do
38
+ create_phases
39
+
40
+ html = view.dropdown_edit(Part.create!(name: "Gear"), :phase)
41
+
42
+ assert_equal [ "---", "helprequest", "decision", "admittance", "nieuw" ], option_texts(html)
43
+ end
44
+
45
+ test "the model's declared direction applies to the dropdown_order column" do
46
+ create_phases
47
+ Phase.inline_forms_dropdown_order :dropdown_order, :desc
48
+
49
+ html = view.dropdown_edit(Part.create!(name: "Gear"), :phase)
50
+
51
+ assert_equal [ "admittance", "decision", "helprequest", "---", "nieuw" ], option_texts(html)
52
+ end
53
+
54
+ test "a declared column wins over the dropdown_order column" do
55
+ create_phases
56
+ Phase.inline_forms_dropdown_order :name, :desc
57
+
58
+ html = view.dropdown_edit(Part.create!(name: "Gear"), :phase)
59
+
60
+ assert_equal [ "nieuw", "helprequest", "decision", "admittance", "---" ], option_texts(html)
61
+ end
62
+
63
+ test "without a declaration or column, the list order applies" do
64
+ %w[Zeta Alpha Mu].each { |name| Machine.create!(name: name) } # inline_forms_list: order(:name, :id)
65
+
66
+ html = view.dropdown_edit(Part.create!(name: "Gear"), :machine)
67
+
68
+ assert_equal %w[Alpha Mu Zeta], option_texts(html)
69
+ end
70
+
71
+ test "ties on the declared column break on id" do
72
+ first = Phase.create!(name: "same", dropdown_order: 5)
73
+ second = Phase.create!(name: "same", dropdown_order: 5)
74
+
75
+ assert_equal [ first.id, second.id ], InlineForms::DropdownOrder.apply(Phase.all).map(&:id)
76
+ end
77
+
78
+ test "without anything declared, records come in database order" do
79
+ %w[Zeta Alpha].each { |name| Kind.create!(name: name) } # inline_forms_list: all
80
+
81
+ assert_equal %w[Zeta Alpha], InlineForms::DropdownOrder.apply(Kind.all).map(&:name)
82
+ end
83
+
84
+ test "a filtering inline_forms_list only orders a dropdown, it hides no records" do
85
+ %w[Zeta Hidden Alpha].each { |name| Kind.create!(name: name) }
86
+ Kind.define_singleton_method(:inline_forms_list) { where.not(name: "Hidden").order(:name, :id) }
87
+
88
+ html = view.dropdown_with_other_edit(Widget.create!(name: "W"), :kind)
89
+
90
+ assert_equal %w[Alpha Hidden Zeta], html.scan(/<option value="([^"]*)">/).flatten
91
+ end
92
+
93
+ test "disabled_for_dropdown? and the options come from one query" do
94
+ create_phases
95
+ Phase.define_method(:disabled_for_dropdown?) { name == "decision" }
96
+ selects = []
97
+ counter = ->(*, payload) { selects << payload[:sql] if payload[:sql].match?(/\ASELECT .*FROM "phases"/) }
98
+
99
+ view_context, part = view, Part.create!(name: "Gear")
100
+
101
+ html = ActiveSupport::Notifications.subscribed(counter, "sql.active_record") do
102
+ view_context.dropdown_edit(part, :phase)
103
+ end
104
+
105
+ assert_equal 1, selects.size, selects.join("\n")
106
+ assert_match(/<option disabled="disabled" value="\d+">decision</, html)
107
+ assert_equal [ "---", "helprequest", "decision", "admittance", "nieuw" ], option_texts(html)
108
+ end
109
+
110
+ test "dropdown_with_other offers its datalist in the dropdown order" do
111
+ %w[Zeta Alpha Mu].each { |name| Kind.create!(name: name) }
112
+ Kind.inline_forms_dropdown_order :name
113
+
114
+ html = view.dropdown_with_other_edit(Widget.create!(name: "W"), :kind)
115
+
116
+ assert_equal %w[Alpha Mu Zeta], html.scan(/<option value="([^"]*)">/).flatten
117
+ end
118
+
119
+ test "check_list lists its records in the dropdown order" do
120
+ machine = Machine.create!(name: "Press")
121
+ %w[Bolt Nut Axle].each { |name| Part.create!(name: name) }
122
+ Part.inline_forms_dropdown_order :name, :desc
123
+
124
+ html = view.check_list_edit(machine, :parts)
125
+
126
+ assert_equal %w[Nut Bolt Axle], html.scan(%r{<label for=[^>]*>([^<]*)</label>}).flatten.reject(&:empty?)
127
+ end
128
+
129
+ test "check_list keeps the inline_forms_list filter under a declared order" do
130
+ machine = Machine.create!(name: "Press")
131
+ %w[Bolt Hidden Nut Axle].each { |name| Part.create!(name: name) }
132
+ Part.define_singleton_method(:inline_forms_list) { where.not(name: "Hidden").order(:name) }
133
+ Part.inline_forms_dropdown_order :name, :desc
134
+
135
+ html = view.check_list_edit(machine, :parts)
136
+
137
+ assert_equal %w[Nut Bolt Axle], html.scan(%r{<label for=[^>]*>([^<]*)</label>}).flatten.reject(&:empty?)
138
+ end
139
+
140
+ test "an unknown direction or column is refused" do
141
+ assert_raises(ArgumentError) { Phase.inline_forms_dropdown_order :name, :up }
14
142
 
15
- assert_equal %w[Alpha Mu Zeta], html.scan(%r{<option value="\d+">([^<]*)</option>}).flatten
143
+ Phase.inline_forms_dropdown_order :position
144
+ assert_raises(ArgumentError) { InlineForms::DropdownOrder.apply(Phase.all).to_a }
16
145
  end
17
146
  end
@@ -42,9 +42,18 @@ ActiveRecord::Schema.define do
42
42
  t.timestamps
43
43
  end
44
44
 
45
+ # Lookup with a dropdown_order column (InlineForms::DropdownOrder);
46
+ # Part belongs_to it for the dropdown tests.
47
+ create_table :phases, force: true do |t|
48
+ t.string :name
49
+ t.integer :dropdown_order
50
+ t.timestamps
51
+ end
52
+
45
53
  create_table :parts, force: true do |t|
46
54
  t.string :name
47
55
  t.integer :machine_id
56
+ t.integer :phase_id
48
57
  t.timestamps
49
58
  end
50
59
  add_index :parts, :machine_id
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inline_forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.1.58
4
+ version: 8.1.60
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ace Suares
@@ -223,6 +223,7 @@ files:
223
223
  - lib/inline_forms.rb
224
224
  - lib/inline_forms/archived_form_elements.rb
225
225
  - lib/inline_forms/attribute_list.rb
226
+ - lib/inline_forms/dropdown_order.rb
226
227
  - lib/inline_forms/form_element_from_callee.rb
227
228
  - lib/inline_forms/form_element_registry.rb
228
229
  - lib/inline_forms/form_elements.rb
@@ -299,6 +300,7 @@ files:
299
300
  - test/dummy/app/models/kind.rb
300
301
  - test/dummy/app/models/machine.rb
301
302
  - test/dummy/app/models/part.rb
303
+ - test/dummy/app/models/phase.rb
302
304
  - test/dummy/app/models/widget.rb
303
305
  - test/dummy/app/views/_gizmos_search.html.erb
304
306
  - test/dummy/app/views/stats/show.html.erb
@@ -388,6 +390,7 @@ test_files:
388
390
  - test/dummy/app/models/kind.rb
389
391
  - test/dummy/app/models/machine.rb
390
392
  - test/dummy/app/models/part.rb
393
+ - test/dummy/app/models/phase.rb
391
394
  - test/dummy/app/models/widget.rb
392
395
  - test/dummy/app/views/_gizmos_search.html.erb
393
396
  - test/dummy/app/views/stats/show.html.erb