Merge branch 'dr1ft/pleroma-fe-develop' into develop
This commit is contained in:
commit
8c2a0191a5
8 changed files with 67 additions and 10 deletions
|
@ -29,4 +29,6 @@ npm run build
|
||||||
npm run unit
|
npm run unit
|
||||||
```
|
```
|
||||||
|
|
||||||
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
# Configuration
|
||||||
|
|
||||||
|
Edit config.json for configuration. scopeOptionsEnabled gives you input fields for CWs and the scope settings.
|
||||||
|
|
|
@ -48,12 +48,21 @@ const PostStatusForm = {
|
||||||
highlighted: 0,
|
highlighted: 0,
|
||||||
newStatus: {
|
newStatus: {
|
||||||
status: statusText,
|
status: statusText,
|
||||||
files: []
|
files: [],
|
||||||
|
visibility: 'public'
|
||||||
},
|
},
|
||||||
caret: 0
|
caret: 0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
vis () {
|
||||||
|
return {
|
||||||
|
public: { selected: this.newStatus.visibility === 'public' },
|
||||||
|
unlisted: { selected: this.newStatus.visibility === 'unlisted' },
|
||||||
|
private: { selected: this.newStatus.visibility === 'private' },
|
||||||
|
direct: { selected: this.newStatus.visibility === 'direct' }
|
||||||
|
}
|
||||||
|
},
|
||||||
candidates () {
|
candidates () {
|
||||||
const firstchar = this.textAtCaret.charAt(0)
|
const firstchar = this.textAtCaret.charAt(0)
|
||||||
if (firstchar === '@') {
|
if (firstchar === '@') {
|
||||||
|
@ -118,6 +127,9 @@ const PostStatusForm = {
|
||||||
},
|
},
|
||||||
isOverLengthLimit () {
|
isOverLengthLimit () {
|
||||||
return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit)
|
return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit)
|
||||||
|
},
|
||||||
|
scopeOptionsEnabled () {
|
||||||
|
return this.$store.state.config.scopeOptionsEnabled
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -185,6 +197,8 @@ const PostStatusForm = {
|
||||||
this.posting = true
|
this.posting = true
|
||||||
statusPoster.postStatus({
|
statusPoster.postStatus({
|
||||||
status: newStatus.status,
|
status: newStatus.status,
|
||||||
|
spoilerText: newStatus.spoilerText || null,
|
||||||
|
visibility: newStatus.visibility,
|
||||||
media: newStatus.files,
|
media: newStatus.files,
|
||||||
store: this.$store,
|
store: this.$store,
|
||||||
inReplyToStatusId: this.replyTo
|
inReplyToStatusId: this.replyTo
|
||||||
|
@ -192,7 +206,8 @@ const PostStatusForm = {
|
||||||
if (!data.error) {
|
if (!data.error) {
|
||||||
this.newStatus = {
|
this.newStatus = {
|
||||||
status: '',
|
status: '',
|
||||||
files: []
|
files: [],
|
||||||
|
visibility: newStatus.visibility
|
||||||
}
|
}
|
||||||
this.$emit('posted')
|
this.$emit('posted')
|
||||||
let el = this.$el.querySelector('textarea')
|
let el = this.$el.querySelector('textarea')
|
||||||
|
@ -239,6 +254,7 @@ const PostStatusForm = {
|
||||||
e.dataTransfer.dropEffect = 'copy'
|
e.dataTransfer.dropEffect = 'copy'
|
||||||
},
|
},
|
||||||
resize (e) {
|
resize (e) {
|
||||||
|
if (!e.target) { return }
|
||||||
const vertPadding = Number(window.getComputedStyle(e.target)['padding-top'].substr(0, 1)) +
|
const vertPadding = Number(window.getComputedStyle(e.target)['padding-top'].substr(0, 1)) +
|
||||||
Number(window.getComputedStyle(e.target)['padding-bottom'].substr(0, 1))
|
Number(window.getComputedStyle(e.target)['padding-bottom'].substr(0, 1))
|
||||||
e.target.style.height = 'auto'
|
e.target.style.height = 'auto'
|
||||||
|
@ -249,6 +265,9 @@ const PostStatusForm = {
|
||||||
},
|
},
|
||||||
clearError () {
|
clearError () {
|
||||||
this.error = null
|
this.error = null
|
||||||
|
},
|
||||||
|
changeVis (visibility) {
|
||||||
|
this.newStatus.visibility = visibility
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
<div class="post-status-form">
|
<div class="post-status-form">
|
||||||
<form @submit.prevent="postStatus(newStatus)">
|
<form @submit.prevent="postStatus(newStatus)">
|
||||||
<div class="form-group" >
|
<div class="form-group" >
|
||||||
|
<input
|
||||||
|
v-if="scopeOptionsEnabled"
|
||||||
|
type="text"
|
||||||
|
:placeholder="$t('post_status.content_warning')"
|
||||||
|
v-model="newStatus.spoilerText"
|
||||||
|
class="form-cw">
|
||||||
<textarea
|
<textarea
|
||||||
ref="textarea"
|
ref="textarea"
|
||||||
@click="setCaret"
|
@click="setCaret"
|
||||||
|
@ -18,6 +24,12 @@
|
||||||
@input="resize"
|
@input="resize"
|
||||||
@paste="paste">
|
@paste="paste">
|
||||||
</textarea>
|
</textarea>
|
||||||
|
<div v-if="scopeOptionsEnabled" class="visibility-tray">
|
||||||
|
<i v-on:click="changeVis('direct')" class="icon-mail-alt" :class="vis.direct"></i>
|
||||||
|
<i v-on:click="changeVis('private')" class="icon-lock" :class="vis.private"></i>
|
||||||
|
<i v-on:click="changeVis('unlisted')" class="icon-lock-open-alt" :class="vis.unlisted"></i>
|
||||||
|
<i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public"></i>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div style="position:relative;" v-if="candidates">
|
<div style="position:relative;" v-if="candidates">
|
||||||
<div class="autocomplete-panel">
|
<div class="autocomplete-panel">
|
||||||
|
@ -79,6 +91,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.post-status-form .visibility-tray {
|
||||||
|
font-size: 1.2em;
|
||||||
|
padding: 3px;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.selected {
|
||||||
|
color: $fallback--lightFg;
|
||||||
|
color: var(--lightFg, $fallback--lightFg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.post-status-form, .login {
|
.post-status-form, .login {
|
||||||
.form-bottom {
|
.form-bottom {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -143,7 +166,15 @@
|
||||||
line-height:24px;
|
line-height:24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
form textarea {
|
form textarea.form-cw {
|
||||||
|
line-height:16px;
|
||||||
|
resize: none;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: min-height 200ms 100ms;
|
||||||
|
min-height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
form textarea.form-control {
|
||||||
line-height:16px;
|
line-height:16px;
|
||||||
resize: none;
|
resize: none;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -152,7 +183,7 @@
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
form textarea:focus {
|
form textarea.form-control:focus {
|
||||||
min-height: 48px;
|
min-height: 48px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -327,6 +327,7 @@ const en = {
|
||||||
},
|
},
|
||||||
post_status: {
|
post_status: {
|
||||||
posting: 'Posting',
|
posting: 'Posting',
|
||||||
|
content_warning: 'Content warning (optional)',
|
||||||
default: 'Just landed in L.A.'
|
default: 'Just landed in L.A.'
|
||||||
},
|
},
|
||||||
finder: {
|
finder: {
|
||||||
|
|
|
@ -88,7 +88,7 @@ window.fetch('/api/statusnet/config.json')
|
||||||
window.fetch('/static/config.json')
|
window.fetch('/static/config.json')
|
||||||
.then((res) => res.json())
|
.then((res) => res.json())
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
const {theme, background, logo, showWhoToFollowPanel, whoToFollowProvider, whoToFollowLink, showInstanceSpecificPanel} = data
|
const {theme, background, logo, showWhoToFollowPanel, whoToFollowProvider, whoToFollowLink, showInstanceSpecificPanel, scopeOptionsEnabled} = data
|
||||||
store.dispatch('setOption', { name: 'theme', value: theme })
|
store.dispatch('setOption', { name: 'theme', value: theme })
|
||||||
store.dispatch('setOption', { name: 'background', value: background })
|
store.dispatch('setOption', { name: 'background', value: background })
|
||||||
store.dispatch('setOption', { name: 'logo', value: logo })
|
store.dispatch('setOption', { name: 'logo', value: logo })
|
||||||
|
@ -96,6 +96,7 @@ window.fetch('/static/config.json')
|
||||||
store.dispatch('setOption', { name: 'whoToFollowProvider', value: whoToFollowProvider })
|
store.dispatch('setOption', { name: 'whoToFollowProvider', value: whoToFollowProvider })
|
||||||
store.dispatch('setOption', { name: 'whoToFollowLink', value: whoToFollowLink })
|
store.dispatch('setOption', { name: 'whoToFollowLink', value: whoToFollowLink })
|
||||||
store.dispatch('setOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel })
|
store.dispatch('setOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel })
|
||||||
|
store.dispatch('setOption', { name: 'scopeOptionsEnabled', value: scopeOptionsEnabled })
|
||||||
if (data['chatDisabled']) {
|
if (data['chatDisabled']) {
|
||||||
store.dispatch('disableChat')
|
store.dispatch('disableChat')
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,12 +331,14 @@ const retweet = ({ id, credentials }) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const postStatus = ({credentials, status, mediaIds, inReplyToStatusId}) => {
|
const postStatus = ({credentials, status, spoilerText, visibility, mediaIds, inReplyToStatusId}) => {
|
||||||
const idsText = mediaIds.join(',')
|
const idsText = mediaIds.join(',')
|
||||||
const form = new FormData()
|
const form = new FormData()
|
||||||
|
|
||||||
form.append('status', status)
|
form.append('status', status)
|
||||||
form.append('source', 'Pleroma FE')
|
form.append('source', 'Pleroma FE')
|
||||||
|
if (spoilerText) form.append('spoiler_text', spoilerText)
|
||||||
|
if (visibility) form.append('visibility', visibility)
|
||||||
form.append('media_ids', idsText)
|
form.append('media_ids', idsText)
|
||||||
if (inReplyToStatusId) {
|
if (inReplyToStatusId) {
|
||||||
form.append('in_reply_to_status_id', inReplyToStatusId)
|
form.append('in_reply_to_status_id', inReplyToStatusId)
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { map } from 'lodash'
|
import { map } from 'lodash'
|
||||||
import apiService from '../api/api.service.js'
|
import apiService from '../api/api.service.js'
|
||||||
|
|
||||||
const postStatus = ({ store, status, media = [], inReplyToStatusId = undefined }) => {
|
const postStatus = ({ store, status, spoilerText, visibility, media = [], inReplyToStatusId = undefined }) => {
|
||||||
const mediaIds = map(media, 'id')
|
const mediaIds = map(media, 'id')
|
||||||
|
|
||||||
return apiService.postStatus({credentials: store.state.users.currentUser.credentials, status, mediaIds, inReplyToStatusId})
|
return apiService.postStatus({credentials: store.state.users.currentUser.credentials, status, spoilerText, visibility, mediaIds, inReplyToStatusId})
|
||||||
.then((data) => data.json())
|
.then((data) => data.json())
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
if (!data.error) {
|
if (!data.error) {
|
||||||
|
|
|
@ -10,5 +10,6 @@
|
||||||
"whoToFollowProviderDummy2": "https://followlink.osa-p.net/api/get_recommend.json?acct=@{{user}}@{{host}}",
|
"whoToFollowProviderDummy2": "https://followlink.osa-p.net/api/get_recommend.json?acct=@{{user}}@{{host}}",
|
||||||
"whoToFollowLink": "https://vinayaka.distsn.org/?{{host}}+{{user}}",
|
"whoToFollowLink": "https://vinayaka.distsn.org/?{{host}}+{{user}}",
|
||||||
"whoToFollowLinkDummy2": "https://followlink.osa-p.net/recommend.html",
|
"whoToFollowLinkDummy2": "https://followlink.osa-p.net/recommend.html",
|
||||||
"showInstanceSpecificPanel": false
|
"showInstanceSpecificPanel": false,
|
||||||
|
"scopeOptionsEnabled": false
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue