Skip to content

Commit d7cdd2c

Browse files
committed
Add spinner for loading iframe content
1 parent 7e7507d commit d7cdd2c

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

web/src/components/DataObjectTable.vue

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts">
22
import {
3-
computed, defineComponent, PropType, reactive, ref, Ref,
3+
computed, defineComponent, PropType, reactive, ref, Ref, watch,
44
} from '@vue/composition-api';
55
import { flattenDeep } from 'lodash';
66
@@ -93,6 +93,7 @@ export default defineComponent({
9393
const selectedHtmlDataObject: Ref<any | null> = ref(null);
9494
const dataModal = ref(false);
9595
const iframeDataSource = ref('');
96+
const iframeLoading = ref(false);
9697
function hasHtmlData(fileType: string) {
9798
return [
9899
'Kraken2 Krona Plot',
@@ -101,12 +102,19 @@ export default defineComponent({
101102
].includes(fileType);
102103
}
103104
async function openHtmlDataModal(item: any) {
105+
iframeLoading.value = true;
106+
dataModal.value = true;
104107
iframeDataSource.value = await api.getDataObjectUrl(item.id);
105108
selectedHtmlDataObject.value = item;
106-
dataModal.value = true;
107109
}
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;
110118
}
111119
112120
const termsDialog = reactive({
@@ -186,11 +194,12 @@ export default defineComponent({
186194
187195
return {
188196
dataModal,
197+
iframeLoading,
189198
hasHtmlData,
190199
openHtmlDataModal,
191200
selectedHtmlDataObject,
192201
iframeDataSource,
193-
handleIframeScroll,
202+
onIframeLoaded,
194203
onAcceptTerms,
195204
handleDownload,
196205
descriptionMap,
@@ -221,20 +230,36 @@ export default defineComponent({
221230
v-model="dataModal"
222231
scroll-strategy="block"
223232
width="80vw"
233+
scrollable
224234
>
225235
<v-card
226236
class="d-flex flex-column"
227237
width="100%"
228238
height="80vh"
229239
>
230240
<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>
232251
<iframe
233-
v-else
234-
title="iframe title"
252+
:title="selectedHtmlDataObject.description || 'Data object HTML content'"
235253
: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%'}"
238263
/>
239264
</v-card-text>
240265
<v-card-actions class="flex-row">

0 commit comments

Comments
 (0)