Initial Commit

This commit is contained in:
2021-05-13 11:20:17 +02:00
commit 48b3256ebf
126 changed files with 39162 additions and 0 deletions

View File

@@ -0,0 +1,29 @@
@extends('layout.main')
@section('title', $title)
@section('content')
<form action="{{ Route("auth-password-change.post") }}" method="post">
<div class="field">
<label for="old_password" class="label">{{ __("views.old_password") }}</label>
<div class="control">
<input type="password" name="old_password" id="old_password" class="input" placeholder="{{ __("views.old_password") }}" required>
</div>
</div>
<div class="field">
<label for="new_password" class="label">{{ __("views.new_password") }}</label>
<div class="control">
<input type="password" name="new_password" id="new_password" class="input" placeholder="{{ __("views.new_password") }}" required>
</div>
</div>
{{ csrf_field() }}
<div class="field">
<div class="control">
<button class="button is-link">{{ __("views.change_password") }}</button>
</div>
</div>
</form>
@endsection

View File

@@ -0,0 +1,35 @@
@extends('layout.main')
@section('title', $title)
@section('content')
<form action="{{ Route("auth-login.post") }}" method="post">
<div class="field">
<label for="username" class="label">{{ __("views.username") }}</label>
<div class="control">
<input type="text" name="username" id="username" class="input" placeholder="{{ __("views.username") }}" value="{{ Request::old('username') }}" required>
</div>
</div>
<div class="field">
<label for="password" class="label">{{ __("views.password") }}</label>
<div class="control">
<input type="password" name="password" id="password" class="input" placeholder="{{ __("views.password") }}" required>
</div>
</div>
<div class="field">
<label class="checkbox">
<input type="checkbox" name="remember"> {{ __("views.remember_me") }}
</label>
</div>
{{ csrf_field() }}
<div class="field">
<div class="control">
<button class="button is-link">{{ __("views.login") }}</button>
</div>
</div>
</form>
@endsection

View File

@@ -0,0 +1,68 @@
@extends('layout.main')
@section('title', $title)
@section('content')
<div class="card">
<div class="card-header">
<p class="card-header-title">{{ __("views.add_domain") }}</p>
</div>
<div class="card-content">
<form action="{{ Route("domains.add") }}" method="post">
<div class="field">
<label for="name" class="label">{{ __("views.name") }}</label>
<div class="control">
<input type="text" name="name" id="name" class="input" placeholder="{{ __('views.name') }}" autofocus required>
</div>
</div>
{{ csrf_field() }}
<div class="field">
<div class="control">
<button class="button is-link">{{ __("views.save") }}</button>
</div>
</div>
</form>
</div>
</div>
<hr>
@if($domains->isEmpty())
<article class="message is-warning">
<div class="message-header">
<p>{{ __("views.no_domains_text_header") }}!</p>
</div>
<div class="message-body">
{{ __("views.no_domains_text_body") }}!
</div>
</article>
@else
Domains: {{ $domains->count() }}
<table class="table is-bordered is-striped is-hoverable is-fullwidth">
<thead>
<tr>
<th>{{ __("views.domain") }}</th>
<th>{{ __("views.delete") }}</th>
</tr>
</thead>
<tbody>
@foreach($domains as $domain)
<tr>
<td>{{ $domain->name }}</td>
<td>
<form action="{{ Route("domains.delete") }}" method="post">
<input type="hidden" name="domain_name" value="{{ $domain->name }}">
<input type="hidden" name="domain_id" value="{{ $domain->id }}">
{{ csrf_field() }}
<span class="delete-btn" aria-label="{{ __("views.delete_domain") }}" data-microtip-position="top" data-name="{{ $domain->name }}" data-delete="domain" role="tooltip"><i class="fas fa-trash-alt"></i></span>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
@endif
@endsection

View File

@@ -0,0 +1,119 @@
@extends('layout.main')
@section('title', $title)
@section('content')
@if($domains->isEmpty())
@else
@include('modals.record-edit')
<div class="select" id="domain-select">
<div class="field is-horizontal">
<div class="field-label">
<label class="label" for="select_domain">{{ __("views.domain") }}</label>
</div>
<div class="field-body">
<select id="select_domain">
@foreach($domains as $domain)
<option value="{{ $domain->id }}">{{ $domain->name }}</option>
@endforeach
</select>
</div>
</div>
</div>
<hr>
@foreach($domains as $domain)
<nav class="panel domain-panel domain-panel-{{ $domain->id }} {{ $loop->first ? 'is-active' : 'is-hidden' }}">
<p class="panel-heading">{{ __("views.domain") }}: {{ $domain->name }}</p>
<!-- TODO: Check for Domain specific records -->
@if($records->isEmpty())
<div class="panel-block">
<article class="message is-warning">
<div class="message-header">
<p>{{ __("views.no_data_available_header") }}!</p>
</div>
<div class="message-body">
{{ __("views.no_data_available_body") }}!
</div>
</article>
</div>
@elseif(empty($recordCount[$domain->id]))
<div class="panel-block">
<article class="message is-warning">
<div class="message-header">
<p>{{ __("views.no_records_available_header") }}!</p>
</div>
<div class="message-body">
{{ __("views.no_records_available_body") }}!<br />
<a href="{{ Route('records.add') }}?domain={{ $domain->id }}">{{ __("views.add_record") }}</a>
</div>
</article>
</div>
@else
<div class="panel-block">
<table id="overviewTable-{{ $domain->id }}" class="table is-bordered is-striped is-hoverable is-fullwidth record-table">
<thead>
<tr>
<th>{{ __("views.name") }}</th>
<th>{{ __("views.type") }}</th>
<th>{{ __("views.content") }}</th>
<th>{{ __("views.ttl") }}</th>
<th>{{ __("views.edit") }}</th>
<th>{{ __("views.delete") }}</th>
</tr>
</thead>
<tbody>
@foreach($records as $record)
@if($record->domains_id == $domain->id)
<tr>
<td>{{ $record->name }}
<td>{{ $record->type }}</td>
<td>
{{ \Illuminate\Support\Str::of($record->content)->limit(70) }}
@if($record->type == "SRV")
TTL: {{ explode(" ", $record->content)[0] }}
Priority: {{ explode(" ", $record->content)[1] }}
Port: {{ explode(" ", $record->content)[2] }}
Ziel: {{ explode(" ", $record->content)[3] }}
@endif
</td>
<td>{{ $record->ttl }}</td>
<td align="center"><span class="edit-btn" data-edit="record" data-url="{{ Route("records.data.json", ["id" => $record->id]) }}"><i class="far fa-edit"></i></span></td>
<td align="center">
<form action="{{ Route('records.delete') }}" method="post">
<input type="hidden" name="type" value="{{ $record->type }}">
<input type="hidden" name="name" value="{{ $record->name }}">
<input type="hidden" name="domain_name" value="{{ $domain->name }}">
<input type="hidden" name="domain_id" value="{{ $domain->id }}">
{{ csrf_field() }}
<span class="delete-btn" aria-label="{{ __("views.delete_record") }}" data-microtip-position="top" data-name="{{ $record->name }}" data-delete="record" role="tooltip"><i class="fas fa-trash-alt"></i></span>
</form>
</td>
</tr>
@endif
@endforeach
</tbody>
</table>
</div>
@endif
@if(!empty($update[$domain->id]))
<div class="panel-block">
<p>{{ $update[$domain->id]["text"] }}</p>
</div>
<div class="panel-block">
<a class="button btn-refresh-records is-link" @if($update[$domain->id]["diff"]->i < env('RECORD_FETCH_LIMIT_MINUTES') and $update[$domain->id]["diff"]->h == 0) disabled aria-label="{{ __("views.update_disabled_text", ["minutes" => env('RECORD_FETCH_LIMIT_MINUTES')]) }}!" data-microtip-position="right" role="tooltip" @else href="{{ Route("fetch-records.get", ['domain' => $domain->name, 'id' => $domain->id]) }}" @endif><i class="fas fa-sync"></i>&nbsp;{{ __("views.update_records") }}</a>
</div>
@else
<div class="panel-block">
<p>{{ __("views.last_update") }}: {{ __("views.never") }}</p>
</div>
<div class="panel-block">
<a class="button btn-refresh-records is-link" href="{{ Route("fetch-records.get", ['domain' => $domain->name, 'id' => $domain->id]) }}"><i class="fas fa-sync"></i>&nbsp;{{ __("views.update_records") }}</a>
</div>
@endif
</nav>
@endforeach
@endif
@endsection

View File

@@ -0,0 +1,36 @@
@if(Session::has('Success_Message'))
<script>
var message = "{{ Session::get('Success_Message') }}";
swal({
title: "{{ __('views.success') }}",
html: message,
type: 'success',
confirmButtonText: "{{ __('views.close') }}"
})
</script>
@elseif(Session::has('Error_Message'))
<script>
var message = "{{ Session::get('Error_Message') }}";
swal({
title: "{{ __('views.error') }}",
html: message,
type: 'error',
confirmButtonText: "{{ __("views.close") }}"
})
</script>
@endif
@if(count($errors) > 0)
<article class="message is-danger" id="error-container">
<div class="message-header">
<p>{{ __("views.error") }}</p>
<button class="delete" aria-label="delete"></button>
</div>
<div class="message-body">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</article>
@endif

View File

@@ -0,0 +1,45 @@
<!doctype html>
<html lang="{{ \App\Http\Controllers\LanguageController::getActiveLanguage() }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ env('APP_NAME') }} | @yield('title')</title>
<script src="https://cdn.jsdelivr.net/sweetalert2/1.3.2/sweetalert2.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js"></script>
<link rel="stylesheet" href="/css/app.css">
</head>
<body class="page-{{ strtolower(str_replace(" ", "_", $title)) }}">
<section id="section-navbar">
<div class="container">@include('layout.nav')</div>
</section>
<section class="section">
<div class="container">
@include('layout.alerts')
<h1 class="title">@yield('title')</h1>
@yield('content')
</div>
</section>
<script defer src="{{ URL::asset("js/libs/fontawesome-5.14.0.js") }}"></script>
<script src="{{ URL::asset("js/libs/moment.min.js") }}"></script>
<script src="{{ URL::asset("js/libs/jquery-3.5.1.min.js") }}"></script>
<script src="{{ URL::asset("js/libs/jquery.dataTables-1.10.23.min.js") }}"></script>
<script src="{{ URL::asset("js/libs/dataTables.bulma-1.10.23.min.js") }}"></script>
<script>
let swalDeleteRecordTitle = "{{ __("views.delete_record") }}";
let swalDeleteDomainTitle = "{{ __("views.delete_domain") }}"
let swalDeleteRecordText1 = "{{ __("views.swal_delete_record_sure_1") }}";
let swalDeleteRecordText2 = "{{ __("views.swal_delete_record_sure_2") }}";
let swalDeleteRecordYes = "{{ __("views.swal_delete_record_yes") }}";
let swalDeleteDomainText1 = "{{ __("views.swal_delete_domain_sure_1") }}";
let swalDeleteDomainText2 = "{{ __("views.swal_delete_domain_sure_2") }}";
let swalDeleteDomainYes = "{{ __("views.swal_delete_domain_yes") }}";
let cancel = "{{ __("views.cancel") }}";
</script>
<script src="{{ URL::asset("js/main.js") }}"></script>
</body>
</html>

View File

@@ -0,0 +1,46 @@
<nav class="navbar is-link is-fixed-top" role="navigation" aria-label="main navigation">
<a role="button" id="mainBurger" class="navbar-burger" aria-label="menu" aria-expanded="false" data-target="mainNavbar">
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
<div id="mainNavbar" class="navbar-menu">
@if(Auth::check())
<div class="navbar-start">
<a href="/" class="navbar-item">Home</a>
<a href="{{ Route('records.add') }}" class="navbar-item"><i class="far fa-plus-square"></i>&nbsp;{{ __("views.add_record") }}</a>
<a href="{{ Route('domains.get') }}" class="navbar-item"><i class="fas fa-globe"></i>&nbsp;{{ __("views.domains") }}</a>
</div>
@endif
<div class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
{{ __("views.language") }}
</a>
<div class="navbar-dropdown">
<a href="{{ Route("language.set", ["code" => "de"]) }}" class="navbar-item {{ \App\Http\Controllers\LanguageController::getActiveLanguage() == 'de' ? 'lang-active' : '' }}"><span class="flag flag-xs" lang="de"></span>&nbsp;{{ __("views.german") }}</a>
<a href="{{ Route("language.set", ["code" => "en"]) }}" class="navbar-item {{ \App\Http\Controllers\LanguageController::getActiveLanguage() == 'en' ? 'lang-active' : '' }}"><span class="flag flag-xs" lang="en"></span>&nbsp;{{ __("views.english")}}</a>
</div>
</div>
@if(Auth::check())
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">
<i class="fas fa-user"></i>&nbsp;{{ Auth::user()->username }}
</a>
<div class="navbar-dropdown is-right">
<a href="{{ Route("auth-password-change.get") }}" class="navbar-item"><i class="fas fa-key"></i>&nbsp;{{ __("views.change_password") }}</a>
<hr class="navbar-divider">
<a href="{{ Route("auth-logout.get") }}" class="navbar-item"><i class="fas fa-sign-out-alt"></i>&nbsp;{{ __("views.logout") }}</a>
</div>
</div>
@else
<a href="{{ Route('auth-login.get') }}" class="navbar-item">Login</a>
@endif
</div>
</div>
</nav>

View File

@@ -0,0 +1,50 @@
<div class="modal" id="recordEditModal">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">{{ __("views.edit_record") }}</p>
<button class="delete modal-closer" aria-label="close"></button>
</header>
<section class="modal-card-body">
<form action="{{ Route("records.edit") }}" method="post">
<input type="hidden" name="record_id" id="edit_record_id">
<div class="field">
<label for="edit_name">{{ __("views.name") }}</label>
<div class="control">
<input type="text" name="name" id="edit_name" class="input" disabled>
</div>
</div>
<div class="field">
<label for="edit_type">{{ __("views.type") }}</label>
<div class="control">
<input type="text" name="type" id="edit_type" class="input" disabled>
</div>
</div>
<div class="field">
<label for="edit_content">{{ __("views.content") }}</label>
<div class="control">
<input type="text" name="content" id="edit_content" class="input">
</div>
</div>
<div class="field">
<label for="edit_ttl">{{ __("views.ttl") }}</label>
<div class="control">
<input type="number" name="ttl" id="edit_ttl" class="input">
</div>
</div>
{{ csrf_field() }}
<div class="field">
<div class="control">
<button class="button is-link">{{ __("views.save") }}</button>
</div>
</div>
</form>
</section>
</div>
</div>

View File

@@ -0,0 +1,66 @@
@extends('layout.main')
@section('title', $title)
@section('content')
<form action="{{ Route("records.add") }}" method="post">
<div class="field">
<label for="domain" class="label">{{ __("views.domain") }}</label>
<div class="control">
<div class="select">
<select name="domain" id="domain">
@foreach($domains as $domain)
<option value="{{ $domain->id }}">{{ $domain->name }}</option>
@endforeach
</select>
</div>
</div>
</div>
<div class="field">
<label for="type" class="label">{{ __("views.type") }}</label>
<div class="control">
<div class="select">
<select name="type" id="type">
<option value="a">A</option>
<option value="aaaa">AAAA</option>
<option value="cname">CNAME</option>
<option value="mx">MX</option>
<option value="txt">TXT</option>
<option value="tlsa">TLSA</option>
<option value="caa">CAA</option>
</select>
</div>
</div>
</div>
<div class="field">
<label for="name" class="label">{{ __("views.name") }}</label>
<div class="control">
<input type="text" name="name" id="name" class="input" placeholder="{{ __('views.name') }}">
</div>
</div>
<div class="field">
<label for="content" class="label">{{ __("views.content") }}</label>
<div class="control">
<input type="text" name="content" id="content" class="input" placeholder="{{ __('views.content') }}" required>
</div>
</div>
<div class="field">
<label for="ttl" class="label">{{ __("views.ttl") }}</label>
<div class="control">
<input type="number" value="20" name="ttl" id="ttl" class="input" placeholder="{{ __('views.ttl') }}" required>
</div>
</div>
{{ csrf_field() }}
<div class="field">
<div class="control">
<button class="button is-link">{{ __("views.save") }}</button>
</div>
</div>
</form>
@endsection