inline_forms 8.1.57 → 8.1.58

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: 93e0cd0c2bc09c666bd81cf76779b780ab345f4a7e80f8a6535177d7921b150d
4
- data.tar.gz: 02e8abc26971fe105a65b8bae7380d171e2635e1e51385c0849917e1a5365c16
3
+ metadata.gz: e989cef82d52e8f127898955b5741aa163ac8018c5d376a1031d2b7fc4606b36
4
+ data.tar.gz: 1dd15f90a192376d102aa5247502537a4427388517601dd3b4daba091a4a7385
5
5
  SHA512:
6
- metadata.gz: ecdf5c3b1c43851b0cd0d6b05fdac85a51b227c30584a52bb395c9786c1dffdb9378e549b6d99a1faf5ff11aa8bfc7ecda01ae1b92e494cf2dfdf9750fc3fae4
7
- data.tar.gz: df8a5b2b0cd7a9f21a9b14e58a086ed7ace99f9ce6380bd1e8284cae6b65183b4db72e15de2c8ffa332e9366d85780dc6ccb125e12bfa7afa4a24ed204383a7a
6
+ metadata.gz: aef0b60a06a818a73ebc92defa6d2466f94aede8a39865870b3b3365e508b00642afafe05614addcc3ac0e3b2bf67a0bf3659531ef834c44050014e2bf2e3401
7
+ data.tar.gz: 4b478b2e1854e9c6427e13014f0694883f362184c86b6dfecfa25e9c3ef71752ca60c807c66b2d00f78eaa69dbed73b29afdc1138caece51e818ac340b9e3542
data/CHANGELOG.md CHANGED
@@ -4,6 +4,37 @@ All notable changes to this project are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [8.1.58] - 2026-10-21
8
+
9
+ 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.
10
+
11
+ ### Changed
12
+
13
+ - **Sass: the entry points load `foundation_and_overrides` with `@use`.** `inline_forms/inline_forms.scss` and `inline_forms/devise.scss` replace `@import 'foundation_and_overrides'` with `@use 'foundation_and_overrides' as *` plus `@forward 'foundation_and_overrides'`. Dart Sass 3 removes `@import`, and these were two of the five gem `@import`s a host build reported.
14
+ - The compiled `inline_forms.css` and `devise.css` are **byte-identical** to 8.1.57's (compressed, compiled with the host's dartsass-rails command; same SHA-256).
15
+ - One rule needed spelling out to stay identical: Foundation's flex grid makes `.columns` an alias with `.columns { @extend .column }`, which reached the gem's `.column { padding-right: 0 !important }` only while the file was `@import`ed. That rule is now `.column, .columns`.
16
+ - The `@forward` keeps the module's API for hosts: Foundation's members (`rem-calc`, `$global-width`, ...) stay visible through `@use "inline_forms/inline_forms" as *`, and the `!default` `$if-*` palette can still be set with `@use "inline_forms/inline_forms" with ($if-accent: ...)`. Without it, both fail to compile.
17
+ - The URL is relative, so it resolves next to the gem's file first, as the `@import` did; a host's `app/assets/stylesheets/inline_forms/foundation_and_overrides.scss` or anything in `app/assets/builds` cannot shadow it.
18
+ - Deprecations per entry point (with `--verbose`): 371 → 370 (`[import]` 118 → 117, `[if-function]` 58, `[global-builtin]` 195). Without `--verbose` Sass prints 5 per category and "356 → 355 repetitive deprecation warnings omitted".
19
+ - **Still `@import`, inside `foundation_and_overrides.scss`:** `settings/settings` and `foundation` (foundation-rails 6.9 is `@import`-only and its settings globals feed the overrides), and `theme`. A `@use 'theme'` would have to precede the settings `@import`, which moves the theme's CSS ahead of Foundation's and runs before `$body-background` exists; `meta.load-css` keeps the position but hides the `$if-*` palette from hosts. All three wait for the Foundation decision. The remaining 114 `[import]`, and all `[if-function]` / `[global-builtin]` warnings, are inside foundation-rails. The deadline is a dartsass-rails release that allows sass-embedded ≥ 3 (0.5.1 pins `~> 1.63`), not a date. No `--quiet-deps` / `--silence-deprecation` was added.
20
+
21
+ ### Fixed
22
+
23
+ - **`dropdown` options are sorted again.** `dropdown_edit` called `values.sort_by { _presentation }` and discarded the result, so the options came out in id order. They are now sorted by their (dropdown) presentation.
24
+ - **The failed-create flash header is translated.** `InlineFormsController#create` set `flash[:header]` to the hard-coded Dutch `"Kan <class_name> niet aanmaken."` (with the underscored class name, e.g. `client`) in every locale. It now uses the new key `inline_forms.view.create_failed` with the model's human name: "Could not create %{model}." (en), "Kan %{model} niet aanmaken." (nl). A host with its own locale needs that key.
25
+ - **"+" and close icons on the gold bands meet WCAG contrast.** `.new_button` / `.close_button` in the model top bar and the associated header were the accent colour on gold: 2.9:1 on the model top bar (below the 3:1 for icons), and white on hover (1.8:1). They now use two new variables, `--if-color-on-band` and `--if-color-on-band-hover` (Sass `$if-on-band` / `$if-on-band-hover`), which clear 4.5:1 on both bands in every preset theme (default, dark, sepia, high-contrast). A host that overrides `--if-color-secondary` / `--if-color-header-band` should set them too. The associated header's close-button hover rule also targeted `.new_button:focus` instead of `.close_button:focus`.
26
+ - **Installer: generated apps compile the gem's SCSS on every Dart Sass build.** The `config/initializers/inline_forms_dartsass_builds.rb` template maps `inline_forms_install/{inline_forms,devise}_main.scss` (`@use "inline_forms/inline_forms" as *`) to `app/assets/builds/inline_forms/{inline_forms,devise}.css`. dartsass-rails passes `app/assets/stylesheets` and then every `config.assets.paths` entry as load paths, and `app/assets/builds` comes before the gem, so from the second build on the `@use` resolved to the app's previous compiled `.css` instead of the gem's `.scss`. Gem stylesheet changes stopped reaching an app after its first build (and the example-app gate did not test them). The template now adds `--load-path=<inline_forms>/app/assets/stylesheets` to `config.dartsass.build_options`, which precede the load paths, as StProject's own initializer already does. **Existing apps** generated by an earlier installer should add the same two lines to their initializer.
27
+
28
+ ### Tests
29
+
30
+ - `dropdown_test` (options sorted by presentation), `locale_test` (failure header in en and nl, `inline_forms.view.create_failed` in both locale files).
31
+ - Example app: `example_app_sass_deprecations_test` compiles both gem entry points with sass-embedded (verbose) and fails if the gem gains an `@import` beyond the three above, or an entry point has more than 117 `[import]` deprecations.
32
+ - Example app: `example_app_dartsass_build_test` checks that the gem's stylesheet dir is the first load path in the dartsass command, and that `app/assets/builds/inline_forms/{inline_forms,devise}.css` match a direct compile of the gem's entry points (test_helper's `dartsass:build` runs after the installer's, so builds/ already held a previous build).
33
+
34
+ ### Lockstep
35
+
36
+ - validation_hints 8.1.58, inline_forms_installer 8.1.58, inline_forms_schema_edit 8.1.58.
37
+
7
38
  ## [8.1.57] - 2026-10-05
8
39
 
9
40
  Fixes from a security/UI review of a host app (StProject), plus missing and hard-coded translations found when StProject switched to `:nl` with `raise_on_missing_translations = :strict`.
@@ -33,6 +33,11 @@ $if-flash-accent: #fade7a !default; // flash border band
33
33
  $if-error-bg: #a70f0f !default;
34
34
  $if-success-bg: #4f8d0d !default;
35
35
  $if-on-dark: #FFFFFF !default; // text/icons on primary/secondary bands
36
+ // The "+" / close icons on the gold bands (secondary, header-band). The
37
+ // accent was 2.9:1 on the secondary gold and the white hover 1.8:1; these
38
+ // clear 4.5:1 on both bands.
39
+ $if-on-band: #8F2F18 !default;
40
+ $if-on-band-hover: #4A1A0C !default;
36
41
 
37
42
  :root {
38
43
  --if-color-primary: #{$if-primary};
@@ -48,6 +53,8 @@ $if-on-dark: #FFFFFF !default; // text/icons on primary/secondary bands
48
53
  --if-color-error-bg: #{$if-error-bg};
49
54
  --if-color-success-bg: #{$if-success-bg};
50
55
  --if-color-on-dark: #{$if-on-dark};
56
+ --if-color-on-band: #{$if-on-band};
57
+ --if-color-on-band-hover: #{$if-on-band-hover};
51
58
  // Foundation globals, bridged so body/anchors can be re-themed too.
52
59
  --if-color-body-bg: #{$body-background};
53
60
  --if-color-body-text: #{$body-font-color};
@@ -85,6 +92,8 @@ body.theme-dark {
85
92
  --if-color-input-bg-hover: #332e25;
86
93
  --if-color-input-bg-focus: #3a352b;
87
94
  --if-color-flash-accent: #7a6829;
95
+ --if-color-on-band: #fdeee5;
96
+ --if-color-on-band-hover: #ffffff;
88
97
  --if-color-body-bg: #1c1a16;
89
98
  --if-color-body-text: #e8e4da;
90
99
  --if-color-anchor: #e0a179;
@@ -108,6 +117,8 @@ body.theme-sepia {
108
117
  --if-color-input-bg-hover: #fffaf0;
109
118
  --if-color-input-bg-focus: #fffdf7;
110
119
  --if-color-flash-accent: #dcc078;
120
+ --if-color-on-band: #6e3a20;
121
+ --if-color-on-band-hover: #3a2418;
111
122
  --if-color-body-bg: #f4ecd8;
112
123
  --if-color-body-text: #5b4636;
113
124
  --if-color-anchor: #8b5e3c;
@@ -124,6 +135,8 @@ body.theme-high-contrast {
124
135
  --if-color-input-bg-hover: #f5f5f5;
125
136
  --if-color-input-bg-focus: #ffffff;
126
137
  --if-color-flash-accent: #ffd500;
138
+ --if-color-on-band: #b30000;
139
+ --if-color-on-band-hover: #000000;
127
140
  --if-color-body-bg: #ffffff;
128
141
  --if-color-body-text: #000000;
129
142
  --if-color-anchor: #0000d6;
@@ -1,6 +1,9 @@
1
1
  // Open Sans @font-face lives in inline_forms_fonts.css.erb (self-hosted,
2
2
  // Sprockets-served; linked from the layouts) — no external font CDN.
3
- @import 'foundation_and_overrides';
3
+ // @use / @forward of foundation_and_overrides: see the module-system note
4
+ // in inline_forms.scss.
5
+ @forward 'foundation_and_overrides';
6
+ @use 'foundation_and_overrides' as *;
4
7
 
5
8
  // Devise pages have only `.contain-to-grid` as the top-bar wrapper (no
6
9
  // `.fixed` variant), so constrain it directly to the F5 1000px row
@@ -55,6 +55,7 @@ $body-font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Roboto, Arial, sans
55
55
 
56
56
  // Theme bridge: palette as CSS custom properties (must come after
57
57
  // 'foundation' so it can read $body-background / $anchor-color).
58
+ // Stays @import: see the module-system note in inline_forms.scss.
58
59
  @import 'theme';
59
60
 
60
61
  @import '../../../vendor/assets/stylesheets/tippy.css';
@@ -2,19 +2,34 @@
2
2
  // Open Sans @font-face lives in inline_forms_fonts.css.erb (self-hosted,
3
3
  // Sprockets-served; linked from the layouts) — no external font CDN.
4
4
  //
5
- // Module-system status (8.1.24): `foundation_icons` is a self-contained
6
- // partial and loads via @use. Everything else must stay on @import until
7
- // the Foundation question is settled: foundation-rails 6.9 is @import-only
8
- // internally and its settings globals ($body-background, rem-calc, ...)
9
- // flow into foundation_and_overrides/theme/devise, which @use cannot
10
- // replicate without a Foundation that ships a module API (it never will —
11
- // the framework is unmaintained). See stuff/improvement-plan.md §1.
5
+ // Module-system status (8.1.58). Loaded with @use:
6
+ // - `foundation_icons` (8.1.24): a self-contained partial.
7
+ // - `foundation_and_overrides`, here and in devise.scss (8.1.58). The
8
+ // compiled CSS is byte-identical to the @import version (the `.columns`
9
+ // alias below is the one rule that needed spelling out). The relative URL
10
+ // resolves next to this file first, as the @import did, so a same-named
11
+ // host or app/assets/builds file cannot shadow it. The @forward keeps what
12
+ // hosts saw through `@use "inline_forms/inline_forms"` before: Foundation's
13
+ // members (rem-calc, $global-width, ...) and the !default `$if-*` palette,
14
+ // configurable with `with (...)`.
15
+ // Still @import, inside foundation_and_overrides:
16
+ // - 'settings/settings' and 'foundation': foundation-rails 6.9 is
17
+ // @import-only and its settings globals feed our overrides. Blocked by the
18
+ // Foundation decision (unmaintained upstream; no module API coming).
19
+ // - 'theme': a @use must precede the settings @import, which would move the
20
+ // theme's CSS ahead of Foundation's and run before $body-background exists;
21
+ // meta.load-css keeps the position but hides the `$if-*` palette from hosts
22
+ // (`with ($if-accent: ...)` stops working). Moves with Foundation.
23
+ // The deadline is a dartsass-rails release that allows sass-embedded >= 3
24
+ // (Dart Sass 3 removes @import; 0.5.1 pins ~> 1.63), not a date.
25
+ // See stuff/improvement-plan.md §1.
12
26
  //
13
27
  // jQuery UI SCSS (sunny theme + widget styles) was dropped in 8.1.26 along
14
28
  // with the last jQuery UI widgets (native date/time/month/range/datalist
15
29
  // inputs replaced them).
16
30
  @use 'inline_forms/foundation_icons';
17
- @import 'foundation_and_overrides';
31
+ @forward 'foundation_and_overrides';
32
+ @use 'foundation_and_overrides' as *;
18
33
 
19
34
  // Foundation 6 makes `.row` a flex container (`display: flex`); a nested
20
35
  // `.row` is therefore a flex item and shrinks to its content's intrinsic
@@ -223,12 +238,12 @@ select:hover, select:focus {
223
238
  }
224
239
  .new_button {
225
240
  background-color: var(--if-color-secondary);
226
- color: var(--if-color-accent);
241
+ color: var(--if-color-on-band);
227
242
  font-size: 1.3rem;
228
243
  padding: 0 2rem 0 1rem;
229
244
  }
230
245
  .new_button:hover, .new_button:focus {
231
- color: white;
246
+ color: var(--if-color-on-band-hover);
232
247
  -webkit-transition-property: color;
233
248
  transition-property: color;
234
249
  }
@@ -358,26 +373,26 @@ turbo-frame {
358
373
  .new_button {
359
374
  background-color: var(--if-color-header-band);
360
375
  font-size: 1.5rem;
361
- color: var(--if-color-accent);
376
+ color: var(--if-color-on-band);
362
377
  padding: 0 0.5rem 0 1rem;
363
378
  margin: 0;
364
379
  }
365
380
  .new_button:hover, .new_button:focus {
366
381
  background-color: var(--if-color-header-band);
367
- color: white;
382
+ color: var(--if-color-on-band-hover);
368
383
  -webkit-transition-property: color;
369
384
  transition-property: color;
370
385
  }
371
386
  .close_button {
372
387
  background-color: var(--if-color-header-band);
373
388
  font-size: 1.5rem;
374
- color: var(--if-color-accent);
389
+ color: var(--if-color-on-band);
375
390
  padding: 0 0.5rem 0 1rem;
376
391
  margin: 0;
377
392
  }
378
- .close_button:hover, .new_button:focus {
393
+ .close_button:hover, .close_button:focus {
379
394
  background-color: var(--if-color-header-band);
380
- color: white;
395
+ color: var(--if-color-on-band-hover);
381
396
  -webkit-transition-property: color;
382
397
  transition-property: color;
383
398
  }
@@ -423,7 +438,11 @@ turbo-frame {
423
438
  margin-bottom: 1.5em;
424
439
  }
425
440
 
426
- .column {
441
+ // `.columns` named explicitly: Foundation's flex grid aliases it with
442
+ // `.columns { @extend .column }`, which reached this rule while
443
+ // foundation_and_overrides was @imported. Since it is @used (8.1.58),
444
+ // that @extend no longer crosses into this module.
445
+ .column, .columns {
427
446
  padding-right: 0 !important;
428
447
  }
429
448
 
@@ -189,7 +189,7 @@ class InlineFormsController < ApplicationController
189
189
  format.html { render_list_frame_after_save }
190
190
  end
191
191
  else
192
- flash.now[:header] = [ "Kan #{@object.class.to_s.underscore} niet aanmaken." ]
192
+ flash.now[:header] = [ t("inline_forms.view.create_failed", model: @object.class.model_name.human) ]
193
193
  flash.now[:error] = @object.errors.to_a
194
194
  respond_to do |format|
195
195
  @object.inline_forms_attribute_list = attributes
@@ -29,7 +29,7 @@ module InlineForms
29
29
  if klass.method_defined? :disabled_for_dropdown?
30
30
  options_disabled = values.map{|v| v.id if v.disabled_for_dropdown?}.compact
31
31
  end
32
- values.sort_by {|v|v.send presentation}
32
+ values = values.sort_by {|v|v.send presentation}
33
33
  # 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
34
  collection_select( ('_' + object.class.to_s.underscore).to_sym,
35
35
  attribute.to_s.foreign_key.to_sym,
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module InlineForms
4
- VERSION = "8.1.57"
4
+ VERSION = "8.1.58"
5
5
  end
@@ -27,6 +27,7 @@ en:
27
27
  view:
28
28
  close: close
29
29
  add_new: make a new %{model}
30
+ create_failed: Could not create %{model}.
30
31
  undo: undo
31
32
  restore: restore
32
33
  trash: trash
@@ -27,6 +27,7 @@ nl:
27
27
  view:
28
28
  close: sluiten
29
29
  add_new: Maak een nieuw %{model}
30
+ create_failed: Kan %{model} niet aanmaken.
30
31
  undo: terughalen
31
32
  restore: terugzetten
32
33
  trash: weggooien
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../integration_test_helper"
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.
7
+ 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")
11
+
12
+ get machines_path
13
+ html = controller.view_context.dropdown_edit(part, :machine)
14
+
15
+ assert_equal %w[Alpha Mu Zeta], html.scan(%r{<option value="\d+">([^<]*)</option>}).flatten
16
+ end
17
+ end
@@ -17,7 +17,7 @@ class LocaleTest < InlineFormsIntegrationTestCase
17
17
  inline_forms.view.versions_old_value inline_forms.view.versions_new_value inline_forms.view.versions_empty
18
18
  inline_forms.view.versions_rich_text inline_forms.view.version_events.create
19
19
  inline_forms.view.version_events.update inline_forms.view.version_events.destroy
20
- inline_forms.devise.login common.more common.logout
20
+ inline_forms.devise.login common.more common.logout inline_forms.view.create_failed
21
21
  ].freeze
22
22
 
23
23
  setup do
@@ -71,6 +71,24 @@ class LocaleTest < InlineFormsIntegrationTestCase
71
71
  assert_equal "Machine is aangemaakt.", controller.flash[:success]
72
72
  end
73
73
 
74
+ # The failure header was hard-coded Dutch with the underscored class name
75
+ # ("Kan machine niet aanmaken.") in every locale.
76
+ test "create's failure flash header translates, with the human model name" do
77
+ I18n.backend.store_translations(:nl, machines: "machines",
78
+ activerecord: { models: { machine: "Werkbank" } })
79
+ strictly(:nl) do
80
+ post machines_path(update: "machines_list"), params: { name: "" }, headers: frame_headers("machines_list")
81
+ end
82
+ assert_equal [ "Kan Werkbank niet aanmaken." ], controller.flash[:header]
83
+
84
+ I18n.backend.store_translations(:en, machines: "machines")
85
+ strictly(:en) do
86
+ post machines_path(update: "machines_list"), params: { name: "" }, headers: frame_headers("machines_list")
87
+ end
88
+ assert_equal [ "Could not create Machine." ], controller.flash[:header]
89
+ assert_includes response.body, "Could not create Machine."
90
+ end
91
+
74
92
  test "the versions panel and list are translated, with localized timestamps" do
75
93
  row = "machine_#{@machine.id}"
76
94
  strictly(:nl) do
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.57
4
+ version: 8.1.58
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ace Suares
@@ -314,6 +314,7 @@ files:
314
314
  - test/inline_forms_addto_generator_test.rb
315
315
  - test/inline_forms_generator_test.rb
316
316
  - test/integration/csp_nonce_test.rb
317
+ - test/integration/dropdown_test.rb
317
318
  - test/integration/field_authorization_test.rb
318
319
  - test/integration/file_slots_test.rb
319
320
  - test/integration/html_refusal_test.rb
@@ -402,6 +403,7 @@ test_files:
402
403
  - test/inline_forms_addto_generator_test.rb
403
404
  - test/inline_forms_generator_test.rb
404
405
  - test/integration/csp_nonce_test.rb
406
+ - test/integration/dropdown_test.rb
405
407
  - test/integration/field_authorization_test.rb
406
408
  - test/integration/file_slots_test.rb
407
409
  - test/integration/html_refusal_test.rb