bard-file_field 0.1.0
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 +7 -0
- data/.nvmrc +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +98 -0
- data/LICENSE +21 -0
- data/README.md +29 -0
- data/Rakefile +4 -0
- data/app/assets/javascripts/bard-file.js +4913 -0
- data/app/controllers/bard/file_field/blobs_controller.rb +11 -0
- data/bard-file/.gitignore +1 -0
- data/bard-file/bun.lockb +0 -0
- data/bard-file/index.js +2 -0
- data/bard-file/package.json +20 -0
- data/bard-file/rollup.config.js +26 -0
- data/bard-file_field.gemspec +34 -0
- data/config/routes.rb +6 -0
- data/dummy/.gitattributes +7 -0
- data/dummy/.gitignore +36 -0
- data/dummy/Gemfile +29 -0
- data/dummy/Gemfile.lock +353 -0
- data/dummy/README.md +24 -0
- data/dummy/Rakefile +13 -0
- data/dummy/app/assets/config/manifest.js +3 -0
- data/dummy/app/assets/images/.keep +0 -0
- data/dummy/app/assets/stylesheets/application.css +22 -0
- data/dummy/app/controllers/application_controller.rb +2 -0
- data/dummy/app/controllers/concerns/.keep +0 -0
- data/dummy/app/controllers/edge_cases_controller.rb +23 -0
- data/dummy/app/controllers/posts_controller.rb +33 -0
- data/dummy/app/controllers/validations_controller.rb +18 -0
- data/dummy/app/helpers/application_helper.rb +2 -0
- data/dummy/app/javascript/application.js +2 -0
- data/dummy/app/javascript/controllers/application.js +9 -0
- data/dummy/app/javascript/controllers/index.js +11 -0
- data/dummy/app/models/application_record.rb +3 -0
- data/dummy/app/models/concerns/.keep +0 -0
- data/dummy/app/models/post.rb +9 -0
- data/dummy/app/views/edge_cases/rails_validation_error.html.erb +16 -0
- data/dummy/app/views/layouts/application.html.erb +18 -0
- data/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/dummy/app/views/posts/form.html.erb +39 -0
- data/dummy/app/views/posts/show.html.erb +16 -0
- data/dummy/app/views/validations/form.html.erb +19 -0
- data/dummy/app/views/validations/optional_file.html.erb +10 -0
- data/dummy/app/views/validations/optional_file_with_max_size.html.erb +10 -0
- data/dummy/app/views/validations/optional_image.html.erb +10 -0
- data/dummy/app/views/validations/required_file.html.erb +10 -0
- data/dummy/app/views/validations/required_media.html.erb +10 -0
- data/dummy/bin/bundle +114 -0
- data/dummy/bin/importmap +4 -0
- data/dummy/bin/rails +4 -0
- data/dummy/bin/rake +4 -0
- data/dummy/bin/setup +33 -0
- data/dummy/config/application.rb +22 -0
- data/dummy/config/boot.rb +4 -0
- data/dummy/config/cable.yml +10 -0
- data/dummy/config/credentials.yml.enc +1 -0
- data/dummy/config/cucumber.yml +2 -0
- data/dummy/config/database.yml +25 -0
- data/dummy/config/environment.rb +5 -0
- data/dummy/config/environments/development.rb +70 -0
- data/dummy/config/environments/production.rb +93 -0
- data/dummy/config/environments/test.rb +60 -0
- data/dummy/config/importmap.rb +4 -0
- data/dummy/config/initializers/assets.rb +12 -0
- data/dummy/config/initializers/content_security_policy.rb +25 -0
- data/dummy/config/initializers/filter_parameter_logging.rb +8 -0
- data/dummy/config/initializers/inflections.rb +16 -0
- data/dummy/config/initializers/permissions_policy.rb +11 -0
- data/dummy/config/locales/en.yml +33 -0
- data/dummy/config/puma.rb +43 -0
- data/dummy/config/routes.rb +7 -0
- data/dummy/config/storage.yml +34 -0
- data/dummy/config.ru +6 -0
- data/dummy/db/migrate/20231013175203_create_posts.rb +8 -0
- data/dummy/db/migrate/20231013175257_create_active_storage_tables.active_storage.rb +57 -0
- data/dummy/db/migrate/20231102131420_add_name_to_posts.rb +5 -0
- data/dummy/db/schema.rb +50 -0
- data/dummy/db/seeds.rb +7 -0
- data/dummy/features/edge_cases.feature +17 -0
- data/dummy/features/form-persistence.feature +40 -0
- data/dummy/features/form_bard_file_field_helper.feature +98 -0
- data/dummy/features/support/env.rb +21 -0
- data/dummy/features/support/fixtures/empty.3gpp +0 -0
- data/dummy/features/support/fixtures/empty.JPEG +0 -0
- data/dummy/features/support/fixtures/empty.M4V +0 -0
- data/dummy/features/support/fixtures/empty.avi +0 -0
- data/dummy/features/support/fixtures/empty.bmp +0 -0
- data/dummy/features/support/fixtures/empty.flv +0 -0
- data/dummy/features/support/fixtures/empty.gif +0 -0
- data/dummy/features/support/fixtures/empty.heic +0 -0
- data/dummy/features/support/fixtures/empty.jpeg +0 -0
- data/dummy/features/support/fixtures/empty.jpg +0 -0
- data/dummy/features/support/fixtures/empty.m4v +0 -0
- data/dummy/features/support/fixtures/empty.mkv +0 -0
- data/dummy/features/support/fixtures/empty.mov +0 -0
- data/dummy/features/support/fixtures/empty.mp4 +0 -0
- data/dummy/features/support/fixtures/empty.png +0 -0
- data/dummy/features/support/fixtures/empty.tiff +0 -0
- data/dummy/features/support/fixtures/empty.webm +0 -0
- data/dummy/features/support/fixtures/empty.wmv +0 -0
- data/dummy/features/support/fixtures/image.jpg +0 -0
- data/dummy/features/support/fixtures/image2.jpg +0 -0
- data/dummy/features/support/fixtures/video.mp4 +0 -0
- data/dummy/features/support/selectors.rb +63 -0
- data/dummy/features/support/step_definitions/download_steps.rb +4 -0
- data/dummy/features/support/step_definitions/web_steps.rb +94 -0
- data/dummy/features/validations.feature +71 -0
- data/dummy/lib/assets/.keep +0 -0
- data/dummy/lib/tasks/.keep +0 -0
- data/dummy/log/.keep +0 -0
- data/dummy/public/404.html +67 -0
- data/dummy/public/422.html +67 -0
- data/dummy/public/500.html +66 -0
- data/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/dummy/public/apple-touch-icon.png +0 -0
- data/dummy/public/favicon.ico +0 -0
- data/dummy/public/robots.txt +1 -0
- data/dummy/storage/.keep +0 -0
- data/dummy/test/application_system_test_case.rb +21 -0
- data/dummy/test/channels/application_cable/connection_test.rb +11 -0
- data/dummy/test/controllers/.keep +0 -0
- data/dummy/test/fixtures/files/.keep +0 -0
- data/dummy/test/helpers/.keep +0 -0
- data/dummy/test/integration/.keep +0 -0
- data/dummy/test/mailers/.keep +0 -0
- data/dummy/test/models/.keep +0 -0
- data/dummy/test/system/.keep +0 -0
- data/dummy/test/system/tests_test.rb +9 -0
- data/dummy/test/test_helper.rb +13 -0
- data/dummy/tmp/.keep +0 -0
- data/dummy/tmp/pids/.keep +0 -0
- data/dummy/tmp/storage/.keep +0 -0
- data/lib/bard/file_field/field.rb +27 -0
- data/lib/bard/file_field/form_builder.rb +12 -0
- data/lib/bard/file_field/version.rb +7 -0
- data/lib/bard/file_field.rb +20 -0
- metadata +197 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module WithinHelpers
|
|
2
|
+
# Maps a name to a selector. Used primarily by the
|
|
3
|
+
#
|
|
4
|
+
# When /^(.+) within (.+)$/ do |step, scope|
|
|
5
|
+
#
|
|
6
|
+
# step definitions in web_steps.rb
|
|
7
|
+
#
|
|
8
|
+
def selector_for(locator)
|
|
9
|
+
case locator
|
|
10
|
+
|
|
11
|
+
when /the "(.+)" bard-file/
|
|
12
|
+
field = find_field($1)
|
|
13
|
+
bard_file = field.find(:xpath, "..")
|
|
14
|
+
|
|
15
|
+
when /the "(.+)" uploaded-file/
|
|
16
|
+
page.document.synchronize 5, errors: [Capybara::ElementNotFound, Ferrum::JavaScriptError] do
|
|
17
|
+
find("uploaded-file[filename='#{$1}']").shadow_root.find("figure")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Add more mappings here.
|
|
21
|
+
# Here is an example that pulls values out of the Regexp:
|
|
22
|
+
#
|
|
23
|
+
# when /^the (notice|error|info) flash$/
|
|
24
|
+
# ".flash.#{$1}"
|
|
25
|
+
|
|
26
|
+
# You can also return an array to use a different selector
|
|
27
|
+
# type, like:
|
|
28
|
+
#
|
|
29
|
+
# when /the header/
|
|
30
|
+
# [:xpath, "//header"]
|
|
31
|
+
|
|
32
|
+
# This allows you to provide a quoted selector as the scope
|
|
33
|
+
# for "within" steps as was previously the default for the
|
|
34
|
+
# web steps:
|
|
35
|
+
|
|
36
|
+
else
|
|
37
|
+
raise "Can't find mapping from \"#{locator}\" to a selector.\n" +
|
|
38
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def element_for(locator)
|
|
43
|
+
args = Array(selector_for(locator))
|
|
44
|
+
find(args.shift, **(args.shift || {}))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def with_scope(locator)
|
|
48
|
+
args = Array(selector_for(locator))
|
|
49
|
+
within(args.shift, **(args.shift || {})) { yield }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
World(WithinHelpers)
|
|
53
|
+
|
|
54
|
+
# Single-line step scoper
|
|
55
|
+
When /^(.*) within (.*[^:])$/ do |step_fragment, parent|
|
|
56
|
+
with_scope(parent) { step step_fragment }
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Multi-line step scoper
|
|
60
|
+
When /^(.*) within (.*[^:]):$/ do |step_fragment, parent, table_or_string|
|
|
61
|
+
with_scope(parent) { step "#{step_fragment}:", table_or_string }
|
|
62
|
+
end
|
|
63
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
Given "I am on the homepage" do
|
|
2
|
+
visit "/"
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
Given "I am on {string}" do |path|
|
|
6
|
+
visit path
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
When "I reload the page" do
|
|
10
|
+
visit page.current_path
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
When "I fill in {string} with {string}" do |field, value|
|
|
14
|
+
fill_in field, with: value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
When "I attach the file {string} to {string}" do |path, field|
|
|
18
|
+
attach_file field, Rails.root.join("features/support/fixtures/#{path}")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
When "I attach a file of type {string} to {string}" do |extension, field|
|
|
22
|
+
path = Rails.root.join("features/support/fixtures/empty.#{extension}")
|
|
23
|
+
FileUtils.touch(path)
|
|
24
|
+
attach_file field, path
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
When "I attach the following files to {string}:" do |field, table|
|
|
28
|
+
files = table.raw.map(&:first).map { |path| Rails.root.join("features/support/fixtures/#{path}") }
|
|
29
|
+
attach_file field, files
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
When "I follow {string}" do |link|
|
|
33
|
+
find_link(link).trigger "click"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
When "I press {string}" do |button|
|
|
37
|
+
click_button button
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
Then "I should see {string} filled in with {string}" do |field, value|
|
|
41
|
+
expect(find_field(field).value).to eq(value)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
Then /^I should see "(.*?)"$/ do |text|
|
|
45
|
+
expect(page).to have_content(text)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
Then /^I should not see "(.*?)"$/ do |text|
|
|
49
|
+
expect(page).to_not have_content(text)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
Then "I should see the {string} image" do |filename|
|
|
53
|
+
expect(page).to have_css("img[src$='/#{filename}']")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
Then "I should not see the {string} image" do |filename|
|
|
57
|
+
expect(page).to_not have_css("img[src$='/#{filename}']")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
Then "I should see a preview of {string}" do |filename|
|
|
61
|
+
expect(find("uploaded-file")[:filename]).to eq(filename)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Then "I should not see a preview" do
|
|
65
|
+
expect(page).to_not have_css("figure")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
Then "I should see an upload progress bar at 100%" do
|
|
69
|
+
page.document.synchronize 5, errors: [Capybara::ElementNotFound, Ferrum::JavaScriptError] do
|
|
70
|
+
expect(page).to have_css("progress-bar[percent='100']")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
Then "the {string} bard-file should have a validation error containing {string}" do |field, message|
|
|
75
|
+
messages = bard_file_validation_messages(field)
|
|
76
|
+
expect(messages).to include message
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
Then "the {string} bard-file should have no validation errors" do |field|
|
|
80
|
+
messages = bard_file_validation_messages(field)
|
|
81
|
+
expect(messages).to be_empty
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def bard_file_validation_messages field
|
|
85
|
+
field = find_field(field)
|
|
86
|
+
bard_file = field.find(:xpath, "..")
|
|
87
|
+
[bard_file, *bard_file.all("uploaded-file input")].map do |e|
|
|
88
|
+
e.evaluate_script("this.validationMessage")
|
|
89
|
+
end.select(&:present?)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
Then "debugger" do
|
|
93
|
+
debugger
|
|
94
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
Feature: form.bard_file_field has validation options
|
|
2
|
+
Scenario: It supports required validation
|
|
3
|
+
Given I am on "/validations/required_file"
|
|
4
|
+
|
|
5
|
+
When I press "Submit"
|
|
6
|
+
Then I should not see "Post created!"
|
|
7
|
+
And the "Required file" bard-file should have a validation error containing "Please select a file."
|
|
8
|
+
|
|
9
|
+
When I attach the file "image.jpg" to "Required file"
|
|
10
|
+
And I press "Submit"
|
|
11
|
+
Then I should see "Post created!"
|
|
12
|
+
And I should see a preview of "image.jpg" within the "Required file" bard-file
|
|
13
|
+
|
|
14
|
+
Scenario: It supports file type validation
|
|
15
|
+
Given I am on "/validations/optional_image"
|
|
16
|
+
|
|
17
|
+
When I attach the file "video.mp4" to "Optional image"
|
|
18
|
+
Then the "Optional image" bard-file should have a validation error containing "Must be a image."
|
|
19
|
+
Then I should not see a preview within the "Optional image" bard-file
|
|
20
|
+
|
|
21
|
+
When I press "Submit"
|
|
22
|
+
Then I should not see "Post created!"
|
|
23
|
+
And I should not see "video.mp4"
|
|
24
|
+
|
|
25
|
+
When I attach the file "image.jpg" to "Optional image"
|
|
26
|
+
And I press "Submit"
|
|
27
|
+
Then I should see "Post created!"
|
|
28
|
+
And I should see a preview of "image.jpg" within the "Optional image" bard-file
|
|
29
|
+
|
|
30
|
+
Scenario: It supports file size validation
|
|
31
|
+
Given I am on "/validations/optional_file_with_max_size"
|
|
32
|
+
When I attach the file "video.mp4" to "File"
|
|
33
|
+
Then the "File" bard-file should have a validation error containing "Must be smaller than 100KB, and \"video.mp4\" is 119.59KB. Please attach a smaller file."
|
|
34
|
+
Then I should not see a preview within the "File" bard-file
|
|
35
|
+
|
|
36
|
+
When I press "Submit"
|
|
37
|
+
Then I should not see "Post created!"
|
|
38
|
+
And I should not see "video.mp4"
|
|
39
|
+
|
|
40
|
+
When I attach the file "image.jpg" to "File"
|
|
41
|
+
And I press "Submit"
|
|
42
|
+
Then I should see "Post created!"
|
|
43
|
+
And I should see a preview of "image.jpg" within the "File" bard-file
|
|
44
|
+
|
|
45
|
+
Scenario Outline: It supports many file extensions
|
|
46
|
+
Given I am on "/validations/required_media"
|
|
47
|
+
When I attach a file of type "<extension>" to "Required media"
|
|
48
|
+
Then the "Required media" bard-file should have no validation errors
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
| extension |
|
|
52
|
+
# Images
|
|
53
|
+
| JPEG |
|
|
54
|
+
| jpeg |
|
|
55
|
+
| jpg |
|
|
56
|
+
| png |
|
|
57
|
+
| gif |
|
|
58
|
+
| bmp |
|
|
59
|
+
| tiff |
|
|
60
|
+
| heic |
|
|
61
|
+
# Videos
|
|
62
|
+
| mp4 |
|
|
63
|
+
| avi |
|
|
64
|
+
| mov |
|
|
65
|
+
| wmv |
|
|
66
|
+
| 3gpp |
|
|
67
|
+
| webm |
|
|
68
|
+
| m4v |
|
|
69
|
+
| mkv |
|
|
70
|
+
| flv |
|
|
71
|
+
|
|
File without changes
|
|
File without changes
|
data/dummy/log/.keep
ADDED
|
File without changes
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
.rails-default-error-page {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.rails-default-error-page div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.rails-default-error-page div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.rails-default-error-page h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.rails-default-error-page div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body class="rails-default-error-page">
|
|
58
|
+
<!-- This file lives in public/404.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
|
62
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
|
63
|
+
</div>
|
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
65
|
+
</div>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
.rails-default-error-page {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.rails-default-error-page div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.rails-default-error-page div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.rails-default-error-page h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.rails-default-error-page div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body class="rails-default-error-page">
|
|
58
|
+
<!-- This file lives in public/422.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>The change you wanted was rejected.</h1>
|
|
62
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
|
63
|
+
</div>
|
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
65
|
+
</div>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
.rails-default-error-page {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.rails-default-error-page div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.rails-default-error-page div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.rails-default-error-page h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.rails-default-error-page div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body class="rails-default-error-page">
|
|
58
|
+
<!-- This file lives in public/500.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>We're sorry, but something went wrong.</h1>
|
|
62
|
+
</div>
|
|
63
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
64
|
+
</div>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
|
data/dummy/storage/.keep
ADDED
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
require "capybara/cuprite"
|
|
3
|
+
|
|
4
|
+
Capybara.register_driver(:cuprite) do |app|
|
|
5
|
+
Capybara::Cuprite::Driver.new(
|
|
6
|
+
app, **{
|
|
7
|
+
window_size: [1200, 800],
|
|
8
|
+
browser_options: {},
|
|
9
|
+
process_timeout: 10,
|
|
10
|
+
inspector: true,
|
|
11
|
+
headless: false # !ENV["HEADLESS"].in?(%w[n 0 no false])
|
|
12
|
+
}
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
Capybara.default_driver = Capybara.javascript_driver = :cuprite
|
|
16
|
+
|
|
17
|
+
Capybara.server = :puma, { Silent: true }
|
|
18
|
+
|
|
19
|
+
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
|
|
20
|
+
driven_by :cuprite, using: :chromium
|
|
21
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
ENV["RAILS_ENV"] ||= "test"
|
|
2
|
+
require_relative "../config/environment"
|
|
3
|
+
require "rails/test_help"
|
|
4
|
+
|
|
5
|
+
class ActiveSupport::TestCase
|
|
6
|
+
# Run tests in parallel with specified workers
|
|
7
|
+
parallelize(workers: :number_of_processors)
|
|
8
|
+
|
|
9
|
+
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
|
|
10
|
+
fixtures :all
|
|
11
|
+
|
|
12
|
+
# Add more helper methods to be used by all tests here...
|
|
13
|
+
end
|
data/dummy/tmp/.keep
ADDED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Bard
|
|
2
|
+
module FileField
|
|
3
|
+
class Field < ActionView::Helpers::Tags::TextField
|
|
4
|
+
def render &block
|
|
5
|
+
options = @options.stringify_keys.reverse_merge({
|
|
6
|
+
"directupload" => "/rails/active_storage/direct_uploads",
|
|
7
|
+
"preview" => true,
|
|
8
|
+
})
|
|
9
|
+
add_default_name_and_id(options)
|
|
10
|
+
|
|
11
|
+
content_tag("bard-file", options) do
|
|
12
|
+
next block.call(options) if block
|
|
13
|
+
Array(object.try(@method_name)).map do |attachment|
|
|
14
|
+
content_tag("uploaded-file", nil, {
|
|
15
|
+
name: options["name"],
|
|
16
|
+
src: @template_object.url_for(attachment),
|
|
17
|
+
filename: attachment.filename,
|
|
18
|
+
value: attachment.signed_id,
|
|
19
|
+
preview: options["preview"],
|
|
20
|
+
})
|
|
21
|
+
end.join("\n").html_safe
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require_relative "field"
|
|
2
|
+
|
|
3
|
+
module Bard
|
|
4
|
+
module FileField
|
|
5
|
+
module FormBuilder
|
|
6
|
+
def bard_file_field method, options={}, &block
|
|
7
|
+
self.multipart = true
|
|
8
|
+
Field.new(@object_name, method, @template, objectify_options(options)).render(&block)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "file_field/version"
|
|
4
|
+
require_relative "file_field/form_builder"
|
|
5
|
+
|
|
6
|
+
module Bard
|
|
7
|
+
module FileField
|
|
8
|
+
class Engine < ::Rails::Engine
|
|
9
|
+
initializer "bard-file_field.assets" do
|
|
10
|
+
if Rails.application.config.respond_to?(:assets)
|
|
11
|
+
Rails.application.config.assets.precompile += ["bard-file.js"]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
config.after_initialize do
|
|
16
|
+
ActionView::Base.default_form_builder.include FormBuilder
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|