hyrax 2.1.0.rc2 → 2.1.0.rc3
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/README.md +2 -2
- data/app/assets/stylesheets/hyrax/_work-show.scss +11 -2
- data/app/controllers/hyrax/admin/admin_sets_controller.rb +22 -1
- data/app/jobs/import_url_job.rb +50 -18
- data/app/models/concerns/hyrax/ability/admin_set_ability.rb +1 -1
- data/app/presenters/hyrax/file_set_presenter.rb +4 -0
- data/app/presenters/hyrax/work_show_presenter.rb +2 -2
- data/app/services/hyrax/collections/permissions_create_service.rb +23 -0
- data/app/services/hyrax/collections/permissions_service.rb +17 -11
- data/app/views/hyrax/base/_items.html.erb +3 -1
- data/app/views/hyrax/collections/_show_document_list_row.html.erb +0 -19
- data/app/views/hyrax/file_sets/_actions.html.erb +38 -36
- data/app/views/hyrax/file_sets/media_display/_image.html.erb +1 -1
- data/config/features.rb +2 -2
- data/config/locales/hyrax.de.yml +13 -1
- data/config/locales/hyrax.en.yml +12 -0
- data/config/locales/hyrax.es.yml +12 -0
- data/config/locales/hyrax.fr.yml +12 -0
- data/config/locales/hyrax.it.yml +12 -0
- data/config/locales/hyrax.pt-BR.yml +12 -0
- data/config/locales/hyrax.zh.yml +12 -0
- data/lib/hyrax/version.rb +1 -1
- data/spec/abilities/admin_set_ability_spec.rb +5 -0
- data/spec/controllers/hyrax/admin/admin_sets_controller_spec.rb +71 -2
- data/spec/jobs/import_url_job_spec.rb +53 -0
- data/spec/models/flipflop_spec.rb +2 -2
- data/spec/presenters/hyrax/file_set_presenter_spec.rb +24 -0
- data/spec/presenters/hyrax/work_show_presenter_spec.rb +10 -0
- data/spec/services/hyrax/collections/permissions_create_service_spec.rb +23 -0
- data/spec/services/hyrax/collections/permissions_service_spec.rb +92 -8
- data/spec/views/hyrax/base/_items.html.erb_spec.rb +23 -45
- data/spec/views/hyrax/base/_member.html.erb_spec.rb +1 -1
- data/spec/views/hyrax/collections/_show_document_list_row.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/dashboard/collections/_show_document_list_row.html.erb_spec.rb +1 -0
- data/spec/views/hyrax/file_sets/_actions.html.erb_spec.rb +30 -9
- data/template.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 025cc22285626454040035c0cf14f5d89d818fa8
|
4
|
+
data.tar.gz: 5669ec53c680bfe657ba9f1064102b43c5cd6efd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a301edaa82e5823d68d31c7e4dd547848fbac537ae1e30ff6db7de2fc45897d7a2b3171560a1a8f62f242e921d259f5e0ab1a682ff4e7393ba9f446c17745b6e
|
7
|
+
data.tar.gz: b034075731f730600bb4415a273e9ae2ed641615052275a91e6d15e52a77af64c15d55687a6922cab802e6cf64118fc365b0e00ab245aafbe0c5014611b2fc0c
|
data/README.md
CHANGED
@@ -63,7 +63,7 @@ The Samvera community is here to help. Please see our [support guide](./.github/
|
|
63
63
|
# Getting started
|
64
64
|
|
65
65
|
This document contains instructions specific to setting up an app with __Hyrax
|
66
|
-
v2.1.0.
|
66
|
+
v2.1.0.rc3__. If you are looking for instructions on installing a different
|
67
67
|
version, be sure to select the appropriate branch or tag from the drop-down
|
68
68
|
menu above.
|
69
69
|
|
@@ -162,7 +162,7 @@ NOTE: The steps need to be done in order to create a new Hyrax based app.
|
|
162
162
|
Generate a new Rails application using the template.
|
163
163
|
|
164
164
|
```
|
165
|
-
rails _5.1.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.1.0.
|
165
|
+
rails _5.1.6_ new my_app -m https://raw.githubusercontent.com/samvera/hyrax/v2.1.0.rc3/template.rb
|
166
166
|
```
|
167
167
|
|
168
168
|
Generating a new Rails application using Hyrax's template above takes cares of a number of steps for you, including:
|
@@ -4,7 +4,8 @@
|
|
4
4
|
}
|
5
5
|
}
|
6
6
|
|
7
|
-
.no-preview,
|
7
|
+
.no-preview,
|
8
|
+
.social-media {
|
8
9
|
padding: $panel-body-padding;
|
9
10
|
}
|
10
11
|
|
@@ -17,7 +18,8 @@ header > h1 .label {
|
|
17
18
|
padding: $panel-body-padding;
|
18
19
|
}
|
19
20
|
|
20
|
-
.relationships,
|
21
|
+
.relationships,
|
22
|
+
.attributes {
|
21
23
|
tbody th {
|
22
24
|
width: 20%;
|
23
25
|
}
|
@@ -52,6 +54,13 @@ ul.tabular {
|
|
52
54
|
.work-type {
|
53
55
|
margin-bottom: 18px;
|
54
56
|
margin-top: -8px;
|
57
|
+
|
58
|
+
.panel-body {
|
59
|
+
.work_description,
|
60
|
+
li.attribute {
|
61
|
+
word-break: break-word;
|
62
|
+
}
|
63
|
+
}
|
55
64
|
}
|
56
65
|
|
57
66
|
.panel-workflow {
|
@@ -2,8 +2,13 @@ module Hyrax
|
|
2
2
|
class Admin::AdminSetsController < ApplicationController
|
3
3
|
include Hyrax::CollectionsControllerBehavior
|
4
4
|
|
5
|
-
before_action :
|
5
|
+
before_action :authenticate_user!
|
6
|
+
before_action :ensure_manager!, except: [:show]
|
6
7
|
load_and_authorize_resource
|
8
|
+
before_action :ensure_viewer!, only: [:show]
|
9
|
+
|
10
|
+
# Catch permission errors
|
11
|
+
rescue_from Hydra::AccessDenied, CanCan::AccessDenied, with: :deny_adminset_access
|
7
12
|
|
8
13
|
with_themed_layout 'dashboard'
|
9
14
|
self.presenter_class = Hyrax::AdminSetPresenter
|
@@ -19,6 +24,15 @@ module Hyrax
|
|
19
24
|
class_attribute :admin_set_create_service
|
20
25
|
self.admin_set_create_service = AdminSetCreateService
|
21
26
|
|
27
|
+
def deny_adminset_access(exception)
|
28
|
+
if current_user && current_user.persisted?
|
29
|
+
redirect_to root_url, alert: exception.message
|
30
|
+
else
|
31
|
+
session['user_return_to'] = request.url
|
32
|
+
redirect_to main_app.new_user_session_url, alert: exception.message
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
22
36
|
def show
|
23
37
|
add_breadcrumb I18n.t('hyrax.controls.home'), hyrax.root_path
|
24
38
|
add_breadcrumb t(:'hyrax.dashboard.title'), hyrax.dashboard_path
|
@@ -92,11 +106,18 @@ module Hyrax
|
|
92
106
|
end
|
93
107
|
|
94
108
|
def ensure_manager!
|
109
|
+
# TODO: Review for possible removal. Doesn't appear to apply anymore.
|
95
110
|
# Even though the user can view this admin set, they may not be able to view
|
96
111
|
# it on the admin page.
|
97
112
|
authorize! :manage_any, AdminSet
|
98
113
|
end
|
99
114
|
|
115
|
+
def ensure_viewer!
|
116
|
+
# Even though the user can view this admin set, they may not be able to view
|
117
|
+
# it on the admin page if access is granted as a public or registered user only.
|
118
|
+
authorize! :view_admin_show, @admin_set
|
119
|
+
end
|
120
|
+
|
100
121
|
def create_admin_set
|
101
122
|
admin_set_create_service.call(admin_set: @admin_set, creating_user: current_user)
|
102
123
|
end
|
data/app/jobs/import_url_job.rb
CHANGED
@@ -8,22 +8,27 @@ require 'browse_everything/retriever'
|
|
8
8
|
# and CreateWithRemoteFilesActor when files are located in some other service.
|
9
9
|
class ImportUrlJob < Hyrax::ApplicationJob
|
10
10
|
queue_as Hyrax.config.ingest_queue_name
|
11
|
+
attr_reader :file_set, :operation
|
11
12
|
|
12
13
|
before_enqueue do |job|
|
14
|
+
operation = job.arguments[1]
|
13
15
|
operation.pending_job(job)
|
14
16
|
end
|
15
17
|
|
16
|
-
# Retrieves the operation for the job
|
17
|
-
def operation
|
18
|
-
arguments.reduce(:merge).fetch(:operation)
|
19
|
-
end
|
20
|
-
|
21
18
|
# @param [FileSet] file_set
|
22
19
|
# @param [Hyrax::BatchCreateOperation] operation
|
23
20
|
def perform(file_set, operation, headers = {})
|
24
21
|
operation.performing!
|
25
22
|
user = User.find_by_user_key(file_set.depositor)
|
26
23
|
uri = URI(file_set.import_url)
|
24
|
+
@file_set = file_set
|
25
|
+
@operation = operation
|
26
|
+
|
27
|
+
unless HTTParty.head(file_set.import_url).success?
|
28
|
+
send_error('Expired URL')
|
29
|
+
return false
|
30
|
+
end
|
31
|
+
|
27
32
|
# @todo Use Hydra::Works::AddExternalFileToFileSet instead of manually
|
28
33
|
# copying the file here. This will be gnarly.
|
29
34
|
copy_remote_file(uri, headers) do |f|
|
@@ -33,13 +38,7 @@ class ImportUrlJob < Hyrax::ApplicationJob
|
|
33
38
|
# FileSetActor operates synchronously so that this tempfile is available.
|
34
39
|
# If asynchronous, the job might be invoked on a machine that did not have this temp file on its file system!
|
35
40
|
# NOTE: The return status may be successful even if the content never attaches.
|
36
|
-
|
37
|
-
operation.success!
|
38
|
-
else
|
39
|
-
# send message to user on download failure
|
40
|
-
Hyrax.config.callback.run(:after_import_url_failure, file_set, user)
|
41
|
-
operation.fail!(file_set.errors.full_messages.join(' '))
|
42
|
-
end
|
41
|
+
log_import_status(uri, f, user)
|
43
42
|
end
|
44
43
|
end
|
45
44
|
|
@@ -57,14 +56,47 @@ class ImportUrlJob < Hyrax::ApplicationJob
|
|
57
56
|
Rails.logger.debug("ImportUrlJob: Copying <#{uri}> to #{dir}")
|
58
57
|
|
59
58
|
File.open(File.join(dir, filename), 'wb') do |f|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
59
|
+
begin
|
60
|
+
write_file(uri, f, headers)
|
61
|
+
yield f
|
62
|
+
rescue StandardError => e
|
63
|
+
send_error(e.message)
|
64
64
|
end
|
65
|
-
f.rewind
|
66
|
-
yield f
|
67
65
|
end
|
68
66
|
Rails.logger.debug("ImportUrlJob: Closing #{File.join(dir, filename)}")
|
69
67
|
end
|
68
|
+
|
69
|
+
# Send message to user on download failure
|
70
|
+
# @param filename [String] the filename of the file to download
|
71
|
+
# @param error_message [String] the download error message
|
72
|
+
def send_error(error_message)
|
73
|
+
user = User.find_by_user_key(file_set.depositor)
|
74
|
+
@file_set.errors.add('Error:', error_message)
|
75
|
+
Hyrax.config.callback.run(:after_import_url_failure, @file_set, user)
|
76
|
+
@operation.fail!(@file_set.errors.full_messages.join(' '))
|
77
|
+
end
|
78
|
+
|
79
|
+
# Write file to the stream
|
80
|
+
# @param uri [URI] the uri of the file to download
|
81
|
+
# @param f [IO] the stream to write to
|
82
|
+
def write_file(uri, f, headers)
|
83
|
+
retriever = BrowseEverything::Retriever.new
|
84
|
+
uri_spec = { 'url' => uri }.merge(headers)
|
85
|
+
retriever.retrieve(uri_spec) do |chunk|
|
86
|
+
f.write(chunk)
|
87
|
+
end
|
88
|
+
f.rewind
|
89
|
+
end
|
90
|
+
|
91
|
+
# Set the import operation status
|
92
|
+
# @param uri [URI] the uri of the file to download
|
93
|
+
# @param f [IO] the stream to write to
|
94
|
+
# @param user [User]
|
95
|
+
def log_import_status(uri, f, user)
|
96
|
+
if Hyrax::Actors::FileSetActor.new(@file_set, user).create_content(f, from_url: true)
|
97
|
+
operation.success!
|
98
|
+
else
|
99
|
+
send_error(uri.path, nil)
|
100
|
+
end
|
101
|
+
end
|
70
102
|
end
|
@@ -9,7 +9,7 @@ module Hyrax
|
|
9
9
|
can :view_admin_show_any, AdminSet
|
10
10
|
else
|
11
11
|
can :manage_any, AdminSet if Hyrax::Collections::PermissionsService.can_manage_any_admin_set?(ability: self)
|
12
|
-
can :create_any, AdminSet if Hyrax::CollectionTypes::PermissionsService.can_create_admin_set_collection_type?(ability: self)
|
12
|
+
can [:create_any, :create], AdminSet if Hyrax::CollectionTypes::PermissionsService.can_create_admin_set_collection_type?(ability: self)
|
13
13
|
can :view_admin_show_any, AdminSet if Hyrax::Collections::PermissionsService.can_view_admin_show_for_any_admin_set?(ability: self)
|
14
14
|
|
15
15
|
can [:edit, :update, :destroy], AdminSet do |admin_set| # for test by solr_doc, see solr_document_ability.rb
|
@@ -90,6 +90,10 @@ module Hyrax
|
|
90
90
|
presenter_args: current_ability).first
|
91
91
|
end
|
92
92
|
|
93
|
+
def user_can_perform_any_action?
|
94
|
+
current_ability.can?(:edit, id) || current_ability.can?(:destroy, id) || current_ability.can?(:download, id)
|
95
|
+
end
|
96
|
+
|
93
97
|
private
|
94
98
|
|
95
99
|
def link_presenter_class
|
@@ -155,8 +155,8 @@ module Hyrax
|
|
155
155
|
|
156
156
|
delegate :member_presenters, :file_set_presenters, :work_presenters, to: :member_presenter_factory
|
157
157
|
|
158
|
-
def
|
159
|
-
member_presenters.delete_if { |m|
|
158
|
+
def exclude_unauthorized_members
|
159
|
+
member_presenters.delete_if { |m| !current_ability.can?(:read, m.id) }
|
160
160
|
end
|
161
161
|
|
162
162
|
def manifest_url
|
@@ -17,6 +17,29 @@ module Hyrax
|
|
17
17
|
collection.reset_access_controls!
|
18
18
|
end
|
19
19
|
|
20
|
+
# @api public
|
21
|
+
#
|
22
|
+
# Add access grants to a collection
|
23
|
+
#
|
24
|
+
# @param collection_id [String] id of a collection
|
25
|
+
# @param grants [Array<Hash>] array of grants to add to the collection
|
26
|
+
# @example grants
|
27
|
+
# [ { agent_type: Hyrax::PermissionTemplateAccess::GROUP,
|
28
|
+
# agent_id: 'my_group_name',
|
29
|
+
# access: Hyrax::PermissionTemplateAccess::DEPOSIT } ]
|
30
|
+
# @see Hyrax::PermissionTemplateAccess for valid values for agent_type and access
|
31
|
+
def self.add_access(collection_id:, grants:)
|
32
|
+
collection = Collection.find(collection_id)
|
33
|
+
template = Hyrax::PermissionTemplate.find_by!(source_id: collection_id)
|
34
|
+
grants.each do |grant|
|
35
|
+
Hyrax::PermissionTemplateAccess.find_or_create_by(permission_template_id: template.id,
|
36
|
+
agent_type: grant[:agent_type],
|
37
|
+
agent_id: grant[:agent_id],
|
38
|
+
access: grant[:access])
|
39
|
+
end
|
40
|
+
collection.reset_access_controls!
|
41
|
+
end
|
42
|
+
|
20
43
|
# @api private
|
21
44
|
#
|
22
45
|
# Gather the default permissions needed for a new collection
|
@@ -170,9 +170,11 @@ module Hyrax
|
|
170
170
|
# @return [Boolean] true if the user has permission to view the admin show page for the collection
|
171
171
|
# @note Several checks get the user's groups from the user's ability. The same values can be retrieved directly from a passed in ability.
|
172
172
|
def self.can_view_admin_show_for_collection?(collection_id:, ability:)
|
173
|
-
|
174
|
-
|
175
|
-
|
173
|
+
exclude_groups = [::Ability.registered_group_name,
|
174
|
+
::Ability.public_group_name]
|
175
|
+
manage_access_to_collection?(collection_id: collection_id, ability: ability) ||
|
176
|
+
deposit_access_to_collection?(collection_id: collection_id, ability: ability, exclude_groups: exclude_groups) ||
|
177
|
+
view_access_to_collection?(collection_id: collection_id, ability: ability, exclude_groups: exclude_groups)
|
176
178
|
end
|
177
179
|
|
178
180
|
# @api private
|
@@ -181,10 +183,11 @@ module Hyrax
|
|
181
183
|
#
|
182
184
|
# @param collection_id [String] id of the collection we are checking permissions on
|
183
185
|
# @param ability [Ability] the ability coming from cancan ability check
|
186
|
+
# @param exclude_groups [Array<String>] name of groups to exclude from the results
|
184
187
|
# @return [Boolean] true if the user has :deposit access to the collection
|
185
188
|
# @note Several checks get the user's groups from the user's ability. The same values can be retrieved directly from a passed in ability.
|
186
|
-
def self.deposit_access_to_collection?(collection_id:, ability: nil)
|
187
|
-
access_to_collection?(collection_id: collection_id, access: 'deposit', ability: ability)
|
189
|
+
def self.deposit_access_to_collection?(collection_id:, ability: nil, exclude_groups: [])
|
190
|
+
access_to_collection?(collection_id: collection_id, access: 'deposit', ability: ability, exclude_groups: exclude_groups)
|
188
191
|
end
|
189
192
|
private_class_method :deposit_access_to_collection?
|
190
193
|
|
@@ -194,10 +197,11 @@ module Hyrax
|
|
194
197
|
#
|
195
198
|
# @param collection_id [String] id of the collection we are checking permissions on
|
196
199
|
# @param ability [Ability] the ability coming from cancan ability check
|
200
|
+
# @param exclude_groups [Array<String>] name of groups to exclude from the results
|
197
201
|
# @return [Boolean] true if the user has :manage access to the collection
|
198
202
|
# @note Several checks get the user's groups from the user's ability. The same values can be retrieved directly from a passed in ability.
|
199
|
-
def self.manage_access_to_collection?(collection_id:, ability:)
|
200
|
-
access_to_collection?(collection_id: collection_id, access: 'manage', ability: ability)
|
203
|
+
def self.manage_access_to_collection?(collection_id:, ability:, exclude_groups: [])
|
204
|
+
access_to_collection?(collection_id: collection_id, access: 'manage', ability: ability, exclude_groups: exclude_groups)
|
201
205
|
end
|
202
206
|
private_class_method :manage_access_to_collection?
|
203
207
|
|
@@ -207,10 +211,11 @@ module Hyrax
|
|
207
211
|
#
|
208
212
|
# @param collection_id [String] id of the collection we are checking permissions on
|
209
213
|
# @param ability [Ability] the ability coming from cancan ability check
|
214
|
+
# @param exclude_groups [Array<String>] name of groups to exclude from the results
|
210
215
|
# @return [Boolean] true if the user has permission to view the collection
|
211
216
|
# @note Several checks get the user's groups from the user's ability. The same values can be retrieved directly from a passed in ability.
|
212
|
-
def self.view_access_to_collection?(collection_id:, ability:)
|
213
|
-
access_to_collection?(collection_id: collection_id, access: 'view', ability: ability)
|
217
|
+
def self.view_access_to_collection?(collection_id:, ability:, exclude_groups: [])
|
218
|
+
access_to_collection?(collection_id: collection_id, access: 'view', ability: ability, exclude_groups: exclude_groups)
|
214
219
|
end
|
215
220
|
private_class_method :view_access_to_collection?
|
216
221
|
|
@@ -221,13 +226,14 @@ module Hyrax
|
|
221
226
|
# @param collection_id [String] id of the collection we are checking permissions on
|
222
227
|
# @param access [Symbol] the access level to check
|
223
228
|
# @param ability [Ability] the ability coming from cancan ability check
|
229
|
+
# @param exclude_groups [Array<String>] name of groups to exclude from the results
|
224
230
|
# @return [Boolean] true if the user has permission to view the collection
|
225
231
|
# @note Several checks get the user's groups from the user's ability. The same values can be retrieved directly from a passed in ability.
|
226
|
-
def self.access_to_collection?(collection_id:, access:, ability:)
|
232
|
+
def self.access_to_collection?(collection_id:, access:, ability:, exclude_groups: [])
|
227
233
|
return false unless collection_id
|
228
234
|
template = Hyrax::PermissionTemplate.find_by!(source_id: collection_id)
|
229
235
|
return true if ([ability.current_user.user_key] & template.agent_ids_for(agent_type: 'user', access: access)).present?
|
230
|
-
return true if (ability.user_groups & template.agent_ids_for(agent_type: 'group', access: access)).present?
|
236
|
+
return true if (ability.user_groups & (template.agent_ids_for(agent_type: 'group', access: access) - exclude_groups)).present?
|
231
237
|
false
|
232
238
|
end
|
233
239
|
private_class_method :access_to_collection?
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<h2><%= t('.header') %></h2>
|
2
|
-
<% members = Flipflop.
|
2
|
+
<% members = Flipflop.hide_private_items? ? presenter.exclude_unauthorized_members : presenter.member_presenters %>
|
3
3
|
<% if members.present? %>
|
4
4
|
<table class="table table-striped related-files">
|
5
5
|
<thead>
|
@@ -17,4 +17,6 @@
|
|
17
17
|
</table>
|
18
18
|
<% elsif can? :edit, presenter.id %>
|
19
19
|
<div class="alert alert-warning" role="alert"><%= t('.empty', type: presenter.human_readable_type) %></div>
|
20
|
+
<% else %>
|
21
|
+
<div class="alert alert-warning" role="alert"><%= t('.unauthorized', type: presenter.human_readable_type) %></div>
|
20
22
|
<% end %>
|
@@ -13,7 +13,6 @@
|
|
13
13
|
<div class="media-body">
|
14
14
|
<p class="media-heading">
|
15
15
|
<strong><%= link_to document.title_or_label, [main_app, document], id: "src_copy_link#{id}", class: "#{'document-title' if document.title_or_label == document.label}" %></strong>
|
16
|
-
<a href="#" class="small" title="Click for more details"><i id="expand_<%= id %>" class="glyphicon glyphicon-chevron-right"></i></a>
|
17
16
|
</p>
|
18
17
|
<%= render_collection_links(document) %>
|
19
18
|
</div>
|
@@ -24,21 +23,3 @@
|
|
24
23
|
<%= render_visibility_link(document) %>
|
25
24
|
</td>
|
26
25
|
</tr>
|
27
|
-
<tr id="detail_<%= id %>"> <!-- document detail"> -->
|
28
|
-
<td colspan="6">
|
29
|
-
<dl class="expanded-details row">
|
30
|
-
<dt class="col-xs-3 col-lg-2">Creator:</dt>
|
31
|
-
<dd class="col-xs-9 col-lg-4"><%= document.creator.to_a.to_sentence %></dd>
|
32
|
-
<dt class="col-xs-3 col-lg-2">Depositor:</dt>
|
33
|
-
<dd class="col-xs-9 col-lg-4"><%= link_to_profile document.depositor %></dd>
|
34
|
-
<dt class="col-xs-3 col-lg-2">Edit Access:</dt>
|
35
|
-
<dd class="col-xs-9 col-lg-10">
|
36
|
-
<% if document.edit_groups.present? %>
|
37
|
-
Groups: <%= document.edit_groups.join(', ') %>
|
38
|
-
<br />
|
39
|
-
<% end %>
|
40
|
-
Users: <%= document.edit_people.join(', ') %>
|
41
|
-
</dd>
|
42
|
-
</dl>
|
43
|
-
</td>
|
44
|
-
</tr>
|
@@ -1,42 +1,44 @@
|
|
1
|
-
|
1
|
+
<% if file_set.user_can_perform_any_action? %>
|
2
|
+
<div class="btn-group">
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown" type="button" id="dropdownMenu_<%= file_set.id %>" aria-haspopup="true">
|
5
|
+
<span class="sr-only">Press to </span>
|
6
|
+
<%= t('.header') %>
|
7
|
+
<span class="caret" aria-hidden="true"></span>
|
8
|
+
</button>
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
<ul role="menu" class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu_<%= file_set.id %>">
|
11
|
+
<% if can?(:edit, file_set.id) %>
|
12
|
+
<li role="menuitem" tabindex="-1">
|
13
|
+
<%= link_to t('.edit'), edit_polymorphic_path([main_app, file_set]),
|
14
|
+
{ title: t('.edit_title', file_set: file_set) } %>
|
15
|
+
</li>
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
<li role="menuitem" tabindex="-1">
|
18
|
+
<%= link_to t('.versions'), edit_polymorphic_path([main_app, file_set], anchor: 'versioning_display'),
|
19
|
+
{ title: t('.versions_title') } %>
|
20
|
+
</li>
|
21
|
+
<% end %>
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
<% if can?(:destroy, file_set.id) %>
|
24
|
+
<li role="menuitem" tabindex="-1">
|
25
|
+
<%= link_to t('.delete'), polymorphic_path([main_app, file_set]),
|
26
|
+
method: :delete, title: t('.delete_title', file_set: file_set),
|
27
|
+
data: { confirm: t('.delete_confirm', file_set: file_set, application_name: application_name) } %>
|
28
|
+
</li>
|
29
|
+
<% end %>
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
31
|
+
<% if can?(:download, file_set.id) %>
|
32
|
+
<li role="menuitem" tabindex="-1">
|
33
|
+
<%= link_to t('.download'),
|
34
|
+
hyrax.download_path(file_set),
|
35
|
+
title: t('.download_title', file_set: file_set),
|
36
|
+
target: "_blank",
|
37
|
+
id: "file_download",
|
38
|
+
data: { label: file_set.id } %>
|
39
|
+
</li>
|
40
|
+
<% end %>
|
40
41
|
|
41
|
-
|
42
|
-
</div>
|
42
|
+
</ul>
|
43
|
+
</div>
|
44
|
+
<% end %>
|