list multiple select
This commit is contained in:
parent
1dce38dfed
commit
693efb99a0
|
@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
<MkModalWindow
|
||||
ref="dialogEl"
|
||||
:withOkButton="true"
|
||||
:okButtonDisabled="selected == null"
|
||||
:okButtonDisabled="(!selected && multipleSelected.length < 1)"
|
||||
@click="cancel()"
|
||||
@close="cancel()"
|
||||
@ok="ok()"
|
||||
|
@ -27,9 +27,10 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
</MkInput>
|
||||
</FormSplit>
|
||||
</div>
|
||||
|
||||
<div v-if="username != '' || host != ''" :class="[$style.result, { [$style.hit]: users.length > 0 }]">
|
||||
<div v-if="users.length > 0" :class="$style.users">
|
||||
<div v-for="user in users" :key="user.id" class="_button" :class="[$style.user, { [$style.selected]: selected && selected.id === user.id }]" @click="selected = user" @dblclick="ok()">
|
||||
<div v-for="user in users" :key="user.id" class="_button" :class="[$style.user, { [$style.selected]: selected && selected.id === user.id || multipleSelected.includes(user)}]" @click="multiple ? (multipleSelected.includes(user) ? multipleSelected.splice(multipleSelected.indexOf(user), 1) : multipleSelected.push(user)) : selected = user" @dblclick="ok()">
|
||||
<MkAvatar :user="user" :class="$style.avatar" indicator/>
|
||||
<div :class="$style.userBody">
|
||||
<MkUserName :user="user" :class="$style.userName"/>
|
||||
|
@ -43,7 +44,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
|||
</div>
|
||||
<div v-if="username == '' && host == ''" :class="$style.recent">
|
||||
<div :class="$style.users">
|
||||
<div v-for="user in recentUsers" :key="user.id" class="_button" :class="[$style.user, { [$style.selected]: selected && selected.id === user.id }]" @click="selected = user" @dblclick="ok()">
|
||||
<div v-for="user in recentUsers" :key="user.id" class="_button" :class="[$style.user, { [$style.selected]: selected && selected.id === user.id || multipleSelected.includes(user) }]" @click="multiple ? (multipleSelected.includes(user) ? multipleSelected.splice(multipleSelected.indexOf(user), 1) : multipleSelected.push(user)) : selected = user" @dblclick="ok()">
|
||||
<MkAvatar :user="user" :class="$style.avatar" indicator/>
|
||||
<div :class="$style.userBody">
|
||||
<MkUserName :user="user" :class="$style.userName"/>
|
||||
|
@ -67,6 +68,7 @@ import { defaultStore } from '@/store.js';
|
|||
import { i18n } from '@/i18n.js';
|
||||
import { $i } from '@/account.js';
|
||||
import { hostname } from '@/config.js';
|
||||
import { multipleSelectUser } from '@/os.js';
|
||||
|
||||
const emit = defineEmits<{
|
||||
(ev: 'ok', selected: Misskey.entities.UserDetailed): void;
|
||||
|
@ -76,6 +78,7 @@ const emit = defineEmits<{
|
|||
|
||||
const props = defineProps<{
|
||||
includeSelf?: boolean;
|
||||
multiple?: boolean;
|
||||
}>();
|
||||
|
||||
const username = ref('');
|
||||
|
@ -83,6 +86,7 @@ const host = ref('');
|
|||
const users = ref<Misskey.entities.UserDetailed[]>([]);
|
||||
const recentUsers = ref<Misskey.entities.UserDetailed[]>([]);
|
||||
const selected = ref<Misskey.entities.UserDetailed | null>(null);
|
||||
const multipleSelected = ref<Misskey.entities.UserDetailed[]>([]);
|
||||
const dialogEl = ref();
|
||||
|
||||
const search = () => {
|
||||
|
@ -101,11 +105,12 @@ const search = () => {
|
|||
};
|
||||
|
||||
const ok = () => {
|
||||
if (selected.value == null) return;
|
||||
emit('ok', selected.value);
|
||||
if ((!selected.value && multipleSelected.value.length < 1)) return;
|
||||
emit('ok', selected.value ?? multipleSelected.value);
|
||||
dialogEl.value.close();
|
||||
|
||||
// 最近使ったユーザー更新
|
||||
if (multipleSelected.value.length < 0) return;
|
||||
let recents = defaultStore.state.recentlyUsedUsers;
|
||||
recents = recents.filter(x => x !== selected.value.id);
|
||||
recents.unshift(selected.value.id);
|
||||
|
|
|
@ -24,7 +24,7 @@ import MkContextMenu from '@/components/MkContextMenu.vue';
|
|||
import { MenuItem } from '@/types/menu.js';
|
||||
import copyToClipboard from '@/scripts/copy-to-clipboard.js';
|
||||
import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
|
||||
import MkSwitch from "@/components/MkSwitch.vue";
|
||||
import MkSwitch from '@/components/MkSwitch.vue';
|
||||
|
||||
export const openingWindowsCount = ref(0);
|
||||
|
||||
|
@ -220,7 +220,7 @@ export function switch1(props: {
|
|||
text?: string | null;
|
||||
okText?: string;
|
||||
cancelText?: string;
|
||||
}): Promise<{ canceled: boolean , result: boolean }> {
|
||||
}): Promise<{ canceled: boolean, result: boolean }> {
|
||||
return new Promise((resolve, reject) => {
|
||||
popup(MkDialog, {
|
||||
...props,
|
||||
|
@ -437,7 +437,20 @@ export function form(title, form) {
|
|||
});
|
||||
}
|
||||
|
||||
export async function selectUser(opts: { includeSelf?: boolean } = {}) {
|
||||
export async function selectUser(opts: { includeSelf?: boolean, multiple?: boolean, } = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
popup(defineAsyncComponent(() => import('@/components/MkUserSelectDialog.vue')), {
|
||||
includeSelf: opts.includeSelf,
|
||||
multiple: opts.multiple,
|
||||
}, {
|
||||
ok: user => {
|
||||
resolve(user);
|
||||
},
|
||||
}, 'closed');
|
||||
});
|
||||
}
|
||||
|
||||
export async function multipleSelectUser(opts: { includeSelf?: boolean } = {}) {
|
||||
return new Promise((resolve, reject) => {
|
||||
popup(defineAsyncComponent(() => import('@/components/MkUserSelectDialog.vue')), {
|
||||
includeSelf: opts.includeSelf,
|
||||
|
|
|
@ -104,14 +104,22 @@ function fetchList() {
|
|||
}
|
||||
|
||||
function addUser() {
|
||||
os.selectUser().then(user => {
|
||||
os.selectUser( { multiple: true }).then(user => {
|
||||
if (!list.value) return;
|
||||
os.apiWithDialog('users/lists/push', {
|
||||
listId: list.value.id,
|
||||
userId: user.id,
|
||||
}).then(() => {
|
||||
paginationEl.value.reload();
|
||||
});
|
||||
if (Array.isArray(user)) {
|
||||
user.forEach(u => {
|
||||
misskeyApi('users/lists/push', {
|
||||
listId: list.value.id,
|
||||
userId: u.id,
|
||||
});
|
||||
});
|
||||
} else if (typeof user === 'string') {
|
||||
os.apiWithDialog('users/lists/push', {
|
||||
listId: list.value.id,
|
||||
userId: user.id,
|
||||
});
|
||||
}
|
||||
paginationEl.value.reload();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue