blacklight-spotlight 0.8.0 → 0.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 351909ac5de4d14fb42941ccf4a0f256a1e5f33a
4
- data.tar.gz: dc6ff75445a24ca3ee49ef3776ea0b3ab6b37b62
3
+ metadata.gz: 79f3c55215f17eb642d2939afb0a526090b929ae
4
+ data.tar.gz: 73621327bd47b37ef54c0a083cfd3efdbe170223
5
5
  SHA512:
6
- metadata.gz: d26fcd3db00fb8981613e734e698e05d1cc416ce1e8e205bdf2f6748e7a912fcefab2008a3b432a124e363e54a2b26623edfbf6c34299cbd67f18d7b47c59504
7
- data.tar.gz: b6abc8e74091524fcb57b34175a54541929b070ad9c44c24349e8539d6e11e7c19fe8819960b10a0dafb86c43a0eaaa1cca74b924351bdd96d3d433e16c81ef9
6
+ metadata.gz: 30ec54bcc766d93a529f47cfdec4ccef3dd0fc5fe1f361dea825c4020fab77c9b5de4268801c850e4706bf7167312f870517a09191bdc6492d9ef14b275bc966
7
+ data.tar.gz: 8e01d90acd6a9c838d8cfe59d18caa50dbe02a39f5838af87b4764c798911b82da81b97bb3cdaee2c5e8bb917567fc3e7b718ad54d724bdfa831b5cfddf80a42
@@ -14,6 +14,7 @@
14
14
  //= require lodash
15
15
  //= require sir-trevor
16
16
  //= require nestable
17
+ //= require parameterize
17
18
  //= require spotlight/spotlight
18
19
  //= require bootstrap/tab
19
20
  //= require bootstrap/tooltip
@@ -1,4 +1,18 @@
1
1
  Spotlight.onLoad(function() {
2
+
3
+ // auto-fill the exhibit slug on the new exhibit form
4
+ $('#new_exhibit').each(function() {
5
+ $('#exhibit_title').on('change keyup', function() {
6
+ $('#exhibit_slug').attr('placeholder', URLify($(this).val(), $(this).val().length));
7
+ });
8
+
9
+ $('#exhibit_slug').on('focus', function() {
10
+ if ($(this).val() === '') {
11
+ $(this).val($(this).attr('placeholder'));
12
+ }
13
+ });
14
+ });
15
+
2
16
  $("#another-email").on("click", function() {
3
17
  var container = $(this).closest('.form-group');
4
18
  var contacts = container.find('.contact');
@@ -24,5 +38,5 @@ Spotlight.onLoad(function() {
24
38
  // Put focus in saved search title input when Save this search modal is shown
25
39
  $('#save-modal').on('shown.bs.modal', function () {
26
40
  $('#search_title').focus();
27
- })
41
+ });
28
42
  });
@@ -25,13 +25,17 @@ $image-overlay-bottom-margin: $padding-large-vertical * 3;
25
25
  }
26
26
 
27
27
  .image-overlay {
28
- img {width: 100%;}
29
- position: relative;
28
+ border: 2px solid $gray-light;
29
+ border-radius: $border-radius-large;
30
30
  margin-bottom: $image-overlay-bottom-margin;
31
31
  max-height: 240px;
32
- border-radius: $border-radius-large;
33
- border: 2px solid $gray-light;
32
+ min-height: 140px;
34
33
  overflow: hidden;
34
+ position: relative;
35
+
36
+ img {
37
+ width: 100%;
38
+ }
35
39
  }
36
40
 
37
41
  .text-overlay {
@@ -92,7 +92,7 @@ module Spotlight
92
92
  params.require(:exhibit).permit(
93
93
  :title,
94
94
  :slug
95
- )
95
+ ).reject { |_k, v| v.blank? }
96
96
  end
97
97
 
98
98
  def import_exhibit_params
@@ -0,0 +1,14 @@
1
+ module Spotlight
2
+ ###
3
+ # Calls the #set_default_thumbnail method
4
+ # on the object passed in and calls save
5
+ ###
6
+ class DefaultThumbnailJob < ActiveJob::Base
7
+ queue_as :default
8
+
9
+ def perform(thumbnailable)
10
+ thumbnailable.set_default_thumbnail
11
+ thumbnailable.save
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,25 @@
1
+ module Spotlight
2
+ ###
3
+ # Simple concern to mixin to classes that
4
+ # fetches a default thumbnail after creation
5
+ # Classes that mixin this module should implement
6
+ # a set_default_thumbnail method themselves
7
+ ###
8
+ module DefaultThumbnailable
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+ after_create(:fetch_default_thumb_later) if respond_to?(:after_create)
13
+ end
14
+
15
+ private
16
+
17
+ def fetch_default_thumb_later
18
+ DefaultThumbnailJob.perform_later(self)
19
+ end
20
+
21
+ def set_default_thumbnail
22
+ fail NotImplementedError
23
+ end
24
+ end
25
+ end
@@ -7,6 +7,7 @@ module Spotlight
7
7
  include Spotlight::ExhibitDocuments
8
8
 
9
9
  scope :published, -> { where(published: true) }
10
+ scope :unpublished, -> { where(published: false) }
10
11
 
11
12
  extend FriendlyId
12
13
  friendly_id :title, use: [:slugged, :finders]
@@ -49,6 +50,7 @@ module Spotlight
49
50
  after_create :initialize_config
50
51
  after_create :initialize_browse
51
52
  after_create :initialize_main_navigation
53
+ include Spotlight::DefaultThumbnailable
52
54
 
53
55
  scope :published, -> { where(published: true) }
54
56
 
@@ -85,6 +87,10 @@ module Spotlight
85
87
  blacklight_config.search_fields.any? { |_k, v| v.enabled && v.include_in_simple_select != false }
86
88
  end
87
89
 
90
+ def set_default_thumbnail
91
+ self.thumbnail ||= searches.first.try(:thumbnail)
92
+ end
93
+
88
94
  protected
89
95
 
90
96
  def initialize_config
@@ -4,11 +4,7 @@ module Spotlight
4
4
  class FeaturedImage < ActiveRecord::Base
5
5
  mount_uploader :image, Spotlight::FeaturedImageUploader
6
6
 
7
- before_validation do
8
- if document && document.uploaded_resource?
9
- self.image = document.uploaded_resource.url.file
10
- end
11
- end
7
+ before_validation :set_image_from_uploaded_resource
12
8
 
13
9
  after_save do
14
10
  if image.present?
@@ -33,6 +29,19 @@ module Spotlight
33
29
  end
34
30
 
35
31
  @document ||= GlobalID::Locator.locate document_global_id
32
+
33
+ rescue Blacklight::Exceptions::RecordNotFound => e
34
+ Rails.logger.info("Exception fetching record by id: #{document_global_id}")
35
+ Rails.logger.info(e)
36
+
37
+ nil
38
+ end
39
+
40
+ private
41
+
42
+ def set_image_from_uploaded_resource
43
+ return unless document && document.uploaded_resource?
44
+ self.image = document.uploaded_resource.url.file
36
45
  end
37
46
  end
38
47
  end
@@ -2,6 +2,7 @@ module Spotlight
2
2
  ##
3
3
  # Exhibit saved searches
4
4
  class Search < ActiveRecord::Base
5
+ include DefaultThumbnailable
5
6
  extend FriendlyId
6
7
  friendly_id :title, use: [:slugged, :scoped, :finders, :history], scope: :exhibit
7
8
 
@@ -18,8 +19,6 @@ module Spotlight
18
19
  accepts_nested_attributes_for :thumbnail, update_only: true
19
20
  accepts_nested_attributes_for :masthead, update_only: true
20
21
 
21
- before_create :set_default_featured_image
22
-
23
22
  include Blacklight::SearchHelper
24
23
  include Spotlight::Catalog::AccessControlsEnforcement
25
24
 
@@ -55,6 +54,19 @@ module Spotlight
55
54
  masthead && masthead.display?
56
55
  end
57
56
 
57
+ def set_default_thumbnail
58
+ self.thumbnail ||= begin
59
+ doc = documents.detect { |x| x.first(Spotlight::Engine.config.full_image_field) }
60
+ if doc
61
+ create_thumbnail(
62
+ source: 'exhibit',
63
+ document_global_id: doc.to_global_id.to_s,
64
+ remote_image_url: doc.first(Spotlight::Engine.config.full_image_field)
65
+ )
66
+ end
67
+ end
68
+ end
69
+
58
70
  private
59
71
 
60
72
  def solr_response
@@ -79,15 +91,6 @@ module Spotlight
79
91
  title_changed?
80
92
  end
81
93
 
82
- def set_default_featured_image
83
- self.thumbnail ||= begin
84
- doc = documents.detect { |x| x.first(Spotlight::Engine.config.full_image_field) }
85
- if doc
86
- create_thumbnail source: 'exhibit', document_global_id: doc.to_global_id.to_s, remote_image_url: doc.first(Spotlight::Engine.config.full_image_field)
87
- end
88
- end
89
- end
90
-
91
94
  alias_method :current_exhibit, :exhibit
92
95
  end
93
96
  end
@@ -13,6 +13,8 @@ module Spotlight
13
13
  def image
14
14
  file = represented.image.file
15
15
 
16
+ return unless file
17
+
16
18
  { filename: file.filename, content_type: file.content_type, content: Base64.encode64(file.read) }
17
19
  end
18
20
 
@@ -1,7 +1,7 @@
1
1
  <div class="col-xs-12 col-sm-4 exhibit-card">
2
2
  <div class="flipper">
3
3
  <div class="card-front card-face">
4
- <%= image_tag(exhibit.thumbnail.image.url) if exhibit.thumbnail.present? %>
4
+ <%= image_tag(exhibit.thumbnail.image.cropped.url) if exhibit.thumbnail.present? %>
5
5
  <h2 class="card-title"><%= exhibit.title %></h2>
6
6
  </div>
7
7
  <div class="card-back card-face">
@@ -0,0 +1,3 @@
1
+ <li>
2
+ <%= link_to exhibit.title, exhibit %>
3
+ </li>
@@ -10,6 +10,15 @@
10
10
  </div>
11
11
  <% end %>
12
12
  <% end %>
13
+
14
+ <% private_exhibits = @exhibits.unpublished.accessible_by(current_ability) %>
15
+
16
+ <% if private_exhibits.any? %>
17
+ <h2><%= t(:'.private') %></h2>
18
+ <ul>
19
+ <%= render collection: private_exhibits, partial: 'exhibit_list', as: 'exhibit' %>
20
+ </ul>
21
+ <% end %>
13
22
  </div>
14
23
 
15
24
  <aside class="col-md-3">
@@ -302,6 +302,8 @@ en:
302
302
  header: "Most popular pages"
303
303
  exhibits:
304
304
  breadcrumb: Home
305
+ index:
306
+ private: Private exhibits
305
307
  delete:
306
308
  heading: Delete exhibit
307
309
  warning_html: >
@@ -1,4 +1,4 @@
1
1
  #
2
2
  module Spotlight
3
- VERSION = '0.8.0'
3
+ VERSION = '0.8.1'
4
4
  end
@@ -27,5 +27,21 @@ describe 'Create a new exhibit', type: :feature do
27
27
  click_button 'Save'
28
28
 
29
29
  expect(page).to have_content 'The exhibit was created.'
30
+ expect(Spotlight::Exhibit.last.slug).to eq 'my-exhibit-title'
31
+ end
32
+
33
+ it 'allows admins to create a new exhibit with a slug' do
34
+ visit '/'
35
+ within '.dropdown-menu' do
36
+ click_link 'Create Exhibit'
37
+ end
38
+
39
+ fill_in 'Title', with: 'My exhibit title'
40
+ fill_in 'URL slug', with: 'custom-slug'
41
+
42
+ click_button 'Save'
43
+
44
+ expect(page).to have_content 'The exhibit was created.'
45
+ expect(Spotlight::Exhibit.last.slug).to eq 'custom-slug'
30
46
  end
31
47
  end
@@ -8,7 +8,7 @@ describe 'Exhibits index page', type: :feature do
8
8
  it 'shows some cards for each published exhibit' do
9
9
  visit spotlight.exhibits_path
10
10
 
11
- within '.exhibit-card:first' do
11
+ within '.exhibit-card:first-child' do
12
12
  expect(page).to have_selector 'h2', text: 'Some Exhibit Title'
13
13
  end
14
14
  end
@@ -31,7 +31,6 @@ the export option behind a bootstrap tab)))
31
31
  end
32
32
 
33
33
  it 'allows admins to import content into an exhibit' do
34
- pending 'PhantomJS 2.0.0 is unable to upload files; see https://github.com/ariya/phantomjs/issues/12506'
35
34
  visit spotlight.exhibit_home_page_path(exhibit, exhibit.home_page)
36
35
 
37
36
  click_link user.email
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spotlight::DefaultThumbnailJob do
4
+ let(:thumbnailable) { double('Thumbnailable') }
5
+ subject { described_class.new(thumbnailable) }
6
+
7
+ it 'calls #set_default_thumbnail on the object passed in and saves' do
8
+ expect(thumbnailable).to receive(:set_default_thumbnail)
9
+ expect(thumbnailable).to receive(:save)
10
+
11
+ subject.perform_now
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spotlight::DefaultThumbnailable do
4
+ let(:test_class) { Class.new }
5
+ subject { test_class.new }
6
+ before { subject.extend(described_class) }
7
+
8
+ it 'invokes DefaultThumbnailJob job' do
9
+ expect(Spotlight::DefaultThumbnailJob).to receive(:perform_later).with(subject)
10
+ subject.send(:fetch_default_thumb_later)
11
+ end
12
+
13
+ it 'raises a NotImplementedError if the class does not have a set_default_thumbnail method' do
14
+ expect do
15
+ subject.send(:set_default_thumbnail)
16
+ end.to raise_error(NotImplementedError)
17
+ end
18
+ end
@@ -47,6 +47,23 @@ describe Spotlight::Exhibit, type: :model do
47
47
  end
48
48
  end
49
49
 
50
+ context 'thumbnail' do
51
+ it 'calls DefaultThumbnailJob to fetch a default feature image' do
52
+ expect(Spotlight::DefaultThumbnailJob).to receive(:perform_later).with(subject.searches.first)
53
+ expect(Spotlight::DefaultThumbnailJob).to receive(:perform_later).with(subject)
54
+ subject.save!
55
+ end
56
+
57
+ context '#set_default_thumbnail' do
58
+ before { subject.save! }
59
+ it 'uses the thubmnail from the first search' do
60
+ subject.set_default_thumbnail
61
+ expect(subject.thumbnail).not_to be_nil
62
+ expect(subject.thumbnail).to eq subject.searches.first.thumbnail
63
+ end
64
+ end
65
+ end
66
+
50
67
  describe '#main_navigations' do
51
68
  subject { FactoryGirl.create(:exhibit, title: 'Sample') }
52
69
  it 'has main navigations' do
@@ -17,18 +17,27 @@ describe Spotlight::Search, type: :model do
17
17
 
18
18
  it { is_expected.to be_a Spotlight::Catalog::AccessControlsEnforcement }
19
19
 
20
- it 'has a default feature image' do
21
- allow(subject).to receive_messages(documents: [document])
22
- subject.save!
23
- expect(subject.thumbnail).not_to be_nil
24
- expect(subject.thumbnail.image.path).to end_with 'default.jpg'
25
- end
20
+ context 'thumbnail' do
21
+ it 'calls DefaultThumbnailJob to fetch a default feature image' do
22
+ expect(Spotlight::DefaultThumbnailJob).to receive(:perform_later).with(subject)
23
+ subject.save!
24
+ end
26
25
 
27
- it 'uses a document with an image for the default feature image' do
28
- allow(subject).to receive_messages(documents: [document_without_an_image, document])
29
- subject.save!
30
- expect(subject.thumbnail).not_to be_nil
31
- expect(subject.thumbnail.image.path).to end_with 'default.jpg'
26
+ context '#set_default_thumbnail' do
27
+ it 'has a default feature image' do
28
+ allow(subject).to receive_messages(documents: [document])
29
+ subject.set_default_thumbnail
30
+ expect(subject.thumbnail).not_to be_nil
31
+ expect(subject.thumbnail.image.path).to end_with 'default.jpg'
32
+ end
33
+
34
+ it 'uses a document with an image for the default feature image' do
35
+ allow(subject).to receive_messages(documents: [document_without_an_image, document])
36
+ subject.set_default_thumbnail
37
+ expect(subject.thumbnail).not_to be_nil
38
+ expect(subject.thumbnail.image.path).to end_with 'default.jpg'
39
+ end
40
+ end
32
41
  end
33
42
 
34
43
  it 'has items' do
@@ -195,6 +195,32 @@ describe Spotlight::ExhibitExportSerializer do
195
195
  expect(subject.searches.first.thumbnail).not_to be_blank
196
196
  expect(subject.searches.first.thumbnail.image.file.path).not_to eq search.thumbnail.image.file.path
197
197
  end
198
+
199
+ context 'without an attached image' do
200
+ before do
201
+ search.masthead.remove_image!
202
+ search.masthead.save
203
+ end
204
+
205
+ it 'copies the masthead without an image' do
206
+ expect(subject.searches.last.masthead).not_to be_blank
207
+ expect(subject.searches.last.masthead.image).to be_blank
208
+ end
209
+ end
210
+
211
+ context 'with a thumbnail from an uploaded resource' do
212
+ before do
213
+ search.masthead.document_global_id = SolrDocument.new(id: 'xyz').to_global_id
214
+ search.masthead.source = 'exhibit'
215
+ search.masthead.save
216
+
217
+ source_exhibit.reload
218
+ end
219
+
220
+ it 'copies the resource' do
221
+ expect(subject.searches.last.masthead).not_to be_blank
222
+ end
223
+ end
198
224
  end
199
225
 
200
226
  context 'with a masthead' do
@@ -3,10 +3,12 @@ require 'spec_helper'
3
3
  module Spotlight
4
4
  describe 'spotlight/exhibits/index', type: :view do
5
5
  let(:exhibits) { Spotlight::Exhibit.none }
6
+ let(:ability) { ::Ability.new(user) }
7
+ let(:user) { ::User.new }
6
8
 
7
9
  before do
8
10
  assign(:exhibits, exhibits)
9
- allow(view).to receive_messages(exhibit_path: '/')
11
+ allow(view).to receive_messages(exhibit_path: '/', current_ability: ability)
10
12
  end
11
13
 
12
14
  context 'with published exhibits' do
@@ -23,6 +25,19 @@ module Spotlight
23
25
  expect(rendered).to have_text exhibit_a.title
24
26
  expect(rendered).to have_text exhibit_b.title
25
27
  expect(rendered).not_to have_text exhibit_c.title
28
+
29
+ expect(rendered).not_to include 'Private exhibits'
30
+ end
31
+
32
+ context 'with an authorized user' do
33
+ let(:user) { FactoryGirl.create(:site_admin) }
34
+
35
+ it 'includes a list of unpublished exhibits' do
36
+ render
37
+
38
+ expect(rendered).to include 'Private exhibits'
39
+ expect(rendered).to have_text exhibit_c.title
40
+ end
26
41
  end
27
42
  end
28
43
 
@@ -0,0 +1,137 @@
1
+ /*
2
+ https://gist.github.com/pjambet/3710461
3
+ */
4
+ var LATIN_MAP = {
5
+ 'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç':
6
+ 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I',
7
+ 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö':
8
+ 'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U',
9
+ 'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä':
10
+ 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
11
+ 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó':
12
+ 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u',
13
+ 'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y'
14
+ }
15
+ var LATIN_SYMBOLS_MAP = {
16
+ '©':'(c)'
17
+ }
18
+ var GREEK_MAP = {
19
+ 'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8',
20
+ 'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p',
21
+ 'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w',
22
+ 'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s',
23
+ 'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i',
24
+ 'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8',
25
+ 'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P',
26
+ 'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W',
27
+ 'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I',
28
+ 'Ϋ':'Y'
29
+ }
30
+ var TURKISH_MAP = {
31
+ 'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U',
32
+ 'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G'
33
+ }
34
+ var RUSSIAN_MAP = {
35
+ 'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh',
36
+ 'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o',
37
+ 'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c',
38
+ 'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu',
39
+ 'я':'ya',
40
+ 'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh',
41
+ 'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O',
42
+ 'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C',
43
+ 'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'', 'Ы':'Y', 'Ь':'', 'Э':'E', 'Ю':'Yu',
44
+ 'Я':'Ya'
45
+ }
46
+ var UKRAINIAN_MAP = {
47
+ 'Є':'Ye', 'І':'I', 'Ї':'Yi', 'Ґ':'G', 'є':'ye', 'і':'i', 'ї':'yi', 'ґ':'g'
48
+ }
49
+ var CZECH_MAP = {
50
+ 'č':'c', 'ď':'d', 'ě':'e', 'ň': 'n', 'ř':'r', 'š':'s', 'ť':'t', 'ů':'u',
51
+ 'ž':'z', 'Č':'C', 'Ď':'D', 'Ě':'E', 'Ň': 'N', 'Ř':'R', 'Š':'S', 'Ť':'T',
52
+ 'Ů':'U', 'Ž':'Z'
53
+ }
54
+
55
+ var POLISH_MAP = {
56
+ 'ą':'a', 'ć':'c', 'ę':'e', 'ł':'l', 'ń':'n', 'ó':'o', 'ś':'s', 'ź':'z',
57
+ 'ż':'z', 'Ą':'A', 'Ć':'C', 'Ę':'e', 'Ł':'L', 'Ń':'N', 'Ó':'o', 'Ś':'S',
58
+ 'Ź':'Z', 'Ż':'Z'
59
+ }
60
+
61
+ var LATVIAN_MAP = {
62
+ 'ā':'a', 'č':'c', 'ē':'e', 'ģ':'g', 'ī':'i', 'ķ':'k', 'ļ':'l', 'ņ':'n',
63
+ 'š':'s', 'ū':'u', 'ž':'z', 'Ā':'A', 'Č':'C', 'Ē':'E', 'Ģ':'G', 'Ī':'i',
64
+ 'Ķ':'k', 'Ļ':'L', 'Ņ':'N', 'Š':'S', 'Ū':'u', 'Ž':'Z'
65
+ }
66
+
67
+ var ALL_DOWNCODE_MAPS=new Array()
68
+ ALL_DOWNCODE_MAPS[0]=LATIN_MAP
69
+ ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP
70
+ ALL_DOWNCODE_MAPS[2]=GREEK_MAP
71
+ ALL_DOWNCODE_MAPS[3]=TURKISH_MAP
72
+ ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP
73
+ ALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP
74
+ ALL_DOWNCODE_MAPS[6]=CZECH_MAP
75
+ ALL_DOWNCODE_MAPS[7]=POLISH_MAP
76
+ ALL_DOWNCODE_MAPS[8]=LATVIAN_MAP
77
+
78
+ var Downcoder = new Object();
79
+ Downcoder.Initialize = function()
80
+ {
81
+ if (Downcoder.map) // already made
82
+ return ;
83
+ Downcoder.map ={}
84
+ Downcoder.chars = '' ;
85
+ for(var i in ALL_DOWNCODE_MAPS)
86
+ {
87
+ var lookup = ALL_DOWNCODE_MAPS[i]
88
+ for (var c in lookup)
89
+ {
90
+ Downcoder.map[c] = lookup[c] ;
91
+ Downcoder.chars += c ;
92
+ }
93
+ }
94
+ Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ;
95
+ }
96
+
97
+ downcode= function( slug )
98
+ {
99
+ Downcoder.Initialize() ;
100
+ var downcoded =""
101
+ var pieces = slug.match(Downcoder.regex);
102
+ if(pieces)
103
+ {
104
+ for (var i = 0 ; i < pieces.length ; i++)
105
+ {
106
+ if (pieces[i].length == 1)
107
+ {
108
+ var mapped = Downcoder.map[pieces[i]] ;
109
+ if (mapped != null)
110
+ {
111
+ downcoded+=mapped;
112
+ continue ;
113
+ }
114
+ }
115
+ downcoded+=pieces[i];
116
+ }
117
+ }
118
+ else
119
+ {
120
+ downcoded = slug;
121
+ }
122
+ return downcoded;
123
+ }
124
+
125
+
126
+ function URLify(s, num_chars) {
127
+ // changes, e.g., "Petty theft" to "petty_theft"
128
+ // remove all these words from the string before urlifying
129
+ s = downcode(s);
130
+ //
131
+ // if downcode doesn't hit, the char will be stripped here
132
+ s = s.replace(/[^-\w\s]/g, ' '); // remove unneeded chars
133
+ s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
134
+ s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
135
+ s = s.toLowerCase(); // convert to lowercase
136
+ return s.substring(0, num_chars);// trim to first num_chars chars
137
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blacklight-spotlight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Beer
@@ -814,6 +814,7 @@ files:
814
814
  - app/helpers/spotlight/search_configurations_helper.rb
815
815
  - app/helpers/spotlight/title_helper.rb
816
816
  - app/jobs/spotlight/add_uploads_from_csv.rb
817
+ - app/jobs/spotlight/default_thumbnail_job.rb
817
818
  - app/jobs/spotlight/reindex_job.rb
818
819
  - app/jobs/spotlight/rename_sidecar_field_job.rb
819
820
  - app/mailers/spotlight/confirmation_mailer.rb
@@ -821,6 +822,7 @@ files:
821
822
  - app/models/ability.rb
822
823
  - app/models/concerns/spotlight/ar_light.rb
823
824
  - app/models/concerns/spotlight/blacklight_configuration_defaults.rb
825
+ - app/models/concerns/spotlight/default_thumbnailable.rb
824
826
  - app/models/concerns/spotlight/exhibit_analytics.rb
825
827
  - app/models/concerns/spotlight/exhibit_documents.rb
826
828
  - app/models/concerns/spotlight/image_derivatives.rb
@@ -953,6 +955,7 @@ files:
953
955
  - app/views/spotlight/exhibits/_contact.html.erb
954
956
  - app/views/spotlight/exhibits/_delete.html.erb
955
957
  - app/views/spotlight/exhibits/_exhibit_card.html.erb
958
+ - app/views/spotlight/exhibits/_exhibit_list.html.erb
956
959
  - app/views/spotlight/exhibits/_export.html.erb
957
960
  - app/views/spotlight/exhibits/_form.html.erb
958
961
  - app/views/spotlight/exhibits/_import.html.erb
@@ -1185,6 +1188,7 @@ files:
1185
1188
  - spec/helpers/spotlight/roles_helper_spec.rb
1186
1189
  - spec/helpers/spotlight/search_configurations_helper_spec.rb
1187
1190
  - spec/helpers/spotlight/title_helper_spec.rb
1191
+ - spec/jobs/spotlight/default_thumbnail_job_spec.rb
1188
1192
  - spec/jobs/spotlight/reindex_job_spec.rb
1189
1193
  - spec/jobs/spotlight/rename_sidecar_field_job_spec.rb
1190
1194
  - spec/lib/spotlight/catalog/access_controls_enforcement_spec.rb
@@ -1201,6 +1205,7 @@ files:
1201
1205
  - spec/models/spotlight/contact_email_spec.rb
1202
1206
  - spec/models/spotlight/contact_spec.rb
1203
1207
  - spec/models/spotlight/custom_field_spec.rb
1208
+ - spec/models/spotlight/default_thumbnailable_concern_spec.rb
1204
1209
  - spec/models/spotlight/exhibit_spec.rb
1205
1210
  - spec/models/spotlight/feature_page_spec.rb
1206
1211
  - spec/models/spotlight/featured_image_spec.rb
@@ -1286,6 +1291,7 @@ files:
1286
1291
  - vendor/assets/javascripts/jquery.serializejson.js
1287
1292
  - vendor/assets/javascripts/jquery.waitforimages.min.js
1288
1293
  - vendor/assets/javascripts/nestable.js
1294
+ - vendor/assets/javascripts/parameterize.js
1289
1295
  - vendor/assets/javascripts/sir-trevor.js
1290
1296
  - vendor/assets/javascripts/typeahead.bundle.min.js
1291
1297
  - vendor/assets/stylesheets/bootstrap-tagsinput.css
@@ -1411,6 +1417,7 @@ test_files:
1411
1417
  - spec/helpers/spotlight/roles_helper_spec.rb
1412
1418
  - spec/helpers/spotlight/search_configurations_helper_spec.rb
1413
1419
  - spec/helpers/spotlight/title_helper_spec.rb
1420
+ - spec/jobs/spotlight/default_thumbnail_job_spec.rb
1414
1421
  - spec/jobs/spotlight/reindex_job_spec.rb
1415
1422
  - spec/jobs/spotlight/rename_sidecar_field_job_spec.rb
1416
1423
  - spec/lib/spotlight/catalog/access_controls_enforcement_spec.rb
@@ -1427,6 +1434,7 @@ test_files:
1427
1434
  - spec/models/spotlight/contact_email_spec.rb
1428
1435
  - spec/models/spotlight/contact_spec.rb
1429
1436
  - spec/models/spotlight/custom_field_spec.rb
1437
+ - spec/models/spotlight/default_thumbnailable_concern_spec.rb
1430
1438
  - spec/models/spotlight/exhibit_spec.rb
1431
1439
  - spec/models/spotlight/feature_page_spec.rb
1432
1440
  - spec/models/spotlight/featured_image_spec.rb