Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f632ec50c1 | ||
![]() |
a55d15214b | ||
![]() |
f1709a2cc2 | ||
![]() |
effa542958 | ||
![]() |
e8bf742c87 | ||
![]() |
2e6652edce | ||
![]() |
230c204b48 | ||
![]() |
3755c600b1 | ||
![]() |
24513fc0a3 | ||
![]() |
0a79a6564a | ||
![]() |
562bb5842b | ||
![]() |
ec3ca3032e | ||
![]() |
890770c275 | ||
![]() |
9ed58a1b4e | ||
![]() |
08984be2fe |
@@ -149,38 +149,20 @@ workflows:
|
||||
- build:
|
||||
requires:
|
||||
- hold
|
||||
filters:
|
||||
branches:
|
||||
ignore:
|
||||
- l10n_develop
|
||||
- imgbot
|
||||
- patch-autogen
|
||||
- test:
|
||||
executor: with-redis
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
branches:
|
||||
ignore:
|
||||
# - master
|
||||
- l10n_develop
|
||||
- imgbot
|
||||
- patch-autogen
|
||||
- test:
|
||||
without_redis: true
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
# branches:
|
||||
# only: master
|
||||
branches:
|
||||
ignore:
|
||||
# - master
|
||||
- l10n_develop
|
||||
- imgbot
|
||||
- patch-autogen
|
||||
docker:
|
||||
jobs:
|
||||
- ok:
|
||||
filters:
|
||||
branches:
|
||||
ignore: master
|
||||
- hold:
|
||||
type: approval
|
||||
filters:
|
||||
|
10
CHANGELOG.md
10
CHANGELOG.md
@@ -1,6 +1,16 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
10.86.2
|
||||
----------
|
||||
* 別タブでルートより下を開いたときにはデッキにしないように
|
||||
* 横のナビゲーションバーの改善
|
||||
* MIDIファイルがオーディオ扱いになる問題を修正
|
||||
* ミュートワードで正規表現を使えるように
|
||||
* デッキで無効になったタイムラインに警告を表示するように
|
||||
* デザインの調整
|
||||
* その他細かな修正
|
||||
|
||||
10.86.1
|
||||
----------
|
||||
* ナビゲーションバーの「ホーム」を「タイムライン」に改称
|
||||
|
@@ -220,6 +220,11 @@ auth/views/index.vue:
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
|
||||
common/views/pages/explore.vue:
|
||||
verified-users: "公式アカウント"
|
||||
popular-users: "人気のユーザー"
|
||||
recently-updated-users: "最近投稿したユーザー"
|
||||
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
@@ -1823,6 +1828,9 @@ deck:
|
||||
rename: "名前を変更"
|
||||
stack-left: "左に重ねる"
|
||||
pop-right: "右に出す"
|
||||
disabled-timeline:
|
||||
title: "無効化されたタイムライン"
|
||||
description: "サーバーの運営者により、このタイムラインは使用できない状態に設定されています。"
|
||||
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "メディア投稿のみ"
|
||||
|
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.86.1",
|
||||
"clientVersion": "2.0.14327",
|
||||
"version": "10.86.2",
|
||||
"clientVersion": "2.0.14342",
|
||||
"codename": "nighthike",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@@ -4,7 +4,8 @@ export default function(me, settings, note) {
|
||||
|
||||
const includesMutedWords = (text: string) =>
|
||||
text
|
||||
? settings.mutedWords.some(q => q.length > 0 && !q.some(word => !text.includes(word)))
|
||||
? settings.mutedWords.some(q => q.length > 0 && !q.some(word =>
|
||||
word.startsWith('/') && word.endsWith('/') ? !(new RegExp(word.substr(1, word.length - 2)).test(text)) : !text.includes(word)))
|
||||
: false;
|
||||
|
||||
return (
|
||||
|
@@ -5,7 +5,7 @@
|
||||
<b>{{ $t('sensitive') }}</b>
|
||||
<span>{{ $t('click-to-show') }}</span>
|
||||
</div>
|
||||
<div class="audio" v-else-if="media.type.startsWith('audio')">
|
||||
<div class="audio" v-else-if="media.type.startsWith('audio') && media.type !== 'audio/midi'">
|
||||
<audio class="audio"
|
||||
:src="media.url"
|
||||
:title="media.name"
|
||||
|
@@ -128,7 +128,7 @@ init(async (launch, os) => {
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: [
|
||||
os.store.getters.isSignedIn && os.store.state.device.deckMode
|
||||
os.store.getters.isSignedIn && os.store.state.device.deckMode && document.location.pathname === '/'
|
||||
? { path: '/', name: 'index', component: MkDeck, children: [
|
||||
{ path: '/@:user', name: 'user', component: () => import('./views/deck/deck.user-column.vue').then(m => m.default), children: [
|
||||
{ path: '', name: 'user', component: () => import('./views/deck/deck.user-column.home.vue').then(m => m.default) },
|
||||
@@ -152,8 +152,8 @@ init(async (launch, os) => {
|
||||
{ path: '/notes/:note', name: 'note', component: () => import('./views/home/note.vue').then(m => m.default) },
|
||||
{ path: '/search', component: () => import('./views/home/search.vue').then(m => m.default) },
|
||||
{ path: '/tags/:tag', name: 'tag', component: () => import('./views/home/tag.vue').then(m => m.default) },
|
||||
{ path: '/featured', component: () => import('./views/home/featured.vue').then(m => m.default) },
|
||||
{ path: '/explore', component: () => import('../common/views/pages/explore.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: '/i/favorites', component: () => import('./views/home/favorites.vue').then(m => m.default) },
|
||||
]},
|
||||
{ path: '/i/messaging/:user', component: MkMessagingRoom },
|
||||
|
@@ -1,13 +1,13 @@
|
||||
<template>
|
||||
<div class="nav">
|
||||
<ul>
|
||||
<li v-if="!$store.state.device.deckMode" class="timeline" @click="goToTop">
|
||||
<li v-if="!$store.state.device.deckMode" class="timeline" :class="{ active: $route.name == 'index' }" @click="goToTop">
|
||||
<router-link to="/"><fa icon="home"/><p>{{ $t('@.timeline') }}</p></router-link>
|
||||
</li>
|
||||
<li class="featured">
|
||||
<li class="featured" :class="{ active: $route.name == 'featured' }">
|
||||
<router-link to="/featured"><fa :icon="faNewspaper"/><p>{{ $t('@.featured-notes') }}</p></router-link>
|
||||
</li>
|
||||
<li class="explore">
|
||||
<li class="explore" :class="{ active: $route.name == 'explore' }">
|
||||
<router-link to="/explore"><fa :icon="faHashtag"/><p>{{ $t('@.explore') }}</p></router-link>
|
||||
</li>
|
||||
<li class="game">
|
||||
|
@@ -6,24 +6,16 @@
|
||||
</div>
|
||||
|
||||
<div class="nav" v-if="$store.getters.isSignedIn">
|
||||
<template v-if="$store.state.device.deckMode">
|
||||
<div class="deck active" @click="goToTop">
|
||||
<router-link to="/"><fa icon="columns"/></router-link>
|
||||
</div>
|
||||
<div class="home">
|
||||
<a @click="toggleDeckMode(false)"><fa icon="home"/></a>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="home active" @click="goToTop">
|
||||
<template v-if="!$store.state.device.deckMode">
|
||||
<div class="home" :class="{ active: $route.name == 'index' }" @click="goToTop">
|
||||
<router-link to="/"><fa icon="home"/></router-link>
|
||||
</div>
|
||||
<div class="deck">
|
||||
<a @click="toggleDeckMode(true)"><fa icon="columns"/></a>
|
||||
</div>
|
||||
</template>
|
||||
<div class="messaging">
|
||||
<a @click="messaging"><fa icon="comments"/><template v-if="hasUnreadMessagingMessage"><fa icon="circle"/></template></a>
|
||||
<div class="featured" :class="{ active: $route.name == 'featured' }">
|
||||
<router-link to="/featured"><fa :icon="faNewspaper"/></router-link>
|
||||
</div>
|
||||
<div class="explore" :class="{ active: $route.name == 'explore' }">
|
||||
<router-link to="/explore"><fa :icon="faHashtag"/></router-link>
|
||||
</div>
|
||||
<div class="game">
|
||||
<a @click="game"><fa icon="gamepad"/><template v-if="hasGameInvitations"><fa icon="circle"/></template></a>
|
||||
@@ -37,30 +29,34 @@
|
||||
<div ref="notificationsButton" :class="{ active: showNotifications }">
|
||||
<a @click="notifications"><fa :icon="['far', 'bell']"/></a>
|
||||
</div>
|
||||
<div class="messaging">
|
||||
<a @click="messaging"><fa icon="comments"/><template v-if="hasUnreadMessagingMessage"><fa icon="circle"/></template></a>
|
||||
</div>
|
||||
<div>
|
||||
<a @click="settings"><fa icon="cog"/></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="account">
|
||||
<router-link :to="`/@${ $store.state.i.username }`">
|
||||
<mk-avatar class="avatar" :user="$store.state.i"/>
|
||||
</router-link>
|
||||
|
||||
<div class="nav menu">
|
||||
<div class="signout">
|
||||
<a @click="signout"><fa icon="power-off"/></a>
|
||||
</div>
|
||||
<div>
|
||||
<router-link to="/i/favorites"><fa icon="star"/></router-link>
|
||||
</div>
|
||||
<div v-if="($store.state.i.isLocked || $store.state.i.carefulBot)">
|
||||
<a @click="followRequests"><fa :icon="['far', 'envelope']"/><i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></a>
|
||||
</div>
|
||||
<div class="signout">
|
||||
<a @click="signout"><fa icon="power-off"/></a>
|
||||
</div>
|
||||
<div>
|
||||
<router-link to="/i/favorites"><fa icon="star"/></router-link>
|
||||
</div>
|
||||
<div v-if="($store.state.i.isLocked || $store.state.i.carefulBot)">
|
||||
<a @click="followRequests"><fa :icon="['far', 'envelope']"/><i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></a>
|
||||
</div>
|
||||
<div class="account">
|
||||
<router-link :to="`/@${ $store.state.i.username }`">
|
||||
<mk-avatar class="avatar" :user="$store.state.i"/>
|
||||
</router-link>
|
||||
</div>
|
||||
<div>
|
||||
<template v-if="$store.state.device.deckMode">
|
||||
<a @click="toggleDeckMode(false)"><fa icon="home"/></a>
|
||||
</template>
|
||||
<template v-else>
|
||||
<a @click="toggleDeckMode(true)"><fa icon="columns"/></a>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="nav dark">
|
||||
<div>
|
||||
<a @click="dark"><template v-if="$store.state.device.darkmode"><fa icon="moon"/></template><template v-else><fa :icon="['far', 'moon']"/></template></a>
|
||||
</div>
|
||||
@@ -85,6 +81,7 @@ import MkDriveWindow from './drive-window.vue';
|
||||
import MkMessagingWindow from './messaging-window.vue';
|
||||
import MkGameWindow from './game-window.vue';
|
||||
import contains from '../../../common/scripts/contains';
|
||||
import { faNewspaper, faHashtag } from '@fortawesome/free-solid-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('desktop/views/components/ui.sidebar.vue'),
|
||||
@@ -92,7 +89,8 @@ export default Vue.extend({
|
||||
return {
|
||||
hasGameInvitations: false,
|
||||
connection: null,
|
||||
showNotifications: false
|
||||
showNotifications: false,
|
||||
faNewspaper, faHashtag
|
||||
};
|
||||
},
|
||||
|
||||
@@ -278,44 +276,23 @@ export default Vue.extend({
|
||||
|
||||
> .nav.bottom
|
||||
position absolute
|
||||
bottom 128px
|
||||
bottom 0
|
||||
left 0
|
||||
|
||||
> .account
|
||||
position absolute
|
||||
bottom 64px
|
||||
left 0
|
||||
width $width
|
||||
height $width
|
||||
padding 14px
|
||||
> .account
|
||||
width $width
|
||||
height $width
|
||||
padding 14px
|
||||
|
||||
> .menu
|
||||
display none
|
||||
position absolute
|
||||
bottom 64px
|
||||
left 0
|
||||
background var(--desktopHeaderBg)
|
||||
|
||||
&:hover
|
||||
> .menu
|
||||
> *
|
||||
display block
|
||||
|
||||
> *:not(.menu)
|
||||
display block
|
||||
width 100%
|
||||
height 100%
|
||||
|
||||
> .avatar
|
||||
pointer-events none
|
||||
width 100%
|
||||
height 100%
|
||||
|
||||
> .dark
|
||||
position absolute
|
||||
bottom 0
|
||||
left 0
|
||||
width $width
|
||||
height $width
|
||||
> .avatar
|
||||
pointer-events none
|
||||
width 100%
|
||||
height 100%
|
||||
|
||||
> .notifications
|
||||
position fixed
|
||||
|
@@ -44,6 +44,7 @@ export default Vue.extend({
|
||||
this.$root.api('notes/featured', {
|
||||
limit: 20,
|
||||
}).then(notes => {
|
||||
notes.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
||||
res(notes);
|
||||
this.fetching = false;
|
||||
this.$emit('loaded');
|
||||
|
@@ -1,14 +1,25 @@
|
||||
<template>
|
||||
<x-notes ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
|
||||
<div class="iwaalbte" v-if="disabled">
|
||||
<p>
|
||||
<fa :icon="faMinusCircle"/>
|
||||
{{ $t('disabled-timeline.title') }}
|
||||
</p>
|
||||
<p class="desc">{{ $t('disabled-timeline.description') }}</p>
|
||||
</div>
|
||||
<x-notes v-else ref="timeline" :more="existMore ? more : null" :media-view="mediaView"/>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import XNotes from './deck.notes.vue';
|
||||
import { faMinusCircle } from '@fortawesome/free-solid-svg-icons';
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
const fetchLimit = 10;
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('deck'),
|
||||
|
||||
components: {
|
||||
XNotes
|
||||
},
|
||||
@@ -36,7 +47,9 @@ export default Vue.extend({
|
||||
fetching: true,
|
||||
moreFetching: false,
|
||||
existMore: false,
|
||||
connection: null
|
||||
connection: null,
|
||||
disabled: false,
|
||||
faMinusCircle
|
||||
};
|
||||
},
|
||||
|
||||
@@ -75,6 +88,12 @@ export default Vue.extend({
|
||||
this.connection.on('unfollow', this.onChangeFollowing);
|
||||
}
|
||||
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.disabled = !this.$store.state.i.isModerator && !this.$store.state.i.isAdmin && (
|
||||
meta.disableLocalTimeline && ['local', 'hybrid'].includes(this.src) ||
|
||||
meta.disableGlobalTimeline && ['global'].includes(this.src));
|
||||
});
|
||||
|
||||
this.fetch();
|
||||
},
|
||||
|
||||
@@ -149,3 +168,16 @@ export default Vue.extend({
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.iwaalbte
|
||||
color var(--text)
|
||||
text-align center
|
||||
|
||||
> p
|
||||
margin 16px
|
||||
|
||||
&.desc
|
||||
font-size 14px
|
||||
|
||||
</style>
|
||||
|
@@ -30,6 +30,7 @@ export default Vue.extend({
|
||||
this.$root.api('notes/featured', {
|
||||
limit: 20
|
||||
}).then(notes => {
|
||||
notes.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
||||
this.notes = notes;
|
||||
this.fetching = false;
|
||||
|
||||
|
@@ -10,8 +10,6 @@
|
||||
</ui-container>
|
||||
</div>
|
||||
<x-photos :user="user"/>
|
||||
<x-friends :user="user"/>
|
||||
<x-followers-you-know v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
|
||||
<x-timeline class="timeline" ref="tl" :user="user"/>
|
||||
</div>
|
||||
</template>
|
||||
@@ -23,8 +21,6 @@ import parseAcct from '../../../../../../misc/acct/parse';
|
||||
import Progress from '../../../../common/scripts/loading';
|
||||
import XTimeline from './user.timeline.vue';
|
||||
import XPhotos from './user.photos.vue';
|
||||
import XFollowersYouKnow from './user.followers-you-know.vue';
|
||||
import XFriends from './user.friends.vue';
|
||||
import XIntegrations from './user.integrations.vue';
|
||||
import XActivity from '../../../../common/views/components/activity.vue';
|
||||
|
||||
@@ -33,8 +29,6 @@ export default Vue.extend({
|
||||
components: {
|
||||
XTimeline,
|
||||
XPhotos,
|
||||
XFollowersYouKnow,
|
||||
XFriends,
|
||||
XIntegrations,
|
||||
XActivity
|
||||
},
|
||||
|
@@ -38,6 +38,7 @@ export default Vue.extend({
|
||||
this.$root.api('notes/featured', {
|
||||
limit: 20
|
||||
}).then(notes => {
|
||||
notes.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
||||
this.notes = notes;
|
||||
this.fetching = false;
|
||||
|
||||
|
Reference in New Issue
Block a user