diff --git a/html/src/app.js b/html/src/app.js index 2587add6..738380fe 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -5096,6 +5096,10 @@ speechSynthesis.getVoices(); if ($app.galleryDialogVisible) { $app.refreshEmojiTable(); } + } else if (contentType === 'avatar') { + // hmm, utilizing this might be too spamy and cause UI to move around + } else if (contentType === 'world') { + // hmm } else { console.log('Unknown content-refresh', content); } @@ -20004,14 +20008,15 @@ speechSynthesis.getVoices(); secureOrShortName: '', lastSelectedGroupId: '', selectedGroupRoles: [], - roleIds: [] + roleIds: [], + groupRef: {} }; API.$on('LOGOUT', function () { $app.newInstanceDialog.visible = false; }); - $app.methods.buildInstance = function () { + $app.methods.buildLegacyInstance = function () { var D = this.newInstanceDialog; D.instanceCreated = false; D.shortName = ''; @@ -20062,6 +20067,7 @@ speechSynthesis.getVoices(); D.roleIds = []; var ref = API.cachedGroups.get(D.groupId); if (typeof ref !== 'undefined') { + D.groupRef = ref; D.selectedGroupRoles = ref.roles; API.getGroupRoles({ groupId: D.groupId @@ -20075,6 +20081,7 @@ speechSynthesis.getVoices(); if (!D.groupId) { D.roleIds = []; D.selectedGroupRoles = []; + D.groupRef = {}; D.lastSelectedGroupId = ''; } D.instanceId = tags.join(''); @@ -20082,12 +20089,65 @@ speechSynthesis.getVoices(); this.saveNewInstanceDialog(); }; - $app.methods.createGroupInstance = function () { + $app.methods.buildInstance = function () { + var D = this.newInstanceDialog; + D.instanceCreated = false; + D.instanceId = ''; + D.shortName = ''; + D.secureOrShortName = ''; + if (!D.userId) { + D.userId = API.currentUser.id; + } + if (D.groupId && D.groupId !== D.lastSelectedGroupId) { + D.roleIds = []; + var ref = API.cachedGroups.get(D.groupId); + if (typeof ref !== 'undefined') { + D.groupRef = ref; + D.selectedGroupRoles = ref.roles; + API.getGroupRoles({ + groupId: D.groupId + }).then((args) => { + D.lastSelectedGroupId = D.groupId; + D.selectedGroupRoles = args.json; + ref.roles = args.json; + }); + } + } + if (!D.groupId) { + D.roleIds = []; + D.groupRef = {}; + D.selectedGroupRoles = []; + D.lastSelectedGroupId = ''; + } + this.saveNewInstanceDialog(); + }; + + $app.methods.createNewInstance = function () { var D = this.newInstanceDialog; if (D.loading) { return; } D.loading = true; + var type = 'public'; + var canRequestInvite = false; + switch (D.accessType) { + case 'friends': + type = 'friends'; + break; + case 'friends+': + type = 'hidden'; + break; + case 'invite': + type = 'private'; + break; + case 'invite+': + type = 'private'; + canRequestInvite = true; + break; + case 'group': + type = 'group'; + break; + } var region = 'us'; if (D.region === 'US East') { region = 'use'; @@ -20096,19 +20156,22 @@ speechSynthesis.getVoices(); } else if (D.region === 'Japan') { region = 'jp'; } - var roleIds = []; - if (D.groupAccessType === 'member') { - roleIds = D.roleIds; - } - API.createInstance({ - type: 'group', - groupAccessType: D.groupAccessType, + var params = { + type, + canRequestInvite, worldId: D.worldId, - ownerId: D.groupId, - region, - queueEnabled: D.queueEnabled, - roleIds - }) + ownerId: D.userId, + region + }; + if (type === 'group') { + params.groupAccessType = D.groupAccessType; + params.ownerId = D.groupId; + params.queueEnabled = D.queueEnabled; + if (D.groupAccessType === 'member') { + params.roleIds = D.roleIds; + } + } + API.createInstance(params) .then((args) => { D.location = args.json.location; D.instanceId = args.json.instanceId; @@ -20174,10 +20237,6 @@ speechSynthesis.getVoices(); 'instanceRegion', this.newInstanceDialog.region ); - await configRepository.setString( - 'groupInstanceRegion', - this.newInstanceDialog.groupRegion - ); await configRepository.setString( 'instanceDialogInstanceName', this.newInstanceDialog.instanceName @@ -20215,6 +20274,11 @@ speechSynthesis.getVoices(); this.$nextTick(() => adjustDialogZ(this.$refs.newInstanceDialog.$el)); var D = this.newInstanceDialog; var L = API.parseLocation(tag); + if (D.worldId === L.worldId) { + // reopening dialog, keep last open instance + D.visible = true; + return; + } D.worldId = L.worldId; D.accessType = await configRepository.getString( 'instanceDialogAccessType', @@ -20224,10 +20288,6 @@ speechSynthesis.getVoices(); 'instanceRegion', 'US West' ); - D.groupRegion = await configRepository.getString( - 'groupInstanceRegion', - 'US West' - ); D.instanceName = await configRepository.getString( 'instanceDialogInstanceName', '' @@ -20248,11 +20308,17 @@ speechSynthesis.getVoices(); D.instanceCreated = false; D.lastSelectedGroupId = ''; D.selectedGroupRoles = []; + D.groupRef = {}; D.roleIds = []; D.strict = false; D.shortName = ''; D.secureOrShortName = ''; - this.buildInstance(); + API.getGroupPermissions({ userId: API.currentUser.id }); + if (D.selectedTab === '0') { + this.buildInstance(); + } else { + this.buildLegacyInstance(); + } this.updateNewInstanceDialog(); D.visible = true; }; @@ -24526,6 +24592,7 @@ speechSynthesis.getVoices(); var ref = API.applyGroup(group); API.currentUserGroups.set(group.id, ref); }); + await API.getGroupPermissions({ userId: API.currentUser.id }); this.saveCurrentUserGroups(); }; @@ -28372,7 +28439,34 @@ speechSynthesis.getVoices(); } }); - //** + API.getGroupPermissions = function (params) { + return this.call(`users/${params.userId}/groups/permissions`, { + method: 'GET' + }).then((json) => { + var args = { + json, + params + }; + this.$emit('GROUP:PERMISSIONS', args); + return args; + }); + }; + + API.$on('GROUP:PERMISSIONS', function (args) { + if (args.params.userId !== this.currentUser.id) { + return; + } + var json = args.json; + for (var groupId in json) { + var permissions = json[groupId]; + var group = this.cachedGroups.get(groupId); + if (group) { + group.myMember.permissions = permissions; + } + } + }); + + // /** // * @param {{ groupId: string }} params // * @return { Promise<{json: any, params}> } // */ @@ -28867,8 +28961,6 @@ speechSynthesis.getVoices(); var ref = this.applyGroupMember(json); $app.groupBansModerationTable.data.push(ref); } - // $app.groupBansModerationTable.data = - // $app.groupBansModerationTable.data.concat(args.json); }); $app.methods.getAllGroupLogs = async function (groupId) { @@ -30109,6 +30201,17 @@ speechSynthesis.getVoices(); await this.getGroupDialogGroupMembers(); }; + $app.methods.getCurrentUserRepresentedGroup = function () { + return API.getRepresentedGroup({ + userId: API.currentUser.id + }).then((args) => { + this.userDialog.representedGroup = args.json; + return args; + }); + }; + + // group permissions + $app.methods.hasGroupPermission = function (ref, permission) { if ( ref && @@ -30122,15 +30225,6 @@ speechSynthesis.getVoices(); return false; }; - $app.methods.getCurrentUserRepresentedGroup = function () { - return API.getRepresentedGroup({ - userId: API.currentUser.id - }).then((args) => { - this.userDialog.representedGroup = args.json; - return args; - }); - }; - // group gallery $app.data.isGroupGalleryLoading = false; diff --git a/html/src/app.scss b/html/src/app.scss index 04aff09e..5b40e1e5 100644 --- a/html/src/app.scss +++ b/html/src/app.scss @@ -94,6 +94,10 @@ -webkit-line-clamp: 1; } +.notification-table .el-table .cell { + -webkit-line-clamp: 2; +} + .el-table__row:hover .el-table__cell .cell { -webkit-line-clamp: unset; } diff --git a/html/src/index.pug b/html/src/index.pug index 692d9c6c..5773923e 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -1193,7 +1193,7 @@ html 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" v-text="item.name" @click.native="setGroupMemberFilter(item)") - el-dropdown-item(v-for="(item) in groupDialog.ref.roles" v-text="item.name" @click.native="setGroupMemberFilter(item)") + el-dropdown-item(v-for="(item) in groupDialog.ref.roles" 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(v-for="user in groupDialog.memberSearchResults" :key="user.id" @click="showUserDialog(user.userId)" class="x-friend-item-border") @@ -1290,8 +1290,9 @@ html 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="450px") div(v-if="inviteDialog.visible" v-loading="inviteDialog.loading") location(:location="inviteDialog.worldId" :link="false") - el-button(size="mini" v-text="$t('dialog.invite.add_friends_in_instance')" @click="addFriendsInInstanceToInvite" style="margin-top:10px") - el-button(size="mini" v-text="$t('dialog.invite.add_favorite_friends')" @click="addFavoriteFriendsToInvite" style="margin-top:10px") + br + el-button(size="mini" 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="friendsGroup0.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") @@ -1403,21 +1404,19 @@ html 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="buildInstance") - 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-checkbox(v-model="newInstanceDialog.strict") Prevent non friends joining via URL/Instance ID + 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="plus" :disabled="!hasGroupPermission(newInstanceDialog.groupRef, 'group-instance-plus-create')") {{ $t('dialog.new_instance.group_access_type_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-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.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.instance_id')") - el-input(v-model="newInstanceDialog.instanceName" :placeholder="$t('dialog.new_instance.instance_id_placeholder')" size="mini" @change="buildInstance") 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="buildInstance") el-option-group(v-if="API.currentUser" :label="$t('side_panel.me')") @@ -1461,41 +1460,12 @@ html 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" v-for="group in API.currentUserGroups.values()" :key="group.id" :label="group.name" :value="group.id" style="height:auto;width:478px") + 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 img(v-lazy="group.iconUrl") .detail span.name(v-text="group.name") - 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-form-item(:label="$t('dialog.new_instance.url')") - el-input(v-model="newInstanceDialog.url" size="mini" readonly) - el-tab-pane(:label="$t('dialog.new_instance.group')") - el-form(v-if="newInstanceDialog.visible" :model="newInstanceDialog" label-width="150px") - el-form-item(:label="$t('dialog.new_instance.group_access_type')") - el-radio-group(v-model="newInstanceDialog.groupAccessType" size="mini" @change="buildInstance") - 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="$t('dialog.new_instance.region')") - el-radio-group(v-model="newInstanceDialog.groupRegion" 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')") - el-checkbox(v-model="newInstanceDialog.queueEnabled" @change="buildInstance") - 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')") - 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" v-for="group in API.currentUserGroups.values()" :key="group.id" :label="group.name" :value="group.id" style="height:auto;width:478px") - .avatar - img(v-lazy="group.iconUrl") - .detail - span.name(v-text="group.name") - el-form-item(:label="$t('dialog.new_instance.roles')" v-if="newInstanceDialog.groupAccessType === 'members'") + el-form-item(:label="$t('dialog.new_instance.roles')" v-if="newInstanceDialog.accessType === 'group' && newInstanceDialog.groupAccessType === 'members'") 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") @@ -1506,19 +1476,98 @@ html el-input(v-model="newInstanceDialog.location" size="mini" readonly @click.native="$event.target.tagName === 'INPUT' && $event.target.select()") el-form-item(:label="$t('dialog.new_instance.url')") el-input(v-model="newInstanceDialog.url" size="mini" readonly) + el-tab-pane(:label="$t('dialog.new_instance.legacy')") + el-form(v-if="newInstanceDialog.visible" :model="newInstanceDialog" label-width="150px") + el-form-item(:label="$t('dialog.new_instance.access_type')") + el-radio-group(v-model="newInstanceDialog.accessType" size="mini" @change="buildLegacyInstance") + el-radio-button(label="public") {{ $t('dialog.new_instance.access_type_public') }} + el-radio-button(label="group") {{ $t('dialog.new_instance.access_type_group') }} + el-radio-button(label="friends+") {{ $t('dialog.new_instance.access_type_friend_plus') }} + 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-checkbox(v-model="newInstanceDialog.strict") Prevent non friends joining via URL/Instance ID + el-form-item(:label="$t('dialog.new_instance.region')") + 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 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.world_id')") + el-input(v-model="newInstanceDialog.worldId" size="mini" @click.native="$event.target.tagName === 'INPUT' && $event.target.select()" @change="buildLegacyInstance") + el-form-item(:label="$t('dialog.new_instance.instance_id')") + 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 + span.name(v-text="API.currentUser.displayName") + el-option-group(v-if="friendsGroup0.length" :label="$t('side_panel.favorite')") + el-option.x-friend-item(v-for="friend in friendsGroup0" :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="friendsGroup1.length" :label="$t('side_panel.online')") + el-option.x-friend-item(v-for="friend in friendsGroup1" :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="friendsGroup2.length" :label="$t('side_panel.active')") + el-option.x-friend-item(v-for="friend in friendsGroup2" :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="friendsGroup3.length" :label="$t('side_panel.offline')") + el-option.x-friend-item(v-for="friend in friendsGroup3" :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-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="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 + img(v-lazy="group.iconUrl") + .detail + span.name(v-text="group.name") + 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-form-item(:label="$t('dialog.new_instance.url')") + el-input(v-model="newInstanceDialog.url" size="mini" readonly) template(#footer v-if="newInstanceDialog.selectedTab === '0'") - 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(#footer v-else-if="newInstanceDialog.selectedTab === '1'") 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) - el-button(type="primary" size="small" @click="createGroupInstance()" :disabled="!newInstanceDialog.groupId") {{ $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'") + 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') }} //- 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") @@ -2962,7 +3011,7 @@ html 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" v-text="item.name" @click.native="setGroupMemberFilter(item)") - el-dropdown-item(v-for="(item) in groupDialog.ref.roles" v-text="item.name" @click.native="setGroupMemberFilter(item)") + el-dropdown-item(v-for="(item) in groupDialog.ref.roles" 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') }} diff --git a/html/src/localization/en/en.json b/html/src/localization/en/en.json index 9bdda973..5102eb2f 100644 --- a/html/src/localization/en/en.json +++ b/html/src/localization/en/en.json @@ -960,6 +960,7 @@ "queueEnabled": "Queue", "normal": "Normal", "group": "Group", + "legacy": "Legacy", "roles": "Roles" }, "launch_options": { diff --git a/html/src/mixins/tabs/notifications.pug b/html/src/mixins/tabs/notifications.pug index f3e60647..66b4c5df 100644 --- a/html/src/mixins/tabs/notifications.pug +++ b/html/src/mixins/tabs/notifications.pug @@ -1,6 +1,6 @@ mixin notificationsTab() .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'notification'" v-if="$refs.menu && $refs.menu.activeIndex === 'notification'" v-loading="API.isNotificationsLoading") - data-tables(v-bind="notificationTable") + data-tables(v-bind="notificationTable" class="notification-table") template(#tool) div(style="margin:0 0 10px;display:flex;align-items:center") el-select(v-model="notificationTable.filters[0].value" @change="saveTableFilters" multiple clearable collapse-tags style="flex:1" :placeholder="$t('view.notification.filter_placeholder')") @@ -53,7 +53,7 @@ mixin notificationsTab() span.x-link(v-if="scope.row.type === 'invite'" @click="showWorldDialog(scope.row.details.worldId)") location(v-if="scope.row.details" :location="scope.row.details.worldId" :hint="scope.row.details.worldName" :grouphint="scope.row.details.groupName" :link="false") br - span(v-else-if="scope.row.message && scope.row.message !== `This is a generated invite to ${scope.row.details?.worldName}`" v-text="scope.row.message") + 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(v-else-if='scope.row.details && scope.row.details.inviteMessage' v-text="scope.row.details.inviteMessage") span(v-else-if='scope.row.details && scope.row.details.requestMessage' v-text="scope.row.details.requestMessage") span(v-else-if='scope.row.details && scope.row.details.responseMessage' v-text="scope.row.details.responseMessage")