diff --git a/resources/views/admin/blacklist/edit.blade.php b/resources/views/admin/blacklist/edit.blade.php new file mode 100644 index 000000000..577fa6cba --- /dev/null +++ b/resources/views/admin/blacklist/edit.blade.php @@ -0,0 +1,203 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Binary Black/Whitelist Edit' }} +

+ + Back to List + +
+
+ + +
+ @csrf + + + + @if($error) +
+
+ +

{{ $error }}

+
+
+ @endif + + +
+ +
+
+ +
+ +
+

+ The full name of a valid newsgroup. (Wildcard in the format 'alt.binaries.*') +

+
+ + +
+ +
+
+ +
+ +
+

+ The regex to be applied. (Note: Beginning and Ending / are already included) +

+
+ + +
+ +
+
+ +
+ +
+

+ A description for this regex +

+
+ + +
+ +
+ @foreach($msgcol_ids as $i => $id) +
+ msgcol ?? 1) == $id ? 'checked' : '' }}> + +
+ @endforeach +
+

+ Which field in the message to apply the black/white list to. +

+
+ + +
+ +
+ @foreach($status_ids as $i => $id) +
+ status ?? 1) == $id ? 'checked' : '' }}> + +
+ @endforeach +
+

+ Only active regexes are applied during the release process. +

+
+ + +
+ +
+ @foreach($optype_ids as $i => $id) +
+ optype ?? 1) == $id ? 'checked' : '' }}> + +
+ @endforeach +
+

+ Black will exclude all messages for a group which match this regex. White will include only those which match. +

+
+
+ + +
+
+ + Cancel + + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/blacklist/index.blade.php b/resources/views/admin/blacklist/index.blade.php new file mode 100644 index 000000000..e5db8aeac --- /dev/null +++ b/resources/views/admin/blacklist/index.blade.php @@ -0,0 +1,202 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Binary Black/White List' }} +

+ + Add New Blacklist + +
+
+ + +
+
+
+ +
+
+

+ Binaries can be prevented from being added to the index if they match a regex in the blacklist. + They can also be included only if they match a regex (whitelist). + Click Edit or on the blacklist to enable/disable. +

+
+
+
+ + +
+ + + @if(count($binlist) > 0) +
+ + + + + + + + + + + + + + + + @foreach($binlist as $bin) + + + + + + + + + + + + @endforeach + +
IDGroupDescriptionTypeFieldStatusRegexLast ActivityActions
{{ $bin->id }} + + {{ str_replace('alt.binaries', 'a.b', $bin->groupname) }} + + + + {{ $bin->description }} + + + @if($bin->optype == 1) + Black + @else + White + @endif + + @if($bin->msgcol == 1) + Subject + @elseif($bin->msgcol == 2) + Poster + @else + MessageID + @endif + + @if($bin->status == 1) + Active + @else + Disabled + @endif + + + + @if($bin->last_activity) + + {{ $bin->last_activity }} + + @else + Never + @endif + +
+ + + + +
+
+
+ + +
+
+ Total entries: {{ count($binlist) }} + + Add New Blacklist + +
+
+ @else +
+ +

No blacklist entries found

+

Get started by adding your first blacklist entry.

+ + Add New Blacklist + +
+ @endif +
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/categories/edit.blade.php b/resources/views/admin/categories/edit.blade.php new file mode 100644 index 000000000..ac5677218 --- /dev/null +++ b/resources/views/admin/categories/edit.blade.php @@ -0,0 +1,174 @@ +@extends('layouts.admin') + +@section('title', $title ?? 'Category Edit') + +@section('content') +
+
+
+

{{ $title }}

+ + Back to Categories + +
+
+ + @if(session('error')) +
+ {{ session('error') }} +
+ @endif + +
+ @if($category) +
+ @csrf + + +
+
+ +
+
+

{{ $category->title }}

+
+
+ +
+
+ +
+
+
+ + +
+ Parent category cannot be changed from this interface +
+
+ +
+
+ +
+
+
+ + +
+ Brief explanation of what belongs in this category +
+
+ +
+
+ +
+
+
+ + +
+ Minimum file size for releases in this category (in bytes). Set to 0 to disable. +
+
+ +
+
+ +
+
+
+ + +
+ Maximum file size for releases in this category (in bytes). Set to 0 to disable. +
+
+ +
+
+ +
+
+ @foreach($status_ids as $index => $statusId) +
+ status ?? 0) == $statusId ? 'checked' : '' }}> + +
+ @endforeach +
+ Inactive categories won't appear in menus but can still be used for release matching +
+
+
+ +
+
+ +
+
+
+ disablepreview ?? 0) == 0 ? 'checked' : '' }}> + +
+
+ disablepreview ?? 0) == 1 ? 'checked' : '' }}> + +
+
+ Disabling prevents ffmpeg from generating previews for releases in this category +
+
+
+ + +
+ @else +
+ No category selected. Please select a category to edit. +
+ + @endif +
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/categories/index.blade.php b/resources/views/admin/categories/index.blade.php new file mode 100644 index 000000000..3edfd8604 --- /dev/null +++ b/resources/views/admin/categories/index.blade.php @@ -0,0 +1,224 @@ +@extends('layouts.admin') + +@section('title', $title ?? 'Category List') + +@section('content') +
+
+
+

{{ $title }}

+ + Add New Category + +
+
+ +
+
+ + Make a category inactive to remove it from the menu. This does not prevent binaries being matched into an + appropriate category. Disable preview prevents ffmpeg being used for releases in the category. +
+ +
+ + + + + + + + + + + + + + + @foreach($categorylist as $category) + + + + + + + + + + + @endforeach + +
+
+ ID + +
+
+
+ Title + +
+
ParentMin SizeMax SizeStatusPreviewActions
{{ $category->id }} + + {{ $category->title }} + + + @if($category->parent) + + {{ $category->parent->title }} + + @else + N/A + @endif + + @if($category->minsizetoformrelease != 0) +
+ + {{ \Blacklight\utility\Utility::bytesToSizeString($category->minsizetoformrelease) }} +
+ @else + + @endif +
+ @if($category->maxsizetoformrelease != 0) +
+ + {{ \Blacklight\utility\Utility::bytesToSizeString($category->maxsizetoformrelease) }} +
+ @else + + @endif +
+ + {{ $category->status == 1 ? 'Active' : 'Inactive' }} + + + + {{ $category->disablepreview == 1 ? 'Disabled' : 'Enabled' }} + + +
+ + + + +
+
+
+ + @if(count($categorylist) == 0) +
+ No categories found. +
+ @endif +
+ + +
+ + + + +@push('scripts') + +@endpush + +@push('styles') + +@endpush +@endsection + diff --git a/resources/views/admin/content/add.blade.php b/resources/views/admin/content/add.blade.php new file mode 100644 index 000000000..c9f5499ee --- /dev/null +++ b/resources/views/admin/content/add.blade.php @@ -0,0 +1,250 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + +
+ @csrf + + @if(!empty($content['id'])) + + @endif + +
+ +
+ + +
+ + +
+ + +

Internal URL (e.g., /about) or external URL (e.g., https://example.com)

+
+ + +
+ + +

Use the rich text editor to format your content

+
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

Lower numbers appear first

+
+
+ + +
+ + +

SEO meta description

+
+ + +
+ + +

Comma-separated keywords for SEO

+
+ + +
+ + + Cancel + +
+
+
+
+
+ +@push('scripts') + + + +@endpush +@endsection + diff --git a/resources/views/admin/content/index.blade.php b/resources/views/admin/content/index.blade.php new file mode 100644 index 000000000..81d4b4d4f --- /dev/null +++ b/resources/views/admin/content/index.blade.php @@ -0,0 +1,120 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + Add New Content + +
+
+ + + @if(count($contentlist) > 0) +
+ + + + + + + + + + + + + + + @foreach($contentlist as $item) + + + + + + + + + + + @endforeach + +
IDTitleURLTypeRoleStatusOrdinalActions
{{ $item->id }} +
{{ $item->title }}
+
+ @if(!empty($item->url)) + + {{ Str::limit($item->url, 30) }} + + @else + N/A + @endif + + @if($item->contenttype == 1) + + Useful Link + + @elseif($item->contenttype == 2) + + Article + + @elseif($item->contenttype == 3) + + Homepage + + @else + N/A + @endif + + @if($item->role == 1) + Everyone + @elseif($item->role == 2) + Logged in Users + @elseif($item->role == 3) + Admins + @else + N/A + @endif + + @if($item->status == 1) + + Enabled + + @else + + Disabled + + @endif + {{ $item->ordinal ?? 0 }} + +
+
+ @else +
+ +

No content found

+

Create your first content to get started.

+
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/games/edit.blade.php b/resources/views/admin/games/edit.blade.php new file mode 100644 index 000000000..0edb360cf --- /dev/null +++ b/resources/views/admin/games/edit.blade.php @@ -0,0 +1,215 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+ @csrf + + + +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + @if(!empty($game['cover']) && $game['cover'] == 1) +
+ Game Cover +
+ @endif + +

+ Upload a new cover image (JPG format) +

+
+ + +
+ + @if(!empty($game['cover']) && $game['cover'] == 1) + + Cover Available + + @else + + No Cover + + @endif +
+
+
+ + +
+ + + Back to Game List + +
+
+
+
+@endsection + diff --git a/resources/views/admin/games/index.blade.php b/resources/views/admin/games/index.blade.php new file mode 100644 index 000000000..e689c2365 --- /dev/null +++ b/resources/views/admin/games/index.blade.php @@ -0,0 +1,145 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+
+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+
+
+
+
+ +
+ +
+ + @if(!empty($lastSearch)) + + Clear + + @endif +
+
+
+ + + @if(!empty($gamelist) && count($gamelist) > 0) +
+ + + + + + + + + + + + + + + @foreach($gamelist as $game) + + + + + + + + + + + @endforeach + +
IDTitlePublisherGenreESRBRelease DateCoverActions
+ {{ $game['id'] ?? 'N/A' }} + +
+ {{ $game['title'] ?? 'N/A' }} +
+
+ {{ $game['publisher'] ?? 'N/A' }} + + {{ $game['genre'] ?? 'N/A' }} + + {{ $game['esrb'] ?? 'N/A' }} + + @if(!empty($game['releasedate'])) + {{ date('Y-m-d', $game['releasedate']) }} + @else + N/A + @endif + + @if(!empty($game['cover']) && $game['cover'] == 1) + + Yes + + @else + + No + + @endif + + + Edit + +
+
+ @else +
+ +

+ @if(!empty($lastSearch)) + No games found matching "{{ $lastSearch }}". + @else + No games found in the database. + @endif +

+
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/groups/bulk.blade.php b/resources/views/admin/groups/bulk.blade.php new file mode 100644 index 000000000..b6e182a6b --- /dev/null +++ b/resources/views/admin/groups/bulk.blade.php @@ -0,0 +1,209 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Bulk Add Newsgroups' }} +

+ + View All Groups + +
+
+ +
+ @if(!empty($groupmsglist)) + +
+
+ +

+ The following groups have been processed. You can now view them in the group list. +

+
+
+ + +
+ + + + + + + + + @foreach($groupmsglist as $group) + + + + + @endforeach + +
GroupStatus
+
+ + {{ $group['group'] }} +
+
+ @if(strpos($group['msg'], 'Error') !== false) + + {{ $group['msg'] }} + + @elseif(strpos($group['msg'], 'exists') !== false) + + {{ $group['msg'] }} + + @else + + {{ $group['msg'] }} + + @endif +
+
+ @else + +
+
+ +

+ Enter a regular expression to match multiple groups for bulk addition to the system. +

+
+
+ + +
+ @csrf + + +
+ +
+
+ +
+ +
+

+ A regular expression to match against group names. Separate multiple patterns with the pipe symbol (|). +
Example: alt.binaries.cd.image.linux|alt.binaries.warez.linux +

+
+ + +
+ +
+
+ + +
+
+ + +
+
+

+ Inactive groups will not have headers downloaded for them. +

+
+ + +
+ +
+
+ + +
+
+ + +
+
+

+ Inactive groups will not have backfill headers downloaded for them. +

+
+
+ @endif +
+ + +
+
+ + Back to Groups + + @if(empty($groupmsglist)) + + @else + + Add More Groups + + @endif +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/groups/edit.blade.php b/resources/views/admin/groups/edit.blade.php new file mode 100644 index 000000000..ae9a31a2d --- /dev/null +++ b/resources/views/admin/groups/edit.blade.php @@ -0,0 +1,266 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Group Edit' }} +

+ + Back to Groups + +
+
+ + + @if(isset($error) && $error != '') +
+
+ +

{{ $error }}

+
+
+ @endif + + +
+ @csrf + + + +
+ +
+
+ +
+ +
+

+ Changing the name to an invalid group will break things. +

+
+ + +
+ +
+
+ +
+ +
+

+ Brief explanation of this group's content +

+
+ + +
+ +
+
+ +
+ +
+

+ Number of days to attempt to backfill this group. Adjust as necessary. +

+
+ + +
+ +
+
+ +
+ +
+

+ The minimum number of files to make a release. If left blank, will use the site wide setting. +

+
+ + +
+ +
+
+ +
+ +
+

+ The minimum total size in bytes to make a release. If left blank, will use the site wide setting. +

+
+ + +
+ +
+
+ +
+ +
+

+ The oldest record number for the group. +

+
+ + +
+ +
+
+ +
+ +
+

+ The newest record number for the group. +

+
+ + +
+ +
+
+ + +
+
+ + +
+
+

+ Inactive groups will not have headers downloaded for them. +

+
+ + +
+ +
+
+ + +
+
+ + +
+
+

+ If set to No, backfill will ignore this group. This works even if the above setting is No. +

+
+
+ + +
+
+ + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/groups/index.blade.php b/resources/views/admin/groups/index.blade.php new file mode 100644 index 000000000..4573a296e --- /dev/null +++ b/resources/views/admin/groups/index.blade.php @@ -0,0 +1,474 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+ +
+ + +
+
+ +

+ Below is a list of all usenet groups available to be indexed. Click 'Activate' to start indexing a group. + Backfill works independently of active. +

+
+
+ + @if(isset($msg) && $msg != '') +
+

{{ $msg }}

+
+ @endif + + @if($grouplist && $grouplist->count() > 0) + +
+
+ +
+
+
+
+
+ +
+ +
+ +
+
+
+ + +
+ {{ $grouplist->onEachSide(5)->links() }} +
+ + +
+
+ + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + @foreach($grouplist as $group) + + + + + + + + + + + + + + @endforeach + +
GroupFirst PostLast PostLast UpdatedStatusBackfillReleasesMin FilesMin SizeBackfill DaysActions
+ + {{ str_replace('alt.binaries', 'a.b', $group->name) }} + + @if($group->description) +
{{ $group->description }}
+ @endif +
+
+ {{ $group->first_record_postdate }} + {{ \Carbon\Carbon::parse($group->first_record_postdate)->diffForHumans() }} +
+
{{ $group->last_record_postdate }} + {{ \Carbon\Carbon::parse($group->last_updated)->diffForHumans() }} + + @if($group->active == 1) + + @else + + @endif + + @if($group->backfill == 1) + + @else + + @endif + + + {{ $group->num_releases ?? 0 }} + + + @if(empty($group->minfilestoformrelease)) + n/a + @else + + {{ $group->minfilestoformrelease }} + + @endif + + @if(empty($group->minsizetoformrelease)) + n/a + @else + + {{ human_filesize($group->minsizetoformrelease) }} + + @endif + + + {{ $group->backfill_target }} + + +
+ + + + + + +
+
+
+ + +
+
+ + Showing {{ $grouplist->count() }} of {{ $grouplist->total() }} groups + +
+ {{ $grouplist->onEachSide(5)->links() }} +
+
+
+ @else +
+ +

No groups available

+

No groups have been added yet.

+ + Add Groups + +
+ @endif +
+
+ + + + + + + +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/movies/add.blade.php b/resources/views/admin/movies/add.blade.php new file mode 100644 index 000000000..0b8c5da6e --- /dev/null +++ b/resources/views/admin/movies/add.blade.php @@ -0,0 +1,104 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+
+ +
+

+ Enter an IMDB ID (numeric only, without the 'tt' prefix) to add movie information to the database. +

+

+ Example: For https://www.imdb.com/title/tt0111161/, enter 0111161 +

+
+
+
+ + +
+
+
+ +
+
+
+ tt +
+ +
+ +
+

+ Enter only the numeric part of the IMDB ID (without 'tt' prefix) +

+
+ +
+

+ How it works: +

+
    +
  • The system will fetch movie information from TMDB (The Movie Database)
  • +
  • Movie details, posters, and backdrops will be automatically downloaded
  • +
  • Associated releases will be linked to the movie information
  • +
+
+ + +
+
+
+
+@endsection + diff --git a/resources/views/admin/movies/edit.blade.php b/resources/views/admin/movies/edit.blade.php new file mode 100644 index 000000000..5c1434291 --- /dev/null +++ b/resources/views/admin/movies/edit.blade.php @@ -0,0 +1,392 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+ @csrf + + + +
+ +
+ +
+ +
+ @php + $imdbid = $movie['imdbid'] ?? $movie->imdbid ?? ''; + $coverPath = public_path('covers/movies/' . $imdbid . '-cover.jpg'); + $hasCover = file_exists($coverPath); + @endphp + @if($hasCover) + Movie Cover + @else +
+ +

No cover image

+
+ @endif + +

Upload a new cover image (JPG/PNG)

+
+
+ + +
+ +
+ @php + $backdropPath = public_path('covers/movies/' . $imdbid . '-backdrop.jpg'); + $hasBackdrop = file_exists($backdropPath); + @endphp + @if($hasBackdrop) + Movie Backdrop + @else +
+ +

No backdrop image

+
+ @endif + +

Upload a new backdrop image (JPG/PNG)

+
+
+
+ + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + + Cancel + + + Update from TMDB + +
+
+
+
+
+
+@endsection +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + Add Movie + +
+
+ + +
+
+
+
+
+ +
+ +
+ + @if(!empty($lastSearch)) + + Clear + + @endif +
+
+
+ + + @if(!empty($movielist) && count($movielist) > 0) +
+ + + + + + + + + + + + + + + @foreach($movielist as $movie) + + + + + + + + + + + @endforeach + +
IMDB IDTitleYearRatingGenreCoverBackdropActions
+ + {{ $movie->imdbid }} + + +
{{ $movie->title ?? 'N/A' }}
+
+ {{ $movie->year ?? 'N/A' }} + + {{ $movie->rating ?? 'N/A' }} + + {{ \Illuminate\Support\Str::limit($movie->genre ?? 'N/A', 30) }} + + @if($movie->cover == 1) + + Yes + + @else + + No + + @endif + + @if($movie->backdrop == 1) + + Yes + + @else + + No + + @endif + + + Edit + + + Update + +
+
+ @else +
+ +

+ @if(!empty($lastSearch)) + No movies found matching "{{ $lastSearch }}". + @else + No movies found in the database. + @endif +

+ + Add Your First Movie + +
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/movies/index.blade.php b/resources/views/admin/movies/index.blade.php new file mode 100644 index 000000000..f54e68e60 --- /dev/null +++ b/resources/views/admin/movies/index.blade.php @@ -0,0 +1,158 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + Add Movie + +
+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+
+
+
+
+ +
+ +
+ + @if(!empty($lastSearch)) + + Clear + + @endif +
+
+
+ + + @if(!empty($movielist) && count($movielist) > 0) +
+ + + + + + + + + + + + + + + @foreach($movielist as $movie) + + + + + + + + + + + @endforeach + +
IMDB IDTitleYearRatingGenreCoverBackdropActions
+ + {{ $movie->imdbid }} + + +
{{ $movie->title ?? 'N/A' }}
+
+ {{ $movie->year ?? 'N/A' }} + + {{ $movie->rating ?? 'N/A' }} + + {{ \Illuminate\Support\Str::limit($movie->genre ?? 'N/A', 30) }} + + @if($movie->cover == 1) + + Yes + + @else + + No + + @endif + + @if($movie->backdrop == 1) + + Yes + + @else + + No + + @endif + + + Edit + + + Update + +
+
+ @else +
+ +

+ @if(!empty($lastSearch)) + No movies found matching "{{ $lastSearch }}". + @else + No movies found in the database. + @endif +

+ + Add Your First Movie + +
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/music/edit.blade.php b/resources/views/admin/music/edit.blade.php new file mode 100644 index 000000000..3fa9cb80e --- /dev/null +++ b/resources/views/admin/music/edit.blade.php @@ -0,0 +1,236 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+ @csrf + + + +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + @if(!empty($mus['cover']) && $mus['cover'] == 1) +
+ Album Cover +
+ @endif + +

+ Upload a new cover image (JPG format) +

+
+ + +
+ + @if(!empty($mus['cover']) && $mus['cover'] == 1) + + Cover Available + + @else + + No Cover + + @endif +
+
+
+ + +
+ + + Back to Music List + +
+
+
+
+@endsection + diff --git a/resources/views/admin/music/index.blade.php b/resources/views/admin/music/index.blade.php new file mode 100644 index 000000000..35fb5d773 --- /dev/null +++ b/resources/views/admin/music/index.blade.php @@ -0,0 +1,145 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+
+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+
+
+
+
+ +
+ +
+ + @if(!empty($lastSearch)) + + Clear + + @endif +
+
+
+ + + @if(!empty($musicList) && count($musicList) > 0) +
+ + + + + + + + + + + + + + + + @foreach($musicList as $music) + + + + + + + + + + + + @endforeach + +
IDTitleArtistPublisherYearGenreTracksCoverActions
+ {{ $music['id'] ?? 'N/A' }} + +
+ {{ $music['title'] ?? 'N/A' }} +
+
+ {{ $music['artist'] ?? 'N/A' }} + + {{ $music['publisher'] ?? 'N/A' }} + + {{ $music['year'] ?? 'N/A' }} + + {{ \Illuminate\Support\Str::limit($music['genre'] ?? 'N/A', 30) }} + + {{ $music['tracks'] ?? 'N/A' }} + + @if(!empty($music['cover']) && $music['cover'] == 1) + + Yes + + @else + + No + + @endif + + + Edit + +
+
+ @else +
+ +

+ @if(!empty($lastSearch)) + No music found matching "{{ $lastSearch }}". + @else + No music found in the database. + @endif +

+
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/regexes/category-edit.blade.php b/resources/views/admin/regexes/category-edit.blade.php new file mode 100644 index 000000000..34deecd55 --- /dev/null +++ b/resources/views/admin/regexes/category-edit.blade.php @@ -0,0 +1,207 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Category Regex Edit' }} +

+ + Back to List + +
+
+ + +
+ @csrf + + + + @if($error) +
+
+ +

{{ $error }}

+
+
+ @endif + + +
+ +
+
+ +
+ +
+

+ Regex to match against a group or multiple groups. Delimiters are already added, and PCRE_CASELESS is added after for case insensitivity.
+ Example of matching a single group: alt\.binaries\.example
+ Example of matching multiple groups: alt\.binaries.* +

+
+ + +
+ +
+
+ +
+ +
+

+ Regex to use when categorizing releases.
+ The regex delimiters are not added, you MUST add them. See this page.
+ To make the regex case insensitive, add i after the last delimiter. +

+
+ + +
+ +
+
+ +
+ +
+

+ Description for this regex. You can include an example usenet subject this regex would match on. +

+
+ + +
+ +
+
+ +
+ +
+

+ The order to run this regex in. Must be a number, 0 or higher.
+ If multiple regex have the same ordinal, MySQL will randomly sort them. +

+
+ + +
+ +
+ @foreach($status_ids as $k => $id) +
+ status ?? 1) == $id ? 'checked' : '' }}> + +
+ @endforeach +
+

+ Only active regex are used during the collection matching process. +

+
+ + +
+ +
+
+ +
+ +
+

+ Select a category which releases matched to this regex will go into. +

+
+
+ + +
+
+ + Cancel + + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + + diff --git a/resources/views/admin/regexes/category-list.blade.php b/resources/views/admin/regexes/category-list.blade.php new file mode 100644 index 000000000..6877c44c1 --- /dev/null +++ b/resources/views/admin/regexes/category-list.blade.php @@ -0,0 +1,235 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Category Regex List' }} +

+ + Add New Regex + +
+
+ + +
+
+
+ +
+
+

+ This page lists regular expressions used for categorizing releases.
+ You can recategorize all releases by running misc/update/update_releases 6 true +

+
+
+
+ + +
+ + +
+
+ @csrf + +
+
+
+ +
+ +
+ +
+
+
+ + + @if($regex && count($regex) > 0) + + @if(method_exists($regex, 'links')) +
+ {{ $regex->onEachSide(5)->links() }} +
+ @endif + +
+ + + + + + + + + + + + + + + @foreach($regex as $row) + + + + + + + + + + + @endforeach + +
IDGroupDescriptionRegexOrdinalStatusCategoryActions
{{ $row->id }} + {{ $row->group_regex }} + + + {{ $row->description }} + + +
+ + {{ htmlspecialchars($row->regex) }} + +
+
{{ $row->ordinal }} + @if($row->status == 1) + + Active + + @else + + Disabled + + @endif + + + {{ $row->categories_id }} + + +
+ + + + +
+
+
+ + + @if(method_exists($regex, 'links')) +
+ {{ $regex->onEachSide(5)->links() }} +
+ @endif + @else +
+ +

No regex patterns found

+

Try a different search term or add a new regex.

+ + Add New Regex + +
+ @endif + + +
+
+ + @if($regex && method_exists($regex, 'total')) + Total entries: {{ $regex->total() }} + @elseif($regex) + Total entries: {{ count($regex) }} + @else + No entries + @endif + + + Add New Regex + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/regexes/collection-edit.blade.php b/resources/views/admin/regexes/collection-edit.blade.php new file mode 100644 index 000000000..50f4b9194 --- /dev/null +++ b/resources/views/admin/regexes/collection-edit.blade.php @@ -0,0 +1,181 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Collection Regex Edit' }} +

+ + Back to List + +
+
+ + +
+ @csrf + + + + @if($error) +
+
+ +

{{ $error }}

+
+
+ @endif + + +
+ +
+
+ +
+ +
+

+ Regex to match against a group or multiple groups. Delimiters are already added, and PCRE_CASELESS is added after for case insensitivity.
+ Example of matching a single group: alt\.binaries\.example
+ Example of matching multiple groups: alt\.binaries.* +

+
+ + +
+ +
+
+ +
+ +
+

+ Regex to use when grouping binaries into collections.
+ The regex delimiters are not added, you MUST add them. See this page.
+ To make the regex case insensitive, add i after the last delimiter. +

+
+ + +
+ +
+
+ +
+ +
+

+ Description for this regex. You can include an example usenet subject this regex would match on. +

+
+ + +
+ +
+
+ +
+ +
+

+ The order to run this regex in. Must be a number, 0 or higher.
+ If multiple regex have the same ordinal, MySQL will randomly sort them. +

+
+ + +
+ +
+ @foreach($status_ids as $k => $id) +
+ status ?? 1) == $id ? 'checked' : '' }}> + +
+ @endforeach +
+

+ Only active regex are used during the collection matching process. +

+
+
+ + +
+
+ + Cancel + + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/regexes/collection-list.blade.php b/resources/views/admin/regexes/collection-list.blade.php new file mode 100644 index 000000000..658bbb36c --- /dev/null +++ b/resources/views/admin/regexes/collection-list.blade.php @@ -0,0 +1,234 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Collection Regex List' }} +

+ + Add New Regex + +
+
+ + +
+
+
+ +
+
+

+ This page lists regular expressions used for grouping binaries into collections.
+ You can test your regex patterns using the test feature. +

+
+
+
+ + +
+ + +
+
+ @csrf + +
+
+
+ +
+ +
+ +
+
+
+ + + @if($regex && count($regex) > 0) + + @if(method_exists($regex, 'links')) +
+ {{ $regex->onEachSide(5)->links() }} +
+ @endif + +
+ + + + + + + + + + + + + + @foreach($regex as $row) + + + + + + + + + + @endforeach + +
IDGroupDescriptionRegexOrdinalStatusActions
{{ $row->id }} + {{ $row->group_regex }} + + + {{ $row->description }} + + +
+ + {{ htmlspecialchars($row->regex) }} + +
+
{{ $row->ordinal }} + @if($row->status == 1) + + Active + + @else + + Disabled + + @endif + +
+ + + + +
+
+
+ + + @if(method_exists($regex, 'links')) +
+ {{ $regex->onEachSide(5)->links() }} +
+ @endif + @else +
+ +

No regex patterns found

+

Try a different search term or add a new regex.

+ + Add New Regex + +
+ @endif + + +
+
+ + @if($regex && method_exists($regex, 'total')) + Total entries: {{ $regex->total() }} + @elseif($regex) + Total entries: {{ count($regex) }} + @else + No entries + @endif + + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/regexes/collection-test.blade.php b/resources/views/admin/regexes/collection-test.blade.php new file mode 100644 index 000000000..81dc1919f --- /dev/null +++ b/resources/views/admin/regexes/collection-test.blade.php @@ -0,0 +1,170 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Collection Regex Test' }} +

+ + Back to List + +
+
+ + +
+
+ +

+ Test your collection regex patterns against actual binary data from your database. +

+
+
+ + +
+
+ +
+ + +

+ Enter a newsgroup name to test against +

+
+ + +
+ + +

+ Number of binaries to test (max 1000) +

+
+
+ + +
+ + +

+ Enter the regex pattern to test. Include delimiters and flags. +

+
+ + + +
+ + + @if($data) +
+

+ Test Results: +

+ + @if(count($data) > 0) +
+ + + + + + + + + + @foreach($data as $row) + + + + + + @endforeach + +
Binary IDSubjectMatch
+ {{ $row['binaryID'] ?? $row['id'] ?? 'N/A' }} + +
+ {{ $row['subject'] ?? '' }} +
+
+ @if(isset($row['match']) && $row['match']) + + Match + + @if(isset($row['name'])) +
+ Name: {{ $row['name'] }} +
+ @endif + @else + + No Match + + @endif +
+
+ + +
+
+ +
+

+ Tested {{ count($data) }} binaries +

+

+ Review the matches above to verify your regex pattern is working correctly. +

+
+
+
+ @else + +
+
+ +
+

No binaries found

+

+ No binaries found for the specified group or no matches found. Try a different group or regex pattern. +

+
+
+
+ @endif +
+ @endif +
+
+@endsection diff --git a/resources/views/admin/regexes/release-naming-edit.blade.php b/resources/views/admin/regexes/release-naming-edit.blade.php new file mode 100644 index 000000000..af197ce78 --- /dev/null +++ b/resources/views/admin/regexes/release-naming-edit.blade.php @@ -0,0 +1,181 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Release Naming Regex Edit' }} +

+ + Back to List + +
+
+ + +
+ @csrf + + + + @if($error) +
+
+ +

{{ $error }}

+
+
+ @endif + + +
+ +
+
+ +
+ +
+

+ Regex to match against a group or multiple groups. Delimiters are already added, and PCRE_CASELESS is added after for case insensitivity.
+ Example of matching a single group: alt\.binaries\.example
+ Example of matching multiple groups: alt\.binaries.* +

+
+ + +
+ +
+
+ +
+ +
+

+ Regex to use when renaming releases.
+ The regex delimiters are not added, you MUST add them. See this page.
+ To make the regex case insensitive, add i after the last delimiter. +

+
+ + +
+ +
+
+ +
+ +
+

+ Description for this regex. You can include an example release name this regex would match on. +

+
+ + +
+ +
+
+ +
+ +
+

+ The order to run this regex in. Must be a number, 0 or higher.
+ If multiple regex have the same ordinal, MySQL will randomly sort them. +

+
+ + +
+ +
+ @foreach($status_ids as $k => $id) +
+ status ?? 1) == $id ? 'checked' : '' }}> + +
+ @endforeach +
+

+ Only active regex are used during the release naming process. +

+
+
+ + +
+
+ + Cancel + + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/regexes/release-naming-list.blade.php b/resources/views/admin/regexes/release-naming-list.blade.php new file mode 100644 index 000000000..5c92639b2 --- /dev/null +++ b/resources/views/admin/regexes/release-naming-list.blade.php @@ -0,0 +1,234 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Release Naming Regex List' }} +

+ + Add New Regex + +
+
+ + +
+
+
+ +
+
+

+ This page lists regular expressions used for renaming releases based on their names.
+ You can test your regex patterns using the test feature. +

+
+
+
+ + +
+ + +
+
+ @csrf + +
+
+
+ +
+ +
+ +
+
+
+ + + @if($regex && count($regex) > 0) + + @if(method_exists($regex, 'links')) +
+ {{ $regex->onEachSide(5)->links() }} +
+ @endif + +
+ + + + + + + + + + + + + + @foreach($regex as $row) + + + + + + + + + + @endforeach + +
IDGroupDescriptionRegexOrdinalStatusActions
{{ $row->id }} + {{ $row->group_regex }} + + + {{ $row->description }} + + +
+ + {{ htmlspecialchars($row->regex) }} + +
+
{{ $row->ordinal }} + @if($row->status == 1) + + Active + + @else + + Disabled + + @endif + +
+ + + + +
+
+
+ + + @if(method_exists($regex, 'links')) +
+ {{ $regex->onEachSide(5)->links() }} +
+ @endif + @else +
+ +

No regex patterns found

+

Try a different search term or add a new regex.

+ + Add New Regex + +
+ @endif + + +
+
+ + @if($regex && method_exists($regex, 'total')) + Total entries: {{ $regex->total() }} + @elseif($regex) + Total entries: {{ count($regex) }} + @else + No entries + @endif + + +
+
+
+
+ +@push('scripts') + +@endpush +@endsection + diff --git a/resources/views/admin/regexes/release-naming-test.blade.php b/resources/views/admin/regexes/release-naming-test.blade.php new file mode 100644 index 000000000..f0e17e84a --- /dev/null +++ b/resources/views/admin/regexes/release-naming-test.blade.php @@ -0,0 +1,192 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title ?? 'Release Naming Regex Test' }} +

+ + Back to List + +
+
+ + +
+
+ +

+ Test your release naming regex patterns against actual release data from your database. +

+
+
+ + +
+
+ +
+ + +

+ Enter a newsgroup name to test against +

+
+ + +
+ + +

+ Results to display +

+
+ + +
+ + +

+ Max releases to query +

+
+
+ + +
+ + +

+ Enter the regex pattern to test. Include delimiters and flags. +

+
+ + + +
+ + + @if($data) +
+

+ Test Results: +

+ + @if(count($data) > 0) +
+ + + + + + + + + + + @foreach($data as $row) + + + + + + + @endforeach + +
Release IDOriginal NameNew NameMatch
+ {{ $row['releaseID'] ?? $row['id'] ?? 'N/A' }} + +
+ {{ $row['oldName'] ?? $row['name'] ?? '' }} +
+
+ @if(isset($row['newName']) && $row['newName']) +
+ {{ $row['newName'] }} +
+ @else + + @endif +
+ @if(isset($row['match']) && $row['match']) + + Match + + @else + + No Match + + @endif +
+
+ + +
+
+ +
+

+ Tested {{ count($data) }} releases +

+

+ Review the matches above to verify your regex pattern is working correctly. +

+
+
+
+ @else + +
+
+ +
+

No releases found

+

+ No releases found for the specified group or no matches found. Try a different group or regex pattern. +

+
+
+
+ @endif +
+ @endif +
+
+@endsection diff --git a/resources/views/admin/releases/edit.blade.php b/resources/views/admin/releases/edit.blade.php new file mode 100644 index 000000000..03296c7b5 --- /dev/null +++ b/resources/views/admin/releases/edit.blade.php @@ -0,0 +1,246 @@ +@extends('layouts.admin') + +@section('title', 'Edit Release') + +@section('content') +
+
+

Edit Release

+ +
+ + @if(session('success')) +
+ {{ session('success') }} +
+ @endif + + @if(session('error')) +
+ {{ session('error') }} +
+ @endif + +
+
+ @csrf + + + + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +

+ Current: {{ number_format(($release->size ?? $release['size'] ?? 0) / 1073741824, 2) }} GB +

+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ + + Cancel + + + View Release + +
+
+
+ + +
+

Release Information

+
+
+
GUID
+
{{ $release->guid ?? $release['guid'] ?? 'N/A' }}
+
+
+
Group
+
{{ $release->group_name ?? $release['group_name'] ?? 'N/A' }}
+
+
+
Password Status
+
+ @if(($release->passwordstatus ?? $release['passwordstatus'] ?? 0) == 0) + None + @elseif(($release->passwordstatus ?? $release['passwordstatus'] ?? 0) == 1) + Passworded + @else + Unknown + @endif +
+
+
+
+
+@endsection + diff --git a/resources/views/admin/releases/failed.blade.php b/resources/views/admin/releases/failed.blade.php new file mode 100644 index 000000000..910a7c86c --- /dev/null +++ b/resources/views/admin/releases/failed.blade.php @@ -0,0 +1,188 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + View All Releases + +
+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + @if(session('warning')) +
+

+ {{ session('warning') }} +

+
+ @endif + + +
+
+
+
+
+ +
+ +
+ + @if(request('failrelsearch')) + + Clear + + @endif +
+
+
+ + + @if($releaselist && $releaselist->count() > 0) +
+ + + + + + + + + + + + + + + @foreach($releaselist as $release) + + + + + + + + + + + @endforeach + +
NameCategorySizeFilesPost DateAdd DateGrabsActions
+ + {{ \Illuminate\Support\Str::limit($release->searchname, 50) }} + + + + {{ $release->category_name ?? 'Unknown' }} + + + + {{ human_filesize($release->size) }} + + + + {{ $release->totalpart ?? 0 }} + + +
+ + + {{ \Carbon\Carbon::parse($release->postdate)->format('Y-m-d H:i') }} + +
+
+
+ + + {{ \Carbon\Carbon::parse($release->adddate)->format('Y-m-d H:i') }} + +
+
+ + {{ $release->grabs ?? 0 }} + + +
+ + + + @if($release->guid) + + + + @endif + + + +
+
+
+ + +
+
+
+ Showing {{ $releaselist->firstItem() }} to + {{ $releaselist->lastItem() }} of + {{ $releaselist->total() }} failed releases +
+
+ {{ $releaselist->onEachSide(2)->links() }} +
+
+
+ @else +
+ +

+ @if(request('failrelsearch')) + No failed releases found matching "{{ request('failrelsearch') }}". + @else + No failed releases found. Great job! + @endif +

+
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/releases/index.blade.php b/resources/views/admin/releases/index.blade.php new file mode 100644 index 000000000..b3b5460c7 --- /dev/null +++ b/resources/views/admin/releases/index.blade.php @@ -0,0 +1,122 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+
+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + + @if(count($releaselist) > 0) +
+ + + + + + + + + + + + + + + + @foreach($releaselist as $release) + + + + + + + + + + + + @endforeach + +
IDNameCategorySizeFilesPostedAddedGrabsActions
{{ $release->id }} +
+ {{ $release->searchname }} +
+
+ {{ $release->name }} +
+
+ + {{ $release->category_name ?? 'N/A' }} + + + {{ number_format($release->size / 1073741824, 2) }} GB + + {{ $release->totalpart ?? 0 }} + + {{ \Carbon\Carbon::parse($release->postdate)->format('Y-m-d H:i') }} + + {{ \Carbon\Carbon::parse($release->adddate)->format('Y-m-d H:i') }} + + {{ $release->grabs ?? 0 }} + + +
+
+ + +
+ {{ $releaselist->links() }} +
+ @else +
+ +

No releases found

+

No releases are currently available in the system.

+
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/roles/add.blade.php b/resources/views/admin/roles/add.blade.php new file mode 100644 index 000000000..6f78271fe --- /dev/null +++ b/resources/views/admin/roles/add.blade.php @@ -0,0 +1,217 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + +
+ @csrf + + +
+ +
+ + +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+ + + Cancel + +
+
+
+
+
+@endsection + diff --git a/resources/views/admin/roles/edit.blade.php b/resources/views/admin/roles/edit.blade.php new file mode 100644 index 000000000..7bda1b47b --- /dev/null +++ b/resources/views/admin/roles/edit.blade.php @@ -0,0 +1,257 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if($role) +
+ @csrf + + + +
+ +
+ + +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ +
+
+ hasPermissionTo('preview') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('hideads') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('edit release') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view console') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view movies') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view audio') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view pc') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view tv') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view adult') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view books') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ hasPermissionTo('view other') ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+
+ + +
+ + + Cancel + +
+
+
+ @else +
+ +

Role not found

+

The requested role could not be found.

+ + Back to Role List + +
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/roles/index.blade.php b/resources/views/admin/roles/index.blade.php new file mode 100644 index 000000000..947b4cd2b --- /dev/null +++ b/resources/views/admin/roles/index.blade.php @@ -0,0 +1,86 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + Add New Role + +
+
+ + + @if(count($userroles) > 0) +
+ + + + + + + + + + + + + + + @foreach($userroles as $role) + + + + + + + + + + + @endforeach + +
IDRole NameAPI RequestsDownload RequestsDefault InvitesRate LimitDefaultActions
{{ $role->id }} +
{{ $role->name }}
+
{{ $role->apirequests ?? 'N/A' }}{{ $role->downloadrequests ?? 'N/A' }}{{ $role->defaultinvites ?? 0 }}{{ $role->rate_limit ?? 60 }} + @if($role->isdefault) + + Yes + + @else + + No + + @endif + + +
+
+ @else +
+ +

No roles found

+

Create your first role to get started.

+
+ @endif +
+
+@endsection + diff --git a/resources/views/admin/site/edit.blade.php b/resources/views/admin/site/edit.blade.php new file mode 100644 index 000000000..67d465d01 --- /dev/null +++ b/resources/views/admin/site/edit.blade.php @@ -0,0 +1,1142 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(!empty($error)) +
+

+ {{ $error }} +

+
+ @endif + + +
+ @csrf + + +
+ +
+

Main Site Settings, HTML Layout, Tags

+ +
+
+ + +

Displayed in the header on every public page.

+
+ +
+ + +

Stem meta-tag appended to all page title tags.

+
+ +
+ + +

Stem meta-description appended to all page meta description tags.

+
+ +
+ + +

Stem meta-keywords appended to all page meta keyword tags.

+
+ +
+ + +

Displayed in the footer section of every public page.

+
+ +
+ + +

The relative path to the landing page shown when a user logs in, or clicks the home link.

+
+ +
+ + +

Optional URL to prepend to external links.

+
+ +
+ + +

Text displayed in the terms and conditions page.

+
+
+
+ + +
+

Usenet Settings

+ +
+
+ + +

Levels deep to store the nzb Files. If you change this you must run the misc/testing/DB/nzb-reorg script!

+
+ +
+ + +

The number of hours incomplete parts and binaries will be retained.

+
+ +
+ + +

The number of days releases will be retained for use throughout site. Set to 0 to disable.

+
+ +
+ + +

The number of hours releases categorized as Misc->Other will be retained. Set to 0 to disable.

+
+ +
+ + +

The number of hours releases categorized as Misc->Hashed will be retained. Set to 0 to disable.

+
+ +
+ + +

Default is 0 (off), which will remove parts in one go. If backfilling or importing and parts table is large, using chunks of 5000+ will speed up removal. Normal indexing is fastest with this setting at 0.

+
+ +
+ + +

The minimum number of files to make a release. i.e. if set to two, then releases which only contain one file will not be created.

+
+ +
+ + +

The minimum total size in bytes to make a release. If set to 0, then ignored.

+
+ +
+ + +

The maximum total size in bytes to make a release. If set to 0, then ignored. Only deletes during release creation.

+
+ +
+ + +

The minimum completion percent to make a release. i.e. if set to 97, then releases under 97% completion will not be created. If set to 0, then ignored.

+
+ +
+ + +

Whether to update download counts when someone downloads a release.

+
+ +
+ + +

The time in hours to check for crossposted releases - this will delete 1 of the releases if the 2 are posted by the same person in the same time period.

+
+ +
+ + +

The maximum number of messages to fetch at a time from the server.

+
+ +
+ + +

The maximum number of headers that update binaries sees as the total range. This ensures that a total of no more than this is attempted to be downloaded at one time per group.

+
+ +
+ + +
+
+ + +
+
+ + +
+
+

Scan back X (posts/days) for each new group? Can backfill to scan further.

+
+ +
+ + +

The target date for safe backfill. Format: YYYY-MM-DD

+
+ +
+ + +

Whether to disable a group automatically during backfill if the target date has been reached.

+
+
+
+ + +
+

Lookup Settings

+ +
+
+ + +

Whether to attempt to lookup TvRage ids on the web.

+
+ +
+ + +

Whether to attempt to lookup book information from Amazon.

+
+ +
+ + +

Categories of Books to lookup information for (only work if Lookup Books is set to yes).

+
+ +
+ + +

Whether to attempt to lookup film information from IMDB or TheMovieDB.

+
+ +
+ + +

Preferred language for scraping external sources.

+
+ +
+ + +

Whether to attempt to lookup anime information from AniDB when processing binaries.

+
+ +
+ + +

Whether to attempt to lookup music information from Amazon.

+
+ +
+ + +

Whether to save a preview of an audio release (requires deep rar inspection enabled).
It is advisable to specify a path to the lame binary to reduce the size of audio previews.

+
+ +
+ + +

Whether to attempt to lookup game information from Amazon.

+
+ +
+ + +

Whether to attempt to lookup XXX information when processing binaries.

+
+
+
+ + +
+

Language/Categorization Options

+ +
+
+ + +

Whether to send foreign movies/tv to foreign sections or not. If set to true they will go in foreign categories.

+
+ +
+ + +

Whether to send WEB-DL to the WEB-DL section or not. If set to true they will go in WEB-DL category, false will send them in HD TV. This will also make them inaccessible to Sickbeard and possibly Couchpotato.

+
+
+
+ + +
+

User Settings

+ +
+
+ + +

The status of registrations to the site.

+
+ +
+ + +

The number of days to preserve user download history, for use when checking limits being hit. Set to zero will remove all records of what users download, but retain history of when, so that role based limits can still be applied.

+
+ +
+ + +

A comma separated list of IP addresses which will be excluded from user limits on number of requests and downloads per IP address. Include values for google reader and other shared services which may be being used.

+
+
+
+ + +
+

Path Settings

+
+
+ + +

Path where NZB files are stored

+
+
+ + +

Path where cover images are stored

+
+
+
+ + +
+

Password Settings

+ +
+
+ + +

Try to download the last rar or zip file? (This is good if most of the files are at the end.) Note: The first rar/zip is still downloaded.

+
+ +
+ + +

Whether to show passworded releases in browse, search, api and rss feeds.

+
+
+
+ + +
+

Additional Usenet Settings

+ +
+
+ +
+ + GB +
+

The maximum size in gigabytes to postprocess a release. If set to 0, then ignored.

+
+ +
+ +
+ + MB +
+

The minimum size in megabytes to post process (additional) a release. If set to 0, then ignored.

+
+
+
+ + +
+

Advanced Settings - For Advanced Users

+ +
+
+ + +

The maximum amount of NZB files to create on stage 5 at a time in update_releases. If more are to be created it will loop stage 5 until none remain.

+
+ +
+ + +

Whether to attempt to repair parts or not, increases backfill/binaries updating time.

+
+ +
+ + +

Whether to put unreceived parts into missed_parts table when running binaries(safe) or backfill scripts.

+
+ +
+ + +

The maximum amount of articles to attempt to repair at a time. If you notice that you are getting a lot of parts into the missed_parts table, it is possible that you USP is not keeping up with the requests. Try to reduce the threads to safe scripts or stop using safe scripts until improves.

+
+ +
+ + +

Maximum amount of times to try part repair.

+
+ +
+ + +

Whether to attempt to retrieve a JPG file while additional post processing, these are usually on XXX releases.

+
+ +
+ + +

Whether to attempt to process a video thumbnail image. You must have ffmpeg for this.

+
+ +
+ + +

Whether to attempt to process a video sample, these videos are very short 1-3 seconds, 100KB on average, in ogg video format. You must have ffmpeg for this.

+
+ +
+ + +

The maximum number of segments to download to generate the sample video file or jpg sample image. (Default 2)

+
+ +
+ +
+ + seconds +
+

The maximum duration (in seconds) for ffmpeg to generate the sample for. (Default 5)

+
+ +
+ +
+ + levels +
+

If a rar/zip has rar/zip inside of it, how many times should we go in those inner rar/zip files.

+
+ +
+ + +

You can add a regex here to set releases to potentially passworded when a file name inside a rar/zip matches this regex. You must ensure this regex is valid, a non valid regex will cause errors during processing!

+
+
+
+ + +
+

Movie Trailer Settings

+ +
+
+ + +

Fetch and display trailers from TraktTV (Requires API key) and/or TrailerAddict on the details page?

+
+ +
+ +
+ + px +
+

Maximum width in pixels for the trailer window. (Default: 480)

+
+ +
+ +
+ + px +
+

Maximum height in pixels for the trailer window. (Default: 345)

+
+
+
+ + +
+

Advanced - Postprocessing Settings

+ +
+
+ +
+ + seconds +
+

How much time to wait for unrar/7zip/mediainfo/ffmpeg/avconv before killing it, set to 0 to disable. 60 is a good value. Requires the GNU Timeout path to be set.

+
+ +
+ + +

The maximum amount of releases to process for passwords/previews/mediainfo per run. Every release gets processed here. This uses NNTP an connection, 1 per thread. This does not query Amazon.

+
+ +
+ + +

If a part fails to download while post processing, this will retry up to the amount you set, then give up.

+
+ +
+ + +

This overrides the above setting if set above 1. How many parts to check for a password before giving up. This slows down post processing massively, better to leave it 1.

+
+ +
+ + +

The maximum amount of TV shows to process with TVRage per run. This does not use an NNTP connection or query Amazon.

+
+ +
+ + +

The maximum amount of movies to process with IMDB per run. This does not use an NNTP connection or query Amazon.

+
+ +
+ + +

The maximum amount of anime to process with anidb per run. This does not use an NNTP connection or query Amazon.

+
+ +
+ + +

The maximum amount of music to process with amazon per run. This does not use an NNTP connection.

+
+ +
+ + +

The maximum amount of games to process with amazon per run. This does not use an NNTP connection.

+
+ +
+ + +

The maximum amount of books to process with amazon per run. This does not use an NNTP connection

+
+ +
+ + +

The maximum amount of XXX to process per run. This does not use an NNTP connection or query Amazon.

+
+ +
+ + +

The maximum number of releases to check per run (threaded script only).

+
+ +
+ +
+ + ms +
+

Sleep time in milliseconds to wait in between amazon requests. If you thread post-proc, multiply by the number of threads. ie Postprocessing Threads = 12, Amazon sleep time = 12000

+
+
+
+ + +
+

NFO Processing Settings

+ +
+
+ + +

Whether to attempt to retrieve an nfo file from usenet.
NOTE: disabling nfo lookups will disable movie lookups.

+
+ +
+ + +

The maximum amount of NFO files to process per run. This uses NNTP an connection, 1 per thread. This does not query Amazon.

+
+ +
+ +
+ + GB +
+

The maximum size in gigabytes of a release to process it for NFOs. If set to 0, then ignored.

+
+ +
+ +
+ + MB +
+

The minimum size in megabytes of a release to process it for NFOs. If set to 0, then ignored.

+
+ +
+ +
+ + times +
+

How many times to retry when a NFO fails to download. If set to 0, we will not retry. The max is 7.

+
+
+
+ + +
+

Connection Settings

+ +
+
+ + +

The maximum number of retry attempts to connect to nntp provider. On error, each retry takes approximately 5 seconds nntp returns reply. (Default 10)

+
+ +
+ + +

The time in hours to wait, since last activity, before releases without parts counts in the subject are are created.
Setting this below 2 hours could create incomplete releases.

+
+ +
+ + +

How many hours to wait before converting a collection into a release that is considered "stuck".
Default value is 48 hours.

+
+
+
+ + +
+

Developer Settings

+ +
+
+ + +

For developers. Whether to log all headers that have 'yEnc' and are dropped. Logged to not_yenc/groupname.dropped.txt.

+
+
+
+ + +
+

Advanced - Threaded Settings

+ +
+
+ + +

The number of threads for update_binaries. If you notice that you are getting a lot of parts into the missed_parts table, it is possible that you USP is not keeping up with the requests. Try to reduce the threads. At least until the cause can be determined.

+
+ +
+ + +

The number of threads for backfill.

+
+ +
+ + +

The number of threads for releases update scripts.

+
+ +
+ + +

The number of threads for additional postprocessing. This includes deep rar inspection, preview and sample creation and nfo processing.

+
+ +
+ + +

The number of threads for nfo postprocessing. The max is 16, if you set anything higher it will use 16.

+
+ +
+ + +

The number of threads for non-amazon postprocessing. This includes movies, anime and tv lookups.

+
+ +
+ + +

The number of threads for fixReleasesNames. This includes md5, nfos, par2 and filenames.

+
+
+
+ + +
+

+ + This is a simplified settings page. For complete site configuration, please use the full settings management interface or edit settings directly in the database. +

+
+ + +
+ + + Cancel + +
+
+
+
+
+@endsection + diff --git a/resources/views/admin/site/stats.blade.php b/resources/views/admin/site/stats.blade.php new file mode 100644 index 000000000..671fbff16 --- /dev/null +++ b/resources/views/admin/site/stats.blade.php @@ -0,0 +1,150 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ +
+ + @if(!empty($topgrabs) && count($topgrabs) > 0) +
+

Top Grabbers

+
+ + + + + + + + + @foreach($topgrabs as $grab) + + + + + @endforeach + +
UsernameGrabs
{{ $grab->username }}{{ $grab->grabs }}
+
+
+ @endif + + + @if(!empty($topdownloads) && count($topdownloads) > 0) +
+

Top Downloads

+
+ + + + + + + + + @foreach($topdownloads as $download) + + + + + @endforeach + +
ReleaseDownloads
{{ $download->searchname }}{{ $download->grabs }}
+
+
+ @endif + + + @if(!empty($recent) && count($recent) > 0) +
+

Recently Added Releases

+
+ + + + + + + + + @foreach($recent as $item) + + + + + @endforeach + +
DateReleases
{{ $item->thedate }}{{ $item->num }}
+
+
+ @endif + + + @if(!empty($usersbymonth) && count($usersbymonth) > 0) +
+

User Signups by Month

+
+ + + + + + + + + @foreach($usersbymonth as $month) + + + + + @endforeach + +
MonthSignups
{{ $month->mth }}{{ $month->num }}
+
+
+ @endif + + + @if(!empty($usersbyrole) && count($usersbyrole) > 0) +
+

Users by Role

+
+ + + + + + + + + @foreach($usersbyrole as $role) + + + + + @endforeach + +
RoleCount
{{ $role->name }}{{ $role->num }}
+
+
+ @endif + + @if(empty($topgrabs) && empty($topdownloads) && empty($recent) && empty($usersbymonth) && empty($usersbyrole)) +
+ +

No statistics available

+

Statistics will appear here once data is collected.

+
+ @endif +
+
+
+@endsection + diff --git a/resources/views/admin/site/tmux-edit.blade.php b/resources/views/admin/site/tmux-edit.blade.php new file mode 100644 index 000000000..ce671d86d --- /dev/null +++ b/resources/views/admin/site/tmux-edit.blade.php @@ -0,0 +1,351 @@ +@extends('layouts.admin') + +@push('styles') + +@endpush + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + +
+ @csrf + + + +
+ +
+

Tmux - How It Works

+
+

Tmux is a screen multiplexer and at least version 1.6 is required. It is used here to allow multiple windows per session and multiple panes per window.

+

Each script is run in its own shell environment. It is not looped, but allowed to run once and then exit. This notifies tmux that the pane is dead and can then be respawned with another iteration of the script in a new shell environment.

+

This allows for scripts that crash to be restarted without user intervention.

+
+

NOTICE:

+

If "Save Tmux Settings" is the last thing you did on this page, refreshing will save the current form values again, not reload from database.

+
+
+
+ + +
+

Monitor Settings

+
+ + + @foreach($yesno_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+ + + + +
+
+ + +
+

Sequential Settings

+
+ + + @foreach($sequential_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+ +
+

Sequential mode is not recommended as it's not tested enough.

+
+
+
+ + +
+

Update Binaries Settings

+
+ + + @foreach($binaries_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+ + +
+ + minutes +
+
+
+
+ + +
+

Backfill Settings

+
+
+ + + @foreach($backfill_ids as $index => $val) + + @endforeach + + + + + + @foreach($backfill_group_ids as $index => $val) + + @endforeach + + + + + + @foreach($backfill_days_ids as $index => $val) + + @endforeach + + +
+ + + + + + + + + + +
+ + seconds +
+
+ + + + @foreach($yesno_ids as $index => $val) + + @endforeach + + +
+
+ + +
+

Update Releases Settings

+
+ + + @foreach($releases_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+
+
+ + +
+

Postprocessing Settings

+
+ + + @foreach($post_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+ + +
+ + seconds +
+
+ + + + @foreach($yesno_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+ + + + @foreach($yesno_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+
+
+ + +
+

Fix Release Names

+
+ + + @foreach($yesno_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+
+
+ + +
+

Remove Crap Releases

+
+ + + @foreach($yesno_ids as $index => $val) + + @endforeach + + + + +
+ + seconds +
+
+
+
+ + +
+ + Save Tmux Settings + +
+
+
+
+
+@endsection + diff --git a/resources/views/admin/users/deleted.blade.php b/resources/views/admin/users/deleted.blade.php new file mode 100644 index 000000000..b5b80caa3 --- /dev/null +++ b/resources/views/admin/users/deleted.blade.php @@ -0,0 +1,265 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + Back to Active Users + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + Clear + +
+
+
+ + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + + @if(count($deletedusers) > 0) +
+ @csrf +
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + @foreach($deletedusers as $user) + + + + + + + + + + + @endforeach + +
+ + + + Username + @if(str_starts_with($orderby ?? '', 'username')) + + @endif + + + + Email + @if(str_starts_with($orderby ?? '', 'email')) + + @endif + + RoleHost + + Created + @if(str_starts_with($orderby ?? '', 'createdat')) + + @endif + + + + Deleted + @if(str_starts_with($orderby ?? '', 'deletedat')) + + @endif + + Actions
+ + +
{{ $user->username }}
+
{{ $user->email }} + + {{ $user->rolename ?? 'N/A' }} + + {{ $user->host ?? 'N/A' }} + {{ $user->created_at ? $user->created_at->format('Y-m-d H:i') : 'N/A' }} + + {{ $user->deleted_at ? $user->deleted_at->format('Y-m-d H:i') : 'N/A' }} + + +
+
+
+ + +
+ {{ $deletedusers->links() }} +
+ @else +
+ +

No deleted users found

+

There are no soft-deleted users matching your filters.

+
+ @endif +
+
+ + +@endsection + diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php new file mode 100644 index 000000000..887743ca1 --- /dev/null +++ b/resources/views/admin/users/edit.blade.php @@ -0,0 +1,207 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+

+ {{ $title }} +

+
+ + + @if(!empty($error)) +
+

+ {{ $error }} +

+
+ @endif + + +
+ @csrf + + @if(!empty($user['id'])) + + @endif + +
+ +
+ + +
+ + +
+ + +
+ + +
+ + + @if(!empty($user['id'])) +

Leave blank to keep the current password

+ @endif +
+ + +
+ + +
+ + @if(!empty($user['id'])) + +
+ + +
+ @endif + + +
+ + +
+ + +
+ + +
+ + @if(!empty($user['id'])) + +
+ +
+
+ movieview ?? 0)) ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ musicview ?? 0)) ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ gameview ?? 0)) ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ consoleview ?? 0)) ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ bookview ?? 0)) ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+ xxxview ?? 0)) ? 'checked' : '' }} + class="h-4 w-4 text-blue-600 dark:text-blue-400 focus:ring-blue-500 border-gray-300 dark:border-gray-600 rounded"> + +
+
+
+ @endif + + +
+ + + Cancel + +
+
+
+
+
+@endsection + diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php new file mode 100644 index 000000000..2fe02fa5c --- /dev/null +++ b/resources/views/admin/users/index.blade.php @@ -0,0 +1,200 @@ +@extends('layouts.admin') + +@section('content') +
+
+ +
+
+

+ {{ $title }} +

+ + Add New User + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + Clear + +
+
+
+ + + @if(request()->has('deleted') && request()->input('deleted') == 1) +
+

+ + User "{{ request()->input('username') }}" has been deleted successfully. +

+
+ @endif + + @if(session('success')) +
+

+ {{ session('success') }} +

+
+ @endif + + @if(session('error')) +
+

+ {{ session('error') }} +

+
+ @endif + + + @if(count($userlist) > 0) +
+ + + + + + + + + + + + + + + + @foreach($userlist as $user) + + + + + + + + + + + + @endforeach + +
IDUsernameEmailRoleHostCountryVerifiedCreatedActions
{{ $user->id }} +
{{ $user->username }}
+
{{ $user->email }} + + {{ $user->roles->first()->name ?? 'N/A' }} + + {{ $user->host ?? 'N/A' }} + @if(!empty($user->country_code)) + {{ $user->country_code }} + @else + N/A + @endif + + @if($user->verified) + + Yes + + @else + + No + + @endif + + {{ $user->created_at ? $user->created_at->format('Y-m-d') : 'N/A' }} + +
+ + + + @if(!$user->verified) + + + + + + + @endif + + + +
+
+
+ + +
+ {{ $userlist->links() }} +
+ @else +
+ +

No users found

+

Try adjusting your search filters or add a new user.

+
+ @endif +
+
+@endsection +