mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-30 18:47:51 +00:00 
			
		
		
		
	 6df2d76c1e
			
		
	
	6df2d76c1e
	
	
	
		
			
			Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: iamsivin <iamsivin@gmail.com>
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <script setup>
 | |
| import { computed } from 'vue';
 | |
| import { useI18n } from 'vue-i18n';
 | |
| 
 | |
| import Button from 'dashboard/components-next/button/Button.vue';
 | |
| 
 | |
| const props = defineProps({
 | |
|   currentPage: {
 | |
|     type: Number,
 | |
|     required: true,
 | |
|   },
 | |
|   totalItems: {
 | |
|     type: Number,
 | |
|     required: true,
 | |
|   },
 | |
|   itemsPerPage: {
 | |
|     type: Number,
 | |
|     default: 16,
 | |
|   },
 | |
| });
 | |
| const emit = defineEmits(['update:currentPage']);
 | |
| const { t } = useI18n();
 | |
| 
 | |
| const totalPages = computed(() =>
 | |
|   Math.ceil(props.totalItems / props.itemsPerPage)
 | |
| );
 | |
| const startItem = computed(
 | |
|   () => (props.currentPage - 1) * props.itemsPerPage + 1
 | |
| );
 | |
| const endItem = computed(() =>
 | |
|   Math.min(startItem.value + props.itemsPerPage - 1, props.totalItems)
 | |
| );
 | |
| const isFirstPage = computed(() => props.currentPage === 1);
 | |
| const isLastPage = computed(() => props.currentPage === totalPages.value);
 | |
| const changePage = newPage => {
 | |
|   if (newPage >= 1 && newPage <= totalPages.value) {
 | |
|     emit('update:currentPage', newPage);
 | |
|   }
 | |
| };
 | |
| 
 | |
| const currentPageInformation = computed(() => {
 | |
|   return t('PAGINATION_FOOTER.SHOWING', {
 | |
|     startItem: startItem.value,
 | |
|     endItem: endItem.value,
 | |
|     totalItems: props.totalItems,
 | |
|   });
 | |
| });
 | |
| 
 | |
| const pageInfo = computed(() => {
 | |
|   return t('PAGINATION_FOOTER.CURRENT_PAGE_INFO', {
 | |
|     currentPage: '',
 | |
|     totalPages: totalPages.value,
 | |
|   });
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <template>
 | |
|   <div
 | |
|     class="flex justify-between h-12 w-full max-w-[957px] outline outline-n-container outline-1 mx-auto bg-n-solid-2 rounded-xl py-2 ltr:pl-4 rtl:pr-4 ltr:pr-3 rtl:pl-3 items-center"
 | |
|   >
 | |
|     <div class="flex items-center gap-3">
 | |
|       <span class="min-w-0 text-sm font-normal line-clamp-1 text-n-slate-11">
 | |
|         {{ currentPageInformation }}
 | |
|       </span>
 | |
|     </div>
 | |
|     <div class="flex items-center gap-2">
 | |
|       <Button
 | |
|         icon="chevrons-lucide-left"
 | |
|         icon-lib="lucide"
 | |
|         variant="ghost"
 | |
|         size="sm"
 | |
|         :disabled="isFirstPage"
 | |
|         @click="changePage(1)"
 | |
|       />
 | |
|       <Button
 | |
|         icon="chevron-lucide-left"
 | |
|         icon-lib="lucide"
 | |
|         variant="ghost"
 | |
|         size="sm"
 | |
|         :disabled="isFirstPage"
 | |
|         @click="changePage(currentPage - 1)"
 | |
|       />
 | |
|       <div class="inline-flex items-center gap-2 text-sm text-n-slate-11">
 | |
|         <span class="px-3 tabular-nums py-0.5 bg-n-alpha-black2 rounded-md">
 | |
|           {{ currentPage }}
 | |
|         </span>
 | |
|         <span>{{ pageInfo }}</span>
 | |
|       </div>
 | |
|       <Button
 | |
|         icon="chevron-lucide-right"
 | |
|         icon-lib="lucide"
 | |
|         variant="ghost"
 | |
|         size="sm"
 | |
|         :disabled="isLastPage"
 | |
|         @click="changePage(currentPage + 1)"
 | |
|       />
 | |
|       <Button
 | |
|         icon="chevrons-lucide-right"
 | |
|         icon-lib="lucide"
 | |
|         variant="ghost"
 | |
|         size="sm"
 | |
|         :disabled="isLastPage"
 | |
|         @click="changePage(totalPages)"
 | |
|       />
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 |