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 @@
<x-layouts.app :title="$c->name"><x-customer-shell><header class="tp-page-header"><div><p>{{__('competitors.title')}}</p><h1>{{$c->name}}</h1><span>{{$c->normalized_domain}} · {{$p->name}}</span></div></header><div class="tp-metric-grid"><x-metric-card :label="__('competitors.your_visibility')" :value="number_format($data['scores'][$p->domain]??0,2).'%'"/><x-metric-card :label="__('competitors.domain')" :value="number_format($data['scores'][$c->normalized_domain]??0,2).'%'"/><x-metric-card :label="__('competitors.lead')" :value="$data['lead']"/><x-metric-card :label="__('competitors.trail')" :value="$data['trail']"/></div></x-customer-shell></x-layouts.app>
@@ -0,0 +1,4 @@
<x-layouts.app :title="__('competitors.title')"><x-customer-shell><header class="tp-page-header"><div><p>{{__('customer.reports')}}</p><h1>{{__('competitors.title')}}</h1><span>{{__('competitors.description')}}</span></div></header>
@if($projects->isEmpty())<section class="tp-panel">{{__('competitors.empty_projects')}}</section>@else<section class="tp-panel mb-3"><form method="get" class="d-flex gap-2"><select name="project" class="form-select">@foreach($projects as $p)<option value="{{$p->ulid}}" @selected($project?->is($p))>{{$p->name}}</option>@endforeach</select><button class="btn btn-primary">{{__('losers.filter')}}</button></form></section>
<section class="tp-panel mb-3"><h2 class="h5">{{__('competitors.add')}}</h2><form method="post" action="{{route('competitors.store',$project)}}" class="tp-competitor-form">@csrf<input class="form-control" name="name" placeholder="{{__('competitors.name')}}"><input class="form-control" name="domain" required placeholder="{{__('competitors.domain')}}"><button class="btn btn-primary">{{__('competitors.add')}}</button></form>@error('domain')<p class="text-danger">{{$message}}</p>@enderror<table class="table mt-3"><tbody>@forelse($project->competitors as $c)<tr><td>{{$c->name}}</td><td>{{$c->normalized_domain}}</td><td>{{__('competitors.'.$c->status)}}</td><td><a href="{{route('competitors.show',[$project,$c])}}">{{__('competitors.view')}}</a></td></tr>@empty<tr><td>{{__('competitors.empty_competitors')}}</td></tr>@endforelse</tbody></table></section>
@if($data&&$competitors->isNotEmpty())@php($strong=$competitors->sortByDesc(fn($c)=>$data['scores'][$c->normalized_domain]??0)->first())<div class="tp-metric-grid mb-3"><x-metric-card :label="__('competitors.your_visibility')" :value="number_format($data['scores'][$project->domain]??0,2).'%'"/><x-metric-card :label="__('competitors.strongest')" :value="$strong?->name"/><x-metric-card :label="__('competitors.lead')" :value="$data['lead']"/><x-metric-card :label="__('competitors.trail')" :value="$data['trail']"/><x-metric-card :label="__('competitors.shared')" :value="$data['shared']"/><x-metric-card :label="__('competitors.unranked')" :value="$data['unranked']"/></div><section class="tp-panel"><div class="table-responsive"><table class="table"><thead><tr><th>{{__('competitors.keyword')}}</th><th>{{__('competitors.your_rank')}}</th><th>{{__('competitors.competitor_rank')}}</th><th>{{__('competitors.gap')}}</th><th>{{__('competitors.leader')}}</th></tr></thead><tbody>@forelse($data['rows'] as $row)<tr><td>{{$row['keyword']->phrase}}</td><td>{{$row['own']??'—'}}</td><td>{{$row['rival']??'—'}}</td><td>{{$row['gap']??'—'}}</td><td>{{__('competitors.'.($row['leader']==='you'?'you_lead':($row['leader']==='competitor'?'competitor_leads':($row['leader']==='tied'?'tied':'no_measurement'))))}}</td></tr>@empty<tr><td colspan="5">{{__('competitors.empty_data')}}</td></tr>@endforelse</tbody></table></div></section>@endif @endif</x-customer-shell></x-layouts.app>
+17
View File
@@ -0,0 +1,17 @@
<x-layouts.app :title="__('losers.title')"><x-customer-shell>
<header class="tp-page-header"><div><p>{{__('customer.reports')}}</p><h1>{{__('losers.title')}}</h1><span>{{__('losers.description')}}</span></div></header>
<section class="tp-panel mb-3"><form method="get" class="tp-losers-filters">
<input class="form-control" name="q" value="{{request('q')}}" placeholder="{{__('losers.search')}}">
<select class="form-select" name="project"><option value="">{{__('losers.all_projects')}}</option>@foreach($projects as $p)<option value="{{$p->ulid}}" @selected(request('project')===$p->ulid)>{{$p->name}}</option>@endforeach</select>
<select class="form-select" name="range">@foreach(['7d'=>'last7','30d'=>'last30','90d'=>'last90','this_month'=>'this_month','last_month'=>'last_month','custom'=>'custom'] as $v=>$label)<option value="{{$v}}" @selected(request('range','30d')===$v)>{{__('visibility.'.$label)}}</option>@endforeach</select>
<select class="form-select" name="country"><option value="">{{__('visibility.country')}}</option>@foreach($countries as $v=>$label)<option value="{{$v}}" @selected(request('country')===$v)>{{$label}}</option>@endforeach</select>
<select class="form-select" name="language"><option value="">{{__('visibility.language')}}</option>@foreach($languages as $v=>$label)<option value="{{$v}}" @selected(request('language')===$v)>{{$label}}</option>@endforeach</select>
<select class="form-select" name="device"><option value="">{{__('visibility.device')}}</option>@foreach(\App\Enums\KeywordDevice::cases() as $v)<option value="{{$v->value}}" @selected(request('device')===$v->value)>{{$v->label()}}</option>@endforeach</select>
<select class="form-select" name="engine"><option value="">{{__('visibility.engine')}}</option>@foreach(\App\Enums\SearchEngine::cases() as $v)<option value="{{$v->value}}" @selected(request('engine')===$v->value)>{{$v->label()}}</option>@endforeach</select>
<input class="form-control" type="number" min="1" max="100" name="min_lost" value="{{request('min_lost')}}" placeholder="{{__('losers.min_lost')}}"><input class="form-control" type="date" name="from" value="{{request('from')}}"><input class="form-control" type="date" name="to" value="{{request('to')}}"><button class="btn btn-primary">{{__('losers.filter')}}</button></form></section>
<div class="tp-metric-grid tp-losers-metrics mb-3"><x-metric-card :label="__('losers.ranking_losers')" :value="$summary['losers']" icon=""/><x-metric-card :label="__('losers.total_lost')" :value="$summary['lost']" icon=""/><x-metric-card :label="__('losers.top3')" :value="$summary['top3']" icon="3"/><x-metric-card :label="__('losers.top10')" :value="$summary['top10']" icon="10"/><x-metric-card :label="__('losers.top100')" :value="$summary['top100']" icon="100"/><x-metric-card :label="__('losers.visibility_loss')" :value="$summary['visibility_loss']===null?null:number_format($summary['visibility_loss'],2).'%'" :description="$summary['visibility_loss']===null?__('losers.no_comparison'):null" icon="%"/></div>
@if($critical->isNotEmpty())<section class="tp-panel tp-critical-losses mb-3"><h2 class="h5">{{__('losers.critical')}}</h2>@foreach($critical as $row)<a class="badge text-bg-danger text-decoration-none me-2" href="{{route('rankings.keywords.show',$row['keyword']->ulid)}}">{{$row['keyword']->phrase}} · {{__('losers.categories.'.$row['category'])}}</a>@endforeach</section>@endif
<section class="tp-panel mb-3"><div class="table-responsive"><table class="table tp-data-table"><thead><tr><th>{{__('losers.keyword')}}</th><th>{{__('losers.project')}}</th><th>{{__('losers.previous')}}</th><th>{{__('losers.current')}}</th><th>{{__('losers.lost')}}</th><th>{{__('losers.visibility_loss')}}</th><th>{{__('losers.category')}}</th><th>{{__('losers.target')}}</th><th>{{__('losers.device')}}</th><th>{{__('losers.last_check')}}</th><th></th></tr></thead><tbody>
@forelse($rows as $row)<tr><td>{{$row['keyword']->phrase}}</td><td><a href="{{route('projects.show',$row['project']->ulid)}}">{{$row['project']->name}}</a></td><td>{{$row['previous']}}</td><td>{{$row['dropped_out']?__('losers.dropped_out_label'):$row['current']}}</td><td class="tp-loser">{{$row['lost']===null?'—':''.$row['lost']}}</td><td>{{number_format($row['visibility_loss'],2)}}%</td><td><span class="badge text-bg-danger">{{__('losers.categories.'.$row['category'])}}</span></td><td>{{$row['keyword']->country_code}} / {{$row['keyword']->language_code}}</td><td>{{$row['keyword']->device->label()}}</td><td>{{$row['checked_at']->format('d.m.Y H:i')}}</td><td><a href="{{route('rankings.keywords.show',$row['keyword']->ulid)}}">{{__('losers.view')}}</a></td></tr>@empty<tr><td colspan="11" class="text-center py-4 text-body-secondary">{{__('losers.empty')}}</td></tr>@endforelse</tbody></table></div>{{$rows->links()}}</section>
<section class="tp-panel"><h2 class="h5">{{__('losers.distribution')}}</h2><div class="tp-distribution">@foreach($distribution as $key=>$count)<div><span>{{__('losers.ranges.'.$key)}}</span><i class="tp-loss-bar" style="--count:{{$count}}"></i><strong>{{$count}}</strong></div>@endforeach</div></section>
</x-customer-shell></x-layouts.app>
@@ -0,0 +1,14 @@
<x-layouts.app :title="__('visibility.title').' — TrafficPumper'"><x-customer-shell>
<header class="tp-page-header"><div><p>{{__('customer.reports')}}</p><h1>{{__('visibility.title')}}</h1><span>{{__('visibility.description')}}</span></div></header>
<section class="tp-panel"><form method="GET" class="tp-visibility-filters">
<select name="project" class="form-select"><option value="">{{__('visibility.all_projects')}}</option>@foreach($projects as $project)<option value="{{$project->ulid}}" @selected(request('project')===$project->ulid)>{{$project->name}}</option>@endforeach</select>
<select name="range" class="form-select">@foreach(['7d'=>'last7','30d'=>'last30','90d'=>'last90','this_month'=>'this_month','last_month'=>'last_month','custom'=>'custom'] as $v=>$l)<option value="{{$v}}" @selected(request('range','30d')===$v)>{{__('visibility.'.$l)}}</option>@endforeach</select>
<select name="compare" class="form-select"><option value="previous">{{__('visibility.compare_previous')}}</option><option value="none" @selected(request('compare')==='none')>{{__('visibility.no_compare')}}</option></select>
<select name="country" class="form-select"><option value="">{{__('visibility.country')}}</option>@foreach($countries as $v=>$l)<option value="{{$v}}">{{$l}}</option>@endforeach</select>
<select name="device" class="form-select"><option value="">{{__('visibility.device')}}</option>@foreach(\App\Enums\KeywordDevice::cases() as $v)<option value="{{$v->value}}">{{$v->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">{{__('visibility.filter')}}</button><a class="btn btn-outline-secondary" href="{{route('reports.visibility')}}">{{__('visibility.clear')}}</a></form></section>
<div class="alert alert-info"><strong>{{__('visibility.formula')}}</strong><br>{{__('visibility.coverage',['measured'=>$coverage[0],'total'=>$coverage[1]])}}@if($coverage[0]<$coverage[1])<br>{{__('visibility.coverage_warning')}}@endif</div>
<section class="tp-metric-grid tp-visibility-metrics"><x-metric-card :label="__('visibility.score')" :value="$metrics['current']!==null?number_format($metrics['current'],2).'%':null" icon=""/><x-metric-card :label="__('visibility.previous')" :value="$metrics['previous']!==null?number_format($metrics['previous'],2).'%':__('visibility.no_comparison')" icon=""/><x-metric-card :label="__('visibility.change')" :value="$metrics['change']!==null?number_format($metrics['change'],2).'%':null" icon=""/><x-metric-card :label="__('visibility.measured')" :value="$metrics['measured']" icon=""/><x-metric-card :label="__('visibility.top10')" :value="$metrics['top10']" icon=""/><x-metric-card :label="__('visibility.unranked')" :value="$metrics['unranked']" icon=""/></section>
<div class="tp-ranking-grid"><section class="tp-panel"><div class="tp-panel-heading"><h2>{{__('visibility.trend')}}</h2></div>@if($trend->isEmpty())<x-empty-state :title="__('visibility.no_data')" :description="__('visibility.formula')"/>@else<div class="tp-visibility-chart" data-visibility-chart='@json(['current'=>$trend,'previous'=>$previousTrend])'></div>@endif</section><section class="tp-panel"><div class="tp-panel-heading"><h2>{{__('visibility.distribution')}}</h2></div><div class="tp-distribution">@foreach($distribution as $key=>$count)<div><span>{{__('visibility.range_labels.'.$key)}}</span><i style="--count:{{$count}}"></i><strong>{{$count}}</strong></div>@endforeach</div></section></div>
<div class="tp-two-columns">@foreach(['winners'=>$winners,'losers'=>$losers] as $title=>$items)<section class="tp-panel"><div class="tp-panel-heading"><h2>{{__('visibility.'.$title)}}</h2></div><div class="table-responsive"><table class="table tp-data-table"><thead><tr><th>{{__('visibility.keyword')}}</th><th>{{__('visibility.previous_rank')}}</th><th>{{__('visibility.current_rank')}}</th><th>{{__('visibility.point_change')}}</th></tr></thead><tbody>@forelse($items as $item)<tr><td><a href="{{route('rankings.keywords.show',$item['keyword'])}}">{{$item['keyword']->phrase}}</a><small class="d-block text-body-secondary">{{$item['project']->name}}</small></td><td>{{$item['previous']?'#'.$item['previous']:'100+'}}</td><td>{{$item['current']?'#'.$item['current']:'100+'}}</td><td class="{{$item['delta']>0?'tp-rank-up':'tp-rank-down'}}">{{$item['delta']>0?'+':''}}{{$item['delta']}}</td></tr>@empty<tr><td colspan="4">{{__('visibility.no_comparison')}}</td></tr>@endforelse</tbody></table></div></section>@endforeach</div>
</x-customer-shell></x-layouts.app>
+16
View File
@@ -0,0 +1,16 @@
<x-layouts.app :title="__('winners.title')"><x-customer-shell>
<div class="tp-page-heading"><div><h1>{{ __('winners.title') }}</h1><p>{{ __('winners.description') }}</p></div></div>
<section class="tp-panel mb-3"><form method="get" action="{{ route('reports.winners') }}" class="tp-winners-filters">
<label>{{ __('winners.search') }}<input class="form-control" name="q" value="{{ request('q') }}"></label>
<label>{{ __('winners.project') }}<select class="form-select" name="project"><option value="">{{ __('winners.all_projects') }}</option>@foreach($projects as $project)<option value="{{ $project->ulid }}" @selected(request('project')===$project->ulid)>{{ $project->name }}</option>@endforeach</select></label>
<label>{{ __('visibility.period') }}<select class="form-select" name="range">@foreach(['7d'=>'last7','30d'=>'last30','90d'=>'last90','this_month'=>'this_month','last_month'=>'last_month','custom'=>'custom'] as $range=>$label)<option value="{{ $range }}" @selected(request('range','30d')===$range)>{{ __('visibility.'.$label) }}</option>@endforeach</select></label>
<label>{{ __('visibility.country') }}<select class="form-select" name="country"><option value=""></option>@foreach($countries as $code=>$name)<option value="{{ $code }}" @selected(request('country')===$code)>{{ $name }}</option>@endforeach</select></label>
<label>{{ __('visibility.language') }}<select class="form-select" name="language"><option value=""></option>@foreach($languages as $code=>$name)<option value="{{ $code }}" @selected(request('language')===$code)>{{ $name }}</option>@endforeach</select></label>
<label>{{ __('winners.min_gained') }}<input class="form-control" type="number" min="1" max="100" name="min_gained" value="{{ request('min_gained') }}"></label>
<label>{{ __('visibility.from_date') }}<input class="form-control" type="date" name="from" value="{{ request('from') }}"></label><label>{{ __('visibility.to_date') }}<input class="form-control" type="date" name="to" value="{{ request('to') }}"></label>
<div class="d-flex align-items-end"><button class="btn btn-primary w-100">{{ __('winners.filter') }}</button></div>
</form></section>
<div class="tp-metric-grid tp-winners-metrics mb-3"><x-metric-card :label="__('winners.ranking_winners')" :value="$summary['winners']" icon=""/><x-metric-card :label="__('winners.total_gained')" :value="$summary['gained']" icon="+"/><x-metric-card :label="__('winners.top3')" :value="$summary['top3']" icon="3"/><x-metric-card :label="__('winners.top10')" :value="$summary['top10']" icon="10"/><x-metric-card :label="__('winners.new_entries')" :value="$summary['new_entries']" icon=""/><x-metric-card :label="__('winners.contribution')" :value="$summary['contribution']===null?null:number_format($summary['contribution'],2).'%'" :description="$summary['contribution']===null?__('winners.no_comparison'):null" icon="%"/></div>
<section class="tp-panel mb-3"><div class="table-responsive"><table class="table tp-data-table"><thead><tr><th>{{ __('winners.keyword') }}</th><th>{{ __('winners.project') }}</th><th>{{ __('winners.previous') }}</th><th>{{ __('winners.current') }}</th><th>{{ __('winners.gained') }}</th><th>{{ __('winners.visibility') }}</th><th>{{ __('winners.last_check') }}</th></tr></thead><tbody>@forelse($rows as $row)<tr><td><a href="{{ route('rankings.keywords.show',$row['keyword']->ulid) }}">{{ $row['keyword']->phrase }}</a><br><small class="text-body-secondary">{{ __('winners.categories.'.$row['category']) }}</small></td><td><a href="{{ route('projects.show',$row['project']->ulid) }}">{{ $row['project']->name }}</a></td><td>{{ $row['previous']??'—' }}</td><td>{{ $row['current']??'—' }}</td><td class="tp-winner">{{ $row['new_entry']?__('winners.categories.new_entry'):'+'.$row['gained'] }}</td><td>{{ number_format($row['contribution'],2) }}%</td><td>{{ $row['checked_at']->format('d.m.Y H:i') }}</td></tr>@empty<tr><td colspan="7" class="text-center text-body-secondary py-4">{{ __('winners.empty') }}</td></tr>@endforelse</tbody></table></div>{{ $rows->links() }}</section>
<section class="tp-panel"><h2 class="h5">{{ __('winners.distribution') }}</h2><div class="tp-distribution">@foreach($distribution as $key=>$count)<div><span>{{ __('winners.ranges.'.$key) }}</span><i style="--count:{{ $count }}"></i><strong>{{ $count }}</strong></div>@endforeach</div></section>
</x-customer-shell></x-layouts.app>