- Changed font from Open Sans to Roboto in layout files. - Added campaign and ad group filters in products main view. - Enhanced product history to include campaign and ad group IDs. - Updated migrations to support new campaign and ad group dimensions in product statistics. - Introduced new migration files for managing campaign types and dropping obsolete columns.
1392 lines
44 KiB
PHP
1392 lines
44 KiB
PHP
<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 class="filter-group terms-columns-group">
|
|
<label><i class="fa-solid fa-table-columns"></i> Kolumny</label>
|
|
<div class="terms-columns-box">
|
|
<details class="terms-columns-control">
|
|
<summary>Grupy reklam</summary>
|
|
<div class="terms-columns-list" id="terms_columns_list_ad_groups"></div>
|
|
</details>
|
|
<details class="terms-columns-control">
|
|
<summary>Frazy wyszukiwane</summary>
|
|
<div class="terms-columns-list" id="terms_columns_list_search"></div>
|
|
</details>
|
|
<details class="terms-columns-control">
|
|
<summary>Frazy wykluczajace</summary>
|
|
<div class="terms-columns-list" id="terms_columns_list_negative"></div>
|
|
</details>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="campaign-terms-wrap">
|
|
<div class="campaigns-extra-card terms-card terms-adgroups-card">
|
|
<div class="campaigns-extra-card-title">
|
|
<span class="terms-card-title-label"><i class="fa-solid fa-layer-group"></i> Grupy reklam</span>
|
|
<button type="button" id="terms_adgroups_toggle" class="terms-card-toggle" title="Zwin tabele grup reklam" aria-label="Zwin tabele grup reklam" aria-expanded="true">
|
|
<i class="fa-solid fa-chevron-up"></i>
|
|
</button>
|
|
</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="terms-search-toolbar">
|
|
<label class="terms-search-toolbar-label"><i class="fa-solid fa-filter"></i> Klik. all</label>
|
|
<input type="number" id="terms_min_clicks_all" class="form-control" min="0" step="1" placeholder=">= np. 100" />
|
|
<input type="number" id="terms_max_clicks_all" class="form-control" min="0" step="1" placeholder="<= np. 500" />
|
|
</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. all</th>
|
|
<th>Koszt all</th>
|
|
<th>Wartosc all</th>
|
|
<th>ROAS all</th>
|
|
<th>Klik. 30d</th>
|
|
<th>Koszt 30d</th>
|
|
<th>Wartosc 30d</th>
|
|
<th>ROAS 30d</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 .campaigns-filters .filter-group.terms-columns-group {
|
|
min-width: 280px;
|
|
}
|
|
.terms-columns-box {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
.terms-columns-control {
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 6px;
|
|
background: #FFFFFF;
|
|
overflow: hidden;
|
|
}
|
|
.terms-columns-control summary {
|
|
cursor: pointer;
|
|
padding: 8px 10px;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
color: #334155;
|
|
list-style: none;
|
|
}
|
|
.terms-columns-control summary::-webkit-details-marker {
|
|
display: none;
|
|
}
|
|
.terms-columns-control summary::after {
|
|
content: '\25BC';
|
|
float: right;
|
|
font-size: 10px;
|
|
color: #64748B;
|
|
margin-top: 2px;
|
|
}
|
|
.terms-columns-control[open] summary::after {
|
|
content: '\25B2';
|
|
}
|
|
.terms-columns-list {
|
|
border-top: 1px solid #EEF2F7;
|
|
padding: 8px 10px;
|
|
max-height: 180px;
|
|
overflow-y: auto;
|
|
}
|
|
.terms-columns-list .terms-col-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
font-size: 12px;
|
|
color: #334155;
|
|
margin-bottom: 6px;
|
|
}
|
|
.terms-columns-list .terms-col-item:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
.terms-columns-list .terms-col-item input[type=checkbox] {
|
|
margin: 0;
|
|
}
|
|
.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-card-title .terms-card-title-label {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
.campaign-terms-page .terms-card-toggle {
|
|
margin-left: auto;
|
|
width: 28px;
|
|
height: 28px;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 6px;
|
|
background: #FFFFFF;
|
|
color: #475569;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
transition: all 0.2s;
|
|
}
|
|
.campaign-terms-page .terms-card-toggle:hover {
|
|
background: #F8FAFC;
|
|
border-color: #CBD5E1;
|
|
}
|
|
.campaign-terms-page .terms-adgroups-card.is-collapsed .campaigns-extra-table-wrap {
|
|
display: none;
|
|
}
|
|
.campaign-terms-page .terms-search-toolbar {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
padding: 10px 12px;
|
|
border-bottom: 1px solid #EEF2F7;
|
|
background: #FFFFFF;
|
|
}
|
|
.campaign-terms-page .terms-search-toolbar label {
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
color: #475569;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
margin: 0;
|
|
white-space: nowrap;
|
|
}
|
|
.campaign-terms-page .terms-search-toolbar .terms-search-toolbar-label {
|
|
min-width: 86px;
|
|
}
|
|
.campaign-terms-page .terms-search-toolbar #terms_min_clicks_all,
|
|
.campaign-terms-page .terms-search-toolbar #terms_max_clicks_all {
|
|
width: 160px;
|
|
height: 32px;
|
|
}
|
|
.campaigns-extra-table-wrap {
|
|
overflow: auto;
|
|
}
|
|
.campaigns-extra-table {
|
|
margin: 0;
|
|
width: 100%;
|
|
table-layout: fixed;
|
|
}
|
|
.campaign-terms-page table.campaigns-extra-table > thead > tr > th {
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 2;
|
|
background-color: #111827 !important;
|
|
color: #E5E7EB !important;
|
|
border-bottom: 1px solid #0B1220 !important;
|
|
font-size: 12px;
|
|
font-weight: 700;
|
|
text-transform: uppercase;
|
|
letter-spacing: .4px;
|
|
padding: 10px 12px;
|
|
white-space: nowrap;
|
|
}
|
|
.campaign-terms-page #terms_search_table thead th .dt-column-order,
|
|
.campaign-terms-page #terms_negative_table thead th .dt-column-order {
|
|
display: none !important;
|
|
}
|
|
.campaign-terms-page #terms_search_table thead th.dt-orderable-asc,
|
|
.campaign-terms-page #terms_search_table thead th.dt-orderable-desc,
|
|
.campaign-terms-page #terms_negative_table thead th.dt-orderable-asc,
|
|
.campaign-terms-page #terms_negative_table thead th.dt-orderable-desc {
|
|
cursor: pointer;
|
|
padding-right: 34px;
|
|
overflow: hidden;
|
|
}
|
|
.campaign-terms-page #terms_search_table thead th .dt-column-title,
|
|
.campaign-terms-page #terms_negative_table thead th .dt-column-title {
|
|
display: block;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
padding-right: 2px;
|
|
}
|
|
.campaign-terms-page #terms_search_table thead th.dt-orderable-asc::after,
|
|
.campaign-terms-page #terms_search_table thead th.dt-orderable-desc::after,
|
|
.campaign-terms-page #terms_negative_table thead th.dt-orderable-asc::after,
|
|
.campaign-terms-page #terms_negative_table thead th.dt-orderable-desc::after {
|
|
content: '\2195';
|
|
position: absolute;
|
|
right: 10px;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
width: 16px;
|
|
height: 16px;
|
|
border-radius: 999px;
|
|
font-size: 12px;
|
|
font-weight: 700;
|
|
line-height: 16px;
|
|
text-align: center;
|
|
color: #E5E7EB;
|
|
background: #374151;
|
|
}
|
|
.campaign-terms-page #terms_search_table thead th.dt-ordering-asc::after,
|
|
.campaign-terms-page #terms_negative_table thead th.dt-ordering-asc::after,
|
|
.campaign-terms-page #terms_search_table thead th[aria-sort="ascending"]::after,
|
|
.campaign-terms-page #terms_negative_table thead th[aria-sort="ascending"]::after {
|
|
content: '\25B2';
|
|
color: #FFFFFF;
|
|
background: #2563EB;
|
|
}
|
|
.campaign-terms-page #terms_search_table thead th.dt-ordering-desc::after,
|
|
.campaign-terms-page #terms_negative_table thead th.dt-ordering-desc::after,
|
|
.campaign-terms-page #terms_search_table thead th[aria-sort="descending"]::after,
|
|
.campaign-terms-page #terms_negative_table thead th[aria-sort="descending"]::after {
|
|
content: '\25BC';
|
|
color: #FFFFFF;
|
|
background: #2563EB;
|
|
}
|
|
.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';
|
|
var TERMS_STORAGE_SEARCH_TABLE_PAGE_PREFIX = 'campaign_terms.search_table_page.';
|
|
var TERMS_STORAGE_NEGATIVE_TABLE_PAGE_PREFIX = 'campaign_terms.negative_table_page.';
|
|
var TERMS_STORAGE_COLUMNS_PREFIX = 'campaign_terms.columns.';
|
|
var TERMS_STORAGE_AD_GROUPS_COLLAPSED = 'campaign_terms.ad_groups_collapsed';
|
|
var TERMS_STORAGE_MIN_CLICKS_ALL = 'campaign_terms.min_clicks_all';
|
|
var TERMS_STORAGE_MAX_CLICKS_ALL = 'campaign_terms.max_clicks_all';
|
|
|
|
var terms_search_filter_registered = false;
|
|
|
|
var TERMS_COLUMNS_LABELS = {
|
|
ad_groups: [
|
|
'Grupa reklam',
|
|
'Klik. 30d',
|
|
'Koszt 30d',
|
|
'Wartosc 30d',
|
|
'ROAS 30d',
|
|
'Klik. all',
|
|
'Koszt all',
|
|
'Wartosc all',
|
|
'ROAS all'
|
|
],
|
|
search: [
|
|
'Fraza',
|
|
'Grupa reklam',
|
|
'Klik. all',
|
|
'Koszt all',
|
|
'Wartosc all',
|
|
'ROAS all',
|
|
'Klik. 30d',
|
|
'Koszt 30d',
|
|
'Wartosc 30d',
|
|
'ROAS 30d',
|
|
'Akcja'
|
|
],
|
|
negative: [
|
|
'Poziom',
|
|
'Fraza',
|
|
'Match type'
|
|
]
|
|
};
|
|
|
|
var TERMS_COLUMNS_LIST_SELECTORS = {
|
|
ad_groups: '#terms_columns_list_ad_groups',
|
|
search: '#terms_columns_list_search',
|
|
negative: '#terms_columns_list_negative'
|
|
};
|
|
|
|
var TERMS_COLUMNS_TABLE_SELECTORS = {
|
|
ad_groups: '#terms_ad_groups_table',
|
|
search: '#terms_search_table',
|
|
negative: '#terms_negative_table'
|
|
};
|
|
|
|
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 terms_pagination_context()
|
|
{
|
|
var client_id = $( '#terms_client_id' ).val() || '0';
|
|
var campaign_id = $( '#terms_campaign_id' ).val() || '0';
|
|
var ad_group_id = $( '#terms_ad_group_id' ).val() || '0';
|
|
return [ client_id, campaign_id, ad_group_id ].join( ':' );
|
|
}
|
|
|
|
function terms_page_storage_key( table_type )
|
|
{
|
|
var prefix = table_type === 'negative' ? TERMS_STORAGE_NEGATIVE_TABLE_PAGE_PREFIX : TERMS_STORAGE_SEARCH_TABLE_PAGE_PREFIX;
|
|
return prefix + terms_pagination_context();
|
|
}
|
|
|
|
function terms_columns_storage_key( table_key )
|
|
{
|
|
if ( table_key === 'search' )
|
|
return TERMS_STORAGE_COLUMNS_PREFIX + table_key + '.v2';
|
|
|
|
return TERMS_STORAGE_COLUMNS_PREFIX + table_key;
|
|
}
|
|
|
|
function terms_get_table_instance( table_key )
|
|
{
|
|
if ( table_key === 'ad_groups' ) return terms_ad_groups_table;
|
|
if ( table_key === 'search' ) return terms_search_table;
|
|
if ( table_key === 'negative' ) return terms_negative_table;
|
|
return null;
|
|
}
|
|
|
|
function terms_get_saved_columns_visibility( table_key, columns_count )
|
|
{
|
|
var raw = terms_storage_get( terms_columns_storage_key( table_key ) );
|
|
if ( !raw )
|
|
return null;
|
|
|
|
try
|
|
{
|
|
var saved = JSON.parse( raw );
|
|
if ( !Array.isArray( saved ) || saved.length !== columns_count )
|
|
return null;
|
|
|
|
return saved.map( function( visible ) { return !!visible; } );
|
|
}
|
|
catch ( e )
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function terms_save_columns_visibility( table_key, table_instance )
|
|
{
|
|
if ( !table_instance || !table_instance.columns )
|
|
return;
|
|
|
|
var columns_count = table_instance.columns().count();
|
|
var visible_map = [];
|
|
var i = 0;
|
|
|
|
for ( i = 0; i < columns_count; i++ )
|
|
{
|
|
visible_map.push( table_instance.column( i ).visible() );
|
|
}
|
|
|
|
terms_storage_set( terms_columns_storage_key( table_key ), JSON.stringify( visible_map ) );
|
|
}
|
|
|
|
function terms_apply_saved_columns_visibility( table_key, table_instance )
|
|
{
|
|
if ( !table_instance || !table_instance.columns )
|
|
return;
|
|
|
|
var columns_count = table_instance.columns().count();
|
|
var saved_visibility = terms_get_saved_columns_visibility( table_key, columns_count );
|
|
var i = 0;
|
|
|
|
if ( !saved_visibility )
|
|
return;
|
|
|
|
for ( i = 0; i < columns_count; i++ )
|
|
{
|
|
table_instance.column( i ).visible( saved_visibility[i], false );
|
|
}
|
|
|
|
table_instance.columns.adjust().draw( false );
|
|
}
|
|
|
|
function terms_render_columns_picker( table_key, table_instance )
|
|
{
|
|
var selector = TERMS_COLUMNS_LIST_SELECTORS[table_key] || '';
|
|
var labels = TERMS_COLUMNS_LABELS[table_key] || [];
|
|
var columns_count = ( table_instance && table_instance.columns ) ? table_instance.columns().count() : 0;
|
|
var $list = $( selector );
|
|
var i = 0;
|
|
|
|
if ( !$list.length )
|
|
return;
|
|
|
|
$list.empty();
|
|
|
|
if ( !columns_count )
|
|
{
|
|
$list.append( '<div class="terms-col-item">Brak kolumn.</div>' );
|
|
return;
|
|
}
|
|
|
|
for ( i = 0; i < columns_count; i++ )
|
|
{
|
|
var label = labels[i] || ( 'Kolumna ' + ( i + 1 ) );
|
|
var checked = table_instance.column( i ).visible() ? ' checked' : '';
|
|
var id = 'terms_col_' + table_key + '_' + i;
|
|
|
|
$list.append(
|
|
'<label class="terms-col-item" for="' + id + '">' +
|
|
'<input type="checkbox" class="terms-col-toggle" id="' + id + '" data-table-key="' + table_key + '" data-col-index="' + i + '"' + checked + '>' +
|
|
'<span>' + label + '</span>' +
|
|
'</label>'
|
|
);
|
|
}
|
|
}
|
|
|
|
function terms_get_clicks_filter_value( selector )
|
|
{
|
|
var raw = $( selector ).val();
|
|
|
|
if ( raw === '' || raw === null || raw === undefined )
|
|
return null;
|
|
|
|
var n = parseInt( raw, 10 );
|
|
|
|
if ( isNaN( n ) )
|
|
return null;
|
|
|
|
if ( n < 0 )
|
|
n = 0;
|
|
|
|
return n;
|
|
}
|
|
|
|
function terms_get_min_clicks_all()
|
|
{
|
|
return terms_get_clicks_filter_value( '#terms_min_clicks_all' );
|
|
}
|
|
|
|
function terms_get_max_clicks_all()
|
|
{
|
|
return terms_get_clicks_filter_value( '#terms_max_clicks_all' );
|
|
}
|
|
|
|
function terms_register_search_filters()
|
|
{
|
|
var ext_search = null;
|
|
|
|
if ( terms_search_filter_registered )
|
|
return;
|
|
|
|
if ( $.fn.dataTable && $.fn.dataTable.ext && $.fn.dataTable.ext.search )
|
|
ext_search = $.fn.dataTable.ext.search;
|
|
else if ( typeof DataTable !== 'undefined' && DataTable.ext && DataTable.ext.search )
|
|
ext_search = DataTable.ext.search;
|
|
|
|
if ( !ext_search )
|
|
return;
|
|
|
|
ext_search.push( function( settings, data )
|
|
{
|
|
var table_id = settings && settings.nTable ? settings.nTable.id : '';
|
|
var min_clicks = terms_get_min_clicks_all();
|
|
var max_clicks = terms_get_max_clicks_all();
|
|
|
|
if ( table_id !== 'terms_search_table' )
|
|
return true;
|
|
|
|
if ( min_clicks === null && max_clicks === null )
|
|
return true;
|
|
|
|
var clicks_raw = data && data.length > 2 ? String( data[2] ) : '0';
|
|
var clicks = parseInt( clicks_raw.replace( /[^\d-]/g, '' ), 10 );
|
|
|
|
if ( isNaN( clicks ) )
|
|
clicks = 0;
|
|
|
|
if ( min_clicks !== null && clicks < min_clicks )
|
|
return false;
|
|
|
|
if ( max_clicks !== null && clicks > max_clicks )
|
|
return false;
|
|
|
|
return true;
|
|
} );
|
|
|
|
terms_search_filter_registered = true;
|
|
}
|
|
|
|
function terms_set_ad_groups_collapsed( collapsed )
|
|
{
|
|
var $card = $( '.terms-adgroups-card' );
|
|
var $toggle = $( '#terms_adgroups_toggle' );
|
|
|
|
if ( !$card.length || !$toggle.length )
|
|
return;
|
|
|
|
if ( collapsed )
|
|
{
|
|
$card.addClass( 'is-collapsed' );
|
|
$toggle.attr( 'title', 'Rozwin tabele grup reklam' );
|
|
$toggle.attr( 'aria-label', 'Rozwin tabele grup reklam' );
|
|
$toggle.attr( 'aria-expanded', 'false' );
|
|
$toggle.find( 'i' ).attr( 'class', 'fa-solid fa-chevron-down' );
|
|
}
|
|
else
|
|
{
|
|
$card.removeClass( 'is-collapsed' );
|
|
$toggle.attr( 'title', 'Zwin tabele grup reklam' );
|
|
$toggle.attr( 'aria-label', 'Zwin tabele grup reklam' );
|
|
$toggle.attr( 'aria-expanded', 'true' );
|
|
$toggle.find( 'i' ).attr( 'class', 'fa-solid fa-chevron-up' );
|
|
}
|
|
|
|
terms_storage_set( TERMS_STORAGE_AD_GROUPS_COLLAPSED, collapsed ? '1' : '0' );
|
|
}
|
|
|
|
function terms_restore_ad_groups_collapsed()
|
|
{
|
|
var saved = terms_storage_get( TERMS_STORAGE_AD_GROUPS_COLLAPSED );
|
|
terms_set_ad_groups_collapsed( saved === '1' );
|
|
}
|
|
|
|
function terms_get_saved_page( table_type )
|
|
{
|
|
var page_raw = terms_storage_get( terms_page_storage_key( table_type ) );
|
|
var page = parseInt( page_raw, 10 );
|
|
|
|
if ( isNaN( page ) || page < 0 )
|
|
return 0;
|
|
|
|
return page;
|
|
}
|
|
|
|
function terms_save_current_page( table_type, table_instance )
|
|
{
|
|
if ( !table_instance || typeof table_instance.page !== 'function' )
|
|
return;
|
|
|
|
var info = table_instance.page.info();
|
|
if ( !info )
|
|
return;
|
|
|
|
terms_storage_set( terms_page_storage_key( table_type ), info.page );
|
|
}
|
|
|
|
function terms_restore_saved_page( table_type, table_instance )
|
|
{
|
|
if ( !table_instance || typeof table_instance.page !== 'function' )
|
|
return;
|
|
|
|
var info = table_instance.page.info();
|
|
if ( !info || !info.pages )
|
|
return;
|
|
|
|
var saved_page = terms_get_saved_page( table_type );
|
|
var page_to_set = saved_page;
|
|
|
|
if ( page_to_set >= info.pages )
|
|
page_to_set = info.pages - 1;
|
|
|
|
if ( page_to_set < 0 )
|
|
page_to_set = 0;
|
|
|
|
if ( page_to_set !== info.page )
|
|
table_instance.page( page_to_set ).draw( 'page' );
|
|
}
|
|
|
|
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 apply_header_titles( selector )
|
|
{
|
|
$( selector + ' thead th' ).each( function()
|
|
{
|
|
var $th = $( this );
|
|
var title = $.trim( $th.find( '.dt-column-title' ).first().text() || $th.text() );
|
|
|
|
if ( title )
|
|
{
|
|
$th.attr( 'title', title );
|
|
$th.find( '.dt-column-title' ).attr( 'title', title );
|
|
}
|
|
} );
|
|
}
|
|
|
|
|
|
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' }
|
|
}
|
|
});
|
|
|
|
terms_apply_saved_columns_visibility( 'ad_groups', terms_ad_groups_table );
|
|
terms_render_columns_picker( 'ad_groups', terms_ad_groups_table );
|
|
}
|
|
|
|
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: [[ 2, 'desc' ]],
|
|
columns: [
|
|
{ data: 'search_term', defaultContent: '', width: '340px' },
|
|
{ data: 'ad_group_name', defaultContent: '', width: '360px' },
|
|
{ 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: '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: '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_',
|
|
search: 'Szukaj:',
|
|
paginate: { next: 'Dalej', previous: 'Wstecz' }
|
|
}
|
|
});
|
|
|
|
terms_apply_saved_columns_visibility( 'search', terms_search_table );
|
|
|
|
$( '#terms_search_table' )
|
|
.off( 'page.dt.termsPagination' )
|
|
.on( 'page.dt.termsPagination', function()
|
|
{
|
|
terms_save_current_page( 'search', terms_search_table );
|
|
} );
|
|
|
|
var q = $( '#phrase_search' ).val();
|
|
terms_search_table.search( q ).draw();
|
|
terms_restore_saved_page( 'search', terms_search_table );
|
|
apply_header_titles( '#terms_search_table' );
|
|
terms_render_columns_picker( 'search', terms_search_table );
|
|
}
|
|
|
|
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_',
|
|
search: 'Szukaj:',
|
|
paginate: { next: 'Dalej', previous: 'Wstecz' }
|
|
}
|
|
});
|
|
|
|
terms_apply_saved_columns_visibility( 'negative', terms_negative_table );
|
|
|
|
$( '#terms_negative_table' )
|
|
.off( 'page.dt.termsPagination' )
|
|
.on( 'page.dt.termsPagination', function()
|
|
{
|
|
terms_save_current_page( 'negative', terms_negative_table );
|
|
} );
|
|
|
|
var q = $( '#phrase_search' ).val();
|
|
terms_negative_table.search( q ).draw();
|
|
terms_restore_saved_page( 'negative', terms_negative_table );
|
|
apply_header_titles( '#terms_negative_table' );
|
|
terms_render_columns_picker( 'negative', terms_negative_table );
|
|
}
|
|
|
|
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()
|
|
{
|
|
terms_register_search_filters();
|
|
|
|
var saved_min_clicks_all = terms_storage_get( TERMS_STORAGE_MIN_CLICKS_ALL );
|
|
if ( saved_min_clicks_all !== '' )
|
|
$( '#terms_min_clicks_all' ).val( saved_min_clicks_all );
|
|
var saved_max_clicks_all = terms_storage_get( TERMS_STORAGE_MAX_CLICKS_ALL );
|
|
if ( saved_max_clicks_all !== '' )
|
|
$( '#terms_max_clicks_all' ).val( saved_max_clicks_all );
|
|
|
|
$( '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' );
|
|
var row_data = terms_search_table ? terms_search_table.row( $( this ).closest( 'tr' ) ).data() : null;
|
|
var selected_search_term = row_data ? String( row_data.search_term || '' ) : '';
|
|
|
|
$.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>' +
|
|
'<div class="form-group" style="margin-top:10px;margin-bottom:0;">' +
|
|
'<label for="negative_keyword_text" style="display:block;margin-bottom:6px;">Fraza wykluczajaca</label>' +
|
|
'<input id="negative_keyword_text" type="text" class="form-control" placeholder="Wpisz fraze do wykluczenia..." />' +
|
|
'<small style="display:block;margin-top:6px;color:#64748B;">Mozesz zmienic fraze przed zapisem, np. usunac jej fragment.</small>' +
|
|
'</div>',
|
|
type: 'blue',
|
|
onContentReady: function()
|
|
{
|
|
this.$content.find( '#negative_keyword_text' ).val( selected_search_term );
|
|
},
|
|
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 keyword_text = $.trim( this.$content.find( '#negative_keyword_text' ).val() || '' );
|
|
var modal = this;
|
|
|
|
if ( keyword_text === '' )
|
|
{
|
|
$.alert({
|
|
title: 'Uwaga',
|
|
columnClass: 'col-md-4 col-md-offset-4',
|
|
content: 'Wpisz fraze, ktora ma zostac dodana do wykluczajacych.',
|
|
type: 'orange'
|
|
});
|
|
return false;
|
|
}
|
|
|
|
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,
|
|
keyword_text: keyword_text
|
|
},
|
|
success: function( response )
|
|
{
|
|
var data = JSON.parse( response );
|
|
modal.close();
|
|
|
|
if ( data.success )
|
|
{
|
|
var debugHtml = '';
|
|
if ( data.debug )
|
|
{
|
|
debugHtml = '<hr style="margin:10px 0;">' +
|
|
'<details style="font-size:11px;color:#666;text-align:left;">' +
|
|
'<summary style="cursor:pointer;font-weight:700;">Debug</summary>' +
|
|
'<div style="margin-top:8px;">' +
|
|
'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>' +
|
|
'</details>';
|
|
}
|
|
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;">' +
|
|
'<details style="font-size:11px;color:#666;text-align:left;">' +
|
|
'<summary style="cursor:pointer;font-weight:700;">Debug</summary>' +
|
|
'<div style="margin-top:8px;">' +
|
|
'<pre style="font-size:10px;max-height:150px;overflow:auto;background:#f5f5f5;padding:6px;">' + JSON.stringify( data.debug, null, 2 ) + '</pre>' +
|
|
'</div>' +
|
|
'</details>';
|
|
}
|
|
$.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();
|
|
});
|
|
|
|
$( 'body' ).on( 'input change', '#terms_min_clicks_all, #terms_max_clicks_all', function()
|
|
{
|
|
terms_storage_set( TERMS_STORAGE_MIN_CLICKS_ALL, $( '#terms_min_clicks_all' ).val() );
|
|
terms_storage_set( TERMS_STORAGE_MAX_CLICKS_ALL, $( '#terms_max_clicks_all' ).val() );
|
|
if ( terms_search_table )
|
|
terms_search_table.draw();
|
|
});
|
|
|
|
$( 'body' ).on( 'change', '.terms-col-toggle', function()
|
|
{
|
|
var table_key = $( this ).data( 'table-key' );
|
|
var col_index = parseInt( $( this ).data( 'col-index' ), 10 );
|
|
var is_visible = $( this ).is( ':checked' );
|
|
var table = terms_get_table_instance( table_key );
|
|
var selector = TERMS_COLUMNS_TABLE_SELECTORS[table_key] || '';
|
|
|
|
if ( !table || isNaN( col_index ) )
|
|
return;
|
|
|
|
table.column( col_index ).visible( is_visible, false );
|
|
table.columns.adjust().draw( false );
|
|
terms_save_columns_visibility( table_key, table );
|
|
|
|
if ( selector )
|
|
apply_header_titles( selector );
|
|
});
|
|
|
|
$( 'body' ).on( 'click', '#terms_adgroups_toggle', function()
|
|
{
|
|
var was_collapsed = $( '.terms-adgroups-card' ).hasClass( 'is-collapsed' );
|
|
|
|
terms_set_ad_groups_collapsed( !was_collapsed );
|
|
|
|
if ( was_collapsed && terms_ad_groups_table )
|
|
terms_ad_groups_table.columns.adjust().draw( false );
|
|
});
|
|
|
|
terms_restore_ad_groups_collapsed();
|
|
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>
|