mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-11-01 00:56:05 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="sci--navigation--notificaitons-flyout">
 | |
|     <div class="sci--navigation--notificaitons-flyout-title">
 | |
|       {{ i18n.t('nav.notifications.title') }}
 | |
|       <i class="sn-icon sn-icon-close" @click="$emit('close')"></i>
 | |
|     </div>
 | |
|     <hr>
 | |
|     <perfect-scrollbar ref="scrollContainer" class="sci--navigation--notificaitons-flyout-notifications">
 | |
|       <div class="sci-navigation--notificaitons-flyout-subtitle" v-if="todayNotifications.length" >
 | |
|         {{ i18n.t('nav.notifications.today') }}
 | |
|       </div>
 | |
|       <NotificationItem v-for="notification in todayNotifications" :key="notification.type_of + '-' + notification.id" :notification="notification" />
 | |
|       <div class="sci-navigation--notificaitons-flyout-subtitle" v-if="olderNotifications.length" >
 | |
|         {{ i18n.t('nav.notifications.older') }}
 | |
|       </div>
 | |
|       <NotificationItem v-for="notification in olderNotifications" :key="notification.type_of + '-' + notification.id" :notification="notification" />
 | |
|       <div class="next-page-loader">
 | |
|         <img src="/images/medium/loading.svg" v-if="loadingPage"/>
 | |
|       </div>
 | |
|     </perfect-scrollbar>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| 
 | |
| import NotificationItem from './notification_item.vue'
 | |
| 
 | |
| export default {
 | |
|   name: 'NotificationsFlyout',
 | |
|   components: {
 | |
|     NotificationItem
 | |
|   },
 | |
|   props: {
 | |
|     notificationsUrl: String,
 | |
|     unseenNotificationsCount: Number
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       notifications: [],
 | |
|       nextPage: 1,
 | |
|       scrollBar: null,
 | |
|       loadingPage: false
 | |
|     }
 | |
|   },
 | |
|   created() {
 | |
|     this.loadNotifications();
 | |
|   },
 | |
|   mounted() {
 | |
|     let container = this.$refs.scrollContainer.$el
 | |
|     container.addEventListener('ps-scroll-y', (e) => {
 | |
|       if (e.target.scrollTop + e.target.clientHeight >= e.target.scrollHeight - 20) {
 | |
|         this.loadNotifications();
 | |
|       }
 | |
|     })
 | |
|   },
 | |
|   computed: {
 | |
|     filteredNotifications() {
 | |
|       this.loadNotifications();
 | |
|     },
 | |
|     todayNotifications() {
 | |
|       return this.notifications.filter(n => n.today);
 | |
|     },
 | |
|     olderNotifications() {
 | |
|       return this.notifications.filter(n => !n.today);
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     loadNotifications() {
 | |
|       if (this.nextPage == null || this.loadingPage) return;
 | |
| 
 | |
|       this.loadingPage = true;
 | |
|       $.getJSON(this.notificationsUrl, { page: this.nextPage }, (result) => {
 | |
|         this.notifications = this.notifications.concat(result.notifications);
 | |
|         this.nextPage = result.next_page;
 | |
|         this.loadingPage = false;
 | |
|         this.$emit('update:unseenNotificationsCount');
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </script>
 |