bpluser 0.1.18 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +131 -163
- 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
|
+
[![Build Status](https://travis-ci.com/boston-library/bpluser.svg?branch=master)](https://travis-ci.com/boston-library/bpluser) [![Coverage Status](https://coveralls.io/repos/github/boston-library/bpluser/badge.svg?branch=master)](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
|