summaryrefslogtreecommitdiff
path: root/src/client/pages/instance/users.vue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-04-22 22:29:33 +0900
committerGitHub <noreply@github.com>2021-04-22 22:29:33 +0900
commit246693b8484b72048cb515b76aa5f094f5fdeb56 (patch)
tree703f7636c363b480b20690495353691e09c98a27 /src/client/pages/instance/users.vue
parentfix style (diff)
downloadmisskey-246693b8484b72048cb515b76aa5f094f5fdeb56.tar.gz
misskey-246693b8484b72048cb515b76aa5f094f5fdeb56.tar.bz2
misskey-246693b8484b72048cb515b76aa5f094f5fdeb56.zip
インスタンス管理画面作り直し (#7473)
* wip * wip * wip * wip
Diffstat (limited to 'src/client/pages/instance/users.vue')
-rw-r--r--src/client/pages/instance/users.vue257
1 files changed, 109 insertions, 148 deletions
diff --git a/src/client/pages/instance/users.vue b/src/client/pages/instance/users.vue
index 4db965588c..452886abde 100644
--- a/src/client/pages/instance/users.vue
+++ b/src/client/pages/instance/users.vue
@@ -1,86 +1,71 @@
<template>
-<div class="mk-instance-users">
- <div class="_section">
- <div class="_content">
- <MkButton inline primary @click="addUser()"><i class="fas fa-plus"></i> {{ $ts.addUser }}</MkButton>
- </div>
+<div class="lknzcolw">
+ <div class="actions">
+ <MkButton inline primary @click="addUser()"><i class="fas fa-plus"></i> {{ $ts.addUser }}</MkButton>
+ <MkButton inline primary @click="lookupUser()"><i class="fas fa-search"></i> {{ $ts.lookup }}</MkButton>
</div>
- <div class="_section lookup">
- <div class="_title"><i class="fas fa-search"></i> {{ $ts.lookup }}</div>
- <div class="_content">
- <MkInput class="target" v-model:value="target" type="text" @enter="showUser()">
- <span>{{ $ts.usernameOrUserId }}</span>
+ <div class="users">
+ <div class="inputs" style="display: flex;">
+ <MkSelect v-model:value="sort" style="margin: 0; flex: 1;">
+ <template #label>{{ $ts.sort }}</template>
+ <option value="-createdAt">{{ $ts.registeredDate }} ({{ $ts.ascendingOrder }})</option>
+ <option value="+createdAt">{{ $ts.registeredDate }} ({{ $ts.descendingOrder }})</option>
+ <option value="-updatedAt">{{ $ts.lastUsed }} ({{ $ts.ascendingOrder }})</option>
+ <option value="+updatedAt">{{ $ts.lastUsed }} ({{ $ts.descendingOrder }})</option>
+ </MkSelect>
+ <MkSelect v-model:value="state" style="margin: 0; flex: 1;">
+ <template #label>{{ $ts.state }}</template>
+ <option value="all">{{ $ts.all }}</option>
+ <option value="available">{{ $ts.normal }}</option>
+ <option value="admin">{{ $ts.administrator }}</option>
+ <option value="moderator">{{ $ts.moderator }}</option>
+ <option value="silenced">{{ $ts.silence }}</option>
+ <option value="suspended">{{ $ts.suspend }}</option>
+ </MkSelect>
+ <MkSelect v-model:value="origin" style="margin: 0; flex: 1;">
+ <template #label>{{ $ts.instance }}</template>
+ <option value="combined">{{ $ts.all }}</option>
+ <option value="local">{{ $ts.local }}</option>
+ <option value="remote">{{ $ts.remote }}</option>
+ </MkSelect>
+ </div>
+ <div class="inputs" style="display: flex; padding-top: 1.2em;">
+ <MkInput v-model:value="searchUsername" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.users.reload()">
+ <span>{{ $ts.username }}</span>
+ </MkInput>
+ <MkInput v-model:value="searchHost" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.users.reload()" :disabled="pagination.params().origin === 'local'">
+ <span>{{ $ts.host }}</span>
</MkInput>
- <MkButton @click="showUser()" primary><i class="fas fa-search"></i> {{ $ts.lookup }}</MkButton>
</div>
- </div>
- <div class="_section users">
- <div class="_title"><i class="fas fa-users"></i> {{ $ts.users }}</div>
- <div class="_content">
- <div class="inputs" style="display: flex;">
- <MkSelect v-model:value="sort" style="margin: 0; flex: 1;">
- <template #label>{{ $ts.sort }}</template>
- <option value="-createdAt">{{ $ts.registeredDate }} ({{ $ts.ascendingOrder }})</option>
- <option value="+createdAt">{{ $ts.registeredDate }} ({{ $ts.descendingOrder }})</option>
- <option value="-updatedAt">{{ $ts.lastUsed }} ({{ $ts.ascendingOrder }})</option>
- <option value="+updatedAt">{{ $ts.lastUsed }} ({{ $ts.descendingOrder }})</option>
- </MkSelect>
- <MkSelect v-model:value="state" style="margin: 0; flex: 1;">
- <template #label>{{ $ts.state }}</template>
- <option value="all">{{ $ts.all }}</option>
- <option value="available">{{ $ts.normal }}</option>
- <option value="admin">{{ $ts.administrator }}</option>
- <option value="moderator">{{ $ts.moderator }}</option>
- <option value="silenced">{{ $ts.silence }}</option>
- <option value="suspended">{{ $ts.suspend }}</option>
- </MkSelect>
- <MkSelect v-model:value="origin" style="margin: 0; flex: 1;">
- <template #label>{{ $ts.instance }}</template>
- <option value="combined">{{ $ts.all }}</option>
- <option value="local">{{ $ts.local }}</option>
- <option value="remote">{{ $ts.remote }}</option>
- </MkSelect>
- </div>
- <div class="inputs" style="display: flex; padding-top: 1.2em;">
- <MkInput v-model:value="searchUsername" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.users.reload()">
- <span>{{ $ts.username }}</span>
- </MkInput>
- <MkInput v-model:value="searchHost" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.users.reload()" :disabled="pagination.params().origin === 'local'">
- <span>{{ $ts.host }}</span>
- </MkInput>
- </div>
-
- <MkPagination :pagination="pagination" #default="{items}" class="users" ref="users">
- <button class="user _panel _button _gap" v-for="user in items" :key="user.id" @click="show(user)">
- <MkAvatar class="avatar" :user="user" :disable-link="true" :show-indicator="true"/>
- <div class="body">
- <header>
- <MkUserName class="name" :user="user"/>
- <span class="acct">@{{ acct(user) }}</span>
- <span class="staff" v-if="user.isAdmin"><i class="fas fa-bookmark"></i></span>
- <span class="staff" v-if="user.isModerator"><i class="far fa-bookmark"></i></span>
- <span class="punished" v-if="user.isSilenced"><i class="fas fa-microphone-slash"></i></span>
- <span class="punished" v-if="user.isSuspended"><i class="fas fa-snowflake"></i></span>
- </header>
- <div>
- <span>{{ $ts.lastUsed }}: <MkTime v-if="user.updatedAt" :time="user.updatedAt" mode="detail"/></span>
- </div>
- <div>
- <span>{{ $ts.registeredDate }}: <MkTime :time="user.createdAt" mode="detail"/></span>
- </div>
+ <MkPagination :pagination="pagination" #default="{items}" class="users" ref="users">
+ <button class="user _panel _button _gap" v-for="user in items" :key="user.id" @click="show(user)">
+ <MkAvatar class="avatar" :user="user" :disable-link="true" :show-indicator="true"/>
+ <div class="body">
+ <header>
+ <MkUserName class="name" :user="user"/>
+ <span class="acct">@{{ acct(user) }}</span>
+ <span class="staff" v-if="user.isAdmin"><i class="fas fa-bookmark"></i></span>
+ <span class="staff" v-if="user.isModerator"><i class="far fa-bookmark"></i></span>
+ <span class="punished" v-if="user.isSilenced"><i class="fas fa-microphone-slash"></i></span>
+ <span class="punished" v-if="user.isSuspended"><i class="fas fa-snowflake"></i></span>
+ </header>
+ <div>
+ <span>{{ $ts.lastUsed }}: <MkTime v-if="user.updatedAt" :time="user.updatedAt" mode="detail"/></span>
</div>
- </button>
- </MkPagination>
- </div>
+ <div>
+ <span>{{ $ts.registeredDate }}: <MkTime :time="user.createdAt" mode="detail"/></span>
+ </div>
+ </div>
+ </button>
+ </MkPagination>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
-import parseAcct from '@/misc/acct/parse';
import MkButton from '@client/components/ui/button.vue';
import MkInput from '@client/components/ui/input.vue';
import MkSelect from '@client/components/ui/select.vue';
@@ -88,6 +73,7 @@ import MkPagination from '@client/components/ui/pagination.vue';
import { acct } from '../../filters/user';
import * as os from '@client/os';
import * as symbols from '@client/symbols';
+import { lookupUser } from '@client/scripts/lookup-user';
export default defineComponent({
components: {
@@ -97,6 +83,8 @@ export default defineComponent({
MkPagination,
},
+ emits: ['info'],
+
data() {
return {
[symbols.PAGE_INFO]: {
@@ -107,7 +95,6 @@ export default defineComponent({
handler: this.searchUser
}
},
- target: '',
sort: '+createdAt',
state: 'all',
origin: 'local',
@@ -140,40 +127,12 @@ export default defineComponent({
},
},
- methods: {
- /** テキストエリアのユーザーを解決する */
- fetchUser() {
- return new Promise((res) => {
- const usernamePromise = os.api('users/show', parseAcct(this.target));
- const idPromise = os.api('users/show', { userId: this.target });
- let _notFound = false;
- const notFound = () => {
- if (_notFound) {
- os.dialog({
- type: 'error',
- text: this.$ts.noSuchUser
- });
- } else {
- _notFound = true;
- }
- };
- usernamePromise.then(res).catch(e => {
- if (e.code === 'NO_SUCH_USER') {
- notFound();
- }
- });
- idPromise.then(res).catch(e => {
- notFound();
- });
- });
- },
+ async mounted() {
+ this.$emit('info', this[symbols.PAGE_INFO]);
+ },
- /** テキストエリアから処理対象ユーザーを設定する */
- async showUser() {
- const user = await this.fetchUser();
- this.show(user);
- this.target = '';
- },
+ methods: {
+ lookupUser,
searchUser() {
os.selectUser().then(user => {
@@ -203,9 +162,7 @@ export default defineComponent({
},
show(user) {
- os.popup(import('./user-dialog.vue'), {
- userId: user.id
- }, {}, 'closed');
+ os.pageWindow(`/instance/user/${user.id}`);
},
acct
@@ -214,57 +171,61 @@ export default defineComponent({
</script>
<style lang="scss" scoped>
-.mk-instance-users {
+.lknzcolw {
+ > .actions {
+ margin: var(--margin);
+ }
+
> .users {
- > ._content {
- > .users {
- margin-top: var(--margin);
+ margin: var(--margin);
+
+ > .users {
+ margin-top: var(--margin);
- > .user {
- display: flex;
- width: 100%;
- box-sizing: border-box;
- text-align: left;
- align-items: center;
- padding: 16px;
+ > .user {
+ display: flex;
+ width: 100%;
+ box-sizing: border-box;
+ text-align: left;
+ align-items: center;
+ padding: 16px;
- &:hover {
- color: var(--accent);
- }
+ &:hover {
+ color: var(--accent);
+ }
- > .avatar {
- width: 60px;
- height: 60px;
- }
+ > .avatar {
+ width: 60px;
+ height: 60px;
+ }
- > .body {
- margin-left: 0.3em;
- padding: 0 8px;
- flex: 1;
+ > .body {
+ margin-left: 0.3em;
+ padding: 0 8px;
+ flex: 1;
- @media (max-width: 500px) {
- font-size: 14px;
- }
+ @media (max-width: 500px) {
+ font-size: 14px;
+ }
- > header {
- > .name {
- font-weight: bold;
- }
+ > header {
+ > .name {
+ font-weight: bold;
+ }
- > .acct {
- margin-left: 8px;
- opacity: 0.7;
- }
+ > .acct {
+ margin-left: 8px;
+ opacity: 0.7;
+ }
- > .staff {
- margin-left: 0.5em;
- color: var(--badge);
- }
+ > .staff {
+ margin-left: 0.5em;
+ color: var(--badge);
+ }
- > .punished {
- margin-left: 0.5em;
- color: #4dabf7;
- }
+ > .punished {
+ margin-left: 0.5em;
+ color: #4dabf7;
}
}
}