refactor: resolve lag issues when opening the world dialog in the favorites worlds tab (#1156) (#1168)

* refactor: resolve lag issues when opening the world dialog in the favorite world tab (#1156)

* fix
This commit is contained in:
pa
2025-03-05 16:48:26 +09:00
committed by GitHub
parent 747a7ca683
commit 1fef4dee57
15 changed files with 1682 additions and 1051 deletions

View File

@@ -123,7 +123,7 @@ mixin previousInstances
size='mini'
@click='deleteGameLogWorldInstancePrompt(scope.row)')
previous-instance-info(
previous-instance-info-dialog(
:visible.sync='previousInstanceInfoDialogVisible'
:instance-id='previousInstanceInfoDialogInstanceId'
:game-log-is-friend='gameLogIsFriend'

View File

@@ -1,453 +1,20 @@
mixin worldDialog
el-dialog.x-dialog.x-world-dialog(
:before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='worldDialog'
:visible.sync='worldDialog.visible'
:show-close='false'
width='770px')
div(v-loading='worldDialog.loading')
div(style='display: flex')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='worldDialog.ref.thumbnailImageUrl'
style='flex: none; width: 160px; height: 120px; border-radius: 12px')
img.x-link(
v-lazy='worldDialog.ref.imageUrl'
style='width: 500px; height: 375px'
@click='showFullscreenImageDialog(worldDialog.ref.imageUrl)')
div(style='flex: 1; display: flex; align-items: center; margin-left: 15px')
div(style='flex: 1')
div
i.el-icon-s-home(
v-show='API.currentUser.$homeLocation && API.currentUser.$homeLocation.worldId === worldDialog.id'
style='margin-right: 5px')
span.dialog-title(v-text='worldDialog.ref.name')
div(style='margin-top: 5px')
span.x-link.x-grey(
v-text='worldDialog.ref.authorName'
@click='showUserDialog(worldDialog.ref.authorId)'
style='font-family: monospace')
div
el-tag(
v-if='worldDialog.ref.$isLabs'
type='primary'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.labs') }}
el-tag(
v-else-if='worldDialog.ref.releaseStatus === "public"'
type='success'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.public') }}
el-tag(
v-else
type='danger'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.private') }}
el-tag.x-tag-platform-pc(
v-if='worldDialog.isPC'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') PC
span.x-grey(
v-if='worldDialog.bundleSizes["standalonewindows"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ worldDialog.bundleSizes['standalonewindows'].fileSize }}
el-tag.x-tag-platform-quest(
v-if='worldDialog.isQuest'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') Android
span.x-grey(
v-if='worldDialog.bundleSizes["android"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ worldDialog.bundleSizes['android'].fileSize }}
el-tag.x-tag-platform-ios(
v-if='worldDialog.isIos'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') iOS
span.x-grey(
v-if='worldDialog.bundleSizes["ios"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ worldDialog.bundleSizes['ios'].fileSize }}
el-tag(
v-if='worldDialog.avatarScalingDisabled'
type='warning'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.avatar_scaling_disabled') }}
el-tag(
v-if='worldDialog.focusViewDisabled'
type='warning'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.focus_view_disabled') }}
el-tag(
v-if='worldDialog.stickersDisabled'
type='warning'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.stickers_disabled') }}
el-tag(
v-if='worldDialog.ref.unityPackageUrl'
type='success'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.world.tags.future_proofing') }}
el-tag.x-link(
v-if='worldDialog.inCache'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px'
@click='openFolderGeneric(worldDialog.cachePath)')
span(v-text='worldDialog.cacheSize')
| {{ $t('dialog.world.tags.cache') }}
div
template(v-for='tag in worldDialog.ref.tags')
el-tag(
v-if='tag.startsWith("content_")'
:key='tag'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px')
template(v-if='tag === "content_horror"') {{ $t('dialog.world.tags.content_horror') }}
template(v-else-if='tag === "content_gore"') {{ $t('dialog.world.tags.content_gore') }}
template(v-else-if='tag === "content_violence"') {{ $t('dialog.world.tags.content_violence') }}
template(v-else-if='tag === "content_adult"') {{ $t('dialog.world.tags.content_adult') }}
template(v-else-if='tag === "content_sex"') {{ $t('dialog.world.tags.content_sex') }}
template(v-else) {{ tag.replace('content_', '') }}
div(style='margin-top: 5px')
span(
v-show='worldDialog.ref.name !== worldDialog.ref.description'
v-text='worldDialog.ref.description'
style='font-size: 12px')
div(style='flex: none; margin-left: 10px')
el-tooltip(
v-if='worldDialog.inCache'
placement='top'
:content='$t("dialog.world.actions.delete_cache_tooltip")'
:disabled='hideTooltips')
el-button(
icon='el-icon-delete'
circle
@click='deleteVRChatCache(worldDialog.ref)'
:disabled='isGameRunning && worldDialog.cacheLocked')
el-tooltip(
v-if='worldDialog.isFavorite'
placement='top'
:content='$t("dialog.world.actions.favorites_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
icon='el-icon-star-on'
circle
@click='worldDialogCommand("Add Favorite")'
style='margin-left: 5px')
el-tooltip(
v-else
placement='top'
:content='$t("dialog.world.actions.favorites_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
icon='el-icon-star-off'
circle
@click='worldDialogCommand("Add Favorite")'
style='margin-left: 5px')
el-dropdown(
trigger='click'
@command='worldDialogCommand'
size='small'
style='margin-left: 5px')
el-button(type='default' icon='el-icon-more' circle)
el-dropdown-menu(#default='dropdown')
el-dropdown-item(icon='el-icon-refresh' command='Refresh') {{ $t('dialog.world.actions.refresh') }}
el-dropdown-item(icon='el-icon-share' command='Share') {{ $t('dialog.world.actions.share') }}
el-dropdown-item(icon='el-icon-s-flag' command='New Instance' divided) {{ $t('dialog.world.actions.new_instance') }}
el-dropdown-item(icon='el-icon-message' command='New Instance and Self Invite') {{ $t('dialog.world.actions.new_instance_and_self_invite') }}
el-dropdown-item(
v-if='API.currentUser.$homeLocation && API.currentUser.$homeLocation.worldId === worldDialog.id'
icon='el-icon-magic-stick'
command='Reset Home'
divided) {{ $t('dialog.world.actions.reset_home') }}
el-dropdown-item(v-else icon='el-icon-s-home' command='Make Home' divided) {{ $t('dialog.world.actions.make_home') }}
el-dropdown-item(icon='el-icon-tickets' command='Previous Instances') {{ $t('dialog.world.actions.show_previous_instances') }}
template(v-if='API.currentUser.id !== worldDialog.ref.authorId')
el-dropdown-item(icon='el-icon-picture-outline' command='Previous Images') {{ $t('dialog.world.actions.show_previous_images') }}
el-dropdown-item(
:disabled='!worldDialog.hasPersistData'
icon='el-icon-upload'
command='Delete Persistent Data') {{ $t('dialog.world.actions.delete_persistent_data') }}
template(v-else)
el-dropdown-item(icon='el-icon-edit' command='Rename') {{ $t('dialog.world.actions.rename') }}
el-dropdown-item(icon='el-icon-edit' command='Change Description') {{ $t('dialog.world.actions.change_description') }}
el-dropdown-item(icon='el-icon-edit' command='Change Capacity') {{ $t('dialog.world.actions.change_capacity') }}
el-dropdown-item(icon='el-icon-edit' command='Change Recommended Capacity') {{ $t('dialog.world.actions.change_recommended_capacity') }}
el-dropdown-item(icon='el-icon-edit' command='Change YouTube Preview') {{ $t('dialog.world.actions.change_preview') }}
el-dropdown-item(icon='el-icon-edit' command='Change Tags') {{ $t('dialog.world.actions.change_tags') }}
el-dropdown-item(icon='el-icon-edit' command='Change Allowed Domains') {{ $t('dialog.world.actions.change_allowed_video_player_domains') }}
el-dropdown-item(icon='el-icon-picture-outline' command='Change Image') {{ $t('dialog.world.actions.change_image') }}
el-dropdown-item(
v-if='worldDialog.ref.unityPackageUrl'
icon='el-icon-download'
command='Download Unity Package') {{ $t('dialog.world.actions.download_package') }}
el-dropdown-item(
v-if='worldDialog.ref.tags.includes("system_approved") || worldDialog.ref.tags.includes("system_labs")'
icon='el-icon-view'
command='Unpublish'
divided) {{ $t('dialog.world.actions.unpublish') }}
el-dropdown-item(v-else icon='el-icon-view' command='Publish' divided) {{ $t('dialog.world.actions.publish_to_labs') }}
el-dropdown-item(
:disabled='!worldDialog.hasPersistData'
icon='el-icon-upload'
command='Delete Persistent Data') {{ $t('dialog.world.actions.delete_persistent_data') }}
el-dropdown-item(icon='el-icon-delete' command='Delete' style='color: #f56c6c') {{ $t('dialog.world.actions.delete') }}
el-tabs
el-tab-pane(:label='$t("dialog.world.instances.header")')
div.
#[i.el-icon-user] {{ $t('dialog.world.instances.public_count', { count: worldDialog.ref.publicOccupants }) }}
#[i.el-icon-user-solid(style='margin-left: 10px')] {{ $t('dialog.world.instances.private_count', { count: worldDialog.ref.privateOccupants }) }}
#[i.el-icon-check(style='margin-left: 10px')] {{ $t('dialog.world.instances.capacity_count', { count: worldDialog.ref.recommendedCapacity, max: worldDialog.ref.capacity }) }}
div(v-for='room in worldDialog.rooms' :key='room.id')
div(style='margin: 5px 0')
location-world(
:locationobject='room.$location'
:currentuserid='API.currentUser.id'
:worlddialogshortname='worldDialog.$location.shortName'
@show-launch-dialog='showLaunchDialog')
launch(
:location='room.tag'
@show-launch-dialog='showLaunchDialog'
style='margin-left: 5px')
el-tooltip(
placement='top'
:content='$t("dialog.world.instances.self_invite_tooltip")'
:disabled='hideTooltips')
invite-yourself(
:location='room.$location.tag'
:shortname='room.$location.shortName'
style='margin-left: 5px')
el-tooltip(
placement='top'
:content='$t("dialog.world.instances.refresh_instance_info")'
:disabled='hideTooltips')
el-button(
@click='refreshInstancePlayerCount(room.tag)'
size='mini'
icon='el-icon-refresh'
style='margin-left: 5px'
circle)
el-tooltip(
v-if='instanceJoinHistory.get(room.$location.tag)'
placement='top'
:content='$t("dialog.previous_instances.info")'
:disabled='hideTooltips')
el-button(
@click='showPreviousInstanceInfoDialog(room.location)'
size='mini'
icon='el-icon-s-data'
style='margin-left: 5px'
plain
circle)
last-join(:location='room.$location.tag' :currentlocation='lastLocation.location')
instance-info(
:location='room.tag'
:instance='room.ref'
:friendcount='room.friendCount'
:updateelement='updateInstanceInfo')
.x-friend-list(
style='margin: 10px 0; max-height: unset'
v-if='room.$location.userId || room.users.length')
.x-friend-item.x-friend-item-border(
v-if='room.$location.userId'
@click='showUserDialog(room.$location.userId)')
template(v-if='room.$location.user')
.avatar(:class='userStatusClass(room.$location.user)')
img(v-lazy='userImage(room.$location.user)')
.detail
span.name(
v-text='room.$location.user.displayName'
:style='{ color: room.$location.user.$userColour }')
span.extra {{ $t('dialog.world.instances.instance_creator') }}
span(v-else v-text='room.$location.userId')
.x-friend-item.x-friend-item-border(
v-for='user in room.users'
:key='user.id'
@click='showUserDialog(user.id)')
.avatar(:class='userStatusClass(user)')
img(v-lazy='userImage(user)')
.detail
span.name(v-text='user.displayName' :style='{ color: user.$userColour }')
span.extra(v-if='user.location === "traveling"')
i.el-icon-loading(style='margin-right: 5px')
timer(:epoch='user.$travelingToTime')
span.extra(v-else)
timer(:epoch='user.$location_at')
el-tab-pane(:label='$t("dialog.world.info.header")' lazy)
.x-friend-list(style='max-height: none')
.x-friend-item(style='width: 100%; cursor: default')
.detail
span.name {{ $t('dialog.world.info.memo') }}
el-input.extra(
v-model='worldDialog.memo'
@change='onWorldMemoChange'
type='textarea'
:rows='2'
:autosize='{ minRows: 1, maxRows: 20 }'
:placeholder='$t("dialog.world.info.memo_placeholder")'
size='mini'
resize='none')
div(style='width: 100%; display: flex')
.x-friend-item(style='width: 100%; cursor: default')
.detail
span.name {{ $t('dialog.world.info.id') }}
span.extra {{ worldDialog.id }}
el-tooltip(
placement='top'
:content='$t("dialog.world.info.id_tooltip")'
:disabled='hideTooltips')
el-dropdown(
trigger='click'
@click.native.stop
size='mini'
style='margin-left: 5px')
el-button(type='default' icon='el-icon-s-order' size='mini' circle)
el-dropdown-menu(#default='dropdown')
el-dropdown-item(@click.native='copyWorldId(worldDialog.id)') {{ $t('dialog.world.info.copy_id') }}
el-dropdown-item(@click.native='copyWorldUrl(worldDialog.id)') {{ $t('dialog.world.info.copy_url') }}
el-dropdown-item(
@click.native='copyWorldName(worldDialog.ref.name)') {{ $t('dialog.world.info.copy_name') }}
.x-friend-item(
v-if='worldDialog.ref.previewYoutubeId'
style='width: 350px'
@click='openExternalLink(`https://www.youtube.com/watch?v=${worldDialog.ref.previewYoutubeId}`)')
.detail
span.name {{ $t('dialog.world.info.youtube_preview') }}
span.extra https://www.youtube.com/watch?v={{ worldDialog.ref.previewYoutubeId }}
.x-friend-item(style='width: 100%; cursor: default')
.detail
span.name {{ $t('dialog.world.info.author_tags') }}
span.extra(
v-if='worldDialog.ref.tags?.filter((tag) => tag.startsWith("author_tag")).length > 0') {{ worldDialog.ref.tags.filter((tag) => tag.startsWith('author_tag')).map((tag) => tag.replace('author_tag_', '')).join(', ') }}
span.extra(v-else) -
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.players') }}
span.extra {{ worldDialog.ref.occupants | commaNumber }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.favorites') }}
span.extra {{ worldDialog.ref.favorites | commaNumber }}
|  #[span.extra(v-if='worldDialog.ref.favorites > 0 && worldDialog.ref.visits > 0') ({{ Math.round((((worldDialog.ref.favorites - worldDialog.ref.visits) / worldDialog.ref.visits) * 100 + 100) * 100) / 100 }}%)]
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.visits') }}
span.extra {{ worldDialog.ref.visits | commaNumber }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.capacity') }}
span.extra {{ worldDialog.ref.recommendedCapacity | commaNumber }} ({{ worldDialog.ref.capacity | commaNumber }})
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.created_at') }}
span.extra {{ worldDialog.ref.created_at | formatDate('long') }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.last_updated') }}
span.extra(v-if='worldDialog.lastUpdated') {{ worldDialog.lastUpdated | formatDate('long') }}
span.extra(v-else) {{ worldDialog.ref.updated_at | formatDate('long') }}
.x-friend-item(v-if='worldDialog.ref.labsPublicationDate !== "none"' style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.labs_publication_date') }}
span.extra {{ worldDialog.ref.labsPublicationDate | formatDate('long') }}
.x-friend-item(v-if='worldDialog.ref.publicationDate !== "none"' style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.publication_date') }}
el-tooltip(
v-if='worldDialog.ref.publicationDate && worldDialog.ref.publicationDate !== "none" && worldDialog.ref.labsPublicationDate && worldDialog.ref.labsPublicationDate !== "none"'
placement='top'
style='margin-left: 5px')
template(#content)
span {{ $t('dialog.world.info.time_in_labs') }} {{ timeToText(new Date(worldDialog.ref.publicationDate) - new Date(worldDialog.ref.labsPublicationDate)) }}
i.el-icon-arrow-down
span.extra {{ worldDialog.ref.publicationDate | formatDate('long') }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.version') }}
span.extra(v-text='worldDialog.ref.version')
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.heat') }}
span.extra {{ worldDialog.ref.heat | commaNumber }} {{ '🔥'.repeat(worldDialog.ref.heat) }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.popularity') }}
span.extra {{ worldDialog.ref.popularity | commaNumber }} {{ '💖'.repeat(worldDialog.ref.popularity) }}
.x-friend-item(style='width: 100%; cursor: default')
.detail
span.name {{ $t('dialog.world.info.platform') }}
span.extra(v-text='worldDialogPlatform')
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.last_visited') }}
el-tooltip(
v-if='!hideTooltips'
placement='top'
style='margin-left: 5px'
:content='$t("dialog.world.info.accuracy_notice")')
i.el-icon-warning
span.extra {{ worldDialog.lastVisit | formatDate('long') }}
el-tooltip(
:disabled='hideTooltips'
placement='top'
:content='$t("dialog.user.info.open_previouse_instance")')
.x-friend-item(@click='showPreviousInstancesWorldDialog(worldDialog.ref)')
.detail
span.name {{ $t('dialog.world.info.visit_count') }}
el-tooltip(
v-if='!hideTooltips'
placement='top'
style='margin-left: 5px'
:content='$t("dialog.world.info.accuracy_notice")')
i.el-icon-warning
span.extra(v-text='worldDialog.visitCount')
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.world.info.time_spent') }}
el-tooltip(
v-if='!hideTooltips'
placement='top'
style='margin-left: 5px'
:content='$t("dialog.world.info.accuracy_notice")')
i.el-icon-warning
span.extra(v-if='worldDialog.timeSpent === 0') -
span.extra(v-else) {{ timeToText(worldDialog.timeSpent) }}
el-tab-pane(:label='$t("dialog.world.json.header")' lazy)
el-button(
type='default'
@click='refreshWorldDialogTreeData()'
size='mini'
icon='el-icon-refresh'
circle)
el-button(
type='default'
@click='downloadAndSaveJson(worldDialog.id, worldDialog.ref)'
size='mini'
icon='el-icon-download'
circle
style='margin-left: 5px')
el-tree(:data='worldDialog.treeData' style='margin-top: 5px; font-size: 12px')
template(#default='scope')
span
span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if='!scope.data.children' v-text='scope.data.value')
world-dialog(
:world-dialog='worldDialog'
:hide-tooltips='hideTooltips'
:is-game-running='isGameRunning'
:last-location='lastLocation'
:instance-join-history='instanceJoinHistory'
:update-instance-info='updateInstanceInfo'
@show-fullscreen-image-dialog='showFullscreenImageDialog'
@open-folder-generic='openFolderGeneric'
@delete-vrchat-cache='deleteVRChatCache'
@world-dialog-command='worldDialogCommand'
@show-launch-dialog='showLaunchDialog'
@refresh-instance-player-count='refreshInstancePlayerCount'
@show-previous-instance-info-dialog='showPreviousInstanceInfoDialog'
@show-previous-instances-world-dialog='showPreviousInstancesWorldDialog'
@download-and-save-json='downloadAndSaveJson')
//- dialog: change Allowed Video Player Domains
el-dialog.x-dialog(

View File

@@ -16,7 +16,7 @@ mixin favoritesTab
size='small'
icon='el-icon-refresh'
circle)
el-tabs(type='card' v-loading='API.isFavoriteLoading' style='height: 100%' @tab-click='onFavTabClick')
el-tabs(type='card' v-loading='API.isFavoriteLoading' style='height: 100%')
el-tab-pane(:label='$t("view.favorite.friends.header")' lazy)
div(style='display: flex; align-items: center; justify-content: space-between')
div
@@ -132,302 +132,28 @@ mixin favoritesTab
style='padding-top: 25px; width: 100%; display: flex; align-items: center; justify-content: center; color: rgb(144, 147, 153)')
span No Data
el-tab-pane(:label='$t("view.favorite.worlds.header")' lazy)
div(style='display: flex; align-items: center; justify-content: space-between')
div
el-button(size='small' @click='showWorldExportDialog') {{ $t('view.favorite.export') }}
el-button(size='small' @click='showWorldImportDialog' style='margin-left: 5px') {{ $t('view.favorite.import') }}
div(style='display: flex; align-items: center; font-size: 13px; margin-right: 10px')
span.name(style='margin-right: 5px; line-height: 10px') {{ $t('view.favorite.sort_by') }}
el-radio-group(
v-model='sortFavorites'
@change='saveSortFavoritesOption'
style='margin-right: 12px')
el-radio(:label='false') {{ $t('view.settings.appearance.appearance.sort_favorite_by_name') }}
el-radio(:label='true') {{ $t('view.settings.appearance.appearance.sort_favorite_by_date') }}
el-input(
v-model='worldFavoriteSearch'
@input='searchWorldFavorites'
clearable
size='mini'
:placeholder='$t("view.favorite.worlds.search")'
style='width: 200px')
.x-friend-list(style='margin-top: 10px')
div(
style='display: inline-block; width: 300px; margin-right: 15px'
v-for='favorite in worldFavoriteSearchResults'
:key='favorite.id'
@click='showWorldDialog(favorite.id)')
.x-friend-item
template(v-if='favorite.name')
.avatar
img(v-lazy='favorite.thumbnailImageUrl')
.detail
span.name(v-text='favorite.name')
span.extra(v-if='favorite.occupants') {{ favorite.authorName }} ({{ favorite.occupants }})
span.extra(v-else v-text='favorite.authorName')
template(v-else)
.avatar
.detail
span(v-text='favorite.id')
span(style='display: block; margin-top: 20px') {{ $t('view.favorite.worlds.vrchat_favorites') }}
el-collapse(style='border: 0')
el-collapse-item(v-for='group in API.favoriteWorldGroups' :key='group.name')
template(slot='title')
div(style='display: flex; align-items: center')
span(
v-text='group.displayName'
style='font-weight: bold; font-size: 14px; margin-left: 10px')
el-tag(
style='margin: 1px 0 0 5px'
size='mini'
:type='userFavoriteWorldsStatusForFavTab(group.visibility)'
effect='plain') {{ group.visibility.charAt(0).toUpperCase() + group.visibility.slice(1) }}
span(style='color: #909399; font-size: 12px; margin-left: 10px') {{ group.count }}/{{ group.capacity }}
el-dropdown(trigger='click' @click.native.stop size='mini' style='margin-left: 10px')
el-tooltip(
placement='top'
:content='$t("view.favorite.visibility_tooltip")'
:disabled='hideTooltips')
el-button(type='default' icon='el-icon-view' size='mini' circle)
el-dropdown-menu(#default='dropdown')
el-dropdown-item(
v-if='group.visibility !== visibility'
v-for='visibility in worldGroupVisibilityOptions'
:key='visibility'
style='display: block; margin: 10px 0'
v-text='visibility.charAt(0).toUpperCase() + visibility.slice(1)'
@click.native='changeWorldGroupVisibility(group.name, visibility)')
el-tooltip(
placement='top'
:content='$t("view.favorite.rename_tooltip")'
:disabled='hideTooltips')
el-button(
@click.stop='changeFavoriteGroupName(group)'
size='mini'
icon='el-icon-edit'
circle
style='margin-left: 5px')
el-tooltip(
placement='right'
:content='$t("view.favorite.clear_tooltip")'
:disabled='hideTooltips')
el-button(
@click.stop='clearFavoriteGroup(group)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
.x-friend-list(v-if='group.count' style='margin-top: 10px')
div(
style='display: inline-block; width: 300px; margin-right: 15px'
v-for='favorite in groupedByGroupKeyFavoriteWorlds[group.key]'
:key='favorite.id'
@click='showWorldDialog(favorite.id)')
.x-friend-item
template(v-if='favorite.ref')
.avatar
img(v-lazy='favorite.ref.thumbnailImageUrl')
.detail
span.name(v-text='favorite.ref.name')
span.extra(v-if='favorite.ref.occupants') {{ favorite.ref.authorName }} ({{ favorite.ref.occupants }})
span.extra(v-else v-text='favorite.ref.authorName')
template(v-if='editFavoritesMode')
el-dropdown(
trigger='click'
@click.native.stop
size='mini'
style='margin-left: 5px')
el-tooltip(
placement='left'
:content='$t("view.favorite.move_tooltip")'
:disabled='hideTooltips')
el-button(type='default' icon='el-icon-back' size='mini' circle)
el-dropdown-menu(#default='dropdown')
template(
v-if='groupAPI.name !== group.name'
v-for='groupAPI in API.favoriteWorldGroups')
el-dropdown-item(
:key='groupAPI.name'
style='display: block; margin: 10px 0'
@click.native='moveFavorite(favorite.ref, groupAPI, "world")'
:disabled='groupAPI.count >= groupAPI.capacity') {{ groupAPI.displayName }} ({{ groupAPI.count }} / {{ groupAPI.capacity }})
el-button(type='text' size='mini' @click.stop style='margin-left: 5px')
el-checkbox(v-model='favorite.$selected')
template(v-else)
el-tooltip(
v-if='favorite.deleted'
placement='left'
:content='$t("view.favorite.unavailable_tooltip")')
i.el-icon-warning(style='color: #f56c6c; margin-left: 5px')
el-tooltip(
v-if='favorite.ref.releaseStatus === "private"'
placement='left'
:content='$t("view.favorite.private")')
i.el-icon-warning(style='color: #e6a23c; margin-left: 5px')
el-tooltip(
placement='left'
:content='$t("view.favorite.self_invite_tooltip")'
:disabled='hideTooltips')
el-button(
@click.stop='newInstanceSelfInvite(favorite.id)'
size='mini'
icon='el-icon-message'
circle
style='margin-left: 5px')
el-tooltip(
placement='right'
:content='$t("view.favorite.unfavorite_tooltip")'
:disabled='hideTooltips')
el-button(
v-if='shiftHeld'
@click.stop='deleteFavorite(favorite.id)'
size='mini'
icon='el-icon-close'
circle
style='color: #f56c6c; margin-left: 5px')
el-button(
v-else
@click.stop='showFavoriteDialog("world", favorite.id)'
type='default'
icon='el-icon-star-on'
size='mini'
circle
style='margin-left: 5px')
template(v-else)
.avatar
.detail
span(v-text='favorite.name || favorite.id')
el-tooltip(
v-if='favorite.deleted'
placement='left'
:content='$t("view.favorite.unavailable_tooltip")')
i.el-icon-warning(style='color: #f56c6c; margin-left: 5px')
el-button(
type='text'
icon='el-icon-close'
size='mini'
@click.stop='deleteFavorite(favorite.id)'
style='margin-left: 5px')
div(
v-else
style='padding-top: 25px; width: 100%; display: flex; align-items: center; justify-content: center; color: rgb(144, 147, 153)')
span No Data
span(style='display: block; margin-top: 20px') {{ $t('view.favorite.worlds.local_favorites') }}
br
el-button(size='small' @click='promptNewLocalWorldFavoriteGroup') {{ $t('view.favorite.worlds.new_group') }}
el-button(
v-if='!refreshingLocalFavorites'
size='small'
@click='refreshLocalWorldFavorites'
style='margin-left: 5px') {{ $t('view.favorite.worlds.refresh') }}
el-button(v-else size='small' @click='refreshingLocalFavorites = false' style='margin-left: 5px')
i.el-icon-loading(style='margin-right: 5px')
span {{ $t('view.favorite.worlds.cancel_refresh') }}
el-collapse-item(
v-for='group in localWorldFavoriteGroups'
v-if='localWorldFavorites[group]'
:key='group')
template(slot='title')
span(v-text='group' style='font-weight: bold; font-size: 14px; margin-left: 10px')
span(style='color: #909399; font-size: 12px; margin-left: 10px') {{ getLocalWorldFavoriteGroupLength(group) }}
el-tooltip(
placement='top'
:content='$t("view.favorite.rename_tooltip")'
:disabled='hideTooltips')
el-button(
@click.stop='promptLocalWorldFavoriteGroupRename(group)'
size='mini'
icon='el-icon-edit'
circle
style='margin-left: 10px')
el-tooltip(
placement='right'
:content='$t("view.favorite.delete_tooltip")'
:disabled='hideTooltips')
el-button(
@click.stop='promptLocalWorldFavoriteGroupDelete(group)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
.x-friend-list(
style='margin-top: 10px'
v-if='localFavoriteShowDelayedContent[0] && localWorldFavorites[group].length')
div(
style='display: inline-block; width: 300px; margin-right: 15px'
v-for='favorite in localWorldFavorites[group]'
:key='favorite.id'
@click='showWorldDialog(favorite.id)')
.x-friend-item
template(v-if='favorite.name')
.avatar
img(v-lazy='favorite.thumbnailImageUrl')
.detail
span.name(v-text='favorite.name')
span.extra(v-if='favorite.occupants') {{ favorite.authorName }} ({{ favorite.occupants }})
span.extra(v-else v-text='favorite.authorName')
template(v-if='editFavoritesMode')
el-dropdown(
trigger='click'
@click.native.stop
size='mini'
style='margin-left: 5px')
el-tooltip(
placement='left'
:content='$t("view.favorite.copy_tooltip")'
:disabled='hideTooltips')
el-button(type='default' icon='el-icon-back' size='mini' circle)
el-dropdown-menu(#default='dropdown')
template(v-for='groupAPI in API.favoriteWorldGroups')
el-dropdown-item(
:key='groupAPI.name'
style='display: block; margin: 10px 0'
@click.native='addFavoriteWorld(favorite, groupAPI, true)'
:disabled='groupAPI.count >= groupAPI.capacity') {{ groupAPI.displayName }} ({{ groupAPI.count }} / {{ groupAPI.capacity }})
template(v-else)
el-tooltip(
placement='left'
:content='$t("view.favorite.self_invite_tooltip")'
:disabled='hideTooltips')
el-button(
@click.stop='newInstanceSelfInvite(favorite.id)'
size='mini'
icon='el-icon-message'
circle
style='margin-left: 5px')
el-tooltip(
placement='right'
:content='$t("view.favorite.unfavorite_tooltip")'
:disabled='hideTooltips')
el-button(
v-if='shiftHeld'
@click.stop='removeLocalWorldFavorite(favorite.id, group)'
size='mini'
icon='el-icon-close'
circle
style='color: #f56c6c; margin-left: 5px')
el-button(
v-else
@click.stop='showFavoriteDialog("world", favorite.id)'
type='default'
icon='el-icon-star-on'
size='mini'
circle
style='margin-left: 5px')
template(v-else)
.avatar
.detail
span(v-text='favorite.id')
el-button(
type='text'
icon='el-icon-close'
size='mini'
@click.stop='removeLocalWorldFavorite(favorite.id, group)'
style='margin-left: 5px')
div(
v-else
style='padding-top: 25px; width: 100%; display: flex; align-items: center; justify-content: center; color: rgb(144, 147, 153)')
span No Data
favorites-world-tab(
@show-world-export-dialog='showWorldExportDialog'
@show-world-import-dialog='showWorldImportDialog'
@save-sort-favorites-option='saveSortFavoritesOption'
@show-world-dialog='showWorldDialog'
@change-favorite-group-name='changeFavoriteGroupName'
@clear-favorite-group='clearFavoriteGroup'
@new-instance-self-invite='newInstanceSelfInvite'
@show-favorite-dialog='showFavoriteDialog'
@refresh-local-world-favorite='refreshLocalWorldFavorites'
@delete-local-world-favorite-group='deleteLocalWorldFavoriteGroup'
@search-world-favorites='searchWorldFavorites'
@remove-local-world-favorite='removeLocalWorldFavorite'
:sort-favorites.sync='sortFavorites'
:world-favorite-search-results='worldFavoriteSearchResults'
:hide-tooltips='hideTooltips'
:favorite-worlds='favoriteWorlds'
:edit-favorites-mode='editFavoritesMode'
:shift-held='shiftHeld'
:refresh-local-world-favorites='refreshLocalWorldFavorites'
:local-world-favorite-groups='localWorldFavoriteGroups'
:local-world-favorites='localWorldFavorites')
el-tab-pane(:label='$t("view.favorite.avatars.header")' lazy)
div(style='display: flex; align-items: center; justify-content: space-between')
div
@@ -681,9 +407,7 @@ mixin favoritesTab
icon='el-icon-delete'
circle
style='margin-left: 5px')
.x-friend-list(
style='margin-top: 10px'
v-if='localFavoriteShowDelayedContent[1] && localAvatarFavorites[group].length')
.x-friend-list(style='margin-top: 10px' v-if='localAvatarFavorites[group].length')
div(
style='display: inline-block; width: 300px; margin-right: 15px'
v-for='favorite in localAvatarFavorites[group]'

View File

@@ -105,7 +105,7 @@ mixin notificationsTab
@click='showFullscreenImageDialog(scope.row.imageUrl)')
el-table-column(:label='$t("table.notification.message")' prop='message')
template(#default='scope')
span.x-link(v-if='scope.row.type === "invite"')
span.x-link(v-if='scope.row.type === "invite"' style='display: flex')
location(
v-if='scope.row.details'
:location='scope.row.details.worldId'