blacklight-spotlight 3.0.0.alpha.10 → 3.0.0.rc1
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 +4 -4
- data/app/assets/javascripts/spotlight/admin/crop.es6 +6 -0
- data/app/assets/javascripts/spotlight/admin/sir-trevor/block_controls.js +21 -12
- data/app/assets/stylesheets/spotlight/_featured_browse_categories_block.scss +4 -4
- data/app/assets/stylesheets/spotlight/_item_text_block.scss +6 -0
- data/app/assets/stylesheets/spotlight/_report_a_problem.scss +5 -2
- data/app/controllers/spotlight/resources/csv_upload_controller.rb +1 -1
- data/app/jobs/spotlight/add_uploads_from_csv.rb +30 -5
- data/app/mailers/spotlight/indexing_complete_mailer.rb +3 -2
- data/app/models/spotlight/contact.rb +1 -1
- data/app/models/spotlight/custom_field.rb +3 -3
- data/app/models/spotlight/featured_image.rb +1 -1
- data/app/models/spotlight/page_configurations.rb +1 -0
- data/app/models/spotlight/page_content.rb +2 -0
- data/app/models/spotlight/resources/csv_upload.rb +2 -1
- data/app/models/spotlight/resources/iiif_manifest.rb +2 -0
- data/app/services/spotlight/solr_document_builder.rb +1 -0
- data/app/values/custom_field_name.rb +1 -0
- data/app/views/spotlight/indexing_complete_mailer/documents_indexed.html.erb +9 -0
- data/app/views/spotlight/pages/_form.html.erb +1 -1
- data/app/views/spotlight/shared/_honeypot_field.html.erb +4 -0
- data/app/views/spotlight/shared/_report_a_problem.html.erb +7 -10
- data/config/i18n-tasks.yml +2 -0
- data/config/locales/spotlight.ar.yml +22 -18
- data/config/locales/spotlight.en.yml +13 -6
- data/lib/generators/spotlight/install_generator.rb +22 -1
- data/lib/generators/spotlight/templates/config/initializers/sir_trevor_rails.rb +10 -0
- data/lib/generators/spotlight/templates/config/initializers/spotlight_initializer.rb +2 -0
- data/lib/spotlight/engine.rb +3 -0
- data/lib/spotlight/upload_field_config.rb +1 -0
- data/lib/spotlight/version.rb +1 -1
- data/spec/controllers/spotlight/browse_controller_spec.rb +1 -1
- data/spec/controllers/spotlight/resources/csv_upload_controller_spec.rb +4 -4
- data/spec/examples.txt +1410 -125
- data/spec/features/add_contacts_spec.rb +1 -1
- data/spec/features/browse_category_admin_spec.rb +2 -2
- data/spec/features/create_exhibit_spec.rb +5 -4
- data/spec/features/dashboard_spec.rb +5 -5
- data/spec/features/exhibits/administration_spec.rb +3 -3
- data/spec/features/exhibits/language_create_edit_spec.rb +3 -3
- data/spec/features/javascript/block_controls_spec.rb +2 -0
- data/spec/features/report_a_problem_spec.rb +5 -4
- data/spec/helpers/spotlight/pages_helper_spec.rb +2 -2
- data/spec/jobs/spotlight/add_uploads_from_csv_spec.rb +13 -1
- data/spec/mailers/spotlight/indexing_complete_mailer_spec.rb +11 -1
- data/spec/models/solr_document_spec.rb +2 -3
- data/spec/models/spotlight/access_controls_enforcement_search_builder_spec.rb +1 -0
- data/spec/models/spotlight/featured_image_spec.rb +0 -1
- data/spec/models/spotlight/role_spec.rb +2 -2
- data/spec/services/spotlight/exhibit_import_export_service_spec.rb +14 -2
- data/spec/services/spotlight/iiif_resource_resolver_spec.rb +1 -1
- data/spec/test_app_templates/Gemfile.extra +0 -3
- data/spec/views/spotlight/metadata_configurations/_metadata_field.html.erb_spec.rb +3 -3
- data/spec/views/spotlight/search_configurations/_sort.html.erb_spec.rb +7 -8
- data/vendor/assets/javascripts/leaflet-iiif.js +46 -21
- metadata +54 -24
@@ -17,7 +17,7 @@ describe 'Add a contact to an exhibit', type: :feature do
|
|
17
17
|
fill_in 'Location', with: 'Rome'
|
18
18
|
fill_in 'Telephone', with: '(555) 555-5555 ext. 12345 (mobile)'
|
19
19
|
|
20
|
-
|
20
|
+
find('input[name="commit"]').click
|
21
21
|
end
|
22
22
|
expect(page).to have_content 'The contact was created.'
|
23
23
|
|
@@ -21,7 +21,7 @@ describe 'Browse Category Administration', type: :feature do
|
|
21
21
|
expect(page).to have_css('#save-modal')
|
22
22
|
fill_in 'search_title', with: 'Some search'
|
23
23
|
expect do
|
24
|
-
|
24
|
+
find('input[name="commit"]').click
|
25
25
|
exhibit.searches.reload
|
26
26
|
end.to change { exhibit.searches.count }.by 1
|
27
27
|
expect(exhibit.searches.last.query_params).to eq 'q' => 'xyz'
|
@@ -32,7 +32,7 @@ describe 'Browse Category Administration', type: :feature do
|
|
32
32
|
click_button 'Save this search'
|
33
33
|
expect(page).to have_css('#save-modal')
|
34
34
|
select search.title, from: 'id'
|
35
|
-
|
35
|
+
find('input[name="commit"]').click
|
36
36
|
expect(search.reload.query_params).to eq 'q' => 'xyz'
|
37
37
|
end
|
38
38
|
end
|
@@ -24,7 +24,7 @@ describe 'Create a new exhibit', type: :feature do
|
|
24
24
|
|
25
25
|
fill_in 'Title', with: 'My exhibit title'
|
26
26
|
|
27
|
-
|
27
|
+
find('input[name="commit"]').click
|
28
28
|
|
29
29
|
expect(page).to have_content 'The exhibit was created.'
|
30
30
|
expect(Spotlight::Exhibit.last.slug).to eq 'my-exhibit-title'
|
@@ -39,7 +39,7 @@ describe 'Create a new exhibit', type: :feature do
|
|
39
39
|
fill_in 'Title', with: 'My exhibit title'
|
40
40
|
fill_in 'URL slug', with: 'custom-slug'
|
41
41
|
|
42
|
-
|
42
|
+
find('input[name="commit"]').click
|
43
43
|
|
44
44
|
expect(page).to have_content 'The exhibit was created.'
|
45
45
|
expect(Spotlight::Exhibit.last.slug).to eq 'custom-slug'
|
@@ -51,14 +51,15 @@ describe 'Create a new exhibit', type: :feature do
|
|
51
51
|
fill_in 'Title', with: 'My exhibit title'
|
52
52
|
fill_in 'URL slug', with: 'custom-slug'
|
53
53
|
|
54
|
-
|
54
|
+
find('input[name="commit"]').click
|
55
55
|
|
56
56
|
visit spotlight.new_exhibit_path
|
57
57
|
|
58
58
|
fill_in 'Title', with: 'My exhibit title'
|
59
59
|
fill_in 'URL slug', with: 'custom-slug'
|
60
60
|
|
61
|
-
|
61
|
+
find('input[name="commit"]').click
|
62
|
+
|
62
63
|
expect(page).to have_content 'has already been taken'
|
63
64
|
end
|
64
65
|
end
|
@@ -2,11 +2,6 @@
|
|
2
2
|
|
3
3
|
describe 'Dashboard', type: :feature do
|
4
4
|
let(:exhibit) { FactoryBot.create(:exhibit) }
|
5
|
-
let(:admin) { FactoryBot.create(:exhibit_admin, exhibit: exhibit) }
|
6
|
-
before do
|
7
|
-
login_as(admin)
|
8
|
-
end
|
9
|
-
|
10
5
|
let!(:parent_feature_page) do
|
11
6
|
FactoryBot.create(:feature_page, title: 'Parent Page', exhibit: exhibit)
|
12
7
|
end
|
@@ -18,6 +13,11 @@ describe 'Dashboard', type: :feature do
|
|
18
13
|
exhibit: exhibit
|
19
14
|
)
|
20
15
|
end
|
16
|
+
let(:admin) { FactoryBot.create(:exhibit_admin, exhibit: exhibit) }
|
17
|
+
|
18
|
+
before do
|
19
|
+
login_as(admin)
|
20
|
+
end
|
21
21
|
|
22
22
|
it 'includes a list of recently edited feature pages' do
|
23
23
|
visit spotlight.exhibit_dashboard_path(exhibit)
|
@@ -63,9 +63,9 @@ describe 'Exhibit Administration', type: :feature do
|
|
63
63
|
it 'updates the aria-labels properly', js: true do
|
64
64
|
visit spotlight.edit_exhibit_path(exhibit)
|
65
65
|
|
66
|
-
expect(find_field(email_id_0)['aria-label']).to eq '
|
66
|
+
expect(find_field(email_id_0)['aria-label']).to eq 'Recipient email 1'
|
67
67
|
find('#another-email').click
|
68
|
-
expect(find_field(email_id_1)['aria-label']).to eq '
|
68
|
+
expect(find_field(email_id_1)['aria-label']).to eq 'Recipient email 2'
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'allows deletion of contact email addresses', js: true do
|
@@ -135,7 +135,7 @@ describe 'Exhibit Administration', type: :feature do
|
|
135
135
|
find_all('.contact-email-delete').first.click
|
136
136
|
end
|
137
137
|
|
138
|
-
expect(page).to have_css("##{hidden_input_id_0}~div span.contact-email-delete-error", text: 'Problem deleting
|
138
|
+
expect(page).to have_css("##{hidden_input_id_0}~div span.contact-email-delete-error", text: 'Problem deleting recipient: Not Found')
|
139
139
|
end
|
140
140
|
end
|
141
141
|
end
|
@@ -13,7 +13,7 @@ describe 'Language', type: :feature do
|
|
13
13
|
it 'successfully adds languages' do
|
14
14
|
within '#language' do
|
15
15
|
select 'Albanian'
|
16
|
-
|
16
|
+
find('input[name="commit"]').click
|
17
17
|
end
|
18
18
|
expect(page).to have_css '.flash_messages', text: 'The language was created.'
|
19
19
|
within '#language' do
|
@@ -27,7 +27,7 @@ describe 'Language', type: :feature do
|
|
27
27
|
it 'successfully updates the language' do
|
28
28
|
within '#language' do
|
29
29
|
select 'Albanian'
|
30
|
-
|
30
|
+
find('input[name="commit"]').click
|
31
31
|
end
|
32
32
|
expect(page).to have_css '.flash_messages', text: 'The language was created.'
|
33
33
|
within '#language' do
|
@@ -43,7 +43,7 @@ describe 'Language', type: :feature do
|
|
43
43
|
it 'successfully updates the language' do
|
44
44
|
within '#language' do
|
45
45
|
select 'Albanian'
|
46
|
-
|
46
|
+
find('input[name="commit"]').click
|
47
47
|
end
|
48
48
|
expect(page).to have_css '.flash_messages', text: 'The language was created.'
|
49
49
|
within '#language' do
|
@@ -27,10 +27,12 @@ describe 'Block controls' do
|
|
27
27
|
|
28
28
|
within('.spotlight-block-controls') do
|
29
29
|
expect(page).to have_css('.st-controls-group', count: 2)
|
30
|
+
|
30
31
|
within(first('.st-controls-group')) do
|
31
32
|
expect(page).to have_content 'Standard widgets'
|
32
33
|
expect(page).to have_css('.st-block-controls__button')
|
33
34
|
end
|
35
|
+
|
34
36
|
within(all('.st-controls-group').last) do
|
35
37
|
expect(page).to have_content 'Exhibit item widgets'
|
36
38
|
expect(page).to have_css('.st-block-controls__button')
|
@@ -33,9 +33,10 @@ describe 'Report a Problem', type: :feature do
|
|
33
33
|
it 'accepts a problem report', js: true do
|
34
34
|
visit spotlight.exhibit_solr_document_path(exhibit, id: 'dq287tq6352')
|
35
35
|
click_on 'Feedback'
|
36
|
+
expect(page).to have_css('.alert-primary', text: '/dq287tq6352')
|
36
37
|
expect(find('#contact_form_current_url', visible: false).value).to end_with spotlight.exhibit_solr_document_path(exhibit, id: 'dq287tq6352')
|
37
|
-
fill_in '
|
38
|
-
fill_in '
|
38
|
+
fill_in 'Your name', with: 'Some Body'
|
39
|
+
fill_in 'Your email', with: 'test@example.com'
|
39
40
|
fill_in 'Message', with: 'This is my problem report'
|
40
41
|
|
41
42
|
expect do
|
@@ -47,8 +48,8 @@ describe 'Report a Problem', type: :feature do
|
|
47
48
|
visit spotlight.exhibit_solr_document_path(exhibit, id: 'dq287tq6352')
|
48
49
|
click_on 'Feedback'
|
49
50
|
expect(find('#contact_form_current_url', visible: false).value).to end_with spotlight.exhibit_solr_document_path(exhibit, id: 'dq287tq6352')
|
50
|
-
fill_in '
|
51
|
-
fill_in '
|
51
|
+
fill_in 'Your name', with: 'Some Body'
|
52
|
+
fill_in 'Your email', with: 'test@example.com'
|
52
53
|
page.evaluate_script("$('#contact_form_#{honeypot_field_name}').val('possible_spam@spam.com')")
|
53
54
|
fill_in 'Message', with: 'This is my problem report'
|
54
55
|
|
@@ -109,13 +109,13 @@ describe Spotlight::PagesHelper, type: :helper do
|
|
109
109
|
end
|
110
110
|
|
111
111
|
describe '#content_editor_class' do
|
112
|
-
context '
|
112
|
+
context 'a sir-trevor backed page with a custom class' do
|
113
113
|
it 'has a custom class' do
|
114
114
|
expect(helper.content_editor_class(Spotlight::Page.new)).to eq 'js-st-instance'
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
-
context '
|
118
|
+
context 'a sir-trevor backed page with a derived class' do
|
119
119
|
it 'derives a css class name from the editor type' do
|
120
120
|
expect(helper.content_editor_class(Spotlight::Page.new(content_type: 'Something::Custom'))).to eq 'js-something-custom-instance'
|
121
121
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
describe Spotlight::
|
3
|
+
describe Spotlight::AddUploadsFromCsv do
|
4
4
|
subject(:job) { described_class.new(data, exhibit, user) }
|
5
5
|
|
6
6
|
let(:exhibit) { FactoryBot.create(:exhibit) }
|
@@ -40,4 +40,16 @@ describe Spotlight::AddUploadsFromCSV do
|
|
40
40
|
|
41
41
|
job.perform_now
|
42
42
|
end
|
43
|
+
|
44
|
+
context 'with errors' do
|
45
|
+
it 'collects errors uploaded resources for each row of data' do
|
46
|
+
allow(Spotlight::IndexingCompleteMailer).to receive(:documents_indexed).and_return(double(deliver_now: true))
|
47
|
+
job.perform_now
|
48
|
+
expect(Spotlight::IndexingCompleteMailer).to have_received(:documents_indexed).with(
|
49
|
+
data, exhibit, user,
|
50
|
+
indexed_count: 1,
|
51
|
+
errors: { 1 => array_including(match(/relative URI: x/)), 2 => array_including(match(/Upload is invalid/)) }
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
43
55
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
describe Spotlight::IndexingCompleteMailer do
|
4
|
-
subject { described_class.documents_indexed [1, 2, 3], exhibit, user }
|
4
|
+
subject { described_class.documents_indexed [1, 2, 3], exhibit, user, indexed_count: 3 }
|
5
5
|
|
6
6
|
let(:user) { double(email: 'test@example.com') }
|
7
7
|
let(:exhibit) { double(title: 'Exhibit title') }
|
@@ -29,4 +29,14 @@ describe Spotlight::IndexingCompleteMailer do
|
|
29
29
|
it 'includes the exhibit title' do
|
30
30
|
expect(subject.body.encoded).to match exhibit.title
|
31
31
|
end
|
32
|
+
|
33
|
+
context 'with errors' do
|
34
|
+
subject { described_class.documents_indexed [], exhibit, user, indexed_count: 0, errors: { 1 => ['missing title'], 20 => ['whatever'] } }
|
35
|
+
|
36
|
+
it 'includes some errors' do
|
37
|
+
expect(subject.body.encoded).to match 'Errors'
|
38
|
+
expect(subject.body.encoded).to match 'Row 1: missing title'
|
39
|
+
expect(subject.body.encoded).to match 'Row 20: whatever'
|
40
|
+
end
|
41
|
+
end
|
32
42
|
end
|
@@ -4,14 +4,13 @@ describe SolrDocument, type: :model do
|
|
4
4
|
subject { document }
|
5
5
|
|
6
6
|
let(:document) { described_class.new(id: 'abcd123') }
|
7
|
+
let(:exhibit_alt) { FactoryBot.create(:exhibit) }
|
8
|
+
let(:exhibit) { FactoryBot.create(:exhibit) }
|
7
9
|
|
8
10
|
before do
|
9
11
|
allow(subject).to receive_messages(reindex: nil)
|
10
12
|
end
|
11
13
|
|
12
|
-
let(:exhibit_alt) { FactoryBot.create(:exhibit) }
|
13
|
-
let(:exhibit) { FactoryBot.create(:exhibit) }
|
14
|
-
|
15
14
|
its(:to_key) { is_expected.to eq ['abcd123'] }
|
16
15
|
its(:persisted?) { is_expected.to be_truthy }
|
17
16
|
|
@@ -37,10 +37,10 @@ describe Spotlight::Role, type: :model do
|
|
37
37
|
|
38
38
|
describe 'that points at a user with an existing role' do
|
39
39
|
let(:user) { FactoryBot.create(:user) }
|
40
|
-
before { described_class.create!(role: 'curator', user: user) }
|
41
|
-
|
42
40
|
let(:args) { { role: 'curator', user_key: user.email } }
|
43
41
|
|
42
|
+
before { described_class.create!(role: 'curator', user: user) }
|
43
|
+
|
44
44
|
it 'is valid' do
|
45
45
|
expect(subject).not_to be_valid
|
46
46
|
expect(subject.errors.messages).to eq(user_key: ['already a member of this exhibit'])
|
@@ -412,10 +412,22 @@ describe Spotlight::ExhibitImportExportService do
|
|
412
412
|
new_export = described_class.new(e).as_json
|
413
413
|
|
414
414
|
actual = _deep_transform_values_in_object(new_export) do |v|
|
415
|
-
v.
|
415
|
+
if DateTime.parse(v.to_s)
|
416
|
+
nil
|
417
|
+
else
|
418
|
+
v
|
419
|
+
end
|
420
|
+
rescue ArgumentError
|
421
|
+
nil
|
416
422
|
end
|
417
423
|
expected = _deep_transform_values_in_object(export) do |v|
|
418
|
-
v.
|
424
|
+
if DateTime.parse(v.to_s)
|
425
|
+
nil
|
426
|
+
else
|
427
|
+
v
|
428
|
+
end
|
429
|
+
rescue ArgumentError
|
430
|
+
nil
|
419
431
|
end
|
420
432
|
expect(actual).to include expected
|
421
433
|
end
|
@@ -68,7 +68,7 @@ describe Spotlight::IiifResourceResolver do
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
context 'when the stored
|
71
|
+
context 'when the stored image ID is not present' do
|
72
72
|
it 'raises a ManifestError' do
|
73
73
|
resource.iiif_image_id = 'not-a-real-image-id'
|
74
74
|
|
@@ -2,7 +2,10 @@
|
|
2
2
|
|
3
3
|
describe 'spotlight/metadata_configurations/_metadata_field', type: :view do
|
4
4
|
let(:exhibit) { FactoryBot.create(:exhibit) }
|
5
|
+
let(:field) { Blacklight::Configuration::Field.new immutable: OpenStruct.new(another_view_type: false) }
|
6
|
+
let(:builder) { ActionView::Helpers::FormBuilder.new 'z', nil, view, {} }
|
5
7
|
let(:p) { 'spotlight/metadata_configurations/metadata_field.html.erb' }
|
8
|
+
|
6
9
|
before do
|
7
10
|
assign(:exhibit, exhibit)
|
8
11
|
assign(:blacklight_configuration, exhibit.blacklight_configuration)
|
@@ -14,9 +17,6 @@ describe 'spotlight/metadata_configurations/_metadata_field', type: :view do
|
|
14
17
|
)
|
15
18
|
end
|
16
19
|
|
17
|
-
let(:field) { Blacklight::Configuration::Field.new immutable: OpenStruct.new(another_view_type: false) }
|
18
|
-
let(:builder) { ActionView::Helpers::FormBuilder.new 'z', nil, view, {} }
|
19
|
-
|
20
20
|
it 'uses the index_field_label helper to render the label' do
|
21
21
|
allow(view).to receive(:index_field_label).with(anything, 'some_key').and_return 'Some label'
|
22
22
|
render partial: p, locals: { key: 'some_key', config: field, f: builder }
|
@@ -2,6 +2,13 @@
|
|
2
2
|
|
3
3
|
describe 'spotlight/search_configurations/_sort', type: :view do
|
4
4
|
let(:exhibit) { FactoryBot.create(:exhibit) }
|
5
|
+
let(:f) do
|
6
|
+
form_helper = nil
|
7
|
+
controller.view_context.bootstrap_form_for(exhibit.blacklight_configuration, url: '/update') do |f|
|
8
|
+
form_helper = f
|
9
|
+
end
|
10
|
+
form_helper
|
11
|
+
end
|
5
12
|
|
6
13
|
before do
|
7
14
|
original_config = Spotlight::Engine.blacklight_config.deep_dup
|
@@ -16,14 +23,6 @@ describe 'spotlight/search_configurations/_sort', type: :view do
|
|
16
23
|
)
|
17
24
|
end
|
18
25
|
|
19
|
-
let(:f) do
|
20
|
-
form_helper = nil
|
21
|
-
controller.view_context.bootstrap_form_for(exhibit.blacklight_configuration, url: '/update') do |f|
|
22
|
-
form_helper = f
|
23
|
-
end
|
24
|
-
form_helper
|
25
|
-
end
|
26
|
-
|
27
26
|
it 'has a disabled relevance sort option' do
|
28
27
|
render partial: 'spotlight/search_configurations/sort', locals: { f: f }
|
29
28
|
expect(rendered).to have_selector "input[name='blacklight_configuration[sort_fields][relevance][enable]'][disabled='disabled']"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Leaflet-IIIF
|
2
|
+
* Leaflet-IIIF 3.0.0
|
3
3
|
* IIIF Viewer for Leaflet
|
4
4
|
* by Jack Reed, @mejackreed
|
5
5
|
*/
|
@@ -32,7 +32,7 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
32
32
|
}
|
33
33
|
|
34
34
|
options = L.setOptions(this, options);
|
35
|
-
this.
|
35
|
+
this._infoPromise = null;
|
36
36
|
this._infoUrl = url;
|
37
37
|
this._baseUrl = this._templateUrl();
|
38
38
|
this._getInfo();
|
@@ -48,27 +48,39 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
48
48
|
miny = (y * tileBaseSize),
|
49
49
|
maxx = Math.min(minx + tileBaseSize, _this.x),
|
50
50
|
maxy = Math.min(miny + tileBaseSize, _this.y);
|
51
|
-
|
51
|
+
|
52
52
|
var xDiff = (maxx - minx);
|
53
53
|
var yDiff = (maxy - miny);
|
54
54
|
|
55
|
+
// Canonical URI Syntax for v2
|
56
|
+
var size = Math.ceil(xDiff / scale) + ',';
|
57
|
+
if (_this.type === 'ImageService3') {
|
58
|
+
// Cannonical URI Syntax for v3
|
59
|
+
size = size + Math.ceil(yDiff / scale);
|
60
|
+
}
|
61
|
+
|
55
62
|
return L.Util.template(this._baseUrl, L.extend({
|
56
63
|
format: _this.options.tileFormat,
|
57
64
|
quality: _this.quality,
|
58
65
|
region: [minx, miny, xDiff, yDiff].join(','),
|
59
66
|
rotation: 0,
|
60
|
-
size:
|
67
|
+
size: size
|
61
68
|
}, this.options));
|
62
69
|
},
|
63
70
|
onAdd: function(map) {
|
64
71
|
var _this = this;
|
65
72
|
|
66
|
-
// Wait for
|
67
|
-
|
73
|
+
// Wait for info.json fetch and parse to complete
|
74
|
+
Promise.all([_this._infoPromise]).then(function() {
|
75
|
+
// Store unmutated imageSizes
|
76
|
+
_this._imageSizesOriginal = _this._imageSizes.slice(0);
|
68
77
|
|
69
78
|
// Set maxZoom for map
|
70
79
|
map._layersMaxZoom = _this.maxZoom;
|
71
80
|
|
81
|
+
// Call add TileLayer
|
82
|
+
L.TileLayer.prototype.onAdd.call(_this, map);
|
83
|
+
|
72
84
|
// Set minZoom and minNativeZoom based on how the imageSizes match up
|
73
85
|
var smallestImage = _this._imageSizes[0];
|
74
86
|
var mapSize = _this._map.getSize();
|
@@ -88,9 +100,6 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
88
100
|
_this._prev_map_layersMinZoom = _this._map._layersMinZoom;
|
89
101
|
_this._map._layersMinZoom = newMinZoom;
|
90
102
|
|
91
|
-
// Call add TileLayer
|
92
|
-
L.TileLayer.prototype.onAdd.call(_this, map);
|
93
|
-
|
94
103
|
if (_this.options.fitBounds) {
|
95
104
|
_this._fitBounds();
|
96
105
|
}
|
@@ -112,12 +121,16 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
112
121
|
tile.tile.style.height = height + 'px';
|
113
122
|
|
114
123
|
});
|
124
|
+
})
|
125
|
+
.catch(function(err){
|
126
|
+
console.error(err);
|
115
127
|
});
|
116
128
|
},
|
117
129
|
onRemove: function(map) {
|
118
130
|
var _this = this;
|
119
|
-
|
131
|
+
|
120
132
|
map._layersMinZoom = _this._prev_map_layersMinZoom;
|
133
|
+
_this._imageSizes = _this._imageSizesOriginal;
|
121
134
|
|
122
135
|
// Remove maxBounds set for this image
|
123
136
|
if(_this.options.setMaxBounds) {
|
@@ -156,9 +169,14 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
156
169
|
_getInfo: function() {
|
157
170
|
var _this = this;
|
158
171
|
|
159
|
-
|
160
|
-
|
161
|
-
|
172
|
+
_this._infoPromise = fetch(_this._infoUrl)
|
173
|
+
.then(function(response) {
|
174
|
+
return response.json();
|
175
|
+
})
|
176
|
+
.catch(function(err){
|
177
|
+
console.error(err);
|
178
|
+
})
|
179
|
+
.then(function(data) {
|
162
180
|
_this.y = data.height;
|
163
181
|
_this.x = data.width;
|
164
182
|
|
@@ -176,6 +194,7 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
176
194
|
}else {
|
177
195
|
_this.profile = data.profile;
|
178
196
|
}
|
197
|
+
_this.type = data.type;
|
179
198
|
|
180
199
|
_this._setQuality();
|
181
200
|
|
@@ -197,10 +216,13 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
197
216
|
};
|
198
217
|
|
199
218
|
// Calculates maximum native zoom for the layer
|
200
|
-
_this.maxNativeZoom = Math.max(
|
201
|
-
ceilLog2(_this.
|
219
|
+
_this.maxNativeZoom = Math.max(
|
220
|
+
ceilLog2(_this.x / _this.options.tileSize),
|
221
|
+
ceilLog2(_this.y / _this.options.tileSize),
|
222
|
+
0
|
223
|
+
);
|
202
224
|
_this.options.maxNativeZoom = _this.maxNativeZoom;
|
203
|
-
|
225
|
+
|
204
226
|
// Enable zooming further than native if maxZoom option supplied
|
205
227
|
if (_this._customMaxZoom && _this.options.maxZoom > _this.maxNativeZoom) {
|
206
228
|
_this.maxZoom = _this.options.maxZoom;
|
@@ -208,7 +230,7 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
208
230
|
else {
|
209
231
|
_this.maxZoom = _this.maxNativeZoom;
|
210
232
|
}
|
211
|
-
|
233
|
+
|
212
234
|
for (var i = 0; i <= _this.maxZoom; i++) {
|
213
235
|
scale = Math.pow(2, _this.maxNativeZoom - i);
|
214
236
|
width_ = Math.ceil(_this.x / scale);
|
@@ -221,10 +243,11 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
221
243
|
|
222
244
|
_this._tierSizes = tierSizes;
|
223
245
|
_this._imageSizes = imageSizes;
|
224
|
-
|
225
|
-
|
226
|
-
|
246
|
+
})
|
247
|
+
.catch(function(err){
|
248
|
+
console.error(err);
|
227
249
|
});
|
250
|
+
|
228
251
|
},
|
229
252
|
|
230
253
|
_setQuality: function() {
|
@@ -259,7 +282,6 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
259
282
|
return this._infoToBaseUrl() + '{region}/{size}/{rotation}/{quality}.{format}';
|
260
283
|
},
|
261
284
|
_isValidTile: function(coords) {
|
262
|
-
var tileBounds = this._tileCoordsToBounds(coords);
|
263
285
|
var _this = this;
|
264
286
|
var zoom = _this._getZoomForUrl();
|
265
287
|
var sizes = _this._tierSizes[zoom];
|
@@ -276,6 +298,9 @@ L.TileLayer.Iiif = L.TileLayer.extend({
|
|
276
298
|
return true;
|
277
299
|
}
|
278
300
|
},
|
301
|
+
_tileShouldBeLoaded: function(coords) {
|
302
|
+
return this._isValidTile(coords);
|
303
|
+
},
|
279
304
|
_getInitialZoom: function (mapSize) {
|
280
305
|
var _this = this;
|
281
306
|
var tolerance = 0.8;
|