From 87cbff9bd828124459c8af80020a71832e6c49d9 Mon Sep 17 00:00:00 2001 From: busya Date: Wed, 17 Jun 2026 14:50:42 +0300 Subject: [PATCH] feat(frontend): add Pagination and ConfirmDialog shared components Pagination.svelte: page numbers with ellipsis, prev/next, page size selector, 'Showing X-Y of Z' summary. Replaces 9 custom pagination implementations. ConfirmDialog.svelte: styled modal replacing native window.confirm(). Backdrop click + Escape to cancel. Supports primary/destructive variants. Replaces 16 native confirm() calls. --- frontend/src/lib/ui/ConfirmDialog.svelte | 69 +++++++++++++ frontend/src/lib/ui/Pagination.svelte | 118 +++++++++++++++++++++++ frontend/src/lib/ui/index.ts | 2 + 3 files changed, 189 insertions(+) create mode 100644 frontend/src/lib/ui/ConfirmDialog.svelte create mode 100644 frontend/src/lib/ui/Pagination.svelte diff --git a/frontend/src/lib/ui/ConfirmDialog.svelte b/frontend/src/lib/ui/ConfirmDialog.svelte new file mode 100644 index 00000000..6a3f3f5f --- /dev/null +++ b/frontend/src/lib/ui/ConfirmDialog.svelte @@ -0,0 +1,69 @@ + + + + + + + + + +{#if show} + +
+
+

{title}

+ {#if message} +

{message}

+ {/if} +
+ + +
+
+
+{/if} + diff --git a/frontend/src/lib/ui/Pagination.svelte b/frontend/src/lib/ui/Pagination.svelte new file mode 100644 index 00000000..22ae67a5 --- /dev/null +++ b/frontend/src/lib/ui/Pagination.svelte @@ -0,0 +1,118 @@ + + + + + + + + + + +
+ +
+ {#if total > 0} + {($t.dashboard?.showing ?? "Showing {start}-{end} of {total}") + .replace("{start}", String(start)) + .replace("{end}", String(end)) + .replace("{total}", String(total))} + {:else} + {$t.common?.no_data || "No items"} + {/if} +
+ +
+ + {#if pageSizeOptions.length > 0} + + {/if} + + + {#if totalPages > 1} +
+ {#each pageNumbers as p} + {#if p === "..."} + + {:else} + + {/if} + {/each} +
+ {/if} + + + + +
+
+ diff --git a/frontend/src/lib/ui/index.ts b/frontend/src/lib/ui/index.ts index b9d184e6..8032d2b9 100644 --- a/frontend/src/lib/ui/index.ts +++ b/frontend/src/lib/ui/index.ts @@ -18,6 +18,8 @@ export { default as Icon } from './Icon.svelte'; export { default as HelpTooltip } from './HelpTooltip.svelte'; export { default as Badge } from './Badge.svelte'; export { default as Skeleton } from './Skeleton.svelte'; +export { default as Pagination } from './Pagination.svelte'; +export { default as ConfirmDialog } from './ConfirmDialog.svelte'; // [/SECTION: EXPORTS] // #endregion ui:Module \ No newline at end of file