Add mentions column (Deck)
This commit is contained in:
		
							parent
							
								
									32afe77a26
								
							
						
					
					
						commit
						afeb8058b1
					
				
					 4 changed files with 144 additions and 1 deletions
				
			
		| 
						 | 
					@ -6,6 +6,7 @@
 | 
				
			||||||
<x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/>
 | 
					<x-tl-column v-else-if="column.type == 'hybrid'" :column="column" :is-stacked="isStacked"/>
 | 
				
			||||||
<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/>
 | 
					<x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/>
 | 
				
			||||||
<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/>
 | 
					<x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/>
 | 
				
			||||||
 | 
					<x-mentions-column v-else-if="column.type == 'mentions'" :column="column" :is-stacked="isStacked"/>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script lang="ts">
 | 
					<script lang="ts">
 | 
				
			||||||
| 
						 | 
					@ -13,12 +14,14 @@ import Vue from 'vue';
 | 
				
			||||||
import XTlColumn from './deck.tl-column.vue';
 | 
					import XTlColumn from './deck.tl-column.vue';
 | 
				
			||||||
import XNotificationsColumn from './deck.notifications-column.vue';
 | 
					import XNotificationsColumn from './deck.notifications-column.vue';
 | 
				
			||||||
import XWidgetsColumn from './deck.widgets-column.vue';
 | 
					import XWidgetsColumn from './deck.widgets-column.vue';
 | 
				
			||||||
 | 
					import XMentionsColumn from './deck.mentions-column.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default Vue.extend({
 | 
					export default Vue.extend({
 | 
				
			||||||
	components: {
 | 
						components: {
 | 
				
			||||||
		XTlColumn,
 | 
							XTlColumn,
 | 
				
			||||||
		XNotificationsColumn,
 | 
							XNotificationsColumn,
 | 
				
			||||||
		XWidgetsColumn
 | 
							XWidgetsColumn,
 | 
				
			||||||
 | 
							XMentionsColumn
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	props: {
 | 
						props: {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					<x-column :name="name" :column="column" :is-stacked="isStacked">
 | 
				
			||||||
 | 
						<span slot="header">%fa:at%{{ name }}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<x-mentions/>
 | 
				
			||||||
 | 
					</x-column>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import XColumn from './deck.column.vue';
 | 
				
			||||||
 | 
					import XMentions from './deck.mentions.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							XColumn,
 | 
				
			||||||
 | 
							XMentions
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
							column: {
 | 
				
			||||||
 | 
								type: Object,
 | 
				
			||||||
 | 
								required: true
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							isStacked: {
 | 
				
			||||||
 | 
								type: Boolean,
 | 
				
			||||||
 | 
								required: true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						computed: {
 | 
				
			||||||
 | 
							name(): string {
 | 
				
			||||||
 | 
								if (this.column.name) return this.column.name;
 | 
				
			||||||
 | 
								return '%i18n:common.deck.mentions%';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
							
								
								
									
										93
									
								
								src/client/app/desktop/views/pages/deck/deck.mentions.vue
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/client/app/desktop/views/pages/deck/deck.mentions.vue
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,93 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
						<x-notes ref="timeline" :more="existMore ? more : null"/>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script lang="ts">
 | 
				
			||||||
 | 
					import Vue from 'vue';
 | 
				
			||||||
 | 
					import XNotes from './deck.notes.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const fetchLimit = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default Vue.extend({
 | 
				
			||||||
 | 
						components: {
 | 
				
			||||||
 | 
							XNotes
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						props: {
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						data() {
 | 
				
			||||||
 | 
							return {
 | 
				
			||||||
 | 
								fetching: true,
 | 
				
			||||||
 | 
								moreFetching: false,
 | 
				
			||||||
 | 
								existMore: false,
 | 
				
			||||||
 | 
								connection: null,
 | 
				
			||||||
 | 
								connectionId: null
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mounted() {
 | 
				
			||||||
 | 
							this.connection = (this as any).os.stream.getConnection();
 | 
				
			||||||
 | 
							this.connectionId = (this as any).os.stream.use();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							this.connection.on('mention', this.onNote);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							this.fetch();
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						beforeDestroy() {
 | 
				
			||||||
 | 
							this.connection.off('mention', this.onNote);
 | 
				
			||||||
 | 
							(this as any).os.stream.dispose(this.connectionId);
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						methods: {
 | 
				
			||||||
 | 
							fetch() {
 | 
				
			||||||
 | 
								this.fetching = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
 | 
				
			||||||
 | 
									(this as any).api('notes/mentions', {
 | 
				
			||||||
 | 
										limit: fetchLimit + 1,
 | 
				
			||||||
 | 
										includeMyRenotes: this.$store.state.settings.showMyRenotes,
 | 
				
			||||||
 | 
										includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
 | 
				
			||||||
 | 
										includeLocalRenotes: this.$store.state.settings.showLocalRenotes
 | 
				
			||||||
 | 
									}).then(notes => {
 | 
				
			||||||
 | 
										if (notes.length == fetchLimit + 1) {
 | 
				
			||||||
 | 
											notes.pop();
 | 
				
			||||||
 | 
											this.existMore = true;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										res(notes);
 | 
				
			||||||
 | 
										this.fetching = false;
 | 
				
			||||||
 | 
										this.$emit('loaded');
 | 
				
			||||||
 | 
									}, rej);
 | 
				
			||||||
 | 
								}));
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							more() {
 | 
				
			||||||
 | 
								this.moreFetching = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								const promise = (this as any).api('notes/mentions', {
 | 
				
			||||||
 | 
									limit: fetchLimit + 1,
 | 
				
			||||||
 | 
									untilId: (this.$refs.timeline as any).tail().id,
 | 
				
			||||||
 | 
									includeMyRenotes: this.$store.state.settings.showMyRenotes,
 | 
				
			||||||
 | 
									includeRenotedMyNotes: this.$store.state.settings.showRenotedMyNotes,
 | 
				
			||||||
 | 
									includeLocalRenotes: this.$store.state.settings.showLocalRenotes
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								promise.then(notes => {
 | 
				
			||||||
 | 
									if (notes.length == fetchLimit + 1) {
 | 
				
			||||||
 | 
										notes.pop();
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										this.existMore = false;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									notes.forEach(n => (this.$refs.timeline as any).append(n));
 | 
				
			||||||
 | 
									this.moreFetching = false;
 | 
				
			||||||
 | 
								});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								return promise;
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							onNote(note) {
 | 
				
			||||||
 | 
								// Prepend a note
 | 
				
			||||||
 | 
								(this.$refs.timeline as any).prepend(note);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -138,6 +138,15 @@ export default Vue.extend({
 | 
				
			||||||
							type: 'global'
 | 
												type: 'global'
 | 
				
			||||||
						});
 | 
											});
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
									}, {
 | 
				
			||||||
 | 
										icon: '%fa:at%',
 | 
				
			||||||
 | 
										text: '%i18n:common.deck.mentions%',
 | 
				
			||||||
 | 
										action: () => {
 | 
				
			||||||
 | 
											this.$store.dispatch('settings/addDeckColumn', {
 | 
				
			||||||
 | 
												id: uuid(),
 | 
				
			||||||
 | 
												type: 'mentions'
 | 
				
			||||||
 | 
											});
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}, {
 | 
									}, {
 | 
				
			||||||
					icon: '%fa:list%',
 | 
										icon: '%fa:list%',
 | 
				
			||||||
					text: '%i18n:common.deck.list%',
 | 
										text: '%i18n:common.deck.list%',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue