Initial Commit

This commit is contained in:
2026-01-07 15:46:00 +01:00
commit 7133af82e3
1454 changed files with 362274 additions and 0 deletions

11
resources/css/app.css Normal file
View File

@@ -0,0 +1,11 @@
@import 'tailwindcss';
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
@source '../../storage/framework/views/*.php';
@source '../**/*.blade.php';
@source '../**/*.js';
@theme {
--font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
}

1
resources/js/app.js Normal file
View File

@@ -0,0 +1 @@
import './bootstrap';

4
resources/js/bootstrap.js vendored Normal file
View File

@@ -0,0 +1,4 @@
import axios from 'axios';
window.axios = axios;
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

View File

@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html>
<head>
<!-- Basic Page Info -->
<meta charset="utf-8" />
<title>@yield('pageTitle')</title>
<!-- Site favicon -->
<link rel="apple-touch-icon" sizes="180x180" href="/back/vendors/images/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/back/vendors/images/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/back/vendors/images/favicon-16x16.png" />
<!-- Mobile Specific Metas -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<!-- Google Font -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap"
rel="stylesheet" />
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="/back/vendors/styles/core.css" />
<link rel="stylesheet" type="text/css" href="/back/vendors/styles/icon-font.min.css" />
<link rel="stylesheet" type="text/css" href="/back/vendors/styles/style.css" />
@yield('stylesheets')
</head>
<body class="login-page">
<div class="login-header box-shadow">
<div class="container-fluid d-flex justify-content-between align-items-center">
<div class="brand-logo">
<a href="/">
<img src="/images/site/{{ isset(settings()->site_logo) ? settings()->site_logo : '' }}"
alt="logo" />
</a>
</div>
<!-- <div class="login-menu">
<ul>
<li><a href="register.html">Register</a></li>
</ul>
</div> -->
</div>
</div>
<div class="login-wrap d-flex align-items-center flex-wrap justify-content-center">
<div class="container">
<div class="row align-items-center">
<div class="col-md-6 col-lg-7">
<img src="/back/vendors/images/login-page-img.png" alt="bg_image" />
</div>
<div class="col-md-6 col-lg-5">
@yield('content')
</div>
</div>
</div>
</div>
<!-- js -->
<script src="/back/vendors/scripts/core.js"></script>
<script src="/back/vendors/scripts/script.min.js"></script>
<script src="/back/vendors/scripts/process.js"></script>
<script src="/back/vendors/scripts/layout-settings.js"></script>
@yield('scripts')
</body>
</html>

View File

@@ -0,0 +1,296 @@
<!DOCTYPE html>
<html>
<head>
<!-- Basic Page Info -->
<meta charset="utf-8" />
<title>@yield('pageTitle')</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<!-- Site favicon -->
<link rel="icon" type="image/png" sizes="16x16"
whref="/images/site/{{ isset(settings()->site_favicon) ? settings()->site_favicon : '' }}" />
<!-- Mobile Specific Metas -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<!-- Google Font -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap"
rel="stylesheet" />
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="{{ asset('/back/vendors/styles/core.css') }}" />
<link rel="stylesheet" type="text/css" href="{{ asset('/back/vendors/styles/icon-font.min.css') }}" />
<link rel="stylesheet" type="text/css" href="{{ asset('/back/vendors/styles/style.css') }}" />
<link rel="stylesheet" href="{{ asset('/extra-assets/jquery-ui/jquery-ui.min.css') }}" />
<link rel="stylesheet" href="{{ asset('/extra-assets/jquery-ui/jquery-ui.structure.min.css') }}" />
<link rel="stylesheet" href="{{ asset('/extra-assets/jquery-ui/jquery-ui.theme.min.css') }}" />
<link rel="stylesheet" type="text/css"
href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" />
@stack('stylesheets')
@kropifyStyles
</head>
<body>
<div class="header">
<div class="header-left">
<div class="menu-icon bi bi-list"></div>
<div class="search-toggle-icon bi bi-search" data-toggle="header_search"></div>
</div>
<div class="header-right">
<div class="dashboard-setting user-notification">
<div class="dropdown">
<a class="dropdown-toggle no-arrow" href="javascript:;" data-toggle="right-sidebar">
<i class="dw dw-settings2"></i>
</a>
</div>
</div>
@livewire('admin.top-user-info')
</div>
</div>
<div class="right-sidebar">
<div class="sidebar-title">
<h3 class="weight-600 font-16 text-blue">
Layout Einstellungen
<span class="btn-block font-weight-400 font-12">User Interface Einstellungen</span>
</h3>
<div class="close-sidebar" data-toggle="right-sidebar-close">
<i class="icon-copy ion-close-round"></i>
</div>
</div>
<div class="right-sidebar-body customscroll">
<div class="right-sidebar-body-content">
<h4 class="weight-600 font-18 pb-10">Header Hintergrund</h4>
<div class="sidebar-btn-group pb-30 mb-10">
<a href="javascript:void(0);" class="btn btn-outline-primary header-white active">White</a>
<a href="javascript:void(0);" class="btn btn-outline-primary header-dark">Dark</a>
</div>
<h4 class="weight-600 font-18 pb-10">Sidebar Hintergrund</h4>
<div class="sidebar-btn-group pb-30 mb-10">
<a href="javascript:void(0);" class="btn btn-outline-primary sidebar-light active">White</a>
<a href="javascript:void(0);" class="btn btn-outline-primary sidebar-dark">Dark</a>
</div>
<h4 class="weight-600 font-18 pb-10">Menu Dropdown Icon</h4>
<div class="sidebar-radio-group pb-10 mb-10">
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebaricon-1" name="menu-dropdown-icon" class="custom-control-input"
value="icon-style-1" checked="" />
<label class="custom-control-label" for="sidebaricon-1"><i class="fa fa-angle-down"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebaricon-2" name="menu-dropdown-icon" class="custom-control-input"
value="icon-style-2" />
<label class="custom-control-label" for="sidebaricon-2"><i class="ion-plus-round"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebaricon-3" name="menu-dropdown-icon" class="custom-control-input"
value="icon-style-3" />
<label class="custom-control-label" for="sidebaricon-3"><i
class="fa fa-angle-double-right"></i></label>
</div>
</div>
<h4 class="weight-600 font-18 pb-10">Menu List Icon</h4>
<div class="sidebar-radio-group pb-30 mb-10">
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebariconlist-1" name="menu-list-icon" class="custom-control-input"
value="icon-list-style-1" checked="" />
<label class="custom-control-label" for="sidebariconlist-1"><i
class="ion-minus-round"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebariconlist-2" name="menu-list-icon"
class="custom-control-input" value="icon-list-style-2" />
<label class="custom-control-label" for="sidebariconlist-2"><i class="fa fa-circle-o"
aria-hidden="true"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebariconlist-3" name="menu-list-icon"
class="custom-control-input" value="icon-list-style-3" />
<label class="custom-control-label" for="sidebariconlist-3"><i
class="dw dw-check"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebariconlist-4" name="menu-list-icon"
class="custom-control-input" value="icon-list-style-4" checked="" />
<label class="custom-control-label" for="sidebariconlist-4"><i
class="icon-copy dw dw-next-2"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebariconlist-5" name="menu-list-icon"
class="custom-control-input" value="icon-list-style-5" />
<label class="custom-control-label" for="sidebariconlist-5"><i
class="dw dw-fast-forward-1"></i></label>
</div>
<div class="custom-control custom-radio custom-control-inline">
<input type="radio" id="sidebariconlist-6" name="menu-list-icon"
class="custom-control-input" value="icon-list-style-6" />
<label class="custom-control-label" for="sidebariconlist-6"><i
class="dw dw-next"></i></label>
</div>
</div>
<div class="reset-options pt-30 text-center">
<button class="btn btn-danger" id="reset-settings">
Einstellungen zurücksetzen
</button>
</div>
</div>
</div>
</div>
<div class="left-side-bar">
<div class="brand-logo">
<a href="/">
<img src="/images/site/{{ isset(settings()->site_logo) ? settings()->site_logo : '' }}"
alt="brand-logo" class="dark-logo" />
<img src="/images/site/{{ isset(settings()->site_logo) ? settings()->site_logo : '' }}"
alt="brand-logo" class="light-logo" />
</a>
<div class="close-sidebar" data-toggle="left-sidebar-close">
<i class="ion-close-round"></i>
</div>
</div>
<div class="menu-block customscroll">
<div class="sidebar-menu">
<ul id="accordion-menu">
<li>
<a href="{{ route('admin.dashboard') }}"
class="dropdown-toggle no-arrow {{ Route::is('admin.dashboard') ? 'active' : '' }}">
<span class="micon bi bi-house"></span><span class="mtext">Home</span>
</a>
</li>
@if (auth()->user()->type == 'superAdmin')
<li>
<a href="{{ route('admin.categories') }}"
class="dropdown-toggle no-arrow {{ Route::is('admin.categories') ? 'active' : '' }}">
<span class="micon fa fa-th-list"></span><span class="mtext">Kategorien</span>
</a>
</li>
@endif
<li class="dropdown">
<a href="javascript:;"
class="dropdown-toggle {{ Route::is('admin.add_posts') || Route::is('admin.posts') || Route::is('admin.edit_post') ? 'active' : '' }}">
<span class="micon fa fa-newspaper-o"></span><span class="mtext"> Posts </span>
</a>
<ul class="submenu">
<li><a href="{{ route('admin.add_post') }}"
class="{{ Route::is('admin.add_post') ? 'active' : '' }}">Neuen
Post</a></li>
<li><a href="{{ route('admin.posts') }}"
class="{{ Route::is('admin.posts') ? 'active' : '' }}">Posts</a>
</li>
</ul>
</li>
<li>
<div class="dropdown-divider"></div>
</li>
<li>
<div class="sidebar-small-cap">Einstellungen</div>
</li>
<li>
<a href="{{ route('admin.profile') }}"
class="dropdown-toggle no-arrow {{ Route::is('admin.profile') ? 'active' : '' }}">
<span class="micon fa fa-user-circle"></span>
<span class="mtext">Profile</span>
</a>
</li>
@if (auth()->user()->type == 'superAdmin')
<li>
<a href="{{ route('admin.settings') }}"
class="dropdown-toggle no-arrow {{ Route::is('admin.settings') ? 'active' : '' }}">
<span class="micon fa fa-cogs"></span>
<span class="mtext">Allgemein</span>
</a>
</li>
<li>
<a href="{{ route('admin.slider') }}"
class="dropdown-toggle no-arrow {{ Route::is('admin.slider') ? 'active' : '' }}">
<span class="micon dw dw-image"></span>
<span class="mtext">Manage Slider</span>
</a>
</li>
@endif
</ul>
</div>
</div>
</div>
<div class="mobile-menu-overlay"></div>
<div class="main-container">
<div class="pd-ltr-20 xs-pd-20-10">
<div class="min-height-200px">
<div class="">
@yield('content')
</div>
</div>
<div class="footer-wrap pd-20 mb-20 card-box">
DeskApp - Bootstrap 4 Admin Template By
<a href="https://github.com/dropways" target="_blank">Ankit Hingarajiya</a>
</div>
</div>
</div>
<!-- js -->
<script src="{{ asset('/back/vendors/scripts/core.js') }}"></script>
<script src="{{ asset('/back/vendors/scripts/script.min.js') }}"></script>
<script src="{{ asset('/back/vendors/scripts/process.js') }}"></script>
<script src="{{ asset('/back/vendors/scripts/layout-settings.js') }}"></script>
<script src="{{ asset('/extra-assets/jquery-ui/jquery-ui.min.js') }}"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
toastr.options = {
"closeButton": true,
"newestOnTop": false,
"progressBar": true,
"positionClass": "toast-bottom-right",
"preventDuplicates": false,
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
};
window.addEventListener("showToastr", function(event) {
const type = event.detail[0].type; // z.B. 'success', 'error', 'info', 'warning'
const message = event.detail[0].message; // Text der Meldung
const Toast = Swal.mixin({
toast: true,
position: "bottom-end",
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
didOpen: (toast) => {
toast.onmouseenter = Swal.stopTimer;
toast.onmouseleave = Swal.resumeTimer;
}
});
Toast.fire({
icon: type,
title: message
});
// Dynamischer Aufruf: toastr.success(message), toastr.error(message) etc.
/* if (typeof toastr[type] === 'function') {
toastr[type](message);
} else {
// Fallback, falls ein unbekannter Typ kommt
toastr.info(message);
} */
});
</script>
@kropifyScripts
@stack('scripts')
</body>
</html>

View File

@@ -0,0 +1,269 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="page-header">
<div class="row">
<div class="col-md-6 col-sm-12">
<div class="title">
<h4>Post hinzufügen</h4>
</div>
<nav aria-label="breadcrumb" role="navigation">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard') }}">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Post erstellen
</li>
</ol>
</nav>
</div>
<div class="col-md-6 col-sm-12 text-right">
<a href="{{ route('admin.posts') }}" class="btn btn-primary">View all posts</a>
</div>
</div>
</div>
<form action="{{ route('admin.create_post') }}" method="POST" autocomplete="off" enctype="multipart/form-data"
id="addPostForm">
@csrf
<div class="row">
<div class="col-md-9">
<div class="card card-box mb-2">
<div class="card-body">
<div class="form-group">
<label for=""><b>Title:</b></label>
<input type="text" class="form-control" name="title" placeholder="Titel angeben" />
<span class="text-danger error-text title_error"></span>
</div>
<div class="form-group">
<label for=""><b>Content:</b></label>
<textarea name="content" id="content" cols="30" rows="10" class="ckeditor form-control"
placeholder="Content eingeben"></textarea>
<span class="text-danger error-text content_error"></span>
</div>
<div class="form-group">
<label for=""><b>JSON FAQ:</b></label>
<textarea name="structured_data" id="structured_data" cols="30" rows="10" class="form-control"
placeholder="JSON FAQ eingeben"></textarea>
</div>
</div>
</div>
<div class="card card-box mb-2">
<div class="card-header weight-500">SEO</div>
<div class="card-body">
<div class="form-group">
<label for=""><b>Post Meta Keywords:</b>: <small>(Separated by Komma)</small></label>
<input type="text" class="form-control" name="meta_keywords"
placeholder="Meta Keywords angeben" />
</div>
<div class="form-group">
<label for=""><b>Post Meta Beschreibung:</b></label>
<textarea name="meta_description" id="" cols="30" rows="10" class="form-control"
placeholder="Meta Beschreibung eingeben"></textarea>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card card-box mb-2">
<div class="card-body">
<div class="form-group">
<label for=""><b>Post Kategorie:</b></label>
<select name="category" id="" class="custom-select form-control">
<option value="">Auswählen..</option>
{!! $categories_html !!}
</select>
<span class="text-danger error-text category_error"></span>
</div>
<div class="form-group">
<label for=""><b>Post Featured Foto:</b></label>
<input type="file" class="form-control-file form-control" name="featured_image"
id="featured_image_input" height="auto" accept="image/png,image/jpeg, image/jpg" />
<span class="text-danger error-text featured_image_error"></span>
</div>
<div class="d-block mb-3" style="max-width:250px;">
<img src="" alt="featured_image" class="img-thumbnail" id="featured_image_preview" />
</div>
<div class="form-group">
<label for=""><b>Tags:</b></label>
<input type="text" class="form-control" name="tags" data-role="tagsinput" />
</div>
<hr>
<div class="form-group">
<label for=""><b>Sichtbar:</b></label>
<div class="custom-control custom-radio mb-5">
<input type="radio" name="visibility" id="customRadio1" class="custom-control-input"
value="1" checked />
<label for="customRadio1" class="custom-control-label">Öffentlich</label>
</div>
<div class="custom-control custom-radio mb-5">
<input type="radio" name="visibility" id="customRadio2" class="custom-control-input"
value="0" />
<label for="customRadio2" class="custom-control-label">Privat</label>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Post erstellen</button>
</div>
</form>
@endsection
@push('stylesheets')
<style>
/* Schlichter Container */
.bootstrap-tagsinput {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4px;
/* Abstand zwischen Tags/Eingabe */
width: 100%;
min-height: 40px;
padding: 6px 8px;
background-color: #ffffff;
border: 1px solid #d1d5db;
border-radius: 6px;
/* keine Ei-Form mehr */
box-shadow: none;
font-size: 14px;
line-height: 1.4;
cursor: text;
}
/* Eingabefeld */
.bootstrap-tagsinput input {
border: none;
box-shadow: none;
outline: none;
background: transparent;
padding: 2px 0;
margin: 0;
min-width: 80px;
max-width: 100%;
font-size: 14px;
color: #111827;
}
/* Placeholder */
.bootstrap-tagsinput.form-control input::-moz-placeholder {
color: #9ca3af;
opacity: 1;
}
.bootstrap-tagsinput.form-control input:-ms-input-placeholder {
color: #9ca3af;
}
.bootstrap-tagsinput.form-control input::-webkit-input-placeholder {
color: #9ca3af;
}
/* Tags */
.bootstrap-tagsinput .tag {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 10px;
border-radius: 999px;
background: #2563eb;
color: #ffffff;
font-size: 13px;
font-weight: 500;
white-space: nowrap;
margin: 0;
/* Abstand kommt über gap */
}
/* Remove-Icon */
.bootstrap-tagsinput .tag [data-role="remove"] {
display: inline-flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
border-radius: 999px;
cursor: pointer;
font-size: 11px;
line-height: 1;
background-color: rgba(15, 23, 42, 0.25);
margin-left: 0;
}
.bootstrap-tagsinput .tag [data-role="remove"]:after {
content: "×";
}
/* leichtes Hover nur auf dem Icon */
.bootstrap-tagsinput .tag [data-role="remove"]:hover {
background-color: rgba(15, 23, 42, 0.4);
}
</style>
@endpush
@push('scripts')
<script src="/back/src/plugins/bootstrap-tagsinput/bootstrap-tagsinput.js"></script>
<script src="/ckeditor/ckeditor.js"></script>
// Image Preview
<script>
document.getElementById("featured_image_input").addEventListener("change", function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
document.getElementById("featured_image_preview").src = event.target.result;
};
reader.readAsDataURL(file);
});
</script>
// Create Post
<script>
$('#addPostForm').on('submit', function(e) {
e.preventDefault();
var form = this;
var content = CKEDITOR.instances.content.getData();
var formdata = new FormData(form);
formdata.append('content', content);
$.ajax({
url: $(form).attr('action'),
method: $(form).attr('method'),
data: formdata,
processData: false,
dataType: 'json',
contentType: false,
beforeSend: function() {
$(form).find('span.error-text').text('');
},
success: function(data) {
if (data.status == 1) {
$(form)[0].reset();
CKEDITOR.instances.content.setData('');
$('img#featured_image_preview').attr('src', '');
$('input[name="tags"]').tagsinput('removeAll');
toastr.success(data.message);
} else {
toastr.error(data.message);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.log('AJAX error', textStatus, errorThrown);
console.log('Response:', jqXHR);
if (jqXHR.responseJSON && jqXHR.responseJSON.errors) {
$.each(jqXHR.responseJSON.errors, function(prefix, val) {
$(form).find('span.' + prefix + '_error').text(val[0]);
});
} else {
toastr.error('Es ist ein unerwarteter Fehler aufgetreten.');
}
}
});
});
</script>
@endpush

View File

@@ -0,0 +1,41 @@
@extends('back.layout.auth-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="login-box bg-white box-shadow border-radius-10">
<div class="login-title">
<h2 class="text-center text-primary">Passwort vergessen</h2>
</div>
<form action="{{ route('admin.send_password_reset_link') }}" method="POST">
<x-form-alerts></x-form-alerts>
@csrf
<div class="input-group custom mb-1">
<input type="text" class="form-control form-control-lg" placeholder="Email" name="email"
value="{{ old('email') }}" />
<div class="input-group-append custom">
<span class="input-group-text"><i class="fa fa-envelope-o" aria-hidden="true"></i></span>
</div>
</div>
@error('email')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
<div class="row align-items-center mb-1 mt-2">
<div class="col-5">
<div class="input-group mb-0">
<input class="btn btn-primary btn-lg btn-block" type="submit" value="Absenden">
</div>
</div>
<div class="col-2">
<div class="font-16 weight-600 text-center" data-color="#707373">
ODER
</div>
</div>
<div class="col-5">
<div class="input-group mb-0">
<a class="btn btn-outline-primary btn-lg btn-block" href="{{ route('admin.login') }}">Einloggen</a>
</div>
</div>
</div>
</form>
</div>
@endsection

View File

@@ -0,0 +1,54 @@
@extends('back.layout.auth-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="login-box bg-white box-shadow border-radius-10">
<div class="login-title">
<h2 class="text-center text-primary">Login</h2>
</div>
<form action="{{ route('admin.login_handler') }}" method="POST">
<x-form-alerts></x-form-alerts>
@csrf
<div class="input-group custom mb-1">
<input type="text" class="form-control form-control-lg" placeholder="Benutzername / Email" name="login_id"
value="{{ old('login_id') }}" />
<div class="input-group-append custom">
<span class="input-group-text"><i class="icon-copy dw dw-user1"></i></span>
</div>
</div>
@error('login_id')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
<div class="input-group custom mb-1 mt-2">
<input type="password" class="form-control form-control-lg" placeholder="**********" name="password" />
<div class="input-group-append custom">
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
</div>
</div>
@error('password')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
<div class="row pb-30">
<div class="col-6">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="customCheck1" />
<label class="custom-control-label" for="customCheck1">Eingeloggt bleiben</label>
</div>
</div>
<div class="col-6">
<div class="forgot-password">
<a href="{{ route('admin.forgot') }}">Password vergessen</a>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="input-group mb-0">
<input class="btn btn-primary btn-lg btn-block" type="submit" value="Einloggen">
</div>
</div>
</div>
</form>
</div>
@endsection

View File

@@ -0,0 +1,41 @@
@extends('back.layout.auth-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="login-box bg-white box-shadow border-radius-10">
<div class="login-title">
<h2 class="text-center text-primary">Passwort zurücksetzen</h2>
</div>
<h6 class="mb-20">Geben Sie Ihr neues Passwort ein, bestätigen Sie es und senden Sie es ab.</h6>
<form method="POST" action="{{ route('admin.reset_password_handler', ['token' => $token]) }}">
<x-form-alerts></x-form-alerts>
@csrf
<div class="input-group custom mb-1">
<input type="text" class="form-control form-control-lg" placeholder="Neues Passwort" name="new_password" />
<div class="input-group-append custom">
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
</div>
</div>
@error('new_password')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
<div class="input-group custom mb-1 mt-2">
<input type="text" class="form-control form-control-lg" placeholder="Neues Passwort bestätigen"
name="new_password_confirm" />
<div class="input-group-append custom">
<span class="input-group-text"><i class="dw dw-padlock1"></i></span>
</div>
</div>
@error('new_password_confirm')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
<div class="row align-items-center">
<div class="col-5">
<div class="input-group mb-0">
<input class="btn btn-primary btn-lg btn-block" type="submit" value="Absenden">
</div>
</div>
</div>
</form>
</div>
@endsection

View File

@@ -0,0 +1,94 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
@livewire('admin.categories')
@endsection
@push('scripts')
<script>
window.addEventListener("showParentCategoryModalForm", function() {
$('#pcategory_modal').modal("show");
});
window.addEventListener("hideParentCategoryModalForm", function() {
$('#pcategory_modal').modal("hide");
});
window.addEventListener("showCategoryModalForm", function() {
$('#category_modal').modal("show");
});
window.addEventListener("hideCategoryModalForm", function() {
$('#category_modal').modal("hide");
});
$('table tbody#sortable_parent_categories').sortable({
cursor: "move",
update: function(event, ui) {
$(this).children().each(function(index) {
if ($(this).attr('data-ordering') != (index + 1)) {
$(this).attr('data-ordering', (index + 1)).addClass('updated');
}
});
var positions = [];
$('.updated').each(function() {
positions.push([$(this).attr('data-index'), $(this).attr('data-ordering')]);
$(this).removeClass('updated');
});
Livewire.dispatch('updateParentCategoryOrdering', [positions]);
}
});
$('table tbody#sortable_categories').sortable({
cursor: "move",
update: function(event, ui) {
$(this).children().each(function(index) {
if ($(this).attr('data-ordering') != (index + 1)) {
$(this).attr('data-ordering', (index + 1)).addClass('updated');
}
});
var positions = [];
$('.updated').each(function() {
positions.push([$(this).attr('data-index'), $(this).attr('data-ordering')]);
$(this).removeClass('updated');
});
Livewire.dispatch('updateCategoryOrdering', [positions]);
}
});
window.addEventListener('deleteParentCategory', function(event) {
var id = event.detail[0].id;
Swal.fire({
title: "Bist du dir sicher?",
text: "Das du die Haupt Kategorie löschen möchtest!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: "Ja, löschen!"
}).then((result) => {
if (result.isConfirmed) {
Livewire.dispatch('deleteParentCategoryAction', [id]);
}
});
});
window.addEventListener('deleteCategory', function(event) {
var id = event.detail[0].id;
Swal.fire({
title: "Bist du dir sicher?",
text: "Das du die Kategorie löschen möchtest!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: "Ja, löschen!"
}).then((result) => {
if (result.isConfirmed) {
Livewire.dispatch('deleteCategoryAction', [id]);
}
});
});
</script>
@endpush

View File

@@ -0,0 +1,342 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="container-fluid py-4">
{{-- Überschrift, falls du sie brauchst --}}
<div class="mb-4">
<h1 class="h3 mb-0">{{ $pageTitle ?? 'Dashboard' }}</h1>
</div>
{{-- KPI-Karten: Tags / Posts / Subscriber --}}
<div class="row g-3 mb-4">
{{-- Tags (deine Zähl-Logik) --}}
<div class="col-12 col-md-4">
<div class="card h-100 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start mb-2">
<small class="text-muted text-uppercase fw-semibold">Tags</small>
<span class="badge bg-primary-subtle text-primary border border-primary-subtle">
Stückanzahl
</span>
</div>
<h3 class="fw-semibold mb-1">
{{ $tagsCount ?? 0 }}
</h3>
<small class="text-muted">Gesamtzahl (laut Feld <code>tags</code>)</small>
</div>
</div>
</div>
{{-- Posts --}}
<div class="col-12 col-md-4">
<div class="card h-100 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start mb-2">
<small class="text-muted text-uppercase fw-semibold">Posts</small>
<span class="badge bg-success-subtle text-success border border-success-subtle">
Stückanzahl
</span>
</div>
<h3 class="fw-semibold mb-1">
{{ $postsCount ?? 0 }}
</h3>
<small class="text-muted">Gesamtzahl der Posts</small>
</div>
</div>
</div>
{{-- Subscriber --}}
<div class="col-12 col-md-4">
<div class="card h-100 shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start mb-2">
<small class="text-muted text-uppercase fw-semibold">Subscriber</small>
<span class="badge bg-info-subtle text-info border border-info-subtle">
Stückanzahl
</span>
</div>
<h3 class="fw-semibold mb-1">
{{ $subscribersCount ?? 0 }}
</h3>
<small class="text-muted">Gesamtzahl der Abonnenten</small>
</div>
</div>
</div>
</div>
{{-- SEO / Content-Checks: KPIs --}}
<div class="row g-3 mb-4">
{{-- Posts ohne Meta-Beschreibung --}}
<div class="col-12 col-md-4">
<div class="card h-100 shadow-sm border-warning-subtle">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start mb-2">
<small class="text-muted text-uppercase fw-semibold">
Posts ohne Meta-Beschreibung
</small>
<span
class="badge
{{ ($postsWithoutMetaDescriptionCount ?? 0) > 0
? 'bg-warning-subtle text-warning border border-warning-subtle'
: 'bg-success-subtle text-success border border-success-subtle' }}">
{{ ($postsWithoutMetaDescriptionCount ?? 0) > 0 ? 'Optimieren' : 'OK' }}
</span>
</div>
<h3 class="fw-semibold mb-1">
{{ $postsWithoutMetaDescriptionCount ?? 0 }}
</h3>
<small class="text-muted">Anzahl Beiträge ohne Meta-Description</small>
</div>
</div>
</div>
{{-- Posts ohne Meta-Keywords --}}
<div class="col-12 col-md-4">
<div class="card h-100 shadow-sm border-warning-subtle">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start mb-2">
<small class="text-muted text-uppercase fw-semibold">
Posts ohne Meta-Keywords
</small>
<span
class="badge
{{ ($postsWithoutMetaKeywordsCount ?? 0) > 0
? 'bg-warning-subtle text-warning border border-warning-subtle'
: 'bg-success-subtle text-success border border-success-subtle' }}">
{{ ($postsWithoutMetaKeywordsCount ?? 0) > 0 ? 'Optimieren' : 'OK' }}
</span>
</div>
<h3 class="fw-semibold mb-1">
{{ $postsWithoutMetaKeywordsCount ?? 0 }}
</h3>
<small class="text-muted">Anzahl Beiträge ohne Meta-Keywords</small>
</div>
</div>
</div>
{{-- Posts ohne Tags --}}
<div class="col-12 col-md-4">
<div class="card h-100 shadow-sm border-warning-subtle">
<div class="card-body">
<div class="d-flex justify-content-between align-items-start mb-2">
<small class="text-muted text-uppercase fw-semibold">
Posts ohne Tags
</small>
<span
class="badge
{{ ($postsWithoutTagsCount ?? 0) > 0
? 'bg-warning-subtle text-warning border border-warning-subtle'
: 'bg-success-subtle text-success border border-success-subtle' }}">
{{ ($postsWithoutTagsCount ?? 0) > 0 ? 'Optimieren' : 'OK' }}
</span>
</div>
<h3 class="fw-semibold mb-1">
{{ $postsWithoutTagsCount ?? 0 }}
</h3>
<small class="text-muted">Beiträge ohne Eintrag im Feld <code>tags</code></small>
</div>
</div>
</div>
</div>
{{-- Letzte 5 Beiträge --}}
<div class="card shadow-sm mb-4">
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="card-title mb-0">Letzte 5 Beiträge</h6>
@if (Route::has('posts.index'))
<a href="{{ route('posts.index') }}" class="small text-decoration-none">
Alle anzeigen
</a>
@endif
</div>
<div class="table-responsive">
<table class="table table-sm align-middle mb-0">
<thead class="table-light">
<tr>
<th>Titel</th>
<th>Status</th>
<th>SEO</th>
<th>Erstellt am</th>
<th class="text-end">Aktionen</th>
</tr>
</thead>
<tbody>
@forelse($latestPosts as $post)
@php
$needsOptimization =
empty($post->meta_keywords) || empty($post->tags) || empty($post->meta_description); // ggf. Feldname anpassen (z.B. meta_title)
@endphp
<tr>
<td>
@if (Route::has('posts.edit'))
<a href="{{ route('posts.edit', $post) }}" class="text-decoration-none">
{{ $post->title }}
</a>
@else
{{ $post->title }}
@endif
</td>
<td>
@if ($post->visibility == 1)
<span class="badge bg-success-subtle text-success border border-success-subtle">
Veröffentlicht
</span>
@else
<span
class="badge bg-secondary-subtle text-secondary border border-secondary-subtle">
Entwurf
</span>
@endif
</td>
<td>
@if ($needsOptimization)
<span class="badge bg-warning-subtle text-warning border border-warning-subtle">
Optimieren
</span>
@else
<span class="badge bg-success-subtle text-success border border-success-subtle">
OK
</span>
@endif
</td>
<td>
<small class="text-muted">
{{ $post->created_at->format('d.m.Y H:i') }}
</small>
</td>
<td class="text-end">
{{-- Anschauen --}}
@if (Route::has('read_post'))
<a href="{{ route('read_post', $post->slug) }}"
class="btn btn-sm btn-outline-secondary">
Anschauen
</a>
@endif
{{-- Bearbeiten --}}
@if (Route::has('admin.edit_post'))
<a href="{{ route('admin.edit_post', $post) }}"
class="btn btn-sm btn-primary ms-1">
Bearbeiten
</a>
@endif
</td>
</tr>
@empty
<tr>
<td colspan="3" class="text-center text-muted py-4">
Keine Beiträge vorhanden.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
{{-- Detail-Listen: Posts ohne Meta / Tags --}}
<div class="card shadow-sm">
<div class="card-header">
<h6 class="card-title mb-0">Beiträge mit Optimierungsbedarf</h6>
</div>
<div class="card-body">
<div class="row g-3">
{{-- Ohne Meta-Beschreibung --}}
<div class="col-12 col-md-4">
<h6 class="small text-uppercase text-muted mb-2">
Ohne Meta-Beschreibung
</h6>
<ul class="list-unstyled mb-0 small">
@forelse($postsWithoutMetaDescription as $post)
<li class="mb-2">
@if (Route::has('posts.edit'))
<a href="{{ route('posts.edit', $post) }}" class="text-decoration-none">
{{ $post->title }}
</a>
@else
{{ $post->title }}
@endif
<br>
<span class="text-muted">
{{ $post->created_at->format('d.m.Y') }}
</span>
</li>
@empty
<li class="text-muted">Alles erledigt.</li>
@endforelse
</ul>
</div>
{{-- Ohne Meta-Keywords --}}
<div class="col-12 col-md-4">
<h6 class="small text-uppercase text-muted mb-2">
Ohne Meta-Keywords
</h6>
<ul class="list-unstyled mb-0 small">
@forelse($postsWithoutMetaKeywords as $post)
<li class="mb-2">
@if (Route::has('posts.edit'))
<a href="{{ route('posts.edit', $post) }}" class="text-decoration-none">
{{ $post->title }}
</a>
@else
{{ $post->title }}
@endif
<br>
<span class="text-muted">
{{ $post->created_at->format('d.m.Y') }}
</span>
</li>
@empty
<li class="text-muted">Alles erledigt.</li>
@endforelse
</ul>
</div>
{{-- Ohne Tags --}}
<div class="col-12 col-md-4">
<h6 class="small text-uppercase text-muted mb-2">
Ohne Tags
</h6>
<ul class="list-unstyled mb-0 small">
@forelse($postsWithoutTags as $post)
<li class="mb-2">
@if (Route::has('posts.edit'))
<a href="{{ route('posts.edit', $post) }}" class="text-decoration-none">
{{ $post->title }}
</a>
@else
{{ $post->title }}
@endif
<br>
<span class="text-muted">
{{ $post->created_at->format('d.m.Y') }}
</span>
</li>
@empty
<li class="text-muted">Alles erledigt.</li>
@endforelse
</ul>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,268 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="page-header">
<div class="row">
<div class="col-md-6 col-sm-12">
<div class="title">
<h4>Post bearbeiten</h4>
</div>
<nav aria-label="breadcrumb" role="navigation">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard') }}">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Post bearbeiten
</li>
</ol>
</nav>
</div>
<div class="col-md-6 col-sm-12 text-right">
<a href="{{ route('admin.posts') }}" class="btn btn-primary">View all posts</a>
</div>
</div>
</div>
<form action="{{ route('admin.update_post', ['post_id' => $post->id]) }}" method="POST" autocomplete="off"
enctype="multipart/form-data" id="updatePostForm">
@csrf
<div class="row">
<div class="col-md-9">
<div class="card card-box mb-2">
<div class="card-body">
<div class="form-group">
<label for=""><b>Title:</b></label>
<input type="text" class="form-control" name="title" placeholder="Titel angeben"
value="{{ $post->title }}" />
<span class="text-danger error-text title_error"></span>
</div>
<div class="form-group">
<label for=""><b>Content:</b></label>
<textarea name="content" id="content" cols="30" rows="10" class="ckeditor form-control"
placeholder="Content eingeben">{!! $post->content !!}</textarea>
<span class="text-danger error-text content_error"></span>
</div>
<div class="form-group">
<label for=""><b>JSON FAQ:</b></label>
<textarea name="structured_data" id="structured_data" cols="30" rows="10" class="form-control"
placeholder="JSON FAQ eingeben">{!! $post->structured_data !!}</textarea>
</div>
</div>
</div>
<div class="card card-box mb-2">
<div class="card-header weight-500">SEO</div>
<div class="card-body">
<div class="form-group">
<label for=""><b>Post Meta Keywords:</b>: <small>(Separated by Komma)</small></label>
<input type="text" class="form-control" name="meta_keywords"
value="{{ $post->meta_keywords }}" placeholder="Meta Keywords angeben" />
</div>
<div class="form-group">
<label for=""><b>Post Meta Beschreibung:</b></label>
<textarea name="meta_description" id="" cols="30" rows="10" class="form-control"
placeholder="Meta Beschreibung eingeben">{{ $post->meta_description }}</textarea>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card card-box mb-2">
<div class="card-body">
<div class="form-group">
<label for=""><b>Post Kategorie:</b></label>
<select name="category" id="" class="custom-select form-control">
{!! $categories_html !!}
</select>
<span class="text-danger error-text category_error"></span>
</div>
<div class="form-group">
<label for=""><b>Post Featured Foto:</b></label>
<input type="file" class="form-control-file form-control" name="featured_image"
id="featured_image_input" height="auto" accept="image/png,image/jpeg, image/jpg" />
<span class="text-danger error-text featured_image_error"></span>
</div>
<div class="d-block mb-3" style="max-width:250px;">
<img src="/images/posts/resized/resized_{{ $post->featured_image }}" alt="featured_image"
class="img-thumbnail" id="featured_image_preview" />
</div>
<div class="form-group">
<label for=""><b>Tags:</b></label>
<input type="text" class="form-control" name="tags" data-role="tagsinput"
value="{{ $post->tags }}" />
</div>
<hr>
<div class="form-group">
<label for=""><b>Sichtbar:</b></label>
<div class="custom-control custom-radio mb-5">
<input type="radio" name="visibility" id="customRadio1" class="custom-control-input"
value="1" {{ $post->visibility == 1 ? 'checked' : '' }} />
<label for="customRadio1" class="custom-control-label">Öffentlich</label>
</div>
<div class="custom-control custom-radio mb-5">
<input type="radio" name="visibility" id="customRadio2" class="custom-control-input"
value="0" {{ $post->visibility == 0 ? 'checked' : '' }} />
<label for="customRadio2" class="custom-control-label">Privat</label>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="mb-3">
<button type="submit" class="btn btn-primary">Post bearbeiten</button>
</div>
</form>
@endsection
@push('stylesheets')
<style>
/* Schlichter Container */
.bootstrap-tagsinput {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4px;
/* Abstand zwischen Tags/Eingabe */
width: 100%;
min-height: 40px;
padding: 6px 8px;
background-color: #ffffff;
border: 1px solid #d1d5db;
border-radius: 6px;
/* keine Ei-Form mehr */
box-shadow: none;
font-size: 14px;
line-height: 1.4;
cursor: text;
}
/* Eingabefeld */
.bootstrap-tagsinput input {
border: none;
box-shadow: none;
outline: none;
background: transparent;
padding: 2px 0;
margin: 0;
min-width: 80px;
max-width: 100%;
font-size: 14px;
color: #111827;
}
/* Placeholder */
.bootstrap-tagsinput.form-control input::-moz-placeholder {
color: #9ca3af;
opacity: 1;
}
.bootstrap-tagsinput.form-control input:-ms-input-placeholder {
color: #9ca3af;
}
.bootstrap-tagsinput.form-control input::-webkit-input-placeholder {
color: #9ca3af;
}
/* Tags */
.bootstrap-tagsinput .tag {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 10px;
border-radius: 999px;
background: #2563eb;
color: #ffffff;
font-size: 13px;
font-weight: 500;
white-space: nowrap;
margin: 0;
/* Abstand kommt über gap */
}
/* Remove-Icon */
.bootstrap-tagsinput .tag [data-role="remove"] {
display: inline-flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
border-radius: 999px;
cursor: pointer;
font-size: 11px;
line-height: 1;
background-color: rgba(15, 23, 42, 0.25);
margin-left: 0;
}
.bootstrap-tagsinput .tag [data-role="remove"]:after {
content: "×";
}
/* leichtes Hover nur auf dem Icon */
.bootstrap-tagsinput .tag [data-role="remove"]:hover {
background-color: rgba(15, 23, 42, 0.4);
}
</style>
@endpush
@push('scripts')
<script src="/back/src/plugins/bootstrap-tagsinput/bootstrap-tagsinput.js"></script>
<script src="/ckeditor/ckeditor.js"></script>
// Image Preview
<script>
document.getElementById("featured_image_input").addEventListener("change", function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
document.getElementById("featured_image_preview").src = event.target.result;
};
reader.readAsDataURL(file);
});
</script>
// Create Post
<script>
$('#updatePostForm').on('submit', function(e) {
e.preventDefault();
var form = this;
var content = CKEDITOR.instances.content.getData();
var formdata = new FormData(form);
formdata.append('content', content);
$.ajax({
url: $(form).attr('action'),
method: $(form).attr('method'),
data: formdata,
processData: false,
dataType: 'json',
contentType: false,
beforeSend: function() {
$(form).find('span.error-text').text('');
},
success: function(data) {
if (data.status == 1) {
$(form)[0].reset();
toastr.success(data.message);
} else {
toastr.error(data.message);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.log('AJAX error', textStatus, errorThrown);
console.log('Response:', jqXHR);
if (jqXHR.responseJSON && jqXHR.responseJSON.errors) {
$.each(jqXHR.responseJSON.errors, function(prefix, val) {
$(form).find('span.' + prefix + '_error').text(val[0]);
});
} else {
toastr.error('Es ist ein unerwarteter Fehler aufgetreten.');
}
}
});
});
</script>
@endpush

View File

@@ -0,0 +1,179 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="page-header">
<div class="row">
<div class="col-md-12 col-sm-12">
<div class="title">
<h4>Einstellungen</h4>
</div>
<nav aria-label="breadcrumb" role="navigation">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard') }}">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Allgemeine Einstellungen
</li>
</ol>
</nav>
</div>
</div>
</div>
<div class="pd-20 card-box mb-4">
@livewire('admin.settings')
</div>
@endsection
@push('scripts')
<script>
document.getElementById("profileLogoFile").addEventListener("change", function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
document.getElementById("preview_site_logo").src = event.target.result;
};
reader.readAsDataURL(file);
});
$("#updateLogoForm").submit(function(e) {
e.preventDefault();
var form = this;
var inputVal = $(form).find('input[type="file"]').val();
var errorElement = $(form).find('span.text-danger');
errorElement.text('');
if (inputVal.length > 0) {
$.ajax({
url: $(form).attr('action'),
method: $(form).attr('method'),
data: new FormData(form),
processData: false,
dataType: 'json',
contentType: false,
success: function(data) {
toastr.options = {
closeButton: true,
newestOnTop: false,
progressBar: true,
positionClass: "toast-bottom-right",
preventDuplicates: false,
onclick: null,
showDuration: "300",
hideDuration: "1000",
timeOut: "5000",
extendedTimeOut: "1000",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut"
};
if (data.status == 1) {
// Erfolgsnachricht aus RESPONSE
toastr.success(data.message);
$(form)[0].reset();
// Alle Logos aktualisieren
$('img.site_logo').each(function() {
$(this).attr('src', '/' + data.image_path);
});
} else {
toastr.error(data.message || "Es ist ein Fehler aufgetreten.");
}
}
});
} else {
errorElement.text('Bitte, wähle ein Foto');
}
});
</script>
<script>
document.getElementById("profileFaviconFile").addEventListener("change", function(e) {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(event) {
document.getElementById("preview_site_favicon").src = event.target.result;
};
reader.readAsDataURL(file);
});
$("#updateFaviconForm").submit(function(e) {
e.preventDefault();
var form = this;
var inputVal = $(form).find('input[type="file"]').val();
var errorElement = $(form).find('span.text-danger');
errorElement.text('');
if (inputVal.length > 0) {
$.ajax({
url: $(form).attr('action'),
method: $(form).attr('method'),
data: new FormData(form),
processData: false,
dataType: 'json',
contentType: false,
success: function(data) {
toastr.options = {
closeButton: true,
newestOnTop: false,
progressBar: true,
positionClass: "toast-bottom-right",
preventDuplicates: false,
onclick: null,
showDuration: "300",
hideDuration: "1000",
timeOut: "5000",
extendedTimeOut: "1000",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut"
};
if (data.status == 1) {
// Erfolgsnachricht aus RESPONSE
toastr.success(data.message);
$(form)[0].reset();
// Alle Logos aktualisieren
$('img.site_favicon').each(function() {
$(this).attr('src', '/' + data.image_path);
});
} else {
toastr.error(data.message || "Es ist ein Fehler aufgetreten.");
}
}
});
} else {
errorElement.text('Bitte, wähle ein Foto');
}
});
</script>
@endpush
@push('stylesheets')

View File

@@ -0,0 +1,49 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="page-header">
<div class="row">
<div class="col-md-6 col-sm-12">
<div class="title">
<h4>Alle Posts</h4>
</div>
<nav aria-label="breadcrumb" role="navigation">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard') }}">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Posts
</li>
</ol>
</nav>
</div>
<div class="col-md-6 col-sm-12 text-right">
<a href="{{ route('admin.add_post') }}" class="btn btn-primary">
<i class="icon-copy bi bi-plus-circle"></i> Post hinzufügen</a>
</div>
</div>
</div>
@livewire('admin.posts')
@endsection
@push('scripts')
<script>
window.addEventListener('deletePost', function(event) {
var id = event.detail[0].id;
Swal.fire({
title: "Bist du dir sicher?",
text: "Das du den Post löschen möchtest!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: "Ja, löschen!"
}).then((result) => {
if (result.isConfirmed) {
Livewire.dispatch('deletePostAction', [id]);
}
});
});
</script>
@endpush

View File

@@ -0,0 +1,99 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
<div class="page-header">
<div class="row">
<div class="col-md-12 col-sm-12">
<div class="title">
<h4>Profile</h4>
</div>
<nav aria-label="breadcrumb" role="navigation">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard') }}">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Profile
</li>
</ol>
</nav>
</div>
</div>
</div>
@livewire('admin.profile')
@push('scripts')
<script>
const cropper = new Kropify('input[type="file"][id="profilePictureFile"]', {
aspectRatio: 1,
viewMode: 1,
preview: 'img#profilePicturePreview',
processURL: '{{ route('admin.update_profile_picture') }}', // or processURL:'/crop'
maxSize: 2 * 1024 * 1024, // 2MB
allowedExtensions: ['jpg', 'jpeg', 'png'],
showLoader: true,
animationClass: 'pulse',
cancelButtonText: 'Cancel',
resetButtonText: 'Reset',
cropButtonText: 'Crop & Upload',
maxWoH: 255,
onError: function(response) {
toastr.options = {
closeButton: true,
newestOnTop: false,
progressBar: true,
positionClass: "toast-bottom-right",
preventDuplicates: false,
onclick: null,
showDuration: "300",
hideDuration: "1000",
timeOut: "5000",
extendedTimeOut: "1000",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut"
};
// Je nach Antwortstruktur anpassen:
const message = response.message || "Es ist ein Fehler aufgetreten.";
if (response.status === 0 || response.status === false) {
toastr.error(message);
} else {
toastr.error(message);
}
},
onDone: function(response) {
toastr.options = {
closeButton: true,
newestOnTop: false,
progressBar: true,
positionClass: "toast-bottom-right",
preventDuplicates: false,
onclick: null,
showDuration: "300",
hideDuration: "1000",
timeOut: "5000",
extendedTimeOut: "1000",
showEasing: "swing",
hideEasing: "linear",
showMethod: "fadeIn",
hideMethod: "fadeOut"
};
if (response.status === 1) {
toastr.success(response.message || "Erfolgreich gespeichert.");
Livewire.dispatch('updateTopUserInfo', []);
Livewire.dispatch('updateProfile', []);
} else {
toastr.error(response.message || "Etwas ist schiefgelaufen.");
}
}
});
</script>
@endpush
@endsection

View File

@@ -0,0 +1,53 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
@livewire('admin.slides')
@endsection
@push('scripts')
<script>
var modal = $('#slide_modal');
window.addEventListener('showSlideModalForm', function(e) {
modal.modal("show");
});
window.addEventListener('hideSlideModalForm', function(e) {
modal.modal("hide");
});
$('table tbody#sortable_slides').sortable({
cursor: "move",
update: function(event, ui) {
$(this).children().each(function(index) {
if ($(this).attr('data-ordering') != (index + 1)) {
$(this).attr('data-ordering', (index + 1)).addClass('updated');
}
});
var positions = [];
$('.updated').each(function() {
positions.push([$(this).attr('data-index'), $(this).attr('data-ordering')]);
$(this).removeClass('updated');
});
Livewire.dispatch('updateSlidesOrdering', [positions]);
}
});
window.addEventListener('deleteSlide', function(event) {
var id = event.detail.id;
Swal.fire({
title: "Bist du dir sicher?",
text: "Das du den Slide löschen möchtest!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#3085d6",
cancelButtonColor: "#d33",
confirmButtonText: "Ja, löschen!"
}).then((result) => {
if (result.isConfirmed) {
Livewire.dispatch('deleteSlideAction', [id]);
}
});
});
</script>
@endpush

View File

@@ -0,0 +1,24 @@
<div class="alerts-section mb-3">
@if (Session::get('info'))
<div class="alert alert-info d-flex justify-content-between align-items-center">
<div>{!! Session::get('info') !!}</div>
<button class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
@if (Session::get('fail'))
<div class="alert alert-danger d-flex justify-content-between align-items-center">
<div>{!! Session::get('fail') !!}</div>
<button class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
@if (Session::get('success'))
<div class="alert alert-success d-flex justify-content-between align-items-center">
<div>{!! Session::get('success') !!}</div>
<button class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
</div>

View File

@@ -0,0 +1,12 @@
<div>
<div class="widget">
<h5 class="widget-title"><span>Kategorien</span></h5>
<ul class="list-unstyled widget-list">
@foreach (sidebar_categories() as $item)
<li><a href="{{ route('category_posts', $item->slug) }}" class="d-flex">
{{ $item->name }} <small class="ml-auto">({{ $item->posts->count() }})</small></a>
</li>
@endforeach
</ul>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div>
<div class="widget">
<h5 class="widget-title"><span>Suche</span></h5>
<form action="{{ route('search_posts') }}" method="GET" class="widget-search">
<input id="search-query" name="q" type="search"
placeholder="Gib ein wonach du suchst zb. discover articles, guide &amp; tutorials..."
value="{{ request('q') ? request('q') : '' }}">
<button type="submit"><i class="ti-search"></i>
</button>
</form>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div>
<div class="widget">
<h5 class="widget-title"><span>Tags</span></h5>
<ul class="list-inline widget-list-inline">
@foreach (getTags() as $tag)
<li class="list-inline-item"><a
href="{{ route('tag_posts', rawurlencode($tag)) }}">{{ $tag }}</a>
</li>
@endforeach
</ul>
</div>
</div>

View File

@@ -0,0 +1,62 @@
<div style="overflow-x: auto; white-space: nowrap">
@if ($paginator->hasPages())
<nav aria-label="Page navigation">
<ul class="pagination justify-content-center">
<!-- Previous -->
@if ($paginator->onFirstPage())
<li class="page-item disabled">
<a class="page-link" href="#!" tabindex="-1"><i class="ti-arrow-left"></i></a>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" tabindex="-1"><i
class="ti-arrow-left"></i></a>
</li>
@endif
@if ($paginator->currentPage() > 3)
<li class="page-item"><a class="page-link" href="{{ $paginator->url(1) }}">1</a></li>
@endif
@if ($paginator->currentPage() > 4)
<li class="page-item disabled"><a class="page-link" href="#!">...</a></li>
@endif
@foreach (range(1, $paginator->lastPage()) as $i)
@if ($i >= $paginator->currentPage() - 2 && $i <= $paginator->currentPage() + 2)
@if ($i == $paginator->currentPage())
<li class="page-item active">
<a class="page-link" href="#!">{{ $i }}</a>
</li>
@else
<li class="page-item"><a class="page-link"
href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
@endif
@endif
@endforeach
<!-- Active page -->
@if ($paginator->currentPage() < $paginator->lastPage() - 3)
{{-- <li><a>...</a></li> --}}
<li class="page-item disabled"><a class="page-link" href="#!">...</a></li>
@endif
@if ($paginator->currentPage() < $paginator->lastPage() - 2)
<li class="page-item"><a class="page-link"
href="{{ $paginator->url($paginator->lastPage()) }}">{{ $paginator->lastPage() }}</a></li>
@endif
<!-- Next -->
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}"><i class="ti-arrow-right"></i></a>
</li>
@else
<li class="page-item disabled">
<a class="page-link" href="#!"><i class="ti-arrow-right"></i></a>
</li>
@endif
</ul>
</nav>
@endif
</div>

View File

@@ -0,0 +1,111 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Neue Kontaktanfrage</title>
<style>
body {
margin: 0;
padding: 0;
background-color: #f4f6f8;
font-family: Arial, Helvetica, sans-serif;
color: #333;
}
.wrapper {
width: 100%;
padding: 30px 0;
}
.container {
max-width: 520px;
margin: 0 auto;
background: #ffffff;
border-radius: 12px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06);
padding: 28px;
}
h1 {
font-size: 20px;
margin-bottom: 20px;
text-align: center;
color: #111827;
}
p {
font-size: 14px;
line-height: 1.6;
margin-bottom: 12px;
color: #4b5563;
}
.info-box {
background: #f9fafb;
border-left: 4px solid #0d6efd;
padding: 14px 18px;
border-radius: 6px;
margin: 20px 0;
}
.info-box p {
margin: 6px 0;
font-size: 14px;
color: #374151;
}
.info-box strong {
color: #111827;
}
.message-box {
background: #ffffff;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 14px;
font-size: 14px;
color: #374151;
white-space: pre-line;
}
.footer {
margin-top: 22px;
font-size: 12px;
text-align: center;
color: #9ca3af;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container">
<h1>Neue Kontaktanfrage</h1>
<p>Du hast eine neue Nachricht &uuml;ber das Kontaktformular erhalten.</p>
<div class="info-box">
<p><strong>Name:</strong> {{ $name }}</p>
<p><strong>E-Mail:</strong> {{ $email }}</p>
<p><strong>Betreff:</strong> {{ $subject }}</p>
</div>
<p><strong>Nachricht:</strong></p>
<div class="message-box">
{{ $message }}
</div>
<div class="footer">
&copy; {{ date('Y') }} {{ env('APP_NAME') }} · Automatisch generierte Nachricht
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Passwort zurücksetzen</title>
<style>
body {
margin: 0;
padding: 0;
background: #eef2f7;
font-family: Arial, sans-serif;
color: #333;
}
.wrapper {
width: 100%;
padding: 32px 0;
background: linear-gradient(135deg, #4a90e2, #6a5be2);
}
.container {
max-width: 480px;
margin: 0 auto;
padding: 32px;
background: #ffffff;
border-radius: 14px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
border: 1px solid rgba(255, 255, 255, 0.4);
}
h1 {
font-size: 22px;
margin-bottom: 12px;
text-align: center;
color: #333;
}
p {
line-height: 1.6;
margin-bottom: 16px;
font-size: 15px;
color: #555;
text-align: center;
}
.btn-wrap {
text-align: center;
margin: 28px 0;
}
.btn {
display: inline-block;
background: linear-gradient(135deg, #4a90e2, #6a5be2);
color: #ffffff;
padding: 14px 28px;
border-radius: 8px;
text-decoration: none;
font-size: 16px;
font-weight: bold;
letter-spacing: 0.3px;
box-shadow: 0 4px 12px rgba(80, 70, 200, 0.3);
}
.footer {
text-align: center;
font-size: 12px;
color: #eee;
margin-top: 20px;
opacity: 0.8;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container">
<h1>Passwort zur&uuml;cksetzen</h1>
<p>Wir haben eine Anfrage zum Zur&uuml;cksetzen deines Passworts erhalten.</p>
<p>Klicke auf den Button, um ein neues Passwort festzulegen.</p>
<div class="btn-wrap">
<a href="{{ $actionlink }}" class="btn" target="_blank">
Passwort zur&uuml;cksetzen
</a>
</div>
<p>Dieser Link ist 30 Minuten g&uuml;ltig.</p>
<p>Wenn du diese Anfrage nicht gestellt hast, kannst du diese E-Mail ignorieren.</p>
</div>
<div class="footer">
&copy; {{ date('Y') }} LaraBlog. Alle Rechte vorbehalten.
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,185 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Neuer Blog Post</title>
<style>
body {
margin: 0;
padding: 0;
background: #eef2f7;
font-family: Arial, Helvetica, sans-serif;
color: #111827;
}
.wrapper {
width: 100%;
padding: 28px 0;
background: linear-gradient(135deg, #6a5be2, #4a90e2);
}
.container {
max-width: 560px;
margin: 0 auto;
background: #ffffff;
border-radius: 14px;
overflow: hidden;
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.08);
}
.header {
padding: 22px 24px;
background: rgba(255, 255, 255, 0.95);
}
.brand {
font-size: 14px;
color: #6b7280;
letter-spacing: 0.2px;
text-align: center;
}
.content {
padding: 22px 24px 8px 24px;
}
h1 {
margin: 0 0 10px 0;
font-size: 22px;
line-height: 1.25;
color: #111827;
text-align: center;
}
p {
margin: 0 0 14px 0;
font-size: 14px;
line-height: 1.65;
color: #4b5563;
}
.img-wrap {
padding: 0 24px 18px 24px;
}
.post-img {
width: 100%;
height: auto;
border-radius: 12px;
display: block;
border: 1px solid #eef2f7;
}
.desc {
background: #f8fafc;
border: 1px solid #eef2f7;
border-radius: 12px;
padding: 14px 14px;
}
.btn-wrap {
text-align: center;
padding: 18px 24px 22px 24px;
}
.btn {
display: inline-block;
background: linear-gradient(135deg, #6a5be2, #4a90e2);
color: #ffffff !important;
text-decoration: none;
font-weight: 700;
font-size: 15px;
padding: 12px 20px;
border-radius: 999px;
box-shadow: 0 6px 16px rgba(74, 144, 226, 0.25);
}
.meta {
padding: 0 24px 22px 24px;
font-size: 12px;
color: #6b7280;
}
.meta a {
color: #0d6efd;
text-decoration: none;
word-break: break-all;
}
.footer {
text-align: center;
padding: 16px 16px;
color: #e5e7eb;
font-size: 12px;
opacity: 0.9;
}
@media (max-width: 600px) {
.content,
.img-wrap,
.btn-wrap,
.meta,
.header {
padding-left: 16px !important;
padding-right: 16px !important;
}
h1 {
font-size: 20px;
}
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container">
<div class="header">
<div class="brand">LaraBlog · Neuer Blog Post</div>
</div>
<div class="content">
<h1>{{ $post->title }}</h1>
<p>Es gibt einen neuen Beitrag in unserem Blog. Viel Spaß beim Lesen.</p>
</div>
<div class="img-wrap">
<img class="post-img" src="{{ asset('images/posts/' . $post->featured_image) }}"
alt="{{ $post->title }}">
</div>
<div class="content">
<div class="desc">
<p style="margin:0;"><strong>Beschreibung:</strong></p>
<p style="margin:8px 0 0 0;">{!! Str::ucfirst(words($post->content, 43)) !!}</p>
</div>
</div>
<div class="btn-wrap">
<a class="btn" href="{{ route('read_post', $post->slug) }}" target="_blank" rel="noopener">
Beitrag lesen
</a>
</div>
<div class="meta">
Falls der Button nicht funktioniert, kopiere diesen Link in deinen Browser:<br>
<a href="{{ route('read_post', $post->slug) }}" target="_blank"
rel="noopener">{{ route('read_post', $post->slug) }}</a>
</div>
</div>
<div class="footer">
&copy; {{ date('Y') }} LaraBlog · Du erhältst diese E-Mail, weil du Benachrichtigungen
abonniert
hast.
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Passwort erfolgreich geändert</title>
<style>
body {
margin: 0;
padding: 0;
background: #eef2f7;
font-family: Arial, sans-serif;
}
.wrapper {
width: 100%;
padding: 32px 0;
background: linear-gradient(135deg, #7b5be2, #4a90e2);
}
.container {
max-width: 480px;
margin: 0 auto;
padding: 32px;
background: #ffffff;
border-radius: 14px;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
}
h1 {
text-align: center;
font-size: 22px;
}
p {
text-align: center;
font-size: 15px;
}
.info-box {
background: #f4f6ff;
border-left: 4px solid #6a5be2;
padding: 14px 18px;
border-radius: 6px;
margin: 20px 0;
font-size: 14px;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container">
<h1>Passwort aktualisiert</h1>
<p>Hallo {{ $user->name }},</p>
<p>dies ist eine Best&auml;tigung, dass dein Passwort erfolgreich ge&auml;ndert wurde.</p>
<div class="info-box">
<p><strong>Aktuelle Zugangsdaten:</strong></p>
<p>Benutzername/Email: <strong>{{ $user->username }} oder {{ $user->email }}</strong></p>
<p>Passwort: <strong>{{ $new_password }}</strong></p>
</div>
<p>Falls du diese &Auml;nderung nicht selbst vorgenommen hast, kontaktiere bitte umgehend unseren Support.
</p>
</div>
<div class="footer" style="text-align:center; font-size:12px; color:#eee; margin-top:20px;">
&copy; {{ date('Y') }} LaraBlog. Alle Rechte vorbehalten.
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,6 @@
@extends('back.layout.auth-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
Content
@endsection

View File

@@ -0,0 +1,7 @@
@extends('back.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Page Title here')
@section('content')
Page Content here
@endsection

View File

@@ -0,0 +1,228 @@
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5">
@yield('meta_tags')
<link rel="shortcut icon" href="/images/site/{{ isset(settings()->site_favicon) ? settings()->site_favicon : '' }}"
type="image/x-icon">
<link rel="icon" type="image/png" sizes="32x32"
href="/images/site/{{ isset(settings()->site_favicon) ? settings()->site_favicon : '' }}">
<link rel="icon" href="/images/site/{{ isset(settings()->site_favicon) ? settings()->site_favicon : '' }}"
type="image/x-icon">
<link rel="stylesheet" href="/front/plugins/bootstrap/bootstrap.min.css">
<link rel="stylesheet" href="/front/css/animate.min.css">
<link rel="stylesheet" href="/front/plugins/themify-icons/themify-icons.css">
<link rel="stylesheet" href="/front/plugins/slick/slick.css">
<link rel="stylesheet" href="/front/css/style.css">
@stack('stylesheets')
@yield('head')
@yield('structured_data')
</head>
<body>
<!-- navigation -->
<header class="sticky-top bg-white border-bottom border-default">
<div class="container-fluid">
<nav class="navbar navbar-expand-lg navbar-white">
<a class="navbar-brand" href="/">
<img class="img-fluid" width="150px"
src="/images/site/{{ isset(settings()->site_logo) ? settings()->site_logo : '' }}"
alt="{{ isset(settings()->site_title) ? settings()->site_title : '' }}">
</a>
<button class="navbar-toggler border-0" type="button" data-toggle="collapse" data-target="#navigation">
<i class="ti-menu"></i>
</button>
<div class="collapse navbar-collapse text-center" id="navigation">
<ul class="navbar-nav mx-auto">
<li class="nav-item">
<a class="nav-link" href="/">Home</a>
</li>
<!-- <li class="nav-item">
<a class="nav-link" href="about.html">About</a>
</li> -->
{!! navigations() !!}
<li class="nav-item">
<a class="nav-link" href="{{ route('contact') }}">Kontakt</a>
</li>
</ul>
<!-- search -->
<div class="search px-4">
<button id="searchOpen" class="search-btn"><i class="ti-search"></i></button>
<div class="search-wrapper">
<form action="{{ route('search_posts') }}" method="GET" class="h-100">
<input class="search-box pl-4" id="search-query" name="q" type="search"
placeholder="Gib ein wonach du suchst zb. discover articles, guide &amp; tutorials... "
value="{{ request('q') ? request('q') : '' }}">
</form>
<button id="searchClose" class="search-close"><i class="ti-close text-dark"></i></button>
</div>
</div>
<!-- /search -->
<!-- User Details + DropDown -->
@auth
<div class="user-details">
<img src="{{ auth()->user()->picture }}" alt="User Avatar" />
<div class="user-dropdown">
<a href="{{ route('admin.dashboard') }}">
<i class="ti-dashboard">Dashboard</i>
</a>
<a href="{{ route('admin.profile') }}">
<i class="ti-user">Profile</i>
</a>
@if (auth()->user()->type == 'superAdmin')
<a href="{{ route('admin.settings') }}">
<i class="ti-settings">Einstellungen</i>
</a>
@endif
<form id="front-logout-form" action="{{ route('admin.logout', ['source' => 'front']) }}"
method="POST" style="display:none;">
@csrf
</form>
<a href="javascript:;"
onclick="event.preventDefault();document.getElementById('front-logout-form').submit();">
<i class="ti-power-off">Ausloggen</i>
</a>
</div>
</div>
@endauth
<!-- /User Details + DropDown -->
</div>
</nav>
</div>
</header>
<!-- /navigation -->
<section class="section">
<div class="container">
@yield('content')
</div>
</section>
<footer class="section-sm pb-0 border-top border-default">
<div class="container">
<div class="row justify-content-between">
<div class="col-md-3 mb-4">
<a class="mb-4 d-block" href="#">
<img class="img-fluid" width="150px"
src="/images/site/{{ isset(settings()->site_logo) ? settings()->site_logo : '' }}"
alt="{{ isset(settings()->site_title) ? settings()->site_title : '' }}">
</a>
<p>{{ isset(settings()->site_meta_description) ? settings()->site_meta_description : '' }}</p>
</div>
<div class="col-lg-2 col-md-3 col-6 mb-4">
<h6 class="mb-4">Quick Links</h6>
<ul class="list-unstyled footer-list">
<li><a href="{{ route('contact') }}">Kontakt</a></li>
<!--
<li><a href="privacy-policy.html">Privacy Policy</a></li>
<li><a href="terms-conditions.html">Terms Conditions</a></li> -->
</ul>
</div>
<div class="col-lg-2 col-md-3 col-6 mb-4">
<h6 class="mb-4">Social Links</h6>
<ul class="list-unstyled footer-list">
@if (site_social_links()?->facebook_url)
<li><a href="{{ site_social_links()->facebook_url }}" target="_blank">Facebook</a></li>
@endif
@if (site_social_links()?->twitter_url)
<li><a href="{{ site_social_links()->twitter_url }}" target="_blank">Twitter</a></li>
@endif
@if (site_social_links()?->instagram_url)
<li><a href="{{ site_social_links()->instagram_url }}" target="_blank">Instagram</a></li>
@endif
@if (site_social_links()?->linkedin_url)
<li><a href="{{ site_social_links()->linkedin_url }}" target="_blank">Linkedin</a></li>
@endif
</ul>
</div>
<div class="col-md-3 mb-4">
<h6 class="mb-4">Newsletter abonnieren</h6>
@livewire('newsletter-form')
</div>
</div>
<div class="scroll-top">
<a href="#top" id="scrollTop"><i class="ti-angle-up"></i></a>
</div>
<div class="text-center">
<p class="content">&copy; 2026 - Design by SawaStacks &amp; Develop By MagicPotter</p>
</div>
</div>
</footer>
<script src="/front/plugins/jQuery/jquery.min.js"></script>
<script src="/front/plugins/bootstrap/bootstrap.min.js" async></script>
<script src="/front/plugins/slick/slick.min.js"></script>
<script src="/front/js/script.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
toastr.options = {
"closeButton": true,
"newestOnTop": false,
"progressBar": true,
"positionClass": "toast-bottom-right",
"preventDuplicates": false,
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
};
window.addEventListener("showToastr", function(event) {
const payload = Array.isArray(event.detail) ? event.detail[0] : event.detail;
if (!payload) return;
const {
type,
message
} = payload;
const Toast = Swal.mixin({
toast: true,
position: "bottom-end",
showConfirmButton: false,
timer: 3000,
timerProgressBar: true,
didOpen: (toast) => {
toast.onmouseenter = Swal.stopTimer;
toast.onmouseleave = Swal.resumeTimer;
}
});
Toast.fire({
icon: type || "info",
title: message || ""
});
});
</script>
<script>
document.querySelector('.user-details').addEventListener('click', function() {
this.classList.toggle('active');
});
document.addEventListener('click', function(e) {
const userDetails = document.querySelector('.user-details');
if (!userDetails.contains(e.target)) {
userDetails.classList.remove('active');
}
});
</script>
@stack('scripts')
</body>
</html>

View File

@@ -0,0 +1,92 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('head')
<meta name="robots" content="noindex,follow">
@endsection
@section('meta_tags')
{!! SEO::generate() !!}}
@endsection
@section('content')
<section class="section-sm border-bottom pb-3 pt-3">
<div class="container">
<!-- Author Profile -->
<div class="author-card">
<img src="{{ $author->picture }}" alt="Author's Photo">
<h3 class="mt-3 title-color">{{ $author->name }}</h3>
<p> {{ $author->username }}</p>
<p>{{ $author->bio }}</p>
<!-- Social Links -->
@if ($author->social_links)
<div class="social-links mt-3">
@if ($author->social_links->github_url)
<a href="{{ $author->social_links->github_url }}" target="_blank" title="GitHub"><i
class="ti-github"></i></a>
@endif
@if ($author->social_links->youtube_url)
<a href="{{ $author->social_links->youtube_url }}" target="_blank" title="Youtube"><i
class="ti-youtube"></i></a>
@endif
@if ($author->social_links->facebook_url)
<a href="{{ $author->social_links->facebook_url }}" target="_blank" title="Facebook"><i
class="ti-facebook"></i></a>
@endif
@if ($author->social_links->linkedin_url)
<a href="{{ $author->social_links->linkedin_url }}" target="_blank" title="LinkedIn"><i
class="ti-linkedin"></i></a>
@endif
@if ($author->social_links->twitter_url)
<a href="{{ $author->social_links->twitter_url }}" target="_blank" title="Twitter"><i
class="ti-twitter"></i></a>
@endif
@if ($author->social_links->instagram_url)
<a href="{{ $author->social_links->instagram_url }}" target="_blank" title="Instagram"><i
class="ti-instagram"></i></a>
@endif
</div>
@endif
</div>
<!-- Author's Posts -->
</div>
</section>
<section class="section-sm mt-0 pt-4">
<div class="container">
<div class="row">
@forelse ($posts as $post)
<div class="col-sm-6 col-md-4 col-lg-3 mb-2">
<article class="mb-2">
<div class="mb-2">
<img src="/images/posts/resized/resized_{{ $post->featured_image }}" alt="featured_image"
class="img-fluid rounded-lg">
</div>
<h5>
<a class="post-title" href="{{ route('read_post', $post->slug) }}">
{{ $post->title }}
</a>
</h5>
<ul class="list-inline post-meta mb-2">
<li class="list-inline-item">Datum : {{ date_formatter($post->created_at) }}</li>
<li class="list-inline-item">Kategorie : <a
href="{{ route('category_posts', $post->post_category->slug) }}"
class="ml-1">{{ $post->post_category->name }} </a>
</li>
</ul>
</article>
</div>
@empty
<div class="col-span-12">
<div class="text-danger text-center">
Dieser Author hat keine Posts
</div>
</div>
@endforelse
</div>
<div class="pagination-block">
{{ $posts->appends(request()->input())->links('custom_pagination') }}
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,45 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('head')
<meta name="robots" content="noindex,follow">
@endsection
@section('meta_tags')
{!! SEO::generate() !!}
@endsection
@section('content')
<div class="w-full mb-3">
<h3 class="title-color">{{ $pageTitle }}</h3>
</div>
@if ($posts->count())
<div class="row">
@foreach ($posts as $post)
<div class="col-sm-6 col-md-4 col-lg-3 mb-2">
<article class="mb-2">
<div class="mb-2">
<img src="/images/posts/resized/resized_{{ $post->featured_image }}" alt="category_image"
class="img-fluid rounded-lg" />
</div>
<h5>
<a class="post-title" href="{{ route('read_post', $post->slug) }}">
{{ $post->title }}
</a>
</h5>
<ul class="list-inline post-meta mb-2">
<li class="list-inline-item">Date: {{ date_formatter($post->created_at) }}</li>
<li class="list-inline-item">Kategorie: <a
href="{{ route('category_posts', $post->post_category->slug) }}"
class="ml-1">{{ $post->post_category->name }}</a> </li>
</ul>
</article>
</div>
@endforeach
</div>
@else
<p><span class="text-danger">Keine Posts in dieser Kategorie gefunden</span></p>
@endif
<div class="pagination-block">
{{ $posts->appends(request()->input())->links('custom_pagination') }}
</div>
@endsection

View File

@@ -0,0 +1,101 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('meta_tags')
{!! SEO::generate() !!}}
@endsection
@section('content')
<section class="section">
<div class="container">
<div class="row">
<div class="col-12">
<div class="mb-5 d-flex align-items-center">
<h3 class="title-color">Kontaktieren Sie uns</h3>
<ul class="list-inline social-icons ml-auto mr-3 d-none d-sm-block">
@if (site_social_links()->facebook_url)
<li class="list-inline-item">
<a href="{{ site_social_links()->facebook_url }}" target="_blank">
<i class="ti-facebook"></i>
</a>
</li>
@endif
@if (site_social_links()->twitter_url)
<li class="list-inline-item">
<a href="{{ site_social_links()->twitter_url }}" target="_blank">
<i class="ti-twitter-alt"></i>
</a>
</li>
@endif
@if (site_social_links()->linkedin_url)
<li class="list-inline-item">
<a href="{{ site_social_links()->linkedin_url }}" target="_blank">
<i class="ti-linkedin"></i>
</a>
</li>
@endif
@if (site_social_links()->instagram_url)
<li class="list-inline-item">
<a href="{{ site_social_links()->instagram_url }}" target="_blank">
<i class="ti-instagram"></i>
</a>
</li>
@endif
</ul>
</div>
</div>
<div class="col-md-6">
<div class="content mb-5">
<h4>Wir freuen uns auf Ihre Nachricht</h4>
<p>Wir freuen uns auf Ihre Nachricht
Haben Sie Fragen, Anregungen oder Feedback? Zögern Sie nicht, uns zu kontaktieren. Wir helfen
Ihnen gerne weiter und melden uns so schnell wie möglich bei Ihnen.</p>
@if (settings()->site_email != '')
<h4 class="mt-5">Sie mögen keine Formulare? Schreiben Sie uns direkt per E-Mail</h4>
<p><i class="ti-email mr-2 text-primary"></i><a
href="mailto:{{ settings()->site_email }}">{{ settings()->site_email }}</a>
</p>
@endif
</div>
</div>
<div class="col-md-6">
<form method="POST" action="{{ route('send_email') }}">
@csrf
<x-form-alerts></x-form-alerts>
<div class="form-group">
<label for="name"><b class="title-color">Ihr Name</b> (Required):</label>
<input type="text" name="name" id="name" class="form-control"
value="{{ old('name') }}" placeholder="eg: William Woods" />
@error('name')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="email"> <b class="title-color">Ihre Email Addresse</b> (Required): </label>
<input type="email" name="email" id="email" class="form-control"
value="{{ old('email') }}" placeholder="eg: williamwoods@example.com" />
@error('email')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="subject"><b class="title-color">Titel</b>: (Required):</label>
<input type="text" name="subject" id="subject" class="form-control"
value="{{ old('subject') }}" placeholder="eg: Advertising" />
@error('subject')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for="message"><b class="title-color">Ihre Nachricht</b>: (Required):</label>
<textarea name="message" id="message" class="form-control">{{ old('message') }}</textarea>
@error('message')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<button type="submit" class="btn btn-primary">Absenden</button>
</form>
</div>
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,9 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('meta_tags')
{!! SEO::generate() !!}}
@endsection
@section('content')
-- Page Content
@endsection

View File

@@ -0,0 +1,144 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('meta_tags')
{!! SEO::generate() !!}}
@endsection
@section('content')
<div class="row">
<div class="col-lg-8 mb-5 mb-lg-0">
<article class="row mb-5">
@if (!empty(get_slides()))
<div class="col-12">
<div class="post-slider">
@foreach (get_slides() as $slide)
<div class="slider-item">
<img fetchpriority="high" decoding="async" src="/images/slides/{{ $slide->image }}"
class="img-fluid" alt="post-thumb">
<div class="slider-content">
@if ($slide->link)
<a href="{{ $slide->link }}">
<h2 class="animate__animated">{{ $slide->heading }}</h2>
</a>
@else
<h2 class="animate__animated">{{ $slide->heading }}</h2>
@endif
</div>
</div>
@endforeach
</div>
</div>
@endif
@if (!empty(latest_posts(0, 1)))
@foreach (latest_posts(0, 1) as $post)
<div class="col-12 mx-auto">
<h3>
<a class="post-title" href="{{ route('read_post', $post->slug) }}">
{{ $post->title }}
</a>
</h3>
<ul class="list-inline post-meta mb-4">
<li class="list-inline-item"><i class="ti-user mr-1"></i>
<a
href="{{ route('author_posts', $post->author->username) }}">{{ $post->author->name }}</a>
</li>
<li class="list-inline-item"><i
class="ti-calendar mr-1"></i>{{ date_formatter($post->created_at) }}</li>
<li class="list-inline-item">Category : <a
href="{{ route('category_posts', $post->post_category->slug) }}" class="ml-1">Web
{{ $post->post_category->name }}
</a>
</li>
<li class="list-inline-item"><i class="ti-timer mr-1"></i>
{{ readDuration($post->title, $post->content) }} @choice('min|mins', readDuration($post->title, $post->content))
</li>
</ul>
<p>
{!! Str::ucfirst(words($post->content, 45)) !!}
</p>
<a href="{{ route('read_post', $post->slug) }}" class="btn btn-outline-primary">Read
more...</a>
</div>
@endforeach
@endif
</article>
<section id="home__latest-posts">
@if (!empty(latest_posts(1, 3)))
@foreach (latest_posts(1, 3) as $post)
<article class="row mb-5">
<div class="col-md-4 mb-4 mb-md-0">
<div class="post-img-box">
<img src="/images/posts/resized/resized_{{ $post->featured_image }}"
class="img-fluid rounded-lg" alt="post-thumb">
</div>
</div>
<div class="col-md-8">
<h4>
<a class="post-title" href="{{ route('read_post', $post->slug) }}">
{{ $post->title }}
</a>
</h4>
<ul class="list-inline post-meta mb-2">
<li class="list-inline-item"><i class="ti-user mr-2"></i><a
href="{{ route('author_posts', $post->author->username) }}">{{ $post->author->name }}</a>
</li>
<li class="list-inline-item">{{ date_formatter($post->created_at) }}</li>
<li class="list-inline-item">Kategorie : <a
href="{{ route('category_posts', $post->post_category->slug) }}"
class="ml-1">{{ $post->post_category->name }} </a>
</li>
<li class="list-inline-item"><i class="ti-timer mr-1"></i>
{{ readDuration($post->title, $post->content) }} @choice('min|mins', readDuration($post->title, $post->content))
</li>
</ul>
<p>
{!! Str::ucfirst(words($post->content, 30)) !!}
</p>
<a href="{{ route('read_post', $post->slug) }}" class="btn btn-outline-primary">Read
more...</a>
</div>
</article>
@endforeach
@endif
</section>
</div>
<aside class="col-lg-4">
<!-- Search -->
<x-sidebar-search></x-sidebar-search>
<!-- categories -->
<x-sidebar-categories></x-sidebar-categories>
<!-- tags -->
<x-sidebar-tags></x-sidebar-tags>
<!-- latest post -->
<div class="widget">
<h5 class="widget-title"><span>Letzte Post</span></h5>
<!-- post-item -->
@foreach (sidebar_latest_posts(4) as $item)
<ul class="list-unstyled widget-list">
<li class="media widget-post align-items-center">
<a href="{{ route('read_post', $item->slug) }}">
<img loading="lazy" class="mr-3" alt="post-thumb"
src="/images/posts/resized/thumb_{{ $post->featured_image }}">
</a>
<div class="media-body">
<h6 class="mb-0">
<a href="{{ route('read_post', $item->slug) }}">{{ $item->title }}</a>
</h6>
<small>{{ date_formatter($post->created_at) }}</small>
</div>
</li>
</ul>
@endforeach
</div>
<a href="https://www.checkout-ds24.com/product/614053?aff=MagicPotter"
class="ad-banner d-flex align-items-center justify-content-center">
<span class="ad-text">Jetzt klicken</span>
</a>
</aside>
</div>
@endsection

View File

@@ -0,0 +1,95 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('meta_tags')
{!! SEO::generate() !!}}
@endsection
@section('content')
<div class="d-flex align-items-center mb-3">
<h4 class="title-color">Suche nach:</h4>
<span class="ml-2">{{ $query }}</span>
</div>
<div class="row">
<div class="col-lg-8 mb-5 mb-lg-0">
<div class="col-12 mb-5 mb-lg-0">
@forelse ($posts as $post)
<article class="row mb-5">
<div class="col-md-4 mb-4 mb-md-0">
<div class="post-img-box">
<img src="/images/posts/resized/resized_{{ $post->featured_image }}"
class="img-fluid rounded-lg" alt="post-thumb">
</div>
</div>
<div class="col-md-8">
<h5>
<a class="post-title" href="{{ route('read_post', $post->slug) }}">
{{ $post->title }}
</a>
</h5>
<ul class="list-inline post-meta mb-2">
<li class="list-inline-item">
<i class="ti-user mr-1"></i><a
href="{{ route('author_posts', $post->author->username) }}">{{ $post->author->name }}</a>
</li>
<li class="list-inline-item">
<i class="ti-calendar mr-1"></i>{{ date_formatter($post->created_at) }}
</li>
<li class="list-inline-item">
Kategorie : <a href="{{ route('category_posts', $post->post_category->slug) }}"
class="ml-1">{{ $post->post_category->name }}</a>
</li>
<li class="list-inline-item"><i class="ti-timer mr-1"></i>
{{ readDuration($post->title, $post->content) }} @choice('min|mins', readDuration($post->title, $post->content))
</li>
</ul>
<p>
{!! Str::ucfirst(words($post->content, 45)) !!}
</p>
<a href="{{ route('read_post', $post->slug) }}" class="btn btn-outline-primary">Mehr
lesen...</a>
</div>
</article>
@empty
<div class="col-span-12">
<div class="text-danger text-center">
Keine Ergebnisse für diese Suche
</div>
</div>
@endforelse
</div>
<div class="pagination-block">
{{ $posts->appends(request()->input())->links('custom_pagination') }}
</div>
</div>
<aside class="col-lg-4">
<!-- Search -->
<x-sidebar-search></x-sidebar-search>
<!-- categories -->
<x-sidebar-categories></x-sidebar-categories>
<!-- tags -->
<x-sidebar-tags></x-sidebar-tags>
<!-- latest post -->
<div class="widget">
<h5 class="widget-title"><span>Letzte Posts</span></h5>
<!-- post-item -->
@foreach (sidebar_latest_posts() as $item)
<ul class="list-unstyled widget-list">
<li class="media widget-post align-items-center">
<a href="{{ route('read_post', $item->slug) }}">
<img loading="lazy" class="mr-3" alt="post-thumb"
src="/images/posts/resized/thumb_{{ $item->featured_image }}">
</a>
<div class="media-body">
<h6 class="mb-0">
<a href="{{ route('read_post', $item->slug) }}">{{ $item->title }}</a>
</h6>
<small>{{ date_formatter($item->created_at) }}</small>
</div>
</li>
</ul>
@endforeach
</div>
</aside>
</div>
@endsection

View File

@@ -0,0 +1,173 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('meta_tags')
{!! SEO::generate() !!}}
@endsection
@section('structured_data')
@if (!empty($post->structured_data))
<script type="application/ld+json">
{!! $post->structured_data !!}
</script>
@endif
@endsection
@section('content')
<div class="row">
<div class="col-lg-8 mb-5 mb-lg-0">
<article class="row mb-4">
<div class="col-lg-12 mb-2">
<h2 class="mb-3">{{ $post->title }}</h2>
<ul class="list-inline post-meta">
<li class="list-inline-item"><i class="ti-user mr-2"></i><a
href="{{ route('author_posts', $post->author->username) }}">{{ $post->author->name }}</a>
</li>
<li class="list-inline-item">Datum : {{ date_formatter($post->created_at) }}</li>
<li class="list-inline-item">Kategorie : <a
href="{{ route('category_posts', $post->post_category->slug) }}"
class="ml-1">{{ $post->post_category->name }}</a>
</li>
<li class="list-inline-item"><i class="ti-timer mr-1"></i>
{{ readDuration($post->title, $post->content) }} @choice('min|mins', readDuration($post->title, $post->content))
</li>
</ul>
</div>
<div class="col-12 mb-3">
<img alt="single-image" src="/images/posts/{{ $post->featured_image }}" class="img-fluid rounded-lg">
</div>
<!-- SHARE BUTTONS -->
<div class="share-buttons">
<span class="title-color">Share: </span>
<a href="https://www.facebook.com/sharer/sharer.php?u={{ urlencode(route('read_post', $post->slug)) }}"
target="_blank" class="btn-facebook">
<i class="ti-facebook"></i>
</a>
<a href="https://twitter.com/intent/tweet?url={{ urlencode(route('read_post', $post->slug)) }}&text={{ urlencode($post->title) }}"
target="_blank" class="btn-twitter">
<i class="ti-twitter-alt"></i>
</a>
<a href="https://www.pinterest.com/pin/create/button?url={{ urlencode(route('read_post', $post->slug)) }}&description={{ urlencode($post->title) }}"
target="_blank" class="btn-pinterest">
<i class="ti-pinterest"></i>
</a>
<a href="mailto:?subject={{ urlencode('Schau dir das an: ' . $post->title) }}&body={{ urlencode('Schau dir diesen Post an: ' . route('read_post', $post->slug)) }}"
target="_blank" class="btn-email">
<i class="ti-email"></i>
</a>
</div>
<!-- SHARE BUTTONS -->
<div class="col-lg-12">
<div class="content">
<p>
{!! $post->content !!}
</p>
</div>
</div>
</article>
<div class="prev-next-posts mt-3 mb-3">
<div class="row justify-content-between p-4">
<div class="col-md-6 mb-2">
@if ($prevPost)
<div>
<h6>&laquo; Vorige</h6>
<a href="{{ route('read_post', $prevPost->slug) }}">{{ $prevPost->title }}</a>
</div>
@endif
</div>
<div class="col-md-6 mb-2 text-md-right">
@if ($nextPost)
<div>
<h6>Nächste &raquo;</h6>
<a href="{{ route('read_post', $nextPost->slug) }}">{{ $nextPost->title }}</a>
</div>
@endif
</div>
</div>
</div>
@if ($relatedPosts)
<section>
<h4>Relevante Posts</h4>
<hr>
@foreach ($relatedPosts as $related)
<article class="row mb-5 mt-4">
<div class="col-md-4 mb-4 mb-md-0">
<div class="post-img-box">
<img src="/images/posts/resized/thumb_{{ $related->featured_image }}"
class="img-fluid rounded-lg" alt="post-thumb">
</div>
</div>
<div class="col-md-8">
<h4>
<a class="post-title" href="{{ route('read_post', $related->slug) }}">
{{ $related->title }}
</a>
</h4>
<ul class="list-inline post-meta mb-2">
<li class="list-inline-item">
<i class="ti-user mr-1"></i><a
href="{{ route('author_posts', $post->author->username) }}">{{ $related->author->name }}</a>
</li>
<li class="list-inline-item">
<i class="ti-calendar mr-1"></i>{{ date_formatter($related->created_at) }}
</li>
<li class="list-inline-item">
Kategorie : <a href="{{ route('category_posts', $related->post_category->slug) }}"
class="ml-1">{{ $related->post_category->name }}</a>
</li>
<li class="list-inline-item"><i class="ti-timer mr-1"></i>
{{ readDuration($post->title, $post->content) }} @choice('min|mins', readDuration($related->title, $related->content))
</li>
</ul>
{!! Str::ucfirst(words($related->content, 28)) !!}
<a href="{{ route('read_post', $related->slug) }}" class="btn btn-outline-primary">Mehr
lesen...</a>
</div>
</article>
@endforeach
</section>
@endif
</div>
<aside class="col-lg-4">
<!-- Search -->
<x-sidebar-search></x-sidebar-search>
<!-- categories -->
<x-sidebar-categories></x-sidebar-categories>
<!-- tags -->
<x-sidebar-tags></x-sidebar-tags>
<!-- latest post -->
<div class="widget">
<h5 class="widget-title"><span>Letzte Post</span></h5>
<!-- post-item -->
@foreach (sidebar_latest_posts(4, $post->id) as $item)
<ul class="list-unstyled widget-list">
<li class="media widget-post align-items-center">
<a href="{{ route('read_post', $item->slug) }}">
<img loading="lazy" class="mr-3" alt="post-thumb"
src="/images/posts/resized/thumb_{{ $item->featured_image }}">
</a>
<div class="media-body">
<h6 class="mb-0">
<a href="{{ route('read_post', $item->slug) }}">{{ $item->title }}</a>
</h6>
<small>{{ date_formatter($item->created_at) }}</small>
</div>
</li>
</ul>
@endforeach
</div>
</aside>
</div>
@endsection
@push('scripts')
<script>
$(document).on('click', '.share-buttons > a', function(e) {
e.preventDefault();
window.open($(this).attr('href'), '', 'height=450,width=450,top=' + ($(window).height() / 2 - 275) +
', left=' + ($(window).width() / 2 - 225) +
', toolbar=0, location=0, menubar=0, directories=0, scrollbars=0');
return false;
});
</script>
@endpush

View File

@@ -0,0 +1,45 @@
@extends('front.layout.pages-layout')
@section('pageTitle', isset($pageTitle) ? $pageTitle : 'Document Title')
@section('head')
<meta name="robots" content="noindex,follow">
@endsection
@section('meta_tags')
{!! SEO::generate() !!}
@endsection
@section('content')
<div class="w-full mb-3">
<h3 class="title-color">{{ $pageTitle }}</h3>
</div>
@if ($posts->count())
<div class="row">
@foreach ($posts as $post)
<div class="col-sm-6 col-md-4 col-lg-3 mb-2">
<article class="mb-2">
<div class="mb-2">
<img src="/images/posts/resized/resized_{{ $post->featured_image }}" alt="tag-thumb"
class="img-fluid rounded-lg" />
</div>
<h5>
<a class="post-title" href="{{ route('read_post', $post->slug) }}">
{{ $post->title }}
</a>
</h5>
<ul class="list-inline post-meta mb-2">
<li class="list-inline-item">Datum: {{ date_formatter($post->created_at) }}</li>
<li class="list-inline-item">Kategorie: <a
href="{{ route('category_posts', $post->post_category->slug) }}"
class="ml-1">{{ $post->post_category->name }}</a> </li>
</ul>
</article>
</div>
@endforeach
</div>
@else
<p><span class="text-danger">Keine Posts mit diesen Tags gefunden</span></p>
@endif
<div class="pagination-block">
{{ $posts->appends(request()->input())->links('custom_pagination') }}
</div>
@endsection

View File

@@ -0,0 +1,203 @@
<div>
<div class="row">
<div class="col-12">
<div class="pd-20 card-box mb-30">
<div class="clearfix">
<div class="pull-left">
<h4 class="h4 text-blue">Haupt Kategorien</h4>
</div>
<div class="pull-right">
<a href="javascript:;" wire:click="addParentCategory()" class="btn btn-primary btn-sm">Haupt
Kategorie hinzufügen.</a>
</div>
</div>
<div class="table-responsive mt-4">
<table class="table table-borderless table-striped table-sm">
<thead class="bg-secondary text-white">
<th>#</th>
<th>Name</th>
<th>Anzahl der Kategorien</th>
<th>Actions</th>
</thead>
<tbody id="sortable_parent_categories">
@forelse ($pcategories as $item)
<tr data-index="{{ $item->id }}" data-ordering="{{ $item->ordering }}">
<td>{{ $item->id }}</td>
<td>{{ $item->name }}</td>
<td>{{ $item->children->count() }}</td>
<td>
<div class="table-actions">
<a href="javascript:;" wire:click="editParentCategory({{ $item->id }})"
class="text-primary mx-2">
<i class="dw dw-edit2"></i>
</a>
<a href="javascript:;"
wire:click="deleteParentCategory({{ $item->id }})"
class="text-danger mx-2">
<i class="dw dw-delete-3"></i>
</a>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="4">
<span class="text-danger">Keine Items gefunden</span>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="d-blcok mt-1 text-center">
{{ $pcategories->links('livewire::bootstrap') }}
</div>
</div>
</div>
<div class="col-12">
<div class="pd-20 card-box mb-30">
<div class="clearfix">
<div class="pull-left">
<h4 class="h4 text-blue">Kategorien</h4>
</div>
<div class="pull-right">
<a href="javascript:;" wire:click="addCategory() " class="btn btn-primary btn-sm">Kategorie
hinzufügen.</a>
</div>
</div>
<div class="table-responsive mt-4">
<table class="table table-borderless table-striped table-sm">
<thead class="bg-secondary text-white">
<th>#</th>
<th>Name</th>
<th>Haupt Kategorie</th>
<th>Anzahl der Posts</th>
<th>Actions</th>
</thead>
<tbody id="sortable_categories">
@forelse ($categories as $item)
<tr data-index="{{ $item->id }}" data-ordering="{{ $item->ordering }}">
<td>{{ $item->id }}</td>
<td>{{ $item->name }}</td>
<td>{{ !is_null($item->parent_category) ? $item->parent_category->name : ' - ' }}
</td>
<td>{{ $item->posts->count() }}</td>
<td>
<div class="table-actions">
<a href="javascript:;" wire:click="editCategory({{ $item->id }})"
class="text-primary mx-2">
<i class="dw dw-edit2"></i>
</a>
<a href="javascript:;" wire:click="deleteCategory({{ $item->id }})"
class="text-danger mx-2">
<i class="dw dw-delete-3"></i>
</a>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="5">
<span class="text-danger">Keine Items gefunden</span>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="d-blcok mt-1 text-center">
{{ $categories->links('livewire::bootstrap') }}
</div>
</div>
</div>
</div>
<div wire:ignore.self class="modal fade" id="pcategory_modal" tabindex="-1" role="dialog"
aria-labelledby="myLargeModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-dialog-centered">
<form class="modal-content"
wire:submit="{{ $isUpdateParentCategoryMode ? 'updateParentCategory()' : 'createParentCategory()' }}">
<div class="modal-header">
<h4 class="modal-title" id="myLargeModalLabel">
{{ $isUpdateParentCategoryMode ? 'Update Haupt Kategorie' : 'Haupt Kategorie hinzufügen' }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
×
</button>
</div>
<div class="modal-body">
@if ($isUpdateParentCategoryMode)
<input type="hidden" wire:model="pcategory_id" />
@endif
<div class="form-group">
<label for=""><b>Haupt Kategorie Name</b></label>
<input type="text" class="form-control" wire:model="pcategory_name"
placeholder="Hauptr Kategorie Namen eingeben" />
@error('pcategory_name')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-secondary" data-dismiss="modal">
Schließen
</button>
<button type="submit" class="btn btn-primary">
{{ $isUpdateParentCategoryMode ? 'Update Haupt Kategorie' : 'Haupt Kategorie erstellen' }}
</button>
</div>
</form>
</div>
</div>
<div wire:ignore.self class="modal fade" id="category_modal" tabindex="-1" role="dialog"
aria-labelledby="myLargeModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="modal-dialog modal-dialog-centered">
<form class="modal-content"
wire:submit="{{ $isUpdateCategoryMode ? 'updateCategory()' : 'createCategory()' }}">
<div class="modal-header">
<h4 class="modal-title" id="myLargeModalLabel">
{{ $isUpdateParentCategoryMode ? 'Update Kategorie' : 'Kategorie hinzufügen' }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
×
</button>
</div>
<div class="modal-body">
@if ($isUpdateCategoryMode)
<input type="hidden" wire:model="category_id" />
@endif
<div class="form-group">
<label for=""><b>Haupt Kategorie</b></label>
<select wire:model="parent" class="custom-select">
<option value="0">Unkategoriert</option>
@foreach ($pcategories as $item)
<option value="{{ $item->id }}">{{ $item->name }}</option>
@endforeach
</select>
@error('parent')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for=""><b>Kategorie Name</b></label>
<input type="text" class="form-control" wire:model="category_name"
placeholder="Kategorie Namen eingeben" />
@error('category_name')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-secondary" data-dismiss="modal">
Schließen
</button>
<button type="submit" class="btn btn-primary">
{{ $isUpdateCategoryMode ? 'Update Kategorie' : 'Kategorie erstellen' }}
</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,104 @@
<div>
<div class="pd-20 card-box mb-30">
<div class="row mb-20">
<div class="col-md-4">
<label for="search"><b class="text-secondary">Suche:</b></label>
<input wire:model.live="search" id="search" type="text" class="form-control"
placeholder="Suche Posts..." />
</div>
@if (auth()->user()->type == 'superAdmin')
<div class="col-md-2">
<label for="author"><b class="text-secondary">Author:</b></label>
<select wire:model.live="author" id="author" class="custom-select form-control">
<option value="">Keine Ausgewählt</option>
@foreach (App\Models\User::whereHas('posts')->get() as $user)
<option value="{{ $user->id }}">{{ $user->name }}</option>
@endforeach
</select>
</div>
@endif
<div class="col-md-2">
<label for="category"><b class="text-secondary">Kategorie:</b></label>
<select wire:model.live="category" id="category" class="custom-select form-control">
<option value="">Keine Ausgewählt</option>
{!! $categories_html !!}
</select>
</div>
<div class="col-md-2">
<label for="visibility"><b class="text-secondary">Sichtbarkeit:</b></label>
<select wire:model.live="visibility" id="visibility" class="custom-select form-control">
<option value="">Keine Ausgewählt</option>
<option value="public">Öffentlich</option>
<option value="private">Privat</option>
</select>
</div>
<div class="col-md-2">
<label for="sort"><b class="text-secondary">Sortiert nach:</b></label>
<select wire:model.live="sortBy" id="sort" class="custom-select form-control">
<option value="asc">Aufsteigend sortiert</option>
<option value="desc">Absteigend sortiert</option>
</select>
</div>
</div>
<div class="table-responsive">
<table class="table table-striped table-auto table-sm">
<thead class="bg-secondary text-white">
<th scope="col">#ID</th>
<th scope="col">Image</th>
<th scope="col">Titel</th>
<th scope="col">Author</th>
<th scope="col">Kategorie</th>
<th scope="col">Sichtbar</th>
<th scope="col">Action</th>
</thead>
<tbody>
@forelse ($posts as $item)
<tr>
<td scope="row">{{ $item->id }}</td>
<td>
<img src="/images/posts/resized/resized_{{ $item->featured_image }}" width="100"
alt="{{ $item->featured_image }}" />
</td>
<td>{{ $item->title }}</td>
<td>{{ $item->author->name }}</td>
<td>{{ $item->post_category->name }}</td>
<td>
@if ($item->visibility == 1)
<span class="badge badge-pill badge-success">
<i class="icon-copy ti-world"></i> Public
</span>
@else
<span class="badge badge-pill badge-warning">
<i class="icon-copy ti-lock"></i> Privat
</span>
@endif
</td>
<td>
<div class="table-actions">
<a href="{{ route('admin.edit_post', ['id' => $item->id]) }}" data-color="#265ed7"
style="color: rgb(38,94,215)">
<i class="icon-copy dw dw-edit2"></i>
</a>
<a href="javascript:;" wire:click="deletePost({{ $item->id }})"
data-color="#e95959" style="color: rgb(233,89,89)">
<i class="icon-copy dw dw-delete-3"></i>
</a>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="7">
<span class="text-danger">Keine Post(s) gefunden! </span>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="block mt-1">
{{ $posts->links('livewire::bootstrap') }}
</div>
</div>
</div>

View File

@@ -0,0 +1,269 @@
<div>
<div class="row">
<div class="col-xl-4 col-lg-4 col-md-4 col-sm-12 mb-30">
<div class="pd-20 card-box height-100-p">
<div class="profile-photo">
<a href="javascript:;"
onclick="event.preventDefault();document.getElementById('profilePictureFile').click();"
class="edit-avatar"><i class="fa fa-pencil"></i></a>
<img src="{{ $user->picture }}" alt="" class="avatar-photo" id="profilePicturePreview"
alt="profilePicturePreview" />
<input type="file" name="profilePictureFile" id="profilePictureFile" class="d-none"
style="opacity: 0" accept=".jpg,.jpeg,.png">
</div>
<h5 class="text-center h5 mb-0">{{ $user->name }}</h5>
<p class="text-center text-muted font-14">
{{ $user->email }}
</p>
<div class="profile-social">
<h5 class="mb-20 h5 text-blue">Social Links</h5>
<ul class="clearfix">
@if (auth()->user()->social_links->facebook_url != '')
<li>
<a href="{{ auth()->user()->social_links->facebook_url }}" class="btn"
data-bgcolor="#3b5998" data-color="#ffffff"><i class="fa fa-facebook"></i></a>
</li>
@endif
@if (auth()->user()->social_links->twitter_url != '')
<li>
<a href="{{ auth()->user()->social_links->twitter_url }}" class="btn"
data-bgcolor="#1da1f2" data-color="#ffffff"><i class="fa fa-twitter"></i></a>
</li>
@endif
@if (auth()->user()->social_links->linkedin_url != '')
<li>
<a href="{{ auth()->user()->social_links->linkedin_url }}" class="btn"
data-bgcolor="#007bb5" data-color="#ffffff"><i class="fa fa-linkedin"></i></a>
</li>
@endif
@if (auth()->user()->social_links->instagram_url != '')
<li>
<a href="{{ auth()->user()->social_links->instagram_url }}" class="btn"
data-bgcolor="#f46f30" data-color="#ffffff"><i class="fa fa-instagram"></i></a>
</li>
@endif
@if (auth()->user()->social_links->youtube_url != '')
<li>
<a href="{{ auth()->user()->social_links->youtube_url }}" class="btn"
data-bgcolor="#ff0000" data-color="#ffffff"><i class="fa fa-youtube"></i></a>
</li>
@endif
@if (auth()->user()->social_links->github_url != '')
<li>
<a href="{{ auth()->user()->social_links->github_url }}" class="btn"
data-bgcolor="#a6a6a6" data-color="#ffffff"><i class="fa fa-github"></i></a>
</li>
@endif
</ul>
</div>
</div>
</div>
<div class="col-xl-8 col-lg-8 col-md-8 col-sm-12 mb-30">
<div class="card-box height-100-p overflow-hidden">
<div class="profile-tab height-100-p">
<div class="tab height-100-p">
<ul class="nav nav-tabs customtab" role="tablist">
<li class="nav-item">
<a wire:click="selectTab('personal_details')"
class="nav-link {{ $tab == 'personal_details' ? 'active' : '' }}" data-toggle="tab"
href="#personal_details" role="tab">Personal
Details</a>
</li>
<li class="nav-item">
<a wire:click="selectTab('update_password')"
class="nav-link {{ $tab == 'update_password' ? 'active' : '' }}" data-toggle="tab"
href="#update_password" role="tab">Update
Passwort</a>
</li>
<li class="nav-item">
<a wire:click="selectTab('social_links')"
class="nav-link {{ $tab == 'social_links' ? 'active' : '' }}" data-toggle="tab"
href="#social_links" role="tab">Social
Links</a>
</li>
</ul>
<div class="tab-content">
<!-- Timeline Tab start -->
<div class="tab-pane fade {{ $tab == 'personal_details' ? 'show active' : '' }} "
id="personal_details" role="tabpanel">
<div class="pd-20">
<form wire:submit="updatePersonalDetails()">
<div class="row">
<div class="col-md-12">
<div class="form-group">
<label for="">Dein Namen<span
style="color:red">*</span></label>
<input type="text" class="form-control" wire:model="name"
placeholder="Dein Namen" />
@error('name')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="">Deine E-Mail</label>
<input type="email" class="form-control" wire:model="email"
disabled placeholder="Deine Email" />
@error('email')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="">Benutzername<span
style="color:red">*</span></label>
<input type="text" class="form-control" wire:model="username"
placeholder="Dein Benutzername" />
@error('username')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<label for="">Deine Bio</label>
<textarea wire:model="bio" cols="4" rows="4" class="form-control" placeholder="Deine Bio"></textarea>
@error('bio')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Einstellungen
speichern</button>
</div>
</form>
</div>
</div>
<!-- Timeline Tab End -->
<!-- Tasks Tab start -->
<div class="tab-pane fade {{ $tab == 'update_password' ? 'show active' : '' }}"
id="update_password" role="tabpanel">
<div class="pd-20 profile-task-wrap">
<form wire:submit="updatePassword()">
<div class="row">
<div class="col-md-4">
<div class="form-group">
<label for="">Aktuelles Passwort</label>
<input type="password" class="form-control"
wire:model="current_password"
placeholder="Gib dein aktuelles Passwort ein" />
@error('current_password')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="">Neues Passwort</label>
<input type="password" class="form-control"
wire:model="new_password"
placeholder="Gib dein neues Passwort ein" />
@error('new_password')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label for="">Neues Passwort bestötigen</label>
<input type="password" class="form-control"
wire:model="new_password_confirmation"
placeholder="Bestätige dein neues Passwort ein" />
@error('new_password_confirmation')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Passwort ändern</button>
</form>
</div>
</div>
<!-- Tasks Tab End -->
<!-- Setting Tab start -->
<div class="tab-pane fade {{ $tab == 'social_links' ? 'show active' : '' }}"
id="social_links" role="tabpanel">
<div class="pd-20 profile-task-wrap">
<form method="POST" wire:submit="updateSocialLinks()">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>Facebook</b></label>
<input type="text" class="form-control"
wire:model="facebook_url" placeholder="Facebook Url" />
@error('facebook_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>Instagram</b></label>
<input type="text" class="form-control"
wire:model="instagram_url" placeholder="Instagram Url" />
@error('instagram_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>YouTube</b></label>
<input type="text" class="form-control"
wire:model="youtube_url" placeholder="Youtube Url" />
@error('youtube_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>LinkedIn</b></label>
<input type="text" class="form-control"
wire:model="linkedin_url" placeholder="LinkedIn Url" />
@error('linkedin_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>Twitter</b></label>
<input type="text" class="form-control"
wire:model="twitter_url" placeholder="Twitter Url" />
@error('twitter_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>GitHub</b></label>
<input type="text" class="form-control"
wire:model="github_url" placeholder="GitHub Url" />
@error('github_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Speichern</button>
</form>
</div>
</div>
<!-- Setting Tab End -->
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,180 @@
<div>
<div class="tab">
<ul class="nav nav-tabs customtab" role="tablist">
<li class="nav-item">
<a wire:click="selectTab('general_settings')"
class="nav-link {{ $tab == 'general_settings' ? 'active' : '' }}" data-toggle="tab"
href="#general_settings" role="tab" aria-selected="true">Allgemeine Einstellungen</a>
</li>
<li class="nav-item">
<a wire:click="selectTab('logo_favicon')" class="nav-link {{ $tab == 'logo_favicon' ? 'active' : '' }}"
data-toggle="tab" href="#logo_favicon" role="tab" aria-selected="false">Logo &
Favicon</a>
</li>
<li class="nav-item">
<a wire:click="selectTab('social_links')" class="nav-link {{ $tab == 'social_links' ? 'active' : '' }}"
data-toggle="tab" href="#social_links" role="tab" aria-selected="false">Social Links</a>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade {{ $tab == 'general_settings' ? 'active show' : '' }}" id="general_settings"
role="tabpanel">
<div class="pd-20">
<form wire:submit="updateSiteInfo()">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label><b>Seiten Titel</b><span style="color:red">*</span></label>
<input type="text" class="form-control" wire:model="site_title"
placeholder="Seiten Titel angeben" />
@error('site_title')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for=""><b>Seiten Kontakt E-Mail</b><span
style="color:red">*</span></label>
<input type="text" class="form-control" wire:model="site_email"
placeholder="Kontakt E-Mail Adresse angeben" />
@error('site_email')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for=""><b>Seiten Kontakt Telefonnummer</b><small>
(optional)</small></label>
<input type="text" class="form-control" wire:model="site_phone"
placeholder="Kontakt Telefonnummer angeben" />
@error('site_phone')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for=""><b>Seiten Meta Keywords</b><small>
(optional)</small></label>
<input type="text" class="form-control" wire:model="site_meta_keywords"
placeholder="Eg: ecommerce, free api, laravel, dropshipping" />
@error('site_meta_keywords')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<div class="form-group">
<label for=""><b>Seiten Meta Description</b><small>
(optional)</small></label>
<textarea class="form-control" rows="4" cols="4" wire:model="site_meta_description"
placeholder="Meta Description hier angeben"></textarea>
@error('site_meta_description')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<button class="btn btn-primary" type="submit">Speichern</button>
</form>
</div>
</div>
<div class="tab-pane fade {{ $tab == 'logo_favicon' ? 'active show' : '' }}" id="logo_favicon"
role="tabpanel">
<div class="pd-20">
<div class="row">
<div class="col-md-6">
<h6>Seiten Logo</h6>
<div class="mb-2 mt-1" style="max-width: 200px">
<img wire:ignore
src="/images/site/{{ isset(settings()->site_logo) ? settings()->site_logo : '' }}"
alt="img-thumbnail" class="img-thumbnail" id="preview_site_logo">
</div>
<form action="{{ route('admin.update_logo') }}" method="post"
enctype="multipart/form-data" id="updateLogoForm">
@csrf
<div class="mb-2">
<input type="file" name="site_logo" id="profileLogoFile" accept="image/*"
class="form-control" />
<span class="text-danger ml-1"></span>
</div>
<button type="submit" class="btn btn-primary">Logo ändern</button>
</form>
</div>
<div class="col-md-6">
<h6>Seiten Favicon</h6>
<div class="mb-2 mt-1" style="max-width: 100px">
<img wire:ignore
src="/images/site/{{ isset(settings()->site_favicon) ? settings()->site_favicon : '' }}"
alt="img-thumbnail" class="img-thumbnail" id="preview_site_favicon">
</div>
<form action="{{ route('admin.update_favicon') }}" method="POST"
enctype="multipart/form-data" id="updateFaviconForm">
@csrf
<div class="mb-2">
<input type="file" name="site_favicon" id="profileFaviconFile"
class="form-control" accept="image/png,image/jpeg, image/jpg" />
<span class="text-danger
ml-1"></span>
</div>
<button type="submit" class="btn btn-primary">Favicon ändern</button>
</form>
</div>
</div>
</div>
</div>
<div class="tab-pane fade {{ $tab == 'social_links' ? 'active show' : '' }}" id="social_links"
role="tabpanel">
<div class="pd-20">
<form method="POST" wire:submit="updateSiteSocialLinks()">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>Facebook</b></label>
<input type="text" class="form-control" wire:model="facebook_url"
placeholder="Facebook Url" />
@error('facebook_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>Instagram</b></label>
<input type="text" class="form-control" wire:model="instagram_url"
placeholder="Instagram Url" />
@error('instagram_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>LinkedIn</b></label>
<input type="text" class="form-control" wire:model="linkedin_url"
placeholder="LinkedIn Url" />
@error('linkedin_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for=""><b>Twitter (X)</b></label>
<input type="text" class="form-control" wire:model="twitter_url"
placeholder="Twitter Url" />
@error('twitter_url')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Speichern</button>
</form>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,149 @@
<div>
<div class="page-header">
<div class="row">
<div class="col-md-6 col-sm-12">
<div class="title">
<h4>Slider hinzufügen</h4>
</div>
<nav aria-label="breadcrumb" role="navigation">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{{ route('admin.dashboard') }}">Home</a>
</li>
<li class="breadcrumb-item active" aria-current="page">
Manage Slider
</li>
</ol>
</nav>
</div>
<div class="col-md-6 col-sm-12 text-right">
<a href="javascript:;" wire:click="addSlide()" class="btn btn-primary">Slider hinzufügen</a>
</div>
</div>
</div>
<div class="card-box pd-20 mb-4">
<div class="table-responsive">
<table class="table table-striped table-auto table-sm table-condensed">
<thead class="bg-secondary text-white">
<th scope="col">#ID</th>
<th scope="col">Image</th>
<th scope="col">Heading</th>
<th scope="col">Link</th>
<th scope="col">Status</th>
<th scope="col">Action</th>
</thead>
<tbody id="sortable_slides">
@forelse ($slides as $slide)
<tr data-index="{{ $slide->id }}" data-ordering="{{ $slide->ordering }}">
<td scope="row">#{{ $slide->id }}</td>
<td>
<a href="">
<img src="/images/slides/{{ $slide->image }}" width="100" alt="img-thumbnail" />
</a>
</td>
<td>{{ $slide->heading }}</td>
<td><a
href="{{ $slide->link ? $slide->link : ' - ' }}">{{ $slide->link ? 'Klick mich' : ' - ' }}</a>
</td>
<td>
@if ($slide->status == 1)
<span class="badge badge-pill badge-success">Public</span>
@else
<span class="badge badge-pill badge-secondary">Unveröffentlicht</span>
@endif
</td>
<td>
<div class="table-actions">
<a href="javascript:;" wire:click="editSlide({{ $slide->id }})"
class="text-primary mx-2">
<i class="dw dw-edit2"></i>
</a>
<a href="javascript:;"
wire:click="$dispatch('deleteSlide',{id:{{ $slide->id }} })"
class="text-danger mx-2">
<i class="dw dw-delete-3"></i>
</a>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="6">
<span class="text-danger">Keine Slides gefunden</span>
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
<!-- Slider -->
<div wire:ignore.self class="modal fade" id="slide_modal" tabindex="-1" role="dialog"
aria-labelledby="myLargeModalLabel" aria-hidden="true" data-backdrop="static" data-keyword="false">
<div class="modal-dialog modal-dialog-centered">
<form class="modal-content" wire:submit="{{ $isUpdateSlideMode ? 'updateSlide()' : 'createSlide()' }}">
<div class="modal-header">
<h4 class="modal-title" id="myLargeModalLabel">
{{ $isUpdateSlideMode ? 'Update Slide' : 'Slide hinzufügen' }}
</h4>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
×
</button>
</div>
<div class="modal-body">
@if ($isUpdateSlideMode)
<input type="hidden" wire:model="slide_id" />
@endif
<div class="form-group">
<label for=""><b>Heading:</b></label>
<input type="text" class="form-control" wire:model="slide_heading"
placeholder="Enter Slide Heading" />
@error('slide_heading')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<div class="form-group">
<label for=""><b>Link:</b></label>
<input type="text" class="form-control" wire:model="slide_link"
placeholder="Enter Slide Link" />
@error('slide_link')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
@if ($selected_slide_image)
<div class="d-block" style="max-width: 200px;">
<img src="{{ $selected_slide_image }}" alt="img-thumbnail" class="img-thumbnail"
style="max-width: 100%; height: auto;" />
</div>
@endif
<div class="form-group">
<label for=""><b>Image:</b></label>
<input type="file" class="form-control" wire:model="slide_image"
accept="image/png,image/jpeg, image/jpg" />
@error('slide_image')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<div class="custom-control custom-checkbox mb-5">
<input type="checkbox" class="custom-control-input" id="customCheck"
wire:model="slide_status" />
<label for="customCheck" class="custom-control-label">
Visible on Slider
</label>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
Close
</button>
<button type="submit" class="btn btn-primary">
{{ $isUpdateSlideMode ? 'Speichern' : 'Erstellen' }}
</button>
</div>
</form>
</div>
</div>
<!-- /Slider -->
</div>

View File

@@ -0,0 +1,25 @@
<div>
<div class="user-info-dropdown">
<div class="dropdown">
<a class="dropdown-toggle" href="#" role="button" data-toggle="dropdown">
<span class="user-icon">
<img src="{{ $user->picture }}" alt="{{ $user->name }}" />
</span>
<span class="user-name">{{ $user->name }}</span>
</a>
<div class="dropdown-menu dropdown-menu-right dropdown-menu-icon-list">
<a class="dropdown-item" href="{{ route('admin.profile') }}"><i class="dw dw-user1"></i>
Profile</a>
<a class="dropdown-item" href="{{ route('admin.profile') }} "><i class="dw dw-settings2"></i>
Einstellung</a>
<a class="dropdown-item" href="{{ route('admin.logout') }}"
onclick="event.preventDefault(); document.getElementById("logout-form").submit();"><i
class="dw dw-logout"></i>
Ausloggen</a>
<form action="{{ route('admin.logout') }}" id="logout-form" method="POST">
@csrf
</form>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div>
<form class="subscription" wire:submit="subscribe()" method="post">
<div class="position-relative">
<i class="ti-email email-icon"></i>
<input type="email" wire:model.live="email" class="form-control" placeholder="Ihre Email Address">
@error('email')
<span class="text-danger ml-1">{{ $message }}</span>
@enderror
</div>
<button class="btn btn-primary btn-block rounded" type="submit">Subscribe now</button>
</form>
</div>

View File

View File

@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<title>Filemanager</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="/extra-assets/jquery-ui/jquery-ui.min.css" />
<script src="/extra-assets/jquery-ui/external/jquery/jquery.js"></script>
<script src="/extra-assets/jquery-ui/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir . '/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir . '/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir . '/js/elfinder.min.js') }}"></script>
@if ($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir . "/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript" charset="utf-8">
// Helper function to get parameters from the query string.
function getUrlParam(paramName) {
var reParam = new RegExp('(?:[\?&]|&amp;)' + paramName + '=([^&]+)', 'i');
var match = window.location.search.match(reParam);
return (match && match.length > 1) ? match[1] : '';
}
$().ready(function() {
var funcNum = getUrlParam('CKEditorFuncNum');
var elf = $('#elfinder').elfinder({
// set your elFinder options here
@if ($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url: '{{ route('elfinder.connector') }}', // connector URL
soundPath: '{{ asset($dir . '/sounds') }}',
getFileCallback: function(file) {
window.opener.CKEDITOR.tools.callFunction(funcNum, file.url);
window.close();
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir.'/js/elfinder.min.js') ?>"></script>
<?php if($locale){ ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir."/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript" charset="utf-8">
// Helper function to get parameters from the query string.
function getUrlParam(paramName) {
var reParam = new RegExp('(?:[\?&]|&amp;)' + paramName + '=([^&]+)', 'i') ;
var match = window.location.search.match(reParam) ;
return (match && match.length > 1) ? match[1] : '' ;
}
$().ready(function() {
var funcNum = getUrlParam('CKEditorFuncNum');
var elf = $('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url: '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>',
getFileCallback : function(file) {
window.opener.CKEDITOR.tools.callFunction(funcNum, file.url);
window.close();
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir.'/js/elfinder.min.js') }}"></script>
@if($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir."/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript" charset="utf-8">
// Documentation for client options:
// https://github.com/Studio-42/elFinder/wiki/Client-configuration-options
$().ready(function() {
$('#elfinder').elfinder({
// set your elFinder options here
@if($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url : '{{ route("elfinder.connector") }}', // connector URL
soundPath: '{{ asset($dir.'/sounds') }}'
});
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir.'/js/elfinder.min.js') ?>"></script>
<?php if($locale){ ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir."/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript" charset="utf-8">
// Documentation for client options:
// https://github.com/Studio-42/elFinder/wiki/Client-configuration-options
$().ready(function() {
$('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url : '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>'
});
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/smoothness/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir . '/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir . '/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir . '/js/elfinder.min.js') }}"></script>
@if($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir . "/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<!-- Include jQuery, jQuery UI, elFinder (REQUIRED) -->
<script type="text/javascript">
$().ready(function () {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
@if($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url: '{{ route("elfinder.connector") }}', // connector URL
soundPath: '{{ asset($dir.'/sounds') }}',
resizable: false,
ui: ['toolbar', 'path','stat'],
onlyMimes: [{{ $mimeTypes }}],
rememberLastDir : false,
height: 300,
defaultView: 'list',
getFileCallback: function (file) {
window.parent.processSelectedFile(file, '{{ $input_id }}');
console.log(file);
},
uiOptions : {
// toolbar configuration
toolbar : [
['home', 'up'],
['upload'],
['quicklook'],
],
// directories tree options
tree : {
// expand current root on init
openRootOnLoad : true,
// auto load current dir parents
syncTree : true
},
// navbar options
navbar : {
minWidth : 150,
maxWidth : 500
},
// current working directory options
cwd : {
// display parent directory in listing as ".."
oldSchool : false
}
}
}).elfinder('instance');
});
</script>
</head>
<body style="margin: 0;">
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/smoothness/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir . '/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir . '/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir . '/js/elfinder.min.js') ?>"></script>
<?php if ($locale) { ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir . "/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<!-- Include jQuery, jQuery UI, elFinder (REQUIRED) -->
<script type="text/javascript">
$().ready(function () {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url: '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>',
resizable: false,
ui: ['toolbar', 'path','stat'],
onlyMimes: [<?= $mimeTypes ?>],
rememberLastDir : false,
height: 300,
defaultView: 'list',
getFileCallback: function (file) {
window.parent.processSelectedFile(file, '<?= $input_id?>');
console.log(file);
},
uiOptions : {
// toolbar configuration
toolbar : [
['home', 'up'],
['upload'],
['quicklook'],
],
// directories tree options
tree : {
// expand current root on init
openRootOnLoad : true,
// auto load current dir parents
syncTree : true
},
// navbar options
navbar : {
minWidth : 150,
maxWidth : 500
},
// current working directory options
cwd : {
// display parent directory in listing as ".."
oldSchool : false
}
}
}).elfinder('instance');
});
</script>
</head>
<body style="margin: 0;">
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/smoothness/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir . '/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir . '/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir . '/js/elfinder.min.js') }}"></script>
@if($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir . "/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<!-- Include jQuery, jQuery UI, elFinder (REQUIRED) -->
<script type="text/javascript">
$().ready(function () {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
@if($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url: '{{ route("elfinder.connector") }}', // connector URL
soundPath: '{{ asset($dir.'/sounds') }}',
dialog: {width: 900, modal: true, title: 'Select a file'},
resizable: false,
commandsOptions: {
getfile: {
oncomplete: 'destroy'
}
},
getFileCallback: function (file) {
window.parent.processSelectedFile(file.path, '{{ $input_id }}');
parent.jQuery.colorbox.close();
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,60 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/smoothness/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir . '/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir . '/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir . '/js/elfinder.min.js') ?>"></script>
<?php if ($locale)
{ ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir . "/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<!-- Include jQuery, jQuery UI, elFinder (REQUIRED) -->
<script type="text/javascript">
$().ready(function () {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url: '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>',
dialog: {width: 900, modal: true, title: 'Select a file'},
resizable: false,
commandsOptions: {
getfile: {
oncomplete: 'destroy'
}
},
getFileCallback: function (file) {
window.parent.processSelectedFile(file.path, '<?= $input_id?>');
parent.jQuery.colorbox.close();
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir.'/js/elfinder.min.js') }}"></script>
<!-- TinyMCE Popup class (REQUIRED) -->
<script type="text/javascript" src="{{ asset($dir.'/js/tiny_mce_popup.js') }}"></script>
@if($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir."/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<script type="text/javascript">
var FileBrowserDialogue = {
init: function() {
// Here goes your code for setting your custom things onLoad.
},
mySubmit: function (URL) {
var win = tinyMCEPopup.getWindowArg('window');
// pass selected file path to TinyMCE
win.document.getElementById(tinyMCEPopup.getWindowArg('input')).value = URL;
// are we an image browser?
if (typeof(win.ImageDialog) != 'undefined') {
// update image dimensions
if (win.ImageDialog.getImageData) {
win.ImageDialog.getImageData();
}
// update preview if necessary
if (win.ImageDialog.showPreviewImage) {
win.ImageDialog.showPreviewImage(URL);
}
}
// close popup window
tinyMCEPopup.close();
}
}
tinyMCEPopup.onInit.add(FileBrowserDialogue.init, FileBrowserDialogue);
$().ready(function() {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
@if($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url : '{{ route("elfinder.connector") }}', // connector URL
soundPath: '{{ asset($dir.'/sounds') }}',
getFileCallback: function(file) { // editor callback
FileBrowserDialogue.mySubmit(file.url); // pass selected file path to TinyMCE
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir.'/js/elfinder.min.js') ?>"></script>
<!-- TinyMCE Popup class (REQUIRED) -->
<script type="text/javascript" src="<?= asset($dir.'/js/tiny_mce_popup.js') ?>"></script>
<?php if($locale){ ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir."/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<script type="text/javascript">
var FileBrowserDialogue = {
init: function() {
// Here goes your code for setting your custom things onLoad.
},
mySubmit: function (URL) {
var win = tinyMCEPopup.getWindowArg('window');
// pass selected file path to TinyMCE
win.document.getElementById(tinyMCEPopup.getWindowArg('input')).value = URL;
// are we an image browser?
if (typeof(win.ImageDialog) != 'undefined') {
// update image dimensions
if (win.ImageDialog.getImageData) {
win.ImageDialog.getImageData();
}
// update preview if necessary
if (win.ImageDialog.showPreviewImage) {
win.ImageDialog.showPreviewImage(URL);
}
}
// close popup window
tinyMCEPopup.close();
}
}
tinyMCEPopup.onInit.add(FileBrowserDialogue.init, FileBrowserDialogue);
$().ready(function() {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url : '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>',
getFileCallback: function(file) { // editor callback
FileBrowserDialogue.mySubmit(file.url); // pass selected file path to TinyMCE
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir.'/js/elfinder.min.js') }}"></script>
@if($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir."/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript">
var FileBrowserDialogue = {
init: function() {
// Here goes your code for setting your custom things onLoad.
},
mySubmit: function (URL) {
// pass selected file path to TinyMCE
parent.tinymce.activeEditor.windowManager.getParams().setUrl(URL);
// close popup window
parent.tinymce.activeEditor.windowManager.close();
}
}
$().ready(function() {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
@if($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url: '{{ route("elfinder.connector") }}', // connector URL
soundPath: '{{ asset($dir.'/sounds') }}',
getFileCallback: function(file) { // editor callback
FileBrowserDialogue.mySubmit(file.url); // pass selected file path to TinyMCE
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir.'/js/elfinder.min.js') ?>"></script>
<?php if($locale){ ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir."/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript">
var FileBrowserDialogue = {
init: function() {
// Here goes your code for setting your custom things onLoad.
},
mySubmit: function (URL) {
// pass selected file path to TinyMCE
parent.tinymce.activeEditor.windowManager.getParams().setUrl(URL);
// close popup window
parent.tinymce.activeEditor.windowManager.close();
}
}
$().ready(function() {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url: '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>',
getFileCallback: function(file) { // editor callback
FileBrowserDialogue.mySubmit(file.url); // pass selected file path to TinyMCE
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/elfinder.min.css') }}">
<link rel="stylesheet" type="text/css" href="{{ asset($dir.'/css/theme.css') }}">
<!-- elFinder JS (REQUIRED) -->
<script src="{{ asset($dir.'/js/elfinder.min.js') }}"></script>
@if($locale)
<!-- elFinder translation (OPTIONAL) -->
<script src="{{ asset($dir."/js/i18n/elfinder.$locale.js") }}"></script>
@endif
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript">
var FileBrowserDialogue = {
init: function() {
// Here goes your code for setting your custom things onLoad.
},
mySubmit: function (file) {
window.parent.postMessage({
mceAction: 'fileSelected',
data: {
file: file
}
}, '*');
}
};
$().ready(function() {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
@if($locale)
lang: '{{ $locale }}', // locale
@endif
customData: {
_token: '{{ csrf_token() }}'
},
url: '{{ route("elfinder.connector") }}', // connector URL
soundPath: '{{ asset($dir.'/sounds') }}',
getFileCallback: function(file) { // editor callback
FileBrowserDialogue.mySubmit(file); // pass selected file path to TinyMCE
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

View File

@@ -0,0 +1,64 @@
<!DOCTYPE html>
<html lang="<?= app()->getLocale() ?>">
<head>
<meta charset="utf-8">
<title>elFinder 2.0</title>
<!-- jQuery and jQuery UI (REQUIRED) -->
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/themes/smoothness/jquery-ui.css" />
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>
<!-- elFinder CSS (REQUIRED) -->
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/elfinder.min.css') ?>">
<link rel="stylesheet" type="text/css" href="<?= asset($dir.'/css/theme.css') ?>">
<!-- elFinder JS (REQUIRED) -->
<script src="<?= asset($dir.'/js/elfinder.min.js') ?>"></script>
<?php if($locale){ ?>
<!-- elFinder translation (OPTIONAL) -->
<script src="<?= asset($dir."/js/i18n/elfinder.$locale.js") ?>"></script>
<?php } ?>
<!-- elFinder initialization (REQUIRED) -->
<script type="text/javascript">
var FileBrowserDialogue = {
init: function() {
// Here goes your code for setting your custom things onLoad.
},
mySubmit: function (file) {
window.parent.postMessage({
mceAction: 'fileSelected',
data: {
file: file
}
}, '*');
}
};
$().ready(function() {
var elf = $('#elfinder').elfinder({
// set your elFinder options here
<?php if($locale){ ?>
lang: '<?= $locale ?>', // locale
<?php } ?>
customData: {
_token: '<?= csrf_token() ?>'
},
url: '<?= route("elfinder.connector") ?>', // connector URL
soundPath: '<?= asset($dir.'/sounds') ?>',
getFileCallback: function(file) { // editor callback
FileBrowserDialogue.mySubmit(file); // pass selected file path to TinyMCE
}
}).elfinder('instance');
});
</script>
</head>
<body>
<!-- Element where elFinder will be created (REQUIRED) -->
<div id="elfinder"></div>
</body>
</html>

File diff suppressed because one or more lines are too long