pleroma-fe/src/components/user_card/user_card.vue

370 lines
11 KiB
Vue
Raw Normal View History

2016-11-30 22:27:19 +01:00
<template>
2019-07-11 02:59:10 +02:00
<div
class="user-card"
:class="classes"
>
2019-09-25 19:23:55 +02:00
<div
:class="{ 'hide-bio': hideBio }"
:style="style"
class="background-image"
/>
2022-06-16 16:06:16 +02:00
<div :class="onClose ? '' : panel-heading -flexible-height">
2019-07-11 02:59:10 +02:00
<div class="user-info">
<div class="container">
2019-07-22 22:58:20 +02:00
<a
v-if="avatarAction === 'zoom'"
class="user-info-avatar -link"
@click="zoomAvatar"
2019-07-22 22:58:20 +02:00
>
<UserAvatar
:better-shadow="betterShadow"
:user="user"
/>
<div class="user-info-avatar -link -overlay">
2020-10-20 23:31:16 +02:00
<FAIcon
class="fa-scale-110 fa-old-padding"
2020-10-20 23:31:16 +02:00
icon="search-plus"
/>
2019-07-25 21:49:02 +02:00
</div>
2019-07-22 22:58:20 +02:00
</a>
<UserAvatar
v-else-if="typeof avatarAction === 'function'"
class="user-info-avatar"
:better-shadow="betterShadow"
:user="user"
2022-07-31 11:35:48 +02:00
@click="avatarAction"
/>
2019-07-22 22:58:20 +02:00
<router-link
v-else
:to="userProfileLink(user)"
>
2019-07-11 02:59:10 +02:00
<UserAvatar
:better-shadow="betterShadow"
:user="user"
/>
</router-link>
<div class="user-summary">
<div class="top-line">
2022-06-16 16:06:16 +02:00
<router-link
:to="userProfileLink(user)"
2019-07-11 02:59:10 +02:00
class="user-name"
2022-06-16 16:06:16 +02:00
>
<RichContent
:title="user.name"
:html="user.name"
:emoji="user.emoji"
/>
</router-link>
2021-04-07 21:42:34 +02:00
<button
2021-06-17 21:29:58 +02:00
v-if="!isOtherUser && user.is_local"
class="button-unstyled edit-profile-button"
@click.stop="openProfileTab"
>
<FAIcon
fixed-width
class="icon"
icon="edit"
:title="$t('user_card.edit_profile')"
/>
</button>
2021-08-16 00:41:52 +02:00
<a
2019-07-11 02:59:10 +02:00
v-if="isOtherUser && !user.is_local"
:href="user.statusnet_profile_url"
target="_blank"
2021-04-07 21:42:34 +02:00
class="button-unstyled external-link-button"
2019-07-11 02:59:10 +02:00
>
2020-10-20 23:31:16 +02:00
<FAIcon
class="icon"
icon="external-link-alt"
/>
2022-03-16 21:02:44 +01:00
</a>
2019-10-11 15:52:26 +02:00
<AccountActions
v-if="isOtherUser && loggedIn"
:user="user"
2020-04-21 22:27:51 +02:00
:relationship="relationship"
2019-10-11 15:52:26 +02:00
/>
2022-06-16 16:06:16 +02:00
<router-link
v-if="onClose"
:to="userProfileLink(user)"
class="button-unstyled external-link-button"
@click="onClose"
>
<FAIcon
class="icon"
icon="expand-alt"
/>
</router-link>
<button
v-if="onClose"
class="button-unstyled external-link-button"
@click="onClose"
>
<FAIcon
class="icon"
icon="times"
/>
</button>
2019-07-11 02:59:10 +02:00
</div>
<div class="bottom-line">
<user-link
2019-07-11 02:59:10 +02:00
class="user-screen-name"
:user="user"
/>
<template v-if="!hideBio">
<span
v-if="user.deactivated"
class="alert user-role"
>
{{ $t('user_card.deactivated') }}
</span>
<span
v-if="!!visibleRole"
class="alert user-role"
>
{{ $t(`general.role.${visibleRole}`) }}
</span>
<span
v-if="user.bot"
class="alert user-role"
>
2021-02-12 10:01:16 +01:00
{{ $t('user_card.bot') }}
</span>
</template>
<span v-if="user.locked">
2020-10-20 23:31:16 +02:00
<FAIcon
class="lock-icon"
icon="lock"
size="sm"
/>
</span>
2019-07-11 02:59:10 +02:00
<span
v-if="!mergedConfig.hideUserStats && !hideBio"
2019-07-11 02:59:10 +02:00
class="dailyAvg"
>{{ dailyAvg }} {{ $t('user_card.per_day') }}</span>
</div>
2019-05-16 04:01:04 +02:00
</div>
2018-06-19 16:14:33 +02:00
</div>
2019-07-11 02:59:10 +02:00
<div class="user-meta">
<div
2020-04-21 22:27:51 +02:00
v-if="relationship.followed_by && loggedIn && isOtherUser"
2019-07-11 02:59:10 +02:00
class="following"
>
{{ $t('user_card.follows_you') }}
</div>
<div
v-if="isOtherUser && (loggedIn || !switcher)"
class="highlighter"
>
<!-- id's need to be unique, otherwise vue confuses which user-card checkbox belongs to -->
<input
v-if="userHighlightType !== 'disabled'"
:id="'userHighlightColorTx'+user.id"
v-model="userHighlightColor"
class="userHighlightText"
type="text"
>
<input
v-if="userHighlightType !== 'disabled'"
:id="'userHighlightColor'+user.id"
v-model="userHighlightColor"
class="userHighlightCl"
type="color"
>
2022-03-23 15:15:05 +01:00
{{ ' ' }}
<Select
:id="'userHighlightSel'+user.id"
v-model="userHighlightType"
class="userHighlightSel"
2019-07-11 02:59:10 +02:00
>
2021-05-31 13:02:36 +02:00
<option value="disabled">
{{ $t('user_card.highlight.disabled') }}
</option>
<option value="solid">
{{ $t('user_card.highlight.solid') }}
</option>
<option value="striped">
{{ $t('user_card.highlight.striped') }}
</option>
<option value="side">
{{ $t('user_card.highlight.side') }}
</option>
</Select>
2019-07-11 02:59:10 +02:00
</div>
2018-06-18 10:36:58 +02:00
</div>
2019-07-11 02:59:10 +02:00
<div
v-if="loggedIn && isOtherUser"
class="user-interactions"
>
2019-10-08 09:21:48 +02:00
<div class="btn-group">
<FollowButton
:relationship="relationship"
:user="user"
/>
2020-04-21 22:27:51 +02:00
<template v-if="relationship.following">
2019-10-08 09:21:48 +02:00
<ProgressButton
2020-04-21 22:27:51 +02:00
v-if="!relationship.subscribing"
class="btn button-default"
2019-10-08 09:21:48 +02:00
:click="subscribeUser"
:title="$t('user_card.subscribe')"
>
<FAIcon icon="bell" />
2019-10-08 09:21:48 +02:00
</ProgressButton>
<ProgressButton
v-else
class="btn button-default toggled"
2019-10-08 09:21:48 +02:00
:click="unsubscribeUser"
:title="$t('user_card.unsubscribe')"
>
<FALayers>
2020-10-20 23:31:16 +02:00
<FAIcon
icon="rss"
transform="left-5 shrink-6 up-3 rotate-20"
flip="horizontal"
/>
<FAIcon
icon="rss"
transform="right-5 shrink-6 up-3 rotate-20"
/>
<FAIcon icon="bell" />
</FALayers>
2019-10-08 09:21:48 +02:00
</ProgressButton>
</template>
2019-09-17 21:59:17 +02:00
</div>
2019-07-11 02:59:10 +02:00
<div>
<button
2020-04-21 22:27:51 +02:00
v-if="relationship.muting"
class="btn button-default btn-block toggled"
:disabled="user.deactivated"
2019-07-11 02:59:10 +02:00
@click="unmuteUser"
>
{{ $t('user_card.muted') }}
</button>
<button
v-else
class="btn button-default btn-block"
:disabled="user.deactivated"
2019-07-11 02:59:10 +02:00
@click="muteUser"
>
{{ $t('user_card.mute') }}
</button>
</div>
<div>
<button
class="btn button-default btn-block"
:disabled="user.deactivated"
@click="mentionUser"
>
{{ $t('user_card.mention') }}
</button>
</div>
2019-07-11 02:59:10 +02:00
<ModerationTools
v-if="showModerationMenu"
2019-07-11 02:59:10 +02:00
:user="user"
/>
</div>
<div
v-if="!loggedIn && user.is_local"
class="user-interactions"
>
<RemoteFollow :user="user" />
</div>
2022-08-20 19:02:27 +02:00
<UserNote
v-if="loggedIn && isOtherUser && (hasNote || (hasNoteEditor && supportsNote))"
2022-08-20 19:02:27 +02:00
:user="user"
:relationship="relationship"
:editable="hasNoteEditor"
2022-08-20 19:02:27 +02:00
/>
2019-04-16 16:13:26 +02:00
</div>
</div>
2019-07-11 02:59:10 +02:00
<div
v-if="!hideBio"
class="panel-body"
>
<div
v-if="!mergedConfig.hideUserStats && switcher"
2019-07-11 02:59:10 +02:00
class="user-counts"
>
<div
class="user-count"
@click.prevent="setProfileView('statuses')"
>
<h5>{{ $t('user_card.statuses') }}</h5>
<span>{{ user.statuses_count }} <br></span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('friends')"
>
<h5>{{ $t('user_card.followees') }}</h5>
2019-11-12 19:31:30 +01:00
<span>{{ hideFollowsCount ? $t('user_card.hidden') : user.friends_count }}</span>
2019-07-11 02:59:10 +02:00
</div>
<div
class="user-count"
@click.prevent="setProfileView('followers')"
>
<h5>{{ $t('user_card.followers') }}</h5>
2019-11-12 19:31:30 +01:00
<span>{{ hideFollowersCount ? $t('user_card.hidden') : user.followers_count }}</span>
2019-07-11 02:59:10 +02:00
</div>
2018-11-25 15:24:58 +01:00
</div>
<RichContent
v-if="!hideBio"
2019-07-11 02:59:10 +02:00
class="user-card-bio"
:html="user.description_html"
:emoji="user.emoji"
:handle-links="true"
2019-07-11 02:59:10 +02:00
/>
2018-11-25 15:24:58 +01:00
</div>
2022-04-06 20:54:58 +02:00
<teleport to="#modal">
2022-03-17 05:06:26 +01:00
<confirm-modal
v-if="showingConfirmMute"
:title="$t('user_card.mute_confirm_title')"
:confirm-text="$t('user_card.mute_confirm_accept_button')"
:cancel-text="$t('user_card.mute_confirm_cancel_button')"
@accepted="doMuteUser"
@cancelled="hideConfirmMute"
2022-02-09 22:21:19 +01:00
>
<i18n-t
keypath="user_card.mute_confirm"
2022-04-30 17:08:19 +02:00
tag="div"
2022-03-17 05:06:26 +01:00
>
<template #user>
<span
v-text="user.screen_name_ui"
/>
</template>
</i18n-t>
2022-04-30 17:08:19 +02:00
<div
class="mute-expiry"
>
<label>
{{ $t('user_card.mute_duration_prompt') }}
</label>
<input
v-model="muteExpiryAmount"
type="number"
class="expiry-amount hide-number-spinner"
:min="0"
>
<Select
v-model="muteExpiryUnit"
unstyled="true"
class="expiry-unit"
>
<option
v-for="unit in muteExpiryUnits"
:key="unit"
:value="unit"
>
{{ $t(`time.${unit}_short`, ['']) }}
</option>
</Select>
</div>
2022-03-17 05:06:26 +01:00
</confirm-modal>
2022-04-06 20:54:58 +02:00
</teleport>
2018-11-25 15:24:58 +01:00
</div>
2016-11-30 22:27:19 +01:00
</template>
2019-03-05 20:01:49 +01:00
<script src="./user_card.js"></script>
<style lang="scss" src="./user_card.scss" />