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")