Skip to content

Commit b9c5661

Browse files
Merge pull request #395 from JLG-WOCFR-DEV/codex/add-user-preference-for-display-mode
Add settings mode toggle persistence and tests
2 parents ddfa05c + 467837c commit b9c5661

File tree

8 files changed

+747
-4
lines changed

8 files changed

+747
-4
lines changed

docs/ux-ui-enhancements.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ Ce document recense des axes d'amélioration identifiés pour rapprocher l'expé
2424
- **Proposition** :
2525
- Mettre en place un assistant de configuration qui priorise les paramètres essentiels et propose des presets en fonction du type d'hébergement.
2626
- Ajouter des contrôles de cohérence (ex. vérifier la compatibilité entre timeouts et tailles de batch).
27+
- **Mise à jour** : la page « Réglages » mémorise désormais un mode simple/avancé par utilisateur et masque dynamiquement les sections expertes tant que le commutateur n’est pas activé, avec une annonce vocale via `wp.a11y` pour refléter le changement d’affichage.
2728

2829
## 4. Système visuel différenciant
2930
- **Constat** : la feuille de style actuelle reste proche de l'esthétique WordPress par défaut.

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

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4474,14 +4474,25 @@ jQuery(document).ready(function($) {
44744474
return applied;
44754475
}
44764476

4477-
function initAdvancedSettings() {
4478-
var $containers = $('.blc-settings-advanced');
4477+
function initAdvancedSettings($scope) {
4478+
var $root = ($scope && $scope.length) ? $scope : $(document);
4479+
var $containers = $root.find('.blc-settings-advanced');
4480+
4481+
if ($root.is && $root.is('.blc-settings-advanced')) {
4482+
$containers = $containers.add($root);
4483+
}
4484+
44794485
if (!$containers.length) {
44804486
return;
44814487
}
44824488

44834489
$containers.each(function() {
44844490
var $container = $(this);
4491+
if ($container.data('blcAdvancedInit')) {
4492+
return;
4493+
}
4494+
4495+
$container.data('blcAdvancedInit', true);
44854496
var $tabs = $container.find('.blc-settings-advanced__tab');
44864497
var $panels = $container.find('.blc-settings-advanced__panel');
44874498
var $personas = $container.find('.blc-persona');
@@ -4590,6 +4601,32 @@ jQuery(document).ready(function($) {
45904601
});
45914602
}
45924603

4604+
var createSettingsModeToggle = (typeof window !== 'undefined' && window.blcSettingsModeToggleFactory)
4605+
? window.blcSettingsModeToggleFactory
4606+
: null;
4607+
var initSettingsModeToggle = null;
4608+
4609+
if (typeof createSettingsModeToggle === 'function') {
4610+
initSettingsModeToggle = createSettingsModeToggle($, {
4611+
toast: toast,
4612+
accessibility: accessibility,
4613+
initAdvancedSettings: initAdvancedSettings
4614+
});
4615+
}
4616+
4617+
window.blcAdmin = window.blcAdmin || {};
4618+
window.blcAdmin.helpers = window.blcAdmin.helpers || {};
4619+
4620+
if (typeof initSettingsModeToggle === 'function') {
4621+
window.blcAdmin.initSettingsModeToggle = initSettingsModeToggle;
4622+
window.blcAdmin.helpers.initSettingsModeToggle = initSettingsModeToggle;
4623+
} else {
4624+
window.blcAdmin.initSettingsModeToggle = function() {
4625+
return false;
4626+
};
4627+
window.blcAdmin.helpers.initSettingsModeToggle = window.blcAdmin.initSettingsModeToggle;
4628+
}
4629+
45934630
function initLinksTableAjax() {
45944631
var $forms = $('.blc-links-filter-form[data-blc-ajax-table]');
45954632
if (!$forms.length) {
@@ -5579,6 +5616,7 @@ jQuery(document).ready(function($) {
55795616

55805617
initFieldHelp();
55815618
initAdvancedSettings();
5619+
initSettingsModeToggle();
55825620
initLinksTableAjax();
55835621

55845622
$(document).on('click', 'a[href*="page=blc-dashboard"]', function() {
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
(function(root, factory) {
2+
var create = factory();
3+
if (typeof module === 'object' && module.exports) {
4+
module.exports = create;
5+
} else {
6+
root.blcSettingsModeToggleFactory = create;
7+
}
8+
}(typeof self !== 'undefined' ? self : this, function() {
9+
function noop() {}
10+
11+
return function createSettingsModeToggle($, options) {
12+
if (!$ || !$.fn) {
13+
return function() {
14+
return false;
15+
};
16+
}
17+
18+
var settings = options || {};
19+
var initAdvancedSettings = (typeof settings.initAdvancedSettings === 'function') ? settings.initAdvancedSettings : noop;
20+
var toast = settings.toast || null;
21+
var accessibility = settings.accessibility || {};
22+
var speak = (typeof accessibility.speak === 'function') ? accessibility.speak : noop;
23+
24+
return function initSettingsModeToggle() {
25+
var config = window.blcAdminSettings || {};
26+
var ajaxConfig = config.ajax || {};
27+
var i18n = config.i18n || {};
28+
var currentMode = (config.mode === 'advanced') ? 'advanced' : 'simple';
29+
var $toggle = $('[data-blc-settings-mode-toggle]');
30+
31+
if (!$toggle.length) {
32+
return false;
33+
}
34+
35+
var $control = $toggle.find('[data-blc-settings-mode-control]');
36+
if (!$control.length) {
37+
return false;
38+
}
39+
40+
var $state = $toggle.find('[data-blc-settings-mode-state]');
41+
var $action = $control.find('[data-blc-settings-mode-action]');
42+
var $placeholder = $('[data-blc-settings-advanced-placeholder]');
43+
var $template = $('#blc-settings-advanced-template');
44+
var templateHtml = '';
45+
46+
if ($template.length) {
47+
templateHtml = $template.html();
48+
if (typeof templateHtml === 'string') {
49+
templateHtml = templateHtml.trim();
50+
}
51+
}
52+
53+
function ensureAdvancedMarkup() {
54+
if (!templateHtml || !$placeholder.length) {
55+
return;
56+
}
57+
58+
if ($placeholder.children().length) {
59+
return;
60+
}
61+
62+
$placeholder.html(templateHtml);
63+
initAdvancedSettings($placeholder);
64+
}
65+
66+
function applyMode(mode) {
67+
var isAdvanced = mode === 'advanced';
68+
currentMode = isAdvanced ? 'advanced' : 'simple';
69+
70+
$toggle.attr('data-current-mode', currentMode);
71+
$control.attr('aria-checked', isAdvanced ? 'true' : 'false');
72+
73+
if ($state.length) {
74+
var statusText = isAdvanced
75+
? (i18n.statusAdvanced || i18n.modeAdvanced || $state.text())
76+
: (i18n.statusSimple || i18n.modeSimple || $state.text());
77+
$state.text(statusText);
78+
}
79+
80+
if ($action.length) {
81+
$action.text(isAdvanced ? (i18n.switchToSimple || $action.text()) : (i18n.switchToAdvanced || $action.text()));
82+
}
83+
84+
if (isAdvanced) {
85+
ensureAdvancedMarkup();
86+
} else if ($placeholder.length) {
87+
$placeholder.empty();
88+
}
89+
}
90+
91+
var isPending = false;
92+
93+
function setPending(state) {
94+
isPending = !!state;
95+
$control.prop('disabled', isPending);
96+
$toggle.toggleClass('is-loading', isPending);
97+
}
98+
99+
function getAnnouncement(mode, response) {
100+
if (response && response.data && response.data.announcement) {
101+
return response.data.announcement;
102+
}
103+
104+
return mode === 'advanced'
105+
? (i18n.announcementAdvanced || '')
106+
: (i18n.announcementSimple || '');
107+
}
108+
109+
function persistMode(mode) {
110+
var url = ajaxConfig.url || window.ajaxurl || '';
111+
var hasAjax = ajaxConfig.action && ajaxConfig.nonce && url && typeof $.post === 'function';
112+
113+
if (!hasAjax) {
114+
if (typeof Promise === 'function') {
115+
return Promise.resolve({ success: true, data: { mode: mode } });
116+
}
117+
118+
if (typeof $.Deferred === 'function') {
119+
return $.Deferred().resolve({ success: true, data: { mode: mode } }).promise();
120+
}
121+
122+
return null;
123+
}
124+
125+
return new Promise(function(resolve, reject) {
126+
var jqRequest = $.post(url, {
127+
action: ajaxConfig.action,
128+
mode: mode,
129+
_wpnonce: ajaxConfig.nonce
130+
});
131+
132+
if (jqRequest && typeof jqRequest.done === 'function') {
133+
jqRequest.done(resolve).fail(reject);
134+
} else if (jqRequest && typeof jqRequest.then === 'function') {
135+
jqRequest.then(resolve).catch(reject);
136+
} else {
137+
resolve({ success: true, data: { mode: mode } });
138+
}
139+
});
140+
}
141+
142+
applyMode(currentMode);
143+
144+
$control.off('click.blcSettingsMode');
145+
$control.on('click.blcSettingsMode', function(event) {
146+
event.preventDefault();
147+
148+
if (isPending) {
149+
return;
150+
}
151+
152+
var previousMode = currentMode;
153+
var nextMode = (currentMode === 'advanced') ? 'simple' : 'advanced';
154+
setPending(true);
155+
156+
applyMode(nextMode);
157+
158+
var request = persistMode(nextMode);
159+
160+
function handleSuccess(response) {
161+
var savedMode = nextMode;
162+
163+
if (response) {
164+
if (response.success !== false && response.data && response.data.mode) {
165+
savedMode = response.data.mode;
166+
} else if (response.mode) {
167+
savedMode = response.mode;
168+
}
169+
}
170+
171+
applyMode(savedMode);
172+
173+
var announcement = getAnnouncement(savedMode, response);
174+
if (announcement) {
175+
speak(announcement, 'polite');
176+
}
177+
}
178+
179+
function handleFailure() {
180+
applyMode(previousMode);
181+
var message = i18n.error || '';
182+
183+
if (toast && typeof toast.warning === 'function' && message) {
184+
toast.warning(message);
185+
}
186+
187+
if (message) {
188+
speak(message, 'assertive');
189+
}
190+
}
191+
192+
if (request && typeof request.then === 'function') {
193+
request.then(function(response) {
194+
handleSuccess(response);
195+
}).catch(function() {
196+
handleFailure();
197+
}).finally(function() {
198+
setPending(false);
199+
});
200+
201+
return;
202+
}
203+
204+
if (request && typeof request.done === 'function') {
205+
request.done(function(response) {
206+
handleSuccess(response);
207+
}).fail(function() {
208+
handleFailure();
209+
}).always(function() {
210+
setPending(false);
211+
});
212+
213+
return;
214+
}
215+
216+
handleSuccess({ data: { mode: nextMode } });
217+
setPending(false);
218+
});
219+
220+
return true;
221+
};
222+
};
223+
}));

liens-morts-detector-jlg/includes/Admin/AdminAssets.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,24 @@ private function enqueueStyles()
105105

106106
private function enqueueScripts()
107107
{
108+
$togglePath = $this->getPluginDir() . 'assets/js/settings-mode-toggle.js';
109+
$toggleVersion = file_exists($togglePath) ? filemtime($togglePath) : time();
110+
111+
\wp_enqueue_script(
112+
'blc-settings-mode-toggle',
113+
$this->getPluginUrl('assets/js/settings-mode-toggle.js'),
114+
array('jquery'),
115+
$toggleVersion,
116+
true
117+
);
118+
108119
$jsPath = $this->getPluginDir() . 'assets/js/blc-admin-scripts.js';
109120
$jsVersion = file_exists($jsPath) ? filemtime($jsPath) : time();
110121

111122
\wp_enqueue_script(
112123
'blc-admin-js',
113124
$this->getPluginUrl('assets/js/blc-admin-scripts.js'),
114-
array('jquery', 'wp-util'),
125+
array('jquery', 'wp-util', 'blc-settings-mode-toggle'),
115126
$jsVersion,
116127
true
117128
);
@@ -166,6 +177,7 @@ private function buildLocalizationContext()
166177
'imagePollInterval' => max(2000, $imagePollInterval),
167178
'soft404Config' => $soft404Config,
168179
'accessibilityPreferences' => $accessibilityPreferences,
180+
'settingsMode' => function_exists('blc_get_settings_mode') ? blc_get_settings_mode() : 'simple',
169181
);
170182
}
171183

liens-morts-detector-jlg/includes/Admin/AdminScriptLocalizations.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public function getScriptData(array $context)
1414
return array(
1515
'blcAdminMessages' => $this->getMessages(),
1616
'blcAdminUi' => $this->getUiConfig($context),
17+
'blcAdminSettings' => $this->getSettingsConfig($context),
1718
'blcAdminScanConfig' => $this->getLinkScanConfig($context),
1819
'blcAdminNotifications' => $this->getNotificationConfig(),
1920
'blcAdminImageScanConfig' => $this->getImageScanConfig($context),
@@ -116,6 +117,42 @@ private function getUiConfig(array $context)
116117
);
117118
}
118119

120+
/**
121+
* @param array<string, mixed> $context
122+
*
123+
* @return array<string, mixed>
124+
*/
125+
private function getSettingsConfig(array $context)
126+
{
127+
$mode = isset($context['settingsMode']) ? (string) $context['settingsMode'] : 'simple';
128+
if (!in_array($mode, array('simple', 'advanced'), true)) {
129+
$mode = 'simple';
130+
}
131+
132+
$ajaxUrl = function_exists('admin_url') ? esc_url_raw(admin_url('admin-ajax.php')) : '';
133+
$nonce = function_exists('wp_create_nonce') ? wp_create_nonce('blc_settings_mode') : '';
134+
135+
return array(
136+
'mode' => $mode,
137+
'ajax' => array(
138+
'url' => $ajaxUrl,
139+
'action' => 'blc_update_settings_mode',
140+
'nonce' => $nonce,
141+
),
142+
'i18n' => array(
143+
'modeSimple' => __('Mode simple', 'liens-morts-detector-jlg'),
144+
'modeAdvanced' => __('Mode avancé', 'liens-morts-detector-jlg'),
145+
'statusSimple' => __('Mode simple activé — seuls les réglages essentiels sont visibles.', 'liens-morts-detector-jlg'),
146+
'statusAdvanced' => __('Mode avancé activé — toutes les sections sont affichées.', 'liens-morts-detector-jlg'),
147+
'switchToAdvanced' => __('Passer en mode avancé', 'liens-morts-detector-jlg'),
148+
'switchToSimple' => __('Revenir au mode simple', 'liens-morts-detector-jlg'),
149+
'announcementSimple' => __('Mode simple activé. Les réglages avancés sont masqués.', 'liens-morts-detector-jlg'),
150+
'announcementAdvanced' => __('Mode avancé activé. Les réglages supplémentaires sont visibles.', 'liens-morts-detector-jlg'),
151+
'error' => __('Impossible d’enregistrer votre préférence pour le moment.', 'liens-morts-detector-jlg'),
152+
),
153+
);
154+
}
155+
119156
/**
120157
* @param array<string, mixed> $context
121158
*

0 commit comments

Comments
 (0)