@@ -14,6 +14,7 @@ class ImageUploaderInline {
14
14
tempFileInput : HTMLInputElement | null = null ;
15
15
next : number = 0 ;
16
16
dragging : boolean = false ;
17
+ canPreview : boolean = true ;
17
18
18
19
constructor ( element : HTMLElement ) {
19
20
this . element = element ;
@@ -171,6 +172,19 @@ class ImageUploaderInline {
171
172
this . updateEmpty ( ) ;
172
173
return ;
173
174
}
175
+ if ( target . closest ( '.iuw-preview-icon' ) ) {
176
+ let image = item . querySelector ( 'img' ) ;
177
+ if ( image ) {
178
+ image = image . cloneNode ( true ) as HTMLImageElement ;
179
+ const modal = this . createPreviewModal ( image ) ;
180
+ setTimeout ( ( ) => {
181
+ modal . classList . add ( 'visible' ) ;
182
+ modal . classList . remove ( 'hide' ) ;
183
+ document . body . style . overflow = 'hidden' ;
184
+ } , 50 ) ;
185
+ return ;
186
+ }
187
+ }
174
188
var fileInput = item . querySelector ( 'input[type=file]' ) as HTMLInputElement ;
175
189
if ( e . target === fileInput ) {
176
190
return ;
@@ -194,6 +208,47 @@ class ImageUploaderInline {
194
208
}
195
209
}
196
210
211
+ closePreviewModal = ( ) => {
212
+ document . body . style . overflow = 'auto' ;
213
+ const modal = document . getElementById ( 'iuw-modal-element' ) ;
214
+ if ( modal ) {
215
+ modal . classList . remove ( 'visible' ) ;
216
+ modal . classList . add ( 'hide' ) ;
217
+ setTimeout ( ( ) => {
218
+ modal . parentElement . removeChild ( modal ) ;
219
+ } , 300 ) ;
220
+ }
221
+ }
222
+
223
+ onModalClick = ( e : Event ) => {
224
+ if ( e && e . target ) {
225
+ const element = e . target as HTMLElement ;
226
+ if ( element . closest ( 'img.iuw-modal-image-preview-item' ) ) {
227
+ return ;
228
+ }
229
+ }
230
+ this . closePreviewModal ( ) ;
231
+ }
232
+
233
+ createPreviewModal = ( image : HTMLImageElement ) : HTMLElement => {
234
+ image . className = '' ;
235
+ image . classList . add ( 'iuw-modal-image-preview-item' ) ;
236
+
237
+ const modal = document . createElement ( 'div' ) ;
238
+ modal . id = 'iuw-modal-element' ;
239
+ modal . classList . add ( 'iuw-modal' , 'hide' ) ;
240
+ modal . addEventListener ( 'click' , this . onModalClick ) ;
241
+
242
+ const preview = document . createElement ( 'div' ) ;
243
+ preview . classList . add ( 'iuw-modal-image-preview' ) ;
244
+ preview . innerHTML = '<span class="iuw-modal-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="100%" height="100%"><path xmlns="http://www.w3.org/2000/svg" d="m289.94 256 95-95A24 24 0 0 0 351 127l-95 95-95-95a24 24 0 0 0-34 34l95 95-95 95a24 24 0 1 0 34 34l95-95 95 95a24 24 0 0 0 34-34z"></path></svg></span>' ;
245
+ preview . appendChild ( image ) ;
246
+ modal . appendChild ( preview ) ;
247
+
248
+ document . body . appendChild ( modal ) ;
249
+ return modal ;
250
+ }
251
+
197
252
appendItem ( element : Element , url : string ) {
198
253
let delete_icon : Element | null = null ;
199
254
const related = element . closest ( '.inline-related' ) ;
@@ -202,6 +257,15 @@ class ImageUploaderInline {
202
257
delete_icon . classList . add ( 'iuw-delete-icon' ) ;
203
258
delete_icon . innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="100%" height="100%"><path xmlns="http://www.w3.org/2000/svg" d="m289.94 256 95-95A24 24 0 0 0 351 127l-95 95-95-95a24 24 0 0 0-34 34l95 95-95 95a24 24 0 1 0 34 34l95-95 95 95a24 24 0 0 0 34-34z"></path></svg>' ;
204
259
}
260
+ if ( this . canPreview ) {
261
+ const span = document . createElement ( 'span' ) ;
262
+ span . classList . add ( 'iuw-preview-icon' ) ;
263
+ if ( related . getAttribute ( 'data-candelete' ) !== 'true' ) {
264
+ span . classList . add ( 'iuw-only-preview' ) ;
265
+ }
266
+ span . innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-zoom-in" viewBox="0 0 16 16" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" width="100%" height="100%"><path xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zM13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0z"></path><path xmlns="http://www.w3.org/2000/svg" d="M10.344 11.742c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1 6.538 6.538 0 0 1-1.398 1.4z"></path><path xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" d="M6.5 3a.5.5 0 0 1 .5.5V6h2.5a.5.5 0 0 1 0 1H7v2.5a.5.5 0 0 1-1 0V7H3.5a.5.5 0 0 1 0-1H6V3.5a.5.5 0 0 1 .5-.5z"></path></svg>' ;
267
+ element . appendChild ( span ) ;
268
+ }
205
269
const img = document . createElement ( 'img' ) ;
206
270
img . src = url ;
207
271
element . appendChild ( img ) ;
0 commit comments