Skip to content

Commit f62e747

Browse files
committed
Add form examples and a preview server for forms
1 parent 7e0d413 commit f62e747

12 files changed

Lines changed: 351 additions & 0 deletions

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@
99

1010
# rspec failure tracking
1111
.rspec_status
12+
13+
# Log files
14+
log/
15+
*.log

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,12 @@ https://www.ruby-toolbox.com/projects/formtastic
508508

509509
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
510510

511+
To preview example forms in your browser, run:
512+
513+
$ bin/preview
514+
515+
This boots a local Rails server at http://localhost:3000 that displays all forms in the `examples/` directory. The server supports hot-reloading, so you can edit forms and refresh the page to see changes.
516+
511517
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
512518

513519
## Contributing

bin/preview

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env ruby
2+
# frozen_string_literal: true
3+
4+
# Boot the Superform examples server
5+
# Run with: bin/superform
6+
7+
require_relative "../server/rails"
8+
start

examples/basic_form.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class BasicForm < ExampleForm
2+
def self.description = <<~HTML
3+
<p>Common input types: <code>text</code>, <code>email</code>, <code>password</code>, and <code>number</code>.</p>
4+
HTML
5+
6+
def view_template
7+
render field(:name).label
8+
render field(:name).text(placeholder: "Your name")
9+
10+
render field(:email).label
11+
render field(:email).email(placeholder: "you@example.com")
12+
13+
render field(:password).label
14+
render field(:password).password
15+
16+
render field(:age).label
17+
render field(:age).number(min: 0, max: 150)
18+
19+
render submit("Save")
20+
end
21+
end

examples/checkbox_form.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class CheckboxForm < ExampleForm
2+
def self.description = <<~HTML
3+
<p><code>checkbox</code> inputs with labels inside a fieldset.</p>
4+
HTML
5+
6+
def view_template
7+
fieldset do
8+
legend { "Preferences" }
9+
10+
label do
11+
render field(:terms_accepted).checkbox
12+
plain " I accept the terms"
13+
end
14+
15+
label do
16+
render field(:subscribe).checkbox
17+
plain " Subscribe to newsletter"
18+
end
19+
20+
label do
21+
render field(:featured).checkbox
22+
plain " Feature this item"
23+
end
24+
end
25+
26+
render submit("Continue")
27+
end
28+
end

examples/date_time_form.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class DateTimeForm < ExampleForm
2+
def self.description = <<~HTML
3+
<p><code>date</code>, <code>time</code>, and <code>datetime</code> input types.</p>
4+
HTML
5+
6+
def view_template
7+
render field(:birth_date).label
8+
render field(:birth_date).date
9+
10+
render field(:appointment_time).label
11+
render field(:appointment_time).time
12+
13+
render field(:event_datetime).label
14+
render field(:event_datetime).datetime
15+
16+
render submit("Schedule")
17+
end
18+
end

examples/example_form.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Base class for example forms
2+
class ExampleForm < Superform::Rails::Form
3+
def self.name_text
4+
name.gsub(/Form$/, "").gsub(/([a-z])([A-Z])/, '\1 \2')
5+
end
6+
7+
def self.description
8+
""
9+
end
10+
end

examples/select_form.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class SelectForm < ExampleForm
2+
def self.description = <<~HTML
3+
<p><code>select</code> dropdowns with various option formats.</p>
4+
HTML
5+
6+
COUNTRIES = [
7+
["United States", "us"],
8+
["Canada", "ca"],
9+
["United Kingdom", "uk"],
10+
["Germany", "de"],
11+
["Japan", "jp"]
12+
].freeze
13+
14+
def view_template
15+
render field(:country).label
16+
render field(:country).select(options: COUNTRIES, include_blank: "Choose...")
17+
18+
render field(:priority).label
19+
render field(:priority).select(options: %w[Low Medium High])
20+
21+
render field(:quantity).label
22+
render field(:quantity).select(options: (1..10).to_a)
23+
24+
render submit("Submit")
25+
end
26+
end

examples/special_inputs_form.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class SpecialInputsForm < ExampleForm
2+
def self.name_text = "Special Inputs"
3+
4+
def self.description = <<~HTML
5+
<p>HTML5 input types: <code>color</code>, <code>range</code>, <code>search</code>, and <code>file</code>.</p>
6+
HTML
7+
8+
def view_template
9+
render field(:favorite_color).label
10+
render field(:favorite_color).color
11+
12+
render field(:volume).label
13+
render field(:volume).range(min: 0, max: 100, step: 10)
14+
15+
render field(:search_query).label
16+
render field(:search_query).search(placeholder: "Search...")
17+
18+
render field(:avatar).label
19+
render field(:avatar).file(accept: "image/*")
20+
21+
render submit("Apply")
22+
end
23+
end

examples/textarea_form.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class TextareaForm < ExampleForm
2+
def self.description = <<~HTML
3+
<p>Text input and <code>textarea</code> for longer content.</p>
4+
HTML
5+
6+
def view_template
7+
render field(:title).label
8+
render field(:title).text(placeholder: "Post title")
9+
10+
render field(:body).label
11+
render field(:body).textarea(rows: 6, placeholder: "Write your content...")
12+
13+
render submit("Publish")
14+
end
15+
end

0 commit comments

Comments
 (0)