sufia 4.0.1 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +247 -215
- data/README.md +7 -3
- data/SUFIA_VERSION +1 -1
- data/app/assets/javascripts/sufia.js +5 -2
- data/app/assets/javascripts/sufia/proxy_rights.js +68 -0
- data/app/assets/javascripts/sufia/transfers.js +3 -0
- data/app/assets/javascripts/sufia/user_search.js +31 -0
- data/app/assets/stylesheets/jquery-ui.css +17 -17
- data/app/assets/stylesheets/sufia.css.scss +3 -2
- data/app/assets/stylesheets/sufia/_proxy-rights.scss +10 -0
- data/app/controllers/concerns/sufia/contact_form_controller_behavior.rb +22 -23
- data/app/controllers/concerns/sufia/depositors_controller_behavior.rb +41 -0
- data/app/controllers/concerns/sufia/files_controller_behavior.rb +1 -0
- data/app/controllers/concerns/sufia/transfers_controller_behavior.rb +76 -0
- data/app/controllers/concerns/sufia/users_controller_behavior.rb +9 -11
- data/app/controllers/depositors_controller.rb +3 -0
- data/app/controllers/transfers_controller.rb +3 -0
- data/app/helpers/sufia/dashboard_helper_behavior.rb +15 -0
- data/app/helpers/sufia/sufia_helper_behavior.rb +24 -2
- data/app/jobs/content_depositor_change_event_job.rb +50 -0
- data/app/views/dashboard/_index_partials/_contents.html.erb +18 -0
- data/app/views/dashboard/_index_partials/_proxy_rights.html.erb +23 -0
- data/app/views/dashboard/_index_partials/_transfers.html.erb +14 -0
- data/app/views/generic_files/proxy.html.erb +5 -0
- data/app/views/generic_files/upload/_form.html.erb +7 -2
- data/app/views/my/_action_menu.html.erb +3 -1
- data/app/views/records/edit_fields/_default.html.erb +1 -1
- data/app/views/transfers/_received.html.erb +58 -0
- data/app/views/transfers/_sent.html.erb +38 -0
- data/app/views/transfers/index.html.erb +7 -0
- data/app/views/transfers/new.html.erb +23 -0
- data/app/views/users/_proxies.html.erb +8 -0
- data/app/views/users/_user_util_links_extra.html.erb +1 -0
- data/app/views/users/edit.html.erb +6 -1
- data/config/locales/sufia.en.yml +9 -4
- data/config/routes.rb +14 -3
- data/lib/sufia.rb +7 -5
- data/lib/sufia/version.rb +1 -1
- data/spec/controllers/authorities_controller_spec.rb +6 -6
- data/spec/controllers/batch_controller_spec.rb +29 -29
- data/spec/controllers/batch_edits_controller_spec.rb +7 -7
- data/spec/controllers/catalog_controller_spec.rb +9 -9
- data/spec/controllers/collections_controller_spec.rb +28 -28
- data/spec/controllers/content_blocks_controller_spec.rb +3 -3
- data/spec/controllers/dashboard_controller_spec.rb +1 -1
- data/spec/controllers/depositors_controller_spec.rb +50 -0
- data/spec/controllers/downloads_controller_spec.rb +22 -22
- data/spec/controllers/featured_work_lists_controller_spec.rb +1 -1
- data/spec/controllers/featured_works_controller_spec.rb +1 -1
- data/spec/controllers/generic_files_controller_spec.rb +98 -90
- data/spec/controllers/homepage_controller_spec.rb +1 -1
- data/spec/controllers/mailbox_controller_spec.rb +10 -10
- data/spec/controllers/my/collections_controller_spec.rb +1 -1
- data/spec/controllers/my/files_controller_spec.rb +1 -1
- data/spec/controllers/my/highlights_controller_spec.rb +1 -1
- data/spec/controllers/my/shares_controller_spec.rb +1 -1
- data/spec/controllers/my_controller_spec.rb +1 -1
- data/spec/controllers/pages_controller_spec.rb +1 -1
- data/spec/controllers/single_use_links_controller_spec.rb +46 -50
- data/spec/controllers/single_use_links_viewer_controller_spec.rb +16 -16
- data/spec/controllers/static_controller_spec.rb +9 -9
- data/spec/controllers/tinymce_assets_controller_spec.rb +1 -1
- data/spec/controllers/transfers_controller_spec.rb +212 -0
- data/spec/controllers/users_controller_spec.rb +1 -1
- data/spec/factories/generic_files.rb +4 -4
- data/spec/factories/proxy_deposit_requests.rb +6 -0
- data/spec/features/browse_dashboard_files_spec.rb +25 -36
- data/spec/features/browse_files_spec.rb +18 -13
- data/spec/features/catalog_search_spec.rb +3 -6
- data/spec/features/cloud_upload_spec.rb +5 -7
- data/spec/features/collection_spec.rb +28 -35
- data/spec/features/contact_form_spec.rb +24 -24
- data/spec/features/display_dashboard_spec.rb +11 -11
- data/spec/features/ingest_upload_files_spec.rb +10 -10
- data/spec/features/notifications_spec.rb +11 -11
- data/spec/features/ownership_transfer_spec.rb +111 -0
- data/spec/features/proxy_spec.rb +52 -0
- data/spec/features/search_spec.rb +1 -1
- data/spec/features/single_use_links_spec.rb +28 -18
- data/spec/features/users_spec.rb +3 -3
- data/spec/helpers/batch_edits_helper_spec.rb +1 -1
- data/spec/helpers/content_block_helper_spec.rb +1 -1
- data/spec/helpers/dashboard_helper_spec.rb +1 -1
- data/spec/helpers/generic_file_helper_spec.rb +1 -1
- data/spec/helpers/records_helper_spec.rb +1 -1
- data/spec/helpers/sufia_helper_spec.rb +8 -8
- data/spec/helpers/trophy_helper_spec.rb +1 -1
- data/spec/jobs/audit_job_spec.rb +5 -5
- data/spec/jobs/batch_update_job_spec.rb +14 -14
- data/spec/jobs/content_depositor_change_event_job_spec.rb +22 -0
- data/spec/jobs/event_jobs_spec.rb +104 -104
- data/spec/jobs/import_url_job_spec.rb +2 -2
- data/spec/jobs/ingest_local_file_job_spec.rb +1 -1
- data/spec/lib/sufia/breadcrumbs_spec.rb +3 -3
- data/spec/lib/sufia/id_service_spec.rb +1 -1
- data/spec/lib/sufia/upload_complete_behavior_spec.rb +4 -4
- data/spec/models/ability_spec.rb +59 -15
- data/spec/models/batch_spec.rb +16 -16
- data/spec/models/characterization_spec.rb +1 -1
- data/spec/models/checksum_audit_log_spec.rb +34 -26
- data/spec/models/collection_spec.rb +1 -1
- data/spec/models/download_spec.rb +1 -1
- data/spec/models/featured_work_list_spec.rb +1 -1
- data/spec/models/featured_work_spec.rb +15 -4
- data/spec/models/file_content_datastream_spec.rb +14 -14
- data/spec/models/file_usage_spec.rb +1 -1
- data/spec/models/fits_datastream_spec.rb +1 -1
- data/spec/models/generic_file/reload_on_save_spec.rb +4 -4
- data/spec/models/generic_file/visibility_spec.rb +1 -1
- data/spec/models/generic_file/web_form_spec.rb +6 -5
- data/spec/models/generic_file_rdf_datastream_spec.rb +1 -1
- data/spec/models/generic_file_spec.rb +254 -220
- data/spec/models/geo_names_resource_spec.rb +2 -2
- data/spec/models/local_authority_spec.rb +60 -59
- data/spec/models/pageview_spec.rb +1 -1
- data/spec/models/properties_datastream_spec.rb +29 -10
- data/spec/models/proxy_deposit_request_spec.rb +107 -0
- data/spec/models/single_use_link_spec.rb +13 -13
- data/spec/models/solr_document_spec.rb +1 -1
- data/spec/models/trophy_spec.rb +6 -6
- data/spec/models/user_spec.rb +38 -22
- data/spec/routing/featured_works_route_spec.rb +1 -1
- data/spec/routing/ownership_transfers_route_spec.rb +45 -0
- data/spec/routing/route_spec.rb +42 -42
- data/spec/services/noid_spec.rb +2 -2
- data/spec/spec_helper.rb +10 -5
- data/spec/support/cleaner.rb +12 -0
- data/spec/support/features.rb +5 -0
- data/spec/support/features/session_helpers.rb +3 -17
- data/spec/support/locations.rb +36 -0
- data/spec/support/poltergeist.rb +11 -0
- data/spec/support/proxies.rb +14 -0
- data/spec/support/selectors.rb +122 -0
- data/spec/views/batch/edit.html.erb_spec.rb +1 -1
- data/spec/views/batch_edits/check_all_spec.rb +4 -4
- data/spec/views/catalog/index.html.erb_spec.rb +1 -1
- data/spec/views/catalog/sort_and_per_page.html.erb_spec.rb +1 -1
- data/spec/views/collections/_form.html.erb_spec.rb +3 -1
- data/spec/views/collections/_show_descriptions.html.erb_spec.rb +1 -1
- data/spec/views/dashboard/index_spec.rb +3 -6
- data/spec/views/generic_file/edit.html.erb_spec.rb +1 -1
- data/spec/views/generic_file/show.html.erb_spec.rb +1 -1
- data/spec/views/generic_file/stats.html.erb_spec.rb +1 -1
- data/spec/views/my/facet.html.erb_spec.rb +2 -2
- data/spec/views/users/_follower_modal.html.erb_spec.rb +1 -1
- data/spec/views/users/_following_modal.html.erb_spec.rb +1 -1
- data/spec/views/users/_notify_number.html.erb_spec.rb +1 -1
- data/spec/views/users/_user_util_links.html.erb_spec.rb +1 -1
- data/spec/views/users/index.html.erb_spec.rb +2 -2
- data/spec/views/users/show.html.erb_spec.rb +2 -2
- data/sufia-models/app/models/concerns/sufia/ability.rb +22 -0
- data/sufia-models/app/models/concerns/sufia/generic_file.rb +1 -0
- data/sufia-models/app/models/concerns/sufia/generic_file/proxy_deposit.rb +22 -0
- data/sufia-models/app/models/concerns/sufia/properties_datastream_behavior.rb +3 -0
- data/sufia-models/app/models/concerns/sufia/user.rb +9 -0
- data/sufia-models/app/models/proxy_deposit_request.rb +85 -0
- data/sufia-models/app/models/proxy_deposit_rights.rb +4 -0
- data/sufia-models/app/models/sufia/avatar_uploader.rb +2 -3
- data/sufia-models/lib/generators/sufia/models/install_generator.rb +9 -1
- data/sufia-models/lib/generators/sufia/models/proxies_generator.rb +53 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_requests.rb +16 -0
- data/sufia-models/lib/generators/sufia/models/templates/migrations/create_proxy_deposit_rights.rb +11 -0
- data/sufia-models/lib/sufia/models/engine.rb +1 -1
- data/sufia-models/lib/sufia/models/version.rb +1 -1
- data/sufia.gemspec +2 -1
- data/tasks/sufia-dev.rake +5 -0
- metadata +82 -6
- data/tasks/sufia-db.rake +0 -21
data/README.md
CHANGED
@@ -32,7 +32,7 @@ Sufia has the following features:
|
|
32
32
|
* Full-text indexing & searching
|
33
33
|
* Responsive, fluid, Bootstrap 3-based UI
|
34
34
|
* Dynamically configurable featured works and researchers on homepage
|
35
|
-
* Proxy deposit and transfers of ownership
|
35
|
+
* Proxy deposit and transfers of ownership
|
36
36
|
|
37
37
|
## License
|
38
38
|
|
@@ -119,8 +119,8 @@ Turbolinks does not mix well with Blacklight.
|
|
119
119
|
|
120
120
|
#### Kaminari
|
121
121
|
|
122
|
-
The line with kaminari listed as a dependency in Gemfile is a temporary fix to address a
|
123
|
-
[problem](https://github.com/amatsuda/kaminari/pull/322) in the current release of kaminari.
|
122
|
+
The line with kaminari listed as a dependency in Gemfile is a temporary fix to address a
|
123
|
+
[problem](https://github.com/amatsuda/kaminari/pull/322) in the current release of kaminari.
|
124
124
|
Technically you should not have to list kaminari, which is a dependency of blacklight and sufia.
|
125
125
|
|
126
126
|
#### Bundler
|
@@ -139,6 +139,10 @@ Bundler could not find compatible versions for gem "bootstrap-sass":
|
|
139
139
|
|
140
140
|
The solution is to update your bundler gem to the latest version.
|
141
141
|
|
142
|
+
### Proxies and Transfers
|
143
|
+
|
144
|
+
To add proxies and transfers to your Sufia 4-based app, run the 'sufia:models:proxies' generator and then run 'rake db:migrate'.
|
145
|
+
|
142
146
|
### Analytics
|
143
147
|
|
144
148
|
Sufia provides support for capturing usage information via Google Analytics and for displaying usage stats in the UI.
|
data/SUFIA_VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
4.0
|
1
|
+
4.1.0
|
@@ -19,6 +19,7 @@
|
|
19
19
|
//= require jquery.validate
|
20
20
|
//= require swfobject
|
21
21
|
//= require ZeroClipboard.min
|
22
|
+
//= require select2
|
22
23
|
|
23
24
|
//= require flot/excanvas
|
24
25
|
//= require flot/jquery.flot
|
@@ -42,9 +43,13 @@
|
|
42
43
|
//= require sufia/editor
|
43
44
|
//= require sufia/ga_events
|
44
45
|
//= require sufia/tabs
|
46
|
+
//= require sufia/user_search
|
47
|
+
//= require sufia/transfers
|
48
|
+
//= require sufia/proxy_rights
|
45
49
|
//= require hydra/batch_select
|
46
50
|
//= require sufia/dashboard_actions
|
47
51
|
//= require sufia/batch
|
52
|
+
|
48
53
|
//= require hydra_collections
|
49
54
|
//= require browse_everything
|
50
55
|
//= require jquery.blacklightTagCloud
|
@@ -98,10 +103,8 @@ Blacklight.onLoad(function() {
|
|
98
103
|
});
|
99
104
|
};
|
100
105
|
|
101
|
-
|
102
106
|
$("a[rel=popover]").click(function() { return false;});
|
103
107
|
|
104
|
-
|
105
108
|
/*
|
106
109
|
* facets lists
|
107
110
|
*/
|
@@ -0,0 +1,68 @@
|
|
1
|
+
(function( $ ){
|
2
|
+
|
3
|
+
$.fn.proxyRights = function( options ) {
|
4
|
+
|
5
|
+
// Create some defaults, extending them with any options that were provided
|
6
|
+
var settings = $.extend( { }, options);
|
7
|
+
|
8
|
+
var $container = this;
|
9
|
+
|
10
|
+
function addContributor(name, id, grantor) {
|
11
|
+
data = {name: name, id: id}
|
12
|
+
|
13
|
+
$.ajax({
|
14
|
+
type: "POST",
|
15
|
+
url: '/users/'+grantor+'/depositors',
|
16
|
+
dataType: 'json',
|
17
|
+
data: {grantee_id: id},
|
18
|
+
success: function (data) {
|
19
|
+
if (data.name !== undefined) {
|
20
|
+
row = rowTemplate(data);
|
21
|
+
$('#authorizedProxies tbody', $container).append(row);
|
22
|
+
if (settings.afterAdd)
|
23
|
+
settings.afterAdd(this, cloneElem);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
})
|
27
|
+
return false;
|
28
|
+
}
|
29
|
+
|
30
|
+
function removeContributor(event) {
|
31
|
+
event.preventDefault();
|
32
|
+
$.ajax({
|
33
|
+
url: $(this).closest('a').prop('href'),
|
34
|
+
type: "post",
|
35
|
+
dataType: "json",
|
36
|
+
data: {"_method":"delete"}
|
37
|
+
});
|
38
|
+
$(this).closest('tr').remove();
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
|
42
|
+
function rowTemplate (data) {
|
43
|
+
return '<tr>'+
|
44
|
+
'<td class="depositor-name">'+data.name+'</td>'+
|
45
|
+
'<td><a class="remove-proxy-button" data-method="delete" href="'+data.delete_path+'" rel="nofollow">'+
|
46
|
+
'<i class="glyphicon glyphicon-remove"></i></a>'+
|
47
|
+
'</td>'+
|
48
|
+
'</tr>'
|
49
|
+
}
|
50
|
+
|
51
|
+
$("#user").userSearch();
|
52
|
+
$("#user").on("change", function() {
|
53
|
+
// Remove the choice from the select2 widget and put it in the table.
|
54
|
+
obj = $("#user").select2("data")
|
55
|
+
grantor = $('#user').data('grantor')
|
56
|
+
$("#user").select2("val", '')
|
57
|
+
addContributor(obj.text, obj.id, grantor);
|
58
|
+
});
|
59
|
+
|
60
|
+
$('body').on('click', 'a.remove-proxy-button', removeContributor);
|
61
|
+
|
62
|
+
};
|
63
|
+
|
64
|
+
})( jQuery );
|
65
|
+
|
66
|
+
Blacklight.onLoad(function() {
|
67
|
+
$('.proxy-rights').proxyRights();
|
68
|
+
});
|
@@ -0,0 +1,31 @@
|
|
1
|
+
(function( $ ){
|
2
|
+
|
3
|
+
$.fn.userSearch = function( options ) {
|
4
|
+
// Create some defaults, extending them with any options that were provided
|
5
|
+
var settings = $.extend( { }, options);
|
6
|
+
|
7
|
+
var $container = this;
|
8
|
+
|
9
|
+
return this.each(function() {
|
10
|
+
$(this).select2( {
|
11
|
+
placeholder: "Search for a user",
|
12
|
+
minimumInputLength: 2,
|
13
|
+
initSelection: function(element, callback) { },
|
14
|
+
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
|
15
|
+
url: "/users.json",
|
16
|
+
dataType: 'json',
|
17
|
+
data: function (term, page) {
|
18
|
+
return {
|
19
|
+
uq: term // search term
|
20
|
+
};
|
21
|
+
},
|
22
|
+
results: function (data, page) { // parse the results into the format expected by Select2.
|
23
|
+
// since we are using custom formatting functions we do not need to alter remote JSON data
|
24
|
+
return {results: data};
|
25
|
+
}
|
26
|
+
},
|
27
|
+
}).select2('data', null);
|
28
|
+
});
|
29
|
+
|
30
|
+
};
|
31
|
+
})( jQuery );
|
@@ -243,25 +243,25 @@ body .ui-tooltip { border-width: 2px; }
|
|
243
243
|
.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
|
244
244
|
.ui-widget .ui-widget { font-size: 1em; }
|
245
245
|
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
|
246
|
-
.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(
|
246
|
+
.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
|
247
247
|
.ui-widget-content a { color: #222222/*{fcContent}*/; }
|
248
|
-
.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(
|
248
|
+
.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
|
249
249
|
.ui-widget-header a { color: #222222/*{fcHeader}*/; }
|
250
250
|
|
251
251
|
/* Interaction states
|
252
252
|
----------------------------------*/
|
253
|
-
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(
|
253
|
+
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
|
254
254
|
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
|
255
|
-
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(
|
255
|
+
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
|
256
256
|
.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121/*{fcHover}*/; text-decoration: none; }
|
257
|
-
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(
|
257
|
+
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
|
258
258
|
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
|
259
259
|
|
260
260
|
/* Interaction Cues
|
261
261
|
----------------------------------*/
|
262
|
-
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(
|
262
|
+
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
|
263
263
|
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
|
264
|
-
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(
|
264
|
+
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
|
265
265
|
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
|
266
266
|
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
|
267
267
|
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
|
@@ -273,14 +273,14 @@ body .ui-tooltip { border-width: 2px; }
|
|
273
273
|
----------------------------------*/
|
274
274
|
|
275
275
|
/* states and images */
|
276
|
-
.ui-icon { width: 16px; height: 16px; background-image: url(
|
277
|
-
.ui-widget-content .ui-icon {background-image: url(
|
278
|
-
.ui-widget-header .ui-icon {background-image: url(
|
279
|
-
.ui-state-default .ui-icon { background-image: url(
|
280
|
-
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(
|
281
|
-
.ui-state-active .ui-icon {background-image: url(
|
282
|
-
.ui-state-highlight .ui-icon {background-image: url(
|
283
|
-
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(
|
276
|
+
.ui-icon { width: 16px; height: 16px; background-image: url(ui-icons_222222_256x240.png)/*{iconsContent}*/; }
|
277
|
+
.ui-widget-content .ui-icon {background-image: url(ui-icons_222222_256x240.png)/*{iconsContent}*/; }
|
278
|
+
.ui-widget-header .ui-icon {background-image: url(ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
|
279
|
+
.ui-state-default .ui-icon { background-image: url(ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
|
280
|
+
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(ui-icons_454545_256x240.png)/*{iconsHover}*/; }
|
281
|
+
.ui-state-active .ui-icon {background-image: url(ui-icons_454545_256x240.png)/*{iconsActive}*/; }
|
282
|
+
.ui-state-highlight .ui-icon {background-image: url(ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
|
283
|
+
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
|
284
284
|
|
285
285
|
/* positioning */
|
286
286
|
.ui-icon-carat-1-n { background-position: 0 0; }
|
@@ -470,5 +470,5 @@ body .ui-tooltip { border-width: 2px; }
|
|
470
470
|
.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
|
471
471
|
|
472
472
|
/* Overlays */
|
473
|
-
.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(
|
474
|
-
.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(
|
473
|
+
.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
|
474
|
+
.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
|
@@ -3,6 +3,7 @@
|
|
3
3
|
*= require generic_files
|
4
4
|
*= require video-js
|
5
5
|
*= require jquery-ui
|
6
|
+
*= require select2
|
6
7
|
*= require sufia-audio-overrides
|
7
8
|
*= require nestable
|
8
9
|
*/
|
@@ -14,7 +15,7 @@
|
|
14
15
|
// Use import here instead of require so we can use the Sass variables defined in Bootstrap and Blacklight
|
15
16
|
// TODO: Probably should use import throughout and move all of Sufia's stylesheets into a single named directory.
|
16
17
|
@import 'sufia/settings','sufia/header','sufia/styles','sufia/file-listing','sufia/collections','sufia/batch-edit',
|
17
|
-
'sufia/dashboard','sufia/home-page','sufia/featured','sufia/tagcloud','sufia/usage-stats','sufia/catalog','sufia/buttons';
|
18
|
+
'sufia/dashboard','sufia/home-page','sufia/featured','sufia/tagcloud','sufia/usage-stats','sufia/catalog','sufia/buttons','sufia/proxy-rights';
|
18
19
|
|
19
20
|
#browse-everything {
|
20
21
|
top:10%;
|
@@ -48,4 +49,4 @@
|
|
48
49
|
|
49
50
|
.button_to-inline {
|
50
51
|
display: inline-block;
|
51
|
-
}
|
52
|
+
}
|
@@ -1,31 +1,30 @@
|
|
1
1
|
module Sufia
|
2
2
|
module ContactFormControllerBehavior
|
3
|
+
def new
|
4
|
+
@contact_form = ContactForm.new
|
5
|
+
end
|
3
6
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
flash[:error]
|
7
|
+
def create
|
8
|
+
@contact_form = ContactForm.new(params[:contact_form])
|
9
|
+
@contact_form.request = request
|
10
|
+
# not spam and a valid form
|
11
|
+
logger.warn "*** MARK ***"
|
12
|
+
if @contact_form.deliver
|
13
|
+
flash.now[:notice] = 'Thank you for your message!'
|
14
|
+
after_deliver
|
15
|
+
render :new
|
16
|
+
else
|
17
|
+
flash.now[:error] = 'Sorry, this message was not sent successfully. '
|
18
|
+
flash.now[:error] << @contact_form.errors.full_messages.map(&:to_s).join(",")
|
19
|
+
render :new
|
20
|
+
end
|
21
|
+
rescue
|
22
|
+
flash.now[:error] = 'Sorry, this message was not delivered.'
|
20
23
|
render :new
|
21
24
|
end
|
22
|
-
rescue
|
23
|
-
flash[:error] = 'Sorry, this message was not delivered.'
|
24
|
-
render :new
|
25
|
-
end
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
def after_deliver
|
27
|
+
return unless Sufia::Engine.config.enable_contact_form_delivery
|
28
|
+
end
|
30
29
|
end
|
31
30
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Sufia
|
2
|
+
module DepositorsControllerBehavior
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
before_filter :authenticate_user!
|
7
|
+
before_filter :validate_users, only: :create
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
grantor = authorize_and_return_grantor
|
12
|
+
grantee = ::User.from_url_component(params[:grantee_id])
|
13
|
+
if grantor.can_receive_deposits_from.include?(grantee)
|
14
|
+
head :ok
|
15
|
+
else
|
16
|
+
grantor.can_receive_deposits_from << grantee
|
17
|
+
render json: { name: grantee.name, delete_path: sufia.user_depositor_path(grantor.user_key, grantee.user_key) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def destroy
|
22
|
+
grantor = authorize_and_return_grantor
|
23
|
+
grantor.can_receive_deposits_from.delete(::User.from_url_component(params[:id]))
|
24
|
+
head :ok
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate_users
|
28
|
+
if params[:user_id] == params[:grantee_id]
|
29
|
+
head :ok
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def authorize_and_return_grantor
|
36
|
+
grantor = ::User.from_url_component(params[:user_id])
|
37
|
+
authorize! :edit, grantor
|
38
|
+
return grantor
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -211,6 +211,7 @@ module Sufia
|
|
211
211
|
def update_metadata_from_upload_screen
|
212
212
|
# Relative path is set by the jquery uploader when uploading a directory
|
213
213
|
@generic_file.relative_path = params[:relative_path] if params[:relative_path]
|
214
|
+
@generic_file.on_behalf_of = params[:on_behalf_of] if params[:on_behalf_of]
|
214
215
|
end
|
215
216
|
end
|
216
217
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Sufia
|
2
|
+
module TransfersControllerBehavior
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
before_action :load_proxy_deposit_request, only: :create
|
7
|
+
load_and_authorize_resource :proxy_deposit_request, parent: false, except: :index
|
8
|
+
before_action :get_pid_and_authorize_depositor, only: [:new, :create]
|
9
|
+
# Catch permission errors
|
10
|
+
# TODO we should make this a module in Sufia
|
11
|
+
rescue_from CanCan::AccessDenied do |exception|
|
12
|
+
if current_user and current_user.persisted?
|
13
|
+
redirect_to root_url, alert: exception.message
|
14
|
+
else
|
15
|
+
session["user_return_to"] = request.url
|
16
|
+
redirect_to new_user_session_url, alert: exception.message
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def new
|
22
|
+
@generic_file = ::GenericFile.load_instance_from_solr(@pid)
|
23
|
+
end
|
24
|
+
|
25
|
+
def create
|
26
|
+
@proxy_deposit_request.sending_user = current_user
|
27
|
+
if @proxy_deposit_request.save
|
28
|
+
redirect_to sufia.transfers_path, notice: "Transfer request created"
|
29
|
+
else
|
30
|
+
redirect_to root_url, alert: @proxy_deposit_request.errors.full_messages.to_sentence
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def index
|
35
|
+
@incoming = ProxyDepositRequest.where(receiving_user_id: current_user.id).reject &:deleted_file?
|
36
|
+
@outgoing = ProxyDepositRequest.where(sending_user_id: current_user.id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def accept
|
40
|
+
@proxy_deposit_request.transfer!(params[:reset])
|
41
|
+
if params[:sticky]
|
42
|
+
current_user.can_receive_deposits_from << @proxy_deposit_request.sending_user
|
43
|
+
end
|
44
|
+
redirect_to sufia.transfers_path, notice: "Transfer complete"
|
45
|
+
end
|
46
|
+
|
47
|
+
def reject
|
48
|
+
@proxy_deposit_request.reject!
|
49
|
+
redirect_to sufia.transfers_path, notice: "Transfer rejected"
|
50
|
+
end
|
51
|
+
|
52
|
+
def destroy
|
53
|
+
@proxy_deposit_request.cancel!
|
54
|
+
redirect_to sufia.transfers_path, notice: "Transfer canceled"
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def get_pid_and_authorize_depositor
|
60
|
+
@pid = Sufia::Noid.namespaceize(params[:id])
|
61
|
+
authorize! :edit, @pid
|
62
|
+
raise Hydra::AccessDenied unless ::GenericFile.load_instance_from_solr(@pid).depositor == current_user.user_key
|
63
|
+
@proxy_deposit_request.pid = @pid
|
64
|
+
rescue
|
65
|
+
redirect_to root_url, alert: 'You are not authorized to transfer this file'
|
66
|
+
end
|
67
|
+
|
68
|
+
def load_proxy_deposit_request
|
69
|
+
@proxy_deposit_request = ProxyDepositRequest.new(proxy_deposit_request_params)
|
70
|
+
end
|
71
|
+
|
72
|
+
def proxy_deposit_request_params
|
73
|
+
params.require(:proxy_deposit_request).permit(:transfer_to)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|