forked from AkkomaGang/akkoma-fe
Merge branch 'iss-149/profile-fields-display' into 'develop'
Display profile fields See merge request pleroma/pleroma-fe!1004
This commit is contained in:
commit
95f5c7fff6
4 changed files with 101 additions and 0 deletions
|
@ -124,6 +124,14 @@ const UserProfile = {
|
||||||
onTabSwitch (tab) {
|
onTabSwitch (tab) {
|
||||||
this.tab = tab
|
this.tab = tab
|
||||||
this.$router.replace({ query: { tab } })
|
this.$router.replace({ query: { tab } })
|
||||||
|
},
|
||||||
|
linkClicked ({ target }) {
|
||||||
|
if (target.tagName === 'SPAN') {
|
||||||
|
target = target.parentNode
|
||||||
|
}
|
||||||
|
if (target.tagName === 'A') {
|
||||||
|
window.open(target.href, '_blank')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
|
@ -11,6 +11,31 @@
|
||||||
:allow-zooming-avatar="true"
|
:allow-zooming-avatar="true"
|
||||||
rounded="top"
|
rounded="top"
|
||||||
/>
|
/>
|
||||||
|
<div
|
||||||
|
v-if="user.fields_html && user.fields_html.length > 0"
|
||||||
|
class="user-profile-fields"
|
||||||
|
>
|
||||||
|
<dl
|
||||||
|
v-for="(field, index) in user.fields_html"
|
||||||
|
:key="index"
|
||||||
|
class="user-profile-field"
|
||||||
|
>
|
||||||
|
<!-- eslint-disable vue/no-v-html -->
|
||||||
|
<dt
|
||||||
|
:title="user.fields_text[index].name"
|
||||||
|
class="user-profile-field-name"
|
||||||
|
@click.prevent="linkClicked"
|
||||||
|
v-html="field.name"
|
||||||
|
/>
|
||||||
|
<dd
|
||||||
|
:title="user.fields_text[index].value"
|
||||||
|
class="user-profile-field-value"
|
||||||
|
@click.prevent="linkClicked"
|
||||||
|
v-html="field.value"
|
||||||
|
/>
|
||||||
|
<!-- eslint-enable vue/no-v-html -->
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
<tab-switcher
|
<tab-switcher
|
||||||
:active-tab="tab"
|
:active-tab="tab"
|
||||||
:render-only-focused="true"
|
:render-only-focused="true"
|
||||||
|
@ -108,11 +133,60 @@
|
||||||
<script src="./user_profile.js"></script>
|
<script src="./user_profile.js"></script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
@import '../../_variables.scss';
|
||||||
|
|
||||||
.user-profile {
|
.user-profile {
|
||||||
flex: 2;
|
flex: 2;
|
||||||
flex-basis: 500px;
|
flex-basis: 500px;
|
||||||
|
|
||||||
|
.user-profile-fields {
|
||||||
|
margin: 0 0.5em;
|
||||||
|
img {
|
||||||
|
object-fit: contain;
|
||||||
|
vertical-align: middle;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 400px;
|
||||||
|
|
||||||
|
&.emoji {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-profile-field {
|
||||||
|
display: flex;
|
||||||
|
margin: 0.25em auto;
|
||||||
|
max-width: 32em;
|
||||||
|
border: 1px solid var(--border, $fallback--border);
|
||||||
|
border-radius: $fallback--inputRadius;
|
||||||
|
border-radius: var(--inputRadius, $fallback--inputRadius);
|
||||||
|
|
||||||
|
.user-profile-field-name {
|
||||||
|
flex: 0 1 30%;
|
||||||
|
font-weight: 500;
|
||||||
|
text-align: right;
|
||||||
|
color: var(--lightText);
|
||||||
|
min-width: 120px;
|
||||||
|
border-right: 1px solid var(--border, $fallback--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-profile-field-value {
|
||||||
|
flex: 1 1 70%;
|
||||||
|
color: var(--text);
|
||||||
|
margin: 0 0 0 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-profile-field-name, .user-profile-field-value {
|
||||||
|
line-height: 18px;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 0.5em 1.5em;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.userlist-placeholder {
|
.userlist-placeholder {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
|
@ -56,6 +56,12 @@ export const parseUser = (data) => {
|
||||||
value: addEmojis(field.value, data.emojis)
|
value: addEmojis(field.value, data.emojis)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
output.fields_text = data.fields.map(field => {
|
||||||
|
return {
|
||||||
|
name: unescape(field.name.replace(/<[^>]*>/g, '')),
|
||||||
|
value: unescape(field.value.replace(/<[^>]*>/g, ''))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Utilize avatar_static for gif avatars?
|
// Utilize avatar_static for gif avatars?
|
||||||
output.profile_image_url = data.avatar
|
output.profile_image_url = data.avatar
|
||||||
|
|
|
@ -290,6 +290,19 @@ describe('API Entities normalizer', () => {
|
||||||
expect(field).to.have.property('value').that.contains('<img')
|
expect(field).to.have.property('value').that.contains('<img')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('removes html tags from user profile fields', () => {
|
||||||
|
const user = makeMockUserMasto({ emojis: makeMockEmojiMasto(), fields: [{ name: 'user', value: '<a rel="me" href="https://example.com/@user">@user</a>' }] })
|
||||||
|
|
||||||
|
const parsedUser = parseUser(user)
|
||||||
|
|
||||||
|
expect(parsedUser).to.have.property('fields_text').to.be.an('array')
|
||||||
|
|
||||||
|
const field = parsedUser.fields_text[0]
|
||||||
|
|
||||||
|
expect(field).to.have.property('name').that.equal('user')
|
||||||
|
expect(field).to.have.property('value').that.equal('@user')
|
||||||
|
})
|
||||||
|
|
||||||
it('adds hide_follows and hide_followers user settings', () => {
|
it('adds hide_follows and hide_followers user settings', () => {
|
||||||
const user = makeMockUserMasto({ pleroma: { hide_followers: true, hide_follows: false, hide_followers_count: false, hide_follows_count: true } })
|
const user = makeMockUserMasto({ pleroma: { hide_followers: true, hide_follows: false, hide_followers_count: false, hide_follows_count: true } })
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue