worthwhile 0.0.1.alpha → 0.0.1

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.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rspec +1 -0
  4. data/.travis.yml +19 -0
  5. data/Gemfile +7 -11
  6. data/README.md +8 -12
  7. data/Rakefile +17 -2
  8. data/app/actors/concerns/worthwhile/manages_embargoes_actor.rb +79 -0
  9. data/app/actors/curation_concern/base_actor.rb +68 -0
  10. data/app/actors/curation_concern/generic_file_actor.rb +40 -0
  11. data/app/actors/curation_concern/generic_work_actor.rb +92 -0
  12. data/app/actors/curation_concern/linked_resource_actor.rb +4 -0
  13. data/app/assets/images/default.png +0 -0
  14. data/app/assets/images/nope.png +0 -0
  15. data/app/assets/javascripts/.gitkeep +0 -0
  16. data/app/assets/javascripts/modernizr.js +3 -0
  17. data/app/assets/javascripts/worthwhile/.gitkeep +0 -0
  18. data/app/assets/javascripts/worthwhile/accept_contributor_agreement.js +15 -0
  19. data/app/assets/javascripts/worthwhile/application.js +18 -0
  20. data/app/assets/javascripts/worthwhile/browse_everything_implement.js +7 -0
  21. data/app/assets/javascripts/worthwhile/embargoes.js +17 -0
  22. data/app/assets/javascripts/worthwhile/facet_mine.js +22 -0
  23. data/app/assets/javascripts/worthwhile/help_modal.js +36 -0
  24. data/app/assets/javascripts/worthwhile/link_groups.js.coffee +123 -0
  25. data/app/assets/javascripts/worthwhile/link_users.js.coffee +126 -0
  26. data/app/assets/javascripts/worthwhile/manage_repeating_fields.js +74 -0
  27. data/app/assets/javascripts/worthwhile/proxy_rights.js.coffee +95 -0
  28. data/app/assets/javascripts/worthwhile/proxy_submission.js +23 -0
  29. data/app/assets/javascripts/worthwhile/select_works.js.coffee +20 -0
  30. data/app/assets/javascripts/worthwhile/worthwhile.js +45 -0
  31. data/app/assets/stylesheets/worthwhile.css.scss +23 -0
  32. data/app/assets/stylesheets/worthwhile/_global-variables.css.scss +5 -0
  33. data/app/assets/stylesheets/worthwhile/_modules.css.scss +14 -0
  34. data/app/assets/stylesheets/worthwhile/_positioning.css.scss +138 -0
  35. data/app/assets/stylesheets/worthwhile/_theme.css.scss +46 -0
  36. data/app/assets/stylesheets/worthwhile/_typography.css.scss +142 -0
  37. data/app/assets/stylesheets/worthwhile/_variables_bootstrap.css.scss +7 -0
  38. data/app/assets/stylesheets/worthwhile/_worthwhile.css.scss +7 -0
  39. data/app/assets/stylesheets/worthwhile/downloads.css.scss +3 -0
  40. data/app/assets/stylesheets/worthwhile/help_requests.css.scss +3 -0
  41. data/app/assets/stylesheets/worthwhile/modules/accessibility.css.scss +50 -0
  42. data/app/assets/stylesheets/worthwhile/modules/accordion.css.scss +33 -0
  43. data/app/assets/stylesheets/worthwhile/modules/attributes.css.scss +26 -0
  44. data/app/assets/stylesheets/worthwhile/modules/classify_work.css.scss +100 -0
  45. data/app/assets/stylesheets/worthwhile/modules/collections.css.scss +42 -0
  46. data/app/assets/stylesheets/worthwhile/modules/embargoes.css.scss +15 -0
  47. data/app/assets/stylesheets/worthwhile/modules/emphatic_action_area.css.scss +14 -0
  48. data/app/assets/stylesheets/worthwhile/modules/forms.css.scss +116 -0
  49. data/app/assets/stylesheets/worthwhile/modules/multi_value_fields.css.scss +52 -0
  50. data/app/assets/stylesheets/worthwhile/modules/pagination.css.scss +4 -0
  51. data/app/assets/stylesheets/worthwhile/modules/search_results.css.scss +55 -0
  52. data/app/assets/stylesheets/worthwhile/modules/site_actions.css.scss +53 -0
  53. data/app/assets/stylesheets/worthwhile/modules/site_search.css.scss +46 -0
  54. data/app/controllers/catalog_controller.rb +3 -0
  55. data/app/controllers/collections_controller.rb +59 -0
  56. data/app/controllers/concerns/worthwhile/application_controller_behavior.rb +23 -0
  57. data/app/controllers/concerns/worthwhile/catalog_controller.rb +347 -0
  58. data/app/controllers/concerns/worthwhile/curation_concern_controller.rb +131 -0
  59. data/app/controllers/concerns/worthwhile/files_controller.rb +149 -0
  60. data/app/controllers/concerns/worthwhile/manages_embargoes.rb +22 -0
  61. data/app/controllers/concerns/worthwhile/parent_container.rb +31 -0
  62. data/app/controllers/concerns/worthwhile/themed_layout_controller.rb +31 -0
  63. data/app/controllers/concerns/worthwhile/without_namespace.rb +15 -0
  64. data/app/controllers/curation_concern/generic_files_controller.rb +6 -0
  65. data/app/controllers/curation_concern/generic_works_controller.rb +6 -0
  66. data/app/controllers/curation_concern/linked_resources_controller.rb +68 -0
  67. data/app/controllers/curation_concern/permissions_controller.rb +19 -0
  68. data/app/controllers/downloads_controller.rb +4 -0
  69. data/app/controllers/embargoes_controller.rb +44 -0
  70. data/app/controllers/leases_controller.rb +34 -0
  71. data/app/controllers/registrations_controller.rb +20 -0
  72. data/app/controllers/sessions_controller.rb +4 -0
  73. data/app/controllers/worthwhile/application_controller.rb +7 -0
  74. data/app/controllers/worthwhile/classify_concerns_controller.rb +35 -0
  75. data/app/datastreams/generic_work_metadata.rb +3 -0
  76. data/app/datastreams/worthwhile/generic_work_rdf_properties.rb +57 -0
  77. data/app/datastreams/worthwhile/properties_datastream.rb +28 -0
  78. data/app/helpers/curate/collections_helper.rb +133 -0
  79. data/app/helpers/worthwhile/ability_helper.rb +46 -0
  80. data/app/helpers/worthwhile/attribute_helper.rb +67 -0
  81. data/app/helpers/worthwhile/catalog_helper.rb +38 -0
  82. data/app/helpers/worthwhile/collections_helper.rb +19 -0
  83. data/app/helpers/worthwhile/embargo_helper.rb +17 -0
  84. data/app/helpers/worthwhile/generic_file_helper.rb +19 -0
  85. data/app/helpers/worthwhile/lease_helper.rb +18 -0
  86. data/app/helpers/worthwhile/main_app_helpers.rb +14 -0
  87. data/app/helpers/worthwhile/render_constraints_helper.rb +42 -0
  88. data/app/helpers/worthwhile/search_paths_helper.rb +13 -0
  89. data/app/helpers/worthwhile/thumbnail_helper.rb +11 -0
  90. data/app/helpers/worthwhile/title_helper.rb +23 -0
  91. data/app/helpers/worthwhile/url_helper.rb +16 -0
  92. data/app/inputs/multi_value_input.rb +72 -0
  93. data/app/models/collection.rb +15 -0
  94. data/app/models/concerns/curation_concern/collection_model.rb +62 -0
  95. data/app/models/concerns/curation_concern/curatable.rb +77 -0
  96. data/app/models/concerns/curation_concern/has_representative.rb +14 -0
  97. data/app/models/concerns/curation_concern/human_readable_type.rb +23 -0
  98. data/app/models/concerns/curation_concern/with_basic_metadata.rb +49 -0
  99. data/app/models/concerns/curation_concern/with_editors.rb +44 -0
  100. data/app/models/concerns/curation_concern/with_generic_files.rb +23 -0
  101. data/app/models/concerns/curation_concern/with_linked_resources.rb +21 -0
  102. data/app/models/concerns/curation_concern/work.rb +24 -0
  103. data/app/models/concerns/worthwhile/ability.rb +34 -0
  104. data/app/models/concerns/worthwhile/generic_file/versioned_content.rb +18 -0
  105. data/app/models/concerns/worthwhile/generic_file_base.rb +64 -0
  106. data/app/models/concerns/worthwhile/solr_document_behavior.rb +140 -0
  107. data/app/models/generic_work.rb +5 -0
  108. data/app/models/worthwhile/classify_concern.rb +47 -0
  109. data/app/models/worthwhile/content_version.rb +23 -0
  110. data/app/models/worthwhile/contributor_agreement.rb +23 -0
  111. data/app/models/worthwhile/generic_file.rb +5 -0
  112. data/app/models/worthwhile/linked_resource.rb +41 -0
  113. data/app/models/worthwhile/quick_classification_query.rb +31 -0
  114. data/app/services/worthwhile/curation_concern.rb +21 -0
  115. data/app/services/worthwhile/embargo_service.rb +26 -0
  116. data/app/services/worthwhile/lease_service.rb +23 -0
  117. data/app/views/catalog/_action_menu_partials/_collection.html.erb +27 -0
  118. data/app/views/catalog/_action_menu_partials/_default.html.erb +27 -0
  119. data/app/views/catalog/_document.html.erb +3 -0
  120. data/app/views/catalog/_document_list.html.erb +5 -0
  121. data/app/views/catalog/_home_text.html.erb +8 -0
  122. data/app/views/catalog/_index_default.html.erb +17 -0
  123. data/app/views/catalog/_index_header_list_default.html.erb +17 -0
  124. data/app/views/catalog/_navbar.html.erb +12 -0
  125. data/app/views/catalog/_show_partials/_default.html.erb +22 -0
  126. data/app/views/catalog/_show_partials/_default_details.html.erb +15 -0
  127. data/app/views/catalog/_show_partials/_facets.html.erb +52 -0
  128. data/app/views/catalog/index.html.erb +48 -0
  129. data/app/views/collections/_batch_edits_actions.html.erb +3 -0
  130. data/app/views/collections/_button_for_creating_empty_collection.html.erb +3 -0
  131. data/app/views/collections/_collection.html.erb +1 -0
  132. data/app/views/collections/_dashboard_document_list.html.erb +6 -0
  133. data/app/views/collections/_document_list.html.erb +7 -0
  134. data/app/views/collections/_edit_actions.html.erb +5 -0
  135. data/app/views/collections/_edit_descriptions.html.erb +20 -0
  136. data/app/views/collections/_form.html.erb +26 -0
  137. data/app/views/collections/_form_for_select_collection.html.erb +34 -0
  138. data/app/views/collections/_form_permission.html.erb +36 -0
  139. data/app/views/collections/_form_required_information.html.erb +11 -0
  140. data/app/views/collections/_identifier_and_action.html.erb +15 -0
  141. data/app/views/collections/_media_display.html.erb +1 -0
  142. data/app/views/collections/_paginate.html.erb +6 -0
  143. data/app/views/collections/_search_collection_dashboard_form.html.erb +10 -0
  144. data/app/views/collections/_show_actions.html.erb +8 -0
  145. data/app/views/collections/_show_descriptions.html.erb +10 -0
  146. data/app/views/collections/_show_fields.html.erb +0 -0
  147. data/app/views/collections/_single_item_action_fields.html.erb +6 -0
  148. data/app/views/collections/_sort_and_per_page.html.erb +29 -0
  149. data/app/views/collections/_view_type_group.html.erb +13 -0
  150. data/app/views/collections/edit.html.erb +22 -0
  151. data/app/views/collections/new.html.erb +15 -0
  152. data/app/views/collections/show.html.erb +24 -0
  153. data/app/views/curate/collections/_add_to_collection_modal.html.erb +15 -0
  154. data/app/views/curate/collections/_button_remove_from_collection.html.erb +6 -0
  155. data/app/views/curate/collections/_form_to_add_member.html.erb +27 -0
  156. data/app/views/curate/collections/add_member_form.html.erb +6 -0
  157. data/app/views/curation_concern/base/_attributes.html.erb +25 -0
  158. data/app/views/curation_concern/base/_collections.html.erb +26 -0
  159. data/app/views/curation_concern/base/_form.html.erb +27 -0
  160. data/app/views/curation_concern/base/_form_additional_information.html.erb +9 -0
  161. data/app/views/curation_concern/base/_form_content_license.html.erb +16 -0
  162. data/app/views/curation_concern/base/_form_contributor_agreement.html.erb +29 -0
  163. data/app/views/curation_concern/base/_form_descriptive_fields.erb +23 -0
  164. data/app/views/curation_concern/base/_form_files_and_links.html.erb +29 -0
  165. data/app/views/curation_concern/base/_form_permission.html.erb +52 -0
  166. data/app/views/curation_concern/base/_form_permission_embargo.html.erb +6 -0
  167. data/app/views/curation_concern/base/_form_permission_lease.html.erb +6 -0
  168. data/app/views/curation_concern/base/_form_permission_under_embargo.html.erb +16 -0
  169. data/app/views/curation_concern/base/_form_permission_under_lease.html.erb +18 -0
  170. data/app/views/curation_concern/base/_form_representative_image.html.erb +13 -0
  171. data/app/views/curation_concern/base/_form_required_information.html.erb +11 -0
  172. data/app/views/curation_concern/base/_form_supplementary_fields.html.erb +15 -0
  173. data/app/views/curation_concern/base/_legally_binding_text.html.erb +33 -0
  174. data/app/views/curation_concern/base/_related_files.html.erb +24 -0
  175. data/app/views/curation_concern/base/_related_resources.html.erb +40 -0
  176. data/app/views/curation_concern/base/_representative_media.html.erb +8 -0
  177. data/app/views/curation_concern/base/edit.html.erb +15 -0
  178. data/app/views/curation_concern/base/new.html.erb +14 -0
  179. data/app/views/curation_concern/base/show.html.erb +32 -0
  180. data/app/views/curation_concern/base/unauthorized.html.erb +3 -0
  181. data/app/views/curation_concern/generic_files/_form.html.erb +35 -0
  182. data/app/views/curation_concern/generic_files/_media_display.html.erb +20 -0
  183. data/app/views/curation_concern/generic_files/edit.html.erb +5 -0
  184. data/app/views/curation_concern/generic_files/show.html.erb +15 -0
  185. data/app/views/curation_concern/generic_works/_generic_work.html.erb +3 -0
  186. data/app/views/curation_concern/linked_resources/_form.html.erb +11 -0
  187. data/app/views/curation_concern/linked_resources/edit.html.erb +5 -0
  188. data/app/views/curation_concern/linked_resources/new.html.erb +5 -0
  189. data/app/views/curation_concern/permissions/confirm.html.erb +13 -0
  190. data/app/views/curation_concern/worthwhile/generic_files/_actions.html.erb +16 -0
  191. data/app/views/curation_concern/worthwhile/generic_files/_generic_file.html.erb +12 -0
  192. data/app/views/embargoes/_embargo_history.html.erb +7 -0
  193. data/app/views/embargoes/_list_active_embargoes.html.erb +16 -0
  194. data/app/views/embargoes/_list_deactivated_embargoes.html.erb +10 -0
  195. data/app/views/embargoes/_list_expired_active_embargoes.html.erb +44 -0
  196. data/app/views/embargoes/edit.html.erb +43 -0
  197. data/app/views/embargoes/index.html.erb +18 -0
  198. data/app/views/layouts/boilerplate.html.erb +22 -0
  199. data/app/views/layouts/common_objects.html.erb +36 -0
  200. data/app/views/layouts/curate_nd.html.erb +33 -0
  201. data/app/views/layouts/curate_nd/1_column.html.erb +22 -0
  202. data/app/views/layouts/curate_nd/2_column.html.erb +26 -0
  203. data/app/views/layouts/curate_nd/catalog.html.erb +38 -0
  204. data/app/views/layouts/curate_nd/dashboard.html.erb +22 -0
  205. data/app/views/leases/_lease_history.html.erb +7 -0
  206. data/app/views/leases/_list_active_leases.html.erb +16 -0
  207. data/app/views/leases/_list_deactivated_leases.html.erb +4 -0
  208. data/app/views/leases/_list_expired_active_leases.html.erb +38 -0
  209. data/app/views/leases/edit.html.erb +43 -0
  210. data/app/views/leases/index.html.erb +18 -0
  211. data/app/views/shared/_add_content.html.erb +32 -0
  212. data/app/views/shared/_brand_bar.html.erb +10 -0
  213. data/app/views/shared/_flash_message.html.erb +17 -0
  214. data/app/views/shared/_footer.html.erb +10 -0
  215. data/app/views/shared/_ga.html.erb +6 -0
  216. data/app/views/shared/_header.html.erb +12 -0
  217. data/app/views/shared/_my_actions.html.erb +21 -0
  218. data/app/views/shared/_site_actions.html.erb +7 -0
  219. data/app/views/shared/_site_search.html.erb +12 -0
  220. data/app/views/shared/_title_bar.html.erb +16 -0
  221. data/app/views/worthwhile/classify_concerns/new.html.erb +27 -0
  222. data/app/workers/visibility_copy_worker.rb +29 -0
  223. data/config/initializers/simple_form.rb +31 -0
  224. data/config/locales/sufia.en.yml +26 -0
  225. data/config/locales/worthwhile.en.yml +68 -0
  226. data/config/routes.rb +4 -0
  227. data/lib/generators/worthwhile/install_generator.rb +74 -0
  228. data/lib/generators/worthwhile/templates/worthwhile.css.scss +3 -0
  229. data/lib/generators/worthwhile/templates/worthwhile.js +1 -0
  230. data/lib/generators/worthwhile/templates/worthwhile_config.rb +3 -0
  231. data/lib/generators/worthwhile/templates/worthwhile_helper.rb +4 -0
  232. data/lib/worthwhile.rb +3 -1
  233. data/lib/worthwhile/configuration.rb +74 -0
  234. data/lib/worthwhile/controller_resource.rb +10 -0
  235. data/lib/worthwhile/engine.rb +20 -0
  236. data/lib/worthwhile/rails/routes.rb +78 -0
  237. data/lib/worthwhile/spec_support.rb +10 -0
  238. data/lib/worthwhile/version.rb +1 -1
  239. data/spec/abilities/generic_file_abilities_spec.rb +62 -0
  240. data/spec/abilities/generic_work_abilities_spec.rb +58 -0
  241. data/spec/actors/curation_concern/generic_work_actor_spec.rb +215 -0
  242. data/spec/actors/curation_concern/linked_resource_actor_spec.rb +36 -0
  243. data/spec/actors/worthwile/manages_embargoes_actor_spec.rb +95 -0
  244. data/spec/controllers/catalog_controller_spec.rb +114 -0
  245. data/spec/controllers/collections_controller_spec.rb +216 -0
  246. data/spec/controllers/curation_concern/generic_files_controller_spec.rb +258 -0
  247. data/spec/controllers/curation_concern/generic_works_controller_spec.rb +171 -0
  248. data/spec/controllers/curation_concern/linked_resources_controller_spec.rb +123 -0
  249. data/spec/controllers/curation_concern/permissions_controller_spec.rb +29 -0
  250. data/spec/controllers/downloads_controller_spec.rb +53 -0
  251. data/spec/controllers/embargoes_controller_spec.rb +107 -0
  252. data/spec/controllers/leases_controller_spec.rb +95 -0
  253. data/spec/controllers/worthwhile/classify_concerns_controller_spec.rb +35 -0
  254. data/spec/factories/collections_factory.rb +21 -0
  255. data/spec/factories/create_curation_concern.rb +3 -0
  256. data/spec/factories/generic_files.rb +18 -0
  257. data/spec/factories/generic_works.rb +37 -0
  258. data/spec/factories/linked_resources_factory.rb +18 -0
  259. data/spec/factories/users.rb +15 -0
  260. data/spec/features/add_external_link_spec.rb +25 -0
  261. data/spec/features/add_file_spec.rb +28 -0
  262. data/spec/features/collection_spec.rb +238 -0
  263. data/spec/features/embargo_spec.rb +45 -0
  264. data/spec/features/lease_spec.rb +43 -0
  265. data/spec/features/update_file_spec.rb +28 -0
  266. data/spec/fixtures/files/image.png +0 -0
  267. data/spec/helpers/catalog_helper_spec.rb +58 -0
  268. data/spec/helpers/configuration_helper_spec.rb +13 -0
  269. data/spec/helpers/render_constraints_helper_spec.rb +19 -0
  270. data/spec/helpers/thumbnail_helper_spec.rb +21 -0
  271. data/spec/helpers/url_helper_spec.rb +19 -0
  272. data/spec/matchers.rb +24 -0
  273. data/spec/matchers/metadata_field_matchers.rb +28 -0
  274. data/spec/models/collection_spec.rb +136 -0
  275. data/spec/models/curation_concern/collection_model_spec.rb +50 -0
  276. data/spec/models/curation_concern/work_spec.rb +30 -0
  277. data/spec/models/generic_work_spec.rb +24 -0
  278. data/spec/models/worthwhile/content_version_spec.rb +27 -0
  279. data/spec/models/worthwhile/generic_file_spec.rb +77 -0
  280. data/spec/models/worthwhile/linked_resource_spec.rb +76 -0
  281. data/spec/routing/worthwhile/routes_spec.rb +23 -0
  282. data/spec/services/embargo_service_spec.rb +38 -0
  283. data/spec/services/lease_service_spec.rb +37 -0
  284. data/spec/spec_helper.rb +30 -5
  285. data/spec/support/controllers/engine_helpers.rb +7 -0
  286. data/spec/support/curation_concern/factory_helpers.rb +14 -0
  287. data/spec/support/features.rb +19 -0
  288. data/spec/support/features/fixture_file_upload.rb +14 -0
  289. data/spec/support/features/session_helpers.rb +41 -0
  290. data/spec/support/shared/shared_examples_has_dc_metadata.rb +17 -0
  291. data/spec/support/shared/shared_examples_is_a_curation_concern_model.rb +40 -0
  292. data/spec/support/shared/shared_examples_is_embargoable.rb +8 -0
  293. data/spec/support/shared/shared_examples_with_access_rights.rb +63 -0
  294. data/spec/test_app_templates/lib/generators/test_app_generator.rb +8 -29
  295. data/spec/views/curation_concern/base/_attributes.html.erb_spec.rb +25 -0
  296. data/spec/views/curation_concern/base/show.html.erb_spec.rb +25 -0
  297. data/spec/views/shared/_add_content.html.erb_spec.rb +42 -0
  298. data/spec/views/shared/_my_actions.html.erb_spec.rb +23 -0
  299. data/spec/workers/visibility_copy_worker_spec.rb +68 -0
  300. data/vendor/assets/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  301. data/vendor/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  302. data/vendor/assets/javascripts/handlebars.js +2278 -0
  303. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.autocomplete.js +602 -0
  304. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.core.js +356 -0
  305. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect-highlight.js +50 -0
  306. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.effect.js +1276 -0
  307. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.menu.js +610 -0
  308. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.position.js +498 -0
  309. data/vendor/assets/javascripts/jquery-ui-1.9.2/jquery.ui.widget.js +528 -0
  310. data/vendor/assets/javascripts/jquery.tokeninput.js +1061 -0
  311. data/vendor/assets/stylesheets/jquery-ui-lightness.css +474 -0
  312. data/vendor/assets/stylesheets/token-input-facebook.css +122 -0
  313. data/vendor/assets/stylesheets/token-input-mac.css +204 -0
  314. data/vendor/assets/stylesheets/token-input.css +127 -0
  315. data/worthwhile.gemspec +9 -3
  316. metadata +469 -9
@@ -0,0 +1,67 @@
1
+ module Worthwhile
2
+ module AttributeHelper
3
+
4
+ # If options[:catalog_search_link] is false,
5
+ # it will return the attribute value as text.
6
+ # If options[:catalog_search_link] is true,
7
+ # it will return a link to a catalog search for that text.
8
+ #
9
+ # If the method_name of the attribute is different than
10
+ # how the attribute name should appear on the search URL,
11
+ # you can explicitly set the URL's search field name using
12
+ # options[:search_field].
13
+ def curation_concern_attribute_to_html(curation_concern, method_name, label = nil, options = {})
14
+ if curation_concern.respond_to?(method_name)
15
+ markup = ""
16
+ label ||= derived_label_for(curation_concern, method_name)
17
+ subject = curation_concern.send(method_name)
18
+ return markup if !subject.present? && !options[:include_empty]
19
+ markup << %(<tr><th>#{label}</th>\n<td><ul class='tabular'>)
20
+ [subject].flatten.compact.each do |value|
21
+ if method_name == :rights
22
+ # Special treatment for license/rights. A URL from the Sufia gem's config/sufia.rb is stored in the descMetadata of the
23
+ # curation_concern. If that URL is valid in form, then it is used as a link. If it is not valid, it is used as plain text.
24
+ parsedUri = URI.parse(value) rescue nil
25
+ if parsedUri.nil?
26
+ markup << %(<li class="attribute #{method_name}">#{h(value)}</li>\n)
27
+ else
28
+ markup << %(<li class="attribute #{method_name}"><a href=#{h(value)} target="_blank"> #{h(Sufia.config.cc_licenses_reverse[value])}</a></li>\n)
29
+ end
30
+ else
31
+ search_field = options[:search_field] || method_name
32
+ li_value = link_to_if(options[:catalog_search_link], h(value), catalog_index_path(search_field: search_field, q: h(value)))
33
+ markup << %(<li class="attribute #{method_name}"> #{li_value} </li>\n)
34
+ end
35
+ end
36
+ markup << %(</ul></td></tr>)
37
+ markup.html_safe
38
+ end
39
+ end
40
+
41
+ def permission_badge_for(curation_concern, solr_document = nil)
42
+ solr_document ||= curation_concern.to_solr
43
+ dom_label_class, link_title = extract_dom_label_class_and_link_title(solr_document)
44
+ %(<span class="label #{dom_label_class}" title="#{link_title}">#{link_title}</span>).html_safe
45
+ end
46
+
47
+ private
48
+ def extract_dom_label_class_and_link_title(document)
49
+ hash = document.stringify_keys
50
+ dom_label_class, link_title = "label-danger", "Private"
51
+ if hash[Hydra.config.permissions.read.group].present?
52
+ if hash[Hydra.config.permissions.read.group].include?('public')
53
+ if hash[Hydra.config.permissions.embargo.release_date].present?
54
+ dom_label_class, link_title = 'label-warning', 'Open Access with Embargo'
55
+ else
56
+ dom_label_class, link_title = 'label-success', 'Open Access'
57
+ end
58
+ elsif hash[Hydra.config.permissions.read.group].include?('registered')
59
+ dom_label_class, link_title = "label-info", t('sufia.institution_name')
60
+ end
61
+ end
62
+ return dom_label_class, link_title
63
+ end
64
+
65
+
66
+ end
67
+ end
@@ -0,0 +1,38 @@
1
+ module Worthwhile::CatalogHelper
2
+ def type_tab(label, key=label)
3
+ if params[:f] && params[:f][type_field] == [key]
4
+ content_tag(:li, link_to(label, "#"), class: "active")
5
+ else
6
+ facet_solr_field = facet_configuration_for_field(type_field)
7
+ path = search_action_path(add_facet_params_and_redirect(type_field, key))
8
+ # local_params = params.dup
9
+ # local_facet_params = local_params[:f] || {}.with_indifferent_access
10
+ # local_params[:f] = local_facet_params.select{|k,_| k != type_field }
11
+ # puts "local #{local_params}"
12
+ # path = add_facet_params(type_field, key, local_params)
13
+ content_tag(:li, link_to(label, path))
14
+ end
15
+ end
16
+
17
+ def all_type_tab(label = t('worthwhile.catalog.index.type_tabs.all'))
18
+ if params[:f] && params[:f][type_field]
19
+ facet_solr_field = facet_configuration_for_field(type_field)
20
+ new_params = remove_facet_params(type_field, params[:f][type_field].first)
21
+
22
+ # Delete any request params from facet-specific action, needed
23
+ # to redir to index action properly.
24
+ new_params.except! *Blacklight::Solr::FacetPaginator.request_keys.values
25
+ path = search_action_path(new_params)
26
+ content_tag(:li, link_to(label, path))
27
+ else
28
+ content_tag(:li, link_to(label, '#'), class: "active")
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def type_field
35
+ Solrizer.solr_name("generic_type", :facetable)
36
+ end
37
+
38
+ end
@@ -0,0 +1,19 @@
1
+ module Worthwhile::CollectionsHelper
2
+ def has_collection_search_parameters?
3
+ params[:cq].present?
4
+ end
5
+
6
+ def collection_modal_id(collectible)
7
+ "#{collectible.to_param.gsub(/:/, '-')}-modal"
8
+ end
9
+
10
+ def link_to_select_collection(collectible, opts={})
11
+ html_class = opts[:class]
12
+ link_to add_member_form_collections_path(collectible_id: collectible.id),
13
+ data: { toggle: "modal", target: '#' + collection_modal_id(collectible) },
14
+ class: "add-to-collection #{html_class}", title: "Add #{collectible.human_readable_type} to Collection" do
15
+ raw('<span class="glyphicon glyphicon-folder-open"></span> Add to a Collection')
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,17 @@
1
+ module Worthwhile
2
+ module EmbargoHelper
3
+
4
+ def assets_with_expired_embargoes
5
+ @assets_with_expired_embargoes ||= EmbargoService.assets_with_expired_embargoes
6
+ end
7
+
8
+ def assets_under_embargo
9
+ @assets_under_embargo ||= EmbargoService.assets_under_embargo
10
+ end
11
+
12
+ def assets_with_deactivated_embargoes
13
+ @assets_with_deactivated_embargoes ||= EmbargoService.assets_with_deactivated_embargoes
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Worthwhile::GenericFileHelper
2
+
3
+ def generic_file_title(gf)
4
+ can?(:read, gf) ? gf.to_s : "File"
5
+ end
6
+
7
+ def generic_file_link_name(gf)
8
+ can?(:read, gf) ? gf.filename : "File"
9
+ end
10
+
11
+ def parent_path(parent)
12
+ if parent.is_a?(Collection)
13
+ collection_path(parent)
14
+ else
15
+ polymorphic_path([:curation_concern, parent])
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,18 @@
1
+ module Worthwhile
2
+ module LeaseHelper
3
+
4
+ def assets_with_expired_leases
5
+ @assets_with_expired_leases ||= LeaseService.assets_with_expired_leases
6
+ end
7
+
8
+ def assets_under_lease
9
+ @assets_under_lease ||= LeaseService.assets_under_lease
10
+ end
11
+
12
+ def assets_with_deactivated_leases
13
+ @assets_with_deactivated_leases ||= LeaseService.assets_with_deactivated_leases
14
+ end
15
+
16
+ end
17
+ end
18
+
@@ -0,0 +1,14 @@
1
+ module Worthwhile::MainAppHelpers
2
+ include Worthwhile::TitleHelper
3
+ include Worthwhile::AttributeHelper
4
+ include Worthwhile::GenericFileHelper
5
+ include Worthwhile::SearchPathsHelper
6
+ include Worthwhile::RenderConstraintsHelper
7
+ include Worthwhile::AbilityHelper
8
+ include Worthwhile::CollectionsHelper
9
+ include Curate::CollectionsHelper
10
+ include Worthwhile::ThumbnailHelper
11
+ include Worthwhile::UrlHelper
12
+ include Worthwhile::EmbargoHelper
13
+ include Worthwhile::LeaseHelper
14
+ end
@@ -0,0 +1,42 @@
1
+ module Worthwhile
2
+ module RenderConstraintsHelper
3
+ # Overridden to remove the 'search_field' tag from the localized params when the query is cleared.
4
+ # This is because unlike Blacklight, there is no way to change the search_field in the worthwhile UI
5
+ ##
6
+ # Render the query constraints
7
+ #
8
+ # @param [Hash] query parameters
9
+ # @return [String]
10
+ def render_constraints_query(localized_params = params)
11
+ # So simple don't need a view template, we can just do it here.
12
+ return "".html_safe if localized_params[:q].blank?
13
+
14
+ render_constraint_element(constraint_query_label(localized_params),
15
+ localized_params[:q],
16
+ classes: ["query"],
17
+ remove: url_for(localized_params.except(:search_field).merge(q: nil, action: 'index')))
18
+ end
19
+
20
+ ##
21
+ # We can remove this method once we use Blacklight > 5.4.0
22
+ ##
23
+ # Return a label for the currently selected search field.
24
+ # If no "search_field" or the default (e.g. "all_fields") is selected, then return nil
25
+ # Otherwise grab the label of the selected search field.
26
+ # @param [Hash] query parameters
27
+ # @return [String]
28
+ def constraint_query_label(localized_params = params)
29
+ label_for_search_field(localized_params[:search_field]) unless default_search_field?(localized_params[:search_field])
30
+ end
31
+
32
+ ##
33
+ # We can remove this method once we use Blacklight > 5.4.0
34
+ ##
35
+ # Is the search form using the default search field ("all_fields" by default)?
36
+ # @param [String] the currently selected search_field
37
+ # @return [Boolean]
38
+ def default_search_field?(selected_search_field)
39
+ selected_search_field.blank? || (default_search_field && selected_search_field == default_search_field[:key])
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,13 @@
1
+ module Worthwhile::SearchPathsHelper
2
+
3
+ def search_path_for_my_works(opts={})
4
+ params_for_my_works = {:'f[generic_type_sim][]'=>'Work', works: 'mine'}
5
+ main_app.catalog_index_path(params_for_my_works.merge(opts))
6
+ end
7
+
8
+ def search_path_for_my_collections(opts={})
9
+ params_for_my_collections = {:'f[generic_type_sim][]'=>'Collection', works: 'mine'}
10
+ main_app.catalog_index_path(params_for_my_collections.merge(opts))
11
+ end
12
+
13
+ end
@@ -0,0 +1,11 @@
1
+ module Worthwhile
2
+ module ThumbnailHelper
3
+ def thumbnail_tag(document, image_options)
4
+ if document.representative.present?
5
+ image_tag download_path(document.representative, datastream_id: 'thumbnail'), alt: 'Thumbnail', class: "canonical-image"
6
+ else
7
+ content_tag :span, '', class: 'canonical-image'
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module Worthwhile::TitleHelper
2
+
3
+ def construct_page_title(*elements)
4
+ (elements.flatten.compact + [application_name]).join(" // ")
5
+ end
6
+
7
+ def curation_concern_page_title(curation_concern)
8
+ if curation_concern.persisted?
9
+ construct_page_title(curation_concern.title, "#{curation_concern.human_readable_type} [#{curation_concern.to_param}]")
10
+ else
11
+ construct_page_title("New #{curation_concern.human_readable_type}")
12
+ end
13
+ end
14
+
15
+ def default_page_title
16
+ text = controller_name.singularize.titleize
17
+ if action_name
18
+ text = "#{action_name.titleize} " + text
19
+ end
20
+ construct_page_title(text)
21
+ end
22
+
23
+ end
@@ -0,0 +1,16 @@
1
+ module Worthwhile
2
+ module UrlHelper
3
+
4
+ # override Blacklight so we can use our 'curation_concern' namespace
5
+ # We may also pass in a ActiveFedora document instead of a SolrDocument
6
+ def url_for_document doc, options = {}
7
+ if doc.kind_of? Worthwhile::GenericFile
8
+ curation_concern_generic_file_path(doc)
9
+ elsif doc.collection?
10
+ doc
11
+ else
12
+ polymorphic_path([:curation_concern, doc])
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,72 @@
1
+ class MultiValueInput < SimpleForm::Inputs::CollectionInput
2
+ def input(wrapper_options)
3
+ @rendered_first_element = false
4
+ input_html_classes.unshift("string")
5
+ #input_html_options[:type] ||= 'text'
6
+ input_html_options[:name] ||= "#{object_name}[#{attribute_name}][]"
7
+ markup = <<-HTML
8
+
9
+
10
+ <ul class="listing">
11
+ HTML
12
+
13
+ collection.each_with_index do |value, i|
14
+ unless value.to_s.strip.blank?
15
+ markup << <<-HTML
16
+ <li class="field-wrapper">
17
+ #{build_text_field(value)}
18
+ </li>
19
+ HTML
20
+ end
21
+ end
22
+
23
+ markup << <<-HTML
24
+ <li class="field-wrapper">
25
+ #{build_text_field('')}
26
+ </li>
27
+ </ul>
28
+
29
+ HTML
30
+ end
31
+
32
+ private
33
+
34
+
35
+ def build_text_field(value)
36
+ options = input_html_options.dup
37
+
38
+ options[:value] = value
39
+ if @rendered_first_element
40
+ options[:id] = nil
41
+ options[:required] = nil
42
+ else
43
+ options[:id] ||= input_dom_id
44
+ end
45
+ options[:class] ||= []
46
+ options[:class] += ["#{input_dom_id} form-control multi-text-field"]
47
+ options[:'aria-labelledby'] = label_id
48
+ @rendered_first_element = true
49
+ if options.delete(:type) == 'textarea'.freeze
50
+ @builder.text_area(attribute_name, options)
51
+ else
52
+ @builder.text_field(attribute_name, options)
53
+ end
54
+ end
55
+
56
+
57
+ def label_id
58
+ input_dom_id + '_label'
59
+ end
60
+
61
+ def input_dom_id
62
+ input_html_options[:id] || "#{object_name}_#{attribute_name}"
63
+ end
64
+
65
+ def collection
66
+ @collection ||= begin
67
+ object.send(attribute_name)
68
+ end
69
+ end
70
+
71
+ def multiple?; true; end
72
+ end
@@ -0,0 +1,15 @@
1
+ class Collection < ActiveFedora::Base
2
+ include Hydra::Collection
3
+ include CurationConcern::CollectionModel
4
+ include Hydra::Collections::Collectible
5
+ include CurationConcern::WithBasicMetadata
6
+ include CurationConcern::WithGenericFiles
7
+
8
+ # override the default Hydra properties so we don't get a prefix deprecation warning.
9
+ has_metadata "properties", type: Worthwhile::PropertiesDatastream
10
+
11
+ # override Hydra::Collection to add :solr_page_size
12
+ has_and_belongs_to_many :members, property: :has_collection_member, class_name: "ActiveFedora::Base" , after_remove: :update_member,
13
+ solr_page_size: 70
14
+
15
+ end
@@ -0,0 +1,62 @@
1
+ module CurationConcern
2
+ module CollectionModel
3
+ extend ActiveSupport::Concern
4
+
5
+ include Hydra::AccessControls::Permissions
6
+ include Hydra::AccessControls::WithAccessRight
7
+ include Sufia::Noid
8
+ include CurationConcern::HumanReadableType
9
+ include Hydra::Collection
10
+ include Hydra::Collections::Collectible
11
+ include CurationConcern::HasRepresentative
12
+
13
+ def add_member(collectible)
14
+ if can_add_to_members?(collectible)
15
+ collectible.collections << self
16
+ collectible.save
17
+ self.members << collectible
18
+ self.save
19
+ end
20
+ end
21
+
22
+ def to_s
23
+ self.title.present? ? title : "No Title"
24
+ end
25
+
26
+ def to_solr(solr_doc={}, opts={})
27
+ super.tap do |solr_doc|
28
+ Solrizer.set_field(solr_doc, 'generic_type', human_readable_type, :facetable)
29
+ solr_doc[Solrizer.solr_name('noid', Sufia::GenericFile.noid_indexer)] = noid
30
+ index_collection_pids(solr_doc)
31
+ end
32
+ end
33
+
34
+ def can_be_member_of_collection?(collection)
35
+ collection == self ? false : true
36
+ end
37
+
38
+
39
+ # ------------------------------------------------
40
+ # overriding method from active-fedora:
41
+ # lib/active_fedora/semantic_node.rb
42
+ #
43
+ # The purpose of this override is to ensure that
44
+ # a collection cannot contain itself.
45
+ #
46
+ # TODO: After active-fedora 7.0 is released, this
47
+ # logic can be moved into a before_add callback.
48
+ # ------------------------------------------------
49
+ def add_relationship(predicate, target, literal=false)
50
+ return if self == target
51
+ super
52
+ end
53
+
54
+ private
55
+ def can_add_to_members?(collectible)
56
+ collectible.can_be_member_of_collection?(self)
57
+ rescue NoMethodError
58
+ false
59
+ end
60
+
61
+ end
62
+ end