Skip to content

Commit 9beac87

Browse files
Merge pull request #383 from JLG-WOCFR-DEV/codex/develop-features-per-roadmap
feat: enrich Slack notifications with customizable identity
2 parents bb992d9 + 6b21eb9 commit 9beac87

File tree

10 files changed

+614
-6
lines changed

10 files changed

+614
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Liens Morts Detector est une extension WordPress qui détecte les liens et image
2323
- Actions en ligne et groupées : modifier une URL, proposer/appliquer une redirection détectée, re-vérifier, ignorer/restaurer ou dissocier un lien en conservant l’ancre.【F:liens-morts-detector-jlg/includes/class-blc-links-list-table.php†L530-L881】
2424

2525
### Notifications et suivi
26-
- Notifications par e-mail ou webhook personnalisable, avec choix du canal (générique JSON, Slack, Microsoft Teams ou Mattermost), du gabarit de message et des catégories de statuts HTTP qui déclenchent un envoi.【F:liens-morts-detector-jlg/includes/blc-settings-fields.php†L295-L366】【F:liens-morts-detector-jlg/includes/blc-notification-payloads.php†L1-L318
26+
- Notifications par e-mail ou webhook personnalisable, avec choix du canal (générique JSON, Slack, Microsoft Teams ou Mattermost), du gabarit de message, des catégories de statuts HTTP qui déclenchent un envoi et d’une identité Slack dédiée (canal cible, nom, icône, sections affichées).【F:liens-morts-detector-jlg/includes/blc-settings-fields.php†L1957-L2094】【F:liens-morts-detector-jlg/includes/blc-notification-payloads.php†L61-L222
2727
- Résumés post-scan envoyés automatiquement depuis le cœur du scanner dès que des destinataires ou un webhook sont configurés.【F:liens-morts-detector-jlg/includes/blc-scanner.php†L1231-L1250】
2828
- Chaque lot publie des métriques (durée, progression, réussite/échec) stockées côté WordPress et exposées via un hook pour alimenter des tableaux de bord externes.【F:liens-morts-detector-jlg/includes/blc-scanner.php†L3214-L3250】
2929

docs/comparaison-professionnelle.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
- **Télémétrie exploitable** : chaque run publie des métriques (durée, progression, réussite) persistées côté WordPress et exposées via un hook pour alimentation de dashboards externes.【F:liens-morts-detector-jlg/includes/blc-scanner.php†L3214-L3250】
2828
- **Délégation granulaire** : de nouvelles capacités `blc_view_reports`, `blc_fix_links` et `blc_manage_settings` permettent d’accorder l’accès aux tableaux, actions et réglages sans recourir à `manage_options`, et sont attribuées automatiquement aux rôles clés lors de l’activation.【F:liens-morts-detector-jlg/includes/blc-capabilities.php†L9-L113】【F:liens-morts-detector-jlg/includes/blc-activation.php†L507-L546】
2929
- **Préférences d’accessibilité** : un panneau dédié aux contrastes, animations et tailles de police applique des classes CSS/JS pour adapter immédiatement l’interface aux besoins spécifiques sans surcharger le thème WordPress.【F:liens-morts-detector-jlg/includes/blc-settings-fields.php†L728-L789】【F:liens-morts-detector-jlg/liens-morts-detector-jlg.php†L142-L175】【F:liens-morts-detector-jlg/assets/css/blc-admin-styles.css†L29-L120】【F:liens-morts-detector-jlg/assets/js/blc-admin-scripts.js†L4-L220】
30+
- **Alertes Slack enrichies** : le connecteur permet maintenant de personnaliser le canal, l’identité d’envoi et les blocs visibles (filtres, top issues) pour refléter les conventions d’escalade professionnelles sans passer par un middleware.【F:liens-morts-detector-jlg/includes/blc-settings-fields.php†L1957-L2094】【F:liens-morts-detector-jlg/includes/blc-notification-payloads.php†L61-L222】【F:tests/NotificationPayloadsTest.php†L72-L194】
3031

3132
## Lacunes face aux outils professionnels
3233
- **Pas de supervision native** : l’historique et les métriques sont stockés côté base, mais aucune interface n’expose encore ces données (tableaux ou graphiques) pour des équipes support non techniques.【F:liens-morts-detector-jlg/includes/blc-scanner.php†L25-L148】【F:liens-morts-detector-jlg/includes/blc-admin-pages.php†L147-L236】

docs/priorites-manquantes.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# État des priorités restantes
22

33
## Manques face à la feuille de route interne
4-
- **Notifications multicanales** : le moteur mutualisé (formatage, throttling, historique) est désormais assuré par `NotificationManager`, mais les connecteurs Slack/Teams/Mattermost décrits dans la roadmap restent à livrer. 【F:liens-morts-detector-jlg/includes/Notifications/NotificationManager.php†L36-L300】【F:liens-morts-detector-jlg/includes/Notifications/NotificationManager.php†L408-L555
4+
- **Notifications multicanales** : Slack dispose désormais d’un connecteur paramétrable (canal, identité, blocs), mais les déclinaisons Teams/Mattermost et les scénarios d’escalade restent à produire. 【F:liens-morts-detector-jlg/includes/blc-settings-fields.php†L1957-L2094】【F:liens-morts-detector-jlg/includes/blc-notification-payloads.php†L61-L222
55
- **Optimisations d’interface** : les tests d’accessibilité automatisés (axe-core) et la documentation de la charte UX restent à livrer malgré la création du composant `DashboardSummary`.
66
- **Renforcement de la qualité logicielle** : les scénarios Playwright et la chaîne CI complète (lint, packaging) restent planifiés mais absents du code.
77
- **Surveillance proactive** : la gestion de seuils configurables, l’escalade multicanale et les visualisations sparkline doivent encore être conçues.
@@ -11,4 +11,4 @@
1111
- **Scalabilité horizontale** : aucune file distribuée (Redis/SQS) ni worker externe ne complète encore WP-Cron pour les catalogues volumineux.
1212
- **Résilience réseau avancée** : la rotation de proxys/IP et les stratégies multi-sorties restent à ajouter pour égaler les solutions premium.
1313
- **Workflows collaboratifs** : l’assignation, la journalisation fine des corrections et le partage de vues enregistrées ne sont pas encore disponibles.
14-
- **Connecteurs prêts à l’emploi** : l’extension ne propose pas d’intégrations Slack/Jira/ServiceNow ni de documentation REST industrialisée comme les concurrents.
14+
- **Connecteurs prêts à l’emploi** : l’extension ne propose pas encore de modules Jira/ServiceNow ni de documentation REST industrialisée comme les concurrents, malgré l’adaptateur Slack amélioré.

docs/roadmap-ameliorations.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Cette feuille de route décline les pistes d'amélioration listées dans le `REA
3535
3. Ajouter un adaptateur Teams/Mattermost basé sur les cartes Adaptive Cards.
3636

3737
> ✅ Un gestionnaire centralisé `NotificationManager` mutualise désormais le formatage des messages, la mise en attente anti-doublon et l'historique des envois pour les canaux e-mail et webhook. 【F:liens-morts-detector-jlg/includes/Notifications/NotificationManager.php†L36-L300】【F:liens-morts-detector-jlg/includes/Notifications/NotificationManager.php†L408-L555】
38+
> ✅ L’adaptateur Slack permet de choisir le canal cible, le nom d’expéditeur, l’icône et les blocs (filtres, principaux problèmes) pour aligner les alertes sur les runbooks d’escalade internes. 【F:liens-morts-detector-jlg/includes/blc-settings-fields.php†L1957-L2094】【F:liens-morts-detector-jlg/includes/blc-notification-payloads.php†L61-L222】【F:tests/NotificationPayloadsTest.php†L72-L194】
3839
3940
**Indicateurs de réussite**
4041
- Notifications livrées en < 5 secondes après la fin d'un scan.

liens-morts-detector-jlg/assets/css/blc-admin-styles.css

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,25 @@
568568
gap: 6px;
569569
}
570570

571+
.blc-notification-channel-advanced {
572+
margin-top: 24px;
573+
padding: 16px 20px;
574+
border: 1px solid var(--blc-admin-border-subtle);
575+
border-radius: var(--blc-admin-radius-sm);
576+
background: var(--blc-admin-surface-subtle);
577+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);
578+
transition: border-color var(--blc-admin-transition), box-shadow var(--blc-admin-transition);
579+
}
580+
581+
.blc-notification-channel-advanced[hidden] {
582+
display: none;
583+
}
584+
585+
.blc-notification-channel-advanced.is-active {
586+
border-color: var(--blc-admin-border-strong);
587+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4), 0 0 0 1px rgba(110, 86, 207, 0.05);
588+
}
589+
571590
/* Styles pour l'encadré des statistiques */
572591
.blc-stats-box {
573592
display: flex;

liens-morts-detector-jlg/assets/js/blc-admin-scripts.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,41 @@ jQuery(document).ready(function($) {
773773
});
774774
})();
775775

776+
(function setupWebhookChannelAdvancedOptions() {
777+
var $channelField = $('#blc_notification_webhook_channel');
778+
if (!$channelField.length) {
779+
return;
780+
}
781+
782+
var $containers = $('.blc-notification-channel-advanced');
783+
if (!$containers.length) {
784+
return;
785+
}
786+
787+
function refreshVisibility() {
788+
var currentChannel = String($channelField.val() || '');
789+
790+
$containers.each(function() {
791+
var $container = $(this);
792+
var targetChannel = String($container.data('blcWebhookChannel') || '');
793+
var shouldShow = !targetChannel || targetChannel === currentChannel;
794+
795+
$container.toggleClass('is-active', shouldShow);
796+
797+
if (shouldShow) {
798+
$container.removeAttr('hidden');
799+
$container.attr('aria-hidden', 'false');
800+
} else {
801+
$container.attr('hidden', 'hidden');
802+
$container.attr('aria-hidden', 'true');
803+
}
804+
});
805+
}
806+
807+
$channelField.on('change', refreshVisibility);
808+
refreshVisibility();
809+
})();
810+
776811
(function announceBulkNotice() {
777812
var $notice = $('.blc-bulk-notice');
778813

liens-morts-detector-jlg/includes/blc-notification-payloads.php

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,48 @@ function blc_build_slack_notification_payload($message, array $summary, array $s
7272
$filter_labels = blc_translate_notification_status_filters($filters);
7373
$trend_label = blc_format_notification_trend($difference, $previous);
7474

75+
$channel_override = isset($settings['slack_channel_override']) ? (string) $settings['slack_channel_override'] : '';
76+
if (function_exists('blc_normalize_notification_slack_channel_override')) {
77+
$channel_override = blc_normalize_notification_slack_channel_override($channel_override);
78+
}
79+
80+
$slack_username = isset($settings['slack_username']) ? (string) $settings['slack_username'] : '';
81+
if (function_exists('blc_normalize_notification_slack_username')) {
82+
$slack_username = blc_normalize_notification_slack_username($slack_username);
83+
}
84+
85+
$slack_icon = isset($settings['slack_icon']) ? (string) $settings['slack_icon'] : '';
86+
if (function_exists('blc_normalize_notification_slack_icon')) {
87+
$slack_icon = blc_normalize_notification_slack_icon($slack_icon);
88+
}
89+
90+
$show_filters = true;
91+
if (array_key_exists('slack_show_filters', $settings)) {
92+
$show_filters = (bool) $settings['slack_show_filters'];
93+
}
94+
95+
$show_top_issues = true;
96+
if (array_key_exists('slack_show_top_issues', $settings)) {
97+
$show_top_issues = (bool) $settings['slack_show_top_issues'];
98+
}
99+
100+
$title_template = isset($settings['slack_title_template']) ? (string) $settings['slack_title_template'] : '{{subject}}';
101+
if (function_exists('blc_normalize_notification_slack_title_template')) {
102+
$title_template = blc_normalize_notification_slack_title_template($title_template);
103+
}
104+
75105
if ($dataset_label === '' && $dataset_type !== '') {
76106
$dataset_label = $dataset_type;
77107
}
78108

109+
if (!$show_filters) {
110+
$filter_labels = array();
111+
}
112+
113+
if (!$show_top_issues) {
114+
$top_issues = array();
115+
}
116+
79117
$overview_fields = array();
80118

81119
if ($site_name !== '') {
@@ -120,12 +158,25 @@ function blc_build_slack_notification_payload($message, array $summary, array $s
120158

121159
$blocks = array();
122160

123-
if ($subject !== '') {
161+
$header_text = $subject;
162+
if ($title_template !== '') {
163+
$rendered_title = function_exists('blc_render_notification_message_template')
164+
? blc_render_notification_message_template($title_template, $summary)
165+
: $title_template;
166+
167+
$rendered_title = blc_trim_slack_plain_text($rendered_title, 150);
168+
169+
if ($rendered_title !== '') {
170+
$header_text = $rendered_title;
171+
}
172+
}
173+
174+
if ($header_text !== '') {
124175
$blocks[] = array(
125176
'type' => 'header',
126177
'text' => array(
127178
'type' => 'plain_text',
128-
'text' => $subject,
179+
'text' => $header_text,
129180
'emoji' => true,
130181
),
131182
);
@@ -215,10 +266,28 @@ function blc_build_slack_notification_payload($message, array $summary, array $s
215266
);
216267
}
217268

218-
return array(
269+
$payload = array(
219270
'text' => $message,
220271
'blocks' => $blocks,
221272
);
273+
274+
if ($channel_override !== '') {
275+
$payload['channel'] = $channel_override;
276+
}
277+
278+
if ($slack_username !== '') {
279+
$payload['username'] = $slack_username;
280+
}
281+
282+
if ($slack_icon !== '') {
283+
if ($slack_icon[0] === ':') {
284+
$payload['icon_emoji'] = $slack_icon;
285+
} else {
286+
$payload['icon_url'] = $slack_icon;
287+
}
288+
}
289+
290+
return $payload;
222291
}
223292

224293
/**

0 commit comments

Comments
 (0)