23-01-2026
This commit is contained in:
parent
8fd1f4d451
commit
389d5d1820
59 changed files with 9642 additions and 883 deletions
235
resources/views/newsletter/detail.blade.php
Normal file
235
resources/views/newsletter/detail.blade.php
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
<h4 class="d-flex justify-content-between align-items-center w-100 font-weight-bold py-3 mb-4">
|
||||
<div>
|
||||
<i class="ion ion-md-contact text-primary"></i> Newsletter-Kontakt
|
||||
</div>
|
||||
<div>
|
||||
<a href="{{ route('newsletter.index') }}" class="btn btn-secondary btn-sm">
|
||||
<i class="fa fa-arrow-left"></i> Zurück
|
||||
</a>
|
||||
<a href="{{ route('newsletter.edit', $contact->id) }}" class="btn btn-primary btn-sm">
|
||||
<i class="fa fa-edit"></i> Bearbeiten
|
||||
</a>
|
||||
</div>
|
||||
</h4>
|
||||
|
||||
@if (Session::has('alert-success'))
|
||||
<div class="alert alert-success alert-dismissible fade show">
|
||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||
{{ Session::get('alert-success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<!-- Linke Spalte -->
|
||||
<div class="col-md-8">
|
||||
<!-- Kontakt-Informationen -->
|
||||
<div class="card mb-4">
|
||||
<h6 class="card-header">Kontakt-Informationen</h6>
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless">
|
||||
<tr>
|
||||
<th width="30%">E-Mail:</th>
|
||||
<td><a href="mailto:{{ $contact->email }}">{{ $contact->email }}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Name:</th>
|
||||
<td>{{ $contact->full_name ?: '-' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Vorname:</th>
|
||||
<td>{{ $contact->firstname ?: '-' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Nachname:</th>
|
||||
<td>{{ $contact->lastname ?: '-' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Status:</th>
|
||||
<td>{!! $contact->status_badge !!}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Gruppen:</th>
|
||||
<td>
|
||||
@if ($contact->group_kulturreisen)
|
||||
<span class="badge badge-info">Kulturreisen</span>
|
||||
@endif
|
||||
@if ($contact->group_ferienwohnungen)
|
||||
<span class="badge badge-primary">Ferienwohnungen</span>
|
||||
@endif
|
||||
@if (!$contact->group_kulturreisen && !$contact->group_ferienwohnungen)
|
||||
<span class="text-muted">Keine Gruppe zugewiesen</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Herkunft:</th>
|
||||
<td>{{ $contact->source_label }}</td>
|
||||
</tr>
|
||||
@if ($contact->notes)
|
||||
<tr>
|
||||
<th>Notizen:</th>
|
||||
<td>{{ $contact->notes }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Buchungsstatistiken -->
|
||||
<div class="card mb-4">
|
||||
<h6 class="card-header">Buchungsstatistiken</h6>
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless">
|
||||
<tr>
|
||||
<th width="30%">Kulturreisen Buchungen:</th>
|
||||
<td>
|
||||
<span class="badge badge-secondary">{{ $contact->total_bookings_kulturreisen }}</span>
|
||||
@if ($contact->customer)
|
||||
<a href="{{ route('customer_detail', $contact->customer_id) }}"
|
||||
class="btn btn-sm btn-link">
|
||||
<i class="fa fa-external-link-alt"></i> Kunde anzeigen
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Ferienwohnungen Buchungen:</th>
|
||||
<td>
|
||||
<span class="badge badge-secondary">{{ $contact->total_bookings_ferienwohnungen }}</span>
|
||||
@if ($contact->travel_user)
|
||||
<a href="{{ route('travel_user_detail', $contact->travel_user_id) }}"
|
||||
class="btn btn-sm btn-link">
|
||||
<i class="fa fa-external-link-alt"></i> Kunde anzeigen
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Gesamt Buchungen:</th>
|
||||
<td><span class="badge badge-primary">{{ $contact->total_bookings }}</span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Letzte Buchung:</th>
|
||||
<td>{{ $contact->last_booking_at ? $contact->last_booking_at->format('d.m.Y') : '-' }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Aktivitäts-Log -->
|
||||
<div class="card">
|
||||
<h6 class="card-header">Aktivitäts-Log</h6>
|
||||
<div class="card-body">
|
||||
@if ($contact->logs->count() > 0)
|
||||
<div class="timeline">
|
||||
@foreach ($contact->logs as $log)
|
||||
<div class="timeline-item mb-3">
|
||||
<div class="d-flex">
|
||||
<div class="mr-3">
|
||||
<i
|
||||
class="fa fa-circle text-{{ $log->action === 'subscribed' ? 'success' : ($log->action === 'unsubscribed' ? 'danger' : 'info') }}"></i>
|
||||
</div>
|
||||
<div class="flex-grow-1">
|
||||
<div class="d-flex justify-content-between">
|
||||
<strong>{{ $log->action_label }}</strong>
|
||||
<small
|
||||
class="text-muted">{{ $log->created_at->format('d.m.Y H:i') }}</small>
|
||||
</div>
|
||||
@if ($log->description)
|
||||
<div class="text-muted">{{ $log->description }}</div>
|
||||
@endif
|
||||
@if ($log->user)
|
||||
<small class="text-muted">Durch: {{ $log->user->fullname }}</small>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@else
|
||||
<p class="text-muted">Keine Aktivitäten vorhanden</p>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Rechte Spalte -->
|
||||
<div class="col-md-4">
|
||||
<!-- Aktionen -->
|
||||
<div class="card mb-4">
|
||||
<h6 class="card-header">Aktionen</h6>
|
||||
<div class="card-body">
|
||||
@if ($contact->status === 'active')
|
||||
<form method="POST" action="{{ route('newsletter.unsubscribe', $contact->id) }}" class="mb-2">
|
||||
@csrf
|
||||
<div class="form-group">
|
||||
<label>Abmelde-Grund (optional)</label>
|
||||
<input type="text" name="reason" class="form-control form-control-sm"
|
||||
placeholder="z.B. Auf Wunsch des Kunden">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-warning btn-block btn-sm"
|
||||
onclick="return confirm('Kontakt wirklich abmelden?')">
|
||||
<i class="fa fa-times"></i> Kontakt abmelden
|
||||
</button>
|
||||
</form>
|
||||
@elseif($contact->status === 'unsubscribed')
|
||||
<form method="POST" action="{{ route('newsletter.resubscribe', $contact->id) }}" class="mb-2">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-success btn-block btn-sm"
|
||||
onclick="return confirm('Kontakt wieder aktivieren?')">
|
||||
<i class="fa fa-check"></i> Wieder aktivieren
|
||||
</button>
|
||||
</form>
|
||||
@endif
|
||||
|
||||
<form method="POST" action="{{ route('newsletter.delete', $contact->id) }}" class="mb-2">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-danger btn-block btn-sm"
|
||||
onclick="return confirm('Kontakt wirklich löschen?')">
|
||||
<i class="fa fa-trash"></i> Kontakt löschen
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Zeitstempel -->
|
||||
<div class="card">
|
||||
<h6 class="card-header">Zeitstempel</h6>
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless table-sm">
|
||||
<tr>
|
||||
<th>Erstellt:</th>
|
||||
<td>{{ $contact->created_at->format('d.m.Y H:i') }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Aktualisiert:</th>
|
||||
<td>{{ $contact->updated_at->format('d.m.Y H:i') }}</td>
|
||||
</tr>
|
||||
@if ($contact->subscribed_at)
|
||||
<tr>
|
||||
<th>Angemeldet:</th>
|
||||
<td>{{ $contact->subscribed_at->format('d.m.Y H:i') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@if ($contact->unsubscribed_at)
|
||||
<tr>
|
||||
<th>Abgemeldet:</th>
|
||||
<td>{{ $contact->unsubscribed_at->format('d.m.Y H:i') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
@if ($contact->last_synced_at)
|
||||
<tr>
|
||||
<th>Letzte Sync:</th>
|
||||
<td>{{ $contact->last_synced_at->format('d.m.Y H:i') }}</td>
|
||||
</tr>
|
||||
@endif
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
150
resources/views/newsletter/edit.blade.php
Normal file
150
resources/views/newsletter/edit.blade.php
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
<h4 class="d-flex justify-content-between align-items-center w-100 font-weight-bold py-3 mb-4">
|
||||
<div>
|
||||
<i class="ion ion-md-create text-primary"></i>
|
||||
{{ $id === 'new' ? 'Neuer Newsletter-Kontakt' : 'Newsletter-Kontakt bearbeiten' }}
|
||||
</div>
|
||||
<div>
|
||||
@if ($id !== 'new')
|
||||
<a href="{{ route('newsletter.detail', $contact->id) }}" class="btn btn-secondary btn-sm">
|
||||
<i class="fa fa-arrow-left"></i> Zurück
|
||||
</a>
|
||||
@else
|
||||
<a href="{{ route('newsletter.index') }}" class="btn btn-secondary btn-sm">
|
||||
<i class="fa fa-arrow-left"></i> Zurück
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</h4>
|
||||
|
||||
@if ($errors->any())
|
||||
<div class="alert alert-danger alert-dismissible fade show">
|
||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||
<ul class="mb-0">
|
||||
@foreach ($errors->all() as $error)
|
||||
<li>{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ route('newsletter.store', $id) }}">
|
||||
@csrf
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="form-label">E-Mail-Adresse <span class="text-danger">*</span></label>
|
||||
<input type="email" name="email" class="form-control @error('email') is-invalid @enderror"
|
||||
value="{{ old('email', $contact->email) }}" required>
|
||||
@error('email')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Vorname</label>
|
||||
<input type="text" name="firstname" class="form-control"
|
||||
value="{{ old('firstname', $contact->firstname) }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Nachname</label>
|
||||
<input type="text" name="lastname" class="form-control"
|
||||
value="{{ old('lastname', $contact->lastname) }}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Status <span class="text-danger">*</span></label>
|
||||
<select name="status" class="form-control @error('status') is-invalid @enderror" required>
|
||||
@foreach (\App\Models\NewsletterContact::$statusLabels as $key => $label)
|
||||
<option value="{{ $key }}"
|
||||
{{ old('status', $contact->status) === $key ? 'selected' : '' }}>
|
||||
{{ $label }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('status')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Herkunft</label>
|
||||
<select name="source" class="form-control">
|
||||
@foreach (\App\Models\NewsletterContact::$sourceLabels as $key => $label)
|
||||
<option value="{{ $key }}"
|
||||
{{ old('source', $contact->source) === $key ? 'selected' : '' }}>
|
||||
{{ $label }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Newsletter-Gruppen</label>
|
||||
<div class="custom-controls-stacked">
|
||||
<label class="custom-control custom-checkbox">
|
||||
<input type="checkbox" name="group_kulturreisen" class="custom-control-input"
|
||||
value="1"
|
||||
{{ old('group_kulturreisen', $contact->group_kulturreisen) ? 'checked' : '' }}>
|
||||
<span class="custom-control-label">Kulturreisen</span>
|
||||
</label>
|
||||
<label class="custom-control custom-checkbox">
|
||||
<input type="checkbox" name="group_ferienwohnungen" class="custom-control-input"
|
||||
value="1"
|
||||
{{ old('group_ferienwohnungen', $contact->group_ferienwohnungen) ? 'checked' : '' }}>
|
||||
<span class="custom-control-label">Ferienwohnungen</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Notizen</label>
|
||||
<textarea name="notes" class="form-control" rows="4">{{ old('notes', $contact->notes) }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="my-4">
|
||||
|
||||
<div class="text-right">
|
||||
@if ($id !== 'new')
|
||||
<a href="{{ route('newsletter.detail', $contact->id) }}" class="btn btn-secondary">
|
||||
Abbrechen
|
||||
</a>
|
||||
@else
|
||||
<a href="{{ route('newsletter.index') }}" class="btn btn-secondary">
|
||||
Abbrechen
|
||||
</a>
|
||||
@endif
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fa fa-save"></i> Speichern
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
322
resources/views/newsletter/index.blade.php
Normal file
322
resources/views/newsletter/index.blade.php
Normal file
|
|
@ -0,0 +1,322 @@
|
|||
@extends('layouts.layout-2')
|
||||
|
||||
@section('content')
|
||||
<h4 class="d-flex justify-content-between align-items-center w-100 font-weight-bold py-3 mb-4">
|
||||
<div>
|
||||
<i class="ion ion-md-mail text-primary"></i> Newsletter-Kontakte
|
||||
</div>
|
||||
<div>
|
||||
<a href="{{ route('newsletter.edit', 'new') }}" class="btn btn-primary btn-sm">
|
||||
<i class="fa fa-plus"></i> Neuer Kontakt
|
||||
</a>
|
||||
</div>
|
||||
</h4>
|
||||
|
||||
@if (Session::has('alert-success'))
|
||||
<div class="alert alert-success alert-dismissible fade show">
|
||||
<button type="button" class="close" data-dismiss="alert">×</button>
|
||||
{{ Session::get('alert-success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Statistiken -->
|
||||
<div class="row">
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="lnr lnr-users display-4 text-primary"></div>
|
||||
<div class="ml-3">
|
||||
<div class="text-muted small">Gesamte Kontakte</div>
|
||||
<div class="text-large">{{ $statistics['total'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="lnr lnr-checkmark-circle display-4 text-success"></div>
|
||||
<div class="ml-3">
|
||||
<div class="text-muted small">Aktive Kontakte</div>
|
||||
<div class="text-large">{{ $statistics['active'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="lnr lnr-map display-4 text-info"></div>
|
||||
<div class="ml-3">
|
||||
<div class="text-muted small">Kulturreisen</div>
|
||||
<div class="text-large">{{ $statistics['kulturreisen'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6 col-xl-3">
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="lnr lnr-home display-4 text-primary"></div>
|
||||
<div class="ml-3">
|
||||
<div class="text-muted small">Ferienwohnungen</div>
|
||||
<div class="text-large">{{ $statistics['ferienwohnungen'] }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Filter & Aktionen -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
<label>Gruppe</label>
|
||||
<select class="form-control" id="filter-group">
|
||||
<option value="">Alle Gruppen</option>
|
||||
<option value="kulturreisen">Kulturreisen</option>
|
||||
<option value="ferienwohnungen">Ferienwohnungen</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label>Status</label>
|
||||
<select class="form-control" id="filter-status">
|
||||
<option value="">Alle Status</option>
|
||||
<option value="active">Aktiv</option>
|
||||
<option value="inactive">Inaktiv</option>
|
||||
<option value="unsubscribed">Abgemeldet</option>
|
||||
<option value="bounced">Bounced</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label>Herkunft</label>
|
||||
<select class="form-control" id="filter-source">
|
||||
<option value="">Alle Herkünfte</option>
|
||||
<option value="booking_kulturreisen">Buchung Kulturreisen</option>
|
||||
<option value="booking_ferienwohnungen">Buchung Ferienwohnungen</option>
|
||||
<option value="newsletter_signup">Newsletter-Anmeldung</option>
|
||||
<option value="manual">Manuell</option>
|
||||
<option value="import">Import</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label> </label>
|
||||
<button type="button" class="btn btn-primary btn-block" id="btn-filter">
|
||||
<i class="fa fa-filter"></i> Filtern
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-3">
|
||||
<label>Letzte Reise von</label>
|
||||
<input type="text" class="form-control datepicker-base" id="filter-travel-from"
|
||||
placeholder="TT.MM.JJJJ">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label>Letzte Reise bis</label>
|
||||
<input type="text" class="form-control datepicker-base" id="filter-travel-to"
|
||||
placeholder="TT.MM.JJJJ">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label> </label>
|
||||
<button type="button" class="btn btn-secondary btn-block" id="btn-reset-filter">
|
||||
<i class="fa fa-times"></i> Filter zurücksetzen
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-12">
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-success btn-sm" onclick="syncContacts('all', false)">
|
||||
<i class="fa fa-sync"></i> Synchronisieren
|
||||
</button>
|
||||
<button type="button" class="btn btn-warning btn-sm" onclick="syncContacts('all', true)">
|
||||
<i class="fa fa-sync"></i> Voll-Sync (alle)
|
||||
</button>
|
||||
</div>
|
||||
<button type="button" class="btn btn-info btn-sm ml-2" onclick="exportContacts()">
|
||||
<i class="fa fa-download"></i> Export (mit aktuellen Filtern)
|
||||
</button>
|
||||
@if ($statistics['last_sync'])
|
||||
<small class="text-muted ml-3">
|
||||
Letzte Synchronisation: {{ $statistics['last_sync'] }}
|
||||
</small>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tabelle -->
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-bordered" id="newsletter-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>E-Mail</th>
|
||||
<th>Name</th>
|
||||
<th>Gruppen</th>
|
||||
<th>Status</th>
|
||||
<th>Herkunft</th>
|
||||
<th>Buchungen</th>
|
||||
<th>Letzte Reise</th>
|
||||
<th>Letzte Buchung</th>
|
||||
<th>Erstellt</th>
|
||||
<th>Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
var table = $('#newsletter-table').DataTable({
|
||||
processing: true,
|
||||
serverSide: true,
|
||||
ajax: {
|
||||
url: '{{ route('newsletter.datatable') }}',
|
||||
data: function(d) {
|
||||
d.group = $('#filter-group').val();
|
||||
d.status = $('#filter-status').val();
|
||||
d.source = $('#filter-source').val();
|
||||
d.travel_from = $('#filter-travel-from').val();
|
||||
d.travel_to = $('#filter-travel-to').val();
|
||||
}
|
||||
},
|
||||
columns: [{
|
||||
data: 'id',
|
||||
name: 'id'
|
||||
},
|
||||
{
|
||||
data: 'email',
|
||||
name: 'email'
|
||||
},
|
||||
{
|
||||
data: 'full_name',
|
||||
name: 'full_name',
|
||||
orderable: false,
|
||||
searchable: false
|
||||
},
|
||||
{
|
||||
data: 'groups',
|
||||
name: 'groups',
|
||||
orderable: false,
|
||||
searchable: false
|
||||
},
|
||||
{
|
||||
data: 'status_badge',
|
||||
name: 'status'
|
||||
},
|
||||
{
|
||||
data: 'source_label',
|
||||
name: 'source_label'
|
||||
},
|
||||
{
|
||||
data: 'total_bookings',
|
||||
name: 'total_bookings',
|
||||
orderable: false,
|
||||
searchable: false
|
||||
},
|
||||
{
|
||||
data: 'last_travel',
|
||||
name: 'last_travel_end_date'
|
||||
},
|
||||
{
|
||||
data: 'last_booking',
|
||||
name: 'last_booking_at'
|
||||
},
|
||||
{
|
||||
data: 'created',
|
||||
name: 'created_at'
|
||||
},
|
||||
{
|
||||
data: 'actions',
|
||||
name: 'actions',
|
||||
orderable: false,
|
||||
searchable: false
|
||||
}
|
||||
],
|
||||
order: [
|
||||
[0, 'desc']
|
||||
],
|
||||
iDisplayLength: 50,
|
||||
language: {
|
||||
url: '//cdn.datatables.net/plug-ins/1.10.24/i18n/German.json'
|
||||
}
|
||||
});
|
||||
|
||||
$('#btn-filter').on('click', function() {
|
||||
table.draw();
|
||||
});
|
||||
|
||||
$('#btn-reset-filter').on('click', function() {
|
||||
$('#filter-group').val('');
|
||||
$('#filter-status').val('');
|
||||
$('#filter-source').val('');
|
||||
$('#filter-travel-from').val('');
|
||||
$('#filter-travel-to').val('');
|
||||
table.draw();
|
||||
});
|
||||
});
|
||||
|
||||
function syncContacts(type, force) {
|
||||
if (!confirm('Möchten Sie die Synchronisation wirklich starten?')) {
|
||||
return;
|
||||
}
|
||||
|
||||
var url = '{{ route('newsletter.sync') }}';
|
||||
var data = {
|
||||
type: type,
|
||||
_token: '{{ csrf_token() }}'
|
||||
};
|
||||
|
||||
if (force) {
|
||||
data.force = true;
|
||||
}
|
||||
|
||||
$.post(url, data, function(response) {
|
||||
location.reload();
|
||||
}).fail(function() {
|
||||
alert('Fehler bei der Synchronisation');
|
||||
});
|
||||
}
|
||||
|
||||
function exportContacts() {
|
||||
var params = [];
|
||||
|
||||
var group = $('#filter-group').val();
|
||||
var status = $('#filter-status').val();
|
||||
var source = $('#filter-source').val();
|
||||
var travelFrom = $('#filter-travel-from').val();
|
||||
var travelTo = $('#filter-travel-to').val();
|
||||
|
||||
if (group) params.push('group=' + encodeURIComponent(group));
|
||||
if (status) params.push('status=' + encodeURIComponent(status));
|
||||
if (source) params.push('source=' + encodeURIComponent(source));
|
||||
if (travelFrom) params.push('travel_from=' + encodeURIComponent(travelFrom));
|
||||
if (travelTo) params.push('travel_to=' + encodeURIComponent(travelTo));
|
||||
|
||||
var url = '{{ route('newsletter.export') }}';
|
||||
if (params.length > 0) {
|
||||
url += '?' + params.join('&');
|
||||
}
|
||||
|
||||
window.location.href = url;
|
||||
}
|
||||
</script>
|
||||
@endsection
|
||||
Loading…
Add table
Add a link
Reference in a new issue