bpluser 0.1.19 → 0.2.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.
Files changed (99) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +33 -0
  3. data/Rakefile +34 -3
  4. data/app/assets/config/bpluser_manifest.js +1 -0
  5. data/app/assets/javascripts/bpluser/folder_tools.js +26 -0
  6. data/app/controllers/bookmarks_controller.rb +50 -0
  7. data/app/controllers/concerns/bpluser/folders_verify_user.rb +20 -0
  8. data/app/controllers/concerns/bpluser/omniauth_callbacks.rb +27 -0
  9. data/app/controllers/concerns/bpluser/registrations.rb +35 -0
  10. data/app/controllers/concerns/bpluser/saved_searches.rb +62 -0
  11. data/app/controllers/folder_items_actions_controller.rb +77 -0
  12. data/app/controllers/folder_items_controller.rb +97 -0
  13. data/app/controllers/folders_controller.rb +100 -0
  14. data/app/controllers/saved_searches_controller.rb +5 -0
  15. data/app/controllers/users/omniauth_callbacks_controller.rb +7 -0
  16. data/app/controllers/users/registrations_controller.rb +7 -0
  17. data/app/controllers/users/sessions_controller.rb +6 -0
  18. data/app/controllers/users_controller.rb +25 -0
  19. data/app/helpers/bpluser/folders_helper_behavior.rb +11 -0
  20. data/app/helpers/folders_helper.rb +5 -0
  21. data/app/models/bpluser/folder.rb +21 -10
  22. data/app/models/bpluser/folder_item.rb +5 -7
  23. data/app/models/concerns/bpluser/users.rb +71 -0
  24. data/app/models/concerns/bpluser/validatable.rb +34 -0
  25. data/app/views/bookmarks/index.html.erb +58 -0
  26. data/app/views/bookmarks/update.js.erb +1 -0
  27. data/app/views/bpluser/folders/_folder.html.erb +36 -0
  28. data/app/views/catalog/_constraints.html.erb +14 -0
  29. data/app/views/catalog/_folder_item_control.html.erb +52 -0
  30. data/app/views/catalog/_save_search.html.erb +8 -0
  31. data/app/views/devise/confirmations/new.html.erb +14 -0
  32. data/app/views/devise/mailer/reset_password_instructions.html.erb +13 -0
  33. data/app/views/devise/passwords/edit.html.erb +32 -0
  34. data/app/views/devise/passwords/new.html.erb +30 -0
  35. data/app/views/devise/registrations/edit.html.erb +82 -0
  36. data/app/views/devise/registrations/new.html.erb +45 -0
  37. data/app/views/devise/sessions/new.html.erb +72 -0
  38. data/app/views/devise/shared/_links.erb +29 -0
  39. data/app/views/folder_items/create.js.erb +1 -0
  40. data/app/views/folder_items/destroy.js.erb +1 -0
  41. data/app/views/folder_items/item_actions.js.erb +2 -0
  42. data/app/views/folder_items/update.js.erb +1 -0
  43. data/app/views/folders/_in_folder.html.erb +3 -0
  44. data/app/views/folders/_new_edit_form_fields.html.erb +36 -0
  45. data/app/views/folders/edit.html.erb +25 -0
  46. data/app/views/folders/index.html.erb +67 -0
  47. data/app/views/folders/new.html.erb +26 -0
  48. data/app/views/folders/public_list.html.erb +41 -0
  49. data/app/views/folders/show.html.erb +82 -0
  50. data/app/views/saved_searches/index.html.erb +55 -0
  51. data/app/views/search_history/index.html.erb +57 -0
  52. data/app/views/shared/_folder_item_actions.html.erb +54 -0
  53. data/app/views/shared/_folder_tools.html.erb +4 -0
  54. data/app/views/shared/_tools.html.erb +16 -0
  55. data/app/views/shared/_user_util_links.html.erb +42 -0
  56. data/app/views/users/show.html.erb +33 -0
  57. data/config/locales/bpluser.en.yml +129 -0
  58. data/config/routes.rb +23 -2
  59. data/lib/bpluser/controller.rb +61 -0
  60. data/lib/bpluser/devise_guests_override.rb +21 -0
  61. data/lib/bpluser/engine.rb +27 -1
  62. data/lib/bpluser/version.rb +3 -1
  63. data/lib/bpluser.rb +21 -15
  64. data/lib/generators/bpluser/controller_generator.rb +29 -0
  65. data/lib/generators/bpluser/devise_generator.rb +40 -0
  66. data/lib/generators/bpluser/install_generator.rb +62 -0
  67. data/lib/generators/bpluser/templates/config/initializers/{devise.rb → devise.rb.bak} +0 -0
  68. data/lib/generators/bpluser/templates/config/locales/devise.en.yml +53 -0
  69. data/lib/generators/bpluser/templates/config/omniauth-polaris.yml +10 -15
  70. data/lib/generators/bpluser/templates/models/user.rb +3 -4
  71. data/lib/generators/bpluser/user_generator.rb +23 -0
  72. data/lib/tasks/bpluser_tasks.rake +27 -0
  73. metadata +132 -158
  74. data/app/controllers/bpluser/api_controller.rb +0 -8
  75. data/app/controllers/bpluser/users/omniauth_callbacks_controller.rb +0 -48
  76. data/app/controllers/bpluser/users/registrations_controller.rb +0 -35
  77. data/app/controllers/bpluser/users/sessions_controller.rb +0 -23
  78. data/app/models/bpluser/ability.rb +0 -22
  79. data/app/models/bpluser/application_record.rb +0 -5
  80. data/app/models/bpluser/concerns/users.rb +0 -190
  81. data/app/models/bpluser/concerns/validatable.rb +0 -47
  82. data/app/models/bpluser/user.rb~ +0 -213
  83. data/app/models/bpluser/user_institution.rb +0 -6
  84. data/app/models/bpluser/validatable.rb~ +0 -65
  85. data/lib/bpluser/routes.rb +0 -37
  86. data/lib/generators/bpluser/bpluser_generator.rb +0 -183
  87. data/lib/generators/bpluser/templates/config/hydra-ldap.yml +0 -33
  88. data/lib/generators/bpluser/templates/config/omniauth-facebook.yml +0 -14
  89. data/lib/generators/bpluser/templates/controllers/users/omniauth_callbacks_controller.rb +0 -3
  90. data/lib/generators/bpluser/templates/controllers/users/registrations_controller.rb +0 -3
  91. data/lib/generators/bpluser/templates/controllers/users/sessions_controller.rb +0 -3
  92. data/lib/generators/bpluser/templates/migrations/add_fields_to_user.rb +0 -22
  93. data/lib/generators/bpluser/templates/migrations/add_folder_items_to_folder.rb +0 -18
  94. data/lib/generators/bpluser/templates/migrations/add_folders_to_user.rb +0 -14
  95. data/lib/generators/bpluser/templates/migrations/create_institutions_for_users.rb +0 -16
  96. data/lib/generators/bpluser/templates/models/ability.rb +0 -4
  97. data/lib/generators/bpluser/templates/views/devise/registrations/edit.html.erb +0 -0
  98. data/lib/generators/bpluser/templates/views/devise/registrations/new.html.erb +0 -24
  99. data/lib/generators/bpluser/templates/views/devise/sessions/new.html.erb +0 -17
@@ -1,20 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bpluser
2
4
  class Folder < ApplicationRecord
5
+ MAX_TITLE_LENGTH = 65
6
+ MAX_DESC_LENGTH = 250
7
+ VALID_VISIBILITY_OPTS = %w[public private].freeze
8
+
9
+ belongs_to :user, inverse_of: :folders, class_name: '::User'
10
+ has_many :folder_items, inverse_of: :folder, dependent: :destroy, class_name: 'Bpluser::FolderItem'
3
11
 
4
- belongs_to :user, inverse_of: :folders, class_name: "::User"
5
- has_many :folder_items, inverse_of: :folder ,:dependent => :destroy, :class_name => "Bpluser::FolderItem"
12
+ scope :with_folder_items, -> { includes(:folder_items) }
13
+ scope :public_list, -> { with_folder_items.where(visibility: 'public').order(updated_at: :desc) }
6
14
 
7
- validates :user_id, :presence => true
8
- #validates :title, :presence => true, :length => {:maximum => 40}
9
- validates :title, :presence => true, :length => {:maximum => 65}
10
- validates :description, :length => {:maximum => 250}
11
- validates :visibility, :inclusion => {:in => %w(public private)}
15
+ validates :title, presence: true, length: { maximum: MAX_TITLE_LENGTH }
16
+ validates :description, length: { maximum: MAX_DESC_LENGTH }
17
+ validates :visibility, presence: true, inclusion: { in: VALID_VISIBILITY_OPTS }
12
18
 
13
- #attr_accessible :id, :title, :description, :visibility
19
+ def folder_item?(document_id)
20
+ folder_items.exists?(document_id: document_id)
21
+ end
14
22
 
15
- def has_folder_item (document_id)
16
- self.folder_items.where(document_id: document_id) if self.folder_items.where(document_id: document_id).exists?
23
+ def public?
24
+ visibility == 'public'
17
25
  end
18
26
 
27
+ def private?
28
+ visibility == 'private'
29
+ end
19
30
  end
20
31
  end
@@ -1,15 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bpluser
2
4
  class FolderItem < ApplicationRecord
3
- #attr_accessible :document_id
4
-
5
- belongs_to :folder, inverse_of: :folder_items, :class_name => "Bpluser::Folder"
5
+ belongs_to :folder, inverse_of: :folder_items, class_name: 'Bpluser::Folder', touch: true
6
6
 
7
- validates :folder_id, :presence => true
8
- validates :document_id, :presence => true
7
+ validates :document_id, presence: true
9
8
 
10
9
  def document
11
- SolrDocument.new SolrDocument.unique_key => :document_id
10
+ SolrDocument.new(SolrDocument.unique_key => document_id) if document_id
12
11
  end
13
-
14
12
  end
15
13
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bpluser
4
+ module Users
5
+ # Changed this to a concern so the modules can resolve better
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ include InstanceMethods
10
+ include Bpluser::Validatable
11
+
12
+ devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :trackable, :omniauthable, omniauth_providers: [:polaris]
13
+
14
+ has_many :folders, inverse_of: :user, dependent: :destroy, class_name: 'Bpluser::Folder'
15
+ has_many :folder_items, through: :folders, class_name: 'Bpluser::FolderItem'
16
+
17
+ before_create :set_default_display_name
18
+ end
19
+
20
+ module InstanceMethods
21
+ # BEGIN INSTANCE METHODS
22
+ def name
23
+ email || username || display_name.to_s.titleize
24
+ end
25
+
26
+ alias to_s name
27
+
28
+ def user_key
29
+ send(Devise.authentication_keys.first)
30
+ end
31
+
32
+ def existing_folder_item_for(document_id)
33
+ get_folder_item(document_id)
34
+ end
35
+
36
+ def get_folder_item(document_id)
37
+ folder_items.where(document_id: document_id).first if folder_items.exists?(document_id: document_id)
38
+ end
39
+
40
+ private
41
+
42
+ def set_default_display_name
43
+ return if display_name.present?
44
+
45
+ return if first_name.blank? && last_name.blank?
46
+
47
+ self.display_name = "#{first_name} #{last_name}".strip
48
+ end
49
+ # END INSTANCE METHODS
50
+ end
51
+
52
+ # BEGIN CLASS METHODS
53
+ class_methods do
54
+ def find_for_polaris_oauth(auth_response)
55
+ polaris_info_details = auth_response[:info]
56
+
57
+ where(provider: auth_response.provider, uid: auth_response.uid).first_or_create do |user|
58
+ user.provider = auth_response.provider
59
+ user.uid = auth_response.uid
60
+ user.username = polaris_info_details[:first_name]
61
+ user.email = polaris_info_details[:email].presence || ''
62
+ user.password = Devise.friendly_token[0, 20]
63
+ user.display_name = "#{polaris_info_details[:first_name]} #{polaris_info_details[:last_name]}"
64
+ user.first_name = polaris_info_details[:first_name]
65
+ user.last_name = polaris_info_details[:last_name]
66
+ end
67
+ end
68
+ end
69
+ # END CLASS METHODS
70
+ end
71
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bpluser
4
+ module Validatable
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ include InstanceMethods
9
+
10
+ validates :uid, presence: true, uniqueness: { scope: :provider, allow_blank: true }, if: :uid_required?
11
+ end
12
+
13
+ # Overrides devise mthods used for validations
14
+ module InstanceMethods
15
+ protected
16
+
17
+ def uid_required?
18
+ provider == 'polaris'
19
+ end
20
+
21
+ def email_required?
22
+ return false if provider == 'polaris'
23
+
24
+ super
25
+ end
26
+
27
+ def password_required?
28
+ return false if provider == 'polaris'
29
+
30
+ super
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,58 @@
1
+ <% @page_title = t('blacklight.bookmarks.page_title', application_name: application_name) %>
2
+
3
+ <%= javascript_include_tag 'bpluser/folder_tools' %>
4
+
5
+ <div id="content" class="folder_show_container col-sm-9">
6
+
7
+ <div id="breadcrumb">
8
+ <ul class="breadcrumb">
9
+ <% if current_user %>
10
+ <li class="breadcrumb-item">
11
+ <%= link_to(t('blacklight.users.account_heading'), current_user) %>
12
+ <span class="divider"><%= t('blacklight.breadcrumb.separator') %></span>
13
+ </li>
14
+ <% end %>
15
+ <li class="breadcrumb-item">
16
+ <%= link_to(t('blacklight.folders.list_title'), folders_path) %>
17
+ <span class="divider"><%= t('blacklight.breadcrumb.separator') %></span>
18
+ </li>
19
+ <li class="active breadcrumb-item">
20
+ <%= t('blacklight.bookmarks.title') %>
21
+ </li>
22
+ </ul>
23
+ </div>
24
+
25
+ <h2><%= t('blacklight.bookmarks.title') %>
26
+ <% unless !current_or_guest_user || @document_list.blank? %>
27
+ <small id="folder_tools">
28
+ </small>
29
+ <% end %>
30
+ </h2>
31
+
32
+ <div id="folder_description">
33
+ <%= t('blacklight.bookmarks.description') %>
34
+ </div>
35
+
36
+ <%- if current_or_guest_user.blank? -%>
37
+ <div id="empty_folder" class="well">
38
+ <h5><%= t('blacklight.bookmarks.need_login') %></h5>
39
+ </div>
40
+ <%- elsif @document_list.blank? -%>
41
+ <div id="empty_folder" class="well">
42
+ <h4><%= t('blacklight.bookmarks.no_bookmarks') %></h4>
43
+ <p><%= t('blacklight.folders.help.add_items') %></p>
44
+ </div>
45
+ <% else %>
46
+
47
+ <%= render 'sort_and_per_page' %>
48
+
49
+ <%= form_tag selected_bookmarks_actions_path, :method => :put, :id => "item_actions_form" do %>
50
+
51
+ <%= render :partial => 'shared/folder_item_actions' %>
52
+
53
+ <%= render_document_index %>
54
+
55
+ <% end %>
56
+ <%= render 'results_pagination' %>
57
+ <% end %>
58
+ </div>
@@ -0,0 +1 @@
1
+ $('#folder_item_toggle').replaceWith("<%= escape_javascript(render(partial: 'folders/in_folder')) %>")
@@ -0,0 +1,36 @@
1
+ <li class="folders_index_list_item">
2
+ <h4>
3
+ <%= link_to folder.title, folder, :class => "folder_title" %>
4
+ <small class="folder_visibility">
5
+ <% if folder.public? %>
6
+ <%= icon('fas', 'eye', class: 'folder-icon', aria: { hidden: true }) %>
7
+ <span class="visibility_public"><%= folder.visibility %></span>
8
+ <% else %>
9
+ <%= icon('fas', 'lock', class: 'folder-icon', aria: { hidden: true }) %>
10
+ <span class="visibility_private"><%= folder.visibility %></span>
11
+ <% end %>
12
+ </small>
13
+ </h4>
14
+ <% if current_user %>
15
+ <!--
16
+ <div class="delete_folder">
17
+ <%# link_to icon('fas', 'trash-alt', aria: { hidden: true }),
18
+ folder,
19
+ method: :delete,
20
+ data: { confirm: t('blacklight.folders.delete.confirm') },
21
+ title: "delete this folder" %>
22
+ </div>
23
+ -->
24
+ <% end %>
25
+ <div class="folder_status">
26
+ <span class="folder_item_count">
27
+ <%= pluralize(folder.folder_items.length.to_s,'item') %>
28
+ </span>
29
+ <span class="folder_updated_at">
30
+ updated <%= time_ago_in_words(folder.updated_at) %> ago
31
+ </span>
32
+ </div>
33
+ <% if folder.description %>
34
+ <%= folder.description %>
35
+ <% end %>
36
+ </li>
@@ -0,0 +1,14 @@
1
+ <%# override so we can add save_search partial from Bpluser %>
2
+ <% if Deprecation.silence(Blacklight::RenderConstraintsHelperBehavior) { query_has_constraints? } %>
3
+ <div id="appliedParams" class="clearfix constraints-container card bg-light">
4
+ <div class="card-body">
5
+ <h2 class="sr-only"><%= t('blacklight.search.search_constraints_header') %></h2>
6
+ <div id="start_over_wrapper">
7
+ <%= render 'start_over' %>
8
+ <%= render 'save_search' if current_or_guest_user %>
9
+ </div>
10
+ <span class="constraints-label"><%= t('blacklight.search.filters.title') %></span>
11
+ <%= render_constraints(controller.params != params ? params : search_state) %>
12
+ </div>
13
+ </div>
14
+ <% end %>
@@ -0,0 +1,52 @@
1
+ <% if current_or_guest_user %>
2
+ <div class="documentFunctions">
3
+ <div id="folder_item_toggle">
4
+ <% if current_user %>
5
+ <% existing_folders = current_user.folders %>
6
+ <% existing_folder_item = current_user.existing_folder_item_for(document.id) %>
7
+ <% else %>
8
+ <% existing_folders = [] %>
9
+ <% end %>
10
+
11
+ <% unless bookmarked? document || existing_folder_item %>
12
+ <% if existing_folders.empty? %>
13
+ <%= form_tag( bookmark_path( document ), method: :put, remote: true) do %>
14
+ <button class="btn btn-outline-secondary" type="submit">
15
+ <%= icon('fas', 'folder-plus', class: 'show-tools-icon', aria: { hidden: true }) + ' ' + t('blacklight.folder_items.add.button') %>
16
+ </button>
17
+ <% end %>
18
+ <% else %>
19
+ <%= form_tag(bookmark_path(document), method: :put, remote: true) do %>
20
+
21
+ <div class="btn-group folder-item-control">
22
+ <button class="btn btn-outline-secondary" type="submit">
23
+ <%= icon('fas', 'folder-plus', class: 'show-tools-icon', aria: { hidden: true }) + ' ' + t('blacklight.folder_items.add.button') %>
24
+ </button>
25
+ <button id="folder_add_dropdown" class="btn btn-outline-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
26
+ <span class="sr-only">Toggle Dropdown</span>
27
+ </button>
28
+ <div class="dropdown-menu" aria-labelledby="folder_add_dropdown">
29
+ <%= link_to t('blacklight.bookmarks.title'),
30
+ bookmark_path(document),
31
+ method: :put,
32
+ class: 'folder_item_add dropdown-item',
33
+ remote: true %>
34
+
35
+ <% existing_folders.each do |folder| %>
36
+ <%= link_to folder.title,
37
+ folder_item_path(document, folder_id: folder.id),
38
+ method: :put,
39
+ class: 'folder_item_add dropdown-item',
40
+ remote: true %>
41
+
42
+ <% end %>
43
+ </div>
44
+ </div>
45
+ <% end %>
46
+ <% end %>
47
+ <% else %>
48
+ <%= render partial: 'folders/in_folder' %>
49
+ <% end %>
50
+ </div>
51
+ </div>
52
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# if current_user %>
2
+ <% if current_or_guest_user %>
3
+ <%= link_to t('blacklight.saved_searches.save'),
4
+ save_search_path(session[:history].first),
5
+ method: :put,
6
+ id: 'saveSearchLink',
7
+ class: 'catalog_saveSearchLink btn btn-sm btn-outline-secondary' %>
8
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <div class="col-sm-12">
2
+ <h2>Resend confirmation instructions</h2>
3
+
4
+ <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
5
+ <%= devise_error_messages! %>
6
+
7
+ <div><%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true %></div>
9
+
10
+ <div><%= f.submit "Resend confirmation instructions" %></div>
11
+ <% end %>
12
+
13
+ <%= render "devise/shared/links" %>
14
+ </div>
@@ -0,0 +1,13 @@
1
+ <p>Hello <%= @resource.email %>!</p>
2
+
3
+ <p>We recently received a request to change your password. Click the link below to get started:</p>
4
+
5
+ <p><%= link_to 'Change my password', edit_user_password_url(reset_password_token: @token) %></p>
6
+
7
+ <p>If you did not request a password change, then please ignore this email.</p>
8
+ <p>(Your password won't be changed until you click the link above and create a new one.)</p>
9
+ <p>If you have any questions, please <%= link_to t('blacklight.pages.contact.title'), feedback_url %>.</p>
10
+ <p>Thanks,<br/>
11
+ Digital Commonwealth<br/>
12
+ <%= link_to 'https://www.digitalcommonwealth.org/', 'https://www.digitalcommonwealth.org/' %>
13
+ </p>
@@ -0,0 +1,32 @@
1
+ <div class="col-sm-9">
2
+ <h2>Change your password</h2>
3
+
4
+ <%= form_for(resource,
5
+ as: resource_name,
6
+ url: user_password_path,
7
+ html: { method: :put, id: 'password_edit', role: 'form' }) do |f| %>
8
+ <%= render partial: 'devise/shared/error_messages', resource: resource %>
9
+ <%= f.hidden_field :reset_password_token %>
10
+
11
+ <div class="form-group row">
12
+ <label class="col-sm-2 col-form-label" for="inputPassword">New password</label>
13
+ <div class="col-sm-4">
14
+ <%= f.password_field :password, autofocus: true, autocomplete: 'off', class: 'form-control' %>
15
+ </div>
16
+ </div>
17
+ <div class="form-group row">
18
+ <label class="col-sm-2 col-form-label" for="inputPassword">Confirm new password</label>
19
+ <div class="col-sm-4">
20
+ <%= f.password_field :password_confirmation, autocomplete: 'off', class: 'form-control' %>
21
+ </div>
22
+ </div>
23
+ <div class="form-group row">
24
+ <div class="offset-sm-2 col-sm-6">
25
+ <%= f.submit 'Change password', class: 'btn btn-primary' %>
26
+ <%= link_to 'Cancel', root_path, class: 'btn btn-secondary' %>
27
+ </div>
28
+ </div>
29
+ <% end %>
30
+
31
+ <%# render "devise/shared/links" %>
32
+ </div>
@@ -0,0 +1,30 @@
1
+ <div class="col-sm-9">
2
+ <h2>Forgot your password?</h2>
3
+
4
+ <p>Enter your email address below and we'll send you a message with instructions on how to reset your password.</p>
5
+
6
+ <%= form_for(resource,
7
+ as: resource_name,
8
+ url: user_password_path,
9
+ html: { method: :post,
10
+ id: 'password_reset_request',
11
+ role: 'form' }) do |f| %>
12
+ <%= render partial: 'devise/shared/error_messages', resource: resource %>
13
+
14
+ <div class="form-group row">
15
+ <label class="col-sm-2 col-form-label" for="inputEmail">Email</label>
16
+ <div class="col-sm-4">
17
+ <%= f.text_field :email, autofocus: true, class: 'form-control' %>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="form-group row">
22
+ <div class="offset-sm-2 col-sm-4">
23
+ <%= f.submit 'Send password reset instructions', :class => 'btn btn-primary' %>
24
+ </div>
25
+ </div>
26
+
27
+ <% end %>
28
+
29
+ <%# render "devise/shared/links" %>
30
+ </div>
@@ -0,0 +1,82 @@
1
+ <div class="row">
2
+ <div class="col-sm-9">
3
+
4
+ <div id="breadcrumb">
5
+ <ul class="breadcrumb">
6
+ <li class="breadcrumb-item">
7
+ <%= link_to(t('blacklight.users.account_heading'), current_user) %>
8
+ <span class="divider"><%= t('blacklight.breadcrumb.separator') %></span>
9
+ </li>
10
+ <li class="active breadcrumb-item">
11
+ <%= t('devise.registrations.edit') %>
12
+ </li>
13
+ </ul>
14
+ </div>
15
+
16
+ <h2><%= t('devise.registrations.edit') %></h2>
17
+
18
+ <div id="edit_account_wrapper">
19
+
20
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, role: 'form' }) do |f| %>
21
+ <%= render partial: 'devise/shared/error_messages', resource: resource %>
22
+ <div class="form-group row">
23
+ <%= f.label 'First Name', class: 'col-form-label col-sm-2' %>
24
+ <div class="col-sm-4">
25
+ <%= f.text_field :first_name, autofocus: true, class: 'form-control' %>
26
+ </div>
27
+ </div>
28
+ <div class="form-group row">
29
+ <%= f.label 'Last Name', class: 'col-form-label col-sm-2' %>
30
+ <div class="col-sm-4">
31
+ <%= f.text_field :last_name, class: 'form-control' %>
32
+ </div>
33
+ </div>
34
+ <div class="form-group row">
35
+ <%= f.label :email, class: 'col-form-label col-sm-2' %>
36
+ <div class="col-sm-4">
37
+ <%= f.email_field :email, class: 'form-control' %>
38
+ </div>
39
+ </div>
40
+ <div class="form-group row">
41
+ <%= f.label t('devise.registrations.password.new'), class: 'col-form-label col-sm-2' %>
42
+ <div class="col-sm-4">
43
+ <%= f.password_field :password, class: 'form-control', autocomplete: 'off' %>
44
+ <span class="form-text">(leave blank if you don't want to change your password)</span>
45
+ </div>
46
+ </div>
47
+ <div class="form-group row">
48
+ <%= f.label t('devise.registrations.password.new_confirm'), class: 'col-form-label col-sm-2' %>
49
+ <div class="col-sm-4">
50
+ <%= f.password_field :password_confirmation, class: 'form-control', autocomplete: 'off' %>
51
+ </div>
52
+ </div>
53
+ <div class="form-group row">
54
+ <%= f.label t('devise.registrations.password.old'), class: 'col-form-label col-sm-2' %>
55
+ <div class="col-sm-4">
56
+ <%= f.password_field :current_password, class: 'form-control', autocomplete: 'off' %>
57
+ <span class="form-text">(we need your current password to confirm your changes)</span>
58
+ </div>
59
+ </div>
60
+ <div class="form-group row">
61
+ <div class="offset-sm-2 col-sm-6">
62
+ <%= f.submit 'Update my account', class: 'btn btn-primary' %>
63
+ <%= link_to 'Cancel changes', current_user, class: 'btn btn-secondary' %>
64
+ </div>
65
+ </div>
66
+ <% end %>
67
+ </div>
68
+ </div>
69
+ <div class="col-sm-3 sidebar-right">
70
+ <div id="cancel_account">
71
+ <h5>Actually, I want to cancel my account...</h5>
72
+ <ul>
73
+ <li>
74
+ <%= link_to "Cancel my account",
75
+ user_registration_path(resource),
76
+ data: { confirm: 'Are you sure? Any bookmarks, folders, or searches you have created will be deleted.' },
77
+ method: :delete %>
78
+ </li>
79
+ </ul>
80
+ </div>
81
+ </div>
82
+ </div>
@@ -0,0 +1,45 @@
1
+ <div class="col-sm-12">
2
+ <h2>Sign up</h2>
3
+
4
+ <div id="signup_wrapper">
5
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :post, role: 'form' }) do |f| %>
6
+ <%= render partial: 'devise/shared/error_messages', resource: resource %>
7
+ <div class="form-group row">
8
+ <label class="col-sm-2 col-form-label" for="inputFirstName">First name</label>
9
+ <div class="col-sm-4">
10
+ <%= f.text_field :first_name, autofocus: true, class: 'form-control' %>
11
+ </div>
12
+ </div>
13
+ <div class="form-group row">
14
+ <label class="col-sm-2 col-form-label" for="inputLastName">Last name</label>
15
+ <div class="col-sm-4">
16
+ <%= f.text_field :last_name, class: 'form-control' %>
17
+ </div>
18
+ </div>
19
+ <div class="form-group row">
20
+ <label class="col-sm-2 col-form-label" for="inputEmail">Email</label>
21
+ <div class="col-sm-4">
22
+ <%= f.text_field :email, class: 'form-control' %>
23
+ </div>
24
+ </div>
25
+ <div class="form-group row">
26
+ <label class="col-sm-2 col-form-label" for="inputPassword">Password</label>
27
+ <div class="col-sm-4">
28
+ <%= f.password_field :password, autocomplete: 'off', class: 'form-control' %>
29
+ </div>
30
+ </div>
31
+ <div class="form-group row">
32
+ <label class="col-sm-2 col-form-label" for="inputPassword">Re-enter password</label>
33
+ <div class="col-sm-4">
34
+ <%= f.password_field :password_confirmation, autocomplete: 'off', class: 'form-control' %>
35
+ </div>
36
+ </div>
37
+ <div class="form-group row">
38
+ <div class="offset-sm-2 col-sm-4">
39
+ <%= f.submit 'Sign up', class: 'btn btn-primary' %>
40
+ <%= link_to 'Cancel', root_path, class: 'btn btn-secondary' %>
41
+ </div>
42
+ </div>
43
+ <% end %>
44
+ </div>
45
+ </div>
@@ -0,0 +1,72 @@
1
+ <div class="row">
2
+ <div class="col-sm-9">
3
+ <h2>Sign in</h2>
4
+
5
+ <div id="signin_wrapper">
6
+
7
+ <%= form_for(resource,
8
+ as: resource_name,
9
+ url: user_session_path,
10
+ html: { method: :post, role: 'form' }) do |f| %>
11
+
12
+ <div class="form-group row">
13
+ <label class="col-sm-2 col-form-label" for="user_uid">Email</label>
14
+ <div class="col-sm-4">
15
+ <%= f.text_field :email, class: 'form-control' %>
16
+ </div>
17
+ </div>
18
+ <div class="form-group row">
19
+ <label class="col-sm-2 col-form-label" for="user_password">Password</label>
20
+ <div class="col-sm-4">
21
+ <%= f.password_field :password, class: 'form-control' %>
22
+ <span class="form-text">
23
+ <%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
24
+ <%= link_to 'Forgot your password?', new_password_path(resource_name) %>
25
+ <% end -%>
26
+ </span>
27
+ </div>
28
+ </div>
29
+ <% if devise_mapping.rememberable? -%>
30
+ <div class="form-group row">
31
+ <div class="form-check offset-sm-2 col-sm-6">
32
+ <%= f.check_box :remember_me, class: 'form-check-input' %>
33
+ <label id="remember_me" class="form-check-label">
34
+ Remember me on this device
35
+ </label>
36
+ </div>
37
+ </div>
38
+
39
+ <% end -%>
40
+ <div class="form-group row">
41
+ <div class="offset-sm-2 col-sm-4">
42
+ <%# f.submit "Sign in" %>
43
+ <button type="submit" class="btn btn-primary">
44
+ <span>Sign in</span>
45
+ </button>
46
+ </div>
47
+ </div>
48
+
49
+ <% end %>
50
+
51
+ <div id="alt_signins">
52
+ <%= link_to(image_tag('commonwealth-vlr-engine/bplLoginButton.png',
53
+ alt: 'Log in with your BPL library card',
54
+ class: 'alt_signin_btn'),
55
+ user_polaris_omniauth_authorize_path, method: :post) %>
56
+ </div>
57
+
58
+ <%= render 'devise/shared/links' %>
59
+
60
+ </div>
61
+ </div>
62
+ <div class="col-sm-3">
63
+ <div id="why_log_in">
64
+ <h5>Why sign in?</h5>
65
+ <ul>
66
+ <li>Create customized collections of your favorite items</li>
67
+ <li>Save important searches</li>
68
+ <li>Keep track of your search history</li>
69
+ </ul>
70
+ </div>
71
+ </div>
72
+ </div>