refactor: Group Dialog (#1207)

This commit is contained in:
pa
2025-04-08 19:49:25 +09:00
committed by GitHub
parent dc5f48808f
commit 63cd5421e2
28 changed files with 5553 additions and 4465 deletions
-758
View File
@@ -1,758 +0,0 @@
mixin groupDialog
el-dialog.x-dialog.x-group-dialog(
:before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='groupDialog'
:visible.sync='groupDialog.visible'
:show-close='false'
width='770px'
top='10vh')
.group-banner-image
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='groupDialog.ref.bannerUrl'
style='flex: none; width: 100%; aspect-ratio: 6/1; object-fit: cover; border-radius: 4px')
img.x-link(
v-lazy='groupDialog.ref.bannerUrl'
style='width: 854px; height: 480px'
@click='showFullscreenImageDialog(groupDialog.ref.bannerUrl)')
.group-body(v-loading='groupDialog.loading')
div(style='display: flex')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='groupDialog.ref.iconUrl'
style='flex: none; width: 120px; height: 120px; border-radius: 12px')
img.x-link(
v-lazy='groupDialog.ref.iconUrl'
style='width: 500px; height: 500px'
@click='showFullscreenImageDialog(groupDialog.ref.iconUrl)')
div(style='flex: 1; display: flex; align-items: center; margin-left: 15px')
.group-header(style='flex: 1')
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.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')
template(#content)
span {{ item.value }} ({{ item.key }})
span.flags(
:class='languageClass(item.key)'
style='display: inline-block; margin-right: 5px')
div(style='margin-top: 5px')
span.x-link.x-grey(
v-text='groupDialog.ownerDisplayName'
@click='showUserDialog(groupDialog.ref.ownerId)'
style='font-family: monospace')
.group-tags
el-tag(
v-if='groupDialog.ref.isVerified'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.verified') }}
el-tag(
v-if='groupDialog.ref.privacy === "private"'
type='danger'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.private') }}
el-tag(
v-if='groupDialog.ref.privacy === "default"'
type='success'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.public') }}
el-tag(
v-if='groupDialog.ref.joinState === "open"'
type='success'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.open') }}
el-tag(
v-else-if='groupDialog.ref.joinState === "request"'
type='warning'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.request') }}
el-tag(
v-else-if='groupDialog.ref.joinState === "invite"'
type='danger'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.invite') }}
el-tag(
v-else-if='groupDialog.ref.joinState === "closed"'
type='danger'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.closed') }}
el-tag(
v-if='groupDialog.inGroup'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.joined') }}
el-tag(
v-if='groupDialog.ref.myMember && groupDialog.ref.myMember.bannedAt'
type='danger'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.banned') }}
template(v-if='groupDialog.inGroup && groupDialog.ref.myMember')
el-tag(
v-if='groupDialog.ref.myMember.visibility === "visible"'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.visible') }}
el-tag(
v-else-if='groupDialog.ref.myMember.visibility === "friends"'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.friends') }}
el-tag(
v-else-if='groupDialog.ref.myMember.visibility === "hidden"'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.hidden') }}
el-tag(
v-if='groupDialog.ref.myMember.isSubscribedToAnnouncements'
type='info'
effect='plain'
size='mini'
style='margin-right: 5px; margin-top: 5px') {{ $t('dialog.group.tags.subscribed') }}
.group-description(style='margin-top: 5px')
span(
v-show='groupDialog.ref.name !== groupDialog.ref.description'
v-text='groupDialog.ref.description'
style='font-size: 12px')
div(style='flex: none; margin-left: 10px')
template(v-if='groupDialog.inGroup && groupDialog.ref?.myMember')
el-tooltip(
v-if='groupDialog.ref.myMember?.isRepresenting'
placement='top'
:content='$t("dialog.group.actions.unrepresent_tooltip")'
:disabled='hideTooltips')
el-button(
type='warning'
icon='el-icon-star-on'
circle
@click='clearGroupRepresentation(groupDialog.id)'
style='margin-left: 5px')
el-tooltip(
v-else
placement='top'
:content='$t("dialog.group.actions.represent_tooltip")'
:disabled='hideTooltips')
span
el-button(
type='default'
icon='el-icon-star-off'
circle
@click='setGroupRepresentation(groupDialog.id)'
style='margin-left: 5px'
:disabled='groupDialog.ref.privacy === "private"')
template(v-else-if='groupDialog.ref.myMember?.membershipStatus === "requested"')
el-tooltip(
placement='top'
:content='$t("dialog.group.actions.cancel_join_request_tooltip")'
:disabled='hideTooltips')
span
el-button(
type='default'
icon='el-icon-close'
circle
@click='cancelGroupRequest(groupDialog.id)'
style='margin-left: 5px')
template(v-else-if='groupDialog.ref.myMember?.membershipStatus === "invited"')
el-tooltip(
placement='top'
:content='$t("dialog.group.actions.pending_request_tooltip")'
:disabled='hideTooltips')
span
el-button(
type='default'
icon='el-icon-check'
circle
@click='joinGroup(groupDialog.id)'
style='margin-left: 5px')
template(v-else)
el-tooltip(
v-if='groupDialog.ref.joinState === "request"'
placement='top'
:content='$t("dialog.group.actions.request_join_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
icon='el-icon-message'
circle
@click='joinGroup(groupDialog.id)'
style='margin-left: 5px')
el-tooltip(
v-if='groupDialog.ref.joinState === "invite"'
placement='top'
:content='$t("dialog.group.actions.invite_required_tooltip")'
:disabled='hideTooltips')
span
el-button(
type='default'
icon='el-icon-message'
disabled
circle
style='margin-left: 5px')
el-tooltip(
v-if='groupDialog.ref.joinState === "open"'
placement='top'
:content='$t("dialog.group.actions.join_group_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
icon='el-icon-check'
circle
@click='joinGroup(groupDialog.id)'
style='margin-left: 5px')
el-dropdown(
trigger='click'
@command='groupDialogCommand'
size='small'
style='margin-left: 5px')
el-button(
:type='groupDialog.ref.membershipStatus === "userblocked" ? "danger" : "default"'
icon='el-icon-more'
circle)
el-dropdown-menu(#default='dropdown')
el-dropdown-item(icon='el-icon-refresh' command='Refresh') {{ $t('dialog.group.actions.refresh') }}
el-dropdown-item(icon='el-icon-share' command='Share') {{ $t('dialog.group.actions.share') }}
template(v-if='groupDialog.inGroup')
template(v-if='groupDialog.ref.myMember')
el-dropdown-item(
v-if='groupDialog.ref.myMember.isSubscribedToAnnouncements'
icon='el-icon-close'
command='Unsubscribe To Announcements'
divided) {{ $t('dialog.group.actions.unsubscribe') }}
el-dropdown-item(
v-else
icon='el-icon-check'
command='Subscribe To Announcements'
divided) {{ $t('dialog.group.actions.subscribe') }}
el-dropdown-item(
v-if='hasGroupPermission(groupDialog.ref, "group-invites-manage")'
icon='el-icon-message'
command='Invite To Group') {{ $t('dialog.group.actions.invite_to_group') }}
template(v-if='hasGroupPermission(groupDialog.ref, "group-announcement-manage")')
el-dropdown-item(icon='el-icon-tickets' command='Create Post') {{ $t('dialog.group.actions.create_post') }}
//- template(v-if="hasGroupPermission(groupDialog.ref, 'group-members-manage')")
el-dropdown-item(icon='el-icon-s-operation' command='Moderation Tools') {{ $t('dialog.group.actions.moderation_tools') }}
template(v-if='groupDialog.ref.myMember && groupDialog.ref.privacy === "default"')
el-dropdown-item(icon='el-icon-view' command='Visibility Everyone' divided) #[i.el-icon-check(v-if='groupDialog.ref.myMember.visibility === "visible"')] {{ $t('dialog.group.actions.visibility_everyone') }}
el-dropdown-item(icon='el-icon-view' command='Visibility Friends') #[i.el-icon-check(v-if='groupDialog.ref.myMember.visibility === "friends"')] {{ $t('dialog.group.actions.visibility_friends') }}
el-dropdown-item(icon='el-icon-view' command='Visibility Hidden') #[i.el-icon-check(v-if='groupDialog.ref.myMember.visibility === "hidden"')] {{ $t('dialog.group.actions.visibility_hidden') }}
el-dropdown-item(
icon='el-icon-delete'
command='Leave Group'
style='color: #f56c6c'
divided) {{ $t('dialog.group.actions.leave') }}
template(v-else)
el-dropdown-item(
v-if='groupDialog.ref.membershipStatus === "userblocked"'
icon='el-icon-circle-check'
command='Unblock Group'
style='color: #f56c6c'
divided) {{ $t('dialog.group.actions.unblock') }}
el-dropdown-item(v-else icon='el-icon-circle-close' command='Block Group' divided) {{ $t('dialog.group.actions.block') }}
el-tabs(ref='groupDialogTabs' @tab-click='groupDialogTabClick')
el-tab-pane(:label='$t("dialog.group.info.header")')
.group-banner-image-info
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='groupDialog.ref.bannerUrl'
style='flex: none; width: 100%; aspect-ratio: 6/1; object-fit: cover; border-radius: 4px')
img.x-link(
v-lazy='groupDialog.ref.bannerUrl'
style='width: 854px; height: 480px'
@click='showFullscreenImageDialog(groupDialog.ref.bannerUrl)')
.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') }}
div(v-for='room in groupDialog.instances' :key='room.tag' style='width: 100%')
div(style='margin: 5px 0')
location(:location='room.tag' style='display: inline-block')
el-tooltip(placement='top' content='Invite yourself' :disabled='hideTooltips')
invite-yourself(:location='room.tag' style='margin-left: 5px')
el-tooltip(placement='top' content='Refresh player count' :disabled='hideTooltips')
el-button(
@click='refreshInstancePlayerCount(room.tag)'
size='mini'
icon='el-icon-refresh'
style='margin-left: 5px'
circle)
last-join(:location='room.tag' :currentlocation='lastLocation.location')
instance-info(
:location='room.tag'
:instance='room.ref'
:friendcount='room.friendCount'
:updateelement='updateInstanceInfo')
.x-friend-list(
style='margin: 10px 0; padding: 0; max-height: unset'
v-if='room.users.length')
.x-friend-item.x-friend-item-border(
v-for='user in room.users'
:key='user.id'
@click='showUserDialog(user.id)')
.avatar(:class='userStatusClass(user)')
img(v-lazy='userImage(user)')
.detail
span.name(v-text='user.displayName' :style='{ color: user.$userColour }')
span.extra(v-if='user.location === "traveling"')
i.el-icon-loading(style='margin-right: 5px')
timer(:epoch='user.$travelingToTime')
span.extra(v-else)
timer(:epoch='user.$location_at')
.x-friend-item(style='width: 100%; cursor: default')
.detail
span.name {{ $t('dialog.group.info.announcement') }}
span(style='display: block' v-text='groupDialog.announcement.title')
div(
v-if='groupDialog.announcement.imageUrl'
style='display: inline-block; margin-right: 5px')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='groupDialog.announcement.imageUrl'
style='flex: none; width: 60px; height: 60px; border-radius: 4px; object-fit: cover')
img.x-link(
v-lazy='groupDialog.announcement.imageUrl'
style='height: 500px'
@click='showFullscreenImageDialog(groupDialog.announcement.imageUrl)')
pre.extra(
style='display: inline-block; vertical-align: top; font-family: inherit; font-size: 12px; white-space: pre-wrap; margin: 0') {{ groupDialog.announcement.text || '-' }}
br
.extra(v-if='groupDialog.announcement.id' style='float: right; margin-left: 5px')
el-tooltip(v-if='groupDialog.announcement.roleIds.length' placement='top')
template(#content)
span {{ $t('dialog.group.posts.visibility') }}
br
template(v-for='roleId in groupDialog.announcement.roleIds')
span(
v-for='(role, rIndex) in groupDialog.ref.roles'
:key='rIndex'
v-if='role.id === roleId'
v-text='role.name')
span(
v-if='groupDialog.announcement.roleIds.indexOf(roleId) < groupDialog.announcement.roleIds.length - 1') ,&nbsp;
i.el-icon-view(style='margin-right: 5px')
display-name(:userid='groupDialog.announcement.authorId' style='margin-right: 5px')
span(v-if='groupDialog.announcement.editorId' style='margin-right: 5px') ({{ $t('dialog.group.posts.edited_by') }} #[display-name(:userid='groupDialog.announcement.editorId')])
el-tooltip(placement='bottom')
template(#content)
span {{ $t('dialog.group.posts.created_at') }} {{ groupDialog.announcement.createdAt | formatDate('long') }}
template(
v-if='groupDialog.announcement.updatedAt !== groupDialog.announcement.createdAt')
br
span {{ $t('dialog.group.posts.edited_at') }} {{ groupDialog.announcement.updatedAt | formatDate('long') }}
timer(:epoch='Date.parse(groupDialog.announcement.updatedAt)')
template(v-if='hasGroupPermission(groupDialog.ref, "group-announcement-manage")')
el-tooltip(
placement='top'
:content='$t("dialog.group.posts.edit_tooltip")'
:disabled='hideTooltips')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
style='margin-left: 5px'
@click='showGroupPostEditDialog(groupDialog.id, groupDialog.announcement)')
el-tooltip(
placement='top'
:content='$t("dialog.group.posts.delete_tooltip")'
:disabled='hideTooltips')
el-button(
type='text'
icon='el-icon-delete'
size='mini'
style='margin-left: 5px'
@click='confirmDeleteGroupPost(groupDialog.announcement)')
.x-friend-item(style='width: 100%; cursor: default')
.detail
span.name {{ $t('dialog.group.info.rules') }}
pre.extra(
style='font-family: inherit; font-size: 12px; white-space: pre-wrap; margin: 0 0.5em 0 0') {{ groupDialog.ref.rules || '-' }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.group.info.members') }}
.extra {{ groupDialog.ref.memberCount }} ({{ groupDialog.ref.onlineMemberCount }})
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.group.info.created_at') }}
span.extra {{ groupDialog.ref.createdAt | formatDate('long') }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.group.info.links') }}
div(
v-if='groupDialog.ref.links && groupDialog.ref.links.length > 0'
style='margin-top: 5px')
el-tooltip(v-if='link' v-for='(link, index) in groupDialog.ref.links' :key='index')
template(#content)
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)')
.extra(v-else) -
.x-friend-item(style='width: 350px; cursor: default')
.detail
span.name {{ $t('dialog.group.info.url') }}
span.extra {{ groupDialog.ref.$url }}
el-tooltip(
placement='top'
:content='$t("dialog.group.info.url_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
@click='copyGroupUrl(groupDialog.ref.$url)'
size='mini'
icon='el-icon-s-order'
circle
style='margin-left: 5px')
.x-friend-item(style='width: 350px; cursor: default')
.detail
span.name {{ $t('dialog.group.info.id') }}
span.extra {{ groupDialog.id }}
el-tooltip(
placement='top'
:content='$t("dialog.group.info.id_tooltip")'
:disabled='hideTooltips')
el-button(
type='default'
@click='copyGroupId(groupDialog.id)'
size='mini'
icon='el-icon-s-order'
circle
style='margin-left: 5px')
div(
v-if='groupDialog.ref.membershipStatus === "member"'
style='width: 100%; margin-top: 10px; border-top: 1px solid #e4e7ed14')
div(style='width: 100%; display: flex; margin-top: 10px')
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.group.info.joined_at') }}
span.extra {{ groupDialog.ref.myMember.joinedAt | formatDate('long') }}
.x-friend-item(style='cursor: default')
.detail
span.name {{ $t('dialog.group.info.roles') }}
span.extra(v-if='groupDialog.memberRoles.length === 0') -
span.extra(v-else)
template(v-for='(role, rIndex) in groupDialog.memberRoles')
el-tooltip(:key='rIndex' placement='top')
template(#content)
span {{ $t('dialog.group.info.role') }} {{ role.name }}
br
span {{ $t('dialog.group.info.role_description') }} {{ role.description }}
br
span(v-if='role.updatedAt') {{ $t('dialog.group.info.role_updated_at') }} {{ role.updatedAt | formatDate('long') }}
span(v-else) {{ $t('dialog.group.info.role_created_at') }} {{ role.createdAt | formatDate('long') }}
br
span {{ $t('dialog.group.info.role_permissions') }}
br
template(v-for='(permission, pIndex) in role.permissions')
span(:key='pIndex') {{ permission }}
br
span {{ role.name }}{{ rIndex < groupDialog.memberRoles.length - 1 ? ', ' : '' }}
el-tab-pane(:label='$t("dialog.group.posts.header")' lazy)
template(v-if='groupDialog.visible')
span(style='margin-right: 10px') {{ $t('dialog.group.posts.posts_count') }} {{ groupDialog.posts.length }}
el-input(
v-model='groupDialog.postsSearch'
@input='updateGroupPostSearch'
clearable
size='mini'
:placeholder='$t("dialog.group.posts.search_placeholder")'
style='width: 89%; margin-bottom: 10px')
.x-friend-list
.x-friend-item(
v-for='post in groupDialog.postsFiltered'
:key='post.id'
style='width: 100%; cursor: default')
.detail
span(style='display: block' v-text='post.title')
div(v-if='post.imageUrl' style='display: inline-block; margin-right: 5px')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='post.imageUrl'
style='flex: none; width: 60px; height: 60px; border-radius: 4px; object-fit: cover')
img.x-link(
v-lazy='post.imageUrl'
style='height: 500px'
@click='showFullscreenImageDialog(post.imageUrl)')
pre.extra(
style='display: inline-block; vertical-align: top; font-family: inherit; font-size: 12px; white-space: pre-wrap; margin: 0') {{ post.text || '-' }}
br
.extra(v-if='post.authorId' style='float: right; margin-left: 5px')
el-tooltip(v-if='post.roleIds.length' placement='top')
template(#content)
span {{ $t('dialog.group.posts.visibility') }}
br
template(v-for='roleId in post.roleIds')
span(
v-for='(role, rIndex) in groupDialog.ref.roles'
:key='rIndex'
v-if='role.id === roleId'
v-text='role.name')
span(v-if='post.roleIds.indexOf(roleId) < post.roleIds.length - 1') ,&nbsp;
i.el-icon-view(style='margin-right: 5px')
display-name(:userid='post.authorId' style='margin-right: 5px')
span(v-if='post.editorId' style='margin-right: 5px') ({{ $t('dialog.group.posts.edited_by') }} #[display-name(:userid='post.editorId')])
el-tooltip(placement='bottom')
template(#content)
span {{ $t('dialog.group.posts.created_at') }} {{ post.createdAt | formatDate('long') }}
template(v-if='post.updatedAt !== post.createdAt')
br
span {{ $t('dialog.group.posts.edited_at') }} {{ post.updatedAt | formatDate('long') }}
timer(:epoch='Date.parse(post.updatedAt)')
template(
v-if='hasGroupPermission(groupDialog.ref, "group-announcement-manage")')
el-tooltip(
placement='top'
:content='$t("dialog.group.posts.edit_tooltip")'
:disabled='hideTooltips')
el-button(
type='text'
icon='el-icon-edit'
size='mini'
style='margin-left: 5px'
@click='showGroupPostEditDialog(groupDialog.id, post)')
el-tooltip(
placement='top'
:content='$t("dialog.group.posts.delete_tooltip")'
:disabled='hideTooltips')
el-button(
type='text'
icon='el-icon-delete'
size='mini'
style='margin-left: 5px'
@click='confirmDeleteGroupPost(post)')
el-tab-pane(:label='$t("dialog.group.members.header")' lazy)
template(v-if='groupDialog.visible')
span(
v-if='hasGroupPermission(groupDialog.ref, "group-members-viewall")'
style='font-weight: bold; font-size: 16px') {{ $t('dialog.group.members.all_members') }}
span(v-else style='font-weight: bold; font-size: 16px') {{ $t('dialog.group.members.friends_only') }}
div(style='margin-top: 10px')
el-button(
type='default'
@click='loadAllGroupMembers'
size='mini'
icon='el-icon-refresh'
:loading='isGroupMembersLoading'
circle)
el-button(
type='default'
@click='downloadAndSaveJson(`${groupDialog.id}_members`, groupDialog.members)'
size='mini'
icon='el-icon-download'
circle
style='margin-left: 5px')
span(
v-if='groupDialog.memberSearch.length'
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 }}
div(
v-if='hasGroupPermission(groupDialog.ref, "group-members-manage")'
style='float: right')
span(style='margin-right: 5px') {{ $t('dialog.group.members.sort_by') }}
el-dropdown(
@click.native.stop
trigger='click'
size='small'
style='margin-right: 5px'
:disabled='isGroupMembersLoading || groupDialog.memberSearch.length')
el-button(size='mini')
span {{ groupDialog.memberSortOrder.name }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default='dropdown')
el-dropdown-item(
v-for='item in groupDialogSortingOptions'
:key='item.name'
v-text='item.name'
@click.native='setGroupMemberSortOrder(item)')
span(style='margin-right: 5px') {{ $t('dialog.group.members.filter') }}
el-dropdown(
@click.native.stop
trigger='click'
size='small'
style='margin-right: 5px'
:disabled='isGroupMembersLoading || groupDialog.memberSearch.length')
el-button(size='mini')
span {{ groupDialog.memberFilter.name }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default='dropdown')
el-dropdown-item(
v-for='item in groupDialogFilterOptions'
:key='item.name'
v-text='item.name'
@click.native='setGroupMemberFilter(item)')
el-dropdown-item(
v-for='item in groupDialog.ref.roles'
:key='item.name'
v-if='!item.defaultRole'
v-text='item.name'
@click.native='setGroupMemberFilter(item)')
el-input(
v-model='groupDialog.memberSearch'
@input='groupMembersSearch'
clearable
size='mini'
:placeholder='$t("dialog.group.members.search")'
style='margin-top: 10px; margin-bottom: 10px')
.x-friend-list(
v-if='groupDialog.memberSearch.length'
v-loading='isGroupMembersLoading'
style='margin-top: 10px; overflow: auto; max-height: 250px; min-width: 130px')
.x-friend-item.x-friend-item-border(
v-for='user in groupDialog.memberSearchResults'
:key='user.id'
@click='showUserDialog(user.userId)')
.avatar
img(v-lazy='userImage(user.user)')
.detail
span.name(v-text='user.user.displayName' :style='{ color: user.user.$userColour }')
span.extra
template(v-if='hasGroupPermission(groupDialog.ref, "group-members-manage")')
el-tooltip(
v-if='user.isRepresenting'
placement='top'
:content='$t("dialog.group.members.representing")')
i.el-icon-collection-tag(style='margin-right: 5px')
el-tooltip(v-if='user.visibility !== "visible"' placement='top')
template(#content)
span {{ $t('dialog.group.members.visibility') }} {{ user.visibility }}
i.el-icon-view(style='margin-right: 5px')
el-tooltip(
v-if='!user.isSubscribedToAnnouncements'
placement='top'
:content='$t("dialog.group.members.unsubscribed_announcements")')
i.el-icon-chat-line-square(style='margin-right: 5px')
el-tooltip(v-if='user.managerNotes' placement='top')
template(#content)
span {{ $t('dialog.group.members.manager_notes') }}
br
span {{ user.managerNotes }}
i.el-icon-edit-outline(style='margin-right: 5px')
template(v-for='roleId in user.roleIds')
span(
v-for='(role, rIndex) in groupDialog.ref.roles'
:key='rIndex'
v-if='role.id === roleId'
v-text='role.name')
span(v-if='user.roleIds.indexOf(roleId) < user.roleIds.length - 1') ,&nbsp;
ul.infinite-list.x-friend-list(
v-else-if='groupDialog.members.length > 0'
v-infinite-scroll='loadMoreGroupMembers'
style='margin-top: 10px; overflow: auto; max-height: 250px; min-width: 130px')
li.infinite-list-item.x-friend-item.x-friend-item-border(
v-for='user in groupDialog.members'
:key='user.id'
@click='showUserDialog(user.userId)')
.avatar
img(v-lazy='userImage(user.user)')
.detail
span.name(v-text='user.user.displayName' :style='{ color: user.user.$userColour }')
span.extra
template(v-if='hasGroupPermission(groupDialog.ref, "group-members-manage")')
el-tooltip(
v-if='user.isRepresenting'
placement='top'
:content='$t("dialog.group.members.representing")')
i.el-icon-collection-tag(style='margin-right: 5px')
el-tooltip(v-if='user.visibility !== "visible"' placement='top')
template(#content)
span {{ $t('dialog.group.members.visibility') }} {{ user.visibility }}
i.el-icon-view(style='margin-right: 5px')
el-tooltip(
v-if='!user.isSubscribedToAnnouncements'
placement='top'
:content='$t("dialog.group.members.unsubscribed_announcements")')
i.el-icon-chat-line-square(style='margin-right: 5px')
el-tooltip(v-if='user.managerNotes' placement='top')
template(#content)
span {{ $t('dialog.group.members.manager_notes') }}
br
span {{ user.managerNotes }}
i.el-icon-edit-outline(style='margin-right: 5px')
template(v-for='roleId in user.roleIds')
span(
v-for='(role, rIndex) in groupDialog.ref.roles'
:key='rIndex'
v-if='role.id === roleId'
v-text='role.name')
span(v-if='user.roleIds.indexOf(roleId) < user.roleIds.length - 1') ,&nbsp;
.x-friend-item(
v-if='!isGroupMembersDone'
v-loading='isGroupMembersLoading'
style='width: 100%; height: 45px; text-align: center'
@click='loadMoreGroupMembers')
.detail(v-if='!isGroupMembersLoading')
span.name {{ $t('dialog.group.members.load_more') }}
el-tab-pane(:label='$t("dialog.group.gallery.header")' lazy)
el-button(
type='default'
size='mini'
icon='el-icon-refresh'
@click='getGroupGalleries'
:loading='isGroupGalleryLoading'
circle)
el-tabs(
type='card'
v-loading='isGroupGalleryLoading'
ref='groupDialogGallery'
style='margin-top: 10px')
template(v-for='(gallery, index) in groupDialog.ref.galleries')
el-tab-pane
span(slot='label')
span(v-text='gallery.name' style='font-weight: bold; font-size: 16px')
i.x-status-icon(style='margin-left: 5px' :class='groupGalleryStatus(gallery)')
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ groupDialog.galleries[gallery.id] ? groupDialog.galleries[gallery.id].length : 0 }}
span(v-text='gallery.description' style='color: #c7c7c7; padding: 10px')
el-carousel(:interval='0' height='600px' style='margin-top: 10px')
el-carousel-item(
v-for='image in groupDialog.galleries[gallery.id]'
:key='image.id')
el-popover(placement='top' width='700px' trigger='click')
img.x-link(
slot='reference'
v-lazy='image.imageUrl'
style='width: 100%; height: 100%; object-fit: contain')
img.x-link(
v-lazy='image.imageUrl'
style='height: 700px'
@click='showFullscreenImageDialog(image.imageUrl)')
el-tab-pane(:label='$t("dialog.group.json.header")' lazy)
el-button(
type='default'
@click='refreshGroupDialogTreeData()'
size='mini'
icon='el-icon-refresh'
circle)
el-button(
type='default'
@click='downloadAndSaveJson(groupDialog.id, groupDialog.ref)'
size='mini'
icon='el-icon-download'
circle
style='margin-left: 5px')
el-tree(:data='groupDialog.treeData' style='margin-top: 5px; font-size: 12px')
template(#default='scope')
span
span(v-text='scope.data.key' style='font-weight: bold; margin-right: 5px')
span(v-if='!scope.data.children' v-text='scope.data.value')
-743
View File
@@ -1,743 +0,0 @@
mixin groups
//- dialog: invite group
el-dialog.x-dialog(
:before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='inviteGroupDialog'
:visible.sync='inviteGroupDialog.visible'
:title='$t("dialog.invite_to_group.header")'
width='450px')
div(v-if='inviteGroupDialog.visible' v-loading='inviteGroupDialog.loading')
span {{ $t('dialog.invite_to_group.description') }}
br
el-select(
v-model='inviteGroupDialog.groupId'
clearable
:placeholder='$t("dialog.invite_to_group.choose_group_placeholder")'
filterable
:disabled='inviteGroupDialog.loading'
@change='isAllowedToInviteToGroup'
style='margin-top: 15px')
el-option-group(
v-if='API.currentUserGroups.size'
:label='$t("dialog.invite_to_group.groups")'
style='width: 410px')
el-option.x-friend-item(
v-for='group in API.currentUserGroups.values()'
:key='group.id'
:label='group.name'
:value='group.id'
style='height: auto')
.avatar
img(v-lazy='group.iconUrl')
.detail
span.name(v-text='group.name')
el-select(
v-model='inviteGroupDialog.userIds'
multiple
clearable
:placeholder='$t("dialog.invite_to_group.choose_friends_placeholder")'
filterable
:disabled='inviteGroupDialog.loading'
style='width: 100%; margin-top: 15px')
el-option-group(v-if='inviteGroupDialog.userId' :label='$t("dialog.invite_to_group.selected_users")')
el-option.x-friend-item(
:key='inviteGroupDialog.userObject.id'
:label='inviteGroupDialog.userObject.displayName'
:value='inviteGroupDialog.userObject.id'
style='height: auto')
template(v-if='inviteGroupDialog.userObject.id')
.avatar(:class='userStatusClass(inviteGroupDialog.userObject)')
img(v-lazy='userImage(inviteGroupDialog.userObject)')
.detail
span.name(
v-text='inviteGroupDialog.userObject.displayName'
:style='{ color: inviteGroupDialog.userObject.$userColour }')
span(v-else v-text='inviteGroupDialog.userId')
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
span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text='friend.id')
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')
template(v-if='friend.ref')
.avatar(:class='userStatusClass(friend.ref)')
img(v-lazy='userImage(friend.ref)')
.detail
span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text='friend.id')
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
img(v-lazy='userImage(friend.ref)')
.detail
span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text='friend.id')
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
img(v-lazy='userImage(friend.ref)')
.detail
span.name(v-text='friend.ref.displayName' :style='{ color: friend.ref.$userColour }')
span(v-else v-text='friend.id')
template(#footer)
el-button(
type='primary'
size='small'
:disabled='inviteGroupDialog.loading || !inviteGroupDialog.userIds.length'
@click='sendGroupInvite()') Invite
//- dialog: group moderation
el-dialog.x-dialog(
:before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='groupMemberModeration'
:visible.sync='groupMemberModeration.visible'
:title='$t("dialog.group_member_moderation.header")'
width='90vw')
div(v-if='groupMemberModeration.visible')
h3(v-text='groupMemberModeration.groupRef.name')
el-tabs(type='card' style='height: 100%')
el-tab-pane(:label='$t("dialog.group_member_moderation.members")')
div(style='margin-top: 10px')
el-button(
type='default'
@click='loadAllGroupMembers'
size='mini'
icon='el-icon-refresh'
:loading='isGroupMembersLoading'
circle)
span(style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupMemberModerationTable.data.length }}/{{ groupMemberModeration.groupRef.memberCount }}
div(style='float: right; margin-top: 5px')
span(style='margin-right: 5px') {{ $t('dialog.group.members.sort_by') }}
el-dropdown(
@click.native.stop
trigger='click'
size='small'
style='margin-right: 5px'
:disabled='isGroupMembersLoading || groupDialog.memberSearch.length || !hasGroupPermission(groupDialog.ref, "group-bans-manage")')
el-button(size='mini')
span {{ groupDialog.memberSortOrder.name }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default='dropdown')
el-dropdown-item(
v-for='item in groupDialogSortingOptions'
:key='item.name'
v-text='item.name'
@click.native='setGroupMemberSortOrder(item)')
span(style='margin-right: 5px') {{ $t('dialog.group.members.filter') }}
el-dropdown(
@click.native.stop
trigger='click'
size='small'
style='margin-right: 5px'
:disabled='isGroupMembersLoading || groupDialog.memberSearch.length || !hasGroupPermission(groupDialog.ref, "group-bans-manage")')
el-button(size='mini')
span {{ groupDialog.memberFilter.name }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default='dropdown')
el-dropdown-item(
v-for='item in groupDialogFilterOptions'
:key='item.name'
v-text='item.name'
@click.native='setGroupMemberFilter(item)')
el-dropdown-item(
v-for='item in groupDialog.ref.roles'
:key='item.name'
v-if='!item.defaultRole'
v-text='item.name'
@click.native='setGroupMemberFilter(item)')
el-input(
v-model='groupDialog.memberSearch'
:disabled='!hasGroupPermission(groupDialog.ref, "group-bans-manage")'
@input='groupMembersSearch'
clearable
size='mini'
:placeholder='$t("dialog.group.members.search")'
style='margin-top: 10px; margin-bottom: 10px')
br
el-button(size='small' @click='selectAllGroupMembers') {{ $t('dialog.group_member_moderation.select_all') }}
data-tables(v-bind='groupMemberModerationTable' style='margin-top: 10px')
el-table-column(width='55' prop='$selected' :key='groupMemberModerationTableForceUpdate')
template(#default='scope')
el-button(type='text' size='mini' @click.stop)
el-checkbox(
v-model='scope.row.$selected'
@change='groupMemberModerationTableSelectionChange(scope.row)')
el-table-column(:label='$t("dialog.group_member_moderation.avatar")' width='70' prop='photo')
template(#default='scope')
el-popover(placement='right' height='500px' trigger='hover')
img.friends-list-avatar(slot='reference' v-lazy='userImage(scope.row.user)')
img.friends-list-avatar(
v-lazy='userImageFull(scope.row.user)'
style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row.user))')
el-table-column(
:label='$t("dialog.group_member_moderation.display_name")'
width='160'
prop='$displayName'
sortable)
template(#default='scope')
span(style='cursor: pointer' @click='showUserDialog(scope.row.userId)')
span(
v-if='randomUserColours'
v-text='scope.row.user.displayName'
:style='{ color: scope.row.user.$userColour }')
span(v-else v-text='scope.row.user.displayName')
el-table-column(:label='$t("dialog.group_member_moderation.roles")' prop='roleIds' sortable)
template(#default='scope')
template(v-for='roleId in scope.row.roleIds')
span(
v-for='(role, rIndex) in groupMemberModeration.groupRef.roles'
:key='rIndex'
v-if='role.id === roleId'
v-text='role.name')
span(v-if='scope.row.roleIds.indexOf(roleId) < scope.row.roleIds.length - 1') ,&nbsp;
el-table-column(
:label='$t("dialog.group_member_moderation.notes")'
prop='managerNotes'
sortable)
template(#default='scope')
span(v-text='scope.row.managerNotes' @click.stop)
el-table-column(
:label='$t("dialog.group_member_moderation.joined_at")'
width='170'
prop='joinedAt'
sortable)
template(#default='scope')
span {{ scope.row.joinedAt | formatDate('long') }}
el-table-column(
:label='$t("dialog.group_member_moderation.visibility")'
width='120'
prop='visibility'
sortable)
template(#default='scope')
span(v-text='scope.row.visibility')
el-tab-pane(
:label='$t("dialog.group_member_moderation.bans")'
:disabled='!hasGroupPermission(groupDialog.ref, "group-bans-manage")')
div(style='margin-top: 10px')
el-button(
type='default'
@click='getAllGroupBans(groupMemberModeration.id)'
size='mini'
icon='el-icon-refresh'
:loading='isGroupMembersLoading'
circle)
span(style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupBansModerationTable.data.length }}
br
el-input(
v-model='groupBansModerationTable.filters[0].value'
clearable
size='mini'
:placeholder='$t("dialog.group.members.search")'
style='margin-top: 10px; margin-bottom: 10px')
br
el-button(size='small' @click='selectAllGroupBans') {{ $t('dialog.group_member_moderation.select_all') }}
data-tables(v-bind='groupBansModerationTable' style='margin-top: 10px')
el-table-column(width='55' prop='$selected' :key='groupMemberModerationTableForceUpdate')
template(#default='scope')
el-button(type='text' size='mini' @click.stop)
el-checkbox(
v-model='scope.row.$selected'
@change='groupMemberModerationTableSelectionChange(scope.row)')
el-table-column(:label='$t("dialog.group_member_moderation.avatar")' width='70' prop='photo')
template(#default='scope')
el-popover(placement='right' height='500px' trigger='hover')
img.friends-list-avatar(slot='reference' v-lazy='userImage(scope.row.user)')
img.friends-list-avatar(
v-lazy='userImageFull(scope.row.user)'
style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row.user))')
el-table-column(
:label='$t("dialog.group_member_moderation.display_name")'
width='160'
prop='$displayName'
sortable)
template(#default='scope')
span(style='cursor: pointer' @click='showUserDialog(scope.row.userId)')
span(
v-if='randomUserColours'
v-text='scope.row.user.displayName'
:style='{ color: scope.row.user.$userColour }')
span(v-else v-text='scope.row.user.displayName')
el-table-column(:label='$t("dialog.group_member_moderation.roles")' prop='roleIds' sortable)
template(#default='scope')
template(v-for='roleId in scope.row.roleIds')
span(
v-for='(role, rIndex) in groupMemberModeration.groupRef.roles'
:key='rIndex'
v-if='role.id === roleId'
v-text='role.name')
span(v-if='scope.row.roleIds.indexOf(roleId) < scope.row.roleIds.length - 1') ,&nbsp;
el-table-column(
:label='$t("dialog.group_member_moderation.notes")'
prop='managerNotes'
sortable)
template(#default='scope')
span(v-text='scope.row.managerNotes' @click.stop)
el-table-column(
:label='$t("dialog.group_member_moderation.joined_at")'
width='170'
prop='joinedAt'
sortable)
template(#default='scope')
span {{ scope.row.joinedAt | formatDate('long') }}
el-table-column(
:label='$t("dialog.group_member_moderation.banned_at")'
width='170'
prop='joinedAt'
sortable)
template(#default='scope')
span {{ scope.row.bannedAt | formatDate('long') }}
el-tab-pane(
:label='$t("dialog.group_member_moderation.invites")'
:disabled='!hasGroupPermission(groupDialog.ref, "group-invites-manage")')
div(style='margin-top: 10px')
el-button(
type='default'
@click='getAllGroupInvitesAndJoinRequests(groupMemberModeration.id)'
size='mini'
icon='el-icon-refresh'
:loading='isGroupMembersLoading'
circle)
br
el-tabs
el-tab-pane
span(slot='label')
span(
v-text='$t("dialog.group_member_moderation.sent_invites")'
style='font-weight: bold; font-size: 16px')
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ groupInvitesModerationTable.data.length }}
el-button(size='small' @click='selectAllGroupInvites') {{ $t('dialog.group_member_moderation.select_all') }}
data-tables(v-bind='groupInvitesModerationTable' style='margin-top: 10px')
el-table-column(
width='55'
prop='$selected'
:key='groupMemberModerationTableForceUpdate')
template(#default='scope')
el-button(type='text' size='mini' @click.stop)
el-checkbox(
v-model='scope.row.$selected'
@change='groupMemberModerationTableSelectionChange(scope.row)')
el-table-column(
:label='$t("dialog.group_member_moderation.avatar")'
width='70'
prop='photo')
template(#default='scope')
el-popover(placement='right' height='500px' trigger='hover')
img.friends-list-avatar(
slot='reference'
v-lazy='userImage(scope.row.user)')
img.friends-list-avatar(
v-lazy='userImageFull(scope.row.user)'
style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row.user))')
el-table-column(
:label='$t("dialog.group_member_moderation.display_name")'
width='160'
prop='$displayName'
sortable)
template(#default='scope')
span(style='cursor: pointer' @click='showUserDialog(scope.row.userId)')
span(
v-if='randomUserColours'
v-text='scope.row.user.displayName'
:style='{ color: scope.row.user.$userColour }')
span(v-else v-text='scope.row.user.displayName')
el-table-column(
:label='$t("dialog.group_member_moderation.notes")'
prop='managerNotes'
sortable)
template(#default='scope')
span(v-text='scope.row.managerNotes' @click.stop)
br
el-button(
@click='groupMembersDeleteSentInvite'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-invites-manage")') {{ $t('dialog.group_member_moderation.delete_sent_invite') }}
el-tab-pane
span(slot='label')
span(
v-text='$t("dialog.group_member_moderation.join_requests")'
style='font-weight: bold; font-size: 16px')
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ groupJoinRequestsModerationTable.data.length }}
el-button(size='small' @click='selectAllGroupJoinRequests') {{ $t('dialog.group_member_moderation.select_all') }}
data-tables(v-bind='groupJoinRequestsModerationTable' style='margin-top: 10px')
el-table-column(
width='55'
prop='$selected'
:key='groupMemberModerationTableForceUpdate')
template(#default='scope')
el-button(type='text' size='mini' @click.stop)
el-checkbox(
v-model='scope.row.$selected'
@change='groupMemberModerationTableSelectionChange(scope.row)')
el-table-column(
:label='$t("dialog.group_member_moderation.avatar")'
width='70'
prop='photo')
template(#default='scope')
el-popover(placement='right' height='500px' trigger='hover')
img.friends-list-avatar(
slot='reference'
v-lazy='userImage(scope.row.user)')
img.friends-list-avatar(
v-lazy='userImageFull(scope.row.user)'
style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row.user))')
el-table-column(
:label='$t("dialog.group_member_moderation.display_name")'
width='160'
prop='$displayName'
sortable)
template(#default='scope')
span(style='cursor: pointer' @click='showUserDialog(scope.row.userId)')
span(
v-if='randomUserColours'
v-text='scope.row.user.displayName'
:style='{ color: scope.row.user.$userColour }')
span(v-else v-text='scope.row.user.displayName')
el-table-column(
:label='$t("dialog.group_member_moderation.notes")'
prop='managerNotes'
sortable)
template(#default='scope')
span(v-text='scope.row.managerNotes' @click.stop)
br
el-button(
@click='groupMembersAcceptInviteRequest'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-invites-manage")') {{ $t('dialog.group_member_moderation.accept_join_requests') }}
el-button(
@click='groupMembersRejectInviteRequest'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-invites-manage")') {{ $t('dialog.group_member_moderation.reject_join_requests') }}
el-button(
@click='groupMembersBlockJoinRequest'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-invites-manage")') {{ $t('dialog.group_member_moderation.block_join_requests') }}
el-tab-pane
span(slot='label')
span(
v-text='$t("dialog.group_member_moderation.blocked_requests")'
style='font-weight: bold; font-size: 16px')
span(style='color: #909399; font-size: 12px; margin-left: 5px') {{ groupBlockedModerationTable.data.length }}
el-button(size='small' @click='selectAllGroupBlocked') {{ $t('dialog.group_member_moderation.select_all') }}
data-tables(v-bind='groupBlockedModerationTable' style='margin-top: 10px')
el-table-column(
width='55'
prop='$selected'
:key='groupMemberModerationTableForceUpdate')
template(#default='scope')
el-button(type='text' size='mini' @click.stop)
el-checkbox(
v-model='scope.row.$selected'
@change='groupMemberModerationTableSelectionChange(scope.row)')
el-table-column(
:label='$t("dialog.group_member_moderation.avatar")'
width='70'
prop='photo')
template(#default='scope')
el-popover(placement='right' height='500px' trigger='hover')
img.friends-list-avatar(
slot='reference'
v-lazy='userImage(scope.row.user)')
img.friends-list-avatar(
v-lazy='userImageFull(scope.row.user)'
style='height: 500px; cursor: pointer'
@click='showFullscreenImageDialog(userImageFull(scope.row.user))')
el-table-column(
:label='$t("dialog.group_member_moderation.display_name")'
width='160'
prop='$displayName'
sortable)
template(#default='scope')
span(style='cursor: pointer' @click='showUserDialog(scope.row.userId)')
span(
v-if='randomUserColours'
v-text='scope.row.user.displayName'
:style='{ color: scope.row.user.$userColour }')
span(v-else v-text='scope.row.user.displayName')
el-table-column(
:label='$t("dialog.group_member_moderation.notes")'
prop='managerNotes'
sortable)
template(#default='scope')
span(v-text='scope.row.managerNotes' @click.stop)
br
el-button(
@click='groupMembersDeleteBlockedRequest'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-invites-manage")') {{ $t('dialog.group_member_moderation.delete_blocked_requests') }}
el-tab-pane(
:label='$t("dialog.group_member_moderation.logs")'
:disabled='!hasGroupPermission(groupDialog.ref, "group-audit-view")')
div(style='margin-top: 10px')
el-button(
type='default'
@click='getAllGroupLogs(groupMemberModeration.id)'
size='mini'
icon='el-icon-refresh'
:loading='isGroupMembersLoading'
circle)
span(style='font-size: 14px; margin-left: 5px; margin-right: 5px') {{ groupLogsModerationTable.data.length }}
br
div(style='display: flex; justify-content: space-between; align-items: center')
div
el-select(
v-model='groupMemberModeration.selectedAuditLogTypes'
multiple
collapse-tags
:placeholder='$t("dialog.group_member_moderation.filter_type")')
el-option-group(:label='$t("dialog.group_member_moderation.select_type")')
el-option.x-friend-item(
v-for='type in groupMemberModeration.auditLogTypes'
:key='type'
:label='getAuditLogTypeName(type)'
:value='type')
.detail
span.name(v-text='getAuditLogTypeName(type)')
el-input(
v-model='groupLogsModerationTable.filters[0].value'
:placeholder='$t("dialog.group_member_moderation.search_placeholder")'
style='display: inline-block; width: 150px; margin: 10px')
div
el-button(@click='showGroupLogsExportDialog') {{ $t('dialog.group_member_moderation.export_logs') }}
br
data-tables(v-bind='groupLogsModerationTable' style='margin-top: 10px')
el-table-column(
:label='$t("dialog.group_member_moderation.created_at")'
width='170'
prop='created_at'
sortable)
template(#default='scope')
span {{ scope.row.created_at | formatDate('long') }}
el-table-column(
:label='$t("dialog.group_member_moderation.type")'
width='190'
prop='eventType'
sortable)
template(#default='scope')
span(v-text='scope.row.eventType')
el-table-column(
:label='$t("dialog.group_member_moderation.display_name")'
width='160'
prop='actorDisplayName'
sortable)
template(#default='scope')
span(style='cursor: pointer' @click='showUserDialog(scope.row.actorId)')
span(v-text='scope.row.actorDisplayName')
el-table-column(:label='$t("dialog.group_member_moderation.description")' prop='description')
template(#default='scope')
span(v-text='scope.row.description')
el-table-column(:label='$t("dialog.group_member_moderation.data")' prop='data')
template(#default='scope')
span(v-if='Object.keys(scope.row.data).length' v-text='JSON.stringify(scope.row.data)')
br
br
span.name {{ $t('dialog.group_member_moderation.user_id') }}
br
el-input(
v-model='groupMemberModeration.selectUserId'
size='mini'
style='margin-top: 5px; width: 340px'
:placeholder='$t("dialog.group_member_moderation.user_id_placeholder")'
clearable)
el-button(size='small' @click='selectGroupMemberUserId' :disabled='!groupMemberModeration.selectUserId') {{ $t('dialog.group_member_moderation.select_user') }}
br
br
span.name {{ $t('dialog.group_member_moderation.selected_users') }}
el-button(
type='default'
@click='clearSelectedGroupMembers'
size='mini'
icon='el-icon-delete'
circle
style='margin-left: 5px')
br
el-tag(
v-for='user in groupMemberModeration.selectedUsersArray'
type='info'
disable-transitions='true'
:key='user.id'
style='margin-right: 5px; margin-top: 5px'
closable
@close='deleteSelectedGroupMember(user)')
span {{ user.user?.displayName }} #[i.el-icon-warning(v-if='user.membershipStatus !== "member"' style='margin-left: 5px')]
br
br
span.name {{ $t('dialog.group_member_moderation.notes') }}
el-input.extra(
v-model='groupMemberModeration.note'
type='textarea'
:rows='2'
:autosize='{ minRows: 1, maxRows: 20 }'
:placeholder='$t("dialog.group_member_moderation.note_placeholder")'
size='mini'
resize='none'
style='margin-top: 5px')
br
br
span.name {{ $t('dialog.group_member_moderation.selected_roles') }}
br
el-select(
v-model='groupMemberModeration.selectedRoles'
clearable
multiple
:placeholder='$t("dialog.group_member_moderation.choose_roles_placeholder")'
filterable
style='margin-top: 5px')
el-option-group(:label='$t("dialog.group_member_moderation.roles")')
el-option.x-friend-item(
v-for='role in groupMemberModeration.groupRef.roles'
:key='role.id'
:label='role.name'
:value='role.id'
style='height: auto')
.detail
span.name(v-text='role.name')
br
br
span.name {{ $t('dialog.group_member_moderation.actions') }}
br
el-button(
@click='groupMembersAddRoles'
:disabled='!groupMemberModeration.selectedRoles.length || groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-roles-assign")') {{ $t('dialog.group_member_moderation.add_roles') }}
el-button(
@click='groupMembersRemoveRoles'
:disabled='!groupMemberModeration.selectedRoles.length || groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-roles-assign")') {{ $t('dialog.group_member_moderation.remove_roles') }}
el-button(
@click='groupMembersSaveNote'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-members-manage")') {{ $t('dialog.group_member_moderation.save_note') }}
el-button(
@click='groupMembersKick'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-members-remove")') {{ $t('dialog.group_member_moderation.kick') }}
el-button(
@click='groupMembersBan'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-bans-manage")') {{ $t('dialog.group_member_moderation.ban') }}
el-button(
@click='groupMembersUnban'
:disabled='groupMemberModeration.progressCurrent || !hasGroupPermission(groupDialog.ref, "group-bans-manage")') {{ $t('dialog.group_member_moderation.unban') }}
span(v-if='groupMemberModeration.progressCurrent' style='margin-top: 10px') #[i.el-icon-loading(style='margin-left: 5px; margin-right: 5px')] {{ $t('dialog.group_member_moderation.progress') }} {{ groupMemberModeration.progressCurrent }}/{{ groupMemberModeration.progressTotal }}
el-button(
v-if='groupMemberModeration.progressCurrent'
@click='groupMemberModeration.progressTotal = 0'
style='margin-left: 5px') {{ $t('dialog.group_member_moderation.cancel') }}
//- dialog: group posts
el-dialog.x-dialog(
:before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
ref='groupPostEditDialog'
:visible.sync='groupPostEditDialog.visible'
:title='$t("dialog.group_post_edit.header")'
width='650px')
div(v-if='groupPostEditDialog.visible')
h3(v-text='groupPostEditDialog.groupRef.name')
el-form(:model='groupPostEditDialog' label-width='150px')
el-form-item(:label='$t("dialog.group_post_edit.title")')
el-input(v-model='groupPostEditDialog.title' size='mini')
el-form-item(:label='$t("dialog.group_post_edit.message")')
el-input(
v-model='groupPostEditDialog.text'
type='textarea'
:rows='4'
:autosize='{ minRows: 4, maxRows: 20 }'
style='margin-top: 10px'
resize='none')
el-form-item
el-checkbox(
v-if='!groupPostEditDialog.postId'
v-model='groupPostEditDialog.sendNotification'
size='small') {{ $t('dialog.group_post_edit.send_notification') }}
el-form-item(:label='$t("dialog.group_post_edit.post_visibility")')
el-radio-group(v-model='groupPostEditDialog.visibility' size='small')
el-radio(label='public') {{ $t('dialog.group_post_edit.visibility_public') }}
el-radio(label='group') {{ $t('dialog.group_post_edit.visibility_group') }}
el-form-item(
v-if='groupPostEditDialog.visibility === "group"'
:label='$t("dialog.new_instance.roles")')
el-select(
v-model='groupPostEditDialog.roleIds'
multiple
clearable
:placeholder='$t("dialog.new_instance.role_placeholder")'
style='width: 100%')
el-option-group(:label='$t("dialog.new_instance.role_placeholder")')
el-option.x-friend-item(
v-for='role in groupPostEditDialog.groupRef?.roles'
:key='role.id'
:label='role.name'
:value='role.id'
style='height: auto; width: 478px')
.detail
span.name(v-text='role.name')
el-form-item(:label='$t("dialog.group_post_edit.image")')
template(v-if='gallerySelectDialog.selectedFileId')
div(style='display: inline-block; flex: none; margin-right: 5px')
el-popover(placement='right' width='500px' trigger='click')
img.x-link(
slot='reference'
v-lazy='gallerySelectDialog.selectedImageUrl'
style='flex: none; width: 60px; height: 60px; border-radius: 4px; object-fit: cover')
img.x-link(
v-lazy='gallerySelectDialog.selectedImageUrl'
style='height: 500px'
@click='showFullscreenImageDialog(gallerySelectDialog.selectedImageUrl)')
el-button(size='mini' @click='clearImageGallerySelect' style='vertical-align: top') {{ $t('dialog.invite_message.clear_selected_image') }}
template(v-else)
el-button(size='mini' @click='showGallerySelectDialog' style='margin-right: 5px') {{ $t('dialog.invite_message.select_image') }}
template(#footer)
el-button(size='small' @click='groupPostEditDialog.visible = false') {{ $t('dialog.group_post_edit.cancel') }}
el-button(v-if='groupPostEditDialog.postId' size='small' @click='editGroupPost') {{ $t('dialog.group_post_edit.edit_post') }}
el-button(v-else size='small' @click='createGroupPost') {{ $t('dialog.group_post_edit.create_post') }}
//- dialog: export logs
el-dialog.x-dialog(
:before-close='beforeDialogClose'
@mousedown.native='dialogMouseDown'
@mouseup.native='dialogMouseUp'
:visible.sync='isGroupLogsExportDialogVisible'
:title='$t("dialog.group_member_moderation.export_logs")'
width='650px'
ref='groupLogsExportDialogRef')
el-checkbox-group(
v-model='checkedGroupLogsExportLogsOptions'
@change='updateGrouptLogsExporContent()'
style='margin-bottom: 10px')
template(v-for='option in checkGroupsLogsExportLogsOptions')
el-checkbox(:key='option.label' :label='option.label') {{ $t(option.text) }}
br
el-input(
type='textarea'
v-model='groupLogsExportContent'
size='mini'
rows='15'
resize='none'
readonly
style='margin-top: 15px'
@click.native='handleCopyGroupLogsExportContent')
+6 -2
View File
@@ -106,9 +106,13 @@ mixin notificationsTab
:grouphint='scope.row.details.groupName'
:link='true')
br
span(
el-tooltip(
v-if='scope.row.message && scope.row.message !== `This is a generated invite to ${scope.row.details?.worldName}`'
v-text='scope.row.message')
placement='top')
template(#content)
pre.extra(
style='display: inline-block; vertical-align: top; font-family: inherit; font-size: 12px; white-space: pre-wrap; margin: 0') {{ scope.row.message || '-' }}
div(v-text='scope.row.message')
span(
v-else-if='scope.row.details && scope.row.details.inviteMessage'
v-text='scope.row.details.inviteMessage')