some progress

This commit is contained in:
Doar Mihai
2026-01-24 12:16:10 +02:00
parent 3665a1d5a3
commit 612cc097f8
51 changed files with 8089 additions and 470 deletions
+72
View File
@@ -0,0 +1,72 @@
@extends('layouts.app')
@section('title', 'Add Sitemap')
@section('content')
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h4 class="mb-0"><i class="bi bi-plus-circle"></i> Add Sitemap for Monitoring</h4>
</div>
<div class="card-body">
<form action="{{ route('sitemaps.store') }}" method="POST">
@csrf
<div class="mb-3">
<label for="site_id" class="form-label">Associated Site <span class="text-danger">*</span></label>
<select class="form-select @error('site_id') is-invalid @enderror"
id="site_id" name="site_id" required>
<option value="">Select a site...</option>
@foreach($sites as $site)
<option value="{{ $site->id }}" {{ old('site_id') == $site->id ? 'selected' : '' }}>
{{ $site->name }} ({{ $site->url }})
</option>
@endforeach
</select>
@error('site_id')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">Select the site this sitemap belongs to</div>
</div>
<div class="mb-3">
<label for="url" class="form-label">Sitemap URL <span class="text-danger">*</span></label>
<input type="url" class="form-control @error('url') is-invalid @enderror"
id="url" name="url" value="{{ old('url') }}" required
placeholder="https://example.com/sitemap.xml">
@error('url')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">The full URL to your sitemap file (e.g., https://example.com/sitemap.xml)</div>
</div>
<div class="mb-3">
<div class="form-check">
<input type="checkbox" class="form-check-input" id="is_active"
name="is_active" {{ old('is_active', true) ? 'checked' : '' }}>
<label class="form-check-label" for="is_active">
Active Monitoring
</label>
</div>
<div class="form-text">Automatically validate this sitemap</div>
</div>
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> <strong>Note:</strong> After adding, we'll automatically validate your sitemap to ensure it's accessible and well-formed XML.
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-circle"></i> Add Sitemap
</button>
<a href="{{ route('sitemaps.index') }}" class="btn btn-secondary">
<i class="bi bi-x-circle"></i> Cancel
</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
+69
View File
@@ -0,0 +1,69 @@
@extends('layouts.app')
@section('title', 'Edit Sitemap')
@section('content')
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h4 class="mb-0"><i class="bi bi-pencil"></i> Edit Sitemap</h4>
</div>
<div class="card-body">
<form action="{{ route('sitemaps.update', $sitemap) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="site_id" class="form-label">Associated Site <span class="text-danger">*</span></label>
<select class="form-select @error('site_id') is-invalid @enderror"
id="site_id" name="site_id" required>
<option value="">Select a site...</option>
@foreach($sites as $site)
<option value="{{ $site->id }}" {{ old('site_id', $sitemap->site_id) == $site->id ? 'selected' : '' }}>
{{ $site->name }} ({{ $site->url }})
</option>
@endforeach
</select>
@error('site_id')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">Select the site this sitemap belongs to</div>
</div>
<div class="mb-3">
<label for="url" class="form-label">Sitemap URL <span class="text-danger">*</span></label>
<input type="url" class="form-control @error('url') is-invalid @enderror"
id="url" name="url" value="{{ old('url', $sitemap->url) }}" required
placeholder="https://example.com/sitemap.xml">
@error('url')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">The full URL to your sitemap file</div>
</div>
<div class="mb-3">
<div class="form-check">
<input type="checkbox" class="form-check-input" id="is_active"
name="is_active" {{ old('is_active', $sitemap->is_active) ? 'checked' : '' }}>
<label class="form-check-label" for="is_active">
Active Monitoring
</label>
</div>
<div class="form-text">Automatically validate this sitemap</div>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-circle"></i> Update Sitemap
</button>
<a href="{{ route('sitemaps.index') }}" class="btn btn-secondary">
<i class="bi bi-x-circle"></i> Cancel
</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
+124
View File
@@ -0,0 +1,124 @@
@extends('layouts.app')
@section('title', 'Sitemap Monitoring')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-diagram-3"></i> Sitemap Monitoring</h1>
<a href="{{ route('sitemaps.create') }}" class="btn btn-primary">
<i class="bi bi-plus-circle"></i> Add Sitemap
</a>
</div>
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="bi bi-check-circle"></i> {{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
@if($sitemaps->isEmpty())
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> No sitemaps are being monitored yet. Click "Add Sitemap" to get started!
</div>
@else
<div class="card">
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead>
<tr>
<th>Site</th>
<th>Sitemap URL</th>
<th>Status</th>
<th>URL Count</th>
<th>Last Checked</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($sitemaps as $sitemap)
<tr class="{{ $sitemap->hasErrors() ? 'table-danger' : '' }}">
<td>
<a href="{{ route('dashboard.show', $sitemap->site) }}">
{{ $sitemap->site->name }}
</a>
</td>
<td>
<a href="{{ $sitemap->url }}" target="_blank" rel="noopener" class="text-break">
{{ Str::limit($sitemap->url, 60) }}
<i class="bi bi-box-arrow-up-right small"></i>
</a>
</td>
<td>
<span class="badge {{ $sitemap->getStatusBadgeClass() }}">
{{ $sitemap->getStatusText() }}
</span>
@if($sitemap->last_error)
<i class="bi bi-exclamation-triangle text-danger"
data-bs-toggle="tooltip"
title="{{ $sitemap->last_error }}"></i>
@endif
</td>
<td>
@if($sitemap->url_count)
<span class="badge bg-info">{{ number_format($sitemap->url_count) }} URLs</span>
@else
<span class="text-muted">-</span>
@endif
</td>
<td>
@if($sitemap->last_checked_at)
<small>{{ $sitemap->last_checked_at->diffForHumans() }}</small>
@else
<span class="text-muted">Never</span>
@endif
</td>
<td>
<div class="btn-group btn-group-sm" role="group">
<a href="{{ route('sitemaps.show', $sitemap) }}" class="btn btn-outline-primary" title="View">
<i class="bi bi-eye"></i>
</a>
<a href="{{ route('sitemaps.edit', $sitemap) }}" class="btn btn-outline-secondary" title="Edit">
<i class="bi bi-pencil"></i>
</a>
<form action="{{ route('sitemaps.check', $sitemap) }}" method="POST" class="d-inline">
@csrf
<button type="submit" class="btn btn-outline-info" title="Validate Now">
<i class="bi bi-arrow-clockwise"></i>
</button>
</form>
<form action="{{ route('sitemaps.destroy', $sitemap) }}" method="POST" class="d-inline"
onsubmit="return confirm('Are you sure you want to delete this sitemap?');">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-outline-danger" title="Delete">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@if($sitemaps->hasPages())
<div class="card-footer">
{{ $sitemaps->links() }}
</div>
@endif
</div>
@endif
@push('scripts')
<script>
// Initialize Bootstrap tooltips
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
return new bootstrap.Tooltip(tooltipTriggerEl)
})
</script>
@endpush
@endsection
+169
View File
@@ -0,0 +1,169 @@
@extends('layouts.app')
@section('title', 'Sitemap Details')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-diagram-3"></i> Sitemap Details</h1>
<div>
<a href="{{ route('sitemaps.edit', $sitemap) }}" class="btn btn-secondary">
<i class="bi bi-pencil"></i> Edit
</a>
<a href="{{ route('sitemaps.index') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left"></i> Back to List
</a>
</div>
</div>
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="bi bi-check-circle"></i> {{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<div class="row">
<div class="col-lg-8">
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">Sitemap Information</h5>
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col-md-4 fw-bold">Associated Site:</div>
<div class="col-md-8">
<a href="{{ route('dashboard.show', $sitemap->site) }}">
{{ $sitemap->site->name }}
</a>
<br>
<small class="text-muted">{{ $sitemap->site->url }}</small>
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Sitemap URL:</div>
<div class="col-md-8">
<a href="{{ $sitemap->url }}" target="_blank" rel="noopener" class="text-break">
{{ $sitemap->url }}
<i class="bi bi-box-arrow-up-right small"></i>
</a>
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Status:</div>
<div class="col-md-8">
<span class="badge {{ $sitemap->getStatusBadgeClass() }} fs-6">
{{ $sitemap->getStatusText() }}
</span>
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Monitoring:</div>
<div class="col-md-8">
@if($sitemap->is_active)
<span class="badge bg-success">Active</span>
@else
<span class="badge bg-secondary">Inactive</span>
@endif
</div>
</div>
@if($sitemap->url_count)
<div class="row mb-3">
<div class="col-md-4 fw-bold">URLs in Sitemap:</div>
<div class="col-md-8">
<span class="fs-4 fw-bold text-primary">{{ number_format($sitemap->url_count) }}</span>
</div>
</div>
@endif
</div>
</div>
<div class="card">
<div class="card-header">
<h5 class="mb-0">Validation Details</h5>
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col-md-4 fw-bold">Last Checked:</div>
<div class="col-md-8">
@if($sitemap->last_checked_at)
{{ $sitemap->last_checked_at->format('F j, Y g:i A') }}
<br>
<small class="text-muted">{{ $sitemap->last_checked_at->diffForHumans() }}</small>
@else
<span class="text-muted">Never</span>
@endif
</div>
</div>
@if($sitemap->last_error)
<div class="row mb-3">
<div class="col-md-4 fw-bold">Last Error:</div>
<div class="col-md-8">
<div class="alert alert-danger mb-0">
<i class="bi bi-exclamation-triangle"></i> {{ $sitemap->last_error }}
</div>
</div>
</div>
@endif
</div>
</div>
</div>
<div class="col-lg-4">
<div class="card mb-4">
<div class="card-header">
<h5 class="mb-0">Actions</h5>
</div>
<div class="card-body">
<form action="{{ route('sitemaps.check', $sitemap) }}" method="POST" class="mb-3">
@csrf
<button type="submit" class="btn btn-primary w-100">
<i class="bi bi-arrow-clockwise"></i> Validate Now
</button>
</form>
<a href="{{ route('sitemaps.edit', $sitemap) }}" class="btn btn-secondary w-100 mb-3">
<i class="bi bi-pencil"></i> Edit Sitemap
</a>
<form action="{{ route('sitemaps.destroy', $sitemap) }}" method="POST"
onsubmit="return confirm('Are you sure you want to delete this sitemap?');">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger w-100">
<i class="bi bi-trash"></i> Delete Sitemap
</button>
</form>
</div>
</div>
@if($sitemap->hasErrors())
<div class="card border-danger">
<div class="card-header bg-danger text-white">
<h5 class="mb-0"><i class="bi bi-exclamation-triangle"></i> Validation Issue</h5>
</div>
<div class="card-body">
<p class="mb-0">
<strong>Your sitemap has validation errors.</strong> Please check the error message above and fix the issues.
</p>
</div>
</div>
@elseif($sitemap->is_valid && $sitemap->last_checked_at)
<div class="card border-success">
<div class="card-header bg-success text-white">
<h5 class="mb-0"><i class="bi bi-check-circle"></i> Validation Passed</h5>
</div>
<div class="card-body">
<p class="mb-0">
Your sitemap is valid and accessible. It contains {{ number_format($sitemap->url_count ?? 0) }} URL(s).
</p>
</div>
</div>
@endif
</div>
</div>
@endsection