curation_concerns 1.3.3 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -1
- data/Gemfile +5 -0
- data/app/actors/curation_concerns/actors/actor_stack.rb +20 -4
- data/app/actors/curation_concerns/actors/base_actor.rb +1 -1
- data/app/assets/javascripts/curation_concerns/boot.es6 +6 -0
- data/app/assets/javascripts/curation_concerns/curation_concerns.js +5 -5
- data/app/assets/javascripts/curation_concerns/file_manager.es6 +41 -0
- data/app/assets/javascripts/curation_concerns/file_manager/member.es6 +2 -8
- data/app/assets/javascripts/curation_concerns/file_manager/save_manager.es6 +1 -3
- data/app/assets/javascripts/curation_concerns/file_manager/sorting.es6 +69 -75
- data/app/controllers/concerns/curation_concerns/collections_controller_behavior.rb +1 -1
- data/app/controllers/concerns/curation_concerns/curation_concern_controller.rb +3 -3
- data/app/controllers/concerns/curation_concerns/file_sets_controller_behavior.rb +5 -7
- data/app/controllers/concerns/curation_concerns/single_use_links_controller_behavior.rb +6 -5
- data/app/models/concerns/curation_concerns/solr_document_behavior.rb +23 -4
- data/app/services/curation_concerns/time_service.rb +2 -1
- data/app/views/curation_concerns/file_sets/show.json.jbuilder +1 -1
- data/curation_concerns.gemspec +2 -1
- data/lib/curation_concerns/engine.rb +1 -0
- data/lib/curation_concerns/version.rb +1 -1
- data/solr/config/solrconfig.xml +26 -4
- data/spec/actors/curation_concerns/apply_order_actor_spec.rb +6 -4
- data/spec/actors/curation_concerns/file_set_actor_spec.rb +3 -3
- data/spec/actors/curation_concerns/work_actor_spec.rb +8 -7
- data/spec/controllers/catalog_controller_spec.rb +1 -1
- data/spec/controllers/curation_concerns/collections_controller_spec.rb +1 -1
- data/spec/controllers/curation_concerns/file_sets_controller_json_spec.rb +29 -5
- data/spec/controllers/curation_concerns/file_sets_controller_spec.rb +20 -4
- data/spec/controllers/curation_concerns/generic_works_controller_json_spec.rb +3 -2
- data/spec/controllers/curation_concerns/generic_works_controller_spec.rb +6 -1
- data/spec/factories/generic_works.rb +2 -2
- data/spec/features/create_work_spec.rb +1 -1
- data/spec/features/update_file_spec.rb +7 -0
- data/spec/features/work_generator_spec.rb +1 -1
- data/spec/models/collection_spec.rb +3 -3
- data/spec/models/curation_concerns/work_behavior_spec.rb +2 -1
- data/spec/models/file_set_spec.rb +2 -1
- data/spec/presenters/curation_concerns/work_show_presenter_spec.rb +0 -1
- data/spec/services/file_set_audit_service_spec.rb +14 -0
- data/spec/services/graph_exporter_spec.rb +1 -1
- data/spec/spec_helper.rb +13 -0
- data/spec/support/helpers/controller_level_helpers.rb +27 -0
- data/spec/support/views/test_view_helpers.rb +10 -0
- data/spec/test_app_templates/Gemfile.extra +2 -0
- data/spec/views/catalog/index.html.erb_spec.rb +0 -3
- data/spec/views/curation_concerns/base/_form_rights_spec.rb +9 -7
- data/spec/views/curation_concerns/file_sets/show.json.jbuilder_spec.rb +6 -6
- metadata +24 -11
- data/app/assets/javascripts/curation_concerns/file_manager/affix.es6 +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7cfdad9a9be43d5356653c2f33b2366241c07b8
|
4
|
+
data.tar.gz: fc51ce634c3532c0956d2822f8dcb36f381ab577
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29f30a7c5a4d29c69b1feb098b918b1a5319025a8f38f811a3699745ace59c3fae94f2341e2950b3b4f134c7552e50ff1a85c02bc28e43b213c6cf5d16e80f93
|
7
|
+
data.tar.gz: df6588bfae1ec8231c6d39853f6bf22e9dfff09705e56d7390049631d5fcd969d2787414257ec35f2ef6c18aed154718408403420ae72a637bc79b03eafaad7d
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -46,3 +46,8 @@ else
|
|
46
46
|
end
|
47
47
|
# END ENGINE_CART BLOCK
|
48
48
|
|
49
|
+
gem 'rails-controller-testing' if !ENV['RAILS_VERSION'] || ENV['RAILS_VERSION'] =~ /^5\./
|
50
|
+
|
51
|
+
unless File.exist?(file)
|
52
|
+
eval_gemfile File.expand_path('spec/test_app_templates/Gemfile.extra', File.dirname(__FILE__))
|
53
|
+
end
|
@@ -17,12 +17,14 @@ module CurationConcerns
|
|
17
17
|
first_actor_class.new(curation_concern, user, inner_stack)
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
# @param [ActionController::Parameters,Hash,NilClass] new_attributes
|
21
|
+
def create(new_attributes)
|
22
|
+
actor.create(cast_to_indifferent_hash(new_attributes))
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
# @param [ActionController::Parameters,Hash,NilClass] new_attributes
|
26
|
+
def update(new_attributes)
|
27
|
+
actor.update(cast_to_indifferent_hash(new_attributes))
|
26
28
|
end
|
27
29
|
|
28
30
|
def destroy
|
@@ -33,6 +35,20 @@ module CurationConcerns
|
|
33
35
|
end
|
34
36
|
curation_concern.destroy
|
35
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @param [ActionController::Parameters,Hash,NilClass] new_attributes
|
42
|
+
def cast_to_indifferent_hash(new_attributes)
|
43
|
+
new_attributes ||= {}
|
44
|
+
if new_attributes.respond_to?(:to_unsafe_h)
|
45
|
+
# This is the typical (not-ActionView::TestCase) code path.
|
46
|
+
new_attributes = new_attributes.to_unsafe_h
|
47
|
+
end
|
48
|
+
# In Rails 5 to_unsafe_h returns a HashWithIndifferentAccess, in Rails 4 it returns Hash
|
49
|
+
new_attributes = new_attributes.with_indifferent_access if new_attributes.instance_of? Hash
|
50
|
+
new_attributes
|
51
|
+
end
|
36
52
|
end
|
37
53
|
end
|
38
54
|
end
|
@@ -53,7 +53,7 @@ module CurationConcerns
|
|
53
53
|
def apply_save_data_to_curation_concern(attributes)
|
54
54
|
attributes[:rights] = Array(attributes[:rights]) if attributes.key? :rights
|
55
55
|
remove_blank_attributes!(attributes)
|
56
|
-
curation_concern.attributes = attributes
|
56
|
+
curation_concern.attributes = attributes
|
57
57
|
curation_concern.date_modified = CurationConcerns::TimeService.time_in_utc
|
58
58
|
end
|
59
59
|
|
@@ -1,23 +1,23 @@
|
|
1
|
-
//= require hydra-editor/hydra-editor
|
2
1
|
//= require curation_concerns/facet_mine
|
3
2
|
//= require curation_concerns/embargoes
|
4
3
|
//= require curation_concerns/fileupload
|
5
|
-
//= require
|
4
|
+
//= require hydra-editor/hydra-editor
|
6
5
|
//= require curation_concerns/file_manager/sorting
|
7
6
|
//= require curation_concerns/file_manager/save_manager
|
8
7
|
//= require curation_concerns/file_manager/member
|
9
8
|
//= require curation_concerns/single_use_links_manager
|
10
9
|
//= require curation_concerns/batch_select
|
11
10
|
//= require curation_concerns/collections
|
12
|
-
|
11
|
+
//= require curation_concerns/file_manager
|
12
|
+
//= require curation_concerns/boot
|
13
13
|
|
14
14
|
// Initialize plugins and Bootstrap dropdowns on jQuery's ready event as well as
|
15
15
|
// Turbolinks's page change event.
|
16
16
|
Blacklight.onLoad(function() {
|
17
|
+
cc = require('curation_concerns/boot')
|
17
18
|
$('abbr').tooltip();
|
18
19
|
|
19
20
|
$("[data-toggle='dropdown']").dropdown();
|
20
21
|
$('a[data-toggle="popover"]').popover({ html: true })
|
21
|
-
|
22
|
-
|
22
|
+
window.curation_concerns = new cc.Initializer()
|
23
23
|
});
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import SaveManager from 'curation_concerns/file_manager/save_manager'
|
2
|
+
import SortManager from 'curation_concerns/file_manager/sorting'
|
3
|
+
import {FileManagerMember} from 'curation_concerns/file_manager/member'
|
4
|
+
export default class FileManager {
|
5
|
+
constructor() {
|
6
|
+
this.save_manager = this.initialize_save_manager()
|
7
|
+
this.sorting()
|
8
|
+
this.save_affix()
|
9
|
+
this.member_tracking()
|
10
|
+
}
|
11
|
+
|
12
|
+
initialize_save_manager() {
|
13
|
+
return(new SaveManager)
|
14
|
+
}
|
15
|
+
|
16
|
+
sorting() {
|
17
|
+
window.new_sort_manager = new SortManager(this.save_manager)
|
18
|
+
}
|
19
|
+
|
20
|
+
save_affix() {
|
21
|
+
let tools = $("#file-manager-tools")
|
22
|
+
if(tools.length > 0) {
|
23
|
+
tools.affix({
|
24
|
+
offset: {
|
25
|
+
top: $("#file-manager-tools .actions").offset().top,
|
26
|
+
bottom: function() {
|
27
|
+
return $("#file-manager-extra-tools").outerHeight(true) + $("footer").outerHeight(true)
|
28
|
+
}
|
29
|
+
}
|
30
|
+
})
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
member_tracking() {
|
35
|
+
let sm = this.save_manager
|
36
|
+
$("li[data-reorder-id]").each(function(index, element) {
|
37
|
+
var manager_member = new FileManagerMember($(element), sm)
|
38
|
+
$(element).data("file_manager_member", manager_member)
|
39
|
+
})
|
40
|
+
}
|
41
|
+
}
|
@@ -1,10 +1,4 @@
|
|
1
|
-
|
2
|
-
$("li[data-reorder-id]").each(function(index, element) {
|
3
|
-
let manager_member = new FileManagerMember($(element), window.save_manager)
|
4
|
-
$(element).data("file_manager_member", manager_member)
|
5
|
-
})
|
6
|
-
})
|
7
|
-
class InputTracker {
|
1
|
+
export class InputTracker {
|
8
2
|
constructor(element, notifier) {
|
9
3
|
this.element = element
|
10
4
|
this.notifier = notifier
|
@@ -28,7 +22,7 @@ class InputTracker {
|
|
28
22
|
}
|
29
23
|
}
|
30
24
|
}
|
31
|
-
class FileManagerMember {
|
25
|
+
export class FileManagerMember {
|
32
26
|
constructor(element, save_manager) {
|
33
27
|
this.element = element
|
34
28
|
this.save_manager = save_manager
|
@@ -1,91 +1,85 @@
|
|
1
|
-
{
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
export default class SortManager {
|
2
|
+
constructor(save_manager) {
|
3
|
+
this.element = $("#sortable")
|
4
|
+
this.sorting_info = {}
|
5
|
+
this.initialize_sort()
|
6
|
+
this.element.data("current-order", this.order)
|
7
|
+
this.save_manager = save_manager
|
8
|
+
}
|
5
9
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
this.element.data("current-order", this.order)
|
12
|
-
this.save_manager = window.save_manager
|
13
|
-
}
|
10
|
+
initialize_sort() {
|
11
|
+
this.element.sortable({handle: ".panel-heading"})
|
12
|
+
this.element.on("sortstop", this.stopped_sorting)
|
13
|
+
this.element.on("sortstart", this.started_sorting)
|
14
|
+
}
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
persist() {
|
17
|
+
let params = {}
|
18
|
+
params[this.singular_class_name] = {
|
19
|
+
"ordered_member_ids": this.order
|
19
20
|
}
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
}
|
26
|
-
params
|
27
|
-
|
28
|
-
this.element.
|
21
|
+
params["_method"] = "PATCH"
|
22
|
+
this.element.addClass("pending")
|
23
|
+
this.element.removeClass("success")
|
24
|
+
this.element.removeClass("failure")
|
25
|
+
let persisting = $.post(
|
26
|
+
`/concern/${this.class_name}/${this.id}.json`,
|
27
|
+
params
|
28
|
+
).done(() => {
|
29
|
+
this.element.data("current-order", this.order)
|
30
|
+
this.element.addClass("success")
|
29
31
|
this.element.removeClass("failure")
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
this.element.addClass("failure")
|
39
|
-
this.element.removeClass("success")
|
40
|
-
}).always(() => {
|
41
|
-
this.element.removeClass("pending")
|
42
|
-
})
|
43
|
-
return persisting
|
44
|
-
}
|
32
|
+
}).fail(() => {
|
33
|
+
this.element.addClass("failure")
|
34
|
+
this.element.removeClass("success")
|
35
|
+
}).always(() => {
|
36
|
+
this.element.removeClass("pending")
|
37
|
+
})
|
38
|
+
return persisting
|
39
|
+
}
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
|
41
|
+
get_sort_position(item) {
|
42
|
+
return this.element.children().index(item)
|
43
|
+
}
|
49
44
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
}
|
56
|
-
if(this.order.toString() != this.element.data("current-order").toString()) {
|
57
|
-
this.save_manager.push_changed(this)
|
58
|
-
} else {
|
59
|
-
this.save_manager.mark_unchanged(this)
|
60
|
-
}
|
45
|
+
get stopped_sorting() {
|
46
|
+
return (event, ui) => {
|
47
|
+
this.sorting_info.end = this.get_sort_position($(ui.item))
|
48
|
+
if(this.sorting_info.end == this.sorting_info.start) {
|
49
|
+
return
|
61
50
|
}
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
this.sorting_element = $(ui.item)
|
67
|
-
this.sorting_info.start = this.get_sort_position(ui.item)
|
51
|
+
if(this.order.toString() != this.element.data("current-order").toString()) {
|
52
|
+
this.save_manager.push_changed(this)
|
53
|
+
} else {
|
54
|
+
this.save_manager.mark_unchanged(this)
|
68
55
|
}
|
69
56
|
}
|
57
|
+
}
|
70
58
|
|
71
|
-
|
72
|
-
|
59
|
+
get started_sorting() {
|
60
|
+
return (event, ui) => {
|
61
|
+
this.sorting_element = $(ui.item)
|
62
|
+
this.sorting_info.start = this.get_sort_position(ui.item)
|
73
63
|
}
|
64
|
+
}
|
74
65
|
|
75
|
-
|
76
|
-
|
77
|
-
|
66
|
+
get id() {
|
67
|
+
return this.element.data("id")
|
68
|
+
}
|
78
69
|
|
79
|
-
|
80
|
-
|
81
|
-
|
70
|
+
get class_name() {
|
71
|
+
return this.element.data("class-name")
|
72
|
+
}
|
82
73
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
74
|
+
get singular_class_name() {
|
75
|
+
return this.element.data("singular-class-name")
|
76
|
+
}
|
77
|
+
|
78
|
+
get order() {
|
79
|
+
return $("*[data-reorder-id]").map(
|
80
|
+
function() {
|
81
|
+
return $(this).data("reorder-id")
|
82
|
+
}
|
83
|
+
).toArray()
|
90
84
|
}
|
91
85
|
}
|
@@ -197,7 +197,7 @@ module CurationConcerns
|
|
197
197
|
# search_field: 'all_fields'
|
198
198
|
# @return <Hash> the inputs required for the collection member search builder
|
199
199
|
def params_for_members_query
|
200
|
-
params.
|
200
|
+
params.merge(q: params[:cq])
|
201
201
|
end
|
202
202
|
|
203
203
|
def collection_member_search_builder
|
@@ -56,8 +56,6 @@ module CurationConcerns::CurationConcernController
|
|
56
56
|
wants.html { presenter && parent_presenter }
|
57
57
|
wants.json do
|
58
58
|
# load and authorize @curation_concern manually because it's skipped for html
|
59
|
-
# This has to use #find instead of #load_instance_from_solr because
|
60
|
-
# we want to return values like file_set_ids in the json
|
61
59
|
@curation_concern = _curation_concern_type.find(params[:id]) unless curation_concern
|
62
60
|
authorize! :show, @curation_concern
|
63
61
|
render :show, status: :ok
|
@@ -168,7 +166,9 @@ module CurationConcerns::CurationConcernController
|
|
168
166
|
end
|
169
167
|
|
170
168
|
def attributes_for_actor
|
171
|
-
|
169
|
+
raw_params = params[hash_key_for_curation_concern]
|
170
|
+
return unless raw_params
|
171
|
+
form_class.model_attributes(raw_params)
|
172
172
|
end
|
173
173
|
|
174
174
|
def hash_key_for_curation_concern
|
@@ -65,12 +65,7 @@ module CurationConcerns
|
|
65
65
|
def show
|
66
66
|
respond_to do |wants|
|
67
67
|
wants.html { presenter }
|
68
|
-
wants.json
|
69
|
-
# load and authorize @curation_concern manually because it's skipped for html
|
70
|
-
self.curation_concern ||= curation_concern_type.load_instance_from_solr(params[:id])
|
71
|
-
authorize! :show, curation_concern
|
72
|
-
render :show, status: :ok
|
73
|
-
end
|
68
|
+
wants.json { presenter }
|
74
69
|
additional_response_formats(wants)
|
75
70
|
end
|
76
71
|
end
|
@@ -115,7 +110,10 @@ module CurationConcerns
|
|
115
110
|
wants.html do
|
116
111
|
redirect_to [main_app, curation_concern], notice: "The file #{view_context.link_to(curation_concern, [main_app, curation_concern])} has been updated."
|
117
112
|
end
|
118
|
-
wants.json
|
113
|
+
wants.json do
|
114
|
+
@presenter = show_presenter.new(curation_concern, current_ability)
|
115
|
+
render :show, status: :ok, location: polymorphic_path([main_app, curation_concern])
|
116
|
+
end
|
119
117
|
end
|
120
118
|
end
|
121
119
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
module CurationConcerns
|
2
2
|
module SingleUseLinksControllerBehavior
|
3
3
|
extend ActiveSupport::Concern
|
4
|
+
include Blacklight::SearchHelper
|
4
5
|
included do
|
5
6
|
class_attribute :show_presenter
|
6
7
|
self.show_presenter = CurationConcerns::SingleUseLinkPresenter
|
@@ -18,12 +19,12 @@ module CurationConcerns
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def create_download
|
21
|
-
@su = SingleUseLink.create itemId: params[:id], path: main_app.download_path(id:
|
22
|
+
@su = SingleUseLink.create itemId: params[:id], path: main_app.download_path(id: params[:id])
|
22
23
|
render text: curation_concerns.download_single_use_link_url(@su.downloadKey)
|
23
24
|
end
|
24
25
|
|
25
26
|
def create_show
|
26
|
-
@su = SingleUseLink.create
|
27
|
+
@su = SingleUseLink.create(itemId: params[:id], path: asset_show_path)
|
27
28
|
render text: curation_concerns.show_single_use_link_url(@su.downloadKey)
|
28
29
|
end
|
29
30
|
|
@@ -40,11 +41,11 @@ module CurationConcerns
|
|
40
41
|
protected
|
41
42
|
|
42
43
|
def authorize_user!
|
43
|
-
authorize! :edit,
|
44
|
+
authorize! :edit, params[:id]
|
44
45
|
end
|
45
46
|
|
46
|
-
def
|
47
|
-
|
47
|
+
def asset_show_path
|
48
|
+
polymorphic_path([main_app, fetch(params[:id]).last])
|
48
49
|
end
|
49
50
|
end
|
50
51
|
end
|