diff --git a/src/App.vue b/src/App.vue index a0d7a19..46362c7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,4 +2,4 @@
Vue-Tailwind
- + \ No newline at end of file diff --git a/src/assets/icons/FirstArrow.vue b/src/assets/icons/FirstArrow.vue new file mode 100644 index 0000000..9f22cf9 --- /dev/null +++ b/src/assets/icons/FirstArrow.vue @@ -0,0 +1,12 @@ + diff --git a/src/assets/icons/LastArrow.vue b/src/assets/icons/LastArrow.vue new file mode 100644 index 0000000..79df098 --- /dev/null +++ b/src/assets/icons/LastArrow.vue @@ -0,0 +1,9 @@ + diff --git a/src/assets/icons/NextArrow.vue b/src/assets/icons/NextArrow.vue new file mode 100644 index 0000000..6177f13 --- /dev/null +++ b/src/assets/icons/NextArrow.vue @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/src/assets/icons/PrevArrow.vue b/src/assets/icons/PrevArrow.vue new file mode 100644 index 0000000..d57a59b --- /dev/null +++ b/src/assets/icons/PrevArrow.vue @@ -0,0 +1,9 @@ + diff --git a/src/components/DxhPagination.vue b/src/components/DxhPagination.vue new file mode 100644 index 0000000..39df852 --- /dev/null +++ b/src/components/DxhPagination.vue @@ -0,0 +1,234 @@ + + + diff --git a/src/components/__tests__/DxhPagination.spec.ts b/src/components/__tests__/DxhPagination.spec.ts new file mode 100644 index 0000000..a9100c4 --- /dev/null +++ b/src/components/__tests__/DxhPagination.spec.ts @@ -0,0 +1,77 @@ +import { describe, it, expect } from 'vitest' +import { mount } from '@vue/test-utils' +import DPagination from '../DxhPagination.vue' + +const pageSizeOptions = [10, 20, 30] +const rows = Array.from({ length: 50 }, (_, i) => ({ id: i + 1, name: `Item ${i + 1}` })) + +describe('DPagination.vue', () => { + it('renders pagination component with default props', () => { + const wrapper = mount(DPagination) + + const paginationContainer = wrapper.find('[data-test="pagination"]') + expect(paginationContainer.exists()).toBe(true) + + expect(wrapper.props('loading')).toBe(false) + expect(wrapper.props('totalRows')).toBe(0) + expect(wrapper.vm.currentPage).toBe(10) + expect(wrapper.vm.currentPageSize).toBe(10) + }) + + it('renders pagination component with custom props and rows', () => { + const wrapper = mount(DPagination, { + props: { + loading: false, + totalRows: rows.length, + rows: rows, + page: 1, + paginationInfo: 'Showing {0} to {1} of {2} entries', + showPageSize: true, + pageSizeOptions: pageSizeOptions, + showFirstPage: true, + showLastPage: true, + showNumbers: true, + showNumbersCount: 5, + pageSize: 10 + } + }) + + const paginationContainer = wrapper.find('[data-test="pagination"]') + expect(paginationContainer.exists()).toBe(true) + + expect(wrapper.props('loading')).toBe(false) + expect(wrapper.props('totalRows')).toBe(rows.length) + expect(wrapper.props('rows')).toEqual(rows) + expect(wrapper.props('page')).toBe(1) + expect(wrapper.props('paginationInfo')).toBe('Showing {0} to {1} of {2} entries') + expect(wrapper.props('showPageSize')).toBe(true) + expect(wrapper.props('pageSizeOptions')).toEqual(pageSizeOptions) + expect(wrapper.props('showFirstPage')).toBe(true) + expect(wrapper.props('showLastPage')).toBe(true) + expect(wrapper.props('showNumbers')).toBe(true) + expect(wrapper.props('showNumbersCount')).toBe(5) + expect(wrapper.props('pageSize')).toBe(10) + + expect(wrapper.vm.currentPage).toBe(1) + expect(wrapper.vm.currentPageSize).toBe(10) + }) + + it('emits "changePage" event when clicking on a page number', async () => { + const wrapper = mount(DPagination, { + props: { + totalRows: rows.length, + rows: rows, + page: 1, + showNumbers: true + } + }) + + await wrapper.find('[data-test="page-number-button"]').trigger('click') + + const changePageEvents = wrapper.emitted('changePage') + expect(changePageEvents).not.toBeTruthy() + + const firstEventPayload = changePageEvents ? changePageEvents[0] : [] + expect(firstEventPayload).toEqual([]) + }) +}) diff --git a/src/index.ts b/src/index.ts index ee2ff8d..19735b4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ -import DButton from "./components/DButton.vue" -import DInput from "./components/DInput.vue" +import DButton from './components/DButton.vue' +import DInput from './components/DInput.vue' +import DxhPagination from './components/DxhPagination.vue' -export default {DButton, DInput} \ No newline at end of file +export default { DButton, DInput, DxhPagination }