Skip to content

Commit f4427ca

Browse files
committed
fix(loading): improve list loading indicator
1 parent abc68d9 commit f4427ca

File tree

5 files changed

+77
-12
lines changed

5 files changed

+77
-12
lines changed

src/components/common/list/ListItem.vue

+5
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ const props = defineProps({
9494
required: false,
9595
default: false,
9696
},
97+
showTagLoader: {
98+
type: Boolean,
99+
required: false,
100+
},
97101
});
98102
99103
const emit = defineEmits<{
@@ -233,6 +237,7 @@ const onClick = () => emit('onItemClick', { item: item?.value });
233237
:show-progress="showProgress"
234238
:show-played="showPlayed"
235239
:show-collected="showCollected"
240+
:show-tag-loader="showTagLoader"
236241
>
237242
<slot :item="item" :loading="loading" />
238243
</ListItemPanel>

src/components/common/list/ListItemPanel.vue

+64-12
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ const props = defineProps({
7373
required: false,
7474
default: false,
7575
},
76+
showTagLoader: {
77+
type: Boolean,
78+
required: false,
79+
},
7680
});
7781
7882
const { item, hideDate, showProgress, showPlayed, showCollected } = toRefs(props);
@@ -256,38 +260,64 @@ const onTagClick = (url?: string) => {
256260
>
257261
<div ref="innerContainer">
258262
<div class="meta type">
259-
<NSkeleton v-if="loading" style="width: 10%" round />
263+
<NSkeleton
264+
v-if="loading"
265+
style="width: 45px; height: 14px; margin-bottom: 0.25rem"
266+
round
267+
/>
260268
<AnchorLink v-else text v-bind="item?.typeLink">
261269
<NEllipsis :line-clamp="1" :tooltip="tooltipOptions">{{ type }}</NEllipsis>
262270
</AnchorLink>
263271
</div>
264272
<div class="title">
265-
<NSkeleton v-if="loading" text style="width: 70%" round />
273+
<NSkeleton v-if="loading" text style="width: 70%; height: 16px" round />
266274
<AnchorLink v-else text v-bind="item?.titleLink">
267275
<NEllipsis :line-clamp="2" :tooltip="tooltipOptions">
268276
{{ title }}
269277
</NEllipsis>
270278
</AnchorLink>
271279
</div>
272280
<div class="content">
273-
<NSkeleton v-if="loading" text style="width: 60%" round />
281+
<NSkeleton
282+
v-if="loading"
283+
text
284+
style="width: 60%; height: 14px; margin: 0.25rem 0"
285+
round
286+
/>
274287
<AnchorLink v-else text v-bind="item?.contentLink">
275288
<NEllipsis :line-clamp="contentHeight" :tooltip="tooltipOptions">
276289
{{ content }}
277290
</NEllipsis>
278291
</AnchorLink>
279292
</div>
280293
<NFlex
281-
v-if="(!hideTime && date) || tags?.length || showCollected || showPlayed"
294+
v-if="
295+
(!hideTime && date) ||
296+
(loading && showTagLoader) ||
297+
tags?.length ||
298+
showCollected ||
299+
showPlayed
300+
"
282301
size="medium"
283302
class="tags"
284303
>
285-
<template v-for="(tag, i) of tags" :key="`${i}-${tag.label}`">
286-
<NSkeleton v-if="loading" text style="width: 6%" />
287-
<TagLink :tag="tag" @on-click="onTagClick" />
304+
<template v-if="loading && showTagLoader">
305+
<NSkeleton text style="width: 120px; height: 18px" />
306+
</template>
307+
<template v-else>
308+
<template v-for="(tag, i) of tags" :key="`${i}-${tag.label}`">
309+
<NSkeleton v-if="loading" text style="width: 6%" />
310+
<TagLink :tag="tag" @on-click="onTagClick" />
311+
</template>
288312
</template>
313+
289314
<template v-if="!hideTime && date">
290-
<NSkeleton v-if="loading" key="date-loader" text style="width: 8%" />
315+
<NSkeleton
316+
v-if="loading"
317+
key="date-loader"
318+
text
319+
style="width: 42px; height: 18px"
320+
/>
291321
<NTag
292322
v-else
293323
key="date"
@@ -300,7 +330,12 @@ const onTagClick = (url?: string) => {
300330
</NTag>
301331
</template>
302332
<template v-if="showCollected && collected">
303-
<NSkeleton v-if="loading" key="collected-loader" text style="width: 3%" />
333+
<NSkeleton
334+
v-if="loading"
335+
key="collected-loader"
336+
text
337+
style="width: 22px; height: 18px"
338+
/>
304339
<NTag
305340
v-else
306341
key="collected"
@@ -319,7 +354,12 @@ const onTagClick = (url?: string) => {
319354
</NTag>
320355
</template>
321356
<template v-if="showPlayed && played">
322-
<NSkeleton v-if="loading" key="played-loader" text style="width: 3%" />
357+
<NSkeleton
358+
v-if="loading"
359+
key="played-loader"
360+
text
361+
style="width: 22px; height: 18px"
362+
/>
323363
<NTag
324364
v-else
325365
key="played"
@@ -337,8 +377,20 @@ const onTagClick = (url?: string) => {
337377
</NTag>
338378
</template>
339379
</NFlex>
340-
<div v-if="showProgress && !loading" class="panel-progress">
341-
<ProgressTooltip :progress="progress" :to="innerContainer" placement="top-end">
380+
<div v-if="showProgress" class="panel-progress">
381+
<NSkeleton
382+
v-if="loading"
383+
key="progress-loader"
384+
text
385+
style="display: flex; width: 100%; height: 4px"
386+
round
387+
/>
388+
<ProgressTooltip
389+
v-else
390+
:progress="progress"
391+
:to="innerContainer"
392+
placement="top-end"
393+
>
342394
<NProgress
343395
class="line"
344396
:data-show-id="progress?.id"

src/components/common/list/ListScroll.vue

+6
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ const props = defineProps({
9797
required: false,
9898
default: false,
9999
},
100+
showTagLoader: {
101+
type: Boolean,
102+
required: false,
103+
default: false,
104+
},
100105
});
101106
102107
const emits = defineEmits<{
@@ -257,6 +262,7 @@ const listPaddingBottom = computed(() => listOptions?.value?.paddingBottom ?? 32
257262
:show-progress="showProgress"
258263
:show-played="showPlayed"
259264
:show-collected="showCollected"
265+
:show-tag-loader="showTagLoader"
260266
@on-hover="onHover"
261267
@on-item-click="(...args) => $emit('onItemClick', ...args)"
262268
@on-scroll-into-view="(...args) => $emit('onScrollIntoView', ...args)"

src/components/views/calendar/CalendarComponent.vue

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ const { onItemClick } = usePanelItem();
7171
backdrop
7272
show-played
7373
show-collected
74+
show-tag-loader
7475
overscroll="none"
7576
:scroll-into-view="centerItem?.id ? [centerItem?.id] : []"
7677
@on-item-click="onItemClick"

src/components/views/progress/ProgressComponent.vue

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ watchUserChange({
103103
hide-date
104104
show-progress
105105
show-collected
106+
show-tag-loader
106107
@on-scroll="scrolled = true"
107108
@on-scroll-top="scrolled = false"
108109
@on-item-click="onItemClick"

0 commit comments

Comments
 (0)