Browse Source

feat: add Clear Log button to sync log tab

Adds a trash button at the top of the Sync Log tab that DELETEs all
rows from oc_reverb_sync_log via a new clearLog() AJAX endpoint.
Confirms before clearing, shows a brief success message, then reloads
the page so the empty-log state renders correctly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Benjamin Harris 1 week ago
parent
commit
9300e79d97

+ 18 - 1
upload/admin/controller/extension/module/reverb.php

@@ -43,7 +43,7 @@ class ControllerExtensionModuleReverb extends Controller {
             'text_category_mapping_help', 'text_no_categories',
             'column_oc_category', 'column_reverb_category',
             'column_date', 'column_product', 'column_direction', 'column_status', 'column_message',
-            'text_push', 'text_pull', 'text_error', 'text_no_log',
+            'text_push', 'text_pull', 'text_error', 'text_no_log', 'button_clear_log',
             'text_success', 'text_log_success',
             'error_warning', 'error_api_token',
         ];
@@ -96,6 +96,7 @@ class ControllerExtensionModuleReverb extends Controller {
         $data['cancel']          = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true);
         $data['sync_url']        = $this->url->link('extension/module/reverb/sync', 'user_token=' . $this->session->data['user_token'], true);
         $data['import_url']      = $this->url->link('extension/module/reverb/importOrders', 'user_token=' . $this->session->data['user_token'], true);
+        $data['clear_log_url']   = $this->url->link('extension/module/reverb/clearLog', 'user_token=' . $this->session->data['user_token'], true);
         $data['categories_url']  = $this->url->link('extension/module/reverb/reverbCategories', 'user_token=' . $this->session->data['user_token'], true);
 
         $data['header']      = $this->load->controller('common/header');
@@ -306,6 +307,22 @@ class ControllerExtensionModuleReverb extends Controller {
         $this->response->setOutput($this->load->view('extension/module/reverb_product', $data));
     }
 
+    // -------------------------------------------------------------------------
+    // Clear sync log (AJAX)
+    // -------------------------------------------------------------------------
+
+    public function clearLog() {
+        $this->load->language('extension/module/reverb');
+        $this->load->model('extension/module/reverb');
+        $this->response->addHeader('Content-Type: application/json');
+        if (!$this->user->hasPermission('modify', 'extension/module/reverb')) {
+            $this->response->setOutput(json_encode(['success' => false, 'error' => $this->language->get('error_permission')]));
+            return;
+        }
+        $this->model_extension_module_reverb->clearSyncLog();
+        $this->response->setOutput(json_encode(['success' => true, 'message' => $this->language->get('text_log_cleared')]));
+    }
+
     // -------------------------------------------------------------------------
     // Reverb categories (AJAX — for category mapping dropdowns)
     // -------------------------------------------------------------------------

+ 2 - 0
upload/admin/language/en-gb/extension/module/reverb.php

@@ -36,6 +36,8 @@ $_['column_reverb_category']     = 'Reverb Category';
 $_['text_no_categories']         = 'No categories selected. Choose categories in the Settings tab first.';
 
 // Sync log tab
+$_['button_clear_log']           = 'Clear Log';
+$_['text_log_cleared']           = 'Sync log cleared.';
 $_['column_date']                = 'Date';
 $_['column_product']             = 'Product';
 $_['column_direction']           = 'Direction';

+ 4 - 0
upload/admin/model/extension/module/reverb.php

@@ -311,6 +311,10 @@ class ModelExtensionModuleReverb extends Model {
         ");
     }
 
+    public function clearSyncLog() {
+        $this->db->query("DELETE FROM `" . DB_PREFIX . "reverb_sync_log`");
+    }
+
     public function getSyncLog($limit = 100) {
         $query = $this->db->query("
             SELECT l.*, pd.name AS product_name

+ 37 - 0
upload/admin/view/template/extension/module/reverb.twig

@@ -206,6 +206,12 @@
           <!-- TAB: Sync Log -->
           <!-- ================================================================ -->
           <div class="tab-pane" id="tab-log">
+            <div style="margin-bottom:10px;">
+              <button type="button" id="btn-clear-log" class="btn btn-danger btn-sm">
+                <i class="fa fa-trash-o"></i> {{ button_clear_log }}
+              </button>
+              <span id="clear-log-result" style="margin-left:10px;"></span>
+            </div>
             {% if sync_log is empty %}
             <p>{{ text_no_log }}</p>
             {% else %}
@@ -307,6 +313,37 @@ $(function() {
             }
         });
     });
+
+    $('#btn-clear-log').on('click', function() {
+        if (!confirm('Clear the entire sync log?')) { return; }
+        var $btn    = $(this);
+        var $result = $('#clear-log-result');
+
+        $btn.prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i>');
+
+        var _p = new URLSearchParams(window.location.search);
+        var _clearUrl = 'index.php?route=extension/module/reverb/clearLog&user_token=' + encodeURIComponent(_p.get('user_token') || '');
+
+        $.ajax({
+            url: _clearUrl,
+            type: 'GET',
+            dataType: 'json',
+            success: function(data) {
+                if (data.success) {
+                    $result.removeClass('text-danger').addClass('text-success').text(data.message);
+                    setTimeout(function() { window.location.reload(); }, 800);
+                } else {
+                    $result.removeClass('text-success').addClass('text-danger').text(data.error);
+                }
+            },
+            error: function() {
+                $result.removeClass('text-success').addClass('text-danger').text('Request failed.');
+            },
+            complete: function() {
+                $btn.prop('disabled', false).html('<i class="fa fa-trash-o"></i> {{ button_clear_log }}');
+            }
+        });
+    });
 });
 </script>