From c30e3fc48d29a315e620f92f9002fbd75feea152 Mon Sep 17 00:00:00 2001 From: DamsFX Date: Thu, 14 Nov 2024 20:17:10 +0100 Subject: [PATCH 1/7] Add event log cleaning by filters --- modules/system/controllers/EventLogs.php | 115 +++++++++++++++++- .../eventlogs/_delete_filtered_form.php | 90 ++++++++++++++ .../controllers/eventlogs/_list_toolbar.php | 9 ++ modules/system/lang/en/lang.php | 8 ++ 4 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 modules/system/controllers/eventlogs/_delete_filtered_form.php diff --git a/modules/system/controllers/EventLogs.php b/modules/system/controllers/EventLogs.php index 5c870e54d..614f6c753 100644 --- a/modules/system/controllers/EventLogs.php +++ b/modules/system/controllers/EventLogs.php @@ -1,10 +1,13 @@ listRefresh(); } + /** + * Show a popup to ask user his choices about clearing the log + */ + public function index_onClearLog() + { + $config = $this->makeConfig([ + 'fields' => [ + 'message' => [ + 'type' => 'text', + 'label' => 'system::lang.event_log.delete_filtered_search', + 'comment' => 'system::lang.event_log.delete_filtered_search_comment', + 'span' => 'full', + ], + 'date_start' => [ + 'type' => 'datepicker', + 'label' => 'system::lang.event_log.delete_filtered_date_start', + 'span' => 'left', + 'mode' => 'datetime', + ], + 'date_end' => [ + 'type' => 'datepicker', + 'label' => 'system::lang.event_log.delete_filtered_date_end', + 'span' => 'right', + 'mode' => 'datetime', + ], + ], + ]); + $config->model = new EventLog; + + $formWidget = $this->makeWidget('Backend\Widgets\Form', $config); + $formWidget->bindToController(); + + return $this->makePartial('delete_filtered_form', [ + 'formWidget' => $formWidget, + ]); + } + + /** + * Return informations about the log to be cleared + */ + public function index_onClearLogInfos() + { + $message = post('message'); + $dateStart = post('date_start'); + $dateEnd = post('date_end'); + + if (!$message && !$dateStart && !$dateEnd) { + return [ + '#deleteFilteredList' => '', + '#deleteFilteredResults' => '', + ]; + } + + $events = EventLog + ::when($message, fn ($q) => $q->where('message', 'like', '%' . $message . '%')) + ->when($dateStart, fn ($q) => $q->where('created_at', '>=', $dateStart)) + ->when($dateEnd, fn ($q) => $q->where('created_at', '<=', $dateEnd)) + ->orderBy('created_at', 'desc') + ->get(); + + $config = $this->makeConfig('~/modules/system/models/eventlog/columns.yaml'); + $config->model = new EventLog; + + $controlList = $this->makeWidget('Backend\Widgets\Lists', $config); + $controlList->bindEvent('list.extendRecords', function ($records) use ($events, $message) { + if ($events->count() > 0) { + return $events; + } + return collect([]); + }); + + $controlList->bindToController(); + + return [ + 'total' => $events->count(), + '#deleteFilteredList' => $controlList->render(), + '#deleteFilteredResults' => Lang::get('system::lang.event_log.delete_filtered_results', [ + 'what' => strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), + 'count' => $events->count(), + ]) + ]; + + } + + /** + * Delete the filtered events log + */ + public function index_onClearLogDelete() + { + $message = post('message'); + $dateStart = post('date_start'); + $dateEnd = post('date_end'); + $eventLog = new EventLog; + + $eventLog = EventLog + ::when($message, fn ($q) => $q->where('message', 'like', '%' . $message . '%')) + ->when($dateStart, fn ($q) => $q->where('created_at', '>=', $dateStart)) + ->when($dateEnd, fn ($q) => $q->where('created_at', '<=', $dateEnd)); + + $events = $eventLog->get(); + $eventLog->delete(); + + Flash::success(Lang::get('system::lang.event_log.delete_filtered_success', [ + 'what' => strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), + ])); + return $this->listRefresh(); + } + public function index_onEmptyLog() { EventLog::truncate(); diff --git a/modules/system/controllers/eventlogs/_delete_filtered_form.php b/modules/system/controllers/eventlogs/_delete_filtered_form.php new file mode 100644 index 000000000..db7c0c1d8 --- /dev/null +++ b/modules/system/controllers/eventlogs/_delete_filtered_form.php @@ -0,0 +1,90 @@ +
+ 'deleteFiltered']) ?> + + + + + + + +
+ + diff --git a/modules/system/controllers/eventlogs/_list_toolbar.php b/modules/system/controllers/eventlogs/_list_toolbar.php index 4dd78a55c..3b0ee3628 100644 --- a/modules/system/controllers/eventlogs/_list_toolbar.php +++ b/modules/system/controllers/eventlogs/_list_toolbar.php @@ -6,6 +6,15 @@ class="btn btn-primary wn-icon-refresh"> + + + 'Message', 'level' => 'Level', 'preview_title' => 'Event', + 'delete_filtered_confirm' => 'Delete the filtered events?', + 'delete_filtered_date_start' => 'Starting date', + 'delete_filtered_date_end' => 'Ending date', + 'delete_filtered_link' => 'Delete filtered events', + 'delete_filtered_search' => 'Messages containing', + 'delete_filtered_success' => 'Filtered :what deleted', + 'delete_filtered_search_comment' => 'select all event log messages containing the following text', + 'delete_filtered_results' => ':count :what log matching your criteria', ], 'request_log' => [ 'hint' => 'This log displays a list of browser requests that may require attention. For example, if a visitor opens a CMS page that cannot be found, a record is created with the status code 404.', From 88973e0f5630a1972eb4551e7897e06ee0b460e9 Mon Sep 17 00:00:00 2001 From: DamsFX Date: Fri, 15 Nov 2024 02:33:25 +0100 Subject: [PATCH 2/7] Update form UX - better change detection on form fields - close popup after user confirmation --- .../eventlogs/_delete_filtered_form.php | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/modules/system/controllers/eventlogs/_delete_filtered_form.php b/modules/system/controllers/eventlogs/_delete_filtered_form.php index db7c0c1d8..f96bb8418 100644 --- a/modules/system/controllers/eventlogs/_delete_filtered_form.php +++ b/modules/system/controllers/eventlogs/_delete_filtered_form.php @@ -30,7 +30,7 @@ class="btn btn-default" class="btn btn-success hidden" data-request="onClearLogDelete" data-request-confirm="" - data-dismiss="popup" + data-request-success="$(this).trigger('close.oc.popup');" data-stripe-load-indicator> @@ -66,25 +66,22 @@ function delay(callback, ms) { }; } - $('#deleteFiltered input:not(:button)').each(function () { - this.defaultValue = this.value; + var $inputMessage = $('#deleteFiltered :input[name="message"]'); + $inputMessage.defaultValue = $inputMessage.val(); - if (this.type == 'text') { - $(this).keyup(delay(function (e) { - if (e.target.value != e.target.defaultValue) { - e.target.defaultValue = this.value; - refreshResults(); - } - }, 750)); - } else { - $(this).on('change', function() { - setTimeout( - refreshResults(), - 1000 - ) - }); + // Monitor change on message field + $inputMessage.keyup(delay(function (e) { + if (e.target.value != e.target.defaultValue) { + e.target.defaultValue = this.value; + refreshResults(); } + }, 750)); - }); + // Monitor change on datepicker fields + $('#deleteFiltered').on('change.oc.formwidget', delay(function (e) { + if (e.target.name != 'message') { + refreshResults(); + } + }, 400)); }) From 000984ff455083b0ee8e7836d8d5adacb6e254ef Mon Sep 17 00:00:00 2001 From: DamsFX Date: Fri, 15 Nov 2024 02:49:57 +0100 Subject: [PATCH 3/7] Remove blank lines --- modules/system/controllers/EventLogs.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/system/controllers/EventLogs.php b/modules/system/controllers/EventLogs.php index 614f6c753..5dbe711ca 100644 --- a/modules/system/controllers/EventLogs.php +++ b/modules/system/controllers/EventLogs.php @@ -1,15 +1,13 @@ Date: Fri, 15 Nov 2024 03:20:17 +0100 Subject: [PATCH 4/7] Update translations --- modules/system/controllers/EventLogs.php | 1 + modules/system/lang/en/lang.php | 4 ++-- modules/system/lang/fr/lang.php | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/system/controllers/EventLogs.php b/modules/system/controllers/EventLogs.php index 5dbe711ca..016faec2f 100644 --- a/modules/system/controllers/EventLogs.php +++ b/modules/system/controllers/EventLogs.php @@ -150,6 +150,7 @@ public function index_onClearLogDelete() Flash::success(Lang::get('system::lang.event_log.delete_filtered_success', [ 'what' => strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), + 'count' => $events->count(), ])); return $this->listRefresh(); } diff --git a/modules/system/lang/en/lang.php b/modules/system/lang/en/lang.php index 913565065..77cdf16e7 100644 --- a/modules/system/lang/en/lang.php +++ b/modules/system/lang/en/lang.php @@ -403,9 +403,9 @@ 'delete_filtered_date_end' => 'Ending date', 'delete_filtered_link' => 'Delete filtered events', 'delete_filtered_search' => 'Messages containing', - 'delete_filtered_success' => 'Filtered :what deleted', + 'delete_filtered_success' => ':count :what successfully deleted', 'delete_filtered_search_comment' => 'select all event log messages containing the following text', - 'delete_filtered_results' => ':count :what log matching your criteria', + 'delete_filtered_results' => ':count :what matching your criteria', ], 'request_log' => [ 'hint' => 'This log displays a list of browser requests that may require attention. For example, if a visitor opens a CMS page that cannot be found, a record is created with the status code 404.', diff --git a/modules/system/lang/fr/lang.php b/modules/system/lang/fr/lang.php index 57a25e478..ddc5ce105 100644 --- a/modules/system/lang/fr/lang.php +++ b/modules/system/lang/fr/lang.php @@ -352,6 +352,14 @@ 'message' => 'Message', 'level' => 'Niveau', 'preview_title' => 'Évènement', + 'delete_filtered_confirm' => 'Supprimer les évènement filtrés?', + 'delete_filtered_date_start' => 'Depuis le', + 'delete_filtered_date_end' => 'Jusqu\'au', + 'delete_filtered_link' => 'Supprimer des évènements', + 'delete_filtered_search' => 'Message contenant', + 'delete_filtered_success' => ':count :what supprimés avec succès', + 'delete_filtered_search_comment' => 'sélectionner tous les messages du journal des événements contenant le texte suivant', + 'delete_filtered_results' => ':count :what correspondant à votre recherche', ], 'request_log' => [ 'hint' => 'Ce journal affiche une liste de requêtes potentiellement suspectes. Par exemple, si un visiteur ouvre une page introuvable du CMS, une ligne avec le code statut 404 est alors créée.', From 09ca4bef61e9ce6469261474b1b036cc09be1e3c Mon Sep 17 00:00:00 2001 From: DamsFX Date: Fri, 15 Nov 2024 03:40:07 +0100 Subject: [PATCH 5/7] Fix code quality check --- modules/system/controllers/EventLogs.php | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/system/controllers/EventLogs.php b/modules/system/controllers/EventLogs.php index 016faec2f..9082067ef 100644 --- a/modules/system/controllers/EventLogs.php +++ b/modules/system/controllers/EventLogs.php @@ -127,7 +127,6 @@ public function index_onClearLogInfos() 'count' => $events->count(), ]) ]; - } /** From a4483fa4da5cbc3d1a408f5855d88a657382f21f Mon Sep 17 00:00:00 2001 From: DamsFX Date: Fri, 15 Nov 2024 18:00:40 +0100 Subject: [PATCH 6/7] Allow special characters (\, % and _) in search query --- .gitignore | 31 ++++++++++++++++++++++++ modules/system/controllers/EventLogs.php | 12 +++++++-- plugins/hounddd/testbatches | 1 + 3 files changed, 42 insertions(+), 2 deletions(-) create mode 160000 plugins/hounddd/testbatches diff --git a/.gitignore b/.gitignore index 9485e1fe2..921068d4a 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,34 @@ package-lock.json # Ignore generated public directory from `winter:mirror public` public +composer.json +plugins/winter/debugbar/.gitignore +plugins/winter/debugbar/icon.png +plugins/winter/debugbar/LICENSE +plugins/winter/debugbar/Plugin.php +plugins/winter/debugbar/README.md +plugins/winter/debugbar/assets/css/debugbar.css +plugins/winter/debugbar/assets/less/debugbar.less +plugins/winter/debugbar/assets/less/vendor.less +plugins/winter/debugbar/classes/JavascriptRenderer.php +plugins/winter/debugbar/classes/ServiceProvider.php +plugins/winter/debugbar/classes/WinterDebugbar.php +plugins/winter/debugbar/collectors/BackendCollector.php +plugins/winter/debugbar/collectors/CmsCollector.php +plugins/winter/debugbar/collectors/ComponentsCollector.php +plugins/winter/debugbar/collectors/ModelsCollector.php +plugins/winter/debugbar/config/config.php +plugins/winter/debugbar/lang/en/lang.php +plugins/winter/debugbar/lang/ru/lang.php +plugins/winter/debugbar/lang/sl/lang.php +plugins/winter/debugbar/middleware/InjectDebugbar.php +plugins/winter/debugbar/middleware/InterpretsAjaxExceptions.php +plugins/winter/debugbar/screenshots/collapsed.png +plugins/winter/debugbar/screenshots/expanded-queries.png +plugins/winter/debugbar/screenshots/expanded-timeline.png +plugins/winter/debugbar/twig/extension/Debug.php +plugins/winter/debugbar/twig/extension/Dump.php +plugins/winter/debugbar/twig/extension/Stopwatch.php +plugins/winter/debugbar/twig/node/StopwatchNode.php +plugins/winter/debugbar/twig/tokenparser/StopwatchTokenParser.php +plugins/winter/debugbar/updates/version.yaml diff --git a/modules/system/controllers/EventLogs.php b/modules/system/controllers/EventLogs.php index 9082067ef..a6dd17070 100644 --- a/modules/system/controllers/EventLogs.php +++ b/modules/system/controllers/EventLogs.php @@ -100,7 +100,11 @@ public function index_onClearLogInfos() } $events = EventLog - ::when($message, fn ($q) => $q->where('message', 'like', '%' . $message . '%')) + ::when($message, fn ($q) => $q->where('message', 'like', '%' . str_replace( + ['\\', '%', '_'], + ['\\\\', '\\%', '\\_'], + $message + ) . '%')) ->when($dateStart, fn ($q) => $q->where('created_at', '>=', $dateStart)) ->when($dateEnd, fn ($q) => $q->where('created_at', '<=', $dateEnd)) ->orderBy('created_at', 'desc') @@ -140,7 +144,11 @@ public function index_onClearLogDelete() $eventLog = new EventLog; $eventLog = EventLog - ::when($message, fn ($q) => $q->where('message', 'like', '%' . $message . '%')) + ::when($message, fn ($q) => $q->where('message', 'like', '%' . str_replace( + ['\\', '%', '_'], + ['\\\\', '\\%', '\\_'], + $message + ) . '%')) ->when($dateStart, fn ($q) => $q->where('created_at', '>=', $dateStart)) ->when($dateEnd, fn ($q) => $q->where('created_at', '<=', $dateEnd)); diff --git a/plugins/hounddd/testbatches b/plugins/hounddd/testbatches new file mode 160000 index 000000000..2fba53232 --- /dev/null +++ b/plugins/hounddd/testbatches @@ -0,0 +1 @@ +Subproject commit 2fba5323263773c47db41a98a463449d8b7dd3d5 From 9bebafea1ee415c9a61eb96eab3e763deb64395c Mon Sep 17 00:00:00 2001 From: DamsFX Date: Sat, 16 Nov 2024 17:41:31 +0100 Subject: [PATCH 7/7] Add visual indicator --- modules/system/controllers/EventLogs.php | 4 +- .../eventlogs/_delete_filtered_form.php | 43 ++++++++++++++++--- modules/system/lang/en/lang.php | 1 + modules/system/lang/fr/lang.php | 1 + 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/modules/system/controllers/EventLogs.php b/modules/system/controllers/EventLogs.php index a6dd17070..c0ee5f06e 100644 --- a/modules/system/controllers/EventLogs.php +++ b/modules/system/controllers/EventLogs.php @@ -127,7 +127,7 @@ public function index_onClearLogInfos() 'total' => $events->count(), '#deleteFilteredList' => $controlList->render(), '#deleteFilteredResults' => Lang::get('system::lang.event_log.delete_filtered_results', [ - 'what' => strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), + 'what' => mb_strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), 'count' => $events->count(), ]) ]; @@ -156,7 +156,7 @@ public function index_onClearLogDelete() $eventLog->delete(); Flash::success(Lang::get('system::lang.event_log.delete_filtered_success', [ - 'what' => strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), + 'what' => mb_strtolower(Str::plural(Lang::get('system::lang.event_log.preview_title'), $events->count())), 'count' => $events->count(), ])); return $this->listRefresh(); diff --git a/modules/system/controllers/eventlogs/_delete_filtered_form.php b/modules/system/controllers/eventlogs/_delete_filtered_form.php index f96bb8418..9015a2ce7 100644 --- a/modules/system/controllers/eventlogs/_delete_filtered_form.php +++ b/modules/system/controllers/eventlogs/_delete_filtered_form.php @@ -12,8 +12,15 @@ render(); ?> -
-
+
+ + +
+
+
@@ -41,7 +48,17 @@ class="btn btn-success hidden"