feat: Enhance user settings with cron URL plan display
- Added a new field to display the cron URL plan in user settings. - Updated JavaScript to handle the new plan data. refactor: Unify product model and migrate data - Migrated product data from `products_data` to `products` table. - Added new columns to `products` for better data organization. - Created `products_aggregate` table for storing aggregated product metrics. chore: Drop deprecated products_data table - Removed `products_data` table as data is now stored in `products`. feat: Add merchant URL flags to products - Introduced flags for tracking merchant URL status in `products` table. - Normalized product URLs to handle empty or invalid values. feat: Link campaign alerts to specific products - Added `product_id` column to `campaign_alerts` table for better tracking. - Created an index for efficient querying of alerts by product. chore: Add debug scripts for client data inspection - Created debug scripts to inspect client data from local and remote databases. - Included error handling and output formatting for better readability.
This commit is contained in:
@@ -17,97 +17,185 @@
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="campaigns-table-wrap">
|
||||
<table class="table" id="campaign_alerts_table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Data</th>
|
||||
<th>Klient</th>
|
||||
<th>Kampania</th>
|
||||
<th>Grupa reklam</th>
|
||||
<th>Komunikat</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ( empty( $this -> alerts ) ): ?>
|
||||
<form method="post" action="/campaign_alerts/delete_selected" id="campaign_alerts_bulk_form">
|
||||
<input type="hidden" name="client_id" value="<?= (int) $this -> selected_client_id; ?>">
|
||||
<input type="hidden" name="page" value="<?= (int) $this -> page; ?>">
|
||||
|
||||
<div style="display:flex;justify-content:flex-end;margin-bottom:10px;">
|
||||
<button type="submit" id="delete_selected_alerts_btn" class="btn btn-danger btn-sm" disabled>
|
||||
<i class="fa-solid fa-trash"></i> Usun zaznaczone (<span id="selected_alerts_count">0</span>)
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="campaigns-table-wrap">
|
||||
<table class="table" id="campaign_alerts_table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="5" class="text-center">Brak alertów.</td>
|
||||
<th style="width:40px;text-align:center;">
|
||||
<input type="checkbox" id="alerts_select_all" aria-label="Zaznacz wszystkie alerty">
|
||||
</th>
|
||||
<th>Data</th>
|
||||
<th>Klient</th>
|
||||
<th style="white-space:nowrap">Kampania</th>
|
||||
<th>Grupa reklam</th>
|
||||
<th>Komunikat</th>
|
||||
</tr>
|
||||
<?php else: ?>
|
||||
<?php foreach ( $this -> alerts as $row ): ?>
|
||||
<?php
|
||||
$campaign_name = trim( (string) ( $row['campaign_name'] ?? '' ) );
|
||||
if ( $campaign_name === '' )
|
||||
{
|
||||
$campaign_name = 'Kampania #' . (int) ( $row['campaign_external_id'] ?? 0 );
|
||||
}
|
||||
|
||||
$ad_group_name = trim( (string) ( $row['ad_group_name'] ?? '' ) );
|
||||
if ( $ad_group_name === '' )
|
||||
{
|
||||
$ad_group_name = 'Grupa reklam #' . (int) ( $row['ad_group_external_id'] ?? 0 );
|
||||
}
|
||||
|
||||
$client_name = trim( (string) ( $row['client_name'] ?? '' ) );
|
||||
if ( $client_name === '' )
|
||||
{
|
||||
$client_name = 'Klient #' . (int) ( $row['client_id'] ?? 0 );
|
||||
}
|
||||
?>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if ( empty( $this -> alerts ) ): ?>
|
||||
<tr>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars( (string) ( $row['date_detected'] ?? '' ) ); ?></td>
|
||||
<td><?= htmlspecialchars( $client_name ); ?></td>
|
||||
<td><?= htmlspecialchars( $campaign_name ); ?></td>
|
||||
<td><?= htmlspecialchars( $ad_group_name ); ?></td>
|
||||
<td><?= htmlspecialchars( (string) ( $row['message'] ?? '' ) ); ?></td>
|
||||
<td colspan="6" class="text-center">Brak alertow.</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php else: ?>
|
||||
<?php foreach ( $this -> alerts as $row ): ?>
|
||||
<?php
|
||||
$alert_type = trim( (string) ( $row['alert_type'] ?? '' ) );
|
||||
$campaign_name = trim( (string) ( $row['campaign_name'] ?? '' ) );
|
||||
$ad_group_name = trim( (string) ( $row['ad_group_name'] ?? '' ) );
|
||||
|
||||
<?php if ( (int) $this -> total_pages > 1 ): ?>
|
||||
<div class="dt-layout-row" style="display:flex !important;justify-content:flex-end;">
|
||||
<div class="dt-paging">
|
||||
<nav>
|
||||
<ul class="pagination">
|
||||
<?php
|
||||
$page = (int) $this -> page;
|
||||
$total_pages = (int) $this -> total_pages;
|
||||
$client_id = (int) $this -> selected_client_id;
|
||||
$qs = $client_id > 0 ? '&client_id=' . $client_id : '';
|
||||
if ( $alert_type === 'products_missing_in_merchant_center' )
|
||||
{
|
||||
$campaign_name = 'Produkt (Merchant Center)';
|
||||
$ad_group_name = '---';
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( $campaign_name === '' )
|
||||
{
|
||||
$campaign_external_id = (int) ( $row['campaign_external_id'] ?? 0 );
|
||||
$campaign_name = $campaign_external_id > 0 ? ( 'Kampania #' . $campaign_external_id ) : '--- konto ---';
|
||||
}
|
||||
|
||||
if ( $ad_group_name === '' )
|
||||
{
|
||||
$ad_group_external_id = (int) ( $row['ad_group_external_id'] ?? 0 );
|
||||
$ad_group_name = $ad_group_external_id > 0 ? ( 'Grupa reklam #' . $ad_group_external_id ) : '---';
|
||||
}
|
||||
}
|
||||
|
||||
$client_name = trim( (string) ( $row['client_name'] ?? '' ) );
|
||||
if ( $client_name === '' )
|
||||
{
|
||||
$client_name = 'Klient #' . (int) ( $row['client_id'] ?? 0 );
|
||||
}
|
||||
?>
|
||||
<li class="page-item <?= $page <= 1 ? 'disabled' : ''; ?>">
|
||||
<a class="page-link" href="/campaign_alerts?page=<?= $page - 1; ?><?= $qs; ?>">«</a>
|
||||
</li>
|
||||
<?php
|
||||
$start_p = max( 1, $page - 2 );
|
||||
$end_p = min( $total_pages, $page + 2 );
|
||||
if ( $start_p > 1 ):
|
||||
?>
|
||||
<li class="page-item"><a class="page-link" href="/campaign_alerts?page=1<?= $qs; ?>">1</a></li>
|
||||
<?php if ( $start_p > 2 ): ?>
|
||||
<li class="page-item disabled"><span class="page-link">...</span></li>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
<?php for ( $i = $start_p; $i <= $end_p; $i++ ): ?>
|
||||
<li class="page-item <?= $i === $page ? 'active' : ''; ?>">
|
||||
<a class="page-link" href="/campaign_alerts?page=<?= $i; ?><?= $qs; ?>"><?= $i; ?></a>
|
||||
<tr>
|
||||
<td style="text-align:center;">
|
||||
<input type="checkbox" name="alert_ids[]" value="<?= (int) ( $row['id'] ?? 0 ); ?>" class="alert-select-row" aria-label="Zaznacz alert #<?= (int) ( $row['id'] ?? 0 ); ?>">
|
||||
</td>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars( (string) ( $row['date_detected'] ?? '' ) ); ?></td>
|
||||
<td><?= htmlspecialchars( $client_name ); ?></td>
|
||||
<td style="white-space:nowrap"><?= htmlspecialchars( $campaign_name ); ?></td>
|
||||
<td><?= htmlspecialchars( $ad_group_name ); ?></td>
|
||||
<td><?= htmlspecialchars( (string) ( $row['message'] ?? '' ) ); ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<?php if ( (int) $this -> total_pages > 1 ): ?>
|
||||
<div class="dt-layout-row" style="display:flex !important;justify-content:flex-end;">
|
||||
<div class="dt-paging">
|
||||
<nav>
|
||||
<ul class="pagination">
|
||||
<?php
|
||||
$page = (int) $this -> page;
|
||||
$total_pages = (int) $this -> total_pages;
|
||||
$client_id = (int) $this -> selected_client_id;
|
||||
$qs = $client_id > 0 ? '&client_id=' . $client_id : '';
|
||||
?>
|
||||
<li class="page-item <?= $page <= 1 ? 'disabled' : ''; ?>">
|
||||
<a class="page-link" href="/campaign_alerts?page=<?= $page - 1; ?><?= $qs; ?>">«</a>
|
||||
</li>
|
||||
<?php endfor; ?>
|
||||
<?php if ( $end_p < $total_pages ): ?>
|
||||
<?php if ( $end_p < $total_pages - 1 ): ?>
|
||||
<li class="page-item disabled"><span class="page-link">...</span></li>
|
||||
<?php
|
||||
$start_p = max( 1, $page - 2 );
|
||||
$end_p = min( $total_pages, $page + 2 );
|
||||
if ( $start_p > 1 ):
|
||||
?>
|
||||
<li class="page-item"><a class="page-link" href="/campaign_alerts?page=1<?= $qs; ?>">1</a></li>
|
||||
<?php if ( $start_p > 2 ): ?>
|
||||
<li class="page-item disabled"><span class="page-link">...</span></li>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
<li class="page-item"><a class="page-link" href="/campaign_alerts?page=<?= $total_pages; ?><?= $qs; ?>"><?= $total_pages; ?></a></li>
|
||||
<?php endif; ?>
|
||||
<li class="page-item <?= $page >= $total_pages ? 'disabled' : ''; ?>">
|
||||
<a class="page-link" href="/campaign_alerts?page=<?= $page + 1; ?><?= $qs; ?>">»</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
<?php for ( $i = $start_p; $i <= $end_p; $i++ ): ?>
|
||||
<li class="page-item <?= $i === $page ? 'active' : ''; ?>">
|
||||
<a class="page-link" href="/campaign_alerts?page=<?= $i; ?><?= $qs; ?>"><?= $i; ?></a>
|
||||
</li>
|
||||
<?php endfor; ?>
|
||||
<?php if ( $end_p < $total_pages ): ?>
|
||||
<?php if ( $end_p < $total_pages - 1 ): ?>
|
||||
<li class="page-item disabled"><span class="page-link">...</span></li>
|
||||
<?php endif; ?>
|
||||
<li class="page-item"><a class="page-link" href="/campaign_alerts?page=<?= $total_pages; ?><?= $qs; ?>"><?= $total_pages; ?></a></li>
|
||||
<?php endif; ?>
|
||||
<li class="page-item <?= $page >= $total_pages ? 'disabled' : ''; ?>">
|
||||
<a class="page-link" href="/campaign_alerts?page=<?= $page + 1; ?><?= $qs; ?>">»</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
$( function()
|
||||
{
|
||||
var form = $( '#campaign_alerts_bulk_form' );
|
||||
var select_all = $( '#alerts_select_all' );
|
||||
var row_checkboxes = form.find( '.alert-select-row' );
|
||||
var delete_button = $( '#delete_selected_alerts_btn' );
|
||||
var selected_count = $( '#selected_alerts_count' );
|
||||
|
||||
function update_selected_state()
|
||||
{
|
||||
var checked = row_checkboxes.filter( ':checked' ).length;
|
||||
var all = row_checkboxes.length;
|
||||
|
||||
selected_count.text( checked );
|
||||
delete_button.prop( 'disabled', checked === 0 );
|
||||
|
||||
if ( all === 0 )
|
||||
{
|
||||
select_all.prop( 'checked', false );
|
||||
select_all.prop( 'indeterminate', false );
|
||||
return;
|
||||
}
|
||||
|
||||
select_all.prop( 'checked', checked === all );
|
||||
select_all.prop( 'indeterminate', checked > 0 && checked < all );
|
||||
}
|
||||
|
||||
select_all.on( 'change', function()
|
||||
{
|
||||
row_checkboxes.prop( 'checked', this.checked );
|
||||
update_selected_state();
|
||||
} );
|
||||
|
||||
row_checkboxes.on( 'change', function()
|
||||
{
|
||||
update_selected_state();
|
||||
} );
|
||||
|
||||
form.on( 'submit', function( e )
|
||||
{
|
||||
var checked = row_checkboxes.filter( ':checked' ).length;
|
||||
|
||||
if ( checked === 0 )
|
||||
{
|
||||
e.preventDefault();
|
||||
return;
|
||||
}
|
||||
|
||||
if ( !confirm( 'Czy na pewno usunac zaznaczone alerty (' + checked + ')?' ) )
|
||||
{
|
||||
e.preventDefault();
|
||||
}
|
||||
} );
|
||||
|
||||
update_selected_state();
|
||||
} );
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user