Merge branch 'small-fixes-and-improvements' into shigusegubu-themes3
This commit is contained in:
commit
5c2ed98f60
29 changed files with 244 additions and 123 deletions
13
src/App.scss
13
src/App.scss
|
|
@ -787,6 +787,19 @@ option {
|
||||||
padding: 0 0.25em;
|
padding: 0 0.25em;
|
||||||
border-radius: var(--roundness);
|
border-radius: var(--roundness);
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
|
|
||||||
|
&.-dismissible {
|
||||||
|
display: flex;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
margin: 0;
|
||||||
|
align-items: baseline;
|
||||||
|
line-height: 2;
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: block;
|
||||||
|
flex: 1 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.faint {
|
.faint {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
import { mapState } from 'pinia'
|
||||||
|
|
||||||
import FeaturesPanel from '../features_panel/features_panel.vue'
|
import FeaturesPanel from '../features_panel/features_panel.vue'
|
||||||
import InstanceSpecificPanel from '../instance_specific_panel/instance_specific_panel.vue'
|
import InstanceSpecificPanel from '../instance_specific_panel/instance_specific_panel.vue'
|
||||||
import MRFTransparencyPanel from '../mrf_transparency_panel/mrf_transparency_panel.vue'
|
import MRFTransparencyPanel from '../mrf_transparency_panel/mrf_transparency_panel.vue'
|
||||||
|
|
@ -7,6 +9,9 @@ import TermsOfServicePanel from '../terms_of_service_panel/terms_of_service_pane
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
|
|
||||||
|
const pleromaFeCommitUrl =
|
||||||
|
'https://git.pleroma.social/pleroma/pleroma-fe/commit/'
|
||||||
|
|
||||||
const About = {
|
const About = {
|
||||||
components: {
|
components: {
|
||||||
InstanceSpecificPanel,
|
InstanceSpecificPanel,
|
||||||
|
|
@ -19,6 +24,10 @@ const About = {
|
||||||
showFeaturesPanel() {
|
showFeaturesPanel() {
|
||||||
return useInstanceStore().instanceIdentity.showFeaturesPanel
|
return useInstanceStore().instanceIdentity.showFeaturesPanel
|
||||||
},
|
},
|
||||||
|
frontendVersionLink() {
|
||||||
|
return pleromaFeCommitUrl + this.frontendVersion
|
||||||
|
},
|
||||||
|
...mapState(useInstanceStore, ['backendVersion', 'backendRepository', 'frontendVersion']),
|
||||||
showInstanceSpecificPanel() {
|
showInstanceSpecificPanel() {
|
||||||
return (
|
return (
|
||||||
useInstanceStore().instanceIdentity.showInstanceSpecificPanel &&
|
useInstanceStore().instanceIdentity.showInstanceSpecificPanel &&
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,45 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="column-inner">
|
<div class="About column-inner">
|
||||||
<instance-specific-panel v-if="showInstanceSpecificPanel" />
|
<instance-specific-panel v-if="showInstanceSpecificPanel" />
|
||||||
<staff-panel />
|
<staff-panel />
|
||||||
<terms-of-service-panel />
|
<terms-of-service-panel />
|
||||||
<MRFTransparencyPanel />
|
<MRFTransparencyPanel />
|
||||||
<features-panel v-if="showFeaturesPanel" />
|
<features-panel v-if="showFeaturesPanel" />
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<div class="title">{{ $t('settings.version.title') }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<dl>
|
||||||
|
<dt>{{ $t('settings.version.backend_version') }}</dt>
|
||||||
|
<dd>
|
||||||
|
<a
|
||||||
|
:href="backendRepository"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
{{ backendVersion }}
|
||||||
|
</a>
|
||||||
|
</dd>
|
||||||
|
<dt>{{ $t('settings.version.frontend_version') }}</dt>
|
||||||
|
<dd>
|
||||||
|
<a
|
||||||
|
:href="frontendVersionLink"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
{{ frontendVersion }}
|
||||||
|
</a>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script src="./about.js"></script>
|
<script src="./about.js"></script>
|
||||||
|
<style>
|
||||||
|
.About {
|
||||||
|
dl {
|
||||||
|
padding-left: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,9 @@ const ConfirmModal = {
|
||||||
confirmText: {
|
confirmText: {
|
||||||
type: String,
|
type: String,
|
||||||
},
|
},
|
||||||
|
confirmDanger: {
|
||||||
|
type: Boolean,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
emits: ['cancelled', 'accepted'],
|
emits: ['cancelled', 'accepted'],
|
||||||
computed: {},
|
computed: {},
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
<slot name="footerLeft" />
|
<slot name="footerLeft" />
|
||||||
<button
|
<button
|
||||||
class="btn button-default"
|
class="btn button-default"
|
||||||
|
:class="{ '-danger': confirmDanger }"
|
||||||
@click.prevent="onAccept"
|
@click.prevent="onAccept"
|
||||||
v-text="confirmText"
|
v-text="confirmText"
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,7 @@
|
||||||
<confirm-modal
|
<confirm-modal
|
||||||
v-if="showingConfirmLogout"
|
v-if="showingConfirmLogout"
|
||||||
:title="$t('login.logout_confirm_title')"
|
:title="$t('login.logout_confirm_title')"
|
||||||
|
:confirm-danger="true"
|
||||||
:confirm-text="$t('login.logout_confirm_accept_button')"
|
:confirm-text="$t('login.logout_confirm_accept_button')"
|
||||||
:cancel-text="$t('login.logout_confirm_cancel_button')"
|
:cancel-text="$t('login.logout_confirm_cancel_button')"
|
||||||
@accepted="doLogout"
|
@accepted="doLogout"
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,7 @@
|
||||||
<confirm-modal
|
<confirm-modal
|
||||||
v-if="showingConfirmLogout"
|
v-if="showingConfirmLogout"
|
||||||
:title="$t('login.logout_confirm_title')"
|
:title="$t('login.logout_confirm_title')"
|
||||||
|
:confirm-danger="true"
|
||||||
:confirm-text="$t('login.logout_confirm_accept_button')"
|
:confirm-text="$t('login.logout_confirm_accept_button')"
|
||||||
:cancel-text="$t('login.logout_confirm_cancel_button')"
|
:cancel-text="$t('login.logout_confirm_cancel_button')"
|
||||||
@accepted="doLogout"
|
@accepted="doLogout"
|
||||||
|
|
|
||||||
|
|
@ -373,14 +373,20 @@ const PostStatusForm = {
|
||||||
quotable() {
|
quotable() {
|
||||||
return this.quotingAvailable && this.replyTo
|
return this.quotingAvailable && this.replyTo
|
||||||
},
|
},
|
||||||
quoteThreadToggled() {
|
quoteThreadToggled: {
|
||||||
return this.newStatus.hasQuote && this.newStatus.quote.thread
|
get() {
|
||||||
|
return this.newStatus.hasQuote && this.newStatus.quote.thread
|
||||||
|
},
|
||||||
|
set(value) {
|
||||||
|
this.newStatus.hasQuote = value
|
||||||
|
this.newStatus.quote.thread = value
|
||||||
|
this.newStatus.quote.id = value ? this.replyTo : ''
|
||||||
|
}
|
||||||
},
|
},
|
||||||
defaultQuotable() {
|
defaultQuotable() {
|
||||||
if (
|
if (
|
||||||
!this.quotingAvailable ||
|
!this.quotingAvailable ||
|
||||||
!this.isReply ||
|
!this.isReply
|
||||||
!this.$store.getters.mergedConfig.quoteReply
|
|
||||||
) {
|
) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -868,11 +874,6 @@ const PostStatusForm = {
|
||||||
quote.url = ''
|
quote.url = ''
|
||||||
quote.thread = quotable
|
quote.thread = quotable
|
||||||
},
|
},
|
||||||
setQuoteThread(v) {
|
|
||||||
this.newStatus.hasQuote = v
|
|
||||||
this.newStatus.quote.thread = v
|
|
||||||
this.newStatus.quote.id = v ? this.replyTo : ''
|
|
||||||
},
|
|
||||||
clearQuoteForm() {
|
clearQuoteForm() {
|
||||||
if (this.$refs.quoteForm) {
|
if (this.$refs.quoteForm) {
|
||||||
this.$refs.quoteForm.clear()
|
this.$refs.quoteForm.clear()
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@
|
||||||
.form-bottom-left {
|
.form-bottom-left {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 1.5em;
|
gap: 1.5em;
|
||||||
|
margin-right: 1em;
|
||||||
|
|
||||||
button {
|
button {
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
|
|
@ -89,9 +90,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.reply-or-quote-selector {
|
.reply-or-quote-selector {
|
||||||
flex: 1 0 auto;
|
flex-wrap: wrap;
|
||||||
margin-bottom: 0.5em;
|
margin-bottom: 0.5em;
|
||||||
display: grid;
|
gap: 1em;
|
||||||
|
display: flex;
|
||||||
grid-template-columns: 1fr 1fr;
|
grid-template-columns: 1fr 1fr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -144,10 +146,7 @@
|
||||||
justify-content: right;
|
justify-content: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-upload-icon,
|
.bottom-left-button {
|
||||||
.poll-icon,
|
|
||||||
.quote-icon,
|
|
||||||
.emoji-icon {
|
|
||||||
font-size: 1.85em;
|
font-size: 1.85em;
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="!disablePreview"
|
v-if="!disablePreview"
|
||||||
class="preview-heading faint"
|
class="preview-heading"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
class="preview-toggle faint"
|
class="preview-toggle faint"
|
||||||
|
|
@ -110,34 +110,23 @@
|
||||||
<div
|
<div
|
||||||
v-if="quotable"
|
v-if="quotable"
|
||||||
role="radiogroup"
|
role="radiogroup"
|
||||||
class="btn-group reply-or-quote-selector"
|
class="reply-or-quote-selector"
|
||||||
>
|
>
|
||||||
<button
|
<Checkbox
|
||||||
:id="`reply-or-quote-option-${randomSeed}-reply`"
|
|
||||||
class="btn button-default reply-or-quote-option"
|
|
||||||
:class="{ toggled: !quoteThreadToggled }"
|
|
||||||
tabindex="0"
|
|
||||||
role="radio"
|
role="radio"
|
||||||
:disabled="quoteFormVisible"
|
:radio="true"
|
||||||
:aria-labelledby="`reply-or-quote-option-${randomSeed}-reply`"
|
:model-value="!quoteThreadToggled"
|
||||||
:aria-checked="!newStatus.quote.thread"
|
@update:model-value="e => quoteThreadToggled = !e"
|
||||||
@click="setQuoteThread(false)"
|
|
||||||
>
|
>
|
||||||
{{ $t('post_status.reply_option') }}
|
{{ $t('post_status.reply_option') }}
|
||||||
</button>
|
</Checkbox>
|
||||||
<button
|
<Checkbox
|
||||||
:id="`reply-or-quote-option-${randomSeed}-quote`"
|
v-model="quoteThreadToggled"
|
||||||
class="btn button-default reply-or-quote-option"
|
:radio="true"
|
||||||
:class="{ toggled: quoteThreadToggled }"
|
|
||||||
tabindex="0"
|
|
||||||
role="radio"
|
|
||||||
:disabled="quoteFormVisible"
|
:disabled="quoteFormVisible"
|
||||||
:aria-labelledby="`reply-or-quote-option-${randomSeed}-quote`"
|
|
||||||
:aria-checked="newStatus.quote.thread"
|
|
||||||
@click="setQuoteThread(true)"
|
|
||||||
>
|
>
|
||||||
{{ $t('post_status.quote_option') }}
|
{{ $t('post_status.quote_option') }}
|
||||||
</button>
|
</Checkbox>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|
@ -292,7 +281,7 @@
|
||||||
<div class="form-bottom-left">
|
<div class="form-bottom-left">
|
||||||
<media-upload
|
<media-upload
|
||||||
ref="mediaUpload"
|
ref="mediaUpload"
|
||||||
class="media-upload-icon"
|
class="bottom-left-button media-upload-icon"
|
||||||
:drop-files="dropFiles"
|
:drop-files="dropFiles"
|
||||||
:disabled="uploadFileLimitReached"
|
:disabled="uploadFileLimitReached"
|
||||||
@uploading="startedUploadingFiles"
|
@uploading="startedUploadingFiles"
|
||||||
|
|
@ -302,8 +291,8 @@
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
v-if="pollsAvailable"
|
v-if="pollsAvailable"
|
||||||
class="poll-icon button-unstyled"
|
class="bottom-left-button poll-icon button-unstyled"
|
||||||
:class="{ selected: pollFormVisible }"
|
:class="{ toggled: pollFormVisible }"
|
||||||
:title="$t('polls.add_poll')"
|
:title="$t('polls.add_poll')"
|
||||||
@click="togglePollForm"
|
@click="togglePollForm"
|
||||||
>
|
>
|
||||||
|
|
@ -311,9 +300,9 @@
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
v-if="quotingAvailable"
|
v-if="quotingAvailable"
|
||||||
class="quote-icon button-unstyled"
|
class="bottom-left-button quote-icon button-unstyled"
|
||||||
:disabled="newStatus.quote.thread"
|
:disabled="newStatus.quote.thread"
|
||||||
:class="{ selected: quoteFormVisible }"
|
:class="{ toggled: quoteFormVisible }"
|
||||||
:title="$t('tool_tip.add_quote')"
|
:title="$t('tool_tip.add_quote')"
|
||||||
@click="toggleQuoteForm"
|
@click="toggleQuoteForm"
|
||||||
>
|
>
|
||||||
|
|
@ -389,9 +378,11 @@
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="error"
|
v-if="error"
|
||||||
class="alert error"
|
class="alert error -dismissible"
|
||||||
>
|
>
|
||||||
Error: {{ error }}
|
<span>
|
||||||
|
{{ error }}
|
||||||
|
</span>
|
||||||
<button
|
<button
|
||||||
class="button-unstyled"
|
class="button-unstyled"
|
||||||
@click="clearError"
|
@click="clearError"
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,6 @@
|
||||||
</ul>
|
</ul>
|
||||||
<h3>{{ $t('admin_dash.federation.activitypub') }}</h3>
|
<h3>{{ $t('admin_dash.federation.activitypub') }}</h3>
|
||||||
<ul class="setting-list">
|
<ul class="setting-list">
|
||||||
<li>
|
|
||||||
<BooleanSetting path=":pleroma.:instance.:allow_relay" />
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting path=":pleroma.:activitypub.:unfollow_blocked" />
|
<BooleanSetting path=":pleroma.:activitypub.:unfollow_blocked" />
|
||||||
</li>
|
</li>
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ const AppearanceTab = {
|
||||||
})),
|
})),
|
||||||
backgroundUploading: false,
|
backgroundUploading: false,
|
||||||
background: null,
|
background: null,
|
||||||
|
backgroundError: null,
|
||||||
backgroundPreview: null,
|
backgroundPreview: null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -474,6 +475,9 @@ const AppearanceTab = {
|
||||||
resetUploadedBackground() {
|
resetUploadedBackground() {
|
||||||
this.backgroundPreview = null
|
this.backgroundPreview = null
|
||||||
},
|
},
|
||||||
|
clearBackgroundError() {
|
||||||
|
this.backgroundError = null
|
||||||
|
},
|
||||||
submitBackground(background) {
|
submitBackground(background) {
|
||||||
if (!this.backgroundPreview && background !== '') {
|
if (!this.backgroundPreview && background !== '') {
|
||||||
return
|
return
|
||||||
|
|
@ -486,8 +490,11 @@ const AppearanceTab = {
|
||||||
this.$store.commit('addNewUsers', [data])
|
this.$store.commit('addNewUsers', [data])
|
||||||
this.$store.commit('setCurrentUser', data)
|
this.$store.commit('setCurrentUser', data)
|
||||||
this.backgroundPreview = null
|
this.backgroundPreview = null
|
||||||
|
this.backgroundError = null
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
this.backgroundError = e
|
||||||
})
|
})
|
||||||
.catch(this.displayUploadError)
|
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
this.backgroundUploading = false
|
this.backgroundUploading = false
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -208,6 +208,23 @@
|
||||||
{{ $t('settings.reset') }}
|
{{ $t('settings.reset') }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="backgroundError"
|
||||||
|
class="alert error -dismissible"
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
{{ backgroundError }}
|
||||||
|
</span>
|
||||||
|
<button
|
||||||
|
class="button-unstyled"
|
||||||
|
@click="clearBackgroundError"
|
||||||
|
>
|
||||||
|
<FAIcon
|
||||||
|
class="fa-scale-110 fa-old-padding"
|
||||||
|
icon="times"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
v-if="!isDefaultBackground"
|
v-if="!isDefaultBackground"
|
||||||
class="btn button-default reset-button"
|
class="btn button-default reset-button"
|
||||||
|
|
@ -246,6 +263,11 @@
|
||||||
{{ $t('settings.hide_wallpaper') }}
|
{{ $t('settings.hide_wallpaper') }}
|
||||||
</BooleanSetting>
|
</BooleanSetting>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<BooleanSetting path="compactProfiles">
|
||||||
|
{{ $t('settings.compact_profiles') }}
|
||||||
|
</BooleanSetting>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { mapState } from 'pinia'
|
||||||
import BooleanSetting from '../helpers/boolean_setting.vue'
|
import BooleanSetting from '../helpers/boolean_setting.vue'
|
||||||
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
import SharedComputedObject from '../helpers/shared_computed_object.js'
|
||||||
|
|
||||||
|
|
@ -9,14 +10,6 @@ const pleromaFeCommitUrl =
|
||||||
'https://git.pleroma.social/pleroma/pleroma-fe/commit/'
|
'https://git.pleroma.social/pleroma/pleroma-fe/commit/'
|
||||||
|
|
||||||
const VersionTab = {
|
const VersionTab = {
|
||||||
data() {
|
|
||||||
const instance = useInstanceStore()
|
|
||||||
return {
|
|
||||||
backendVersion: instance.backendVersion,
|
|
||||||
backendRepository: instance.backendRepository,
|
|
||||||
frontendVersion: instance.frontendVersion,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
components: {
|
components: {
|
||||||
BooleanSetting,
|
BooleanSetting,
|
||||||
},
|
},
|
||||||
|
|
@ -24,6 +17,7 @@ const VersionTab = {
|
||||||
frontendVersionLink() {
|
frontendVersionLink() {
|
||||||
return pleromaFeCommitUrl + this.frontendVersion
|
return pleromaFeCommitUrl + this.frontendVersion
|
||||||
},
|
},
|
||||||
|
...mapState(useInstanceStore, ['backendVersion', 'backendRepository', 'frontendVersion']),
|
||||||
...SharedComputedObject(),
|
...SharedComputedObject(),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
class="lang-selector"
|
class="lang-selector"
|
||||||
@update="val => language = val"
|
@update="val => language = val"
|
||||||
/>
|
/>
|
||||||
|
<h5>{{ $t('settings.email_language') }}</h5>
|
||||||
<interface-language-switcher
|
<interface-language-switcher
|
||||||
v-model="emailLanguage"
|
v-model="emailLanguage"
|
||||||
class="lang-selector"
|
class="lang-selector"
|
||||||
|
|
|
||||||
|
|
@ -509,22 +509,14 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
setCustomTheme() {
|
setCustomTheme() {
|
||||||
useInterfaceStore().setThemeV2({
|
useInterfaceStore().setTheme({
|
||||||
customTheme: {
|
themeFileVersion: this.selectedVersion,
|
||||||
ignore: true,
|
themeEngineVersion: CURRENT_VERSION,
|
||||||
themeFileVersion: this.selectedVersion,
|
shadows: this.shadowsLocal,
|
||||||
themeEngineVersion: CURRENT_VERSION,
|
fonts: this.fontsLocal,
|
||||||
...this.previewTheme,
|
opacity: this.currentOpacity,
|
||||||
},
|
colors: this.currentColors,
|
||||||
customThemeSource: {
|
radii: this.currentRadii,
|
||||||
themeFileVersion: this.selectedVersion,
|
|
||||||
themeEngineVersion: CURRENT_VERSION,
|
|
||||||
shadows: this.shadowsLocal,
|
|
||||||
fonts: this.fontsLocal,
|
|
||||||
opacity: this.currentOpacity,
|
|
||||||
colors: this.currentColors,
|
|
||||||
radii: this.currentRadii,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
updatePreviewColors() {
|
updatePreviewColors() {
|
||||||
|
|
|
||||||
|
|
@ -152,6 +152,7 @@ const Status = {
|
||||||
'simpleTree',
|
'simpleTree',
|
||||||
'showOtherRepliesAsButton',
|
'showOtherRepliesAsButton',
|
||||||
'dive',
|
'dive',
|
||||||
|
'ignoreMute',
|
||||||
|
|
||||||
'controlledThreadDisplayStatus',
|
'controlledThreadDisplayStatus',
|
||||||
'controlledToggleThreadDisplay',
|
'controlledToggleThreadDisplay',
|
||||||
|
|
@ -345,6 +346,7 @@ const Status = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
muted() {
|
muted() {
|
||||||
|
if (this.ignoreMute) return false
|
||||||
if (this.statusoid.user.id === this.currentUser.id) return false
|
if (this.statusoid.user.id === this.currentUser.id) return false
|
||||||
return !this.unmuted && !this.shouldNotMute && this.muteReasons.length > 0
|
return !this.unmuted && !this.shouldNotMute && this.muteReasons.length > 0
|
||||||
},
|
},
|
||||||
|
|
@ -366,6 +368,7 @@ const Status = {
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
shouldNotMute() {
|
shouldNotMute() {
|
||||||
|
if (this.ignoreMute) return true
|
||||||
if (this.isFocused) return true
|
if (this.isFocused) return true
|
||||||
const { status } = this
|
const { status } = this
|
||||||
const { reblog } = status
|
const { reblog } = status
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
.status-container {
|
.status-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: var(--status-margin);
|
padding: var(--status-margin);
|
||||||
|
gap: var(--status-margin);
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
|
@ -50,12 +51,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.left-side {
|
.left-side {
|
||||||
margin-right: var(--status-margin);
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.right-side {
|
.right-side {
|
||||||
flex: 1;
|
flex: 1 1 auto;
|
||||||
min-width: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.usercard {
|
.usercard {
|
||||||
|
|
@ -230,29 +230,47 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.repeat-info {
|
.repeat-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
padding: 0.4em var(--status-margin);
|
padding: 0.4em var(--status-margin);
|
||||||
|
|
||||||
.repeat-icon {
|
.repeater-avatar {
|
||||||
color: var(--cGreen);
|
flex: 0 0 1.5em;
|
||||||
|
border-radius: var(--roundness);
|
||||||
|
margin-left: 2em; // 3.5 (poster avatar size) - 1.5 (repeater avatar size)
|
||||||
|
width: 1.5em;
|
||||||
|
height: 1.5em;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.repeater-avatar {
|
.right-side {
|
||||||
border-radius: var(--roundness);
|
display: flex;
|
||||||
margin-left: 2em; // 3.5 (poster avatar size) - 1.5 (repeater avatar size)
|
flex: 1 1 auto;
|
||||||
width: 1.5em;
|
overflow-x: hidden;
|
||||||
height: 1.5em;
|
text-overflow: ellipsis;
|
||||||
}
|
margin-right: 0;
|
||||||
|
gap: 0.5em;
|
||||||
|
|
||||||
.repeater-name {
|
.repeater-name {
|
||||||
text-overflow: ellipsis;
|
flex: 0 1 auto;
|
||||||
margin-right: 0;
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.emoji {
|
.repeat-label {
|
||||||
width: 1em;
|
white-space: nowrap;
|
||||||
height: 1em;
|
flex: 0 0 auto;
|
||||||
vertical-align: middle;
|
|
||||||
object-fit: contain;
|
.repeat-icon {
|
||||||
|
vertical-align: middle;
|
||||||
|
color: var(--cGreen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.emoji {
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
vertical-align: middle;
|
||||||
|
object-fit: contain;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -371,21 +389,4 @@
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media all and (width <= 800px) {
|
|
||||||
.repeater-avatar {
|
|
||||||
margin-left: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.post-avatar {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
|
|
||||||
// TODO define those other way somehow?
|
|
||||||
&.-compact {
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -88,13 +88,14 @@
|
||||||
:to="retweeterProfileLink"
|
:to="retweeterProfileLink"
|
||||||
>{{ retweeter }}</router-link>
|
>{{ retweeter }}</router-link>
|
||||||
</bdi>
|
</bdi>
|
||||||
{{ ' ' }}
|
<div class="repeat-label">
|
||||||
<FAIcon
|
<FAIcon
|
||||||
icon="retweet"
|
icon="retweet"
|
||||||
class="repeat-icon"
|
class="repeat-icon"
|
||||||
:title="$t('tool_tip.repeat')"
|
:title="$t('tool_tip.repeat')"
|
||||||
/>
|
/>
|
||||||
{{ $t('timeline.repeated') }}
|
{{ $t('timeline.repeated') }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
:is-preview="true"
|
:is-preview="true"
|
||||||
:statusoid="status"
|
:statusoid="status"
|
||||||
:compact="true"
|
:compact="true"
|
||||||
|
:ignore-mute="true"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
v-else-if="error"
|
v-else-if="error"
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,15 @@ library.add(
|
||||||
faClockRotateLeft,
|
faClockRotateLeft,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const KNOWN_TAGS = new Set([
|
||||||
|
'mrf_tag:media-force-nsfw',
|
||||||
|
'mrf_tag:media-strip',
|
||||||
|
'mrf_tag:force-unlisted',
|
||||||
|
'mrf_tag:sandbox',
|
||||||
|
'mrf_tag:disable-remote-subscription',
|
||||||
|
'mrf_tag:disable-any-subscription'
|
||||||
|
])
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
// Enables all the options for profile editing, used in settings -> profile tab
|
// Enables all the options for profile editing, used in settings -> profile tab
|
||||||
|
|
@ -105,6 +114,12 @@ export default {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
// Disable forced 3:1 aspect ratio
|
||||||
|
compact: {
|
||||||
|
required: false,
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
DialogModal,
|
DialogModal,
|
||||||
|
|
@ -388,6 +403,9 @@ export default {
|
||||||
...mapState(useMergedConfigStore, ['mergedConfig']),
|
...mapState(useMergedConfigStore, ['mergedConfig']),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
isKnownTag(tag) {
|
||||||
|
return KNOWN_TAGS.has(tag)
|
||||||
|
},
|
||||||
muteUser() {
|
muteUser() {
|
||||||
this.$refs.timedMuteDialog.optionallyPrompt()
|
this.$refs.timedMuteDialog.optionallyPrompt()
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -165,12 +165,15 @@
|
||||||
|
|
||||||
.user-identity {
|
.user-identity {
|
||||||
position: relative;
|
position: relative;
|
||||||
aspect-ratio: 3;
|
|
||||||
min-height: 6em;
|
min-height: 6em;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
container: user-card / inline-size;
|
container: user-card / inline-size;
|
||||||
|
|
||||||
|
&:not(.-compact) {
|
||||||
|
aspect-ratio: 3;
|
||||||
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,10 @@
|
||||||
<div class="user-card">
|
<div class="user-card">
|
||||||
<div class="user-card-inner">
|
<div class="user-card-inner">
|
||||||
<div class="user-info">
|
<div class="user-info">
|
||||||
<div class="user-identity">
|
<div
|
||||||
|
class="user-identity"
|
||||||
|
:class="{ '-compact': compact }"
|
||||||
|
>
|
||||||
<div class="header-overlay">
|
<div class="header-overlay">
|
||||||
<div class="banner-image">
|
<div class="banner-image">
|
||||||
<img
|
<img
|
||||||
|
|
@ -212,6 +215,12 @@
|
||||||
>
|
>
|
||||||
{{ $t('user_card.group') }}
|
{{ $t('user_card.group') }}
|
||||||
</span>
|
</span>
|
||||||
|
<span
|
||||||
|
v-for="tag in user.tags"
|
||||||
|
class="alert warning user-role"
|
||||||
|
>
|
||||||
|
{{ isKnownTag ? $t('user_card.tags.' + tag) : tag }}
|
||||||
|
</span>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
v-model="localNote"
|
v-model="localNote"
|
||||||
class="input note-text"
|
class="input note-text"
|
||||||
:class="{ unstyled: !editing }"
|
:class="{ unstyled: !editing }"
|
||||||
rows="1"
|
rows="3"
|
||||||
:placeholder="$t('user_card.note_blank_click')"
|
:placeholder="$t('user_card.note_blank_click')"
|
||||||
@focus="startEditing"
|
@focus="startEditing"
|
||||||
@blur="finalizeEditing"
|
@blur="finalizeEditing"
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
<template #content="{close}">
|
<template #content="{close}">
|
||||||
<UserCard
|
<UserCard
|
||||||
class="user-popover"
|
class="user-popover"
|
||||||
|
:compact="true"
|
||||||
:show-close="true"
|
:show-close="true"
|
||||||
:show-expand="true"
|
:show-expand="true"
|
||||||
:user-id="userId"
|
:user-id="userId"
|
||||||
|
|
@ -37,7 +38,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-identity {
|
.user-identity {
|
||||||
aspect-ratio: unset;
|
|
||||||
min-width: calc(min(30em, 98vw));
|
min-width: calc(min(30em, 98vw));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import get from 'lodash/get'
|
import get from 'lodash/get'
|
||||||
|
import { mapState } from 'pinia'
|
||||||
|
|
||||||
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
import RichContent from 'src/components/rich_content/rich_content.jsx'
|
||||||
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx'
|
||||||
|
|
@ -9,6 +10,7 @@ import List from '../list/list.vue'
|
||||||
import Timeline from '../timeline/timeline.vue'
|
import Timeline from '../timeline/timeline.vue'
|
||||||
import UserCard from '../user_card/user_card.vue'
|
import UserCard from '../user_card/user_card.vue'
|
||||||
|
|
||||||
|
import { useMergedConfigStore } from 'src/stores/merged_config.js'
|
||||||
import { useInstanceStore } from 'src/stores/instance.js'
|
import { useInstanceStore } from 'src/stores/instance.js'
|
||||||
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
|
import { useInstanceCapabilitiesStore } from 'src/stores/instance_capabilities.js'
|
||||||
|
|
||||||
|
|
@ -94,6 +96,9 @@ const UserProfile = {
|
||||||
!this.user.hide_favorites)
|
!this.user.hide_favorites)
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
compactProfiles() {
|
||||||
|
return useMergedConfigStore().mergedConfig.compactProfiles
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
setFooterRef(el) {
|
setFooterRef(el) {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
:user-id="userId"
|
:user-id="userId"
|
||||||
:switcher="true"
|
:switcher="true"
|
||||||
:selected="timeline.viewing"
|
:selected="timeline.viewing"
|
||||||
|
:compact="compactProfiles"
|
||||||
avatar-action="zoom"
|
avatar-action="zoom"
|
||||||
:has-note-editor="true"
|
:has-note-editor="true"
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -1141,7 +1141,8 @@
|
||||||
"hard_reset_value_tooltip": "Remove setting from storage, forcing use of default value",
|
"hard_reset_value_tooltip": "Remove setting from storage, forcing use of default value",
|
||||||
"cache": "Cache",
|
"cache": "Cache",
|
||||||
"clear_asset_cache": "Clear asset cache",
|
"clear_asset_cache": "Clear asset cache",
|
||||||
"clear_emoji_cache": "Clear emoji cache"
|
"clear_emoji_cache": "Clear emoji cache",
|
||||||
|
"compact_profiles": "Reduce profile height on user pages"
|
||||||
},
|
},
|
||||||
"admin_dash": {
|
"admin_dash": {
|
||||||
"window_title": "Administration",
|
"window_title": "Administration",
|
||||||
|
|
@ -1737,7 +1738,15 @@
|
||||||
},
|
},
|
||||||
"personal_note": "Personal note",
|
"personal_note": "Personal note",
|
||||||
"note_blank_click": "Click to add note",
|
"note_blank_click": "Click to add note",
|
||||||
"highlight_header": "Highlight user's posts and mentions"
|
"highlight_header": "Highlight user's posts and mentions",
|
||||||
|
"tags": {
|
||||||
|
"mrf_tag:media-force-nsfw": "Mark as sensitive",
|
||||||
|
"mrf_tag:media-strip": "Remove attachments",
|
||||||
|
"mrf_tag:force-unlisted": "Force unlisted",
|
||||||
|
"mrf_tag:sandbox": "Remove from public timelines",
|
||||||
|
"mrf_tag:disable-remote-subscription": "Reject non-local follow requests",
|
||||||
|
"mrf_tag:disable-any-subscription": "Reject any follow requests"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"user_profile": {
|
"user_profile": {
|
||||||
"timeline_title": "User timeline",
|
"timeline_title": "User timeline",
|
||||||
|
|
|
||||||
|
|
@ -542,6 +542,10 @@ export const INSTANCE_DEFAULT_CONFIG_DEFINITIONS = {
|
||||||
required: true,
|
required: true,
|
||||||
default: 'none',
|
default: 'none',
|
||||||
},
|
},
|
||||||
|
compactProfiles: {
|
||||||
|
description: 'Reduce profile height on user pages',
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
export const INSTANCE_DEFAULT_CONFIG = convertDefinitions(
|
export const INSTANCE_DEFAULT_CONFIG = convertDefinitions(
|
||||||
INSTANCE_DEFAULT_CONFIG_DEFINITIONS,
|
INSTANCE_DEFAULT_CONFIG_DEFINITIONS,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue