2016-10-31 00:53:58 +09:00
|
|
|
<template>
|
2018-04-16 00:38:10 +09:00
|
|
|
<div class="post-status-form">
|
2019-06-19 05:28:31 +09:00
|
|
|
<form @submit.prevent="postStatus(newStatus)" autocomplete="off">
|
2018-04-16 00:38:10 +09:00
|
|
|
<div class="form-group" >
|
2018-06-24 05:10:13 +09:00
|
|
|
<i18n
|
2019-04-03 00:19:45 +09:00
|
|
|
v-if="!$store.state.users.currentUser.locked && newStatus.visibility == 'private'"
|
2018-06-24 05:10:13 +09:00
|
|
|
path="post_status.account_not_locked_warning"
|
|
|
|
tag="p"
|
|
|
|
class="visibility-notice">
|
2018-12-06 10:05:35 +09:00
|
|
|
<router-link :to="{ name: 'user-settings' }">{{ $t('post_status.account_not_locked_warning_link') }}</router-link>
|
2018-06-24 05:10:13 +09:00
|
|
|
</i18n>
|
2019-05-08 04:32:47 +09:00
|
|
|
<p v-if="!hideScopeNotice && newStatus.visibility === 'public'" class="visibility-notice notice-dismissible">
|
2019-05-08 01:13:45 +09:00
|
|
|
<span>{{ $t('post_status.scope_notice.public') }}</span>
|
2019-05-08 04:32:47 +09:00
|
|
|
<a v-on:click.prevent="dismissScopeNotice()" class="button-icon dismiss">
|
2019-05-08 01:13:45 +09:00
|
|
|
<i class='icon-cancel'></i>
|
|
|
|
</a>
|
|
|
|
</p>
|
2019-05-08 04:32:47 +09:00
|
|
|
<p v-else-if="!hideScopeNotice && newStatus.visibility === 'unlisted'" class="visibility-notice notice-dismissible">
|
2019-05-08 01:13:45 +09:00
|
|
|
<span>{{ $t('post_status.scope_notice.unlisted') }}</span>
|
2019-05-08 04:32:47 +09:00
|
|
|
<a v-on:click.prevent="dismissScopeNotice()" class="button-icon dismiss">
|
2019-05-08 01:13:45 +09:00
|
|
|
<i class='icon-cancel'></i>
|
|
|
|
</a>
|
|
|
|
</p>
|
2019-05-08 04:32:47 +09:00
|
|
|
<p v-else-if="!hideScopeNotice && newStatus.visibility === 'private' && $store.state.users.currentUser.locked" class="visibility-notice notice-dismissible">
|
2019-05-08 01:13:45 +09:00
|
|
|
<span>{{ $t('post_status.scope_notice.private') }}</span>
|
2019-05-08 04:32:47 +09:00
|
|
|
<a v-on:click.prevent="dismissScopeNotice()" class="button-icon dismiss">
|
2019-05-08 01:13:45 +09:00
|
|
|
<i class='icon-cancel'></i>
|
|
|
|
</a>
|
|
|
|
</p>
|
|
|
|
<p v-else-if="newStatus.visibility === 'direct'" class="visibility-notice">
|
2019-04-03 00:19:45 +09:00
|
|
|
<span v-if="safeDMEnabled">{{ $t('post_status.direct_warning_to_first_only') }}</span>
|
|
|
|
<span v-else>{{ $t('post_status.direct_warning_to_all') }}</span>
|
|
|
|
</p>
|
2019-03-26 11:38:15 +09:00
|
|
|
<EmojiInput
|
2018-12-03 12:47:35 +09:00
|
|
|
v-if="newStatus.spoilerText || alwaysShowSubject"
|
2019-06-08 22:23:58 +09:00
|
|
|
:suggest="emojiSuggestor"
|
2018-06-07 18:03:50 +09:00
|
|
|
v-model="newStatus.spoilerText"
|
2019-06-08 22:23:58 +09:00
|
|
|
class="form-control"
|
2019-06-07 06:17:49 +09:00
|
|
|
>
|
|
|
|
<input
|
|
|
|
|
|
|
|
type="text"
|
|
|
|
:placeholder="$t('post_status.content_warning')"
|
|
|
|
v-model="newStatus.spoilerText"
|
2019-06-08 22:23:58 +09:00
|
|
|
class="form-post-subject"
|
2019-06-07 06:17:49 +09:00
|
|
|
/>
|
2019-06-19 03:30:35 +09:00
|
|
|
</EmojiInput>
|
|
|
|
<EmojiInput
|
2019-06-08 22:23:58 +09:00
|
|
|
:suggest="emojiUserSuggestor"
|
|
|
|
v-model="newStatus.status"
|
2019-06-22 22:41:02 +09:00
|
|
|
class="form-control main-input"
|
2019-06-08 22:23:58 +09:00
|
|
|
>
|
2019-06-07 06:17:49 +09:00
|
|
|
<textarea
|
|
|
|
ref="textarea"
|
|
|
|
v-model="newStatus.status"
|
|
|
|
:placeholder="$t('post_status.default')"
|
|
|
|
rows="1"
|
|
|
|
@keydown.meta.enter="postStatus(newStatus)"
|
|
|
|
@keyup.ctrl.enter="postStatus(newStatus)"
|
|
|
|
@drop="fileDrop"
|
|
|
|
@dragover.prevent="fileDrag"
|
|
|
|
@input="resize"
|
|
|
|
@paste="paste"
|
|
|
|
:disabled="posting"
|
2019-06-08 22:23:58 +09:00
|
|
|
class="form-post-body"
|
2019-06-07 06:17:49 +09:00
|
|
|
>
|
|
|
|
</textarea>
|
2019-06-22 22:41:02 +09:00
|
|
|
<p
|
|
|
|
v-if="hasStatusLengthLimit"
|
|
|
|
class="character-counter faint"
|
|
|
|
:class="{ error: isOverLengthLimit }"
|
|
|
|
>
|
|
|
|
{{ charactersLeft }}
|
|
|
|
</p>
|
2019-06-19 03:30:35 +09:00
|
|
|
</EmojiInput>
|
2018-08-31 09:42:42 +09:00
|
|
|
<div class="visibility-tray">
|
2019-06-17 02:16:52 +09:00
|
|
|
<div class="text-format" v-if="postFormats.length > 1">
|
2018-08-31 13:23:06 +09:00
|
|
|
<label for="post-content-type" class="select">
|
2019-02-22 01:16:11 +09:00
|
|
|
<select id="post-content-type" v-model="newStatus.contentType" class="form-control">
|
2019-03-07 13:13:04 +09:00
|
|
|
<option v-for="postFormat in postFormats" :key="postFormat" :value="postFormat">
|
|
|
|
{{$t(`post_status.content_type["${postFormat}"]`)}}
|
|
|
|
</option>
|
2018-08-31 13:23:06 +09:00
|
|
|
</select>
|
|
|
|
<i class="icon-down-open"></i>
|
|
|
|
</label>
|
2019-05-16 04:53:33 +09:00
|
|
|
</div>
|
2019-06-17 02:16:52 +09:00
|
|
|
<div class="text-format" v-if="postFormats.length === 1">
|
|
|
|
<span class="only-format">
|
|
|
|
{{$t(`post_status.content_type["${postFormats[0]}"]`)}}
|
|
|
|
</span>
|
|
|
|
</div>
|
2018-08-31 09:42:42 +09:00
|
|
|
|
2019-03-03 22:15:41 +09:00
|
|
|
<scope-selector
|
|
|
|
:showAll="showAllScopes"
|
|
|
|
:userDefault="userDefaultScope"
|
|
|
|
:originalScope="copyMessageScope"
|
|
|
|
:initialScope="newStatus.visibility"
|
|
|
|
:onScopeChange="changeVis"/>
|
2018-06-07 18:03:50 +09:00
|
|
|
</div>
|
2018-04-16 00:38:10 +09:00
|
|
|
</div>
|
2019-06-19 05:28:31 +09:00
|
|
|
<poll-form
|
|
|
|
ref="pollForm"
|
|
|
|
v-if="pollsAvailable"
|
|
|
|
:visible="pollFormVisible"
|
|
|
|
@update-poll="setPoll"
|
|
|
|
/>
|
|
|
|
<div class='form-bottom'>
|
|
|
|
<div class='form-bottom-left'>
|
2019-02-05 00:45:26 +09:00
|
|
|
<media-upload ref="mediaUpload" @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="uploadFailed" :drop-files="dropFiles"></media-upload>
|
2019-06-19 05:28:31 +09:00
|
|
|
<div v-if="pollsAvailable" class="poll-icon">
|
|
|
|
<i
|
|
|
|
:title="$t('polls.add_poll')"
|
|
|
|
@click="togglePollForm"
|
|
|
|
class="icon-chart-bar btn btn-default"
|
|
|
|
:class="pollFormVisible && 'selected'"
|
|
|
|
/>
|
2016-10-31 00:53:58 +09:00
|
|
|
</div>
|
|
|
|
</div>
|
2019-06-19 05:28:31 +09:00
|
|
|
|
|
|
|
<button v-if="posting" disabled class="btn btn-default">{{$t('post_status.posting')}}</button>
|
|
|
|
<button v-else-if="isOverLengthLimit" disabled class="btn btn-default">{{$t('general.submit')}}</button>
|
|
|
|
<button v-else :disabled="submitDisabled" type="submit" class="btn btn-default">{{$t('general.submit')}}</button>
|
|
|
|
</div>
|
|
|
|
<div class='alert error' v-if="error">
|
|
|
|
Error: {{ error }}
|
|
|
|
<i class="button-icon icon-cancel" @click="clearError"></i>
|
|
|
|
</div>
|
|
|
|
<div class="attachments">
|
|
|
|
<div class="media-upload-wrapper" v-for="file in newStatus.files">
|
|
|
|
<i class="fa button-icon icon-cancel" @click="removeMediaFile(file)"></i>
|
|
|
|
<div class="media-upload-container attachment">
|
|
|
|
<img class="thumbnail media-upload" :src="file.url" v-if="type(file) === 'image'"></img>
|
|
|
|
<video v-if="type(file) === 'video'" :src="file.url" controls></video>
|
|
|
|
<audio v-if="type(file) === 'audio'" :src="file.url" controls></audio>
|
|
|
|
<a v-if="type(file) === 'unknown'" :href="file.url">{{file.url}}</a>
|
|
|
|
</div>
|
2018-08-26 06:18:43 +09:00
|
|
|
</div>
|
2019-06-19 05:28:31 +09:00
|
|
|
</div>
|
|
|
|
<div class="upload_settings" v-if="newStatus.files.length > 0">
|
|
|
|
<input type="checkbox" id="filesSensitive" v-model="newStatus.nsfw">
|
|
|
|
<label for="filesSensitive">{{$t('post_status.attachments_sensitive')}}</label>
|
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</div>
|
2016-10-31 00:53:58 +09:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<script src="./post_status_form.js"></script>
|
2016-11-13 05:05:01 +09:00
|
|
|
|
|
|
|
<style lang="scss">
|
2018-04-01 11:28:20 +09:00
|
|
|
@import '../../_variables.scss';
|
2017-11-21 17:30:30 +09:00
|
|
|
|
2018-04-01 03:14:36 +09:00
|
|
|
.tribute-container {
|
2018-04-08 01:30:27 +09:00
|
|
|
ul {
|
|
|
|
padding: 0px;
|
|
|
|
li {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
img {
|
|
|
|
padding: 3px;
|
|
|
|
width: 16px;
|
|
|
|
height: 16px;
|
|
|
|
border-radius: $fallback--avatarAltRadius;
|
|
|
|
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
|
|
|
|
}
|
2018-04-01 03:14:36 +09:00
|
|
|
}
|
|
|
|
|
2019-05-16 11:21:06 +09:00
|
|
|
.post-status-form {
|
|
|
|
.visibility-tray {
|
|
|
|
display: flex;
|
|
|
|
justify-content: space-between;
|
|
|
|
flex-direction: row-reverse;
|
|
|
|
padding-top: 5px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-14 03:54:25 +09:00
|
|
|
.post-status-form {
|
2018-04-08 01:30:27 +09:00
|
|
|
.form-bottom {
|
|
|
|
display: flex;
|
|
|
|
padding: 0.5em;
|
|
|
|
height: 32px;
|
|
|
|
|
2018-08-21 03:06:29 +09:00
|
|
|
button {
|
|
|
|
width: 10em;
|
|
|
|
}
|
|
|
|
|
2018-04-08 01:30:27 +09:00
|
|
|
p {
|
|
|
|
margin: 0.35em;
|
|
|
|
padding: 0.35em;
|
|
|
|
display: flex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-19 05:28:31 +09:00
|
|
|
.form-bottom-left {
|
|
|
|
display: flex;
|
|
|
|
flex: 1;
|
|
|
|
}
|
|
|
|
|
2019-06-17 02:16:52 +09:00
|
|
|
.text-format {
|
|
|
|
.only-format {
|
|
|
|
color: $fallback--faint;
|
|
|
|
color: var(--faint, $fallback--faint);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-19 05:28:31 +09:00
|
|
|
.poll-icon {
|
|
|
|
font-size: 26px;
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
.selected {
|
|
|
|
color: $fallback--lightText;
|
|
|
|
color: var(--lightText, $fallback--lightText);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.icon-chart-bar {
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
|
2019-06-17 02:16:52 +09:00
|
|
|
|
2018-04-08 01:30:27 +09:00
|
|
|
.error {
|
|
|
|
text-align: center;
|
|
|
|
}
|
|
|
|
|
2018-08-15 20:53:40 +09:00
|
|
|
.media-upload-wrapper {
|
|
|
|
flex: 0 0 auto;
|
|
|
|
max-width: 100%;
|
|
|
|
min-width: 50px;
|
|
|
|
margin-right: .2em;
|
|
|
|
margin-bottom: .5em;
|
|
|
|
|
|
|
|
.icon-cancel {
|
|
|
|
display: inline-block;
|
|
|
|
position: static;
|
|
|
|
margin: 0;
|
|
|
|
padding-bottom: 0;
|
|
|
|
margin-left: $fallback--attachmentRadius;
|
|
|
|
margin-left: var(--attachmentRadius, $fallback--attachmentRadius);
|
2018-10-08 01:59:22 +09:00
|
|
|
background-color: $fallback--fg;
|
2018-11-22 00:22:05 +09:00
|
|
|
background-color: var(--btn, $fallback--fg);
|
2018-08-15 20:53:40 +09:00
|
|
|
border-bottom-left-radius: 0;
|
|
|
|
border-bottom-right-radius: 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-08 01:30:27 +09:00
|
|
|
.attachments {
|
|
|
|
padding: 0 0.5em;
|
|
|
|
|
|
|
|
.attachment {
|
2018-08-15 20:53:40 +09:00
|
|
|
margin: 0;
|
2018-04-08 01:30:27 +09:00
|
|
|
position: relative;
|
2018-08-15 20:53:40 +09:00
|
|
|
flex: 0 0 auto;
|
2018-04-08 03:58:29 +09:00
|
|
|
border: 1px solid $fallback--border;
|
|
|
|
border: 1px solid var(--border, $fallback--border);
|
2018-08-15 20:53:40 +09:00
|
|
|
text-align: center;
|
|
|
|
|
|
|
|
audio {
|
|
|
|
min-width: 300px;
|
|
|
|
flex: 1 0 auto;
|
|
|
|
}
|
|
|
|
|
|
|
|
a {
|
|
|
|
display: block;
|
|
|
|
text-align: left;
|
|
|
|
line-height: 1.2;
|
|
|
|
padding: .5em;
|
|
|
|
}
|
2018-04-08 01:30:27 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
i {
|
|
|
|
position: absolute;
|
|
|
|
margin: 10px;
|
|
|
|
padding: 5px;
|
|
|
|
background: rgba(230,230,230,0.6);
|
|
|
|
border-radius: $fallback--attachmentRadius;
|
|
|
|
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn {
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn[disabled] {
|
|
|
|
cursor: not-allowed;
|
|
|
|
}
|
|
|
|
|
|
|
|
form {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
padding: 0.6em;
|
|
|
|
}
|
|
|
|
|
|
|
|
.form-group {
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
2019-05-16 04:53:33 +09:00
|
|
|
padding: 0.25em 0.5em 0.5em;
|
2018-04-08 01:30:27 +09:00
|
|
|
line-height:24px;
|
|
|
|
}
|
|
|
|
|
2018-06-07 18:03:50 +09:00
|
|
|
form textarea.form-cw {
|
|
|
|
line-height:16px;
|
|
|
|
resize: none;
|
|
|
|
overflow: hidden;
|
|
|
|
transition: min-height 200ms 100ms;
|
|
|
|
min-height: 1px;
|
|
|
|
}
|
|
|
|
|
2019-06-08 22:23:58 +09:00
|
|
|
.form-post-body {
|
2019-06-22 22:41:02 +09:00
|
|
|
height: 16px; // Only affects the empty-height
|
|
|
|
line-height: 16px;
|
2018-04-08 01:30:27 +09:00
|
|
|
resize: none;
|
|
|
|
overflow: hidden;
|
|
|
|
transition: min-height 200ms 100ms;
|
2019-06-22 22:41:02 +09:00
|
|
|
padding-bottom: 1.75em;
|
2018-04-08 01:30:27 +09:00
|
|
|
min-height: 1px;
|
|
|
|
box-sizing: content-box;
|
|
|
|
}
|
|
|
|
|
2019-06-08 22:23:58 +09:00
|
|
|
.form-post-body:focus {
|
2018-04-08 01:30:27 +09:00
|
|
|
min-height: 48px;
|
|
|
|
}
|
|
|
|
|
2019-06-22 22:41:02 +09:00
|
|
|
.main-input {
|
|
|
|
position: relative;
|
|
|
|
}
|
|
|
|
|
|
|
|
.character-counter {
|
|
|
|
position: absolute;
|
|
|
|
bottom: 0;
|
|
|
|
right: 0;
|
|
|
|
padding: 0;
|
|
|
|
margin: 0 0.5em;
|
|
|
|
|
|
|
|
&.error {
|
|
|
|
color: $fallback--cRed;
|
|
|
|
color: var(--cRed, $fallback--cRed);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-08 01:30:27 +09:00
|
|
|
.btn {
|
|
|
|
cursor: pointer;
|
|
|
|
}
|
|
|
|
|
|
|
|
.btn[disabled] {
|
|
|
|
cursor: not-allowed;
|
|
|
|
}
|
|
|
|
|
|
|
|
.icon-cancel {
|
|
|
|
cursor: pointer;
|
|
|
|
z-index: 4;
|
|
|
|
}
|
2018-04-01 03:14:36 +09:00
|
|
|
}
|
2016-11-13 05:05:01 +09:00
|
|
|
</style>
|