diff --git a/src/components/admin/SmsCampaignPanel.jsx b/src/components/admin/SmsCampaignPanel.jsx
index 51e46b6..adc03b4 100644
--- a/src/components/admin/SmsCampaignPanel.jsx
+++ b/src/components/admin/SmsCampaignPanel.jsx
@@ -123,7 +123,10 @@ export const SmsCampaignPanel = () => {
const [autoRefresh, setAutoRefresh] = useState(true);
const [togglingCampaign, setTogglingCampaign] = useState(null);
const [showCityRules, setShowCityRules] = useState(false);
+ const [logPage, setLogPage] = useState(1);
+ const [manualPage, setManualPage] = useState(1);
const refreshTimer = useRef(null);
+ const PER_PAGE = 20;
const handleOpenGroup = useCallback((groupId) => {
if (groupId) navigate("/dashboard/group/" + groupId);
@@ -331,7 +334,7 @@ export const SmsCampaignPanel = () => {
)}
{/* Campaign cards */}
-
+
{CAMPAIGNS.map(c => {
const isActive = activeCampaign === c.key;
const s = allSettings[c.key];
@@ -348,7 +351,7 @@ export const SmsCampaignPanel = () => {
? "border-[var(--color-accent)] bg-[var(--color-accent-soft)]"
: "border-[var(--color-border)] bg-[var(--color-surface)] hover:bg-[var(--color-surface-strong)]"
}`}
- onClick={() => { setActiveCampaign(c.key); setFilter("all"); }}
+ onClick={() => { setActiveCampaign(c.key); setFilter("all"); setLogPage(1); setManualPage(1); }}
>
{/* Header: icon + toggle */}
@@ -618,7 +621,10 @@ export const SmsCampaignPanel = () => {
{manualGroups.length === 0 ? (
Нет групп в ручном управлении
) : (
- manualGroups.map((group) => (
+ (() => {
+ const start = (manualPage - 1) * PER_PAGE;
+ const pageGroups = manualGroups.slice(start, start + PER_PAGE);
+ return pageGroups.map((group) => (
handleOpenGroup(group.id)}
@@ -640,11 +646,31 @@ export const SmsCampaignPanel = () => {
{fmtElapsed(group.updated_at)}
- ))
+ ));
+ })()
)}
+
+ {/* ── Pagination: manual groups ─────────────────────────────────── */}
+ {manualGroups.length > PER_PAGE && (
+
+
+
+ Стр. {manualPage} / {Math.ceil(manualGroups.length / PER_PAGE)} · {manualGroups.length} записей
+
+
+
+ )}
>
) : (
<>
@@ -663,11 +689,11 @@ export const SmsCampaignPanel = () => {
{/* ── Filter + auto-refresh ─────────────────────────────────────────── */}
- setFilter("all")}>Все ({logs.length})
+ { setFilter("all"); setLogPage(1); }}>Все ({logs.length})
{Object.entries(STATUS_LABELS).map(([status, label]) => {
const count = stats[status] || 0;
if (count === 0) return null;
- return setFilter(status)}>{label} ({count});
+ return { setFilter(status); setLogPage(1); }}>{label} ({count});
})}
);
- })
+ });
+ })()
)}
+ {/* ── Pagination: logs ─────────────────────────────────────────────── */}
+ {logs.length > PER_PAGE && (
+
+
+
+ Стр. {logPage} / {Math.ceil(logs.length / PER_PAGE)} · {logs.length} записей
+
+
+
+ )}
+