hyrax 2.3.3 → 2.4.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 +4 -4
- data/.circleci/config.yml +1 -1
- data/.github/stale.yml +19 -0
- data/README.md +2 -2
- data/app/actors/hyrax/actors/apply_permission_template_actor.rb +2 -4
- data/app/actors/hyrax/actors/create_with_files_ordered_members_actor.rb +45 -0
- data/app/actors/hyrax/actors/create_with_remote_files_ordered_members_actor.rb +96 -0
- data/app/actors/hyrax/actors/file_set_ordered_members_actor.rb +16 -0
- data/app/actors/hyrax/actors/ordered_members_actor.rb +28 -0
- data/app/assets/javascripts/hyrax/collections.js +2 -0
- data/app/assets/stylesheets/hyrax/_file-listing.scss +2 -1
- data/app/assets/stylesheets/hyrax/_work-show.scss +4 -0
- data/app/controllers/concerns/hyrax/embargoes_controller_behavior.rb +1 -1
- data/app/controllers/concerns/hyrax/works_controller_behavior.rb +5 -2
- data/app/controllers/hyrax/dashboard/nest_collections_controller.rb +2 -9
- data/app/helpers/hyrax/batch_edits_helper.rb +0 -1
- data/app/helpers/hyrax/hyrax_helper_behavior.rb +1 -0
- data/app/helpers/hyrax/iiif_helper.rb +12 -0
- data/app/jobs/attach_files_to_work_with_ordered_members_job.rb +41 -0
- data/app/presenters/hyrax/work_show_presenter.rb +29 -2
- data/app/services/hyrax/permission_template_applicator.rb +48 -0
- data/app/views/hyrax/admin/collection_types/_form_settings.html.erb +1 -1
- data/app/views/hyrax/admin/collection_types/index.html.erb +1 -1
- data/app/views/hyrax/base/_form_rendering.html.erb +7 -5
- data/app/views/hyrax/base/_form_representative.html.erb +4 -2
- data/app/views/hyrax/base/_form_thumbnail.html.erb +4 -2
- data/app/views/hyrax/base/_member.html.erb +1 -1
- data/app/views/hyrax/base/_representative_media.html.erb +1 -4
- data/app/views/hyrax/base/_show_actions.html.erb +6 -4
- data/app/views/hyrax/base/iiif_viewers/_universal_viewer.html.erb +4 -0
- data/app/views/hyrax/base/show.html.erb +2 -2
- data/app/views/hyrax/dashboard/works/_default_group.html.erb +1 -1
- data/app/views/hyrax/file_sets/_file_set_title.erb +2 -2
- data/app/views/hyrax/homepage/_featured.html.erb +0 -3
- data/app/views/hyrax/my/_collection_action_menu.html.erb +1 -0
- data/app/views/hyrax/my/collections/_default_group.html.erb +1 -9
- data/app/views/hyrax/my/collections/_list_collections.html.erb +1 -1
- data/app/views/hyrax/users/_activity_log.html.erb +1 -1
- data/config/locales/hyrax.de.yml +2 -0
- data/config/locales/hyrax.en.yml +2 -0
- data/config/locales/hyrax.es.yml +2 -0
- data/config/locales/hyrax.fr.yml +2 -0
- data/config/locales/hyrax.it.yml +2 -0
- data/config/locales/hyrax.pt-BR.yml +2 -0
- data/config/locales/hyrax.zh.yml +2 -0
- data/hyrax.gemspec +1 -0
- data/lib/generators/hyrax/templates/config/initializers/hyrax.rb +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.de.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.en.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.es.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.fr.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.it.yml +1 -1
- data/lib/generators/hyrax/templates/config/locales/hyrax.zh.yml +1 -1
- data/lib/hyrax/configuration.rb +1 -1
- data/lib/hyrax/transactions.rb +23 -0
- data/lib/hyrax/transactions/container.rb +63 -0
- data/lib/hyrax/transactions/create_work.rb +47 -0
- data/lib/hyrax/transactions/steps/apply_permission_template.rb +29 -0
- data/lib/hyrax/transactions/steps/ensure_admin_set.rb +23 -0
- data/lib/hyrax/transactions/steps/ensure_permission_template.rb +27 -0
- data/lib/hyrax/transactions/steps/save_work.rb +35 -0
- data/lib/hyrax/transactions/steps/set_default_admin_set.rb +25 -0
- data/lib/hyrax/transactions/steps/set_modified_date.rb +25 -0
- data/lib/hyrax/transactions/steps/set_uploaded_date.rb +28 -0
- data/lib/hyrax/version.rb +1 -1
- data/spec/actors/hyrax/actors/create_with_files_ordered_members_actor_spec.rb +41 -0
- data/spec/actors/hyrax/actors/create_with_remote_files_ordered_members_actor_spec.rb +49 -0
- data/spec/actors/hyrax/actors/file_set_ordered_members_actor_spec.rb +35 -0
- data/spec/actors/hyrax/actors/ordered_members_actor_spec.rb +59 -0
- data/spec/controllers/hyrax/embargoes_controller_spec.rb +2 -0
- data/spec/controllers/hyrax/generic_works_controller_spec.rb +6 -1
- data/spec/factories/generic_works.rb +6 -0
- data/spec/features/collection_multi_membership_spec.rb +6 -6
- data/spec/features/work_show_spec.rb +58 -5
- data/spec/helpers/hyrax/batch_edits_helper_spec.rb +4 -2
- data/spec/helpers/hyrax/iiif_helper_spec.rb +44 -0
- data/spec/hyrax/transactions/create_work_spec.rb +155 -0
- data/spec/hyrax/transactions/steps/apply_permission_template_spec.rb +72 -0
- data/spec/hyrax/transactions/steps/ensure_admin_set_spec.rb +25 -0
- data/spec/hyrax/transactions/steps/ensure_permission_template_spec.rb +33 -0
- data/spec/hyrax/transactions/steps/save_work_spec.rb +32 -0
- data/spec/hyrax/transactions/steps/set_default_admin_set_spec.rb +38 -0
- data/spec/hyrax/transactions/steps/set_modified_date_spec.rb +22 -0
- data/spec/hyrax/transactions/steps/set_uploaded_date_spec.rb +32 -0
- data/spec/jobs/attach_files_to_work_with_ordered_members_job_spec.rb +13 -0
- data/spec/presenters/hyrax/presenter_renderer_spec.rb +4 -2
- data/spec/presenters/hyrax/work_show_presenter_spec.rb +46 -2
- data/spec/services/hyrax/permission_template_applicator_spec.rb +69 -0
- data/spec/spec_helper.rb +13 -2
- data/spec/views/catalog/index.html.erb_spec.rb +7 -4
- data/spec/views/hyrax/admin/admin_sets/_show_actions.html.erb_spec.rb +2 -0
- data/spec/views/hyrax/admin/admin_sets/_show_document_list_row.html.erb_spec.rb +4 -1
- data/spec/views/hyrax/admin/admin_sets/index.html.erb_spec.rb +6 -2
- data/spec/views/hyrax/admin/admin_sets/index.json.erb_spec.rb +1 -2
- data/spec/views/hyrax/admin/collection_types/_form_metadata_admin_set.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/admin/collection_types/_form_settings.html.erb_spec.rb +5 -26
- data/spec/views/hyrax/admin/collection_types/index.html.erb_spec.rb +26 -5
- data/spec/views/hyrax/admin/stats/show.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/base/_attribute_rows.html.erb_spec.rb +5 -1
- data/spec/views/hyrax/base/_attributes.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/base/_form_rendering.html.erb_spec.rb +5 -1
- data/spec/views/hyrax/base/_items.html.erb_spec.rb +2 -0
- data/spec/views/hyrax/base/_relationships.html.erb_spec.rb +2 -1
- data/spec/views/hyrax/base/_show_actions.html.erb_spec.rb +71 -0
- data/spec/views/hyrax/base/file_manager.html.erb_spec.rb +11 -14
- data/spec/views/hyrax/base/show.html.erb_spec.rb +2 -2
- data/spec/views/hyrax/base/show.json.jbuilder_spec.rb +3 -1
- data/spec/views/hyrax/collections/_show_document_list_row.html.erb_spec.rb +6 -1
- data/spec/views/hyrax/collections/_show_parent_collections.html.erb_spec.rb +5 -5
- data/spec/views/hyrax/collections/_subcollection_list.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/collections/show.html.erb_spec.rb +3 -2
- data/spec/views/hyrax/dashboard/collections/_form_share.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/_form_share_table.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/_show_document_list_row.html.erb_spec.rb +6 -1
- data/spec/views/hyrax/dashboard/collections/_subcollection_list.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/dashboard/collections/edit.html.erb_spec.rb +3 -1
- data/spec/views/hyrax/dashboard/profiles/show.html.erb_spec.rb +2 -3
- data/spec/views/hyrax/file_sets/_show_characterization_details.html.erb_spec.rb +1 -2
- data/spec/views/hyrax/file_sets/_single_use_links.html.erb_spec.rb +1 -2
- data/spec/views/hyrax/homepage/_sortable_featured.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/my/_collection_action_menu.html.erb_spec.rb +5 -5
- data/spec/views/hyrax/my/collections/_list_collections.html.erb_spec.rb +11 -8
- data/spec/views/hyrax/users/index.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/users/show.html.erb_spec.rb +3 -0
- data/template.rb +1 -1
- metadata +65 -3
- data/app/views/hyrax/dashboard/collections/_form_default_group_delt.html.erb +0 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d34c51d077dddcd6a5932d22a633104906b17e30
|
|
4
|
+
data.tar.gz: f61e880d0705b2863c0edf50e0066b8cf4df41c3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bcda312829b2581af6d701b0a57cc11e99d26e12c4405fc5f8ecb814328cdc94a5ed74cb5deb0583b995b8ffd64127f806c4b7fb64a37372610ddf2d0e477d44
|
|
7
|
+
data.tar.gz: 70e85336f1286e3749f22f8cd4ee8d3607a4f06bc9dda48429cf37f53041b7d9012ddb1628bc97ae1de8d17622019e6f20d37f66bd920adb272fe1996a96954c
|
data/.circleci/config.yml
CHANGED
|
@@ -12,7 +12,7 @@ jobs:
|
|
|
12
12
|
- image: ualbertalib/docker-fcrepo4:4.7
|
|
13
13
|
environment:
|
|
14
14
|
CATALINA_OPTS: "-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
|
|
15
|
-
- image: solr:7
|
|
15
|
+
- image: solr:7-alpine
|
|
16
16
|
command: bin/solr -cloud -noprompt -f -p 8985
|
|
17
17
|
|
|
18
18
|
# Specify service dependencies here if necessary
|
data/.github/stale.yml
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Number of days of inactivity before an issue becomes stale
|
|
2
|
+
daysUntilStale: 30
|
|
3
|
+
# Number of days of inactivity before a stale issue is closed
|
|
4
|
+
daysUntilClose: 14
|
|
5
|
+
# Issues with these labels will never be considered stale
|
|
6
|
+
exemptLabels:
|
|
7
|
+
- pinned
|
|
8
|
+
- security
|
|
9
|
+
# Label to use when marking an issue as stale
|
|
10
|
+
staleLabel: stale
|
|
11
|
+
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
12
|
+
markComment: >
|
|
13
|
+
This issue has been automatically marked as stale because it has not had
|
|
14
|
+
activity for 30 days. It will be closed if no further activity occurs within 14 days. Thank you
|
|
15
|
+
for your contributions.
|
|
16
|
+
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
17
|
+
closeComment: false
|
|
18
|
+
# Limit to only `issues` or `pulls`
|
|
19
|
+
only: pulls
|
data/README.md
CHANGED
|
@@ -64,7 +64,7 @@ The Samvera community is here to help. Please see our [support guide](./.github/
|
|
|
64
64
|
# Getting started
|
|
65
65
|
|
|
66
66
|
This document contains instructions specific to setting up an app with __Hyrax
|
|
67
|
-
v2.
|
|
67
|
+
v2.4.0__. If you are looking for instructions on installing a different
|
|
68
68
|
version, be sure to select the appropriate branch or tag from the drop-down
|
|
69
69
|
menu above.
|
|
70
70
|
|
|
@@ -163,7 +163,7 @@ NOTE: The steps need to be done in order to create a new Hyrax based app.
|
|
|
163
163
|
Generate a new Rails application using the template.
|
|
164
164
|
|
|
165
165
|
```
|
|
166
|
-
rails _5.1.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.
|
|
166
|
+
rails _5.1.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.4.0/template.rb
|
|
167
167
|
```
|
|
168
168
|
|
|
169
169
|
Generating a new Rails application using Hyrax's template above takes cares of a number of steps for you, including:
|
|
@@ -31,10 +31,8 @@ module Hyrax
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def set_curation_concern_access(env, template)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
env.curation_concern.read_users += template.agent_ids_for(agent_type: 'user', access: 'view')
|
|
37
|
-
env.curation_concern.read_groups += template.agent_ids_for(agent_type: 'group', access: 'view')
|
|
34
|
+
PermissionTemplateApplicator
|
|
35
|
+
.apply(template).to(model: env.curation_concern)
|
|
38
36
|
end
|
|
39
37
|
end
|
|
40
38
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Hyrax
|
|
2
|
+
module Actors
|
|
3
|
+
# When adding member FileSets to a Work, Hyrax saves
|
|
4
|
+
# and reloads the work for each new member FileSet.
|
|
5
|
+
# This can significantly slow down ingest for Works
|
|
6
|
+
# with many member FileSets. The saving and reloading
|
|
7
|
+
# happens in FileSetActor#attach_to_work.
|
|
8
|
+
#
|
|
9
|
+
# This is a 'swappable' alternative approach. It will
|
|
10
|
+
# be of most value to Hyrax applications dealing with
|
|
11
|
+
# works with many filesets. Anecdotally, a work with
|
|
12
|
+
# 600 filesets can be processed in ~15 mins versus
|
|
13
|
+
# > 3 hours with the standard approach.
|
|
14
|
+
#
|
|
15
|
+
# The tradeoff is that the ordered members are now added in a
|
|
16
|
+
# single step after the creation of all the FileSets, thus
|
|
17
|
+
# introducing a slight risk of orphan filesets if the upload
|
|
18
|
+
# fails before the addition of the ordered members. This
|
|
19
|
+
# has not been observed in practice.
|
|
20
|
+
#
|
|
21
|
+
# Swapping out the actors can be achieved thus:
|
|
22
|
+
#
|
|
23
|
+
# In `config/initializers/hyrax.rb`:
|
|
24
|
+
# ```
|
|
25
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
|
26
|
+
# Hyrax::Actors::CreateWithFilesOrderedMembersActor)
|
|
27
|
+
# ```
|
|
28
|
+
# Alternatively, in `config/application.rb`:
|
|
29
|
+
# ```
|
|
30
|
+
# config.to_prepare
|
|
31
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
|
32
|
+
# Hyrax::Actors::CreateWithFilesOrderedMembersActor)
|
|
33
|
+
# end
|
|
34
|
+
# ```
|
|
35
|
+
# Creates a work and attaches files to the work
|
|
36
|
+
class CreateWithFilesOrderedMembersActor < CreateWithFilesActor
|
|
37
|
+
# @return [TrueClass]
|
|
38
|
+
def attach_files(files, env)
|
|
39
|
+
return true if files.blank?
|
|
40
|
+
AttachFilesToWorkWithOrderedMembersJob.perform_later(env.curation_concern, files, env.attributes.to_h.symbolize_keys)
|
|
41
|
+
true
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module Hyrax
|
|
2
|
+
module Actors
|
|
3
|
+
# When adding member FileSets to a Work, Hyrax saves
|
|
4
|
+
# and reloads the work for each new member FileSet.
|
|
5
|
+
# This can significantly slow down ingest for Works
|
|
6
|
+
# with many member FileSets. The saving and reloading
|
|
7
|
+
# happens in FileSetActor#attach_to_work.
|
|
8
|
+
#
|
|
9
|
+
# This is a 'swappable' alternative approach. It will
|
|
10
|
+
# be of most value to Hyrax applications dealing with
|
|
11
|
+
# works with many filesets. Anecdotally, a 600 fileset
|
|
12
|
+
# can be processed in ~15 mins versus >3 hours
|
|
13
|
+
# with the standard approach.
|
|
14
|
+
#
|
|
15
|
+
# The tradeoff is that the ordered members are now added in a
|
|
16
|
+
# single step after the creation of all the FileSets, thus
|
|
17
|
+
# introducing a slight risk of orphan filesets if the upload
|
|
18
|
+
# fails before the addition of the ordered members. This
|
|
19
|
+
# has not been observed in practice.
|
|
20
|
+
#
|
|
21
|
+
# Swapping out the actors can be achieved thus:
|
|
22
|
+
#
|
|
23
|
+
# In `config/initializers/hyrax.rb`:
|
|
24
|
+
# ```
|
|
25
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
|
26
|
+
# Hyrax::Actors::CreateWithRemoteFilesOrderedMembersActor)
|
|
27
|
+
# ```
|
|
28
|
+
# Alternatively, in `config/application.rb`:
|
|
29
|
+
# ```
|
|
30
|
+
# config.to_prepare
|
|
31
|
+
# Hyrax::CurationConcern.actor_factory.swap(Hyrax::Actors::CreateWithFilesActor,
|
|
32
|
+
# Hyrax::Actors::CreateWithRemoteFilesOrderedMembersActor)
|
|
33
|
+
# end
|
|
34
|
+
# ```
|
|
35
|
+
#
|
|
36
|
+
# If there is a key `:remote_files' in the attributes, it attaches the files at the specified URIs
|
|
37
|
+
# to the work. e.g.:
|
|
38
|
+
# attributes[:remote_files] = filenames.map do |name|
|
|
39
|
+
# { url: "https://example.com/file/#{name}", file_name: name }
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
# Browse everything may also return a local file. And although it's in the
|
|
43
|
+
# url property, it may have spaces, and not be a valid URI.
|
|
44
|
+
class CreateWithRemoteFilesOrderedMembersActor < CreateWithRemoteFilesActor
|
|
45
|
+
attr_reader :ordered_members
|
|
46
|
+
|
|
47
|
+
# @param [HashWithIndifferentAccess] remote_files
|
|
48
|
+
# @return [TrueClass]
|
|
49
|
+
def attach_files(env, remote_files)
|
|
50
|
+
return true unless remote_files
|
|
51
|
+
@ordered_members = env.curation_concern.ordered_members.to_a
|
|
52
|
+
remote_files.each do |file_info|
|
|
53
|
+
next if file_info.blank? || file_info[:url].blank?
|
|
54
|
+
# Escape any space characters, so that this is a legal URI
|
|
55
|
+
uri = URI.parse(Addressable::URI.escape(file_info[:url]))
|
|
56
|
+
unless validate_remote_url(uri)
|
|
57
|
+
Rails.logger.error "User #{env.user.user_key} attempted to ingest file from url #{file_info[:url]}, which doesn't pass validation"
|
|
58
|
+
return false
|
|
59
|
+
end
|
|
60
|
+
auth_header = file_info.fetch(:auth_header, {})
|
|
61
|
+
create_file_from_url(env, uri, file_info[:file_name], auth_header)
|
|
62
|
+
end
|
|
63
|
+
add_ordered_members(env.user, env.curation_concern)
|
|
64
|
+
true
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Generic utility for creating FileSet from a URL
|
|
68
|
+
# Used in to import files using URLs from a file picker like browse_everything
|
|
69
|
+
def create_file_from_url(env, uri, file_name, auth_header = {})
|
|
70
|
+
::FileSet.new(import_url: uri.to_s, label: file_name) do |fs|
|
|
71
|
+
actor = file_set_actor_class.new(fs, env.user)
|
|
72
|
+
actor.create_metadata(visibility: env.curation_concern.visibility)
|
|
73
|
+
actor.attach_to_work(env.curation_concern)
|
|
74
|
+
fs.save!
|
|
75
|
+
ordered_members << fs
|
|
76
|
+
if uri.scheme == 'file'
|
|
77
|
+
# Turn any %20 into spaces.
|
|
78
|
+
file_path = CGI.unescape(uri.path)
|
|
79
|
+
IngestLocalFileJob.perform_later(fs, file_path, env.user)
|
|
80
|
+
else
|
|
81
|
+
ImportUrlJob.perform_later(fs, operation_for(user: actor.user), auth_header)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Add all file_sets as ordered_members in a single action
|
|
87
|
+
def add_ordered_members(user, work)
|
|
88
|
+
actor = Hyrax::Actors::OrderedMembersActor.new(ordered_members, user)
|
|
89
|
+
actor.attach_ordered_members_to_work(work)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
class_attribute :file_set_actor_class
|
|
93
|
+
self.file_set_actor_class = Hyrax::Actors::FileSetOrderedMembersActor
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hyrax
|
|
4
|
+
module Actors
|
|
5
|
+
class FileSetOrderedMembersActor < FileSetActor
|
|
6
|
+
# Adds representative and thumbnail to work; sets file_set visibility
|
|
7
|
+
# @param [ActiveFedora::Base] work the parent work
|
|
8
|
+
# @param [Hash] file_set_params
|
|
9
|
+
def attach_to_work(work, file_set_params = {})
|
|
10
|
+
file_set.visibility = work.visibility unless assign_visibility?(file_set_params)
|
|
11
|
+
work.representative = file_set if work.representative_id.blank?
|
|
12
|
+
work.thumbnail = file_set if work.thumbnail_id.blank?
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Hyrax
|
|
4
|
+
module Actors
|
|
5
|
+
class OrderedMembersActor < FileSetActor
|
|
6
|
+
include Lockable
|
|
7
|
+
attr_reader :ordered_members, :user
|
|
8
|
+
|
|
9
|
+
def initialize(ordered_members, user)
|
|
10
|
+
@ordered_members = ordered_members
|
|
11
|
+
@user = user
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Adds FileSets to the work using ore:Aggregations.
|
|
15
|
+
# Locks to ensure that only one process is operating on the list at a time.
|
|
16
|
+
# @param [ActiveFedora::Base] work the parent work
|
|
17
|
+
def attach_ordered_members_to_work(work)
|
|
18
|
+
acquire_lock_for(work.id) do
|
|
19
|
+
work.ordered_members = ordered_members
|
|
20
|
+
work.save
|
|
21
|
+
ordered_members.each do |file_set|
|
|
22
|
+
Hyrax.config.callback.run(:after_create_fileset, file_set, user)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -289,6 +289,7 @@ Blacklight.onLoad(function () {
|
|
|
289
289
|
parentId = $modal.find('[name="parent_id"]').val(),
|
|
290
290
|
data = {
|
|
291
291
|
parent_id: parentId,
|
|
292
|
+
// source parameter is used by NestCollectionsController#redirect_path
|
|
292
293
|
source: $self.data('source')
|
|
293
294
|
};
|
|
294
295
|
if (url.length === 0) {
|
|
@@ -308,6 +309,7 @@ Blacklight.onLoad(function () {
|
|
|
308
309
|
childId = $(this).closest('.modal').find('[name="child_id"]').val(),
|
|
309
310
|
data = {
|
|
310
311
|
child_id: childId,
|
|
312
|
+
// source parameter is used by NestCollectionsController#redirect_path
|
|
311
313
|
source: $(this).data('source')
|
|
312
314
|
};
|
|
313
315
|
if (url.length === 0) {
|
|
@@ -127,13 +127,16 @@ module Hyrax
|
|
|
127
127
|
|
|
128
128
|
def manifest
|
|
129
129
|
headers['Access-Control-Allow-Origin'] = '*'
|
|
130
|
-
|
|
130
|
+
respond_to do |wants|
|
|
131
|
+
wants.json { render json: manifest_builder.to_h }
|
|
132
|
+
wants.html { render json: manifest_builder.to_h }
|
|
133
|
+
end
|
|
131
134
|
end
|
|
132
135
|
|
|
133
136
|
private
|
|
134
137
|
|
|
135
138
|
def user_collections
|
|
136
|
-
collections_service.search_results(:deposit)
|
|
139
|
+
collections_service.search_results(:deposit)
|
|
137
140
|
end
|
|
138
141
|
|
|
139
142
|
def collections_service
|
|
@@ -91,15 +91,8 @@ module Hyrax
|
|
|
91
91
|
|
|
92
92
|
# determine appropriate redirect location depending on specified source
|
|
93
93
|
def redirect_path(item:)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
when "my"
|
|
97
|
-
my_collections_path
|
|
98
|
-
when "show"
|
|
99
|
-
dashboard_collection_path(item)
|
|
100
|
-
else
|
|
101
|
-
dashboard_collection_path(item)
|
|
102
|
-
end
|
|
94
|
+
return my_collections_path if params[:source] == 'my'
|
|
95
|
+
dashboard_collection_path(item)
|
|
103
96
|
end
|
|
104
97
|
end
|
|
105
98
|
end
|
|
@@ -11,6 +11,7 @@ module Hyrax
|
|
|
11
11
|
include Hyrax::CollectionsHelper
|
|
12
12
|
include Hyrax::ChartsHelper
|
|
13
13
|
include Hyrax::DashboardHelperBehavior
|
|
14
|
+
include Hyrax::IiifHelper
|
|
14
15
|
|
|
15
16
|
# Which translations are available for the user to select
|
|
16
17
|
# @return [Hash<String,String>] locale abbreviations as keys and flags as values
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Hyrax
|
|
2
|
+
module IiifHelper
|
|
3
|
+
def iiif_viewer_display(work_presenter, locals = {})
|
|
4
|
+
render iiif_viewer_display_partial(work_presenter),
|
|
5
|
+
locals.merge(presenter: work_presenter)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def iiif_viewer_display_partial(work_presenter)
|
|
9
|
+
'hyrax/base/iiif_viewers/' + work_presenter.iiif_viewer.to_s
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Converts UploadedFiles into FileSets and attaches them to works.
|
|
2
|
+
class AttachFilesToWorkWithOrderedMembersJob < AttachFilesToWorkJob
|
|
3
|
+
attr_reader :ordered_members, :uploaded_files
|
|
4
|
+
|
|
5
|
+
# @param [ActiveFedora::Base] work - the work object
|
|
6
|
+
# @param [Array<Hyrax::UploadedFile>] uploaded_files - an array of files to attach
|
|
7
|
+
def perform(work, uploaded_files, **work_attributes)
|
|
8
|
+
@uploaded_files = uploaded_files
|
|
9
|
+
validate_files!(uploaded_files)
|
|
10
|
+
@ordered_members = work.ordered_members.to_a # Build array of ordered members
|
|
11
|
+
depositor = proxy_or_depositor(work)
|
|
12
|
+
user = User.find_by_user_key(depositor)
|
|
13
|
+
metadata = visibility_attributes(work_attributes)
|
|
14
|
+
add_uploaded_files(user, metadata, work)
|
|
15
|
+
add_ordered_members(user, work)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def add_uploaded_files(user, metadata, work)
|
|
21
|
+
work_permissions = work.permissions.map(&:to_hash)
|
|
22
|
+
uploaded_files.each do |uploaded_file|
|
|
23
|
+
actor = file_set_actor_class.new(FileSet.create, user)
|
|
24
|
+
actor.create_metadata(metadata)
|
|
25
|
+
actor.create_content(uploaded_file)
|
|
26
|
+
actor.attach_to_work(work)
|
|
27
|
+
actor.file_set.permissions_attributes = work_permissions
|
|
28
|
+
ordered_members << actor.file_set
|
|
29
|
+
uploaded_file.update(file_set_uri: actor.file_set.uri)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Add all file_sets as ordered_members in a single action
|
|
34
|
+
def add_ordered_members(user, work)
|
|
35
|
+
actor = Hyrax::Actors::OrderedMembersActor.new(ordered_members, user)
|
|
36
|
+
actor.attach_ordered_members_to_work(work)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
class_attribute :file_set_actor_class
|
|
40
|
+
self.file_set_actor_class = Hyrax::Actors::FileSetOrderedMembersActor
|
|
41
|
+
end
|
|
@@ -55,8 +55,8 @@ module Hyrax
|
|
|
55
55
|
Hyrax::Engine.routes.url_helpers.download_url(representative_presenter, host: request.host)
|
|
56
56
|
end
|
|
57
57
|
|
|
58
|
-
# @return [Boolean] render
|
|
59
|
-
def
|
|
58
|
+
# @return [Boolean] render a IIIF viewer
|
|
59
|
+
def iiif_viewer?
|
|
60
60
|
representative_id.present? &&
|
|
61
61
|
representative_presenter.present? &&
|
|
62
62
|
representative_presenter.image? &&
|
|
@@ -64,6 +64,26 @@ module Hyrax
|
|
|
64
64
|
members_include_viewable_image?
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
+
alias universal_viewer? iiif_viewer?
|
|
68
|
+
deprecation_deprecate universal_viewer?: "use iiif_viewer? instead"
|
|
69
|
+
|
|
70
|
+
# @return [Symbol] the name of the IIIF viewer partial to render
|
|
71
|
+
# @example A work presenter with a custom iiif viewer
|
|
72
|
+
# module Hyrax
|
|
73
|
+
# class GenericWorkPresenter < Hyrax::WorkShowPresenter
|
|
74
|
+
# def iiif_viewer
|
|
75
|
+
# :my_iiif_viewer
|
|
76
|
+
# end
|
|
77
|
+
# end
|
|
78
|
+
# end
|
|
79
|
+
#
|
|
80
|
+
# Custom iiif viewer partial at app/views/hyrax/base/iiif_viewers/_my_iiif_viewer.html.erb
|
|
81
|
+
# <h3>My IIIF Viewer!</h3>
|
|
82
|
+
# <a href=<%= main_app.polymorphic_url([main_app, :manifest, presenter], { locale: nil }) %>>Manifest</a>
|
|
83
|
+
def iiif_viewer
|
|
84
|
+
:universal_viewer
|
|
85
|
+
end
|
|
86
|
+
|
|
67
87
|
# @return FileSetPresenter presenter for the representative FileSets
|
|
68
88
|
def representative_presenter
|
|
69
89
|
return nil if representative_id.blank?
|
|
@@ -204,6 +224,13 @@ module Hyrax
|
|
|
204
224
|
metadata
|
|
205
225
|
end
|
|
206
226
|
|
|
227
|
+
# determine if the user can add this work to a collection
|
|
228
|
+
# @param collections <Collections> list of collections to which this user can deposit
|
|
229
|
+
# @return true if the user can deposit to at least one collection OR if the user can create a collection; otherwise, false
|
|
230
|
+
def show_deposit_for?(collections:)
|
|
231
|
+
collections.present? || current_ability.can?(:create_any, Collection)
|
|
232
|
+
end
|
|
233
|
+
|
|
207
234
|
private
|
|
208
235
|
|
|
209
236
|
# list of item ids to display is based on ordered_ids
|