This commit is contained in:
2026-02-16 00:43:39 +01:00
parent afe9d6216d
commit 59c086384b
10 changed files with 578 additions and 36 deletions

View File

@@ -58,7 +58,14 @@
</div>
</div>
<?php
$openai_enabled = \services\GoogleAdsApi::get_setting( 'openai_enabled' ) !== '0';
$claude_enabled = \services\GoogleAdsApi::get_setting( 'claude_enabled' ) !== '0';
?>
<script type="text/javascript">
var AI_OPENAI_ENABLED = <?= $openai_enabled ? 'true' : 'false'; ?>;
var AI_CLAUDE_ENABLED = <?= $claude_enabled ? 'true' : 'false'; ?>;
function show_toast( message, type )
{
var bg = type === 'error' ? '#dc3545' : '#28a745';
@@ -263,7 +270,8 @@ $( function()
'<label>Tytuł produktu</label>' +
'<div class="input-with-ai">' +
'<input type="text" value="" product_id="' + $( this ).attr( 'product_id' ) + '" placeholder="Tytuł produktu" class="name form-control" required />' +
'<button type="button" class="btn btn-sm btn-ai-suggest" data-field="title" title="Zaproponuj tytuł przez AI"><i class="fa-solid fa-wand-magic-sparkles"></i> AI</button>' +
( AI_OPENAI_ENABLED ? '<button type="button" class="btn btn-sm btn-ai-suggest" data-field="title" data-provider="openai" title="Zaproponuj tytuł przez ChatGPT"><i class="fa-solid fa-wand-magic-sparkles"></i> GPT</button>' : '' ) +
( AI_CLAUDE_ENABLED ? '<button type="button" class="btn btn-sm btn-ai-suggest btn-ai-claude" data-field="title" data-provider="claude" title="Zaproponuj tytuł przez Claude"><i class="fa-solid fa-brain"></i> Claude</button>' : '' ) +
'</div>' +
'<small>0/150 znaków</small>' +
'</div>' +
@@ -284,7 +292,8 @@ $( function()
'<textarea class="form-control description" style="height:220px;resize:vertical" placeholder="Opis produktu (opcjonalnie)"></textarea>' +
'<div class="desc-preview" style="display:none;height:220px;overflow-y:auto;padding:10px 12px;border:1px solid #ddd;border-radius:4px;background:#fff;font-size:13px;line-height:1.6"></div>' +
'</div>' +
'<button type="button" class="btn btn-sm btn-ai-suggest" data-field="description" title="Zaproponuj opis przez AI"><i class="fa-solid fa-wand-magic-sparkles"></i> AI</button>' +
( AI_OPENAI_ENABLED ? '<button type="button" class="btn btn-sm btn-ai-suggest" data-field="description" data-provider="openai" title="Zaproponuj opis przez ChatGPT"><i class="fa-solid fa-wand-magic-sparkles"></i> GPT</button>' : '' ) +
( AI_CLAUDE_ENABLED ? '<button type="button" class="btn btn-sm btn-ai-suggest btn-ai-claude" data-field="description" data-provider="claude" title="Zaproponuj opis przez Claude"><i class="fa-solid fa-brain"></i> Claude</button>' : '' ) +
'</div>' +
'</div>' +
'<div class="form-group">' +
@@ -293,7 +302,8 @@ $( function()
'<select class="form-control google-category" id="google_category" style="width: calc(100% - 60px)">' +
'<option value="">— wybierz kategorię —</option>' +
'</select>' +
'<button type="button" class="btn btn-sm btn-ai-suggest" data-field="category" title="Zaproponuj kategorię przez AI"><i class="fa-solid fa-wand-magic-sparkles"></i> AI</button>' +
( AI_OPENAI_ENABLED ? '<button type="button" class="btn btn-sm btn-ai-suggest" data-field="category" data-provider="openai" title="Zaproponuj kategorię przez ChatGPT"><i class="fa-solid fa-wand-magic-sparkles"></i> GPT</button>' : '' ) +
( AI_CLAUDE_ENABLED ? '<button type="button" class="btn btn-sm btn-ai-suggest btn-ai-claude" data-field="category" data-provider="claude" title="Zaproponuj kategorię przez Claude"><i class="fa-solid fa-brain"></i> Claude</button>' : '' ) +
'</div>' +
'</div>' +
'</form>',
@@ -420,14 +430,16 @@ $( function()
this.$content.on( 'click', '.btn-ai-suggest', function() {
var $btn = $( this );
var field = $btn.data( 'field' );
var provider = $btn.data( 'provider' ) || 'openai';
var originalHtml = $btn.html();
var providerLabel = provider === 'claude' ? 'Claude' : 'ChatGPT';
$btn.prop( 'disabled', true ).html( '<i class="fa-solid fa-spinner fa-spin"></i>' );
$.ajax({
url: '/products/ai_suggest/',
type: 'POST',
data: { product_id: product_id, field: field, product_url: $productUrl.val() },
data: { product_id: product_id, field: field, product_url: $productUrl.val(), provider: provider },
success: function( response ) {
var data = JSON.parse( response );
if ( data.status == 'ok' ) {
@@ -443,20 +455,22 @@ $( function()
if ( $googleCategory.find( 'option[value="' + catId + '"]' ).length ) {
$googleCategory.val( catId ).trigger( 'change' );
} else {
$.alert({ title: 'AI sugestia', content: 'Sugerowana kategoria: ' + catId, type: 'blue' });
$.alert({ title: 'AI sugestia (' + providerLabel + ')', content: 'Sugerowana kategoria: ' + catId, type: 'blue' });
}
}
if ( data.warning ) {
show_toast( data.warning, 'error' );
show_toast( providerLabel + ': ' + data.warning, 'error' );
} else if ( data.page_fetched ) {
show_toast( 'Sugestia wygenerowana z treścią strony produktu', 'success' );
show_toast( providerLabel + ': Sugestia wygenerowana z treścią strony produktu', 'success' );
} else {
show_toast( providerLabel + ': Sugestia wygenerowana', 'success' );
}
} else {
show_toast( data.message || 'Wystąpił błąd AI.', 'error' );
show_toast( providerLabel + ': ' + ( data.message || 'Wystąpił błąd AI.' ), 'error' );
}
},
error: function() {
$.alert({ title: 'Błąd', content: 'Nie udało się połączyć z API.', type: 'red' });
$.alert({ title: 'Błąd', content: 'Nie udało się połączyć z API ' + providerLabel + '.', type: 'red' });
},
complete: function() {
$btn.prop( 'disabled', false ).html( originalHtml );