Proje dosyaları eklendi

This commit is contained in:
2026-08-29 15:53:53 +03:00
commit d3313400ca
440 changed files with 24827 additions and 0 deletions
@@ -0,0 +1,4 @@
<x-layouts.app :title="__('serp_checks.title').' — TrafficPumper'"><x-customer-shell><header class="tp-page-header"><div><p>{{__('customer.rank_tracking')}}</p><h1>{{__('serp_checks.title')}}</h1><span>{{__('serp_checks.description')}}</span></div></header>@error('serp')<div class="alert alert-warning">{{$message}}</div>@enderror @if(!config('serp.enabled')||app(\App\Serp\Operations\ActivationManager::class)->allowsNormal()===false)<div class="alert alert-secondary">{{__('serp_checks.unavailable')}}</div>@endif
<section class="tp-metric-grid tp-serp-metrics"><x-metric-card :label="__('serp_checks.total')" :value="$summary['total']" icon=""/><x-metric-card :label="__('serp_checks.pending')" :value="$summary['pending']" icon=""/><x-metric-card :label="__('serp_checks.running')" :value="$summary['running']" icon=""/><x-metric-card :label="__('serp_checks.completed')" :value="$summary['completed']" icon=""/><x-metric-card :label="__('serp_checks.failed')" :value="$summary['failed']" icon="!"/><x-metric-card :label="__('serp_checks.last24')" :value="$summary['last24']" icon=""/></section>
<section class="tp-panel"><form method="GET" class="tp-serp-filters"><input name="q" class="form-control" value="{{request('q')}}" placeholder="{{__('serp_checks.search')}}"><select name="project" class="form-select"><option value="">{{__('serp_checks.all_projects')}}</option>@foreach($projects as $project)<option value="{{$project->ulid}}" @selected(request('project')===$project->ulid)>{{$project->name}}</option>@endforeach</select><select name="keyword" class="form-select"><option value="">{{__('serp_checks.all_keywords')}}</option>@foreach($keywords as $keyword)<option value="{{$keyword->ulid}}" @selected(request('keyword')===$keyword->ulid)>{{$keyword->phrase}}</option>@endforeach</select><select name="status" class="form-select"><option value="">{{__('serp_checks.all_statuses')}}</option>@foreach(\App\Enums\SerpCheckStatus::cases() as $status)<option value="{{$status->value}}" @selected(request('status')===$status->value)>{{$status->label()}}</option>@endforeach</select><select name="device" class="form-select"><option value="">{{__('serp_checks.device')}}</option>@foreach(\App\Enums\KeywordDevice::cases() as $device)<option value="{{$device->value}}" @selected(request('device')===$device->value)>{{$device->label()}}</option>@endforeach</select><input type="date" name="from" value="{{request('from')}}" class="form-control"><input type="date" name="to" value="{{request('to')}}" class="form-control"><button class="btn btn-primary">{{__('serp_checks.filter')}}</button><a class="btn btn-outline-secondary" href="{{route('serp-checks.index')}}">{{__('serp_checks.clear')}}</a></form></section>
<section class="tp-panel"><div class="table-responsive"><table class="table tp-data-table"><thead><tr><th>{{__('serp_checks.keyword')}}</th><th>{{__('serp_checks.project')}}</th><th>{{__('serp_checks.type')}}</th><th>{{__('serp_checks.status')}}</th><th>{{__('serp_checks.rank')}}</th><th>{{__('serp_checks.device')}}</th><th>{{__('serp_checks.target')}}</th><th>{{__('serp_checks.requested')}}</th><th>{{__('serp_checks.completed_at')}}</th><th>{{__('serp_checks.action')}}</th></tr></thead><tbody>@forelse($checks as $check)<tr><td>{{$check->phrase}}</td><td>{{$check->keyword->project->name}}</td><td>{{__('serp_checks.'.($check->origin==='scheduled'?'scheduled':'manual'))}}</td><td><span class="badge tp-status-{{$check->status->value}}">{{$check->status->label()}}</span></td><td>{{$check->detected_rank?'#'.$check->detected_rank:($check->status===\App\Enums\SerpCheckStatus::Completed?'100+':'—')}}</td><td>{{$check->device->label()}}</td><td>{{$check->country_code}} / {{$check->language_code}}</td><td>{{$check->created_at->translatedFormat('d M Y H:i')}}</td><td>{{$check->completed_at?->translatedFormat('d M Y H:i')??'—'}}</td><td><a href="{{route('serp-checks.show',$check)}}">{{__('serp_checks.view')}}</a></td></tr>@empty<tr><td colspan="10"><x-empty-state :title="__('serp_checks.no_filter')" :description="__('serp_checks.no_checks')"/></td></tr>@endforelse</tbody></table></div>{{$checks->links()}}</section></x-customer-shell></x-layouts.app>
@@ -0,0 +1 @@
<x-layouts.app :title="__('serp_checks.details').' — TrafficPumper'"><x-customer-shell><nav><ol class="breadcrumb"><li class="breadcrumb-item"><a href="{{route('serp-checks.index')}}">{{__('serp_checks.title')}}</a></li><li class="breadcrumb-item active">{{$check->phrase}}</li></ol></nav><header class="tp-page-header"><div><p>{{$check->keyword->project->name}} · {{$check->keyword->project->domain}}</p><h1>{{__('serp_checks.details')}}</h1><span>{{$check->status->label()}}</span></div></header><section class="tp-metric-grid tp-serp-metrics"><x-metric-card :label="__('serp_checks.rank')" :value="$rank?'#'.$rank:($check->status===\App\Enums\SerpCheckStatus::Completed?'100+':null)" icon=""/><x-metric-card :label="__('serp_checks.previous')" :value="$previous?'#'.$previous:null" icon=""/><x-metric-card :label="__('serp_checks.change')" :value="$change" icon=""/><x-metric-card :label="__('serp_checks.status')" :value="$check->status->label()" icon=""/><x-metric-card :label="__('serp_checks.type')" :value="__('serp_checks.'.($check->origin==='scheduled'?'scheduled':'manual'))" icon=""/><x-metric-card :label="__('serp_checks.completed_at')" :value="$check->completed_at?->diffForHumans()" icon=""/></section><div class="tp-two-columns"><section class="tp-panel"><dl class="tp-detail-list"><div><dt>{{__('serp_checks.keyword')}}</dt><dd>{{$check->phrase}}</dd></div><div><dt>{{__('serp_checks.engine')}}</dt><dd>{{$check->search_engine->label()}}</dd></div><div><dt>{{__('serp_checks.target')}}</dt><dd>{{$check->country_code}} / {{$check->language_code}} / {{$check->device->label()}}</dd></div><div><dt>{{__('serp_checks.requested')}}</dt><dd>{{$check->created_at->translatedFormat('d M Y H:i')}}</dd></div><div><dt>{{__('serp_checks.started')}}</dt><dd>{{$check->started_at?->translatedFormat('d M Y H:i')??'—'}}</dd></div><div><dt>{{__('serp_checks.found_url')}}</dt><dd>{{$check->results->firstWhere('is_project_domain',true)?->url??'—'}}</dd></div>@if($check->status===\App\Enums\SerpCheckStatus::Failed)<div><dt>{{__('serp_checks.safe_error')}}</dt><dd>{{__('serp_checks.error.'.(in_array($check->error_code,['validation','timeout'],true)?$check->error_code:'failed'))}}</dd></div>@endif</dl></section><section class="tp-panel"><div class="tp-panel-heading"><h2>{{__('serp_checks.organic')}}</h2></div><div class="table-responsive"><table class="table tp-data-table"><thead><tr><th>{{__('serp_checks.result_rank')}}</th><th>{{__('serp_checks.title_col')}}</th><th>{{__('serp_checks.url')}}</th><th>{{__('serp_checks.ours')}}</th></tr></thead><tbody>@forelse($check->results as $result)<tr><td>#{{$result->position}}</td><td>{{$result->title}}</td><td>@if(in_array(parse_url($result->url,PHP_URL_SCHEME),['http','https'],true))<a href="{{$result->url}}" rel="noopener noreferrer">{{$result->display_url?:parse_url($result->url,PHP_URL_HOST)}}</a>@else{{$result->display_url}}@endif</td><td>{{$result->is_project_domain?__('serp_checks.yes'):__('serp_checks.no')}}</td></tr>@empty<tr><td colspan="4">{{__('serp_checks.no_checks')}}</td></tr>@endforelse</tbody></table></div></section></div></x-customer-shell></x-layouts.app>
@@ -0,0 +1 @@
<x-layouts.app :title="'SERP Geçmişi — '.$keyword->phrase"><div class="container-fluid"><div class="row"><x-customer-sidebar/><main class="col-lg-10 p-4 p-lg-5"><div class="d-flex flex-wrap justify-content-between gap-3 mb-4"><div><h1 class="h2">SERP kontrol geçmişi</h1><a href="{{ route('projects.keywords.show',[$project,$keyword]) }}">{{ $keyword->phrase }}</a></div>@if($keyword->status===\App\Enums\KeywordStatus::Active)@if(config('serp.enabled'))<form method="POST" action="{{ route('projects.keywords.serp-checks.store',[$project,$keyword]) }}">@csrf<button class="btn btn-primary">Kontrol başlat</button></form>@else<span class="alert alert-secondary py-2 mb-0">SERP kontrol hizmeti henüz yapılandırılmamış.</span>@endif @endif</div>@error('serp')<div class="alert alert-warning">{{ $message }}</div>@enderror<div class="card border-0 shadow-sm"><div class="table-responsive"><table class="table mb-0"><thead><tr><th>Zaman</th><th>Hedef</th><th>Durum</th><th>Sonuç</th></tr></thead><tbody>@forelse($checks as $check)<tr><td><a href="{{ route('projects.keywords.serp-checks.show',[$project,$keyword,$check]) }}">{{ $check->created_at->format('d.m.Y H:i') }}</a></td><td>{{ $check->search_engine->label() }} · {{ $check->country_code }}/{{ $check->language_code }} · {{ $check->device->label() }}</td><td>{{ $check->status->label() }}</td><td>{{ $check->status===\App\Enums\SerpCheckStatus::Completed?$check->result_count:'—' }}</td></tr>@empty<tr><td colspan="4" class="text-center py-5 text-body-secondary">Henüz gerçek kontrol kaydı yok.</td></tr>@endforelse</tbody></table></div></div><div class="mt-4">{{ $checks->links() }}</div></main></div></div></x-layouts.app>
@@ -0,0 +1 @@
<x-layouts.app title="SERP Kontrolü — TrafficPumper"><div class="container-fluid"><div class="row"><x-customer-sidebar/><main class="col-lg-10 p-4 p-lg-5"><h1 class="h2">SERP kontrolü</h1><p>{{ $check->phrase }} · {{ $check->status->label() }} · En iyi proje pozisyonu: {{ $best??'—' }}</p><div class="card border-0 shadow-sm"><div class="table-responsive"><table class="table mb-0"><thead><tr><th>Pozisyon</th><th>Sonuç</th><th>Proje</th></tr></thead><tbody>@forelse($check->results as $result)<tr><td>{{ $result->position }}</td><td><a href="{{ $result->url }}" rel="noopener noreferrer">{{ $result->title?:$result->display_url }}</a>@if($result->snippet)<div class="text-body-secondary">{{ $result->snippet }}</div>@endif</td><td>{{ $result->is_project_domain?'Evet':'Hayır' }}</td></tr>@empty<tr><td colspan="3" class="text-center py-5 text-body-secondary">Kaydedilmiş sonuç yok.</td></tr>@endforelse</tbody></table></div></div></main></div></div></x-layouts.app>