From b628252b5a5376b9b12948a3e16ee7380730603c Mon Sep 17 00:00:00 2001
From: Jay Sizzla
Date: Thu, 4 Apr 2024 12:21:12 +0200
Subject: [PATCH 04/61] Requirements & Perks columns should be equal in width
---
resources/sass/pages/_stats.scss | 6 ++++++
resources/views/stats/groups/groups-requirements.blade.php | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/resources/sass/pages/_stats.scss b/resources/sass/pages/_stats.scss
index a2a26e67ae..8474bf000d 100644
--- a/resources/sass/pages/_stats.scss
+++ b/resources/sass/pages/_stats.scss
@@ -9,3 +9,9 @@
display: table;
table-layout: fixed;
}
+
+.perks-table tr {
+ width: 100%;
+ display: table;
+ table-layout: fixed;
+}
diff --git a/resources/views/stats/groups/groups-requirements.blade.php b/resources/views/stats/groups/groups-requirements.blade.php
index 7e0ae94540..6797706185 100644
--- a/resources/views/stats/groups/groups-requirements.blade.php
+++ b/resources/views/stats/groups/groups-requirements.blade.php
@@ -165,7 +165,7 @@ class="{{ config('other.font-awesome') }} fa-x text-red"
@endif
-
+
From f01beb9f1f470d2e270f793e4ba606e6040f8b2a Mon Sep 17 00:00:00 2001
From: Jay Sizzla
Date: Thu, 4 Apr 2024 13:15:09 +0200
Subject: [PATCH 05/61] Add mobile layout
---
resources/sass/pages/_stats.scss | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/resources/sass/pages/_stats.scss b/resources/sass/pages/_stats.scss
index 8474bf000d..d47effb948 100644
--- a/resources/sass/pages/_stats.scss
+++ b/resources/sass/pages/_stats.scss
@@ -15,3 +15,21 @@
display: table;
table-layout: fixed;
}
+
+@media only screen and (max-width: 806px) {
+ .data-table > thead {
+ display: none;
+ }
+
+ .data-table:not(.requirements-table):not(.perks-table) > tbody > tr {
+ width: 100%;
+ display: grid;
+ grid-template-columns: 1fr;
+ grid-template-rows: auto;
+ margin-bottom: 20px;
+ }
+
+ .data-table > tbody > tr > td {
+ text-align: center;
+ }
+}
From 2825e1e4b1945de5fd6583f06d7d0f10cf36a1e0 Mon Sep 17 00:00:00 2001
From: Jay Sizzla
Date: Thu, 4 Apr 2024 20:17:42 +0200
Subject: [PATCH 06/61] Take global invite restriction into account
---
resources/views/stats/groups/groups-requirements.blade.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/resources/views/stats/groups/groups-requirements.blade.php b/resources/views/stats/groups/groups-requirements.blade.php
index 6797706185..ae21f751a0 100644
--- a/resources/views/stats/groups/groups-requirements.blade.php
+++ b/resources/views/stats/groups/groups-requirements.blade.php
@@ -188,7 +188,7 @@ class="{{ config('other.font-awesome') }} fa-upload text-success"
@endif
- @if (\in_array($group->name, config('other.invite_groups'), true))
+ @if (!config('other.invites_restriced') || (config('other.invites_restriced') && \in_array($group->name, config('other.invite_groups'), true)))
Date: Thu, 4 Apr 2024 18:18:42 +0000
Subject: [PATCH 07/61] Blade Style Change (Prettier Blade CI)
---
resources/views/stats/groups/groups-requirements.blade.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/resources/views/stats/groups/groups-requirements.blade.php b/resources/views/stats/groups/groups-requirements.blade.php
index ae21f751a0..c8b8773e81 100644
--- a/resources/views/stats/groups/groups-requirements.blade.php
+++ b/resources/views/stats/groups/groups-requirements.blade.php
@@ -188,7 +188,7 @@ class="{{ config('other.font-awesome') }} fa-upload text-success"
@endif
- @if (!config('other.invites_restriced') || (config('other.invites_restriced') && \in_array($group->name, config('other.invite_groups'), true)))
+ @if (! config('other.invites_restriced') || (config('other.invites_restriced') && \in_array($group->name, config('other.invite_groups'), true)))
Date: Sat, 6 Apr 2024 12:45:34 +0200
Subject: [PATCH 08/61] Improve desktop and mobile layout
---
resources/sass/pages/_stats.scss | 27 +++++++++++++++----
.../groups/groups-requirements.blade.php | 6 ++---
2 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/resources/sass/pages/_stats.scss b/resources/sass/pages/_stats.scss
index d47effb948..5dcf79e697 100644
--- a/resources/sass/pages/_stats.scss
+++ b/resources/sass/pages/_stats.scss
@@ -4,24 +4,41 @@
gap: 1rem;
}
-.requirements-table tr {
+.stats__requirements-table tr {
width: 100%;
display: table;
table-layout: fixed;
}
-.perks-table tr {
+.stats__perks-table tr {
width: 100%;
display: table;
table-layout: fixed;
}
+.stats__requirements-table tr:nth-child(even) > td,
+.stats__perks-table tr:nth-child(even) > td {
+ background-color: inherit;
+}
+
+.stats__requirements-table tr:nth-child(odd) > td,
+.stats__perks-table tr:nth-child(odd) > td {
+ background-color: inherit;
+}
+
+.stats__requirements-table > tr:not(:last-child) > td,
+.stats__requirements-table > thead > tr:not(:last-child) > td,
+.stats__requirements-table > tbody > tr:not(:last-child) > td,
+.stats__requirements-table > tfoot > tr:not(:last-child) > td {
+ border-bottom: var(--data-table-tr-border);
+}
+
@media only screen and (max-width: 806px) {
- .data-table > thead {
+ .stats__groups-table > thead {
display: none;
}
- .data-table:not(.requirements-table):not(.perks-table) > tbody > tr {
+ .stats__groups-table > tbody > tr {
width: 100%;
display: grid;
grid-template-columns: 1fr;
@@ -29,7 +46,7 @@
margin-bottom: 20px;
}
- .data-table > tbody > tr > td {
+ .stats__groups-table > tbody > tr > td {
text-align: center;
}
}
diff --git a/resources/views/stats/groups/groups-requirements.blade.php b/resources/views/stats/groups/groups-requirements.blade.php
index c8b8773e81..50d7285794 100644
--- a/resources/views/stats/groups/groups-requirements.blade.php
+++ b/resources/views/stats/groups/groups-requirements.blade.php
@@ -28,7 +28,7 @@
{{ __('stat.groups') }}
-
+
{{ __('common.group') }}
@@ -53,7 +53,7 @@
@if ($group->autogroup)
-
+
@@ -165,7 +165,7 @@ class="{{ config('other.font-awesome') }} fa-x text-red"
@endif
-
+
From 14652fa8b882fbb0ce30963cf71ed1b3fda576a9 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Sat, 6 Apr 2024 21:02:18 -0400
Subject: [PATCH 09/61] fix: broken syntax
---
resources/views/livewire/two-factor-auth-form.blade.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/resources/views/livewire/two-factor-auth-form.blade.php b/resources/views/livewire/two-factor-auth-form.blade.php
index 6758afee55..00e06dcbc3 100644
--- a/resources/views/livewire/two-factor-auth-form.blade.php
+++ b/resources/views/livewire/two-factor-auth-form.blade.php
@@ -21,7 +21,7 @@
- {{ __('When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from a syncronized 2fa app (Google Authenticator, Authy, BitWarden, etc.) }}
+ {{ __('When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from a syncronized 2fa app such as Google Authenticator, Authy, BitWarden, etc.') }}
From 3f1e4971d92f6eba00fe327602471d1d00ca6aef Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Sat, 6 Apr 2024 21:05:23 -0400
Subject: [PATCH 10/61] chore: larastan
---
phpstan-baseline.neon | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index 1d1f0cdfed..906a2a40ca 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -1275,6 +1275,16 @@ parameters:
count: 1
path: app/Http/Resources/TorrentResource.php
+ -
+ message: "#^Unable to resolve the template type TKey in call to function collect$#"
+ count: 1
+ path: app/Http/Resources/TorrentResource.php
+
+ -
+ message: "#^Unable to resolve the template type TValue in call to function collect$#"
+ count: 1
+ path: app/Http/Resources/TorrentResource.php
+
-
message: "#^Method App\\\\Http\\\\Resources\\\\TorrentsResource\\:\\:toArray\\(\\) return type has no value type specified in iterable type array\\.$#"
count: 1
From 5da57295fc12b1d78b75c06797b0fe10e680c928 Mon Sep 17 00:00:00 2001
From: crKtv <36048892+crKtv@users.noreply.github.com>
Date: Sun, 7 Apr 2024 17:18:20 +0100
Subject: [PATCH 11/61] Update row.blade.php
---
resources/views/components/torrent/row.blade.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/resources/views/components/torrent/row.blade.php b/resources/views/components/torrent/row.blade.php
index b075e2c057..a34c295d64 100644
--- a/resources/views/components/torrent/row.blade.php
+++ b/resources/views/components/torrent/row.blade.php
@@ -18,7 +18,7 @@
data-mal-id="{{ $torrent->mal }}"
data-category-id="{{ $torrent->category_id }}"
data-type-id="{{ $torrent->type_id }}"
- data-type-id="{{ $torrent->resolution_id }}"
+ data-resolution-id="{{ $torrent->resolution_id }}"
>
@if (auth()->user()->show_poster == 1)
From 65ced2cf75566fe8ec0ead81031715fd92c81ca3 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Sun, 7 Apr 2024 20:29:49 -0400
Subject: [PATCH 12/61] fix: #3729
- closes #3729
---
app/Http/Livewire/InviteLogSearch.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/Http/Livewire/InviteLogSearch.php b/app/Http/Livewire/InviteLogSearch.php
index 2575dab80a..61bb84dbc3 100644
--- a/app/Http/Livewire/InviteLogSearch.php
+++ b/app/Http/Livewire/InviteLogSearch.php
@@ -85,7 +85,7 @@ final public function invites(): \Illuminate\Contracts\Pagination\LengthAwarePag
->when($this->sender, fn ($query) => $query->whereRelation('sender', 'username', '=', $this->sender))
->when($this->email, fn ($query) => $query->where('email', 'LIKE', '%'.$this->email.'%'))
->when($this->code, fn ($query) => $query->where('code', 'LIKE', '%'.$this->code.'%'))
- ->when($this->receiver, fn ($query) => $query->whereRelation('sender', 'username', '=', $this->receiver))
+ ->when($this->receiver, fn ($query) => $query->whereRelation('receiver', 'username', '=', $this->receiver))
->when($this->custom, fn ($query) => $query->where('custom', 'LIKE', '%'.$this->custom.'%'))
->when(
$this->groupBy === 'user_id',
From c5d7859dd83730857cd00010da0349c5f54c322b Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Sun, 7 Apr 2024 21:03:50 -0400
Subject: [PATCH 13/61] fix: #3724
- closes #3724
---
app/Http/Controllers/API/TorrentController.php | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/app/Http/Controllers/API/TorrentController.php b/app/Http/Controllers/API/TorrentController.php
index e840a54b7a..be5ed885af 100644
--- a/app/Http/Controllers/API/TorrentController.php
+++ b/app/Http/Controllers/API/TorrentController.php
@@ -79,10 +79,12 @@ public function index(): TorrentsResource
)
->latest('sticky')
->latest('bumped_at')
- ->paginate(25);
+ ->cursorPaginate(25);
// See app/Traits/TorrentMeta.php
- return $this->scopeMeta($torrents);
+ $this->scopeMeta($torrents);
+
+ return $torrents;
});
return new TorrentsResource($torrents);
@@ -499,7 +501,7 @@ public function filter(Request $request): TorrentsResource|\Illuminate\Http\Json
$cacheKey = $url.'?'.$queryString;
$torrents = cache()->remember($cacheKey, 300, function () use ($request, $isRegex) {
- $torrents = Torrent::with(['user:id,username', 'category', 'type', 'resolution', 'distributor', 'region'])
+ $torrents = Torrent::with(['user:id,username', 'category', 'type', 'resolution', 'distributor', 'region', 'files'])
->select('*')
->selectRaw("
CASE
@@ -546,10 +548,12 @@ public function filter(Request $request): TorrentsResource|\Illuminate\Http\Json
->when($request->filled('episodeNumber'), fn ($query) => $query->ofEpisode((int) $request->episodeNumber))
->latest('sticky')
->orderBy($request->input('sortField') ?? $this->sortField, $request->input('sortDirection') ?? $this->sortDirection)
- ->paginate(min($request->input('perPage') ?? $this->perPage, 100));
+ ->cursorPaginate(min($request->input('perPage') ?? $this->perPage, 100));
// See app/Traits/TorrentMeta.php
- return $this->scopeMeta($torrents);
+ $this->scopeMeta($torrents);
+
+ return $torrents;
});
if ($torrents !== null) {
From b308debf51aec8594a2f49af84d5f97a4d9b4fa9 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Mon, 8 Apr 2024 11:57:26 -0400
Subject: [PATCH 14/61] update: dependencies
---
composer.json | 7 +-
composer.lock | 316 ++++++----
docker-compose.yml | 21 +
public/vendor/livewire/livewire.js | 851 ++++++++++++++++-----------
public/vendor/livewire/manifest.json | 2 +-
5 files changed, 711 insertions(+), 486 deletions(-)
diff --git a/composer.json b/composer.json
index 6933145117..6d6d2f4957 100644
--- a/composer.json
+++ b/composer.json
@@ -27,7 +27,7 @@
"laravel/fortify": "1.20.0",
"laravel/framework": "^10.48.4",
"laravel/tinker": "^2.9.0",
- "livewire/livewire": "^v3.4.9",
+ "livewire/livewire": "^v3.4.10",
"marcreichel/igdb-laravel": "^3.8.1",
"paragonie/constant_time_encoding": "^2.6.3",
"spatie/laravel-backup": "^8.6.0",
@@ -45,7 +45,7 @@
"fakerphp/faker": "^1.23.1",
"jasonmccreary/laravel-test-assertions": "^2.4",
"larastan/larastan": "^2.9.2",
- "laravel/pint": "^1.15.0",
+ "laravel/pint": "^1.15.1",
"laravel/sail": "^1.29.1",
"mockery/mockery": "^1.6.11",
"nunomaduro/collision": "v7.10.0",
@@ -54,7 +54,8 @@
"pestphp/pest-plugin-laravel": "^v2.2.0",
"pestphp/pest-plugin-livewire": "^2.1",
"phpunit/phpunit": "10.5.9",
- "spatie/laravel-ignition": "^2.4.2"
+ "ryoluo/sail-ssl": "^1.3.2",
+ "spatie/laravel-ignition": "^2.5.1"
},
"config": {
"preferred-install": "dist",
diff --git a/composer.lock b/composer.lock
index 127bde0595..2dbbbec3b9 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "5543f09b65f9fa46d16125107cfa64ae",
+ "content-hash": "755663ed237060ffa943aab3c6bc96a8",
"packages": [
{
"name": "assada/laravel-achievements",
@@ -2753,16 +2753,16 @@
},
{
"name": "league/flysystem",
- "version": "3.26.0",
+ "version": "3.27.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "072735c56cc0da00e10716dd90d5a7f7b40b36be"
+ "reference": "4729745b1ab737908c7d055148c9a6b3e959832f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/072735c56cc0da00e10716dd90d5a7f7b40b36be",
- "reference": "072735c56cc0da00e10716dd90d5a7f7b40b36be",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/4729745b1ab737908c7d055148c9a6b3e959832f",
+ "reference": "4729745b1ab737908c7d055148c9a6b3e959832f",
"shasum": ""
},
"require": {
@@ -2827,7 +2827,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/3.26.0"
+ "source": "https://github.com/thephpleague/flysystem/tree/3.27.0"
},
"funding": [
{
@@ -2839,7 +2839,7 @@
"type": "github"
}
],
- "time": "2024-03-25T11:49:53+00:00"
+ "time": "2024-04-07T19:17:50+00:00"
},
{
"name": "league/flysystem-local",
@@ -2958,16 +2958,16 @@
},
{
"name": "livewire/livewire",
- "version": "v3.4.9",
+ "version": "v3.4.10",
"source": {
"type": "git",
"url": "https://github.com/livewire/livewire.git",
- "reference": "c65b3f0798ab2c9338213ede3588c3cdf4e6fcc0"
+ "reference": "6f90e2d7f8e80a97a7406c22a0fbc61ca1256ed9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/livewire/livewire/zipball/c65b3f0798ab2c9338213ede3588c3cdf4e6fcc0",
- "reference": "c65b3f0798ab2c9338213ede3588c3cdf4e6fcc0",
+ "url": "https://api.github.com/repos/livewire/livewire/zipball/6f90e2d7f8e80a97a7406c22a0fbc61ca1256ed9",
+ "reference": "6f90e2d7f8e80a97a7406c22a0fbc61ca1256ed9",
"shasum": ""
},
"require": {
@@ -2977,6 +2977,7 @@
"illuminate/validation": "^10.0|^11.0",
"league/mime-type-detection": "^1.9",
"php": "^8.1",
+ "symfony/console": "^6.0|^7.0",
"symfony/http-kernel": "^6.2|^7.0"
},
"require-dev": {
@@ -2984,8 +2985,8 @@
"laravel/framework": "^10.0|^11.0",
"laravel/prompts": "^0.1.6",
"mockery/mockery": "^1.3.1",
- "orchestra/testbench": "8.20.0|^9.0",
- "orchestra/testbench-dusk": "8.20.0|^9.0",
+ "orchestra/testbench": "^8.21.0|^9.0",
+ "orchestra/testbench-dusk": "^8.24|^9.1",
"phpunit/phpunit": "^10.4",
"psy/psysh": "^0.11.22|^0.12"
},
@@ -3021,7 +3022,7 @@
"description": "A front-end framework for Laravel.",
"support": {
"issues": "https://github.com/livewire/livewire/issues",
- "source": "https://github.com/livewire/livewire/tree/v3.4.9"
+ "source": "https://github.com/livewire/livewire/tree/v3.4.10"
},
"funding": [
{
@@ -3029,7 +3030,7 @@
"type": "github"
}
],
- "time": "2024-03-14T14:03:32+00:00"
+ "time": "2024-04-02T14:22:50+00:00"
},
{
"name": "marcreichel/igdb-laravel",
@@ -3105,16 +3106,16 @@
},
{
"name": "masterminds/html5",
- "version": "2.8.1",
+ "version": "2.9.0",
"source": {
"type": "git",
"url": "https://github.com/Masterminds/html5-php.git",
- "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf"
+ "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf",
- "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf",
+ "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f5ac2c0b0a2eefca70b2ce32a5809992227e75a6",
+ "reference": "f5ac2c0b0a2eefca70b2ce32a5809992227e75a6",
"shasum": ""
},
"require": {
@@ -3122,7 +3123,7 @@
"php": ">=5.3.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8"
+ "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
},
"type": "library",
"extra": {
@@ -3166,9 +3167,9 @@
],
"support": {
"issues": "https://github.com/Masterminds/html5-php/issues",
- "source": "https://github.com/Masterminds/html5-php/tree/2.8.1"
+ "source": "https://github.com/Masterminds/html5-php/tree/2.9.0"
},
- "time": "2023-05-10T11:58:31+00:00"
+ "time": "2024-03-31T07:05:07+00:00"
},
{
"name": "monolog/monolog",
@@ -4325,16 +4326,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.12.2",
+ "version": "v0.12.3",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "9185c66c2165bbf4d71de78a69dccf4974f9538d"
+ "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/9185c66c2165bbf4d71de78a69dccf4974f9538d",
- "reference": "9185c66c2165bbf4d71de78a69dccf4974f9538d",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73",
+ "reference": "b6b6cce7d3ee8fbf31843edce5e8f5a72eff4a73",
"shasum": ""
},
"require": {
@@ -4398,9 +4399,9 @@
],
"support": {
"issues": "https://github.com/bobthecow/psysh/issues",
- "source": "https://github.com/bobthecow/psysh/tree/v0.12.2"
+ "source": "https://github.com/bobthecow/psysh/tree/v0.12.3"
},
- "time": "2024-03-17T01:53:00+00:00"
+ "time": "2024-04-02T15:57:53+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -4629,16 +4630,16 @@
},
{
"name": "spatie/db-dumper",
- "version": "3.4.2",
+ "version": "3.5.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/db-dumper.git",
- "reference": "59beef7ad612ca7463dfddb64de6e038eb59e0d7"
+ "reference": "d6519cd43cb8dacec448e97fb713240f9467d147"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/db-dumper/zipball/59beef7ad612ca7463dfddb64de6e038eb59e0d7",
- "reference": "59beef7ad612ca7463dfddb64de6e038eb59e0d7",
+ "url": "https://api.github.com/repos/spatie/db-dumper/zipball/d6519cd43cb8dacec448e97fb713240f9467d147",
+ "reference": "d6519cd43cb8dacec448e97fb713240f9467d147",
"shasum": ""
},
"require": {
@@ -4676,7 +4677,7 @@
"spatie"
],
"support": {
- "source": "https://github.com/spatie/db-dumper/tree/3.4.2"
+ "source": "https://github.com/spatie/db-dumper/tree/3.5.0"
},
"funding": [
{
@@ -4688,7 +4689,7 @@
"type": "github"
}
],
- "time": "2023-12-25T11:42:15+00:00"
+ "time": "2024-04-08T07:24:04+00:00"
},
{
"name": "spatie/image-optimizer",
@@ -5305,16 +5306,16 @@
},
{
"name": "symfony/console",
- "version": "v6.4.4",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "0d9e4eb5ad413075624378f474c4167ea202de78"
+ "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78",
- "reference": "0d9e4eb5ad413075624378f474c4167ea202de78",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a2708a5da5c87d1d0d52937bdeac625df659e11f",
+ "reference": "a2708a5da5c87d1d0d52937bdeac625df659e11f",
"shasum": ""
},
"require": {
@@ -5379,7 +5380,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.4"
+ "source": "https://github.com/symfony/console/tree/v6.4.6"
},
"funding": [
{
@@ -5395,7 +5396,7 @@
"type": "tidelift"
}
],
- "time": "2024-02-22T20:27:10+00:00"
+ "time": "2024-03-29T19:07:53+00:00"
},
{
"name": "symfony/css-selector",
@@ -5598,16 +5599,16 @@
},
{
"name": "symfony/error-handler",
- "version": "v6.4.4",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "c725219bdf2afc59423c32793d5019d2a904e13a"
+ "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/c725219bdf2afc59423c32793d5019d2a904e13a",
- "reference": "c725219bdf2afc59423c32793d5019d2a904e13a",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/64db1c1802e3a4557e37ba33031ac39f452ac5d4",
+ "reference": "64db1c1802e3a4557e37ba33031ac39f452ac5d4",
"shasum": ""
},
"require": {
@@ -5653,7 +5654,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v6.4.4"
+ "source": "https://github.com/symfony/error-handler/tree/v6.4.6"
},
"funding": [
{
@@ -5669,7 +5670,7 @@
"type": "tidelift"
}
],
- "time": "2024-02-22T20:27:10+00:00"
+ "time": "2024-03-19T11:56:30+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -5753,16 +5754,16 @@
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v3.4.0",
+ "version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "a76aed96a42d2b521153fb382d418e30d18b59df"
+ "reference": "4e64b49bf370ade88e567de29465762e316e4224"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df",
- "reference": "a76aed96a42d2b521153fb382d418e30d18b59df",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/4e64b49bf370ade88e567de29465762e316e4224",
+ "reference": "4e64b49bf370ade88e567de29465762e316e4224",
"shasum": ""
},
"require": {
@@ -5809,7 +5810,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0"
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -5825,7 +5826,7 @@
"type": "tidelift"
}
],
- "time": "2023-05-23T14:45:45+00:00"
+ "time": "2024-01-23T14:51:35+00:00"
},
{
"name": "symfony/finder",
@@ -5970,16 +5971,16 @@
},
{
"name": "symfony/http-kernel",
- "version": "v6.4.5",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "f6947cb939d8efee137797382cb4db1af653ef75"
+ "reference": "060038863743fd0cd982be06acecccf246d35653"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f6947cb939d8efee137797382cb4db1af653ef75",
- "reference": "f6947cb939d8efee137797382cb4db1af653ef75",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/060038863743fd0cd982be06acecccf246d35653",
+ "reference": "060038863743fd0cd982be06acecccf246d35653",
"shasum": ""
},
"require": {
@@ -6063,7 +6064,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v6.4.5"
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.6"
},
"funding": [
{
@@ -6079,20 +6080,20 @@
"type": "tidelift"
}
],
- "time": "2024-03-04T21:00:47+00:00"
+ "time": "2024-04-03T06:09:15+00:00"
},
{
"name": "symfony/mailer",
- "version": "v6.4.4",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "791c5d31a8204cf3db0c66faab70282307f4376b"
+ "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/791c5d31a8204cf3db0c66faab70282307f4376b",
- "reference": "791c5d31a8204cf3db0c66faab70282307f4376b",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/677f34a6f4b4559e08acf73ae0aec460479e5859",
+ "reference": "677f34a6f4b4559e08acf73ae0aec460479e5859",
"shasum": ""
},
"require": {
@@ -6143,7 +6144,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v6.4.4"
+ "source": "https://github.com/symfony/mailer/tree/v6.4.6"
},
"funding": [
{
@@ -6159,20 +6160,20 @@
"type": "tidelift"
}
],
- "time": "2024-02-03T21:33:47+00:00"
+ "time": "2024-03-27T21:14:17+00:00"
},
{
"name": "symfony/mime",
- "version": "v6.4.3",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "5017e0a9398c77090b7694be46f20eb796262a34"
+ "reference": "14762b86918823cb42e3558cdcca62e58b5227fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34",
- "reference": "5017e0a9398c77090b7694be46f20eb796262a34",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/14762b86918823cb42e3558cdcca62e58b5227fe",
+ "reference": "14762b86918823cb42e3558cdcca62e58b5227fe",
"shasum": ""
},
"require": {
@@ -6193,6 +6194,7 @@
"league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.4|^7.0",
"symfony/property-access": "^5.4|^6.0|^7.0",
"symfony/property-info": "^5.4|^6.0|^7.0",
"symfony/serializer": "^6.3.2|^7.0"
@@ -6227,7 +6229,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v6.4.3"
+ "source": "https://github.com/symfony/mime/tree/v6.4.6"
},
"funding": [
{
@@ -6243,7 +6245,7 @@
"type": "tidelift"
}
],
- "time": "2024-01-30T08:32:12+00:00"
+ "time": "2024-03-21T19:36:20+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -7099,16 +7101,16 @@
},
{
"name": "symfony/routing",
- "version": "v6.4.5",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4"
+ "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4",
- "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/f2591fd1f8c6e3734656b5d6b3829e8bf81f507c",
+ "reference": "f2591fd1f8c6e3734656b5d6b3829e8bf81f507c",
"shasum": ""
},
"require": {
@@ -7162,7 +7164,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v6.4.5"
+ "source": "https://github.com/symfony/routing/tree/v6.4.6"
},
"funding": [
{
@@ -7178,20 +7180,20 @@
"type": "tidelift"
}
],
- "time": "2024-02-27T12:33:30+00:00"
+ "time": "2024-03-28T13:28:49+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.4.1",
+ "version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0"
+ "reference": "11bbf19a0fb7b36345861e85c5768844c552906e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0",
- "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/11bbf19a0fb7b36345861e85c5768844c552906e",
+ "reference": "11bbf19a0fb7b36345861e85c5768844c552906e",
"shasum": ""
},
"require": {
@@ -7244,7 +7246,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.4.1"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -7260,7 +7262,7 @@
"type": "tidelift"
}
],
- "time": "2023-12-26T14:02:43+00:00"
+ "time": "2023-12-19T21:51:00+00:00"
},
{
"name": "symfony/string",
@@ -7445,16 +7447,16 @@
},
{
"name": "symfony/translation-contracts",
- "version": "v3.4.1",
+ "version": "v3.4.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "06450585bf65e978026bda220cdebca3f867fde7"
+ "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7",
- "reference": "06450585bf65e978026bda220cdebca3f867fde7",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/43810bdb2ddb5400e5c5e778e27b210a0ca83b6b",
+ "reference": "43810bdb2ddb5400e5c5e778e27b210a0ca83b6b",
"shasum": ""
},
"require": {
@@ -7503,7 +7505,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.4.2"
},
"funding": [
{
@@ -7519,7 +7521,7 @@
"type": "tidelift"
}
],
- "time": "2023-12-26T14:02:43+00:00"
+ "time": "2024-01-23T14:51:35+00:00"
},
{
"name": "symfony/uid",
@@ -7597,16 +7599,16 @@
},
{
"name": "symfony/var-dumper",
- "version": "v6.4.4",
+ "version": "v6.4.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "b439823f04c98b84d4366c79507e9da6230944b1"
+ "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1",
- "reference": "b439823f04c98b84d4366c79507e9da6230944b1",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/95bd2706a97fb875185b51ecaa6112ec184233d4",
+ "reference": "95bd2706a97fb875185b51ecaa6112ec184233d4",
"shasum": ""
},
"require": {
@@ -7662,7 +7664,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v6.4.4"
+ "source": "https://github.com/symfony/var-dumper/tree/v6.4.6"
},
"funding": [
{
@@ -7678,7 +7680,7 @@
"type": "tidelift"
}
],
- "time": "2024-02-15T11:23:52+00:00"
+ "time": "2024-03-19T11:56:30+00:00"
},
{
"name": "theodorejb/polycast",
@@ -8858,16 +8860,16 @@
},
{
"name": "laravel/pint",
- "version": "v1.15.0",
+ "version": "v1.15.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/pint.git",
- "reference": "c52de679b3ac01207016c179d7ce173e4be128c4"
+ "reference": "5f288b5e79938cc72f5c298d384e639de87507c6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pint/zipball/c52de679b3ac01207016c179d7ce173e4be128c4",
- "reference": "c52de679b3ac01207016c179d7ce173e4be128c4",
+ "url": "https://api.github.com/repos/laravel/pint/zipball/5f288b5e79938cc72f5c298d384e639de87507c6",
+ "reference": "5f288b5e79938cc72f5c298d384e639de87507c6",
"shasum": ""
},
"require": {
@@ -8878,13 +8880,13 @@
"php": "^8.1.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.49.0",
- "illuminate/view": "^10.43.0",
- "larastan/larastan": "^2.8.1",
+ "friendsofphp/php-cs-fixer": "^3.52.1",
+ "illuminate/view": "^10.48.4",
+ "larastan/larastan": "^2.9.2",
"laravel-zero/framework": "^10.3.0",
- "mockery/mockery": "^1.6.7",
+ "mockery/mockery": "^1.6.11",
"nunomaduro/termwind": "^1.15.1",
- "pestphp/pest": "^2.33.6"
+ "pestphp/pest": "^2.34.5"
},
"bin": [
"builds/pint"
@@ -8920,7 +8922,7 @@
"issues": "https://github.com/laravel/pint/issues",
"source": "https://github.com/laravel/pint"
},
- "time": "2024-03-26T16:40:24+00:00"
+ "time": "2024-04-02T14:28:47+00:00"
},
{
"name": "laravel/sail",
@@ -10053,16 +10055,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "1.27.0",
+ "version": "1.28.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757"
+ "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757",
- "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb",
+ "reference": "cd06d6b1a1b3c75b0b83f97577869fd85a3cd4fb",
"shasum": ""
},
"require": {
@@ -10094,22 +10096,22 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.28.0"
},
- "time": "2024-03-21T13:14:53+00:00"
+ "time": "2024-04-03T18:51:33+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "1.10.65",
+ "version": "1.10.66",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6"
+ "reference": "94779c987e4ebd620025d9e5fdd23323903950bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3c657d057a0b7ecae19cb12db446bbc99d8839c6",
- "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/94779c987e4ebd620025d9e5fdd23323903950bd",
+ "reference": "94779c987e4ebd620025d9e5fdd23323903950bd",
"shasum": ""
},
"require": {
@@ -10158,7 +10160,7 @@
"type": "tidelift"
}
],
- "time": "2024-03-23T10:30:26+00:00"
+ "time": "2024-03-28T16:17:31+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -10582,6 +10584,68 @@
],
"time": "2024-01-22T14:35:40+00:00"
},
+ {
+ "name": "ryoluo/sail-ssl",
+ "version": "v1.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ryoluo/sail-ssl.git",
+ "reference": "afc8cbdbc27a41bbb32a835df02e38a9f937f2bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ryoluo/sail-ssl/zipball/afc8cbdbc27a41bbb32a835df02e38a9f937f2bc",
+ "reference": "afc8cbdbc27a41bbb32a835df02e38a9f937f2bc",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/contracts": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^8.0|^9.0|^10.0|^11.0",
+ "php": "^7.3|^8.0|^8.1|^8.2|^8.3"
+ },
+ "require-dev": {
+ "laravel/sail": "^1.14",
+ "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0",
+ "phpunit/phpunit": "^9.5|^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Ryoluo\\SailSsl\\SailSslServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ryoluo\\SailSsl\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ryo Kobayashi",
+ "email": "ryoluo@lotus-base.com"
+ }
+ ],
+ "description": "Laravel Sail plugin to enable SSL (HTTPS) connection with Nginx.",
+ "keywords": [
+ "docker",
+ "laravel",
+ "nginx",
+ "sail",
+ "ssl"
+ ],
+ "support": {
+ "issues": "https://github.com/ryoluo/sail-ssl/issues",
+ "source": "https://github.com/ryoluo/sail-ssl"
+ },
+ "time": "2024-03-15T18:32:51+00:00"
+ },
{
"name": "sebastian/cli-parser",
"version": "2.0.1",
@@ -11631,16 +11695,16 @@
},
{
"name": "spatie/ignition",
- "version": "1.12.0",
+ "version": "1.13.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/ignition.git",
- "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d"
+ "reference": "889bf1dfa59e161590f677728b47bf4a6893983b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/ignition/zipball/5b6f801c605a593106b623e45ca41496a6e7d56d",
- "reference": "5b6f801c605a593106b623e45ca41496a6e7d56d",
+ "url": "https://api.github.com/repos/spatie/ignition/zipball/889bf1dfa59e161590f677728b47bf4a6893983b",
+ "reference": "889bf1dfa59e161590f677728b47bf4a6893983b",
"shasum": ""
},
"require": {
@@ -11710,20 +11774,20 @@
"type": "github"
}
],
- "time": "2024-01-03T15:49:39+00:00"
+ "time": "2024-03-29T14:03:47+00:00"
},
{
"name": "spatie/laravel-ignition",
- "version": "2.4.2",
+ "version": "2.5.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-ignition.git",
- "reference": "351504f4570e32908839fc5a2dc53bf77d02f85e"
+ "reference": "0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/351504f4570e32908839fc5a2dc53bf77d02f85e",
- "reference": "351504f4570e32908839fc5a2dc53bf77d02f85e",
+ "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9",
+ "reference": "0c864b3cbd66ce67a2096c5f743e07ce8f1d6ab9",
"shasum": ""
},
"require": {
@@ -11733,7 +11797,7 @@
"illuminate/support": "^10.0|^11.0",
"php": "^8.1",
"spatie/flare-client-php": "^1.3.5",
- "spatie/ignition": "^1.9",
+ "spatie/ignition": "^1.13",
"symfony/console": "^6.2.3|^7.0",
"symfony/var-dumper": "^6.2.3|^7.0"
},
@@ -11802,7 +11866,7 @@
"type": "github"
}
],
- "time": "2024-02-09T16:08:40+00:00"
+ "time": "2024-04-02T06:30:22+00:00"
},
{
"name": "symfony/yaml",
diff --git a/docker-compose.yml b/docker-compose.yml
index 23e5942123..281e1a8208 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,5 +1,24 @@
version: '3'
services:
+ nginx:
+ image: 'nginx:latest'
+ ports:
+ - '${HTTP_PORT:-8000}:80'
+ - '${SSL_PORT:-443}:443'
+ environment:
+ - SSL_PORT=${SSL_PORT:-443}
+ - APP_SERVICE=${APP_SERVICE:-laravel.test}
+ - SERVER_NAME=${SERVER_NAME:-localhost}
+ - SSL_DOMAIN=${SSL_DOMAIN:-localhost}
+ - SSL_ALT_NAME=${SSL_ALT_NAME:-DNS:localhost}
+ volumes:
+ - 'sail-nginx:/etc/nginx/certs'
+ - './vendor/ryoluo/sail-ssl/nginx/templates:/etc/nginx/templates'
+ - './vendor/ryoluo/sail-ssl/nginx/generate-ssl-cert.sh:/docker-entrypoint.d/99-generate-ssl-cert.sh'
+ depends_on:
+ - ${APP_SERVICE:-laravel.test}
+ networks:
+ - sail
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.3
@@ -75,6 +94,8 @@ networks:
sail:
driver: bridge
volumes:
+ sail-nginx:
+ driver: local
sail-mysql:
driver: local
sail-redis:
diff --git a/public/vendor/livewire/livewire.js b/public/vendor/livewire/livewire.js
index 3d80e5c09e..f237ace4bc 100644
--- a/public/vendor/livewire/livewire.js
+++ b/public/vendor/livewire/livewire.js
@@ -312,14 +312,18 @@
return this.get(key).forEach(callback);
}
};
- function dispatch(el, name, detail = {}, bubbles = true) {
- el.dispatchEvent(new CustomEvent(name, {
+ function dispatch(target, name, detail = {}, bubbles = true) {
+ target.dispatchEvent(new CustomEvent(name, {
detail,
bubbles,
composed: true,
cancelable: true
}));
}
+ function listen(target, name, handler4) {
+ target.addEventListener(name, handler4);
+ return () => target.removeEventListener(name, handler4);
+ }
function isObjecty(subject) {
return typeof subject === "object" && subject !== null;
}
@@ -465,6 +469,13 @@
}
};
el.addEventListener("change", eventHandler);
+ component.$wire.$watch(property, (value) => {
+ if (!el.isConnected)
+ return;
+ if (value === null || value === "") {
+ el.value = "";
+ }
+ });
let clearFileInputValue = () => {
el.value = null;
};
@@ -2014,7 +2025,6 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
"checked",
"required",
"readonly",
- "hidden",
"open",
"selected",
"autofocus",
@@ -2222,7 +2232,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
get raw() {
return raw;
},
- version: "3.13.7",
+ version: "3.13.8",
flushAndStopDeferringMutations,
dontAutoEvaluateFunctions,
disableEffectScheduling,
@@ -3295,7 +3305,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
});
if (modifiers.includes("fill")) {
if ([void 0, null, ""].includes(getValue()) || el.type === "checkbox" && Array.isArray(getValue())) {
- el.dispatchEvent(new Event(event, {}));
+ setValue(getInputValue(el, modifiers, { target: el }, getValue()));
}
}
if (!el._x_removeModelListeners)
@@ -3364,12 +3374,25 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
return option.value || option.text;
});
} else {
+ let newValue;
+ if (el.type === "radio") {
+ if (event.target.checked) {
+ newValue = event.target.value;
+ } else {
+ newValue = currentValue;
+ }
+ } else {
+ newValue = event.target.value;
+ }
if (modifiers.includes("number")) {
- return safeParseNumber(event.target.value);
+ return safeParseNumber(newValue);
} else if (modifiers.includes("boolean")) {
- return safeParseBoolean(event.target.value);
+ return safeParseBoolean(newValue);
+ } else if (modifiers.includes("trim")) {
+ return newValue.trim();
+ } else {
+ return newValue;
}
- return modifiers.includes("trim") ? event.target.value.trim() : event.target.value;
}
});
}
@@ -3418,7 +3441,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
});
});
mapAttributes(startingWith(":", into(prefix("bind:"))));
- var handler2 = (el, { value, modifiers, expression, original }, { effect: effect3 }) => {
+ var handler2 = (el, { value, modifiers, expression, original }, { effect: effect3, cleanup: cleanup22 }) => {
if (!value) {
let bindingProviders = {};
injectBindingProviders(bindingProviders);
@@ -3440,6 +3463,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
}
mutateDom(() => bind(el, value, result, modifiers));
}));
+ cleanup22(() => {
+ el._x_undoAddedClasses && el._x_undoAddedClasses();
+ el._x_undoAddedStyles && el._x_undoAddedStyles();
+ });
};
handler2.inline = (el, { value, modifiers, expression }) => {
if (!value)
@@ -4349,25 +4376,15 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
return component.$wire.set(name, !component.$wire.get(name), live);
});
wireProperty("$watch", (component) => (path, callback) => {
- let firstTime = true;
- let oldValue = void 0;
- module_default.effect(() => {
- let value = dataGet(component.reactive, path);
- JSON.stringify(value);
- if (!firstTime) {
- queueMicrotask(() => {
- callback(value, oldValue);
- oldValue = value;
- });
- } else {
- oldValue = value;
- }
- firstTime = false;
- });
+ let getter = () => {
+ return dataGet(component.reactive, path);
+ };
+ let unwatch = module_default.watch(getter, callback);
+ component.addCleanup(unwatch);
});
wireProperty("$refresh", (component) => component.$wire.$commit);
wireProperty("$commit", (component) => async () => await requestCommit(component));
- wireProperty("$on", (component) => (...params) => listen(component, ...params));
+ wireProperty("$on", (component) => (...params) => listen2(component, ...params));
wireProperty("$dispatch", (component) => (...params) => dispatch3(component, ...params));
wireProperty("$dispatchSelf", (component) => (...params) => dispatchSelf(component, ...params));
wireProperty("$dispatchTo", () => (...params) => dispatchTo(...params));
@@ -4574,7 +4591,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
dispatchEvent(target.el, name, params, false);
});
}
- function listen(component, name, callback) {
+ function listen2(component, name, callback) {
component.el.addEventListener(name, (e) => {
callback(e.detail);
});
@@ -5770,7 +5787,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
return storage.getItem(key) !== null;
}
function storageGet(key, storage) {
- return JSON.parse(storage.getItem(key, storage));
+ let value = storage.getItem(key, storage);
+ if (value === void 0)
+ return;
+ return JSON.parse(value);
}
function storageSet(key, value, storage) {
storage.setItem(key, JSON.stringify(value));
@@ -7067,18 +7087,72 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
var module_default6 = src_default6;
// js/plugins/navigate/history.js
+ var Snapshot = class {
+ constructor(url, html) {
+ this.url = url;
+ this.html = html;
+ }
+ };
+ var snapshotCache = {
+ currentKey: null,
+ currentUrl: null,
+ keys: [],
+ lookup: {},
+ limit: 10,
+ has(location) {
+ return this.lookup[location] !== void 0;
+ },
+ retrieve(location) {
+ let snapshot = this.lookup[location];
+ if (snapshot === void 0)
+ throw "No back button cache found for current location: " + location;
+ return snapshot;
+ },
+ replace(key, snapshot) {
+ if (this.has(key)) {
+ this.lookup[key] = snapshot;
+ } else {
+ this.push(key, snapshot);
+ }
+ },
+ push(key, snapshot) {
+ this.lookup[key] = snapshot;
+ let index = this.keys.indexOf(key);
+ if (index > -1)
+ this.keys.splice(index, 1);
+ this.keys.unshift(key);
+ this.trim();
+ },
+ trim() {
+ for (let key of this.keys.splice(this.limit)) {
+ delete this.lookup[key];
+ }
+ }
+ };
function updateCurrentPageHtmlInHistoryStateForLaterBackButtonClicks() {
let url = new URL(window.location.href, document.baseURI);
replaceUrl(url, document.documentElement.outerHTML);
}
- function whenTheBackOrForwardButtonIsClicked(callback) {
+ function updateCurrentPageHtmlInSnapshotCacheForLaterBackButtonClicks(key, url) {
+ let html = document.documentElement.outerHTML;
+ snapshotCache.replace(key, new Snapshot(url, html));
+ }
+ function whenTheBackOrForwardButtonIsClicked(registerFallback, handleHtml) {
+ let fallback2;
+ registerFallback((i) => fallback2 = i);
window.addEventListener("popstate", (e) => {
let state = e.state || {};
let alpine = state.alpine || {};
- if (!alpine._html)
+ if (Object.keys(state).length === 0)
return;
- let html = fromSessionStorage(alpine._html);
- callback(html);
+ if (!alpine.snapshotIdx)
+ return;
+ if (snapshotCache.has(alpine.snapshotIdx)) {
+ let snapshot = snapshotCache.retrieve(alpine.snapshotIdx);
+ handleHtml(snapshot.html, snapshot.url, snapshotCache.currentUrl, snapshotCache.currentKey);
+ } else {
+ fallback2(alpine.url);
+ }
});
}
function updateUrlAndStoreLatestHtmlForFutureBackButtons(html, destination) {
@@ -7091,14 +7165,17 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
updateUrl("replaceState", url, html);
}
function updateUrl(method, url, html) {
- let key = new Date().getTime();
- tryToStoreInSession(key, html);
+ let key = url.toString() + "-" + Math.random();
+ method === "pushState" ? snapshotCache.push(key, new Snapshot(url, html)) : snapshotCache.replace(key = snapshotCache.currentKey ?? key, new Snapshot(url, html));
let state = history.state || {};
if (!state.alpine)
state.alpine = {};
- state.alpine._html = key;
+ state.alpine.snapshotIdx = key;
+ state.alpine.url = url.toString();
try {
- history[method](state, document.title, url);
+ history[method](state, JSON.stringify(document.title), url);
+ snapshotCache.currentKey = key;
+ snapshotCache.currentUrl = url;
} catch (error2) {
if (error2 instanceof DOMException && error2.name === "SecurityError") {
console.error("Livewire: You can't use wire:navigate with a link to a different root domain: " + url);
@@ -7106,23 +7183,6 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
console.error(error2);
}
}
- function fromSessionStorage(timestamp) {
- let state = JSON.parse(sessionStorage.getItem("alpine:" + timestamp));
- return state;
- }
- function tryToStoreInSession(timestamp, value) {
- try {
- sessionStorage.setItem("alpine:" + timestamp, JSON.stringify(value));
- } catch (error2) {
- if (![22, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14].includes(error2.code))
- return;
- let oldestTimestamp = Object.keys(sessionStorage).map((key) => Number(key.replace("alpine:", ""))).sort().shift();
- if (!oldestTimestamp)
- return;
- sessionStorage.removeItem("alpine:" + oldestTimestamp);
- tryToStoreInSession(timestamp, value);
- }
- }
// js/plugins/navigate/links.js
function whenThisLinkIsPressed(el, callback) {
@@ -7177,10 +7237,13 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
function createUrlObjectFromString(urlString) {
return new URL(urlString, document.baseURI);
}
+ function getUriStringFromUrlObject(urlObject) {
+ return urlObject.pathname + urlObject.search + urlObject.hash;
+ }
// js/plugins/navigate/fetch.js
function fetchHtml(destination, callback) {
- let uri = destination.pathname + destination.search;
+ let uri = getUriStringFromUrlObject(destination);
performFetch(uri, (html, finalDestination) => {
callback(html, finalDestination);
});
@@ -7197,7 +7260,11 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
});
let finalDestination;
fetch(uri, options).then((response) => {
+ let destination = createUrlObjectFromString(uri);
finalDestination = createUrlObjectFromString(response.url);
+ if (destination.pathname + destination.search === finalDestination.pathname + finalDestination.search) {
+ finalDestination.hash = destination.hash;
+ }
return response.text();
}).then((html) => {
callback(html, finalDestination);
@@ -7207,24 +7274,24 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
// js/plugins/navigate/prefetch.js
var prefetches = {};
function prefetchHtml(destination, callback) {
- let path = destination.pathname;
- if (prefetches[path])
+ let uri = getUriStringFromUrlObject(destination);
+ if (prefetches[uri])
return;
- prefetches[path] = { finished: false, html: null, whenFinished: () => {
+ prefetches[uri] = { finished: false, html: null, whenFinished: () => {
} };
- performFetch(path, (html, routedUri) => {
+ performFetch(uri, (html, routedUri) => {
callback(html, routedUri);
});
}
function storeThePrefetchedHtmlForWhenALinkIsClicked(html, destination, finalDestination) {
- let state = prefetches[destination.pathname];
+ let state = prefetches[getUriStringFromUrlObject(destination)];
state.html = html;
state.finished = true;
state.finalDestination = finalDestination;
state.whenFinished();
}
function getPretchedHtmlOr(destination, receive, ifNoPrefetchExists) {
- let uri = destination.pathname + destination.search;
+ let uri = getUriStringFromUrlObject(destination);
if (!prefetches[uri])
return ifNoPrefetchExists();
if (prefetches[uri].finished) {
@@ -7573,7 +7640,15 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
var autofocus = false;
function navigate_default(Alpine3) {
Alpine3.navigate = (url) => {
- navigateTo(createUrlObjectFromString(url));
+ let destination = createUrlObjectFromString(url);
+ let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", {
+ url: destination,
+ history: false,
+ cached: false
+ });
+ if (prevented)
+ return;
+ navigateTo(destination);
};
Alpine3.navigate.disableProgressBar = () => {
showProgressBar = false;
@@ -7593,11 +7668,18 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
storeThePrefetchedHtmlForWhenALinkIsClicked(html, destination, finalDestination);
});
whenItIsReleased(() => {
+ let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", {
+ url: destination,
+ history: false,
+ cached: false
+ });
+ if (prevented)
+ return;
navigateTo(destination);
});
});
});
- function navigateTo(destination) {
+ function navigateTo(destination, shouldPushToHistoryState = true) {
showProgressBar && showAndStartProgressBar();
fetchHtmlOrUsePrefetchedHtml(destination, (html, finalDestination) => {
fireEventForOtherLibariesToHookInto("alpine:navigating");
@@ -7609,28 +7691,55 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
enablePersist && storePersistantElementsForLater((persistedEl) => {
packUpPersistedTeleports(persistedEl);
});
+ if (shouldPushToHistoryState) {
+ updateUrlAndStoreLatestHtmlForFutureBackButtons(html, finalDestination);
+ } else {
+ replaceUrl(finalDestination, html);
+ }
swapCurrentPageWithNewHtml(html, (afterNewScriptsAreDoneLoading) => {
removeAnyLeftOverStaleTeleportTargets(document.body);
enablePersist && putPersistantElementsBack((persistedEl, newStub) => {
unPackPersistedTeleports(persistedEl);
});
restoreScrollPositionOrScrollToTop();
- updateUrlAndStoreLatestHtmlForFutureBackButtons(html, finalDestination);
- fireEventForOtherLibariesToHookInto("alpine:navigated");
afterNewScriptsAreDoneLoading(() => {
andAfterAllThis(() => {
setTimeout(() => {
autofocus && autofocusElementsWithTheAutofocusAttribute();
});
nowInitializeAlpineOnTheNewPage(Alpine3);
+ fireEventForOtherLibariesToHookInto("alpine:navigated");
});
});
});
});
});
}
- whenTheBackOrForwardButtonIsClicked((html) => {
+ whenTheBackOrForwardButtonIsClicked((ifThePageBeingVisitedHasntBeenCached) => {
+ ifThePageBeingVisitedHasntBeenCached((url) => {
+ let destination = createUrlObjectFromString(url);
+ let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", {
+ url: destination,
+ history: true,
+ cached: false
+ });
+ if (prevented)
+ return;
+ let shouldPushToHistoryState = false;
+ navigateTo(destination, shouldPushToHistoryState);
+ });
+ }, (html, url, currentPageUrl, currentPageKey) => {
+ let destination = createUrlObjectFromString(url);
+ let prevented = fireEventForOtherLibariesToHookInto("alpine:navigate", {
+ url: destination,
+ history: true,
+ cached: true
+ });
+ if (prevented)
+ return;
storeScrollInformationInHtmlBeforeNavigatingAway();
+ fireEventForOtherLibariesToHookInto("alpine:navigating");
+ updateCurrentPageHtmlInSnapshotCacheForLaterBackButtonClicks(currentPageUrl, currentPageKey);
preventAlpineFromPickingUpDomChanges(Alpine3, (andAfterAllThis) => {
enablePersist && storePersistantElementsForLater((persistedEl) => {
packUpPersistedTeleports(persistedEl);
@@ -7641,10 +7750,10 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
unPackPersistedTeleports(persistedEl);
});
restoreScrollPositionOrScrollToTop();
- fireEventForOtherLibariesToHookInto("alpine:navigated");
andAfterAllThis(() => {
autofocus && autofocusElementsWithTheAutofocusAttribute();
nowInitializeAlpineOnTheNewPage(Alpine3);
+ fireEventForOtherLibariesToHookInto("alpine:navigated");
});
});
});
@@ -7667,8 +7776,14 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
});
});
}
- function fireEventForOtherLibariesToHookInto(eventName) {
- document.dispatchEvent(new CustomEvent(eventName, { bubbles: true }));
+ function fireEventForOtherLibariesToHookInto(name, detail) {
+ let event = new CustomEvent(name, {
+ cancelable: true,
+ bubbles: true,
+ detail
+ });
+ document.dispatchEvent(event);
+ return event.defaultPrevented;
}
function nowInitializeAlpineOnTheNewPage(Alpine3) {
Alpine3.initTree(document.body, void 0, (el, skip) => {
@@ -7878,6 +7993,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
let entries = search.split("&").map((i) => i.split("="));
let data2 = /* @__PURE__ */ Object.create(null);
entries.forEach(([key, value]) => {
+ if (typeof value == "undefined")
+ return;
value = decodeURIComponent(value.replaceAll("+", "%20"));
if (!key.includes("[")) {
data2[key] = value;
@@ -8454,110 +8571,29 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
}
}
- // js/features/supportDisablingFormsDuringRequest.js
- var cleanupStackByComponentId = {};
- on2("element.init", ({ el, component }) => setTimeout(() => {
- let directives2 = getDirectives(el);
- if (directives2.missing("submit"))
- return;
- el.addEventListener("submit", () => {
- cleanupStackByComponentId[component.id] = [];
- module_default.walk(component.el, (node, skip) => {
- if (!el.contains(node))
- return;
- if (node.hasAttribute("wire:ignore"))
- return skip();
- if (node.tagName.toLowerCase() === "button" && node.type === "submit" || node.tagName.toLowerCase() === "select" || node.tagName.toLowerCase() === "input" && (node.type === "checkbox" || node.type === "radio")) {
- if (!node.disabled)
- cleanupStackByComponentId[component.id].push(() => node.disabled = false);
- node.disabled = true;
- } else if (node.tagName.toLowerCase() === "input" || node.tagName.toLowerCase() === "textarea") {
- if (!node.readOnly)
- cleanupStackByComponentId[component.id].push(() => node.readOnly = false);
- node.readOnly = true;
- }
- });
- });
- }));
- on2("commit", ({ component, respond }) => {
- respond(() => {
- cleanup2(component);
- });
- });
- function cleanup2(component) {
- if (!cleanupStackByComponentId[component.id])
- return;
- while (cleanupStackByComponentId[component.id].length > 0) {
- cleanupStackByComponentId[component.id].shift()();
- }
- }
-
- // js/features/supportPropsAndModelables.js
- on2("commit.pooling", ({ commits }) => {
- commits.forEach((commit) => {
- let component = commit.component;
- getDeepChildrenWithBindings(component, (child) => {
- child.$wire.$commit();
- });
- });
- });
- on2("commit.pooled", ({ pools }) => {
- let commits = getPooledCommits(pools);
- commits.forEach((commit) => {
- let component = commit.component;
- getDeepChildrenWithBindings(component, (child) => {
- colocateCommitsByComponent(pools, component, child);
- });
- });
+ // js/features/supportListeners.js
+ on2("effect", ({ component, effects }) => {
+ registerListeners(component, effects.listeners || []);
});
- function getPooledCommits(pools) {
- let commits = [];
- pools.forEach((pool) => {
- pool.commits.forEach((commit) => {
- commits.push(commit);
+ function registerListeners(component, listeners2) {
+ listeners2.forEach((name) => {
+ let handler4 = (e) => {
+ if (e.__livewire)
+ e.__livewire.receivedBy.push(component);
+ component.$wire.call("__dispatch", name, e.detail || {});
+ };
+ window.addEventListener(name, handler4);
+ component.addCleanup(() => window.removeEventListener(name, handler4));
+ component.el.addEventListener(name, (e) => {
+ if (!e.__livewire)
+ return;
+ if (e.bubbles)
+ return;
+ if (e.__livewire)
+ e.__livewire.receivedBy.push(component.id);
+ component.$wire.call("__dispatch", name, e.detail || {});
});
});
- return commits;
- }
- function colocateCommitsByComponent(pools, component, foreignComponent) {
- let pool = findPoolWithComponent(pools, component);
- let foreignPool = findPoolWithComponent(pools, foreignComponent);
- let foreignCommit = foreignPool.findCommitByComponent(foreignComponent);
- foreignPool.delete(foreignCommit);
- pool.add(foreignCommit);
- pools.forEach((pool2) => {
- if (pool2.empty())
- pools.delete(pool2);
- });
- }
- function findPoolWithComponent(pools, component) {
- for (let [idx, pool] of pools.entries()) {
- if (pool.hasCommitFor(component))
- return pool;
- }
- }
- function getDeepChildrenWithBindings(component, callback) {
- getDeepChildren(component, (child) => {
- if (hasReactiveProps(child) || hasWireModelableBindings(child)) {
- callback(child);
- }
- });
- }
- function hasReactiveProps(component) {
- let meta = component.snapshot.memo;
- let props = meta.props;
- return !!props;
- }
- function hasWireModelableBindings(component) {
- let meta = component.snapshot.memo;
- let bindings = meta.bindings;
- return !!bindings;
- }
- function getDeepChildren(component, callback) {
- component.children.forEach((child) => {
- callback(child);
- getDeepChildren(child, callback);
- });
}
// js/features/supportScriptsAndAssets.js
@@ -8660,42 +8696,6 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
return script;
}
- // js/features/supportFileDownloads.js
- on2("commit", ({ succeed }) => {
- succeed(({ effects }) => {
- let download = effects.download;
- if (!download)
- return;
- let urlObject = window.webkitURL || window.URL;
- let url = urlObject.createObjectURL(base64toBlob(download.content, download.contentType));
- let invisibleLink = document.createElement("a");
- invisibleLink.style.display = "none";
- invisibleLink.href = url;
- invisibleLink.download = download.name;
- document.body.appendChild(invisibleLink);
- invisibleLink.click();
- setTimeout(function() {
- urlObject.revokeObjectURL(url);
- }, 0);
- });
- });
- function base64toBlob(b64Data, contentType = "", sliceSize = 512) {
- const byteCharacters = atob(b64Data);
- const byteArrays = [];
- if (contentType === null)
- contentType = "";
- for (let offset2 = 0; offset2 < byteCharacters.length; offset2 += sliceSize) {
- let slice = byteCharacters.slice(offset2, offset2 + sliceSize);
- let byteNumbers = new Array(slice.length);
- for (let i = 0; i < slice.length; i++) {
- byteNumbers[i] = slice.charCodeAt(i);
- }
- let byteArray = new Uint8Array(byteNumbers);
- byteArrays.push(byteArray);
- }
- return new Blob(byteArrays, { type: contentType });
- }
-
// js/features/supportJsEvaluation.js
on2("effect", ({ component, effects }) => {
let js = effects.js;
@@ -8714,28 +8714,264 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
}
});
- // js/features/supportLazyLoading.js
- var componentsThatWantToBeBundled = /* @__PURE__ */ new WeakSet();
- var componentsThatAreLazy = /* @__PURE__ */ new WeakSet();
- on2("component.init", ({ component }) => {
- let memo = component.snapshot.memo;
- if (memo.lazyLoaded === void 0)
- return;
- componentsThatAreLazy.add(component);
- if (memo.lazyIsolated !== void 0 && memo.lazyIsolated === false) {
- componentsThatWantToBeBundled.add(component);
+ // js/morph.js
+ function morph2(component, el, html) {
+ let wrapperTag = el.parentElement ? el.parentElement.tagName.toLowerCase() : "div";
+ let wrapper = document.createElement(wrapperTag);
+ wrapper.innerHTML = html;
+ let parentComponent;
+ try {
+ parentComponent = closestComponent(el.parentElement);
+ } catch (e) {
}
- });
- on2("commit.pooling", ({ commits }) => {
- commits.forEach((commit) => {
- if (!componentsThatAreLazy.has(commit.component))
- return;
- if (componentsThatWantToBeBundled.has(commit.component)) {
- commit.isolate = false;
- componentsThatWantToBeBundled.delete(commit.component);
- } else {
- commit.isolate = true;
- }
+ parentComponent && (wrapper.__livewire = parentComponent);
+ let to = wrapper.firstElementChild;
+ to.__livewire = component;
+ trigger2("morph", { el, toEl: to, component });
+ module_default.morph(el, to, {
+ updating: (el2, toEl, childrenOnly, skip) => {
+ if (isntElement(el2))
+ return;
+ trigger2("morph.updating", { el: el2, toEl, component, skip, childrenOnly });
+ if (el2.__livewire_ignore === true)
+ return skip();
+ if (el2.__livewire_ignore_self === true)
+ childrenOnly();
+ if (isComponentRootEl(el2) && el2.getAttribute("wire:id") !== component.id)
+ return skip();
+ if (isComponentRootEl(el2))
+ toEl.__livewire = component;
+ },
+ updated: (el2) => {
+ if (isntElement(el2))
+ return;
+ trigger2("morph.updated", { el: el2, component });
+ },
+ removing: (el2, skip) => {
+ if (isntElement(el2))
+ return;
+ trigger2("morph.removing", { el: el2, component, skip });
+ },
+ removed: (el2) => {
+ if (isntElement(el2))
+ return;
+ trigger2("morph.removed", { el: el2, component });
+ },
+ adding: (el2) => {
+ trigger2("morph.adding", { el: el2, component });
+ },
+ added: (el2) => {
+ if (isntElement(el2))
+ return;
+ const closestComponentId = closestComponent(el2).id;
+ trigger2("morph.added", { el: el2 });
+ },
+ key: (el2) => {
+ if (isntElement(el2))
+ return;
+ return el2.hasAttribute(`wire:key`) ? el2.getAttribute(`wire:key`) : el2.hasAttribute(`wire:id`) ? el2.getAttribute(`wire:id`) : el2.id;
+ },
+ lookahead: false
+ });
+ }
+ function isntElement(el) {
+ return typeof el.hasAttribute !== "function";
+ }
+ function isComponentRootEl(el) {
+ return el.hasAttribute("wire:id");
+ }
+
+ // js/features/supportMorphDom.js
+ on2("effect", ({ component, effects }) => {
+ let html = effects.html;
+ if (!html)
+ return;
+ queueMicrotask(() => {
+ queueMicrotask(() => {
+ morph2(component, component.el, html);
+ });
+ });
+ });
+
+ // js/features/supportDispatches.js
+ on2("effect", ({ component, effects }) => {
+ dispatchEvents(component, effects.dispatches || []);
+ });
+ function dispatchEvents(component, dispatches) {
+ dispatches.forEach(({ name, params = {}, self = false, to }) => {
+ if (self)
+ dispatchSelf(component, name, params);
+ else if (to)
+ dispatchTo(to, name, params);
+ else
+ dispatch3(component, name, params);
+ });
+ }
+
+ // js/features/supportDisablingFormsDuringRequest.js
+ var cleanupStackByComponentId = {};
+ on2("element.init", ({ el, component }) => setTimeout(() => {
+ let directives2 = getDirectives(el);
+ if (directives2.missing("submit"))
+ return;
+ el.addEventListener("submit", () => {
+ cleanupStackByComponentId[component.id] = [];
+ module_default.walk(component.el, (node, skip) => {
+ if (!el.contains(node))
+ return;
+ if (node.hasAttribute("wire:ignore"))
+ return skip();
+ if (node.tagName.toLowerCase() === "button" && node.type === "submit" || node.tagName.toLowerCase() === "select" || node.tagName.toLowerCase() === "input" && (node.type === "checkbox" || node.type === "radio")) {
+ if (!node.disabled)
+ cleanupStackByComponentId[component.id].push(() => node.disabled = false);
+ node.disabled = true;
+ } else if (node.tagName.toLowerCase() === "input" || node.tagName.toLowerCase() === "textarea") {
+ if (!node.readOnly)
+ cleanupStackByComponentId[component.id].push(() => node.readOnly = false);
+ node.readOnly = true;
+ }
+ });
+ });
+ }));
+ on2("commit", ({ component, respond }) => {
+ respond(() => {
+ cleanup2(component);
+ });
+ });
+ function cleanup2(component) {
+ if (!cleanupStackByComponentId[component.id])
+ return;
+ while (cleanupStackByComponentId[component.id].length > 0) {
+ cleanupStackByComponentId[component.id].shift()();
+ }
+ }
+
+ // js/features/supportPropsAndModelables.js
+ on2("commit.pooling", ({ commits }) => {
+ commits.forEach((commit) => {
+ let component = commit.component;
+ getDeepChildrenWithBindings(component, (child) => {
+ child.$wire.$commit();
+ });
+ });
+ });
+ on2("commit.pooled", ({ pools }) => {
+ let commits = getPooledCommits(pools);
+ commits.forEach((commit) => {
+ let component = commit.component;
+ getDeepChildrenWithBindings(component, (child) => {
+ colocateCommitsByComponent(pools, component, child);
+ });
+ });
+ });
+ function getPooledCommits(pools) {
+ let commits = [];
+ pools.forEach((pool) => {
+ pool.commits.forEach((commit) => {
+ commits.push(commit);
+ });
+ });
+ return commits;
+ }
+ function colocateCommitsByComponent(pools, component, foreignComponent) {
+ let pool = findPoolWithComponent(pools, component);
+ let foreignPool = findPoolWithComponent(pools, foreignComponent);
+ let foreignCommit = foreignPool.findCommitByComponent(foreignComponent);
+ foreignPool.delete(foreignCommit);
+ pool.add(foreignCommit);
+ pools.forEach((pool2) => {
+ if (pool2.empty())
+ pools.delete(pool2);
+ });
+ }
+ function findPoolWithComponent(pools, component) {
+ for (let [idx, pool] of pools.entries()) {
+ if (pool.hasCommitFor(component))
+ return pool;
+ }
+ }
+ function getDeepChildrenWithBindings(component, callback) {
+ getDeepChildren(component, (child) => {
+ if (hasReactiveProps(child) || hasWireModelableBindings(child)) {
+ callback(child);
+ }
+ });
+ }
+ function hasReactiveProps(component) {
+ let meta = component.snapshot.memo;
+ let props = meta.props;
+ return !!props;
+ }
+ function hasWireModelableBindings(component) {
+ let meta = component.snapshot.memo;
+ let bindings = meta.bindings;
+ return !!bindings;
+ }
+ function getDeepChildren(component, callback) {
+ component.children.forEach((child) => {
+ callback(child);
+ getDeepChildren(child, callback);
+ });
+ }
+
+ // js/features/supportFileDownloads.js
+ on2("commit", ({ succeed }) => {
+ succeed(({ effects }) => {
+ let download = effects.download;
+ if (!download)
+ return;
+ let urlObject = window.webkitURL || window.URL;
+ let url = urlObject.createObjectURL(base64toBlob(download.content, download.contentType));
+ let invisibleLink = document.createElement("a");
+ invisibleLink.style.display = "none";
+ invisibleLink.href = url;
+ invisibleLink.download = download.name;
+ document.body.appendChild(invisibleLink);
+ invisibleLink.click();
+ setTimeout(function() {
+ urlObject.revokeObjectURL(url);
+ }, 0);
+ });
+ });
+ function base64toBlob(b64Data, contentType = "", sliceSize = 512) {
+ const byteCharacters = atob(b64Data);
+ const byteArrays = [];
+ if (contentType === null)
+ contentType = "";
+ for (let offset2 = 0; offset2 < byteCharacters.length; offset2 += sliceSize) {
+ let slice = byteCharacters.slice(offset2, offset2 + sliceSize);
+ let byteNumbers = new Array(slice.length);
+ for (let i = 0; i < slice.length; i++) {
+ byteNumbers[i] = slice.charCodeAt(i);
+ }
+ let byteArray = new Uint8Array(byteNumbers);
+ byteArrays.push(byteArray);
+ }
+ return new Blob(byteArrays, { type: contentType });
+ }
+
+ // js/features/supportLazyLoading.js
+ var componentsThatWantToBeBundled = /* @__PURE__ */ new WeakSet();
+ var componentsThatAreLazy = /* @__PURE__ */ new WeakSet();
+ on2("component.init", ({ component }) => {
+ let memo = component.snapshot.memo;
+ if (memo.lazyLoaded === void 0)
+ return;
+ componentsThatAreLazy.add(component);
+ if (memo.lazyIsolated !== void 0 && memo.lazyIsolated === false) {
+ componentsThatWantToBeBundled.add(component);
+ }
+ });
+ on2("commit.pooling", ({ commits }) => {
+ commits.forEach((commit) => {
+ if (!componentsThatAreLazy.has(commit.component))
+ return;
+ if (componentsThatWantToBeBundled.has(commit.component)) {
+ commit.isolate = false;
+ componentsThatWantToBeBundled.delete(commit.component);
+ } else {
+ commit.isolate = true;
+ }
componentsThatAreLazy.delete(commit.component);
});
});
@@ -8868,12 +9104,16 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
// js/features/supportNavigate.js
shouldHideProgressBar() && Alpine.navigate.disableProgressBar();
- document.addEventListener("alpine:navigated", (e) => {
- document.dispatchEvent(new CustomEvent("livewire:navigated", { bubbles: true }));
- });
- document.addEventListener("alpine:navigating", (e) => {
- document.dispatchEvent(new CustomEvent("livewire:navigating", { bubbles: true }));
- });
+ document.addEventListener("alpine:navigate", (e) => forwardEvent("livewire:navigate", e));
+ document.addEventListener("alpine:navigating", (e) => forwardEvent("livewire:navigating", e));
+ document.addEventListener("alpine:navigated", (e) => forwardEvent("livewire:navigated", e));
+ function forwardEvent(name, original) {
+ let event = new CustomEvent(name, { cancelable: true, bubbles: true, detail: original.detail });
+ document.dispatchEvent(event);
+ if (event.defaultPrevented) {
+ original.preventDefault();
+ }
+ }
function shouldRedirectUsingNavigateOr(effects, url, or) {
let forceNavigate = effects.redirectUsingNavigate;
if (forceNavigate) {
@@ -8900,121 +9140,6 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
});
});
- // js/morph.js
- function morph2(component, el, html) {
- let wrapperTag = el.parentElement ? el.parentElement.tagName.toLowerCase() : "div";
- let wrapper = document.createElement(wrapperTag);
- wrapper.innerHTML = html;
- let parentComponent;
- try {
- parentComponent = closestComponent(el.parentElement);
- } catch (e) {
- }
- parentComponent && (wrapper.__livewire = parentComponent);
- let to = wrapper.firstElementChild;
- to.__livewire = component;
- trigger2("morph", { el, toEl: to, component });
- module_default.morph(el, to, {
- updating: (el2, toEl, childrenOnly, skip) => {
- if (isntElement(el2))
- return;
- trigger2("morph.updating", { el: el2, toEl, component, skip, childrenOnly });
- if (el2.__livewire_ignore === true)
- return skip();
- if (el2.__livewire_ignore_self === true)
- childrenOnly();
- if (isComponentRootEl(el2) && el2.getAttribute("wire:id") !== component.id)
- return skip();
- if (isComponentRootEl(el2))
- toEl.__livewire = component;
- },
- updated: (el2) => {
- if (isntElement(el2))
- return;
- trigger2("morph.updated", { el: el2, component });
- },
- removing: (el2, skip) => {
- if (isntElement(el2))
- return;
- trigger2("morph.removing", { el: el2, component, skip });
- },
- removed: (el2) => {
- if (isntElement(el2))
- return;
- trigger2("morph.removed", { el: el2, component });
- },
- adding: (el2) => {
- trigger2("morph.adding", { el: el2, component });
- },
- added: (el2) => {
- if (isntElement(el2))
- return;
- const closestComponentId = closestComponent(el2).id;
- trigger2("morph.added", { el: el2 });
- },
- key: (el2) => {
- if (isntElement(el2))
- return;
- return el2.hasAttribute(`wire:key`) ? el2.getAttribute(`wire:key`) : el2.hasAttribute(`wire:id`) ? el2.getAttribute(`wire:id`) : el2.id;
- },
- lookahead: false
- });
- }
- function isntElement(el) {
- return typeof el.hasAttribute !== "function";
- }
- function isComponentRootEl(el) {
- return el.hasAttribute("wire:id");
- }
-
- // js/features/supportMorphDom.js
- on2("effect", ({ component, effects }) => {
- let html = effects.html;
- if (!html)
- return;
- queueMicrotask(() => {
- queueMicrotask(() => {
- morph2(component, component.el, html);
- });
- });
- });
-
- // js/features/supportEvents.js
- on2("effect", ({ component, effects }) => {
- registerListeners(component, effects.listeners || []);
- dispatchEvents(component, effects.dispatches || []);
- });
- function registerListeners(component, listeners2) {
- listeners2.forEach((name) => {
- let handler4 = (e) => {
- if (e.__livewire)
- e.__livewire.receivedBy.push(component);
- component.$wire.call("__dispatch", name, e.detail || {});
- };
- window.addEventListener(name, handler4);
- component.addCleanup(() => window.removeEventListener(name, handler4));
- component.el.addEventListener(name, (e) => {
- if (!e.__livewire)
- return;
- if (e.bubbles)
- return;
- if (e.__livewire)
- e.__livewire.receivedBy.push(component.id);
- component.$wire.call("__dispatch", name, e.detail || {});
- });
- });
- }
- function dispatchEvents(component, dispatches) {
- dispatches.forEach(({ name, params = {}, self = false, to }) => {
- if (self)
- dispatchSelf(component, name, params);
- else if (to)
- dispatchTo(to, name, params);
- else
- dispatch3(component, name, params);
- });
- }
-
// js/directives/wire-transition.js
on2("morph.added", ({ el }) => {
el.__addedByMorph = true;
@@ -9149,7 +9274,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
} else {
let cache = cachedDisplay ?? window.getComputedStyle(el, null).getPropertyValue("display");
let display = ["inline", "block", "table", "flex", "grid", "inline-flex"].filter((i) => directive3.modifiers.includes(i))[0] || "inline-block";
- display = directive3.modifiers.includes("remove") ? cache : display;
+ display = directive3.modifiers.includes("remove") && !isTruthy ? cache : display;
el.style.display = isTruthy ? display : "none";
}
}
@@ -9171,17 +9296,21 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
});
// js/directives/wire-loading.js
- directive2("loading", ({ el, directive: directive3, component }) => {
+ directive2("loading", ({ el, directive: directive3, component, cleanup: cleanup3 }) => {
let { targets, inverted } = getTargets(el);
let [delay3, abortDelay] = applyDelay(directive3);
- whenTargetsArePartOfRequest(component, targets, inverted, [
+ let cleanupA = whenTargetsArePartOfRequest(component, targets, inverted, [
() => delay3(() => toggleBooleanStateDirective(el, directive3, true)),
() => abortDelay(() => toggleBooleanStateDirective(el, directive3, false))
]);
- whenTargetsArePartOfFileUpload(component, targets, [
+ let cleanupB = whenTargetsArePartOfFileUpload(component, targets, [
() => delay3(() => toggleBooleanStateDirective(el, directive3, true)),
() => abortDelay(() => toggleBooleanStateDirective(el, directive3, false))
]);
+ cleanup3(() => {
+ cleanupA();
+ cleanupB();
+ });
});
function applyDelay(directive3) {
if (!directive3.modifiers.includes("delay") || directive3.modifiers.includes("none"))
@@ -9222,7 +9351,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
];
}
function whenTargetsArePartOfRequest(component, targets, inverted, [startLoading, endLoading]) {
- on2("commit", ({ component: iComponent, commit: payload, respond }) => {
+ return on2("commit", ({ component: iComponent, commit: payload, respond }) => {
if (iComponent !== component)
return;
if (targets.length > 0 && containsTargets(payload, targets) === inverted)
@@ -9242,21 +9371,26 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
return true;
return false;
};
- window.addEventListener("livewire-upload-start", (e) => {
+ let cleanupA = listen(window, "livewire-upload-start", (e) => {
if (eventMismatch(e))
return;
startLoading();
});
- window.addEventListener("livewire-upload-finish", (e) => {
+ let cleanupB = listen(window, "livewire-upload-finish", (e) => {
if (eventMismatch(e))
return;
endLoading();
});
- window.addEventListener("livewire-upload-error", (e) => {
+ let cleanupC = listen(window, "livewire-upload-error", (e) => {
if (eventMismatch(e))
return;
endLoading();
});
+ return () => {
+ cleanupA();
+ cleanupB();
+ cleanupC();
+ };
}
function containsTargets(payload, targets) {
let { updates, calls } = payload;
@@ -9629,14 +9763,19 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
return module_default.navigate;
}
};
+ var warnAboutMultipleInstancesOf = (entity) => console.warn(`Detected multiple instances of ${entity} running`);
if (window.Livewire)
- console.warn("Detected multiple instances of Livewire running");
+ warnAboutMultipleInstancesOf("Livewire");
if (window.Alpine)
- console.warn("Detected multiple instances of Alpine running");
+ warnAboutMultipleInstancesOf("Alpine");
window.Livewire = Livewire2;
window.Alpine = module_default;
if (window.livewireScriptConfig === void 0) {
+ window.Alpine.__fromLivewire = true;
document.addEventListener("DOMContentLoaded", () => {
+ if (window.Alpine.__fromLivewire === void 0) {
+ warnAboutMultipleInstancesOf("Alpine");
+ }
Livewire2.start();
});
}
diff --git a/public/vendor/livewire/manifest.json b/public/vendor/livewire/manifest.json
index 154963a2de..c0a72e976b 100644
--- a/public/vendor/livewire/manifest.json
+++ b/public/vendor/livewire/manifest.json
@@ -1,2 +1,2 @@
-{"/livewire.js":"5d8beb2e"}
+{"/livewire.js":"239a5c52"}
From 4d5d701069e3613c967dac94738ced3d643b5c73 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Mon, 8 Apr 2024 12:00:44 -0400
Subject: [PATCH 15/61] fix: middleware alias
---
routes/web.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/routes/web.php b/routes/web.php
index cf9850e5b7..ace40accce 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -306,7 +306,7 @@
Route::get('/create', [App\Http\Controllers\TicketController::class, 'create'])->name('create');
Route::post('/', [App\Http\Controllers\TicketController::class, 'store'])->name('store');
Route::get('/{ticket}', [App\Http\Controllers\TicketController::class, 'show'])->name('show');
- Route::delete('/{ticket}', [App\Http\Controllers\TicketController::class, 'destroy'])->name('destroy')->middleware('is_modo');
+ Route::delete('/{ticket}', [App\Http\Controllers\TicketController::class, 'destroy'])->name('destroy')->middleware('modo');
Route::post('/{ticket}/note', [App\Http\Controllers\TicketNoteController::class, 'store'])->name('note.store');
Route::delete('/{ticket}/note', [App\Http\Controllers\TicketNoteController::class, 'destroy'])->name('note.destroy');
Route::post('/{ticket}/assignee', [App\Http\Controllers\TicketAssigneeController::class, 'store'])->name('assignee.store');
From 2685606fbe2850abb1c045c3d84b197ffca07af2 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Mon, 8 Apr 2024 18:53:09 -0400
Subject: [PATCH 16/61] add: request #3676
- closes #3676
- replaces top_uploaders block with new top_users block which covers old stats plus more
---
app/Http/Controllers/HomeController.php | 134 +++++-
resources/sass/pages/_home.scss | 17 +
.../views/blocks/top_uploaders.blade.php | 77 ----
resources/views/blocks/top_users.blade.php | 385 ++++++++++++++++++
resources/views/home/index.blade.php | 2 +-
5 files changed, 520 insertions(+), 95 deletions(-)
delete mode 100644 resources/views/blocks/top_uploaders.blade.php
create mode 100644 resources/views/blocks/top_users.blade.php
diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index 99ca38f50b..87abf81549 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -15,11 +15,15 @@
use App\Models\Article;
use App\Models\Bookmark;
+use App\Models\Comment;
use App\Models\FeaturedTorrent;
use App\Models\FreeleechToken;
use App\Models\Group;
+use App\Models\History;
+use App\Models\Peer;
use App\Models\Poll;
use App\Models\Post;
+use App\Models\Thank;
use App\Models\Topic;
use App\Models\Torrent;
use App\Models\User;
@@ -41,7 +45,7 @@ class HomeController extends Controller
public function index(Request $request): \Illuminate\Contracts\View\Factory|\Illuminate\View\View
{
// For Cache
- $expiresAt = now()->addMinutes(1);
+ $expiresAt = now()->addMinutes(5);
// Authorized User
$user = $request->user();
@@ -65,7 +69,7 @@ public function index(Request $request): \Illuminate\Contracts\View\Factory|\Ill
$query->whereNotNull('torrent')->where('active', '1');
},
])
- ->where('last_action', '>', now()->subMinutes(5))
+ ->where('last_action', '>', now()->subMinutes(60))
->orderByRaw('(select position from `groups` where `groups`.id = users.group_id), group_id, username')
->get()
->sortBy(fn ($user) => $user->hidden || !$user->isVisible($user, 'other', 'show_online'))
@@ -119,21 +123,117 @@ public function index(Request $request): \Illuminate\Contracts\View\Factory|\Ill
])->get()
),
'poll' => cache()->remember('latest_poll', $expiresAt, fn () => Poll::latest()->first()),
- 'uploaders' => cache()->remember('top_uploaders', $expiresAt, fn () => Torrent::with(['user.group'])
- ->select(DB::raw('user_id, count(*) as value'))
- ->where('anon', '=', false)
- ->groupBy('user_id')
- ->latest('value')
- ->take(10)
- ->get()),
- 'past_uploaders' => cache()->remember('month_uploaders', $expiresAt, fn () => Torrent::with(['user.group'])
- ->where('created_at', '>', now()->subDays(30)->toDateTimeString())
- ->select(DB::raw('user_id, count(*) as value'))
- ->where('anon', '=', false)
- ->groupBy('user_id')
- ->latest('value')
- ->take(10)
- ->get()),
+ 'uploaders' => cache()->remember(
+ 'top-users:uploaders',
+ 3_600,
+ fn () => Torrent::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, COUNT(user_id) as value'))
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->where('anon', '=', false)
+ ->groupBy('user_id')
+ ->orderByDesc('value')
+ ->take(8)
+ ->get()
+ ),
+ 'downloaders' => cache()->remember(
+ 'top-users:downloaders',
+ 3_600,
+ fn () => History::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, count(distinct torrent_id) as value'))
+ ->whereNotNull('completed_at')
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->groupBy('user_id')
+ ->orderByDesc('value')
+ ->take(8)
+ ->get()
+ ),
+ 'uploaded' => cache()->remember(
+ 'top-users:uploaded',
+ 3_600,
+ fn () => User::select(['id', 'group_id', 'username', 'uploaded', 'image', 'private_profile'])
+ ->where('id', '!=', User::SYSTEM_USER_ID)
+ ->whereNotIn('group_id', Group::select('id')->whereIn('slug', ['banned', 'validating', 'disabled', 'pruned']))
+ ->orderByDesc('uploaded')
+ ->take(8)
+ ->get(),
+ ),
+ 'downloaded' => cache()->remember(
+ 'top-users:downloaded',
+ 3_600,
+ fn () => User::select(['id', 'group_id', 'username', 'downloaded', 'image', 'private_profile'])
+ ->where('id', '!=', User::SYSTEM_USER_ID)
+ ->whereNotIn('group_id', Group::select('id')->whereIn('slug', ['banned', 'validating', 'disabled', 'pruned']))
+ ->orderByDesc('downloaded')
+ ->take(8)
+ ->get(),
+ ),
+ 'seeders' => cache()->remember(
+ 'top-users:seeders',
+ 3_600,
+ fn () => Peer::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, count(distinct torrent_id) as value'))
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->where('seeder', '=', 1)
+ ->where('active', '=', 1)
+ ->groupBy('user_id')
+ ->orderByDesc('value')
+ ->take(8)
+ ->get(),
+ ),
+ 'seedtimes' => cache()->remember(
+ 'top-users:seedtimes',
+ 3_600,
+ fn () => User::withSum('history as seedtime', 'seedtime')
+ ->where('id', '!=', User::SYSTEM_USER_ID)
+ ->whereNotIn('group_id', Group::select('id')->whereIn('slug', ['banned', 'validating', 'disabled', 'pruned']))
+ ->orderByDesc('seedtime')
+ ->take(8)
+ ->get(),
+ ),
+ 'served' => cache()->remember(
+ 'top-users:served',
+ 3_600,
+ fn () => User::withCount('uploadSnatches')
+ ->where('id', '!=', User::SYSTEM_USER_ID)
+ ->whereNotIn('group_id', Group::select('id')->whereIn('slug', ['banned', 'validating', 'disabled', 'pruned']))
+ ->orderByDesc('upload_snatches_count')
+ ->take(8)
+ ->get(),
+ ),
+ 'commenters' => cache()->remember(
+ 'top-users:commenters',
+ 3_600,
+ fn () => Comment::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, COUNT(user_id) as value'))
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->where('anon', '=', false)
+ ->groupBy('user_id')
+ ->orderByRaw('COALESCE(value, 0) DESC')
+ ->take(8)
+ ->get()
+ ),
+ 'posters' => cache()->remember(
+ 'top-users:posters',
+ 3_600,
+ fn () => Post::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, COUNT(user_id) as value'))
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->groupBy('user_id')
+ ->orderByRaw('COALESCE(value, 0) DESC')
+ ->take(8)
+ ->get()
+ ),
+ 'thankers' => cache()->remember(
+ 'top-users:thankers',
+ 3_600,
+ fn () => Thank::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, COUNT(user_id) as value'))
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->groupBy('user_id')
+ ->orderByRaw('COALESCE(value, 0) DESC')
+ ->take(8)
+ ->get()
+ ),
'freeleech_tokens' => FreeleechToken::where('user_id', $user->id)->get(),
'bookmarks' => Bookmark::where('user_id', $user->id)->get(),
]);
diff --git a/resources/sass/pages/_home.scss b/resources/sass/pages/_home.scss
index fa0255b4e7..847606bfd7 100644
--- a/resources/sass/pages/_home.scss
+++ b/resources/sass/pages/_home.scss
@@ -13,3 +13,20 @@
// margin: 0 calc(-1 * max(0px, 45vw - 800px)); /* Inverses the magic numbers used in the main layout styles */
// }
// }
+
+.top-users__place {
+ border-radius: 50%;
+ background: #212125;
+ border: 2px solid #934042;
+ height: 30px;
+ line-height: 27px;
+ width: 30px;
+ box-shadow:
+ 0 8px 10px 1px #00000024,
+ 0 3px 14px 2px #0000001f,
+ 0 5px 5px -3px #0003;
+ font-size: 11px;
+ text-align: center;
+ float: right;
+ display: inline-block;
+}
diff --git a/resources/views/blocks/top_uploaders.blade.php b/resources/views/blocks/top_uploaders.blade.php
deleted file mode 100644
index fb23007957..0000000000
--- a/resources/views/blocks/top_uploaders.blade.php
+++ /dev/null
@@ -1,77 +0,0 @@
-
- Top Uploaders
-
-
- All Time
-
-
- {{ __('stat.last30days') }}
-
-
-
-
-
-
- {{ __('common.user') }}
- {{ __('user.total-uploads') }}
- {{ __('stat.place') }}
-
-
-
- @foreach ($uploaders as $uploader)
-
-
-
-
- {{ $uploader->value }}
-
- {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
- {{ __('stat.place') }}
-
-
- @endforeach
-
-
-
-
-
-
-
- {{ __('common.user') }}
- {{ __('user.total-uploads') }}
- {{ __('stat.place') }}
-
-
-
- @foreach ($past_uploaders as $uploader)
-
-
-
-
- {{ $uploader->value }}
-
- {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
- {{ __('stat.place') }}
-
-
- @endforeach
-
-
-
-
diff --git a/resources/views/blocks/top_users.blade.php b/resources/views/blocks/top_users.blade.php
new file mode 100644
index 0000000000..8ed09eb2db
--- /dev/null
+++ b/resources/views/blocks/top_users.blade.php
@@ -0,0 +1,385 @@
+
+ Top Users
+
+
+ Uploaders
+
+
+ Downloaders
+
+
+ Uploaded
+
+
+ Downloaded
+
+
+ Seeders
+
+
+ Seedtime
+
+
+ Users Served
+
+
+ Commenters
+
+
+ Posters
+
+
+ Thankers
+
+
+
+
+ @foreach ($uploaders as $uploader)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $uploader->value }} Uploads
+
+ @if ($uploader->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($downloaders as $downloader)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $downloader->value }} Downloads
+
+ @if ($downloader->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($uploaded as $upload)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+
+ {{ App\Helpers\StringHelper::formatBytes($upload->uploaded, 2) }} Uploaded
+
+
+ @if ($upload->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($downloaded as $download)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+
+ {{ App\Helpers\StringHelper::formatBytes($download->downloaded, 2) }}
+ Downloaded
+
+
+ @if ($download->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($seeders as $seeder)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $seeder->value }} Seeds
+
+ @if ($seeder->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($seedtimes as $seedtime)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+
+ {{ App\Helpers\StringHelper::timeElapsed($seedtime->seedtime ?? 0) }}
+ Seedtime Average
+
+
+ @if ($seedtime->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($served as $serve)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+
+ {{ $serve->upload_snatches_count }} Users Served
+
+
+ @if ($serve->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($commenters as $commenter)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $commenter->value }} Comments Made
+
+ @if ($commenter->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($posters as $poster)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $poster->value }} Posts Made
+
+ @if ($poster->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+ @foreach ($thankers as $thanker)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $thanker->value }} Thanks Given
+
+ @if ($thanker->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
+
+
diff --git a/resources/views/home/index.blade.php b/resources/views/home/index.blade.php
index a1cae68af8..be1389fbb6 100644
--- a/resources/views/home/index.blade.php
+++ b/resources/views/home/index.blade.php
@@ -15,7 +15,7 @@
@livewire('random-media')
@include('blocks.poll')
@livewire('top-torrents')
- @include('blocks.top_uploaders')
+ @include('blocks.top_users')
@include('blocks.latest_topics')
@include('blocks.latest_posts')
@include('blocks.online')
From 19f3f135634cf03e04231909e2587f1454c5a4ab Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Mon, 8 Apr 2024 19:06:12 -0400
Subject: [PATCH 17/61] update: homecontroller test
---
tests/Feature/Http/Controllers/HomeControllerTest.php | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tests/Feature/Http/Controllers/HomeControllerTest.php b/tests/Feature/Http/Controllers/HomeControllerTest.php
index 4a4ae752ec..e36775829c 100644
--- a/tests/Feature/Http/Controllers/HomeControllerTest.php
+++ b/tests/Feature/Http/Controllers/HomeControllerTest.php
@@ -29,7 +29,15 @@
$response->assertViewHas('featured');
$response->assertViewHas('poll');
$response->assertViewHas('uploaders');
- $response->assertViewHas('past_uploaders');
+ $response->assertViewHas('downloaders');
+ $response->assertViewHas('uploaded');
+ $response->assertViewHas('downloaded');
+ $response->assertViewHas('seeders');
+ $response->assertViewHas('seedtimes');
+ $response->assertViewHas('served');
+ $response->assertViewHas('commenters');
+ $response->assertViewHas('posters');
+ $response->assertViewHas('thankers');
$response->assertViewHas('freeleech_tokens');
$response->assertViewHas('bookmarks');
});
From adb103fda0e9db87bc18e5fafbe583ff48173e01 Mon Sep 17 00:00:00 2001
From: EkoNesLeg <155665062+EkoNesLeg@users.noreply.github.com>
Date: Tue, 9 Apr 2024 01:53:38 +0100
Subject: [PATCH 18/61] (Update) TMDb/IMDb icons for movie_meta partials
---
resources/views/torrent/partials/movie_meta.blade.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/resources/views/torrent/partials/movie_meta.blade.php b/resources/views/torrent/partials/movie_meta.blade.php
index 078495c349..31b69872a7 100755
--- a/resources/views/torrent/partials/movie_meta.blade.php
+++ b/resources/views/torrent/partials/movie_meta.blade.php
@@ -95,7 +95,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
@@ -108,7 +108,7 @@ class="meta-id-tag"
title="Internet Movie Database: {{ \str_pad((string) $meta->imdb_id, \max(\strlen((string) $meta->imdb_id), 7), '0', STR_PAD_LEFT) }}"
target="_blank"
>
-
+
@endif
From ec236053f7b267614988550b1a579f070bf2d007 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Thu, 11 Apr 2024 18:24:06 -0400
Subject: [PATCH 19/61] add: personal releases
---
app/Http/Controllers/HomeController.php | 13 +++++++
resources/views/blocks/top_users.blade.php | 38 +++++++++++++++++++
.../Http/Controllers/HomeControllerTest.php | 1 +
3 files changed, 52 insertions(+)
diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index 87abf81549..bff3ee4237 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -234,6 +234,19 @@ public function index(Request $request): \Illuminate\Contracts\View\Factory|\Ill
->take(8)
->get()
),
+ 'personals' => cache()->remember(
+ 'top-users:personals',
+ 3_600,
+ fn () => Torrent::with(['user' , 'user.group'])
+ ->select(DB::raw('user_id, COUNT(user_id) as value'))
+ ->where('user_id', '!=', User::SYSTEM_USER_ID)
+ ->where('anon', '=', false)
+ ->where('personal_release', '=', 1)
+ ->groupBy('user_id')
+ ->orderByDesc('value')
+ ->take(8)
+ ->get()
+ ),
'freeleech_tokens' => FreeleechToken::where('user_id', $user->id)->get(),
'bookmarks' => Bookmark::where('user_id', $user->id)->get(),
]);
diff --git a/resources/views/blocks/top_users.blade.php b/resources/views/blocks/top_users.blade.php
index 8ed09eb2db..555ea2ee51 100644
--- a/resources/views/blocks/top_users.blade.php
+++ b/resources/views/blocks/top_users.blade.php
@@ -81,6 +81,14 @@ class="panel__tab"
>
Thankers
+
+ Personal Releases
+
@@ -381,5 +389,35 @@ class="user-stat-card__avatar"
@endforeach
+
+ @foreach ($personals as $personal)
+
+
+
+
+ {{ App\Helpers\StringHelper::ordinal($loop->iteration) }}
+
+
+ {{ $uploader->value }} Personal Releases
+
+ @if ($personal->user->private_profile)
+
+ @else
+
+ @endif
+
+ @endforeach
+
diff --git a/tests/Feature/Http/Controllers/HomeControllerTest.php b/tests/Feature/Http/Controllers/HomeControllerTest.php
index e36775829c..f8afa65986 100644
--- a/tests/Feature/Http/Controllers/HomeControllerTest.php
+++ b/tests/Feature/Http/Controllers/HomeControllerTest.php
@@ -38,6 +38,7 @@
$response->assertViewHas('commenters');
$response->assertViewHas('posters');
$response->assertViewHas('thankers');
+ $response->assertViewHas('personals');
$response->assertViewHas('freeleech_tokens');
$response->assertViewHas('bookmarks');
});
From d0ba5f7b599135fcdddd19402c7bb9cfee9c916a Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Thu, 11 Apr 2024 20:05:10 -0400
Subject: [PATCH 20/61] chore: lint
---
resources/views/torrent/partials/movie_meta.blade.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/resources/views/torrent/partials/movie_meta.blade.php b/resources/views/torrent/partials/movie_meta.blade.php
index 31b69872a7..3ba4af03d8 100755
--- a/resources/views/torrent/partials/movie_meta.blade.php
+++ b/resources/views/torrent/partials/movie_meta.blade.php
@@ -95,7 +95,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
From 25c898bdea85464278d133fe0bfaada47a826931 Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Thu, 11 Apr 2024 20:10:11 -0400
Subject: [PATCH 21/61] update: meta icons
---
resources/views/torrent/partials/movie_meta.blade.php | 2 +-
resources/views/torrent/partials/tv_meta.blade.php | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/resources/views/torrent/partials/movie_meta.blade.php b/resources/views/torrent/partials/movie_meta.blade.php
index 3ba4af03d8..a11bd29216 100755
--- a/resources/views/torrent/partials/movie_meta.blade.php
+++ b/resources/views/torrent/partials/movie_meta.blade.php
@@ -95,7 +95,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
diff --git a/resources/views/torrent/partials/tv_meta.blade.php b/resources/views/torrent/partials/tv_meta.blade.php
index 9ff5da6aa1..f9970d6737 100755
--- a/resources/views/torrent/partials/tv_meta.blade.php
+++ b/resources/views/torrent/partials/tv_meta.blade.php
@@ -94,7 +94,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
@@ -107,7 +107,7 @@ class="meta-id-tag"
title="Internet Movie Database: {{ \str_pad((string) $meta->imdb_id, \max(\strlen((string) $meta->imdb_id), 7), '0', STR_PAD_LEFT) }}"
target="_blank"
>
-
+
@endif
From 1502f8fd912814f9e3586041238d94d852cc0b9e Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Thu, 11 Apr 2024 23:10:57 -0400
Subject: [PATCH 22/61] update: images
---
.gitignore | 24 ++--
public/img/imdb-icon.png | Bin 2768 -> 0 bytes
public/img/meta/anidb.svg | 123 ++++++++++++++++++
public/img/meta/imdb.svg | 3 +
public/img/meta/tmdb.svg | 1 +
public/img/meta/tvdb.svg | 1 +
public/img/tmdb-icon.png | Bin 1207 -> 0 bytes
public/img/tmdb_small.png | Bin 1207 -> 0 bytes
.../torrent/partials/movie_meta.blade.php | 10 +-
.../views/torrent/partials/tv_meta.blade.php | 10 +-
10 files changed, 147 insertions(+), 25 deletions(-)
delete mode 100644 public/img/imdb-icon.png
create mode 100644 public/img/meta/anidb.svg
create mode 100644 public/img/meta/imdb.svg
create mode 100644 public/img/meta/tmdb.svg
create mode 100644 public/img/meta/tvdb.svg
delete mode 100644 public/img/tmdb-icon.png
delete mode 100644 public/img/tmdb_small.png
diff --git a/.gitignore b/.gitignore
index beaa2f9dd8..67ccbc9ae7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,29 +5,18 @@
# Ignore everything in the public/files directory EXCEPT the .gitkeep
/public/files
!.gitkeep
-
-/public/css
-/public/fonts
-/public/img
-/public/js
/public/sounds
/public/vendor
-/public/mix-manifest.json
-/public/mix-sri.json
-
/storage/backups
/storage/gitupdate
/storage/*.key
-
-/vendor
-/.vagrant
-Homestead.json
-Homestead.yaml
-npm-debug.log
.env
laravel-echo-server.json
laravel-echo-server.lock
+# Composer
+/vendor
+
# Vite
/public/build
@@ -43,7 +32,12 @@ laravel-echo-server.lock
# Vim
.*.swp
-_ide_helper.php
+# Miscellaneous
+/.vagrant
+Homestead.json
+Homestead.yaml
+npm-debug.log
+_ide_helper.php
supervisor.ini
/.phpunit.cache/
diff --git a/public/img/imdb-icon.png b/public/img/imdb-icon.png
deleted file mode 100644
index 892c8fc76b208363c66755a4d13e1536e021ec1f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2768
zcmV;>3NQ7EP)o`qzJy|CiTOzj_yIv35d$U)2!dfO10TWcR-j`?d0_7ItkoM9X3pBx
z=X%X_ZQ~p*=S*|V?lmpH?n9PqjG{5OP+8qDR)C*j_A)@t%uN-o1eq7U<(OwAd~FP!
zyQaC$)J*RH?$qJV8x2YcT?v(MO5hVoc+1TQVDU)HPw;9-;C)7b8S75h&RDszZZ-~5
zSZaak9qKzD1ilRB17f|Mfy
zcjnxzvMuYS4&6XrLQwEk%q|G8b9{eTkj`7V1u7f^`)yu97uQ#;AIJm|s)a1l;i1W@
zzHvif78BHrP+UP!(^kdm1ULhwN&&aIZH)3{<>L#li^7|N9wEFPSNQh#$+4#O_4#mO
z#Z$T95MI|K5>{IoaMcOw_=?dmB!Y<%CMo)V#qnGvd~6Xuh9On;6Y`xgp(psv{}(vE
z)^f}7Hy6WBi(^T5L!IDw*!Jo{NI
zV8-7c+oIzIHN#Z7>G~BqLHOgJH&IOjm1X42HC@)00}uXn2Peref{}G#eYL~2>lwqm
zWIT@i?H~J;Wh6%B?0SdOYk{)V7XF`RYN_);Kd&H^xder%^!kAZ|GB{%-t&FBS>Wl7
z1HSvkJBez%<6}SO^!flZ*xns;&sSc@P3Kp*>jOW*IU#uA(niiF-}?gIbldg3;Y0T^
z=zGi(bBEyQcRjbi{4}3>|8psd$ooF~0GGFNb`K(-dH+p(bk^zz0EGdVqI=cWHf$Mm|ln<`aVQw`^Y$DZ7y*Y%Z0Qck3Ha&-?8D5LS*8@^Z>T)<$N}H`+>JQqGI|9g$4&Fe!FOPZZUt>Dn
z8o8$WSH)2dkr>?X=B8N$97p=&Ny{4ql`5}&w2o9++zlt
zHOz#fG+z3=0k3@VGI?PWV_1`1n9b~NTRb^7*Fa2Tz^aE^143m~)>Z;%)_att64h8;
z?r{2Kmon<)p_8I(A&!`XS$e*RFv=std`bwm(2Y&$)XWI0R<_hFvS_Iqcao~+LC>=?
z=uoQR)L383SX&OnSP_0Bh$k*+cy`_cOvLdLn^V&3iB~wT>+STe6
zf-yIPsXWkTsp`RX2Y17@1Ds0=Tz9%hCrrYmF$}1Mhy7vX@uzdVPmJdssc>V;?NXG6_kwe-
zs$R9a7S@&npZ@v&DrPDsoq0!uyNXTRIy#Heg+kLh+C`#WRCMIIfo7-c~oysT+*xxR=?o^kDFYK|q
zU4RpYqgdUeB=4t6^zv3g@X3SA1JB*JokXLuy%+h{b|mWv4?dD};fXQ9!{%<}t+)0$
zz2-Q`V~UL?j6{%)-@FsaR5U;j{^dV$4o0Jr+g^SaGvmJBK8X{!
z@m!x*yyO~wc;7{K_Y3ZN^%N3IAEl8?h`(4M2Z|?D&
z^BuPLN`Cs=9S%l`&2E3`fImGlF2sRYEHK`J$SBH_F|Y!
zm754Hhm136gcK6(YrhI(~ktZa8N2)M+whpR?|LdXkTxK
ztUG$b*FMgi=9kcKsWDon!ADz}!<28E3AOBx(Kfc3owqJPNRkpEHwb3r9o(l0a^79RLx|!dazx2pXxX?d9@th
zlB{fDpDq!o*-qsI2?DNq(!FMO3#KKtH~t&Kx9+zcOL#0<6|f)GsW_Nf#0LyMFXi}E
zX8QUxNm6(GjftzENm`ndh2LGwZJZ~#X|)^qZP0I|eGQ92oHs2-^j6M{M|+pwgxT9M
zyWPw>$15A!cGz`V{~VT}4iTPK;Spd6b}#5X5Co!uGkM|{Z)yFp2jV#Q>hJwu{Mh3!
z-@KvO;?Dlq1K{F)Z%)G~5Hs~x+RJVK-NWL~Y8JO&+wp#A)}69WvkEP1O`i9zNBK9X
W3vT4k=7ZG$0000
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/img/meta/imdb.svg b/public/img/meta/imdb.svg
new file mode 100644
index 0000000000..b2a908bcb4
--- /dev/null
+++ b/public/img/meta/imdb.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/public/img/meta/tmdb.svg b/public/img/meta/tmdb.svg
new file mode 100644
index 0000000000..42f31f1544
--- /dev/null
+++ b/public/img/meta/tmdb.svg
@@ -0,0 +1 @@
+Asset 2
\ No newline at end of file
diff --git a/public/img/meta/tvdb.svg b/public/img/meta/tvdb.svg
new file mode 100644
index 0000000000..929914460c
--- /dev/null
+++ b/public/img/meta/tvdb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/tmdb-icon.png b/public/img/tmdb-icon.png
deleted file mode 100644
index a6a07f053683c161dac79f81f594d83078ee8388..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1207
zcmV;o1W5adP)6$R#MK=y156>wQHNW1@*y;^f<
z4Y;Da-ioL{>_4+U>s8S+-7`JY-NQ69;}72iYO1U2Gu8Fp_f?Ms08%nb`tATcKa6N#
zYG>+BFm>SEA_A}u51Amr)oBXAK4?jT$!lsh1L!sFoIV=J?nNL!Y5?iq4IsVof%Luw
zq>rs2eQt|hA6mpXn%*^o^kO5(&znI0s}YoQ<)CIy3*6CM}j`o0jS8RGUYn;DL13=M=*`lp{77GlbO`Y#1z_TW20C!eJ1i%#{O?f;q
zX>ExGaI-cnfZSduyi>hJ)Y3wb1>4Y^_yZypQ)W^J7S@JJL1z{F>{3-HPzz;BhI04xuf0%&2>MS%aM
zS3XAo7}IHOj&Q768?(V=#{!_mQw@D-Q5KMv0#GNWy9V%8dhJVUFZ7j{j&?Hf=`tQB
zE(Whk>>nYU063`-FT@@{HGgubEzyhRg<#N-
zv2U*$0D#RX#J|;t4ZM<4$BzN!c!@|}ED>Ux9zY#CnwP3tA6k>+8i4IY#sRw42HKcK
zmLG^(f-awK1jw5V>YNNv&R2-f%?tJrdor*@)@K8tdz~>%?kyJKvpGNPBg9w8>x~wm
zJGKBg89l(EC4SqW2fzt&*UHA^dtl~-#8?6B>u+OuK(pesFv|d-{AAMRy;7
z-GG+P0Mav0LXzQpqwfLP5_0n1E0e!GuQ^&Z++U|FK81=^KxO
VxUYKSUM&Cs002ovPDHLkV1hD-He>(*
diff --git a/public/img/tmdb_small.png b/public/img/tmdb_small.png
deleted file mode 100644
index a6a07f053683c161dac79f81f594d83078ee8388..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1207
zcmV;o1W5adP)6$R#MK=y156>wQHNW1@*y;^f<
z4Y;Da-ioL{>_4+U>s8S+-7`JY-NQ69;}72iYO1U2Gu8Fp_f?Ms08%nb`tATcKa6N#
zYG>+BFm>SEA_A}u51Amr)oBXAK4?jT$!lsh1L!sFoIV=J?nNL!Y5?iq4IsVof%Luw
zq>rs2eQt|hA6mpXn%*^o^kO5(&znI0s}YoQ<)CIy3*6CM}j`o0jS8RGUYn;DL13=M=*`lp{77GlbO`Y#1z_TW20C!eJ1i%#{O?f;q
zX>ExGaI-cnfZSduyi>hJ)Y3wb1>4Y^_yZypQ)W^J7S@JJL1z{F>{3-HPzz;BhI04xuf0%&2>MS%aM
zS3XAo7}IHOj&Q768?(V=#{!_mQw@D-Q5KMv0#GNWy9V%8dhJVUFZ7j{j&?Hf=`tQB
zE(Whk>>nYU063`-FT@@{HGgubEzyhRg<#N-
zv2U*$0D#RX#J|;t4ZM<4$BzN!c!@|}ED>Ux9zY#CnwP3tA6k>+8i4IY#sRw42HKcK
zmLG^(f-awK1jw5V>YNNv&R2-f%?tJrdor*@)@K8tdz~>%?kyJKvpGNPBg9w8>x~wm
zJGKBg89l(EC4SqW2fzt&*UHA^dtl~-#8?6B>u+OuK(pesFv|d-{AAMRy;7
z-GG+P0Mav0LXzQpqwfLP5_0n1E0e!GuQ^&Z++U|FK81=^KxO
VxUYKSUM&Cs002ovPDHLkV1hD-He>(*
diff --git a/resources/views/torrent/partials/movie_meta.blade.php b/resources/views/torrent/partials/movie_meta.blade.php
index a11bd29216..eafb51c7c4 100755
--- a/resources/views/torrent/partials/movie_meta.blade.php
+++ b/resources/views/torrent/partials/movie_meta.blade.php
@@ -95,7 +95,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
@@ -108,7 +108,7 @@ class="meta-id-tag"
title="Internet Movie Database: {{ \str_pad((string) $meta->imdb_id, \max(\strlen((string) $meta->imdb_id), 7), '0', STR_PAD_LEFT) }}"
target="_blank"
>
-
+
@endif
@@ -121,7 +121,7 @@ class="meta-id-tag"
title="My Anime List: {{ $torrent->mal }}"
target="_blank"
>
-
+
@endif
@@ -134,7 +134,7 @@ class="meta-id-tag"
title="The TV Database: {{ $torrent->tvdb }}"
target="_blank"
>
-
+
@endif
@@ -147,7 +147,7 @@ class="meta-id-tag"
title="Rotten Tomatoes: {{ $meta->title ?? '' }} ({{ substr($meta->release_date ?? '', 0, 4) ?? '' }})"
target="_blank"
>
-
+
@endif
diff --git a/resources/views/torrent/partials/tv_meta.blade.php b/resources/views/torrent/partials/tv_meta.blade.php
index f9970d6737..e8ddd6922d 100755
--- a/resources/views/torrent/partials/tv_meta.blade.php
+++ b/resources/views/torrent/partials/tv_meta.blade.php
@@ -94,7 +94,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
@@ -107,7 +107,7 @@ class="meta-id-tag"
title="Internet Movie Database: {{ \str_pad((string) $meta->imdb_id, \max(\strlen((string) $meta->imdb_id), 7), '0', STR_PAD_LEFT) }}"
target="_blank"
>
-
+
@endif
@@ -120,7 +120,7 @@ class="meta-id-tag"
title="My Anime List: {{ $torrent->mal }}"
target="_blank"
>
-
+
@endif
@@ -133,7 +133,7 @@ class="meta-id-tag"
title="The TV Database: {{ $torrent->tvdb }}"
target="_blank"
>
-
+
@endif
@@ -145,7 +145,7 @@ class="meta-id-tag"
title="Rotten Tomatoes: {{ $meta->name ?? '' }} ({{ substr($meta->first_air_date ?? '', 0, 4) ?? '' }})"
target="_blank"
>
-
+
From 062f166f3b9866feebdc266789c1e1b3a88693bd Mon Sep 17 00:00:00 2001
From: HDVinnie
Date: Fri, 12 Apr 2024 03:11:56 +0000
Subject: [PATCH 23/61] Blade Style Change (Prettier Blade CI)
---
.../torrent/partials/movie_meta.blade.php | 19 ++++++++++++++-----
.../views/torrent/partials/tv_meta.blade.php | 19 ++++++++++++++-----
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/resources/views/torrent/partials/movie_meta.blade.php b/resources/views/torrent/partials/movie_meta.blade.php
index eafb51c7c4..303a432e60 100755
--- a/resources/views/torrent/partials/movie_meta.blade.php
+++ b/resources/views/torrent/partials/movie_meta.blade.php
@@ -95,7 +95,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
@@ -108,7 +108,7 @@ class="meta-id-tag"
title="Internet Movie Database: {{ \str_pad((string) $meta->imdb_id, \max(\strlen((string) $meta->imdb_id), 7), '0', STR_PAD_LEFT) }}"
target="_blank"
>
-
+
@endif
@@ -121,7 +121,7 @@ class="meta-id-tag"
title="My Anime List: {{ $torrent->mal }}"
target="_blank"
>
-
+
@endif
@@ -134,7 +134,7 @@ class="meta-id-tag"
title="The TV Database: {{ $torrent->tvdb }}"
target="_blank"
>
-
+
@endif
@@ -147,7 +147,16 @@ class="meta-id-tag"
title="Rotten Tomatoes: {{ $meta->title ?? '' }} ({{ substr($meta->release_date ?? '', 0, 4) ?? '' }})"
target="_blank"
>
-
+
@endif
diff --git a/resources/views/torrent/partials/tv_meta.blade.php b/resources/views/torrent/partials/tv_meta.blade.php
index e8ddd6922d..e91f8e899e 100755
--- a/resources/views/torrent/partials/tv_meta.blade.php
+++ b/resources/views/torrent/partials/tv_meta.blade.php
@@ -94,7 +94,7 @@ class="meta-id-tag"
title="The Movie Database: {{ $meta->id }}"
target="_blank"
>
-
+
@endif
@@ -107,7 +107,7 @@ class="meta-id-tag"
title="Internet Movie Database: {{ \str_pad((string) $meta->imdb_id, \max(\strlen((string) $meta->imdb_id), 7), '0', STR_PAD_LEFT) }}"
target="_blank"
>
-
+
@endif
@@ -120,7 +120,7 @@ class="meta-id-tag"
title="My Anime List: {{ $torrent->mal }}"
target="_blank"
>
-
+
@endif
@@ -133,7 +133,7 @@ class="meta-id-tag"
title="The TV Database: {{ $torrent->tvdb }}"
target="_blank"
>
-
+
@endif
@@ -145,7 +145,16 @@ class="meta-id-tag"
title="Rotten Tomatoes: {{ $meta->name ?? '' }} ({{ substr($meta->first_air_date ?? '', 0, 4) ?? '' }})"
target="_blank"
>
-
+
From 96984a4c6607429cb384b29daf652461135861e1 Mon Sep 17 00:00:00 2001
From: Audionut
Date: Sun, 14 Apr 2024 17:58:46 +1000
Subject: [PATCH 24/61] (Update) User profile invite persmission - 2fa
---
resources/views/user/profile/show.blade.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/resources/views/user/profile/show.blade.php b/resources/views/user/profile/show.blade.php
index 838b5e7ca2..74a35ec206 100644
--- a/resources/views/user/profile/show.blade.php
+++ b/resources/views/user/profile/show.blade.php
@@ -924,7 +924,7 @@ class="{{ $user->last_action }}"
{{ __('user.can-invite') }}
- @if ($user->can_invite == 1)
+ @if ($user->can_invite == 1 && user->two_factor_confirmed_at !== null)
@else
From ea38a1cb38e36c3f8e6f9a824f839d80c347c670 Mon Sep 17 00:00:00 2001
From: Jay Sizzla
Date: Sat, 13 Apr 2024 20:26:47 +0200
Subject: [PATCH 25/61] Add search for title and year
---
app/Http/Livewire/MissingMediaSearch.php | 8 ++++
.../livewire/missing-media-search.blade.php | 39 ++++++++++++++++++-
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/app/Http/Livewire/MissingMediaSearch.php b/app/Http/Livewire/MissingMediaSearch.php
index 8fe342ce3a..ce0602f66e 100644
--- a/app/Http/Livewire/MissingMediaSearch.php
+++ b/app/Http/Livewire/MissingMediaSearch.php
@@ -28,6 +28,12 @@ class MissingMediaSearch extends Component
#TODO: Update URL attributes once Livewire 3 fixes upstream bug. See: https://github.com/livewire/livewire/discussions/7746
+ #[Url(history: true)]
+ public string $name = '';
+
+ #[Url(history: true)]
+ public ?int $year = null;
+
#[Url(history: true)]
public array $categories = [];
@@ -47,6 +53,8 @@ class MissingMediaSearch extends Component
final public function medias(): \Illuminate\Contracts\Pagination\LengthAwarePaginator
{
return Movie::with(['torrents:tmdb,resolution_id,type_id' => ['resolution:id,position,name']])
+ ->when($this->name, fn ($query) => $query->where('title', 'LIKE', '%'.$this->name.'%'))
+ ->when($this->year, fn ($query) => $query->where('release_date', 'LIKE', '%'.$this->year.'%'))
->withCount(['requests' => fn ($query) => $query->whereNull('torrent_id')->whereNull('claimed')])
->orderBy($this->sortField, $this->sortDirection)
->paginate($this->perPage);
diff --git a/resources/views/livewire/missing-media-search.blade.php b/resources/views/livewire/missing-media-search.blade.php
index 0e9ea1cdca..4594b097e5 100644
--- a/resources/views/livewire/missing-media-search.blade.php
+++ b/resources/views/livewire/missing-media-search.blade.php
@@ -1,10 +1,45 @@