logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://anongit.hacktivis.me/git/pleroma-fe.git/
commit: 3627aadeadb5a154fe21fc6e453ba31caa5bff0d
parent f659c9c123622a5206f17f6f17711f0572fc2119
Author: Pleroma User <66706-pleromian@users.noreply.git.pleroma.social>
Date:   Mon, 10 Feb 2025 21:20:56 +0000

Fix few markup inconsistencies

Diffstat:

Achangelog.d/markup-panels.fix1+
Msrc/boot/after_store.js1+
Msrc/components/chat_list/chat_list.vue4++--
Msrc/components/drafts/drafts.vue18+++++++++++++++---
Msrc/components/features_panel/features_panel.vue4++--
Msrc/components/mrf_transparency_panel/mrf_transparency_panel.vue2+-
Msrc/components/registration/registration.js5++++-
Msrc/components/registration/registration.vue604++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/components/staff_panel/staff_panel.vue5++---
Msrc/components/terms_of_service_panel/terms_of_service_panel.js3+++
Msrc/components/terms_of_service_panel/terms_of_service_panel.vue13+++++++++++--
Msrc/components/user_card/user_card.vue5++++-
Msrc/i18n/en.json3++-
Msrc/modules/instance.js1+
14 files changed, 355 insertions(+), 314 deletions(-)

diff --git a/changelog.d/markup-panels.fix b/changelog.d/markup-panels.fix @@ -0,0 +1 @@ +Fix few markup panel inconsistencies; better ToS and registration diff --git a/src/boot/after_store.js b/src/boot/after_store.js @@ -129,6 +129,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => { copyInstanceOption('theme') copyInstanceOption('style') copyInstanceOption('palette') + copyInstanceOption('embeddedToS') copyInstanceOption('nsfwCensorImage') copyInstanceOption('background') copyInstanceOption('hidePostStats') diff --git a/src/components/chat_list/chat_list.vue b/src/components/chat_list/chat_list.vue @@ -34,7 +34,7 @@ </div> <div v-else - class="emtpy-chat-list-alert" + class="empty-chat-list-alert" > <span>{{ $t('chats.empty_chat_list_placeholder') }}</span> </div> @@ -50,7 +50,7 @@ margin-bottom: 0; } -.emtpy-chat-list-alert { +.empty-chat-list-alert { padding: 3em; font-size: 1.2em; display: flex; diff --git a/src/components/drafts/drafts.vue b/src/components/drafts/drafts.vue @@ -1,15 +1,18 @@ <template> <div class="Drafts"> <div class="panel panel-default"> - <div class="panel-heading"> + <div class="panel-heading -sticky"> <div class="title"> {{ $t('drafts.drafts') }} </div> </div> <div class="panel-body"> - <p v-if="drafts.length === 0"> + <div + v-if="drafts.length === 0" + class="empty-drafs-list-alert" + > {{ $t('drafts.no_drafts') }} - </p> + </div> <List v-else :items="drafts" @@ -33,4 +36,13 @@ .draft { margin: 1em 0; } + +.empty-drafs-list-alert { + padding: 3em; + font-size: 1.2em; + display: flex; + justify-content: center; + color: var(--textFaint); +} + </style> diff --git a/src/components/features_panel/features_panel.vue b/src/components/features_panel/features_panel.vue @@ -1,12 +1,12 @@ <template> <div class="features-panel"> <div class="panel panel-default base01-background"> - <div class="panel-heading timeline-heading base02-background base04"> + <div class="panel-heading timeline-heading base02-background base04 -sticky"> <h1 class="title"> {{ $t('features_panel.title') }} </h1> </div> - <div class="panel-body features-panel"> + <div class="panel-body"> <ul> <li v-if="shout"> {{ $t('features_panel.shout') }} diff --git a/src/components/mrf_transparency_panel/mrf_transparency_panel.vue b/src/components/mrf_transparency_panel/mrf_transparency_panel.vue @@ -4,7 +4,7 @@ class="mrf-transparency-panel" > <div class="panel panel-default base01-background"> - <div class="panel-heading timeline-heading base02-background"> + <div class="panel-heading timeline-heading base02-background -sticky"> <div class="title"> {{ $t("about.mrf.federation") }} </div> diff --git a/src/components/registration/registration.js b/src/components/registration/registration.js @@ -4,6 +4,7 @@ import { mapActions, mapState } from 'vuex' import InterfaceLanguageSwitcher from '../interface_language_switcher/interface_language_switcher.vue' import localeService from '../../services/locale/locale.service.js' import { DAY } from 'src/services/date_utils/date_utils.js' +import TermsOfServicePanel from '../terms_of_service_panel/terms_of_service_panel.vue' const registration = { setup () { return { v$: useVuelidate() } }, @@ -21,7 +22,8 @@ const registration = { captcha: {} }), components: { - InterfaceLanguageSwitcher + InterfaceLanguageSwitcher, + TermsOfServicePanel }, validations () { return { @@ -86,6 +88,7 @@ const registration = { signUpNotice: (state) => state.users.signUpNotice, hasSignUpNotice: (state) => !!state.users.signUpNotice.message, termsOfService: (state) => state.instance.tos, + embeddedToS: (state) => state.instance.embeddedToS, accountActivationRequired: (state) => state.instance.accountActivationRequired, accountApprovalRequired: (state) => state.instance.accountApprovalRequired, birthdayRequired: (state) => state.instance.birthdayRequired, diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue @@ -1,321 +1,325 @@ <template> - <div class="settings panel panel-default"> - <div class="panel-heading"> - <h1 class="title"> - {{ $t('registration.registration') }} - </h1> - </div> - <div - v-if="!hasSignUpNotice" - class="panel-body" - > - <form - class="registration-form" - @submit.prevent="submit(user)" + <div class="column-inner"> + <TermsOfServicePanel v-if="!hasSignUpNotice && !embeddedToS" /> + <div class="settings panel panel-default"> + <div class="panel-heading"> + <h1 class="title"> + {{ $t('registration.registration') }} + </h1> + </div> + <div + v-if="!hasSignUpNotice" + class="panel-body" > - <div class="container"> - <div class="text-fields"> - <div - class="form-group" - :class="{ 'form-group--error': v$.user.username.$error }" - > - <label - class="form--label" - for="sign-up-username" - >{{ $t('login.username') }}</label> - <input - id="sign-up-username" - v-model.trim="v$.user.username.$model" - :disabled="isPending" - class="input form-control" - :aria-required="true" - :placeholder="$t('registration.username_placeholder')" + <form + class="registration-form" + @submit.prevent="submit(user)" + > + <div class="container"> + <div class="text-fields"> + <div + class="form-group" + :class="{ 'form-group--error': v$.user.username.$error }" > - </div> - <div - v-if="v$.user.username.$dirty" - class="form-error" - > - <ul> - <li v-if="!v$.user.username.required"> - <span>{{ $t('registration.validations.username_required') }}</span> - </li> - </ul> - </div> - - <div - class="form-group" - :class="{ 'form-group--error': v$.user.fullname.$error }" - > - <label - class="form--label" - for="sign-up-fullname" - >{{ $t('registration.fullname') }}</label> - <input - id="sign-up-fullname" - v-model.trim="v$.user.fullname.$model" - :disabled="isPending" - class="input form-control" - :aria-required="true" - :placeholder="$t('registration.fullname_placeholder')" + <label + class="form--label" + for="sign-up-username" + >{{ $t('login.username') }}</label> + <input + id="sign-up-username" + v-model.trim="v$.user.username.$model" + :disabled="isPending" + class="input form-control" + :aria-required="true" + :placeholder="$t('registration.username_placeholder')" + > + </div> + <div + v-if="v$.user.username.$dirty" + class="form-error" > - </div> - <div - v-if="v$.user.fullname.$dirty" - class="form-error" - > - <ul> - <li v-if="!v$.user.fullname.required"> - <span>{{ $t('registration.validations.fullname_required') }}</span> - </li> - </ul> - </div> - - <div - class="form-group" - :class="{ 'form-group--error': v$.user.email.$error }" - > - <label - class="form--label" - for="email" - >{{ accountActivationRequired ? $t('registration.email') : $t('registration.email_optional') }}</label> - <input - id="email" - v-model="v$.user.email.$model" - :disabled="isPending" - class="input form-control" - type="email" - :aria-required="accountActivationRequired" + <ul> + <li v-if="!v$.user.username.required"> + <span>{{ $t('registration.validations.username_required') }}</span> + </li> + </ul> + </div> + + <div + class="form-group" + :class="{ 'form-group--error': v$.user.fullname.$error }" > - </div> - <div - v-if="v$.user.email.$dirty" - class="form-error" - > - <ul> - <li v-if="!v$.user.email.required"> - <span>{{ $t('registration.validations.email_required') }}</span> - </li> - </ul> - </div> - - <div class="form-group"> - <label - class="form--label" - for="bio" - >{{ $t('registration.bio_optional') }}</label> - <textarea - id="bio" - v-model="user.bio" - :disabled="isPending" - class="input form-control" - :placeholder="bioPlaceholder" - /> - </div> - - <div - class="form-group" - :class="{ 'form-group--error': v$.user.password.$error }" - > - <label - class="form--label" - for="sign-up-password" - >{{ $t('login.password') }}</label> - <input - id="sign-up-password" - v-model="user.password" - :disabled="isPending" - class="input form-control" - type="password" - :aria-required="true" + <label + class="form--label" + for="sign-up-fullname" + >{{ $t('registration.fullname') }}</label> + <input + id="sign-up-fullname" + v-model.trim="v$.user.fullname.$model" + :disabled="isPending" + class="input form-control" + :aria-required="true" + :placeholder="$t('registration.fullname_placeholder')" + > + </div> + <div + v-if="v$.user.fullname.$dirty" + class="form-error" > - </div> - <div - v-if="v$.user.password.$dirty" - class="form-error" - > - <ul> - <li v-if="!v$.user.password.required"> - <span>{{ $t('registration.validations.password_required') }}</span> - </li> - </ul> - </div> - - <div - class="form-group" - :class="{ 'form-group--error': v$.user.confirm.$error }" - > - <label - class="form--label" - for="sign-up-password-confirmation" - >{{ $t('registration.password_confirm') }}</label> - <input - id="sign-up-password-confirmation" - v-model="user.confirm" - :disabled="isPending" - class="input form-control" - type="password" - :aria-required="true" + <ul> + <li v-if="!v$.user.fullname.required"> + <span>{{ $t('registration.validations.fullname_required') }}</span> + </li> + </ul> + </div> + + <div + class="form-group" + :class="{ 'form-group--error': v$.user.email.$error }" > - </div> - <div - v-if="v$.user.confirm.$dirty" - class="form-error" - > - <ul> - <li v-if="v$.user.confirm.required.$invalid"> - <span>{{ $t('registration.validations.password_confirmation_required') }}</span> - </li> - <li v-if="v$.user.confirm.sameAs.$invalid"> - <span>{{ $t('registration.validations.password_confirmation_match') }}</span> - </li> - </ul> - </div> + <label + class="form--label" + for="email" + >{{ accountActivationRequired ? $t('registration.email') : $t('registration.email_optional') }}</label> + <input + id="email" + v-model="v$.user.email.$model" + :disabled="isPending" + class="input form-control" + type="email" + :aria-required="accountActivationRequired" + > + </div> + <div + v-if="v$.user.email.$dirty" + class="form-error" + > + <ul> + <li v-if="!v$.user.email.required"> + <span>{{ $t('registration.validations.email_required') }}</span> + </li> + </ul> + </div> + + <div class="form-group"> + <label + class="form--label" + for="bio" + >{{ $t('registration.bio_optional') }}</label> + <textarea + id="bio" + v-model="user.bio" + :disabled="isPending" + class="input form-control" + :placeholder="bioPlaceholder" + /> + </div> - <div - class="form-group" - :class="{ 'form-group--error': v$.user.birthday.$error }" - > - <label - class="form--label" - for="sign-up-birthday" + <div + class="form-group" + :class="{ 'form-group--error': v$.user.password.$error }" > - {{ birthdayRequired ? $t('registration.birthday') : $t('registration.birthday_optional') }} - </label> - <input - id="sign-up-birthday" - v-model="user.birthday" - :disabled="isPending" - class="input form-control" - type="date" - :max="birthdayRequired ? birthdayMinAttr : undefined" - :aria-required="birthdayRequired" + <label + class="form--label" + for="sign-up-password" + >{{ $t('login.password') }}</label> + <input + id="sign-up-password" + v-model="user.password" + :disabled="isPending" + class="input form-control" + type="password" + :aria-required="true" + > + </div> + <div + v-if="v$.user.password.$dirty" + class="form-error" > - </div> - <div - v-if="v$.user.birthday.$dirty" - class="form-error" - > - <ul> - <li v-if="v$.user.birthday.required.$invalid"> - <span>{{ $t('registration.validations.birthday_required') }}</span> - </li> - <li v-if="v$.user.birthday.maxValue.$invalid"> - <span>{{ $t('registration.validations.birthday_min_age', { date: birthdayMinFormatted }) }}</span> - </li> - </ul> - </div> - - <div - class="form-group" - :class="{ 'form-group--error': v$.user.language.$error }" - > - <interface-language-switcher - for="email-language" - :prompt-text="$t('registration.email_language')" - :language="v$.user.language.$model" - :set-language="val => v$.user.language.$model = val" - @click.stop.prevent - /> - </div> - - <div - v-if="accountApprovalRequired" - class="form-group" - > - <label - class="form--label" - for="reason" - >{{ $t('registration.reason') }}</label> - <textarea - id="reason" - v-model="user.reason" - :disabled="isPending" - class="input form-control" - :placeholder="reasonPlaceholder" - /> - </div> - - <div - v-if="captcha.type != 'none'" - id="captcha-group" - class="form-group" - > - <label - class="form--label" - for="captcha-label" - >{{ $t('registration.captcha') }}</label> - - <template v-if="['kocaptcha', 'native'].includes(captcha.type)"> - <img - :src="captcha.url" - @click="setCaptcha" + <ul> + <li v-if="!v$.user.password.required"> + <span>{{ $t('registration.validations.password_required') }}</span> + </li> + </ul> + </div> + + <div + class="form-group" + :class="{ 'form-group--error': v$.user.confirm.$error }" + > + <label + class="form--label" + for="sign-up-password-confirmation" + >{{ $t('registration.password_confirm') }}</label> + <input + id="sign-up-password-confirmation" + v-model="user.confirm" + :disabled="isPending" + class="input form-control" + type="password" + :aria-required="true" > - - <sub>{{ $t('registration.new_captcha') }}</sub> - + </div> + <div + v-if="v$.user.confirm.$dirty" + class="form-error" + > + <ul> + <li v-if="v$.user.confirm.required.$invalid"> + <span>{{ $t('registration.validations.password_confirmation_required') }}</span> + </li> + <li v-if="v$.user.confirm.sameAs.$invalid"> + <span>{{ $t('registration.validations.password_confirmation_match') }}</span> + </li> + </ul> + </div> + + <div + class="form-group" + :class="{ 'form-group--error': v$.user.birthday.$error }" + > + <label + class="form--label" + for="sign-up-birthday" + > + {{ birthdayRequired ? $t('registration.birthday') : $t('registration.birthday_optional') }} + </label> <input - id="captcha-answer" - v-model="captcha.solution" + id="sign-up-birthday" + v-model="user.birthday" + :disabled="isPending" + class="input form-control" + type="date" + :max="birthdayRequired ? birthdayMinAttr : undefined" + :aria-required="birthdayRequired" + > + </div> + <div + v-if="v$.user.birthday.$dirty" + class="form-error" + > + <ul> + <li v-if="v$.user.birthday.required.$invalid"> + <span>{{ $t('registration.validations.birthday_required') }}</span> + </li> + <li v-if="v$.user.birthday.maxValue.$invalid"> + <span>{{ $t('registration.validations.birthday_min_age', { date: birthdayMinFormatted }) }}</span> + </li> + </ul> + </div> + + <div + class="form-group" + :class="{ 'form-group--error': v$.user.language.$error }" + > + <interface-language-switcher + for="email-language" + :prompt-text="$t('registration.email_language')" + :language="v$.user.language.$model" + :set-language="val => v$.user.language.$model = val" + @click.stop.prevent + /> + </div> + + <div + v-if="accountApprovalRequired" + class="form-group" + > + <label + class="form--label" + for="reason" + >{{ $t('registration.reason') }}</label> + <textarea + id="reason" + v-model="user.reason" :disabled="isPending" class="input form-control" + :placeholder="reasonPlaceholder" + /> + </div> + + <div + v-if="captcha.type != 'none'" + id="captcha-group" + class="form-group" + > + <label + class="form--label" + for="captcha-label" + >{{ $t('registration.captcha') }}</label> + + <template v-if="['kocaptcha', 'native'].includes(captcha.type)"> + <img + :src="captcha.url" + @click="setCaptcha" + > + + <sub>{{ $t('registration.new_captcha') }}</sub> + + <input + id="captcha-answer" + v-model="captcha.solution" + :disabled="isPending" + class="input form-control" + type="text" + autocomplete="off" + autocorrect="off" + autocapitalize="off" + spellcheck="false" + > + </template> + </div> + + <div + v-if="token" + class="form-group" + > + <label for="token">{{ $t('registration.token') }}</label> + <input + id="token" + v-model="token" + disabled="true" + class="input form-control" type="text" - autocomplete="off" - autocorrect="off" - autocapitalize="off" - spellcheck="false" > - </template> + </div> + <div class="form-group"> + <button + :disabled="isPending" + type="submit" + class="btn button-default" + > + {{ $t('registration.register') }} + </button> + </div> </div> + <!-- eslint-disable vue/no-v-html --> <div - v-if="token" - class="form-group" - > - <label for="token">{{ $t('registration.token') }}</label> - <input - id="token" - v-model="token" - disabled="true" - class="input form-control" - type="text" - > - </div> - <div class="form-group"> - <button - :disabled="isPending" - type="submit" - class="btn button-default" - > - {{ $t('registration.register') }} - </button> - </div> + v-if="embeddedToS" + class="terms-of-service" + v-html="termsOfService" + /> + <!-- eslint-enable vue/no-v-html --> </div> - - <!-- eslint-disable vue/no-v-html --> <div - class="terms-of-service" - v-html="termsOfService" - /> - <!-- eslint-enable vue/no-v-html --> - </div> - <div - v-if="serverValidationErrors.length" - class="form-group" - > - <div class="alert error"> - <span - v-for="error in serverValidationErrors" - :key="error" - >{{ error }}</span> + v-if="serverValidationErrors.length" + class="form-group" + > + <div class="alert error"> + <span + v-for="error in serverValidationErrors" + :key="error" + >{{ error }}</span> + </div> </div> - </div> - </form> - </div> - <div v-else> - <p class="registration-notice"> - {{ signUpNotice.message }} - </p> + </form> + </div> + <div v-else> + <p class="registration-notice"> + {{ signUpNotice.message }} + </p> + </div> </div> </div> </template> @@ -325,7 +329,7 @@ .registration-form { display: flex; flex-direction: column; - margin: 0.6em; + margin: 1em; .container { display: flex; @@ -338,7 +342,7 @@ .terms-of-service { flex: 0 1 50%; - margin: 0.8em; + margin: 0.6em 0 0 0.8em; } .text-fields { @@ -417,6 +421,10 @@ @media all and (max-width: 800px) { .registration-form .container { flex-direction: column-reverse; + + .terms-of-service { + margin: 0; + } } } </style> diff --git a/src/components/staff_panel/staff_panel.vue b/src/components/staff_panel/staff_panel.vue @@ -1,7 +1,7 @@ <template> <div class="staff-panel"> <div class="panel panel-default base01-background"> - <div class="panel-heading timeline-heading base02-background"> + <div class="panel-heading timeline-heading base02-background -sticky"> <div class="title"> {{ $t("about.staff") }} </div> @@ -28,8 +28,7 @@ <style lang="scss"> .staff-group { - padding-left: 1em; - padding-top: 1em; + padding: 1em; .basic-user-card { padding-left: 0; diff --git a/src/components/terms_of_service_panel/terms_of_service_panel.js b/src/components/terms_of_service_panel/terms_of_service_panel.js @@ -2,6 +2,9 @@ const TermsOfServicePanel = { computed: { content () { return this.$store.state.instance.tos + }, + embedded () { + return this.$store.state.instance.embeddedToS } } } diff --git a/src/components/terms_of_service_panel/terms_of_service_panel.vue b/src/components/terms_of_service_panel/terms_of_service_panel.vue @@ -1,13 +1,21 @@ <template> - <div> + <div class="terms-of-service-panel"> <div class="panel panel-default"> + <div + v-if="!embedded" + class="panel-heading -sticky" + > + <div class="title"> + {{ $t("about.terms") }} + </div> + </div> <div class="panel-body"> <!-- eslint-disable vue/no-v-html --> <div class="tos-content" v-html="content" /> - <!-- eslint-enable vue/no-v-html --> + <!-- eslint-enable vue/no-v-html --> </div> </div> </div> @@ -19,4 +27,5 @@ .tos-content { margin: 1em; } + </style> diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue @@ -275,7 +275,10 @@ /> </div> </div> - <div v-if="!hideBio"> + <div + v-if="!hideBio" + class="user-bio" + > <div v-if="!mergedConfig.hideUserStats && switcher" class="user-counts" diff --git a/src/i18n/en.json b/src/i18n/en.json @@ -30,7 +30,8 @@ "media_nsfw_desc": "This instance forces media to be set sensitive in posts on the following instances:" } }, - "staff": "Staff" + "staff": "Staff", + "terms": "Terms of Service" }, "announcements": { "page_header": "Announcements", diff --git a/src/modules/instance.js b/src/modules/instance.js @@ -54,6 +54,7 @@ const defaultState = { defaultAvatar: '/images/avi.png', defaultBanner: '/images/banner.png', background: '/static/aurora_borealis.jpg', + embeddedToS: true, collapseMessageWithSubject: false, greentext: false, useAtIcon: false,