bootstrap_form 5.0.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +14 -12
  3. data/.gitignore +12 -2
  4. data/.rubocop.yml +2 -1
  5. data/CHANGELOG.md +45 -2
  6. data/CONTRIBUTING.md +17 -16
  7. data/Dangerfile +1 -1
  8. data/Dockerfile +2 -7
  9. data/Gemfile +5 -7
  10. data/README.md +756 -52
  11. data/RELEASING.md +5 -10
  12. data/bootstrap_form.gemspec +2 -3
  13. data/demo/.ruby-version +1 -0
  14. data/demo/Gemfile +80 -0
  15. data/demo/Gemfile.lock +261 -0
  16. data/demo/Procfile.dev +2 -0
  17. data/demo/app/assets/builds/.keep +0 -0
  18. data/demo/app/assets/builds/application.js.LICENSE.txt +9 -0
  19. data/demo/app/assets/config/manifest.js +1 -0
  20. data/demo/app/assets/stylesheets/actiontext.css +31 -0
  21. data/demo/app/assets/stylesheets/application.scss +1 -1
  22. data/demo/app/controllers/bootstrap_controller.rb +17 -2
  23. data/demo/app/controllers/users_controller.rb +9 -0
  24. data/demo/app/helpers/bootstrap_helper.rb +1 -1
  25. data/demo/app/javascript/application.js +3 -0
  26. data/demo/app/models/skill.rb +15 -0
  27. data/demo/app/models/user.rb +14 -0
  28. data/demo/app/views/active_storage/blobs/_blob.html.erb +1 -1
  29. data/demo/app/views/layouts/action_text/contents/_content.html.erb +3 -0
  30. data/demo/app/views/layouts/application.html.erb +28 -20
  31. data/demo/bin/dev +9 -0
  32. data/demo/config/environments/development.rb +3 -3
  33. data/demo/config/routes.rb +1 -0
  34. data/demo/db/schema.rb +29 -14
  35. data/demo/doc/screenshots/bootstrap/index/00_horizontal_form.png +0 -0
  36. data/demo/doc/screenshots/bootstrap/index/01_with_validation_error.png +0 -0
  37. data/demo/doc/screenshots/bootstrap/index/02_inline_form.png +0 -0
  38. data/demo/doc/screenshots/bootstrap/index/03_simple_action_text_example.png +0 -0
  39. data/demo/doc/screenshots/bootstrap/index/04_floating_labels.png +0 -0
  40. data/demo/doc/screenshots/bootstrap/readme/00_example.png +0 -0
  41. data/demo/doc/screenshots/bootstrap/readme/01_example.png +0 -0
  42. data/demo/doc/screenshots/bootstrap/readme/02_example.png +0 -0
  43. data/demo/doc/screenshots/bootstrap/readme/03_example.png +0 -0
  44. data/demo/doc/screenshots/bootstrap/readme/04_example.png +0 -0
  45. data/demo/doc/screenshots/bootstrap/readme/05_example.png +0 -0
  46. data/demo/doc/screenshots/bootstrap/readme/06_example.png +0 -0
  47. data/demo/doc/screenshots/bootstrap/readme/07_example.png +0 -0
  48. data/demo/doc/screenshots/bootstrap/readme/08_example.png +0 -0
  49. data/demo/doc/screenshots/bootstrap/readme/09_example.png +0 -0
  50. data/demo/doc/screenshots/bootstrap/readme/10_example.png +0 -0
  51. data/demo/doc/screenshots/bootstrap/readme/11_example.png +0 -0
  52. data/demo/doc/screenshots/bootstrap/readme/12_example.png +0 -0
  53. data/demo/doc/screenshots/bootstrap/readme/13_example.png +0 -0
  54. data/demo/doc/screenshots/bootstrap/readme/14_example.png +0 -0
  55. data/demo/doc/screenshots/bootstrap/readme/15_example.png +0 -0
  56. data/demo/doc/screenshots/bootstrap/readme/16_example.png +0 -0
  57. data/demo/doc/screenshots/bootstrap/readme/17_example.png +0 -0
  58. data/demo/doc/screenshots/bootstrap/readme/18_example.png +0 -0
  59. data/demo/doc/screenshots/bootstrap/readme/19_example.png +0 -0
  60. data/demo/doc/screenshots/bootstrap/readme/20_example.png +0 -0
  61. data/demo/doc/screenshots/bootstrap/readme/21_example.png +0 -0
  62. data/demo/doc/screenshots/bootstrap/readme/22_example.png +0 -0
  63. data/demo/doc/screenshots/bootstrap/readme/23_example.png +0 -0
  64. data/demo/doc/screenshots/bootstrap/readme/24_example.png +0 -0
  65. data/demo/doc/screenshots/bootstrap/readme/25_example.png +0 -0
  66. data/demo/doc/screenshots/bootstrap/readme/26_example.png +0 -0
  67. data/demo/doc/screenshots/bootstrap/readme/27_example.png +0 -0
  68. data/demo/doc/screenshots/bootstrap/readme/28_example.png +0 -0
  69. data/demo/doc/screenshots/bootstrap/readme/29_example.png +0 -0
  70. data/demo/doc/screenshots/bootstrap/readme/30_example.png +0 -0
  71. data/demo/doc/screenshots/bootstrap/readme/31_example.png +0 -0
  72. data/demo/doc/screenshots/bootstrap/readme/32_example.png +0 -0
  73. data/demo/doc/screenshots/bootstrap/readme/33_example.png +0 -0
  74. data/demo/doc/screenshots/bootstrap/readme/34_example.png +0 -0
  75. data/demo/doc/screenshots/bootstrap/readme/35_example.png +0 -0
  76. data/demo/doc/screenshots/bootstrap/readme/36_example.png +0 -0
  77. data/demo/doc/screenshots/bootstrap/readme/37_example.png +0 -0
  78. data/demo/doc/screenshots/bootstrap/readme/38_example.png +0 -0
  79. data/demo/doc/screenshots/bootstrap/readme/39_example.png +0 -0
  80. data/demo/doc/screenshots/bootstrap/readme/40_example.png +0 -0
  81. data/demo/doc/screenshots/bootstrap/readme/41_example.png +0 -0
  82. data/demo/doc/screenshots/bootstrap/readme/42_example.png +0 -0
  83. data/demo/doc/screenshots/bootstrap/readme/43_example.png +0 -0
  84. data/demo/doc/screenshots/bootstrap/readme/44_example.png +0 -0
  85. data/demo/doc/screenshots/bootstrap/readme/45_example.png +0 -0
  86. data/demo/doc/screenshots/bootstrap/readme/46_example.png +0 -0
  87. data/demo/doc/screenshots/bootstrap/readme/47_example.png +0 -0
  88. data/demo/doc/screenshots/bootstrap/readme/48_example.png +0 -0
  89. data/demo/doc/screenshots/bootstrap/readme/49_example.png +0 -0
  90. data/demo/doc/screenshots/bootstrap/readme/50_example.png +0 -0
  91. data/demo/package.json +10 -6
  92. data/demo/test/application_system_test_case.rb +8 -0
  93. data/demo/test/controllers/bootstrap_controller_test.rb +8 -0
  94. data/demo/test/controllers/users_controller_test.rb +13 -0
  95. data/demo/test/fixtures/users.yml +2 -0
  96. data/demo/test/system/bootstrap_test.rb +84 -0
  97. data/demo/test/test_helper.rb +10 -0
  98. data/demo/webpack.config.js +20 -0
  99. data/demo/yarn.lock +4063 -3144
  100. data/docker-compose.yml +22 -43
  101. data/gemfiles/7.0.gemfile +6 -0
  102. data/lib/bootstrap_form/components/hints.rb +13 -4
  103. data/lib/bootstrap_form/components/labels.rb +1 -1
  104. data/lib/bootstrap_form/form_builder.rb +6 -6
  105. data/lib/bootstrap_form/form_group.rb +6 -2
  106. data/lib/bootstrap_form/helpers/bootstrap.rb +7 -3
  107. data/lib/bootstrap_form/inputs/check_box.rb +5 -3
  108. data/lib/bootstrap_form/inputs/collection_check_boxes.rb +5 -1
  109. data/lib/bootstrap_form/inputs/collection_select.rb +1 -1
  110. data/lib/bootstrap_form/inputs/grouped_collection_select.rb +1 -1
  111. data/lib/bootstrap_form/inputs/radio_button.rb +13 -8
  112. data/lib/bootstrap_form/version.rb +1 -1
  113. metadata +82 -21
  114. data/demo/config/initializers/assets.rb +0 -14
@@ -1,4 +1,5 @@
1
1
  Dummy::Application.routes.draw do
2
+ get "fragment" => "bootstrap#fragment", as: :fragment
2
3
  resources :users
3
4
 
4
5
  root to: "bootstrap#form"
data/demo/db/schema.rb CHANGED
@@ -10,24 +10,24 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 2019_01_26_192508) do
13
+ ActiveRecord::Schema.define(version: 2022_01_09_230956) do
14
14
 
15
15
  create_table "action_text_rich_texts", force: :cascade do |t|
16
16
  t.string "name", null: false
17
- t.text "body", limit: 16777215
17
+ t.text "body"
18
18
  t.string "record_type", null: false
19
- t.integer "record_id", null: false
20
- t.datetime "created_at", null: false
21
- t.datetime "updated_at", null: false
19
+ t.bigint "record_id", null: false
20
+ t.datetime "created_at", precision: 6, null: false
21
+ t.datetime "updated_at", precision: 6, null: false
22
22
  t.index ["record_type", "record_id", "name"], name: "index_action_text_rich_texts_uniqueness", unique: true
23
23
  end
24
24
 
25
25
  create_table "active_storage_attachments", force: :cascade do |t|
26
26
  t.string "name", null: false
27
27
  t.string "record_type", null: false
28
- t.integer "record_id", null: false
29
- t.integer "blob_id", null: false
30
- t.datetime "created_at", null: false
28
+ t.bigint "record_id", null: false
29
+ t.bigint "blob_id", null: false
30
+ t.datetime "created_at", precision: 6, null: false
31
31
  t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
32
32
  t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
33
33
  end
@@ -37,20 +37,33 @@ ActiveRecord::Schema.define(version: 2019_01_26_192508) do
37
37
  t.string "filename", null: false
38
38
  t.string "content_type"
39
39
  t.text "metadata"
40
+ t.string "service_name", null: false
40
41
  t.bigint "byte_size", null: false
41
- t.string "checksum", null: false
42
- t.datetime "created_at", null: false
42
+ t.string "checksum"
43
+ t.datetime "created_at", precision: 6, null: false
43
44
  t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
44
45
  end
45
46
 
47
+ create_table "active_storage_variant_records", force: :cascade do |t|
48
+ t.bigint "blob_id", null: false
49
+ t.string "variation_digest", null: false
50
+ t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
51
+ end
52
+
46
53
  create_table "addresses", force: :cascade do |t|
47
54
  t.integer "user_id"
48
55
  t.string "street"
49
56
  t.string "city"
50
57
  t.string "state"
51
58
  t.string "zip_code"
52
- t.datetime "created_at", null: false
53
- t.datetime "updated_at", null: false
59
+ t.datetime "created_at", precision: 6, null: false
60
+ t.datetime "updated_at", precision: 6, null: false
61
+ end
62
+
63
+ create_table "bogons", force: :cascade do |t|
64
+ t.datetime "created_at", precision: 6, null: false
65
+ t.datetime "updated_at", precision: 6, null: false
66
+ t.integer "food_waste_main"
54
67
  end
55
68
 
56
69
  create_table "users", force: :cascade do |t|
@@ -62,8 +75,10 @@ ActiveRecord::Schema.define(version: 2019_01_26_192508) do
62
75
  t.text "preferences"
63
76
  t.boolean "terms", default: false
64
77
  t.string "type"
65
- t.datetime "created_at", null: false
66
- t.datetime "updated_at", null: false
78
+ t.datetime "created_at", precision: 6, null: false
79
+ t.datetime "updated_at", precision: 6, null: false
67
80
  end
68
81
 
82
+ add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
83
+ add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
69
84
  end
data/demo/package.json CHANGED
@@ -2,16 +2,20 @@
2
2
  "name": "dummy",
3
3
  "private": true,
4
4
  "dependencies": {
5
- "@rails/actioncable": "^6.0.0-alpha",
6
- "@rails/actiontext": "^6.0.0-beta1",
7
- "@rails/activestorage": "^6.0.0-alpha",
8
- "@rails/ujs": "^6.0.0-alpha",
9
- "@rails/webpacker": "^4.0.0-rc.7",
5
+ "@rails/actioncable": "^6.1.0",
6
+ "@rails/actiontext": "^6.1.0",
7
+ "@rails/activestorage": "^6.1.0",
8
+ "@rails/ujs": "^6.1.0",
9
+ "@rails/webpacker": "^5.0.0",
10
10
  "trix": "^1.0.0",
11
11
  "turbolinks": "^5.2.0"
12
12
  },
13
13
  "version": "0.1.0",
14
14
  "devDependencies": {
15
- "webpack-dev-server": "^3.1.14"
15
+ "webpack-dev-server": "^4.0.0"
16
+ },
17
+ "scripts": {
18
+ "build": "webpack --config webpack.config.js",
19
+ "build:css": "webpack --config webpack.config.js"
16
20
  }
17
21
  }
@@ -0,0 +1,8 @@
1
+ require "test_helper"
2
+
3
+ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
4
+ include Capybara::Screenshot::Diff
5
+ driven_by :selenium, using: :headless_chrome, screen_size: [960, 720] do |capabilities|
6
+ capabilities.add_argument "force-device-scale-factor=1"
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require "test_helper"
2
+
3
+ class BootstrapControllerTest < ActionDispatch::IntegrationTest
4
+ test "should get form" do
5
+ get root_path
6
+ assert_response :success
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+
3
+ class UsersControllerTest < ActionDispatch::IntegrationTest
4
+ test "should post create" do
5
+ post users_url
6
+ assert_redirected_to root_path
7
+ end
8
+
9
+ test "should patch update" do
10
+ patch user_url(users(:one))
11
+ assert_redirected_to root_path
12
+ end
13
+ end
@@ -0,0 +1,2 @@
1
+ one:
2
+ email: one@test.com
@@ -0,0 +1,84 @@
1
+ require "application_system_test_case"
2
+
3
+ class BootstrapTest < ApplicationSystemTestCase
4
+ setup { screenshot_section :bootstrap }
5
+
6
+ test "visiting the index" do
7
+ screenshot_group :index
8
+ visit root_url
9
+
10
+ all(".toggle").each { |btn| execute_script "arguments[0].remove()", btn }
11
+
12
+ all("h3").each do |header|
13
+ example = header.first(:xpath, "./following-sibling::div")
14
+ scroll_to example
15
+ sleep 0.5
16
+ screenshot header.text.downcase.tr(" ", "_"), crop: bounds(example), color_distance_limit: 2
17
+ end
18
+ end
19
+
20
+ HEADERS = ["Generated HTML", "This generates", "Which outputs", "will be rendered as"].join("|").freeze
21
+ REGEXP =
22
+ /(?:!\[[^\]]*\]\([^)]+\)\s*)?```erb\n(.*?)\n```\s*((?:#{HEADERS}).*?$)?\s*(```html\n(?:.*?)\n```\s*)?/mi
23
+ .freeze
24
+ test "readme examples" do
25
+ screenshot_group :readme
26
+
27
+ readme = File.read(File.expand_path("../../../README.md", __dir__))
28
+ augmented_readme = readme.gsub(REGEXP) do |_|
29
+ erb = Regexp.last_match(1)
30
+ header = Regexp.last_match(2)
31
+ unless /\A<%= bootstrap[^>]*>\n\s*...\s*<% end %>\z/.match? erb
32
+ wrapped_erb = erb.starts_with?("<%= bootstrap") ? erb : <<~ERB
33
+ <%= bootstrap_form_with model: @user do |f| %>
34
+ #{erb}
35
+ <% end %>
36
+ ERB
37
+
38
+ visit fragment_path erb: wrapped_erb
39
+ wrapper = find(".p-3")
40
+ i = @screenshot_counter
41
+ screenshot :example, crop: bounds(wrapper)
42
+ wrapper = wrapper.find("form") if wrapped_erb != erb
43
+ html = wrapper["innerHTML"].strip.gsub("><", ">\n<")
44
+ assert html.present?, erb
45
+ doc = Nokogiri::HTML.fragment(html)
46
+ doc.traverse do |node|
47
+ if node.is_a?(Nokogiri::XML::Element)
48
+ node.attributes.sort_by(&:first).each do |name, value|
49
+ node.delete(name)
50
+ node[name] = value
51
+ end
52
+ end
53
+ end
54
+ html = doc.to_html
55
+ image = <<~MD
56
+ ![Example #{i}](demo/doc/screenshots/bootstrap/readme/#{format('%02i', i)}_example.png "Example #{i}")
57
+ MD
58
+ html = <<~MD
59
+
60
+ #{header || 'Generated HTML:'}
61
+
62
+ ```html
63
+ #{HtmlBeautifier.beautify(html)}
64
+ ```
65
+ MD
66
+ end
67
+ <<~MD
68
+ #{image}```erb
69
+ #{erb}
70
+ ```
71
+ #{html}
72
+ MD
73
+ end
74
+ augmented_readme.gsub!(/127.0.0.1:\d+/, "test.host")
75
+ File.write(File.expand_path("../../../README.md", __dir__), augmented_readme)
76
+ end
77
+
78
+ private
79
+
80
+ def bounds(node)
81
+ client_rect = evaluate_script("arguments[0].getBoundingClientRect()", node.native)
82
+ [client_rect["left"].floor, client_rect["top"].floor, client_rect["right"].ceil, client_rect["bottom"].ceil]
83
+ end
84
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV["RAILS_ENV"] = "test"
4
+
5
+ require_relative "../config/environment"
6
+ require "rails/test_help"
7
+
8
+ class ActiveSupport::TestCase
9
+ fixtures :all
10
+ end
@@ -0,0 +1,20 @@
1
+ const path = require("path")
2
+ const webpack = require("webpack")
3
+
4
+ module.exports = {
5
+ mode: "production",
6
+ devtool: "source-map",
7
+ entry: {
8
+ application: "./app/javascript/application.js"
9
+ },
10
+ output: {
11
+ filename: "[name].js",
12
+ sourceMapFilename: "[name].js.map",
13
+ path: path.resolve(__dirname, "app/assets/builds"),
14
+ },
15
+ plugins: [
16
+ new webpack.optimize.LimitChunkCountPlugin({
17
+ maxChunks: 1
18
+ })
19
+ ]
20
+ }