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 Domain')
@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 Domain for Monitoring</h4>
</div>
<div class="card-body">
<form action="{{ route('domains.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 domain belongs to</div>
</div>
<div class="mb-3">
<label for="domain" class="form-label">Domain Name <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('domain') is-invalid @enderror"
id="domain" name="domain" value="{{ old('domain') }}" required
placeholder="example.com">
@error('domain')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">Enter the domain name without protocol (e.g., example.com)</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">Monitor this domain's expiration date</div>
</div>
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> <strong>Note:</strong> After adding, we'll automatically check the domain's expiration date using WHOIS lookup.
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-circle"></i> Add Domain
</button>
<a href="{{ route('domains.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 Domain')
@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 Domain</h4>
</div>
<div class="card-body">
<form action="{{ route('domains.update', $domain) }}" 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', $domain->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 domain belongs to</div>
</div>
<div class="mb-3">
<label for="domain" class="form-label">Domain Name <span class="text-danger">*</span></label>
<input type="text" class="form-control @error('domain') is-invalid @enderror"
id="domain" name="domain" value="{{ old('domain', $domain->domain) }}" required
placeholder="example.com">
@error('domain')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
<div class="form-text">Enter the domain name without protocol (e.g., example.com)</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', $domain->is_active) ? 'checked' : '' }}>
<label class="form-check-label" for="is_active">
Active Monitoring
</label>
</div>
<div class="form-text">Monitor this domain's expiration date</div>
</div>
<div class="d-flex gap-2">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-circle"></i> Update Domain
</button>
<a href="{{ route('domains.index') }}" class="btn btn-secondary">
<i class="bi bi-x-circle"></i> Cancel
</a>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
+129
View File
@@ -0,0 +1,129 @@
@extends('layouts.app')
@section('title', 'Domain Monitoring')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-globe"></i> Domain Monitoring</h1>
<a href="{{ route('domains.create') }}" class="btn btn-primary">
<i class="bi bi-plus-circle"></i> Add Domain
</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($domains->isEmpty())
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> No domains are being monitored yet. Click "Add Domain" 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>Domain</th>
<th>Site</th>
<th>Status</th>
<th>Expires At</th>
<th>Days Left</th>
<th>Last Checked</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach($domains as $domain)
<tr>
<td>
<strong>{{ $domain->domain }}</strong>
</td>
<td>
<a href="{{ route('dashboard.show', $domain->site) }}">
{{ $domain->site->name }}
</a>
</td>
<td>
@if($domain->isExpired())
<span class="badge bg-danger">Expired</span>
@elseif($domain->isExpiringSoon())
<span class="badge bg-warning text-dark">Expiring Soon</span>
@elseif($domain->expires_at)
<span class="badge bg-success">Active</span>
@else
<span class="badge bg-secondary">Unknown</span>
@endif
</td>
<td>
@if($domain->expires_at)
{{ $domain->expires_at->format('Y-m-d') }}
@else
<span class="text-muted">Not checked</span>
@endif
</td>
<td>
@php
$days = $domain->daysUntilExpiration();
@endphp
@if($days !== null)
@if($days < 0)
<span class="text-danger fw-bold">Expired {{ abs($days) }} days ago</span>
@elseif($days < 30)
<span class="text-warning fw-bold">{{ $days }} days</span>
@else
<span class="text-success">{{ $days }} days</span>
@endif
@else
<span class="text-muted">-</span>
@endif
</td>
<td>
@if($domain->last_checked_at)
<small>{{ $domain->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('domains.show', $domain) }}" class="btn btn-outline-primary" title="View">
<i class="bi bi-eye"></i>
</a>
<a href="{{ route('domains.edit', $domain) }}" class="btn btn-outline-secondary" title="Edit">
<i class="bi bi-pencil"></i>
</a>
<form action="{{ route('domains.check', $domain) }}" method="POST" class="d-inline">
@csrf
<button type="submit" class="btn btn-outline-info" title="Check Now">
<i class="bi bi-arrow-clockwise"></i>
</button>
</form>
<form action="{{ route('domains.destroy', $domain) }}" method="POST" class="d-inline"
onsubmit="return confirm('Are you sure you want to delete this domain?');">
@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($domains->hasPages())
<div class="card-footer">
{{ $domains->links() }}
</div>
@endif
</div>
@endif
@endsection
+178
View File
@@ -0,0 +1,178 @@
@extends('layouts.app')
@section('title', 'Domain Details')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-globe"></i> Domain Details</h1>
<div>
<a href="{{ route('domains.edit', $domain) }}" class="btn btn-secondary">
<i class="bi bi-pencil"></i> Edit
</a>
<a href="{{ route('domains.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">Domain Information</h5>
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col-md-4 fw-bold">Domain Name:</div>
<div class="col-md-8">{{ $domain->domain }}</div>
</div>
<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', $domain->site) }}">
{{ $domain->site->name }}
</a>
<br>
<small class="text-muted">{{ $domain->site->url }}</small>
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Status:</div>
<div class="col-md-8">
@if($domain->isExpired())
<span class="badge bg-danger fs-6">Expired</span>
@elseif($domain->isExpiringSoon())
<span class="badge bg-warning text-dark fs-6">Expiring Soon</span>
@elseif($domain->expires_at)
<span class="badge bg-success fs-6">Active</span>
@else
<span class="badge bg-secondary fs-6">Unknown</span>
@endif
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Monitoring:</div>
<div class="col-md-8">
@if($domain->is_active)
<span class="badge bg-success">Active</span>
@else
<span class="badge bg-secondary">Inactive</span>
@endif
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<h5 class="mb-0">Expiration Details</h5>
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col-md-4 fw-bold">Expires At:</div>
<div class="col-md-8">
@if($domain->expires_at)
{{ $domain->expires_at->format('F j, Y') }}
<br>
<small class="text-muted">{{ $domain->expires_at->format('g:i A T') }}</small>
@else
<span class="text-muted">Not yet checked</span>
@endif
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Days Until Expiration:</div>
<div class="col-md-8">
@php
$days = $domain->daysUntilExpiration();
@endphp
@if($days !== null)
@if($days < 0)
<span class="text-danger fs-4 fw-bold">Expired {{ abs($days) }} days ago</span>
@elseif($days < 30)
<span class="text-warning fs-4 fw-bold">{{ $days }} days</span>
@else
<span class="text-success fs-4 fw-bold">{{ $days }} days</span>
@endif
@else
<span class="text-muted">Unknown</span>
@endif
</div>
</div>
<div class="row mb-3">
<div class="col-md-4 fw-bold">Last Checked:</div>
<div class="col-md-8">
@if($domain->last_checked_at)
{{ $domain->last_checked_at->format('F j, Y g:i A') }}
<br>
<small class="text-muted">{{ $domain->last_checked_at->diffForHumans() }}</small>
@else
<span class="text-muted">Never</span>
@endif
</div>
</div>
</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('domains.check', $domain) }}" method="POST" class="mb-3">
@csrf
<button type="submit" class="btn btn-primary w-100">
<i class="bi bi-arrow-clockwise"></i> Check Expiry Now
</button>
</form>
<a href="{{ route('domains.edit', $domain) }}" class="btn btn-secondary w-100 mb-3">
<i class="bi bi-pencil"></i> Edit Domain
</a>
<form action="{{ route('domains.destroy', $domain) }}" method="POST"
onsubmit="return confirm('Are you sure you want to delete this domain?');">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger w-100">
<i class="bi bi-trash"></i> Delete Domain
</button>
</form>
</div>
</div>
@if($domain->isExpiringSoon() || $domain->isExpired())
<div class="card border-{{ $domain->isExpired() ? 'danger' : 'warning' }}">
<div class="card-header bg-{{ $domain->isExpired() ? 'danger' : 'warning' }} text-{{ $domain->isExpired() ? 'white' : 'dark' }}">
<h5 class="mb-0"><i class="bi bi-exclamation-triangle"></i> Alert</h5>
</div>
<div class="card-body">
@if($domain->isExpired())
<p class="mb-0">
<strong>This domain has expired!</strong> Please renew it immediately to avoid losing ownership.
</p>
@else
<p class="mb-0">
<strong>This domain is expiring soon!</strong> Consider renewing it to prevent any interruptions.
</p>
@endif
</div>
</div>
@endif
</div>
</div>
@endsection