Resolved merge conflict with index.html

This commit is contained in:
Your New SJW Waifu 2019-09-25 16:09:13 -05:00
commit f271d4417c
25 changed files with 449 additions and 217 deletions

View File

@ -10,7 +10,7 @@
<link rel="stylesheet" href="/static/font/css/fontello.css"> <link rel="stylesheet" href="/static/font/css/fontello.css">
<link rel="stylesheet" href="/static/font/css/animation.css"> <link rel="stylesheet" href="/static/font/css/animation.css">
</head> </head>
<body> <body class="hidden">
<noscript> <noscript>
This tale begins nine months ago. I just graduated college with a degree in journalism. This tale begins nine months ago. I just graduated college with a degree in journalism.
<br> <br>
@ -432,7 +432,6 @@
<br> <br>
<br> <br>
The moral of the story is in order to access the H.M.S. Neckbeard, you need to enable JavaScript.</noscript> The moral of the story is in order to access the H.M.S. Neckbeard, you need to enable JavaScript.</noscript>
</noscript>
<div id="app"></div> <div id="app"></div>
<!-- built files will be auto injected --> <!-- built files will be auto injected -->
</body> </body>

View File

@ -18,6 +18,7 @@
"@chenfengyuan/vue-qrcode": "^1.0.0", "@chenfengyuan/vue-qrcode": "^1.0.0",
"babel-plugin-add-module-exports": "^0.2.1", "babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-lodash": "^3.2.11", "babel-plugin-lodash": "^3.2.11",
"body-scroll-lock": "^2.6.4",
"chromatism": "^3.0.0", "chromatism": "^3.0.0",
"cropperjs": "^1.4.3", "cropperjs": "^1.4.3",
"diff": "^3.0.1", "diff": "^3.0.1",

View File

@ -8,9 +8,10 @@ import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_pan
import ChatPanel from './components/chat_panel/chat_panel.vue' import ChatPanel from './components/chat_panel/chat_panel.vue'
import MediaModal from './components/media_modal/media_modal.vue' import MediaModal from './components/media_modal/media_modal.vue'
import SideDrawer from './components/side_drawer/side_drawer.vue' import SideDrawer from './components/side_drawer/side_drawer.vue'
import MobilePostStatusModal from './components/mobile_post_status_modal/mobile_post_status_modal.vue' import MobilePostStatusButton from './components/mobile_post_status_button/mobile_post_status_button.vue'
import MobileNav from './components/mobile_nav/mobile_nav.vue' import MobileNav from './components/mobile_nav/mobile_nav.vue'
import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue'
import PostStatusModal from './components/post_status_modal/post_status_modal.vue'
import { windowWidth } from './services/window_utils/window_utils' import { windowWidth } from './services/window_utils/window_utils'
export default { export default {
@ -26,9 +27,10 @@ export default {
ChatPanel, ChatPanel,
MediaModal, MediaModal,
SideDrawer, SideDrawer,
MobilePostStatusModal, MobilePostStatusButton,
MobileNav, MobileNav,
UserReportingModal UserReportingModal,
PostStatusModal
}, },
data: () => ({ data: () => ({
mobileActivePanel: 'timeline', mobileActivePanel: 'timeline',

View File

@ -10,7 +10,8 @@
position: fixed; position: fixed;
z-index: -1; z-index: -1;
height: 100%; height: 100%;
width: 100%; left: 0;
right: -20px;
background-size: cover; background-size: cover;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 50%; background-position: 0 50%;
@ -347,6 +348,7 @@ i[class*=icon-] {
align-items: center; align-items: center;
position: fixed; position: fixed;
height: 50px; height: 50px;
box-sizing: border-box;
.logo { .logo {
display: flex; display: flex;
@ -386,6 +388,7 @@ i[class*=icon-] {
} }
.inner-nav { .inner-nav {
position: relative;
margin: auto; margin: auto;
box-sizing: border-box; box-sizing: border-box;
padding-left: 10px; padding-left: 10px;

View File

@ -4,6 +4,7 @@
:style="bgAppStyle" :style="bgAppStyle"
> >
<div <div
id="app_bg_wrapper"
class="app-bg-wrapper" class="app-bg-wrapper"
:style="bgStyle" :style="bgStyle"
/> />
@ -14,20 +15,20 @@
class="nav-bar container" class="nav-bar container"
@click="scrollToTop()" @click="scrollToTop()"
> >
<div
class="logo"
:style="logoBgStyle"
>
<div
class="mask"
:style="logoMaskStyle"
/>
<img
:src="logo"
:style="logoStyle"
>
</div>
<div class="inner-nav"> <div class="inner-nav">
<div
class="logo"
:style="logoBgStyle"
>
<div
class="mask"
:style="logoMaskStyle"
/>
<img
:src="logo"
:style="logoStyle"
>
</div>
<div class="item"> <div class="item">
<router-link <router-link
class="site-name" class="site-name"
@ -107,8 +108,9 @@
:floating="true" :floating="true"
class="floating-chat mobile-hidden" class="floating-chat mobile-hidden"
/> />
<MobilePostStatusModal /> <MobilePostStatusButton />
<UserReportingModal /> <UserReportingModal />
<PostStatusModal />
<portal-target name="modal" /> <portal-target name="modal" />
</div> </div>
</template> </template>

View File

@ -1,6 +1,7 @@
<template> <template>
<div <div
v-if="showing" v-if="showing"
v-body-scroll-lock="showing"
class="modal-view media-modal-view" class="modal-view media-modal-view"
@click.prevent="hide" @click.prevent="hide"
> >
@ -43,6 +44,10 @@
.media-modal-view { .media-modal-view {
z-index: 1001; z-index: 1001;
body:not(.scroll-locked) & {
display: none;
}
&:hover { &:hover {
.modal-view-button-arrow { .modal-view-button-arrow {
opacity: 0.75; opacity: 0.75;

View File

@ -1,14 +1,9 @@
import PostStatusForm from '../post_status_form/post_status_form.vue'
import { debounce } from 'lodash' import { debounce } from 'lodash'
const MobilePostStatusModal = { const MobilePostStatusButton = {
components: {
PostStatusForm
},
data () { data () {
return { return {
hidden: false, hidden: false,
postFormOpen: false,
scrollingDown: false, scrollingDown: false,
inputActive: false, inputActive: false,
oldScrollPos: 0, oldScrollPos: 0,
@ -28,8 +23,8 @@ const MobilePostStatusModal = {
window.removeEventListener('resize', this.handleOSK) window.removeEventListener('resize', this.handleOSK)
}, },
computed: { computed: {
currentUser () { isLoggedIn () {
return this.$store.state.users.currentUser return !!this.$store.state.users.currentUser
}, },
isHidden () { isHidden () {
return this.autohideFloatingPostButton && (this.hidden || this.inputActive) return this.autohideFloatingPostButton && (this.hidden || this.inputActive)
@ -57,17 +52,7 @@ const MobilePostStatusModal = {
window.removeEventListener('scroll', this.handleScrollEnd) window.removeEventListener('scroll', this.handleScrollEnd)
}, },
openPostForm () { openPostForm () {
this.postFormOpen = true this.$store.dispatch('openPostStatusModal')
this.hidden = true
const el = this.$el.querySelector('textarea')
this.$nextTick(function () {
el.focus()
})
},
closePostForm () {
this.postFormOpen = false
this.hidden = false
}, },
handleOSK () { handleOSK () {
// This is a big hack: we're guessing from changed window sizes if the // This is a big hack: we're guessing from changed window sizes if the
@ -105,4 +90,4 @@ const MobilePostStatusModal = {
} }
} }
export default MobilePostStatusModal export default MobilePostStatusButton

View File

@ -1,23 +1,5 @@
<template> <template>
<div v-if="currentUser"> <div v-if="isLoggedIn">
<div
v-show="postFormOpen"
class="post-form-modal-view modal-view"
@click="closePostForm"
>
<div
class="post-form-modal-panel panel"
@click.stop=""
>
<div class="panel-heading">
{{ $t('post_status.new_status') }}
</div>
<PostStatusForm
class="panel-body"
@posted="closePostForm"
/>
</div>
</div>
<button <button
class="new-status-button" class="new-status-button"
:class="{ 'hidden': isHidden }" :class="{ 'hidden': isHidden }"
@ -28,27 +10,11 @@
</div> </div>
</template> </template>
<script src="./mobile_post_status_modal.js"></script> <script src="./mobile_post_status_button.js"></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.post-form-modal-view {
align-items: flex-start;
}
.post-form-modal-panel {
flex-shrink: 0;
margin-top: 25%;
margin-bottom: 2em;
width: 100%;
max-width: 700px;
@media (orientation: landscape) {
margin-top: 8%;
}
}
.new-status-button { .new-status-button {
width: 5em; width: 5em;
height: 5em; height: 5em;

View File

@ -9,7 +9,8 @@ const Notification = {
data () { data () {
return { return {
userExpanded: false, userExpanded: false,
betterShadow: this.$store.state.interface.browserSupport.cssFilter betterShadow: this.$store.state.interface.browserSupport.cssFilter,
unmuted: false
} }
}, },
props: [ 'notification' ], props: [ 'notification' ],
@ -23,11 +24,14 @@ const Notification = {
toggleUserExpanded () { toggleUserExpanded () {
this.userExpanded = !this.userExpanded this.userExpanded = !this.userExpanded
}, },
userProfileLink (user) { generateUserProfileLink (user) {
return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames) return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
}, },
getUser (notification) { getUser (notification) {
return this.$store.state.users.usersObject[notification.from_profile.id] return this.$store.state.users.usersObject[notification.from_profile.id]
},
toggleMute () {
this.unmuted = !this.unmuted
} }
}, },
computed: { computed: {
@ -47,6 +51,12 @@ const Notification = {
return this.userInStore return this.userInStore
} }
return this.notification.from_profile return this.notification.from_profile
},
userProfileLink () {
return this.generateUserProfileLink(this.user)
},
needMute () {
return this.user.muted
} }
} }
} }

View File

@ -4,104 +4,126 @@
:compact="true" :compact="true"
:statusoid="notification.status" :statusoid="notification.status"
/> />
<div <div v-else>
v-else <div
class="non-mention" v-if="needMute && !unmuted"
:class="[userClass, { highlighted: userStyle }]" class="container muted"
:style="[ userStyle ]"
>
<a
class="avatar-container"
:href="notification.from_profile.statusnet_profile_url"
@click.stop.prevent.capture="toggleUserExpanded"
> >
<UserAvatar <small>
:compact="true" <router-link :to="userProfileLink">
:better-shadow="betterShadow" {{ notification.from_profile.screen_name }}
:user="notification.from_profile" </router-link>
/> </small>
</a> <a
<div class="notification-right"> href="#"
<UserCard class="unmute"
v-if="userExpanded" @click.prevent="toggleMute"
:user="getUser(notification)" ><i class="button-icon icon-eye-off" /></a>
:rounded="true" </div>
:bordered="true" <div
/> v-else
<span class="notification-details"> class="non-mention"
<div class="name-and-action"> :class="[userClass, { highlighted: userStyle }]"
<!-- eslint-disable vue/no-v-html --> :style="[ userStyle ]"
<span >
v-if="!!notification.from_profile.name_html" <a
class="username" class="avatar-container"
:title="'@'+notification.from_profile.screen_name" :href="notification.from_profile.statusnet_profile_url"
v-html="notification.from_profile.name_html" @click.stop.prevent.capture="toggleUserExpanded"
/> >
<!-- eslint-enable vue/no-v-html --> <UserAvatar
<span :compact="true"
v-else :better-shadow="betterShadow"
class="username" :user="notification.from_profile"
:title="'@'+notification.from_profile.screen_name" />
>{{ notification.from_profile.name }}</span> </a>
<span v-if="notification.type === 'like'"> <div class="notification-right">
<i class="fa icon-star lit" /> <UserCard
<small>{{ $t('notifications.favorited_you') }}</small> v-if="userExpanded"
</span> :user="getUser(notification)"
<span v-if="notification.type === 'repeat'"> :rounded="true"
<i :bordered="true"
class="fa icon-retweet lit" />
:title="$t('tool_tip.repeat')" <span class="notification-details">
<div class="name-and-action">
<!-- eslint-disable vue/no-v-html -->
<span
v-if="!!notification.from_profile.name_html"
class="username"
:title="'@'+notification.from_profile.screen_name"
v-html="notification.from_profile.name_html"
/> />
<small>{{ $t('notifications.repeated_you') }}</small> <!-- eslint-enable vue/no-v-html -->
</span> <span
<span v-if="notification.type === 'follow'"> v-else
<i class="fa icon-user-plus lit" /> class="username"
<small>{{ $t('notifications.followed_you') }}</small> :title="'@'+notification.from_profile.screen_name"
</span> >{{ notification.from_profile.name }}</span>
</div> <span v-if="notification.type === 'like'">
<i class="fa icon-star lit" />
<small>{{ $t('notifications.favorited_you') }}</small>
</span>
<span v-if="notification.type === 'repeat'">
<i
class="fa icon-retweet lit"
:title="$t('tool_tip.repeat')"
/>
<small>{{ $t('notifications.repeated_you') }}</small>
</span>
<span v-if="notification.type === 'follow'">
<i class="fa icon-user-plus lit" />
<small>{{ $t('notifications.followed_you') }}</small>
</span>
</div>
<div
v-if="notification.type === 'follow'"
class="timeago"
>
<span class="faint">
<Timeago
:time="notification.created_at"
:auto-update="240"
/>
</span>
</div>
<div
v-else
class="timeago"
>
<router-link
v-if="notification.status"
:to="{ name: 'conversation', params: { id: notification.status.id } }"
class="faint-link"
>
<Timeago
:time="notification.created_at"
:auto-update="240"
/>
</router-link>
</div>
<a
v-if="needMute"
href="#"
@click.prevent="toggleMute"
><i class="button-icon icon-eye-off" /></a>
</span>
<div <div
v-if="notification.type === 'follow'" v-if="notification.type === 'follow'"
class="timeago" class="follow-text"
> >
<span class="faint"> <router-link :to="userProfileLink">
<Timeago @{{ notification.from_profile.screen_name }}
:time="notification.created_at"
:auto-update="240"
/>
</span>
</div>
<div
v-else
class="timeago"
>
<router-link
v-if="notification.status"
:to="{ name: 'conversation', params: { id: notification.status.id } }"
class="faint-link"
>
<Timeago
:time="notification.created_at"
:auto-update="240"
/>
</router-link> </router-link>
</div> </div>
</span> <template v-else>
<div <status
v-if="notification.type === 'follow'" class="faint"
class="follow-text" :compact="true"
> :statusoid="notification.action"
<router-link :to="userProfileLink(notification.from_profile)"> :no-heading="true"
@{{ notification.from_profile.screen_name }} />
</router-link> </template>
</div> </div>
<template v-else>
<status
class="faint"
:compact="true"
:statusoid="notification.action"
:no-heading="true"
/>
</template>
</div> </div>
</div> </div>
</template> </template>

View File

@ -33,7 +33,6 @@
.notification { .notification {
box-sizing: border-box; box-sizing: border-box;
display: flex;
border-bottom: 1px solid; border-bottom: 1px solid;
border-color: $fallback--border; border-color: $fallback--border;
border-color: var(--border, $fallback--border); border-color: var(--border, $fallback--border);
@ -47,6 +46,10 @@
} }
} }
.muted {
padding: .25em .6em;
}
.non-mention { .non-mention {
display: flex; display: flex;
flex: 1; flex: 1;

View File

@ -8,7 +8,7 @@ import fileTypeService from '../../services/file_type/file_type.service.js'
import { reject, map, uniqBy } from 'lodash' import { reject, map, uniqBy } from 'lodash'
import suggestor from '../emoji-input/suggestor.js' import suggestor from '../emoji-input/suggestor.js'
const buildMentionsString = ({ user, attentions }, currentUser) => { const buildMentionsString = ({ user, attentions = [] }, currentUser) => {
let allAttentions = [...attentions] let allAttentions = [...attentions]
allAttentions.unshift(user) allAttentions.unshift(user)

View File

@ -0,0 +1,32 @@
import PostStatusForm from '../post_status_form/post_status_form.vue'
const PostStatusModal = {
components: {
PostStatusForm
},
computed: {
isLoggedIn () {
return !!this.$store.state.users.currentUser
},
isOpen () {
return this.isLoggedIn && this.$store.state.postStatus.modalActivated
},
params () {
return this.$store.state.postStatus.params || {}
}
},
watch: {
isOpen (val) {
if (val) {
this.$nextTick(() => this.$el.querySelector('textarea').focus())
}
}
},
methods: {
closeModal () {
this.$store.dispatch('closePostStatusModal')
}
}
}
export default PostStatusModal

View File

@ -0,0 +1,43 @@
<template>
<div
v-if="isOpen"
class="post-form-modal-view modal-view"
@click="closeModal"
>
<div
class="post-form-modal-panel panel"
@click.stop=""
>
<div class="panel-heading">
{{ $t('post_status.new_status') }}
</div>
<PostStatusForm
class="panel-body"
v-bind="params"
@posted="closeModal"
/>
</div>
</div>
</template>
<script src="./post_status_modal.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.post-form-modal-view {
align-items: flex-start;
}
.post-form-modal-panel {
flex-shrink: 0;
margin-top: 25%;
margin-bottom: 2em;
width: 100%;
max-width: 700px;
@media (orientation: landscape) {
margin-top: 8%;
}
}
</style>

View File

@ -168,6 +168,9 @@ export default {
} }
this.$store.dispatch('setMedia', [attachment]) this.$store.dispatch('setMedia', [attachment])
this.$store.dispatch('setCurrent', attachment) this.$store.dispatch('setCurrent', attachment)
},
mentionUser () {
this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user })
} }
} }
} }

View File

@ -188,6 +188,15 @@
</ProgressButton> </ProgressButton>
</div> </div>
<div>
<button
class="btn btn-default btn-block"
@click="mentionUser"
>
{{ $t('user_card.mention') }}
</button>
</div>
<div> <div>
<button <button
v-if="user.muted" v-if="user.muted"

View File

@ -11,7 +11,7 @@
rounded="top" rounded="top"
/> />
<div class="panel-footer"> <div class="panel-footer">
<post-status-form v-if="user" /> <post-status-form />
</div> </div>
</div> </div>
<auth-form <auth-form

View File

@ -0,0 +1,69 @@
import * as bodyScrollLock from 'body-scroll-lock'
let previousNavPaddingRight
let previousAppBgWrapperRight
const disableBodyScroll = (el) => {
const scrollBarGap = window.innerWidth - document.documentElement.clientWidth
bodyScrollLock.disableBodyScroll(el, {
reserveScrollBarGap: true
})
setTimeout(() => {
// If previousNavPaddingRight is already set, don't set it again.
if (previousNavPaddingRight === undefined) {
const navEl = document.getElementById('nav')
previousNavPaddingRight = window.getComputedStyle(navEl).getPropertyValue('padding-right')
navEl.style.paddingRight = previousNavPaddingRight ? `calc(${previousNavPaddingRight} + ${scrollBarGap}px)` : `${scrollBarGap}px`
}
// If previousAppBgWrapeprRight is already set, don't set it again.
if (previousAppBgWrapperRight === undefined) {
const appBgWrapperEl = document.getElementById('app_bg_wrapper')
previousAppBgWrapperRight = window.getComputedStyle(appBgWrapperEl).getPropertyValue('right')
appBgWrapperEl.style.right = previousAppBgWrapperRight ? `calc(${previousAppBgWrapperRight} + ${scrollBarGap}px)` : `${scrollBarGap}px`
}
document.body.classList.add('scroll-locked')
})
}
const enableBodyScroll = (el) => {
setTimeout(() => {
if (previousNavPaddingRight !== undefined) {
document.getElementById('nav').style.paddingRight = previousNavPaddingRight
// Restore previousNavPaddingRight to undefined so disableBodyScroll knows it can be set again.
previousNavPaddingRight = undefined
}
if (previousAppBgWrapperRight !== undefined) {
document.getElementById('app_bg_wrapper').style.right = previousAppBgWrapperRight
// Restore previousAppBgWrapperRight to undefined so disableBodyScroll knows it can be set again.
previousAppBgWrapperRight = undefined
}
document.body.classList.remove('scroll-locked')
})
bodyScrollLock.enableBodyScroll(el)
}
const directive = {
inserted: (el, binding) => {
if (binding.value) {
disableBodyScroll(el)
}
},
componentUpdated: (el, binding) => {
if (binding.oldValue === binding.value) {
return
}
if (binding.value) {
disableBodyScroll(el)
} else {
enableBodyScroll(el)
}
},
unbind: (el) => {
enableBodyScroll(el)
}
}
export default (Vue) => {
Vue.directive('body-scroll-lock', directive)
}

View File

@ -529,6 +529,7 @@
"follows_you": "Follows you!", "follows_you": "Follows you!",
"its_you": "It's you!", "its_you": "It's you!",
"media": "Media", "media": "Media",
"mention": "Mention",
"mute": "Mute", "mute": "Mute",
"muted": "Muted", "muted": "Muted",
"per_day": "per day", "per_day": "per day",

View File

@ -508,7 +508,9 @@
"pinned": "Fijado", "pinned": "Fijado",
"delete_confirm": "¿Realmente quieres borrar la publicación?", "delete_confirm": "¿Realmente quieres borrar la publicación?",
"reply_to": "Respondiendo a", "reply_to": "Respondiendo a",
"replies_list": "Respuestas:" "replies_list": "Respuestas:",
"mute_conversation": "Silenciar la conversación",
"unmute_conversation": "Mostrar la conversación"
}, },
"user_card": { "user_card": {
"approve": "Aprobar", "approve": "Aprobar",
@ -606,5 +608,16 @@
"person_talking": "{count} personas hablando", "person_talking": "{count} personas hablando",
"people_talking": "{count} gente hablando", "people_talking": "{count} gente hablando",
"no_results": "Sin resultados" "no_results": "Sin resultados"
},
"password_reset": {
"forgot_password": "¿Contraseña olvidada?",
"password_reset": "Restablecer la contraseña",
"instruction": "Ingrese su dirección de correo electrónico o nombre de usuario. Le enviaremos un enlace para restablecer su contraseña.",
"placeholder": "Su correo electrónico o nombre de usuario",
"check_email": "Revise su correo electrónico para obtener un enlace para restablecer su contraseña.",
"return_home": "Volver a la página de inicio",
"not_found": "No pudimos encontrar ese correo electrónico o nombre de usuario.",
"too_many_requests": "Has alcanzado el límite de intentos, vuelve a intentarlo más tarde.",
"password_reset_disabled": "El restablecimiento de contraseñas está deshabilitado. Póngase en contacto con el administrador de su instancia."
} }
} }

View File

@ -88,7 +88,7 @@
"followed_you": "Zu jarraitzen zaitu", "followed_you": "Zu jarraitzen zaitu",
"load_older": "Kargatu jakinarazpen zaharragoak", "load_older": "Kargatu jakinarazpen zaharragoak",
"notifications": "Jakinarazpenak", "notifications": "Jakinarazpenak",
"read": "Irakurri!", "read": "Irakurrita!",
"repeated_you": "zure mezua errepikatu du", "repeated_you": "zure mezua errepikatu du",
"no_more_notifications": "Ez dago jakinarazpen gehiago" "no_more_notifications": "Ez dago jakinarazpen gehiago"
}, },
@ -116,7 +116,7 @@
}, },
"post_status": { "post_status": {
"new_status": "Mezu berri bat idatzi", "new_status": "Mezu berri bat idatzi",
"account_not_locked_warning": "Zure kontua ez dago {0}. Edozeinek jarraitzen hastearekin, zure mezuak irakur dezake.", "account_not_locked_warning": "Zure kontua ez dago {0}. Edozeinek jarraitzen hastearekin, zure mezuak irakur ditzake.",
"account_not_locked_warning_link": "Blokeatuta", "account_not_locked_warning_link": "Blokeatuta",
"attachments_sensitive": "Nabarmendu eranskinak hunkigarri gisa ", "attachments_sensitive": "Nabarmendu eranskinak hunkigarri gisa ",
"content_type": { "content_type": {
@ -136,10 +136,10 @@
"unlisted": "Mezu hau ez da argitaratuko Denbora-lerro Publikoan ezta Ezagutzen den Sarean" "unlisted": "Mezu hau ez da argitaratuko Denbora-lerro Publikoan ezta Ezagutzen den Sarean"
}, },
"scope": { "scope": {
"direct": "Zuzena - Bidali aipatutako erabiltzaileei besterik ez", "direct": "Zuzena: Bidali aipatutako erabiltzaileei besterik ez",
"private": "Jarraitzaileentzako bakarrik- Bidali jarraitzaileentzat bakarrik", "private": "Jarraitzaileentzako bakarrik: Bidali jarraitzaileentzat bakarrik",
"public": "Publickoa - Bistaratu denbora-lerro publikoetan", "public": "Publikoa: Bistaratu denbora-lerro publikoetan",
"unlisted": "Zerrendatu gabea - ez bidali denbora-lerro publikoetan" "unlisted": "Zerrendatu gabea: ez bidali denbora-lerro publikoetara"
} }
}, },
"registration": { "registration": {
@ -228,7 +228,7 @@
"avatar_size_instruction": "Avatar irudien gomendatutako gutxieneko tamaina 150x150 pixel dira.", "avatar_size_instruction": "Avatar irudien gomendatutako gutxieneko tamaina 150x150 pixel dira.",
"export_theme": "Gorde aurre-ezarpena", "export_theme": "Gorde aurre-ezarpena",
"filtering": "Iragazten", "filtering": "Iragazten",
"filtering_explanation": "Hitz hauek dituzten muzu guztiak isilduak izango dira. Lerro bakoitzeko bat", "filtering_explanation": "Hitz hauek dituzten mezu guztiak isilduak izango dira. Lerro bakoitzeko bat",
"follow_export": "Jarraitzen dituzunak esportatu", "follow_export": "Jarraitzen dituzunak esportatu",
"follow_export_button": "Esportatu zure jarraitzaileak csv fitxategi batean", "follow_export_button": "Esportatu zure jarraitzaileak csv fitxategi batean",
"follow_import": "Jarraitzen dituzunak inportatu", "follow_import": "Jarraitzen dituzunak inportatu",
@ -276,7 +276,7 @@
"no_blocks": "Ez daude erabiltzaile blokeatutak", "no_blocks": "Ez daude erabiltzaile blokeatutak",
"no_mutes": "Ez daude erabiltzaile mututuak", "no_mutes": "Ez daude erabiltzaile mututuak",
"hide_follows_description": "Ez erakutsi nor jarraitzen ari naizen", "hide_follows_description": "Ez erakutsi nor jarraitzen ari naizen",
"hide_followers_description": "Ez erakutsi nor ari de ni jarraitzen", "hide_followers_description": "Ez erakutsi nor ari den ni jarraitzen",
"show_admin_badge": "Erakutsi Administratzaile etiketa nire profilan", "show_admin_badge": "Erakutsi Administratzaile etiketa nire profilan",
"show_moderator_badge": "Erakutsi Moderatzaile etiketa nire profilan", "show_moderator_badge": "Erakutsi Moderatzaile etiketa nire profilan",
"nsfw_clickthrough": "Gaitu klika hunkigarri eranskinak ezkutatzeko", "nsfw_clickthrough": "Gaitu klika hunkigarri eranskinak ezkutatzeko",
@ -456,8 +456,8 @@
"time": { "time": {
"day": "{0} egun", "day": "{0} egun",
"days": "{0} egun", "days": "{0} egun",
"day_short": "{0}d", "day_short": "{0}e",
"days_short": "{0}d", "days_short": "{0}e",
"hour": "{0} ordu", "hour": "{0} ordu",
"hours": "{0} ordu", "hours": "{0} ordu",
"hour_short": "{0}o", "hour_short": "{0}o",
@ -492,7 +492,7 @@
"conversation": "Elkarrizketa", "conversation": "Elkarrizketa",
"error_fetching": "Errorea eguneraketak eskuratzen", "error_fetching": "Errorea eguneraketak eskuratzen",
"load_older": "Kargatu mezu zaharragoak", "load_older": "Kargatu mezu zaharragoak",
"no_retweet_hint": "Mezu hau jarraitzailentzko bakarrik markatuta dago eta ezin da errepikatu", "no_retweet_hint": "Mezu hau jarraitzailentzako bakarrik markatuta dago eta ezin da errepikatu",
"repeated": "Errepikatuta", "repeated": "Errepikatuta",
"show_new": "Berriena erakutsi", "show_new": "Berriena erakutsi",
"up_to_date": "Eguneratuta", "up_to_date": "Eguneratuta",
@ -507,8 +507,10 @@
"unpin": "Aingura ezeztatu profilatik", "unpin": "Aingura ezeztatu profilatik",
"pinned": "Ainguratuta", "pinned": "Ainguratuta",
"delete_confirm": "Mezu hau benetan ezabatu nahi duzu?", "delete_confirm": "Mezu hau benetan ezabatu nahi duzu?",
"reply_to": "Erantzun", "reply_to": "Erantzuten",
"replies_list": "Erantzunak:" "replies_list": "Erantzunak:",
"mute_conversation": "Elkarrizketa isilarazi",
"unmute_conversation": "Elkarrizketa aktibatu"
}, },
"user_card": { "user_card": {
"approve": "Onartu", "approve": "Onartu",
@ -581,7 +583,7 @@
}, },
"tool_tip": { "tool_tip": {
"media_upload": "Multimedia igo", "media_upload": "Multimedia igo",
"repeat": "Erreplikatu", "repeat": "Errepikatu",
"reply": "Erantzun", "reply": "Erantzun",
"favorite": "Gogokoa", "favorite": "Gogokoa",
"user_settings": "Erabiltzaile ezarpenak" "user_settings": "Erabiltzaile ezarpenak"
@ -601,10 +603,21 @@
} }
}, },
"search": { "search": {
"people": "Gendea", "people": "Erabiltzaileak",
"hashtags": "Traolak", "hashtags": "Traolak",
"person_talking": "{count} pertsona hitzegiten", "person_talking": "{count} pertsona hitzegiten",
"people_talking": "{count} gende hitzegiten", "people_talking": "{count} jende hitzegiten",
"no_results": "Emaitzarik ez" "no_results": "Emaitzarik ez"
},
"password_reset": {
"forgot_password": "Pasahitza ahaztua?",
"password_reset": "Pasahitza berrezarri",
"instruction": "Idatzi zure helbide elektronikoa edo erabiltzaile izena. Pasahitza berrezartzeko esteka bidaliko dizugu.",
"placeholder": "Zure e-posta edo erabiltzaile izena",
"check_email": "Begiratu zure posta elektronikoa pasahitza berrezarri ahal izateko.",
"return_home": "Itzuli hasierara",
"not_found": "Ezin izan dugu helbide elektroniko edo erabiltzaile hori aurkitu.",
"too_many_requests": "Saiakera gehiegi burutu ditzu, saiatu berriro geroxeago.",
"password_reset_disabled": "Pasahitza berrezartzea debekatuta dago. Mesedez, jarri harremanetan instantzia administratzailearekin."
} }
} }

View File

@ -30,12 +30,12 @@
"cancel": "Anullar" "cancel": "Anullar"
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Talhar limatge", "crop_picture": "Talhar limatge",
"save": "Salvar", "save": "Salvar",
"save_without_cropping": "Salvar sens talhada", "save_without_cropping": "Salvar sens talhada",
"cancel": "Anullar" "cancel": "Anullar"
}, },
"importer": { "importer": {
"submit": "Mandar", "submit": "Mandar",
"success": "Corrèctament importat.", "success": "Corrèctament importat.",
"error": "Una error ses producha pendent limportacion daqueste fichièr." "error": "Una error ses producha pendent limportacion daqueste fichièr."
@ -65,6 +65,7 @@
"timeline": "Flux dactualitat", "timeline": "Flux dactualitat",
"twkn": "Lo malhum conegut", "twkn": "Lo malhum conegut",
"user_search": "Cèrca dutilizaires", "user_search": "Cèrca dutilizaires",
"search": "Cercar",
"who_to_follow": "Qual seguir", "who_to_follow": "Qual seguir",
"preferences": "Preferéncias" "preferences": "Preferéncias"
}, },
@ -79,19 +80,27 @@
"no_more_notifications": "Pas mai de notificacions" "no_more_notifications": "Pas mai de notificacions"
}, },
"polls": { "polls": {
"add_poll": "Ajustar un sondatge", "add_poll": "Ajustar un sondatge",
"add_option": "Ajustar dopcions", "add_option": "Ajustar dopcions",
"option": "Opcion", "option": "Opcion",
"votes": "vòtes", "votes": "vòtes",
"vote": "Votar", "vote": "Votar",
"type": "Tipe de sondatge", "type": "Tipe de sondatge",
"single_choice": "Causida unica", "single_choice": "Causida unica",
"multiple_choices": "Causida multipla", "multiple_choices": "Causida multipla",
"expiry": "Durada del sondatge", "expiry": "Durada del sondatge",
"expires_in": "Lo sondatge sacabarà {0}", "expires_in": "Lo sondatge sacabarà {0}",
"expired": "Sondatge acabat {0}", "expired": "Sondatge acabat {0}",
"not_enough_options": "I a pas pro dopcions" "not_enough_options": "I a pas pro dopcions"
}, },
"stickers": {
"add_sticker": "Ajustar un pegasolet"
},
"interactions": {
"favs_repeats": "Repeticions e favorits",
"follows": "Nòus seguidors",
"load_older": "Cargar dinteraccions anterioras"
},
"post_status": { "post_status": {
"new_status": "Publicar destatuts novèls", "new_status": "Publicar destatuts novèls",
"account_not_locked_warning": "Vòstre compte es pas {0}. Qual que siá pòt vos seguir per veire vòstras publicacions destinadas pas qua vòstres seguidors.", "account_not_locked_warning": "Vòstre compte es pas {0}. Qual que siá pòt vos seguir per veire vòstras publicacions destinadas pas qua vòstres seguidors.",
@ -137,7 +146,7 @@
} }
}, },
"selectable_list": { "selectable_list": {
"select_all": "O seleccionar tot" "select_all": "O seleccionar tot"
}, },
"settings": { "settings": {
"app_name": "Nom de laplicacion", "app_name": "Nom de laplicacion",
@ -216,7 +225,6 @@
"use_contain_fit": "Talhar pas las pèças juntas per las vinhetas", "use_contain_fit": "Talhar pas las pèças juntas per las vinhetas",
"name": "Nom", "name": "Nom",
"name_bio": "Nom & Bio", "name_bio": "Nom & Bio",
"new_password": "Nòu senhal", "new_password": "Nòu senhal",
"notification_visibility_follows": "Abonaments", "notification_visibility_follows": "Abonaments",
"notification_visibility_likes": "Aimar", "notification_visibility_likes": "Aimar",
@ -264,12 +272,12 @@
"subject_line_email": "Coma los corrièls: \"re: subjècte\"", "subject_line_email": "Coma los corrièls: \"re: subjècte\"",
"subject_line_mastodon": "Coma mastodon: copiar tal coma es", "subject_line_mastodon": "Coma mastodon: copiar tal coma es",
"subject_line_noop": "Copiar pas", "subject_line_noop": "Copiar pas",
"post_status_content_type": "Publicar lo tipe de contengut dels estatuts", "post_status_content_type": "Publicar lo tipe de contengut dels estatuts",
"stop_gifs": "Lançar los GIFs al subrevòl", "stop_gifs": "Lançar los GIFs al subrevòl",
"streaming": "Activar lo cargament automatic dels novèls estatus en anar amont", "streaming": "Activar lo cargament automatic dels novèls estatus en anar amont",
"text": "Tèxte", "text": "Tèxte",
"theme": "Tèma", "theme": "Tèma",
"theme_help_v2_1": "You can also override certain component's colors and opacity by toggling the checkbox, use \"Clear all\" button to clear all overrides.", "theme_help_v2_1": "Podètz tanben remplaçar la color dunes compausants en clicant la case, utilizatz lo boton \"O escafar tot\" per escafar totes las subrecargadas.",
"theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.", "theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.",
"theme_help": "Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.", "theme_help": "Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.",
"tooltipRadius": "Astúcias/alèrtas", "tooltipRadius": "Astúcias/alèrtas",
@ -280,14 +288,14 @@
"true": "òc" "true": "òc"
}, },
"notifications": "Notificacions", "notifications": "Notificacions",
"notification_setting": "Receber las notificacions de:", "notification_setting": "Recebre las notificacions de:",
"notification_setting_follows": "Utilizaires que seguissètz", "notification_setting_follows": "Utilizaires que seguissètz",
"notification_setting_non_follows": "Utilizaires que seguissètz pas", "notification_setting_non_follows": "Utilizaires que seguissètz pas",
"notification_setting_followers": "Utilizaires que vos seguisson", "notification_setting_followers": "Utilizaires que vos seguisson",
"notification_setting_non_followers": "Utilizaires que vos seguisson pas", "notification_setting_non_followers": "Utilizaires que vos seguisson pas",
"notification_mutes": "Per receber pas mai dun utilizaire en particular, botatz-lo en silenci.", "notification_mutes": "Per recebre pas mai dun utilizaire en particular, botatz-lo en silenci.",
"notification_blocks": "Blocar un utilizaire arrèsta totas las notificacions tan coma quitar de los seguir.", "notification_blocks": "Blocar un utilizaire arrèsta totas las notificacions tan coma quitar de los seguir.",
"enable_web_push_notifications": "Activar las notificacions web push", "enable_web_push_notifications": "Activar las notificacions web push",
"style": { "style": {
"switcher": { "switcher": {
"keep_color": "Gardar las colors", "keep_color": "Gardar las colors",
@ -442,7 +450,7 @@
"conversation": "Conversacion", "conversation": "Conversacion",
"error_fetching": "Error en cercant de mesas a jorn", "error_fetching": "Error en cercant de mesas a jorn",
"load_older": "Ne veire mai", "load_older": "Ne veire mai",
"no_retweet_hint": "Las publicacions marcadas pels seguidors solament o dirèctas se pòdon pas repetir", "no_retweet_hint": "Las publicacions marcadas pels seguidors solament o dirèctas se pòdon pas repetir",
"repeated": "repetit", "repeated": "repetit",
"show_new": "Ne veire mai", "show_new": "Ne veire mai",
"up_to_date": "A jorn", "up_to_date": "A jorn",
@ -477,6 +485,8 @@
"per_day": "per jorn", "per_day": "per jorn",
"remote_follow": "Seguir a distància", "remote_follow": "Seguir a distància",
"statuses": "Estatuts", "statuses": "Estatuts",
"subscribe": "Sabonar",
"unsubscribe": "Se desabonar",
"unblock": "Desblocar", "unblock": "Desblocar",
"unblock_progress": "Desblocatge...", "unblock_progress": "Desblocatge...",
"block_progress": "Blocatge...", "block_progress": "Blocatge...",
@ -532,5 +542,12 @@
"GiB": "Gio", "GiB": "Gio",
"TiB": "Tio" "TiB": "Tio"
} }
},
"search": {
"people": "Gent",
"hashtags": "Etiquetas",
"person_talking": "{count} persona ne parla",
"people_talking": "{count} personas ne parlan",
"no_results": "Cap de resultats"
} }
} }

View File

@ -15,6 +15,7 @@ import mediaViewerModule from './modules/media_viewer.js'
import oauthTokensModule from './modules/oauth_tokens.js' import oauthTokensModule from './modules/oauth_tokens.js'
import reportsModule from './modules/reports.js' import reportsModule from './modules/reports.js'
import pollsModule from './modules/polls.js' import pollsModule from './modules/polls.js'
import postStatusModule from './modules/postStatus.js'
import VueI18n from 'vue-i18n' import VueI18n from 'vue-i18n'
@ -26,6 +27,7 @@ import messages from './i18n/messages.js'
import VueChatScroll from 'vue-chat-scroll' import VueChatScroll from 'vue-chat-scroll'
import VueClickOutside from 'v-click-outside' import VueClickOutside from 'v-click-outside'
import PortalVue from 'portal-vue' import PortalVue from 'portal-vue'
import VBodyScrollLock from './directives/body_scroll_lock'
import VTooltip from 'v-tooltip' import VTooltip from 'v-tooltip'
import afterStoreSetup from './boot/after_store.js' import afterStoreSetup from './boot/after_store.js'
@ -38,6 +40,7 @@ Vue.use(VueI18n)
Vue.use(VueChatScroll) Vue.use(VueChatScroll)
Vue.use(VueClickOutside) Vue.use(VueClickOutside)
Vue.use(PortalVue) Vue.use(PortalVue)
Vue.use(VBodyScrollLock)
Vue.use(VTooltip) Vue.use(VTooltip)
const i18n = new VueI18n({ const i18n = new VueI18n({
@ -76,7 +79,8 @@ const persistedStateOptions = {
mediaViewer: mediaViewerModule, mediaViewer: mediaViewerModule,
oauthTokens: oauthTokensModule, oauthTokens: oauthTokensModule,
reports: reportsModule, reports: reportsModule,
polls: pollsModule polls: pollsModule,
postStatus: postStatusModule
}, },
plugins: [persistedState, pushNotifications], plugins: [persistedState, pushNotifications],
strict: false // Socket modifies itself, let's ignore this for now. strict: false // Socket modifies itself, let's ignore this for now.

25
src/modules/postStatus.js Normal file
View File

@ -0,0 +1,25 @@
const postStatus = {
state: {
params: null,
modalActivated: false
},
mutations: {
openPostStatusModal (state, params) {
state.params = params
state.modalActivated = true
},
closePostStatusModal (state) {
state.modalActivated = false
}
},
actions: {
openPostStatusModal ({ commit }, params) {
commit('openPostStatusModal', params)
},
closePostStatusModal ({ commit }) {
commit('closePostStatusModal')
}
}
}
export default postStatus

View File

@ -1196,6 +1196,11 @@ body-parser@1.18.3, body-parser@^1.16.1:
raw-body "2.3.3" raw-body "2.3.3"
type-is "~1.6.16" type-is "~1.6.16"
body-scroll-lock@^2.6.4:
version "2.6.4"
resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-2.6.4.tgz#567abc60ef4d656a79156781771398ef40462e94"
integrity sha512-NP08WsovlmxEoZP9pdlqrE+AhNaivlTrz9a0FF37BQsnOrpN48eNqivKkE7SYpM9N+YIPjsdVzfLAUQDBm6OQw==
boolbase@~1.0.0: boolbase@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"