Skip to content
Snippets Groups Projects
Commit 7ea42af0 authored by syuilo's avatar syuilo
Browse files

wip

parent 76c8e05e
No related branches found
No related tags found
No related merge requests found
......@@ -223,18 +223,18 @@ root(isDark)
background $theme-color
> footer
> *
> button
display block
margin 0
padding 16px
width 100%
text-align center
color #ccc
background isDark ? #282C37 : #fff
border-top solid 1px isDark ? #1c2023 : #eaeaea
border-bottom-left-radius 4px
border-bottom-right-radius 4px
border-bottom-left-radius 6px
border-bottom-right-radius 6px
> button
&:hover
background isDark ? #2e3440 : #f5f5f5
......
......@@ -45,7 +45,7 @@
<script lang="ts">
import Vue from 'vue';
import MkListsWindow from './lists-window.vue';
import MkUserListsWindow from './user-lists-window.vue';
import MkSettingsWindow from './settings-window.vue';
import MkDriveWindow from './drive-window.vue';
import contains from '../../../common/scripts/contains';
......@@ -86,7 +86,7 @@ export default Vue.extend({
},
list() {
this.close();
(this as any).os.new(MkListsWindow);
(this as any).os.new(MkUserListsWindow);
},
settings() {
this.close();
......
<template>
<div>
<mk-notes ref="timeline" :more="existMore ? more : null"/>
</div>
</template>
<script lang="ts">
......
<template>
<div>
<mk-widget-container>
<template slot="header">%fa:users% ユーザー</template>
<button slot="func" title="ユーザーを追加" @click="add">%fa:plus%</button>
<div data-id="d0b63759-a822-4556-a5ce-373ab966e08a">
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw% %i18n:common.loading%<mk-ellipsis/></p>
<template v-else-if="users.length != 0">
<div class="user" v-for="_user in users">
<router-link class="avatar-anchor" :to="_user | userPage">
<img class="avatar" :src="`${_user.avatarUrl}?thumbnail&size=42`" alt="" v-user-preview="_user.id"/>
</router-link>
<div class="body">
<router-link class="name" :to="_user | userPage" v-user-preview="_user.id">{{ _user | userName }}</router-link>
<p class="username">@{{ _user | acct }}</p>
</div>
</div>
</template>
<p class="empty" v-else>%i18n:@no-one%</p>
</div>
</mk-widget-container>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: {
list: {
type: Object,
required: true
}
},
data() {
return {
fetching: true,
users: []
};
},
mounted() {
(this as any).api('users/show', {
userIds: this.list.userIds
}).then(users => {
this.users = users;
this.fetching = false;
});
},
methods: {
add() {
(this as any).apis.input({
title: 'ユーザー名',
}).then(async username => {
const user = await (this as any).api('users/show', {
username
});
(this as any).api('users/lists/push', {
listId: this.list.id,
userId: user.id
});
});
}
}
});
</script>
<style lang="stylus" scoped>
root(isDark)
> .user
padding 16px
border-bottom solid 1px isDark ? #1c2023 : #eee
&:last-child
border-bottom none
&:after
content ""
display block
clear both
> .avatar-anchor
display block
float left
margin 0 12px 0 0
> .avatar
display block
width 42px
height 42px
margin 0
border-radius 8px
vertical-align bottom
> .body
float left
width calc(100% - 54px)
> .name
margin 0
font-size 16px
line-height 24px
color isDark ? #fff : #555
> .username
display block
margin 0
font-size 15px
line-height 16px
color isDark ? #606984 : #ccc
> .empty
margin 0
padding 16px
text-align center
color #aaa
> .fetching
margin 0
padding 16px
text-align center
color #aaa
[data-id="d0b63759-a822-4556-a5ce-373ab966e08a"][data-darkmode]
root(true)
[data-id="d0b63759-a822-4556-a5ce-373ab966e08a"]:not([data-darkmode])
root(false)
</style>
......@@ -3,6 +3,7 @@
<div v-if="!fetching" data-id="02010e15-cc48-4245-8636-16078a9b623c">
<div>
<div><h1>{{ list.title }}</h1></div>
<x-users :list="list"/>
</div>
<main>
<mk-user-list-timeline :list="list"/>
......@@ -13,8 +14,12 @@
<script lang="ts">
import Vue from 'vue';
import XUsers from './user-list.users.vue';
export default Vue.extend({
components: {
XUsers
},
data() {
return {
fetching: true,
......
......@@ -8,7 +8,7 @@ import resolveRemoteUser from '../../../../remote/resolve-user';
const cursorOption = { fields: { data: false } };
/**
* Show a user
* Show user(s)
*/
module.exports = (params, me) => new Promise(async (res, rej) => {
let user;
......@@ -17,6 +17,10 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
const [userId, userIdErr] = $(params.userId).optional.type(ID).$;
if (userIdErr) return rej('invalid userId param');
// Get 'userIds' parameter
const [userIds, userIdsErr] = $(params.userIds).optional.array($().type(ID)).$;
if (userIdsErr) return rej('invalid userIds param');
// Get 'username' parameter
const [username, usernameErr] = $(params.username).optional.string().$;
if (usernameErr) return rej('invalid username param');
......@@ -25,32 +29,40 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
const [host, hostErr] = $(params.host).nullable.optional.string().$;
if (hostErr) return rej('invalid host param');
if (userId === undefined && typeof username !== 'string') {
return rej('userId or pair of username and host is required');
}
if (userIds) {
const users = await User.find({
_id: {
$in: userIds
}
});
// Lookup user
if (typeof host === 'string') {
try {
user = await resolveRemoteUser(username, host, cursorOption);
} catch (e) {
console.warn(`failed to resolve remote user: ${e}`);
return rej('failed to resolve remote user');
}
res(await Promise.all(users.map(u => pack(u, me, {
detail: true
}))));
} else {
const q = userId !== undefined
? { _id: userId }
: { usernameLower: username.toLowerCase(), host: null };
// Lookup user
if (typeof host === 'string') {
try {
user = await resolveRemoteUser(username, host, cursorOption);
} catch (e) {
console.warn(`failed to resolve remote user: ${e}`);
return rej('failed to resolve remote user');
}
} else {
const q = userId !== undefined
? { _id: userId }
: { usernameLower: username.toLowerCase(), host: null };
user = await User.findOne(q, cursorOption);
user = await User.findOne(q, cursorOption);
if (user === null) {
return rej('user not found');
if (user === null) {
return rej('user not found');
}
}
}
// Send response
res(await pack(user, me, {
detail: true
}));
// Send response
res(await pack(user, me, {
detail: true
}));
}
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment