feat: Dodaj moduł grup i fraz, oznaczanie wykluczonych na czerwono, CLAUDE.md

- Nowy moduł CampaignTerms z widokiem grup reklam, fraz wyszukiwanych i fraz wykluczających
- Frazy wyszukiwane dodane do wykluczonych oznaczane czerwonym kolorem w tabeli
- Instalator migracji (install.php) z obsługą schema_migrations
- Migracja 003 dla tabel campaign_ad_groups, campaign_search_terms, campaign_negative_keywords
- CLAUDE.md z dokumentacją architektury projektu
- Aktualizacja layoutu, stylów i konfiguracji

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 23:44:30 +01:00
parent 59c086384b
commit 5e491d626c
23 changed files with 4739 additions and 251 deletions

View File

@@ -0,0 +1,762 @@
<div class="campaigns-page campaign-terms-page">
<div class="campaigns-header">
<h2><i class="fa-solid fa-list-check"></i> Grupy i frazy</h2>
</div>
<div class="campaigns-filters">
<div class="filter-group">
<label for="terms_client_id"><i class="fa-solid fa-building"></i> Klient</label>
<select id="terms_client_id" name="terms_client_id" class="form-control">
<option value="">- wybierz klienta -</option>
<?php foreach ( $this -> clients as $client ): ?>
<option value="<?= $client['id']; ?>"><?= htmlspecialchars( $client['name'] ); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="filter-group">
<label for="terms_campaign_id"><i class="fa-solid fa-bullhorn"></i> Kampania</label>
<select id="terms_campaign_id" name="terms_campaign_id" class="form-control">
<option value="">- wybierz kampanie -</option>
</select>
</div>
<div class="filter-group">
<label for="terms_ad_group_id"><i class="fa-solid fa-layer-group"></i> Grupa reklam</label>
<select id="terms_ad_group_id" name="terms_ad_group_id" class="form-control">
<option value="">- wszystkie grupy -</option>
</select>
</div>
<div class="filter-group">
<label for="phrase_search"><i class="fa-solid fa-magnifying-glass"></i> Szukaj frazy</label>
<input type="text" id="phrase_search" class="form-control" placeholder="Wpisz fragment frazy..." />
</div>
</div>
<div class="campaign-terms-wrap">
<div class="campaigns-extra-card terms-card terms-adgroups-card">
<div class="campaigns-extra-card-title">
<i class="fa-solid fa-layer-group"></i> Grupy reklam
</div>
<div class="campaigns-extra-table-wrap">
<table class="table table-sm campaigns-extra-table" id="terms_ad_groups_table">
<thead>
<tr>
<th>Grupa reklam</th>
<th>Klik. 30d</th>
<th>Koszt 30d</th>
<th>Wartosc 30d</th>
<th>ROAS 30d</th>
<th>Klik. all</th>
<th>Koszt all</th>
<th>Wartosc all</th>
<th>ROAS all</th>
</tr>
</thead>
<tbody>
<tr><td colspan="9" class="campaigns-empty-row">Wybierz klienta i kampanie.</td></tr>
</tbody>
</table>
</div>
</div>
<div class="campaigns-extra-card terms-card terms-search-card">
<div class="campaigns-extra-card-title">
<i class="fa-solid fa-magnifying-glass"></i> Frazy wyszukiwane (klikniecia >= 1)
</div>
<div class="campaigns-extra-table-wrap">
<table class="table table-sm campaigns-extra-table" id="terms_search_table">
<thead>
<tr>
<th>Fraza</th>
<th>Grupa reklam</th>
<th>Klik. 30d</th>
<th>Koszt 30d</th>
<th>Wartosc 30d</th>
<th>ROAS 30d</th>
<th>Klik. all</th>
<th>Koszt all</th>
<th>Wartosc all</th>
<th>ROAS all</th>
<th>Akcja</th>
</tr>
</thead>
<tbody>
<tr><td colspan="11" class="campaigns-empty-row">Brak danych.</td></tr>
</tbody>
</table>
</div>
</div>
<div class="campaigns-extra-card terms-card terms-negative-card">
<div class="campaigns-extra-card-title">
<i class="fa-solid fa-ban"></i> Frazy wykluczajace
</div>
<div class="campaigns-extra-table-wrap">
<table class="table table-sm campaigns-extra-table" id="terms_negative_table">
<thead>
<tr>
<th>Poziom</th>
<th>Fraza</th>
<th>Match type</th>
</tr>
</thead>
<tbody>
<tr><td colspan="3" class="campaigns-empty-row">Brak danych.</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<style>
.campaign-terms-wrap {
display: flex;
flex-direction: column;
gap: 20px;
margin-top: 20px;
}
.campaign-terms-page .campaigns-filters {
flex-wrap: wrap;
}
.campaign-terms-page .campaigns-filters .filter-group {
min-width: 220px;
}
.campaign-terms-page {
max-width: 100%;
overflow: hidden;
}
.campaigns-extra-card {
background: #FFFFFF;
border-radius: 10px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
overflow: hidden;
}
.campaigns-extra-card-title {
padding: 14px 16px;
border-bottom: 1px solid #E2E8F0;
font-size: 13px;
font-weight: 700;
color: #334155;
display: flex;
align-items: center;
gap: 8px;
}
.campaigns-extra-table-wrap {
overflow: auto;
}
.campaigns-extra-table {
margin: 0;
width: 100%;
table-layout: fixed;
}
.campaigns-extra-table thead th {
position: sticky;
top: 0;
z-index: 2;
background: #F8FAFC;
border-bottom: 1px solid #E2E8F0;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .4px;
color: #64748B;
padding: 10px 12px;
white-space: nowrap;
}
.campaigns-extra-table tbody td {
padding: 9px 12px;
border-bottom: 1px solid #F1F5F9;
font-size: 13px;
color: #334155;
vertical-align: middle;
white-space: nowrap;
}
.campaigns-extra-table td.num-cell {
text-align: right;
white-space: nowrap;
}
.campaigns-extra-table td.text-cell {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.campaigns-extra-table th.phrase-nowrap,
.campaigns-extra-table td.phrase-nowrap {
white-space: nowrap !important;
overflow: hidden;
text-overflow: ellipsis;
}
.campaigns-extra-table .terms-add-negative-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border-radius: 6px;
border: 1px solid #E2E8F0;
background: #EEF2FF;
color: #3B82F6;
cursor: pointer;
transition: all 0.2s;
}
.campaigns-extra-table .terms-add-negative-btn:hover {
background: #3B82F6;
color: #FFFFFF;
border-color: #3B82F6;
}
.campaigns-extra-table tbody tr:hover {
background: #F8FAFC;
}
.campaigns-extra-table tbody tr.term-is-negative td {
color: #DC2626;
}
.campaigns-extra-table tbody tr.term-is-negative:hover {
background: #FEF2F2;
}
.campaigns-empty-row {
text-align: center;
color: #94A3B8 !important;
font-style: italic;
}
.campaign-terms-page .dt-layout-row:first-child {
display: none;
}
.campaign-terms-page .dt-layout-row {
padding: 10px 12px;
margin: 0 !important;
border-top: 1px solid #F1F5F9;
}
.campaign-terms-page .dt-info {
font-size: 12px;
color: #64748B;
}
.campaign-terms-page .dt-paging .pagination {
margin: 0;
padding: 0;
list-style: none !important;
display: flex;
align-items: center;
gap: 6px;
}
.campaign-terms-page .dt-paging .pagination .page-item {
list-style: none !important;
}
.campaign-terms-page .dt-paging .pagination .page-item .page-link {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 36px;
width: fit-content;
height: 32px;
padding: 0 12px;
border-radius: 6px;
font-size: 12px;
font-weight: 500;
border: 1px solid #E2E8F0;
background: #FFFFFF;
color: #4E5E6A;
text-decoration: none;
line-height: 1;
white-space: nowrap;
}
.campaign-terms-page .dt-paging .pagination .page-item.previous .page-link,
.campaign-terms-page .dt-paging .pagination .page-item.next .page-link {
min-width: 72px;
}
.campaign-terms-page .dt-paging .pagination .page-item .page-link:hover {
background: #EEF2FF;
color: #6690F4;
border-color: #6690F4;
}
.campaign-terms-page .dt-paging .pagination .page-item.active .page-link {
background: #6690F4;
color: #FFFFFF;
border-color: #6690F4;
}
.campaign-terms-page .dt-paging .pagination .page-item.disabled .page-link {
opacity: 0.35;
cursor: default;
pointer-events: none;
}
</style>
<script type="text/javascript">
var terms_ad_groups_table = null;
var terms_search_table = null;
var terms_negative_table = null;
var TERMS_STORAGE_CLIENT = 'campaign_terms.last_client_id';
var TERMS_STORAGE_CAMPAIGN = 'campaign_terms.last_campaign_id';
var TERMS_STORAGE_AD_GROUP = 'campaign_terms.last_ad_group_id';
function terms_storage_set( key, value )
{
try
{
if ( value === null || value === undefined || value === '' )
localStorage.removeItem( key );
else
localStorage.setItem( key, String( value ) );
}
catch ( e ) {}
}
function terms_storage_get( key )
{
try
{
return localStorage.getItem( key ) || '';
}
catch ( e )
{
return '';
}
}
function format_num( value, digits )
{
var n = Number( value || 0 );
return n.toLocaleString( 'pl-PL', {
minimumFractionDigits: digits || 0,
maximumFractionDigits: digits || 0
} );
}
function destroy_table_if_exists( selector )
{
if ( $.fn.DataTable.isDataTable( selector ) )
{
$( selector ).DataTable().destroy();
$( selector + ' tbody' ).empty();
}
}
function build_ad_groups_table( rows )
{
destroy_table_if_exists( '#terms_ad_groups_table' );
terms_ad_groups_table = new DataTable( '#terms_ad_groups_table', {
data: rows || [],
processing: false,
serverSide: false,
autoWidth: false,
searching: false,
lengthChange: false,
pageLength: 15,
pagingType: 'simple_numbers',
order: [],
columns: [
{ data: 'ad_group_name', defaultContent: '' },
{ data: 'clicks_30', render: function( data, type ){ return type === 'display' ? format_num( data, 0 ) : Number( data || 0 ); } },
{ data: 'cost_30', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'conversion_value_30', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'roas_30', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) + '%' : Number( data || 0 ); } },
{ data: 'clicks_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 0 ) : Number( data || 0 ); } },
{ data: 'cost_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'conversion_value_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'roas_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) + '%' : Number( data || 0 ); } }
],
columnDefs: [
{ targets: 0, className: 'text-cell' },
{ targets: [1,5], className: 'num-cell', width: '80px' },
{ targets: [2,3,6,7], className: 'num-cell', width: '90px' },
{ targets: [4,8], className: 'num-cell', width: '85px' }
],
language: {
emptyTable: 'Brak danych do wyswietlenia',
info: 'Wpisy _START_ - _END_ z _TOTAL_',
paginate: { next: 'Dalej', previous: 'Wstecz' }
}
});
}
function build_search_terms_table( rows, negative_keywords )
{
destroy_table_if_exists( '#terms_search_table' );
var negative_set = {};
( negative_keywords || [] ).forEach( function( nk ) {
negative_set[ String( nk.keyword_text || '' ).toLowerCase().trim() ] = true;
});
terms_search_table = new DataTable( '#terms_search_table', {
data: rows || [],
processing: false,
serverSide: false,
autoWidth: false,
searching: true,
lengthChange: false,
pageLength: 15,
pagingType: 'simple_numbers',
order: [],
columns: [
{ data: 'search_term', defaultContent: '', width: '340px' },
{ data: 'ad_group_name', defaultContent: '', width: '360px' },
{ data: 'clicks_30', render: function( data, type ){ return type === 'display' ? format_num( data, 0 ) : Number( data || 0 ); } },
{ data: 'cost_30', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'conversion_value_30', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'roas_30', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) + '%' : Number( data || 0 ); } },
{ data: 'clicks_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 0 ) : Number( data || 0 ); } },
{ data: 'cost_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'conversion_value_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) : Number( data || 0 ); } },
{ data: 'roas_all_time', render: function( data, type ){ return type === 'display' ? format_num( data, 2 ) + '%' : Number( data || 0 ); } },
{ data: 'id', orderable: false, searchable: false, render: function( data, type, row ) {
if ( type !== 'display' ) return data;
return '<button type="button" class="terms-add-negative-btn" data-search-term-id="' + row.id + '" title="Dodaj do wykluczajacych"><i class="fa-solid fa-ban"></i></button>';
} }
],
columnDefs: [
{ targets: 0, className: 'text-cell phrase-nowrap', width: '220px' },
{ targets: 1, className: 'text-cell' },
{ targets: [2,6], className: 'num-cell', width: '70px' },
{ targets: [3,4,7,8], className: 'num-cell', width: '85px' },
{ targets: [5,9], className: 'num-cell', width: '80px' },
{ targets: 10, className: 'dt-center', width: '50px' }
],
createdRow: function( row, data ) {
var term = String( data.search_term || '' ).toLowerCase().trim();
if ( negative_set[ term ] )
{
$( row ).addClass( 'term-is-negative' );
}
},
language: {
emptyTable: 'Brak danych do wyswietlenia',
info: 'Wpisy _START_ - _END_ z _TOTAL_',
paginate: { next: 'Dalej', previous: 'Wstecz' }
}
});
var q = $( '#phrase_search' ).val();
terms_search_table.search( q ).draw();
}
function build_negative_terms_table( rows )
{
destroy_table_if_exists( '#terms_negative_table' );
terms_negative_table = new DataTable( '#terms_negative_table', {
data: rows || [],
processing: false,
serverSide: false,
autoWidth: false,
searching: true,
lengthChange: false,
pageLength: 15,
pagingType: 'simple_numbers',
order: [],
columns: [
{ data: 'scope', render: function( data, type, row ) {
var scope = data === 'ad_group' ? 'Ad group' : 'Kampania';
if ( data === 'ad_group' && row.ad_group_name )
scope = 'Ad group: ' + row.ad_group_name;
return scope;
} },
{ data: 'keyword_text', defaultContent: '', width: '340px' },
{ data: 'match_type', defaultContent: '' }
],
columnDefs: [
{ targets: 0, className: 'text-cell' },
{ targets: 1, className: 'text-cell phrase-nowrap' },
{ targets: 2, width: '120px' }
],
language: {
emptyTable: 'Brak danych do wyswietlenia',
info: 'Wpisy _START_ - _END_ z _TOTAL_',
paginate: { next: 'Dalej', previous: 'Wstecz' }
}
});
var q = $( '#phrase_search' ).val();
terms_negative_table.search( q ).draw();
}
function reset_all_tables()
{
build_ad_groups_table( [] );
build_search_terms_table( [] );
build_negative_terms_table( [] );
}
function load_phrase_tables()
{
var campaign_id = $( '#terms_campaign_id' ).val();
var ad_group_id = $( '#terms_ad_group_id' ).val();
if ( !campaign_id )
{
reset_all_tables();
return;
}
$.ajax({
url: '/campaign_terms/get_campaign_phrase_details/',
type: 'POST',
data: {
campaign_id: campaign_id,
ad_group_id: ad_group_id
},
success: function( response )
{
var data = JSON.parse( response );
var negative_keywords = data.negative_keywords || [];
build_search_terms_table( data.search_terms || [], negative_keywords );
build_negative_terms_table( negative_keywords );
}
});
}
function load_ad_groups()
{
var campaign_id = $( '#terms_campaign_id' ).val();
var $ad_group_select = $( '#terms_ad_group_id' );
var saved_ad_group_id = terms_storage_get( TERMS_STORAGE_AD_GROUP );
$ad_group_select.empty();
$ad_group_select.append( '<option value="">- wszystkie grupy -</option>' );
if ( !campaign_id )
{
build_ad_groups_table( [] );
load_phrase_tables();
return;
}
$.ajax({
url: '/campaign_terms/get_campaign_ad_groups/',
type: 'POST',
data: { campaign_id: campaign_id },
success: function( response )
{
var data = JSON.parse( response );
var ad_groups = data.ad_groups || [];
build_ad_groups_table( ad_groups );
ad_groups.forEach( function( row ) {
$ad_group_select.append( '<option value="' + row.id + '">' + row.ad_group_name + '</option>' );
});
if ( saved_ad_group_id && $ad_group_select.find( 'option[value="' + saved_ad_group_id + '"]' ).length )
{
$ad_group_select.val( saved_ad_group_id );
}
load_phrase_tables();
}
});
}
function load_campaigns_for_client( restore_campaign_id )
{
var client_id = $( '#terms_client_id' ).val();
var $campaign_select = $( '#terms_campaign_id' );
$campaign_select.empty();
$campaign_select.append( '<option value="">- wybierz kampanie -</option>' );
if ( !client_id )
{
$( '#terms_ad_group_id' ).val( '' );
reset_all_tables();
return;
}
$.ajax({
url: '/campaign_terms/get_campaigns_list/client_id=' + client_id,
type: 'GET',
success: function( response )
{
var data = JSON.parse( response );
var campaigns = Object.entries( data.campaigns || {} );
campaigns.sort( function( a, b ) {
var nameA = String( ( a[1] && a[1].campaign_name ) ? a[1].campaign_name : '' ).toLowerCase();
var nameB = String( ( b[1] && b[1].campaign_name ) ? b[1].campaign_name : '' ).toLowerCase();
if ( nameA === '--- konto ---' ) return -1;
if ( nameB === '--- konto ---' ) return 1;
if ( nameA > nameB ) return 1;
if ( nameA < nameB ) return -1;
return 0;
});
campaigns.forEach( function( pair ) {
var value = pair[1];
$campaign_select.append( '<option value="' + value.id + '">' + value.campaign_name + '</option>' );
});
if ( restore_campaign_id && $campaign_select.find( 'option[value="' + restore_campaign_id + '"]' ).length )
{
$campaign_select.val( restore_campaign_id );
}
load_ad_groups();
}
});
}
$( function()
{
$( 'body' ).on( 'change', '#terms_client_id', function()
{
var client_id = $( this ).val();
terms_storage_set( TERMS_STORAGE_CLIENT, client_id );
terms_storage_set( TERMS_STORAGE_CAMPAIGN, '' );
terms_storage_set( TERMS_STORAGE_AD_GROUP, '' );
load_campaigns_for_client( '' );
});
$( 'body' ).on( 'change', '#terms_campaign_id', function()
{
var campaign_id = $( this ).val();
terms_storage_set( TERMS_STORAGE_CAMPAIGN, campaign_id );
terms_storage_set( TERMS_STORAGE_AD_GROUP, '' );
$( '#terms_ad_group_id' ).val( '' );
load_ad_groups();
});
$( 'body' ).on( 'change', '#terms_ad_group_id', function()
{
terms_storage_set( TERMS_STORAGE_AD_GROUP, $( this ).val() );
load_phrase_tables();
});
$( 'body' ).on( 'click', '.terms-add-negative-btn', function()
{
var search_term_id = $( this ).data( 'search-term-id' );
$.confirm({
title: 'Dodaj do wykluczajacych',
columnClass: 'col-md-4 col-md-offset-4',
content:
'<div class="form-group" style="margin-bottom:10px;">' +
'<label for="negative_scope" style="display:block;margin-bottom:6px;">Poziom wykluczenia</label>' +
'<select id="negative_scope" class="form-control">' +
'<option value="campaign" selected>Kampania (zalecane)</option>' +
'<option value="ad_group">Grupa reklam</option>' +
'</select>' +
'<small style="display:block;margin-top:6px;color:#64748B;">Kampania = widoczne w wykluczeniach kampanii. Grupa reklam = tylko w tej grupie.</small>' +
'</div>' +
'<div class="form-group" style="margin-bottom:0;">' +
'<label for="negative_match_type" style="display:block;margin-bottom:6px;">Typ dopasowania</label>' +
'<select id="negative_match_type" class="form-control">' +
'<option value="PHRASE" selected>Dopasowanie do wyrazenia</option>' +
'<option value="EXACT">Dopasowanie scisle</option>' +
'<option value="BROAD">Dopasowanie przyblizone</option>' +
'</select>' +
'</div>',
type: 'blue',
buttons: {
confirm: {
text: 'Zapisz',
btnClass: 'btn-blue',
action: function()
{
var match_type = this.$content.find( '#negative_match_type' ).val() || 'PHRASE';
var scope = this.$content.find( '#negative_scope' ).val() || 'campaign';
var modal = this;
modal.showLoading( true );
$.ajax({
url: '/campaign_terms/add_negative_keyword/',
type: 'POST',
data: {
search_term_id: search_term_id,
match_type: match_type,
scope: scope
},
success: function( response )
{
var data = JSON.parse( response );
modal.close();
if ( data.success )
{
var debugHtml = '';
if ( data.debug )
{
debugHtml = '<hr style="margin:10px 0;">' +
'<div style="font-size:11px;color:#666;text-align:left;">' +
'<strong>Debug:</strong><br>' +
'Customer ID: ' + ( data.debug.customer_id || 'brak' ) + '<br>' +
'Campaign ID: ' + ( data.debug.campaign_external_id || 'brak' ) + '<br>' +
'Ad Group ID: ' + ( data.debug.ad_group_external_id || 'brak' ) + '<br>' +
'Scope: ' + ( data.debug.scope || 'brak' ) + '<br>' +
'Keyword: ' + ( data.debug.keyword_text || 'brak' ) + '<br>' +
'API response: <pre style="font-size:10px;max-height:120px;overflow:auto;background:#f5f5f5;padding:6px;margin-top:4px;">' + JSON.stringify( data.debug.api_response, null, 2 ) + '</pre>' +
'Verification: <pre style="font-size:10px;max-height:120px;overflow:auto;background:#f5f5f5;padding:6px;margin-top:4px;">' + JSON.stringify( data.debug.verification, null, 2 ) + '</pre>' +
'</div>';
}
var successDialog = $.alert({
title: 'Sukces',
columnClass: 'col-md-4 col-md-offset-4',
content: ( data.message || 'Fraza zostala dodana do wykluczajacych.' )
+ '<br><small style="display:block;margin-top:8px;color:#64748B;">Zmiana moze byc widoczna w panelu Google Ads po 1-3 minutach.</small>'
+ debugHtml,
type: 'green'
});
setTimeout( function() { successDialog.close(); }, 10000 );
load_phrase_tables();
}
else
{
var debugHtml = '';
if ( data.debug )
{
debugHtml = '<hr style="margin:10px 0;">' +
'<div style="font-size:11px;color:#666;text-align:left;">' +
'<strong>Debug:</strong><pre style="font-size:10px;max-height:150px;overflow:auto;background:#f5f5f5;padding:6px;">' + JSON.stringify( data.debug, null, 2 ) + '</pre>' +
'</div>';
}
$.alert({
title: 'Blad',
columnClass: 'col-md-4 col-md-offset-4',
content: ( data.message || 'Nie udalo sie dodac frazy.' ) + ( data.error ? '<br><small>' + data.error + '</small>' : '' ) + debugHtml,
type: 'red'
});
}
},
error: function()
{
modal.close();
$.alert({
title: 'Blad',
columnClass: 'col-md-4 col-md-offset-4',
content: 'Blad komunikacji z serwerem.',
type: 'red'
});
}
});
return false;
}
},
cancel: { text: 'Anuluj' }
}
});
});
$( 'body' ).on( 'input', '#phrase_search', function()
{
var q = $( this ).val();
if ( terms_search_table )
terms_search_table.search( q ).draw();
if ( terms_negative_table )
terms_negative_table.search( q ).draw();
});
reset_all_tables();
var saved_client_id = terms_storage_get( TERMS_STORAGE_CLIENT );
var saved_campaign_id = terms_storage_get( TERMS_STORAGE_CAMPAIGN );
if ( saved_client_id && $( '#terms_client_id option[value="' + saved_client_id + '"]' ).length )
{
$( '#terms_client_id' ).val( saved_client_id );
load_campaigns_for_client( saved_campaign_id );
}
});
</script>