feat(admin): always-on dashboard widget + default retro days = 0

- Dashboard widget is now registered unconditionally. Header + content
  adapt: shows '⚠️ ошибки доставки' only when failed > 0, otherwise
  plain title with queue state (pending / sent-24h / failed).
  Pilot feedback: the conditional widget felt like the plugin was
  missing — users expect a persistent status readout.
- Retro default window changed from 7 days to 0 (no limit). Most
  pilot uses were 'dump everything since install', so 0 is the more
  useful default. User can still narrow to N days in the form.
- Spec §10 + §14 updated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-04-18 00:12:45 +05:00
parent 2de8f0be57
commit dbdfc9afa9
6 changed files with 103 additions and 43 deletions
@@ -257,7 +257,7 @@ apply_filters('cf7stg_classifier_thresholds', ['client' => 3, 'spam' => -2]);
**UI:** на странице настроек — блок «Ретроспективная выгрузка из Flamingo»:
- `count` (int, default 10, max 50)
- `days` (int, default 7; 0 = без ограничения)
- `days` (int, default 0; 0 = без ограничения)
- `allow_repeat` (checkbox)
- кнопка «Добавить в очередь»
@@ -324,22 +324,30 @@ $schedules['cf7stg_every_minute'] = ['interval' => 60, 'display' => 'Раз в
**Ограничения shared-хостинга:** WP-Cron срабатывает при HTTP-запросах к сайту. При малом трафике события могут опаздывать. В UI настроек — короткая подсказка: «Для точности можно настроить внешний cron на `wp-cron.php`».
## 14. Dashboard-виджет (условный)
## 14. Dashboard-виджет
`add_action('wp_dashboard_setup', ...)` → при `Queue::count_failed() > 0` регистрируется виджет `cf7stg_dashboard_errors`:
`add_action('wp_dashboard_setup', ...)` регистрирует виджет `cf7stg_dashboard_status` **всегда** (после пилота: пользователь ожидает увидеть быстрый статус, а не ориентироваться только на появление «тревожной» лампы).
Заголовок зависит от состояния:
- `failed > 0``⚠️ CF7 Spam → Telegram: ошибки доставки`
- иначе → `CF7 Spam → Telegram`
Содержимое:
```
⚠️ CF7 Spam → Telegram: ошибки доставки
Есть N неотправленных сообщений (TG-API отвечает ошибкой):
[если !is_configured: ⚙️ Плагин не настроен — укажите Bot Token и Chat ID в настройках.]
⏳ В очереди: N · ✅ За сутки: M · [✖|⚠️] Ошибки: K
[если K > 0:
Последние ошибки доставки (TG-API):
• {created_at} — {last_error}
• ...
]
[Открыть настройки →]
```
При `count_failed() == 0` — виджет не регистрируется, дашборд чистый.
## 15. Обработка ошибок Telegram API
`TelegramClient::send_message()` бросает `TelegramException`, у которого метод `is_permanent(): bool`.