Read more/less for long channel text messages
This commit is contained in:
parent
e1fdb51429
commit
0c08503ac7
4 changed files with 94 additions and 11 deletions
|
|
@ -71,6 +71,22 @@
|
||||||
color: black !important;
|
color: black !important;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
.more-less-control__content {
|
||||||
|
transition: height 0.3s linear;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.more-less-control.collapsed .more-less-control__content {
|
||||||
|
max-height: 4 * 24 * $chat-text-size; // Four lines - font size is 16 and line height 1.5
|
||||||
|
}
|
||||||
|
.more-less-control__read-more, .more-less-control__read-less {
|
||||||
|
font-family: "Inter", sans-serif;
|
||||||
|
font-size: 16 * $chat-text-size;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 20.8 * $chat-text-size;
|
||||||
|
letter-spacing: 0.400 * $chat-text-size;
|
||||||
|
text-align: left;
|
||||||
|
color: #6360F0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.bubble {
|
.bubble {
|
||||||
|
|
|
||||||
61
src/components/MoreLessControl.vue
Normal file
61
src/components/MoreLessControl.vue
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
<template>
|
||||||
|
<div :class="{ 'more-less-control': true, 'collapsed': collapsed }">
|
||||||
|
<div ref="content" class="more-less-control__content">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
<div class="more-less-control__read-more clickable" v-if="useExpansion && collapsed" @click="readMore">{{
|
||||||
|
$t('global.show_more') }}</div>
|
||||||
|
<div class="more-less-control__read-less clickable" v-else-if="useExpansion" @click="readLess">{{
|
||||||
|
$t('global.show_less') }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "MoreLessControl",
|
||||||
|
props: {
|
||||||
|
event: {
|
||||||
|
type: Object,
|
||||||
|
default: function () {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (this.event.isChannelMessage) {
|
||||||
|
const el = this.$refs.content;
|
||||||
|
if (el) {
|
||||||
|
this.useExpansion = el.scrollHeight > el.clientHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
collapsed: (this.event.isChannelMessage ? true : false),
|
||||||
|
collapsedSize: 100,
|
||||||
|
useExpansion: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
readMore() {
|
||||||
|
const el = this.$refs.content;
|
||||||
|
this.collapsedSize = el.clientHeight;
|
||||||
|
this.collapsed = false;
|
||||||
|
el.style.height = el.clientHeight + "px";
|
||||||
|
el.style.maxHeight = "unset";
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
el.style.height = el.scrollHeight + "px";
|
||||||
|
});
|
||||||
|
},
|
||||||
|
readLess() {
|
||||||
|
const el = this.$refs.content;
|
||||||
|
el.style.height = this.collapsedSize + "px";
|
||||||
|
this.collapsed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
@import "@/assets/css/chat.scss";
|
||||||
|
</style>
|
||||||
|
|
@ -14,10 +14,12 @@
|
||||||
<v-icon :color="this.senderIsAdminOrModerator(this.event)?'white':''" size="small">block</v-icon>
|
<v-icon :color="this.senderIsAdminOrModerator(this.event)?'white':''" size="small">block</v-icon>
|
||||||
{{ redactedBySomeoneElse(event) ? $t('message.incoming_message_deleted_text') : $t('message.outgoing_message_deleted_text')}}
|
{{ redactedBySomeoneElse(event) ? $t('message.incoming_message_deleted_text') : $t('message.outgoing_message_deleted_text')}}
|
||||||
</i>
|
</i>
|
||||||
<span v-html="linkify($sanitize(messageText))" v-else/>
|
<more-less-control :event="originalEvent" v-else>
|
||||||
<span class="edit-marker" v-if="event.replacingEventId() && !event.isRedacted()">
|
<span v-html="linkify($sanitize(messageText))" />
|
||||||
{{ $t('message.edited') }}
|
<span class="edit-marker" v-if="event.replacingEventId() && !event.isRedacted()">
|
||||||
</span>
|
{{ $t('message.edited') }}
|
||||||
|
</span>
|
||||||
|
</more-less-control>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div>{{ JSON.stringify(event) }}</div> -->
|
<!-- <div>{{ JSON.stringify(event) }}</div> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -26,11 +28,12 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import MessageIncoming from "./MessageIncoming.vue";
|
import MessageIncoming from "./MessageIncoming.vue";
|
||||||
|
import MoreLessControl from '../MoreLessControl.vue';
|
||||||
import messageMixin from "./messageMixin";
|
import messageMixin from "./messageMixin";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: MessageIncoming,
|
extends: MessageIncoming,
|
||||||
components: { MessageIncoming },
|
components: { MessageIncoming, MoreLessControl },
|
||||||
mixins: [messageMixin],
|
mixins: [messageMixin],
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,12 @@
|
||||||
<v-icon size="small">block</v-icon>
|
<v-icon size="small">block</v-icon>
|
||||||
{{ redactedBySomeoneElse(event) ? $t('message.incoming_message_deleted_text') : $t('message.outgoing_message_deleted_text')}}
|
{{ redactedBySomeoneElse(event) ? $t('message.incoming_message_deleted_text') : $t('message.outgoing_message_deleted_text')}}
|
||||||
</i>
|
</i>
|
||||||
<span v-html="linkify($sanitize(messageText))" v-else/>
|
<more-less-control :event="originalEvent" v-else>
|
||||||
<span class="edit-marker" v-if="event.replacingEventId() && !event.isRedacted()">
|
<span v-html="linkify($sanitize(messageText))" />
|
||||||
{{ $t('message.edited') }}
|
<span class="edit-marker" v-if="event.replacingEventId() && !event.isRedacted()">
|
||||||
</span>
|
{{ $t('message.edited') }}
|
||||||
|
</span>
|
||||||
|
</more-less-control>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</message-outgoing>
|
</message-outgoing>
|
||||||
|
|
@ -25,10 +27,11 @@
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import MessageOutgoing from "./MessageOutgoing.vue";
|
import MessageOutgoing from "./MessageOutgoing.vue";
|
||||||
|
import MoreLessControl from '../MoreLessControl.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: MessageOutgoing,
|
extends: MessageOutgoing,
|
||||||
components: { MessageOutgoing },
|
components: { MessageOutgoing, MoreLessControl },
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue