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.
- checksums.yaml +5 -5
- data/README.md +33 -0
- data/Rakefile +34 -3
- data/app/assets/config/bpluser_manifest.js +1 -0
- data/app/assets/javascripts/bpluser/folder_tools.js +26 -0
- data/app/controllers/bookmarks_controller.rb +50 -0
- data/app/controllers/concerns/bpluser/folders_verify_user.rb +20 -0
- data/app/controllers/concerns/bpluser/omniauth_callbacks.rb +27 -0
- data/app/controllers/concerns/bpluser/registrations.rb +35 -0
- data/app/controllers/concerns/bpluser/saved_searches.rb +62 -0
- data/app/controllers/folder_items_actions_controller.rb +77 -0
- data/app/controllers/folder_items_controller.rb +97 -0
- data/app/controllers/folders_controller.rb +100 -0
- data/app/controllers/saved_searches_controller.rb +5 -0
- data/app/controllers/users/omniauth_callbacks_controller.rb +7 -0
- data/app/controllers/users/registrations_controller.rb +7 -0
- data/app/controllers/users/sessions_controller.rb +6 -0
- data/app/controllers/users_controller.rb +25 -0
- data/app/helpers/bpluser/folders_helper_behavior.rb +11 -0
- data/app/helpers/folders_helper.rb +5 -0
- data/app/models/bpluser/folder.rb +21 -10
- data/app/models/bpluser/folder_item.rb +5 -7
- data/app/models/concerns/bpluser/users.rb +71 -0
- data/app/models/concerns/bpluser/validatable.rb +34 -0
- data/app/views/bookmarks/index.html.erb +58 -0
- data/app/views/bookmarks/update.js.erb +1 -0
- data/app/views/bpluser/folders/_folder.html.erb +36 -0
- data/app/views/catalog/_constraints.html.erb +14 -0
- data/app/views/catalog/_folder_item_control.html.erb +52 -0
- data/app/views/catalog/_save_search.html.erb +8 -0
- data/app/views/devise/confirmations/new.html.erb +14 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +13 -0
- data/app/views/devise/passwords/edit.html.erb +32 -0
- data/app/views/devise/passwords/new.html.erb +30 -0
- data/app/views/devise/registrations/edit.html.erb +82 -0
- data/app/views/devise/registrations/new.html.erb +45 -0
- data/app/views/devise/sessions/new.html.erb +72 -0
- data/app/views/devise/shared/_links.erb +29 -0
- data/app/views/folder_items/create.js.erb +1 -0
- data/app/views/folder_items/destroy.js.erb +1 -0
- data/app/views/folder_items/item_actions.js.erb +2 -0
- data/app/views/folder_items/update.js.erb +1 -0
- data/app/views/folders/_in_folder.html.erb +3 -0
- data/app/views/folders/_new_edit_form_fields.html.erb +36 -0
- data/app/views/folders/edit.html.erb +25 -0
- data/app/views/folders/index.html.erb +67 -0
- data/app/views/folders/new.html.erb +26 -0
- data/app/views/folders/public_list.html.erb +41 -0
- data/app/views/folders/show.html.erb +82 -0
- data/app/views/saved_searches/index.html.erb +55 -0
- data/app/views/search_history/index.html.erb +57 -0
- data/app/views/shared/_folder_item_actions.html.erb +54 -0
- data/app/views/shared/_folder_tools.html.erb +4 -0
- data/app/views/shared/_tools.html.erb +16 -0
- data/app/views/shared/_user_util_links.html.erb +42 -0
- data/app/views/users/show.html.erb +33 -0
- data/config/locales/bpluser.en.yml +129 -0
- data/config/routes.rb +23 -2
- data/lib/bpluser/controller.rb +61 -0
- data/lib/bpluser/devise_guests_override.rb +21 -0
- data/lib/bpluser/engine.rb +27 -1
- data/lib/bpluser/version.rb +3 -1
- data/lib/bpluser.rb +21 -15
- data/lib/generators/bpluser/controller_generator.rb +29 -0
- data/lib/generators/bpluser/devise_generator.rb +40 -0
- data/lib/generators/bpluser/install_generator.rb +62 -0
- data/lib/generators/bpluser/templates/config/initializers/{devise.rb → devise.rb.bak} +0 -0
- data/lib/generators/bpluser/templates/config/locales/devise.en.yml +53 -0
- data/lib/generators/bpluser/templates/config/omniauth-polaris.yml +10 -15
- data/lib/generators/bpluser/templates/models/user.rb +3 -4
- data/lib/generators/bpluser/user_generator.rb +23 -0
- data/lib/tasks/bpluser_tasks.rake +27 -0
- metadata +132 -158
- data/app/controllers/bpluser/api_controller.rb +0 -8
- data/app/controllers/bpluser/users/omniauth_callbacks_controller.rb +0 -48
- data/app/controllers/bpluser/users/registrations_controller.rb +0 -35
- data/app/controllers/bpluser/users/sessions_controller.rb +0 -23
- data/app/models/bpluser/ability.rb +0 -22
- data/app/models/bpluser/application_record.rb +0 -5
- data/app/models/bpluser/concerns/users.rb +0 -190
- data/app/models/bpluser/concerns/validatable.rb +0 -47
- data/app/models/bpluser/user.rb~ +0 -213
- data/app/models/bpluser/user_institution.rb +0 -6
- data/app/models/bpluser/validatable.rb~ +0 -65
- data/lib/bpluser/routes.rb +0 -37
- data/lib/generators/bpluser/bpluser_generator.rb +0 -183
- data/lib/generators/bpluser/templates/config/hydra-ldap.yml +0 -33
- data/lib/generators/bpluser/templates/config/omniauth-facebook.yml +0 -14
- data/lib/generators/bpluser/templates/controllers/users/omniauth_callbacks_controller.rb +0 -3
- data/lib/generators/bpluser/templates/controllers/users/registrations_controller.rb +0 -3
- data/lib/generators/bpluser/templates/controllers/users/sessions_controller.rb +0 -3
- data/lib/generators/bpluser/templates/migrations/add_fields_to_user.rb +0 -22
- data/lib/generators/bpluser/templates/migrations/add_folder_items_to_folder.rb +0 -18
- data/lib/generators/bpluser/templates/migrations/add_folders_to_user.rb +0 -14
- data/lib/generators/bpluser/templates/migrations/create_institutions_for_users.rb +0 -16
- data/lib/generators/bpluser/templates/models/ability.rb +0 -4
- data/lib/generators/bpluser/templates/views/devise/registrations/edit.html.erb +0 -0
- data/lib/generators/bpluser/templates/views/devise/registrations/new.html.erb +0 -24
- data/lib/generators/bpluser/templates/views/devise/sessions/new.html.erb +0 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 542e2ec27e1951726cb444ed5fca214b92259c6f789df4833863cdc0613febde
|
|
4
|
+
data.tar.gz: 76d39f975ba98651d264b6a887650a9b19de73ac078a03d77f244b10687ea0dc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 58203dff5734d2c8756b3e5d83849091e31fb0acc6e19cbe57319a43f471d9f6f5a2bb7264a20c96912ceb5fb803eef03927a53748b366ce371268fd7ab1f362
|
|
7
|
+
data.tar.gz: 10d8f61f9fcd013c57b2faac5293a12b30ceb0e47042f3f49344a06a6bfec8e70189c39ffcff438a93835e1ff90cfc2b98e99cba37dd3f79ef30afb98bd9da71
|
data/README.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Bpluser
|
|
2
|
+
|
|
3
|
+
[](https://travis-ci.com/boston-library/bpluser) [](https://coveralls.io/github/boston-library/bpluser?branch=master)
|
|
4
|
+
|
|
5
|
+
Rails engine for providing Devise-based user models and functionality for digital repository applications using
|
|
6
|
+
[CommonwealthVlrEngine](https://github.com/boston-library/commonwealth-vlr-engine).
|
|
7
|
+
|
|
8
|
+
This includes bookmarks (Blacklight default), custom folders, and saved searches.
|
|
9
|
+
|
|
10
|
+
# Requirements
|
|
11
|
+
- `ruby >= 2.6.10`
|
|
12
|
+
- `rails ~> 6.0.6`
|
|
13
|
+
- `postgres v12 or higher`
|
|
14
|
+
|
|
15
|
+
To install, add the following to your Gemfile:
|
|
16
|
+
```ruby
|
|
17
|
+
gem 'bpluser', '~> 0.1.0'
|
|
18
|
+
# OR
|
|
19
|
+
gem 'bpluser', git: 'https://github.com/boston-library/bpluser'
|
|
20
|
+
```
|
|
21
|
+
Then run:
|
|
22
|
+
```
|
|
23
|
+
$ bundle install
|
|
24
|
+
$ rails generate bpluser:install
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
When updating run
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
rails bpluser:install:update_migrations
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
(Note that the installer will ask to overwrite your local `config/locales/devise.en.yml`).
|
data/Rakefile
CHANGED
|
@@ -1,15 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
begin
|
|
2
4
|
require 'bundler/setup'
|
|
3
5
|
rescue LoadError
|
|
4
6
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
5
7
|
end
|
|
6
8
|
|
|
7
|
-
APP_RAKEFILE = File.expand_path(
|
|
9
|
+
APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
|
|
8
10
|
# load rake tasks defined in lib/tasks that are not loaded in lib/active_fedora.rb
|
|
9
11
|
Dir['lib/tasks/*.rake'].each { |rake| load rake }
|
|
10
12
|
|
|
11
13
|
load 'rails/tasks/engine.rake'
|
|
12
|
-
|
|
13
14
|
load 'rails/tasks/statistics.rake'
|
|
14
15
|
|
|
15
|
-
|
|
16
|
+
begin
|
|
17
|
+
require 'rubocop/rake_task'
|
|
18
|
+
RuboCop::RakeTask.new(:rubocop) do |task|
|
|
19
|
+
task.requires << 'rubocop-rspec'
|
|
20
|
+
task.requires << 'rubocop-performance'
|
|
21
|
+
task.requires << 'rubocop-rails'
|
|
22
|
+
task.fail_on_error = true
|
|
23
|
+
end
|
|
24
|
+
rescue LoadError
|
|
25
|
+
task rubocop: :environment do
|
|
26
|
+
warn 'Rubocop is disabled'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
require 'solr_wrapper'
|
|
31
|
+
require 'solr_wrapper/rake_task'
|
|
32
|
+
|
|
33
|
+
require 'rspec/core/rake_task'
|
|
34
|
+
RSpec::Core::RakeTask.new
|
|
35
|
+
|
|
36
|
+
desc 'Lint, spin up Solr, index test docs, run test suite'
|
|
37
|
+
task ci: [:environment, :rubocop] do
|
|
38
|
+
SolrWrapper.wrap(port: 8984, version: '8.11.2', persist: false) do |solr|
|
|
39
|
+
solr.with_collection(name: 'blacklight-core', dir: 'spec/dummy/solr/conf/') do
|
|
40
|
+
system 'RAILS_ENV=test rake app:bpluser:test_index:seed'
|
|
41
|
+
Rake::Task['spec'].invoke
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
task default: [:ci]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= link bpluser/folder_tools.js
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// item actions for folders and bookmarks
|
|
2
|
+
|
|
3
|
+
$(document).ready ( function () {
|
|
4
|
+
// remove duplicate buttons from form
|
|
5
|
+
$('#cite_btn,#email_btn').remove();
|
|
6
|
+
// add click event for any checkbox in doc list
|
|
7
|
+
$(':checkbox[name="selected[]"]').click( function () {
|
|
8
|
+
addCheckedToURL();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
// select/unselect all
|
|
12
|
+
$('#selectAllItems').click( function () {
|
|
13
|
+
$(':checkbox[name="selected[]"]').prop('checked', this.checked);
|
|
14
|
+
addCheckedToURL();
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
// when any checkbox is selected, append the ids of all checked items to url
|
|
20
|
+
function addCheckedToURL () {
|
|
21
|
+
var checkboxValues = $('[name="selected[]"]:checked').serialize();
|
|
22
|
+
checkboxValues = checkboxValues.replace(/selected/g,"id");
|
|
23
|
+
$('#citeLink,#emailLink,#copyLink').attr('href', function(index,previousValue) {
|
|
24
|
+
return previousValue.replace(/\?.*/,"?" + checkboxValues);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class BookmarksController < CatalogController
|
|
4
|
+
include Blacklight::Bookmarks
|
|
5
|
+
|
|
6
|
+
# LOCAL OVERRIDE to render update.js.erb partial when bookmark created
|
|
7
|
+
def create
|
|
8
|
+
@bookmarks = params[:bookmarks].present? ? bookmark_params : default_bookmark_params
|
|
9
|
+
|
|
10
|
+
current_or_guest_user.save! unless current_or_guest_user.persisted?
|
|
11
|
+
|
|
12
|
+
success = @bookmarks.all? do |bookmark|
|
|
13
|
+
next true if current_or_guest_user.bookmarks.exists?(bookmark)
|
|
14
|
+
|
|
15
|
+
begin
|
|
16
|
+
current_or_guest_user.bookmarks.create!(bookmark)
|
|
17
|
+
next true
|
|
18
|
+
rescue ActiveRecord::RecordInvalid
|
|
19
|
+
break false
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
if request.xhr?
|
|
24
|
+
# success ? render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count }}) : render(:text => "", :status => "500")
|
|
25
|
+
success ? render(:update) : render(plain: '', status: '500')
|
|
26
|
+
else
|
|
27
|
+
if @bookmarks.any? && success
|
|
28
|
+
flash[:notice] = I18n.t('blacklight.bookmarks.add.success', count: @bookmarks.count)
|
|
29
|
+
elsif @bookmarks.any?
|
|
30
|
+
flash[:error] = I18n.t('blacklight.bookmarks.add.failure', count: @bookmarks.count)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
redirect_back fallback_location: bookmarks_path
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def folder_item_actions
|
|
38
|
+
redirect_to action: 'index'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def default_bookmark_params
|
|
44
|
+
[{ document_id: params[:id], document_type: blacklight_config.document_model.to_s }]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def bookmark_params
|
|
48
|
+
params.require(:bookmarks).map { |item_params| item_params.permit(:document_id, :document_type) }
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bpluser
|
|
4
|
+
module FoldersVerifyUser
|
|
5
|
+
# Concern that adds verify_user method for folder related controller endopints t('blacklight.folders.need_login')
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
include InstanceMethods
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module InstanceMethods
|
|
13
|
+
protected
|
|
14
|
+
|
|
15
|
+
def verify_user
|
|
16
|
+
flash[:notice] = t('blacklight.folders.need_login') and raise Blacklight::Exceptions::AccessDenied unless current_user
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bpluser
|
|
4
|
+
module OmniauthCallbacks
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
include InstanceMethods
|
|
9
|
+
|
|
10
|
+
skip_before_action :verify_authenticity_token, only: :polaris
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module InstanceMethods
|
|
14
|
+
def polaris
|
|
15
|
+
@user = User.find_for_polaris_oauth(request.env['omniauth.auth'])
|
|
16
|
+
|
|
17
|
+
if @user.persisted?
|
|
18
|
+
sign_in_and_redirect @user, event: :authentication
|
|
19
|
+
set_flash_message(:notice, :success, kind: 'Polaris') if is_navigational_format?
|
|
20
|
+
else
|
|
21
|
+
session['devise.polaris_data'] = request.env['omniauth.auth'].except(:extra)
|
|
22
|
+
redirect_to new_user_registration_url
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bpluser
|
|
4
|
+
module Registrations
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
include InstanceMethods
|
|
9
|
+
before_action :configure_permitted_parameters, only: [:create, :update], if: :devise_controller?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module InstanceMethods
|
|
13
|
+
# POST /resource
|
|
14
|
+
def create
|
|
15
|
+
if User.exists?(email: sign_up_params[:email])
|
|
16
|
+
flash[:error] = "An account with that email (#{sign_up_params[:email]}) already exists. Please sign in or click the \"Forgot your password?\" link below."
|
|
17
|
+
redirect_to new_user_session_path and return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
protected
|
|
24
|
+
|
|
25
|
+
def configure_permitted_parameters
|
|
26
|
+
case params[:action]
|
|
27
|
+
when 'create'
|
|
28
|
+
devise_parameter_sanitizer.permit(:sign_up, keys: %i[first_name last_name])
|
|
29
|
+
when 'update'
|
|
30
|
+
devise_parameter_sanitizer.permit(:account_update, keys: %i[first_name last_name])
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# copied from Blacklight 6.19.2 -- this feature is no longer provided by Blacklight >= 7
|
|
4
|
+
module Bpluser
|
|
5
|
+
module SavedSearches
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
|
|
8
|
+
included do
|
|
9
|
+
include Blacklight::Configurable
|
|
10
|
+
copy_blacklight_config_from(CatalogController)
|
|
11
|
+
# before_action :require_user_authentication_provider This is deprecated
|
|
12
|
+
before_action :verify_user
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def index
|
|
16
|
+
@searches = current_user.searches
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def save
|
|
20
|
+
current_user.searches << searches_from_history.find(params[:id])
|
|
21
|
+
|
|
22
|
+
if current_user.save
|
|
23
|
+
flash[:notice] = t('blacklight.saved_searches.add.success')
|
|
24
|
+
else
|
|
25
|
+
flash[:error] = t('blacklight.saved_searches.add.failure')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
redirect_back fallback_location: saved_searches_path
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Only dereferences the user rather than removing the item in case it
|
|
32
|
+
# is in the session[:history]
|
|
33
|
+
def forget
|
|
34
|
+
search = current_user.searches.find(params[:id])
|
|
35
|
+
|
|
36
|
+
if search.update(user_id: nil)
|
|
37
|
+
flash[:notice] = t('blacklight.saved_searches.remove.success')
|
|
38
|
+
else
|
|
39
|
+
flash[:error] = t('blacklight.saved_searches.remove.failure')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
redirect_back fallback_location: saved_searches_path
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Only dereferences the user rather than removing the items in case they
|
|
46
|
+
# are in the session[:history]
|
|
47
|
+
def clear
|
|
48
|
+
if current_user.searches.all? { |s| s.update(user_id: nil) } && current_user.save
|
|
49
|
+
flash[:notice] = t('blacklight.saved_searches.clear.success')
|
|
50
|
+
else
|
|
51
|
+
flash[:error] = t('blacklight.saved_searches.clear.failure')
|
|
52
|
+
end
|
|
53
|
+
redirect_to saved_searches_url
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
protected
|
|
57
|
+
|
|
58
|
+
def verify_user
|
|
59
|
+
flash[:notice] = t('blacklight.saved_searches.need_login') and raise Blacklight::Exceptions::AccessDenied unless current_user
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# use to share folder item actions (email, cite, delete) between folders and bookmarks
|
|
4
|
+
class FolderItemsActionsController < ApplicationController
|
|
5
|
+
def folder_item_actions
|
|
6
|
+
@folder = Bpluser::Folder.find(params[:id]) if params[:origin] == 'folders'
|
|
7
|
+
@user = current_or_guest_user
|
|
8
|
+
|
|
9
|
+
unless params[:selected]
|
|
10
|
+
flash[:error] = t('blacklight.folders.update_items.remove.no_items')
|
|
11
|
+
redirect_back(fallback_location: root_path)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
items = params[:selected]
|
|
15
|
+
case params[:commit]
|
|
16
|
+
# email
|
|
17
|
+
when t('blacklight.tools.email')
|
|
18
|
+
redirect_to email_solr_document_path(id: items)
|
|
19
|
+
# cite
|
|
20
|
+
when t('blacklight.tools.citation')
|
|
21
|
+
redirect_to citation_solr_document_path(id: items)
|
|
22
|
+
# remove
|
|
23
|
+
when t('blacklight.tools.remove')
|
|
24
|
+
if params[:origin] == 'folders'
|
|
25
|
+
if @folder.folder_items.destroy_by(document_id: items)
|
|
26
|
+
flash[:notice] = t('blacklight.folders.update_items.remove.success')
|
|
27
|
+
else
|
|
28
|
+
flash[:error] = t('blacklight.folders.update_items.remove.failure')
|
|
29
|
+
end
|
|
30
|
+
redirect_to folder_path(@folder, view_params)
|
|
31
|
+
else
|
|
32
|
+
if current_or_guest_user.bookmarks.destroy_by(document_id: items)
|
|
33
|
+
flash[:notice] = t('blacklight.folders.update_items.remove.success')
|
|
34
|
+
else
|
|
35
|
+
flash[:error] = t('blacklight.folders.update_items.remove.failure')
|
|
36
|
+
end
|
|
37
|
+
redirect_to bookmarks_path(view_params)
|
|
38
|
+
end
|
|
39
|
+
# copy
|
|
40
|
+
when /#{t('blacklight.tools.copy_to')}/
|
|
41
|
+
destination = params[:commit].split("#{t('blacklight.tools.copy_to')} ")[1]
|
|
42
|
+
if destination == t('blacklight.bookmarks.title')
|
|
43
|
+
success = items.all? do |item_id|
|
|
44
|
+
next true if current_or_guest_user.bookmarks.exists?(document_id: item_id)
|
|
45
|
+
|
|
46
|
+
current_or_guest_user.bookmarks.create(document_id: item_id)
|
|
47
|
+
end
|
|
48
|
+
else
|
|
49
|
+
folder_to_update = current_user.folders.find(destination)
|
|
50
|
+
success = items.all? do |item_id|
|
|
51
|
+
next true if folder_to_update.folder_item?(item_id)
|
|
52
|
+
|
|
53
|
+
begin
|
|
54
|
+
folder_to_update.folder_items.create!(document_id: item_id)
|
|
55
|
+
next true
|
|
56
|
+
rescue ActiveRecord::RecordInvalid
|
|
57
|
+
break false
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
if success
|
|
63
|
+
folder_display_name = destination == t('blacklight.bookmarks.title') ? t('blacklight.bookmarks.title') : folder_to_update.title
|
|
64
|
+
flash[:notice] = t('blacklight.folders.update_items.copy.success', folder_name: folder_display_name)
|
|
65
|
+
else
|
|
66
|
+
flash[:error] = t('blacklight.folders.update_items.copy.failure')
|
|
67
|
+
end
|
|
68
|
+
redirect_back(fallback_location: root_path)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def view_params
|
|
75
|
+
params.permit(:sort, :per_page, :view)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class FolderItemsController < CatalogController
|
|
4
|
+
include Bpluser::FoldersVerifyUser
|
|
5
|
+
|
|
6
|
+
before_action :verify_user
|
|
7
|
+
|
|
8
|
+
def create
|
|
9
|
+
@response, @document = search_service.fetch(params[:id])
|
|
10
|
+
|
|
11
|
+
@folder_items = params[:folder_items].present? ? folder_items_params : default_folder_item_params
|
|
12
|
+
|
|
13
|
+
success = @folder_items.all? do |f_item|
|
|
14
|
+
folder_to_update = current_user.folders.find(f_item[:folder_id])
|
|
15
|
+
|
|
16
|
+
next true if folder_to_update.folder_item?(f_item[:document_id])
|
|
17
|
+
|
|
18
|
+
begin
|
|
19
|
+
folder_to_update.folder_items.create!(document_id: f_item[:document_id])
|
|
20
|
+
next true
|
|
21
|
+
rescue ActiveRecord::RecordInvalid
|
|
22
|
+
break false
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
unless request.xhr?
|
|
27
|
+
if success
|
|
28
|
+
flash[:notice] = t('blacklight.folder_items.add.success')
|
|
29
|
+
else
|
|
30
|
+
flash[:error] = t('blacklight.folder_items.add.failure')
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
respond_to do |format|
|
|
35
|
+
format.html { redirect_back(fallback_location: root_path) }
|
|
36
|
+
format.js
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def update
|
|
41
|
+
create
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Beware, :id is the Solr document_id, not the actual Bookmark id.
|
|
45
|
+
# idempotent, as DELETE is supposed to be.
|
|
46
|
+
# PRETTY SURE THIS METHOD IS NEVER USED!
|
|
47
|
+
def destroy
|
|
48
|
+
@response, @document = search_service.fetch(params[:id])
|
|
49
|
+
folder_item = current_user.existing_folder_item_for(params[:id])
|
|
50
|
+
|
|
51
|
+
Bpluser::FolderItem.find(folder_item.id).destroy
|
|
52
|
+
|
|
53
|
+
respond_to do |format|
|
|
54
|
+
format.html { redirect_back(fallback_location: root_path) }
|
|
55
|
+
format.js
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def clear
|
|
60
|
+
@folder = current_user.folders.find(params[:id])
|
|
61
|
+
|
|
62
|
+
if @folder.folder_items.clear && @folder.save
|
|
63
|
+
flash[:notice] = t('blacklight.folder_items.clear.success')
|
|
64
|
+
else
|
|
65
|
+
flash[:error] = t('blacklight.folder_items.clear.failure')
|
|
66
|
+
end
|
|
67
|
+
redirect_to folders_path(@folder)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# PRETTY SURE THIS METHOD IS NEVER USED!
|
|
71
|
+
def delete_selected
|
|
72
|
+
@folder = Bpluser::Folder.find(params[:id])
|
|
73
|
+
|
|
74
|
+
if params[:selected]
|
|
75
|
+
if @folder.folder_items.destroy_by(document_id: params[:selected])
|
|
76
|
+
flash[:notice] = t('blacklight.folders.update_items.remove.success')
|
|
77
|
+
else
|
|
78
|
+
flash[:error] = t('blacklight.folders.update_items.remove.failure')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
redirect_to folders_path(@folder)
|
|
82
|
+
else
|
|
83
|
+
flash[:error] = t('blacklight.folders.update_items.remove.no_items')
|
|
84
|
+
redirect_back(fallback_location: root_path)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
protected
|
|
89
|
+
|
|
90
|
+
def default_folder_item_params
|
|
91
|
+
[{ document_id: params[:id], folder_id: params[:folder_id] }]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def folder_items_params
|
|
95
|
+
params.require(:folder_items).map { |fi_params| fi_params.permit(:document_id, :folder_id) }
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class FoldersController < CatalogController
|
|
4
|
+
##
|
|
5
|
+
# Give Bookmarks access to the CatalogController configuration
|
|
6
|
+
include Blacklight::Configurable
|
|
7
|
+
include Blacklight::TokenBasedUser
|
|
8
|
+
include Bpluser::FoldersVerifyUser
|
|
9
|
+
|
|
10
|
+
copy_blacklight_config_from(CatalogController)
|
|
11
|
+
|
|
12
|
+
# Blacklight uses #search_action_url to figure out the right URL for
|
|
13
|
+
# the global search box
|
|
14
|
+
def search_action_url(options = {})
|
|
15
|
+
search_catalog_url(options.except(:controller, :action))
|
|
16
|
+
end
|
|
17
|
+
helper_method :search_action_url
|
|
18
|
+
|
|
19
|
+
before_action :verify_user, except: [:index, :show, :public_list]
|
|
20
|
+
before_action :check_visibility, only: [:show]
|
|
21
|
+
before_action :correct_user_for_folder, only: [:update, :edit, :destroy]
|
|
22
|
+
|
|
23
|
+
blacklight_config.track_search_session = false
|
|
24
|
+
blacklight_config.http_method = Blacklight::Engine.config.bookmarks_http_method
|
|
25
|
+
|
|
26
|
+
def index
|
|
27
|
+
@folders = current_or_guest_user.folders.with_folder_items if current_or_guest_user
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def show
|
|
31
|
+
# @folder is set by correct_user_for_folder
|
|
32
|
+
@folder_items = @folder.folder_items
|
|
33
|
+
folder_items_ids = @folder_items.pluck(:document_id)
|
|
34
|
+
params[:sort] ||= 'title_info_primary_ssort asc, date_start_dtsi asc'
|
|
35
|
+
@response, @document_list = search_service.fetch(folder_items_ids)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def new
|
|
39
|
+
@folder = current_user.folders.build
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def edit; end
|
|
43
|
+
|
|
44
|
+
def create
|
|
45
|
+
@folder = current_user.folders.new(folder_params)
|
|
46
|
+
|
|
47
|
+
if @folder.save
|
|
48
|
+
flash[:notice] = t('blacklight.folders.create.success')
|
|
49
|
+
redirect_to action: 'index'
|
|
50
|
+
else
|
|
51
|
+
render action: 'new'
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def update
|
|
56
|
+
# @folder is set by correct_user_for_folder
|
|
57
|
+
if @folder.update(folder_params)
|
|
58
|
+
flash[:notice] = t('blacklight.folders.update.success')
|
|
59
|
+
redirect_to @folder
|
|
60
|
+
else
|
|
61
|
+
render action: :edit
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def destroy
|
|
66
|
+
# @folder is set by correct_user_for_folder
|
|
67
|
+
@folder.destroy
|
|
68
|
+
flash[:notice] = t('blacklight.folders.delete.success')
|
|
69
|
+
redirect_to action: 'index'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# return a list of publicly visible folders that have items
|
|
73
|
+
def public_list
|
|
74
|
+
@folders = Bpluser::Folder.public_list
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def folder_params
|
|
80
|
+
params.require(:folder).permit(:title, :description, :visibility)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def check_visibility
|
|
84
|
+
@folder = Bpluser::Folder.with_folder_items.find(params[:id])
|
|
85
|
+
|
|
86
|
+
return if @folder&.public?
|
|
87
|
+
|
|
88
|
+
correct_user_for_folder
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def correct_user_for_folder
|
|
92
|
+
@folder ||= Bpluser::Folder.with_folder_items.find(params[:id])
|
|
93
|
+
|
|
94
|
+
if current_or_guest_user
|
|
95
|
+
flash[:notice] = t('blacklight.folders.private') and redirect_to root_path unless current_or_guest_user.folders.include?(@folder)
|
|
96
|
+
else
|
|
97
|
+
flash[:notice] = t('blacklight.folders.private') and redirect_to root_path
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class UsersController < ApplicationController
|
|
4
|
+
before_action :authenticate_user!, :correct_user, only: [:show]
|
|
5
|
+
|
|
6
|
+
# getting some weird intermittent errors where users are being redirected
|
|
7
|
+
# to '/users' after signup. this is a failsafe last-resort solution
|
|
8
|
+
def index
|
|
9
|
+
redirect_to root_path
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def show
|
|
13
|
+
respond_to do |format|
|
|
14
|
+
format.html
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def correct_user
|
|
21
|
+
@user = User.find(params[:id])
|
|
22
|
+
|
|
23
|
+
redirect_to root_path unless current_user == @user
|
|
24
|
+
end
|
|
25
|
+
end
|