Skip to content

Commit 882c22b

Browse files
authored
Styled users and associated providers (#44)
* Styled users and associated providers * Fixed lint
1 parent 6b16c33 commit 882c22b

15 files changed

+154
-88
lines changed

app/controllers/users_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,6 @@ def set_user
6767

6868
# Only allow a list of trusted parameters through.
6969
def user_params
70-
params.expect(user: [ :email_address, :password, :is_admin ])
70+
params.expect(user: [ :email_address, :password, :is_admin, :provider_id ])
7171
end
7272
end

app/models/provider.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
class Provider < ApplicationRecord
22
validates :name, presence: true
33
validates :name, uniqueness: true
4+
5+
has_many :users
46
end

app/models/user.rb

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class User < ApplicationRecord
22
has_secure_password
33
has_many :sessions, dependent: :destroy
4+
belongs_to :provider, optional: true
45

56
validates :email_address, presence: true
67
validates :email_address, uniqueness: true

app/views/users/_form.html.erb

+28-37
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,39 @@
1-
<%= form_with(model: user) do |form| %>
2-
<% if user.errors.any? %>
3-
<div style="color: red">
4-
<h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2>
5-
6-
<ul>
7-
<% user.errors.each do |error| %>
8-
<li><%= error.full_message %></li>
9-
<% end %>
10-
</ul>
11-
</div>
12-
<% end %>
13-
14-
<div class="form-body">
15-
<div class="row">
16-
<div class="col-md-4">
17-
<%= form.label :email_address, style: "display: block" %>
1+
<div class="card-content">
2+
<div class="card-body">
3+
<p>Regions should ... Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut
4+
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
5+
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
6+
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est
7+
laborum.</p>
8+
<%= form_with(model: @user, local: true, class: "form") do |f| %>
9+
<div class="row">
10+
<div class="col-md-12 col-12">
11+
<div class="form-group">
12+
<%= f.label :email_address, "Email Address" %>
13+
<%= f.text_field :email_address, class: "form-control", placeholder: "[email protected]" %>
14+
</div>
1815
</div>
16+
<div class="row">
17+
<div class="col-md-4">
18+
<%= f.label :provider_id, style: "display: block" %>
19+
</div>
1920
<div class="col-md-8 form-group">
20-
<%= form.text_field :email_address %>
21+
<%= f.collection_select(:provider_id, Provider.all, :id, :name, include_blank: "No provider (user must be an admin)") %>
2122
</div>
2223
</div>
23-
<% if @user.new_record? %>
24-
<div class="row">
25-
<div class="col-md-4">
26-
<%= form.label :password, style: "display: block" %>
27-
</div>
28-
<div class="col-md-8 form-group">
29-
<%= form.text_field :password %>
30-
</div>
31-
</div>
32-
<% end %>
3324
<div class="row">
3425
<div class="col-md-4">
35-
<%= form.label :is_admin, style: "display: block" %>
26+
<%= f.label :is_admin, style: "display: block" %>
3627
</div>
3728
<div class="col-md-8 form-group">
38-
<%= form.checkbox :is_admin %>
29+
<%= f.checkbox :is_admin %>
3930
</div>
4031
</div>
32+
<div class="col-12 d-flex justify-content-end">
33+
<%= submit_button(f) %>
34+
<%= link_to "Cancel", users_path, class: "btn btn-light-secondary me-1 mb-1" %>
35+
</div>
36+
</div>
37+
<% end %>
38+
</div>
4139
</div>
42-
43-
44-
<div class="col-sm-12 d-flex justify-content-end">
45-
<%= form.submit class: "btn btn-primary me-1 mb-1" %>
46-
</div>
47-
48-
<% end %>

app/views/users/_user.html.erb

+5
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,9 @@
99
<%= user.is_admin %>
1010
</p>
1111

12+
<p>
13+
<strong>Provider:</strong>
14+
<%= user.provider.present? ? user.provider.name : "No provider" %>
15+
</p>
16+
1217
</div>

app/views/users/edit.html.erb

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
<% content_for :title, "Editing user" %>
22

3-
<h1>Editing user</h1>
4-
5-
<%= render "form", user: @user %>
6-
7-
<br>
8-
9-
<div>
10-
<%= link_to "Show this user", @user %> |
11-
<%= link_to "Back to users", users_path %>
12-
</div>
3+
<section id="multiple-column-form">
4+
<div class="row match-height">
5+
<div class="col-12">
6+
<div class="card">
7+
<div class="card-header">
8+
<h3>Edit Users</h3>
9+
</div>
10+
<%= render "form", user:@user %>
11+
</div>
12+
</div>
13+
</div>
14+
</section>

app/views/users/index.html.erb

+51-16
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,51 @@
1-
<p style="color: green"><%= notice %></p>
2-
3-
<% content_for :title, "Users" %>
4-
5-
<h1>Users</h1>
6-
7-
<div id="users">
8-
<% @users.each do |user| %>
9-
<%= render user %>
10-
<p>
11-
<%= link_to "Show this user", user %>
12-
</p>
13-
<% end %>
14-
</div>
15-
16-
<%= link_to "New user", new_user_path %>
1+
<section class="section">
2+
<div class="row" id="table-striped">
3+
<div class="col-12 cold-md-12">
4+
<div class="card">
5+
<div class="card-header d-flex justify-content-between align-items-center">
6+
<h2>Users</h2>
7+
<%= link_to new_user_path, class: "btn btn-primary" do %>
8+
<i class="bi bi-plus-circle-fill"></i> Add New User
9+
<% end %>
10+
</div>
11+
<div class="card-content">
12+
<div class="card-body">
13+
<p class="card-text">
14+
Lorem ipsum dolor sit amet, <code>consectetur adipiscing</code> elit. Sed do eiusmod tempor incididunt ut
15+
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
16+
ex ea commodo consequat. Duis aute irure dolor in <code>reprehenderit</code> in voluptate velit esse cillum dolore eu fugiat nulla
17+
pariatur. Excepteur sint <code>occaecat cupidatat</code> non proident, sunt in culpa qui officia deserunt mollit anim id est
18+
laborum.
19+
</p>
20+
<!-- table striped -->
21+
<div class="table-responsive">
22+
<table class="table table-lg table-striped mb-0">
23+
<thead>
24+
<tr>
25+
<th>Users</th>
26+
<th>Provider</th>
27+
<th class="text-end">User Actions</th>
28+
</tr>
29+
</thead>
30+
<tbody>
31+
<% @users.each do |user| %>
32+
<tr id="<%= dom_id(user) %>" class="user-listing">
33+
<td class="text-bold-500"><%= user.email_address %></td>
34+
<td><%= user.provider.name if user.provider.present? %></td>
35+
<td class="text-end">
36+
<%= show_page_tool_link(user, "Show User Details") %>
37+
<%= link_to edit_user_path(user), class: "btn btn-secondary btn-sm" do %>
38+
<i class="bi bi-pencil"></i>
39+
<% end %>
40+
<%= delete_tool_link(user, "Delete User") %>
41+
</td>
42+
</tr>
43+
<% end %>
44+
</tbody>
45+
</table>
46+
</div>
47+
</div>
48+
</div>
49+
</div>
50+
</div>
51+
</section>

app/views/users/new.html.erb

+12-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
<% content_for :title, "New user" %>
2-
3-
<h1>New user</h1>
4-
5-
<%= render "form", user: @user %>
6-
7-
<br>
8-
9-
<div>
10-
<%= link_to "Back to users", users_path %>
11-
</div>
1+
<section id="multiple-column-form">
2+
<div class="row match-height">
3+
<div class="col-12">
4+
<div class="card">
5+
<div class="card-header">
6+
<h3>Create New User</h3>
7+
</div>
8+
<%= render "form", user:@user %>
9+
</div>
10+
</div>
11+
</div>
12+
</section>

app/views/users/show.html.erb

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,27 @@
11
<p style="color: green"><%= notice %></p>
22

3-
<%= render @user %>
43

5-
<div>
6-
<%= link_to "Edit this user", edit_user_path(@user) %> |
7-
<%= link_to "Back to users", users_path %>
4+
<section id="multiple-column-form">
5+
<div class="row match-height">
6+
<div class="col-12">
7+
<div class="card">
8+
<div class="card-header">
9+
<h2>User</h2>
10+
<h4><%= @user.email_address %></h4>
11+
</div>
12+
<div class="card-content">
13+
<div class="card-body">
14+
<%= render @user %>
815

9-
<%= button_to "Destroy this user", @user, method: :delete %>
10-
</div>
16+
<div>
17+
<%= link_to "Edit this user", edit_user_path(@user) %> |
18+
<%= link_to "Back to users", users_path %>
19+
20+
<%= button_to "Destroy this user", @user, method: :delete %>
21+
</div>
22+
</div>
23+
</div>
24+
</div>
25+
</div>
26+
</div>
27+
</section>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddProviderIdToUser < ActiveRecord::Migration[8.0]
2+
def change
3+
add_column :users, :provider_id, :integer
4+
end
5+
end

db/schema.rb

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/models/provider_spec.rb

+5
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,9 @@
55
it { should validate_presence_of(:name) }
66
it { should validate_uniqueness_of(:name) }
77
end
8+
9+
describe 'associations' do
10+
subject { FactoryBot.build(:provider) }
11+
it { should have_many :users }
12+
end
813
end

spec/models/user_spec.rb

+5
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,9 @@
66
it { should validate_presence_of(:email_address) }
77
it { should validate_uniqueness_of(:email_address).ignoring_case_sensitivity }
88
end
9+
10+
describe 'associations' do
11+
subject { FactoryBot.build(:user) }
12+
it { should belong_to(:provider).optional }
13+
end
914
end

spec/views/users/index.html.erb_spec.rb

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818

1919
it "renders a list of users" do
2020
render
21-
cell_selector = 'div>p'
22-
assert_select cell_selector, text: Regexp.new("Email address".to_s), count: 2
23-
assert_select cell_selector, text: Regexp.new(false.to_s), count: 2
21+
cell_selector = 'tr.user-listing'
22+
assert_select cell_selector, text: Regexp.new("email address".to_s), count: 2
2423
end
2524
end

spec/views/users/new.html.erb_spec.rb

-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@
1414

1515
assert_select "form[action=?][method=?]", users_path, "post" do
1616
assert_select "input[name=?]", "user[email_address]"
17-
18-
assert_select "input[name=?]", "user[password]"
19-
2017
assert_select "input[name=?]", "user[is_admin]"
2118
end
2219
end

0 commit comments

Comments
 (0)