From a5817110c9fee677629baf44d1f68ff365b72be9 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Jul 2026 12:33:38 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20SMS=20campaign=20=E2=80=94=20compact=20c?= =?UTF-8?q?ards=20+=20pagination=2020/page=20for=20logs=20&=20manual=20gro?= =?UTF-8?q?ups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/admin/SmsCampaignPanel.jsx | 66 ++++++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) 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} записей + + +
+ )} +