Unleash the PUG linter

This commit is contained in:
Natsumi
2025-01-27 12:28:08 +13:00
parent ca6b52c053
commit cc1a1fbd6a
30 changed files with 6904 additions and 3041 deletions
+5 -1
View File
@@ -95,7 +95,11 @@ export default class extends baseClass {
) { ) {
if (LINUX) { if (LINUX) {
this.nextGameRunningCheck = 1; this.nextGameRunningCheck = 1;
$app.updateIsGameRunning(await AppApi.IsGameRunning(), await AppApi.IsSteamVRRunning(), false); $app.updateIsGameRunning(
await AppApi.IsGameRunning(),
await AppApi.IsSteamVRRunning(),
false
);
} else { } else {
this.nextGameRunningCheck = 3; this.nextGameRunningCheck = 3;
AppApi.CheckGameRunning(); AppApi.CheckGameRunning();
+11 -7
View File
@@ -146,12 +146,12 @@ export default class extends baseClass {
fileInput.accept = '.json'; fileInput.accept = '.json';
fileInput.style.display = 'none'; fileInput.style.display = 'none';
document.body.appendChild(fileInput); document.body.appendChild(fileInput);
fileInput.onchange = function(event) { fileInput.onchange = function (event) {
const file = event.target.files[0]; const file = event.target.files[0];
if (file) { if (file) {
const reader = new FileReader(); const reader = new FileReader();
reader.onload = function() { reader.onload = function () {
fileInput.remove(); fileInput.remove();
resolve(reader.result); resolve(reader.result);
}; };
@@ -161,15 +161,19 @@ export default class extends baseClass {
resolve(null); resolve(null);
} }
}; };
fileInput.click(); fileInput.click();
}); });
}, },
async restoreVrcRegistryFromFile() { async restoreVrcRegistryFromFile() {
if (WINDOWS) { if (WINDOWS) {
var filePath = await AppApi.OpenFileSelectorDialog(null, ".json", "JSON Files (*.json)|*.json"); var filePath = await AppApi.OpenFileSelectorDialog(
if (filePath === "") { null,
'.json',
'JSON Files (*.json)|*.json'
);
if (filePath === '') {
return; return;
} }
} }
@@ -180,7 +184,7 @@ export default class extends baseClass {
} else { } else {
json = await AppApi.ReadVrcRegJsonFile(filePath); json = await AppApi.ReadVrcRegJsonFile(filePath);
} }
try { try {
var data = JSON.parse(json); var data = JSON.parse(json);
if (!data || typeof data !== 'object') { if (!data || typeof data !== 'object') {
+22 -8
View File
@@ -185,23 +185,33 @@ export default class extends baseClass {
} }
const notiConditions = { const notiConditions = {
'Always': () => true, Always: () => true,
'Inside VR': () => this.isSteamVRRunning, 'Inside VR': () => this.isSteamVRRunning,
'Outside VR': () => !this.isSteamVRRunning, 'Outside VR': () => !this.isSteamVRRunning,
'Game Closed': () => !this.isGameRunning, // Also known as "Outside VRChat" 'Game Closed': () => !this.isGameRunning, // Also known as "Outside VRChat"
'Game Running': () => this.isGameRunning, // Also known as "Inside VRChat" 'Game Running': () => this.isGameRunning, // Also known as "Inside VRChat"
'Desktop Mode': () => this.isGameNoVR && this.isGameRunning, 'Desktop Mode': () => this.isGameNoVR && this.isGameRunning,
'AFK': () => this.afkDesktopToast && this.isHmdAfk && this.isGameRunning && !this.isGameNoVR, AFK: () =>
this.afkDesktopToast &&
this.isHmdAfk &&
this.isGameRunning &&
!this.isGameNoVR
}; };
const playNotificationTTS = notiConditions[this.notificationTTS]?.(); const playNotificationTTS =
const playDesktopToast = notiConditions[this.desktopToast]?.() || notiConditions['AFK'](); notiConditions[this.notificationTTS]?.();
const playDesktopToast =
notiConditions[this.desktopToast]?.() ||
notiConditions['AFK']();
const playOverlayToast = notiConditions[this.overlayToast]?.(); const playOverlayToast = notiConditions[this.overlayToast]?.();
const playOverlayNotification = this.overlayNotifications && playOverlayToast; const playOverlayNotification =
this.overlayNotifications && playOverlayToast;
const playXSNotification = this.xsNotifications && playOverlayToast; const playXSNotification = this.xsNotifications && playOverlayToast;
const playOvrtHudNotifications = this.ovrtHudNotifications && playOverlayToast; const playOvrtHudNotifications =
const playOvrtWristNotifications = this.ovrtWristNotifications && playOverlayToast; this.ovrtHudNotifications && playOverlayToast;
const playOvrtWristNotifications =
this.ovrtWristNotifications && playOverlayToast;
var message = ''; var message = '';
if (noty.title) { if (noty.title) {
@@ -1299,7 +1309,11 @@ export default class extends baseClass {
if (WINDOWS) { if (WINDOWS) {
AppApi.DesktopNotification(displayName, message, image); AppApi.DesktopNotification(displayName, message, image);
} else { } else {
window.electron.desktopNotification(displayName, message, image); window.electron.desktopNotification(
displayName,
message,
image
);
} }
}, },
+65 -55
View File
@@ -1,31 +1,42 @@
doctype html doctype html
html html
head head
meta(http-equiv="Content-Type" content="text/html;charset=utf-8") meta(http-equiv='Content-Type' content='text/html;charset=utf-8')
meta(http-equiv="Cache-Control" content="no-cache") meta(http-equiv='Cache-Control' content='no-cache')
meta(http-equiv="referrer" content="no-referrer") meta(http-equiv='referrer' content='no-referrer')
meta(http-equiv="viewport" content="width=device-width,initial-scale=1,user-scalable=no") meta(http-equiv='viewport' content='width=device-width,initial-scale=1,user-scalable=no')
title VRCX title VRCX
link(rel="preconnect" href="https://api.vrchat.cloud") link(rel='preconnect' href='https://api.vrchat.cloud')
link(rel="preconnect" href="https://d348imysud55la.cloudfront.net") link(rel='preconnect' href='https://d348imysud55la.cloudfront.net')
link(rel="stylesheet" href="app.css") link(rel='stylesheet' href='app.css')
link(rel="stylesheet" href="flags.css") link(rel='stylesheet' href='flags.css')
link(rel="stylesheet" href="animated-emoji.css") link(rel='stylesheet' href='animated-emoji.css')
body body
.x-app#x-app(style="display:none" @dragenter.prevent @dragover.prevent @drop.prevent) #x-app.x-app(style='display: none' @dragenter.prevent @dragover.prevent @drop.prevent)
//- login //- login
include ./mixins/loginPage.pug include ./mixins/loginPage.pug
+loginPage() +loginPage
//- menu //- menu
.x-menu-container .x-menu-container
//- download progress, update pending //- download progress, update pending
.pending-update(v-if="updateInProgress" @click="showVRCXUpdateDialog") .pending-update(v-if='updateInProgress' @click='showVRCXUpdateDialog')
el-progress(type="circle" width="50" stroke-width="3" :percentage="updateProgress" :format="updateProgressText") el-progress(
.pending-update(v-else-if="pendingVRCXUpdate || pendingVRCXInstall") type='circle'
el-button(type="default" @click="showVRCXUpdateDialog" size="mini" icon="el-icon-download" circle style="font-size:14px;height:50px;width:50px") width='50'
stroke-width='3'
:percentage='updateProgress'
:format='updateProgressText')
.pending-update(v-else-if='pendingVRCXUpdate || pendingVRCXInstall')
el-button(
type='default'
@click='showVRCXUpdateDialog'
size='mini'
icon='el-icon-download'
circle
style='font-size: 14px; height: 50px; width: 50px')
el-menu(ref="menu" collapse @select="selectMenu") el-menu(ref='menu' collapse @select='selectMenu')
mixin menuitem(index, name, icon) mixin menuitem(index, name, icon)
el-menu-item(index=index) el-menu-item(index=index)
i(class=icon) i(class=icon)
@@ -44,118 +55,117 @@ html
+menuitem('settings', "{{ $t('nav_tooltip.settings') }}", 'el-icon-s-tools') +menuitem('settings', "{{ $t('nav_tooltip.settings') }}", 'el-icon-s-tools')
//- ### Tabs ### //- ### Tabs ###
template(v-if="API.isLoggedIn") template(v-if='API.isLoggedIn')
//- feed //- feed
include ./mixins/tabs/feed.pug include ./mixins/tabs/feed.pug
+feedTab() +feedTab
//- gameLog //- gameLog
include ./mixins/tabs/gameLog.pug include ./mixins/tabs/gameLog.pug
+gameLogTab() +gameLogTab
//- playerList //- playerList
include ./mixins/tabs/playerList.pug include ./mixins/tabs/playerList.pug
+playerListTab() +playerListTab
//- search //- search
include ./mixins/tabs/search.pug include ./mixins/tabs/search.pug
+searchTab() +searchTab
//- favorite //- favorite
include ./mixins/tabs/favorites.pug include ./mixins/tabs/favorites.pug
+favoritesTab() +favoritesTab
//- friendLog //- friendLog
include ./mixins/tabs/friendLog.pug include ./mixins/tabs/friendLog.pug
+friendLogTab() +friendLogTab
//- moderation //- moderation
moderation-tab( moderation-tab(
v-if="$refs.menu?.activeIndex === 'moderation'" v-if='$refs.menu?.activeIndex === "moderation"'
:Api='API' :Api='API'
:table-data='playerModerationTable' :table-data='playerModerationTable'
:show-user-dialog='showUserDialog' :show-user-dialog='showUserDialog'
:shift-held='shiftHeld') :shift-held='shiftHeld')
//- notification //- notification
include ./mixins/tabs/notifications.pug include ./mixins/tabs/notifications.pug
+notificationsTab() +notificationsTab
//- profile //- profile
include ./mixins/tabs/profile.pug include ./mixins/tabs/profile.pug
+profileTab() +profileTab
//- friends list //- friends list
include ./mixins/tabs/friendsList.pug include ./mixins/tabs/friendsList.pug
+friendsListTab() +friendsListTab
//- settings //- settings
include ./mixins/tabs/settings.pug include ./mixins/tabs/settings.pug
+settingsTab() +settingsTab
include ./mixins/friendsListSidebar.pug include ./mixins/friendsListSidebar.pug
+friendsListSidebar() +friendsListSidebar
//- ## Dialogs ## -\\ //- ## Dialogs ## -\\
include ./mixins/dialogs/userDialog.pug include ./mixins/dialogs/userDialog.pug
+userDialog() +userDialog
include ./mixins/dialogs/worldDialog.pug include ./mixins/dialogs/worldDialog.pug
+worldDialog() +worldDialog
include ./mixins/dialogs/avatarDialog.pug include ./mixins/dialogs/avatarDialog.pug
+avatarDialog() +avatarDialog
include ./mixins/dialogs/groupDialog.pug include ./mixins/dialogs/groupDialog.pug
+groupDialog() +groupDialog
include ./mixins/dialogs/favoritesDialog.pug include ./mixins/dialogs/favoritesDialog.pug
+favoritesDialog() +favoritesDialog
include ./mixins/dialogs/images.pug include ./mixins/dialogs/images.pug
+images() +images
include ./mixins/dialogs/newInstance.pug include ./mixins/dialogs/newInstance.pug
+newInstance() +newInstance
include ./mixins/dialogs/feedFilters.pug include ./mixins/dialogs/feedFilters.pug
+feedFilters() +feedFilters
include ./mixins/dialogs/openSourceSoftwareNotice.pug include ./mixins/dialogs/openSourceSoftwareNotice.pug
+openSourceSoftwareNotice() +openSourceSoftwareNotice
include ./mixins/dialogs/groups.pug include ./mixins/dialogs/groups.pug
+groups() +groups
include ./mixins/dialogs/currentUser.pug include ./mixins/dialogs/currentUser.pug
+currentUser() +currentUser
include ./mixins/dialogs/invites.pug include ./mixins/dialogs/invites.pug
+invites() +invites
include ./mixins/dialogs/launch.pug include ./mixins/dialogs/launch.pug
+launch() +launch
include ./mixins/dialogs/screenshotMetadata.pug include ./mixins/dialogs/screenshotMetadata.pug
+screenshotMetadata() +screenshotMetadata
include ./mixins/dialogs/vrcx.pug include ./mixins/dialogs/vrcx.pug
+vrcx() +vrcx
include ./mixins/dialogs/settings.pug include ./mixins/dialogs/settings.pug
+settings() +settings
include ./mixins/dialogs/previousInstances.pug include ./mixins/dialogs/previousInstances.pug
+previousInstances() +previousInstances
include ./mixins/dialogs/tags.pug include ./mixins/dialogs/tags.pug
+tags() +tags
include ./mixins/dialogs/boops.pug include ./mixins/dialogs/boops.pug
+boops() +boops
//- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="templateDialog" :visible.sync="templateDialog.visible" :title="$t('dialog.template_dialog.header')" width="450px") //- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="templateDialog" :visible.sync="templateDialog.visible" :title="$t('dialog.template_dialog.header')" width="450px")
script(src="vendor.js") script(src='vendor.js')
script(src="app.js") script(src='app.js')
+291 -103
View File
@@ -1,130 +1,318 @@
mixin avatarDialog
mixin avatarDialog() el-dialog.x-dialog.x-avatar-dialog(
el-dialog.x-dialog.x-avatar-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarDialog" :visible.sync="avatarDialog.visible" :show-close="false" width="600px") :before-close='beforeDialogClose'
div(v-loading="avatarDialog.loading") @mousedown.native='dialogMouseDown'
div(style="display:flex") @mouseup.native='dialogMouseUp'
el-popover(placement="right" width="500px" trigger="click") ref='avatarDialog'
img.x-link(slot="reference" v-lazy="avatarDialog.ref.thumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:12px") :visible.sync='avatarDialog.visible'
img.x-link(v-lazy="avatarDialog.ref.imageUrl" style="width:500px;height:375px" @click="showFullscreenImageDialog(avatarDialog.ref.imageUrl)") :show-close='false'
div(style="flex:1;display:flex;align-items:center;margin-left:15px") width='600px')
div(style="flex:1") div(v-loading='avatarDialog.loading')
div(style='display: flex')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='avatarDialog.ref.thumbnailImageUrl'
style='flex: none; width: 160px; height: 120px; border-radius: 12px')
img.x-link(
v-lazy='avatarDialog.ref.imageUrl'
style='width: 500px; height: 375px'
@click='showFullscreenImageDialog(avatarDialog.ref.imageUrl)')
div(style='flex: 1; display: flex; align-items: center; margin-left: 15px')
div(style='flex: 1')
div div
span.dialog-title(v-text="avatarDialog.ref.name") span.dialog-title(v-text='avatarDialog.ref.name')
div(style="margin-top:5px") div(style='margin-top: 5px')
span.x-link.x-grey(v-text="avatarDialog.ref.authorName" @click="showUserDialog(avatarDialog.ref.authorId)" style="font-family:monospace") span.x-link.x-grey(
v-text='avatarDialog.ref.authorName'
@click='showUserDialog(avatarDialog.ref.authorId)'
style='font-family: monospace')
div div
el-tag(v-if="avatarDialog.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.public') }} el-tag(
el-tag(v-else type="danger" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.private') }} v-if='avatarDialog.ref.releaseStatus === "public"'
el-tag.x-tag-platform-pc(v-if="avatarDialog.isPC" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") PC type='success'
span.x-grey(v-if="avatarDialog.platformInfo.pc" style=";margin-left:5px;border-left:inherit;padding-left:5px") {{ avatarDialog.platformInfo.pc.performanceRating }} effect='plain'
span.x-grey(v-if="avatarDialog.bundleSizes['standalonewindows']" style=";margin-left:5px;border-left:inherit;padding-left:5px") {{ avatarDialog.bundleSizes['standalonewindows'].fileSize }} size='mini'
el-tag.x-tag-platform-quest(v-if="avatarDialog.isQuest" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") Android style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.avatar.tags.public') }}
span.x-grey(v-if="avatarDialog.platformInfo.android" style=";margin-left:5px;border-left:inherit;padding-left:5px") {{ avatarDialog.platformInfo.android.performanceRating }} el-tag(
span.x-grey(v-if="avatarDialog.bundleSizes['android']" style="margin-left:5px;border-left:inherit;padding-left:5px") {{ avatarDialog.bundleSizes['android'].fileSize }} v-else
el-tag.x-tag-platform-ios(v-if="avatarDialog.isIos" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") iOS type='danger'
span.x-grey(v-if="avatarDialog.platformInfo.ios" style=";margin-left:5px;border-left:inherit;padding-left:5px") {{ avatarDialog.platformInfo.ios.performanceRating }} effect='plain'
span.x-grey(v-if="avatarDialog.bundleSizes['ios']" style="margin-left:5px;border-left:inherit;padding-left:5px") {{ avatarDialog.bundleSizes['ios'].fileSize }} size='mini'
el-tag.x-link(v-if="avatarDialog.inCache" type="info" effect="plain" size="mini" @click="openFolderGeneric(avatarDialog.cachePath)" style="margin-right:5px;margin-top:5px") style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.avatar.tags.private') }}
span(v-text="avatarDialog.cacheSize") el-tag.x-tag-platform-pc(
| {{ $t('dialog.avatar.tags.cache') }} v-if='avatarDialog.isPC'
el-tag(v-if="avatarDialog.isQuestFallback" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.fallback') }} type='info'
el-tag(v-if="avatarDialog.hasImposter" type="info" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.impostor') }} effect='plain'
span.x-grey(v-if="avatarDialog.imposterVersion" style="margin-left:5px;border-left:inherit;padding-left:5px") v{{ avatarDialog.imposterVersion }} size='mini'
el-tag(v-if="avatarDialog.ref.unityPackageUrl" type="success" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.avatar.tags.future_proofing') }} style='margin-right: 5px; margin-top: 5px') PC
span.x-grey(
v-if='avatarDialog.platformInfo.pc'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ avatarDialog.platformInfo.pc.performanceRating }}
span.x-grey(
v-if='avatarDialog.bundleSizes["standalonewindows"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ avatarDialog.bundleSizes['standalonewindows'].fileSize }}
el-tag.x-tag-platform-quest(
v-if='avatarDialog.isQuest'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') Android
span.x-grey(
v-if='avatarDialog.platformInfo.android'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ avatarDialog.platformInfo.android.performanceRating }}
span.x-grey(
v-if='avatarDialog.bundleSizes["android"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ avatarDialog.bundleSizes['android'].fileSize }}
el-tag.x-tag-platform-ios(
v-if='avatarDialog.isIos'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') iOS
span.x-grey(
v-if='avatarDialog.platformInfo.ios'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ avatarDialog.platformInfo.ios.performanceRating }}
span.x-grey(
v-if='avatarDialog.bundleSizes["ios"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ avatarDialog.bundleSizes['ios'].fileSize }}
el-tag.x-link(
v-if='avatarDialog.inCache'
type='info'
effect='plain'
size='mini'
@click='openFolderGeneric(avatarDialog.cachePath)'
style='margin-right: 5px; margin-top: 5px')
span(v-text='avatarDialog.cacheSize')
|
| {{ $t('dialog.avatar.tags.cache') }}
el-tag(
v-if='avatarDialog.isQuestFallback'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.avatar.tags.fallback') }}
el-tag(
v-if='avatarDialog.hasImposter'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.avatar.tags.impostor') }}
span.x-grey(
v-if='avatarDialog.imposterVersion'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') v{{ avatarDialog.imposterVersion }}
el-tag(
v-if='avatarDialog.ref.unityPackageUrl'
type='success'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.avatar.tags.future_proofing') }}
div div
template(v-for="tag in avatarDialog.ref.tags") template(v-for='tag in avatarDialog.ref.tags')
el-tag(v-if="tag.startsWith('content_')" :key="tag" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") el-tag(
template(v-if="tag === 'content_horror'") {{ $t('dialog.avatar.tags.content_horror') }} v-if='tag.startsWith("content_")'
template(v-else-if="tag === 'content_gore'") {{ $t('dialog.avatar.tags.content_gore') }} :key='tag'
template(v-else-if="tag === 'content_violence'") {{ $t('dialog.avatar.tags.content_violence') }} effect='plain'
template(v-else-if="tag === 'content_adult'") {{ $t('dialog.avatar.tags.content_adult') }} size='mini'
template(v-else-if="tag === 'content_sex'") {{ $t('dialog.avatar.tags.content_sex') }} style='margin-right: 5px; margin-top: 5px')
template(v-if='tag === "content_horror"') {{ $t('dialog.avatar.tags.content_horror') }}
template(v-else-if='tag === "content_gore"') {{ $t('dialog.avatar.tags.content_gore') }}
template(v-else-if='tag === "content_violence"') {{ $t('dialog.avatar.tags.content_violence') }}
template(v-else-if='tag === "content_adult"') {{ $t('dialog.avatar.tags.content_adult') }}
template(v-else-if='tag === "content_sex"') {{ $t('dialog.avatar.tags.content_sex') }}
template(v-else) {{ tag.replace('content_', '') }} template(v-else) {{ tag.replace('content_', '') }}
div(style="margin-top:5px") div(style='margin-top: 5px')
span(v-show="avatarDialog.ref.name !== avatarDialog.ref.description" v-text="avatarDialog.ref.description" style="font-size:12px") span(
div(style="flex:none;margin-left:10px") v-show='avatarDialog.ref.name !== avatarDialog.ref.description'
el-tooltip(v-if="avatarDialog.inCache" placement="top" :content="$t('dialog.avatar.actions.delete_cache_tooltip')" :disabled="hideTooltips") v-text='avatarDialog.ref.description'
el-button(icon="el-icon-delete" circle @click="deleteVRChatCache(avatarDialog.ref)" :disabled="isGameRunning && avatarDialog.cacheLocked") style='font-size: 12px')
el-tooltip(v-if="avatarDialog.isFavorite" placement="top" :content="$t('dialog.avatar.actions.favorite_tooltip')" :disabled="hideTooltips") div(style='flex: none; margin-left: 10px')
el-button(type="warning" icon="el-icon-star-on" circle @click="avatarDialogCommand('Add Favorite')" style="margin-left:5px") el-tooltip(
el-tooltip(v-else placement="top" :content="$t('dialog.avatar.actions.favorite_tooltip')" :disabled="hideTooltips") v-if='avatarDialog.inCache'
el-button(type="default" icon="el-icon-star-off" circle @click="avatarDialogCommand('Add Favorite')" style="margin-left:5px") placement='top'
el-dropdown(trigger="click" @command="avatarDialogCommand" size="small" style="margin-left:5px") :content='$t("dialog.avatar.actions.delete_cache_tooltip")'
el-button(:type="avatarDialog.isBlocked ? 'danger' : 'default'" icon="el-icon-more" circle) :disabled='hideTooltips')
el-dropdown-menu(#default="dropdown") el-button(
el-dropdown-item(icon="el-icon-refresh" command="Refresh") {{ $t('dialog.avatar.actions.refresh') }} icon='el-icon-delete'
el-dropdown-item(icon="el-icon-check" :disabled="API.currentUser.currentAvatar === avatarDialog.id" command="Select Avatar") {{ $t('dialog.avatar.actions.select') }} circle
el-dropdown-item(v-if="/quest/.test(avatarDialog.ref.tags)" icon="el-icon-check" command="Select Fallback Avatar") {{ $t('dialog.avatar.actions.select_fallback') }} @click='deleteVRChatCache(avatarDialog.ref)'
el-dropdown-item(v-if="avatarDialog.isBlocked" icon="el-icon-circle-check" command="Unblock Avatar" style="color:#F56C6C") {{ $t('dialog.avatar.actions.unblock') }} :disabled='isGameRunning && avatarDialog.cacheLocked')
el-dropdown-item(v-else icon="el-icon-circle-close" command="Block Avatar") {{ $t('dialog.avatar.actions.block') }} el-tooltip(
el-dropdown-item(v-if="avatarDialog.ref.authorId !== API.currentUser.id" icon="el-icon-picture-outline" command="Previous Images") {{ $t('dialog.avatar.actions.show_previous_images') }} v-if='avatarDialog.isFavorite'
template(v-if="avatarDialog.ref.authorId === API.currentUser.id") placement='top'
el-dropdown-item(v-if="avatarDialog.ref.releaseStatus === 'public'" icon="el-icon-user-solid" command="Make Private" divided) {{ $t('dialog.avatar.actions.make_private') }} :content='$t("dialog.avatar.actions.favorite_tooltip")'
el-dropdown-item(v-else icon="el-icon-user" command="Make Public" divided) {{ $t('dialog.avatar.actions.make_public') }} :disabled='hideTooltips')
el-dropdown-item(icon="el-icon-edit" command="Rename") {{ $t('dialog.avatar.actions.rename') }} el-button(
el-dropdown-item(icon="el-icon-edit" command="Change Description") {{ $t('dialog.avatar.actions.change_description') }} type='warning'
el-dropdown-item(icon="el-icon-edit" command="Change Content Tags") {{ $t('dialog.avatar.actions.change_content_tags') }} icon='el-icon-star-on'
el-dropdown-item(icon="el-icon-picture-outline" command="Change Image") {{ $t('dialog.avatar.actions.change_image') }} circle
el-dropdown-item(v-if="avatarDialog.ref.unityPackageUrl" icon="el-icon-download" command="Download Unity Package") {{ $t('dialog.avatar.actions.download_package') }} @click='avatarDialogCommand("Add Favorite")'
el-dropdown-item(v-if="avatarDialog.hasImposter" icon="el-icon-refresh" command="Regenerate Imposter" style="color:#F56C6C") {{ $t('dialog.avatar.actions.regenerate_impostor') }} style='margin-left: 5px')
el-dropdown-item(v-if="avatarDialog.hasImposter" icon="el-icon-delete" command="Delete Imposter" style="color:#F56C6C") {{ $t('dialog.avatar.actions.delete_impostor') }} el-tooltip(
el-dropdown-item(v-else icon="el-icon-user" command="Create Imposter") {{ $t('dialog.avatar.actions.create_impostor') }} v-else
el-dropdown-item(icon="el-icon-delete" command="Delete" style="color:#F56C6C" divided) {{ $t('dialog.avatar.actions.delete') }} placement='top'
:content='$t("dialog.avatar.actions.favorite_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
icon='el-icon-star-off'
circle
@click='avatarDialogCommand("Add Favorite")'
style='margin-left: 5px')
el-dropdown(
trigger='click'
@command='avatarDialogCommand'
size='small'
style='margin-left: 5px')
el-button(:type='avatarDialog.isBlocked ? "danger" : "default"' icon='el-icon-more' circle)
el-dropdown-menu(#default='dropdown')
el-dropdown-item(icon='el-icon-refresh' command='Refresh') {{ $t('dialog.avatar.actions.refresh') }}
el-dropdown-item(
icon='el-icon-check'
:disabled='API.currentUser.currentAvatar === avatarDialog.id'
command='Select Avatar') {{ $t('dialog.avatar.actions.select') }}
el-dropdown-item(
v-if='/quest/.test(avatarDialog.ref.tags)'
icon='el-icon-check'
command='Select Fallback Avatar') {{ $t('dialog.avatar.actions.select_fallback') }}
el-dropdown-item(
v-if='avatarDialog.isBlocked'
icon='el-icon-circle-check'
command='Unblock Avatar'
style='color: #f56c6c') {{ $t('dialog.avatar.actions.unblock') }}
el-dropdown-item(v-else icon='el-icon-circle-close' command='Block Avatar') {{ $t('dialog.avatar.actions.block') }}
el-dropdown-item(
v-if='avatarDialog.ref.authorId !== API.currentUser.id'
icon='el-icon-picture-outline'
command='Previous Images') {{ $t('dialog.avatar.actions.show_previous_images') }}
template(v-if='avatarDialog.ref.authorId === API.currentUser.id')
el-dropdown-item(
v-if='avatarDialog.ref.releaseStatus === "public"'
icon='el-icon-user-solid'
command='Make Private'
divided) {{ $t('dialog.avatar.actions.make_private') }}
el-dropdown-item(v-else icon='el-icon-user' command='Make Public' divided) {{ $t('dialog.avatar.actions.make_public') }}
el-dropdown-item(icon='el-icon-edit' command='Rename') {{ $t('dialog.avatar.actions.rename') }}
el-dropdown-item(icon='el-icon-edit' command='Change Description') {{ $t('dialog.avatar.actions.change_description') }}
el-dropdown-item(icon='el-icon-edit' command='Change Content Tags') {{ $t('dialog.avatar.actions.change_content_tags') }}
el-dropdown-item(icon='el-icon-picture-outline' command='Change Image') {{ $t('dialog.avatar.actions.change_image') }}
el-dropdown-item(
v-if='avatarDialog.ref.unityPackageUrl'
icon='el-icon-download'
command='Download Unity Package') {{ $t('dialog.avatar.actions.download_package') }}
el-dropdown-item(
v-if='avatarDialog.hasImposter'
icon='el-icon-refresh'
command='Regenerate Imposter'
style='color: #f56c6c') {{ $t('dialog.avatar.actions.regenerate_impostor') }}
el-dropdown-item(
v-if='avatarDialog.hasImposter'
icon='el-icon-delete'
command='Delete Imposter'
style='color: #f56c6c') {{ $t('dialog.avatar.actions.delete_impostor') }}
el-dropdown-item(v-else icon='el-icon-user' command='Create Imposter') {{ $t('dialog.avatar.actions.create_impostor') }}
el-dropdown-item(
icon='el-icon-delete'
command='Delete'
style='color: #f56c6c'
divided) {{ $t('dialog.avatar.actions.delete') }}
el-tabs el-tabs
el-tab-pane(:label="$t('dialog.avatar.info.header')") el-tab-pane(:label='$t("dialog.avatar.info.header")')
.x-friend-list .x-friend-list
.x-friend-item(style="width:100%;cursor:default") .x-friend-item(style='width: 100%; cursor: default')
.detail .detail
span.name(style="margin-bottom:5px") {{ $t('dialog.avatar.info.memo') }} span.name(style='margin-bottom: 5px') {{ $t('dialog.avatar.info.memo') }}
el-input.extra(v-model="avatarDialog.memo" @change="onAvatarMemoChange" size="mini" type="textarea" :rows="2" :autosize="{minRows: 1, maxRows: 20}" :placeholder="$t('dialog.avatar.info.memo_placeholder')" resize="none") el-input.extra(
.x-friend-item(style="width:100%;cursor:default") v-model='avatarDialog.memo'
@change='onAvatarMemoChange'
size='mini'
type='textarea'
:rows='2'
:autosize='{ minRows: 1, maxRows: 20 }'
:placeholder='$t("dialog.avatar.info.memo_placeholder")'
resize='none')
.x-friend-item(style='width: 100%; cursor: default')
.detail .detail
span.name {{ $t('dialog.avatar.info.id') }} span.name {{ $t('dialog.avatar.info.id') }}
span.extra {{ avatarDialog.id }} span.extra {{ avatarDialog.id }}
el-tooltip(placement="top" :content="$t('dialog.avatar.info.id_tooltip')" :disabled="hideTooltips") el-tooltip(
el-dropdown(trigger="click" @click.native.stop size="mini" style="margin-left:5px") placement='top'
el-button(type="default" icon="el-icon-s-order" size="mini" circle) :content='$t("dialog.avatar.info.id_tooltip")'
el-dropdown-menu(#default="dropdown") :disabled='hideTooltips')
el-dropdown-item(@click.native="copyAvatarId(avatarDialog.id)") {{ $t('dialog.avatar.info.copy_id') }} el-dropdown(
el-dropdown-item(@click.native="copyAvatarUrl(avatarDialog.id)") {{ $t('dialog.avatar.info.copy_url') }} trigger='click'
.x-friend-item(style="cursor:default") @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='copyAvatarId(avatarDialog.id)') {{ $t('dialog.avatar.info.copy_id') }}
el-dropdown-item(@click.native='copyAvatarUrl(avatarDialog.id)') {{ $t('dialog.avatar.info.copy_url') }}
.x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.avatar.info.created_at') }} span.name {{ $t('dialog.avatar.info.created_at') }}
span.extra {{ avatarDialog.ref.created_at | formatDate('long') }} span.extra {{ avatarDialog.ref.created_at | formatDate('long') }}
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.avatar.info.last_updated') }} span.name {{ $t('dialog.avatar.info.last_updated') }}
span.extra(v-if="avatarDialog.lastUpdated") {{ avatarDialog.lastUpdated | formatDate('long') }} span.extra(v-if='avatarDialog.lastUpdated') {{ avatarDialog.lastUpdated | formatDate('long') }}
span.extra(v-else) {{ avatarDialog.ref.updated_at | formatDate('long') }} span.extra(v-else) {{ avatarDialog.ref.updated_at | formatDate('long') }}
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.avatar.info.version') }} span.name {{ $t('dialog.avatar.info.version') }}
span.extra(v-if="avatarDialog.ref.version !== 0" v-text="avatarDialog.ref.version") span.extra(v-if='avatarDialog.ref.version !== 0' v-text='avatarDialog.ref.version')
span.extra(v-else) - span.extra(v-else) -
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.avatar.info.time_spent') }} span.name {{ $t('dialog.avatar.info.time_spent') }}
el-tooltip(v-if="!hideTooltips" placement="top" style="margin-left:5px" :content="$t('dialog.world.info.accuracy_notice')") el-tooltip(
v-if='!hideTooltips'
placement='top'
style='margin-left: 5px'
:content='$t("dialog.world.info.accuracy_notice")')
i.el-icon-warning i.el-icon-warning
span.extra(v-if="avatarDialog.timeSpent === 0") - span.extra(v-if='avatarDialog.timeSpent === 0') -
span.extra(v-else) {{ timeToText(avatarDialog.timeSpent) }} span.extra(v-else) {{ timeToText(avatarDialog.timeSpent) }}
.x-friend-item(style="width:100%;cursor:default") .x-friend-item(style='width: 100%; cursor: default')
.detail .detail
span.name {{ $t('dialog.avatar.info.platform') }} span.name {{ $t('dialog.avatar.info.platform') }}
span.extra(v-if="avatarDialogPlatform" v-text="avatarDialogPlatform") span.extra(v-if='avatarDialogPlatform' v-text='avatarDialogPlatform')
span.extra(v-else) - span.extra(v-else) -
el-tab-pane(:label="$t('dialog.avatar.json.header')") el-tab-pane(:label='$t("dialog.avatar.json.header")')
el-button(type="default" @click="refreshAvatarDialogTreeData()" size="mini" icon="el-icon-refresh" circle) el-button(
el-tooltip(placement="top" :content="$t('dialog.avatar.json.file_analysis')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="getAvatarFileAnalysis" size="mini" icon="el-icon-s-data" circle style="margin-left:5px") @click='refreshAvatarDialogTreeData()'
el-button(type="default" @click="downloadAndSaveJson(avatarDialog.id, avatarDialog.ref)" size="mini" icon="el-icon-download" circle style="margin-left:5px") size='mini'
el-tree(v-if="Object.keys(avatarDialog.fileAnalysis).length > 0" :data="avatarDialog.fileAnalysis" style="margin-top:5px;font-size:12px") icon='el-icon-refresh'
template(#default="scope") circle)
el-tooltip(
placement='top'
:content='$t("dialog.avatar.json.file_analysis")'
:disabled='hideTooltips')
el-button(
type='default'
@click='getAvatarFileAnalysis'
size='mini'
icon='el-icon-s-data'
circle
style='margin-left: 5px')
el-button(
type='default'
@click='downloadAndSaveJson(avatarDialog.id, avatarDialog.ref)'
size='mini'
icon='el-icon-download'
circle
style='margin-left: 5px')
el-tree(
v-if='Object.keys(avatarDialog.fileAnalysis).length > 0'
:data='avatarDialog.fileAnalysis'
style='margin-top: 5px; font-size: 12px')
template(#default='scope')
span span
span(v-text="scope.data.key" style="font-weight:bold;margin-right:5px") span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if="!scope.data.children" v-text="scope.data.value") span(v-if='!scope.data.children' v-text='scope.data.value')
el-tree(:data="avatarDialog.treeData" style="margin-top:5px;font-size:12px") el-tree(:data='avatarDialog.treeData' style='margin-top: 5px; font-size: 12px')
template(#default="scope") template(#default='scope')
span span
span(v-text="scope.data.key" style="font-weight:bold;margin-right:5px") span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if="!scope.data.children" v-text="scope.data.value") span(v-if='!scope.data.children' v-text='scope.data.value')
+94 -43
View File
@@ -1,53 +1,104 @@
mixin boops() mixin boops
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendBoopDialog" :visible.sync="sendBoopDialog.visible" :title="$t('dialog.boop_dialog.header')" width="450px") el-dialog.x-dialog(
div(v-if="sendBoopDialog.visible") :before-close='beforeDialogClose'
el-select(v-model="sendBoopDialog.userId" :placeholder="$t('dialog.new_instance.instance_creator_placeholder')" filterable style="width:100%") @mousedown.native='dialogMouseDown'
el-option-group(v-if="vipFriends.length" :label="$t('side_panel.favorite')") @mouseup.native='dialogMouseUp'
el-option.x-friend-item(v-for="friend in vipFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") ref='sendBoopDialog'
template(v-if="friend.ref") :visible.sync='sendBoopDialog.visible'
.avatar(:class="userStatusClass(friend.ref)") :title='$t("dialog.boop_dialog.header")'
img(v-lazy="userImage(friend.ref)") width='450px')
div(v-if='sendBoopDialog.visible')
el-select(
v-model='sendBoopDialog.userId'
:placeholder='$t("dialog.new_instance.instance_creator_placeholder")'
filterable
style='width: 100%')
el-option-group(v-if='vipFriends.length' :label='$t("side_panel.favorite")')
el-option.x-friend-item(
v-for='friend in vipFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
el-option-group(v-if="onlineFriends.length" :label="$t('side_panel.online')") el-option-group(v-if='onlineFriends.length' :label='$t("side_panel.online")')
el-option.x-friend-item(v-for="friend in onlineFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in onlineFriends'
.avatar(:class="userStatusClass(friend.ref)") :key='friend.id'
img(v-lazy="userImage(friend.ref)") :label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
el-option-group(v-if="activeFriends.length" :label="$t('side_panel.active')") el-option-group(v-if='activeFriends.length' :label='$t("side_panel.active")')
el-option.x-friend-item(v-for="friend in activeFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in activeFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar .avatar
img(v-lazy="userImage(friend.ref)") img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
el-option-group(v-if="offlineFriends.length" :label="$t('side_panel.offline')") el-option-group(v-if='offlineFriends.length' :label='$t("side_panel.offline")')
el-option.x-friend-item(v-for="friend in offlineFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in offlineFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar .avatar
img(v-lazy="userImage(friend.ref)") img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
br br
br br
el-select(v-model="sendBoopDialog.fileId" clearable :placeholder="$t('dialog.boop_dialog.select_emoji')" size="small" style="width:100%" popper-class="max-height-el-select") el-select(
el-option-group(:label="$t('dialog.boop_dialog.my_emojis')") v-model='sendBoopDialog.fileId'
el-option(v-if="image.versions && image.versions.length > 0" v-for="image in emojiTable" :key="image.id" :value="image.id" style="width:100%;height:100%") clearable
.vrcplus-icon(v-if="image.versions[image.versions.length - 1].file.url" style="overflow:hidden;width:200px;height:200px;padding:10px") :placeholder='$t("dialog.boop_dialog.select_emoji")'
template(v-if="image.frames") size='small'
.avatar(:style="generateEmojiStyle(image.versions[image.versions.length - 1].file.url, image.framesOverTime, image.frames, image.loopStyle)") style='width: 100%'
popper-class='max-height-el-select')
el-option-group(:label='$t("dialog.boop_dialog.my_emojis")')
el-option(
v-if='image.versions && image.versions.length > 0'
v-for='image in emojiTable'
:key='image.id'
:value='image.id'
style='width: 100%; height: 100%')
.vrcplus-icon(
v-if='image.versions[image.versions.length - 1].file.url'
style='overflow: hidden; width: 200px; height: 200px; padding: 10px')
template(v-if='image.frames')
.avatar(
:style='generateEmojiStyle(image.versions[image.versions.length - 1].file.url, image.framesOverTime, image.frames, image.loopStyle)')
template(v-else) template(v-else)
img.avatar(v-lazy="image.versions[image.versions.length - 1].file.url" style="width:200px;height:200px") img.avatar(
el-option-group(:label="$t('dialog.boop_dialog.default_emojis')") v-lazy='image.versions[image.versions.length - 1].file.url'
el-option(v-for="emojiName in photonEmojis" :key="emojiName" :value="getEmojiValue(emojiName)" style="width:100%;height:100%") style='width: 200px; height: 200px')
span(v-text="emojiName") el-option-group(:label='$t("dialog.boop_dialog.default_emojis")')
el-option(
v-for='emojiName in photonEmojis'
:key='emojiName'
:value='getEmojiValue(emojiName)'
style='width: 100%; height: 100%')
span(v-text='emojiName')
template(#footer) template(#footer)
el-button(size="small" @click="showGalleryDialog(2)") {{ $t('dialog.boop_dialog.emoji_manager') }} el-button(size='small' @click='showGalleryDialog(2)') {{ $t('dialog.boop_dialog.emoji_manager') }}
el-button(size="small" @click="sendBoopDialog.visible = false") {{ $t('dialog.boop_dialog.cancel') }} el-button(size='small' @click='sendBoopDialog.visible = false') {{ $t('dialog.boop_dialog.cancel') }}
el-button(size="small" @click="sendBoop" :disabled="!sendBoopDialog.userId") {{ $t('dialog.boop_dialog.send') }} el-button(size='small' @click='sendBoop' :disabled='!sendBoopDialog.userId') {{ $t('dialog.boop_dialog.send') }}
+391 -135
View File
@@ -1,189 +1,445 @@
mixin currentUser() mixin currentUser
//- dialog: social status //- dialog: social status
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="socialStatusDialog" :visible.sync="socialStatusDialog.visible" :title="$t('dialog.social_status.header')" width="400px") el-dialog.x-dialog(
div(v-loading="socialStatusDialog.loading") :before-close='beforeDialogClose'
el-collapse(style="border:0") @mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='socialStatusDialog'
:visible.sync='socialStatusDialog.visible'
:title='$t("dialog.social_status.header")'
width='400px')
div(v-loading='socialStatusDialog.loading')
el-collapse(style='border: 0')
el-collapse-item el-collapse-item
template(slot="title") template(slot='title')
span(style="font-size:16px") {{ $t('dialog.social_status.history') }} span(style='font-size: 16px') {{ $t('dialog.social_status.history') }}
data-tables(v-bind="socialStatusHistoryTable" @row-click="setSocialStatusFromHistory" style="cursor:pointer") data-tables(
el-table-column(:label="$t('table.social_status.no')" prop="no" width="50") v-bind='socialStatusHistoryTable'
el-table-column(:label="$t('table.social_status.status')" prop="status") @row-click='setSocialStatusFromHistory'
el-select(v-model="socialStatusDialog.status" style="display:block;margin-top:10px") style='cursor: pointer')
el-option(:label="$t('dialog.user.status.join_me')" value="join me"). el-table-column(:label='$t("table.social_status.no")' prop='no' width='50')
el-table-column(:label='$t("table.social_status.status")' prop='status')
el-select(v-model='socialStatusDialog.status' style='display: block; margin-top: 10px')
el-option(:label='$t("dialog.user.status.join_me")' value='join me').
#[i.x-user-status.joinme] {{ $t('dialog.user.status.join_me') }} #[i.x-user-status.joinme] {{ $t('dialog.user.status.join_me') }}
el-option(:label="$t('dialog.user.status.online')" value="active"). el-option(:label='$t("dialog.user.status.online")' value='active').
#[i.x-user-status.online] {{ $t('dialog.user.status.online') }} #[i.x-user-status.online] {{ $t('dialog.user.status.online') }}
el-option(:label="$t('dialog.user.status.ask_me')" value="ask me"). el-option(:label='$t("dialog.user.status.ask_me")' value='ask me').
#[i.x-user-status.askme] {{ $t('dialog.user.status.ask_me') }} #[i.x-user-status.askme] {{ $t('dialog.user.status.ask_me') }}
el-option(:label="$t('dialog.user.status.busy')" value="busy"). el-option(:label='$t("dialog.user.status.busy")' value='busy').
#[i.x-user-status.busy] {{ $t('dialog.user.status.busy') }} #[i.x-user-status.busy] {{ $t('dialog.user.status.busy') }}
el-option(v-if="API.currentUser.$isModerator" :label="$t('dialog.user.status.offline')" value="offline"). el-option(
v-if='API.currentUser.$isModerator'
:label='$t("dialog.user.status.offline")'
value='offline').
#[i.x-user-status.offline] {{ $t('dialog.user.status.offline') }} #[i.x-user-status.offline] {{ $t('dialog.user.status.offline') }}
el-input(v-model="socialStatusDialog.statusDescription" :placeholder="$t('dialog.social_status.status_placeholder')" maxlength="32" show-word-limit style="display:block;margin-top:10px") el-input(
v-model='socialStatusDialog.statusDescription'
:placeholder='$t("dialog.social_status.status_placeholder")'
maxlength='32'
show-word-limit
style='display: block; margin-top: 10px')
template(#footer) template(#footer)
el-button(type="primary" size="small" :disabled="socialStatusDialog.loading" @click="saveSocialStatus") {{ $t('dialog.social_status.update') }} el-button(type='primary' size='small' :disabled='socialStatusDialog.loading' @click='saveSocialStatus') {{ $t('dialog.social_status.update') }}
//- dialog: language //- dialog: language
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="languageDialog" :visible.sync="languageDialog.visible" :title="$t('dialog.language.header')" width="400px") el-dialog.x-dialog(
div(v-loading="languageDialog.loading") :before-close='beforeDialogClose'
div(style="margin:5px 0") @mousedown.native='dialogMouseDown'
el-tag(v-for="item in API.currentUser.$languages" :key="item.key" size="small" type="info" effect="plain" closable @close="removeUserLanguage(item.key)" style="margin-right:5px") @mouseup.native='dialogMouseUp'
span.flags(:class="languageClass(item.key)" style="display:inline-block;margin-right:5px") ref='languageDialog'
:visible.sync='languageDialog.visible'
:title='$t("dialog.language.header")'
width='400px')
div(v-loading='languageDialog.loading')
div(style='margin: 5px 0')
el-tag(
v-for='item in API.currentUser.$languages'
:key='item.key'
size='small'
type='info'
effect='plain'
closable
@close='removeUserLanguage(item.key)'
style='margin-right: 5px')
span.flags(:class='languageClass(item.key)' style='display: inline-block; margin-right: 5px')
| {{ item.value }} ({{ item.key }}) | {{ item.value }} ({{ item.key }})
div(v-if="languageDialog.languageChoice === true") div(v-if='languageDialog.languageChoice === true')
el-select(v-model="languageDialog.languageValue" :placeholder="$t('dialog.language.select_language')" size="mini") el-select(
el-option(v-for="item in languageDialog.languages" :key="item.key" :value="item.key" :label="item.value") v-model='languageDialog.languageValue'
span.flags(:class="languageClass(item.key)" style="display:inline-block;margin-right:5px") :placeholder='$t("dialog.language.select_language")'
size='mini')
el-option(
v-for='item in languageDialog.languages'
:key='item.key'
:value='item.key'
:label='item.value')
span.flags(:class='languageClass(item.key)' style='display: inline-block; margin-right: 5px')
| {{ item.value }} ({{ item.key }}) | {{ item.value }} ({{ item.key }})
el-button(@click="languageDialog.languageChoice=false; addUserLanguage(languageDialog.languageValue)" size="mini") {{ $t('dialog.language.ok') }} el-button(
el-button(@click="languageDialog.languageChoice=false" size="mini" style="margin-left:0") {{ $t('dialog.language.cancel') }} @click='languageDialog.languageChoice = false; addUserLanguage(languageDialog.languageValue)'
size='mini') {{ $t('dialog.language.ok') }}
el-button(@click='languageDialog.languageChoice = false' size='mini' style='margin-left: 0') {{ $t('dialog.language.cancel') }}
div(v-else) div(v-else)
el-button(@click="languageDialog.languageValue='';languageDialog.languageChoice=true" size="mini") {{ $t('dialog.language.add_language') }} el-button(@click='languageDialog.languageValue = ""; languageDialog.languageChoice = true' size='mini') {{ $t('dialog.language.add_language') }}
//- dialog: bio //- dialog: bio
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="bioDialog" :visible.sync="bioDialog.visible" :title="$t('dialog.bio.header')" width="600px") el-dialog.x-dialog(
div(v-loading="bioDialog.loading") :before-close='beforeDialogClose'
el-input(type="textarea" v-model="bioDialog.bio" size="mini" maxlength="512" show-word-limit :autosize="{ minRows:2, maxRows:5 }" :placeholder="$t('dialog.bio.bio_placeholder')") @mousedown.native='dialogMouseDown'
el-input(v-for="(link, index) in bioDialog.bioLinks" :key="index" :value="link" v-model="bioDialog.bioLinks[index]" size="small" style="margin-top:5px") @mouseup.native='dialogMouseUp'
img(slot="prepend" :src="getFaviconUrl(link)" style="width:16px;height:16px") ref='bioDialog'
el-button(slot="append" icon="el-icon-delete" @click="bioDialog.bioLinks.splice(index, 1)") :visible.sync='bioDialog.visible'
el-button(@click="bioDialog.bioLinks.push('')" :disabled="bioDialog.bioLinks.length >= 3" size="mini" style="margin-top:5px") {{ $t('dialog.bio.add_link') }} :title='$t("dialog.bio.header")'
width='600px')
div(v-loading='bioDialog.loading')
el-input(
type='textarea'
v-model='bioDialog.bio'
size='mini'
maxlength='512'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
:placeholder='$t("dialog.bio.bio_placeholder")')
el-input(
v-for='(link, index) in bioDialog.bioLinks'
:key='index'
:value='link'
v-model='bioDialog.bioLinks[index]'
size='small'
style='margin-top: 5px')
img(slot='prepend' :src='getFaviconUrl(link)' style='width: 16px; height: 16px')
el-button(slot='append' icon='el-icon-delete' @click='bioDialog.bioLinks.splice(index, 1)')
el-button(
@click='bioDialog.bioLinks.push("")'
:disabled='bioDialog.bioLinks.length >= 3'
size='mini'
style='margin-top: 5px') {{ $t('dialog.bio.add_link') }}
template(#footer) template(#footer)
el-button(type="primary" size="small" :disabled="bioDialog.loading" @click="saveBio") {{ $t('dialog.bio.update') }} el-button(type='primary' size='small' :disabled='bioDialog.loading' @click='saveBio') {{ $t('dialog.bio.update') }}
//- dialog: pronouns //- dialog: pronouns
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="pronounsDialog" :visible.sync="pronounsDialog.visible" :title="$t('dialog.pronouns.header')" width="600px") el-dialog.x-dialog(
div(v-loading="pronounsDialog.loading") :before-close='beforeDialogClose'
el-input(type="textarea" v-model="pronounsDialog.pronouns" size="mini" maxlength="32" show-word-limit :autosize="{ minRows:2, maxRows:5 }" :placeholder="$t('dialog.pronouns.pronouns_placeholder')") @mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='pronounsDialog'
:visible.sync='pronounsDialog.visible'
:title='$t("dialog.pronouns.header")'
width='600px')
div(v-loading='pronounsDialog.loading')
el-input(
type='textarea'
v-model='pronounsDialog.pronouns'
size='mini'
maxlength='32'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
:placeholder='$t("dialog.pronouns.pronouns_placeholder")')
template(#footer) template(#footer)
el-button(type="primary" size="small" :disabled="pronounsDialog.loading" @click="savePronouns") {{ $t('dialog.pronouns.update') }} el-button(type='primary' size='small' :disabled='pronounsDialog.loading' @click='savePronouns') {{ $t('dialog.pronouns.update') }}
//- dialog: Gallery/VRCPlusIcons //- dialog: Gallery/VRCPlusIcons
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="galleryDialog" :visible.sync="galleryDialogVisible" :title="$t('dialog.gallery_icons.header')" width="100%") el-dialog.x-dialog(
el-tabs(type="card" ref="galleryTabs") :before-close='beforeDialogClose'
el-tab-pane(v-if="galleryDialogVisible" v-loading="galleryDialogGalleryLoading") @mousedown.native='dialogMouseDown'
span(slot="label") {{ $t('dialog.gallery_icons.gallery') }} @mouseup.native='dialogMouseUp'
span(style="color:#909399;font-size:12px;margin-left:5px") {{ galleryTable.length }}/64 ref='galleryDialog'
input(type="file" accept="image/*" @change="onFileChangeGallery" id="GalleryUploadButton" style="display:none") :visible.sync='galleryDialogVisible'
:title='$t("dialog.gallery_icons.header")'
width='100%')
el-tabs(type='card' ref='galleryTabs')
el-tab-pane(v-if='galleryDialogVisible' v-loading='galleryDialogGalleryLoading')
span(slot='label') {{ $t('dialog.gallery_icons.gallery') }}
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ galleryTable.length }}/64
input#GalleryUploadButton(
type='file'
accept='image/*'
@change='onFileChangeGallery'
style='display: none')
span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1200x900px (4:3) span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1200x900px (4:3)
br br
br br
el-button-group el-button-group
el-button(type="default" size="small" @click="refreshGalleryTable" icon="el-icon-refresh") {{ $t('dialog.gallery_icons.refresh') }} el-button(type='default' size='small' @click='refreshGalleryTable' icon='el-icon-refresh') {{ $t('dialog.gallery_icons.refresh') }}
el-button(type="default" size="small" @click="displayGalleryUpload" icon="el-icon-upload2" :disabled="!API.currentUser.$isVRCPlus") {{ $t('dialog.gallery_icons.upload') }} el-button(
el-button(type="default" size="small" @click="setProfilePicOverride('')" icon="el-icon-close" :disabled="!API.currentUser.profilePicOverride") {{ $t('dialog.gallery_icons.clear') }} type='default'
size='small'
@click='displayGalleryUpload'
icon='el-icon-upload2'
:disabled='!API.currentUser.$isVRCPlus') {{ $t('dialog.gallery_icons.upload') }}
el-button(
type='default'
size='small'
@click='setProfilePicOverride("")'
icon='el-icon-close'
:disabled='!API.currentUser.profilePicOverride') {{ $t('dialog.gallery_icons.clear') }}
br br
.x-friend-item(v-if="image.versions && image.versions.length > 0" v-for="image in galleryTable" :key="image.id" style="display:inline-block;margin-top:10px;width:unset;cursor:default") .x-friend-item(
.vrcplus-icon(v-if="image.versions[image.versions.length - 1].file.url" @click="setProfilePicOverride(image.id)" :class="{ 'current-vrcplus-icon': compareCurrentProfilePic(image.id) }") v-if='image.versions && image.versions.length > 0'
img.avatar(v-lazy="image.versions[image.versions.length - 1].file.url") v-for='image in galleryTable'
div(style="float:right;margin-top:5px") :key='image.id'
el-button(type="default" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)" size="mini" icon="el-icon-picture-outline" circle) style='display: inline-block; margin-top: 10px; width: unset; cursor: default')
el-button(type="default" @click="deleteGalleryImage(image.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") .vrcplus-icon(
el-tab-pane(v-if="galleryDialogVisible" v-loading="galleryDialogIconsLoading") v-if='image.versions[image.versions.length - 1].file.url'
span(slot="label") {{ $t('dialog.gallery_icons.icons') }} @click='setProfilePicOverride(image.id)'
span(style="color:#909399;font-size:12px;margin-left:5px") {{ VRCPlusIconsTable.length }}/64 :class='{ "current-vrcplus-icon": compareCurrentProfilePic(image.id) }')
input(type="file" accept="image/*" @change="onFileChangeVRCPlusIcon" id="VRCPlusIconUploadButton" style="display:none") img.avatar(v-lazy='image.versions[image.versions.length - 1].file.url')
div(style='float: right; margin-top: 5px')
el-button(
type='default'
@click='showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)'
size='mini'
icon='el-icon-picture-outline'
circle)
el-button(
type='default'
@click='deleteGalleryImage(image.id)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tab-pane(v-if='galleryDialogVisible' v-loading='galleryDialogIconsLoading')
span(slot='label') {{ $t('dialog.gallery_icons.icons') }}
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ VRCPlusIconsTable.length }}/64
input#VRCPlusIconUploadButton(
type='file'
accept='image/*'
@change='onFileChangeVRCPlusIcon'
style='display: none')
span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 2048x2048px (1:1) span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 2048x2048px (1:1)
br br
br br
el-button-group el-button-group
el-button(type="default" size="small" @click="refreshVRCPlusIconsTable" icon="el-icon-refresh") {{ $t('dialog.gallery_icons.refresh') }} el-button(type='default' size='small' @click='refreshVRCPlusIconsTable' icon='el-icon-refresh') {{ $t('dialog.gallery_icons.refresh') }}
el-button(type="default" size="small" @click="displayVRCPlusIconUpload" icon="el-icon-upload2" :disabled="!API.currentUser.$isVRCPlus") {{ $t('dialog.gallery_icons.upload') }} el-button(
el-button(type="default" size="small" @click="setVRCPlusIcon('')" icon="el-icon-close" :disabled="!API.currentUser.userIcon") {{ $t('dialog.gallery_icons.clear') }} type='default'
size='small'
@click='displayVRCPlusIconUpload'
icon='el-icon-upload2'
:disabled='!API.currentUser.$isVRCPlus') {{ $t('dialog.gallery_icons.upload') }}
el-button(
type='default'
size='small'
@click='setVRCPlusIcon("")'
icon='el-icon-close'
:disabled='!API.currentUser.userIcon') {{ $t('dialog.gallery_icons.clear') }}
br br
.x-friend-item(v-if="image.versions && image.versions.length > 0" v-for="image in VRCPlusIconsTable" :key="image.id" style="display:inline-block;margin-top:10px;width:unset;cursor:default") .x-friend-item(
.vrcplus-icon(v-if="image.versions[image.versions.length - 1].file.url" @click="setVRCPlusIcon(image.id)" :class="{ 'current-vrcplus-icon': compareCurrentVRCPlusIcon(image.id) }") v-if='image.versions && image.versions.length > 0'
img.avatar(v-lazy="image.versions[image.versions.length - 1].file.url") v-for='image in VRCPlusIconsTable'
div(style="float:right;margin-top:5px") :key='image.id'
el-button(type="default" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)" size="mini" icon="el-icon-picture-outline" circle) style='display: inline-block; margin-top: 10px; width: unset; cursor: default')
el-button(type="default" @click="deleteVRCPlusIcon(image.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") .vrcplus-icon(
el-tab-pane(v-if="galleryDialogVisible" v-loading="galleryDialogEmojisLoading") v-if='image.versions[image.versions.length - 1].file.url'
span(slot="label") {{ $t('dialog.gallery_icons.emojis') }} @click='setVRCPlusIcon(image.id)'
span(style="color:#909399;font-size:12px;margin-left:5px") {{ emojiTable.length }}/9 :class='{ "current-vrcplus-icon": compareCurrentVRCPlusIcon(image.id) }')
input(type="file" accept="image/*" @change="onFileChangeEmoji" id="EmojiUploadButton" style="display:none") img.avatar(v-lazy='image.versions[image.versions.length - 1].file.url')
div(style='float: right; margin-top: 5px')
el-button(
type='default'
@click='showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)'
size='mini'
icon='el-icon-picture-outline'
circle)
el-button(
type='default'
@click='deleteVRCPlusIcon(image.id)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tab-pane(v-if='galleryDialogVisible' v-loading='galleryDialogEmojisLoading')
span(slot='label') {{ $t('dialog.gallery_icons.emojis') }}
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ emojiTable.length }}/9
input#EmojiUploadButton(type='file' accept='image/*' @change='onFileChangeEmoji' style='display: none')
span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1024x1024px (1:1) span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1024x1024px (1:1)
br br
br br
el-button-group(style="margin-right:10px") el-button-group(style='margin-right: 10px')
el-button(type="default" size="small" @click="refreshEmojiTable" icon="el-icon-refresh") {{ $t('dialog.gallery_icons.refresh') }} el-button(type='default' size='small' @click='refreshEmojiTable' icon='el-icon-refresh') {{ $t('dialog.gallery_icons.refresh') }}
el-button(type="default" size="small" @click="displayEmojiUpload" icon="el-icon-upload2" :disabled="!API.currentUser.$isVRCPlus") {{ $t('dialog.gallery_icons.upload') }} el-button(
el-select(v-model="emojiAnimationStyle" popper-class="max-height-el-select") type='default'
size='small'
@click='displayEmojiUpload'
icon='el-icon-upload2'
:disabled='!API.currentUser.$isVRCPlus') {{ $t('dialog.gallery_icons.upload') }}
el-select(v-model='emojiAnimationStyle' popper-class='max-height-el-select')
el-option-group {{ $t('dialog.gallery_icons.emoji_animation_styles') }} el-option-group {{ $t('dialog.gallery_icons.emoji_animation_styles') }}
el-option.x-friend-item(v-for="(fileName, styleName) in emojiAnimationStyleList" :key="fileName" :label="styleName" :value="styleName" style="height:auto") el-option.x-friend-item(
.avatar(style="width:200px;height:200px") v-for='(fileName, styleName) in emojiAnimationStyleList'
img(v-lazy="`${emojiAnimationStyleUrl}${fileName}`") :key='fileName'
:label='styleName'
:value='styleName'
style='height: auto')
.avatar(style='width: 200px; height: 200px')
img(v-lazy='`${emojiAnimationStyleUrl}${fileName}`')
.detail .detail
span.name(v-text="styleName" style="margin-right:100px") span.name(v-text='styleName' style='margin-right: 100px')
el-checkbox(v-model="emojiAnimType" style="margin-left:10px;margin-right:10px") el-checkbox(v-model='emojiAnimType' style='margin-left: 10px; margin-right: 10px')
span {{ $t('dialog.gallery_icons.emoji_animation_type') }} span {{ $t('dialog.gallery_icons.emoji_animation_type') }}
template(v-if="emojiAnimType") template(v-if='emojiAnimType')
span(style="margin-right:10px") {{ $t('dialog.gallery_icons.emoji_animation_fps') }} span(style='margin-right: 10px') {{ $t('dialog.gallery_icons.emoji_animation_fps') }}
el-input-number(size="small" v-model="emojiAnimFps" :min="1" :max="64" style="margin-right:10px;width:112px") el-input-number(
span(style="margin-right:10px") {{ $t('dialog.gallery_icons.emoji_animation_frame_count') }} size='small'
el-input-number(size="small" v-model="emojiAnimFrameCount" :min="2" :max="64" style="margin-right:10px;width:112px") v-model='emojiAnimFps'
el-checkbox(v-model="emojiAnimLoopPingPong" style="margin-left:10px;margin-right:10px") :min='1'
:max='64'
style='margin-right: 10px; width: 112px')
span(style='margin-right: 10px') {{ $t('dialog.gallery_icons.emoji_animation_frame_count') }}
el-input-number(
size='small'
v-model='emojiAnimFrameCount'
:min='2'
:max='64'
style='margin-right: 10px; width: 112px')
el-checkbox(v-model='emojiAnimLoopPingPong' style='margin-left: 10px; margin-right: 10px')
span {{ $t('dialog.gallery_icons.emoji_loop_pingpong') }} span {{ $t('dialog.gallery_icons.emoji_loop_pingpong') }}
br br
br br
span {{ $t('dialog.gallery_icons.flipbook_info') }} span {{ $t('dialog.gallery_icons.flipbook_info') }}
br br
.x-friend-item(v-if="image.versions && image.versions.length > 0" v-for="image in emojiTable" :key="image.id" style="display:inline-block;margin-top:10px;width:unset;cursor:default") .x-friend-item(
.vrcplus-icon(v-if="image.versions[image.versions.length - 1].file.url" style="overflow:hidden" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url, getEmojiFileName(image))") v-if='image.versions && image.versions.length > 0'
template(v-if="image.frames") v-for='image in emojiTable'
.avatar(:style="generateEmojiStyle(image.versions[image.versions.length - 1].file.url, image.framesOverTime, image.frames, image.loopStyle)") :key='image.id'
style='display: inline-block; margin-top: 10px; width: unset; cursor: default')
.vrcplus-icon(
v-if='image.versions[image.versions.length - 1].file.url'
style='overflow: hidden'
@click='showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url, getEmojiFileName(image))')
template(v-if='image.frames')
.avatar(
:style='generateEmojiStyle(image.versions[image.versions.length - 1].file.url, image.framesOverTime, image.frames, image.loopStyle)')
template(v-else) template(v-else)
img.avatar(v-lazy="image.versions[image.versions.length - 1].file.url") img.avatar(v-lazy='image.versions[image.versions.length - 1].file.url')
div(style="display:inline-block;margin:5px") div(style='display: inline-block; margin: 5px')
span(v-if="image.loopStyle === 'pingpong'") #[i.el-icon-refresh.el-icon--left] span(v-if='image.loopStyle === "pingpong"') #[i.el-icon-refresh.el-icon--left]
span(style="margin-right:5px") {{ image.animationStyle }} span(style='margin-right: 5px') {{ image.animationStyle }}
span(v-if="image.framesOverTime" style="margin-right:5px") {{ image.framesOverTime }}fps span(v-if='image.framesOverTime' style='margin-right: 5px') {{ image.framesOverTime }}fps
span(v-if="image.frames" style="margin-right:5px") {{ image.frames }}frames span(v-if='image.frames' style='margin-right: 5px') {{ image.frames }}frames
br br
div(style="float:right;margin-top:5px") div(style='float: right; margin-top: 5px')
el-button(type="default" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url, getEmojiFileName(image))" size="mini" icon="el-icon-picture-outline" circle) el-button(
el-button(type="default" @click="deleteEmoji(image.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") type='default'
el-tab-pane(v-if="galleryDialogVisible" v-loading="galleryDialogStickersLoading") @click='showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url, getEmojiFileName(image))'
span(slot="label") {{ $t('dialog.gallery_icons.stickers') }} size='mini'
span(style="color:#909399;font-size:12px;margin-left:5px") {{ stickerTable.length }}/9 icon='el-icon-picture-outline'
input(type="file" accept="image/*" @change="onFileChangeSticker" id="StickerUploadButton" style="display:none") circle)
el-button(
type='default'
@click='deleteEmoji(image.id)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tab-pane(v-if='galleryDialogVisible' v-loading='galleryDialogStickersLoading')
span(slot='label') {{ $t('dialog.gallery_icons.stickers') }}
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ stickerTable.length }}/9
input#StickerUploadButton(
type='file'
accept='image/*'
@change='onFileChangeSticker'
style='display: none')
span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1024x1024px (1:1) span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1024x1024px (1:1)
br br
br br
el-button-group el-button-group
el-button(type="default" size="small" @click="refreshStickerTable" icon="el-icon-refresh") {{ $t('dialog.gallery_icons.refresh') }} el-button(type='default' size='small' @click='refreshStickerTable' icon='el-icon-refresh') {{ $t('dialog.gallery_icons.refresh') }}
el-button(type="default" size="small" @click="displayStickerUpload" icon="el-icon-upload2" :disabled="!API.currentUser.$isVRCPlus") {{ $t('dialog.gallery_icons.upload') }} el-button(
type='default'
size='small'
@click='displayStickerUpload'
icon='el-icon-upload2'
:disabled='!API.currentUser.$isVRCPlus') {{ $t('dialog.gallery_icons.upload') }}
br br
.x-friend-item(v-if="image.versions && image.versions.length > 0" v-for="image in stickerTable" :key="image.id" style="display:inline-block;margin-top:10px;width:unset;cursor:default") .x-friend-item(
.vrcplus-icon(v-if="image.versions[image.versions.length - 1].file.url" style="overflow:hidden" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)") v-if='image.versions && image.versions.length > 0'
img.avatar(v-lazy="image.versions[image.versions.length - 1].file.url") v-for='image in stickerTable'
div(style="float:right;margin-top:5px") :key='image.id'
el-button(type="default" @click="showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)" size="mini" icon="el-icon-picture-outline" circle) style='display: inline-block; margin-top: 10px; width: unset; cursor: default')
el-button(type="default" @click="deleteSticker(image.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") .vrcplus-icon(
el-tab-pane(v-if="galleryDialogVisible" v-loading="galleryDialogPrintsLoading") v-if='image.versions[image.versions.length - 1].file.url'
span(slot="label") {{ $t('dialog.gallery_icons.prints') }} style='overflow: hidden'
span(style="color:#909399;font-size:12px;margin-left:5px") {{ printTable.length }}/64 @click='showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)')
input(type="file" accept="image/*" @change="onFileChangePrint" id="PrintUploadButton" style="display:none") img.avatar(v-lazy='image.versions[image.versions.length - 1].file.url')
div(style='float: right; margin-top: 5px')
el-button(
type='default'
@click='showFullscreenImageDialog(image.versions[image.versions.length - 1].file.url)'
size='mini'
icon='el-icon-picture-outline'
circle)
el-button(
type='default'
@click='deleteSticker(image.id)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tab-pane(v-if='galleryDialogVisible' v-loading='galleryDialogPrintsLoading')
span(slot='label') {{ $t('dialog.gallery_icons.prints') }}
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ printTable.length }}/64
input#PrintUploadButton(type='file' accept='image/*' @change='onFileChangePrint' style='display: none')
span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1920x1080px (16:9) span {{ $t('dialog.gallery_icons.recommended_image_size') }}: 1920x1080px (16:9)
br br
br br
el-button-group el-button-group
el-button(type="default" size="small" @click="refreshPrintTable" icon="el-icon-refresh") {{ $t('dialog.gallery_icons.refresh') }} el-button(type='default' size='small' @click='refreshPrintTable' icon='el-icon-refresh') {{ $t('dialog.gallery_icons.refresh') }}
el-button(type="default" size="small" @click="displayPrintUpload" icon="el-icon-upload2" :disabled="!API.currentUser.$isVRCPlus") {{ $t('dialog.gallery_icons.upload') }} el-button(
el-input(type="textarea" v-model="printUploadNote" size="mini" rows="1" resize="none" maxlength="32" style="margin-left:10px;width:300px" :placeholder="$t('dialog.gallery_icons.note')") type='default'
size='small'
@click='displayPrintUpload'
icon='el-icon-upload2'
:disabled='!API.currentUser.$isVRCPlus') {{ $t('dialog.gallery_icons.upload') }}
el-input(
type='textarea'
v-model='printUploadNote'
size='mini'
rows='1'
resize='none'
maxlength='32'
style='margin-left: 10px; width: 300px'
:placeholder='$t("dialog.gallery_icons.note")')
br br
.x-friend-item(v-for="image in printTable" :key="image.id" style="display:inline-block;margin-top:10px;width:unset;cursor:default") .x-friend-item(
.vrcplus-icon(style="overflow:hidden" @click="showFullscreenImageDialog(image.files.image, getPrintFileName(image))") v-for='image in printTable'
img.avatar(v-lazy="image.files.image") :key='image.id'
div(style="margin-top:5px;width:208px") style='display: inline-block; margin-top: 10px; width: unset; cursor: default')
span.x-ellipsis(v-if="image.note" v-text="image.note" style="display:block") .vrcplus-icon(
span(v-else style="display:block")   style='overflow: hidden'
location.x-ellipsis(v-if="image.worldId" :location="image.worldId" :hint="image.worldName" style="display:block") @click='showFullscreenImageDialog(image.files.image, getPrintFileName(image))')
span(v-else style="display:block")   img.avatar(v-lazy='image.files.image')
display-name.x-ellipsis(v-if="image.authorId" :userid="image.authorId" :hint="image.authorName" style="color:#909399;font-family:monospace;display:block") div(style='margin-top: 5px; width: 208px')
span(v-else style="font-family:monospace;display:block")   span.x-ellipsis(v-if='image.note' v-text='image.note' style='display: block')
span.x-ellipsis(v-if="image.createdAt" style="color:#909399;font-family:monospace;font-size:11px;display:block") {{ image.createdAt | formatDate('long') }} span(v-else style='display: block')  
span(v-else style="display:block")   location.x-ellipsis(
div(style="float:right") v-if='image.worldId'
el-button(type="default" @click="showFullscreenImageDialog(image.files.image, getPrintFileName(image))" size="mini" icon="el-icon-picture-outline" circle) :location='image.worldId'
el-button(type="default" @click="deletePrint(image.id)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") :hint='image.worldName'
style='display: block')
span(v-else style='display: block')  
display-name.x-ellipsis(
v-if='image.authorId'
:userid='image.authorId'
:hint='image.authorName'
style='color: #909399; font-family: monospace; display: block')
span(v-else style='font-family: monospace; display: block')  
span.x-ellipsis(
v-if='image.createdAt'
style='color: #909399; font-family: monospace; font-size: 11px; display: block') {{ image.createdAt | formatDate('long') }}
span(v-else style='display: block')  
div(style='float: right')
el-button(
type='default'
@click='showFullscreenImageDialog(image.files.image, getPrintFileName(image))'
size='mini'
icon='el-icon-picture-outline'
circle)
el-button(
type='default'
@click='deletePrint(image.id)'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
+425 -202
View File
@@ -1,241 +1,464 @@
mixin favoritesDialog() mixin favoritesDialog
//- dialog: favorite //- dialog: favorite
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="favoriteDialog" :visible.sync="favoriteDialog.visible" :title="$t('dialog.favorite.header')" width="300px") el-dialog.x-dialog(
div(v-if="favoriteDialog.visible" v-loading="favoriteDialog.loading") :before-close='beforeDialogClose'
span(style="display:block;text-align:center") {{ $t('dialog.favorite.vrchat_favorites') }} @mousedown.native='dialogMouseDown'
template(v-if="favoriteDialog.currentGroup && favoriteDialog.currentGroup.key") @mouseup.native='dialogMouseUp'
el-button(style="display:block;width:100%;margin:10px 0" @click="deleteFavoriteNoConfirm(favoriteDialog.objectId)") #[i.el-icon-check] {{ favoriteDialog.currentGroup.displayName }} ({{ favoriteDialog.currentGroup.count }} / {{ favoriteDialog.currentGroup.capacity }}) ref='favoriteDialog'
:visible.sync='favoriteDialog.visible'
:title='$t("dialog.favorite.header")'
width='300px')
div(v-if='favoriteDialog.visible' v-loading='favoriteDialog.loading')
span(style='display: block; text-align: center') {{ $t('dialog.favorite.vrchat_favorites') }}
template(v-if='favoriteDialog.currentGroup && favoriteDialog.currentGroup.key')
el-button(
style='display: block; width: 100%; margin: 10px 0'
@click='deleteFavoriteNoConfirm(favoriteDialog.objectId)') #[i.el-icon-check] {{ favoriteDialog.currentGroup.displayName }} ({{ favoriteDialog.currentGroup.count }} / {{ favoriteDialog.currentGroup.capacity }})
template(v-else) template(v-else)
el-button(v-for="group in favoriteDialog.groups" :key="group" style="display:block;width:100%;margin:10px 0" @click="addFavorite(group)") {{ group.displayName }} ({{ group.count }} / {{ group.capacity }}) el-button(
div(v-if="favoriteDialog.visible && favoriteDialog.type === 'world'" style="margin-top:20px") v-for='group in favoriteDialog.groups'
span(style="display:block;text-align:center") {{ $t('dialog.favorite.local_favorites') }} :key='group'
template(v-for="group in localWorldFavoriteGroups" :key="group") style='display: block; width: 100%; margin: 10px 0'
el-button(v-if="hasLocalWorldFavorite(favoriteDialog.objectId, group)" style="display:block;width:100%;margin:10px 0" @click="removeLocalWorldFavorite(favoriteDialog.objectId, group)") #[i.el-icon-check] {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }}) @click='addFavorite(group)') {{ group.displayName }} ({{ group.count }} / {{ group.capacity }})
el-button(v-else style="display:block;width:100%;margin:10px 0" @click="addLocalWorldFavorite(favoriteDialog.objectId, group)") {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }}) div(v-if='favoriteDialog.visible && favoriteDialog.type === "world"' style='margin-top: 20px')
div(v-if="favoriteDialog.visible && favoriteDialog.type === 'avatar'" style="margin-top:20px") span(style='display: block; text-align: center') {{ $t('dialog.favorite.local_favorites') }}
span(style="display:block;text-align:center") {{ $t('dialog.favorite.local_avatar_favorites') }} template(v-for='group in localWorldFavoriteGroups' :key='group')
template(v-for="group in localAvatarFavoriteGroups" :key="group") el-button(
el-button(v-if="hasLocalAvatarFavorite(favoriteDialog.objectId, group)" style="display:block;width:100%;margin:10px 0" @click="removeLocalAvatarFavorite(favoriteDialog.objectId, group)") #[i.el-icon-check] {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }}) v-if='hasLocalWorldFavorite(favoriteDialog.objectId, group)'
el-button(v-else style="display:block;width:100%;margin:10px 0" :disabled="!isLocalUserVrcplusSupporter()" @click="addLocalAvatarFavorite(favoriteDialog.objectId, group)") {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }}) style='display: block; width: 100%; margin: 10px 0'
@click='removeLocalWorldFavorite(favoriteDialog.objectId, group)') #[i.el-icon-check] {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }})
el-button(
v-else
style='display: block; width: 100%; margin: 10px 0'
@click='addLocalWorldFavorite(favoriteDialog.objectId, group)') {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }})
div(v-if='favoriteDialog.visible && favoriteDialog.type === "avatar"' style='margin-top: 20px')
span(style='display: block; text-align: center') {{ $t('dialog.favorite.local_avatar_favorites') }}
template(v-for='group in localAvatarFavoriteGroups' :key='group')
el-button(
v-if='hasLocalAvatarFavorite(favoriteDialog.objectId, group)'
style='display: block; width: 100%; margin: 10px 0'
@click='removeLocalAvatarFavorite(favoriteDialog.objectId, group)') #[i.el-icon-check] {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }})
el-button(
v-else
style='display: block; width: 100%; margin: 10px 0'
:disabled='!isLocalUserVrcplusSupporter()'
@click='addLocalAvatarFavorite(favoriteDialog.objectId, group)') {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }})
//- dialog: export friends list //- dialog: export friends list
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" :visible.sync="exportFriendsListDialog" :title="$t('dialog.export_friends_list.header')" width="650px") el-dialog.x-dialog(
el-tabs(type="card") :before-close='beforeDialogClose'
el-tab-pane(:label="$t('dialog.export_friends_list.csv')") @mousedown.native='dialogMouseDown'
el-input(type="textarea" v-if="exportFriendsListDialog" v-model="exportFriendsListCsv" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()") @mouseup.native='dialogMouseUp'
el-tab-pane(:label="$t('dialog.export_friends_list.json')") :visible.sync='exportFriendsListDialog'
el-input(type="textarea" v-if="exportFriendsListDialog" v-model="exportFriendsListJson" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()") :title='$t("dialog.export_friends_list.header")'
width='650px')
el-tabs(type='card')
el-tab-pane(:label='$t("dialog.export_friends_list.csv")')
el-input(
type='textarea'
v-if='exportFriendsListDialog'
v-model='exportFriendsListCsv'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='$event.target.tagName === "TEXTAREA" && $event.target.select()')
el-tab-pane(:label='$t("dialog.export_friends_list.json")')
el-input(
type='textarea'
v-if='exportFriendsListDialog'
v-model='exportFriendsListJson'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='$event.target.tagName === "TEXTAREA" && $event.target.select()')
//- dialog: export avatars list //- dialog: export avatars list
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" :visible.sync="exportAvatarsListDialog" :title="$t('dialog.export_own_avatars.header')" width="650px") el-dialog.x-dialog(
el-input(type="textarea" v-if="exportAvatarsListDialog" v-model="exportAvatarsListCsv" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()") :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
:visible.sync='exportAvatarsListDialog'
:title='$t("dialog.export_own_avatars.header")'
width='650px')
el-input(
type='textarea'
v-if='exportAvatarsListDialog'
v-model='exportAvatarsListCsv'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='$event.target.tagName === "TEXTAREA" && $event.target.select()')
//- dialog: export world list //- dialog: export world list
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="worldExportDialogRef" :visible.sync="worldExportDialogVisible" :title="$t('dialog.world_export.header')" width="650px") el-dialog.x-dialog(
el-checkbox-group(v-model="exportSelectedOptions" @change="updateWorldExportDialog()" style="margin-bottom:10px") :before-close='beforeDialogClose'
template(v-for="option in exportSelectOptions" :key="option.value") @mousedown.native='dialogMouseDown'
el-checkbox(:label="option.label") @mouseup.native='dialogMouseUp'
el-dropdown(@click.native.stop trigger="click" size="small") ref='worldExportDialogRef'
el-button(size="mini") :visible.sync='worldExportDialogVisible'
span(v-if="worldExportFavoriteGroup") {{ worldExportFavoriteGroup.displayName }} ({{ worldExportFavoriteGroup.count }}/{{ worldExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right] :title='$t("dialog.world_export.header")'
width='650px')
el-checkbox-group(
v-model='exportSelectedOptions'
@change='updateWorldExportDialog()'
style='margin-bottom: 10px')
template(v-for='option in exportSelectOptions' :key='option.value')
el-checkbox(:label='option.label')
el-dropdown(@click.native.stop trigger='click' size='small')
el-button(size='mini')
span(v-if='worldExportFavoriteGroup') {{ worldExportFavoriteGroup.displayName }} ({{ worldExportFavoriteGroup.count }}/{{ worldExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) All Favorites #[i.el-icon-arrow-down.el-icon--right] span(v-else) All Favorites #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldExportGroup(null)") None el-dropdown-item(style='display: block; margin: 10px 0' @click.native='selectWorldExportGroup(null)') None
template(v-for="groupAPI in API.favoriteWorldGroups" :key="groupAPI.name") template(v-for='groupAPI in API.favoriteWorldGroups' :key='groupAPI.name')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldExportGroup(groupAPI)") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }}) el-dropdown-item(
el-dropdown(@click.native.stop trigger="click" size="small" style="margin-left:10px") style='display: block; margin: 10px 0'
el-button(size="mini") @click.native='selectWorldExportGroup(groupAPI)') {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
span(v-if="worldExportLocalFavoriteGroup") {{ worldExportLocalFavoriteGroup }} ({{ getLocalWorldFavoriteGroupLength(worldExportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right] el-dropdown(@click.native.stop trigger='click' size='small' style='margin-left: 10px')
el-button(size='mini')
span(v-if='worldExportLocalFavoriteGroup') {{ worldExportLocalFavoriteGroup }} ({{ getLocalWorldFavoriteGroupLength(worldExportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right] span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldExportLocalGroup(null)") None el-dropdown-item(style='display: block; margin: 10px 0' @click.native='selectWorldExportLocalGroup(null)') None
template(v-for="group in localWorldFavoriteGroups" :key="group") template(v-for='group in localWorldFavoriteGroups' :key='group')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldExportLocalGroup(group)") {{ group }} ({{ localWorldFavorites[group].length }}) el-dropdown-item(
style='display: block; margin: 10px 0'
@click.native='selectWorldExportLocalGroup(group)') {{ group }} ({{ localWorldFavorites[group].length }})
br br
el-input(type="textarea" v-if="worldExportDialogVisible" v-model="worldExportContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="handleCopyWorldExportData") el-input(
type='textarea'
v-if='worldExportDialogVisible'
v-model='worldExportContent'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='handleCopyWorldExportData')
//- dialog: World import dialog //- dialog: World import dialog
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="worldImportDialog" :visible.sync="worldImportDialog.visible" :title="$t('dialog.world_import.header')" width="650px") el-dialog.x-dialog(
div(style="display:flex;align-items:center;justify-content:space-between") :before-close='beforeDialogClose'
div(style="font-size:12px") {{ $t('dialog.world_import.description') }} @mousedown.native='dialogMouseDown'
div(style="display:flex;align-items:center;") @mouseup.native='dialogMouseUp'
div(v-if="worldImportDialog.progress") {{ $t('dialog.world_import.process_progress') }} {{ worldImportDialog.progress }} / {{ worldImportDialog.progressTotal }} #[i.el-icon-loading(style="margin:0 5px")] ref='worldImportDialog'
el-button(v-if="worldImportDialog.loading" size="small" @click="cancelWorldImport") {{ $t('dialog.world_import.cancel') }} :visible.sync='worldImportDialog.visible'
el-button(v-else size="small" @click="processWorldImportList" :disabled="!worldImportDialog.input") {{ $t('dialog.world_import.process_list') }} :title='$t("dialog.world_import.header")'
el-input(type="textarea" v-model="worldImportDialog.input" size="mini" rows="10" resize="none" style="margin-top:10px") width='650px')
div(style="display:flex;align-items:center;justify-content:space-between;margin-top:5px") div(style='display: flex; align-items: center; justify-content: space-between')
div(style='font-size: 12px') {{ $t('dialog.world_import.description') }}
div(style='display: flex; align-items: center')
div(v-if='worldImportDialog.progress') {{ $t('dialog.world_import.process_progress') }} {{ worldImportDialog.progress }} / {{ worldImportDialog.progressTotal }} #[i.el-icon-loading(style='margin: 0 5px')]
el-button(v-if='worldImportDialog.loading' size='small' @click='cancelWorldImport') {{ $t('dialog.world_import.cancel') }}
el-button(v-else size='small' @click='processWorldImportList' :disabled='!worldImportDialog.input') {{ $t('dialog.world_import.process_list') }}
el-input(
type='textarea'
v-model='worldImportDialog.input'
size='mini'
rows='10'
resize='none'
style='margin-top: 10px')
div(style='display: flex; align-items: center; justify-content: space-between; margin-top: 5px')
div div
el-dropdown(@click.native.stop trigger="click" size="small" style="margin-right:5px") el-dropdown(@click.native.stop trigger='click' size='small' style='margin-right: 5px')
el-button(size="mini") el-button(size='mini')
span(v-if="worldImportDialog.worldImportFavoriteGroup") {{ worldImportDialog.worldImportFavoriteGroup.displayName }} ({{ worldImportDialog.worldImportFavoriteGroup.count }}/{{ worldImportDialog.worldImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right] span(v-if='worldImportDialog.worldImportFavoriteGroup') {{ worldImportDialog.worldImportFavoriteGroup.displayName }} ({{ worldImportDialog.worldImportFavoriteGroup.count }}/{{ worldImportDialog.worldImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) {{ $t('dialog.world_import.select_vrchat_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right] span(v-else) {{ $t('dialog.world_import.select_vrchat_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
template(v-for="groupAPI in API.favoriteWorldGroups" :key="groupAPI.name") template(v-for='groupAPI in API.favoriteWorldGroups' :key='groupAPI.name')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldImportGroup(groupAPI)" :disabled="groupAPI.count >= groupAPI.capacity") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }}) el-dropdown-item(
el-dropdown(@click.native.stop trigger="click" size="small" style="margin:5px") style='display: block; margin: 10px 0'
el-button(size="mini") @click.native='selectWorldImportGroup(groupAPI)'
span(v-if="worldImportDialog.worldImportLocalFavoriteGroup") {{ worldImportDialog.worldImportLocalFavoriteGroup }} ({{ getLocalWorldFavoriteGroupLength(worldImportDialog.worldImportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right] :disabled='groupAPI.count >= groupAPI.capacity') {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
el-dropdown(@click.native.stop trigger='click' size='small' style='margin: 5px')
el-button(size='mini')
span(v-if='worldImportDialog.worldImportLocalFavoriteGroup') {{ worldImportDialog.worldImportLocalFavoriteGroup }} ({{ getLocalWorldFavoriteGroupLength(worldImportDialog.worldImportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) {{ $t('dialog.world_import.select_local_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right] span(v-else) {{ $t('dialog.world_import.select_local_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
template(v-for="group in localWorldFavoriteGroups" :key="group") template(v-for='group in localWorldFavoriteGroups' :key='group')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldImportLocalGroup(group)" ) {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }}) el-dropdown-item(
span(v-if="worldImportDialog.worldImportFavoriteGroup" style="margin-left:5px") {{ worldImportTable.data.length }} / {{ worldImportDialog.worldImportFavoriteGroup.capacity - worldImportDialog.worldImportFavoriteGroup.count }} style='display: block; margin: 10px 0'
@click.native='selectWorldImportLocalGroup(group)') {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }})
span(v-if='worldImportDialog.worldImportFavoriteGroup' style='margin-left: 5px') {{ worldImportTable.data.length }} / {{ worldImportDialog.worldImportFavoriteGroup.capacity - worldImportDialog.worldImportFavoriteGroup.count }}
div div
el-button(size="small" @click="clearWorldImportTable" :disabled="worldImportTable.data.length === 0") {{ $t('dialog.world_import.clear_table') }} el-button(size='small' @click='clearWorldImportTable' :disabled='worldImportTable.data.length === 0') {{ $t('dialog.world_import.clear_table') }}
el-button(size="small" type="primary" @click="importWorldImportTable" style="margin:5px" :disabled="worldImportTable.data.length === 0 || (!worldImportDialog.worldImportFavoriteGroup && !worldImportDialog.worldImportLocalFavoriteGroup)") {{ $t('dialog.world_import.import') }} el-button(
span(v-if="worldImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.world_import.import_progress') }} {{ worldImportDialog.importProgress }}/{{ worldImportDialog.importProgressTotal }} size='small'
type='primary'
@click='importWorldImportTable'
style='margin: 5px'
:disabled='worldImportTable.data.length === 0 || (!worldImportDialog.worldImportFavoriteGroup && !worldImportDialog.worldImportLocalFavoriteGroup)') {{ $t('dialog.world_import.import') }}
span(v-if='worldImportDialog.importProgress' style='margin: 10px') #[i.el-icon-loading(style='margin-right: 5px')] {{ $t('dialog.world_import.import_progress') }} {{ worldImportDialog.importProgress }}/{{ worldImportDialog.importProgressTotal }}
br br
template(v-if="worldImportDialog.errors") template(v-if='worldImportDialog.errors')
el-button(size="small" @click="worldImportDialog.errors = ''") {{ $t('dialog.world_import.clear_errors') }} el-button(size='small' @click='worldImportDialog.errors = ""') {{ $t('dialog.world_import.clear_errors') }}
h2(style="font-weight:bold;margin:5px 0") {{ $t('dialog.world_import.errors') }} h2(style='font-weight: bold; margin: 5px 0') {{ $t('dialog.world_import.errors') }}
pre(v-text="worldImportDialog.errors" style="white-space:pre-wrap;font-size:12px") pre(v-text='worldImportDialog.errors' style='white-space: pre-wrap; font-size: 12px')
data-tables(v-if="worldImportDialog.visible" v-bind="worldImportTable" v-loading="worldImportDialog.loading" style="margin-top:10px") data-tables(
el-table-column(:label="$t('table.import.image')" width="70" prop="thumbnailImageUrl") v-if='worldImportDialog.visible'
template(#default="scope") v-bind='worldImportTable'
el-popover(placement="right" height="500px" trigger="hover") v-loading='worldImportDialog.loading'
img.friends-list-avatar(slot="reference" v-lazy="scope.row.thumbnailImageUrl") style='margin-top: 10px')
img.friends-list-avatar(v-lazy="scope.row.imageUrl" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(scope.row.imageUrl)") el-table-column(:label='$t("table.import.image")' width='70' prop='thumbnailImageUrl')
el-table-column(:label="$t('table.import.name')" prop="name") template(#default='scope')
template(#default="scope") el-popover(placement='right' height='500px' trigger='hover')
span.x-link(v-text="scope.row.name" @click="showWorldDialog(scope.row.id)") img.friends-list-avatar(slot='reference' v-lazy='scope.row.thumbnailImageUrl')
el-table-column(:label="$t('table.import.author')" width="120" prop="authorName") img.friends-list-avatar(
template(#default="scope") v-lazy='scope.row.imageUrl'
span.x-link(v-text="scope.row.authorName" @click="showUserDialog(scope.row.authorId)") style='height: 500px; cursor: pointer'
el-table-column(:label="$t('table.import.status')" width="70" prop="releaseStatus") @click='showFullscreenImageDialog(scope.row.imageUrl)')
template(#default="scope") el-table-column(:label='$t("table.import.name")' prop='name')
span(v-text="scope.row.releaseStatus.charAt(0).toUpperCase() + scope.row.releaseStatus.slice(1)" :style="{ color: scope.row.releaseStatus === 'public' ? '#67c23a' : scope.row.releaseStatus === 'private' ? '#f56c6c' : undefined }") template(#default='scope')
el-table-column(:label="$t('table.import.action')" width="90" align="right") span.x-link(v-text='scope.row.name' @click='showWorldDialog(scope.row.id)')
template(#default="scope") el-table-column(:label='$t("table.import.author")' width='120' prop='authorName')
el-button(type="text" icon="el-icon-close" size="mini" @click="deleteItemWorldImport(scope.row)") template(#default='scope')
span.x-link(v-text='scope.row.authorName' @click='showUserDialog(scope.row.authorId)')
el-table-column(:label='$t("table.import.status")' width='70' prop='releaseStatus')
template(#default='scope')
span(
v-text='scope.row.releaseStatus.charAt(0).toUpperCase() + scope.row.releaseStatus.slice(1)'
:style='{ color: scope.row.releaseStatus === "public" ? "#67c23a" : scope.row.releaseStatus === "private" ? "#f56c6c" : undefined }')
el-table-column(:label='$t("table.import.action")' width='90' align='right')
template(#default='scope')
el-button(type='text' icon='el-icon-close' size='mini' @click='deleteItemWorldImport(scope.row)')
//- dialog: export avatar list //- dialog: export avatar list
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarExportDialogRef" :visible.sync="avatarExportDialogVisible" :title="$t('dialog.avatar_export.header')" width="650px") el-dialog.x-dialog(
el-checkbox-group(v-model="exportSelectedOptions" @change="updateAvatarExportDialog()" style="margin-bottom:10px") :before-close='beforeDialogClose'
template(v-for="option in exportSelectOptions" :key="option.value") @mousedown.native='dialogMouseDown'
el-checkbox(:label="option.label") @mouseup.native='dialogMouseUp'
el-dropdown(@click.native.stop trigger="click" size="small") ref='avatarExportDialogRef'
el-button(size="mini") :visible.sync='avatarExportDialogVisible'
span(v-if="avatarExportFavoriteGroup") {{ avatarExportFavoriteGroup.displayName }} ({{ avatarExportFavoriteGroup.count }}/{{ avatarExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right] :title='$t("dialog.avatar_export.header")'
width='650px')
el-checkbox-group(
v-model='exportSelectedOptions'
@change='updateAvatarExportDialog()'
style='margin-bottom: 10px')
template(v-for='option in exportSelectOptions' :key='option.value')
el-checkbox(:label='option.label')
el-dropdown(@click.native.stop trigger='click' size='small')
el-button(size='mini')
span(v-if='avatarExportFavoriteGroup') {{ avatarExportFavoriteGroup.displayName }} ({{ avatarExportFavoriteGroup.count }}/{{ avatarExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) All Favorites #[i.el-icon-arrow-down.el-icon--right] span(v-else) All Favorites #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarExportGroup(null)") All Favorites el-dropdown-item(style='display: block; margin: 10px 0' @click.native='selectAvatarExportGroup(null)') All Favorites
template(v-for="groupAPI in API.favoriteAvatarGroups" :key="groupAPI.name") template(v-for='groupAPI in API.favoriteAvatarGroups' :key='groupAPI.name')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarExportGroup(groupAPI)") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }}) el-dropdown-item(
el-dropdown(@click.native.stop trigger="click" size="small" style="margin-left:10px") style='display: block; margin: 10px 0'
el-button(size="mini") @click.native='selectAvatarExportGroup(groupAPI)') {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
span(v-if="avatarExportLocalFavoriteGroup") {{ avatarExportLocalFavoriteGroup }} ({{ getLocalAvatarFavoriteGroupLength(avatarExportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right] el-dropdown(@click.native.stop trigger='click' size='small' style='margin-left: 10px')
el-button(size='mini')
span(v-if='avatarExportLocalFavoriteGroup') {{ avatarExportLocalFavoriteGroup }} ({{ getLocalAvatarFavoriteGroupLength(avatarExportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right] span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarExportLocalGroup(null)") None el-dropdown-item(
template(v-for="group in localAvatarFavoriteGroups" :key="group") style='display: block; margin: 10px 0'
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarExportLocalGroup(group)" ) {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }}) @click.native='selectAvatarExportLocalGroup(null)') None
template(v-for='group in localAvatarFavoriteGroups' :key='group')
el-dropdown-item(
style='display: block; margin: 10px 0'
@click.native='selectAvatarExportLocalGroup(group)') {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }})
br br
el-input(type="textarea" v-if="avatarExportDialogVisible" v-model="avatarExportContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="handleCopyAvatarExportData") el-input(
type='textarea'
v-if='avatarExportDialogVisible'
v-model='avatarExportContent'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='handleCopyAvatarExportData')
//- dialog: Avatar import dialog //- dialog: Avatar import dialog
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarImportDialog" :visible.sync="avatarImportDialog.visible" :title="$t('dialog.avatar_import.header')" width="650px") el-dialog.x-dialog(
div(style="display:flex;align-items:center;justify-content:space-between") :before-close='beforeDialogClose'
div(style="font-size:12px") {{ $t('dialog.avatar_import.description') }} @mousedown.native='dialogMouseDown'
div(style="display:flex;align-items:center;") @mouseup.native='dialogMouseUp'
div(v-if="avatarImportDialog.progress") {{ $t('dialog.avatar_import.process_progress') }} {{ avatarImportDialog.progress }} / {{ avatarImportDialog.progressTotal }} #[i.el-icon-loading(style="margin:0 5px")] ref='avatarImportDialog'
el-button(v-if="avatarImportDialog.loading" size="small" @click="cancelAvatarImport") {{ $t('dialog.avatar_import.cancel') }} :visible.sync='avatarImportDialog.visible'
el-button(v-else size="small" @click="processAvatarImportList" :disabled="!avatarImportDialog.input") {{ $t('dialog.avatar_import.process_list') }} :title='$t("dialog.avatar_import.header")'
el-input(type="textarea" v-model="avatarImportDialog.input" size="mini" rows="10" resize="none" style="margin-top:10px") width='650px')
div(style="display:flex;align-items:center;justify-content:space-between;margin-top:5px") div(style='display: flex; align-items: center; justify-content: space-between')
div(style='font-size: 12px') {{ $t('dialog.avatar_import.description') }}
div(style='display: flex; align-items: center')
div(v-if='avatarImportDialog.progress') {{ $t('dialog.avatar_import.process_progress') }} {{ avatarImportDialog.progress }} / {{ avatarImportDialog.progressTotal }} #[i.el-icon-loading(style='margin: 0 5px')]
el-button(v-if='avatarImportDialog.loading' size='small' @click='cancelAvatarImport') {{ $t('dialog.avatar_import.cancel') }}
el-button(v-else size='small' @click='processAvatarImportList' :disabled='!avatarImportDialog.input') {{ $t('dialog.avatar_import.process_list') }}
el-input(
type='textarea'
v-model='avatarImportDialog.input'
size='mini'
rows='10'
resize='none'
style='margin-top: 10px')
div(style='display: flex; align-items: center; justify-content: space-between; margin-top: 5px')
div div
el-dropdown(@click.native.stop trigger="click" size="small") el-dropdown(@click.native.stop trigger='click' size='small')
el-button(size="mini") el-button(size='mini')
span(v-if="avatarImportDialog.avatarImportFavoriteGroup") {{ avatarImportDialog.avatarImportFavoriteGroup.displayName }} ({{ avatarImportDialog.avatarImportFavoriteGroup.count }}/{{ avatarImportDialog.avatarImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right] span(v-if='avatarImportDialog.avatarImportFavoriteGroup') {{ avatarImportDialog.avatarImportFavoriteGroup.displayName }} ({{ avatarImportDialog.avatarImportFavoriteGroup.count }}/{{ avatarImportDialog.avatarImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) {{ $t('dialog.avatar_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right] span(v-else) {{ $t('dialog.avatar_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
template(v-for="groupAPI in API.favoriteAvatarGroups" :key="groupAPI.name") template(v-for='groupAPI in API.favoriteAvatarGroups' :key='groupAPI.name')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarImportGroup(groupAPI)" :disabled="groupAPI.count >= groupAPI.capacity") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }}) el-dropdown-item(
el-dropdown(@click.native.stop trigger="click" size="small" style="margin:5px") style='display: block; margin: 10px 0'
el-button(size="mini") @click.native='selectAvatarImportGroup(groupAPI)'
span(v-if="avatarImportDialog.avatarImportLocalFavoriteGroup") {{ avatarImportDialog.avatarImportLocalFavoriteGroup }} ({{ getLocalAvatarFavoriteGroupLength(avatarImportDialog.avatarImportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right] :disabled='groupAPI.count >= groupAPI.capacity') {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
el-dropdown(@click.native.stop trigger='click' size='small' style='margin: 5px')
el-button(size='mini')
span(v-if='avatarImportDialog.avatarImportLocalFavoriteGroup') {{ avatarImportDialog.avatarImportLocalFavoriteGroup }} ({{ getLocalAvatarFavoriteGroupLength(avatarImportDialog.avatarImportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) {{ $t('dialog.avatar_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right] span(v-else) {{ $t('dialog.avatar_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
template(v-for="group in localAvatarFavoriteGroups" :key="group") template(v-for='group in localAvatarFavoriteGroups' :key='group')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarImportLocalGroup(group)" ) {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }}) el-dropdown-item(
span(v-if="avatarImportDialog.avatarImportFavoriteGroup" style="margin-left:5px") {{ avatarImportTable.data.length }} / {{ avatarImportDialog.avatarImportFavoriteGroup.capacity - avatarImportDialog.avatarImportFavoriteGroup.count }} style='display: block; margin: 10px 0'
@click.native='selectAvatarImportLocalGroup(group)') {{ group }} ({{ getLocalAvatarFavoriteGroupLength(group) }})
span(v-if='avatarImportDialog.avatarImportFavoriteGroup' style='margin-left: 5px') {{ avatarImportTable.data.length }} / {{ avatarImportDialog.avatarImportFavoriteGroup.capacity - avatarImportDialog.avatarImportFavoriteGroup.count }}
div div
el-button(size="small" @click="clearAvatarImportTable") {{ $t('dialog.avatar_import.clear_table') }} el-button(size='small' @click='clearAvatarImportTable') {{ $t('dialog.avatar_import.clear_table') }}
el-button(size="small" type="primary" @click="importAvatarImportTable" style="margin:5px" :disabled="avatarImportTable.data.length === 0 || (!avatarImportDialog.avatarImportFavoriteGroup && !avatarImportDialog.avatarImportLocalFavoriteGroup)") {{ $t('dialog.avatar_import.import') }} el-button(
span(v-if="avatarImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.avatar_import.import_progress') }} {{ avatarImportDialog.importProgress }}/{{ avatarImportDialog.importProgressTotal }} size='small'
type='primary'
@click='importAvatarImportTable'
style='margin: 5px'
:disabled='avatarImportTable.data.length === 0 || (!avatarImportDialog.avatarImportFavoriteGroup && !avatarImportDialog.avatarImportLocalFavoriteGroup)') {{ $t('dialog.avatar_import.import') }}
span(v-if='avatarImportDialog.importProgress' style='margin: 10px') #[i.el-icon-loading(style='margin-right: 5px')] {{ $t('dialog.avatar_import.import_progress') }} {{ avatarImportDialog.importProgress }}/{{ avatarImportDialog.importProgressTotal }}
br br
template(v-if="avatarImportDialog.errors") template(v-if='avatarImportDialog.errors')
el-button(size="small" @click="avatarImportDialog.errors = ''") {{ $t('dialog.avatar_import.clear_errors') }} el-button(size='small' @click='avatarImportDialog.errors = ""') {{ $t('dialog.avatar_import.clear_errors') }}
h2(style="font-weight:bold;margin:5px 0") {{ $t('dialog.avatar_import.errors') }} h2(style='font-weight: bold; margin: 5px 0') {{ $t('dialog.avatar_import.errors') }}
pre(v-text="avatarImportDialog.errors" style="white-space:pre-wrap;font-size:12px") pre(v-text='avatarImportDialog.errors' style='white-space: pre-wrap; font-size: 12px')
data-tables(v-if="avatarImportDialog.visible" v-bind="avatarImportTable" v-loading="avatarImportDialog.loading" style="margin-top:10px") data-tables(
el-table-column(:label="$t('table.import.image')" width="70" prop="thumbnailImageUrl") v-if='avatarImportDialog.visible'
template(#default="scope") v-bind='avatarImportTable'
el-popover(placement="right" height="500px" trigger="hover") v-loading='avatarImportDialog.loading'
img.friends-list-avatar(slot="reference" v-lazy="scope.row.thumbnailImageUrl") style='margin-top: 10px')
img.friends-list-avatar(v-lazy="scope.row.imageUrl" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(scope.row.imageUrl)") el-table-column(:label='$t("table.import.image")' width='70' prop='thumbnailImageUrl')
el-table-column(:label="$t('table.import.name')" prop="name") template(#default='scope')
template(#default="scope") el-popover(placement='right' height='500px' trigger='hover')
span.x-link(v-text="scope.row.name" @click="showAvatarDialog(scope.row.id)") img.friends-list-avatar(slot='reference' v-lazy='scope.row.thumbnailImageUrl')
el-table-column(:label="$t('table.import.author')" width="120" prop="authorName") img.friends-list-avatar(
template(#default="scope") v-lazy='scope.row.imageUrl'
span.x-link(v-text="scope.row.authorName" @click="showUserDialog(scope.row.authorId)") style='height: 500px; cursor: pointer'
el-table-column(:label="$t('table.import.status')" width="70" prop="releaseStatus") @click='showFullscreenImageDialog(scope.row.imageUrl)')
template(#default="scope") el-table-column(:label='$t("table.import.name")' prop='name')
span(v-text="scope.row.releaseStatus.charAt(0).toUpperCase() + scope.row.releaseStatus.slice(1)" :style="{ color: scope.row.releaseStatus === 'public' ? '#67c23a' : scope.row.releaseStatus === 'private' ? '#f56c6c' : undefined }") template(#default='scope')
el-table-column(:label="$t('table.import.action')" width="90" align="right") span.x-link(v-text='scope.row.name' @click='showAvatarDialog(scope.row.id)')
template(#default="scope") el-table-column(:label='$t("table.import.author")' width='120' prop='authorName')
el-button(type="text" icon="el-icon-close" size="mini" @click="deleteItemAvatarImport(scope.row)") template(#default='scope')
span.x-link(v-text='scope.row.authorName' @click='showUserDialog(scope.row.authorId)')
el-table-column(:label='$t("table.import.status")' width='70' prop='releaseStatus')
template(#default='scope')
span(
v-text='scope.row.releaseStatus.charAt(0).toUpperCase() + scope.row.releaseStatus.slice(1)'
:style='{ color: scope.row.releaseStatus === "public" ? "#67c23a" : scope.row.releaseStatus === "private" ? "#f56c6c" : undefined }')
el-table-column(:label='$t("table.import.action")' width='90' align='right')
template(#default='scope')
el-button(type='text' icon='el-icon-close' size='mini' @click='deleteItemAvatarImport(scope.row)')
//- dialog: export friend list //- dialog: export friend list
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="friendExportDialogRef" :visible.sync="friendExportDialogVisible" :title="$t('dialog.friend_export.header')" width="650px") el-dialog.x-dialog(
el-dropdown(@click.native.stop trigger="click" size="small") :before-close='beforeDialogClose'
el-button(size="mini") @mousedown.native='dialogMouseDown'
span(v-if="friendExportFavoriteGroup") {{ friendExportFavoriteGroup.displayName }} ({{ friendExportFavoriteGroup.count }}/{{ friendExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right] @mouseup.native='dialogMouseUp'
ref='friendExportDialogRef'
:visible.sync='friendExportDialogVisible'
:title='$t("dialog.friend_export.header")'
width='650px')
el-dropdown(@click.native.stop trigger='click' size='small')
el-button(size='mini')
span(v-if='friendExportFavoriteGroup') {{ friendExportFavoriteGroup.displayName }} ({{ friendExportFavoriteGroup.count }}/{{ friendExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) All Favorites #[i.el-icon-arrow-down.el-icon--right] span(v-else) All Favorites #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectFriendExportGroup(null)") All Favorites el-dropdown-item(style='display: block; margin: 10px 0' @click.native='selectFriendExportGroup(null)') All Favorites
template(v-for="groupAPI in API.favoriteFriendGroups" :key="groupAPI.name") template(v-for='groupAPI in API.favoriteFriendGroups' :key='groupAPI.name')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectFriendExportGroup(groupAPI)") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }}) el-dropdown-item(
style='display: block; margin: 10px 0'
@click.native='selectFriendExportGroup(groupAPI)') {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
br br
el-input(type="textarea" v-if="friendExportDialogVisible" v-model="friendExportContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="handleCopyFriendExportData") el-input(
type='textarea'
v-if='friendExportDialogVisible'
v-model='friendExportContent'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='handleCopyFriendExportData')
//- dialog: Friend import dialog //- dialog: Friend import dialog
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="friendImportDialog" :visible.sync="friendImportDialog.visible" :title="$t('dialog.friend_import.header')" width="650px") el-dialog.x-dialog(
div(style="display:flex;align-items:center;justify-content:space-between") :before-close='beforeDialogClose'
div(style="font-size:12px") {{ $t('dialog.friend_import.description') }} @mousedown.native='dialogMouseDown'
div(style="display:flex;align-items:center;") @mouseup.native='dialogMouseUp'
div(v-if="friendImportDialog.progress") {{ $t('dialog.friend_import.process_progress') }} {{ friendImportDialog.progress }} / {{ friendImportDialog.progressTotal }} #[i.el-icon-loading(style="margin:0 5px")] ref='friendImportDialog'
el-button(v-if="friendImportDialog.loading" size="small" @click="cancelFriendImport") {{ $t('dialog.friend_import.cancel') }} :visible.sync='friendImportDialog.visible'
el-button(v-else size="small" @click="processFriendImportList" :disabled="!friendImportDialog.input") {{ $t('dialog.friend_import.process_list') }} :title='$t("dialog.friend_import.header")'
el-input(type="textarea" v-model="friendImportDialog.input" size="mini" rows="10" resize="none" style="margin-top:10px") width='650px')
div(style="display:flex;align-items:center;justify-content:space-between;margin-top:5px") div(style='display: flex; align-items: center; justify-content: space-between')
div(style='font-size: 12px') {{ $t('dialog.friend_import.description') }}
div(style='display: flex; align-items: center')
div(v-if='friendImportDialog.progress') {{ $t('dialog.friend_import.process_progress') }} {{ friendImportDialog.progress }} / {{ friendImportDialog.progressTotal }} #[i.el-icon-loading(style='margin: 0 5px')]
el-button(v-if='friendImportDialog.loading' size='small' @click='cancelFriendImport') {{ $t('dialog.friend_import.cancel') }}
el-button(v-else size='small' @click='processFriendImportList' :disabled='!friendImportDialog.input') {{ $t('dialog.friend_import.process_list') }}
el-input(
type='textarea'
v-model='friendImportDialog.input'
size='mini'
rows='10'
resize='none'
style='margin-top: 10px')
div(style='display: flex; align-items: center; justify-content: space-between; margin-top: 5px')
div div
el-dropdown(@click.native.stop trigger="click" size="small") el-dropdown(@click.native.stop trigger='click' size='small')
el-button(size="mini") el-button(size='mini')
span(v-if="friendImportDialog.friendImportFavoriteGroup") {{ friendImportDialog.friendImportFavoriteGroup.displayName }} ({{ friendImportDialog.friendImportFavoriteGroup.count }}/{{ friendImportDialog.friendImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right] span(v-if='friendImportDialog.friendImportFavoriteGroup') {{ friendImportDialog.friendImportFavoriteGroup.displayName }} ({{ friendImportDialog.friendImportFavoriteGroup.count }}/{{ friendImportDialog.friendImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
span(v-else) {{ $t('dialog.friend_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right] span(v-else) {{ $t('dialog.friend_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown") el-dropdown-menu(#default='dropdown')
template(v-for="groupAPI in API.favoriteFriendGroups" :key="groupAPI.name") template(v-for='groupAPI in API.favoriteFriendGroups' :key='groupAPI.name')
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectFriendImportGroup(groupAPI)" :disabled="groupAPI.count >= groupAPI.capacity") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }}) el-dropdown-item(
span(v-if="friendImportDialog.friendImportFavoriteGroup" style="margin-left:5px") {{ friendImportTable.data.length }} / {{ friendImportDialog.friendImportFavoriteGroup.capacity - friendImportDialog.friendImportFavoriteGroup.count }} style='display: block; margin: 10px 0'
@click.native='selectFriendImportGroup(groupAPI)'
:disabled='groupAPI.count >= groupAPI.capacity') {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
span(v-if='friendImportDialog.friendImportFavoriteGroup' style='margin-left: 5px') {{ friendImportTable.data.length }} / {{ friendImportDialog.friendImportFavoriteGroup.capacity - friendImportDialog.friendImportFavoriteGroup.count }}
div div
el-button(size="small" @click="clearFriendImportTable" :disabled="friendImportTable.data.length === 0") {{ $t('dialog.friend_import.clear_table') }} el-button(size='small' @click='clearFriendImportTable' :disabled='friendImportTable.data.length === 0') {{ $t('dialog.friend_import.clear_table') }}
el-button(size="small" type="primary" @click="importFriendImportTable" style="margin:5px" :disabled="friendImportTable.data.length === 0 || !friendImportDialog.friendImportFavoriteGroup") {{ $t('dialog.friend_import.import') }} el-button(
span(v-if="friendImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.friend_import.import_progress') }} {{ friendImportDialog.importProgress }}/{{ friendImportDialog.importProgressTotal }} size='small'
type='primary'
@click='importFriendImportTable'
style='margin: 5px'
:disabled='friendImportTable.data.length === 0 || !friendImportDialog.friendImportFavoriteGroup') {{ $t('dialog.friend_import.import') }}
span(v-if='friendImportDialog.importProgress' style='margin: 10px') #[i.el-icon-loading(style='margin-right: 5px')] {{ $t('dialog.friend_import.import_progress') }} {{ friendImportDialog.importProgress }}/{{ friendImportDialog.importProgressTotal }}
br br
template(v-if="friendImportDialog.errors") template(v-if='friendImportDialog.errors')
el-button(size="small" @click="friendImportDialog.errors = ''") {{ $t('dialog.friend_import.clear_errors') }} el-button(size='small' @click='friendImportDialog.errors = ""') {{ $t('dialog.friend_import.clear_errors') }}
h2(style="font-weight:bold;margin:5px 0") {{ $t('dialog.friend_import.errors') }} h2(style='font-weight: bold; margin: 5px 0') {{ $t('dialog.friend_import.errors') }}
pre(v-text="friendImportDialog.errors" style="white-space:pre-wrap;font-size:12px") pre(v-text='friendImportDialog.errors' style='white-space: pre-wrap; font-size: 12px')
data-tables(v-if="friendImportDialog.visible" v-bind="friendImportTable" v-loading="friendImportDialog.loading" style="margin-top:10px") data-tables(
el-table-column(:label="$t('table.import.image')" width="70" prop="currentAvatarThumbnailImageUrl") v-if='friendImportDialog.visible'
template(#default="scope") v-bind='friendImportTable'
el-popover(placement="right" height="500px" trigger="hover") v-loading='friendImportDialog.loading'
img.friends-list-avatar(slot="reference" v-lazy="userImage(scope.row)") style='margin-top: 10px')
img.friends-list-avatar(v-lazy="userImageFull(scope.row)" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(userImageFull(scope.row))") el-table-column(:label='$t("table.import.image")' width='70' prop='currentAvatarThumbnailImageUrl')
el-table-column(:label="$t('table.import.name')" prop="displayName") template(#default='scope')
template(#default="scope") el-popover(placement='right' height='500px' trigger='hover')
span.x-link(v-text="scope.row.displayName" @click="showUserDialog(scope.row.id)") img.friends-list-avatar(slot='reference' v-lazy='userImage(scope.row)')
el-table-column(:label="$t('table.import.action')" width="90" align="right") img.friends-list-avatar(
template(#default="scope") v-lazy='userImageFull(scope.row)'
el-button(type="text" icon="el-icon-close" size="mini" @click="deleteItemFriendImport(scope.row)") style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row))')
el-table-column(:label='$t("table.import.name")' prop='displayName')
template(#default='scope')
span.x-link(v-text='scope.row.displayName' @click='showUserDialog(scope.row.id)')
el-table-column(:label='$t("table.import.action")' width='90' align='right')
template(#default='scope')
el-button(type='text' icon='el-icon-close' size='mini' @click='deleteItemFriendImport(scope.row)')
+19 -6
View File
@@ -33,11 +33,14 @@ mixin groupDialog
.group-header(style='flex: 1') .group-header(style='flex: 1')
span(v-if='groupDialog.ref.ownerId === API.currentUser.id' style='margin-right: 5px') 👑 span(v-if='groupDialog.ref.ownerId === API.currentUser.id' style='margin-right: 5px') 👑
span.dialog-title(v-text='groupDialog.ref.name' style='margin-right: 5px') span.dialog-title(v-text='groupDialog.ref.name' style='margin-right: 5px')
span.group-discriminator.x-grey(style='font-family: monospace; font-size: 12px; margin-right: 5px') {{ groupDialog.ref.shortCode }}.{{ groupDialog.ref.discriminator }} span.group-discriminator.x-grey(
style='font-family: monospace; font-size: 12px; margin-right: 5px') {{ groupDialog.ref.shortCode }}.{{ groupDialog.ref.discriminator }}
el-tooltip(v-for='item in groupDialog.ref.$languages' :key='item.key' placement='top') el-tooltip(v-for='item in groupDialog.ref.$languages' :key='item.key' placement='top')
template(#content) template(#content)
span {{ item.value }} ({{ item.key }}) span {{ item.value }} ({{ item.key }})
span.flags(:class='languageClass(item.key)' style='display: inline-block; margin-right: 5px') span.flags(
:class='languageClass(item.key)'
style='display: inline-block; margin-right: 5px')
div(style='margin-top: 5px') div(style='margin-top: 5px')
span.x-link.x-grey( span.x-link.x-grey(
v-text='groupDialog.ownerDisplayName' v-text='groupDialog.ownerDisplayName'
@@ -218,7 +221,11 @@ mixin groupDialog
circle circle
@click='joinGroup(groupDialog.id)' @click='joinGroup(groupDialog.id)'
style='margin-left: 5px') style='margin-left: 5px')
el-dropdown(trigger='click' @command='groupDialogCommand' size='small' style='margin-left: 5px') el-dropdown(
trigger='click'
@command='groupDialogCommand'
size='small'
style='margin-left: 5px')
el-button( el-button(
:type='groupDialog.ref.membershipStatus === "userblocked" ? "danger" : "default"' :type='groupDialog.ref.membershipStatus === "userblocked" ? "danger" : "default"'
icon='el-icon-more' icon='el-icon-more'
@@ -276,7 +283,9 @@ mixin groupDialog
style='width: 854px; height: 480px' style='width: 854px; height: 480px'
@click='showFullscreenImageDialog(groupDialog.ref.bannerUrl)') @click='showFullscreenImageDialog(groupDialog.ref.bannerUrl)')
.x-friend-list(style='max-height: none') .x-friend-list(style='max-height: none')
span(v-if='groupDialog.instances.length' style='font-size: 12px; font-weight: bold; margin: 5px') {{ $t('dialog.group.info.instances') }} span(
v-if='groupDialog.instances.length'
style='font-size: 12px; font-weight: bold; margin: 5px') {{ $t('dialog.group.info.instances') }}
div(v-for='room in groupDialog.instances' :key='room.tag' style='width: 100%') div(v-for='room in groupDialog.instances' :key='room.tag' style='width: 100%')
div(style='margin: 5px 0') div(style='margin: 5px 0')
location(:location='room.tag') location(:location='room.tag')
@@ -295,7 +304,9 @@ mixin groupDialog
:instance='room.ref' :instance='room.ref'
:friendcount='room.friendCount' :friendcount='room.friendCount'
:updateelement='updateInstanceInfo') :updateelement='updateInstanceInfo')
.x-friend-list(style='margin: 10px 0; padding: 0; max-height: unset' v-if='room.users.length') .x-friend-list(
style='margin: 10px 0; padding: 0; max-height: unset'
v-if='room.users.length')
.x-friend-item.x-friend-item-border( .x-friend-item.x-friend-item-border(
v-for='user in room.users' v-for='user in room.users'
:key='user.id' :key='user.id'
@@ -560,7 +571,9 @@ mixin groupDialog
v-if='groupDialog.memberSearch.length' v-if='groupDialog.memberSearch.length'
style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupDialog.memberSearchResults.length }}/{{ groupDialog.ref.memberCount }} style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupDialog.memberSearchResults.length }}/{{ groupDialog.ref.memberCount }}
span(v-else style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupDialog.members.length }}/{{ groupDialog.ref.memberCount }} span(v-else style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupDialog.members.length }}/{{ groupDialog.ref.memberCount }}
div(v-if='hasGroupPermission(groupDialog.ref, "group-members-manage")' style='float: right') div(
v-if='hasGroupPermission(groupDialog.ref, "group-members-manage")'
style='float: right')
span(style='margin-right: 5px') {{ $t('dialog.group.members.sort_by') }} span(style='margin-right: 5px') {{ $t('dialog.group.members.sort_by') }}
el-dropdown( el-dropdown(
@click.native.stop @click.native.stop
File diff suppressed because it is too large Load Diff
+130 -41
View File
@@ -1,61 +1,150 @@
mixin images() mixin images
//- dialog: Change avatar image //- dialog: Change avatar image
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="changeAvatarImageDialog" :visible.sync="changeAvatarImageDialogVisible" :title="$t('dialog.change_content_image.avatar')" width="850px") el-dialog.x-dialog(
div(v-if="changeAvatarImageDialogVisible" v-loading="changeAvatarImageDialogLoading") :before-close='beforeDialogClose'
input(type="file" accept="image/*" @change="onFileChangeAvatarImage" id="AvatarImageUploadButton" style="display:none") @mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='changeAvatarImageDialog'
:visible.sync='changeAvatarImageDialogVisible'
:title='$t("dialog.change_content_image.avatar")'
width='850px')
div(v-if='changeAvatarImageDialogVisible' v-loading='changeAvatarImageDialogLoading')
input#AvatarImageUploadButton(
type='file'
accept='image/*'
@change='onFileChangeAvatarImage'
style='display: none')
span {{ $t('dialog.change_content_image.description') }} span {{ $t('dialog.change_content_image.description') }}
br br
el-button-group(style="padding-bottom:10px;padding-top:10px") el-button-group(style='padding-bottom: 10px; padding-top: 10px')
el-button(type="default" size="small" @click="displayPreviousImages('Avatar', 'Change')" icon="el-icon-refresh") {{ $t('dialog.change_content_image.refresh') }} el-button(
el-button(type="default" size="small" @click="uploadAvatarImage" icon="el-icon-upload2") {{ $t('dialog.change_content_image.upload') }} type='default'
size='small'
@click='displayPreviousImages("Avatar", "Change")'
icon='el-icon-refresh') {{ $t('dialog.change_content_image.refresh') }}
el-button(type='default' size='small' @click='uploadAvatarImage' icon='el-icon-upload2') {{ $t('dialog.change_content_image.upload') }}
//- el-button(type="default" size="small" @click="deleteAvatarImage" icon="el-icon-delete") Delete Latest Image //- el-button(type="default" size="small" @click="deleteAvatarImage" icon="el-icon-delete") Delete Latest Image
br br
div(style="display:inline-block" v-for="image in previousImagesTable" :key="image.version" v-if="image.file") div(
.x-change-image-item(@click="setAvatarImage(image)" style="cursor:pointer" :class="{ 'current-image': compareCurrentImage(image) }") style='display: inline-block'
img.image(v-lazy="image.file.url") v-for='image in previousImagesTable'
:key='image.version'
v-if='image.file')
.x-change-image-item(
@click='setAvatarImage(image)'
style='cursor: pointer'
:class='{ "current-image": compareCurrentImage(image) }')
img.image(v-lazy='image.file.url')
//- dialog: Change world image //- dialog: Change world image
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="changeWorldImageDialog" :visible.sync="changeWorldImageDialogVisible" :title="$t('dialog.change_content_image.world')" width="850px") el-dialog.x-dialog(
div(v-if="changeWorldImageDialogVisible" v-loading="changeWorldImageDialogLoading") :before-close='beforeDialogClose'
input(type="file" accept="image/*" @change="onFileChangeWorldImage" id="WorldImageUploadButton" style="display:none") @mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='changeWorldImageDialog'
:visible.sync='changeWorldImageDialogVisible'
:title='$t("dialog.change_content_image.world")'
width='850px')
div(v-if='changeWorldImageDialogVisible' v-loading='changeWorldImageDialogLoading')
input#WorldImageUploadButton(
type='file'
accept='image/*'
@change='onFileChangeWorldImage'
style='display: none')
span {{ $t('dialog.change_content_image.description') }} span {{ $t('dialog.change_content_image.description') }}
br br
el-button-group(style="padding-bottom:10px;padding-top:10px") el-button-group(style='padding-bottom: 10px; padding-top: 10px')
el-button(type="default" size="small" @click="displayPreviousImages('World', 'Change')" icon="el-icon-refresh") {{ $t('dialog.change_content_image.refresh') }} el-button(
el-button(type="default" size="small" @click="uploadWorldImage" icon="el-icon-upload2") {{ $t('dialog.change_content_image.upload') }} type='default'
size='small'
@click='displayPreviousImages("World", "Change")'
icon='el-icon-refresh') {{ $t('dialog.change_content_image.refresh') }}
el-button(type='default' size='small' @click='uploadWorldImage' icon='el-icon-upload2') {{ $t('dialog.change_content_image.upload') }}
//- el-button(type="default" size="small" @click="deleteWorldImage" icon="el-icon-delete") Delete Latest Image //- el-button(type="default" size="small" @click="deleteWorldImage" icon="el-icon-delete") Delete Latest Image
br br
div(style="display:inline-block" v-for="image in previousImagesTable" :key="image.version" v-if="image.file") div(
.x-change-image-item(@click="setWorldImage(image)" style="cursor:pointer" :class="{ 'current-image': compareCurrentImage(image) }") style='display: inline-block'
img.image(v-lazy="image.file.url") v-for='image in previousImagesTable'
:key='image.version'
v-if='image.file')
.x-change-image-item(
@click='setWorldImage(image)'
style='cursor: pointer'
:class='{ "current-image": compareCurrentImage(image) }')
img.image(v-lazy='image.file.url')
//- dialog: Display previous avatar/world images //- dialog: Display previous avatar/world images
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="previousImagesDialog" :visible.sync="previousImagesDialogVisible" :title="$t('dialog.previous_images.header')" width="800px") el-dialog.x-dialog(
div(v-if="previousImagesDialogVisible") :before-close='beforeDialogClose'
div(style="display:inline-block" v-for="image in previousImagesTable" :key="image.version" v-if="image.file") @mousedown.native='dialogMouseDown'
el-popover.x-change-image-item(placement="right" width="500px" trigger="click") @mouseup.native='dialogMouseUp'
img.x-link(slot="reference" v-lazy="image.file.url") ref='previousImagesDialog'
img.x-link(v-lazy="image.file.url" style="width:500px;height:375px" @click="showFullscreenImageDialog(image.file.url)") :visible.sync='previousImagesDialogVisible'
:title='$t("dialog.previous_images.header")'
width='800px')
div(v-if='previousImagesDialogVisible')
div(
style='display: inline-block'
v-for='image in previousImagesTable'
:key='image.version'
v-if='image.file')
el-popover.x-change-image-item(placement='right' width='500px' trigger='click')
img.x-link(slot='reference' v-lazy='image.file.url')
img.x-link(
v-lazy='image.file.url'
style='width: 500px; height: 375px'
@click='showFullscreenImageDialog(image.file.url)')
//- dialog: gallery select //- dialog: gallery select
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="gallerySelectDialog" :visible.sync="gallerySelectDialog.visible" :title="$t('dialog.gallery_select.header')" width="100%") el-dialog.x-dialog(
div(v-if="gallerySelectDialog.visible") :before-close='beforeDialogClose'
span(slot="label") {{ $t('dialog.gallery_select.gallery') }} @mousedown.native='dialogMouseDown'
span(style="color:#909399;font-size:12px;margin-left:5px") {{ galleryTable.length }}/64 @mouseup.native='dialogMouseUp'
ref='gallerySelectDialog'
:visible.sync='gallerySelectDialog.visible'
:title='$t("dialog.gallery_select.header")'
width='100%')
div(v-if='gallerySelectDialog.visible')
span(slot='label') {{ $t('dialog.gallery_select.gallery') }}
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ galleryTable.length }}/64
br br
input(type="file" accept="image/*" @change="onFileChangeGallery" id="GalleryUploadButton" style="display:none") input#GalleryUploadButton(type='file' accept='image/*' @change='onFileChangeGallery' style='display: none')
el-button-group el-button-group
el-button(type="default" size="small" @click="selectImageGallerySelect('', '')" icon="el-icon-close") {{ $t('dialog.gallery_select.none') }} el-button(type='default' size='small' @click='selectImageGallerySelect("", "")' icon='el-icon-close') {{ $t('dialog.gallery_select.none') }}
el-button(type="default" size="small" @click="refreshGalleryTable" icon="el-icon-refresh") {{ $t('dialog.gallery_select.refresh') }} el-button(type='default' size='small' @click='refreshGalleryTable' icon='el-icon-refresh') {{ $t('dialog.gallery_select.refresh') }}
el-button(type="default" size="small" @click="displayGalleryUpload" icon="el-icon-upload2" :disabled="!API.currentUser.$isVRCPlus") {{ $t('dialog.gallery_select.upload') }} el-button(
type='default'
size='small'
@click='displayGalleryUpload'
icon='el-icon-upload2'
:disabled='!API.currentUser.$isVRCPlus') {{ $t('dialog.gallery_select.upload') }}
br br
.x-friend-item(v-if="image.versions && image.versions.length > 0" v-for="image in galleryTable" :key="image.id" style="display:inline-block;margin-top:10px;width:unset;cursor:default") .x-friend-item(
.vrcplus-icon(v-if="image.versions[image.versions.length - 1].file.url" @click="selectImageGallerySelect(image.versions[image.versions.length - 1].file.url, image.id)") v-if='image.versions && image.versions.length > 0'
img.avatar(v-lazy="image.versions[image.versions.length - 1].file.url") v-for='image in galleryTable'
:key='image.id'
style='display: inline-block; margin-top: 10px; width: unset; cursor: default')
.vrcplus-icon(
v-if='image.versions[image.versions.length - 1].file.url'
@click='selectImageGallerySelect(image.versions[image.versions.length - 1].file.url, image.id)')
img.avatar(v-lazy='image.versions[image.versions.length - 1].file.url')
//- dialog: full screen image //- dialog: full screen image
el-dialog.x-dialog(ref="fullscreenImageDialog" :before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" :visible.sync="fullscreenImageDialog.visible" top="3vh" width="97vw") el-dialog.x-dialog(
div(style="margin:0 0 5px 5px") ref='fullscreenImageDialog'
el-button(@click="copyImageUrl(fullscreenImageDialog.imageUrl)" size="mini" icon="el-icon-s-order" circle) :before-close='beforeDialogClose'
el-button(type="default" size="mini" icon="el-icon-download" circle @click="downloadAndSaveImage(fullscreenImageDialog.imageUrl, fullscreenImageDialog.fileName)" style="margin-left:5px") @mousedown.native='dialogMouseDown'
img(v-lazy="fullscreenImageDialog.imageUrl" style="width:100%;height:100vh;object-fit:contain") @mouseup.native='dialogMouseUp'
:visible.sync='fullscreenImageDialog.visible'
top='3vh'
width='97vw')
div(style='margin: 0 0 5px 5px')
el-button(@click='copyImageUrl(fullscreenImageDialog.imageUrl)' size='mini' icon='el-icon-s-order' circle)
el-button(
type='default'
size='mini'
icon='el-icon-download'
circle
@click='downloadAndSaveImage(fullscreenImageDialog.imageUrl, fullscreenImageDialog.fileName)'
style='margin-left: 5px')
img(v-lazy='fullscreenImageDialog.imageUrl' style='width: 100%; height: 100vh; object-fit: contain')
+320 -121
View File
@@ -1,118 +1,262 @@
mixin invites() mixin invites
//- dialog: invite //- dialog: invite
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="inviteDialog" :visible.sync="inviteDialog.visible" :title="$t('dialog.invite.header')" width="500px") el-dialog.x-dialog(
div(v-if="inviteDialog.visible" v-loading="inviteDialog.loading") :before-close='beforeDialogClose'
location(:location="inviteDialog.worldId" :link="false") @mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='inviteDialog'
:visible.sync='inviteDialog.visible'
:title='$t("dialog.invite.header")'
width='500px')
div(v-if='inviteDialog.visible' v-loading='inviteDialog.loading')
location(:location='inviteDialog.worldId' :link='false')
br br
el-button(size="mini" v-text="$t('dialog.invite.add_self')" @click="addSelfToInvite" style="margin-top:10px") el-button(
el-button(size="mini" v-text="$t('dialog.invite.add_friends_in_instance')" @click="addFriendsInInstanceToInvite" :disabled="inviteDialog.friendsInInstance.length === 0" style="margin-top:10px") size='mini'
el-button(size="mini" v-text="$t('dialog.invite.add_favorite_friends')" @click="addFavoriteFriendsToInvite" :disabled="vipFriends.length === 0" style="margin-top:10px") v-text='$t("dialog.invite.add_self")'
el-select(v-model="inviteDialog.userIds" multiple clearable :placeholder="$t('dialog.invite.select_placeholder')" filterable :disabled="inviteDialog.loading" style="width:100%;margin-top:15px") @click='addSelfToInvite'
el-option-group(v-if="API.currentUser" :label="$t('side_panel.me')") style='margin-top: 10px')
el-option.x-friend-item(:label="API.currentUser.displayName" :value="API.currentUser.id" style="height:auto") el-button(
.avatar(:class="userStatusClass(API.currentUser)") size='mini'
img(v-lazy="userImage(API.currentUser)") v-text='$t("dialog.invite.add_friends_in_instance")'
@click='addFriendsInInstanceToInvite'
:disabled='inviteDialog.friendsInInstance.length === 0'
style='margin-top: 10px')
el-button(
size='mini'
v-text='$t("dialog.invite.add_favorite_friends")'
@click='addFavoriteFriendsToInvite'
:disabled='vipFriends.length === 0'
style='margin-top: 10px')
el-select(
v-model='inviteDialog.userIds'
multiple
clearable
:placeholder='$t("dialog.invite.select_placeholder")'
filterable
:disabled='inviteDialog.loading'
style='width: 100%; margin-top: 15px')
el-option-group(v-if='API.currentUser' :label='$t("side_panel.me")')
el-option.x-friend-item(
:label='API.currentUser.displayName'
:value='API.currentUser.id'
style='height: auto')
.avatar(:class='userStatusClass(API.currentUser)')
img(v-lazy='userImage(API.currentUser)')
.detail .detail
span.name(v-text="API.currentUser.displayName") span.name(v-text='API.currentUser.displayName')
el-option-group(v-if="inviteDialog.friendsInInstance.length" :label="$t('dialog.invite.friends_in_instance')") el-option-group(
el-option.x-friend-item(v-for="friend in inviteDialog.friendsInInstance" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") v-if='inviteDialog.friendsInInstance.length'
template(v-if="friend.ref") :label='$t("dialog.invite.friends_in_instance")')
.avatar(:class="userStatusClass(friend.ref)") el-option.x-friend-item(
img(v-lazy="userImage(friend.ref)") v-for='friend in inviteDialog.friendsInInstance'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
el-option-group(v-if="vipFriends.length" :label="$t('side_panel.favorite')") el-option-group(v-if='vipFriends.length' :label='$t("side_panel.favorite")')
el-option.x-friend-item(v-for="friend in vipFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in vipFriends'
.avatar(:class="userStatusClass(friend.ref)") :key='friend.id'
img(v-lazy="userImage(friend.ref)") :label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
el-option-group(v-if="onlineFriends.length" :label="$t('side_panel.online')") el-option-group(v-if='onlineFriends.length' :label='$t("side_panel.online")')
el-option.x-friend-item(v-for="friend in onlineFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in onlineFriends'
.avatar(:class="userStatusClass(friend.ref)") :key='friend.id'
img(v-lazy="userImage(friend.ref)") :label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
el-option-group(v-if="activeFriends.length" :label="$t('side_panel.active')") el-option-group(v-if='activeFriends.length' :label='$t("side_panel.active")')
el-option.x-friend-item(v-for="friend in activeFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in activeFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar .avatar
img(v-lazy="userImage(friend.ref)") img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text="friend.id") span(v-else v-text='friend.id')
template(#footer) template(#footer)
el-button(size="small" :disabled="inviteDialog.loading || !inviteDialog.userIds.length" @click="showSendInviteDialog()") {{ $t('dialog.invite.invite_with_message') }} el-button(
el-button(type="primary" size="small" :disabled="inviteDialog.loading || !inviteDialog.userIds.length" @click="sendInvite()") {{ $t('dialog.invite.invite') }} size='small'
:disabled='inviteDialog.loading || !inviteDialog.userIds.length'
@click='showSendInviteDialog()') {{ $t('dialog.invite.invite_with_message') }}
el-button(
type='primary'
size='small'
:disabled='inviteDialog.loading || !inviteDialog.userIds.length'
@click='sendInvite()') {{ $t('dialog.invite.invite') }}
//- dialog: Edit Invite Message //- dialog: Edit Invite Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="editInviteMessageDialog" :visible.sync="editInviteMessageDialog.visible" :title="$t('dialog.edit_invite_message.header')" width="400px") el-dialog.x-dialog(
div(style='font-size:12px') :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='editInviteMessageDialog'
:visible.sync='editInviteMessageDialog.visible'
:title='$t("dialog.edit_invite_message.header")'
width='400px')
div(style='font-size: 12px')
span {{ $t('dialog.edit_invite_message.description') }} span {{ $t('dialog.edit_invite_message.description') }}
el-input(type="textarea" v-model="editInviteMessageDialog.newMessage" size="mini" maxlength="64" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px") el-input(
type='textarea'
v-model='editInviteMessageDialog.newMessage'
size='mini'
maxlength='64'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
placeholder=''
style='margin-top: 10px')
template(#footer) template(#footer)
el-button(type="small" @click="cancelEditInviteMessage") {{ $t('dialog.edit_invite_message.cancel') }} el-button(type='small' @click='cancelEditInviteMessage') {{ $t('dialog.edit_invite_message.cancel') }}
el-button(type="primary" size="small" @click="saveEditInviteMessage") {{ $t('dialog.edit_invite_message.save') }} el-button(type='primary' size='small' @click='saveEditInviteMessage') {{ $t('dialog.edit_invite_message.save') }}
//- dialog: Edit And Send Invite Response Message //- dialog: Edit And Send Invite Response Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="editAndSendInviteResponseDialog" :visible.sync="editAndSendInviteResponseDialog.visible" :title="$t('dialog.edit_send_invite_response_message.header')" width="400px") el-dialog.x-dialog(
div(style='font-size:12px') :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='editAndSendInviteResponseDialog'
:visible.sync='editAndSendInviteResponseDialog.visible'
:title='$t("dialog.edit_send_invite_response_message.header")'
width='400px')
div(style='font-size: 12px')
span {{ $t('dialog.edit_send_invite_response_message.description') }} span {{ $t('dialog.edit_send_invite_response_message.description') }}
el-input(type="textarea" v-model="editAndSendInviteResponseDialog.newMessage" size="mini" maxlength="64" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px") el-input(
type='textarea'
v-model='editAndSendInviteResponseDialog.newMessage'
size='mini'
maxlength='64'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
placeholder=''
style='margin-top: 10px')
template(#footer) template(#footer)
el-button(type="small" @click="cancelEditAndSendInviteResponse") {{ $t('dialog.edit_send_invite_response_message.cancel') }} el-button(type='small' @click='cancelEditAndSendInviteResponse') {{ $t('dialog.edit_send_invite_response_message.cancel') }}
el-button(type="primary" size="small" @click="saveEditAndSendInviteResponse") {{ $t('dialog.edit_send_invite_response_message.send') }} el-button(type='primary' size='small' @click='saveEditAndSendInviteResponse') {{ $t('dialog.edit_send_invite_response_message.send') }}
//- dialog Table: Send Invite Response Message //- dialog Table: Send Invite Response Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendInviteResponseDialog" :visible.sync="sendInviteResponseDialogVisible" :title="$t('dialog.invite_response_message.header')" width="800px") el-dialog.x-dialog(
template(v-if="API.currentUser.$isVRCPlus") :before-close='beforeDialogClose'
input.inviteImageUploadButton(type="file" accept="image/*" @change="inviteImageUpload") @mousedown.native='dialogMouseDown'
data-tables(v-if="sendInviteResponseDialogVisible" v-bind="inviteResponseMessageTable" @row-click="showSendInviteResponseConfirmDialog" style="margin-top:10px;cursor:pointer") @mouseup.native='dialogMouseUp'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") ref='sendInviteResponseDialog'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") :visible.sync='sendInviteResponseDialogVisible'
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") :title='$t("dialog.invite_response_message.header")'
template(#default="scope") width='800px')
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") template(v-if='API.currentUser.$isVRCPlus')
el-table-column(:label="$t('table.profile.invite_messages.action')" width="70" align="right") input.inviteImageUploadButton(type='file' accept='image/*' @change='inviteImageUpload')
template(#default="scope") data-tables(
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditAndSendInviteResponseDialog('response', scope.row)") v-if='sendInviteResponseDialogVisible'
v-bind='inviteResponseMessageTable'
@row-click='showSendInviteResponseConfirmDialog'
style='margin-top: 10px; cursor: pointer')
el-table-column(:label='$t("table.profile.invite_messages.slot")' prop='slot' sortable='custom' width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='70' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditAndSendInviteResponseDialog("response", scope.row)')
template(#footer) template(#footer)
el-button(type="small" @click="cancelSendInviteResponse") {{ $t('dialog.invite_response_message.cancel') }} el-button(type='small' @click='cancelSendInviteResponse') {{ $t('dialog.invite_response_message.cancel') }}
el-button(type="small" @click="API.refreshInviteMessageTableData('response')") {{ $t('dialog.invite_response_message.refresh') }} el-button(type='small' @click='API.refreshInviteMessageTableData("response")') {{ $t('dialog.invite_response_message.refresh') }}
//- dialog Table: Send Invite Request Response Message //- dialog Table: Send Invite Request Response Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendInviteRequestResponseDialog" :visible.sync="sendInviteRequestResponseDialogVisible" :title="$t('dialog.invite_request_response_message.header')" width="800px") el-dialog.x-dialog(
template(v-if="API.currentUser.$isVRCPlus") :before-close='beforeDialogClose'
input.inviteImageUploadButton(type="file" accept="image/*" @change="inviteImageUpload") @mousedown.native='dialogMouseDown'
data-tables(v-if="sendInviteRequestResponseDialogVisible" v-bind="inviteRequestResponseMessageTable" @row-click="showSendInviteResponseConfirmDialog" style="margin-top:10px;cursor:pointer") @mouseup.native='dialogMouseUp'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") ref='sendInviteRequestResponseDialog'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") :visible.sync='sendInviteRequestResponseDialogVisible'
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") :title='$t("dialog.invite_request_response_message.header")'
template(#default="scope") width='800px')
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") template(v-if='API.currentUser.$isVRCPlus')
el-table-column(:label="$t('table.profile.invite_messages.action')" width="70" align="right") input.inviteImageUploadButton(type='file' accept='image/*' @change='inviteImageUpload')
template(#default="scope") data-tables(
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditAndSendInviteResponseDialog('requestResponse', scope.row)") v-if='sendInviteRequestResponseDialogVisible'
v-bind='inviteRequestResponseMessageTable'
@row-click='showSendInviteResponseConfirmDialog'
style='margin-top: 10px; cursor: pointer')
el-table-column(:label='$t("table.profile.invite_messages.slot")' prop='slot' sortable='custom' width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='70' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditAndSendInviteResponseDialog("requestResponse", scope.row)')
template(#footer) template(#footer)
el-button(type="small" @click="cancelSendInviteRequestResponse") {{ $t('dialog.invite_request_response_message.cancel') }} el-button(type='small' @click='cancelSendInviteRequestResponse') {{ $t('dialog.invite_request_response_message.cancel') }}
el-button(type="small" @click="API.refreshInviteMessageTableData('requestResponse')") {{ $t('dialog.invite_request_response_message.refresh') }} el-button(type='small' @click='API.refreshInviteMessageTableData("requestResponse")') {{ $t('dialog.invite_request_response_message.refresh') }}
//- dialog: Send Invite Response Message Confirm //- dialog: Send Invite Response Message Confirm
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendInviteResponseConfirmDialog" :visible.sync="sendInviteResponseConfirmDialog.visible" :title="$t('dialog.invite_response_message.header')" width="400px") el-dialog.x-dialog(
div(style='font-size:12px') :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='sendInviteResponseConfirmDialog'
:visible.sync='sendInviteResponseConfirmDialog.visible'
:title='$t("dialog.invite_response_message.header")'
width='400px')
div(style='font-size: 12px')
span {{ $t('dialog.invite_response_message.confirmation') }} span {{ $t('dialog.invite_response_message.confirmation') }}
template(#footer) template(#footer)
el-button(type="small" @click="cancelInviteResponseConfirm") {{ $t('dialog.invite_response_message.cancel') }} el-button(type='small' @click='cancelInviteResponseConfirm') {{ $t('dialog.invite_response_message.cancel') }}
el-button(type="primary" size="small" @click="sendInviteResponseConfirm") {{ $t('dialog.invite_response_message.confirm') }} el-button(type='primary' size='small' @click='sendInviteResponseConfirm') {{ $t('dialog.invite_response_message.confirm') }}
//- dialog Table: Send Invite Message //- dialog Table: Send Invite Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendInviteDialog" :visible.sync="sendInviteDialogVisible" :title="$t('dialog.invite_message.header')" width="800px") el-dialog.x-dialog(
template(v-if="API.currentUser.$isVRCPlus") :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='sendInviteDialog'
:visible.sync='sendInviteDialogVisible'
:title='$t("dialog.invite_message.header")'
width='800px')
template(v-if='API.currentUser.$isVRCPlus')
//- template(v-if="gallerySelectDialog.selectedFileId") //- template(v-if="gallerySelectDialog.selectedFileId")
//- div(style="display:inline-block;flex:none;margin-right:5px") //- div(style="display:inline-block;flex:none;margin-right:5px")
//- el-popover(placement="right" width="500px" trigger="click") //- el-popover(placement="right" width="500px" trigger="click")
@@ -121,50 +265,105 @@ mixin invites()
//- el-button(size="mini" @click="clearImageGallerySelect" style="vertical-align:top") {{ $t('dialog.invite_message.clear_selected_image') }} //- el-button(size="mini" @click="clearImageGallerySelect" style="vertical-align:top") {{ $t('dialog.invite_message.clear_selected_image') }}
//- template(v-else) //- template(v-else)
//- el-button(size="mini" @click="showGallerySelectDialog" style="margin-right:5px") {{ $t('dialog.invite_message.select_image') }} //- el-button(size="mini" @click="showGallerySelectDialog" style="margin-right:5px") {{ $t('dialog.invite_message.select_image') }}
input.inviteImageUploadButton(type="file" accept="image/*" @change="inviteImageUpload") input.inviteImageUploadButton(type='file' accept='image/*' @change='inviteImageUpload')
data-tables(v-if="sendInviteDialogVisible" v-bind="inviteMessageTable" @row-click="showSendInviteConfirmDialog" style="margin-top:10px;cursor:pointer") data-tables(
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") v-if='sendInviteDialogVisible'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") v-bind='inviteMessageTable'
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") @row-click='showSendInviteConfirmDialog'
template(#default="scope") style='margin-top: 10px; cursor: pointer')
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") el-table-column(:label='$t("table.profile.invite_messages.slot")' prop='slot' sortable='custom' width='70')
el-table-column(:label="$t('table.profile.invite_messages.action')" width="70" align="right") el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
template(#default="scope") el-table-column(
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditAndSendInviteDialog('message', scope.row)") :label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='70' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditAndSendInviteDialog("message", scope.row)')
template(#footer) template(#footer)
el-button(type="small" @click="cancelSendInvite") {{ $t('dialog.invite_message.cancel') }} el-button(type='small' @click='cancelSendInvite') {{ $t('dialog.invite_message.cancel') }}
el-button(type="small" @click="API.refreshInviteMessageTableData('message')") {{ $t('dialog.invite_message.refresh') }} el-button(type='small' @click='API.refreshInviteMessageTableData("message")') {{ $t('dialog.invite_message.refresh') }}
//- dialog Table: Send Invite Request Message //- dialog Table: Send Invite Request Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendInviteRequestDialog" :visible.sync="sendInviteRequestDialogVisible" :title="$t('dialog.invite_request_message.header')" width="800px") el-dialog.x-dialog(
template(v-if="API.currentUser.$isVRCPlus") :before-close='beforeDialogClose'
input.inviteImageUploadButton(type="file" accept="image/*" @change="inviteImageUpload") @mousedown.native='dialogMouseDown'
data-tables(v-if="sendInviteRequestDialogVisible" v-bind="inviteRequestMessageTable" @row-click="showSendInviteConfirmDialog" style="margin-top:10px;cursor:pointer") @mouseup.native='dialogMouseUp'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") ref='sendInviteRequestDialog'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") :visible.sync='sendInviteRequestDialogVisible'
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") :title='$t("dialog.invite_request_message.header")'
template(#default="scope") width='800px')
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") template(v-if='API.currentUser.$isVRCPlus')
el-table-column(:label="$t('table.profile.invite_messages.action')" width="70" align="right") input.inviteImageUploadButton(type='file' accept='image/*' @change='inviteImageUpload')
template(#default="scope") data-tables(
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditAndSendInviteDialog('request', scope.row)") v-if='sendInviteRequestDialogVisible'
v-bind='inviteRequestMessageTable'
@row-click='showSendInviteConfirmDialog'
style='margin-top: 10px; cursor: pointer')
el-table-column(:label='$t("table.profile.invite_messages.slot")' prop='slot' sortable='custom' width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='70' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditAndSendInviteDialog("request", scope.row)')
template(#footer) template(#footer)
el-button(type="small" @click="cancelSendInviteRequest") {{ $t('dialog.invite_request_message.cancel') }} el-button(type='small' @click='cancelSendInviteRequest') {{ $t('dialog.invite_request_message.cancel') }}
el-button(type="small" @click="API.refreshInviteMessageTableData('request')") {{ $t('dialog.invite_request_message.refresh') }} el-button(type='small' @click='API.refreshInviteMessageTableData("request")') {{ $t('dialog.invite_request_message.refresh') }}
//- dialog: Send Invite Message Confirm //- dialog: Send Invite Message Confirm
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="sendInviteConfirmDialog" :visible.sync="sendInviteConfirmDialog.visible" :title="$t('dialog.invite_message.header')" width="400px") el-dialog.x-dialog(
div(style='font-size:12px') :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='sendInviteConfirmDialog'
:visible.sync='sendInviteConfirmDialog.visible'
:title='$t("dialog.invite_message.header")'
width='400px')
div(style='font-size: 12px')
span {{ $t('dialog.invite_message.confirmation') }} span {{ $t('dialog.invite_message.confirmation') }}
template(#footer) template(#footer)
el-button(type="small" @click="cancelInviteConfirm") {{ $t('dialog.invite_message.cancel') }} el-button(type='small' @click='cancelInviteConfirm') {{ $t('dialog.invite_message.cancel') }}
el-button(type="primary" size="small" @click="sendInviteConfirm") {{ $t('dialog.invite_message.confirm') }} el-button(type='primary' size='small' @click='sendInviteConfirm') {{ $t('dialog.invite_message.confirm') }}
//- dialog: Edit And Send Invite Message //- dialog: Edit And Send Invite Message
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="editAndSendInviteDialog" :visible.sync="editAndSendInviteDialog.visible" :title="$t('dialog.edit_send_invite_message.header')" width="400px") el-dialog.x-dialog(
div(style='font-size:12px') :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='editAndSendInviteDialog'
:visible.sync='editAndSendInviteDialog.visible'
:title='$t("dialog.edit_send_invite_message.header")'
width='400px')
div(style='font-size: 12px')
span {{ $t('dialog.edit_send_invite_message.description') }} span {{ $t('dialog.edit_send_invite_message.description') }}
el-input(type="textarea" v-model="editAndSendInviteDialog.newMessage" size="mini" maxlength="64" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px") el-input(
type='textarea'
v-model='editAndSendInviteDialog.newMessage'
size='mini'
maxlength='64'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
placeholder=''
style='margin-top: 10px')
template(#footer) template(#footer)
el-button(type="small" @click="cancelEditAndSendInvite") {{ $t('dialog.edit_send_invite_message.cancel') }} el-button(type='small' @click='cancelEditAndSendInvite') {{ $t('dialog.edit_send_invite_message.cancel') }}
el-button(type="primary" size="small" @click="saveEditAndSendInvite") {{ $t('dialog.edit_send_invite_message.send') }} el-button(type='primary' size='small' @click='saveEditAndSendInvite') {{ $t('dialog.edit_send_invite_message.send') }}
+97 -30
View File
@@ -1,38 +1,105 @@
mixin launch() mixin launch
//- dialog: launch //- dialog: launch
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="launchDialog" :visible.sync="launchDialog.visible" :title="$t('dialog.launch.header')" width="450px") el-dialog.x-dialog(
el-form(:model="launchDialog" label-width="80px") :before-close='beforeDialogClose'
el-form-item(:label="$t('dialog.launch.url')") @mousedown.native='dialogMouseDown'
el-input(v-model="launchDialog.url" size="mini" @click.native="$event.target.tagName === 'INPUT' && $event.target.select()" style="width:260px") @mouseup.native='dialogMouseUp'
el-tooltip(placement="right" :content="$t('dialog.launch.copy_tooltip')" :disabled="hideTooltips") ref='launchDialog'
el-button(@click="copyInstanceMessage(launchDialog.url)" size="mini" icon="el-icon-s-order" style="margin-right:5px" circle) :visible.sync='launchDialog.visible'
el-form-item(v-if="launchDialog.shortUrl" :label="$t('dialog.launch.short_url')") :title='$t("dialog.launch.header")'
el-tooltip(placement="top" style="margin-left:5px" :content="$t('dialog.launch.short_url_notice')") width='450px')
el-form(:model='launchDialog' label-width='80px')
el-form-item(:label='$t("dialog.launch.url")')
el-input(
v-model='launchDialog.url'
size='mini'
@click.native='$event.target.tagName === "INPUT" && $event.target.select()'
style='width: 260px')
el-tooltip(placement='right' :content='$t("dialog.launch.copy_tooltip")' :disabled='hideTooltips')
el-button(
@click='copyInstanceMessage(launchDialog.url)'
size='mini'
icon='el-icon-s-order'
style='margin-right: 5px'
circle)
el-form-item(v-if='launchDialog.shortUrl' :label='$t("dialog.launch.short_url")')
el-tooltip(placement='top' style='margin-left: 5px' :content='$t("dialog.launch.short_url_notice")')
i.el-icon-warning i.el-icon-warning
el-input(v-model="launchDialog.shortUrl" size="mini" @click.native="$event.target.tagName === 'INPUT' && $event.target.select()" style="width:241px") el-input(
el-tooltip(placement="right" :content="$t('dialog.launch.copy_tooltip')" :disabled="hideTooltips") v-model='launchDialog.shortUrl'
el-button(@click="copyInstanceMessage(launchDialog.shortUrl)" size="mini" icon="el-icon-s-order" style="margin-right:5px" circle) size='mini'
el-form-item(:label="$t('dialog.launch.location')") @click.native='$event.target.tagName === "INPUT" && $event.target.select()'
el-input(v-model="launchDialog.location" size="mini" @click.native="$event.target.tagName === 'INPUT' && $event.target.select()" style="width:260px") style='width: 241px')
el-tooltip(placement="right" :content="$t('dialog.launch.copy_tooltip')" :disabled="hideTooltips") el-tooltip(placement='right' :content='$t("dialog.launch.copy_tooltip")' :disabled='hideTooltips')
el-button(@click="copyInstanceMessage(launchDialog.location)" size="mini" icon="el-icon-s-order" style="margin-right:5px" circle) el-button(
@click='copyInstanceMessage(launchDialog.shortUrl)'
size='mini'
icon='el-icon-s-order'
style='margin-right: 5px'
circle)
el-form-item(:label='$t("dialog.launch.location")')
el-input(
v-model='launchDialog.location'
size='mini'
@click.native='$event.target.tagName === "INPUT" && $event.target.select()'
style='width: 260px')
el-tooltip(placement='right' :content='$t("dialog.launch.copy_tooltip")' :disabled='hideTooltips')
el-button(
@click='copyInstanceMessage(launchDialog.location)'
size='mini'
icon='el-icon-s-order'
style='margin-right: 5px'
circle)
template(#footer) template(#footer)
el-checkbox(v-model="launchDialog.desktop" @change="saveLaunchDialog" style="float:left;margin-top:5px") {{ $t('dialog.launch.start_as_desktop') }} el-checkbox(v-model='launchDialog.desktop' @change='saveLaunchDialog' style='float: left; margin-top: 5px') {{ $t('dialog.launch.start_as_desktop') }}
el-button(size="small" @click="showPreviousInstanceInfoDialog(launchDialog.location)") {{ $t('dialog.launch.info') }} el-button(size='small' @click='showPreviousInstanceInfoDialog(launchDialog.location)') {{ $t('dialog.launch.info') }}
el-button(size="small" @click="showInviteDialog(launchDialog.location)" :disabled="!checkCanInvite(launchDialog.location)") {{ $t('dialog.launch.invite') }} el-button(
el-button(type="primary" size="small" @click="launchGame(launchDialog.location, launchDialog.shortName, launchDialog.desktop)" :disabled="!launchDialog.secureOrShortName") {{ $t('dialog.launch.launch') }} size='small'
@click='showInviteDialog(launchDialog.location)'
:disabled='!checkCanInvite(launchDialog.location)') {{ $t('dialog.launch.invite') }}
el-button(
type='primary'
size='small'
@click='launchGame(launchDialog.location, launchDialog.shortName, launchDialog.desktop)'
:disabled='!launchDialog.secureOrShortName') {{ $t('dialog.launch.launch') }}
//- dialog: launch options //- dialog: launch options
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="launchOptionsDialog" :visible.sync="launchOptionsDialog.visible" :title="$t('dialog.launch_options.header')" width="600px") el-dialog.x-dialog(
div(style="font-size:12px") :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='launchOptionsDialog'
:visible.sync='launchOptionsDialog.visible'
:title='$t("dialog.launch_options.header")'
width='600px')
div(style='font-size: 12px')
| {{ $t('dialog.launch_options.description') }} #[br] | {{ $t('dialog.launch_options.description') }} #[br]
| {{ $t('dialog.launch_options.example') }} #[el-tag(size="mini") --fps=144] | {{ $t('dialog.launch_options.example') }} #[el-tag(size='mini') --fps=144]
el-input(type="textarea" v-model="launchOptionsDialog.launchArguments" size="mini" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px") el-input(
div(style="font-size:12px;margin-top:10px") type='textarea'
v-model='launchOptionsDialog.launchArguments'
size='mini'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
placeholder=''
style='margin-top: 10px')
div(style='font-size: 12px; margin-top: 10px')
| {{ $t('dialog.launch_options.path_override') }} | {{ $t('dialog.launch_options.path_override') }}
el-input(type="textarea" v-model="launchOptionsDialog.vrcLaunchPathOverride" placeholder="C:\\Program Files (x86)\\Steam\\steamapps\\common\\VRChat" :rows="1" style="display:block;margin-top:10px") el-input(
type='textarea'
v-model='launchOptionsDialog.vrcLaunchPathOverride'
placeholder='C:\\Program Files (x86)\\Steam\\steamapps\\common\\VRChat'
:rows='1'
style='display: block; margin-top: 10px')
template(#footer) template(#footer)
div(style="display:flex") div(style='display: flex')
el-button(size="small" @click="openExternalLink('https://docs.vrchat.com/docs/launch-options')") {{ $t('dialog.launch_options.vrchat_docs') }} el-button(size='small' @click='openExternalLink("https://docs.vrchat.com/docs/launch-options")') {{ $t('dialog.launch_options.vrchat_docs') }}
el-button(size="small" @click="openExternalLink('https://docs.unity3d.com/Manual/CommandLineArguments.html')") {{ $t('dialog.launch_options.unity_manual') }} el-button(
el-button(type="primary" size="small" :disabled="launchOptionsDialog.loading" @click="updateLaunchOptions" style="margin-left:auto") {{ $t('dialog.launch_options.save') }} size='small'
@click='openExternalLink("https://docs.unity3d.com/Manual/CommandLineArguments.html")') {{ $t('dialog.launch_options.unity_manual') }}
el-button(
type='primary'
size='small'
:disabled='launchOptionsDialog.loading'
@click='updateLaunchOptions'
style='margin-left: auto') {{ $t('dialog.launch_options.save') }}
+272 -128
View File
@@ -1,143 +1,287 @@
mixin newInstance() mixin newInstance
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="newInstanceDialog" :visible.sync="newInstanceDialog.visible" :title="$t('dialog.new_instance.header')" width="650px") el-dialog.x-dialog(
el-tabs(type="card" v-model="newInstanceDialog.selectedTab" @tab-click="newInstanceTabClick") :before-close='beforeDialogClose'
el-tab-pane(:label="$t('dialog.new_instance.normal')") @mousedown.native='dialogMouseDown'
el-form(v-if="newInstanceDialog.visible" :model="newInstanceDialog" label-width="150px") @mouseup.native='dialogMouseUp'
el-form-item(:label="$t('dialog.new_instance.access_type')") ref='newInstanceDialog'
el-radio-group(v-model="newInstanceDialog.accessType" size="mini" @change="buildInstance") :visible.sync='newInstanceDialog.visible'
el-radio-button(label="public") {{ $t('dialog.new_instance.access_type_public') }} :title='$t("dialog.new_instance.header")'
el-radio-button(label="group") {{ $t('dialog.new_instance.access_type_group') }} width='650px')
el-radio-button(label="friends+") {{ $t('dialog.new_instance.access_type_friend_plus') }} el-tabs(type='card' v-model='newInstanceDialog.selectedTab' @tab-click='newInstanceTabClick')
el-radio-button(label="friends") {{ $t('dialog.new_instance.access_type_friend') }} el-tab-pane(:label='$t("dialog.new_instance.normal")')
el-radio-button(label="invite+") {{ $t('dialog.new_instance.access_type_invite_plus') }} el-form(v-if='newInstanceDialog.visible' :model='newInstanceDialog' label-width='150px')
el-radio-button(label="invite") {{ $t('dialog.new_instance.access_type_invite') }} el-form-item(:label='$t("dialog.new_instance.access_type")')
el-form-item(:label="$t('dialog.new_instance.group_access_type')" v-if="newInstanceDialog.accessType === 'group'") el-radio-group(v-model='newInstanceDialog.accessType' size='mini' @change='buildInstance')
el-radio-group(v-model="newInstanceDialog.groupAccessType" size="mini" @change="buildInstance") el-radio-button(label='public') {{ $t('dialog.new_instance.access_type_public') }}
el-radio-button(label="members" :disabled="!hasGroupPermission(newInstanceDialog.groupRef, 'group-instance-open-create')") {{ $t('dialog.new_instance.group_access_type_members') }} el-radio-button(label='group') {{ $t('dialog.new_instance.access_type_group') }}
el-radio-button(label="plus" :disabled="!hasGroupPermission(newInstanceDialog.groupRef, 'group-instance-plus-create')") {{ $t('dialog.new_instance.group_access_type_plus') }} el-radio-button(label='friends+') {{ $t('dialog.new_instance.access_type_friend_plus') }}
el-radio-button(label="public" :disabled="!hasGroupPermission(newInstanceDialog.groupRef, 'group-instance-public-create') || newInstanceDialog.groupRef.privacy === 'private'") {{ $t('dialog.new_instance.group_access_type_public') }} el-radio-button(label='friends') {{ $t('dialog.new_instance.access_type_friend') }}
el-form-item(:label="$t('dialog.new_instance.region')") el-radio-button(label='invite+') {{ $t('dialog.new_instance.access_type_invite_plus') }}
el-radio-group(v-model="newInstanceDialog.region" size="mini" @change="buildInstance") el-radio-button(label='invite') {{ $t('dialog.new_instance.access_type_invite') }}
el-radio-button(label="US West") {{ $t('dialog.new_instance.region_usw') }} el-form-item(
el-radio-button(label="US East") {{ $t('dialog.new_instance.region_use') }} :label='$t("dialog.new_instance.group_access_type")'
el-radio-button(label="Europe") {{ $t('dialog.new_instance.region_eu') }} v-if='newInstanceDialog.accessType === "group"')
el-radio-button(label="Japan") {{ $t('dialog.new_instance.region_jp') }} el-radio-group(v-model='newInstanceDialog.groupAccessType' size='mini' @change='buildInstance')
el-form-item(:label="$t('dialog.new_instance.queueEnabled')" v-if="newInstanceDialog.accessType === 'group'") el-radio-button(
el-checkbox(v-model="newInstanceDialog.queueEnabled" @change="buildInstance") label='members'
el-form-item(:label="$t('dialog.new_instance.ageGate')" v-if="newInstanceDialog.accessType === 'group'") :disabled='!hasGroupPermission(newInstanceDialog.groupRef, "group-instance-open-create")') {{ $t('dialog.new_instance.group_access_type_members') }}
el-checkbox(v-model="newInstanceDialog.ageGate" @change="buildInstance" :disabled="!hasGroupPermission(newInstanceDialog.groupRef, 'group-instance-age-gated-create')") el-radio-button(
el-form-item(:label="$t('dialog.new_instance.world_id')") label='plus'
el-input(v-model="newInstanceDialog.worldId" size="mini" @click.native="$event.target.tagName === 'INPUT' && $event.target.select()" @change="buildInstance") :disabled='!hasGroupPermission(newInstanceDialog.groupRef, "group-instance-plus-create")') {{ $t('dialog.new_instance.group_access_type_plus') }}
el-form-item(:label="$t('dialog.new_instance.group_id')" v-if="newInstanceDialog.accessType === 'group'") el-radio-button(
el-select(v-model="newInstanceDialog.groupId" clearable :placeholder="$t('dialog.new_instance.group_placeholder')" filterable style="width:100%" @change="buildInstance") label='public'
el-option-group(:label="$t('dialog.new_instance.group_placeholder')") :disabled='!hasGroupPermission(newInstanceDialog.groupRef, "group-instance-public-create") || newInstanceDialog.groupRef.privacy === "private"') {{ $t('dialog.new_instance.group_access_type_public') }}
el-option.x-friend-item(v-if="group && (hasGroupPermission(group, 'group-instance-public-create') || hasGroupPermission(group, 'group-instance-plus-create') || hasGroupPermission(group, 'group-instance-open-create'))" v-for="group in API.currentUserGroups.values()" :key="group.id" :label="group.name" :value="group.id" style="height:auto;width:478px") el-form-item(:label='$t("dialog.new_instance.region")')
el-radio-group(v-model='newInstanceDialog.region' size='mini' @change='buildInstance')
el-radio-button(label='US West') {{ $t('dialog.new_instance.region_usw') }}
el-radio-button(label='US East') {{ $t('dialog.new_instance.region_use') }}
el-radio-button(label='Europe') {{ $t('dialog.new_instance.region_eu') }}
el-radio-button(label='Japan') {{ $t('dialog.new_instance.region_jp') }}
el-form-item(
:label='$t("dialog.new_instance.queueEnabled")'
v-if='newInstanceDialog.accessType === "group"')
el-checkbox(v-model='newInstanceDialog.queueEnabled' @change='buildInstance')
el-form-item(
:label='$t("dialog.new_instance.ageGate")'
v-if='newInstanceDialog.accessType === "group"')
el-checkbox(
v-model='newInstanceDialog.ageGate'
@change='buildInstance'
:disabled='!hasGroupPermission(newInstanceDialog.groupRef, "group-instance-age-gated-create")')
el-form-item(:label='$t("dialog.new_instance.world_id")')
el-input(
v-model='newInstanceDialog.worldId'
size='mini'
@click.native='$event.target.tagName === "INPUT" && $event.target.select()'
@change='buildInstance')
el-form-item(
:label='$t("dialog.new_instance.group_id")'
v-if='newInstanceDialog.accessType === "group"')
el-select(
v-model='newInstanceDialog.groupId'
clearable
:placeholder='$t("dialog.new_instance.group_placeholder")'
filterable
style='width: 100%'
@change='buildInstance')
el-option-group(:label='$t("dialog.new_instance.group_placeholder")')
el-option.x-friend-item(
v-if='group && (hasGroupPermission(group, "group-instance-public-create") || hasGroupPermission(group, "group-instance-plus-create") || hasGroupPermission(group, "group-instance-open-create"))'
v-for='group in API.currentUserGroups.values()'
:key='group.id'
:label='group.name'
:value='group.id'
style='height: auto; width: 478px')
.avatar .avatar
img(v-lazy="group.iconUrl") img(v-lazy='group.iconUrl')
.detail .detail
span.name(v-text="group.name") span.name(v-text='group.name')
el-form-item(:label="$t('dialog.new_instance.roles')" v-if="newInstanceDialog.accessType === 'group' && newInstanceDialog.groupAccessType === 'members'") el-form-item(
el-select(v-model="newInstanceDialog.roleIds" multiple clearable :placeholder="$t('dialog.new_instance.role_placeholder')" style="width:100%" @change="buildInstance") :label='$t("dialog.new_instance.roles")'
el-option-group(:label="$t('dialog.new_instance.role_placeholder')") v-if='newInstanceDialog.accessType === "group" && newInstanceDialog.groupAccessType === "members"')
el-option.x-friend-item(v-for="role in newInstanceDialog.selectedGroupRoles" :key="role.id" :label="role.name" :value="role.id" style="height:auto;width:478px") el-select(
v-model='newInstanceDialog.roleIds'
multiple
clearable
:placeholder='$t("dialog.new_instance.role_placeholder")'
style='width: 100%'
@change='buildInstance')
el-option-group(:label='$t("dialog.new_instance.role_placeholder")')
el-option.x-friend-item(
v-for='role in newInstanceDialog.selectedGroupRoles'
:key='role.id'
:label='role.name'
:value='role.id'
style='height: auto; width: 478px')
.detail .detail
span.name(v-text="role.name") span.name(v-text='role.name')
template(v-if="newInstanceDialog.instanceCreated") template(v-if='newInstanceDialog.instanceCreated')
el-form-item(:label="$t('dialog.new_instance.location')") el-form-item(:label='$t("dialog.new_instance.location")')
el-input(v-model="newInstanceDialog.location" size="mini" readonly @click.native="$event.target.tagName === 'INPUT' && $event.target.select()") el-input(
el-form-item(:label="$t('dialog.new_instance.url')") v-model='newInstanceDialog.location'
el-input(v-model="newInstanceDialog.url" size="mini" readonly) size='mini'
el-tab-pane(:label="$t('dialog.new_instance.legacy')") readonly
el-form(v-if="newInstanceDialog.visible" :model="newInstanceDialog" label-width="150px") @click.native='$event.target.tagName === "INPUT" && $event.target.select()')
el-form-item(:label="$t('dialog.new_instance.access_type')") el-form-item(:label='$t("dialog.new_instance.url")')
el-radio-group(v-model="newInstanceDialog.accessType" size="mini" @change="buildLegacyInstance") el-input(v-model='newInstanceDialog.url' size='mini' readonly)
el-radio-button(label="public") {{ $t('dialog.new_instance.access_type_public') }} el-tab-pane(:label='$t("dialog.new_instance.legacy")')
el-radio-button(label="group") {{ $t('dialog.new_instance.access_type_group') }} el-form(v-if='newInstanceDialog.visible' :model='newInstanceDialog' label-width='150px')
el-radio-button(label="friends+") {{ $t('dialog.new_instance.access_type_friend_plus') }} el-form-item(:label='$t("dialog.new_instance.access_type")')
el-radio-button(label="friends") {{ $t('dialog.new_instance.access_type_friend') }} el-radio-group(
el-radio-button(label="invite+") {{ $t('dialog.new_instance.access_type_invite_plus') }} v-model='newInstanceDialog.accessType'
el-radio-button(label="invite") {{ $t('dialog.new_instance.access_type_invite') }} size='mini'
el-form-item(:label="$t('dialog.new_instance.group_access_type')" v-if="newInstanceDialog.accessType === 'group'") @change='buildLegacyInstance')
el-radio-group(v-model="newInstanceDialog.groupAccessType" size="mini" @change="buildLegacyInstance") el-radio-button(label='public') {{ $t('dialog.new_instance.access_type_public') }}
el-radio-button(label="members") {{ $t('dialog.new_instance.group_access_type_members') }} el-radio-button(label='group') {{ $t('dialog.new_instance.access_type_group') }}
el-radio-button(label="plus") {{ $t('dialog.new_instance.group_access_type_plus') }} el-radio-button(label='friends+') {{ $t('dialog.new_instance.access_type_friend_plus') }}
el-radio-button(label="public") {{ $t('dialog.new_instance.group_access_type_public') }} el-radio-button(label='friends') {{ $t('dialog.new_instance.access_type_friend') }}
el-radio-button(label='invite+') {{ $t('dialog.new_instance.access_type_invite_plus') }}
el-radio-button(label='invite') {{ $t('dialog.new_instance.access_type_invite') }}
el-form-item(
:label='$t("dialog.new_instance.group_access_type")'
v-if='newInstanceDialog.accessType === "group"')
el-radio-group(
v-model='newInstanceDialog.groupAccessType'
size='mini'
@change='buildLegacyInstance')
el-radio-button(label='members') {{ $t('dialog.new_instance.group_access_type_members') }}
el-radio-button(label='plus') {{ $t('dialog.new_instance.group_access_type_plus') }}
el-radio-button(label='public') {{ $t('dialog.new_instance.group_access_type_public') }}
//- el-form-item(label="Strict" v-if="newInstanceDialog.accessType === 'friends' || newInstanceDialog.accessType === 'invite'") //- el-form-item(label="Strict" v-if="newInstanceDialog.accessType === 'friends' || newInstanceDialog.accessType === 'invite'")
//- el-checkbox(v-model="newInstanceDialog.strict") Prevent non friends joining via URL/Instance ID //- el-checkbox(v-model="newInstanceDialog.strict") Prevent non friends joining via URL/Instance ID
el-form-item(:label="$t('dialog.new_instance.region')") el-form-item(:label='$t("dialog.new_instance.region")')
el-radio-group(v-model="newInstanceDialog.region" size="mini" @change="buildLegacyInstance") el-radio-group(v-model='newInstanceDialog.region' size='mini' @change='buildLegacyInstance')
el-radio-button(label="US West") {{ $t('dialog.new_instance.region_usw') }} el-radio-button(label='US West') {{ $t('dialog.new_instance.region_usw') }}
el-radio-button(label="US East") {{ $t('dialog.new_instance.region_use') }} el-radio-button(label='US East') {{ $t('dialog.new_instance.region_use') }}
el-radio-button(label="Europe") {{ $t('dialog.new_instance.region_eu') }} el-radio-button(label='Europe') {{ $t('dialog.new_instance.region_eu') }}
el-radio-button(label="Japan") {{ $t('dialog.new_instance.region_jp') }} el-radio-button(label='Japan') {{ $t('dialog.new_instance.region_jp') }}
el-form-item(:label="$t('dialog.new_instance.ageGate')" v-if="newInstanceDialog.accessType === 'group'") el-form-item(
el-checkbox(v-model="newInstanceDialog.ageGate" @change="buildInstance") :label='$t("dialog.new_instance.ageGate")'
el-form-item(:label="$t('dialog.new_instance.world_id')") v-if='newInstanceDialog.accessType === "group"')
el-input(v-model="newInstanceDialog.worldId" size="mini" @click.native="$event.target.tagName === 'INPUT' && $event.target.select()" @change="buildLegacyInstance") el-checkbox(v-model='newInstanceDialog.ageGate' @change='buildInstance')
el-form-item(:label="$t('dialog.new_instance.instance_id')") el-form-item(:label='$t("dialog.new_instance.world_id")')
el-input(v-model="newInstanceDialog.instanceName" :placeholder="$t('dialog.new_instance.instance_id_placeholder')" size="mini" @change="buildLegacyInstance") el-input(
el-form-item(:label="$t('dialog.new_instance.instance_creator')" v-if="newInstanceDialog.accessType !== 'public' && newInstanceDialog.accessType !== 'group'") v-model='newInstanceDialog.worldId'
el-select(v-model="newInstanceDialog.userId" clearable :placeholder="$t('dialog.new_instance.instance_creator_placeholder')" filterable style="width:100%" @change="buildLegacyInstance") size='mini'
el-option-group(v-if="API.currentUser" :label="$t('side_panel.me')") @click.native='$event.target.tagName === "INPUT" && $event.target.select()'
el-option.x-friend-item(:label="API.currentUser.displayName" :value="API.currentUser.id" style="height:auto") @change='buildLegacyInstance')
.avatar(:class="userStatusClass(API.currentUser)") el-form-item(:label='$t("dialog.new_instance.instance_id")')
img(v-lazy="userImage(API.currentUser)") el-input(
v-model='newInstanceDialog.instanceName'
:placeholder='$t("dialog.new_instance.instance_id_placeholder")'
size='mini'
@change='buildLegacyInstance')
el-form-item(
:label='$t("dialog.new_instance.instance_creator")'
v-if='newInstanceDialog.accessType !== "public" && newInstanceDialog.accessType !== "group"')
el-select(
v-model='newInstanceDialog.userId'
clearable
:placeholder='$t("dialog.new_instance.instance_creator_placeholder")'
filterable
style='width: 100%'
@change='buildLegacyInstance')
el-option-group(v-if='API.currentUser' :label='$t("side_panel.me")')
el-option.x-friend-item(
:label='API.currentUser.displayName'
:value='API.currentUser.id'
style='height: auto')
.avatar(:class='userStatusClass(API.currentUser)')
img(v-lazy='userImage(API.currentUser)')
.detail .detail
span.name(v-text="API.currentUser.displayName") span.name(v-text='API.currentUser.displayName')
el-option-group(v-if="vipFriends.length" :label="$t('side_panel.favorite')") el-option-group(v-if='vipFriends.length' :label='$t("side_panel.favorite")')
el-option.x-friend-item(v-for="friend in vipFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") el-option.x-friend-item(
template(v-if="friend.ref") v-for='friend in vipFriends'
.avatar(:class="userStatusClass(friend.ref)") :key='friend.id'
img(v-lazy="userImage(friend.ref)") :label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(
span(v-else v-text="friend.id") v-text='friend.ref.displayName'
el-option-group(v-if="onlineFriends.length" :label="$t('side_panel.online')") :style='{ color: friend.ref.$userColour }')
el-option.x-friend-item(v-for="friend in onlineFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") span(v-else v-text='friend.id')
template(v-if="friend.ref") el-option-group(v-if='onlineFriends.length' :label='$t("side_panel.online")')
.avatar(:class="userStatusClass(friend.ref)") el-option.x-friend-item(
img(v-lazy="userImage(friend.ref)") v-for='friend in onlineFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(
span(v-else v-text="friend.id") v-text='friend.ref.displayName'
el-option-group(v-if="activeFriends.length" :label="$t('side_panel.active')") :style='{ color: friend.ref.$userColour }')
el-option.x-friend-item(v-for="friend in activeFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") span(v-else v-text='friend.id')
template(v-if="friend.ref") el-option-group(v-if='activeFriends.length' :label='$t("side_panel.active")')
el-option.x-friend-item(
v-for='friend in activeFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar .avatar
img(v-lazy="userImage(friend.ref)") img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(
span(v-else v-text="friend.id") v-text='friend.ref.displayName'
el-option-group(v-if="offlineFriends.length" :label="$t('side_panel.offline')") :style='{ color: friend.ref.$userColour }')
el-option.x-friend-item(v-for="friend in offlineFriends" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") span(v-else v-text='friend.id')
template(v-if="friend.ref") el-option-group(v-if='offlineFriends.length' :label='$t("side_panel.offline")')
el-option.x-friend-item(
v-for='friend in offlineFriends'
:key='friend.id'
:label='friend.name'
:value='friend.id'
style='height: auto')
template(v-if='friend.ref')
.avatar .avatar
img(v-lazy="userImage(friend.ref)") img(v-lazy='userImage(friend.ref)')
.detail .detail
span.name(v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}") span.name(
span(v-else v-text="friend.id") v-text='friend.ref.displayName'
el-form-item(:label="$t('dialog.new_instance.group_id')" v-if="newInstanceDialog.accessType === 'group'") :style='{ color: friend.ref.$userColour }')
el-select(v-model="newInstanceDialog.groupId" clearable :placeholder="$t('dialog.new_instance.group_placeholder')" filterable style="width:100%" @change="buildLegacyInstance") span(v-else v-text='friend.id')
el-option-group(:label="$t('dialog.new_instance.group_placeholder')") el-form-item(
el-option.x-friend-item(v-if="group" v-for="group in API.currentUserGroups.values()" :key="group.id" :label="group.name" :value="group.id" style="height:auto;width:478px") :label='$t("dialog.new_instance.group_id")'
v-if='newInstanceDialog.accessType === "group"')
el-select(
v-model='newInstanceDialog.groupId'
clearable
:placeholder='$t("dialog.new_instance.group_placeholder")'
filterable
style='width: 100%'
@change='buildLegacyInstance')
el-option-group(:label='$t("dialog.new_instance.group_placeholder")')
el-option.x-friend-item(
v-if='group'
v-for='group in API.currentUserGroups.values()'
:key='group.id'
:label='group.name'
:value='group.id'
style='height: auto; width: 478px')
.avatar .avatar
img(v-lazy="group.iconUrl") img(v-lazy='group.iconUrl')
.detail .detail
span.name(v-text="group.name") span.name(v-text='group.name')
el-form-item(:label="$t('dialog.new_instance.location')") el-form-item(:label='$t("dialog.new_instance.location")')
el-input(v-model="newInstanceDialog.location" size="mini" readonly @click.native="$event.target.tagName === 'INPUT' && $event.target.select()") el-input(
el-form-item(:label="$t('dialog.new_instance.url')") v-model='newInstanceDialog.location'
el-input(v-model="newInstanceDialog.url" size="mini" readonly) size='mini'
template(#footer v-if="newInstanceDialog.selectedTab === '0'") readonly
template(v-if="newInstanceDialog.instanceCreated") @click.native='$event.target.tagName === "INPUT" && $event.target.select()')
el-button(size="small" @click="copyInstanceUrl(newInstanceDialog.location)") {{ $t('dialog.new_instance.copy_url') }} el-form-item(:label='$t("dialog.new_instance.url")')
el-button(size="small" @click="selfInvite(newInstanceDialog.location)") {{ $t('dialog.new_instance.self_invite') }} el-input(v-model='newInstanceDialog.url' size='mini' readonly)
el-button(size="small" @click="showInviteDialog(newInstanceDialog.location)" :disabled="(newInstanceDialog.accessType === 'friends' || newInstanceDialog.accessType === 'invite') && newInstanceDialog.userId !== API.currentUser.id") {{ $t('dialog.new_instance.invite') }} template(#footer v-if='newInstanceDialog.selectedTab === "0"')
el-button(type="primary" size="small" @click="showLaunchDialog(newInstanceDialog.location, newInstanceDialog.shortName)") {{ $t('dialog.new_instance.launch') }} template(v-if='newInstanceDialog.instanceCreated')
el-button(size='small' @click='copyInstanceUrl(newInstanceDialog.location)') {{ $t('dialog.new_instance.copy_url') }}
el-button(size='small' @click='selfInvite(newInstanceDialog.location)') {{ $t('dialog.new_instance.self_invite') }}
el-button(
size='small'
@click='showInviteDialog(newInstanceDialog.location)'
:disabled='(newInstanceDialog.accessType === "friends" || newInstanceDialog.accessType === "invite") && newInstanceDialog.userId !== API.currentUser.id') {{ $t('dialog.new_instance.invite') }}
el-button(
type='primary'
size='small'
@click='showLaunchDialog(newInstanceDialog.location, newInstanceDialog.shortName)') {{ $t('dialog.new_instance.launch') }}
template(v-else) template(v-else)
el-button(type="primary" size="small" @click="createNewInstance()") {{ $t('dialog.new_instance.create_instance') }} el-button(type='primary' size='small' @click='createNewInstance()') {{ $t('dialog.new_instance.create_instance') }}
template(#footer v-else-if="newInstanceDialog.selectedTab === '1'") template(#footer v-else-if='newInstanceDialog.selectedTab === "1"')
el-button(size="small" @click="copyInstanceUrl(newInstanceDialog.location)") {{ $t('dialog.new_instance.copy_url') }} el-button(size='small' @click='copyInstanceUrl(newInstanceDialog.location)') {{ $t('dialog.new_instance.copy_url') }}
el-button(size="small" @click="selfInvite(newInstanceDialog.location)") {{ $t('dialog.new_instance.self_invite') }} el-button(size='small' @click='selfInvite(newInstanceDialog.location)') {{ $t('dialog.new_instance.self_invite') }}
el-button(size="small" @click="showInviteDialog(newInstanceDialog.location)" :disabled="(newInstanceDialog.accessType === 'friends' || newInstanceDialog.accessType === 'invite') && newInstanceDialog.userId !== API.currentUser.id") {{ $t('dialog.new_instance.invite') }} el-button(
el-button(type="primary" size="small" @click="showLaunchDialog(newInstanceDialog.location, newInstanceDialog.shortName)") {{ $t('dialog.new_instance.launch') }} size='small'
@click='showInviteDialog(newInstanceDialog.location)'
:disabled='(newInstanceDialog.accessType === "friends" || newInstanceDialog.accessType === "invite") && newInstanceDialog.userId !== API.currentUser.id') {{ $t('dialog.new_instance.invite') }}
el-button(
type='primary'
size='small'
@click='showLaunchDialog(newInstanceDialog.location, newInstanceDialog.shortName)') {{ $t('dialog.new_instance.launch') }}
+54 -48
View File
@@ -1,12 +1,18 @@
mixin openSourceSoftwareNotice() mixin openSourceSoftwareNotice
//- dialog: open source software notice //- dialog: open source software notice
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" :visible.sync="ossDialog" :title="$t('dialog.open_source.header')" width="650px") el-dialog.x-dialog(
div(v-if="ossDialog" style="height:350px;overflow:hidden scroll;word-break:break-all") :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
:visible.sync='ossDialog'
:title='$t("dialog.open_source.header")'
width='650px')
div(v-if='ossDialog' style='height: 350px; overflow: hidden scroll; word-break: break-all')
div div
span {{ $t('dialog.open_source.description') }} span {{ $t('dialog.open_source.description') }}
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") animate.css p(style='font-weight: bold') animate.css
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2019 Daniel Eden Copyright (c) 2019 Daniel Eden
@@ -28,9 +34,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") CefSharp p(style='font-weight: bold') CefSharp
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
// Copyright © The CefSharp Authors. All rights reserved. // Copyright © The CefSharp Authors. All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
@@ -61,9 +67,9 @@ mixin openSourceSoftwareNotice()
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") DiscordRichPresence p(style='font-weight: bold') DiscordRichPresence
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
MIT License MIT License
Copyright (c) 2018 Lachee Copyright (c) 2018 Lachee
@@ -85,9 +91,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") element p(style='font-weight: bold') element
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016-present ElemeFE Copyright (c) 2016-present ElemeFE
@@ -109,9 +115,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") librsync.net p(style='font-weight: bold') librsync.net
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015 Brad Dodson Copyright (c) 2015 Brad Dodson
@@ -133,9 +139,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") Newtonsoft.Json p(style='font-weight: bold') Newtonsoft.Json
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2007 James Newton-King Copyright (c) 2007 James Newton-King
@@ -145,9 +151,9 @@ mixin openSourceSoftwareNotice()
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") normalize p(style='font-weight: bold') normalize
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright © Nicolas Gallagher and Jonathan Neal Copyright © Nicolas Gallagher and Jonathan Neal
@@ -157,9 +163,9 @@ mixin openSourceSoftwareNotice()
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") noty p(style='font-weight: bold') noty
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
Copyright (c) 2012 Nedim Arabacı Copyright (c) 2012 Nedim Arabacı
Permission is hereby granted, free of charge, to any person obtaining Permission is hereby granted, free of charge, to any person obtaining
@@ -180,9 +186,9 @@ mixin openSourceSoftwareNotice()
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") OpenVR SDK p(style='font-weight: bold') OpenVR SDK
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
Copyright (c) 2015, Valve Corporation Copyright (c) 2015, Valve Corporation
All rights reserved. All rights reserved.
@@ -210,9 +216,9 @@ mixin openSourceSoftwareNotice()
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") Twemoji p(style='font-weight: bold') Twemoji
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
MIT License MIT License
Copyright (c) 2021 Twitter Copyright (c) 2021 Twitter
@@ -234,9 +240,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") SharpDX p(style='font-weight: bold') SharpDX
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
Copyright (c) 2010-2014 SharpDX - Alexandre Mutel Copyright (c) 2010-2014 SharpDX - Alexandre Mutel
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -256,9 +262,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") vue p(style='font-weight: bold') vue
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2013-present, Yuxi (Evan) You Copyright (c) 2013-present, Yuxi (Evan) You
@@ -280,9 +286,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") vue-data-tables p(style='font-weight: bold') vue-data-tables
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2018 Leon Zhang Copyright (c) 2018 Leon Zhang
@@ -304,9 +310,9 @@ mixin openSourceSoftwareNotice()
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") vue-lazyload p(style='font-weight: bold') vue-lazyload
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2016 Awe Copyright (c) 2016 Awe
@@ -329,9 +335,9 @@ mixin openSourceSoftwareNotice()
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
div(style="margin-top:15px") div(style='margin-top: 15px')
p(style="font-weight:bold") Encode Sans Font (from Dark Vanilla) p(style='font-weight: bold') Encode Sans Font (from Dark Vanilla)
pre(style="font-size:12px;white-space:pre-line"). pre(style='font-size: 12px; white-space: pre-line').
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
Copyright (c) 2020 June 20, Impallari Type, Andres Torresi, Jacques Le Bailly Copyright (c) 2020 June 20, Impallari Type, Andres Torresi, Jacques Le Bailly
(https://fonts.google.com/specimen/Encode+Sans), (https://fonts.google.com/specimen/Encode+Sans),
+79 -42
View File
@@ -1,67 +1,104 @@
mixin tags() mixin tags
//- dialog: Set World Tags //- dialog: Set World Tags
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="setWorldTagsDialog" :visible.sync="setWorldTagsDialog.visible" :title="$t('dialog.set_world_tags.header')" width="400px") el-dialog.x-dialog(
el-checkbox(v-model="setWorldTagsDialog.avatarScalingDisabled") {{ $t('dialog.set_world_tags.avatar_scaling_disabled') }} :before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='setWorldTagsDialog'
:visible.sync='setWorldTagsDialog.visible'
:title='$t("dialog.set_world_tags.header")'
width='400px')
el-checkbox(v-model='setWorldTagsDialog.avatarScalingDisabled') {{ $t('dialog.set_world_tags.avatar_scaling_disabled') }}
br br
el-checkbox(v-model="setWorldTagsDialog.focusViewDisabled") {{ $t('dialog.set_world_tags.focus_view_disabled') }} el-checkbox(v-model='setWorldTagsDialog.focusViewDisabled') {{ $t('dialog.set_world_tags.focus_view_disabled') }}
br br
el-checkbox(v-model="setWorldTagsDialog.stickersDisabled") {{ $t('dialog.set_world_tags.stickers_disabled') }} el-checkbox(v-model='setWorldTagsDialog.stickersDisabled') {{ $t('dialog.set_world_tags.stickers_disabled') }}
br br
el-checkbox(v-model="setWorldTagsDialog.debugAllowed") {{ $t('dialog.set_world_tags.enable_debugging') }} el-checkbox(v-model='setWorldTagsDialog.debugAllowed') {{ $t('dialog.set_world_tags.enable_debugging') }}
div(style='font-size:12px;margin-top:10px') div(style='font-size: 12px; margin-top: 10px')
| {{ $t('dialog.set_world_tags.author_tags') }} #[br] | {{ $t('dialog.set_world_tags.author_tags') }} #[br]
el-input(type="textarea" v-model="setWorldTagsDialog.authorTags" size="mini" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px") el-input(
div(style='font-size:12px;margin-top:10px') type='textarea'
v-model='setWorldTagsDialog.authorTags'
size='mini'
show-word-limit
:autosize='{ minRows: 2, maxRows: 5 }'
placeholder=''
style='margin-top: 10px')
div(style='font-size: 12px; margin-top: 10px')
| {{ $t('dialog.set_world_tags.content_tags') }} #[br] | {{ $t('dialog.set_world_tags.content_tags') }} #[br]
el-checkbox(v-model="setWorldTagsDialog.contentHorror") {{ $t('dialog.set_world_tags.content_horror') }} el-checkbox(v-model='setWorldTagsDialog.contentHorror') {{ $t('dialog.set_world_tags.content_horror') }}
br br
el-checkbox(v-model="setWorldTagsDialog.contentGore") {{ $t('dialog.set_world_tags.content_gore') }} el-checkbox(v-model='setWorldTagsDialog.contentGore') {{ $t('dialog.set_world_tags.content_gore') }}
br br
el-checkbox(v-model="setWorldTagsDialog.contentViolence") {{ $t('dialog.set_world_tags.content_violence') }} el-checkbox(v-model='setWorldTagsDialog.contentViolence') {{ $t('dialog.set_world_tags.content_violence') }}
br br
el-checkbox(v-model="setWorldTagsDialog.contentAdult") {{ $t('dialog.set_world_tags.content_adult') }} el-checkbox(v-model='setWorldTagsDialog.contentAdult') {{ $t('dialog.set_world_tags.content_adult') }}
br br
el-checkbox(v-model="setWorldTagsDialog.contentSex") {{ $t('dialog.set_world_tags.content_sex') }} el-checkbox(v-model='setWorldTagsDialog.contentSex') {{ $t('dialog.set_world_tags.content_sex') }}
//- el-input(type="textarea" v-model="setWorldTagsDialog.contentTags" size="mini" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px") //- el-input(type="textarea" v-model="setWorldTagsDialog.contentTags" size="mini" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="" style="margin-top:10px")
template(#footer) template(#footer)
div(style="display:flex") div(style='display: flex')
el-button(size="small" @click="setWorldTagsDialog.visible = false") {{ $t('dialog.set_world_tags.cancel') }} el-button(size='small' @click='setWorldTagsDialog.visible = false') {{ $t('dialog.set_world_tags.cancel') }}
el-button(type="primary" size="small" @click="saveSetWorldTagsDialog") {{ $t('dialog.set_world_tags.save') }} el-button(type='primary' size='small' @click='saveSetWorldTagsDialog') {{ $t('dialog.set_world_tags.save') }}
//- dialog: Set Avatar Tags //- dialog: Set Avatar Tags
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="setAvatarTagsDialog" :visible.sync="setAvatarTagsDialog.visible" :title="$t('dialog.set_avatar_tags.header')" width="770px") el-dialog.x-dialog(
template(v-if="setAvatarTagsDialog.visible") :before-close='beforeDialogClose'
el-checkbox(v-model="setAvatarTagsDialog.contentHorror" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_horror') }} @mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='setAvatarTagsDialog'
:visible.sync='setAvatarTagsDialog.visible'
:title='$t("dialog.set_avatar_tags.header")'
width='770px')
template(v-if='setAvatarTagsDialog.visible')
el-checkbox(v-model='setAvatarTagsDialog.contentHorror' @change='updateSelectedAvatarTags') {{ $t('dialog.set_avatar_tags.content_horror') }}
br br
el-checkbox(v-model="setAvatarTagsDialog.contentGore" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_gore') }} el-checkbox(v-model='setAvatarTagsDialog.contentGore' @change='updateSelectedAvatarTags') {{ $t('dialog.set_avatar_tags.content_gore') }}
br br
el-checkbox(v-model="setAvatarTagsDialog.contentViolence" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_violence') }} el-checkbox(v-model='setAvatarTagsDialog.contentViolence' @change='updateSelectedAvatarTags') {{ $t('dialog.set_avatar_tags.content_violence') }}
br br
el-checkbox(v-model="setAvatarTagsDialog.contentAdult" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_adult') }} el-checkbox(v-model='setAvatarTagsDialog.contentAdult' @change='updateSelectedAvatarTags') {{ $t('dialog.set_avatar_tags.content_adult') }}
br br
el-checkbox(v-model="setAvatarTagsDialog.contentSex" @change="updateSelectedAvatarTags") {{ $t('dialog.set_avatar_tags.content_sex') }} el-checkbox(v-model='setAvatarTagsDialog.contentSex' @change='updateSelectedAvatarTags') {{ $t('dialog.set_avatar_tags.content_sex') }}
br br
el-input(v-model="setAvatarTagsDialog.selectedTagsCsv" @input="updateInputAvatarTags" size="mini" :autosize="{ minRows:2, maxRows:5 }" :placeholder="$t('dialog.set_avatar_tags.custom_tags_placeholder')" style="margin-top:10px") el-input(
template(v-if="setAvatarTagsDialog.ownAvatars.length === setAvatarTagsDialog.selectedCount") v-model='setAvatarTagsDialog.selectedTagsCsv'
el-button(size="small" @click="setAvatarTagsSelectToggle") {{ $t('dialog.set_avatar_tags.select_none') }} @input='updateInputAvatarTags'
size='mini'
:autosize='{ minRows: 2, maxRows: 5 }'
:placeholder='$t("dialog.set_avatar_tags.custom_tags_placeholder")'
style='margin-top: 10px')
template(v-if='setAvatarTagsDialog.ownAvatars.length === setAvatarTagsDialog.selectedCount')
el-button(size='small' @click='setAvatarTagsSelectToggle') {{ $t('dialog.set_avatar_tags.select_none') }}
template(v-else) template(v-else)
el-button(size="small" @click="setAvatarTagsSelectToggle") {{ $t('dialog.set_avatar_tags.select_all') }} el-button(size='small' @click='setAvatarTagsSelectToggle') {{ $t('dialog.set_avatar_tags.select_all') }}
span(style="margin-left:5px") {{ setAvatarTagsDialog.selectedCount }} / {{ setAvatarTagsDialog.ownAvatars.length }} span(style='margin-left: 5px') {{ setAvatarTagsDialog.selectedCount }} / {{ setAvatarTagsDialog.ownAvatars.length }}
span(v-if="setAvatarTagsDialog.loading" style="margin-left:5px") span(v-if='setAvatarTagsDialog.loading' style='margin-left: 5px')
i.el-icon-loading i.el-icon-loading
br br
.x-friend-list(style="margin-top:10px;min-height:60px;max-height:280px") .x-friend-list(style='margin-top: 10px; min-height: 60px; max-height: 280px')
.x-friend-item(v-for="avatar in setAvatarTagsDialog.ownAvatars" :key="setAvatarTagsDialog.forceUpdate" @click="showAvatarDialog(avatar.id)" class="x-friend-item-border" style="width:350px") .x-friend-item.x-friend-item-border(
v-for='avatar in setAvatarTagsDialog.ownAvatars'
:key='setAvatarTagsDialog.forceUpdate'
@click='showAvatarDialog(avatar.id)'
style='width: 350px')
.avatar .avatar
img(v-if="avatar.thumbnailImageUrl" v-lazy="avatar.thumbnailImageUrl") img(v-if='avatar.thumbnailImageUrl' v-lazy='avatar.thumbnailImageUrl')
.detail .detail
span.name(v-text="avatar.name") span.name(v-text='avatar.name')
span.extra(v-text="avatar.releaseStatus" v-if="avatar.releaseStatus === 'public'" style="color: #67c23a;") span.extra(
span.extra(v-text="avatar.releaseStatus" v-else-if="avatar.releaseStatus === 'private'" style="color: #f56c6c;") v-text='avatar.releaseStatus'
span.extra(v-text="avatar.releaseStatus" v-else) v-if='avatar.releaseStatus === "public"'
span.extra(v-text="avatar.$tagString") style='color: #67c23a')
el-button(type="text" size="mini" @click.stop style="margin-left:5px") span.extra(
el-checkbox(v-model="avatar.$selected" @change="updateAvatarTagsSelection") v-text='avatar.releaseStatus'
v-else-if='avatar.releaseStatus === "private"'
style='color: #f56c6c')
span.extra(v-text='avatar.releaseStatus' v-else)
span.extra(v-text='avatar.$tagString')
el-button(type='text' size='mini' @click.stop style='margin-left: 5px')
el-checkbox(v-model='avatar.$selected' @change='updateAvatarTagsSelection')
template(#footer) template(#footer)
el-button(size="small" @click="setAvatarTagsDialog.visible = false") {{ $t('dialog.set_avatar_tags.cancel') }} el-button(size='small' @click='setAvatarTagsDialog.visible = false') {{ $t('dialog.set_avatar_tags.cancel') }}
el-button(type="primary" size="small" @click="saveSetAvatarTagsDialog") {{ $t('dialog.set_avatar_tags.save') }} el-button(type='primary' size='small' @click='saveSetAvatarTagsDialog') {{ $t('dialog.set_avatar_tags.save') }}
+3 -1
View File
@@ -917,7 +917,9 @@ mixin userDialog
el-tab-pane el-tab-pane
span(slot='label') span(slot='label')
span(v-text='list[0]' style='font-weight: bold; font-size: 16px') span(v-text='list[0]' style='font-weight: bold; font-size: 16px')
i.x-status-icon(style='margin-left: 5px' :class='userFavoriteWorldsStatus(list[1])') i.x-status-icon(
style='margin-left: 5px'
:class='userFavoriteWorldsStatus(list[1])')
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ list[2].length }}/{{ API.favoriteLimits.maxFavoritesPerGroup.world }} span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ list[2].length }}/{{ API.favoriteLimits.maxFavoritesPerGroup.world }}
.x-friend-list(style='margin-top: 10px; margin-bottom: 15px; min-height: 60px') .x-friend-list(style='margin-top: 10px; margin-bottom: 15px; min-height: 60px')
.x-friend-item.x-friend-item-border( .x-friend-item.x-friend-item-border(
+59 -23
View File
@@ -1,33 +1,69 @@
mixin vrcx() mixin vrcx
//- dialog: update VRCX //- dialog: update VRCX
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="VRCXUpdateDialog" :visible.sync="VRCXUpdateDialog.visible" :title="$t('dialog.vrcx_updater.header')" width="400px") el-dialog.x-dialog(
div(v-loading="checkingForVRCXUpdate" style="margin-top:15px") :before-close='beforeDialogClose'
template(v-if="updateInProgress") @mousedown.native='dialogMouseDown'
el-progress(:percentage="updateProgress" :format="updateProgressText") @mouseup.native='dialogMouseUp'
ref='VRCXUpdateDialog'
:visible.sync='VRCXUpdateDialog.visible'
:title='$t("dialog.vrcx_updater.header")'
width='400px')
div(v-loading='checkingForVRCXUpdate' style='margin-top: 15px')
template(v-if='updateInProgress')
el-progress(:percentage='updateProgress' :format='updateProgressText')
br br
template(v-else) template(v-else)
div(v-if="VRCXUpdateDialog.updatePending" style="margin-bottom:15px") div(v-if='VRCXUpdateDialog.updatePending' style='margin-bottom: 15px')
span(v-text="pendingVRCXInstall") span(v-text='pendingVRCXInstall')
br br
span {{ $t('dialog.vrcx_updater.ready_for_update') }} span {{ $t('dialog.vrcx_updater.ready_for_update') }}
el-select(v-model="branch" @change="loadBranchVersions" style="display:inline-block;width:150px;margin-right:15px") el-select(
el-option(v-for="branch in branches" :key="branch.name" :label="branch.name" :value="branch.name") v-model='branch'
el-select(v-model="VRCXUpdateDialog.release" style="display:inline-block;width:150px") @change='loadBranchVersions'
el-option(v-for="item in VRCXUpdateDialog.releases" :key="item.name" :label="item.tag_name" :value="item.name") style='display: inline-block; width: 150px; margin-right: 15px')
div(v-if="!VRCXUpdateDialog.updatePending && VRCXUpdateDialog.release === appVersion" style="margin-top:15px") el-option(v-for='branch in branches' :key='branch.name' :label='branch.name' :value='branch.name')
el-select(v-model='VRCXUpdateDialog.release' style='display: inline-block; width: 150px')
el-option(
v-for='item in VRCXUpdateDialog.releases'
:key='item.name'
:label='item.tag_name'
:value='item.name')
div(
v-if='!VRCXUpdateDialog.updatePending && VRCXUpdateDialog.release === appVersion'
style='margin-top: 15px')
span {{ $t('dialog.vrcx_updater.latest_version') }} span {{ $t('dialog.vrcx_updater.latest_version') }}
template(#footer) template(#footer)
el-button(v-if="updateInProgress" type="primary" size="small" @click="cancelUpdate") {{ $t('dialog.vrcx_updater.cancel') }} el-button(v-if='updateInProgress' type='primary' size='small' @click='cancelUpdate') {{ $t('dialog.vrcx_updater.cancel') }}
el-button(v-if="VRCXUpdateDialog.release !== pendingVRCXInstall" :disabled="updateInProgress" type="primary" size="small" @click="installVRCXUpdate") {{ $t('dialog.vrcx_updater.download') }} el-button(
el-button(v-if="!updateInProgress && pendingVRCXInstall" type="primary" size="small" @click="restartVRCX(true)") {{ $t('dialog.vrcx_updater.install') }} v-if='VRCXUpdateDialog.release !== pendingVRCXInstall'
:disabled='updateInProgress'
type='primary'
size='small'
@click='installVRCXUpdate') {{ $t('dialog.vrcx_updater.download') }}
el-button(
v-if='!updateInProgress && pendingVRCXInstall'
type='primary'
size='small'
@click='restartVRCX(true)') {{ $t('dialog.vrcx_updater.install') }}
//- dialog: change log //- dialog: change log
el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="changeLogDialog" :visible.sync="changeLogDialog.visible" :title="$t('dialog.change_log.header')" width="800px" top="5vh") el-dialog.x-dialog(
.changelog-dialog(v-if="changeLogDialog.visible") :before-close='beforeDialogClose'
h2(v-text="changeLogDialog.buildName") @mousedown.native='dialogMouseDown'
span {{ $t('dialog.change_log.description') }} #[a.x-link(@click="openExternalLink('https://www.patreon.com/Natsumi_VRCX')") Patreon], #[a.x-link(@click="openExternalLink('https://ko-fi.com/natsumi_sama')") Ko-fi]. @mouseup.native='dialogMouseUp'
vue-markdown(:source="changeLogDialog.changeLog" :linkify="false" style="height:62vh;overflow-y:auto;margin-top:10px") ref='changeLogDialog'
:visible.sync='changeLogDialog.visible'
:title='$t("dialog.change_log.header")'
width='800px'
top='5vh')
.changelog-dialog(v-if='changeLogDialog.visible')
h2(v-text='changeLogDialog.buildName')
span {{ $t('dialog.change_log.description') }} #[a.x-link(@click='openExternalLink("https://www.patreon.com/Natsumi_VRCX")') Patreon], #[a.x-link(@click='openExternalLink("https://ko-fi.com/natsumi_sama")') Ko-fi].
vue-markdown(
:source='changeLogDialog.changeLog'
:linkify='false'
style='height: 62vh; overflow-y: auto; margin-top: 10px')
template(#footer) template(#footer)
el-button(type="small" @click="openExternalLink('https://github.com/vrcx-team/VRCX/releases')") {{ $t('dialog.change_log.github') }} el-button(type='small' @click='openExternalLink("https://github.com/vrcx-team/VRCX/releases")') {{ $t('dialog.change_log.github') }}
el-button(type="small" @click="openExternalLink('https://patreon.com/Natsumi_VRCX')") {{ $t('dialog.change_log.donate') }} el-button(type='small' @click='openExternalLink("https://patreon.com/Natsumi_VRCX")') {{ $t('dialog.change_log.donate') }}
el-button(type="small" @click="changeLogDialog.visible = false") {{ $t('dialog.change_log.close') }} el-button(type='small' @click='changeLogDialog.visible = false') {{ $t('dialog.change_log.close') }}
+1 -1
View File
@@ -63,7 +63,7 @@ mixin friendsListSidebar
:traveling='lastLocationDestination' :traveling='lastLocationDestination'
:link='false') :link='false')
location.extra( location.extra(
v-else-if='isRealInstance(API.currentUser.$locationTag) || isRealInstance(API.currentUser.$travelingToLocation)' v-else-if='isRealInstance(API.currentUser.$locationTag) || isRealInstance(API.currentUser.$travelingToLocation)'
:location='API.currentUser.$locationTag' :location='API.currentUser.$locationTag'
:traveling='API.currentUser.$travelingToLocation' :traveling='API.currentUser.$travelingToLocation'
:link='false') :link='false')
+97 -42
View File
@@ -1,49 +1,104 @@
mixin loginPage() mixin loginPage
.x-login-container(v-if="!API.isLoggedIn" v-loading="loginForm.loading") .x-login-container(v-if='!API.isLoggedIn' v-loading='loginForm.loading')
.x-login .x-login
div(style="position:fixed; top: 0; left: 0; margin:5px") div(style='position: fixed; top: 0; left: 0; margin: 5px')
el-tooltip(placement="top" :content="$t('view.login.updater')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.login.updater")' :disabled='hideTooltips')
el-button(type="default" @click="showVRCXUpdateDialog" size="mini" icon="el-icon-download" circle) el-button(type='default' @click='showVRCXUpdateDialog' size='mini' icon='el-icon-download' circle)
el-tooltip(placement="top" :content="$t('view.login.proxy_settings')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.login.proxy_settings")' :disabled='hideTooltips')
el-button(type="default" @click="promptProxySettings" size="mini" icon="el-icon-connection" style="margin-left:5px" circle) el-button(
type='default'
@click='promptProxySettings'
size='mini'
icon='el-icon-connection'
style='margin-left: 5px'
circle)
div.x-login-form-container .x-login-form-container
div div
h2(style="font-weight:bold;text-align:center;margin:0") {{ $t("view.login.login") }} h2(style='font-weight: bold; text-align: center; margin: 0') {{ $t('view.login.login') }}
el-form(ref="loginForm" :model="loginForm" :rules="loginForm.rules" @submit.native.prevent="login()") el-form(
el-form-item(:label="$t('view.login.field.username')" prop="username" required) ref='loginForm'
el-input(v-model="loginForm.username" name="username" :placeholder="$t('view.login.field.username')" clearable) :model='loginForm'
el-form-item(:label="$t('view.login.field.password')" prop="password" required style="margin-top:10px") :rules='loginForm.rules'
el-input(type="password" v-model="loginForm.password" name="password" :placeholder="$t('view.login.field.password')" clearable show-password) @submit.native.prevent='login()')
el-checkbox(v-model="loginForm.saveCredentials" style="margin-top:15px") {{ $t("view.login.field.saveCredentials") }} el-form-item(:label='$t("view.login.field.username")' prop='username' required)
el-checkbox(v-model="enableCustomEndpoint" @change="toggleCustomEndpoint" style="margin-top:10px") {{ $t("view.login.field.devEndpoint") }} el-input(
el-form-item(v-if="enableCustomEndpoint" :label="$t('view.login.field.endpoint')" prop="endpoint" style="margin-top:10px") v-model='loginForm.username'
el-input(v-model="loginForm.endpoint" name="endpoint" :placeholder="API.endpointDomainVrchat" clearable) name='username'
el-form-item(v-if="enableCustomEndpoint" :label="$t('view.login.field.websocket')" prop="endpoint" style="margin-top:10px") :placeholder='$t("view.login.field.username")'
el-input(v-model="loginForm.websocket" name="websocket" :placeholder="API.websocketDomainVrchat" clearable) clearable)
el-form-item(style="margin-top:15px") el-form-item(
el-button(native-type="submit" type="primary" style="width:100%") {{ $t("view.login.login") }} :label='$t("view.login.field.password")'
el-button(type="primary" @click="openExternalLink('https://vrchat.com/register')" style="width:100%") {{ $t("view.login.register") }} prop='password'
required
hr.x-vertical-divider(v-if="Object.keys(loginForm.savedCredentials).length !== 0")/ style='margin-top: 10px')
el-input(
type='password'
v-model='loginForm.password'
name='password'
:placeholder='$t("view.login.field.password")'
clearable
show-password)
el-checkbox(v-model='loginForm.saveCredentials' style='margin-top: 15px') {{ $t('view.login.field.saveCredentials') }}
el-checkbox(
v-model='enableCustomEndpoint'
@change='toggleCustomEndpoint'
style='margin-top: 10px') {{ $t('view.login.field.devEndpoint') }}
el-form-item(
v-if='enableCustomEndpoint'
:label='$t("view.login.field.endpoint")'
prop='endpoint'
style='margin-top: 10px')
el-input(
v-model='loginForm.endpoint'
name='endpoint'
:placeholder='API.endpointDomainVrchat'
clearable)
el-form-item(
v-if='enableCustomEndpoint'
:label='$t("view.login.field.websocket")'
prop='endpoint'
style='margin-top: 10px')
el-input(
v-model='loginForm.websocket'
name='websocket'
:placeholder='API.websocketDomainVrchat'
clearable)
el-form-item(style='margin-top: 15px')
el-button(native-type='submit' type='primary' style='width: 100%') {{ $t('view.login.login') }}
el-button(
type='primary'
@click='openExternalLink("https://vrchat.com/register")'
style='width: 100%') {{ $t('view.login.register') }}
div(v-if="Object.keys(loginForm.savedCredentials).length !== 0") hr.x-vertical-divider(v-if='Object.keys(loginForm.savedCredentials).length !== 0')/
h2(style="font-weight:bold;text-align:center;margin:0") {{ $t("view.login.savedAccounts") }}
.x-scroll-wrapper(style="margin-top:10px") div(v-if='Object.keys(loginForm.savedCredentials).length !== 0')
h2(style='font-weight: bold; text-align: center; margin: 0') {{ $t('view.login.savedAccounts') }}
.x-scroll-wrapper(style='margin-top: 10px')
.x-saved-account-list .x-saved-account-list
.x-friend-item(v-for="user in loginForm.savedCredentials" :key="user.user.id" @click="relogin(user)") .x-friend-item(
v-for='user in loginForm.savedCredentials'
:key='user.user.id'
@click='relogin(user)')
.avatar .avatar
img(v-lazy="userImage(user.user)") img(v-lazy='userImage(user.user)')
.detail .detail
span.name(v-text="user.user.displayName") span.name(v-text='user.user.displayName')
span.extra(v-text="user.user.username") span.extra(v-text='user.user.username')
span.extra(v-text="user.loginParmas.endpoint") span.extra(v-text='user.loginParmas.endpoint')
el-button(type="default" @click.stop="deleteSavedLogin(user.user.id)" size="mini" icon="el-icon-delete" style="margin-left:10px" circle) el-button(
type='default'
div.x-legal-notice-container @click.stop='deleteSavedLogin(user.user.id)'
div(style="text-align:center;font-size:12px") size='mini'
p #[a.x-link(@click="openExternalLink('https://vrchat.com/home/password')") {{ $t("view.login.forgotPassword") }}] icon='el-icon-delete'
p © 2019-2024 #[a.x-link(@click="openExternalLink('https://github.com/pypy-vrc')") pypy] & #[a.x-link(@click="openExternalLink('https://github.com/Natsumi-sama')") Natsumi] style='margin-left: 10px'
p {{ $t("view.settings.general.legal_notice.info") }} circle)
p {{ $t("view.settings.general.legal_notice.disclaimer1") }}
p {{ $t("view.settings.general.legal_notice.disclaimer2") }} .x-legal-notice-container
div(style='text-align: center; font-size: 12px')
p #[a.x-link(@click='openExternalLink("https://vrchat.com/home/password")') {{ $t('view.login.forgotPassword') }}]
p © 2019-2024 #[a.x-link(@click='openExternalLink("https://github.com/pypy-vrc")') pypy] & #[a.x-link(@click='openExternalLink("https://github.com/Natsumi-sama")') Natsumi]
p {{ $t('view.settings.general.legal_notice.info') }}
p {{ $t('view.settings.general.legal_notice.disclaimer1') }}
p {{ $t('view.settings.general.legal_notice.disclaimer2') }}
File diff suppressed because it is too large Load Diff
+165 -97
View File
@@ -1,121 +1,189 @@
mixin feedTab() mixin feedTab
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'feed'") .x-container(v-show='$refs.menu && $refs.menu.activeIndex === \'feed\'')
data-tables(v-bind="feedTable" v-loading="feedTable.loading") data-tables(v-bind='feedTable' v-loading='feedTable.loading')
template(#tool) template(#tool)
div(style="margin:0 0 10px;display:flex;align-items:center") div(style='margin: 0 0 10px; display: flex; align-items: center')
div(style="flex:none;margin-right:10px;display:flex;align-items:center;") div(style='flex: none; margin-right: 10px; display: flex; align-items: center')
el-tooltip(placement="bottom" :content="$t('view.feed.favorites_only_tooltip')" :disabled="hideTooltips") el-tooltip(
el-switch(v-model="feedTable.vip" @change="feedTableLookup" active-color="#13ce66") placement='bottom'
el-select(v-model="feedTable.filter" @change="feedTableLookup" multiple clearable style="flex:1;height:40px;" :placeholder="$t('view.feed.filter_placeholder')") :content='$t("view.feed.favorites_only_tooltip")'
el-option(v-for="type in ['GPS', 'Online', 'Offline', 'Status', 'Avatar', 'Bio']" :key="type" :label="$t('view.feed.filters.' + type)" :value="type") :disabled='hideTooltips')
el-input(v-model="feedTable.search" :placeholder="$t('view.feed.search_placeholder')" @keyup.native.13="feedTableLookup" @change="feedTableLookup" clearable style="flex:none;width:150px;margin:0 10px") el-switch(v-model='feedTable.vip' @change='feedTableLookup' active-color='#13ce66')
el-table-column(type="expand" width="20") el-select(
template(#default="scope") v-model='feedTable.filter'
div(style="position:relative;font-size:14px") @change='feedTableLookup'
template(v-if="scope.row.type === 'GPS'") multiple
location(v-if="scope.row.previousLocation" :location="scope.row.previousLocation") clearable
el-tag(type="info" effect="plain" size="mini" style="margin-left:5px") {{ timeToText(scope.row.time) }} style='flex: 1; height: 40px'
:placeholder='$t("view.feed.filter_placeholder")')
el-option(
v-for='type in ["GPS", "Online", "Offline", "Status", "Avatar", "Bio"]'
:key='type'
:label='$t("view.feed.filters." + type)'
:value='type')
el-input(
v-model='feedTable.search'
:placeholder='$t("view.feed.search_placeholder")'
@keyup.native.13='feedTableLookup'
@change='feedTableLookup'
clearable
style='flex: none; width: 150px; margin: 0 10px')
el-table-column(type='expand' width='20')
template(#default='scope')
div(style='position: relative; font-size: 14px')
template(v-if='scope.row.type === "GPS"')
location(v-if='scope.row.previousLocation' :location='scope.row.previousLocation')
el-tag(type='info' effect='plain' size='mini' style='margin-left: 5px') {{ timeToText(scope.row.time) }}
br br
span(style="margin-right:5px") span(style='margin-right: 5px')
i.el-icon-right i.el-icon-right
location(v-if="scope.row.location" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName") location(
template(v-else-if="scope.row.type === 'Offline'") v-if='scope.row.location'
template(v-if="scope.row.location") :location='scope.row.location'
location(:location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName") :hint='scope.row.worldName'
el-tag(type="info" effect="plain" size="mini" style="margin-left:5px") {{ timeToText(scope.row.time) }} :grouphint='scope.row.groupName')
template(v-else-if="scope.row.type === 'Online'") template(v-else-if='scope.row.type === "Offline"')
location(v-if="scope.row.location" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName") template(v-if='scope.row.location')
template(v-else-if="scope.row.type === 'Avatar'") location(
div(style="display:flex;align-items:center") :location='scope.row.location'
el-popover(placement="right" width="500px" trigger="click") :hint='scope.row.worldName'
div(slot="reference" style="display:inline-block;vertical-align:top;width:160px") :grouphint='scope.row.groupName')
template(v-if="scope.row.previousCurrentAvatarThumbnailImageUrl") el-tag(type='info' effect='plain' size='mini' style='margin-left: 5px') {{ timeToText(scope.row.time) }}
img.x-link(v-lazy="scope.row.previousCurrentAvatarThumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px") template(v-else-if='scope.row.type === "Online"')
location(
v-if='scope.row.location'
:location='scope.row.location'
:hint='scope.row.worldName'
:grouphint='scope.row.groupName')
template(v-else-if='scope.row.type === "Avatar"')
div(style='display: flex; align-items: center')
el-popover(placement='right' width='500px' trigger='click')
div(slot='reference' style='display: inline-block; vertical-align: top; width: 160px')
template(v-if='scope.row.previousCurrentAvatarThumbnailImageUrl')
img.x-link(
v-lazy='scope.row.previousCurrentAvatarThumbnailImageUrl'
style='flex: none; width: 160px; height: 120px; border-radius: 4px')
br br
avatar-info(:imageurl="scope.row.previousCurrentAvatarThumbnailImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.previousOwnerId" :hintavatarname="scope.row.previousAvatarName" :avatartags="scope.row.previousCurrentAvatarTags") avatar-info(
img.x-link(v-lazy="scope.row.previousCurrentAvatarImageUrl" style="width:500px;height:375px" @click="showFullscreenImageDialog(scope.row.previousCurrentAvatarImageUrl)") :imageurl='scope.row.previousCurrentAvatarThumbnailImageUrl'
span(style="position:relative;margin:0 10px") :userid='scope.row.userId'
:hintownerid='scope.row.previousOwnerId'
:hintavatarname='scope.row.previousAvatarName'
:avatartags='scope.row.previousCurrentAvatarTags')
img.x-link(
v-lazy='scope.row.previousCurrentAvatarImageUrl'
style='width: 500px; height: 375px'
@click='showFullscreenImageDialog(scope.row.previousCurrentAvatarImageUrl)')
span(style='position: relative; margin: 0 10px')
i.el-icon-right i.el-icon-right
el-popover(placement="right" width="500px" trigger="click") el-popover(placement='right' width='500px' trigger='click')
div(slot="reference" style="display:inline-block;vertical-align:top;width:160px") div(slot='reference' style='display: inline-block; vertical-align: top; width: 160px')
template(v-if="scope.row.currentAvatarThumbnailImageUrl") template(v-if='scope.row.currentAvatarThumbnailImageUrl')
img.x-link(v-lazy="scope.row.currentAvatarThumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px") img.x-link(
v-lazy='scope.row.currentAvatarThumbnailImageUrl'
style='flex: none; width: 160px; height: 120px; border-radius: 4px')
br br
avatar-info(:imageurl="scope.row.currentAvatarThumbnailImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.ownerId" :hintavatarname="scope.row.avatarName" :avatartags="scope.row.currentAvatarTags") avatar-info(
img.x-link(v-lazy="scope.row.currentAvatarImageUrl" style="width:500px;height:375px" @click="showFullscreenImageDialog(scope.row.currentAvatarImageUrl)") :imageurl='scope.row.currentAvatarThumbnailImageUrl'
template(v-else-if="scope.row.type === 'Status'") :userid='scope.row.userId'
el-tooltip(placement="top") :hintownerid='scope.row.ownerId'
:hintavatarname='scope.row.avatarName'
:avatartags='scope.row.currentAvatarTags')
img.x-link(
v-lazy='scope.row.currentAvatarImageUrl'
style='width: 500px; height: 375px'
@click='showFullscreenImageDialog(scope.row.currentAvatarImageUrl)')
template(v-else-if='scope.row.type === "Status"')
el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.previousStatus === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.previousStatus === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.previousStatus === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.previousStatus === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)") i.x-user-status(:class='statusClass(scope.row.previousStatus)')
span(v-text="scope.row.previousStatusDescription" style="margin-left:5px") span(v-text='scope.row.previousStatusDescription' style='margin-left: 5px')
br br
span span
i.el-icon-right i.el-icon-right
el-tooltip(placement="top") el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.status === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.status === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.status === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.status === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)" style="margin:0 5px") i.x-user-status(:class='statusClass(scope.row.status)' style='margin: 0 5px')
span(v-text="scope.row.statusDescription") span(v-text='scope.row.statusDescription')
template(v-else-if="scope.row.type === 'Bio'") template(v-else-if='scope.row.type === "Bio"')
pre(v-html="formatDifference(scope.row.previousBio, scope.row.bio)" style="font-family:inherit;font-size:12px;white-space:pre-wrap;line-height:25px;line-height: 22px;") pre(
el-table-column(:label="$t('table.feed.date')" prop="created_at" sortable="custom" width="120") v-html='formatDifference(scope.row.previousBio, scope.row.bio)'
template(#default="scope") style='font-family: inherit; font-size: 12px; white-space: pre-wrap; line-height: 25px; line-height: 22px')
el-tooltip(placement="right") el-table-column(:label='$t("table.feed.date")' prop='created_at' sortable='custom' width='120')
template(#default='scope')
el-tooltip(placement='right')
template(#content) template(#content)
span {{ scope.row.created_at | formatDate('long') }} span {{ scope.row.created_at | formatDate('long') }}
span {{ scope.row.created_at | formatDate('short') }} span {{ scope.row.created_at | formatDate('short') }}
el-table-column(:label="$t('table.feed.type')" prop="type" width="80") el-table-column(:label='$t("table.feed.type")' prop='type' width='80')
template(#default="scope") template(#default='scope')
span.x-link(v-text="$t('view.feed.filters.' + scope.row.type)") span.x-link(v-text='$t("view.feed.filters." + scope.row.type)')
el-table-column(:label="$t('table.feed.user')" prop="displayName" width="180") el-table-column(:label='$t("table.feed.user")' prop='displayName' width='180')
template(#default="scope") template(#default='scope')
span.x-link(v-text="scope.row.displayName" @click="showUserDialog(scope.row.userId)" style="padding-right:10px") span.x-link(
el-table-column(:label="$t('table.feed.detail')") v-text='scope.row.displayName'
template(#default="scope") @click='showUserDialog(scope.row.userId)'
template(v-if="scope.row.type === 'GPS'") style='padding-right: 10px')
location(v-if="scope.row.location" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName") el-table-column(:label='$t("table.feed.detail")')
template(v-else-if="scope.row.type === 'Offline' || scope.row.type === 'Online'") template(#default='scope')
location(v-if="scope.row.location" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName") template(v-if='scope.row.type === "GPS"')
template(v-else-if="scope.row.type === 'Status'") location(
template(v-if="scope.row.statusDescription === scope.row.previousStatusDescription") v-if='scope.row.location'
el-tooltip(placement="top") :location='scope.row.location'
:hint='scope.row.worldName'
:grouphint='scope.row.groupName')
template(v-else-if='scope.row.type === "Offline" || scope.row.type === "Online"')
location(
v-if='scope.row.location'
:location='scope.row.location'
:hint='scope.row.worldName'
:grouphint='scope.row.groupName')
template(v-else-if='scope.row.type === "Status"')
template(v-if='scope.row.statusDescription === scope.row.previousStatusDescription')
el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.previousStatus === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.previousStatus === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.previousStatus === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.previousStatus === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)") i.x-user-status(:class='statusClass(scope.row.previousStatus)')
span(style="margin:0 5px") span(style='margin: 0 5px')
i.el-icon-right i.el-icon-right
el-tooltip(placement="top") el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.status === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.status === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.status === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.status === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)") i.x-user-status(:class='statusClass(scope.row.status)')
template(v-else) template(v-else)
el-tooltip(placement="top") el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.status === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.status === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.status === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.status === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)" style="margin-right:3px") i.x-user-status(:class='statusClass(scope.row.status)' style='margin-right: 3px')
span(v-text="scope.row.statusDescription") span(v-text='scope.row.statusDescription')
template(v-else-if="scope.row.type === 'Avatar'") template(v-else-if='scope.row.type === "Avatar"')
avatar-info(:imageurl="scope.row.currentAvatarImageUrl" :userid="scope.row.userId" :hintownerid="scope.row.ownerId" :hintavatarname="scope.row.avatarName" :avatartags="scope.row.currentAvatarTags") avatar-info(
template(v-else-if="scope.row.type === 'Bio'") :imageurl='scope.row.currentAvatarImageUrl'
span(v-text="scope.row.bio") :userid='scope.row.userId'
:hintownerid='scope.row.ownerId'
:hintavatarname='scope.row.avatarName'
:avatartags='scope.row.currentAvatarTags')
template(v-else-if='scope.row.type === "Bio"')
span(v-text='scope.row.bio')
+184 -73
View File
@@ -1,85 +1,196 @@
mixin friendsListTab() mixin friendsListTab
.x-container(v-if="$refs.menu && $refs.menu.activeIndex === 'friendsList'") .x-container(v-if='$refs.menu && $refs.menu.activeIndex === "friendsList"')
div.options-container(style="margin-top:0") .options-container(style='margin-top: 0')
span.header {{ $t('view.friend_list.header') }} span.header {{ $t('view.friend_list.header') }}
div(style="float:right;font-size:13px") div(style='float: right; font-size: 13px')
div(v-if="friendsListBulkUnfriendMode" style="display:inline-block;margin-right:10px") div(v-if='friendsListBulkUnfriendMode' style='display: inline-block; margin-right: 10px')
el-button(size="small" @click="showBulkUnfriendSelectionConfirm") {{ $t('view.friend_list.bulk_unfriend_selection') }} el-button(size='small' @click='showBulkUnfriendSelectionConfirm') {{ $t('view.friend_list.bulk_unfriend_selection') }}
//- el-button(size="small" @click="showBulkUnfriendAllConfirm" style="margin-right:5px") Bulk Unfriend All //- el-button(size="small" @click="showBulkUnfriendAllConfirm" style="margin-right:5px") Bulk Unfriend All
div(style="display:inline-block;margin-right:10px") div(style='display: inline-block; margin-right: 10px')
span.name {{ $t('view.friend_list.bulk_unfriend') }} span.name {{ $t('view.friend_list.bulk_unfriend') }}
el-switch(@change="toggleFriendsListBulkUnfriendMode" v-model="friendsListBulkUnfriendMode" style="margin-left:5px") el-switch(
@change='toggleFriendsListBulkUnfriendMode'
v-model='friendsListBulkUnfriendMode'
style='margin-left: 5px')
span {{ $t('view.friend_list.load') }} span {{ $t('view.friend_list.load') }}
template(v-if="friendsListLoading") template(v-if='friendsListLoading')
span(v-text="friendsListLoadingProgress" style="margin-left:5px") span(v-text='friendsListLoadingProgress' style='margin-left: 5px')
el-tooltip(placement="top" :content="$t('view.friend_list.cancel_tooltip')" :disabled="hideTooltips") el-tooltip(
el-button(@click="friendsListLoading = false" size="mini" icon="el-icon-loading" circle style="margin-left:5px") placement='top'
:content='$t("view.friend_list.cancel_tooltip")'
:disabled='hideTooltips')
el-button(
@click='friendsListLoading = false'
size='mini'
icon='el-icon-loading'
circle
style='margin-left: 5px')
template(v-else) template(v-else)
el-tooltip(placement="top" :content="$t('view.friend_list.load_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.friend_list.load_tooltip")' :disabled='hideTooltips')
el-button(@click="friendsListLoadUsers" size="mini" icon="el-icon-refresh-left" circle style="margin-left:5px") el-button(
div(style="margin:10px 0 0 10px;display:flex;align-items:center") @click='friendsListLoadUsers'
div(style="flex:none;margin-right:10px;display:flex;align-items:center;") size='mini'
el-tooltip(placement="bottom" :content="$t('view.friend_list.favorites_only_tooltip')" :disabled="hideTooltips") icon='el-icon-refresh-left'
el-switch(v-model="friendsListSearchFilterVIP" @change="friendsListSearchChange" active-color="#13ce66") circle
el-input(v-model="friendsListSearch" :placeholder="$t('view.friend_list.search_placeholder')" @change="friendsListSearchChange" clearable style="flex:1") style='margin-left: 5px')
el-select(v-model="friendsListSearchFilters" multiple clearable collapse-tags style="flex:none;width:200px;margin:0 10px" @change="friendsListSearchChange" :placeholder="$t('view.friend_list.filter_placeholder')") div(style='margin: 10px 0 0 10px; display: flex; align-items: center')
el-option(v-for="type in ['Display Name', 'User Name', 'Rank', 'Status', 'Bio', 'Memo']" :key="type" :label="type" :value="type") div(style='flex: none; margin-right: 10px; display: flex; align-items: center')
el-tooltip(placement="top" :content="$t('view.friend_list.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(
el-button(type="default" @click="friendsListSearchChange" icon="el-icon-refresh" circle style="flex:none") placement='bottom'
el-tooltip(placement="top" :content="$t('view.friend_list.clear_tooltip')" :disabled="hideTooltips") :content='$t("view.friend_list.favorites_only_tooltip")'
el-button(type="default" @click="friendsListTable.data = []" icon="el-icon-delete" circle style="flex:none;margin-left:5px") :disabled='hideTooltips')
data-tables(v-bind="friendsListTable" @row-click="selectFriendsListRow" style="margin-top:10px;cursor:pointer") el-switch(
el-table-column(width="55" prop="$selected" v-if="friendsListBulkUnfriendMode" :key="friendsListBulkUnfriendForceUpdate") v-model='friendsListSearchFilterVIP'
template(#default="scope") @change='friendsListSearchChange'
el-button(type="text" size="mini" @click.stop) active-color='#13ce66')
el-checkbox(v-model="scope.row.$selected" @change="friendsListBulkUnfriendForceUpdate++") el-input(
el-table-column(:label="$t('table.friendList.no')" width="70" prop="$friendNumber" sortable="custom") v-model='friendsListSearch'
template(#default="scope") :placeholder='$t("view.friend_list.search_placeholder")'
@change='friendsListSearchChange'
clearable
style='flex: 1')
el-select(
v-model='friendsListSearchFilters'
multiple
clearable
collapse-tags
style='flex: none; width: 200px; margin: 0 10px'
@change='friendsListSearchChange'
:placeholder='$t("view.friend_list.filter_placeholder")')
el-option(
v-for='type in ["Display Name", "User Name", "Rank", "Status", "Bio", "Memo"]'
:key='type'
:label='type'
:value='type')
el-tooltip(placement='top' :content='$t("view.friend_list.refresh_tooltip")' :disabled='hideTooltips')
el-button(
type='default'
@click='friendsListSearchChange'
icon='el-icon-refresh'
circle
style='flex: none')
el-tooltip(placement='top' :content='$t("view.friend_list.clear_tooltip")' :disabled='hideTooltips')
el-button(
type='default'
@click='friendsListTable.data = []'
icon='el-icon-delete'
circle
style='flex: none; margin-left: 5px')
data-tables(
v-bind='friendsListTable'
@row-click='selectFriendsListRow'
style='margin-top: 10px; cursor: pointer')
el-table-column(
width='55'
prop='$selected'
v-if='friendsListBulkUnfriendMode'
:key='friendsListBulkUnfriendForceUpdate')
template(#default='scope')
el-button(type='text' size='mini' @click.stop)
el-checkbox(v-model='scope.row.$selected' @change='friendsListBulkUnfriendForceUpdate++')
el-table-column(:label='$t("table.friendList.no")' width='70' prop='$friendNumber' sortable='custom')
template(#default='scope')
span {{ scope.row.$friendNumber ? scope.row.$friendNumber : '' }} span {{ scope.row.$friendNumber ? scope.row.$friendNumber : '' }}
el-table-column(:label="$t('table.friendList.avatar')" width="70" prop="photo") el-table-column(:label='$t("table.friendList.avatar")' width='70' prop='photo')
template(#default="scope") template(#default='scope')
el-popover(placement="right" height="500px" trigger="hover") el-popover(placement='right' height='500px' trigger='hover')
img.friends-list-avatar(slot="reference" v-lazy="userImage(scope.row)") img.friends-list-avatar(slot='reference' v-lazy='userImage(scope.row)')
img.friends-list-avatar(v-lazy="userImageFull(scope.row)" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(userImageFull(scope.row))") img.friends-list-avatar(
el-table-column(:label="$t('table.friendList.displayName')" min-width="140" prop="displayName" sortable :sort-method="(a, b) => sortAlphabetically(a, b, 'displayName')") v-lazy='userImageFull(scope.row)'
template(#default="scope") style='height: 500px; cursor: pointer'
span.name(v-if="randomUserColours" v-text="scope.row.displayName" :style="{'color':scope.row.$userColour}") @click='showFullscreenImageDialog(userImageFull(scope.row))')
span.name(v-else v-text="scope.row.displayName") el-table-column(
el-table-column(:label="$t('table.friendList.rank')" width="110" prop="$trustSortNum" sortable="custom") :label='$t("table.friendList.displayName")'
template(#default="scope") min-width='140'
span.name(v-if="randomUserColours" v-text="scope.row.$trustLevel" :class="scope.row.$trustClass") prop='displayName'
span.name(v-else v-text="scope.row.$trustLevel" :style="{'color':scope.row.$userColour}") sortable
el-table-column(:label="$t('table.friendList.status')" min-width="180" prop="status" sortable :sort-method="(a, b) => sortStatus(a.status, b.status)") :sort-method='(a, b) => sortAlphabetically(a, b, "displayName")')
template(#default="scope") template(#default='scope')
i.x-user-status(v-if="scope.row.status !== 'offline'" :class="statusClass(scope.row.status)") span.name(
span v-if='randomUserColours'
span(v-text="scope.row.statusDescription") v-text='scope.row.displayName'
el-table-column(:label="$t('table.friendList.language')" width="110" prop="$languages" sortable :sort-method="(a, b) => sortLanguages(a, b)") :style='{ color: scope.row.$userColour }')
template(#default="scope") span.name(v-else v-text='scope.row.displayName')
el-tooltip(v-for="item in scope.row.$languages" :key="item.key" placement="top") el-table-column(
:label='$t("table.friendList.rank")'
width='110'
prop='$trustSortNum'
sortable='custom')
template(#default='scope')
span.name(
v-if='randomUserColours'
v-text='scope.row.$trustLevel'
:class='scope.row.$trustClass')
span.name(v-else v-text='scope.row.$trustLevel' :style='{ color: scope.row.$userColour }')
el-table-column(
:label='$t("table.friendList.status")'
min-width='180'
prop='status'
sortable
:sort-method='(a, b) => sortStatus(a.status, b.status)')
template(#default='scope')
i.x-user-status(v-if='scope.row.status !== "offline"' :class='statusClass(scope.row.status)')
span
span(v-text='scope.row.statusDescription')
el-table-column(
:label='$t("table.friendList.language")'
width='110'
prop='$languages'
sortable
:sort-method='(a, b) => sortLanguages(a, b)')
template(#default='scope')
el-tooltip(v-for='item in scope.row.$languages' :key='item.key' placement='top')
template(#content) template(#content)
span {{ item.value }} ({{ item.key }}) span {{ item.value }} ({{ item.key }})
span.flags(:class="languageClass(item.key)" style="display:inline-block;margin-right:5px") span.flags(:class='languageClass(item.key)' style='display: inline-block; margin-right: 5px')
el-table-column(:label="$t('table.friendList.bioLink')" width="100" prop="bioLinks") el-table-column(:label='$t("table.friendList.bioLink")' width='100' prop='bioLinks')
template(#default="scope") template(#default='scope')
el-tooltip(v-if="link" v-for="(link, index) in scope.row.bioLinks" :key="index") el-tooltip(v-if='link' v-for='(link, index) in scope.row.bioLinks' :key='index')
template(#content) template(#content)
span(v-text="link") span(v-text='link')
img(:src="getFaviconUrl(link)" style="width:16px;height:16px;vertical-align:middle;margin-right:5px;cursor:pointer" @click.stop="openExternalLink(link)") img(
el-table-column(:label="$t('table.friendList.joinCount')" width="120" prop="$joinCount" sortable) :src='getFaviconUrl(link)'
el-table-column(:label="$t('table.friendList.timeTogether')" width="140" prop="$timeSpent" sortable) style='width: 16px; height: 16px; vertical-align: middle; margin-right: 5px; cursor: pointer'
template(#default="scope") @click.stop='openExternalLink(link)')
span(v-if="scope.row.$timeSpent") {{ timeToText(scope.row.$timeSpent) }} el-table-column(:label='$t("table.friendList.joinCount")' width='120' prop='$joinCount' sortable)
el-table-column(:label="$t('table.friendList.lastSeen')" width="170" prop="$lastSeen" sortable :sort-method="(a, b) => sortAlphabetically(a, b, '$lastSeen')") el-table-column(:label='$t("table.friendList.timeTogether")' width='140' prop='$timeSpent' sortable)
template(#default="scope") template(#default='scope')
span(v-if='scope.row.$timeSpent') {{ timeToText(scope.row.$timeSpent) }}
el-table-column(
:label='$t("table.friendList.lastSeen")'
width='170'
prop='$lastSeen'
sortable
:sort-method='(a, b) => sortAlphabetically(a, b, "$lastSeen")')
template(#default='scope')
span {{ scope.row.$lastSeen | formatDate('long') }} span {{ scope.row.$lastSeen | formatDate('long') }}
el-table-column(:label="$t('table.friendList.lastActivity')" width="170" prop="last_activity" sortable :sort-method="(a, b) => sortAlphabetically(a, b, 'last_activity')") el-table-column(
template(#default="scope") :label='$t("table.friendList.lastActivity")'
width='170'
prop='last_activity'
sortable
:sort-method='(a, b) => sortAlphabetically(a, b, "last_activity")')
template(#default='scope')
span {{ scope.row.last_activity | formatDate('long') }} span {{ scope.row.last_activity | formatDate('long') }}
el-table-column(:label="$t('table.friendList.lastLogin')" width="170" prop="last_login" sortable :sort-method="(a, b) => sortAlphabetically(a, b, 'last_login')") el-table-column(
template(#default="scope") :label='$t("table.friendList.lastLogin")'
width='170'
prop='last_login'
sortable
:sort-method='(a, b) => sortAlphabetically(a, b, "last_login")')
template(#default='scope')
span {{ scope.row.last_login | formatDate('long') }} span {{ scope.row.last_login | formatDate('long') }}
el-table-column(:label="$t('table.friendList.dateJoined')" width="120" prop="date_joined" sortable :sort-method="(a, b) => sortAlphabetically(a, b, 'date_joined')") el-table-column(
el-table-column(:label="$t('table.friendList.unfriend')" width="100" align="center") :label='$t("table.friendList.dateJoined")'
template(#default="scope") width='120'
el-button(type="text" icon="el-icon-close" style="color:#f56c6c" size="mini" @click.stop="confirmDeleteFriend(scope.row.id)") prop='date_joined'
sortable
:sort-method='(a, b) => sortAlphabetically(a, b, "date_joined")')
el-table-column(:label='$t("table.friendList.unfriend")' width='100' align='center')
template(#default='scope')
el-button(
type='text'
icon='el-icon-close'
style='color: #f56c6c'
size='mini'
@click.stop='confirmDeleteFriend(scope.row.id)')
+106 -51
View File
@@ -1,57 +1,112 @@
mixin gameLogTab() mixin gameLogTab
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'gameLog'") .x-container(v-show='$refs.menu && $refs.menu.activeIndex === \'gameLog\'')
data-tables(v-bind="gameLogTable" v-loading="gameLogTable.loading") data-tables(v-bind='gameLogTable' v-loading='gameLogTable.loading')
template(#tool) template(#tool)
div(style="margin:0 0 10px;display:flex;align-items:center") div(style='margin: 0 0 10px; display: flex; align-items: center')
div(style="flex:none;margin-right:10px;display:flex;align-items:center;") div(style='flex: none; margin-right: 10px; display: flex; align-items: center')
el-tooltip(placement="bottom" :content="$t('view.feed.favorites_only_tooltip')" :disabled="hideTooltips") el-tooltip(
el-switch(v-model="gameLogTable.vip" @change="gameLogTableLookup" active-color="#13ce66") placement='bottom'
el-select(v-model="gameLogTable.filter" @change="gameLogTableLookup" multiple clearable style="flex:1" :placeholder="$t('view.game_log.filter_placeholder')") :content='$t("view.feed.favorites_only_tooltip")'
el-option(v-for="type in ['Location', 'OnPlayerJoined', 'OnPlayerLeft', 'PortalSpawn', 'VideoPlay', 'Event', 'External', 'StringLoad', 'ImageLoad']" :key="type" :label="$t('view.game_log.filters.' + type)" :value="type") :disabled='hideTooltips')
el-input(v-model="gameLogTable.search" :placeholder="$t('view.game_log.search_placeholder')" @keyup.native.13="gameLogTableLookup" @change="gameLogTableLookup" clearable style="flex:none;width:150px;margin:0 10px") el-switch(v-model='gameLogTable.vip' @change='gameLogTableLookup' active-color='#13ce66')
el-table-column(:label="$t('table.gameLog.date')" prop="created_at" sortable="custom" width="120") el-select(
template(#default="scope") v-model='gameLogTable.filter'
el-tooltip(placement="right") @change='gameLogTableLookup'
multiple
clearable
style='flex: 1'
:placeholder='$t("view.game_log.filter_placeholder")')
el-option(
v-for='type in ["Location", "OnPlayerJoined", "OnPlayerLeft", "PortalSpawn", "VideoPlay", "Event", "External", "StringLoad", "ImageLoad"]'
:key='type'
:label='$t("view.game_log.filters." + type)'
:value='type')
el-input(
v-model='gameLogTable.search'
:placeholder='$t("view.game_log.search_placeholder")'
@keyup.native.13='gameLogTableLookup'
@change='gameLogTableLookup'
clearable
style='flex: none; width: 150px; margin: 0 10px')
el-table-column(:label='$t("table.gameLog.date")' prop='created_at' sortable='custom' width='120')
template(#default='scope')
el-tooltip(placement='right')
template(#content) template(#content)
span {{ scope.row.created_at | formatDate('long') }} span {{ scope.row.created_at | formatDate('long') }}
span {{ scope.row.created_at | formatDate('short') }} span {{ scope.row.created_at | formatDate('short') }}
el-table-column(:label="$t('table.gameLog.type')" prop="type" width="120") el-table-column(:label='$t("table.gameLog.type")' prop='type' width='120')
template(#default="scope") template(#default='scope')
span.x-link(v-if="scope.row.location && scope.row.type !== 'Location'" v-text="$t('view.game_log.filters.' + scope.row.type)" @click="showWorldDialog(scope.row.location)") span.x-link(
span(v-else v-text="$t('view.game_log.filters.' + scope.row.type)") v-if='scope.row.location && scope.row.type !== "Location"'
el-table-column(:label="$t('table.gameLog.icon')" prop="isFriend" width="70" align="center") v-text='$t("view.game_log.filters." + scope.row.type)'
template(#default="scope") @click='showWorldDialog(scope.row.location)')
template(v-if="gameLogIsFriend(scope.row)") span(v-else v-text='$t("view.game_log.filters." + scope.row.type)')
el-tooltip(v-if="gameLogIsFavorite(scope.row)" placement="top" content="Favorite") el-table-column(:label='$t("table.gameLog.icon")' prop='isFriend' width='70' align='center')
template(#default='scope')
template(v-if='gameLogIsFriend(scope.row)')
el-tooltip(v-if='gameLogIsFavorite(scope.row)' placement='top' content='Favorite')
span ⭐ span ⭐
el-tooltip(v-else placement="top" content="Friend") el-tooltip(v-else placement='top' content='Friend')
span 💚 span 💚
el-table-column(:label="$t('table.gameLog.user')" prop="displayName" width="180") el-table-column(:label='$t("table.gameLog.user")' prop='displayName' width='180')
template(#default="scope") template(#default='scope')
span.x-link(v-if="scope.row.displayName" v-text="scope.row.displayName" @click="lookupUser(scope.row)" style="padding-right:10px") span.x-link(
el-table-column(:label="$t('table.gameLog.detail')" prop="data") v-if='scope.row.displayName'
template(#default="scope") v-text='scope.row.displayName'
location(v-if="scope.row.type === 'Location'" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName") @click='lookupUser(scope.row)'
location(v-else-if="scope.row.type === 'PortalSpawn'" :location="scope.row.instanceId" :hint="scope.row.worldName" :grouphint="scope.row.groupName") style='padding-right: 10px')
template(v-else-if="scope.row.type === 'Event'") el-table-column(:label='$t("table.gameLog.detail")' prop='data')
span(v-text="scope.row.data") template(#default='scope')
template(v-else-if="scope.row.type === 'External'") location(
span(v-text="scope.row.message") v-if='scope.row.type === "Location"'
template(v-else-if="scope.row.type === 'VideoPlay'") :location='scope.row.location'
span(v-if="scope.row.videoId" style="margin-right:5px") {{ scope.row.videoId }}: :hint='scope.row.worldName'
span(v-if="scope.row.videoId === 'LSMedia'" v-text="scope.row.videoName") :grouphint='scope.row.groupName')
span.x-link(v-else-if="scope.row.videoName" @click="openExternalLink(scope.row.videoUrl)" v-text="scope.row.videoName") location(
span.x-link(v-else @click="openExternalLink(scope.row.videoUrl)" v-text="scope.row.videoUrl") v-else-if='scope.row.type === "PortalSpawn"'
template(v-else-if="scope.row.type === 'ImageLoad'") :location='scope.row.instanceId'
span.x-link(@click="openExternalLink(scope.row.resourceUrl)" v-text="scope.row.resourceUrl") :hint='scope.row.worldName'
template(v-else-if="scope.row.type === 'StringLoad'") :grouphint='scope.row.groupName')
span.x-link(@click="openExternalLink(scope.row.resourceUrl)" v-text="scope.row.resourceUrl") template(v-else-if='scope.row.type === "Event"')
template(v-else-if="scope.row.type === 'Notification' || scope.row.type === 'OnPlayerJoined' || scope.row.type === 'OnPlayerLeft'") span(v-text='scope.row.data')
span.x-link(v-else v-text="scope.row.data") template(v-else-if='scope.row.type === "External"')
el-table-column(:label="$t('table.gameLog.action')" width="80" align="right") span(v-text='scope.row.message')
template(#default="scope") template(v-else-if='scope.row.type === "VideoPlay"')
template(v-if="scope.row.type !== 'OnPlayerJoined' && scope.row.type !== 'OnPlayerLeft' && scope.row.type !== 'Location' && scope.row.type !== 'PortalSpawn'") span(v-if='scope.row.videoId' style='margin-right: 5px') {{ scope.row.videoId }}:
el-button(v-if="shiftHeld" style="color:#f56c6c" type="text" icon="el-icon-close" size="mini" @click="deleteGameLogEntry(scope.row)") span(v-if='scope.row.videoId === "LSMedia"' v-text='scope.row.videoName')
el-button(v-else type="text" icon="el-icon-delete" size="mini" @click="deleteGameLogEntryPrompt(scope.row)") span.x-link(
el-tooltip(placement="top" content="Open Instance Info" :disabled="hideTooltips") v-else-if='scope.row.videoName'
el-button(v-if="scope.row.type === 'Location'" type="text" icon="el-icon-tickets" size="mini" @click="showPreviousInstanceInfoDialog(scope.row.location)") @click='openExternalLink(scope.row.videoUrl)'
v-text='scope.row.videoName')
span.x-link(v-else @click='openExternalLink(scope.row.videoUrl)' v-text='scope.row.videoUrl')
template(v-else-if='scope.row.type === "ImageLoad"')
span.x-link(@click='openExternalLink(scope.row.resourceUrl)' v-text='scope.row.resourceUrl')
template(v-else-if='scope.row.type === "StringLoad"')
span.x-link(@click='openExternalLink(scope.row.resourceUrl)' v-text='scope.row.resourceUrl')
template(
v-else-if='scope.row.type === "Notification" || scope.row.type === "OnPlayerJoined" || scope.row.type === "OnPlayerLeft"')
span.x-link(v-else v-text='scope.row.data')
el-table-column(:label='$t("table.gameLog.action")' width='80' align='right')
template(#default='scope')
template(
v-if='scope.row.type !== "OnPlayerJoined" && scope.row.type !== "OnPlayerLeft" && scope.row.type !== "Location" && scope.row.type !== "PortalSpawn"')
el-button(
v-if='shiftHeld'
style='color: #f56c6c'
type='text'
icon='el-icon-close'
size='mini'
@click='deleteGameLogEntry(scope.row)')
el-button(
v-else
type='text'
icon='el-icon-delete'
size='mini'
@click='deleteGameLogEntryPrompt(scope.row)')
el-tooltip(placement='top' content='Open Instance Info' :disabled='hideTooltips')
el-button(
v-if='scope.row.type === "Location"'
type='text'
icon='el-icon-tickets'
size='mini'
@click='showPreviousInstanceInfoDialog(scope.row.location)')
+257 -88
View File
@@ -1,95 +1,264 @@
mixin notificationsTab() mixin notificationsTab
.x-container(v-if="$refs.menu && $refs.menu.activeIndex === 'notification'" v-loading="API.isNotificationsLoading") .x-container(v-if='$refs.menu && $refs.menu.activeIndex === "notification"' v-loading='API.isNotificationsLoading')
data-tables(v-bind="notificationTable" ref="notificationTableRef" class="notification-table") data-tables.notification-table(v-bind='notificationTable' ref='notificationTableRef')
template(#tool) template(#tool)
div(style="margin:0 0 10px;display:flex;align-items:center") div(style='margin: 0 0 10px; display: flex; align-items: center')
el-select(v-model="notificationTable.filters[0].value" @change="saveTableFilters" multiple clearable style="flex:1" :placeholder="$t('view.notification.filter_placeholder')") el-select(
el-option(v-for="type in ['requestInvite', 'invite', 'requestInviteResponse', 'inviteResponse', 'friendRequest', 'ignoredFriendRequest', 'message', 'boop', 'groupChange', 'group.announcement', 'group.informative', 'group.invite', 'group.joinRequest', 'group.transfer', 'group.queueReady', 'moderation.warning.group', 'moderation.report.closed', 'instance.closed']" :key="type" :label="$t('view.notification.filters.' + type)" :value="type") v-model='notificationTable.filters[0].value'
el-input(v-model="notificationTable.filters[1].value" :placeholder="$t('view.notification.search_placeholder')" style="flex:none;width:150px;margin:0 10px") @change='saveTableFilters'
el-tooltip(placement="bottom" :content="$t('view.notification.refresh_tooltip')" :disabled="hideTooltips") multiple
el-button(type="default" :loading="API.isNotificationsLoading" @click="API.refreshNotifications()" icon="el-icon-refresh" circle style="flex:none") clearable
el-table-column(:label="$t('table.notification.date')" prop="created_at" sortable="custom" width="120") style='flex: 1'
template(#default="scope") :placeholder='$t("view.notification.filter_placeholder")')
el-tooltip(placement="right") el-option(
v-for='type in ["requestInvite", "invite", "requestInviteResponse", "inviteResponse", "friendRequest", "ignoredFriendRequest", "message", "boop", "groupChange", "group.announcement", "group.informative", "group.invite", "group.joinRequest", "group.transfer", "group.queueReady", "moderation.warning.group", "moderation.report.closed", "instance.closed"]'
:key='type'
:label='$t("view.notification.filters." + type)'
:value='type')
el-input(
v-model='notificationTable.filters[1].value'
:placeholder='$t("view.notification.search_placeholder")'
style='flex: none; width: 150px; margin: 0 10px')
el-tooltip(
placement='bottom'
:content='$t("view.notification.refresh_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
:loading='API.isNotificationsLoading'
@click='API.refreshNotifications()'
icon='el-icon-refresh'
circle
style='flex: none')
el-table-column(:label='$t("table.notification.date")' prop='created_at' sortable='custom' width='120')
template(#default='scope')
el-tooltip(placement='right')
template(#content) template(#content)
span {{ scope.row.created_at | formatDate('long') }} span {{ scope.row.created_at | formatDate('long') }}
span {{ scope.row.created_at | formatDate('short') }} span {{ scope.row.created_at | formatDate('short') }}
el-table-column(:label="$t('table.notification.type')" prop="type" width="180") el-table-column(:label='$t("table.notification.type")' prop='type' width='180')
template(#default="scope") template(#default='scope')
el-tooltip(v-if="scope.row.type === 'invite'" placement="top") el-tooltip(v-if='scope.row.type === "invite"' placement='top')
template(#content) template(#content)
location(v-if="scope.row.details" :location="scope.row.details.worldId" :hint="scope.row.details.worldName" :grouphint="scope.row.details.groupName" :link="false") location(
span.x-link(v-text="$t('view.notification.filters.' + scope.row.type)" @click="showWorldDialog(scope.row.details.worldId)") v-if='scope.row.details'
el-tooltip(v-else-if="scope.row.type === 'group.queueReady' || scope.row.type === 'instance.closed'" placement="top") :location='scope.row.details.worldId'
:hint='scope.row.details.worldName'
:grouphint='scope.row.details.groupName'
:link='false')
span.x-link(
v-text='$t("view.notification.filters." + scope.row.type)'
@click='showWorldDialog(scope.row.details.worldId)')
el-tooltip(
v-else-if='scope.row.type === "group.queueReady" || scope.row.type === "instance.closed"'
placement='top')
template(#content) template(#content)
location(v-if="scope.row.location" :location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName" :link="false") location(
span.x-link(v-text="$t('view.notification.filters.' + scope.row.type)" @click="showWorldDialog(scope.row.location)") v-if='scope.row.location'
el-tooltip(v-else-if="scope.row.link" placement="top" :content="scope.row.linkText" :disabled="hideTooltips") :location='scope.row.location'
span.x-link(v-text="$t('view.notification.filters.' + scope.row.type)" @click="openNotificationLink(scope.row.link)") :hint='scope.row.worldName'
span(v-else v-text="$t('view.notification.filters.' + scope.row.type)") :grouphint='scope.row.groupName'
el-table-column(:label="$t('table.notification.user_group')" prop="senderUsername" width="150") :link='false')
template(#default="scope") span.x-link(
template(v-if="scope.row.type === 'groupChange'") v-text='$t("view.notification.filters." + scope.row.type)'
span.x-link(v-text="scope.row.senderUsername" @click="showGroupDialog(scope.row.senderUserId)") @click='showWorldDialog(scope.row.location)')
template(v-else-if="scope.row.senderUserId") el-tooltip(
span.x-link(v-text="scope.row.senderUsername" @click="showUserDialog(scope.row.senderUserId)") v-else-if='scope.row.link'
template(v-else-if="scope.row.link && scope.row.data?.groupName") placement='top'
span.x-link(v-text="scope.row.data?.groupName" @click="openNotificationLink(scope.row.link)") :content='scope.row.linkText'
template(v-else-if="scope.row.link") :disabled='hideTooltips')
span.x-link(v-text="scope.row.linkText" @click="openNotificationLink(scope.row.link)") span.x-link(
el-table-column(:label="$t('table.notification.photo')" width="100" prop="photo") v-text='$t("view.notification.filters." + scope.row.type)'
template(#default="scope") @click='openNotificationLink(scope.row.link)')
template(v-if="scope.row.details && scope.row.details.imageUrl") span(v-else v-text='$t("view.notification.filters." + scope.row.type)')
el-popover(placement="right" width="500px" trigger="click") el-table-column(:label='$t("table.notification.user_group")' prop='senderUsername' width='150')
img.x-link(slot="reference" v-lazy="scope.row.details.imageUrl" style="flex:none;height:50px;border-radius:4px") template(#default='scope')
img.x-link(v-lazy="scope.row.details.imageUrl" style="width:500px" @click="showFullscreenImageDialog(scope.row.details.imageUrl)") template(v-if='scope.row.type === "groupChange"')
template(v-else-if="scope.row.imageUrl") span.x-link(v-text='scope.row.senderUsername' @click='showGroupDialog(scope.row.senderUserId)')
el-popover(placement="right" width="500px" trigger="click") template(v-else-if='scope.row.senderUserId')
img.x-link(slot="reference" v-lazy="scope.row.imageUrl" style="flex:none;height:50px;border-radius:4px") span.x-link(v-text='scope.row.senderUsername' @click='showUserDialog(scope.row.senderUserId)')
img.x-link(v-lazy="scope.row.imageUrl" style="width:500px" @click="showFullscreenImageDialog(scope.row.imageUrl)") template(v-else-if='scope.row.link && scope.row.data?.groupName')
el-table-column(:label="$t('table.notification.message')" prop="message") span.x-link(v-text='scope.row.data?.groupName' @click='openNotificationLink(scope.row.link)')
template(#default="scope") template(v-else-if='scope.row.link')
span.x-link(v-if="scope.row.type === 'invite'") span.x-link(v-text='scope.row.linkText' @click='openNotificationLink(scope.row.link)')
location(v-if="scope.row.details" :location="scope.row.details.worldId" :hint="scope.row.details.worldName" :grouphint="scope.row.details.groupName" :link="true") el-table-column(:label='$t("table.notification.photo")' width='100' prop='photo')
template(#default='scope')
template(v-if='scope.row.details && scope.row.details.imageUrl')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='scope.row.details.imageUrl'
style='flex: none; height: 50px; border-radius: 4px')
img.x-link(
v-lazy='scope.row.details.imageUrl'
style='width: 500px'
@click='showFullscreenImageDialog(scope.row.details.imageUrl)')
template(v-else-if='scope.row.imageUrl')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='scope.row.imageUrl'
style='flex: none; height: 50px; border-radius: 4px')
img.x-link(
v-lazy='scope.row.imageUrl'
style='width: 500px'
@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"')
location(
v-if='scope.row.details'
:location='scope.row.details.worldId'
:hint='scope.row.details.worldName'
:grouphint='scope.row.details.groupName'
:link='true')
br br
span(v-if="scope.row.message && scope.row.message !== `This is a generated invite to ${scope.row.details?.worldName}`" v-text="scope.row.message") span(
span(v-else-if='scope.row.details && scope.row.details.inviteMessage' v-text="scope.row.details.inviteMessage") v-if='scope.row.message && scope.row.message !== `This is a generated invite to ${scope.row.details?.worldName}`'
span(v-else-if='scope.row.details && scope.row.details.requestMessage' v-text="scope.row.details.requestMessage") v-text='scope.row.message')
span(v-else-if='scope.row.details && scope.row.details.responseMessage' v-text="scope.row.details.responseMessage") span(
el-table-column(:label="$t('table.notification.action')" width="100" align="right") v-else-if='scope.row.details && scope.row.details.inviteMessage'
template(#default="scope") v-text='scope.row.details.inviteMessage')
template(v-if="scope.row.senderUserId !== API.currentUser.id && !scope.row.$isExpired") span(
template(v-if="scope.row.type === 'friendRequest'") v-else-if='scope.row.details && scope.row.details.requestMessage'
el-tooltip(placement="top" content="Accept" :disabled="hideTooltips") v-text='scope.row.details.requestMessage')
el-button(type="text" icon="el-icon-check" style="color:#67c23a" size="mini" @click="acceptFriendRequestNotification(scope.row)") span(
template(v-else-if="scope.row.type === 'invite'") v-else-if='scope.row.details && scope.row.details.responseMessage'
el-tooltip(placement="top" content="Decline with message" :disabled="hideTooltips") v-text='scope.row.details.responseMessage')
el-button(type="text" icon="el-icon-chat-line-square" size="mini" @click="showSendInviteResponseDialog(scope.row)") el-table-column(:label='$t("table.notification.action")' width='100' align='right')
template(v-else-if="scope.row.type === 'requestInvite'") template(#default='scope')
template(v-if="lastLocation.location && isGameRunning && checkCanInvite(lastLocation.location)") template(v-if='scope.row.senderUserId !== API.currentUser.id && !scope.row.$isExpired')
el-tooltip(placement="top" content="Invite" :disabled="hideTooltips") template(v-if='scope.row.type === "friendRequest"')
el-button(type="text" icon="el-icon-check" style="color:#67c23a" size="mini" @click="acceptRequestInvite(scope.row)") el-tooltip(placement='top' content='Accept' :disabled='hideTooltips')
el-tooltip(placement="top" content="Decline with message" :disabled="hideTooltips") el-button(
el-button(type="text" icon="el-icon-chat-line-square" size="mini" style="margin-left:5px" @click="showSendInviteRequestResponseDialog(scope.row)") type='text'
template(v-if="scope.row.responses") icon='el-icon-check'
template(v-for="response in scope.row.responses") style='color: #67c23a'
el-tooltip(placement="top" :content="response.text" :disabled="hideTooltips") size='mini'
el-button(v-if="response.icon === 'check'" type="text" icon="el-icon-check" size="mini" style="margin-left:5px" @click="sendNotificationResponse(scope.row.id, scope.row.responses, response.type)") @click='acceptFriendRequestNotification(scope.row)')
el-button(v-else-if="response.icon === 'cancel'" type="text" icon="el-icon-close" size="mini" style="margin-left:5px" @click="sendNotificationResponse(scope.row.id, scope.row.responses, response.type)") template(v-else-if='scope.row.type === "invite"')
el-button(v-else-if="response.icon === 'ban'" type="text" icon="el-icon-circle-close" size="mini" style="margin-left:5px" @click="sendNotificationResponse(scope.row.id, scope.row.responses, response.type)") el-tooltip(placement='top' content='Decline with message' :disabled='hideTooltips')
el-button(v-else-if="response.icon === 'bell-slash'" type="text" icon="el-icon-bell" size="mini" style="margin-left:5px" @click="sendNotificationResponse(scope.row.id, scope.row.responses, response.type)") el-button(
el-button(v-else-if="response.icon === 'reply' && scope.row.type === 'boop'" type="text" icon="el-icon-chat-line-square" size="mini" style="margin-left:5px" @click="showSendBoopDialog(scope.row.senderUserId)") type='text'
el-button(v-else-if="response.icon === 'reply'" type="text" icon="el-icon-chat-line-square" size="mini" style="margin-left:5px" @click="sendNotificationResponse(scope.row.id, scope.row.responses, response.type)") icon='el-icon-chat-line-square'
el-button(v-else type="text" icon="el-icon-collection-tag" size="mini" style="margin-left:5px" @click="sendNotificationResponse(scope.row.id, scope.row.responses, response.type)") size='mini'
template(v-if="scope.row.type !== 'requestInviteResponse' && scope.row.type !== 'inviteResponse' && scope.row.type !== 'message' && scope.row.type !== 'boop' && scope.row.type !== 'groupChange' && !scope.row.type.includes('group.') && !scope.row.type.includes('moderation.') && !scope.row.type.includes('instance.')") @click='showSendInviteResponseDialog(scope.row)')
el-tooltip(placement="top" content="Decline" :disabled="hideTooltips") template(v-else-if='scope.row.type === "requestInvite"')
el-button(v-if="shiftHeld" style="color:#f56c6c;margin-left:5px" type="text" icon="el-icon-close" size="mini" @click="hideNotification(scope.row)") template(
el-button(v-else type="text" icon="el-icon-close" size="mini" style="margin-left:5px" @click="hideNotificationPrompt(scope.row)") v-if='lastLocation.location && isGameRunning && checkCanInvite(lastLocation.location)')
template(v-if="scope.row.type === 'group.queueReady'") el-tooltip(placement='top' content='Invite' :disabled='hideTooltips')
el-tooltip(placement="top" content="Delete log" :disabled="hideTooltips") el-button(
el-button(v-if="shiftHeld" style="color:#f56c6c;margin-left:5px" type="text" icon="el-icon-close" size="mini" @click="deleteNotificationLog(scope.row)") type='text'
el-button(v-else type="text" icon="el-icon-delete" size="mini" style="margin-left:5px" @click="deleteNotificationLogPrompt(scope.row)") icon='el-icon-check'
template(v-if="scope.row.type !== 'friendRequest' && scope.row.type !== 'ignoredFriendRequest' && !scope.row.type.includes('group.') && !scope.row.type.includes('moderation.')") style='color: #67c23a'
el-tooltip(placement="top" content="Delete log" :disabled="hideTooltips") size='mini'
el-button(v-if="shiftHeld" style="color:#f56c6c;margin-left:5px" type="text" icon="el-icon-close" size="mini" @click="deleteNotificationLog(scope.row)") @click='acceptRequestInvite(scope.row)')
el-button(v-else type="text" icon="el-icon-delete" size="mini" style="margin-left:5px" @click="deleteNotificationLogPrompt(scope.row)") el-tooltip(placement='top' content='Decline with message' :disabled='hideTooltips')
el-button(
type='text'
icon='el-icon-chat-line-square'
size='mini'
style='margin-left: 5px'
@click='showSendInviteRequestResponseDialog(scope.row)')
template(v-if='scope.row.responses')
template(v-for='response in scope.row.responses')
el-tooltip(placement='top' :content='response.text' :disabled='hideTooltips')
el-button(
v-if='response.icon === "check"'
type='text'
icon='el-icon-check'
size='mini'
style='margin-left: 5px'
@click='sendNotificationResponse(scope.row.id, scope.row.responses, response.type)')
el-button(
v-else-if='response.icon === "cancel"'
type='text'
icon='el-icon-close'
size='mini'
style='margin-left: 5px'
@click='sendNotificationResponse(scope.row.id, scope.row.responses, response.type)')
el-button(
v-else-if='response.icon === "ban"'
type='text'
icon='el-icon-circle-close'
size='mini'
style='margin-left: 5px'
@click='sendNotificationResponse(scope.row.id, scope.row.responses, response.type)')
el-button(
v-else-if='response.icon === "bell-slash"'
type='text'
icon='el-icon-bell'
size='mini'
style='margin-left: 5px'
@click='sendNotificationResponse(scope.row.id, scope.row.responses, response.type)')
el-button(
v-else-if='response.icon === "reply" && scope.row.type === "boop"'
type='text'
icon='el-icon-chat-line-square'
size='mini'
style='margin-left: 5px'
@click='showSendBoopDialog(scope.row.senderUserId)')
el-button(
v-else-if='response.icon === "reply"'
type='text'
icon='el-icon-chat-line-square'
size='mini'
style='margin-left: 5px'
@click='sendNotificationResponse(scope.row.id, scope.row.responses, response.type)')
el-button(
v-else
type='text'
icon='el-icon-collection-tag'
size='mini'
style='margin-left: 5px'
@click='sendNotificationResponse(scope.row.id, scope.row.responses, response.type)')
template(
v-if='scope.row.type !== "requestInviteResponse" && scope.row.type !== "inviteResponse" && scope.row.type !== "message" && scope.row.type !== "boop" && scope.row.type !== "groupChange" && !scope.row.type.includes("group.") && !scope.row.type.includes("moderation.") && !scope.row.type.includes("instance.")')
el-tooltip(placement='top' content='Decline' :disabled='hideTooltips')
el-button(
v-if='shiftHeld'
style='color: #f56c6c; margin-left: 5px'
type='text'
icon='el-icon-close'
size='mini'
@click='hideNotification(scope.row)')
el-button(
v-else
type='text'
icon='el-icon-close'
size='mini'
style='margin-left: 5px'
@click='hideNotificationPrompt(scope.row)')
template(v-if='scope.row.type === "group.queueReady"')
el-tooltip(placement='top' content='Delete log' :disabled='hideTooltips')
el-button(
v-if='shiftHeld'
style='color: #f56c6c; margin-left: 5px'
type='text'
icon='el-icon-close'
size='mini'
@click='deleteNotificationLog(scope.row)')
el-button(
v-else
type='text'
icon='el-icon-delete'
size='mini'
style='margin-left: 5px'
@click='deleteNotificationLogPrompt(scope.row)')
template(
v-if='scope.row.type !== "friendRequest" && scope.row.type !== "ignoredFriendRequest" && !scope.row.type.includes("group.") && !scope.row.type.includes("moderation.")')
el-tooltip(placement='top' content='Delete log' :disabled='hideTooltips')
el-button(
v-if='shiftHeld'
style='color: #f56c6c; margin-left: 5px'
type='text'
icon='el-icon-close'
size='mini'
@click='deleteNotificationLog(scope.row)')
el-button(
v-else
type='text'
icon='el-icon-delete'
size='mini'
style='margin-left: 5px'
@click='deleteNotificationLogPrompt(scope.row)')
+428 -222
View File
@@ -1,275 +1,481 @@
mixin playerListTab() mixin playerListTab
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'playerList'" style="padding-top:5px") .x-container(v-show='$refs.menu && $refs.menu.activeIndex === \'playerList\'' style='padding-top: 5px')
div(style="display:flex;flex-direction:column;height:100%") div(style='display: flex; flex-direction: column; height: 100%')
div(v-if="currentInstanceWorld.ref.id" style="display:flex") div(v-if='currentInstanceWorld.ref.id' style='display: flex')
el-popover(placement="right" width="500px" trigger="click" style="height:120px") el-popover(placement='right' width='500px' trigger='click' style='height: 120px')
img.x-link(slot="reference" v-lazy="currentInstanceWorld.ref.thumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px") img.x-link(
img.x-link(v-lazy="currentInstanceWorld.ref.imageUrl" style="width:500px;height:375px" @click="showFullscreenImageDialog(currentInstanceWorld.ref.imageUrl)") slot='reference'
div(style="margin-left:10px;display:flex;flex-direction:column;min-width:320px;width:100%") v-lazy='currentInstanceWorld.ref.thumbnailImageUrl'
style='flex: none; width: 160px; height: 120px; border-radius: 4px')
img.x-link(
v-lazy='currentInstanceWorld.ref.imageUrl'
style='width: 500px; height: 375px'
@click='showFullscreenImageDialog(currentInstanceWorld.ref.imageUrl)')
div(style='margin-left: 10px; display: flex; flex-direction: column; min-width: 320px; width: 100%')
div div
span.x-link(@click="showWorldDialog(currentInstanceWorld.ref.id)" style="font-weight:bold;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1") span.x-link(
| #[i.el-icon-s-home(v-show="API.currentUser.$homeLocation && API.currentUser.$homeLocation.worldId === currentInstanceWorld.ref.id" style="margin-right:5px")] {{ currentInstanceWorld.ref.name }} @click='showWorldDialog(currentInstanceWorld.ref.id)'
style='font-weight: bold; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1')
|#[i.el-icon-s-home(v-show='API.currentUser.$homeLocation && API.currentUser.$homeLocation.worldId === currentInstanceWorld.ref.id' style='margin-right: 5px')] {{ currentInstanceWorld.ref.name }}
div div
span.x-link.x-grey(v-text="currentInstanceWorld.ref.authorName" @click="showUserDialog(currentInstanceWorld.ref.authorId)" style="font-family:monospace") span.x-link.x-grey(
div(style="margin-top:5px") v-text='currentInstanceWorld.ref.authorName'
el-tag(v-if="currentInstanceWorld.ref.$isLabs" type="primary" effect="plain" size="mini" style="margin-right:5px") {{ $t('dialog.world.tags.labs') }} @click='showUserDialog(currentInstanceWorld.ref.authorId)'
el-tag(v-else-if="currentInstanceWorld.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini" style="margin-right:5px") {{ $t('dialog.world.tags.public') }} style='font-family: monospace')
el-tag(v-else-if="currentInstanceWorld.ref.releaseStatus === 'private'" type="danger" effect="plain" size="mini" style="margin-right:5px") {{ $t('dialog.world.tags.private') }} div(style='margin-top: 5px')
el-tag.x-tag-platform-pc(v-if="currentInstanceWorld.isPC" type="info" effect="plain" size="mini" style="margin-right:5px") PC el-tag(
span.x-grey(v-if="currentInstanceWorld.bundleSizes['standalonewindows']" style="margin-left:5px;border-left:inherit;padding-left:5px") {{ currentInstanceWorld.bundleSizes['standalonewindows'].fileSize }} v-if='currentInstanceWorld.ref.$isLabs'
el-tag.x-tag-platform-quest(v-if="currentInstanceWorld.isQuest" type="info" effect="plain" size="mini" style="margin-right:5px") Android type='primary'
span.x-grey(v-if="currentInstanceWorld.bundleSizes['android']" style="margin-left:5px;border-left:inherit;padding-left:5px") {{ currentInstanceWorld.bundleSizes['android'].fileSize }} effect='plain'
el-tag.x-tag-platform-ios(v-if="currentInstanceWorld.isIOS" type="info" effect="plain" size="mini" style="margin-right:5px") iOS size='mini'
span.x-grey(v-if="currentInstanceWorld.bundleSizes['ios']" style="margin-left:5px;border-left:inherit;padding-left:5px") {{ currentInstanceWorld.bundleSizes['ios'].fileSize }} style='margin-right: 5px') {{ $t('dialog.world.tags.labs') }}
el-tag(v-if="currentInstanceWorld.avatarScalingDisabled" type="warning" effect="plain" size="mini" style="margin-right:5px;margin-top:5px") {{ $t('dialog.world.tags.avatar_scaling_disabled') }} el-tag(
el-tag(v-if="currentInstanceWorld.inCache" type="info" effect="plain" size="mini" style="margin-right:5px") v-else-if='currentInstanceWorld.ref.releaseStatus === "public"'
span(v-text="currentInstanceWorld.cacheSize") type='success'
| {{ $t('dialog.world.tags.cache') }} effect='plain'
div(style="margin-top:5px") size='mini'
location-world(:locationobject="currentInstanceLocation" :currentuserid="API.currentUser.id") style='margin-right: 5px') {{ $t('dialog.world.tags.public') }}
span(v-if="lastLocation.playerList.size > 0" style="margin-left:5px") el-tag(
v-else-if='currentInstanceWorld.ref.releaseStatus === "private"'
type='danger'
effect='plain'
size='mini'
style='margin-right: 5px') {{ $t('dialog.world.tags.private') }}
el-tag.x-tag-platform-pc(
v-if='currentInstanceWorld.isPC'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px') PC
span.x-grey(
v-if='currentInstanceWorld.bundleSizes["standalonewindows"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ currentInstanceWorld.bundleSizes['standalonewindows'].fileSize }}
el-tag.x-tag-platform-quest(
v-if='currentInstanceWorld.isQuest'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px') Android
span.x-grey(
v-if='currentInstanceWorld.bundleSizes["android"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ currentInstanceWorld.bundleSizes['android'].fileSize }}
el-tag.x-tag-platform-ios(
v-if='currentInstanceWorld.isIOS'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px') iOS
span.x-grey(
v-if='currentInstanceWorld.bundleSizes["ios"]'
style='margin-left: 5px; border-left: inherit; padding-left: 5px') {{ currentInstanceWorld.bundleSizes['ios'].fileSize }}
el-tag(
v-if='currentInstanceWorld.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='currentInstanceWorld.inCache'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px')
span(v-text='currentInstanceWorld.cacheSize')
|
| {{ $t('dialog.world.tags.cache') }}
div(style='margin-top: 5px')
location-world(
:locationobject='currentInstanceLocation'
:currentuserid='API.currentUser.id')
span(v-if='lastLocation.playerList.size > 0' style='margin-left: 5px')
| {{ lastLocation.playerList.size }} | {{ lastLocation.playerList.size }}
| #[template(v-if="lastLocation.friendList.size > 0") ({{ lastLocation.friendList.size }})] | #[template(v-if='lastLocation.friendList.size > 0') ({{ lastLocation.friendList.size }})]
|  ― #[timer(v-if="lastLocation.date" :epoch="lastLocation.date")] |  ― #[timer(v-if='lastLocation.date' :epoch='lastLocation.date')]
div(style="margin-top:5px") div(style='margin-top: 5px')
span(v-show="currentInstanceWorld.ref.name !== currentInstanceWorld.ref.description" v-text="currentInstanceWorld.ref.description" :style="{fontSize: '12px', overflow: 'hidden', textOverflow: 'ellipsis', display:'-webkit-box', WebkitBoxOrient: 'vertical', WebkitLineClamp: currentInstanceWorldDescriptionExpanded ? 'none' : '2'}") span(
div(style="display:flex;justify-content:end") v-show='currentInstanceWorld.ref.name !== currentInstanceWorld.ref.description'
el-button(v-if="currentInstanceWorld.ref.description.length > 50 && !currentInstanceWorldDescriptionExpanded" type="text" size="mini" @click="currentInstanceWorldDescriptionExpanded = true") {{ !currentInstanceWorldDescriptionExpanded && 'Show more' }} v-text='currentInstanceWorld.ref.description'
div(style="display:flex;flex-direction:column;margin-left:20px") :style='{ fontSize: "12px", overflow: "hidden", textOverflow: "ellipsis", display: "-webkit-box", WebkitBoxOrient: "vertical", WebkitLineClamp: currentInstanceWorldDescriptionExpanded ? "none" : "2" }')
.x-friend-item(style="cursor:default") div(style='display: flex; justify-content: end')
el-button(
v-if='currentInstanceWorld.ref.description.length > 50 && !currentInstanceWorldDescriptionExpanded'
type='text'
size='mini'
@click='currentInstanceWorldDescriptionExpanded = true') {{ !currentInstanceWorldDescriptionExpanded && 'Show more' }}
div(style='display: flex; flex-direction: column; margin-left: 20px')
.x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.world.info.capacity') }} span.name {{ $t('dialog.world.info.capacity') }}
span.extra {{ currentInstanceWorld.ref.recommendedCapacity | commaNumber }} ({{ currentInstanceWorld.ref.capacity | commaNumber }}) span.extra {{ currentInstanceWorld.ref.recommendedCapacity | commaNumber }} ({{ currentInstanceWorld.ref.capacity | commaNumber }})
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.world.info.last_updated') }} span.name {{ $t('dialog.world.info.last_updated') }}
span.extra {{ currentInstanceWorld.lastUpdated | formatDate('long') }} span.extra {{ currentInstanceWorld.lastUpdated | formatDate('long') }}
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('dialog.world.info.created_at') }} span.name {{ $t('dialog.world.info.created_at') }}
span.extra {{ currentInstanceWorld.ref.created_at | formatDate('long') }} span.extra {{ currentInstanceWorld.ref.created_at | formatDate('long') }}
div.photon-event-table(v-if="photonLoggingEnabled") .photon-event-table(v-if='photonLoggingEnabled')
div(style="position:absolute;width:600px;margin-left:215px;z-index:1") div(style='position: absolute; width: 600px; margin-left: 215px; z-index: 1')
el-select(v-model="photonEventTableTypeFilter" @change="photonEventTableFilterChange" multiple clearable collapse-tags style="flex:1;width:220px" :placeholder="$t('view.player_list.photon.filter_placeholder')") el-select(
el-option(v-for="type in photonEventTableTypeFilterList" :key="type" :label="type" :value="type") v-model='photonEventTableTypeFilter'
el-input(v-model="photonEventTableFilter" @input="photonEventTableFilterChange" :placeholder="$t('view.player_list.photon.search_placeholder')" clearable style="width:150px;margin-left:10px") @change='photonEventTableFilterChange'
el-button(@click="showChatboxBlacklistDialog" style="margin-left:10px") {{ $t('view.player_list.photon.chatbox_blacklist') }} multiple
el-tooltip(placement="bottom" :content="$t('view.player_list.photon.status_tooltip')" :disabled="hideTooltips") clearable
div(style="display:inline-block;margin-left:15px;font-size:14px;vertical-align:text-top;margin-top:1px") collapse-tags
span(v-if="ipcEnabled && !photonEventIcon") 🟢 style='flex: 1; width: 220px'
span(v-else-if="ipcEnabled") ⚪ :placeholder='$t("view.player_list.photon.filter_placeholder")')
el-option(
v-for='type in photonEventTableTypeFilterList'
:key='type'
:label='type'
:value='type')
el-input(
v-model='photonEventTableFilter'
@input='photonEventTableFilterChange'
:placeholder='$t("view.player_list.photon.search_placeholder")'
clearable
style='width: 150px; margin-left: 10px')
el-button(@click='showChatboxBlacklistDialog' style='margin-left: 10px') {{ $t('view.player_list.photon.chatbox_blacklist') }}
el-tooltip(
placement='bottom'
:content='$t("view.player_list.photon.status_tooltip")'
:disabled='hideTooltips')
div(
style='display: inline-block; margin-left: 15px; font-size: 14px; vertical-align: text-top; margin-top: 1px')
span(v-if='ipcEnabled && !photonEventIcon') 🟢
span(v-else-if='ipcEnabled') ⚪
span(v-else) 🔴 span(v-else) 🔴
el-tabs(type="card") el-tabs(type='card')
el-tab-pane(:label="$t('view.player_list.photon.current')") el-tab-pane(:label='$t("view.player_list.photon.current")')
data-tables(v-bind="photonEventTable" style="margin-bottom:10px") data-tables(v-bind='photonEventTable' style='margin-bottom: 10px')
el-table-column(:label="$t('table.playerList.date')" prop="created_at" width="120") el-table-column(:label='$t("table.playerList.date")' prop='created_at' width='120')
template(#default="scope") template(#default='scope')
el-tooltip(placement="right") el-tooltip(placement='right')
template(#content) template(#content)
span {{ scope.row.created_at | formatDate('long') }} span {{ scope.row.created_at | formatDate('long') }}
span {{ scope.row.created_at | formatDate('short') }} span {{ scope.row.created_at | formatDate('short') }}
el-table-column(:label="$t('table.playerList.user')" prop="photonId" width="160") el-table-column(:label='$t("table.playerList.user")' prop='photonId' width='160')
template(#default="scope") template(#default='scope')
span.x-link(v-text="scope.row.displayName" @click="showUserFromPhotonId(scope.row.photonId)" style="padding-right:10px") span.x-link(
el-table-column(:label="$t('table.playerList.type')" prop="type" width="140") v-text='scope.row.displayName'
el-table-column(:label="$t('table.playerList.detail')" prop="text") @click='showUserFromPhotonId(scope.row.photonId)'
template(#default="scope") style='padding-right: 10px')
template(v-if="scope.row.type === 'ChangeAvatar'") el-table-column(:label='$t("table.playerList.type")' prop='type' width='140')
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)") el-table-column(:label='$t("table.playerList.detail")' prop='text')
template(#default='scope')
template(v-if='scope.row.type === "ChangeAvatar"')
span.x-link(
v-text='scope.row.avatar.name'
@click='showAvatarDialog(scope.row.avatar.id)')
|   |  
span(v-if="!scope.row.inCache" style="color:#aaa") #[i.el-icon-download]  span(v-if='!scope.row.inCache' style='color: #aaa') #[i.el-icon-download] 
span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") {{ $t('dialog.avatar.labels.public') }} span.avatar-info-public(v-if='scope.row.avatar.releaseStatus === "public"') {{ $t('dialog.avatar.labels.public') }}
span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") {{ $t('dialog.avatar.labels.private') }} span.avatar-info-own(v-else-if='scope.row.avatar.releaseStatus === "private"') {{ $t('dialog.avatar.labels.private') }}
template(v-if="scope.row.avatar.description && scope.row.avatar.name !== scope.row.avatar.description") template(
| - {{ scope.row.avatar.description }} v-if='scope.row.avatar.description && scope.row.avatar.name !== scope.row.avatar.description')
template(v-else-if="scope.row.type === 'ChangeStatus'") |
template(v-if="scope.row.status !== scope.row.previousStatus") | - {{ scope.row.avatar.description }}
el-tooltip(placement="top") template(v-else-if='scope.row.type === "ChangeStatus"')
template(v-if='scope.row.status !== scope.row.previousStatus')
el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.previousStatus === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.previousStatus === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.previousStatus === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.previousStatus === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)") i.x-user-status(:class='statusClass(scope.row.previousStatus)')
span span
i.el-icon-right i.el-icon-right
el-tooltip(placement="top") el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.status === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.status === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.status === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.status === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)" style="margin-right:5px") i.x-user-status(
span(v-if="scope.row.statusDescription !== scope.row.previousStatusDescription" v-text="scope.row.statusDescription") :class='statusClass(scope.row.status)'
template(v-else-if="scope.row.type === 'ChangeGroup'") style='margin-right: 5px')
span.x-link(v-if="scope.row.previousGroupName" v-text="scope.row.previousGroupName" @click="showGroupDialog(scope.row.previousGroupId)" style="margin-right:5px") span(
span.x-link(v-else v-text="scope.row.previousGroupId" @click="showGroupDialog(scope.row.previousGroupId)" style="margin-right:5px") v-if='scope.row.statusDescription !== scope.row.previousStatusDescription'
v-text='scope.row.statusDescription')
template(v-else-if='scope.row.type === "ChangeGroup"')
span.x-link(
v-if='scope.row.previousGroupName'
v-text='scope.row.previousGroupName'
@click='showGroupDialog(scope.row.previousGroupId)'
style='margin-right: 5px')
span.x-link(
v-else
v-text='scope.row.previousGroupId'
@click='showGroupDialog(scope.row.previousGroupId)'
style='margin-right: 5px')
span span
i.el-icon-right i.el-icon-right
span.x-link(v-if="scope.row.groupName" v-text="scope.row.groupName" @click="showGroupDialog(scope.row.groupId)" style="margin-left:5px") span.x-link(
span.x-link(v-else v-text="scope.row.groupId" @click="showGroupDialog(scope.row.groupId)" style="margin-left:5px") v-if='scope.row.groupName'
span.x-link(v-else-if="scope.row.type === 'PortalSpawn'" @click="showWorldDialog(scope.row.location, scope.row.shortName)") v-text='scope.row.groupName'
location(:location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName" :link="false") @click='showGroupDialog(scope.row.groupId)'
span(v-else-if="scope.row.type === 'ChatBoxMessage'" v-text="scope.row.text") style='margin-left: 5px')
span(v-else-if="scope.row.type === 'OnPlayerJoined'") span.x-link(
span(v-if="scope.row.platform === 'Desktop'" style="color:#409eff") Desktop  v-else
span(v-else-if="scope.row.platform === 'VR'" style="color:#409eff") VR  v-text='scope.row.groupId'
span(v-else-if="scope.row.platform === 'Quest'" style="color:#67c23a") Android  @click='showGroupDialog(scope.row.groupId)'
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)") style='margin-left: 5px')
span.x-link(
v-else-if='scope.row.type === "PortalSpawn"'
@click='showWorldDialog(scope.row.location, scope.row.shortName)')
location(
:location='scope.row.location'
:hint='scope.row.worldName'
:grouphint='scope.row.groupName'
:link='false')
span(v-else-if='scope.row.type === "ChatBoxMessage"' v-text='scope.row.text')
span(v-else-if='scope.row.type === "OnPlayerJoined"')
span(v-if='scope.row.platform === "Desktop"' style='color: #409eff') Desktop 
span(v-else-if='scope.row.platform === "VR"' style='color: #409eff') VR 
span(v-else-if='scope.row.platform === "Quest"' style='color: #67c23a') Android 
span.x-link(
v-text='scope.row.avatar.name'
@click='showAvatarDialog(scope.row.avatar.id)')
|   |  
span(v-if="!scope.row.inCache" style="color:#aaa") #[i.el-icon-download]  span(v-if='!scope.row.inCache' style='color: #aaa') #[i.el-icon-download] 
span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") {{ $t('dialog.avatar.labels.public') }} span.avatar-info-public(v-if='scope.row.avatar.releaseStatus === "public"') {{ $t('dialog.avatar.labels.public') }}
span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") {{ $t('dialog.avatar.labels.private') }} span.avatar-info-own(v-else-if='scope.row.avatar.releaseStatus === "private"') {{ $t('dialog.avatar.labels.private') }}
span(v-else-if="scope.row.type === 'SpawnEmoji'") span(v-else-if='scope.row.type === "SpawnEmoji"')
span(v-if="scope.row.imageUrl") span(v-if='scope.row.imageUrl')
el-tooltip(placement="right") el-tooltip(placement='right')
template(#content) template(#content)
img.friends-list-avatar(v-lazy="scope.row.imageUrl" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(scope.row.imageUrl)") img.friends-list-avatar(
span(v-text="scope.row.fileId") v-lazy='scope.row.imageUrl'
span(v-else v-text="scope.row.text") style='height: 500px; cursor: pointer'
span(v-else-if="scope.row.color === 'yellow'" v-text="scope.row.text" style="color:yellow") @click='showFullscreenImageDialog(scope.row.imageUrl)')
span(v-else v-text="scope.row.text") span(v-text='scope.row.fileId')
el-tab-pane(:label="$t('view.player_list.photon.previous')") span(v-else v-text='scope.row.text')
data-tables(v-bind="photonEventTablePrevious" style="margin-bottom:10px") span(
el-table-column(:label="$t('table.playerList.date')" prop="created_at" width="120") v-else-if='scope.row.color === "yellow"'
template(#default="scope") v-text='scope.row.text'
el-tooltip(placement="right") style='color: yellow')
span(v-else v-text='scope.row.text')
el-tab-pane(:label='$t("view.player_list.photon.previous")')
data-tables(v-bind='photonEventTablePrevious' style='margin-bottom: 10px')
el-table-column(:label='$t("table.playerList.date")' prop='created_at' width='120')
template(#default='scope')
el-tooltip(placement='right')
template(#content) template(#content)
span {{ scope.row.created_at | formatDate('long') }} span {{ scope.row.created_at | formatDate('long') }}
span {{ scope.row.created_at | formatDate('short') }} span {{ scope.row.created_at | formatDate('short') }}
el-table-column(:label="$t('table.playerList.user')" prop="photonId" width="160") el-table-column(:label='$t("table.playerList.user")' prop='photonId' width='160')
template(#default="scope") template(#default='scope')
span.x-link(v-text="scope.row.displayName" @click="lookupUser(scope.row)" style="padding-right:10px") span.x-link(
el-table-column(:label="$t('table.playerList.type')" prop="type" width="140") v-text='scope.row.displayName'
el-table-column(:label="$t('table.playerList.detail')" prop="text") @click='lookupUser(scope.row)'
template(#default="scope") style='padding-right: 10px')
template(v-if="scope.row.type === 'ChangeAvatar'") el-table-column(:label='$t("table.playerList.type")' prop='type' width='140')
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)") el-table-column(:label='$t("table.playerList.detail")' prop='text')
template(#default='scope')
template(v-if='scope.row.type === "ChangeAvatar"')
span.x-link(
v-text='scope.row.avatar.name'
@click='showAvatarDialog(scope.row.avatar.id)')
|   |  
span(v-if="!scope.row.inCache" style="color:#aaa") #[i.el-icon-download]  span(v-if='!scope.row.inCache' style='color: #aaa') #[i.el-icon-download] 
span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") {{ $t('dialog.avatar.labels.public') }} span.avatar-info-public(v-if='scope.row.avatar.releaseStatus === "public"') {{ $t('dialog.avatar.labels.public') }}
span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") {{ $t('dialog.avatar.labels.private') }} span.avatar-info-own(v-else-if='scope.row.avatar.releaseStatus === "private"') {{ $t('dialog.avatar.labels.private') }}
template(v-if="scope.row.avatar.description && scope.row.avatar.name !== scope.row.avatar.description") template(
| - {{ scope.row.avatar.description }} v-if='scope.row.avatar.description && scope.row.avatar.name !== scope.row.avatar.description')
template(v-else-if="scope.row.type === 'ChangeStatus'") |
template(v-if="scope.row.status !== scope.row.previousStatus") | - {{ scope.row.avatar.description }}
el-tooltip(placement="top") template(v-else-if='scope.row.type === "ChangeStatus"')
template(v-if='scope.row.status !== scope.row.previousStatus')
el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.previousStatus === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.previousStatus === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.previousStatus === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.previousStatus === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)") i.x-user-status(:class='statusClass(scope.row.previousStatus)')
span span
i.el-icon-right i.el-icon-right
el-tooltip(placement="top") el-tooltip(placement='top')
template(#content) template(#content)
span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }} span(v-if='scope.row.status === "active"') {{ $t('dialog.user.status.active') }}
span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }} span(v-else-if='scope.row.status === "join me"') {{ $t('dialog.user.status.join_me') }}
span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }} span(v-else-if='scope.row.status === "ask me"') {{ $t('dialog.user.status.ask_me') }}
span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }} span(v-else-if='scope.row.status === "busy"') {{ $t('dialog.user.status.busy') }}
span(v-else) {{ $t('dialog.user.status.offline') }} span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)" style="margin-right:5px") i.x-user-status(
span(v-if="scope.row.statusDescription !== scope.row.previousStatusDescription" v-text="scope.row.statusDescription") :class='statusClass(scope.row.status)'
template(v-else-if="scope.row.type === 'ChangeGroup'") style='margin-right: 5px')
span.x-link(v-if="scope.row.previousGroupName" v-text="scope.row.previousGroupName" @click="showGroupDialog(scope.row.previousGroupId)" style="margin-right:5px") span(
span.x-link(v-else v-text="scope.row.previousGroupId" @click="showGroupDialog(scope.row.previousGroupId)" style="margin-right:5px") v-if='scope.row.statusDescription !== scope.row.previousStatusDescription'
v-text='scope.row.statusDescription')
template(v-else-if='scope.row.type === "ChangeGroup"')
span.x-link(
v-if='scope.row.previousGroupName'
v-text='scope.row.previousGroupName'
@click='showGroupDialog(scope.row.previousGroupId)'
style='margin-right: 5px')
span.x-link(
v-else
v-text='scope.row.previousGroupId'
@click='showGroupDialog(scope.row.previousGroupId)'
style='margin-right: 5px')
span span
i.el-icon-right i.el-icon-right
span.x-link(v-if="scope.row.groupName" v-text="scope.row.groupName" @click="showGroupDialog(scope.row.groupId)" style="margin-left:5px") span.x-link(
span.x-link(v-else v-text="scope.row.groupId" @click="showGroupDialog(scope.row.groupId)" style="margin-left:5px") v-if='scope.row.groupName'
span.x-link(v-else-if="scope.row.type === 'PortalSpawn'" @click="showWorldDialog(scope.row.location, scope.row.shortName)") v-text='scope.row.groupName'
location(:location="scope.row.location" :hint="scope.row.worldName" :grouphint="scope.row.groupName" :link="false") @click='showGroupDialog(scope.row.groupId)'
span(v-else-if="scope.row.type === 'ChatBoxMessage'" v-text="scope.row.text") style='margin-left: 5px')
span(v-else-if="scope.row.type === 'OnPlayerJoined'") span.x-link(
span(v-if="scope.row.platform === 'Desktop'" style="color:#409eff") Desktop  v-else
span(v-else-if="scope.row.platform === 'VR'" style="color:#409eff") VR  v-text='scope.row.groupId'
span(v-else-if="scope.row.platform === 'Quest'" style="color:#67c23a") Android  @click='showGroupDialog(scope.row.groupId)'
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)") style='margin-left: 5px')
span.x-link(
v-else-if='scope.row.type === "PortalSpawn"'
@click='showWorldDialog(scope.row.location, scope.row.shortName)')
location(
:location='scope.row.location'
:hint='scope.row.worldName'
:grouphint='scope.row.groupName'
:link='false')
span(v-else-if='scope.row.type === "ChatBoxMessage"' v-text='scope.row.text')
span(v-else-if='scope.row.type === "OnPlayerJoined"')
span(v-if='scope.row.platform === "Desktop"' style='color: #409eff') Desktop 
span(v-else-if='scope.row.platform === "VR"' style='color: #409eff') VR 
span(v-else-if='scope.row.platform === "Quest"' style='color: #67c23a') Android 
span.x-link(
v-text='scope.row.avatar.name'
@click='showAvatarDialog(scope.row.avatar.id)')
|   |  
span(v-if="!scope.row.inCache" style="color:#aaa") #[i.el-icon-download]  span(v-if='!scope.row.inCache' style='color: #aaa') #[i.el-icon-download] 
span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") {{ $t('dialog.avatar.labels.public') }} span.avatar-info-public(v-if='scope.row.avatar.releaseStatus === "public"') {{ $t('dialog.avatar.labels.public') }}
span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") {{ $t('dialog.avatar.labels.private') }} span.avatar-info-own(v-else-if='scope.row.avatar.releaseStatus === "private"') {{ $t('dialog.avatar.labels.private') }}
span(v-else-if="scope.row.type === 'SpawnEmoji'") span(v-else-if='scope.row.type === "SpawnEmoji"')
span(v-if="scope.row.imageUrl") span(v-if='scope.row.imageUrl')
el-tooltip(placement="right") el-tooltip(placement='right')
template(#content) template(#content)
img.friends-list-avatar(v-lazy="scope.row.imageUrl" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(scope.row.imageUrl)") img.friends-list-avatar(
span(v-text="scope.row.fileId") v-lazy='scope.row.imageUrl'
span(v-else v-text="scope.row.text") style='height: 500px; cursor: pointer'
span(v-else-if="scope.row.color === 'yellow'" v-text="scope.row.text" style="color:yellow") @click='showFullscreenImageDialog(scope.row.imageUrl)')
span(v-else v-text="scope.row.text") span(v-text='scope.row.fileId')
div.current-instance-table span(v-else v-text='scope.row.text')
data-tables(v-bind="currentInstanceUserList" @row-click="selectCurrentInstanceRow" style="margin-top:10px;cursor:pointer") span(
el-table-column(:label="$t('table.playerList.avatar')" width="70" prop="photo") v-else-if='scope.row.color === "yellow"'
template(#default="scope") v-text='scope.row.text'
template(v-if="userImage(scope.row.ref)") style='color: yellow')
el-popover(placement="right" height="500px" trigger="hover") span(v-else v-text='scope.row.text')
img.friends-list-avatar(slot="reference" v-lazy="userImage(scope.row.ref)") .current-instance-table
img.friends-list-avatar(v-lazy="userImageFull(scope.row.ref)" style="height:500px;cursor:pointer" @click="showFullscreenImageDialog(userImageFull(scope.row.ref))") data-tables(
el-table-column(:label="$t('table.playerList.timer')" width="80" prop="timer" sortable) v-bind='currentInstanceUserList'
template(#default="scope") @row-click='selectCurrentInstanceRow'
timer(:epoch="scope.row.timer") style='margin-top: 10px; cursor: pointer')
el-table-column(v-if="photonLoggingEnabled" :label="$t('table.playerList.photonId')" width="110" prop="photonId" sortable) el-table-column(:label='$t("table.playerList.avatar")' width='70' prop='photo')
template(#default="scope") template(#default='scope')
template(v-if="chatboxUserBlacklist.has(scope.row.ref.id)") template(v-if='userImage(scope.row.ref)')
el-tooltip(placement="left" content="Unblock chatbox messages") el-popover(placement='right' height='500px' trigger='hover')
el-button(type="text" icon="el-icon-turn-off-microphone" size="mini" style="color:red;margin-right:5px" @click.stop="deleteChatboxUserBlacklist(scope.row.ref.id)") img.friends-list-avatar(slot='reference' v-lazy='userImage(scope.row.ref)')
img.friends-list-avatar(
v-lazy='userImageFull(scope.row.ref)'
style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row.ref))')
el-table-column(:label='$t("table.playerList.timer")' width='80' prop='timer' sortable)
template(#default='scope')
timer(:epoch='scope.row.timer')
el-table-column(
v-if='photonLoggingEnabled'
:label='$t("table.playerList.photonId")'
width='110'
prop='photonId'
sortable)
template(#default='scope')
template(v-if='chatboxUserBlacklist.has(scope.row.ref.id)')
el-tooltip(placement='left' content='Unblock chatbox messages')
el-button(
type='text'
icon='el-icon-turn-off-microphone'
size='mini'
style='color: red; margin-right: 5px'
@click.stop='deleteChatboxUserBlacklist(scope.row.ref.id)')
template(v-else) template(v-else)
el-tooltip(placement="left" content="Block chatbox messages") el-tooltip(placement='left' content='Block chatbox messages')
el-button(type="text" icon="el-icon-microphone" size="mini" style="margin-right:5px" @click.stop="addChatboxUserBlacklist(scope.row.ref)") el-button(
span(v-text="scope.row.photonId") type='text'
el-table-column(:label="$t('table.playerList.icon')" prop="isMaster" width="70" align="center") icon='el-icon-microphone'
template(#default="scope") size='mini'
el-tooltip(v-if="scope.row.isMaster" placement="left" content="Instance Master") style='margin-right: 5px'
@click.stop='addChatboxUserBlacklist(scope.row.ref)')
span(v-text='scope.row.photonId')
el-table-column(:label='$t("table.playerList.icon")' prop='isMaster' width='70' align='center')
template(#default='scope')
el-tooltip(v-if='scope.row.isMaster' placement='left' content='Instance Master')
span 👑 span 👑
el-tooltip(v-if="scope.row.isModerator" placement="left" content="Moderator") el-tooltip(v-if='scope.row.isModerator' placement='left' content='Moderator')
span ⚔️ span ⚔️
el-tooltip(v-if="scope.row.isFriend" placement="left" content="Friend") el-tooltip(v-if='scope.row.isFriend' placement='left' content='Friend')
span 💚 span 💚
el-tooltip(v-if="scope.row.timeoutTime" placement="left" content="Timeout") el-tooltip(v-if='scope.row.timeoutTime' placement='left' content='Timeout')
span(style="color:red") 🔴{{ scope.row.timeoutTime }}s span(style='color: red') 🔴{{ scope.row.timeoutTime }}s
el-table-column(:label="$t('table.playerList.platform')" prop="inVRMode" width="80") el-table-column(:label='$t("table.playerList.platform")' prop='inVRMode' width='80')
template(#default="scope") template(#default='scope')
template(v-if="scope.row.ref.last_platform") template(v-if='scope.row.ref.last_platform')
span(v-if="scope.row.ref.last_platform === 'standalonewindows'" style="color:#409eff") PC span(v-if='scope.row.ref.last_platform === "standalonewindows"' style='color: #409eff') PC
span(v-else-if="scope.row.ref.last_platform === 'android'" style="color:#67c23a") A span(v-else-if='scope.row.ref.last_platform === "android"' style='color: #67c23a') A
span(v-else-if="scope.row.ref.last_platform === 'ios'" style="color:#c7c7ce") iOS span(v-else-if='scope.row.ref.last_platform === "ios"' style='color: #c7c7ce') iOS
span(v-else) {{ scope.row.ref.last_platform }} span(v-else) {{ scope.row.ref.last_platform }}
template(v-if="scope.row.inVRMode !== null") template(v-if='scope.row.inVRMode !== null')
span(v-if="scope.row.inVRMode") VR span(v-if='scope.row.inVRMode') VR
span(v-else-if="scope.row.ref.last_platform === 'android' || scope.row.ref.last_platform === 'ios'") M span(
v-else-if='scope.row.ref.last_platform === "android" || scope.row.ref.last_platform === "ios"') M
span(v-else) D span(v-else) D
el-table-column(:label="$t('table.playerList.displayName')" min-width="140" prop="displayName" sortable="custom") el-table-column(
template(#default="scope") :label='$t("table.playerList.displayName")'
span(v-if="randomUserColours" v-text="scope.row.ref.displayName" :style="{'color':scope.row.ref.$userColour}") min-width='140'
span(v-else v-text="scope.row.ref.displayName") prop='displayName'
el-table-column(:label="$t('table.playerList.status')" min-width="180" prop="ref.status") sortable='custom')
template(#default="scope") template(#default='scope')
template(v-if="scope.row.ref.status") span(
i.x-user-status(:class="statusClass(scope.row.ref.status)") v-if='randomUserColours'
span v-text='scope.row.ref.displayName'
span(v-text="scope.row.ref.statusDescription") :style='{ color: scope.row.ref.$userColour }')
span(v-else v-text='scope.row.ref.displayName')
el-table-column(:label='$t("table.playerList.status")' min-width='180' prop='ref.status')
template(#default='scope')
template(v-if='scope.row.ref.status')
i.x-user-status(:class='statusClass(scope.row.ref.status)')
span
span(v-text='scope.row.ref.statusDescription')
//- el-table-column(label="Group" min-width="180" prop="groupOnNameplate" sortable) //- el-table-column(label="Group" min-width="180" prop="groupOnNameplate" sortable)
//- template(v-once #default="scope") //- template(v-once #default="scope")
//- span(v-text="scope.row.groupOnNameplate") //- span(v-text="scope.row.groupOnNameplate")
el-table-column(:label="$t('table.playerList.rank')" width="110" prop="$trustSortNum" sortable="custom") el-table-column(
template(#default="scope") :label='$t("table.playerList.rank")'
span.name(v-text="scope.row.ref.$trustLevel" :class="scope.row.ref.$trustClass") width='110'
el-table-column(:label="$t('table.playerList.language')" width="100" prop="ref.$languages") prop='$trustSortNum'
template(#default="scope") sortable='custom')
el-tooltip(v-for="item in scope.row.ref.$languages" :key="item.key" placement="top") template(#default='scope')
span.name(v-text='scope.row.ref.$trustLevel' :class='scope.row.ref.$trustClass')
el-table-column(:label='$t("table.playerList.language")' width='100' prop='ref.$languages')
template(#default='scope')
el-tooltip(v-for='item in scope.row.ref.$languages' :key='item.key' placement='top')
template(#content) template(#content)
span {{ item.value }} ({{ item.key }}) span {{ item.value }} ({{ item.key }})
span.flags(:class="languageClass(item.key)" style="display:inline-block;margin-right:5px") span.flags(
el-table-column(:label="$t('table.playerList.bioLink')" width="100" prop="ref.bioLinks") :class='languageClass(item.key)'
template(#default="scope") style='display: inline-block; margin-right: 5px')
div(style="display:flex;align-items:center") el-table-column(:label='$t("table.playerList.bioLink")' width='100' prop='ref.bioLinks')
el-tooltip(v-if="link" v-for="(link, index) in scope.row.ref.bioLinks" :key="index") template(#default='scope')
div(style='display: flex; align-items: center')
el-tooltip(v-if='link' v-for='(link, index) in scope.row.ref.bioLinks' :key='index')
template(#content) template(#content)
span(v-text="link") span(v-text='link')
img(:src="getFaviconUrl(link)" style="width:16px;height:16px;vertical-align:middle;margin-right:5px;cursor:pointer" @click.stop="openExternalLink(link)") img(
:src='getFaviconUrl(link)'
style='width: 16px; height: 16px; vertical-align: middle; margin-right: 5px; cursor: pointer'
@click.stop='openExternalLink(link)')
+339 -132
View File
@@ -1,164 +1,371 @@
mixin profileTab() mixin profileTab
.x-container(v-if="$refs.menu && $refs.menu.activeIndex === 'profile'") .x-container(v-if='$refs.menu && $refs.menu.activeIndex === "profile"')
div.options-container(style="margin-top:0") .options-container(style='margin-top: 0')
span.header {{ $t('view.profile.profile.header') }} span.header {{ $t('view.profile.profile.header') }}
.x-friend-list(style="margin-top:10px") .x-friend-list(style='margin-top: 10px')
.x-friend-item(@click="showUserDialog(API.currentUser.id)") .x-friend-item(@click='showUserDialog(API.currentUser.id)')
.avatar .avatar
img(v-lazy="userImage(API.currentUser)") img(v-lazy='userImage(API.currentUser)')
.detail .detail
span.name(v-text="API.currentUser.displayName") span.name(v-text='API.currentUser.displayName')
span.extra(v-text="API.currentUser.username") span.extra(v-text='API.currentUser.username')
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('view.profile.profile.last_activity') }} span.name {{ $t('view.profile.profile.last_activity') }}
span.extra {{ API.currentUser.last_activity | formatDate('long') }} span.extra {{ API.currentUser.last_activity | formatDate('long') }}
.x-friend-item(style="cursor:default") .x-friend-item(style='cursor: default')
.detail .detail
span.name {{ $t('view.profile.profile.two_factor') }} span.name {{ $t('view.profile.profile.two_factor') }}
span.extra {{ API.currentUser.twoFactorAuthEnabled ? $t('view.profile.profile.two_factor_enabled') : $t('view.profile.profile.two_factor_disabled') }} span.extra {{ API.currentUser.twoFactorAuthEnabled ? $t('view.profile.profile.two_factor_enabled') : $t('view.profile.profile.two_factor_disabled') }}
.x-friend-item(@click="getVRChatCredits()") .x-friend-item(@click='getVRChatCredits()')
.detail .detail
span.name {{ $t('view.profile.profile.vrchat_credits') }} span.name {{ $t('view.profile.profile.vrchat_credits') }}
span.extra {{ API.currentUser.$vrchatcredits ?? $t('view.profile.profile.refresh') }} span.extra {{ API.currentUser.$vrchatcredits ?? $t('view.profile.profile.refresh') }}
div(style="margin-top:10px") div(style='margin-top: 10px')
el-button(size="small" type="danger" plain icon="el-icon-switch-button" @click="logout()" style="margin-left:0;margin-right:5px;margin-top:10px;") {{ $t('view.profile.profile.logout') }} el-button(
el-button(size="small" icon="el-icon-picture-outline" @click="showGalleryDialog()" style="margin-left:0;margin-right:5px;margin-top:10px") {{ $t('view.profile.profile.manage_gallery_icon') }} size='small'
el-button(size="small" icon="el-icon-chat-dot-round" @click="showDiscordNamesDialog()" style="margin-left:0;margin-right:5px;margin-top:10px") {{ $t('view.profile.profile.discord_names') }} type='danger'
el-button(size="small" icon="el-icon-printer" @click="showExportFriendsListDialog()" style="margin-left:0;margin-right:5px;margin-top:10px") {{ $t('view.profile.profile.export_friend_list') }} plain
el-button(size="small" icon="el-icon-user" @click="showExportAvatarsListDialog()" style="margin-left:0;margin-right:5px;margin-top:10px") {{ $t('view.profile.profile.export_own_avatars') }} icon='el-icon-switch-button'
el-button(size="small" icon="el-icon-document-copy" @click="showNoteExportDialog()" style="margin-left:0;margin-right:5px;margin-top:10px") {{ $t('view.profile.profile.export_notes') }} @click='logout()'
style='margin-left: 0; margin-right: 5px; margin-top: 10px') {{ $t('view.profile.profile.logout') }}
el-button(
size='small'
icon='el-icon-picture-outline'
@click='showGalleryDialog()'
style='margin-left: 0; margin-right: 5px; margin-top: 10px') {{ $t('view.profile.profile.manage_gallery_icon') }}
el-button(
size='small'
icon='el-icon-chat-dot-round'
@click='showDiscordNamesDialog()'
style='margin-left: 0; margin-right: 5px; margin-top: 10px') {{ $t('view.profile.profile.discord_names') }}
el-button(
size='small'
icon='el-icon-printer'
@click='showExportFriendsListDialog()'
style='margin-left: 0; margin-right: 5px; margin-top: 10px') {{ $t('view.profile.profile.export_friend_list') }}
el-button(
size='small'
icon='el-icon-user'
@click='showExportAvatarsListDialog()'
style='margin-left: 0; margin-right: 5px; margin-top: 10px') {{ $t('view.profile.profile.export_own_avatars') }}
el-button(
size='small'
icon='el-icon-document-copy'
@click='showNoteExportDialog()'
style='margin-left: 0; margin-right: 5px; margin-top: 10px') {{ $t('view.profile.profile.export_notes') }}
div.options-container .options-container
span.header {{ $t('view.profile.game_info.header') }} span.header {{ $t('view.profile.game_info.header') }}
.x-friend-list(style="margin-top:10px") .x-friend-list(style='margin-top: 10px')
.x-friend-item .x-friend-item
.detail(@click="API.getVisits()") .detail(@click='API.getVisits()')
span.name {{ $t('view.profile.game_info.online_users') }} span.name {{ $t('view.profile.game_info.online_users') }}
span.extra(v-if="visits") {{ $t('view.profile.game_info.user_online', { count: visits }) }} span.extra(v-if='visits') {{ $t('view.profile.game_info.user_online', { count: visits }) }}
span.extra(v-else) {{ $t('view.profile.game_info.refresh') }} span.extra(v-else) {{ $t('view.profile.game_info.refresh') }}
div.options-container .options-container
div.header-bar .header-bar
span.header {{ $t('view.profile.vrc_sdk_downloads.header') }} span.header {{ $t('view.profile.vrc_sdk_downloads.header') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="API.getConfig()" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
.x-friend-list(style="margin-top:10px") type='default'
.x-friend-item(v-for="(link, item) in API.cachedConfig.downloadUrls" :key="item" placement="top") @click='API.getConfig()'
.detail(@click="openExternalLink(link)") size='mini'
span.name(v-text="item") icon='el-icon-refresh'
span.extra(v-text="link") circle
div.options-container style='margin-left: 5px')
.x-friend-list(style='margin-top: 10px')
.x-friend-item(v-for='(link, item) in API.cachedConfig.downloadUrls' :key='item' placement='top')
.detail(@click='openExternalLink(link)')
span.name(v-text='item')
span.extra(v-text='link')
.options-container
span.header {{ $t('view.profile.direct_access.header') }} span.header {{ $t('view.profile.direct_access.header') }}
div(style="margin-top:10px") div(style='margin-top: 10px')
el-button-group el-button-group
el-button(size="small" @click="promptUsernameDialog()") {{ $t('view.profile.direct_access.username') }} el-button(size='small' @click='promptUsernameDialog()') {{ $t('view.profile.direct_access.username') }}
el-button(size="small" @click="promptUserIdDialog()") {{ $t('view.profile.direct_access.user_id') }} el-button(size='small' @click='promptUserIdDialog()') {{ $t('view.profile.direct_access.user_id') }}
el-button(size="small" @click="promptWorldDialog()") {{ $t('view.profile.direct_access.world_instance') }} el-button(size='small' @click='promptWorldDialog()') {{ $t('view.profile.direct_access.world_instance') }}
el-button(size="small" @click="promptAvatarDialog()") {{ $t('view.profile.direct_access.avatar') }} el-button(size='small' @click='promptAvatarDialog()') {{ $t('view.profile.direct_access.avatar') }}
div.options-container .options-container
div.header-bar .header-bar
span.header {{ $t('view.profile.invite_messages') }} span.header {{ $t('view.profile.invite_messages') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="inviteMessageTable.visible = true; refreshInviteMessageTable('message')" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="inviteMessageTable.visible = false" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='inviteMessageTable.visible = true; refreshInviteMessageTable("message")'
data-tables(v-if="inviteMessageTable.visible" v-bind="inviteMessageTable" style="margin-top:10px") size='mini'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") icon='el-icon-refresh'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") circle
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") style='margin-left: 5px')
template(#default="scope") el-tooltip(
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") placement='top'
el-table-column(:label="$t('table.profile.invite_messages.action')" width="60" align="right") :content='$t("view.profile.clear_results_tooltip")'
template(#default="scope") :disabled='hideTooltips')
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditInviteMessageDialog('message', scope.row)") el-button(
div.options-container type='default'
div.header-bar @click='inviteMessageTable.visible = false'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
data-tables(v-if='inviteMessageTable.visible' v-bind='inviteMessageTable' style='margin-top: 10px')
el-table-column(
:label='$t("table.profile.invite_messages.slot")'
prop='slot'
sortable='custom'
width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='60' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditInviteMessageDialog("message", scope.row)')
.options-container
.header-bar
span.header {{ $t('view.profile.invite_response_messages') }} span.header {{ $t('view.profile.invite_response_messages') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="inviteResponseMessageTable.visible = true; refreshInviteMessageTable('response')" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="inviteResponseMessageTable.visible = false" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='inviteResponseMessageTable.visible = true; refreshInviteMessageTable("response")'
data-tables(v-if="inviteResponseMessageTable.visible" v-bind="inviteResponseMessageTable" style="margin-top:10px") size='mini'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") icon='el-icon-refresh'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") circle
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") style='margin-left: 5px')
template(#default="scope") el-tooltip(
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") placement='top'
el-table-column(:label="$t('table.profile.invite_messages.action')" width="60" align="right") :content='$t("view.profile.clear_results_tooltip")'
template(#default="scope") :disabled='hideTooltips')
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditInviteMessageDialog('response', scope.row)") el-button(
div.options-container type='default'
div.header-bar @click='inviteResponseMessageTable.visible = false'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
data-tables(
v-if='inviteResponseMessageTable.visible'
v-bind='inviteResponseMessageTable'
style='margin-top: 10px')
el-table-column(
:label='$t("table.profile.invite_messages.slot")'
prop='slot'
sortable='custom'
width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='60' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditInviteMessageDialog("response", scope.row)')
.options-container
.header-bar
span.header {{ $t('view.profile.invite_request_messages') }} span.header {{ $t('view.profile.invite_request_messages') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="inviteRequestMessageTable.visible = true; refreshInviteMessageTable('request')" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="inviteRequestMessageTable.visible = false" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='inviteRequestMessageTable.visible = true; refreshInviteMessageTable("request")'
data-tables(v-if="inviteRequestMessageTable.visible" v-bind="inviteRequestMessageTable" style="margin-top:10px") size='mini'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") icon='el-icon-refresh'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") circle
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") style='margin-left: 5px')
template(#default="scope") el-tooltip(
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") placement='top'
el-table-column(:label="$t('table.profile.invite_messages.action')" width="60" align="right") :content='$t("view.profile.clear_results_tooltip")'
template(#default="scope") :disabled='hideTooltips')
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditInviteMessageDialog('request', scope.row)") el-button(
div.options-container type='default'
div.header-bar @click='inviteRequestMessageTable.visible = false'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
data-tables(
v-if='inviteRequestMessageTable.visible'
v-bind='inviteRequestMessageTable'
style='margin-top: 10px')
el-table-column(
:label='$t("table.profile.invite_messages.slot")'
prop='slot'
sortable='custom'
width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='60' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditInviteMessageDialog("request", scope.row)')
.options-container
.header-bar
span.header {{ $t('view.profile.invite_request_response_messages') }} span.header {{ $t('view.profile.invite_request_response_messages') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="inviteRequestResponseMessageTable.visible = true; refreshInviteMessageTable('requestResponse')" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="inviteRequestResponseMessageTable.visible = false" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='inviteRequestResponseMessageTable.visible = true; refreshInviteMessageTable("requestResponse")'
data-tables(v-if="inviteRequestResponseMessageTable.visible" v-bind="inviteRequestResponseMessageTable" style="margin-top:10px") size='mini'
el-table-column(:label="$t('table.profile.invite_messages.slot')" prop="slot" sortable="custom" width="70") icon='el-icon-refresh'
el-table-column(:label="$t('table.profile.invite_messages.message')" prop="message") circle
el-table-column(:label="$t('table.profile.invite_messages.cool_down')" prop="updatedAt" sortable="custom" width="110" align="right") style='margin-left: 5px')
template(#default="scope") el-tooltip(
countdown-timer(:datetime="scope.row.updatedAt" :hours="1") placement='top'
el-table-column(:label="$t('table.profile.invite_messages.action')" width="60" align="right") :content='$t("view.profile.clear_results_tooltip")'
template(#default="scope") :disabled='hideTooltips')
el-button(type="text" icon="el-icon-edit" size="mini" @click="showEditInviteMessageDialog('requestResponse', scope.row)") el-button(
div.options-container type='default'
@click='inviteRequestResponseMessageTable.visible = false'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
data-tables(
v-if='inviteRequestResponseMessageTable.visible'
v-bind='inviteRequestResponseMessageTable'
style='margin-top: 10px')
el-table-column(
:label='$t("table.profile.invite_messages.slot")'
prop='slot'
sortable='custom'
width='70')
el-table-column(:label='$t("table.profile.invite_messages.message")' prop='message')
el-table-column(
:label='$t("table.profile.invite_messages.cool_down")'
prop='updatedAt'
sortable='custom'
width='110'
align='right')
template(#default='scope')
countdown-timer(:datetime='scope.row.updatedAt' :hours='1')
el-table-column(:label='$t("table.profile.invite_messages.action")' width='60' align='right')
template(#default='scope')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
@click='showEditInviteMessageDialog("requestResponse", scope.row)')
.options-container
span.header {{ $t('view.profile.past_display_names') }} span.header {{ $t('view.profile.past_display_names') }}
data-tables(v-bind="pastDisplayNameTable" style="margin-top:10px") data-tables(v-bind='pastDisplayNameTable' style='margin-top: 10px')
el-table-column(:label="$t('table.profile.previous_display_name.date')" prop="updated_at" sortable="custom") el-table-column(
template(#default="scope") :label='$t("table.profile.previous_display_name.date")'
prop='updated_at'
sortable='custom')
template(#default='scope')
span {{ scope.row.updated_at | formatDate('long') }} span {{ scope.row.updated_at | formatDate('long') }}
el-table-column(:label="$t('table.profile.previous_display_name.name')" prop="displayName") el-table-column(:label='$t("table.profile.previous_display_name.name")' prop='displayName')
div.options-container .options-container
div.header-bar .header-bar
span.header {{ $t('view.profile.config_json') }} span.header {{ $t('view.profile.config_json') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="refreshConfigTreeData()" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="configTreeData = []" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='refreshConfigTreeData()'
el-tree(v-if="configTreeData.length > 0" :data="configTreeData" style="margin-top:10px;font-size:12px") size='mini'
template(#default="scope") icon='el-icon-refresh'
circle
style='margin-left: 5px')
el-tooltip(
placement='top'
:content='$t("view.profile.clear_results_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
@click='configTreeData = []'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tree(v-if='configTreeData.length > 0' :data='configTreeData' style='margin-top: 10px; font-size: 12px')
template(#default='scope')
span span
span(v-text="scope.data.key" style="font-weight:bold;margin-right:5px") span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if="!scope.data.children" v-text="scope.data.value") span(v-if='!scope.data.children' v-text='scope.data.value')
div.options-container .options-container
div.header-bar .header-bar
span.header {{ $t('view.profile.current_user_json') }} span.header {{ $t('view.profile.current_user_json') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="refreshCurrentUserTreeData()" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="currentUserTreeData = []" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='refreshCurrentUserTreeData()'
el-tree(v-if="currentUserTreeData.length > 0" :data="currentUserTreeData" style="margin-top:10px;font-size:12px") size='mini'
template(#default="scope") icon='el-icon-refresh'
circle
style='margin-left: 5px')
el-tooltip(
placement='top'
:content='$t("view.profile.clear_results_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
@click='currentUserTreeData = []'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tree(
v-if='currentUserTreeData.length > 0'
:data='currentUserTreeData'
style='margin-top: 10px; font-size: 12px')
template(#default='scope')
span span
span(v-text="scope.data.key" style="font-weight:bold;margin-right:5px") span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if="!scope.data.children" v-text="scope.data.value") span(v-if='!scope.data.children' v-text='scope.data.value')
div.options-container .options-container
div.header-bar .header-bar
span.header {{ $t('view.profile.feedback') }} span.header {{ $t('view.profile.feedback') }}
el-tooltip(placement="top" :content="$t('view.profile.refresh_tooltip')" :disabled="hideTooltips") el-tooltip(placement='top' :content='$t("view.profile.refresh_tooltip")' :disabled='hideTooltips')
el-button(type="default" @click="getCurrentUserFeedback()" size="mini" icon="el-icon-refresh" circle style="margin-left:5px") el-button(
el-tooltip(placement="top" :content="$t('view.profile.clear_results_tooltip')" :disabled="hideTooltips") type='default'
el-button(type="default" @click="currentUserFeedbackData = []" size="mini" icon="el-icon-delete" circle style="margin-left:5px") @click='getCurrentUserFeedback()'
el-tree(v-if="currentUserFeedbackData.length > 0" :data="currentUserFeedbackData" style="margin-top:10px;font-size:12px") size='mini'
template(#default="scope") icon='el-icon-refresh'
circle
style='margin-left: 5px')
el-tooltip(
placement='top'
:content='$t("view.profile.clear_results_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
@click='currentUserFeedbackData = []'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
el-tree(
v-if='currentUserFeedbackData.length > 0'
:data='currentUserFeedbackData'
style='margin-top: 10px; font-size: 12px')
template(#default='scope')
span span
span(v-text="scope.data.key" style="font-weight:bold;margin-right:5px") span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if="!scope.data.children" v-text="scope.data.value") span(v-if='!scope.data.children' v-text='scope.data.value')
+187 -80
View File
@@ -1,93 +1,200 @@
mixin searchTab() mixin searchTab
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'search'") .x-container(v-show='$refs.menu && $refs.menu.activeIndex === \'search\'')
div(style="margin:0 0 10px;display:flex;align-items:center") div(style='margin: 0 0 10px; display: flex; align-items: center')
el-input(v-model="searchText" :placeholder="$t('view.search.search_placeholder')" @keyup.native.13="search()" style="flex:1") el-input(
el-tooltip(placement="bottom" :content="$t('view.search.clear_results_tooltip')" :disabled="hideTooltips") v-model='searchText'
el-button(type="default" @click="clearSearch()" icon="el-icon-delete" circle style="flex:none;margin-left:10px") :placeholder='$t("view.search.search_placeholder")'
el-tabs(ref="searchTab" type="card" style="margin-top:15px" @tab-click="searchText = ''") @keyup.native.13='search()'
el-tab-pane(:label="$t('view.search.user.header')" v-loading="isSearchUserLoading" style="min-height:60px") style='flex: 1')
.x-friend-list(style="min-height:500px") el-tooltip(placement='bottom' :content='$t("view.search.clear_results_tooltip")' :disabled='hideTooltips')
.x-friend-item(v-for="user in searchUserResults" :key="user.id" @click="showUserDialog(user.id)") el-button(
type='default'
@click='clearSearch()'
icon='el-icon-delete'
circle
style='flex: none; margin-left: 10px')
el-tabs(ref='searchTab' type='card' style='margin-top: 15px' @tab-click='searchText = ""')
el-tab-pane(:label='$t("view.search.user.header")' v-loading='isSearchUserLoading' style='min-height: 60px')
.x-friend-list(style='min-height: 500px')
.x-friend-item(v-for='user in searchUserResults' :key='user.id' @click='showUserDialog(user.id)')
template template
.avatar .avatar
img(v-lazy="userImage(user)") img(v-lazy='userImage(user)')
.detail .detail
span.name(v-text="user.displayName") span.name(v-text='user.displayName')
span.extra(v-if="randomUserColours" v-text="user.$trustLevel" :class="user.$trustClass") span.extra(
span.extra(v-else v-text="user.$trustLevel" :style="{'color':user.$userColour}") v-if='randomUserColours'
el-button-group(style="margin-top:15px" v-if="searchUserResults.length") v-text='user.$trustLevel'
el-button(:disabled="!searchUserParams.offset" @click="moreSearchUser(-1)" icon="el-icon-back" size="small") {{ $t('view.search.prev_page') }} :class='user.$trustClass')
el-button(:disabled="searchUserResults.length < 10" @click="moreSearchUser(1)" icon="el-icon-right" size="small") {{ $t('view.search.next_page') }} span.extra(v-else v-text='user.$trustLevel' :style='{ color: user.$userColour }')
el-tab-pane(:label="$t('view.search.world.header')" v-loading="isSearchWorldLoading" style="min-height:60px") el-button-group(style='margin-top: 15px' v-if='searchUserResults.length')
el-dropdown(@command="(row) => searchWorld(row)" size="small" trigger="click" style="margin-bottom:15px") el-button(
el-button(size="small") {{ $t('view.search.world.category') }} #[i.el-icon-arrow-down.el-icon--right] :disabled='!searchUserParams.offset'
el-dropdown-menu(#default="dropdown") @click='moreSearchUser(-1)'
el-dropdown-item(v-for="row in API.cachedConfig.dynamicWorldRows" :key="row.index" v-text="row.name" :command="row") icon='el-icon-back'
el-checkbox(v-model="searchWorldLabs" style="margin-left:10px") {{ $t('view.search.world.community_lab') }} size='small') {{ $t('view.search.prev_page') }}
.x-friend-list(style="min-height:500px") el-button(
.x-friend-item(v-for="world in searchWorldResults" :key="world.id" @click="showWorldDialog(world.id)") :disabled='searchUserResults.length < 10'
@click='moreSearchUser(1)'
icon='el-icon-right'
size='small') {{ $t('view.search.next_page') }}
el-tab-pane(
:label='$t("view.search.world.header")'
v-loading='isSearchWorldLoading'
style='min-height: 60px')
el-dropdown(
@command='(row) => searchWorld(row)'
size='small'
trigger='click'
style='margin-bottom: 15px')
el-button(size='small') {{ $t('view.search.world.category') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default='dropdown')
el-dropdown-item(
v-for='row in API.cachedConfig.dynamicWorldRows'
:key='row.index'
v-text='row.name'
:command='row')
el-checkbox(v-model='searchWorldLabs' style='margin-left: 10px') {{ $t('view.search.world.community_lab') }}
.x-friend-list(style='min-height: 500px')
.x-friend-item(
v-for='world in searchWorldResults'
:key='world.id'
@click='showWorldDialog(world.id)')
template template
.avatar .avatar
img(v-lazy="world.thumbnailImageUrl") img(v-lazy='world.thumbnailImageUrl')
.detail .detail
span.name(v-text="world.name") span.name(v-text='world.name')
span.extra(v-if="world.occupants") {{ world.authorName }} ({{ world.occupants }}) span.extra(v-if='world.occupants') {{ world.authorName }} ({{ world.occupants }})
span.extra(v-else v-text="world.authorName") span.extra(v-else v-text='world.authorName')
el-button-group(style="margin-top:15px" v-if="searchWorldResults.length") el-button-group(style='margin-top: 15px' v-if='searchWorldResults.length')
el-button(:disabled="!searchWorldParams.offset" @click="moreSearchWorld(-1)" icon="el-icon-back" size="small") {{ $t('view.search.prev_page') }} el-button(
el-button(:disabled="searchWorldResults.length < 10" @click="moreSearchWorld(1)" icon="el-icon-right" size="small") {{ $t('view.search.next_page') }} :disabled='!searchWorldParams.offset'
el-tab-pane(:label="$t('view.search.avatar.header')" v-loading="isSearchAvatarLoading" style="min-height:60px") @click='moreSearchWorld(-1)'
div(style="display:flex;align-items:center;justify-content:space-between;") icon='el-icon-back'
div(style="display:flex;align-items:center;") size='small') {{ $t('view.search.prev_page') }}
el-dropdown(v-if="avatarRemoteDatabaseProviderList.length > 1" trigger="click" @click.native.stop size="mini" style="margin-right:5px") el-button(
el-button(size="small") {{ $t('view.search.avatar.search_provider') }} #[i.el-icon-arrow-down.el-icon--right] :disabled='searchWorldResults.length < 10'
el-dropdown-menu(#default="dropdown") @click='moreSearchWorld(1)'
el-dropdown-item(v-for="provider in avatarRemoteDatabaseProviderList" :key="provider" @click.native="setAvatarProvider(provider)") #[i.el-icon-check.el-icon--left(v-if="provider === avatarRemoteDatabaseProvider")] {{ provider }} icon='el-icon-right'
el-tooltip(placement="bottom" :content="$t('view.search.avatar.refresh_tooltip')" :disabled="hideTooltips") size='small') {{ $t('view.search.next_page') }}
el-button(type="default" :loading="userDialog.isAvatarsLoading" @click="refreshUserDialogAvatars()" size="mini" icon="el-icon-refresh" circle) el-tab-pane(
span(style="font-size:14px;margin-left:5px;margin-right:5px") {{ $t("view.search.avatar.result_count", { count: searchAvatarResults.length }) }} :label='$t("view.search.avatar.header")'
div(style="display:flex;align-items:center;") v-loading='isSearchAvatarLoading'
el-radio-group(v-model="searchAvatarFilter" size="mini" style="margin:5px;display:block" @change="searchAvatar") style='min-height: 60px')
el-radio(label="all") {{ $t('view.search.avatar.all') }} div(style='display: flex; align-items: center; justify-content: space-between')
el-radio(label="public") {{ $t('view.search.avatar.public') }} div(style='display: flex; align-items: center')
el-radio(label="private") {{ $t('view.search.avatar.private') }} el-dropdown(
el-divider(direction="vertical") v-if='avatarRemoteDatabaseProviderList.length > 1'
el-radio-group(v-model="searchAvatarFilterRemote" size="mini" style="margin:5px;display:block" @change="searchAvatar") trigger='click'
el-radio(label="all") {{ $t('view.search.avatar.all') }} @click.native.stop
el-radio(label="local") {{ $t('view.search.avatar.local') }} size='mini'
el-radio(label="remote" :disabled="!avatarRemoteDatabase") {{ $t('view.search.avatar.remote') }} style='margin-right: 5px')
div(style="display:flex;justify-content:end;") el-button(size='small') {{ $t('view.search.avatar.search_provider') }} #[i.el-icon-arrow-down.el-icon--right]
el-radio-group(:disabled="searchAvatarFilterRemote !== 'local'" v-model="searchAvatarSort" size="mini" style="margin:5px;display:block" @change="searchAvatar") el-dropdown-menu(#default='dropdown')
el-radio(label="name") {{ $t('view.search.avatar.sort_name') }} el-dropdown-item(
el-radio(label="update") {{ $t('view.search.avatar.sort_update') }} v-for='provider in avatarRemoteDatabaseProviderList'
el-radio(label="created") {{ $t('view.search.avatar.sort_created') }} :key='provider'
.x-friend-list(style="margin-top:20px;min-height:500px") @click.native='setAvatarProvider(provider)') #[i.el-icon-check.el-icon--left(v-if='provider === avatarRemoteDatabaseProvider')] {{ provider }}
.x-friend-item(v-for="avatar in searchAvatarPage" :key="avatar.id" @click="showAvatarDialog(avatar.id)") el-tooltip(
placement='bottom'
:content='$t("view.search.avatar.refresh_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
:loading='userDialog.isAvatarsLoading'
@click='refreshUserDialogAvatars()'
size='mini'
icon='el-icon-refresh'
circle)
span(style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ $t('view.search.avatar.result_count', { count: searchAvatarResults.length }) }}
div(style='display: flex; align-items: center')
el-radio-group(
v-model='searchAvatarFilter'
size='mini'
style='margin: 5px; display: block'
@change='searchAvatar')
el-radio(label='all') {{ $t('view.search.avatar.all') }}
el-radio(label='public') {{ $t('view.search.avatar.public') }}
el-radio(label='private') {{ $t('view.search.avatar.private') }}
el-divider(direction='vertical')
el-radio-group(
v-model='searchAvatarFilterRemote'
size='mini'
style='margin: 5px; display: block'
@change='searchAvatar')
el-radio(label='all') {{ $t('view.search.avatar.all') }}
el-radio(label='local') {{ $t('view.search.avatar.local') }}
el-radio(label='remote' :disabled='!avatarRemoteDatabase') {{ $t('view.search.avatar.remote') }}
div(style='display: flex; justify-content: end')
el-radio-group(
:disabled='searchAvatarFilterRemote !== "local"'
v-model='searchAvatarSort'
size='mini'
style='margin: 5px; display: block'
@change='searchAvatar')
el-radio(label='name') {{ $t('view.search.avatar.sort_name') }}
el-radio(label='update') {{ $t('view.search.avatar.sort_update') }}
el-radio(label='created') {{ $t('view.search.avatar.sort_created') }}
.x-friend-list(style='margin-top: 20px; min-height: 500px')
.x-friend-item(
v-for='avatar in searchAvatarPage'
:key='avatar.id'
@click='showAvatarDialog(avatar.id)')
template template
.avatar .avatar
img(v-if="avatar.thumbnailImageUrl" v-lazy="avatar.thumbnailImageUrl") img(v-if='avatar.thumbnailImageUrl' v-lazy='avatar.thumbnailImageUrl')
img(v-else-if="avatar.imageUrl" v-lazy="avatar.imageUrl") img(v-else-if='avatar.imageUrl' v-lazy='avatar.imageUrl')
.detail .detail
span.name(v-text="avatar.name") span.name(v-text='avatar.name')
span.extra(v-text="avatar.releaseStatus" v-if="avatar.releaseStatus === 'public'" style="color: #67c23a;") span.extra(
span.extra(v-text="avatar.releaseStatus" v-else-if="avatar.releaseStatus === 'private'" style="color: #f56c6c;") v-text='avatar.releaseStatus'
span.extra(v-text="avatar.releaseStatus" v-else) v-if='avatar.releaseStatus === "public"'
span.extra(v-text="avatar.authorName") style='color: #67c23a')
el-button-group(style="margin-top:15px" v-if="searchAvatarPage.length") span.extra(
el-button(:disabled="!searchAvatarPageNum" @click="moreSearchAvatar(-1)" icon="el-icon-back" size="small") {{ $t('view.search.prev_page') }} v-text='avatar.releaseStatus'
el-button(:disabled="searchAvatarResults.length < 10 || (searchAvatarPageNum + 1) * 10 >= searchAvatarResults.length" @click="moreSearchAvatar(1)" icon="el-icon-right" size="small") {{ $t('view.search.next_page') }} v-else-if='avatar.releaseStatus === "private"'
el-tab-pane(:label="$t('view.search.group.header')" v-loading="isSearchGroupLoading" style="min-height:60px") style='color: #f56c6c')
.x-friend-list(style="min-height:500px") span.extra(v-text='avatar.releaseStatus' v-else)
.x-friend-item(v-for="group in searchGroupResults" :key="group.id" @click="showGroupDialog(group.id)") span.extra(v-text='avatar.authorName')
el-button-group(style='margin-top: 15px' v-if='searchAvatarPage.length')
el-button(
:disabled='!searchAvatarPageNum'
@click='moreSearchAvatar(-1)'
icon='el-icon-back'
size='small') {{ $t('view.search.prev_page') }}
el-button(
:disabled='searchAvatarResults.length < 10 || (searchAvatarPageNum + 1) * 10 >= searchAvatarResults.length'
@click='moreSearchAvatar(1)'
icon='el-icon-right'
size='small') {{ $t('view.search.next_page') }}
el-tab-pane(
:label='$t("view.search.group.header")'
v-loading='isSearchGroupLoading'
style='min-height: 60px')
.x-friend-list(style='min-height: 500px')
.x-friend-item(
v-for='group in searchGroupResults'
:key='group.id'
@click='showGroupDialog(group.id)')
template template
.avatar .avatar
img(v-lazy="group.iconUrl") img(v-lazy='group.iconUrl')
.detail .detail
span.name span.name
span(v-text="group.name") span(v-text='group.name')
span(style="margin-left:5px;font-weight:normal") ({{ group.memberCount }}) span(style='margin-left: 5px; font-weight: normal') ({{ group.memberCount }})
span(style="margin-left:5px;color:#909399;font-weight:normal;font-family:monospace;font-size:12px") {{ group.shortCode }}.{{ group.discriminator }} span(
span.extra(v-text="group.description") style='margin-left: 5px; color: #909399; font-weight: normal; font-family: monospace; font-size: 12px') {{ group.shortCode }}.{{ group.discriminator }}
el-button-group(style="margin-top:15px" v-if="searchGroupResults.length") span.extra(v-text='group.description')
el-button(:disabled="!searchGroupParams.offset" @click="moreSearchGroup(-1)" icon="el-icon-back" size="small") {{ $t('view.search.prev_page') }} el-button-group(style='margin-top: 15px' v-if='searchGroupResults.length')
el-button(:disabled="searchGroupResults.length < 10" @click="moreSearchGroup(1)" icon="el-icon-right" size="small") {{ $t('view.search.next_page') }} el-button(
:disabled='!searchGroupParams.offset'
@click='moreSearchGroup(-1)'
icon='el-icon-back'
size='small') {{ $t('view.search.prev_page') }}
el-button(
:disabled='searchGroupResults.length < 10'
@click='moreSearchGroup(1)'
icon='el-icon-right'
size='small') {{ $t('view.search.next_page') }}
File diff suppressed because it is too large Load Diff
+529 -313
View File
File diff suppressed because it is too large Load Diff