diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2019-02-17 23:41:47 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-17 23:41:47 +0900 |
| commit | 1d5a54ff6f74569fa89c4083301d9b01eb80ad29 (patch) | |
| tree | 0695f8ee6942b49236b880bb228be45b26282e90 /src/client | |
| parent | Fix #4300 (#4304) (diff) | |
| download | misskey-1d5a54ff6f74569fa89c4083301d9b01eb80ad29.tar.gz misskey-1d5a54ff6f74569fa89c4083301d9b01eb80ad29.tar.bz2 misskey-1d5a54ff6f74569fa89c4083301d9b01eb80ad29.zip | |
ハッシュタグでユーザー検索できるように (#4298)
* ハッシュタグでユーザー検索できるように
* :art:
* Increase limit
* リモートユーザーも表示
* Fix bug
* Fix bug
* Improve performance
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/app/common/views/components/mfm.ts | 8 | ||||
| -rw-r--r-- | src/client/app/common/views/components/user-list.vue | 2 | ||||
| -rw-r--r-- | src/client/app/common/views/pages/explore.vue | 86 | ||||
| -rw-r--r-- | src/client/app/common/views/pages/follow.vue | 2 | ||||
| -rw-r--r-- | src/client/app/desktop/script.ts | 2 | ||||
| -rw-r--r-- | src/client/app/desktop/views/components/user-card.vue | 2 | ||||
| -rw-r--r-- | src/client/app/desktop/views/deck/deck.user-column.vue | 2 | ||||
| -rw-r--r-- | src/client/app/desktop/views/home/user/user.header.vue | 2 | ||||
| -rw-r--r-- | src/client/app/mobile/script.ts | 1 | ||||
| -rw-r--r-- | src/client/app/mobile/views/components/user-preview.vue | 2 | ||||
| -rw-r--r-- | src/client/app/mobile/views/pages/user/index.vue | 2 |
11 files changed, 90 insertions, 21 deletions
diff --git a/src/client/app/common/views/components/mfm.ts b/src/client/app/common/views/components/mfm.ts index e322c53a38..78734200a7 100644 --- a/src/client/app/common/views/components/mfm.ts +++ b/src/client/app/common/views/components/mfm.ts @@ -40,7 +40,11 @@ export default Vue.component('misskey-flavored-markdown', { }, customEmojis: { required: false, - } + }, + isNote: { + type: Boolean, + default: true + }, }, render(createElement) { @@ -204,7 +208,7 @@ export default Vue.component('misskey-flavored-markdown', { return [createElement('router-link', { key: Math.random(), attrs: { - to: `/tags/${encodeURIComponent(token.node.props.hashtag)}`, + to: this.isNote ? `/tags/${encodeURIComponent(token.node.props.hashtag)}` : `/explore/tags/${encodeURIComponent(token.node.props.hashtag)}`, style: 'color:var(--mfmHashtag);' } }, `#${token.node.props.hashtag}`)]; diff --git a/src/client/app/common/views/components/user-list.vue b/src/client/app/common/views/components/user-list.vue index 8541e85433..ee44eac860 100644 --- a/src/client/app/common/views/components/user-list.vue +++ b/src/client/app/common/views/components/user-list.vue @@ -13,7 +13,7 @@ <p class="username">@{{ user | acct }}</p> </div> <div class="description" v-if="user.description" :title="user.description"> - <mfm :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/> + <mfm :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis" :should-break="false"/> </div> </div> </div> diff --git a/src/client/app/common/views/pages/explore.vue b/src/client/app/common/views/pages/explore.vue index 79fa26b70f..2d273d3fd2 100644 --- a/src/client/app/common/views/pages/explore.vue +++ b/src/client/app/common/views/pages/explore.vue @@ -1,29 +1,53 @@ <template> <div> - <mk-user-list :make-promise="verifiedUsers"> - <span><fa :icon="faBookmark"/> {{ $t('verified-users') }}</span> + <mk-user-list v-if="tag != null" :make-promise="tagUsers" :key="tag"> + <fa :icon="faHashtag" fixed-width/>{{ tag }} </mk-user-list> - <mk-user-list :make-promise="popularUsers"> - <span><fa :icon="faChartLine"/> {{ $t('popular-users') }}</span> - </mk-user-list> - <mk-user-list :make-promise="recentlyUpdatedUsers"> - <span><fa :icon="faCommentAlt"/> {{ $t('recently-updated-users') }}</span> - </mk-user-list> - <mk-user-list :make-promise="recentlyRegisteredUsers"> - <span><fa :icon="faPlus"/> {{ $t('recently-registered-users') }}</span> + <mk-user-list v-if="tag != null" :make-promise="tagRemoteUsers" :key="tag"> + <fa :icon="faHashtag" fixed-width/>{{ tag }} ({{ $t('federated') }}) </mk-user-list> + + <ui-container :body-togglable="true"> + <template slot="header"><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template> + + <div class="vxjfqztj"> + <router-link v-for="tag in tags" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link> + </div> + </ui-container> + + <template v-if="tag == null"> + <mk-user-list :make-promise="verifiedUsers"> + <fa :icon="faBookmark" fixed-width/>{{ $t('verified-users') }} + </mk-user-list> + <mk-user-list :make-promise="popularUsers"> + <fa :icon="faChartLine" fixed-width/>{{ $t('popular-users') }} + </mk-user-list> + <mk-user-list :make-promise="recentlyUpdatedUsers"> + <fa :icon="faCommentAlt" fixed-width/>{{ $t('recently-updated-users') }} + </mk-user-list> + <mk-user-list :make-promise="recentlyRegisteredUsers"> + <fa :icon="faPlus" fixed-width/>{{ $t('recently-registered-users') }} + </mk-user-list> + </template> </div> </template> <script lang="ts"> import Vue from 'vue'; import i18n from '../../../i18n'; -import { faChartLine, faPlus } from '@fortawesome/free-solid-svg-icons'; +import { faChartLine, faPlus, faHashtag } from '@fortawesome/free-solid-svg-icons'; import { faBookmark, faCommentAlt } from '@fortawesome/free-regular-svg-icons'; export default Vue.extend({ i18n: i18n('common/views/pages/explore.vue'), + props: { + tag: { + type: String, + required: false + } + }, + data() { return { verifiedUsers: () => this.$root.api('users', { @@ -49,11 +73,49 @@ export default Vue.extend({ sort: '+createdAt', limit: 10 }), - faBookmark, faChartLine, faCommentAlt, faPlus + tags: [], + faBookmark, faChartLine, faCommentAlt, faPlus, faHashtag }; }, + + computed: { + tagUsers(): () => Promise<any> { + return () => this.$root.api('hashtags/users', { + tag: this.tag, + state: 'alive', + origin: 'local', + sort: '+follower', + limit: 30 + }); + }, + + tagRemoteUsers(): () => Promise<any> { + return () => this.$root.api('hashtags/users', { + tag: this.tag, + state: 'alive', + origin: 'remote', + sort: '+follower', + limit: 30 + }); + }, + }, + + created() { + this.$root.api('hashtags/list', { + sort: '+attachedLocalUsers', + limit: 30 + }).then(tags => { + this.tags = tags; + }); + } }); </script> <style lang="stylus" scoped> +.vxjfqztj + padding 16px + + > * + margin-right 16px + </style> diff --git a/src/client/app/common/views/pages/follow.vue b/src/client/app/common/views/pages/follow.vue index 4d1febaec0..f8d12a2dca 100644 --- a/src/client/app/common/views/pages/follow.vue +++ b/src/client/app/common/views/pages/follow.vue @@ -12,7 +12,7 @@ </router-link> <span class="username">@{{ user | acct }}</span> <div class="description"> - <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> + <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> </div> </div> </main> diff --git a/src/client/app/desktop/script.ts b/src/client/app/desktop/script.ts index c66171e3af..8c8e3c3fbf 100644 --- a/src/client/app/desktop/script.ts +++ b/src/client/app/desktop/script.ts @@ -146,6 +146,7 @@ init(async (launch, os) => { { path: '/tags/:tag', name: 'tag', component: () => import('./views/deck/deck.hashtag-column.vue').then(m => m.default) }, { path: '/featured', component: () => import('./views/deck/deck.featured-column.vue').then(m => m.default) }, { path: '/explore', component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) }, + { path: '/explore/tags/:tag', props: true, component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) }, { path: '/i/favorites', component: () => import('./views/deck/deck.favorites-column.vue').then(m => m.default) } ]} : { path: '/', component: MkHome, children: [ @@ -160,6 +161,7 @@ init(async (launch, os) => { { path: '/tags/:tag', name: 'tag', component: () => import('./views/home/tag.vue').then(m => m.default) }, { path: '/featured', name: 'featured', component: () => import('./views/home/featured.vue').then(m => m.default) }, { path: '/explore', name: 'explore', component: () => import('../common/views/pages/explore.vue').then(m => m.default) }, + { path: '/explore/tags/:tag', name: 'explore', props: true, component: () => import('../common/views/pages/explore.vue').then(m => m.default) }, { path: '/i/favorites', component: () => import('./views/home/favorites.vue').then(m => m.default) }, ]}, { path: '/i/messaging/:user', component: MkMessagingRoom }, diff --git a/src/client/app/desktop/views/components/user-card.vue b/src/client/app/desktop/views/components/user-card.vue index 21a4ab9f6c..61b3be9305 100644 --- a/src/client/app/desktop/views/components/user-card.vue +++ b/src/client/app/desktop/views/components/user-card.vue @@ -10,7 +10,7 @@ <span class="username">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span> <div class="description"> - <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> + <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> </div> </div> </div> diff --git a/src/client/app/desktop/views/deck/deck.user-column.vue b/src/client/app/desktop/views/deck/deck.user-column.vue index d6618c5716..813667f6aa 100644 --- a/src/client/app/desktop/views/deck/deck.user-column.vue +++ b/src/client/app/desktop/views/deck/deck.user-column.vue @@ -25,7 +25,7 @@ </header> <div class="info"> <div class="description"> - <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> + <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> </div> <div class="fields" v-if="user.fields"> <dl class="field" v-for="(field, i) in user.fields" :key="i"> diff --git a/src/client/app/desktop/views/home/user/user.header.vue b/src/client/app/desktop/views/home/user/user.header.vue index debfb24393..1219a07916 100644 --- a/src/client/app/desktop/views/home/user/user.header.vue +++ b/src/client/app/desktop/views/home/user/user.header.vue @@ -23,7 +23,7 @@ <ui-button @click="menu" ref="menu" :inline="true"><fa icon="ellipsis-h"/></ui-button> </div> <div class="description"> - <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> + <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> </div> <div class="fields" v-if="user.fields"> <dl class="field" v-for="(field, i) in user.fields" :key="i"> diff --git a/src/client/app/mobile/script.ts b/src/client/app/mobile/script.ts index dbdc0f630c..9bec577d7b 100644 --- a/src/client/app/mobile/script.ts +++ b/src/client/app/mobile/script.ts @@ -133,6 +133,7 @@ init((launch) => { { path: '/tags/:tag', component: MkTag }, { path: '/featured', name: 'featured', component: () => import('./views/pages/featured.vue').then(m => m.default) }, { path: '/explore', name: 'explore', component: () => import('./views/pages/explore.vue').then(m => m.default) }, + { path: '/explore/tags/:tag', name: 'explore', props: true, component: () => import('./views/pages/explore.vue').then(m => m.default) }, { path: '/share', component: MkShare }, { path: '/games/reversi/:game?', name: 'reversi', component: MkReversi }, { path: '/@:user', name: 'user', component: () => import('./views/pages/user/index.vue').then(m => m.default), children: [ diff --git a/src/client/app/mobile/views/components/user-preview.vue b/src/client/app/mobile/views/components/user-preview.vue index b40e6f7619..ea8bbe242f 100644 --- a/src/client/app/mobile/views/components/user-preview.vue +++ b/src/client/app/mobile/views/components/user-preview.vue @@ -10,7 +10,7 @@ </header> <div class="body"> <div class="description"> - <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> + <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> </div> </div> </div> diff --git a/src/client/app/mobile/views/pages/user/index.vue b/src/client/app/mobile/views/pages/user/index.vue index 48b65624ef..d7fb3d4d58 100644 --- a/src/client/app/mobile/views/pages/user/index.vue +++ b/src/client/app/mobile/views/pages/user/index.vue @@ -22,7 +22,7 @@ <span class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</span> </div> <div class="description"> - <mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> + <mfm v-if="user.description" :text="user.description" :is-note="false" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/> </div> <div class="fields" v-if="user.fields"> <dl class="field" v-for="(field, i) in user.fields" :key="i"> |