1
1
<script lang="ts">
2
2
import {
3
- computed , defineComponent , PropType , reactive , ref , Ref ,
3
+ computed , defineComponent , PropType , reactive , ref , Ref , watch ,
4
4
} from ' @vue/composition-api' ;
5
5
import { flattenDeep } from ' lodash' ;
6
6
@@ -93,6 +93,7 @@ export default defineComponent({
93
93
const selectedHtmlDataObject: Ref <any | null > = ref (null );
94
94
const dataModal = ref (false );
95
95
const iframeDataSource = ref (' ' );
96
+ const iframeLoading = ref (false );
96
97
function hasHtmlData(fileType : string ) {
97
98
return [
98
99
' Kraken2 Krona Plot' ,
@@ -101,12 +102,19 @@ export default defineComponent({
101
102
].includes (fileType );
102
103
}
103
104
async function openHtmlDataModal(item : any ) {
105
+ iframeLoading .value = true ;
106
+ dataModal .value = true ;
104
107
iframeDataSource .value = await api .getDataObjectUrl (item .id );
105
108
selectedHtmlDataObject .value = item ;
106
- dataModal .value = true ;
107
109
}
108
- function handleIframeScroll(e ) {
109
- console .log (e );
110
+ watch (dataModal , () => {
111
+ if (! dataModal .value ) {
112
+ selectedHtmlDataObject .value = null ;
113
+ iframeDataSource .value = ' ' ;
114
+ }
115
+ });
116
+ function onIframeLoaded() {
117
+ iframeLoading .value = false ;
110
118
}
111
119
112
120
const termsDialog = reactive ({
@@ -186,11 +194,12 @@ export default defineComponent({
186
194
187
195
return {
188
196
dataModal ,
197
+ iframeLoading ,
189
198
hasHtmlData ,
190
199
openHtmlDataModal ,
191
200
selectedHtmlDataObject ,
192
201
iframeDataSource ,
193
- handleIframeScroll ,
202
+ onIframeLoaded ,
194
203
onAcceptTerms ,
195
204
handleDownload ,
196
205
descriptionMap ,
@@ -221,20 +230,36 @@ export default defineComponent({
221
230
v-model =" dataModal"
222
231
scroll-strategy =" block"
223
232
width =" 80vw"
233
+ scrollable
224
234
>
225
235
<v-card
226
236
class =" d-flex flex-column"
227
237
width =" 100%"
228
238
height =" 80vh"
229
239
>
230
240
<v-card-text class =" d-flex flex-grow-1" >
231
- <span v-if =" !iframeDataSource" >Loading data</span >
241
+ <span
242
+ v-if =" iframeLoading"
243
+ class =" d-flex align-center justify-center flex-grow-1"
244
+ >
245
+ <v-progress-circular
246
+ color =" primary"
247
+ indeterminate
248
+ />
249
+ Loading...
250
+ </span >
232
251
<iframe
233
- v-else
234
- title =" iframe title"
252
+ :title =" selectedHtmlDataObject.description || 'Data object HTML content'"
235
253
:src =" iframeDataSource"
236
- :style =" {border: 'none'}"
237
- width =" 100%"
254
+ :style =" {border: 'none' }"
255
+ :width =" iframeLoading ? '0%' : '100%'"
256
+ class =" pa-4"
257
+ loading =" lazy"
258
+ @load =" onIframeLoaded"
259
+ />
260
+ <div
261
+ class =" iframe-blocker"
262
+ :style =" { position: 'absolute', height: '100%', width: '100%'}"
238
263
/>
239
264
</v-card-text >
240
265
<v-card-actions class =" flex-row" >
0 commit comments