• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pulibrary / orangelight / 5583111e-2df9-4965-8722-73a1191b3c47

12 May 2026 01:33PM UTC coverage: 89.183% (-6.4%) from 95.538%
5583111e-2df9-4965-8722-73a1191b3c47

push

circleci

web-flow
Remove incorrect border-spacing rule (#5883)

border-spacing only has an effect on tables, but the facets
are presented as a list, not a table.

5936 of 6656 relevant lines covered (89.18%)

1268.1 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

41.79
/app/controllers/bookmarks_controller.rb
1
# frozen_string_literal: true
2

3
require 'csv'
2✔
4
# :reek:TooManyInstanceVariables
5
class BookmarksController < CatalogController
2✔
6
  include Blacklight::Bookmarks
2✔
7

8
  configure_blacklight do |_config|
2✔
9
    blacklight_config.show.document_actions[:print] =
2✔
10
      {
11
        partial: 'document_action',
12
        name: :print,
13
        modal: false
14
      }
15
  end
16

17
  # :reek:TooManyStatements
18
  # :reek:DuplicateMethodCall
19
  def index
2✔
20
    @bookmarks = token_or_current_or_guest_user.bookmarks
9✔
21
    bookmark_ids = @bookmarks.collect { |bookmark| bookmark.document_id.to_s }
13✔
22

23
    if bookmark_ids.present?
9✔
24
      params[:f] ||= {}
3✔
25
      params[:f][:id] = bookmark_ids
3✔
26
      @response, = search_service.search_results
3✔
27
    else
28
      @response = Blacklight::Solr::Response.new({ response: { numFound: 0, start: 0, docs: [] } }, {})
6✔
29
    end
30

31
    respond_to do |format|
9✔
32
      format.html {}
9✔
33
      format.json { render json: render_search_results_as_json }
9✔
34
    end
35
  end
36

37
  def print
2✔
38
    fetch_bookmarked_documents
×
39
    render('orangelight/record_mailer/email_record', formats: [:text])
×
40
  end
41

42
  def citation
2✔
43
    bookmarks = token_or_current_or_guest_user.bookmarks
×
44
    bookmark_ids = bookmarks.collect { |bookmark| bookmark.document_id.to_s }
×
45
    @documents = search_service.fetch(bookmark_ids, { rows: bookmark_ids.count, fl: "author_citation_display, title_citation_display, pub_citation_display, number_of_pages_citation_display, pub_date_start_sort, edition_display, format" })
×
46
  end
47

48
  def csv
2✔
49
    fetch_bookmarked_documents
×
50
    send_data csv_output, type: 'text/csv', filename: "bookmarks-#{Time.zone.today}.csv"
×
51
  end
52

53
  private
2✔
54

55
    # :reek:TooManyStatements
56
    def fetch_bookmarked_documents
2✔
57
      bookmarks = token_or_current_or_guest_user.bookmarks
×
58
      bookmark_ids = bookmarks.collect { |bookmark| bookmark.document_id.to_s }
×
59
      bookmark_count = bookmark_ids.length
×
60
      search_params = params.to_unsafe_h
×
61
      search_params[:f] = { id: bookmark_ids }
×
62
      search_params[:rows] = bookmark_count
×
63
      q_param = search_params[:q]
×
64
      has_query = q_param.present?
×
65

66
      if has_query
×
67
        @filtered_bookmark_ids = solr_filtered_bookmark_ids(q_param, bookmark_ids, bookmark_count)
×
68
        @documents = fetch_documents(@filtered_bookmark_ids)
×
69
      else
70
        @filtered_bookmark_ids = bookmark_ids
×
71
        @documents = fetch_documents(bookmark_ids)
×
72
      end
73
    end
74

75
    # byte-order-mark declaring our output as UTF-8 (required for non-ASCII to be handled by Excel)
76
    def csv_bom
2✔
77
      %w[EF BB BF].map { |a| a.hex.chr }.join
×
78
    end
79

80
    def csv_fields
2✔
81
      {
×
82
        id: 'ID',
83
        title_citation_display: ['Title', 'Title (Original Script)'],
84
        author_display: ['Author', 'Author (Original Script)'],
85
        format: 'Format',
86
        language_facet: 'Language',
87
        pub_citation_display: 'Published/Created',
88
        pub_date_display: 'Date',
89
        description_display: 'Description',
90
        series_display: 'Series',
91
        location: 'Library',
92
        location_display: 'Location',
93
        call_number_display: 'Call Number',
94
        notes_display: 'Notes',
95
        edition_display: 'Edition'
96
      }
97
    end
98

99
    def csv_output
2✔
100
      CSV.generate(csv_bom, headers: true) do |csv|
×
101
        csv << csv_fields.values.flatten
×
102
        @documents.each do |doc|
×
103
          csv << csv_fields.keys.map { |field| csv_values(doc, field) }.flatten
×
104
        end
105
      end
106
    end
107

108
    def csv_values(doc, field)
2✔
109
      if csv_fields[field] == 'ID'
×
110
        "'#{doc[field]}'"
×
111
      elsif csv_fields[field].is_a?(Array)
×
112
        two_values(doc[field])
×
113
      else
114
        Array(doc[field]).join('; ')
×
115
      end
116
    end
117

118
    def two_values(arr)
2✔
119
      values = arr || ['', '']
×
120
      values << '' if values.length == 1
×
121
      values.map { |v| v.chomp(' /') }
×
122
    end
123

124
    # :reek:UtilityFunction
125
    def solr_filtered_bookmark_ids(q_param, bookmark_ids, bookmark_count)
2✔
126
      solr = Blacklight.default_index.connection
×
127
      solr_params = {
128
        q: q_param.presence || '*:*',
×
129
        fq: ["id:(#{bookmark_ids.join(' ')})"],
130
        fl: 'id',
131
        rows: bookmark_count
132
      }
133
      response = solr.get 'select', params: solr_params
×
134
      response['response']['docs'].pluck('id')
×
135
    end
136

137
    def fetch_documents(ids)
2✔
138
      search_service.fetch(ids, rows: ids.length, fl: '*')
×
139
    end
140
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc