blacklight-gallery 4.6.4 → 4.7.0
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/.github/workflows/ruby.yml +0 -23
- data/README.md +1 -1
- data/app/assets/javascripts/blacklight_gallery/default.js +1 -1
- data/app/assets/javascripts/blacklight_gallery/osd_viewer.js +2 -1
- data/lib/blacklight/gallery/version.rb +1 -1
- data/package.json +2 -2
- data/spec/components/blacklight/gallery/slideshow_preview_component_spec.rb +1 -5
- data/spec/features/gallery_spec.rb +1 -1
- data/spec/features/masonry_spec.rb +1 -1
- data/spec/features/slideshow_spec.rb +1 -2
- data/spec/models/concerns/openseadragon_solr_document_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -6
- data/spec/test_app_templates/Gemfile.extra +0 -4
- data/spec/views/catalog/_openseadragon_default.html.erb_spec.rb +1 -1
- data/vendor/assets/javascripts/imagesloaded.pkgd.js +441 -0
- metadata +4 -6
- data/spec/view_component_v2_test_helpers.rb +0 -20
- data/vendor/assets/javascripts/imagesloaded.min.js +0 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 735864f7774b580439e9147a573b0835791cf2ea6444e04c409ecc8bed6911a1
|
|
4
|
+
data.tar.gz: '0670846bebf0ba98635f98467abe3ae2d2668eab1c7c542cc29a1a571a1d9851'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6b1c5c76536fbfd5e6de38db58c905fa3c10497646f2779119b016776c14b40509baeecad64840493062b86c9534853ba38759a7eea859dd1716354dd70f92dd
|
|
7
|
+
data.tar.gz: 265e62fe308cb5aa49e3d51bfa00ff392dc66c93a443faeb7e1d19012f46b3980c697d3402219084ad348833d8dcd9a775a5282123bde9ba251c78760a2a5976
|
data/.github/workflows/ruby.yml
CHANGED
|
@@ -19,29 +19,7 @@ jobs:
|
|
|
19
19
|
experimental: [false]
|
|
20
20
|
additional_engine_cart_rails_options: [""]
|
|
21
21
|
additional_name: [""]
|
|
22
|
-
view_component_version: ["~> 3.12"]
|
|
23
22
|
include:
|
|
24
|
-
- ruby: "3.1"
|
|
25
|
-
rails_version: 6.1.7
|
|
26
|
-
blacklight_version: "~> 7.0"
|
|
27
|
-
experimental: false
|
|
28
|
-
additional_name: Rails 6.1, Ruby 3.1
|
|
29
|
-
- ruby: "3.2"
|
|
30
|
-
rails_version: "7.0.4"
|
|
31
|
-
blacklight_version: "~> 8.0"
|
|
32
|
-
experimental: false
|
|
33
|
-
additional_name: Blacklight 8
|
|
34
|
-
- ruby: "3.2"
|
|
35
|
-
rails_version: "7.0.4"
|
|
36
|
-
blacklight_version: "github"
|
|
37
|
-
experimental: true
|
|
38
|
-
additional_name: Blacklight main branch
|
|
39
|
-
- ruby: "3.2"
|
|
40
|
-
rails_version: "7.0.4"
|
|
41
|
-
blacklight_version: "~> 7.0"
|
|
42
|
-
experimental: false
|
|
43
|
-
view_component_version: "~> 2.83"
|
|
44
|
-
additional_name: "/ ViewComponent 2"
|
|
45
23
|
- ruby: "3.3"
|
|
46
24
|
rails_version: "8.0.0"
|
|
47
25
|
blacklight_version: "~> 8.0"
|
|
@@ -57,7 +35,6 @@ jobs:
|
|
|
57
35
|
env:
|
|
58
36
|
RAILS_VERSION: ${{ matrix.rails_version }}
|
|
59
37
|
BLACKLIGHT_VERSION: ${{ matrix.blacklight_version }}
|
|
60
|
-
VIEW_COMPONENT_VERSION: ${{ matrix.view_component_version }}
|
|
61
38
|
ENGINE_CART_RAILS_OPTIONS: "--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test ${{ matrix.additional_engine_cart_rails_options }}"
|
|
62
39
|
steps:
|
|
63
40
|
- uses: actions/checkout@v4
|
data/README.md
CHANGED
|
@@ -25,7 +25,7 @@ Run the gallery generator for Sprockets:
|
|
|
25
25
|
|
|
26
26
|
Or for node based bundlers add `blacklight-gallery masonry-layout@v4` as a dependencies and add this to your entrypoint:
|
|
27
27
|
```js
|
|
28
|
-
import 'blacklight-gallery/vendor/assets/javascripts/imagesloaded.
|
|
28
|
+
import 'blacklight-gallery/vendor/assets/javascripts/imagesloaded.pkgd.js'
|
|
29
29
|
import 'blacklight-gallery/app/assets/javascripts/blacklight_gallery/slideshow'
|
|
30
30
|
import 'blacklight-gallery/app/assets/javascripts/blacklight_gallery/masonry'
|
|
31
31
|
```
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
//= require openseadragon/
|
|
1
|
+
//= require openseadragon-rails/dom
|
|
2
|
+
//= require openseadragon-rails/rails
|
data/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blacklight-gallery",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.7.0",
|
|
4
4
|
"description": "Gallery views for Blacklight search results",
|
|
5
5
|
"main": "app/assets/javascripts/blacklight_gallery/default.js",
|
|
6
6
|
"files": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"url": "https://github.com/projectblacklight/blacklight-gallery/issues"
|
|
19
19
|
},
|
|
20
20
|
"homepage": "https://github.com/projectblacklight/blacklight-gallery#readme",
|
|
21
|
-
"devDependencies": {
|
|
21
|
+
"devDependencies": {},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"blacklight-frontend": ">=7.1.0 <9",
|
|
24
24
|
"jquery": ">=3.0"
|
|
@@ -52,11 +52,7 @@ RSpec.describe Blacklight::Gallery::SlideshowPreviewComponent, type: :component
|
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
it 'renders the correct slide number' do
|
|
55
|
-
|
|
56
|
-
expect(rendered).to have_css '[data-slide-to=\"4\"][data-bs-slide-to=\"4\"]'
|
|
57
|
-
else
|
|
58
|
-
expect(rendered).to have_css '[data-slide-to=\"5\"][data-bs-slide-to=\"5\"]'
|
|
59
|
-
end
|
|
55
|
+
expect(rendered).to have_css '[data-slide-to=\"5\"][data-bs-slide-to=\"5\"]'
|
|
60
56
|
end
|
|
61
57
|
|
|
62
58
|
context 'when the presenter returns nothing' do
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
RSpec.describe 'Slideshow',
|
|
4
|
-
|
|
3
|
+
RSpec.describe 'Slideshow', js: true do
|
|
5
4
|
it 'opens when one of the grid panes is clicked' do
|
|
6
5
|
visit search_catalog_path( q: 'medicine', view: 'slideshow' )
|
|
7
6
|
expect(page).to have_content 'You searched for:'
|
data/spec/spec_helper.rb
CHANGED
|
@@ -7,7 +7,6 @@ require 'rspec/collection_matchers'
|
|
|
7
7
|
require 'rspec/its'
|
|
8
8
|
require 'rspec/rails'
|
|
9
9
|
require 'rspec/active_model/mocks'
|
|
10
|
-
require 'view_component_v2_test_helpers'
|
|
11
10
|
|
|
12
11
|
require 'selenium-webdriver'
|
|
13
12
|
|
|
@@ -19,10 +18,6 @@ require 'blacklight/gallery'
|
|
|
19
18
|
|
|
20
19
|
RSpec.configure do |c|
|
|
21
20
|
c.infer_spec_type_from_file_location!
|
|
21
|
+
c.disable_monkey_patching!
|
|
22
22
|
c.include ViewComponent::TestHelpers, type: :component
|
|
23
|
-
view_component_version = Gem.loaded_specs['view_component'].version
|
|
24
|
-
VIEW_COMPONENT_VERSION = view_component_version.segments.first
|
|
25
|
-
if VIEW_COMPONENT_VERSION < 3
|
|
26
|
-
c.include ViewComponentV2TestHelpers, type: :component
|
|
27
|
-
end
|
|
28
23
|
end
|
|
@@ -3,7 +3,3 @@ if ENV['BLACKLIGHT_VERSION'] == 'github'
|
|
|
3
3
|
elsif ENV['BLACKLIGHT_VERSION'] && !ENV['BLACKLIGHT_VERSION'].empty?
|
|
4
4
|
gem 'blacklight', ENV['BLACKLIGHT_VERSION']
|
|
5
5
|
end
|
|
6
|
-
|
|
7
|
-
unless ENV['VIEW_COMPONENT_VERSION'].to_s == ""
|
|
8
|
-
gem 'view_component', ENV.fetch('VIEW_COMPONENT_VERSION')
|
|
9
|
-
end
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* imagesLoaded PACKAGED v5.0.0
|
|
3
|
+
* JavaScript is all like "You images are done yet or what?"
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* EvEmitter v2.1.1
|
|
9
|
+
* Lil' event emitter
|
|
10
|
+
* MIT License
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
( function( global, factory ) {
|
|
14
|
+
// universal module definition
|
|
15
|
+
if ( typeof module == 'object' && module.exports ) {
|
|
16
|
+
// CommonJS - Browserify, Webpack
|
|
17
|
+
module.exports = factory();
|
|
18
|
+
} else {
|
|
19
|
+
// Browser globals
|
|
20
|
+
global.EvEmitter = factory();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
}( typeof window != 'undefined' ? window : this, function() {
|
|
24
|
+
|
|
25
|
+
function EvEmitter() {}
|
|
26
|
+
|
|
27
|
+
let proto = EvEmitter.prototype;
|
|
28
|
+
|
|
29
|
+
proto.on = function( eventName, listener ) {
|
|
30
|
+
if ( !eventName || !listener ) return this;
|
|
31
|
+
|
|
32
|
+
// set events hash
|
|
33
|
+
let events = this._events = this._events || {};
|
|
34
|
+
// set listeners array
|
|
35
|
+
let listeners = events[ eventName ] = events[ eventName ] || [];
|
|
36
|
+
// only add once
|
|
37
|
+
if ( !listeners.includes( listener ) ) {
|
|
38
|
+
listeners.push( listener );
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return this;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
proto.once = function( eventName, listener ) {
|
|
45
|
+
if ( !eventName || !listener ) return this;
|
|
46
|
+
|
|
47
|
+
// add event
|
|
48
|
+
this.on( eventName, listener );
|
|
49
|
+
// set once flag
|
|
50
|
+
// set onceEvents hash
|
|
51
|
+
let onceEvents = this._onceEvents = this._onceEvents || {};
|
|
52
|
+
// set onceListeners object
|
|
53
|
+
let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
|
|
54
|
+
// set flag
|
|
55
|
+
onceListeners[ listener ] = true;
|
|
56
|
+
|
|
57
|
+
return this;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
proto.off = function( eventName, listener ) {
|
|
61
|
+
let listeners = this._events && this._events[ eventName ];
|
|
62
|
+
if ( !listeners || !listeners.length ) return this;
|
|
63
|
+
|
|
64
|
+
let index = listeners.indexOf( listener );
|
|
65
|
+
if ( index != -1 ) {
|
|
66
|
+
listeners.splice( index, 1 );
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return this;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
proto.emitEvent = function( eventName, args ) {
|
|
73
|
+
let listeners = this._events && this._events[ eventName ];
|
|
74
|
+
if ( !listeners || !listeners.length ) return this;
|
|
75
|
+
|
|
76
|
+
// copy over to avoid interference if .off() in listener
|
|
77
|
+
listeners = listeners.slice( 0 );
|
|
78
|
+
args = args || [];
|
|
79
|
+
// once stuff
|
|
80
|
+
let onceListeners = this._onceEvents && this._onceEvents[ eventName ];
|
|
81
|
+
|
|
82
|
+
for ( let listener of listeners ) {
|
|
83
|
+
let isOnce = onceListeners && onceListeners[ listener ];
|
|
84
|
+
if ( isOnce ) {
|
|
85
|
+
// remove listener
|
|
86
|
+
// remove before trigger to prevent recursion
|
|
87
|
+
this.off( eventName, listener );
|
|
88
|
+
// unset once flag
|
|
89
|
+
delete onceListeners[ listener ];
|
|
90
|
+
}
|
|
91
|
+
// trigger listener
|
|
92
|
+
listener.apply( this, args );
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return this;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
proto.allOff = function() {
|
|
99
|
+
delete this._events;
|
|
100
|
+
delete this._onceEvents;
|
|
101
|
+
return this;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return EvEmitter;
|
|
105
|
+
|
|
106
|
+
} ) );
|
|
107
|
+
/*!
|
|
108
|
+
* imagesLoaded v5.0.0
|
|
109
|
+
* JavaScript is all like "You images are done yet or what?"
|
|
110
|
+
* MIT License
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
( function( window, factory ) {
|
|
114
|
+
// universal module definition
|
|
115
|
+
if ( typeof module == 'object' && module.exports ) {
|
|
116
|
+
// CommonJS
|
|
117
|
+
module.exports = factory( window, require('ev-emitter') );
|
|
118
|
+
} else {
|
|
119
|
+
// browser global
|
|
120
|
+
window.imagesLoaded = factory( window, window.EvEmitter );
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
} )( typeof window !== 'undefined' ? window : this,
|
|
124
|
+
function factory( window, EvEmitter ) {
|
|
125
|
+
|
|
126
|
+
let $ = window.jQuery;
|
|
127
|
+
let console = window.console;
|
|
128
|
+
|
|
129
|
+
// -------------------------- helpers -------------------------- //
|
|
130
|
+
|
|
131
|
+
// turn element or nodeList into an array
|
|
132
|
+
function makeArray( obj ) {
|
|
133
|
+
// use object if already an array
|
|
134
|
+
if ( Array.isArray( obj ) ) return obj;
|
|
135
|
+
|
|
136
|
+
let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
|
|
137
|
+
// convert nodeList to array
|
|
138
|
+
if ( isArrayLike ) return [ ...obj ];
|
|
139
|
+
|
|
140
|
+
// array of single index
|
|
141
|
+
return [ obj ];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// -------------------------- imagesLoaded -------------------------- //
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @param {[Array, Element, NodeList, String]} elem
|
|
148
|
+
* @param {[Object, Function]} options - if function, use as callback
|
|
149
|
+
* @param {Function} onAlways - callback function
|
|
150
|
+
* @returns {ImagesLoaded}
|
|
151
|
+
*/
|
|
152
|
+
function ImagesLoaded( elem, options, onAlways ) {
|
|
153
|
+
// coerce ImagesLoaded() without new, to be new ImagesLoaded()
|
|
154
|
+
if ( !( this instanceof ImagesLoaded ) ) {
|
|
155
|
+
return new ImagesLoaded( elem, options, onAlways );
|
|
156
|
+
}
|
|
157
|
+
// use elem as selector string
|
|
158
|
+
let queryElem = elem;
|
|
159
|
+
if ( typeof elem == 'string' ) {
|
|
160
|
+
queryElem = document.querySelectorAll( elem );
|
|
161
|
+
}
|
|
162
|
+
// bail if bad element
|
|
163
|
+
if ( !queryElem ) {
|
|
164
|
+
console.error(`Bad element for imagesLoaded ${queryElem || elem}`);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
this.elements = makeArray( queryElem );
|
|
169
|
+
this.options = {};
|
|
170
|
+
// shift arguments if no options set
|
|
171
|
+
if ( typeof options == 'function' ) {
|
|
172
|
+
onAlways = options;
|
|
173
|
+
} else {
|
|
174
|
+
Object.assign( this.options, options );
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if ( onAlways ) this.on( 'always', onAlways );
|
|
178
|
+
|
|
179
|
+
this.getImages();
|
|
180
|
+
// add jQuery Deferred object
|
|
181
|
+
if ( $ ) this.jqDeferred = new $.Deferred();
|
|
182
|
+
|
|
183
|
+
// HACK check async to allow time to bind listeners
|
|
184
|
+
setTimeout( this.check.bind( this ) );
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
|
|
188
|
+
|
|
189
|
+
ImagesLoaded.prototype.getImages = function() {
|
|
190
|
+
this.images = [];
|
|
191
|
+
|
|
192
|
+
// filter & find items if we have an item selector
|
|
193
|
+
this.elements.forEach( this.addElementImages, this );
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const elementNodeTypes = [ 1, 9, 11 ];
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @param {Node} elem
|
|
200
|
+
*/
|
|
201
|
+
ImagesLoaded.prototype.addElementImages = function( elem ) {
|
|
202
|
+
// filter siblings
|
|
203
|
+
if ( elem.nodeName === 'IMG' ) {
|
|
204
|
+
this.addImage( elem );
|
|
205
|
+
}
|
|
206
|
+
// get background image on element
|
|
207
|
+
if ( this.options.background === true ) {
|
|
208
|
+
this.addElementBackgroundImages( elem );
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// find children
|
|
212
|
+
// no non-element nodes, #143
|
|
213
|
+
let { nodeType } = elem;
|
|
214
|
+
if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;
|
|
215
|
+
|
|
216
|
+
let childImgs = elem.querySelectorAll('img');
|
|
217
|
+
// concat childElems to filterFound array
|
|
218
|
+
for ( let img of childImgs ) {
|
|
219
|
+
this.addImage( img );
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// get child background images
|
|
223
|
+
if ( typeof this.options.background == 'string' ) {
|
|
224
|
+
let children = elem.querySelectorAll( this.options.background );
|
|
225
|
+
for ( let child of children ) {
|
|
226
|
+
this.addElementBackgroundImages( child );
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const reURL = /url\((['"])?(.*?)\1\)/gi;
|
|
232
|
+
|
|
233
|
+
ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
|
|
234
|
+
let style = getComputedStyle( elem );
|
|
235
|
+
// Firefox returns null if in a hidden iframe https://bugzil.la/548397
|
|
236
|
+
if ( !style ) return;
|
|
237
|
+
|
|
238
|
+
// get url inside url("...")
|
|
239
|
+
let matches = reURL.exec( style.backgroundImage );
|
|
240
|
+
while ( matches !== null ) {
|
|
241
|
+
let url = matches && matches[2];
|
|
242
|
+
if ( url ) {
|
|
243
|
+
this.addBackground( url, elem );
|
|
244
|
+
}
|
|
245
|
+
matches = reURL.exec( style.backgroundImage );
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* @param {Image} img
|
|
251
|
+
*/
|
|
252
|
+
ImagesLoaded.prototype.addImage = function( img ) {
|
|
253
|
+
let loadingImage = new LoadingImage( img );
|
|
254
|
+
this.images.push( loadingImage );
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
ImagesLoaded.prototype.addBackground = function( url, elem ) {
|
|
258
|
+
let background = new Background( url, elem );
|
|
259
|
+
this.images.push( background );
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
ImagesLoaded.prototype.check = function() {
|
|
263
|
+
this.progressedCount = 0;
|
|
264
|
+
this.hasAnyBroken = false;
|
|
265
|
+
// complete if no images
|
|
266
|
+
if ( !this.images.length ) {
|
|
267
|
+
this.complete();
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* eslint-disable-next-line func-style */
|
|
272
|
+
let onProgress = ( image, elem, message ) => {
|
|
273
|
+
// HACK - Chrome triggers event before object properties have changed. #83
|
|
274
|
+
setTimeout( () => {
|
|
275
|
+
this.progress( image, elem, message );
|
|
276
|
+
} );
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
this.images.forEach( function( loadingImage ) {
|
|
280
|
+
loadingImage.once( 'progress', onProgress );
|
|
281
|
+
loadingImage.check();
|
|
282
|
+
} );
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
ImagesLoaded.prototype.progress = function( image, elem, message ) {
|
|
286
|
+
this.progressedCount++;
|
|
287
|
+
this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
|
|
288
|
+
// progress event
|
|
289
|
+
this.emitEvent( 'progress', [ this, image, elem ] );
|
|
290
|
+
if ( this.jqDeferred && this.jqDeferred.notify ) {
|
|
291
|
+
this.jqDeferred.notify( this, image );
|
|
292
|
+
}
|
|
293
|
+
// check if completed
|
|
294
|
+
if ( this.progressedCount === this.images.length ) {
|
|
295
|
+
this.complete();
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if ( this.options.debug && console ) {
|
|
299
|
+
console.log( `progress: ${message}`, image, elem );
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
ImagesLoaded.prototype.complete = function() {
|
|
304
|
+
let eventName = this.hasAnyBroken ? 'fail' : 'done';
|
|
305
|
+
this.isComplete = true;
|
|
306
|
+
this.emitEvent( eventName, [ this ] );
|
|
307
|
+
this.emitEvent( 'always', [ this ] );
|
|
308
|
+
if ( this.jqDeferred ) {
|
|
309
|
+
let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
|
|
310
|
+
this.jqDeferred[ jqMethod ]( this );
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
// -------------------------- -------------------------- //
|
|
315
|
+
|
|
316
|
+
function LoadingImage( img ) {
|
|
317
|
+
this.img = img;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
LoadingImage.prototype = Object.create( EvEmitter.prototype );
|
|
321
|
+
|
|
322
|
+
LoadingImage.prototype.check = function() {
|
|
323
|
+
// If complete is true and browser supports natural sizes,
|
|
324
|
+
// try to check for image status manually.
|
|
325
|
+
let isComplete = this.getIsImageComplete();
|
|
326
|
+
if ( isComplete ) {
|
|
327
|
+
// report based on naturalWidth
|
|
328
|
+
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// If none of the checks above matched, simulate loading on detached element.
|
|
333
|
+
this.proxyImage = new Image();
|
|
334
|
+
// add crossOrigin attribute. #204
|
|
335
|
+
if ( this.img.crossOrigin ) {
|
|
336
|
+
this.proxyImage.crossOrigin = this.img.crossOrigin;
|
|
337
|
+
}
|
|
338
|
+
this.proxyImage.addEventListener( 'load', this );
|
|
339
|
+
this.proxyImage.addEventListener( 'error', this );
|
|
340
|
+
// bind to image as well for Firefox. #191
|
|
341
|
+
this.img.addEventListener( 'load', this );
|
|
342
|
+
this.img.addEventListener( 'error', this );
|
|
343
|
+
this.proxyImage.src = this.img.currentSrc || this.img.src;
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
LoadingImage.prototype.getIsImageComplete = function() {
|
|
347
|
+
// check for non-zero, non-undefined naturalWidth
|
|
348
|
+
// fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
|
|
349
|
+
return this.img.complete && this.img.naturalWidth;
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
LoadingImage.prototype.confirm = function( isLoaded, message ) {
|
|
353
|
+
this.isLoaded = isLoaded;
|
|
354
|
+
let { parentNode } = this.img;
|
|
355
|
+
// emit progress with parent <picture> or self <img>
|
|
356
|
+
let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;
|
|
357
|
+
this.emitEvent( 'progress', [ this, elem, message ] );
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
// ----- events ----- //
|
|
361
|
+
|
|
362
|
+
// trigger specified handler for event type
|
|
363
|
+
LoadingImage.prototype.handleEvent = function( event ) {
|
|
364
|
+
let method = 'on' + event.type;
|
|
365
|
+
if ( this[ method ] ) {
|
|
366
|
+
this[ method ]( event );
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
LoadingImage.prototype.onload = function() {
|
|
371
|
+
this.confirm( true, 'onload' );
|
|
372
|
+
this.unbindEvents();
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
LoadingImage.prototype.onerror = function() {
|
|
376
|
+
this.confirm( false, 'onerror' );
|
|
377
|
+
this.unbindEvents();
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
LoadingImage.prototype.unbindEvents = function() {
|
|
381
|
+
this.proxyImage.removeEventListener( 'load', this );
|
|
382
|
+
this.proxyImage.removeEventListener( 'error', this );
|
|
383
|
+
this.img.removeEventListener( 'load', this );
|
|
384
|
+
this.img.removeEventListener( 'error', this );
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
// -------------------------- Background -------------------------- //
|
|
388
|
+
|
|
389
|
+
function Background( url, element ) {
|
|
390
|
+
this.url = url;
|
|
391
|
+
this.element = element;
|
|
392
|
+
this.img = new Image();
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// inherit LoadingImage prototype
|
|
396
|
+
Background.prototype = Object.create( LoadingImage.prototype );
|
|
397
|
+
|
|
398
|
+
Background.prototype.check = function() {
|
|
399
|
+
this.img.addEventListener( 'load', this );
|
|
400
|
+
this.img.addEventListener( 'error', this );
|
|
401
|
+
this.img.src = this.url;
|
|
402
|
+
// check if image is already complete
|
|
403
|
+
let isComplete = this.getIsImageComplete();
|
|
404
|
+
if ( isComplete ) {
|
|
405
|
+
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
|
406
|
+
this.unbindEvents();
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
Background.prototype.unbindEvents = function() {
|
|
411
|
+
this.img.removeEventListener( 'load', this );
|
|
412
|
+
this.img.removeEventListener( 'error', this );
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
Background.prototype.confirm = function( isLoaded, message ) {
|
|
416
|
+
this.isLoaded = isLoaded;
|
|
417
|
+
this.emitEvent( 'progress', [ this, this.element, message ] );
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
// -------------------------- jQuery -------------------------- //
|
|
421
|
+
|
|
422
|
+
ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
|
|
423
|
+
jQuery = jQuery || window.jQuery;
|
|
424
|
+
if ( !jQuery ) return;
|
|
425
|
+
|
|
426
|
+
// set local variable
|
|
427
|
+
$ = jQuery;
|
|
428
|
+
// $().imagesLoaded()
|
|
429
|
+
$.fn.imagesLoaded = function( options, onAlways ) {
|
|
430
|
+
let instance = new ImagesLoaded( this, options, onAlways );
|
|
431
|
+
return instance.jqDeferred.promise( $( this ) );
|
|
432
|
+
};
|
|
433
|
+
};
|
|
434
|
+
// try making plugin
|
|
435
|
+
ImagesLoaded.makeJQueryPlugin();
|
|
436
|
+
|
|
437
|
+
// -------------------------- -------------------------- //
|
|
438
|
+
|
|
439
|
+
return ImagesLoaded;
|
|
440
|
+
|
|
441
|
+
} );
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: blacklight-gallery
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Chris Beer
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-12-
|
|
11
|
+
date: 2024-12-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -299,10 +299,9 @@ files:
|
|
|
299
299
|
- spec/spec_helper.rb
|
|
300
300
|
- spec/test_app_templates/Gemfile.extra
|
|
301
301
|
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
|
302
|
-
- spec/view_component_v2_test_helpers.rb
|
|
303
302
|
- spec/views/catalog/_document_slideshow.html.erb_spec.rb
|
|
304
303
|
- spec/views/catalog/_openseadragon_default.html.erb_spec.rb
|
|
305
|
-
- vendor/assets/javascripts/imagesloaded.
|
|
304
|
+
- vendor/assets/javascripts/imagesloaded.pkgd.js
|
|
306
305
|
- vendor/assets/javascripts/masonry.min.js
|
|
307
306
|
homepage: https://github.com/projectblacklight/blacklight-gallery
|
|
308
307
|
licenses:
|
|
@@ -323,7 +322,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
323
322
|
- !ruby/object:Gem::Version
|
|
324
323
|
version: '0'
|
|
325
324
|
requirements: []
|
|
326
|
-
rubygems_version: 3.
|
|
325
|
+
rubygems_version: 3.5.23
|
|
327
326
|
signing_key:
|
|
328
327
|
specification_version: 4
|
|
329
328
|
summary: Gallery display for Blacklight
|
|
@@ -340,6 +339,5 @@ test_files:
|
|
|
340
339
|
- spec/spec_helper.rb
|
|
341
340
|
- spec/test_app_templates/Gemfile.extra
|
|
342
341
|
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
|
343
|
-
- spec/view_component_v2_test_helpers.rb
|
|
344
342
|
- spec/views/catalog/_document_slideshow.html.erb_spec.rb
|
|
345
343
|
- spec/views/catalog/_openseadragon_default.html.erb_spec.rb
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
module ViewComponentV2TestHelpers
|
|
2
|
-
def vc_test_controller
|
|
3
|
-
@vc_test_controller ||= __vc_test_helpers_build_controller(ViewComponent::Base.test_controller.constantize)
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def __vc_test_helpers_build_controller(klass)
|
|
7
|
-
klass.new.tap { |c| c.request = vc_test_request }.extend(Rails.application.routes.url_helpers)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def vc_test_request
|
|
11
|
-
require "action_controller/test_case"
|
|
12
|
-
|
|
13
|
-
@vc_test_request ||=
|
|
14
|
-
begin
|
|
15
|
-
out = ActionDispatch::TestRequest.create
|
|
16
|
-
out.session = ActionController::TestSession.new
|
|
17
|
-
out
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* imagesLoaded PACKAGED v4.1.4
|
|
3
|
-
* JavaScript is all like "You images are done yet or what?"
|
|
4
|
-
* MIT License
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o<i.length;o++){var r=i[o],s=n&&n[r];s&&(this.off(e,r),delete n[r]),r.apply(this,t)}return this}},t.allOff=function(){delete this._events,delete this._onceEvents},e}),function(e,t){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(i){return t(e,i)}):"object"==typeof module&&module.exports?module.exports=t(e,require("ev-emitter")):e.imagesLoaded=t(e,e.EvEmitter)}("undefined"!=typeof window?window:this,function(e,t){function i(e,t){for(var i in t)e[i]=t[i];return e}function n(e){if(Array.isArray(e))return e;var t="object"==typeof e&&"number"==typeof e.length;return t?d.call(e):[e]}function o(e,t,r){if(!(this instanceof o))return new o(e,t,r);var s=e;return"string"==typeof e&&(s=document.querySelectorAll(e)),s?(this.elements=n(s),this.options=i({},this.options),"function"==typeof t?r=t:i(this.options,t),r&&this.on("always",r),this.getImages(),h&&(this.jqDeferred=new h.Deferred),void setTimeout(this.check.bind(this))):void a.error("Bad element for imagesLoaded "+(s||e))}function r(e){this.img=e}function s(e,t){this.url=e,this.element=t,this.img=new Image}var h=e.jQuery,a=e.console,d=Array.prototype.slice;o.prototype=Object.create(t.prototype),o.prototype.options={},o.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},o.prototype.addElementImages=function(e){"IMG"==e.nodeName&&this.addImage(e),this.options.background===!0&&this.addElementBackgroundImages(e);var t=e.nodeType;if(t&&u[t]){for(var i=e.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var r=e.querySelectorAll(this.options.background);for(n=0;n<r.length;n++){var s=r[n];this.addElementBackgroundImages(s)}}}};var u={1:!0,9:!0,11:!0};return o.prototype.addElementBackgroundImages=function(e){var t=getComputedStyle(e);if(t)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(t.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,e),n=i.exec(t.backgroundImage)}},o.prototype.addImage=function(e){var t=new r(e);this.images.push(t)},o.prototype.addBackground=function(e,t){var i=new s(e,t);this.images.push(i)},o.prototype.check=function(){function e(e,i,n){setTimeout(function(){t.progress(e,i,n)})}var t=this;return this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?void this.images.forEach(function(t){t.once("progress",e),t.check()}):void this.complete()},o.prototype.progress=function(e,t,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded,this.emitEvent("progress",[this,e,t]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,e),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&a&&a.log("progress: "+i,e,t)},o.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(e,[this]),this.emitEvent("always",[this]),this.jqDeferred){var t=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[t](this)}},r.prototype=Object.create(t.prototype),r.prototype.check=function(){var e=this.getIsImageComplete();return e?void this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),void(this.proxyImage.src=this.img.src))},r.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},r.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.img,t])},r.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},r.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},r.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},r.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype=Object.create(r.prototype),s.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url;var e=this.getIsImageComplete();e&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},s.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},s.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.element,t])},o.makeJQueryPlugin=function(t){t=t||e.jQuery,t&&(h=t,h.fn.imagesLoaded=function(e,t){var i=new o(this,e,t);return i.jqDeferred.promise(h(this))})},o.makeJQueryPlugin(),o});
|