arclight 0.1.0 → 1.6.2
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 +5 -5
- data/.all-contributorsrc +450 -0
- data/.codeclimate.yml +5 -0
- data/.eslintrc +14 -4
- data/.github/workflows/ruby.yml +51 -0
- data/.gitignore +2 -0
- data/.rspec +0 -1
- data/.rubocop.yml +503 -48
- data/.rubocop_todo.yml +122 -0
- data/.solr_wrapper +2 -1
- data/CONTRIBUTING.md +5 -5
- data/CONTRIBUTORS.md +79 -0
- data/Gemfile +15 -10
- data/README.md +47 -32
- data/Rakefile +0 -1
- data/app/assets/images/blacklight/bookmark.svg +1 -0
- data/app/assets/images/blacklight/collection.svg +5 -0
- data/app/assets/images/blacklight/compact.svg +1 -25
- data/app/assets/images/blacklight/container.svg +5 -0
- data/app/assets/images/blacklight/ead.svg +1 -0
- data/app/assets/images/blacklight/file.svg +5 -0
- data/app/assets/images/blacklight/folder.svg +1 -0
- data/app/assets/images/blacklight/list.svg +1 -0
- data/app/assets/images/blacklight/minus.svg +1 -0
- data/app/assets/images/blacklight/online.svg +5 -0
- data/app/assets/images/blacklight/pdf.svg +1 -0
- data/app/assets/images/blacklight/plus.svg +1 -0
- data/app/assets/images/blacklight/repository.svg +1 -0
- data/app/assets/javascripts/arclight/arclight.js +4 -9
- data/app/assets/javascripts/arclight/oembed_controller.js +58 -0
- data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
- data/app/assets/stylesheets/arclight/application.scss +4 -3
- data/app/assets/stylesheets/arclight/build.scss +4 -0
- data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +117 -136
- data/app/assets/stylesheets/arclight/modules/highlights.scss +3 -2
- data/app/assets/stylesheets/arclight/modules/icons.scss +20 -0
- data/app/assets/stylesheets/arclight/modules/layout.scss +203 -16
- data/app/assets/stylesheets/arclight/modules/mastheads.scss +27 -45
- data/app/assets/stylesheets/arclight/modules/repositories.scss +3 -7
- data/app/assets/stylesheets/arclight/modules/repository_card.scss +5 -50
- data/app/assets/stylesheets/arclight/modules/search_form.scss +9 -0
- data/app/assets/stylesheets/arclight/modules/search_results.scss +200 -25
- data/app/assets/stylesheets/arclight/modules/show_collection.scss +21 -61
- data/app/assets/stylesheets/arclight/modules/truncator.scss +58 -0
- data/app/assets/stylesheets/arclight/responsive.scss +13 -0
- data/app/assets/stylesheets/arclight/variables.scss +25 -2
- data/app/components/arclight/access_component.html.erb +14 -0
- data/app/components/arclight/access_component.rb +25 -0
- data/app/components/arclight/bookmark_component.html.erb +25 -0
- data/app/components/arclight/bookmark_component.rb +9 -0
- data/app/components/arclight/breadcrumb_component.rb +50 -0
- data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
- data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
- data/app/components/arclight/collection_context_component.html.erb +12 -0
- data/app/components/arclight/collection_context_component.rb +27 -0
- data/app/components/arclight/collection_info_component.html.erb +28 -0
- data/app/components/arclight/collection_info_component.rb +26 -0
- data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
- data/app/components/arclight/collection_sidebar_component.rb +39 -0
- data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
- data/app/components/arclight/constraints_component.rb +17 -0
- data/app/components/arclight/document_collection_context_component.html.erb +29 -0
- data/app/components/arclight/document_collection_context_component.rb +28 -0
- data/app/components/arclight/document_collection_hierarchy_component.html.erb +50 -0
- data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
- data/app/components/arclight/document_component.html.erb +39 -0
- data/app/components/arclight/document_component.rb +49 -0
- data/app/components/arclight/document_components_hierarchy_component.html.erb +20 -0
- data/app/components/arclight/document_components_hierarchy_component.rb +34 -0
- data/app/components/arclight/document_download_component.html.erb +24 -0
- data/app/components/arclight/document_download_component.rb +71 -0
- data/app/components/arclight/embed_component.html.erb +10 -0
- data/app/components/arclight/embed_component.rb +43 -0
- data/app/components/arclight/expand_hierarchy_button_component.html.erb +5 -0
- data/app/components/arclight/expand_hierarchy_button_component.rb +16 -0
- data/app/components/arclight/group_component.html.erb +34 -0
- data/app/components/arclight/group_component.rb +23 -0
- data/app/components/arclight/header_component.html.erb +5 -0
- data/app/components/arclight/header_component.rb +10 -0
- data/app/components/arclight/index_metadata_field_component.html.erb +16 -0
- data/app/components/arclight/index_metadata_field_component.rb +20 -0
- data/app/components/arclight/masthead_component.html.erb +17 -0
- data/app/components/arclight/masthead_component.rb +10 -0
- data/app/components/arclight/metadata_section_component.html.erb +13 -0
- data/app/components/arclight/metadata_section_component.rb +22 -0
- data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
- data/app/components/arclight/oembed_viewer_component.rb +16 -0
- data/app/components/arclight/online_content_filter_component.html.erb +15 -0
- data/app/components/arclight/online_content_filter_component.rb +17 -0
- data/app/components/arclight/online_status_indicator_component.rb +19 -0
- data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
- data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
- data/app/components/arclight/repository_location_component.html.erb +20 -0
- data/app/components/arclight/repository_location_component.rb +10 -0
- data/app/components/arclight/search_bar_component.html.erb +27 -0
- data/app/components/arclight/search_bar_component.rb +32 -0
- data/app/components/arclight/search_result_breadcrumbs_component.html.erb +6 -0
- data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
- data/app/components/arclight/search_result_component.html.erb +20 -0
- data/app/components/arclight/search_result_component.rb +18 -0
- data/app/components/arclight/search_result_title_component.html.erb +15 -0
- data/app/components/arclight/search_result_title_component.rb +15 -0
- data/app/components/arclight/sidebar_component.html.erb +9 -0
- data/app/components/arclight/sidebar_component.rb +19 -0
- data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
- data/app/components/blacklight/icons/bookmark_component.rb +12 -0
- data/app/components/blacklight/icons/collection_component.rb +14 -0
- data/app/components/blacklight/icons/compact_component.rb +12 -0
- data/app/components/blacklight/icons/container_component.rb +14 -0
- data/app/components/blacklight/icons/ead_component.rb +12 -0
- data/app/components/blacklight/icons/file_component.rb +14 -0
- data/app/components/blacklight/icons/folder_component.rb +12 -0
- data/app/components/blacklight/icons/online_component.rb +15 -0
- data/app/components/blacklight/icons/pdf_component.rb +12 -0
- data/app/components/blacklight/icons/repository_component.rb +12 -0
- data/app/controllers/arclight/repositories_controller.rb +4 -4
- data/app/helpers/arclight/ead_format_helpers.rb +309 -0
- data/app/helpers/arclight/field_config_helpers.rb +26 -0
- data/app/helpers/arclight_helper.rb +55 -120
- data/app/models/arclight/document_downloads.rb +122 -0
- data/app/models/arclight/parent.rb +9 -9
- data/app/models/arclight/parents.rb +9 -4
- data/app/models/arclight/requests/aeon_external_request.rb +42 -0
- data/app/models/arclight/requests/aeon_web_ead.rb +52 -0
- data/app/models/arclight/requests/google_form.rb +8 -3
- data/app/models/concerns/arclight/catalog.rb +33 -11
- data/app/models/concerns/arclight/search_behavior.rb +22 -21
- data/app/models/concerns/arclight/solr_document.rb +88 -59
- data/app/presenters/arclight/show_presenter.rb +34 -7
- data/app/views/arclight/_requests.html.erb +7 -0
- data/app/views/arclight/repositories/_repository.html.erb +22 -41
- data/app/views/arclight/repositories/index.html.erb +5 -0
- data/app/views/arclight/repositories/show.html.erb +7 -8
- data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +8 -0
- data/app/views/arclight/requests/_aeon_web_ead.html.erb +6 -0
- data/app/views/arclight/requests/_google_form.html.erb +4 -5
- data/app/views/catalog/_document_list.html.erb +8 -0
- data/app/views/catalog/_group.html.erb +4 -0
- data/app/views/catalog/_group_toggle.html.erb +10 -0
- data/app/views/catalog/_search_results_header.html.erb +3 -0
- data/app/views/catalog/hierarchy.html.erb +19 -0
- data/app/views/catalog/index.html.erb +16 -7
- data/app/views/shared/_breadcrumbs.html.erb +3 -15
- data/app/views/shared/_main_menu_links.html.erb +1 -1
- data/arclight.gemspec +22 -17
- data/config/breadcrumbs.rb +24 -0
- data/config/i18n-tasks.yml +134 -0
- data/config/importmap.rb +3 -0
- data/config/locales/arclight.en.yml +90 -55
- data/config/routes.rb +1 -1
- data/docker-compose.yml +16 -0
- data/lib/arclight/digital_object.rb +2 -1
- data/lib/arclight/engine.rb +23 -31
- data/lib/arclight/exceptions.rb +1 -0
- data/lib/arclight/hash_absolute_xpath.rb +62 -0
- data/lib/arclight/level_label.rb +46 -0
- data/lib/arclight/missing_id_strategy.rb +21 -0
- data/lib/arclight/normalized_date.rb +24 -20
- data/lib/arclight/normalized_id.rb +7 -2
- data/lib/arclight/normalized_title.rb +3 -0
- data/lib/arclight/repository.rb +72 -47
- data/lib/arclight/routes/hierarchy.rb +19 -0
- data/lib/arclight/routes.rb +8 -0
- data/lib/arclight/traject/ead2_component_config.rb +335 -0
- data/lib/arclight/traject/ead2_config.rb +316 -0
- data/lib/arclight/traject/nokogiri_namespaceless_reader.rb +22 -0
- data/lib/arclight/version.rb +1 -1
- data/lib/arclight/year_range.rb +13 -4
- data/lib/arclight.rb +6 -1
- data/lib/generators/arclight/install_generator.rb +110 -10
- data/lib/generators/arclight/templates/arclight.scss +6 -3
- data/lib/generators/arclight/templates/catalog_controller.rb +249 -173
- data/lib/generators/arclight/templates/config/downloads.yml +12 -0
- data/lib/generators/arclight/templates/config/locales/arclight.en.yml +61 -0
- data/lib/generators/arclight/templates/config/repositories.yml +42 -31
- data/lib/generators/arclight/update_generator.rb +1 -1
- data/lib/tasks/index.rake +25 -28
- data/package.json +15 -9
- data/solr/conf/schema.xml +101 -332
- data/solr/conf/solrconfig.xml +99 -164
- data/tasks/arclight.rake +22 -11
- data/template.rb +6 -11
- metadata +230 -105
- data/.travis.yml +0 -33
- data/app/assets/javascripts/arclight/collection_context.js +0 -18
- data/app/assets/javascripts/arclight/collection_navigation.js +0 -114
- data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
- data/app/assets/javascripts/arclight/component_ancestors.js +0 -56
- data/app/assets/javascripts/arclight/oembed_viewer.js +0 -39
- data/app/assets/javascripts/arclight/truncator.js.erb +0 -23
- data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -3
- data/app/assets/stylesheets/arclight/modules/sidebar.scss +0 -16
- data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -86
- data/app/factories/blacklight_field_configuration_factory.rb +0 -29
- data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
- data/app/views/arclight/viewers/_oembed.html.erb +0 -7
- data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
- data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
- data/app/views/catalog/_arclight_document_show_header.html.erb +0 -15
- data/app/views/catalog/_arclight_document_show_header_collection.html.erb +0 -12
- data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -15
- data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -5
- data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
- data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
- data/app/views/catalog/_collection_contents.html.erb +0 -12
- data/app/views/catalog/_collection_count.html.erb +0 -7
- data/app/views/catalog/_collection_downloads.html.erb +0 -17
- data/app/views/catalog/_collection_online_contents.html.erb +0 -17
- data/app/views/catalog/_collection_overview.html.erb +0 -7
- data/app/views/catalog/_component_overview.html.erb +0 -46
- data/app/views/catalog/_context_card.html.erb +0 -27
- data/app/views/catalog/_context_sidebar.html.erb +0 -8
- data/app/views/catalog/_custom_metadata.html.erb +0 -16
- data/app/views/catalog/_home.html.erb +0 -1
- data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -3
- data/app/views/catalog/_index_default.html.erb +0 -17
- data/app/views/catalog/_index_header.html.erb +0 -7
- data/app/views/catalog/_index_header_hierarchy_default.html.erb +0 -42
- data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
- data/app/views/catalog/_index_hierarchy_default.html.erb +0 -28
- data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
- data/app/views/catalog/_results_histogram.html.erb +0 -10
- data/app/views/catalog/_search_results.html.erb +0 -31
- data/app/views/catalog/_search_within_form.html.erb +0 -16
- data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -7
- data/app/views/catalog/_show_collection.html.erb +0 -40
- data/app/views/catalog/_show_component_sidebar.html.erb +0 -12
- data/app/views/catalog/_show_default.html.erb +0 -32
- data/app/views/catalog/_show_header.html.erb +0 -5
- data/app/views/catalog/_show_sidebar.html.erb +0 -30
- data/app/views/layouts/catalog_result.html.erb +0 -7
- data/app/views/shared/_context_sidebar.html.erb +0 -8
- data/app/views/shared/_header_navbar.html.erb +0 -54
- data/lib/arclight/custom_component.rb +0 -98
- data/lib/arclight/custom_document.rb +0 -93
- data/lib/arclight/indexer.rb +0 -9
- data/lib/arclight/shared_indexing_behavior.rb +0 -97
- data/lib/arclight/shared_terminology_behavior.rb +0 -65
- data/lib/arclight/solr_ead_indexer_ext.rb +0 -159
- data/lib/arclight/viewer.rb +0 -45
- data/lib/arclight/viewers/oembed.rb +0 -56
- data/lib/generators/arclight/templates/arclight.js +0 -2
- data/solr/conf/scripts.conf +0 -24
- data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
- data/vendor/assets/javascripts/stickyfill.js +0 -480
- /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
- /data/{app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb → config/repositories.yml} +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<ol class="breadcrumb">
|
|
2
|
+
<li class="breadcrumb-home-link">
|
|
3
|
+
<%= link_to t('arclight.routes.home'), root_path %>
|
|
4
|
+
</li>
|
|
5
|
+
<li class="breadcrumb-item breadcrumb-item-1">
|
|
6
|
+
<span aria-hidden="true"><%= blacklight_icon :repository, classes: 'al-repository-content-icon' %></span>
|
|
7
|
+
<span class="breadcrumb-text"><%= repository %></span>
|
|
8
|
+
<ol class="breadcrumb">
|
|
9
|
+
<% if collection %>
|
|
10
|
+
<li class="breadcrumb-item breadcrumb-item-2">
|
|
11
|
+
<span aria-hidden="true"><%= blacklight_icon :collection, classes: 'al-collection-content-icon' %></span>
|
|
12
|
+
<span class="breadcrumb-text"><%= link_to collection.label, solr_document_path(collection.id) %></span>
|
|
13
|
+
|
|
14
|
+
<ol class="breadcrumb">
|
|
15
|
+
<% parents_under_collection.each do |parent| %>
|
|
16
|
+
<li class="breadcrumb-item breadcrumb-item-3">
|
|
17
|
+
<span class="breadcrumb-text"><%= link_to parent.label, solr_document_path(parent.id) %></span>
|
|
18
|
+
</li>
|
|
19
|
+
<% end %>
|
|
20
|
+
|
|
21
|
+
<li class="breadcrumb-item breadcrumb-item-4">
|
|
22
|
+
<span class="breadcrumb-text"><%= @presenter.heading %></span>
|
|
23
|
+
</li>
|
|
24
|
+
</ol>
|
|
25
|
+
</li>
|
|
26
|
+
<% else # this is a collection %>
|
|
27
|
+
<li class="breadcrumb-item breadcrumb-item-4">
|
|
28
|
+
<span aria-hidden="true"><%= blacklight_icon :collection, classes: 'al-collection-content-icon' %></span>
|
|
29
|
+
<span class="breadcrumb-text"><%= @presenter.heading %></span>
|
|
30
|
+
</li>
|
|
31
|
+
<% end %>
|
|
32
|
+
</ol>
|
|
33
|
+
</li>
|
|
34
|
+
</ol>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Render the hierarchy for a document
|
|
5
|
+
class BreadcrumbsHierarchyComponent < ViewComponent::Base
|
|
6
|
+
delegate :document, to: :@presenter
|
|
7
|
+
delegate :blacklight_icon, to: :helpers
|
|
8
|
+
|
|
9
|
+
def initialize(presenter:)
|
|
10
|
+
super()
|
|
11
|
+
|
|
12
|
+
@presenter = presenter
|
|
13
|
+
collections, @parents_under_collection = document.parents.partition(&:collection?)
|
|
14
|
+
@collection = collections.first
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
attr_reader :collection, :parents_under_collection
|
|
18
|
+
|
|
19
|
+
def repository
|
|
20
|
+
return tag.span(t('arclight.show_breadcrumb_label')) if document.repository_config.blank?
|
|
21
|
+
|
|
22
|
+
link_to(document.repository_config.name, helpers.arclight_engine.repository_path(document.repository_config.slug))
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<div class='al-show-actions-box mb-3'>
|
|
2
|
+
<div class="al-actions-box-container">
|
|
3
|
+
<button type="button" class="btn-close d-lg-none float-end mt-1 me-1" data-bs-dismiss="offcanvas" data-bs-target="#sidebar" aria-label="Close"></button>
|
|
4
|
+
<h2>Collection</h2>
|
|
5
|
+
<h3><%= title %></h3>
|
|
6
|
+
|
|
7
|
+
<div class="al-collection-context-actions d-flex flex-wrap gap-1">
|
|
8
|
+
<%= document_download %>
|
|
9
|
+
<%= collection_info %>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Render various actions for a collection (e.g. requesting, download links, etc)
|
|
5
|
+
class CollectionContextComponent < ViewComponent::Base
|
|
6
|
+
def initialize(presenter:, download_component:)
|
|
7
|
+
super()
|
|
8
|
+
|
|
9
|
+
@collection = presenter.document.collection
|
|
10
|
+
@download_component = download_component
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :collection
|
|
14
|
+
|
|
15
|
+
def title
|
|
16
|
+
collection.normalized_title
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def document_download
|
|
20
|
+
render @download_component.new(downloads: collection.downloads) || Arclight::DocumentDownloadComponent.new(downloads: collection.downloads)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def collection_info
|
|
24
|
+
render Arclight::CollectionInfoComponent.new(collection: collection)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<div class='al-show-actions-box-info'>
|
|
2
|
+
|
|
3
|
+
<div class="dropdown">
|
|
4
|
+
<button class="dropdown-toggle btn btn-secondary btn-sm" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
5
|
+
<%= info_icon %> <%= t('.more_info') %>
|
|
6
|
+
</button>
|
|
7
|
+
<div class="dropdown-menu shadow-lg p-2" style="min-width: 300px;" >
|
|
8
|
+
<table style="width: 100%">
|
|
9
|
+
<tr>
|
|
10
|
+
<th scope="row"><%= t('.collection_id') %></th>
|
|
11
|
+
<td><%= collection_unitid %></td>
|
|
12
|
+
</tr>
|
|
13
|
+
<tr>
|
|
14
|
+
<th scope="row"><%= t('.total_components') %></th>
|
|
15
|
+
<td><%= total_component_count %></td>
|
|
16
|
+
</tr>
|
|
17
|
+
<tr>
|
|
18
|
+
<th scope="row"><%= t('.online_items') %></th>
|
|
19
|
+
<td><%= tag.span blacklight_icon(:online), class: 'al-online-content-icon' %><%= online_item_count %></td>
|
|
20
|
+
</tr>
|
|
21
|
+
<tr>
|
|
22
|
+
<th scope="row"><%= t('.last_indexed') %></th>
|
|
23
|
+
<td><%= last_indexed.strftime('%F') %></td>
|
|
24
|
+
</tr>
|
|
25
|
+
</table>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Render information about the collection
|
|
5
|
+
class CollectionInfoComponent < ViewComponent::Base
|
|
6
|
+
def initialize(collection:)
|
|
7
|
+
super()
|
|
8
|
+
|
|
9
|
+
@collection = collection
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
attr_reader :collection
|
|
13
|
+
|
|
14
|
+
delegate :total_component_count, :online_item_count, :last_indexed, :collection_unitid, to: :collection
|
|
15
|
+
delegate :blacklight_icon, to: :helpers
|
|
16
|
+
|
|
17
|
+
def info_icon
|
|
18
|
+
icon = <<~SVG
|
|
19
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16">
|
|
20
|
+
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z"/>
|
|
21
|
+
</svg>
|
|
22
|
+
SVG
|
|
23
|
+
icon.html_safe # rubocop:disable Rails/OutputSafety
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<nav class="al-sidebar-navigation-context sidebar-section" aria-labelledby="collection-nav">
|
|
2
|
+
<h2 id="collection-nav"><%= t('arclight.views.show.context_nav.title') %></h2>
|
|
3
|
+
<ul class='nav flex-column'>
|
|
4
|
+
<% partials.each do |section| %>
|
|
5
|
+
<% next unless has_section?(section) %>
|
|
6
|
+
<li class='nav-item'>
|
|
7
|
+
<%= link_to section_label(section),
|
|
8
|
+
document_section_path(section),
|
|
9
|
+
class: 'nav-link pl-0 ps-0 py-1',
|
|
10
|
+
data: { turbolinks: 'false' }
|
|
11
|
+
%>
|
|
12
|
+
</li>
|
|
13
|
+
<% end %>
|
|
14
|
+
</ul>
|
|
15
|
+
</nav>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Draw the links to the collection info in the sidebar
|
|
5
|
+
class CollectionSidebarComponent < ViewComponent::Base
|
|
6
|
+
def initialize(document:, partials:, collection_presenter:)
|
|
7
|
+
super()
|
|
8
|
+
|
|
9
|
+
@document = document
|
|
10
|
+
@partials = Array(partials)
|
|
11
|
+
@collection_presenter = collection_presenter
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
attr_reader :document, :partials, :collection_presenter
|
|
15
|
+
|
|
16
|
+
def has_section?(section)
|
|
17
|
+
# Access field data comes from repositories.yml not from solr, so handle it in a different way.
|
|
18
|
+
return true if section == :access_field
|
|
19
|
+
|
|
20
|
+
collection_presenter.with_field_group(section).fields_to_render.any?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def document_section_path(section)
|
|
24
|
+
[document_path, section_anchor(section)].join
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def section_label(section)
|
|
28
|
+
t("arclight.views.show.sections.#{section}")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def document_path
|
|
32
|
+
@document_path ||= solr_document_path(document.root)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def section_anchor(section)
|
|
36
|
+
"##{t("arclight.views.show.sections.#{section}").parameterize}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Extend the upstream constraints with breadcrumbs and
|
|
5
|
+
# repository context information
|
|
6
|
+
class ConstraintsComponent < Blacklight::ConstraintsComponent
|
|
7
|
+
def initialize(**kwargs)
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
@kwargs = kwargs
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def repository
|
|
14
|
+
@repository ||= helpers.repository_faceted_on
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<%= tag.tr(
|
|
2
|
+
id: @document.id,
|
|
3
|
+
data: {
|
|
4
|
+
'document-id': @document.id.to_s.parameterize,
|
|
5
|
+
'document-counter': @counter,
|
|
6
|
+
},
|
|
7
|
+
itemscope: true,
|
|
8
|
+
itemtype: @document.itemtype,
|
|
9
|
+
class: classes.join(' ')) do %>
|
|
10
|
+
<td data-document-id="<%= document.id %>">
|
|
11
|
+
<div class="index_title document-title-heading" data-turbo="false">
|
|
12
|
+
<%= helpers.link_to_document document, counter: @counter %>
|
|
13
|
+
<% if document.children? %>
|
|
14
|
+
<span class="badge badge-pill bg-secondary badge-secondary al-number-of-children-badge"><%= document.number_of_children %><span class="sr-only visually-hidden"><%= t(:'arclight.views.index.number_of_components', count: document.number_of_children) %></span></span>
|
|
15
|
+
<% end %>
|
|
16
|
+
</div>
|
|
17
|
+
</td>
|
|
18
|
+
|
|
19
|
+
<%= tag.td class: 'text-muted' do %>
|
|
20
|
+
<%= document.containers.join(', ') %>
|
|
21
|
+
<% end %>
|
|
22
|
+
|
|
23
|
+
<%= tag.td class: 'text-end' do %>
|
|
24
|
+
<%= helpers.render_index_doc_actions document, wrapping_class: 'd-inline-flex justify-content-end' %>
|
|
25
|
+
<% end %>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<%= render Arclight::IndexMetadataFieldComponent.with_collection(@presenter&.field_presenters.select { |field| field.field_config.collection_context }, classes: ['col pl-0 my-0']) %>
|
|
29
|
+
<% end %>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Display a single document in the collection
|
|
5
|
+
class DocumentCollectionContextComponent < Arclight::SearchResultComponent
|
|
6
|
+
# @param [SolrDocument] document
|
|
7
|
+
def initialize(document: nil, blacklight_config: nil, **kwargs)
|
|
8
|
+
super(document: document, **kwargs)
|
|
9
|
+
@blacklight_config = blacklight_config
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
attr_reader :blacklight_config
|
|
13
|
+
|
|
14
|
+
def classes
|
|
15
|
+
(super - ['row'] + ['al-collection-context']).flatten
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def online_status
|
|
21
|
+
render online_status_component.new(document: @document)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def online_status_component
|
|
25
|
+
blacklight_config.show.online_status_component || Arclight::OnlineStatusIndicatorComponent
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<%= content_tag :li,
|
|
2
|
+
id: "#{@document.id}-hierarchy-item",
|
|
3
|
+
data: {
|
|
4
|
+
'document-id': @document.id.to_s.parameterize,
|
|
5
|
+
'document-counter': @counter,
|
|
6
|
+
},
|
|
7
|
+
itemscope: true,
|
|
8
|
+
itemtype: @document.itemtype,
|
|
9
|
+
class: (classes.flatten + ['al-collection-context', ('al-hierarchy-highlight' if current_target?)].compact).join(' ') do %>
|
|
10
|
+
<div class="documentHeader" data-document-id="<%= document.id %>">
|
|
11
|
+
<% if document.children? %>
|
|
12
|
+
<%= link_to('',
|
|
13
|
+
"#collapsible-hierarchy-#{document.id}",
|
|
14
|
+
class: "al-toggle-view-children#{ ' collapsed' unless show_expanded?}",
|
|
15
|
+
aria: {
|
|
16
|
+
label: t('arclight.hierarchy.view_all'),
|
|
17
|
+
expanded: show_expanded?
|
|
18
|
+
},
|
|
19
|
+
data: {
|
|
20
|
+
bs_toggle: 'collapse',
|
|
21
|
+
toggle: 'collapse'
|
|
22
|
+
}
|
|
23
|
+
)
|
|
24
|
+
%>
|
|
25
|
+
<% end %>
|
|
26
|
+
<div class="index_title document-title-heading" data-turbo="false">
|
|
27
|
+
<% if current_target? %>
|
|
28
|
+
<%= document.normalized_title %>
|
|
29
|
+
<% else %>
|
|
30
|
+
<%= helpers.link_to_document document, counter: @counter %>
|
|
31
|
+
<% end %>
|
|
32
|
+
<% if document.children? %>
|
|
33
|
+
<span class="badge badge-pill bg-secondary badge-secondary al-number-of-children-badge"><%= document.number_of_children %><span class="sr-only visually-hidden"><%= t(:'arclight.views.index.number_of_components', count: document.number_of_children) %></span></span>
|
|
34
|
+
<% end %>
|
|
35
|
+
<%= online_status %>
|
|
36
|
+
</div>
|
|
37
|
+
<%= content_tag('div', class: 'al-document-container text-muted') do %>
|
|
38
|
+
<%= document.containers.join(', ') %>
|
|
39
|
+
<% end if document.containers.present? %>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<%= render Arclight::IndexMetadataFieldComponent.with_collection(@presenter&.field_presenters.select { |field| field.field_config.collection_context }, classes: ['col pl-0 my-0']) %>
|
|
43
|
+
<% if document.number_of_children > 0 %>
|
|
44
|
+
<%= content_tag(:div, id: "collapsible-hierarchy-#{document.id}",
|
|
45
|
+
class: "collapse al-collection-context-collapsible al-hierarchy-level-#{document.component_level} #{'show' if show_expanded?}"
|
|
46
|
+
) do %>
|
|
47
|
+
<%= render Arclight::DocumentComponentsHierarchyComponent.new(document: @document, target_index: target_index) %>
|
|
48
|
+
<% end %>
|
|
49
|
+
<% end %>
|
|
50
|
+
<% end %>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Display a single document in the collection hierarchy
|
|
5
|
+
class DocumentCollectionHierarchyComponent < Arclight::SearchResultComponent
|
|
6
|
+
# @param [Blacklight::DocumentPresenter] document
|
|
7
|
+
# @param [String] nest_path determines which element to highlight
|
|
8
|
+
def initialize(document: nil, nest_path: nil, blacklight_config: nil, **kwargs)
|
|
9
|
+
super(document: document, **kwargs)
|
|
10
|
+
@nest_path = nest_path
|
|
11
|
+
@blacklight_config = blacklight_config
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
attr_reader :blacklight_config
|
|
15
|
+
|
|
16
|
+
def classes
|
|
17
|
+
super - ['row']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# we want to eager-load this document's children if we're in the
|
|
21
|
+
# target document's component hierarchy
|
|
22
|
+
def show_expanded?
|
|
23
|
+
within_original_tree?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Solr nest paths are constructed using the path name and an index, e.g.
|
|
27
|
+
# `/components#5/components#3`.
|
|
28
|
+
#
|
|
29
|
+
# @return [String] the targeted index for this level of the hierarchy
|
|
30
|
+
def target_index
|
|
31
|
+
return -1 unless within_original_tree?
|
|
32
|
+
|
|
33
|
+
remaining_path = nest_path.sub("#{@document.nest_path}/", '')
|
|
34
|
+
current_component, _rest = remaining_path.split('/', 2)
|
|
35
|
+
_name, index = current_component.split('#', 2)
|
|
36
|
+
|
|
37
|
+
index&.to_i
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
# We're in the targeted document's original tree if the target nest path
|
|
43
|
+
# includes this document's path.
|
|
44
|
+
def within_original_tree?
|
|
45
|
+
nest_path&.start_with? "#{@document.nest_path}/"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def current_target?
|
|
49
|
+
nest_path == @document.nest_path
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def online_status
|
|
53
|
+
render online_status_component.new(document: @document)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def online_status_component
|
|
57
|
+
blacklight_config.show.online_status_component || Arclight::OnlineStatusIndicatorComponent
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
attr_reader :nest_path
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<div class='d-md-flex justify-content-between al-show'>
|
|
2
|
+
<div class='al-show-breadcrumb'>
|
|
3
|
+
<nav aria-label="breadcrumb">
|
|
4
|
+
<%= render breadcrumb_component.new(presenter: presenter) %>
|
|
5
|
+
</nav>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="title-container">
|
|
10
|
+
<%= content_tag :h1 do %>
|
|
11
|
+
<%= document.normalized_title %>
|
|
12
|
+
<% end %>
|
|
13
|
+
<%= render 'arclight/requests', document: document %>
|
|
14
|
+
<%= render Arclight::BookmarkComponent.new document: document, action: bookmark_config %>
|
|
15
|
+
<%= toggle_sidebar %>
|
|
16
|
+
<%= online_filter %>
|
|
17
|
+
</div>
|
|
18
|
+
|
|
19
|
+
<%= render Arclight::MetadataSectionComponent.with_collection(component_metadata_partials,
|
|
20
|
+
metadata_attr: { layout: Arclight::UpperMetadataLayoutComponent },
|
|
21
|
+
presenter: presenter) unless document.collection? %>
|
|
22
|
+
|
|
23
|
+
<%= embed %>
|
|
24
|
+
|
|
25
|
+
<% if document.collection? %>
|
|
26
|
+
<div id="metadata">
|
|
27
|
+
<h2 class="sr-only visually-hidden"><%= t 'arclight.views.show.context' %></h2>
|
|
28
|
+
<%= render Arclight::MetadataSectionComponent.with_collection(metadata_partials,
|
|
29
|
+
metadata_attr: { layout: Arclight::UpperMetadataLayoutComponent },
|
|
30
|
+
presenter: presenter, heading: true) %>
|
|
31
|
+
</div>
|
|
32
|
+
<% elsif document.children? %>
|
|
33
|
+
<div id="contents">
|
|
34
|
+
<h2 class="al-show-sub-heading"><%= t 'arclight.views.show.contents' %></h2>
|
|
35
|
+
<%= helpers.turbo_frame_tag "al-hierarchy-#{document.id}-document", loading: 'lazy', src: helpers.hierarchy_solr_document_path(id: document.id, paginate: true, key: '-document', per_page: 50) %>
|
|
36
|
+
</div>
|
|
37
|
+
<% end %>
|
|
38
|
+
|
|
39
|
+
<%= access %>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Render a single document
|
|
5
|
+
class DocumentComponent < Blacklight::DocumentComponent
|
|
6
|
+
attr_reader :document
|
|
7
|
+
|
|
8
|
+
def online_content?
|
|
9
|
+
document.online_content? && (document.collection? || document.children?)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def blacklight_config
|
|
13
|
+
presenter.configuration
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Blacklight::Configuration::ToolConfig] the configuration for the bookmark
|
|
17
|
+
def bookmark_config
|
|
18
|
+
blacklight_config.index.document_actions.arclight_bookmark_control
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def breadcrumb_component
|
|
22
|
+
blacklight_config.show.breadcrumb_component || Arclight::BreadcrumbsHierarchyComponent
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def metadata_partials
|
|
26
|
+
blacklight_config.show.metadata_partials || []
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def component_metadata_partials
|
|
30
|
+
blacklight_config.show.component_metadata_partials || []
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def online_filter
|
|
34
|
+
render Arclight::OnlineContentFilterComponent.new(document: document)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def access
|
|
38
|
+
render (blacklight_config.show.access_component || Arclight::AccessComponent).new(presenter: presenter)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def toggle_sidebar
|
|
42
|
+
button_tag(t('arclight.views.show.toggle_sidebar'),
|
|
43
|
+
type: :button,
|
|
44
|
+
class: 'btn btn-sm btn-secondary d-lg-none sidebar-toggle',
|
|
45
|
+
data: { bs_toggle: 'offcanvas', bs_target: '#sidebar' },
|
|
46
|
+
aria: { controls: 'sidebar' })
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<% if paginate? && @target_index >= 0 && @target_index >= @maximum_left_gap %>
|
|
2
|
+
<%# render the hierarchy as: outer (left) window ... window ... because our current document hierarchy is so far down the list it'd be buried %>
|
|
3
|
+
<%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}-left", loading: 'lazy', src: hierarchy_path(limit: @left_outer_window, key: '-left') %>
|
|
4
|
+
<%= tag.turbo_frame id: "al-hierarchy-#{@document.id}-gap" do %>
|
|
5
|
+
<%= render expand_hierarchy_component.new(path: hierarchy_path(offset: @left_outer_window, limit: @target_index - @left_outer_window - (@window / 2), key: '-gap')) %>
|
|
6
|
+
<% end %>
|
|
7
|
+
<%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}-window", src: hierarchy_path(offset: @target_index - (@window / 2), limit: @window, key: '-window') %>
|
|
8
|
+
<%= tag.turbo_frame id: "al-hierarchy-#{@document.id}-right" do %>
|
|
9
|
+
<%= render expand_hierarchy_component.new(path: hierarchy_path(offset: @target_index + (@window / 2), key: '-right')) %>
|
|
10
|
+
<% end %>
|
|
11
|
+
<% elsif paginate? %>
|
|
12
|
+
<%# render the first N documents, and let the user expand the remaining if desired %>
|
|
13
|
+
<%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}-sidebar", loading: ('lazy' unless @target_index >= 0), src: hierarchy_path(limit: @maximum_left_gap, key: '-sidebar') %>
|
|
14
|
+
<%= tag.turbo_frame id: "al-hierarchy-#{@document.id}-right" do %>
|
|
15
|
+
<%= render expand_hierarchy_component.new(path: hierarchy_path(offset: @maximum_left_gap, key: '-right')) %>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% else %>
|
|
18
|
+
<%# there aren't enough to bother paginating, so load them all at once %>
|
|
19
|
+
<%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}-sidebar", loading: ('lazy' unless @target_index >= 0), src: hierarchy_path(key: '-sidebar') %>
|
|
20
|
+
<% end %>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# Display a document's constituent components with appropriate lazy-loading
|
|
5
|
+
# to keep the page load time reasonable.
|
|
6
|
+
class DocumentComponentsHierarchyComponent < ViewComponent::Base
|
|
7
|
+
# rubocop:disable Metrics/ParameterLists
|
|
8
|
+
def initialize(document: nil, target_index: -1, minimum_pagination_size: 20, left_outer_window: 3, maximum_left_gap: 10, window: 10)
|
|
9
|
+
super()
|
|
10
|
+
|
|
11
|
+
@document = document
|
|
12
|
+
@target_index = target_index&.to_i || -1
|
|
13
|
+
@minimum_pagination_size = minimum_pagination_size
|
|
14
|
+
@left_outer_window = left_outer_window
|
|
15
|
+
@maximum_left_gap = maximum_left_gap
|
|
16
|
+
@window = window
|
|
17
|
+
end
|
|
18
|
+
# rubocop:enable Metrics/ParameterLists
|
|
19
|
+
|
|
20
|
+
def paginate?
|
|
21
|
+
@document.number_of_children > @minimum_pagination_size
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def hierarchy_path(**kwargs)
|
|
25
|
+
helpers.hierarchy_solr_document_path(id: @document.id, hierarchy: true, nest_path: params[:nest_path], **kwargs)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def expand_hierarchy_component
|
|
29
|
+
blacklight_config.show.expand_hierarchy_component || Arclight::ExpandHierarchyButtonComponent
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
delegate :blacklight_config, to: :helpers
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<div class="al-show-actions-box-downloads-container">
|
|
2
|
+
<% case files.size %>
|
|
3
|
+
<% when 2 %>
|
|
4
|
+
<div class="dropdown">
|
|
5
|
+
<button class="btn btn-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
6
|
+
<%= t("arclight.views.show.download.default") %>
|
|
7
|
+
</button>
|
|
8
|
+
<ul class="dropdown-menu">
|
|
9
|
+
<% files.each do |file| %>
|
|
10
|
+
<li><%= link_to(file.href, class: "dropdown-item", **@link_options) do %>
|
|
11
|
+
<%= icon_for(file.type) %> <%= dropdown_label(file) %>
|
|
12
|
+
<% end %>
|
|
13
|
+
</li>
|
|
14
|
+
<% end %>
|
|
15
|
+
</ul>
|
|
16
|
+
</div>
|
|
17
|
+
<% when 1 %>
|
|
18
|
+
<% files.each do |file| %>
|
|
19
|
+
<%= link_to(file.href, class: "btn btn-secondary btn-sm", **@link_options) do %>
|
|
20
|
+
<%= download_icon %> <%= label(file) %>
|
|
21
|
+
<% end %>
|
|
22
|
+
<% end %>
|
|
23
|
+
<% end %>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Arclight
|
|
4
|
+
# ViewComponent for rendering a single document download link
|
|
5
|
+
class DocumentDownloadComponent < ViewComponent::Base
|
|
6
|
+
def initialize(downloads:, **kwargs)
|
|
7
|
+
super()
|
|
8
|
+
|
|
9
|
+
@downloads = downloads
|
|
10
|
+
@link_options = kwargs
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :downloads
|
|
14
|
+
|
|
15
|
+
delegate :files, to: :downloads
|
|
16
|
+
|
|
17
|
+
def render?
|
|
18
|
+
files.present?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# i18n-tasks-use t('arclight.views.show.download.multiple.pdf')
|
|
22
|
+
# i18n-tasks-use t('arclight.views.show.download.multiple.ead')
|
|
23
|
+
def dropdown_label(file)
|
|
24
|
+
t(file.type, scope: 'arclight.views.show.download.multiple')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# i18n-tasks-use t('arclight.views.show.download.single.pdf')
|
|
28
|
+
# i18n-tasks-use t('arclight.views.show.download.single.ead')
|
|
29
|
+
def label(file)
|
|
30
|
+
t(file.type, scope: 'arclight.views.show.download.single')
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# From https://icons.getbootstrap.com/icons/download/
|
|
34
|
+
def download_icon
|
|
35
|
+
icon = <<~HTML
|
|
36
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-download" viewBox="0 0 16 16">
|
|
37
|
+
<path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5z"/>
|
|
38
|
+
<path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3z"/>
|
|
39
|
+
</svg>
|
|
40
|
+
HTML
|
|
41
|
+
icon.html_safe # rubocop:disable Rails/OutputSafety
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# This is an extension point where one could configure a different icon per file type
|
|
45
|
+
def icon_for(type)
|
|
46
|
+
public_send("#{type}_icon")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# From https://icons.getbootstrap.com/icons/file-earmark-pdf/
|
|
50
|
+
def pdf_icon
|
|
51
|
+
icon = <<~HTML
|
|
52
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-pdf" viewBox="0 0 16 16">
|
|
53
|
+
<path d="M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z"/>
|
|
54
|
+
<path d="M4.603 14.087a.81.81 0 0 1-.438-.42c-.195-.388-.13-.776.08-1.102.198-.307.526-.568.897-.787a7.68 7.68 0 0 1 1.482-.645 19.697 19.697 0 0 0 1.062-2.227 7.269 7.269 0 0 1-.43-1.295c-.086-.4-.119-.796-.046-1.136.075-.354.274-.672.65-.823.192-.077.4-.12.602-.077a.7.7 0 0 1 .477.365c.088.164.12.356.127.538.007.188-.012.396-.047.614-.084.51-.27 1.134-.52 1.794a10.954 10.954 0 0 0 .98 1.686 5.753 5.753 0 0 1 1.334.05c.364.066.734.195.96.465.12.144.193.32.2.518.007.192-.047.382-.138.563a1.04 1.04 0 0 1-.354.416.856.856 0 0 1-.51.138c-.331-.014-.654-.196-.933-.417a5.712 5.712 0 0 1-.911-.95 11.651 11.651 0 0 0-1.997.406 11.307 11.307 0 0 1-1.02 1.51c-.292.35-.609.656-.927.787a.793.793 0 0 1-.58.029zm1.379-1.901c-.166.076-.32.156-.459.238-.328.194-.541.383-.647.547-.094.145-.096.25-.04.361.01.022.02.036.026.044a.266.266 0 0 0 .035-.012c.137-.056.355-.235.635-.572a8.18 8.18 0 0 0 .45-.606zm1.64-1.33a12.71 12.71 0 0 1 1.01-.193 11.744 11.744 0 0 1-.51-.858 20.801 20.801 0 0 1-.5 1.05zm2.446.45c.15.163.296.3.435.41.24.19.407.253.498.256a.107.107 0 0 0 .07-.015.307.307 0 0 0 .094-.125.436.436 0 0 0 .059-.2.095.095 0 0 0-.026-.063c-.052-.062-.2-.152-.518-.209a3.876 3.876 0 0 0-.612-.053zM8.078 7.8a6.7 6.7 0 0 0 .2-.828c.031-.188.043-.343.038-.465a.613.613 0 0 0-.032-.198.517.517 0 0 0-.145.04c-.087.035-.158.106-.196.283-.04.192-.03.469.046.822.024.111.054.227.09.346z"/>
|
|
55
|
+
</svg>
|
|
56
|
+
HTML
|
|
57
|
+
icon.html_safe # rubocop:disable Rails/OutputSafety
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# From https://icons.getbootstrap.com/icons/file-earmark-code/
|
|
61
|
+
def ead_icon
|
|
62
|
+
icon = <<~HTML
|
|
63
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-earmark-code" viewBox="0 0 16 16">
|
|
64
|
+
<path d="M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5L14 4.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5h-2z"/>
|
|
65
|
+
<path d="M8.646 6.646a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L10.293 9 8.646 7.354a.5.5 0 0 1 0-.708zm-1.292 0a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0 0 .708l2 2a.5.5 0 0 0 .708-.708L5.707 9l1.647-1.646a.5.5 0 0 0 0-.708z"/>
|
|
66
|
+
</svg>
|
|
67
|
+
HTML
|
|
68
|
+
icon.html_safe # rubocop:disable Rails/OutputSafety
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|