Skip to content

Commit

Permalink
fix: resolve conversations
Browse files Browse the repository at this point in the history
  • Loading branch information
DesignHhuang committed Nov 7, 2024
1 parent 9fa93f3 commit 2a631de
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 16 deletions.
2 changes: 1 addition & 1 deletion packages/effects/common-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
"@vben/constants": "workspace:*",
"@vben/icons": "workspace:*",
"@vben/locales": "workspace:*",
"@vben/types": "workspace:*",
"@vben/hooks": "workspace:*",

Check failure on line 30 in packages/effects/common-ui/package.json

View workflow job for this annotation

GitHub Actions / Lint (ubuntu-latest)

Expected object keys to be in ascending order. '@vben/hooks' should be before '@vben/locales'
"@vben/types": "workspace:*",
"@vueuse/core": "catalog:",
"@vueuse/integrations": "catalog:",
"qrcode": "catalog:",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ const currentSelect = ref('');
const currentList = ref(props.icons);
const refTrigger = ref<HTMLDivElement>();
watch(
() => props.icons,
(newIcons) => {
currentList.value = newIcons;
},
{ immediate: true },
);
const { getPaginationList, getTotal, setCurrentPage } = usePagination(
currentList,
props.pageSize,
Expand Down
27 changes: 25 additions & 2 deletions packages/effects/hooks/src/use-pagination.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,34 @@
import type { Ref } from 'vue';
import { computed, ref, unref } from 'vue';

/**
* Paginates an array of items
* @param list The array to paginate
* @param pageNo The current page number (1-based)
* @param pageSize Number of items per page
* @returns Paginated array slice
* @throws {Error} If pageNo or pageSize are invalid
*/
function pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {
if (pageNo < 1) throw new Error('Page number must be positive');
if (pageSize < 1) throw new Error('Page size must be positive');

const offset = (pageNo - 1) * Number(pageSize);
const ret =
offset + Number(pageSize) >= list.length
offset + pageSize >= list.length
? list.slice(offset)
: list.slice(offset, offset + Number(pageSize));
: list.slice(offset, offset + pageSize);
return ret;
}

export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
const currentPage = ref(1);
const pageSizeRef = ref(pageSize);

const totalPages = computed(() =>
Math.ceil(unref(list).length / unref(pageSizeRef)),
);

const getPaginationList = computed(() => {
return pagination(unref(list), unref(currentPage), unref(pageSizeRef));
});
Expand All @@ -23,11 +38,19 @@ export function usePagination<T = any>(list: Ref<T[]>, pageSize: number) {
});

function setCurrentPage(page: number) {
if (page < 1 || page > unref(totalPages)) {
throw new Error('Invalid page number');
}
currentPage.value = page;
}

function setPageSize(pageSize: number) {
if (pageSize < 1) {
throw new Error('Page size must be positive');
}
pageSizeRef.value = pageSize;
// Reset to first page to prevent invalid state
currentPage.value = 1;
}

return { setCurrentPage, getTotal, setPageSize, getPaginationList };
Expand Down
31 changes: 18 additions & 13 deletions playground/src/views/demos/features/icons/icon-picker.vue
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<script lang="ts" setup>
import { ref } from 'vue';
import { computed, ref } from 'vue';
import { IconPicker } from '@vben/common-ui';
import { listIcons } from '@vben/icons';
Expand Down Expand Up @@ -37,21 +37,26 @@ const props = withDefaults(defineProps<Props>(), {
const refIconPicker = ref();
const currentSelect = ref('');
function getIcons() {
if (props.prefix) {
return listIcons('', props.prefix);
} else {
const prefix = iconsData.prefix;
return iconsData.icons.map((icon) => `${prefix}:${icon}`);
const currentList = computed(() => {
try {
if (props.prefix) {
const icons = listIcons('', props.prefix);
if (icons.length === 0) {
console.warn(`No icons found for prefix: ${props.prefix}`);
}
return icons;
} else {
const prefix = iconsData.prefix;
return iconsData.icons.map((icon) => `${prefix}:${icon}`);
}
} catch (error) {
console.error('Failed to load icons:', error);
return [];
}
}
const currentList = ref(getIcons());
});
const triggerPopover = () => {
if (refIconPicker.value) {
refIconPicker.value.changeOpenState();
}
refIconPicker.value?.changeOpenState?.();
};
const handleChange = (icon: string) => {
Expand Down

0 comments on commit 2a631de

Please sign in to comment.