diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-04-16 00:21:56 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-04-16 00:21:56 +0900 |
| commit | 5e1d17dff24fefd8e306ae597601f0593fa40b09 (patch) | |
| tree | 97b78f715bfe5d8456a594b2f8924c1dea509742 /src/client/components | |
| parent | Merge branch 'develop' (diff) | |
| parent | 12.76.1 (diff) | |
| download | misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.tar.gz misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.tar.bz2 misskey-5e1d17dff24fefd8e306ae597601f0593fa40b09.zip | |
Merge branch 'develop'
Diffstat (limited to 'src/client/components')
| -rw-r--r-- | src/client/components/date-separated-list.vue | 14 | ||||
| -rw-r--r-- | src/client/components/mfm.ts | 11 | ||||
| -rw-r--r-- | src/client/components/notifications.vue | 5 | ||||
| -rw-r--r-- | src/client/components/post-form.vue | 48 |
4 files changed, 64 insertions, 14 deletions
diff --git a/src/client/components/date-separated-list.vue b/src/client/components/date-separated-list.vue index 433655d6ed..833cdfc898 100644 --- a/src/client/components/date-separated-list.vue +++ b/src/client/components/date-separated-list.vue @@ -24,11 +24,9 @@ export default defineComponent({ methods: { focus() { this.$slots.default[0].elm.focus(); - } - }, + }, - render() { - const getDateText = (time: string) => { + getDateText(time: string) { const date = new Date(time).getDate(); const month = new Date(time).getMonth() + 1; return this.$t('monthAndDay', { @@ -36,9 +34,13 @@ export default defineComponent({ day: date.toString() }); } + }, + render() { const noGap = [...document.querySelectorAll('._noGap_')].some(el => el.contains(this.$parent.$el)); + if (this.items.length === 0) return; + return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? { class: 'sqadhkmv' + (noGap ? ' _block' : ''), name: 'list', @@ -72,10 +74,10 @@ export default defineComponent({ class: 'icon', icon: faAngleUp, }), - getDateText(item.createdAt) + this.getDateText(item.createdAt) ]), h('span', [ - getDateText(this.items[i + 1].createdAt), + this.getDateText(this.items[i + 1].createdAt), h(FontAwesomeIcon, { class: 'icon', icon: faAngleDown, diff --git a/src/client/components/mfm.ts b/src/client/components/mfm.ts index b8e948a188..3b08c83c7f 100644 --- a/src/client/components/mfm.ts +++ b/src/client/components/mfm.ts @@ -58,10 +58,13 @@ export default defineComponent({ const text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n'); if (!this.plain) { - const x = text.split('\n') - .map(t => t == '' ? [h('br')] : [t, h('br')]); - x[x.length - 1].pop(); - return x; + const res = []; + for (const t of text.split('\n')) { + res.push(h('br')); + res.push(t); + } + res.shift(); + return res; } else { return [text.replace(/\n/g, ' ')]; } diff --git a/src/client/components/notifications.vue b/src/client/components/notifications.vue index baafa86f4d..0891108d8b 100644 --- a/src/client/components/notifications.vue +++ b/src/client/components/notifications.vue @@ -1,7 +1,6 @@ <template> -<div class="mfcuwfyp _noGap_"> - <div class="_magnet"></div> - <XList class="notifications" :items="items" v-slot="{ item: notification }"> +<div class="mfcuwfyp _noGap_ _magnetParent"> + <XList class="notifications _magnetChild" :items="items" v-slot="{ item: notification }"> <XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/> <XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/> </XList> diff --git a/src/client/components/post-form.vue b/src/client/components/post-form.vue index ce79f34d62..4c6a9ebc95 100644 --- a/src/client/components/post-form.vue +++ b/src/client/components/post-form.vue @@ -34,6 +34,7 @@ <button @click="addVisibleUser" class="_buttonPrimary"><Fa :icon="faPlus" fixed-width/></button> </div> </div> + <MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo> <input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown"> <textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" /> <XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/> @@ -71,12 +72,14 @@ import { selectFile } from '@client/scripts/select-file'; import { notePostInterruptors, postFormActions } from '@client/store'; import { isMobile } from '@client/scripts/is-mobile'; import { throttle } from 'throttle-debounce'; +import MkInfo from '@client/components/ui/info.vue'; export default defineComponent({ components: { XNotePreview, XPostFormAttaches: defineAsyncComponent(() => import('./post-form-attaches.vue')), - XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')) + XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')), + MkInfo, }, inject: ['modal'], @@ -143,6 +146,7 @@ export default defineComponent({ autocomplete: null, draghover: false, quoteId: null, + hasNotSpecifiedMentions: false, recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'), imeText: '', typing: throttle(3000, () => { @@ -214,6 +218,18 @@ export default defineComponent({ } }, + watch: { + text() { + this.checkMissingMention(); + }, + visibleUsers: { + handler() { + this.checkMissingMention(); + }, + deep: true + } + }, + mounted() { if (this.initialText) { this.text = this.initialText; @@ -338,6 +354,32 @@ export default defineComponent({ this.$watch('localOnly', () => this.saveDraft()); }, + checkMissingMention() { + if (this.visibility === 'specified') { + const ast = mfm.parse(this.text); + + for (const x of extractMentions(ast)) { + if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) { + this.hasNotSpecifiedMentions = true; + return; + } + } + this.hasNotSpecifiedMentions = false; + } + }, + + addMissingMention() { + const ast = mfm.parse(this.text); + + for (const x of extractMentions(ast)) { + if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) { + os.api('users/show', { username: x.username, host: x.host }).then(user => { + this.visibleUsers.push(user); + }); + } + } + }, + togglePoll() { if (this.poll) { this.poll = null; @@ -741,6 +783,10 @@ export default defineComponent({ } } + > .hasNotSpecifiedMentions { + margin: 0 20px 16px 20px; + } + > .cw, > .text { display: block; |