From 7e1e26f20b2d8954946123ac7c4ee8da24b3541d Mon Sep 17 00:00:00 2001 From: Benjamin Date: Tue, 16 Jun 2026 16:21:43 +0200 Subject: [PATCH] A lot of things --- .../Commands/DeleteRejectedEntries.php | 7 +- app/Console/Commands/PurgeFeaturedEntries.php | 31 + app/Helpers/EntryHelpers.php | 30 +- app/Helpers/PlayOnlineHelpers.php | 57 + app/Helpers/XenForoHelpers.php | 26 +- .../Controllers/DynamicLoadController.php | 22 + app/Http/Controllers/EntryController.php | 13 +- .../EntryFeaturedRequestController.php | 23 + app/Http/Controllers/FileServerController.php | 20 +- app/Http/Controllers/HomeController.php | 32 +- app/Http/Controllers/ModCPController.php | 5 + app/Http/Controllers/NewsController.php | 124 + app/Http/Controllers/QueueController.php | 52 +- app/Http/Controllers/RedirectController.php | 9 + app/Http/Controllers/SubmissionController.php | 58 +- app/Http/Controllers/ToolsController.php | 31 +- app/Http/Requests/StoreEntryRequest.php | 3 + app/Http/Requests/StoreNewsDraftRequest.php | 26 + app/Http/Requests/StoreNewsRequest.php | 78 + app/Jobs/CreateXenForoCommentsThread.php | 3 +- app/Jobs/DeleteFile.php | 36 + app/Livewire/ActivityLogs.php | 64 + app/Livewire/EntrySelector.php | 72 + app/Livewire/NewsDatabase.php | 104 + app/Models/Entry.php | 29 +- app/Models/EntryFile.php | 15 + app/Models/EntryGallery.php | 19 + app/Models/Gallery.php | 7 + app/Models/LogXfUser.php | 129 + app/Models/News.php | 118 + app/Models/Platform.php | 2 + app/Models/PlayOnlineSetting.php | 45 + app/Policies/NewsPolicy.php | 165 ++ app/Providers/AppServiceProvider.php | 4 +- app/Services/ActivityService.php | 223 ++ app/Services/FileServersService.php | 41 +- app/Services/NewsService.php | 194 ++ app/Services/SubmissionsService.php | 108 +- app/Services/XenforoApiService.php | 10 +- app/Services/XenforoService.php | 28 +- app/Support/XenForoCauserResolver.php | 22 + app/Traits/HasGallery.php | 2 +- app/View/Components/CategorySelector.php | 5 +- app/View/Components/NewsCard.php | 31 + app/View/Components/SubmitEntryStatus.php | 12 +- app/helpers.php | 9 + bootstrap/app.php | 2 +- composer.json | 6 +- composer.lock | 100 +- config/database.php | 7 + config/menu.php | 9 +- ...2026_05_10_072747_create_entries_table.php | 1 - .../2026_06_10_090320_create_news_table.php | 15 + ...10_091105_add_fields_for_queue_to_news.php | 29 + ...11_155053_add_order_to_galleries_table.php | 28 + ...10606_add_featured_at_field_to_entries.php | 28 + ...3648_create_play_online_settings_table.php | 34 + ...default_core_play_online_for_platforms.php | 28 + ...06_16_100941_create_activity_log_table.php | 23 + ...2812_add_download_field_to_entry_files.php | 28 + ...2026_06_12_130031_create_actions_table.php | 29 + ...026_06_12_131701_add_fields_to_actions.php | 28 + extra.less | 2172 ++++++++++++++++- public/favicon.ico | Bin 0 -> 28972 bytes public/logo/plaza-logo-text.png | Bin 0 -> 73481 bytes public/logo/plaza-logo-wide.png | Bin 0 -> 85605 bytes public/logo/plaza-logo.png | Bin 0 -> 53767 bytes public/rom-patcher-js/RomPatcher.webapp.js | 26 +- resources/css/app.css | 2 + resources/css/components/forms.css | 44 + resources/css/components/modal.css | 2 +- resources/css/components/modcp.css | 229 ++ resources/css/layout/activity.css | 485 ++++ resources/css/layout/menu.css | 8 +- resources/css/layout/news.css | 438 ++++ resources/css/layout/submit.css | 297 +++ resources/js/PlayOnlineAndPatcher.js | 85 + resources/js/RomPatcher.js | 10 +- resources/js/SubmissionsClass/FSFileData.js | 25 +- .../js/SubmissionsClass/GalleryManager.js | 21 + resources/js/app.js | 6 +- resources/js/news-submissions.js | 169 ++ resources/js/settings.js | 69 +- resources/js/submissions.js | 26 + .../views/activity/featured-entries.blade.php | 40 + .../views/activity/latest-news.blade.php | 34 + resources/views/activity/timeline.blade.php | 103 + .../views/components/gallery-field.blade.php | 8 +- resources/views/components/menu.blade.php | 9 +- .../views/components/news-card.blade.php | 41 + .../news-category-selector.blade.php | 13 + .../components/settings-dropdown.blade.php | 21 - .../components/submit-entry-status.blade.php | 50 +- resources/views/components/topbar.blade.php | 4 +- resources/views/entries/comments.blade.php | 13 +- resources/views/entries/drafts.blade.php | 4 + resources/views/entries/index.blade.php | 4 + resources/views/entries/show.blade.php | 2 +- resources/views/home.blade.php | 28 +- resources/views/layouts/app.blade.php | 2 +- resources/views/layouts/modcp.blade.php | 4 + .../views/livewire/activity-logs.blade.php | 210 ++ .../views/livewire/authors-selector.blade.php | 2 +- resources/views/livewire/database.blade.php | 2 +- .../livewire/entry-files-modal.blade.php | 7 +- .../views/livewire/entry-selector.blade.php | 41 + .../views/livewire/news-database.blade.php | 43 + resources/views/modcp/logs.blade.php | 14 + resources/views/news/create.blade.php | 9 + resources/views/news/draft_item.blade.php | 51 + resources/views/news/edit.blade.php | 9 + resources/views/news/form.blade.php | 104 + resources/views/news/index.blade.php | 11 + resources/views/news/show.blade.php | 225 ++ resources/views/queue/index.blade.php | 1 + resources/views/queue/item.blade.php | 41 +- .../views/submissions/fs-upload.blade.php | 51 +- resources/views/submissions/index.blade.php | 73 + .../play-online-core-select.blade.php | 8 + resources/views/tools/patcher.blade.php | 5 + resources/views/tools/play.blade.php | 102 + routes/api.php | 9 + routes/breadcrumbs.php | 30 + routes/console.php | 1 + routes/web.php | 34 +- vite.config.js | 5 +- 126 files changed, 7917 insertions(+), 204 deletions(-) create mode 100644 app/Console/Commands/PurgeFeaturedEntries.php create mode 100644 app/Helpers/PlayOnlineHelpers.php create mode 100644 app/Http/Controllers/EntryFeaturedRequestController.php create mode 100644 app/Http/Controllers/NewsController.php create mode 100644 app/Http/Requests/StoreNewsDraftRequest.php create mode 100644 app/Http/Requests/StoreNewsRequest.php create mode 100644 app/Jobs/DeleteFile.php create mode 100644 app/Livewire/ActivityLogs.php create mode 100644 app/Livewire/EntrySelector.php create mode 100644 app/Livewire/NewsDatabase.php create mode 100644 app/Models/LogXfUser.php create mode 100644 app/Models/News.php create mode 100644 app/Models/PlayOnlineSetting.php create mode 100644 app/Policies/NewsPolicy.php create mode 100644 app/Services/ActivityService.php create mode 100644 app/Services/NewsService.php create mode 100644 app/Support/XenForoCauserResolver.php create mode 100644 app/View/Components/NewsCard.php create mode 100644 database/migrations/2026_06_10_091105_add_fields_for_queue_to_news.php create mode 100644 database/migrations/2026_06_11_155053_add_order_to_galleries_table.php create mode 100644 database/migrations/2026_06_13_210606_add_featured_at_field_to_entries.php create mode 100644 database/migrations/2026_06_14_163648_create_play_online_settings_table.php create mode 100644 database/migrations/2026_06_14_174906_add_default_core_play_online_for_platforms.php create mode 100644 database/migrations/2026_06_16_100941_create_activity_log_table.php create mode 100644 database/migrations/2026_06_16_122812_add_download_field_to_entry_files.php create mode 100644 database/migrations/discord/2026_06_12_130031_create_actions_table.php create mode 100644 database/migrations/discord/2026_06_12_131701_add_fields_to_actions.php create mode 100644 public/logo/plaza-logo-text.png create mode 100644 public/logo/plaza-logo-wide.png create mode 100644 public/logo/plaza-logo.png create mode 100644 resources/css/layout/activity.css create mode 100644 resources/css/layout/submit.css create mode 100644 resources/js/PlayOnlineAndPatcher.js create mode 100644 resources/js/news-submissions.js create mode 100644 resources/views/activity/featured-entries.blade.php create mode 100644 resources/views/activity/latest-news.blade.php create mode 100644 resources/views/activity/timeline.blade.php create mode 100644 resources/views/components/news-card.blade.php create mode 100644 resources/views/components/news-category-selector.blade.php create mode 100644 resources/views/livewire/activity-logs.blade.php create mode 100644 resources/views/livewire/entry-selector.blade.php create mode 100644 resources/views/livewire/news-database.blade.php create mode 100644 resources/views/modcp/logs.blade.php create mode 100644 resources/views/news/create.blade.php create mode 100644 resources/views/news/draft_item.blade.php create mode 100644 resources/views/news/edit.blade.php create mode 100644 resources/views/news/form.blade.php create mode 100644 resources/views/news/index.blade.php create mode 100644 resources/views/news/show.blade.php create mode 100644 resources/views/submissions/index.blade.php create mode 100644 resources/views/submissions/play-online-core-select.blade.php create mode 100644 resources/views/tools/play.blade.php diff --git a/app/Console/Commands/DeleteRejectedEntries.php b/app/Console/Commands/DeleteRejectedEntries.php index c65582f..395742b 100644 --- a/app/Console/Commands/DeleteRejectedEntries.php +++ b/app/Console/Commands/DeleteRejectedEntries.php @@ -3,6 +3,7 @@ namespace App\Console\Commands; use App\Models\Entry; +use App\Models\News; use Illuminate\Console\Attributes\Description; use Illuminate\Console\Attributes\Signature; use Illuminate\Console\Command; @@ -20,7 +21,11 @@ class DeleteRejectedEntries extends Command $count = Entry::where('state', 'rejected') ->where('rejected_at', '<', now()->subDays($days)) ->delete(); + $count += News::where('state', 'rejected') + ->where('rejected_at', '<', now()->subDays($days)) + ->delete(); - $this->info("Deleted {$count} entries"); + $this->info("Deleted {$count} entries/news"); + return self::SUCCESS; } } diff --git a/app/Console/Commands/PurgeFeaturedEntries.php b/app/Console/Commands/PurgeFeaturedEntries.php new file mode 100644 index 0000000..e487ce2 --- /dev/null +++ b/app/Console/Commands/PurgeFeaturedEntries.php @@ -0,0 +1,31 @@ +option('days'); + + $cutoff = now()->subDays($days); + + $count = Entry::query() + ->where('featured', true) + ->where('featured_at', '<=', $cutoff) + ->update([ + 'featured' => false, + 'featured_at' => null, + ]); + + $this->info("$count entr" . ($count > 1 ? 'ies' : 'y') . " unfeatured."); + return self::SUCCESS; + } +} diff --git a/app/Helpers/EntryHelpers.php b/app/Helpers/EntryHelpers.php index 603673a..25228a3 100644 --- a/app/Helpers/EntryHelpers.php +++ b/app/Helpers/EntryHelpers.php @@ -3,6 +3,8 @@ namespace App\Helpers; use App\Models\Entry; +use App\Models\EntryFile; +use App\Models\News; use App\Services\XenforoApiService; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Str; @@ -62,13 +64,16 @@ class EntryHelpers { }; } - public static function getLatestComments(Entry $entry, int $limit = 20): array { + public static function getLatestComments(Entry|News $entry, int $limit = 20): array { if( !$entry->comments_thread_id ){ return []; } - $cacheKey = "entry_comments_{$entry->id}"; + if( is_a( $entry, News::class ) ) + $cacheKey = "news_comments_{$entry->id}"; + else + $cacheKey = "entry_comments_{$entry->id}"; return Cache::remember($cacheKey, now()->addDays(1), function () use ($entry, $limit) { $service = app(XenforoApiService::class); @@ -93,6 +98,25 @@ class EntryHelpers { public static function enableOnlinePatcherBasedOnExtension(string $filename): bool { - return Str::endsWith(Str::lower($filename), ['.ips', '.bps', '.xdelta', '.zip' ]); + return Str::endsWith(Str::lower($filename), ['.ips', '.bps', '.xdelta', '.ups', '.aps', '.ppf', '.zip' ]); + } + + public static function getYoutubeVideoId(string $url): ?string + { + $pattern = '%(?:https?://)?(?:www\.|m\.)?(?:youtu\.be/|youtube(?:-nocookie)?\.com/(?:watch\?.*v=|embed/|v/|shorts/|live/))([\w-]{11})%i'; + + preg_match($pattern, $url, $matches); + return $matches[1] ?? null; + } + + public static function fileAlreadyDownloaded(EntryFile $entryFile): bool + { + return session("downloaded_file_{$entryFile->file_uuid}", null ) !== null; + } + + public static function markFileAsDownloaded(EntryFile $entryFile): bool + { + session(["downloaded_file_{$entryFile->file_uuid}" => 1]); + return true; } } diff --git a/app/Helpers/PlayOnlineHelpers.php b/app/Helpers/PlayOnlineHelpers.php new file mode 100644 index 0000000..f7377b8 --- /dev/null +++ b/app/Helpers/PlayOnlineHelpers.php @@ -0,0 +1,57 @@ +updateEntriesCount( $count, $userId ); } - public static function entryApproved( Entry $entry ): void + public static function entryApproved( Entry|News $entry ): void { // 1. Update XF Entry count. self::updateEntriesCount( $entry->user_id ); @@ -58,6 +59,29 @@ class XenForoHelpers { $title = "Entry approved : {$entry->title}"; $message = "Your entry {$entry->title} has been approved by {$moderator}."; + $service = app(XenForoApiService::class); + + $service->createConversation([ $entry->user_id ], $title, $message, false, false); + } + + public static function entryRejected( Entry|News $entry ): void + { + // 1. Update XF Entry count. + self::updateEntriesCount( $entry->user_id ); + + // 2. Send a private message + /* + if( \Auth::user()->user_id === $entry->user_id ) { + return; + } + */ + + $moderator = \Auth::user()->username; + $title = "Entry rejected : {$entry->title}"; + $message = "Your entry {$entry->title} has been rejected by {$moderator}.\nReason: {$entry->staff_comment}\n\nYou have 7 days to edit your entry before it is permanently deleted."; + + $service = app(XenForoApiService::class); + $service->createConversation([ $entry->user_id ], $title, $message, false, false); } } diff --git a/app/Http/Controllers/DynamicLoadController.php b/app/Http/Controllers/DynamicLoadController.php index bbf847a..0f91890 100644 --- a/app/Http/Controllers/DynamicLoadController.php +++ b/app/Http/Controllers/DynamicLoadController.php @@ -3,8 +3,10 @@ namespace App\Http\Controllers; use App\Helpers\XenForoHelpers; +use App\Services\ActivityService; use App\Services\XenforoApiService; use App\Services\XenforoService; +use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; @@ -63,4 +65,24 @@ class DynamicLoadController extends Controller return response()->json( $data ); } + + public function activityFeed(Request $request): JsonResponse + { + $availableFilters = ['entries', 'news', 'messages', 'threads', 'clubs']; + + $requested = $request->query('filters') + ? explode(',', $request->query('filters')) + : []; + + $activeFilters = !empty($requested) + ? array_intersect($requested, $availableFilters) + : $availableFilters; + + $service = app(ActivityService::class); + $items = $service->getActivities(array_values($activeFilters)); + + return response()->json([ + 'html' => view('activity.timeline', compact('items'))->render(), + ]); + } } diff --git a/app/Http/Controllers/EntryController.php b/app/Http/Controllers/EntryController.php index 07b9b71..80e4094 100644 --- a/app/Http/Controllers/EntryController.php +++ b/app/Http/Controllers/EntryController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Helpers\EntryHelpers; use App\Models\Entry; +use App\Models\News; use Illuminate\Support\Facades\Gate; use Illuminate\Http\Request; use Illuminate\View\View; @@ -11,7 +12,7 @@ use Illuminate\View\View; class EntryController extends Controller { - private const SECTION_TYPES = ['translations', 'romhacks', 'homebrew', 'utilities', 'documents', 'lua-scripts', 'tutorials']; + private const SECTION_TYPES = ['translations', 'romhacks', 'homebrew', 'utilities', 'documents', 'lua-scripts']; public function index(): View { @@ -31,7 +32,8 @@ class EntryController extends Controller if ($entry->type !== $section) abort(404); - Gate::authorize('viewAny', $entry); + if( !\Auth::guest() ) + Gate::authorize('viewAny', $entry); // Permissions. $entryPolicy = match ($entry->state) { @@ -61,7 +63,12 @@ class EntryController extends Controller ->orderBy('updated_at', 'desc') ->paginate(20); - return view('entries.drafts', compact('drafts')); + $newsDrafts = News::where('user_id', \Auth::user()->user_id ) + ->where('state', 'draft') + ->orderBy('updated_at', 'desc') + ->paginate(20); + + return view('entries.drafts', compact('drafts', 'newsDrafts')); } } diff --git a/app/Http/Controllers/EntryFeaturedRequestController.php b/app/Http/Controllers/EntryFeaturedRequestController.php new file mode 100644 index 0000000..6a158e2 --- /dev/null +++ b/app/Http/Controllers/EntryFeaturedRequestController.php @@ -0,0 +1,23 @@ +featuredRequest($entry); + return response()->json([ + 'success' => $response, + ]); + } + +} diff --git a/app/Http/Controllers/FileServerController.php b/app/Http/Controllers/FileServerController.php index c1bea53..5a03c77 100644 --- a/app/Http/Controllers/FileServerController.php +++ b/app/Http/Controllers/FileServerController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Helpers\EntryHelpers; use App\Models\EntryFile; +use App\Models\LogXfUser; use App\Services\FileServersService; use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\JsonResponse; @@ -45,7 +46,7 @@ class FileServerController extends Controller { return response()->json($data); } - \Cache::put("uploaded_file_{$fileUuid}", [ + $fileData = [ 'uuid' => $fileUuid, 'type' => $type, 'filename' => $filename, @@ -54,7 +55,16 @@ class FileServerController extends Controller { 'favorite_server' => $data['favorite_server'], 'favorite_at' => time(), 'state' => 'public', - ], now()->addHours(2) ); + ]; + + activity('entry-file') + ->causedBy(LogXfUser::find(\Auth::user()->getAuthIdentifier())) + ->withProperties($fileData) + ->event('file_upload') + ->log("File uploaded") + ; + + \Cache::put("uploaded_file_{$fileUuid}", $fileData, now()->addHours(2) ); $data['finished'] = true; return response()->json($data); @@ -67,7 +77,11 @@ class FileServerController extends Controller { abort(404); } - // TODO: DL Count. + if( !EntryHelpers::fileAlreadyDownloaded($file) ) { + EntryHelpers::markFileAsDownloaded($file); + $file->increaseDownloadCount(); + } + return redirect( $this->fs->getDownloadFileUrl( $file) ); } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index e6054db..3b003d9 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -2,14 +2,42 @@ namespace App\Http\Controllers; +use App\Models\Entry; +use App\Services\ActivityService; use Illuminate\Http\Request; use Illuminate\View\View; +use App\Models\News; class HomeController extends Controller { - public function index(): View { - return view('home'); + public function __construct( private ActivityService $service ) {} + + public function index( Request $request ): View { + + $filters = [ 'entries', 'news', 'messages', 'threads', 'clubs' ]; + + $cookie = $request->cookie('activity_filters'); + $activeFilters = $cookie ? array_intersect( json_decode( $cookie, true ) ?? [], $filters ) : $filters; + + if( empty( $activeFilters ) ) { + $activeFilters = $filters; + } + + $items = $this->service->getActivities( array_values( $activeFilters ) ); + + $viewFilters = [ + 'entries' => ['label' => 'Entries', 'icon' => 'database'], + 'news' => ['label' => 'News', 'icon' => 'newspaper'], + 'messages' => ['label' => 'Posts', 'icon' => 'message-square'], + 'threads' => ['label' => 'Threads', 'icon' => 'messages-square'], + 'clubs' => ['label' => 'Clubs', 'icon' => 'balloon'], + ]; + + $latestNews = News::published()->latest('created_at')->limit(5)->get(); + $featuredEntries = Entry::published()->where('featured', true)->latest('featured_at')->get(); + + return view('home', compact('items', 'activeFilters', 'viewFilters', 'latestNews', 'featuredEntries')); } } diff --git a/app/Http/Controllers/ModCPController.php b/app/Http/Controllers/ModCPController.php index b0d0d52..bf75df0 100644 --- a/app/Http/Controllers/ModCPController.php +++ b/app/Http/Controllers/ModCPController.php @@ -75,4 +75,9 @@ class ModCPController extends Controller $entry->forceDelete(); return back()->with('success', "Entry permanently deleted"); } + + public function logs() + { + return view('modcp.logs'); + } } diff --git a/app/Http/Controllers/NewsController.php b/app/Http/Controllers/NewsController.php new file mode 100644 index 0000000..23bb429 --- /dev/null +++ b/app/Http/Controllers/NewsController.php @@ -0,0 +1,124 @@ +state) { + 'pending' => 'viewPending', + 'draft' => 'viewDraft', + 'rejected' => 'viewRejected', + 'hidden' => 'viewHidden', + 'locked' => 'viewLocked', + 'published' => null, + 'default' => null + }; + + if ($entryPolicy) + Gate::authorize($entryPolicy, $news); + + $comments = EntryHelpers::getLatestComments($news); + + return view('news.show', compact('news', 'comments')); + } + + public function create(Request $request) + { + $data = [ + 'news' => new News(), + 'isEdit' => false, + 'oldCategory' => old('category') ? [ old('category') ] : [] + ]; + + return view ('news.create', $data); + } + + public function edit(Request $request, News $news) + { + $data = [ + 'news' => $news, + 'isEdit' => true, + 'oldCategory' => old('category', $news->category_id) ? [ old('category', $news->category_id) ] : [] + ]; + + return view ('news.edit', $data); + } + + public function store(Request $request) + { + $request = $request->input('submit-state') === 'draft' ? app(StoreNewsDraftRequest::class) : app(StoreNewsRequest::class); + $request->validateResolved(); + + $service = app(NewsService::class); + + try { + $entry = $service->storeNews($request); + + return match ($entry->state) { + 'published' => redirect()->route('news.show', ['news' => $entry->slug])->with('success', "Your entry has been published."), + 'pending' => redirect()->route('home')->with('success', "Your entry has been submitted and is pending review."), + default => redirect()->route('home')->with('success', "Your entry has been saved as a draft.") + }; + } catch ( SubmissionException $e ) { + return back()->withInput()->withErrors(['error' => $e->getMessage()]); + } catch ( \Exception $e ) { + return back()->withInput()->withErrors(['error' => 'Unknown error: '.$e->getMessage()]); + } + } + + public function update(Request $request, News $news) + { + $request = $request->input('submit-state') === 'draft' ? app(StoreNewsDraftRequest::class) : app(StoreNewsRequest::class); + $request->validateResolved(); + + $service = app(NewsService::class); + + try { + $news = $service->editNews($request, $news); + + return match ($news->state) { + 'published' => redirect()->route('news.show', ['news' => $news->slug])->with('success', "Your entry has been published."), + 'pending' => redirect()->route('home')->with('success', "Your entry has been submitted and is pending review."), + default => redirect()->route('home')->with('success', "Your entry has been saved as a draft.") + }; + } catch ( SubmissionException $e ) { + return back()->withInput()->withErrors(['error' => $e->getMessage()]); + } catch ( \Exception $e ) { + return back()->withInput()->withErrors(['error' => 'Unknown error: '.$e->getMessage()]); + } + + } + + public function destroy(Request $request, News $news) + { + if( $news->comments_thread_id ) + DeleteXenForoCommentsThread::dispatch( $news->comments_thread_id ); + + $news->delete(); + return redirect( route('news.index') )->with('success', "Entry successfully deleted."); + } +} diff --git a/app/Http/Controllers/QueueController.php b/app/Http/Controllers/QueueController.php index c9f4e91..7b5d037 100644 --- a/app/Http/Controllers/QueueController.php +++ b/app/Http/Controllers/QueueController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Helpers\XenForoHelpers; use App\Models\Entry; +use App\Models\News; use App\Services\XenforoService; use Illuminate\Http\Request; class QueueController extends Controller @@ -14,7 +15,25 @@ class QueueController extends Controller ->with(['authors', 'game.platform']) ->orderByRaw("CASE WHEN state = 'pending' THEN 1 ELSE 0 END") ->orderBy('created_at', 'asc') - ->get(); + ->get() + ->map(fn($item) => $item->setAttribute('queue_type', 'entry')); + + $news = News::inQueue() + ->orderByRaw("CASE WHEN state = 'pending' THEN 1 ELSE 0 END") + ->orderBy('created_at', 'asc') + ->get() + ->map(fn($item) => $item->setAttribute('queue_type', 'news')); + + $entries = $entries->concat($news)->sort(function($a, $b) { + $aPending = $a->state === 'pending' ? 0 : 1; + $bPending = $b->state === 'pending' ? 0 : 1; + + if($aPending !== $bPending) { + return $aPending <=> $bPending; + } + + return $a->created_at <=> $b->created_at; + })->values(); return view('queue.index', compact('entries')); } @@ -25,24 +44,53 @@ class QueueController extends Controller $entry->update(['staff_comment' => $request->input('comment')]); + return back()->with('success', 'Comment supdated'); + } + + public function updateComment_news(Request $request, News $news) + { + $request->validate(['comment' => 'nullable|string|max:2000']); + + $news->update(['staff_comment' => $request->input('comment')]); + return back()->with('success', 'Comment updated'); } public function approve(Request $request, Entry $entry) { - // $entry->update(['state' => 'published']); + $entry->update(['state' => 'published', 'created_at' => now()]); XenForoHelpers::entryApproved($entry); return back()->with('success', 'Entry approved'); } + public function approve_news(Request $request, News $news) + { + $news->update(['state' => 'published', 'created_at' => now()]); + + XenForoHelpers::entryApproved($news); + + return back()->with('success', 'Entry approved'); + } + public function reject(Request $request, Entry $entry) { $request->validate(['reason' => 'nullable|string|max:2000']); $entry->update(['state' => 'rejected', 'staff_comment' => $request->input('reason'), 'rejected_at' => now() ]); + XenForoHelpers::entryRejected($entry); + return back()->with('success', 'Entry rejected'); + } + + public function reject_news(Request $request, News $news) + { + $request->validate(['reason' => 'nullable|string|max:2000']); + + $news->update(['state' => 'rejected', 'staff_comment' => $request->input('reason'), 'rejected_at' => now() ]); + + XenForoHelpers::entryRejected($news); return back()->with('success', 'Entry rejected'); } diff --git a/app/Http/Controllers/RedirectController.php b/app/Http/Controllers/RedirectController.php index 10d9753..61254e2 100644 --- a/app/Http/Controllers/RedirectController.php +++ b/app/Http/Controllers/RedirectController.php @@ -14,4 +14,13 @@ class RedirectController extends Controller return redirect()->route('entries.show', ['section' => $entry->type, 'entry' => $entry])->with('success', "Your report has been sent."); } + + public function newsReportRedirect( Request $request ) + { + $id = $request->input('id'); + $entry = News::findOrFail($id); + + return redirect()->route('news.show', ['news' => $entry])->with('success', "Your report has been sent."); + } + } diff --git a/app/Http/Controllers/SubmissionController.php b/app/Http/Controllers/SubmissionController.php index 5d8b4c5..ebc7c4b 100644 --- a/app/Http/Controllers/SubmissionController.php +++ b/app/Http/Controllers/SubmissionController.php @@ -33,6 +33,62 @@ class SubmissionController extends Controller public function __construct(private SubmissionsService $services){} + public function index(Request $request) + { + + $entryTypes = [ + 'romhack' => [ + 'slug' => 'romhacks', + 'label' => 'Romhack', + 'icon' => 'gamepad-2', + 'color' => '#4a6fc2', + 'bg' => '#d5e1fc1a', + 'border' => '#d5e1fc40', + ], + 'translation' => [ + 'slug' => 'translations', + 'label' => 'Translation', + 'icon' => 'languages', + 'color' => '#4a8a2a', + 'bg' => '#e7f4d91a', + 'border' => '#e7f4d940', + ], + 'homebrew' => [ + 'slug' => 'homebrew', + 'label' => 'Homebrew', + 'icon' => 'cpu', + 'color' => '#c23060', + 'bg' => '#ffeaf01a', + 'border' => '#ffeaf040', + ], + 'utility' => [ + 'slug' => 'utilities', + 'label' => 'Utility', + 'icon' => 'wrench', + 'color' => '#8a6600', + 'bg' => '#fff8d51a', + 'border' => '#fff8d540', + ], + 'document' => [ + 'slug' => 'documents', + 'label' => 'Document', + 'icon' => 'file-text', + 'color' => '#7a35c2', + 'bg' => '#f3eaff1a', + 'border' => '#f3eaff40', + ], + 'lua-script' => [ + 'slug' => 'lua-script', + 'label' => 'Lua script', + 'icon' => 'terminal', + 'color' => '#a04515', + 'bg' => '#eed6c51a', + 'border' => '#eed6c540', + ] ]; + + return view('submissions.index', compact('entryTypes')); + } + public function create(Request $request, string $section) { $data = [ @@ -108,7 +164,7 @@ class SubmissionController extends Controller if( $entry->type !== $section ) abort(404); - if( $entry->comments_thread_id) + if( $entry->comments_thread_id ) DeleteXenForoCommentsThread::dispatch( $entry->comments_thread_id ); $entry->delete(); diff --git a/app/Http/Controllers/ToolsController.php b/app/Http/Controllers/ToolsController.php index ef2180f..9e54d91 100644 --- a/app/Http/Controllers/ToolsController.php +++ b/app/Http/Controllers/ToolsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Models\Entry; use App\Models\EntryFile; use App\Services\FileServersService; use Illuminate\Http\Request; @@ -15,9 +16,29 @@ class ToolsController extends Controller return view('tools.patcher'); } - public function directPatch( Request $request, int $entry_id, EntryFile $file ) + public function directPatch( Request $request, int $entryId, EntryFile $file ) { - if( $file->entry_id != $entry_id ) { + if( $file->entry_id != $entryId ) { + abort(404); + } + + $service = app(FileServersService::class); + + + $patches = [ + 'file' => $service->getDownloadFileUrl( $file ), + 'name' => $file->entry->title, + 'outputName' => $file->filename + ]; + + + + return view('tools.patcher', compact('patches')); + } + + public function play( Request $request, int $entryId, EntryFile $file ) + { + if( $file->entry_id != $entryId ) { abort(404); } @@ -28,7 +49,11 @@ class ToolsController extends Controller 'name' => $file->entry->title, 'outputName' => $file->filename ]; + $emuConfig = [ + 'core' => $file->playOnlineSetting?->core, + 'threads' => $file->playOnlineSetting?->threads, + ]; - return view('tools.patcher', compact('patches')); + return view('tools.play', compact('patches', 'emuConfig')); } } diff --git a/app/Http/Requests/StoreEntryRequest.php b/app/Http/Requests/StoreEntryRequest.php index 5884b85..e9b7a58 100644 --- a/app/Http/Requests/StoreEntryRequest.php +++ b/app/Http/Requests/StoreEntryRequest.php @@ -149,6 +149,9 @@ class StoreEntryRequest extends FormRequest $rules['files_metadata'] = 'array|nullable'; $rules['files_metadata.*.online_patcher'] = 'nullable|boolean'; $rules['files_metadata.*.secondary_online_patcher'] = 'nullable|boolean|required_with:files_metadata.*.online_patcher'; + $rules['files_metadata.*.play_online'] = 'nullable|boolean'; + $rules['files_metadata.*.play_online_core'] = 'nullable|string'; + $rules['files_metadata.*.play_online_threads'] = 'nullable|boolean'; } if( $isEdit && $this->user()->can('moderate', $this->route('entry') ) ){ diff --git a/app/Http/Requests/StoreNewsDraftRequest.php b/app/Http/Requests/StoreNewsDraftRequest.php new file mode 100644 index 0000000..87d806c --- /dev/null +++ b/app/Http/Requests/StoreNewsDraftRequest.php @@ -0,0 +1,26 @@ + $r === 'required' ? 'nullable' : $r, $rule); + } + + return preg_replace( + ['/\brequired_without\S*/', '/required_with\S*/', '/\brequired\b/'], + ['nullable', 'nullable', 'nullable'], + $rule + ); + }, $rules ); + + return $rules; + } +} diff --git a/app/Http/Requests/StoreNewsRequest.php b/app/Http/Requests/StoreNewsRequest.php new file mode 100644 index 0000000..822abc3 --- /dev/null +++ b/app/Http/Requests/StoreNewsRequest.php @@ -0,0 +1,78 @@ +route('news'); + if( $news ) + return $this->user()->can('update', $news); + + return $this->user()->can('create', News::class); + } + + public function prepareForValidation(): void + { + $this->merge([ + 'gallery' => $this->input('gallery') !== '' ? $this->input('gallery') : null, + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + $isEdit = (bool) $this->route('news'); + + $rules = []; + + $rules['title'] = 'required|string|max:255'; + $rules['category'] = 'required|integer|exists:categories,id'; + + $rules['description'] = 'required|string'; + $rules['gallery'] = 'array|required|min:1'; + $rules['gallery.*'] = [ 'string', new PublicFileExists ]; + + $rules['entry_id'] = 'nullable|integer|exists:entries,id'; + $rules['release_site'] = 'nullable|url|max:500'; + $rules['youtube_video'] = 'nullable|url|max:500'; + + if( $isEdit ){ + $ss = 'draft,pending,published'; + if( \Auth::user()->can('moderate', $this->route('news')) && \Auth::user()->can('view-hidden', $this->route('news')) ) + $ss .= ',hidden'; + if(\Auth::user()->can('moderate', $this->route('news')) && \Auth::user()->can('view-locked', $this->route('news')) ) + $ss .= ',locked'; + $rules['submit-state'] = 'required|in:' . $ss; + } else { + if( $this->user()->can('skip-queue', '\App\Models\News') ){ + $rules['submit-state'] = 'required|string|in:draft,pending,published'; + } else { + $rules['submit-state'] = 'required|string|in:draft,pending'; + } + } + + if( $isEdit && $this->user()->can('moderate', $this->route('news') ) ){ + $rules['staff_comment'] = 'nullable|string'; + $rules['owner_user_id'] = [ 'required', 'integer', new XfUserExists ]; + $rules['comments_thread_id'] = 'nullable|integer'; + } + + return $rules; + + } +} diff --git a/app/Jobs/CreateXenForoCommentsThread.php b/app/Jobs/CreateXenForoCommentsThread.php index 0edeb09..ce532c5 100644 --- a/app/Jobs/CreateXenForoCommentsThread.php +++ b/app/Jobs/CreateXenForoCommentsThread.php @@ -3,6 +3,7 @@ namespace App\Jobs; use App\Models\Entry; +use App\Models\News; use App\Services\XenforoApiService; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Queue\Queueable; @@ -18,7 +19,7 @@ class CreateXenForoCommentsThread implements ShouldQueue * Create a new job instance. */ public function __construct( - protected Entry $entry + protected Entry|News $entry ) { // diff --git a/app/Jobs/DeleteFile.php b/app/Jobs/DeleteFile.php new file mode 100644 index 0000000..52369dd --- /dev/null +++ b/app/Jobs/DeleteFile.php @@ -0,0 +1,36 @@ +deleteFile($this->filePath, $this->fileName, $this->userId); + } +} diff --git a/app/Livewire/ActivityLogs.php b/app/Livewire/ActivityLogs.php new file mode 100644 index 0000000..a80b40d --- /dev/null +++ b/app/Livewire/ActivityLogs.php @@ -0,0 +1,64 @@ +resetPage(); } + + public function clearFilters(): void + { + $this->reset('search', 'logName', 'event', 'dateFrom', 'dateTo', 'causerId'); + $this->resetPage(); + } + + public function render() + { + $logs = Activity::query() + ->with(['causer']) + ->when($this->search, fn($q) => $q + ->where('description', 'like', "%{$this->search}%") + ->orWhere('subject_type', 'like', "%{$this->search}%") + ->orWhere('log_name', 'like', "%{$this->search}%") + ) + ->when($this->logName, fn($q) => $q->where('log_name', $this->logName)) + ->when($this->event, fn($q) => $q->where('event', $this->event)) + ->when($this->causerId, fn($q) => $q->where('causer_id', $this->causerId)) + ->when($this->dateFrom, fn($q) => $q->whereDate('created_at', '>=', $this->dateFrom)) + ->when($this->dateTo, fn($q) => $q->whereDate('created_at', '<=', $this->dateTo)) + ->latest() + ->paginate(50); + + $logNames = Activity::distinct()->orderBy('log_name')->pluck('log_name')->filter()->values(); + $events = Activity::distinct()->orderBy('event')->pluck('event')->filter()->values(); + + $hasFilters = $this->logName || $this->event || $this->dateFrom || $this->dateTo || $this->causerId; + + return view('livewire.activity-logs', compact('logs', 'logNames', 'events', 'hasFilters')); + } +} diff --git a/app/Livewire/EntrySelector.php b/app/Livewire/EntrySelector.php new file mode 100644 index 0000000..e78b74c --- /dev/null +++ b/app/Livewire/EntrySelector.php @@ -0,0 +1,72 @@ +selectedEntryId = $oldEntryId; + $this->entryName = $entry->complete_title ?? $entry->title; + } + } + } + + public function updatedSearch(): void + { + if( $this->selectedEntryId ) { + $this->selectedEntryId = null; + $this->entryName = null; + } + $this->dropdown = strlen($this->search) > 2; + } + + public function selectEntry( int $id ){ + $entry = Entry::find($id); + if( $entry ) { + $this->selectedEntryId = $id; + $this->entryName = $entry->complete_title ?? $entry->title; + $this->search = $entry->complete_title ?? $entry->title; + $this->dropdown = false; + + } + } + + public function clearEntry(): void + { + $this->selectedEntryId = null; + $this->entryName = null; + $this->search = ''; + } + + public function render() + { + $entries = collect(); + + if( $this->dropdown && strlen($this->search) > 2 ) { + $entries = Entry::where('complete_title', 'like', '%' . $this->search . '%') + ->orWhere('title', 'like', '%' . $this->search . '%') + ->orderBy('complete_title', 'asc') + ->orderBy('title', 'asc') + ->limit(20) + ->get(); + } + + $data = [ 'entries' => $entries, 'required_chars' => 3 ]; + + return view('livewire.entry-selector', $data); + } +} diff --git a/app/Livewire/NewsDatabase.php b/app/Livewire/NewsDatabase.php new file mode 100644 index 0000000..3c64c58 --- /dev/null +++ b/app/Livewire/NewsDatabase.php @@ -0,0 +1,104 @@ + 'Date added', + 'title' => 'Title' + ]; + + public const int PAGINATION = 30; + + public function updatedSearch(): void { $this->resetPage(); $this->dispatch('filters-updated'); } + public function updatedCategories(): void { $this->resetPage(); $this->dispatch('filters-updated'); } + public function updatedCategoriesMode(): void { $this->resetPage(); $this->dispatch('filters-updated'); } + + public function clearFilters(): void + { + $this->reset([ + 'search', 'categories', + ]); + $this->resetPage(); + } + + public function setSort(string $field): void + { + if( $this->sortBy === $field ) { + $this->sortDir = $this->sortDir === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortBy = $field; + $this->sortDir = 'asc'; + } + $this->resetPage(); + $this->dispatch('filters-updated'); + } + + private function buildQuery() + { + $query = News::query()->published(); + + if( $this->search ){ + $query->where(function($q){ + $q->where('title', 'like', '%'.$this->search.'%'); + }); + } + + if( $this->categories ) { + $query->whereIn('category_id', $this->categories); + } + + return $query->orderBy($this->sortBy, $this->sortDir); + } + + public function render() + { + return view('livewire.news-database', [ + 'news' => $this->buildQuery()->paginate(self::PAGINATION), + 'allCategories' => Category::where(function ($query) { + $query->whereJsonContains('restricted_to', "news") + ->orWhereNull('restricted_to'); + })->orderBy('name')->get() + ]); + } +} diff --git a/app/Models/Entry.php b/app/Models/Entry.php index ef532b9..22a2795 100644 --- a/app/Models/Entry.php +++ b/app/Models/Entry.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Helpers\EntryHelpers; use App\Traits\HasGallery; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -10,6 +11,8 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; use Monolog\Level; +use Spatie\Activitylog\Models\Concerns\LogsActivity; +use Spatie\Activitylog\Support\LogOptions; /** * @property int $id @@ -22,6 +25,7 @@ use Monolog\Level; * @property string|null $staff_comment * @property \Illuminate\Support\Carbon|null $rejected_at * @property bool $featured + * @property \Illuminate\Support\Carbon|null $featured_at * @property int|null $game_id * @property int|null $platform_id * @property int|null $status_id @@ -69,6 +73,7 @@ use Monolog\Level; * @method static Builder|Entry whereDeletedAt($value) * @method static Builder|Entry whereDescription($value) * @method static Builder|Entry whereFeatured($value) + * @method static Builder|Entry whereFeaturedAt($value) * @method static Builder|Entry whereGameId($value) * @method static Builder|Entry whereId($value) * @method static Builder|Entry whereLevelId($value) @@ -90,12 +95,14 @@ use Monolog\Level; * @method static Builder|Entry whereYoutubeLink($value) * @method static Builder|Entry withTrashed(bool $withTrashed = true) * @method static Builder|Entry withoutTrashed() + * @property-read \Illuminate\Database\Eloquent\Collection $activitiesAsSubject + * @property-read int|null $activities_as_subject_count * @mixin \Eloquent */ class Entry extends Model { - use SoftDeletes, HasGallery; + use SoftDeletes, HasGallery, LogsActivity; /** * @var string[] @@ -108,6 +115,7 @@ class Entry extends Model 'main_image', 'state', 'featured', + 'featured_at', 'game_id', 'platform_id', 'status_id', @@ -121,7 +129,8 @@ class Entry extends Model 'comments_thread_id', 'staff_comment', 'rejected_at', - 'level_id' + 'level_id', + 'created_at' ]; /** @@ -131,6 +140,7 @@ class Entry extends Model 'featured' => 'boolean', 'release_date' => 'date', 'rejected_at' => 'datetime', + 'featured_at' => 'datetime', ]; public function scopePublished( Builder $query ): Builder { @@ -197,7 +207,7 @@ class Entry extends Model return $this->hasMany(EntryHash::class); } - public function parseStaffCredits(): array { + public function parseStaffCredits(): ?array { return json_decode( $this->staff_credits ?? "", true ); } @@ -205,10 +215,17 @@ class Entry extends Model if( !$this->youtube_link ) return null; - $pattern = '%(?:https?://)?(?:www\.|m\.)?(?:youtu\.be/|youtube(?:-nocookie)?\.com/(?:watch\?.*v=|embed/|v/|shorts/|live/))([\w-]{11})%i'; + return EntryHelpers::getYoutubeVideoId( $this->youtube_link ); + } - preg_match($pattern, $this->youtube_link, $matches); - return $matches[1] ?? null; + public function getActivitylogOptions(): LogOptions + { + return LogOptions::defaults() + ->useLogName('entry') + ->logAll() + ->logOnlyDirty() + ->dontLogEmptyChanges() + ->setDescriptionForEvent(fn(string $eventName) => "Entry {$eventName}"); } } diff --git a/app/Models/EntryFile.php b/app/Models/EntryFile.php index 99bcd7f..a213637 100644 --- a/app/Models/EntryFile.php +++ b/app/Models/EntryFile.php @@ -4,6 +4,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasOne; /** * @property int $id @@ -36,6 +37,9 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @method static \Illuminate\Database\Eloquent\Builder|EntryFile whereSecondaryOnlinePatcher($value) * @method static \Illuminate\Database\Eloquent\Builder|EntryFile whereState($value) * @method static \Illuminate\Database\Eloquent\Builder|EntryFile whereUpdatedAt($value) + * @property-read \App\Models\PlayOnlineSetting|null $playOnlineSetting + * @property int $download_count + * @method static \Illuminate\Database\Eloquent\Builder|EntryFile whereDownloadCount($value) * @mixin \Eloquent */ class EntryFile extends Model @@ -53,4 +57,15 @@ class EntryFile extends Model return $this->belongsTo(Entry::class); } + public function playOnlineSetting(): HasOne + { + return $this->hasOne(PlayOnlineSetting::class,'file_id'); + } + + public function increaseDownloadCount(): void + { + $this->download_count++; + $this->save(); + } + } diff --git a/app/Models/EntryGallery.php b/app/Models/EntryGallery.php index 48b6ff2..e8a9014 100644 --- a/app/Models/EntryGallery.php +++ b/app/Models/EntryGallery.php @@ -4,5 +4,24 @@ namespace App\Models; /** * @deprecated Use Gallery instead. + * @property int $id + * @property string $galleryable_type + * @property int $galleryable_id + * @property string $image + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \Illuminate\Database\Eloquent\Model|\Eloquent $galleryable + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery query() + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereGalleryableId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereGalleryableType($value) + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereId($value) + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereImage($value) + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereUpdatedAt($value) + * @property int $order + * @method static \Illuminate\Database\Eloquent\Builder|EntryGallery whereOrder($value) + * @mixin \Eloquent */ class EntryGallery extends Gallery {} diff --git a/app/Models/Gallery.php b/app/Models/Gallery.php index 3d5f7dd..288650e 100644 --- a/app/Models/Gallery.php +++ b/app/Models/Gallery.php @@ -19,6 +19,13 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; * @method static \Illuminate\Database\Eloquent\Builder|Gallery whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|Gallery whereImage($value) * @method static \Illuminate\Database\Eloquent\Builder|Gallery whereUpdatedAt($value) + * @property string $galleryable_type + * @property int $galleryable_id + * @property-read Model|\Eloquent $galleryable + * @method static \Illuminate\Database\Eloquent\Builder|Gallery whereGalleryableId($value) + * @method static \Illuminate\Database\Eloquent\Builder|Gallery whereGalleryableType($value) + * @property int $order + * @method static \Illuminate\Database\Eloquent\Builder|Gallery whereOrder($value) * @mixin \Eloquent */ class Gallery extends Model diff --git a/app/Models/LogXfUser.php b/app/Models/LogXfUser.php new file mode 100644 index 0000000..def689a --- /dev/null +++ b/app/Models/LogXfUser.php @@ -0,0 +1,129 @@ +|LogXfUser newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser query() + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereActivityVisible($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAlertsUnread($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAlertsUnviewed($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAvatarDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAvatarHeight($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAvatarHighdpi($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAvatarOptimized($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereAvatarWidth($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereConversationsUnread($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereCustomTitle($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereDisplayStyleGroupId($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereEmail($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereGravatar($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereIsAdmin($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereIsBanned($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereIsModerator($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereIsStaff($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereLanguageId($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereLastActivity($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereLastSummaryEmailDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereMessageCount($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser wherePermissionCombinationId($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser wherePrivacyPolicyAccepted($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereQuestionSolutionCount($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereReactionScore($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereRegisterDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereRhpzEntryCount($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereSecondaryGroupIds($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereSecretKey($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereSecurityLock($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereStyleId($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereStyleVariation($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereTermsAccepted($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereTimezone($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereTrophyPoints($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereUserGroupId($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereUserId($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereUserState($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereUsername($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereUsernameDate($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereUsernameDateVisible($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereVisible($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereVoteScore($value) + * @method static \Illuminate\Database\Eloquent\Builder|LogXfUser whereWarningPoints($value) + * @mixin \Eloquent + */ +class LogXfUser extends Model +{ + + protected $connection = 'xenforo'; + protected $table = 'user'; + protected $primaryKey = 'user_id'; + public $timestamps = false; + public $incrementing = true; + + public function save(array $options = []) + { + return false; + } + + public function delete() + { + return false; + } + + public function update(array $attributes = [], array $options = []) + { + return false; + } + +} diff --git a/app/Models/News.php b/app/Models/News.php new file mode 100644 index 0000000..7bd8548 --- /dev/null +++ b/app/Models/News.php @@ -0,0 +1,118 @@ + $gallery + * @property-read int|null $gallery_count + * @method static Builder|News inQueue(int $daysRejected = 7) + * @method static Builder|News newModelQuery() + * @method static Builder|News newQuery() + * @method static Builder|News onlyTrashed() + * @method static Builder|News published() + * @method static Builder|News query() + * @method static Builder|News whereCategoryId($value) + * @method static Builder|News whereCommentsThreadId($value) + * @method static Builder|News whereCreatedAt($value) + * @method static Builder|News whereDeletedAt($value) + * @method static Builder|News whereDescription($value) + * @method static Builder|News whereEntryId($value) + * @method static Builder|News whereId($value) + * @method static Builder|News whereRejectedAt($value) + * @method static Builder|News whereRelevantLink($value) + * @method static Builder|News whereSlug($value) + * @method static Builder|News whereStaffComment($value) + * @method static Builder|News whereState($value) + * @method static Builder|News whereTitle($value) + * @method static Builder|News whereUpdatedAt($value) + * @method static Builder|News whereUserId($value) + * @method static Builder|News whereYoutubeLink($value) + * @method static Builder|News withTrashed(bool $withTrashed = true) + * @method static Builder|News withoutTrashed() + * @mixin \Eloquent + */ +class News extends Model +{ + + use SoftDeletes, HasGallery; + + protected $table = 'news'; + + protected $fillable = [ + 'title', + 'slug', + 'description', + 'state', + 'category_id', + 'entry_id', + 'relevant_link', + 'youtube_link', + 'user_id', + 'comments_thread_id', + 'staff_comment', + 'rejected_at', + 'created_at' + ]; + + + protected $casts = [ + 'rejected_at' => 'datetime', + ]; + + public function scopePublished(Builder $query): Builder + { + return $query->where('state', 'published' ); + } + + public function scopeInQueue( Builder $query, int $daysRejected = 7 ): Builder + { + return $query->withTrashed()->where(function($q) use($daysRejected) { + $q->where('state', 'pending')->whereNull('deleted_at'); + })->orWhere(function($q) use($daysRejected) { + $q->where('state', 'rejected')->whereNotNull('rejected_at')->where('rejected_at', '>=', now()->subDays($daysRejected) ); + }); + } + + public function entry(): BelongsTo + { + return $this->belongsTo(Entry::class); + } + + public function category(): BelongsTo + { + return $this->belongsTo(Category::class); + } + + public function getYoutubeVideoId(): ?string { + if( !$this->youtube_link ) + return null; + + return EntryHelpers::getYoutubeVideoId( $this->youtube_link ); + } + +} diff --git a/app/Models/Platform.php b/app/Models/Platform.php index 8fc5269..d62581b 100644 --- a/app/Models/Platform.php +++ b/app/Models/Platform.php @@ -25,6 +25,8 @@ use Illuminate\Database\Eloquent\Relations\HasMany; * @method static \Illuminate\Database\Eloquent\Builder|Platform whereShortName($value) * @method static \Illuminate\Database\Eloquent\Builder|Platform whereSlug($value) * @method static \Illuminate\Database\Eloquent\Builder|Platform whereUpdatedAt($value) + * @property string|null $play_online_core + * @method static \Illuminate\Database\Eloquent\Builder|Platform wherePlayOnlineCore($value) * @mixin \Eloquent */ class Platform extends Model diff --git a/app/Models/PlayOnlineSetting.php b/app/Models/PlayOnlineSetting.php new file mode 100644 index 0000000..95c0b98 --- /dev/null +++ b/app/Models/PlayOnlineSetting.php @@ -0,0 +1,45 @@ +|PlayOnlineSetting newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting query() + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting whereCore($value) + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting whereCreatedAt($value) + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting whereFileId($value) + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting whereThreads($value) + * @method static \Illuminate\Database\Eloquent\Builder|PlayOnlineSetting whereUpdatedAt($value) + * @mixin \Eloquent + */ +class PlayOnlineSetting extends Model +{ + protected $primaryKey = 'file_id'; + public $incrementing = false; + protected $keyType = 'int'; + + protected $fillable = [ + 'file_id', + 'core', + 'threads' + ]; + + protected $casts = [ + 'threads' => 'boolean', + ]; + + public function file(): BelongsTo + { + return $this->belongsTo(EntryFile::class, 'file_id'); + } +} diff --git a/app/Policies/NewsPolicy.php b/app/Policies/NewsPolicy.php new file mode 100644 index 0000000..75cce62 --- /dev/null +++ b/app/Policies/NewsPolicy.php @@ -0,0 +1,165 @@ +_can( 'romhackplaza', 'view' ) ) + return true; + + return false; + } + + public function viewPending(User $user, News $news): bool + { + // Author. + if( $news->user_id === $user->user_id ) + return true; + + return $user->_can( 'romhackplaza', 'canModerateEntries' ); + } + + public function viewDraft(User $user, News $news): bool { + // Author. + if( $news->user_id === $user->user_id ) + return true; + + return $user->_can( 'romhackplaza', 'canSeeOthersDrafts' ); + } + + public function viewRejected(User $user, News $news): bool + { + // Author. + if( $news->user_id === $user->user_id ) + return true; + + return $user->_can( 'romhackplaza', 'canSeeRejectedEntries' ); + } + + public function viewHidden(User $user, News $news): bool + { + return $user->_can('romhackplaza', 'canSeeHiddenEntries' ); + } + + public function viewLocked(User $user, News $news): bool + { + // Author. + if( $news->user_id === $user->user_id ) + return true; + + return $user->_can('romhackplaza', 'canSeeLockedEntries' ); + } + + public function create(User $user, ?News $news = null ): bool + { + return $user->_can( 'romhackplaza', 'canSubmitEntry' ); + } + + /** + * Determine whether the user can update the model. + */ + public function update(User $user, News $news): bool + { + if( $news->state === 'published' ){ + + // Staff editors + if( $user->_can('romhackplaza', 'canEditOthersEntries') ) + return true; + + // Author. + if( $user->_can( 'romhackplaza', 'canEditMyEntries' ) && $news->user_id === $user->user_id ) + return true; + + return false; + + } else if( $news->state === 'pending' ){ + + // Staff moderation. + if( $user->_can('romhackplaza', 'canEditOthersEntries') && $user->_can('romhackplaza', 'canModerateEntries') ) + return true; + + // Author. + if( $user->_can( 'romhackplaza', 'canEditMyEntries' ) && $news->user_id === $user->user_id ) + return true; + + } else if( $news->state === 'draft' ){ + + // Staff. + if( $user->_can('romhackplaza', 'canEditOthersEntries') && $user->_can( 'romhackplaza', 'canSeeOthersDrafts' ) ) + return true; + + // Author. + if( $user->_can( 'romhackplaza', 'canEditMyEntries' ) && $news->user_id === $user->user_id ) + return true; + + } else if( $news->state === 'rejected' ){ + + // Staff. + if( $user->_can('romhackplaza', 'canEditOthersEntries') && $user->_can( 'romhackplaza', 'canSeeRejectedEntries' ) ) + return true; + + // Author. + if( $user->_can( 'romhackplaza', 'canEditMyEntries' ) && $news->user_id === $user->user_id ) + return true; + + } else if( $news->state === 'locked' ){ + + // Staff. + if( $user->_can('romhackplaza', 'canEditOthersEntries') && $user->_can( 'romhackplaza', 'canSeeLockedEntries' ) ) + return true; + + return false; + + } else if( $news->state === 'hidden' ){ + + // Staff. + if( $user->_can('romhackplaza', 'canEditOthersEntries') && $user->_can( 'romhackplaza', 'canSeeHiddenEntries' ) ) + return true; + + return false; + + } + + return false; + } + + public function skipQueue(User $user, ?News $news = null): bool + { + return $user->_can( 'romhackplaza', 'canSubmitEntryInPublished' ); + } + + public function updateComment(User $user, News $news): bool + { + return $user->_can('romhackplaza', 'canModerateEntries' ); + } + + public function manageButtonsInQueue(User $user, News $news): bool + { + if( $news->state === 'rejected' ){ + return $this->viewRejected( $user, $news ); + } + + return $user->_can('romhackplaza', 'canModerateEntries' ); + } + + public function approve(User $user, News $news): bool + { + return $user->_can('romhackplaza', 'canModerateEntries' ); + } + + public function reject(User $user, News $news): bool + { + return $user->_can('romhackplaza', 'canModerateEntries' ); + } + + public function moderate(User $user, News $news): bool + { + return $user->_can('romhackplaza', 'canModerateEntries' ); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7a1413e..bba7ec1 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -6,8 +6,10 @@ use App\Auth\XenForoGuard; use App\Auth\XenForoUser; use App\Policies\TempFilePolicy; use App\Services\TemporaryFileService; +use App\Support\XenForoCauserResolver; use Illuminate\Support\Facades\Gate; use Illuminate\Support\ServiceProvider; +use Spatie\Activitylog\Support\CauserResolver; class AppServiceProvider extends ServiceProvider { @@ -16,7 +18,7 @@ class AppServiceProvider extends ServiceProvider */ public function register(): void { - // + $this->app->bind(CauserResolver::class, XenForoCauserResolver::class ); } /** diff --git a/app/Services/ActivityService.php b/app/Services/ActivityService.php new file mode 100644 index 0000000..896f4b1 --- /dev/null +++ b/app/Services/ActivityService.php @@ -0,0 +1,223 @@ +merge($this->getEntries()); + } + if( in_array( 'news', $activities ) ) { + $c = $c->merge($this->getNews()); + } + if( in_array( 'messages', $activities ) ) { + $c = $c->merge($this->getMessages()); + } + if( in_array( 'threads', $activities ) ) { + $c = $c->merge($this->getThreads()); + } + if( in_array( 'clubs', $activities ) ) { + $c = $c->merge($this->getClubs()); + } + + return $c->sortByDesc('date') + ->values() + ->take(30) + ->map(function(array $item){ + $obj = (object) $item; + $obj->date = Carbon::createFromTimestamp($obj->date); + return $obj; + }); + } + + private function formatEntry( Entry $entry ): array + { + return [ + 'type' => 'entry', + 'title' => $entry->complete_title ?? $entry->title, + 'url' => route('entries.show', ['section' => $entry->type, 'entry' => $entry]), + 'image' => $entry->main_image ? \Storage::url($entry->main_image) : null, + 'date' => $entry->created_at->timestamp, + 'author' => $entry->authors->pluck('name')->implode(', '), + 'user_id' => $entry->user_id, + 'badge' => EntryCard::ENTRY_TYPES_BADGE[$entry->type], + 'badge_class' => $entry->type, + 'excerpt' => $entry->description ? \Str::limit(strip_tags($entry->description), 80) : null, + 'meta' => $entry->getRealPlatform()?->name + ]; + } + + private function formatNews( News $news ): array + { + return [ + 'type' => 'news', + 'title' => $news->title, + 'url' => route('news.show', ['news' => $news]), + 'image' => $news->gallery()->first() ? \Storage::url($news->gallery()->first()->image) : null, + 'date' => $news->created_at->timestamp, + 'author' => null, + 'user_id' => $news->user_id, + 'badge' => 'News', + 'badge_class' => 'news', + 'excerpt' => $news->description ? \Str::limit(strip_tags($news->description), 80) : null, + 'meta' => $news->category?->name + ]; + } + + private function formatMessage( object $message ): array + { + return [ + 'type' => 'message', + 'title' => $message->title, + 'url' => xfRoute('threads/.' ) . $message->thread_id . '/post-' . $message->post_id, + 'image' => null, + 'date' => $message->post_date, + 'author' => null, + 'user_id' => $message->user_id, + 'badge' => 'Post', + 'badge_class' => 'message', + 'excerpt' => $message->message ? \Str::limit(strip_tags($message->message), 80) : null, + 'meta' => null + ]; + + } + + private function formatThread( object $thread ): array + { + return [ + 'type' => 'thread', + 'title' => $thread->title, + 'url' => xfRoute('threads/.' ) . $thread->thread_id, + 'image' => null, + 'date' => $thread->post_date, + 'author' => null, + 'user_id' => $thread->user_id, + 'badge' => 'Thread', + 'badge_class' => 'thread', + 'excerpt' => $thread->message ? \Str::limit(strip_tags($thread->message), 80) : null, + 'meta' => null + ]; + + } + + private function formatClub( object $club ): array + { + return [ + 'type' => 'club', + 'title' => $club->title, + 'url' => xfRoute('forums/.' ) . $club->node_id, + 'image' => null, // TODO: Remplacer par banner_date + 'date' => $club->club_creation_date, + 'author' => null, + 'user_id' => $club->user_id, + 'badge' => 'Club', + 'badge_class' => 'club', + 'excerpt' => $club->description ? \Str::limit(strip_tags($club->description), 80) : null, + 'meta' => null + ]; + } + + private function getEntries(): array + { + return Cache::remember('activity_entries', self::CACHE_ENTRIES, function() { + return Entry::published() + ->with(['authors', 'game.platform']) + ->latest('created_at') + ->limit(self::ITEMS_PER_TYPE) + ->get() + ->map($this->formatEntry(...)) + ->toArray(); + }); + } + + private function getNews(): array + { + return Cache::remember('activity_news', self::CACHE_NEWS, function() { + return News::published() + ->with('gallery') + ->latest('created_at') + ->limit(self::ITEMS_PER_TYPE) + ->get() + ->map($this->formatNews(...)) + ->toArray(); + }); + } + + private function getMessages(): array + { + return Cache::remember('activity_messages', self::CACHE_MESSAGES, function() { + return DB::connection('xenforo') + ->table('post') + ->join('user', 'post.user_id', '=', 'user.user_id') + ->join('thread', 'post.thread_id', '=', 'thread.thread_id') + ->where('post.message_state', 'visible') + ->where('thread.first_post_id', '!=', 'post.post_id') + ->orderByDesc('post.post_date') + ->limit(self::ITEMS_PER_TYPE) + ->select([ + 'thread.title', 'thread.thread_id', 'post.post_id', 'post.post_date', + 'post.user_id', 'post.message' + ]) + ->get() + ->map($this->formatMessage(...)) + ->toArray(); + }); + } + + private function getThreads(): array + { + return Cache::remember('activity_threads', self::CACHE_THREADS, function() { + return DB::connection('xenforo') + ->table('thread') + ->join('user', 'thread.user_id', '=', 'user.user_id') + ->join('post', 'thread.first_post_id', '=', 'post.post_id') + ->where('thread.discussion_state', 'visible') + ->where('thread.discussion_type', '!=', 'redirect' ) + ->orderByDesc('thread.post_date') + ->limit(self::ITEMS_PER_TYPE) + ->select([ + 'thread.title', 'thread.thread_id', 'thread.post_date', 'thread.user_id', + 'post.message' + ]) + ->get() + ->map($this->formatThread(...)) + ->toArray(); + }); + } + + private function getClubs(): array + { + return Cache::remember('activity_clubs', self::CACHE_CLUBS, function() { + return DB::connection('xenforo') + ->table('club') + ->where('club_state', 'visible') + ->orderByDesc('club_creation_date') + ->limit(self::ITEMS_PER_TYPE) + ->select([ + 'club.title', 'club.description', 'club.node_id', + 'club.club_creation_date', 'club.user_id' + ]) + ->get() + ->map($this->formatClub(...)) + ->toArray(); + }); + } +} diff --git a/app/Services/FileServersService.php b/app/Services/FileServersService.php index 42d82c0..742db53 100644 --- a/app/Services/FileServersService.php +++ b/app/Services/FileServersService.php @@ -3,6 +3,7 @@ namespace App\Services; use App\Models\EntryFile; +use App\Models\LogXfUser; use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Http; @@ -110,7 +111,6 @@ class FileServersService { 'filename' => $filename, 'current_chunk' => $currentChunk, 'total_chunks' => $totalChunks, - // TODO : Must replace User ID 'zeus' => $this->generateZeusToken( \Auth::user()->user_id, $server['base_url'], "Uploadchunk" ), ]); @@ -129,4 +129,43 @@ class FileServersService { return $data; } + public function deleteFile( + string $filePath, + string $fileName, + int $userId + ): bool { + + foreach( $this->servers as $serverKey => $server ){ + + $response = Http::withHeaders([]) + ->post( $server['delete_file'], [ + 'filepath' => $filePath, + 'filename' => $fileName, + 'zeus' => $this->generateZeusToken( $userId, $server['base_url'], "Deletefile" ), + ]); + + if (!$response->successful()) { + throw new \RuntimeException( $response->body() ); + } + + $data = $response->json(); + if( isset( $data['status'] ) && $data['status'] === 'deleted' ){ + continue; + } else { + return false; + } + } + + activity('entry-file') + ->causedBy(LogXfUser::find($userId)) + ->withProperties([ + 'filepath' => $filePath, + 'filename' => $fileName, + ]) + ->event('file_deletion') + ->log('File deleted'); + + return true; + } + } diff --git a/app/Services/NewsService.php b/app/Services/NewsService.php new file mode 100644 index 0000000..1bd4a75 --- /dev/null +++ b/app/Services/NewsService.php @@ -0,0 +1,194 @@ +request = $request; + $user_id = \Auth::user()->user_id; + + $news = DB::transaction(function () use ($user_id) { + + // STEP 1 : Slug + $slug = EntryHelpers::uniqueSlug( $this->request->input('title'), News::class ); + + $fields = [ + 'title' => $this->request->input('title'), + 'slug' => $slug, + 'category_id' => $this->request->input('category'), + 'description' => $this->request->input('description'), + 'state' => $this->request->input('submit-state'), + 'entry_id' => $this->request->input('entry_id'), + 'relevant_link' => $this->request->input('release_site'), + 'youtube_link' => $this->request->input('youtube_link'), + 'user_id' => $user_id, + ]; + + $news = News::create( $fields ); + + // STEP 3 : Prepare Gallery images. + $this->Step3a_PrepareGalleryImages( $news ); + + return $news; + + }); + + $this->Step3b_SaveGalleryImages( $news ); + + $this->Step4_CreateCommentsThread( $news ); + + return $news; + } + + private function Step3a_PrepareGalleryImages(News $news): void + { + foreach( $this->request->input('gallery', [] ) ?? [] as $i => $imagePath ){ + $news->gallery()->create([ + 'image' => $imagePath, + 'order' => $i + ]); + } + } + + private function Step3b_SaveGalleryImages(News $news): void + { + foreach ( $news->gallery ?? [] as $galleryItem ) { + $newPath = 'news/gallery-images/' . $news->id . '/' . basename($galleryItem->image); + + if( !Storage::disk('public')->move($galleryItem->image, $newPath) ) + continue; + + $galleryItem->update(['image' => $newPath]); + } + } + + private function Step4_CreateCommentsThread( News $news ): void + { + if( $news->state !== 'published' ) + return; + + if( !$news->comments_thread_id ) + CreateXenForoCommentsThread::dispatch( $news ); + } + + public function editNews(Request $request, News $news): News + { + $this->request = $request; + $this->news = $news; + + if( \Auth::user()->can('moderate', $news) ){ + $user_id = $this->request->input('owner_user_id'); + } else { + $user_id = \Auth::user()->user_id; + } + + $galleryPaths = []; + + $news = DB::transaction(function () use ($user_id, &$galleryPaths) { + + // STEP 1 : Refresh slug. + if( $this->request->input('title') !== $this->news->title ){ + $this->news->slug = EntryHelpers::uniqueSlug( $this->request->input('title'), News::class, $this->news->id ); + } + + $fields = [ + 'title' => $this->request->input('title'), + 'slug' => $this->news->slug, + 'category_id' => $this->request->input('category'), + 'description' => $this->request->input('description'), + 'state' => $this->request->input('submit-state'), + 'entry_id' => $this->request->input('entry_id'), + 'relevant_link' => $this->request->input('release_site'), + 'youtube_link' => $this->request->input('youtube_link'), + 'user_id' => $user_id, + ]; + + if( \Auth::user()->can('moderate', $this->news) ){ + $fields['staff_comment'] = $this->request->input('staff_comment'); + $fields['comments_thread_id'] = $this->request->input('comments_thread_id'); + } + + $this->news->update( $fields ); + + $galleryPaths = $this->eStep3a_UpdateGalleryImages(); + + return $this->news; + + }); + + $this->eStep3b_UpdateGalleryImages( $galleryPaths ); + + $this->step4_CreateCommentsThread( $news ); + + return $news; + + } + + private function eStep3a_UpdateGalleryImages(): array + { + $requestGallery = $this->request->input('gallery', [] ) ?? []; + $existingGalleryPaths = $this->news->gallery->pluck('image')->toArray(); + + $needDeletion = array_diff( $existingGalleryPaths, $requestGallery ); + + if( !empty( $needDeletion ) ){ + $this->news->gallery()->whereIn('image', $needDeletion )->delete(); + } + + $needAddition = array_diff( $requestGallery, $existingGalleryPaths ); + $images = []; + foreach( $needAddition as $imagePath ){ + $images[] = $this->news->gallery()->create([ + 'image' => $imagePath, + ]); + } + + foreach( $requestGallery as $i => $imagePath ){ + $this->news->gallery()->where('image', $imagePath )->update(['order' => $i]); + } + + return [ 'addition' => $images, 'deletion' => $needDeletion ]; + } + + private function eStep3b_UpdateGalleryImages( array $pathsChanges ): void + { + foreach ( $pathsChanges['deletion'] as $deletePath ){ + if( Storage::disk('public')->exists($deletePath) ) + Storage::disk('public')->delete($deletePath); + } + + foreach ( $pathsChanges['addition'] as $galleryItem ){ + $newPath = 'news/gallery-images/' . $this->news->id . '/' . basename( $galleryItem->image ); + + if( !Storage::disk('public')->move( $galleryItem->image, $newPath ) ){ + continue; + } + + $galleryItem->update(['image' => $newPath]); + } + } + +} diff --git a/app/Services/SubmissionsService.php b/app/Services/SubmissionsService.php index b7df22b..15130cf 100644 --- a/app/Services/SubmissionsService.php +++ b/app/Services/SubmissionsService.php @@ -4,9 +4,11 @@ namespace App\Services; use App\Exceptions\SubmissionException; use App\Helpers\EntryHelpers; +use App\Helpers\PlayOnlineHelpers; use App\Helpers\XenForoHelpers; use App\Http\Requests\StoreEntryRequest; use App\Jobs\CreateXenForoCommentsThread; +use App\Jobs\DeleteFile; use App\Models\Author; use App\Models\Category; use App\Models\Entry; @@ -76,8 +78,12 @@ class SubmissionsService { 'error' => null, 'uuid' => $uuid, 'state' => $file->state, + 'can_be_online_patched' => EntryHelpers::enableOnlinePatcherBasedOnExtension($file['filename']), 'meta_online_patcher' => $file->online_patcher, 'meta_secondary_online_patcher' => $file->secondary_online_patcher, + 'meta_play_online' => $file->playOnlineSetting()->exists() ? true : false, + 'meta_play_online_core' => $file->playOnlineSetting()->exists() ? $file->playOnlineSetting->core : '', + 'meta_play_online_threads' => $file->playOnlineSetting()->exists() ? $file->playOnlineSetting->threads : false, ]; $file = Cache::get("uploaded_file_{$uuid}"); @@ -92,8 +98,12 @@ class SubmissionsService { 'error' => null, 'uuid' => $uuid, 'state' => $file['state'], + 'can_be_online_patched' => EntryHelpers::enableOnlinePatcherBasedOnExtension($file['filename']), 'meta_online_patcher' => false, 'meta_secondary_online_patcher' => false, + 'meta_play_online' => false, + 'meta_play_online_core' => null, + 'meta_play_online_threads' => false ]; return null; @@ -298,15 +308,20 @@ class SubmissionsService { foreach ( $uuidData ?? [] as $uuid ) { $fileData = Cache::pull("uploaded_file_{$uuid}"); if( !$fileData ) - throw new SubmissionException( "File {$uuid} has expired. Please delete all your files and retry. If it's an edition, delete all your new files and retry." ); + throw new SubmissionException( "File {$uuid} has expired. Please delete all your files and retry. If it's an edition, delete all the new files and retry." ); - $onlinePatcher = (bool)($metadataArray[$uuid]['online_patcher'] ?? false); - if( !$onlinePatcher ) - $onlinePatcher = EntryHelpers::enableOnlinePatcherBasedOnExtension( $fileData['filename'] ); + if( section_must_be( [ 'romhacks', 'translations' ], $entry->type ) ) { + $onlinePatcher = (bool)($metadataArray[$uuid]['online_patcher'] ?? false); + if (!$onlinePatcher) + $onlinePatcher = EntryHelpers::enableOnlinePatcherBasedOnExtension($fileData['filename']); - $secondaryOnlinePatcher = (bool)($metadataArray[$uuid]['secondary_online_patcher'] ?? false); + $secondaryOnlinePatcher = (bool)($metadataArray[$uuid]['secondary_online_patcher'] ?? false); + } else { + $onlinePatcher = false; + $secondaryOnlinePatcher = false; + } - EntryFile::create([ + $file = EntryFile::create([ 'entry_id' => $entry->id, 'file_uuid' => $uuid, 'filename' => $fileData['filename'], @@ -319,6 +334,26 @@ class SubmissionsService { 'secondary_online_patcher' => $secondaryOnlinePatcher, ]); + if( section_must_be( ['romhacks', 'translations', 'homebrew'], $entry->type ) ) { + $playOnline = (bool)($metadataArray[$uuid]['play_online'] ?? false); + $playOnlineCore = $metadataArray[$uuid]['play_online_core'] ?? null; + $playOnlineThreads = (bool)($metadataArray[$uuid]['play_online_threads'] ?? false); + + if (!$playOnline && $entry->getRealPlatform()?->play_online_core !== null) { + $playOnline = true; + $playOnlineCore = $entry->getRealPlatform()?->play_online_core; + } + + if ($playOnline) { + $file->playOnlineSetting()->updateOrCreate( + ['file_id' => $file->id], + [ + 'core' => $playOnlineCore, + 'threads' => $playOnlineThreads, + ] + ); + } + } } } @@ -452,9 +487,10 @@ class SubmissionsService { private function Step12a_PrepareGalleryImages( Entry $entry ): void { - foreach ( $this->request->input('gallery', [] ) ?? [] as $imagePath ) { + foreach ( $this->request->input('gallery', [] ) ?? [] as $i => $imagePath ) { $entry->gallery()->create([ 'image' => $imagePath, + 'order' => $i ]); } } @@ -556,6 +592,10 @@ class SubmissionsService { if( \Auth::user()->can('moderate', $this->entry) ){ $fields['staff_comment'] = $this->request->input('staff_comment'); $fields['featured'] = $this->request->input('featured') ?? false; + if( $fields['featured'] == true && $this->entry->featured_at === null ) + $fields['featured_at'] = now(); + if( $fields['featured'] == false ) + $fields['featured_at'] = null; $fields['comments_thread_id'] = $this->request->input('comments_thread_id'); } @@ -666,6 +706,10 @@ class SubmissionsService { $needDeletion = array_diff( $existingUuids, $requestUuids ); if( !empty( $needDeletion ) ){ + $userId = \Auth::user()->user_id; + EntryFile::where('entry_id', $entryId)->whereIn('file_uuid', $needDeletion)->get()->each( function ( $f ) use ( $userId ) { + DeleteFile::dispatch( $f->filepath, $f->filename, $userId); + }); EntryFile::where('entry_id', $entryId)->whereIn('file_uuid', $needDeletion)->delete(); } @@ -680,15 +724,45 @@ class SubmissionsService { foreach( $stateMap as $uuid => $state ){ - $onlinePatcher = (bool)($metadataArray[$uuid]['online_patcher'] ?? false); - $secondaryOnlinePatcher = (bool)($metadataArray[$uuid]['secondary_online_patcher'] ?? false); + if( section_must_be( ['romhacks', 'translations'], $this->entry->type ) ) { + $onlinePatcher = (bool)($metadataArray[$uuid]['online_patcher'] ?? false); + $secondaryOnlinePatcher = (bool)($metadataArray[$uuid]['secondary_online_patcher'] ?? false); + } else { + $onlinePatcher = false; + $secondaryOnlinePatcher = false; + } - EntryFile::where('file_uuid', $uuid)->where('entry_id', $entryId)->where('state', '!=', 'archived') - ->update([ - 'state' => $state, - 'online_patcher' => $onlinePatcher, - 'secondary_online_patcher' => $secondaryOnlinePatcher, - ]); + $entryFile = EntryFile::where('file_uuid', $uuid)->where('entry_id', $entryId)->where('state', '!=', 'archived')->first(); + if( !$entryFile ) + continue; + + $entryFile->update([ + 'state' => $state, + 'online_patcher' => $onlinePatcher, + 'secondary_online_patcher' => $secondaryOnlinePatcher, + ]); + + if( section_must_be( ['romhacks', 'translations', 'homebrew'], $this->entry->type ) ) { + + $playOnline = (bool)($metadataArray[$uuid]['play_online'] ?? false); + $playOnlineCore = $metadataArray[$uuid]['play_online_core'] ?? null; + $playOnlineThreads = (bool)($metadataArray[$uuid]['play_online_threads'] ?? false); + + if ($playOnline) { + if ($playOnlineCore === null || !in_array($playOnlineCore, PlayOnlineHelpers::getCoreLists())) + $playOnlineCore = $this->entry->getRealPlatform()->play_online_core ? $this->entry->getRealPlatform()->play_online_core : 'nes'; + + $entryFile->playOnlineSetting()->updateOrCreate( + ['file_id' => $entryFile->id], + [ + 'core' => $playOnlineCore, + 'threads' => $playOnlineThreads, + ] + ); + } else { + $entryFile->playOnlineSetting()->delete(); + } + } } } @@ -860,6 +934,10 @@ class SubmissionsService { ]); } + foreach ( $requestGallery as $i => $imagePath ){ + $this->entry->gallery()->where('image', $imagePath )->update(['order' => $i]); + } + return [ 'addition' => $images, 'deletion' => $needDeletion ]; } diff --git a/app/Services/XenforoApiService.php b/app/Services/XenforoApiService.php index f1ce2ef..602c6e3 100644 --- a/app/Services/XenforoApiService.php +++ b/app/Services/XenforoApiService.php @@ -92,7 +92,7 @@ class XenforoApiService { return $response['success'] ?? false; } - public function createCommentsThread( Entry $entry ): bool + public function createCommentsThread( Entry|News $entry ): bool { if( !$entry->comments_thread_id || $entry->comments_thread_id <= 0 ){ $data = [ @@ -134,6 +134,14 @@ class XenforoApiService { return $response['success'] ?? false; } + public function featuredRequest( Entry $entry ): bool + { + $response = $this->post("romhackplaza_entry/featured", data: [ + 'entry_id' => $entry->id, 'user_id' => $entry->user_id, 'entry_title' => $entry->complete_title ?? $entry->title, + ]); + return $response['success'] ?? false; + } + public function deleteThreadWithEntry(int $threadId): bool { return (bool) $this->delete( "threads/{$threadId}", data: ['reason' => "Deletion with entry." ] ); diff --git a/app/Services/XenforoService.php b/app/Services/XenforoService.php index fc8d0d1..47ca18b 100644 --- a/app/Services/XenforoService.php +++ b/app/Services/XenforoService.php @@ -195,9 +195,9 @@ class XenforoService { } - private function hashCSRFToken( string $token ): string + private function hashCSRFToken( string $token, int $timestamp ): string { - return hash_hmac('md5', $token . time(), config('app.xf_salt') ); + return hash_hmac('md5', $token . $timestamp, config('app.xf_salt') ); } public function getCSRFToken(): string { @@ -207,6 +207,28 @@ class XenforoService { Cookie::queue('xf_csrf', $token, 0, '/', config('session.domain'), 0, false, false ); } - return time() . ',' . $this->hashCSRFToken($token); + $timestamp = time(); + return $timestamp . ',' . $this->hashCSRFToken($token, $timestamp); + } + public function verifyCSRFToken( string $requestToken ): bool + { + $token = Cookie::get('xf_csrf'); + if( !$token ){ + return false; + } + + try { + [$timestamp, $hash] = explode(',', $requestToken); + } catch (\Throwable $th) { + return false; + } + + $timestamp = intval($timestamp); + $currentTimestamp = time(); + + if( abs( $currentTimestamp - $timestamp ) > 3600 ) + return false; + + return $hash === $this->hashCSRFToken($token, $timestamp); } } diff --git a/app/Support/XenForoCauserResolver.php b/app/Support/XenForoCauserResolver.php new file mode 100644 index 0000000..0e9e749 --- /dev/null +++ b/app/Support/XenForoCauserResolver.php @@ -0,0 +1,22 @@ +getAuthIdentifier() ){ + return LogXfUser::find($user->getAuthIdentifier()); + } + + return null; + } +} diff --git a/app/Traits/HasGallery.php b/app/Traits/HasGallery.php index c775d50..57f0ed0 100644 --- a/app/Traits/HasGallery.php +++ b/app/Traits/HasGallery.php @@ -9,6 +9,6 @@ trait HasGallery { public function gallery(): MorphMany { - return $this->morphMany(Gallery::class, 'galleryable')->orderBy('id'); + return $this->morphMany(Gallery::class, 'galleryable')->orderBy('order')->orderBy('id'); } } diff --git a/app/View/Components/CategorySelector.php b/app/View/Components/CategorySelector.php index 44c7fdb..9e0f412 100644 --- a/app/View/Components/CategorySelector.php +++ b/app/View/Components/CategorySelector.php @@ -19,7 +19,8 @@ class CategorySelector extends Component public function __construct( public string $section, public array $selected = [], - public bool $required = true + public bool $required = true, + public bool $news = false ) { $this->categories = Category::query() @@ -36,6 +37,6 @@ class CategorySelector extends Component */ public function render(): View|Closure|string { - return view('components.category-selector'); + return $this->news === true ? view('components.news-category-selector' ) : view('components.category-selector'); } } diff --git a/app/View/Components/NewsCard.php b/app/View/Components/NewsCard.php new file mode 100644 index 0000000..fdb81dc --- /dev/null +++ b/app/View/Components/NewsCard.php @@ -0,0 +1,31 @@ +entry === null ) - $this->entry = 'App\Models\Entry'; + if( $this->entry === null ){ + if( $news ) + $this->entry = 'App\Models\News'; + else + $this->entry = 'App\Models\Entry'; + } } public function availableStates(): array diff --git a/app/helpers.php b/app/helpers.php index fb7eaff..a8fd4d0 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -25,6 +25,15 @@ if( !function_exists( 'section_must_not_be' ) ){ } +if( !function_exists('userTheme' ) ){ + function userTheme(): string { + if( !\Auth::guest() ){ + return \Auth::user()->style_variation ?? 'default'; + } + return \Illuminate\Support\Facades\Cookie::get('xf_style_variation', 'default'); + } +} + if( !function_exists( 'databaseRoute' ) ){ function databaseRoute( array $params = [] ): string diff --git a/bootstrap/app.php b/bootstrap/app.php index 3928513..641e643 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -13,7 +13,7 @@ return Application::configure(basePath: dirname(__DIR__)) health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { - $middleware->encryptCookies(except: ['xf_session','xf_user','xf_csrf','theme','entries_per_page']); + $middleware->encryptCookies(except: ['xf_session','xf_user','xf_csrf','xf_style_variation','activity_filters']); $middleware->alias([ 'xf.auth' => \App\Http\Middleware\CheckXenForoPermissions::class, ]); diff --git a/composer.json b/composer.json index cf73412..9df3a22 100644 --- a/composer.json +++ b/composer.json @@ -7,14 +7,16 @@ "license": "MIT", "require": { "php": "^8.4", + "ext-pdo": "*", + "ext-simplexml": "*", + "ext-xmlreader": "*", "diglactic/laravel-breadcrumbs": "^10.1", "filament/filament": "^5.6", "laravel/framework": "^13.7", "laravel/tinker": "^3.0", "livewire/livewire": "^4.3", "predis/predis": "^3.4", - "ext-xmlreader": "*", - "ext-simplexml": "*" + "spatie/laravel-activitylog": "^5.0" }, "require-dev": { "barryvdh/laravel-debugbar": "^4.2", diff --git a/composer.lock b/composer.lock index a713774..de6c591 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": "79ce85f4c121f30d964f9322cb7120a4", + "content-hash": "d561062afd8c291a93e8fd1e00f4e901", "packages": [ { "name": "blade-ui-kit/blade-heroicons", @@ -5273,6 +5273,99 @@ ], "time": "2024-05-17T09:06:10+00:00" }, + { + "name": "spatie/laravel-activitylog", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-activitylog.git", + "reference": "0e00fe74fd071cc572a045459f6d4c9de33130bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/0e00fe74fd071cc572a045459f6d4c9de33130bd", + "reference": "0e00fe74fd071cc572a045459f6d4c9de33130bd", + "shasum": "" + }, + "require": { + "illuminate/config": "^12.0 || ^13.0", + "illuminate/database": "^12.0 || ^13.0", + "illuminate/support": "^12.0 || ^13.0", + "php": "^8.4", + "spatie/laravel-package-tools": "^1.6.3" + }, + "require-dev": { + "ext-json": "*", + "larastan/larastan": "^3.0", + "laravel/pint": "^1.29", + "orchestra/testbench": "^10.0 || ^11.0", + "pestphp/pest": "^4.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Activitylog\\ActivitylogServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Activitylog\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Tom Witkowski", + "email": "dev.gummibeer@gmail.com", + "homepage": "https://gummibeer.de", + "role": "Developer" + } + ], + "description": "A very simple activity logger to monitor the users of your website or application", + "homepage": "https://github.com/spatie/activitylog", + "keywords": [ + "activity", + "laravel", + "log", + "spatie", + "user" + ], + "support": { + "issues": "https://github.com/spatie/laravel-activitylog/issues", + "source": "https://github.com/spatie/laravel-activitylog/tree/5.0.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-03-25T10:04:54+00:00" + }, { "name": "spatie/laravel-package-tools", "version": "1.93.0", @@ -11241,8 +11334,9 @@ "prefer-lowest": false, "platform": { "php": "^8.4", - "ext-xmlreader": "*", - "ext-simplexml": "*" + "ext-pdo": "*", + "ext-simplexml": "*", + "ext-xmlreader": "*" }, "platform-dev": {}, "plugin-api-version": "2.9.0" diff --git a/config/database.php b/config/database.php index c3c8ad2..c806590 100644 --- a/config/database.php +++ b/config/database.php @@ -129,6 +129,13 @@ return [ 'database' => storage_path('hashes.sqlite'), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'discord' => [ + 'driver' => 'sqlite', + 'database' => env('DISCORD_DB_PATH'), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ] ], diff --git a/config/menu.php b/config/menu.php index 18f3fc1..89cabe7 100644 --- a/config/menu.php +++ b/config/menu.php @@ -18,16 +18,21 @@ return [ 'icon' => 'database', 'route' => 'entries.index' ], + [ + 'name' => 'News', + 'icon' => 'newspaper', + 'route' => 'news.index' + ], [ 'name' => "Submissions queue", 'icon' => 'gavel', 'route' => 'queue.index' ], [ - 'name' => "My Drafts", + 'name' => "My drafts", 'icon' => 'scissors', 'route' => 'entries.drafts', - 'auth' => true + 'requires_auth' => true ] ] ], diff --git a/database/migrations/2026_05_10_072747_create_entries_table.php b/database/migrations/2026_05_10_072747_create_entries_table.php index 0c6a41f..4cac30a 100644 --- a/database/migrations/2026_05_10_072747_create_entries_table.php +++ b/database/migrations/2026_05_10_072747_create_entries_table.php @@ -23,7 +23,6 @@ return new class extends Migration $table->longText( 'description' ); $table->string( 'main_image' )->nullable(); - // TODO: Replace it by state. $table->enum( 'state', [ 'draft', 'pending', 'published', 'locked', 'hidden' ] )->default('draft'); $table->boolean('featured')->default(false); diff --git a/database/migrations/2026_06_10_090320_create_news_table.php b/database/migrations/2026_06_10_090320_create_news_table.php index dab2a32..28ea81a 100644 --- a/database/migrations/2026_06_10_090320_create_news_table.php +++ b/database/migrations/2026_06_10_090320_create_news_table.php @@ -12,7 +12,22 @@ return new class extends Migration public function up(): void { Schema::create('news', function (Blueprint $table) { + $table->id(); + $table->string('title'); + $table->string('slug')->unique(); + $table->foreignId('category_id')->nullable()->constrained('categories')->nullOnDelete(); + $table->longText('description'); + $table->enum('state', [ 'draft', 'pending', 'published', 'locked', 'rejected', 'hidden' ] )->default('draft'); + + $table->foreignId('entry_id')->nullable()->constrained('entries')->nullOnDelete(); + $table->string('relevant_link', 500 )->nullable(); + $table->string('youtube_link', 500 )->nullable(); + + $table->unsignedBigInteger( 'user_id' ); // xf_user_id + $table->unsignedBigInteger( 'comments_thread_id' )->nullable(); // xf_thread + + $table->softDeletes(); $table->timestamps(); }); } diff --git a/database/migrations/2026_06_10_091105_add_fields_for_queue_to_news.php b/database/migrations/2026_06_10_091105_add_fields_for_queue_to_news.php new file mode 100644 index 0000000..0e3f9b1 --- /dev/null +++ b/database/migrations/2026_06_10_091105_add_fields_for_queue_to_news.php @@ -0,0 +1,29 @@ +text("staff_comment")->nullable()->after("state"); + $table->timestamp("rejected_at")->nullable()->after("staff_comment"); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('news', function (Blueprint $table) { + $table->dropColumn(['staff_comment', 'rejected_at']); + }); + } +}; diff --git a/database/migrations/2026_06_11_155053_add_order_to_galleries_table.php b/database/migrations/2026_06_11_155053_add_order_to_galleries_table.php new file mode 100644 index 0000000..3a770f6 --- /dev/null +++ b/database/migrations/2026_06_11_155053_add_order_to_galleries_table.php @@ -0,0 +1,28 @@ +unsignedSmallInteger('order')->default(0)->after('image'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('galleries', function (Blueprint $table) { + $table->dropColumn('order'); + }); + } +}; diff --git a/database/migrations/2026_06_13_210606_add_featured_at_field_to_entries.php b/database/migrations/2026_06_13_210606_add_featured_at_field_to_entries.php new file mode 100644 index 0000000..53af415 --- /dev/null +++ b/database/migrations/2026_06_13_210606_add_featured_at_field_to_entries.php @@ -0,0 +1,28 @@ +dateTime('featured_at')->nullable()->after('featured'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('entries', function (Blueprint $table) { + $table->dropColumn('featured_at'); + }); + } +}; diff --git a/database/migrations/2026_06_14_163648_create_play_online_settings_table.php b/database/migrations/2026_06_14_163648_create_play_online_settings_table.php new file mode 100644 index 0000000..d0a4e6d --- /dev/null +++ b/database/migrations/2026_06_14_163648_create_play_online_settings_table.php @@ -0,0 +1,34 @@ +unsignedBigInteger('file_id')->primary(); + $table->foreign('file_id') + ->references('id') + ->on('entry_files') + ->onDelete('cascade'); + + $table->string('core', 30); + $table->boolean('threads')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('play_online_settings'); + } +}; diff --git a/database/migrations/2026_06_14_174906_add_default_core_play_online_for_platforms.php b/database/migrations/2026_06_14_174906_add_default_core_play_online_for_platforms.php new file mode 100644 index 0000000..8ae5710 --- /dev/null +++ b/database/migrations/2026_06_14_174906_add_default_core_play_online_for_platforms.php @@ -0,0 +1,28 @@ +string('play_online_core')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('platforms', function (Blueprint $table) { + $table->dropColumn('play_online_core'); + }); + } +}; diff --git a/database/migrations/2026_06_16_100941_create_activity_log_table.php b/database/migrations/2026_06_16_100941_create_activity_log_table.php new file mode 100644 index 0000000..5c17c24 --- /dev/null +++ b/database/migrations/2026_06_16_100941_create_activity_log_table.php @@ -0,0 +1,23 @@ +id(); + $table->string('log_name')->nullable()->index(); + $table->text('description'); + $table->nullableMorphs('subject', 'subject'); + $table->string('event')->nullable(); + $table->nullableMorphs('causer', 'causer'); + $table->json('attribute_changes')->nullable(); + $table->json('properties')->nullable(); + $table->timestamps(); + }); + } +}; diff --git a/database/migrations/2026_06_16_122812_add_download_field_to_entry_files.php b/database/migrations/2026_06_16_122812_add_download_field_to_entry_files.php new file mode 100644 index 0000000..9c241e1 --- /dev/null +++ b/database/migrations/2026_06_16_122812_add_download_field_to_entry_files.php @@ -0,0 +1,28 @@ +unsignedBigInteger('download_count')->default(0); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('entry_files', function (Blueprint $table) { + $table->dropColumn('download_count'); + }); + } +}; diff --git a/database/migrations/discord/2026_06_12_130031_create_actions_table.php b/database/migrations/discord/2026_06_12_130031_create_actions_table.php new file mode 100644 index 0000000..7715239 --- /dev/null +++ b/database/migrations/discord/2026_06_12_130031_create_actions_table.php @@ -0,0 +1,29 @@ +create('actions', function (Blueprint $table) { + $table->id(); + $table->string('action'); + $table->json('data'); + $table->boolean('done')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::connection('discord')->dropIfExists('actions'); + } +}; diff --git a/database/migrations/discord/2026_06_12_131701_add_fields_to_actions.php b/database/migrations/discord/2026_06_12_131701_add_fields_to_actions.php new file mode 100644 index 0000000..d2da0dd --- /dev/null +++ b/database/migrations/discord/2026_06_12_131701_add_fields_to_actions.php @@ -0,0 +1,28 @@ +table('actions', function (Blueprint $table) { + $table->string('errors')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::connection('discord')->table('actions', function (Blueprint $table) { + $table->dropColumn('errors'); + }); + } +}; diff --git a/extra.less b/extra.less index 62e665d..2611c34 100644 --- a/extra.less +++ b/extra.less @@ -63,7 +63,7 @@ ul { --error: #e57373; --info: #1976d2; --success: #81c784; - --success2: #fdeb0f; + --success2: #388e3c; /* Typo */ --typography: 'Segoe UI', 'San Francisco', 'Helvetica Neue', sans-serif; @@ -309,6 +309,11 @@ ul { color: var(--text); border-color: var(--success2); } +.\$badge.yellow, .\$badge.utilities { + background-color: #fdeb0f; + color: #000; + border-color: #fdeb0f; +} .\$topbar-badge { position: absolute; @@ -791,6 +796,169 @@ ul { +/* File: resources/css/components/drafts.css */ +.\$drafts-count { + font-size: 0.85rem; + color: var(--text2); + margin-bottom: 15px; + padding-bottom: 10px; + border-bottom: 1px solid var(--border); +} + +.\$drafts-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 15px; + padding: 80px 20px; + background-color: var(--bg2); + border: 1px dashed var(--border); + text-align: center; + color: var(--text2); + + h3 { + font-size: 1.1rem; + color: var(--text); + margin: 0; + } + + p { + font-size: 0.9rem; + margin: 0; + } + +} + +.\$drafts-list { + display: flex; + flex-direction: column; + gap: 15px; +} + +.\$drafts-item { + display: flex; + gap: 20px; + background-color: var(--bg2); + border: 1px solid var(--border); + border-left: 3px solid var(--rhpz-orange); + padding: 20px; + transition: border-color 0.15s; + + &:hover { + border-color: var(--rhpz-orange); + } +} + +.\$drafts-cover { + width: 80px; + height: 80px; + flex-shrink: 0; + background-color: var(--bg); + border: 1px solid var(--border); + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + + img { + width: 100%; + height: 100%; + object-fit: contain; + } +} + +.\$drafts-cover-placeholder { + color: var(--border); +} + +.\$drafts-info { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 12px; +} + +.\$drafts-top { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 15px; +} + +.\$drafts-title { + font-size: 1rem; + font-weight: 600; + color: var(--text); + margin-bottom: 6px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.\$drafts-meta { + display: flex; + gap: 6px; + flex-wrap: wrap; +} + +.\$drafts-dates { + display: flex; + flex-direction: column; + gap: 4px; + text-align: right; + font-size: 0.78rem; + color: var(--text2); + flex-shrink: 0; + + span { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 5px; + } +} + +.\$drafts-progress { + display: flex; + align-items: center; + gap: 10px; +} + +.\$drafts-progress-bar { + flex: 1; + height: 4px; + background-color: var(--bg4); + overflow: hidden; +} + +.\$drafts-progress-fill { + height: 100%; + background-color: var(--rhpz-orange); + transition: width 0.3s ease; + + .\$complete { + background-color: var(--success); + } +} +.\$drafts-progress-label { + font-size: 0.75rem; + color: var(--text2); + white-space: nowrap; +} +.\$drafts-actions { + display: flex; + flex-direction: column; + gap: 8px; + justify-content: center; + flex-shrink: 0; + .\$btn { + white-space: nowrap; + } +} + + /* File: resources/css/components/easymde.css */ .\$EasyMDEContainer { display: flex; @@ -1264,6 +1432,50 @@ ul { flex-direction: column; gap: 5px; } +.\$gallery-item { + position: relative; + cursor: grab; + transition: opacity 0.2s, transform 0.15s; + user-select: none; +} + +.gallery-item:active { cursor: grabbing; } + +.\$gallery-item--dragging { + opacity: 0.4; + transform: scale(0.97); +} + +.\$gallery-drag-handle { + position: absolute; + top: 4px; + left: 4px; + z-index: 10; + background-color: rgba(0,0,0,0.6); + color: #fff; + padding: 3px 4px; + display: flex; + align-items: center; + cursor: grab; + opacity: 0; + transition: opacity 0.15s; +} + +.gallery-item:hover .gallery-drag-handle { opacity: 1; } + +.\$gallery-order-badge { + position: absolute; + bottom: 4px; + left: 4px; + z-index: 10; + background-color: rgba(0,0,0,0.7); + color: #fff; + font-size: 0.7rem; + font-weight: 700; + padding: 2px 6px; + min-width: 20px; + text-align: center; +} .\$authors-list { display: grid; grid-template-columns: repeat(4, 1fr); @@ -1444,6 +1656,47 @@ ul { .author-search-item:hover { background-color: var(--bg3); } +.\$game-selector-mode { + display: flex; + gap: 0; + margin-bottom: 15px; + border: 1px solid var(--border); +} + +.\$game-selector-mode-btn { + display: flex; + align-items: center; + gap: 7px; + padding: 8px 14px; + background: none; + border: none; + border-right: 1px solid var(--border); + color: var(--text2); + font-size: 0.85rem; + cursor: pointer; + font-family: var(--font-family); + transition: background-color 0.1s, color 0.1s; +} + +.\$game-selector-mode-btn:last-child { + border-right: none; +} + +.\$game-selector-mode-btn:hover { + background-color: var(--bg3); + color: var(--text); +} + +.\$game-selector-mode-btn.active { + background-color: var(--bg3); + color: var(--rhpz-orange); + border-bottom: 2px solid var(--rhpz-orange); +} + +.\$game-selector-platform-only { + grid-column: span 1; +} + /* File: resources/css/components/grid.css */ .\$grid-c2 { @@ -1658,11 +1911,563 @@ ul { } -.\$modal-content { +.\$modal-content, .\$modal-body { padding: 20px; } +/* File: resources/css/components/modcp.css */ +.\$modcp-wrapper { + display: flex; + gap: 0; + align-items: flex-start; + min-height: calc(100vh - 60px); +} + +.\$modcp-sidebar { + width: 220px; + flex-shrink: 0; + background-color: var(--bg2); + border: 1px solid var(--border); + position: sticky; + top: 0; + align-self: flex-start; + margin-right: 15px; +} + +.\$modcp-sidebar-header { + display: flex; + align-items: center; + gap: 8px; + padding: 14px 16px; + font-weight: 600; + font-size: 0.88rem; + color: var(--text); + border-bottom: 1px solid var(--border); + background-color: var(--bg3); + text-transform: uppercase; + letter-spacing: 0.5px; +} + + +.modcp-nav { padding: 8px 0; } + +.modcp-nav-group { margin-bottom: 4px; } + +.\$modcp-nav-label { + display: block; + padding: 8px 16px 4px; + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.8px; + color: var(--text2); +} + +.\$modcp-nav-item { + display: flex; + align-items: center; + gap: 9px; + padding: 8px 16px; + font-size: 0.88rem; + color: var(--text); + text-decoration: none; + border-left: 3px solid transparent; + transition: background-color 0.1s, border-color 0.1s; + + &:hover { + background-color: var(--bg3); + text-decoration: none; + } + .\$active { + background-color: var(--bg3); + border-left-color: var(--rhpz-orange); + color: var(--text); + font-weight: 600; + } +} + +.\$modcp-nav-badge { + margin-left: auto; + background-color: var(--rhpz-orange); + color: #111; + font-size: 0.65rem; + font-weight: 700; + min-width: 18px; + height: 18px; + border-radius: 9px; + display: flex; + align-items: center; + justify-content: center; + padding: 0 5px; +} + +.\$modcp-content { + flex: 1; + min-width: 0; + background-color: var(--bg2); + border: 1px solid var(--border); + padding: 25px; +} + +.\$modcp-page-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 1.3rem; + font-weight: 600; + color: var(--text); + margin-bottom: 25px; + padding-bottom: 15px; + border-bottom: 1px solid var(--border); +} + +.\$modcp-count { + margin-left: auto; + font-size: 0.85rem; + font-weight: normal; + color: var(--text2); +} + +.\$modcp-section-title { + font-size: 0.78rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.7px; + color: var(--text2); + margin-bottom: 12px; +} + +.\$modcp-stats { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + gap: 12px; + margin-bottom: 25px; +} + +.\$modcp-stat-card { + display: flex; + align-items: center; + gap: 12px; + padding: 16px; + background-color: var(--bg3); + border: 1px solid var(--border); + border-left: 3px solid var(--border); + text-decoration: none; + transition: border-color 0.15s, background-color 0.15s; + color: var(--text); + + &:hover { + background-color: var(--bg4); + text-decoration: none; + } +} + +.modcp-stat-card--orange { border-left-color: var(--rhpz-orange); } +.modcp-stat-card--danger { border-left-color: var(--error); } +.modcp-stat-card--muted { cursor: default; } + +.modcp-stat-icon { color: var(--text2); } +.modcp-stat-card--orange .modcp-stat-icon { color: var(--rhpz-orange); } +.modcp-stat-card--danger .modcp-stat-icon { color: var(--error); } + +.modcp-stat-info { display: flex; flex-direction: column; } +.modcp-stat-value { font-size: 1.4rem; font-weight: 700; color: var(--text); line-height: 1; } +.modcp-stat-label { font-size: 0.75rem; color: var(--text2); margin-top: 3px; } + +.\$modcp-quick-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 25px; +} + +.\$modcp-quick-btn { + display: inline-flex; + align-items: center; + gap: 7px; + padding: 8px 14px; + background-color: var(--bg3); + border: 1px solid var(--border); + color: var(--text); + font-size: 0.85rem; + text-decoration: none; + transition: background-color 0.1s, border-color 0.1s; + + &:hover { + background-color: var(--bg4); + border-color: var(--rhpz-orange); + text-decoration: none; + } +} + +.modcp-list { display: flex; flex-direction: column; } + +.\$modcp-list-item { + display: flex; + align-items: center; + gap: 15px; + padding: 12px 15px; + border-bottom: 1px solid var(--border); + transition: background-color 0.1s; +} + +.modcp-list-item:last-child { border-bottom: none; } +.modcp-list-item:hover { background-color: var(--bg3); } +.modcp-list-item--deleted { opacity: 0.8; } + +.\$modcp-list-item-cover { + width: 44px; + height: 44px; + flex-shrink: 0; + background-color: var(--bg); + border: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + color: var(--border); +} + +.\$modcp-list-item-cover img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.\$modcp-list-item-info { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 4px; +} + +.\$modcp-list-item-title { + font-size: 0.92rem; + font-weight: 600; + color: var(--text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.\$modcp-list-item-meta { + display: flex; + align-items: center; + gap: 6px; + font-size: 0.78rem; + color: var(--text2); +} + +.\$modcp-list-item-actions { + display: flex; + gap: 6px; + flex-shrink: 0; +} + +.\$modcp-list-item-edit { + display: flex; + gap: 6px; + flex: 1; + align-items: center; +} + +.\$modcp-list-item-edit .\$form-input { + flex: 1; + padding: 5px 10px; + font-size: 0.88rem; +} + +.\$modcp-list-see-all { + display: block; + text-align: center; + padding: 10px; + font-size: 0.85rem; + color: var(--rhpz-orange); + border-top: 1px solid var(--border); + text-decoration: none; +} + +.\$modcp-add-form { + background-color: var(--bg3); + border: 1px solid var(--border); + padding: 15px; + margin-bottom: 20px; +} + +.\$modcp-add-form-inner { + display: flex; + gap: 8px; + align-items: center; +} + +.modcp-add-form-inner .form-input { flex: 1; } + +.\$modcp-empty { + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + padding: 50px 20px; + color: var(--text2); + text-align: center; +} + +.\$mod-alert { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 15px; + margin-bottom: 20px; + font-size: 0.88rem; + border: 1px solid; +} + +.\$mod-alert--success { + background-color: rgba(129, 199, 132, 0.08); + border-color: rgba(129, 199, 132, 0.3); + color: var(--success); +} + +.\$modcp-list-item-edit--game { + flex-wrap: wrap; + gap: 6px; +} + +.modcp-list-item-edit--game .form-input { min-width: 180px; flex: 2; } +.modcp-list-item-edit--game .form-select { flex: 1; min-width: 120px; } + +.\$log-filters { + margin-bottom: 16px; + background-color: var(--bg3); + border: 1px solid var(--border); +} + +.\$log-filters-main { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 14px; + flex-wrap: wrap; +} + +.\$log-search-wrap { + flex: 1; + min-width: 200px; + position: relative; + display: flex; + align-items: center; +} + +.\$log-search-wrap i { + position: absolute; + left: 10px; + color: var(--text2); + pointer-events: none; +} + +.log-search-wrap .form-input { padding-left: 30px; } + +.log-select { min-width: 130px; } + +.\$log-filter-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background-color: var(--rhpz-orange); + flex-shrink: 0; +} + +.\$log-filters-extra { + border-top: 1px solid var(--border); + padding: 12px 14px; +} + +.\$log-filters-extra-inner { + display: flex; + align-items: flex-end; + gap: 12px; + flex-wrap: wrap; +} + +.\$log-filter-field { + display: flex; + flex-direction: column; + gap: 4px; +} + +.\$log-filter-label { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.6px; + color: var(--text2); +} + +.log-transition-enter { transition: all .15s ease; } +.log-transition-leave { transition: all .1s ease; } + +.\$log-results-bar { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 0.78rem; + color: var(--text2); + margin-bottom: 10px; + padding: 0 2px; +} + +.log-loading { opacity: 0.5; } + +.log-item { align-items: flex-start; padding: 11px 14px; } +.log-item--open { background-color: var(--bg3); } + +.\$log-event-dot { + width: 26px; + height: 26px; + flex-shrink: 0; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-top: 2px; + border: 1px solid var(--border); + background-color: var(--bg3); + color: var(--text2); +} + +.\$log-event-dot--created { + background-color: rgba(129,199,132,.1); + border-color: rgba(129,199,132,.35); + color: var(--success); +} + +.\$log-event-dot--updated { + background-color: rgba(255,115,0,.1); + border-color: rgba(255,115,0,.35); + color: var(--rhpz-orange); +} + +.\$log-event-dot--deleted { + background-color: rgba(229,115,115,.1); + border-color: rgba(229,115,115,.35); + color: var(--error); +} + +.\$log-channel-badge { + display: inline-flex; + align-items: center; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 1px 6px; + background-color: rgba(255,255,255,.05); + border: 1px solid var(--border); + color: var(--text2); +} + +.log-id { color: var(--text2); font-size: 0.78rem; } +.log-sep { color: var(--border); } + +.\$log-item-right { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; + margin-left: auto; +} + +.\$log-timestamp { + font-size: 0.75rem; + color: var(--text2); + white-space: nowrap; +} + +.log-expand-btn { padding: 4px 7px; } + +.\$log-properties { + background-color: var(--bg); + border-bottom: 1px solid var(--border); + padding: 14px 14px 14px 54px; +} + +.\$log-diff-label { + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.7px; + color: var(--text2); + margin-bottom: 8px; +} + +.\$log-diff { + width: 100%; + border-collapse: collapse; + font-size: 0.8rem; +} + +.\$log-diff th { + text-align: left; + padding: 5px 10px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text2); + border-bottom: 1px solid var(--border); +} + +.\$log-diff td { + padding: 5px 10px; + border-bottom: 1px solid var(--border); + vertical-align: top; + max-width: 300px; + overflow-wrap: break-word; +} + +.log-diff tr:last-child td { border-bottom: none; } + +.\$log-diff-key { + font-size: 0.78rem; + font-weight: 600; + color: var(--text); + width: 160px; + white-space: nowrap; +} + +.log-diff-old-head { color: var(--error) !important; } +.log-diff-new-head { color: var(--success) !important; } + +.\$log-diff-old { + color: var(--error); + background-color: rgba(229,115,115,.05); +} + +.\$log-diff-new { + color: var(--success); + background-color: rgba(129,199,132,.05); +} + +.\$log-raw { + font-family: monospace; + font-size: 0.78rem; + color: var(--text2); + background-color: var(--bg2); + border: 1px solid var(--border); + padding: 10px 12px; + overflow-x: auto; + white-space: pre-wrap; + word-break: break-all; +} + +.\$log-pagination { + padding: 14px 0 4px; + border-top: 1px solid var(--border); +} + + /* File: resources/css/components/notifications.css */ .\$notifications, .\$conversations { position: absolute; @@ -2154,6 +2959,580 @@ ul { } +/* File: resources/css/components/tools.css */ +.\$patcher-container { + background-color: var(--bg2); + border: 1px solid var(--border); + padding: 25px; + margin-bottom: 20px; +} + +.\$patcher-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} + +@media (max-width: 768px) { + .\$patcher-grid { + grid-template-columns: 1fr; + } +} + +.\$patcher-dropzone { + border: 2px dashed var(--border); + background-color: var(--bg3); + padding: 55px 20px; + text-align: center; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + flex-direction: column; + align-items: center; + gap: 15px; +} + +.\$patcher-dropzone:hover, .\$patcher-dropzone.dragover { + border-color: var(--rhpz-orange); + background-color: var(--bg4); +} + +.\$patcher-dropzone.has-file { + border-color: var(--success); + background-color: rgba(129, 199, 132, 0.02); +} + +.\$patcher-status-box { + margin-top: 20px; + padding: 15px; + border: 1px solid var(--border); + background-color: var(--bg3); + font-size: 0.95rem; + line-height: 1.4; +} + +.\$btn:disabled { + opacity: 0.4; + cursor: not-allowed; + background-color: var(--bg3); + border-color: var(--border); + color: var(--text2); +} + +.\$embed-patch-box { + border: 1px solid var(--border); + background-color: var(--bg3); + padding: 25px; + height: 85%; + display: flex; + flex-direction: column; + justify-content: center; + gap: 15px; +} +.\$embed-patch-box-icon { + display: flex; + align-items: center; + gap: 15px; +} +.\$embed-patch-box-icon-block { + width: 48px; + height: 48px; + background-color: var(--bg2); + border: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: center; +} + + +/* File: resources/css/layout/activity.css */ + +.\$activity-hero-excerpt { + font-size: 0.9rem; + color: rgba(255,255,255,0.75); + margin-bottom: 12px; + line-height: 1.5; + max-width: 600px; +} + +.\$activity-tl-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid var(--border); + gap: 15px; + flex-wrap: wrap; +} + +.\$activity-tl-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 1.15rem; + font-weight: 600; + color: var(--text); + margin: 0; +} + +.\$activity-tl-filters { + display: flex; + gap: 5px; + flex-wrap: wrap; +} + +.\$activity-tl-filter { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 5px 12px; + background: none; + border: 1px solid var(--border); + color: var(--text2); + font-size: 0.8rem; + cursor: pointer; + font-family: var(--typography); + transition: all 0.1s; +} + +.activity-tl-filter:hover { background-color: var(--bg3); color: var(--text); } +.\$activity-tl-filter.active { + background-color: var(--bg3); + border-color: var(--rhpz-orange); + color: var(--rhpz-orange); +} + +.\$activity-day-sep { + display: flex; + align-items: center; + gap: 10px; + padding-left: 54px; + margin: 20px 0 12px; +} + +.\$activity-day-label { + font-size: 0.72rem; + font-weight: 600; + color: var(--text2); + text-transform: uppercase; + letter-spacing: 0.8px; + white-space: nowrap; +} + +.\$activity-day-line { + flex: 1; + height: 1px; + background-color: var(--border); +} + +.\$activity-tl-item { + display: flex; + gap: 0; + margin-bottom: 2px; +} + +.\$activity-tl-left { + width: 54px; + flex-shrink: 0; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 12px; +} + +.\$activity-tl-dot { + width: 32px; + height: 32px; + border-radius: 50%; + border: 1px solid var(--border); + background-color: var(--bg2); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + z-index: 1; +} + +.\$activity-tl-dot--entry { + background-color: rgba(255,115,0,0.1); + border-color: rgba(255,115,0,0.4); + color: var(--rhpz-orange); +} + +.\$activity-tl-dot--news { + background-color: rgba(129,199,132,0.1); + border-color: rgba(129,199,132,0.4); + color: var(--success); +} + +.\$activity-tl-dot--message, .\$activity-tl-dot--thread, .\$activity-tl-dot--club { + background-color: rgba(25,118,210,0.1); + border-color: rgba(25,118,210,0.4); + color: var(--info); +} + +.\$activity-tl-line { + width: 1px; + flex: 1; + background-color: var(--border); + margin-top: 4px; + min-height: 16px; +} + +.activity-tl-item:last-of-type .activity-tl-line { display: none; } + +.\$activity-tl-card { + flex: 1; + display: flex; + align-items: center; + gap: 12px; + background-color: var(--bg2); + border: 1px solid var(--border); + padding: 10px 14px; + margin-bottom: 8px; + text-decoration: none; + transition: border-color 0.15s, background-color 0.1s; + min-width: 0; +} + +.\$activity-tl-card:hover { + border-color: var(--rhpz-orange); + background-color: var(--bg3); + text-decoration: none; +} + +.\$activity-tl-thumb { + width: 52px; + height: 52px; + flex-shrink: 0; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--bg3); + border: 1px solid var(--border); +} + +.\$activity-tl-thumb img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.\$activity-tl-body { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 4px; +} + +.\$activity-tl-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.6px; + padding: 2px 7px; + width: fit-content; +} + +.\$activity-tl-badge--entry { + background-color: rgba(255,115,0,0.1); + color: var(--rhpz-orange); + border: 1px solid rgba(255,115,0,0.25); +} + +.\$activity-tl-badge--news { + background-color: rgba(129,199,132,0.1); + color: var(--success); + border: 1px solid rgba(129,199,132,0.25); +} + +.\$activity-tl-badge--message, .\$activity-tl-badge--thread, .\$activity-tl-dot--club { + background-color: rgba(25,118,210,0.1); + color: var(--info); + border: 1px solid rgba(25,118,210,0.25); +} + +.\$activity-tl-card-title { + font-size: 0.92rem; + font-weight: 600; + color: var(--text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.3; +} + +.\$activity-tl-card-description { + font-size: 0.8rem; + color: var(--text2); + white-space: nowrap; + text-overflow: ellipsis; + line-height: 1.3; +} + +.\$activity-tl-meta { + display: flex; + align-items: center; + gap: 10px; + font-size: 0.75rem; + color: var(--text2); + flex-wrap: wrap; +} + +.\$activity-tl-meta span { + display: flex; + align-items: center; + gap: 3px; +} + +.\$activity-tl-time { + font-size: 0.72rem; + color: var(--text2); + white-space: nowrap; + flex-shrink: 0; + align-self: center; +} + +.\$activity-tl-empty { + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + padding: 60px; + color: var(--text2); + text-align: center; + padding-left: 54px; +} + +@media (max-width: 600px) { + .activity-tl-header { flex-direction: column; align-items: flex-start; } + .activity-tl-thumb { display: none; } + .activity-day-sep { padding-left: 44px; } + .activity-tl-left { width: 44px; } +} + +.\$home-section { + margin-bottom: 30px; +} + +.\$home-section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 12px; + border-bottom: 1px solid var(--border); + margin-bottom: 14px; +} + +.\$home-section-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 1.05rem; + font-weight: 600; + color: var(--text); + margin: 0; +} + +.\$home-section-more { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 0.75rem; + color: var(--text2); + border: 1px solid var(--border); + padding: 4px 10px; + text-decoration: none; + transition: color 0.1s, border-color 0.1s; +} + +.\$home-section-more:hover { + color: var(--rhpz-orange); + border-color: var(--rhpz-orange); +} + +.\$news-strip { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 10px; +} + +.\$news-strip-card { + display: flex; + flex-direction: column; + background-color: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + overflow: hidden; + transition: border-color 0.15s; +} + +.news-strip-card:hover { border-color: var(--rhpz-orange); text-decoration: none; } + +.\$news-strip-cover { + height: 110px; + background-color: var(--bg3); + background-size: cover; + background-position: center; + position: relative; + flex-shrink: 0; +} + +.\$news-strip-date { + position: absolute; + bottom: 6px; + left: 8px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(255,255,255,0.8); + background: rgba(0,0,0,0.55); + padding: 2px 6px; + border: 1px solid rgba(255,255,255,0.07); +} + +.\$news-strip-body { + padding: 10px 12px; + display: flex; + flex-direction: column; + gap: 5px; + flex: 1; +} + +.\$news-strip-badge { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--success); + background: rgba(129,199,132,0.1); + border: 1px solid rgba(129,199,132,0.25); + padding: 1px 6px; + width: fit-content; +} + +.\$news-strip-title { + font-size: 0.85rem; + font-weight: 600; + color: var(--text); + line-height: 1.35; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + margin: 0; +} + +.\$news-strip-meta { + font-size: 0.72rem; + color: var(--text2); + margin-top: auto; +} + +.\$featured-entries-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; +} + +.\$featured-entry-card { + display: flex; + flex-direction: column; + background-color: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + overflow: hidden; + transition: border-color 0.15s; +} + +.featured-entry-card:hover { border-color: var(--rhpz-orange); text-decoration: none; } + +.\$featured-entry-cover { + height: 80px; + background-color: var(--bg3); + position: relative; + flex-shrink: 0; + overflow: hidden; +} + +.\$featured-entry-cover img { + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0.85; +} + +.\$featured-entry-star { + position: absolute; + top: 6px; + right: 6px; + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + background: rgba(255,115,0,0.9); + color: #111; + padding: 2px 6px; + border: 1px solid rgba(255,115,0,0.5); + display: flex; + align-items: center; + gap: 3px; +} + +.\$featured-entry-body { + padding: 10px 12px; + display: flex; + flex-direction: column; + gap: 5px; + flex: 1; +} + +.\$featured-entry-platform { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--rhpz-orange); + background: rgba(255,115,0,0.1); + border: 1px solid rgba(255,115,0,0.25); + padding: 1px 6px; + width: fit-content; +} + +.\$featured-entry-title { + font-size: 0.88rem; + font-weight: 600; + color: var(--text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.\$featured-entry-meta { + font-size: 0.72rem; + color: var(--text2); + margin-top: auto; +} + +@media (max-width: 900px) { + .news-strip { grid-template-columns: repeat(3, 1fr); } + .featured-entries-grid { grid-template-columns: repeat(2, 1fr); } +} + +@media (max-width: 600px) { + .news-strip { grid-template-columns: repeat(2, 1fr); } + .featured-entries-grid { grid-template-columns: repeat(2, 1fr); } + .news-strip-cover { height: 80px; } +} + + /* File: resources/css/layout/content.css */ #main-wrapper { flex-grow: 1; @@ -2180,24 +3559,6 @@ ul { cursor: pointer; } - .\$search-bar { - display: flex; - align-items: center; - background-color: var(--bg); - border: 1px solid var(--border); - border-radius: 2px; - padding: 5px 10px; - width: 300px; - input { - background: none; - border: none; - color: var(--text); - outline: none; - margin-left: 8px; - width: 100%; - } - } - .\$topbar-actions { display: flex; gap: 8px; @@ -2210,6 +3571,24 @@ ul { } +.\$search-bar { + display: flex; + align-items: center; + background-color: var(--bg); + border: 1px solid var(--border); + border-radius: 2px; + padding: 5px 10px; + width: 300px; + input { + background: none; + border: none; + color: var(--text); + outline: none; + margin-left: 8px; + width: 100%; + } +} + #content { flex-grow: 1; padding: 30px; @@ -2236,8 +3615,8 @@ ul { gap: 30px; .\$entry-cover { - width: 200px; - height: 280px; + width: 220px; + height: 220px; background-color: var(--bg); border: 1px solid var(--border); display: flex; @@ -2251,7 +3630,8 @@ ul { img { width: 100%; height: 100%; - object-fit: cover; + object-fit: contain; + padding: 8px; } } @@ -2616,12 +3996,18 @@ ul { z-index: 100; .\$menu-header { - padding: 20px; + padding: 10px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--border); + img { + width: 100%; + height: 100%; + object-fit: contain; + } + .\$menu-logo { width: 32px; height: 32px; @@ -2785,6 +4171,744 @@ ul { } } +#news-container { + background-color: var(--bg2); + border: 1px solid var(--border); + display: flex; + flex-direction: column; +} + +.\$news-header { + width: 100%; + height: 300px; + background-size: cover; + background-position: center; + display: flex; + align-items: flex-end; + padding: 40px 30px; + border-bottom: 1px solid var(--border); + position: relative; +} + +.\$news-header-content { + position: relative; + z-index: 2; +} + +.\$news-header .\$news-title { + font-size: 2.5rem; + font-weight: 600; + color: var(--text); + margin-bottom: 12px; + text-shadow: 0 2px 4px rgba(0,0,0,0.6); +} + +.\$news-header .\$news-meta { + color: var(--text2); + display: flex; + gap: 20px; + font-size: 0.9rem; + align-items: center; +} + +.\$news-header .\$meta-item { + display: flex; + align-items: center; + gap: 6px; + background-color: rgba(0, 0, 0, 0.4); + padding: 4px 10px; + border-radius: 2px; + border: 1px solid rgba(255,255,255,0.05); +} + +.\$news-layout { + display: flex; + flex-direction: row; + gap: 30px; + padding: 30px; +} + +@media (max-width: 992px) { + .\$news-layout { + flex-direction: column; + } +} + +.\$news-main-content { + flex-grow: 1; + flex-basis: 0; + min-width: 0; +} + +.\$news-body-text { + line-height: 1.75; + color: var(--text); + font-size: 1.05rem; + margin-bottom: 15px; +} + +.\$news-body-text p { + margin-bottom: 20px; +} + +.\$news-sidebar { + width: 320px; + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 25px; +} + +@media (max-width: 992px) { + .\$news-sidebar { + width: 100%; + } +} + +.\$sidebar-block { + background-color: var(--bg); + border: 1px solid var(--border); + padding: 20px; + border-radius: 4px; +} + +.\$sidebar-title { + font-size: 1rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text); + margin-bottom: 15px; + display: flex; + align-items: center; + gap: 8px; + border-bottom: 1px solid var(--border); + padding-bottom: 8px; +} + +.\$btn-sidebar { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + padding: 10px 15px; + font-size: 0.95rem; + font-weight: 500; + text-decoration: none; + cursor: pointer; + border-radius: 2px; + transition: background-color 0.2s ease, border-color 0.2s ease; + text-align: center; +} + +.\$btn-orange { + background-color: var(--rhpz-orange); + color: #fff; + border: 1px solid transparent; +} + +.\$btn-orange:hover { + background-color: var(--rhpz-orange-hover); +} + +.\$related-card { + display: flex; + flex-direction: column; + gap: 12px; +} + +.\$related-card-cover { + width: 100%; + height: 150px; + background-color: var(--bg2); + border: 1px solid var(--border); + overflow: hidden; + border-radius: 2px; +} + +.\$related-card-cover img { + width: 100%; + height: 100%; + object-fit: contain; + padding: 5px; +} + +.\$related-card-info h4 { + font-size: 1.1rem; + color: var(--text); + margin-bottom: 10px; + font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.\$news-sidebar .\$video-thumbnail-wrapper { + position: relative; + width: 100%; + aspect-ratio: 16/9; + background-color: #000; + border: 1px solid var(--border); + cursor: pointer; + overflow: hidden; + border-radius: 2px; +} + +.\$news-sidebar .\$video-thumbnail-wrapper img { + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0.7; + transition: transform 0.3s ease, opacity 0.3s ease; +} + +.\$news-sidebar .\$video-thumbnail-wrapper:hover img { + transform: scale(1.03); + opacity: 0.9; +} + +.\$news-sidebar .\$play-trigger { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 50px; + height: 50px; + background-color: rgba(0, 0, 0, 0.75); + border: 2px solid #fff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + transition: background-color 0.2s, transform 0.2s ease-out; +} + +.\$news-sidebar .\$video-thumbnail-wrapper:hover .\$play-trigger { + background-color: var(--rhpz-orange); + transform: translate(-50%, -50%) scale(1.1); +} + +.\$news-actions { + display: flex; + align-items: center; + gap: 8px; + margin-top: 15px; + flex-wrap: wrap; +} + +.\$news-header .\$news-actions .\$btn { + background-color: rgba(0, 0, 0, 0.5); + border-color: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(4px); + color: var(--text); + transition: background-color 0.15s, border-color 0.15s; +} + +.\$news-header .\$news-actions .\$btn:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(255, 255, 255, 0.3); +} + +.\$news-header .\$news-actions .\$btn.success { + background-color: rgba(56, 142, 60, 0.6); + border-color: rgba(129, 199, 132, 0.4); + color: #81c784; +} + +.\$news-header .\$news-actions .\$btn.danger { + background-color: rgba(183, 28, 28, 0.5); + border-color: rgba(229, 115, 115, 0.4); + color: #e57373; +} + +/* ── Hero ────────────────────────────────────────────────── */ +.\$news-hero { + display: block; + position: relative; + width: 100%; + height: 360px; + margin-bottom: 20px; + border: 1px solid var(--border); + overflow: hidden; + text-decoration: none; + transition: border-color 0.2s; +} + +.\$news-hero:hover { + border-color: var(--rhpz-orange); + text-decoration: none; +} + +.\$news-hero-bg { + position: absolute; + inset: 0; + background-size: cover; + background-position: center; + background-color: var(--bg3); + transition: transform 0.4s ease; +} + +.\$news-hero:hover .\$news-hero-bg { + transform: scale(1.02); +} + +.\$news-hero-content { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 30px; + z-index: 2; +} + +.\$news-hero-badge { + display: inline-flex; + align-items: center; + gap: 5px; + background-color: var(--rhpz-orange); + color: #111; + font-size: 0.72rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.8px; + padding: 4px 10px; + margin-bottom: 12px; +} + +.\$news-hero-title { + font-size: 2rem; + font-weight: 600; + color: #fff; + margin-bottom: 12px; + text-shadow: 0 2px 8px rgba(0,0,0,0.5); + line-height: 1.2; +} + +.\$news-hero-meta { + display: flex; + align-items: center; + gap: 15px; + font-size: 0.85rem; + color: rgba(255,255,255,0.75); +} + +.\$news-hero-meta span { + display: flex; + align-items: center; + gap: 5px; + background-color: rgba(0,0,0,0.4); + padding: 3px 10px; + border: 1px solid rgba(255,255,255,0.08); +} + +.\$news-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 15px; + margin-bottom: 20px; +} + +.\$news-card { + display: flex; + flex-direction: column; + background-color: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + overflow: hidden; + transition: border-color 0.15s, transform 0.15s; +} + +.\$news-card:hover { + border-color: var(--rhpz-orange); + transform: translateY(-2px); + text-decoration: none; +} + +.\$news-card-cover { + height: 160px; + background-size: cover; + background-position: center; + background-color: var(--bg3); + position: relative; + flex-shrink: 0; + transition: transform 0.3s ease; +} + +.\$news-card:hover .\$news-card-cover { + transform: scale(1.03); +} + +.\$news-card-state-badge { + position: absolute; + top: 10px; + right: 10px; + display: inline-flex; + align-items: center; + gap: 4px; + background-color: rgba(0,0,0,0.7); + color: var(--rhpz-orange); + font-size: 0.72rem; + font-weight: 600; + padding: 3px 8px; + border: 1px solid rgba(255,115,0,0.3); +} + +.\$news-card-body { + padding: 16px; + display: flex; + flex-direction: column; + flex: 1; + gap: 8px; +} + +.\$news-card-title { + font-size: 1rem; + font-weight: 600; + color: var(--text); + line-height: 1.3; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.\$news-card-excerpt { + font-size: 0.82rem; + color: var(--text2); + line-height: 1.5; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + flex: 1; +} + +.\$news-card-meta { + display: flex; + align-items: center; + gap: 12px; + font-size: 0.75rem; + color: var(--text2); + margin-top: auto; + padding-top: 8px; + border-top: 1px solid var(--border); +} + +.\$news-card-meta span { + display: flex; + align-items: center; + gap: 4px; +} + +@media (max-width: 600px) { + .news-hero { height: 240px; } + .news-hero-title { font-size: 1.4rem; } + .news-grid { grid-template-columns: 1fr; } +} + + +/* File: resources/css/layout/submit.css */ +.\$submit-hero { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 24px; + background-color: var(--bg2); + border-bottom: 1px solid var(--border); + padding: 40px 36px 32px; +} + +.\$submit-eyebrow { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + color: var(--rhpz-orange); + background: rgba(255,115,0,.1); + border: 1px solid rgba(255,115,0,.3); + padding: 3px 10px; + margin-bottom: 16px; +} + +.\$submit-hero-title { + font-size: 1.9rem; + font-weight: 300; + color: var(--text); + margin-bottom: 10px; + line-height: 1.25; +} + +.\$submit-hero-sub { + font-size: 0.9rem; + color: var(--text2); + max-width: 460px; + line-height: 1.65; +} + +.\$submit-review-note { + font-size: 0.8rem; + color: var(--text2); + border: 1px solid var(--border); + background: var(--bg3); + padding: 14px 18px; + max-width: 210px; + line-height: 1.6; + flex-shrink: 0; +} + +.submit-review-note strong { color: var(--rhpz-orange); } + +.submit-body { padding: 28px 36px 40px; } + +.\$submit-section-label { + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + color: var(--text2); + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 14px; +} + +.\$submit-section-label::after { + content: ''; + flex: 1; + height: 1px; + background: var(--border); +} + +.\$submit-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + margin-bottom: 30px; +} + +.\$submit-card { + display: flex; + flex-direction: column; + background: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + transition: border-color .15s, background .1s; +} + +.\$submit-card:hover { + border-color: var(--card-color); + background: var(--bg3); + text-decoration: none; +} + +.\$submit-card-top { + display: flex; + align-items: flex-start; + gap: 14px; + padding: 20px 20px 16px; + border-bottom: 1px solid var(--border); +} + +.\$submit-card-icon { + width: 38px; + height: 38px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + background: var(--card-bg); + border: 1px solid var(--card-border); + color: var(--card-color); +} + +.\$submit-card-title { + font-size: 0.95rem; + font-weight: 600; + color: var(--text); + margin-bottom: 4px; +} + +.\$submit-card-desc { + font-size: 0.78rem; + color: var(--text2); + line-height: 1.55; +} + +.\$submit-card-bottom { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 20px; +} + +.\$submit-card-tag { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--card-color); + background: var(--card-bg); + border: 1px solid var(--card-border); + padding: 2px 7px; +} + +.\$submit-card-cta { + font-size: 0.75rem; + color: var(--text2); + display: flex; + align-items: center; + gap: 4px; + transition: color .15s; +} + +.submit-card:hover .submit-card-cta { color: var(--card-color); } + +.\$submit-news-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-bottom: 28px; +} + +.\$submit-news-card { + display: flex; + align-items: center; + gap: 14px; + background: var(--bg2); + border: 1px solid var(--border); + padding: 18px 22px; + text-decoration: none; + transition: border-color .15s, background .1s; +} + +.\$submit-news-card:hover { + border-color: var(--success); + background: var(--bg3); +} + +.submit-news-card--disabled { opacity: .5; cursor: not-allowed; } +.submit-news-card--disabled:hover { border-color: var(--border); background: var(--bg2); } + +.\$submit-news-icon { + width: 38px; + height: 38px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(129,199,132,.1); + border: 1px solid rgba(129,199,132,.3); + color: var(--success); +} + +.\$submit-news-title { + font-size: 0.95rem; + font-weight: 600; + color: var(--text); + margin-bottom: 3px; +} + +.submit-news-desc { font-size: 0.78rem; color: var(--text2); line-height: 1.55; } + +.\$submit-news-cta { + flex-shrink: 0; + font-size: 0.75rem; + color: var(--text2); + display: flex; + align-items: center; + gap: 4px; + transition: color .15s; +} + +.submit-news-card:hover .submit-news-cta { color: var(--success); } + +.\$submit-news-staff-note { + background: var(--bg2); + border: 1px solid var(--border); + padding: 18px 22px; + font-size: 0.8rem; + color: var(--text2); + line-height: 1.65; + display: flex; + flex-direction: column; + gap: 10px; +} + +.\$submit-news-staff-badge { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: .6px; + color: var(--rhpz-orange); + background: rgba(255,115,0,.1); + border: 1px solid rgba(255,115,0,.3); + padding: 2px 8px; + width: fit-content; +} + +.submit-news-staff-note a { color: var(--text2); text-decoration: underline; } +.submit-news-staff-note a:hover { color: var(--text); } + +.\$submit-rules { + display: flex; + gap: 0; + background: var(--bg2); + border: 1px solid var(--border); +} + +.\$submit-rule { + flex: 1; + display: flex; + align-items: flex-start; + gap: 12px; + padding: 18px 22px; + border-right: 1px solid var(--border); + font-size: 0.8rem; + color: var(--text2); + line-height: 1.6; +} + +.submit-rule:last-child { border-right: none; } +.submit-rule strong { color: var(--text); } + +.\$submit-rule-num { + width: 22px; + height: 22px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255,115,0,.1); + border: 1px solid rgba(255,115,0,.3); + color: var(--rhpz-orange); + font-size: 0.72rem; + font-weight: 700; +} + +@media (max-width: 900px) { + .submit-hero { flex-direction: column; align-items: flex-start; } + .submit-grid { grid-template-columns: repeat(2, 1fr); } + .submit-rules { flex-direction: column; } + .submit-rule { border-right: none; border-bottom: 1px solid var(--border); } + .submit-rule:last-child { border-bottom: none; } +} + +@media (max-width: 600px) { + .submit-hero, .submit-body { padding-left: 20px; padding-right: 20px; } + .submit-grid { grid-template-columns: 1fr; } + .submit-news-row { grid-template-columns: 1fr; } + .submit-review-note { max-width: 100%; } +} + /* File: resources/css/xenforo.css */ .\$xf-menu-user-avatar-fix { diff --git a/public/favicon.ico b/public/favicon.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e6ee8373d56839fc61230f6c59a7155ced4db20c 100644 GIT binary patch literal 28972 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≪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 V^Aqh4Ecx=z`xpO1M9=68{|6Nc8b$yB literal 0 HcmV?d00001 diff --git a/public/logo/plaza-logo.png b/public/logo/plaza-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3b0558071d540d070eacba9cbb952f600cf34d1d GIT binary patch literal 53767 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Πd{PuB{okW@OQG=zI#G^=-tn8CTXz=8llfPP< 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%0DgT0BO!!Q@U0-;RMkbV+XCu!q&WC;PWxv8I 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 BvL*lk literal 0 HcmV?d00001 diff --git a/public/rom-patcher-js/RomPatcher.webapp.js b/public/rom-patcher-js/RomPatcher.webapp.js index 6e2fedd..3e6ba3e 100644 --- a/public/rom-patcher-js/RomPatcher.webapp.js +++ b/public/rom-patcher-js/RomPatcher.webapp.js @@ -6,19 +6,19 @@ * License: * * MIT License -* +* * Copyright (c) 2016-2025 Marc Robledo -* +* * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: -* +* * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. -* +* * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -35,7 +35,7 @@ - switch to ES6 classes and modules? */ -const ROM_PATCHER_JS_PATH = './rom-patcher-js/'; +const ROM_PATCHER_JS_PATH = '../../rom-patcher-js/'; const RomPatcherWeb = (function () { const SCRIPT_DEPENDENCIES = [ @@ -198,7 +198,6 @@ const RomPatcherWeb = (function () { ZIPManager.unzipEmbededPatches(arrayBuffer, currentEmbededPatches); } else { const parsedPatch = _parseEmbededPatchInfo(embededPatchInfo); - currentEmbededPatches = [parsedPatch]; const option = document.createElement('option'); option.innerHTML = parsedPatch.name; @@ -612,6 +611,7 @@ const RomPatcherWeb = (function () { const containerOptionalPatches = document.createElement('div'); containerOptionalPatches.id = 'rom-patcher-container-optional-patches'; containerOptionalPatches.style.display = 'none'; + containerOptionalPatches.classList.add("form-group", "level", "form-type-of-checkboxes"); htmlSelectPatch.parentElement.appendChild(containerOptionalPatches); } else { const htmlInputFilePatch = htmlElements.get('input-file-patch'); @@ -1415,9 +1415,16 @@ const ZIPManager = (function (romPatcherWeb) { const optionalPatches = []; for (var i = 0; i < filteredEntries.length; i++) { const embededPatchInfo = embededPatchesInfo.find((embededPatchInfo) => embededPatchInfo.file === filteredEntries[i].filename); - if (embededPatchInfo && embededPatchInfo.optional) + if (embededPatchInfo && embededPatchInfo.optional ) optionalPatches.push(filteredEntries[i]); - else + else if( filteredEntries[i].filename.startsWith('optional_') ){ + embededPatchesInfo.push({ + file: filteredEntries[i].filename, + name: filteredEntries[i].filename.replace(/^optional_/, '').replace(/_/g, ' ').replace(/\.[^.]+$/, ''), + optional: true + }); + optionalPatches.push(filteredEntries[i]); + } else selectablePatches.push(filteredEntries[i]); } @@ -1446,6 +1453,7 @@ const ZIPManager = (function (romPatcherWeb) { const embededPatchInfo = embededPatchesInfo.find((embededPatchInfo) => embededPatchInfo.file === optionalPatches[i].filename); const checkbox = document.createElement('input'); + checkbox.classList.add('form-checkbox'); checkbox.type = 'checkbox'; checkbox.value = i; checkbox.checked = false; @@ -2164,4 +2172,4 @@ const ROM_PATCHER_LOCALE = { 'Invalid patch file': '無效的patch檔', 'Using big files is not recommended': '不建議使用大檔。' } -}; \ No newline at end of file +}; diff --git a/resources/css/app.css b/resources/css/app.css index 60437ec..ebd3d5b 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -5,6 +5,8 @@ @import './layout/content.css'; @import './layout/entry.css'; @import './layout/news.css'; +@import './layout/activity.css'; +@import './layout/submit.css'; @import './components/common.css'; @import './components/grid.css'; diff --git a/resources/css/components/forms.css b/resources/css/components/forms.css index 11a7587..94156bd 100644 --- a/resources/css/components/forms.css +++ b/resources/css/components/forms.css @@ -349,6 +349,50 @@ flex-direction: column; gap: 5px; } +.gallery-item { + position: relative; + cursor: grab; + transition: opacity 0.2s, transform 0.15s; + user-select: none; +} + +.gallery-item:active { cursor: grabbing; } + +.gallery-item--dragging { + opacity: 0.4; + transform: scale(0.97); +} + +.gallery-drag-handle { + position: absolute; + top: 4px; + left: 4px; + z-index: 10; + background-color: rgba(0,0,0,0.6); + color: #fff; + padding: 3px 4px; + display: flex; + align-items: center; + cursor: grab; + opacity: 0; + transition: opacity 0.15s; +} + +.gallery-item:hover .gallery-drag-handle { opacity: 1; } + +.gallery-order-badge { + position: absolute; + bottom: 4px; + left: 4px; + z-index: 10; + background-color: rgba(0,0,0,0.7); + color: #fff; + font-size: 0.7rem; + font-weight: 700; + padding: 2px 6px; + min-width: 20px; + text-align: center; +} .authors-list { display: grid; grid-template-columns: repeat(4, 1fr); diff --git a/resources/css/components/modal.css b/resources/css/components/modal.css index 934b109..ec8e6eb 100644 --- a/resources/css/components/modal.css +++ b/resources/css/components/modal.css @@ -48,6 +48,6 @@ } -.modal-content { +.modal-content, .modal-body { padding: 20px; } diff --git a/resources/css/components/modcp.css b/resources/css/components/modcp.css index e5cddb9..cafe51f 100644 --- a/resources/css/components/modcp.css +++ b/resources/css/components/modcp.css @@ -318,3 +318,232 @@ .modcp-list-item-edit--game .form-input { min-width: 180px; flex: 2; } .modcp-list-item-edit--game .form-select { flex: 1; min-width: 120px; } + +.log-filters { + margin-bottom: 16px; + background-color: var(--bg3); + border: 1px solid var(--border); +} + +.log-filters-main { + display: flex; + align-items: center; + gap: 8px; + padding: 12px 14px; + flex-wrap: wrap; +} + +.log-search-wrap { + flex: 1; + min-width: 200px; + position: relative; + display: flex; + align-items: center; +} + +.log-search-wrap i { + position: absolute; + left: 10px; + color: var(--text2); + pointer-events: none; +} + +.log-search-wrap .form-input { padding-left: 30px; } + +.log-select { min-width: 130px; } + +.log-filter-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background-color: var(--rhpz-orange); + flex-shrink: 0; +} + +.log-filters-extra { + border-top: 1px solid var(--border); + padding: 12px 14px; +} + +.log-filters-extra-inner { + display: flex; + align-items: flex-end; + gap: 12px; + flex-wrap: wrap; +} + +.log-filter-field { + display: flex; + flex-direction: column; + gap: 4px; +} + +.log-filter-label { + font-size: 0.7rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.6px; + color: var(--text2); +} + +.log-transition-enter { transition: all .15s ease; } +.log-transition-leave { transition: all .1s ease; } + +.log-results-bar { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 0.78rem; + color: var(--text2); + margin-bottom: 10px; + padding: 0 2px; +} + +.log-loading { opacity: 0.5; } + +.log-item { align-items: flex-start; padding: 11px 14px; } +.log-item--open { background-color: var(--bg3); } + +.log-event-dot { + width: 26px; + height: 26px; + flex-shrink: 0; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-top: 2px; + border: 1px solid var(--border); + background-color: var(--bg3); + color: var(--text2); +} + +.log-event-dot--created { + background-color: rgba(129,199,132,.1); + border-color: rgba(129,199,132,.35); + color: var(--success); +} + +.log-event-dot--updated { + background-color: rgba(255,115,0,.1); + border-color: rgba(255,115,0,.35); + color: var(--rhpz-orange); +} + +.log-event-dot--deleted { + background-color: rgba(229,115,115,.1); + border-color: rgba(229,115,115,.35); + color: var(--error); +} + +.log-channel-badge { + display: inline-flex; + align-items: center; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + padding: 1px 6px; + background-color: rgba(255,255,255,.05); + border: 1px solid var(--border); + color: var(--text2); +} + +.log-id { color: var(--text2); font-size: 0.78rem; } +.log-sep { color: var(--border); } + +.log-item-right { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; + margin-left: auto; +} + +.log-timestamp { + font-size: 0.75rem; + color: var(--text2); + white-space: nowrap; +} + +.log-expand-btn { padding: 4px 7px; } + +.log-properties { + background-color: var(--bg); + border-bottom: 1px solid var(--border); + padding: 14px 14px 14px 54px; +} + +.log-diff-label { + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.7px; + color: var(--text2); + margin-bottom: 8px; +} + +.log-diff { + width: 100%; + border-collapse: collapse; + font-size: 0.8rem; +} + +.log-diff th { + text-align: left; + padding: 5px 10px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text2); + border-bottom: 1px solid var(--border); +} + +.log-diff td { + padding: 5px 10px; + border-bottom: 1px solid var(--border); + vertical-align: top; + max-width: 300px; + overflow-wrap: break-word; +} + +.log-diff tr:last-child td { border-bottom: none; } + +.log-diff-key { + font-size: 0.78rem; + font-weight: 600; + color: var(--text); + width: 160px; + white-space: nowrap; +} + +.log-diff-old-head { color: var(--error) !important; } +.log-diff-new-head { color: var(--success) !important; } + +.log-diff-old { + color: var(--error); + background-color: rgba(229,115,115,.05); +} + +.log-diff-new { + color: var(--success); + background-color: rgba(129,199,132,.05); +} + +.log-raw { + font-family: monospace; + font-size: 0.78rem; + color: var(--text2); + background-color: var(--bg2); + border: 1px solid var(--border); + padding: 10px 12px; + overflow-x: auto; + white-space: pre-wrap; + word-break: break-all; +} + +.log-pagination { + padding: 14px 0 4px; + border-top: 1px solid var(--border); +} diff --git a/resources/css/layout/activity.css b/resources/css/layout/activity.css new file mode 100644 index 0000000..34e71cf --- /dev/null +++ b/resources/css/layout/activity.css @@ -0,0 +1,485 @@ + +.activity-hero-excerpt { + font-size: 0.9rem; + color: rgba(255,255,255,0.75); + margin-bottom: 12px; + line-height: 1.5; + max-width: 600px; +} + +.activity-tl-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid var(--border); + gap: 15px; + flex-wrap: wrap; +} + +.activity-tl-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 1.15rem; + font-weight: 600; + color: var(--text); + margin: 0; +} + +.activity-tl-filters { + display: flex; + gap: 5px; + flex-wrap: wrap; +} + +.activity-tl-filter { + display: inline-flex; + align-items: center; + gap: 5px; + padding: 5px 12px; + background: none; + border: 1px solid var(--border); + color: var(--text2); + font-size: 0.8rem; + cursor: pointer; + font-family: var(--typography); + transition: all 0.1s; +} + +.activity-tl-filter:hover { background-color: var(--bg3); color: var(--text); } +.activity-tl-filter.active { + background-color: var(--bg3); + border-color: var(--rhpz-orange); + color: var(--rhpz-orange); +} + +.activity-day-sep { + display: flex; + align-items: center; + gap: 10px; + padding-left: 54px; + margin: 20px 0 12px; +} + +.activity-day-label { + font-size: 0.72rem; + font-weight: 600; + color: var(--text2); + text-transform: uppercase; + letter-spacing: 0.8px; + white-space: nowrap; +} + +.activity-day-line { + flex: 1; + height: 1px; + background-color: var(--border); +} + +.activity-tl-item { + display: flex; + gap: 0; + margin-bottom: 2px; +} + +.activity-tl-left { + width: 54px; + flex-shrink: 0; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 12px; +} + +.activity-tl-dot { + width: 32px; + height: 32px; + border-radius: 50%; + border: 1px solid var(--border); + background-color: var(--bg2); + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + z-index: 1; +} + +.activity-tl-dot--entry { + background-color: rgba(255,115,0,0.1); + border-color: rgba(255,115,0,0.4); + color: var(--rhpz-orange); +} + +.activity-tl-dot--news { + background-color: rgba(129,199,132,0.1); + border-color: rgba(129,199,132,0.4); + color: var(--success); +} + +.activity-tl-dot--message, .activity-tl-dot--thread, .activity-tl-dot--club { + background-color: rgba(25,118,210,0.1); + border-color: rgba(25,118,210,0.4); + color: var(--info); +} + +.activity-tl-line { + width: 1px; + flex: 1; + background-color: var(--border); + margin-top: 4px; + min-height: 16px; +} + +.activity-tl-item:last-of-type .activity-tl-line { display: none; } + +.activity-tl-card { + flex: 1; + display: flex; + align-items: center; + gap: 12px; + background-color: var(--bg2); + border: 1px solid var(--border); + padding: 10px 14px; + margin-bottom: 8px; + text-decoration: none; + transition: border-color 0.15s, background-color 0.1s; + min-width: 0; +} + +.activity-tl-card:hover { + border-color: var(--rhpz-orange); + background-color: var(--bg3); + text-decoration: none; +} + +.activity-tl-thumb { + width: 52px; + height: 52px; + flex-shrink: 0; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--bg3); + border: 1px solid var(--border); +} + +.activity-tl-thumb img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.activity-tl-body { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 4px; +} + +.activity-tl-badge { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.6px; + padding: 2px 7px; + width: fit-content; +} + +.activity-tl-badge--entry { + background-color: rgba(255,115,0,0.1); + color: var(--rhpz-orange); + border: 1px solid rgba(255,115,0,0.25); +} + +.activity-tl-badge--news { + background-color: rgba(129,199,132,0.1); + color: var(--success); + border: 1px solid rgba(129,199,132,0.25); +} + +.activity-tl-badge--message, .activity-tl-badge--thread, .activity-tl-dot--club { + background-color: rgba(25,118,210,0.1); + color: var(--info); + border: 1px solid rgba(25,118,210,0.25); +} + +.activity-tl-card-title { + font-size: 0.92rem; + font-weight: 600; + color: var(--text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + line-height: 1.3; +} + +.activity-tl-card-description { + font-size: 0.8rem; + color: var(--text2); + white-space: nowrap; + text-overflow: ellipsis; + line-height: 1.3; +} + +.activity-tl-meta { + display: flex; + align-items: center; + gap: 10px; + font-size: 0.75rem; + color: var(--text2); + flex-wrap: wrap; +} + +.activity-tl-meta span { + display: flex; + align-items: center; + gap: 3px; +} + +.activity-tl-time { + font-size: 0.72rem; + color: var(--text2); + white-space: nowrap; + flex-shrink: 0; + align-self: center; +} + +.activity-tl-empty { + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + padding: 60px; + color: var(--text2); + text-align: center; + padding-left: 54px; +} + +@media (max-width: 600px) { + .activity-tl-header { flex-direction: column; align-items: flex-start; } + .activity-tl-thumb { display: none; } + .activity-day-sep { padding-left: 44px; } + .activity-tl-left { width: 44px; } +} + +.home-section { + margin-bottom: 30px; +} + +.home-section-header { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 12px; + border-bottom: 1px solid var(--border); + margin-bottom: 14px; +} + +.home-section-title { + display: flex; + align-items: center; + gap: 8px; + font-size: 1.05rem; + font-weight: 600; + color: var(--text); + margin: 0; +} + +.home-section-more { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 0.75rem; + color: var(--text2); + border: 1px solid var(--border); + padding: 4px 10px; + text-decoration: none; + transition: color 0.1s, border-color 0.1s; +} + +.home-section-more:hover { + color: var(--rhpz-orange); + border-color: var(--rhpz-orange); +} + +.news-strip { + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 10px; +} + +.news-strip-card { + display: flex; + flex-direction: column; + background-color: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + overflow: hidden; + transition: border-color 0.15s; +} + +.news-strip-card:hover { border-color: var(--rhpz-orange); text-decoration: none; } + +.news-strip-cover { + height: 110px; + background-color: var(--bg3); + background-size: cover; + background-position: center; + position: relative; + flex-shrink: 0; +} + +.news-strip-date { + position: absolute; + bottom: 6px; + left: 8px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: rgba(255,255,255,0.8); + background: rgba(0,0,0,0.55); + padding: 2px 6px; + border: 1px solid rgba(255,255,255,0.07); +} + +.news-strip-body { + padding: 10px 12px; + display: flex; + flex-direction: column; + gap: 5px; + flex: 1; +} + +.news-strip-badge { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--success); + background: rgba(129,199,132,0.1); + border: 1px solid rgba(129,199,132,0.25); + padding: 1px 6px; + width: fit-content; +} + +.news-strip-title { + font-size: 0.85rem; + font-weight: 600; + color: var(--text); + line-height: 1.35; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + margin: 0; +} + +.news-strip-meta { + font-size: 0.72rem; + color: var(--text2); + margin-top: auto; +} + +.featured-entries-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; +} + +.featured-entry-card { + display: flex; + flex-direction: column; + background-color: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + overflow: hidden; + transition: border-color 0.15s; +} + +.featured-entry-card:hover { border-color: var(--rhpz-orange); text-decoration: none; } + +.featured-entry-cover { + height: 80px; + background-color: var(--bg3); + position: relative; + flex-shrink: 0; + overflow: hidden; +} + +.featured-entry-cover img { + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0.85; +} + +.featured-entry-star { + position: absolute; + top: 6px; + right: 6px; + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + background: rgba(255,115,0,0.9); + color: #111; + padding: 2px 6px; + border: 1px solid rgba(255,115,0,0.5); + display: flex; + align-items: center; + gap: 3px; +} + +.featured-entry-body { + padding: 10px 12px; + display: flex; + flex-direction: column; + gap: 5px; + flex: 1; +} + +.featured-entry-platform { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--rhpz-orange); + background: rgba(255,115,0,0.1); + border: 1px solid rgba(255,115,0,0.25); + padding: 1px 6px; + width: fit-content; +} + +.featured-entry-title { + font-size: 0.88rem; + font-weight: 600; + color: var(--text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.featured-entry-meta { + font-size: 0.72rem; + color: var(--text2); + margin-top: auto; +} + +@media (max-width: 900px) { + .news-strip { grid-template-columns: repeat(3, 1fr); } + .featured-entries-grid { grid-template-columns: repeat(2, 1fr); } +} + +@media (max-width: 600px) { + .news-strip { grid-template-columns: repeat(2, 1fr); } + .featured-entries-grid { grid-template-columns: repeat(2, 1fr); } + .news-strip-cover { height: 80px; } +} diff --git a/resources/css/layout/menu.css b/resources/css/layout/menu.css index 564c25d..e7f3e47 100644 --- a/resources/css/layout/menu.css +++ b/resources/css/layout/menu.css @@ -9,12 +9,18 @@ z-index: 100; .menu-header { - padding: 20px; + padding: 10px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--border); + img { + width: 100%; + height: 100%; + object-fit: contain; + } + .menu-logo { width: 32px; height: 32px; diff --git a/resources/css/layout/news.css b/resources/css/layout/news.css index eb73bc6..e5159e1 100644 --- a/resources/css/layout/news.css +++ b/resources/css/layout/news.css @@ -46,3 +46,441 @@ margin-bottom: 20px; } } + +#news-container { + background-color: var(--bg2); + border: 1px solid var(--border); + display: flex; + flex-direction: column; +} + +.news-header { + width: 100%; + height: 300px; + background-size: cover; + background-position: center; + display: flex; + align-items: flex-end; + padding: 40px 30px; + border-bottom: 1px solid var(--border); + position: relative; +} + +.news-header-content { + position: relative; + z-index: 2; +} + +.news-header .news-title { + font-size: 2.5rem; + font-weight: 600; + color: var(--text); + margin-bottom: 12px; + text-shadow: 0 2px 4px rgba(0,0,0,0.6); +} + +.news-header .news-meta { + color: var(--text2); + display: flex; + gap: 20px; + font-size: 0.9rem; + align-items: center; +} + +.news-header .meta-item { + display: flex; + align-items: center; + gap: 6px; + background-color: rgba(0, 0, 0, 0.4); + padding: 4px 10px; + border-radius: 2px; + border: 1px solid rgba(255,255,255,0.05); +} + +.news-layout { + display: flex; + flex-direction: row; + gap: 30px; + padding: 30px; +} + +@media (max-width: 992px) { + .news-layout { + flex-direction: column; + } +} + +.news-main-content { + flex-grow: 1; + flex-basis: 0; + min-width: 0; +} + +.news-body-text { + line-height: 1.75; + color: var(--text); + font-size: 1.05rem; + margin-bottom: 15px; +} + +.news-body-text p { + margin-bottom: 20px; +} + +.news-sidebar { + width: 320px; + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 25px; +} + +@media (max-width: 992px) { + .news-sidebar { + width: 100%; + } +} + +.sidebar-block { + background-color: var(--bg); + border: 1px solid var(--border); + padding: 20px; + border-radius: 4px; +} + +.sidebar-title { + font-size: 1rem; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text); + margin-bottom: 15px; + display: flex; + align-items: center; + gap: 8px; + border-bottom: 1px solid var(--border); + padding-bottom: 8px; +} + +.btn-sidebar { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + width: 100%; + padding: 10px 15px; + font-size: 0.95rem; + font-weight: 500; + text-decoration: none; + cursor: pointer; + border-radius: 2px; + transition: background-color 0.2s ease, border-color 0.2s ease; + text-align: center; +} + +.btn-orange { + background-color: var(--rhpz-orange); + color: #fff; + border: 1px solid transparent; +} + +.btn-orange:hover { + background-color: var(--rhpz-orange-hover); +} + +.related-card { + display: flex; + flex-direction: column; + gap: 12px; +} + +.related-card-cover { + width: 100%; + height: 150px; + background-color: var(--bg2); + border: 1px solid var(--border); + overflow: hidden; + border-radius: 2px; +} + +.related-card-cover img { + width: 100%; + height: 100%; + object-fit: contain; + padding: 5px; +} + +.related-card-info h4 { + font-size: 1.1rem; + color: var(--text); + margin-bottom: 10px; + font-weight: 500; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.news-sidebar .video-thumbnail-wrapper { + position: relative; + width: 100%; + aspect-ratio: 16/9; + background-color: #000; + border: 1px solid var(--border); + cursor: pointer; + overflow: hidden; + border-radius: 2px; +} + +.news-sidebar .video-thumbnail-wrapper img { + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0.7; + transition: transform 0.3s ease, opacity 0.3s ease; +} + +.news-sidebar .video-thumbnail-wrapper:hover img { + transform: scale(1.03); + opacity: 0.9; +} + +.news-sidebar .play-trigger { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 50px; + height: 50px; + background-color: rgba(0, 0, 0, 0.75); + border: 2px solid #fff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + transition: background-color 0.2s, transform 0.2s ease-out; +} + +.news-sidebar .video-thumbnail-wrapper:hover .play-trigger { + background-color: var(--rhpz-orange); + transform: translate(-50%, -50%) scale(1.1); +} + +.news-actions { + display: flex; + align-items: center; + gap: 8px; + margin-top: 15px; + flex-wrap: wrap; +} + +.news-header .news-actions .btn { + background-color: rgba(0, 0, 0, 0.5); + border-color: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(4px); + color: var(--text); + transition: background-color 0.15s, border-color 0.15s; +} + +.news-header .news-actions .btn:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(255, 255, 255, 0.3); +} + +.news-header .news-actions .btn.success { + background-color: rgba(56, 142, 60, 0.6); + border-color: rgba(129, 199, 132, 0.4); + color: #81c784; +} + +.news-header .news-actions .btn.danger { + background-color: rgba(183, 28, 28, 0.5); + border-color: rgba(229, 115, 115, 0.4); + color: #e57373; +} + +/* ── Hero ────────────────────────────────────────────────── */ +.news-hero { + display: block; + position: relative; + width: 100%; + height: 360px; + margin-bottom: 20px; + border: 1px solid var(--border); + overflow: hidden; + text-decoration: none; + transition: border-color 0.2s; +} + +.news-hero:hover { + border-color: var(--rhpz-orange); + text-decoration: none; +} + +.news-hero-bg { + position: absolute; + inset: 0; + background-size: cover; + background-position: center; + background-color: var(--bg3); + transition: transform 0.4s ease; +} + +.news-hero:hover .news-hero-bg { + transform: scale(1.02); +} + +.news-hero-content { + position: absolute; + bottom: 0; + left: 0; + right: 0; + padding: 30px; + z-index: 2; +} + +.news-hero-badge { + display: inline-flex; + align-items: center; + gap: 5px; + background-color: var(--rhpz-orange); + color: #111; + font-size: 0.72rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.8px; + padding: 4px 10px; + margin-bottom: 12px; +} + +.news-hero-title { + font-size: 2rem; + font-weight: 600; + color: #fff; + margin-bottom: 12px; + text-shadow: 0 2px 8px rgba(0,0,0,0.5); + line-height: 1.2; +} + +.news-hero-meta { + display: flex; + align-items: center; + gap: 15px; + font-size: 0.85rem; + color: rgba(255,255,255,0.75); +} + +.news-hero-meta span { + display: flex; + align-items: center; + gap: 5px; + background-color: rgba(0,0,0,0.4); + padding: 3px 10px; + border: 1px solid rgba(255,255,255,0.08); +} + +.news-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 15px; + margin-bottom: 20px; +} + +.news-card { + display: flex; + flex-direction: column; + background-color: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + overflow: hidden; + transition: border-color 0.15s, transform 0.15s; +} + +.news-card:hover { + border-color: var(--rhpz-orange); + transform: translateY(-2px); + text-decoration: none; +} + +.news-card-cover { + height: 160px; + background-size: cover; + background-position: center; + background-color: var(--bg3); + position: relative; + flex-shrink: 0; + transition: transform 0.3s ease; +} + +.news-card:hover .news-card-cover { + transform: scale(1.03); +} + +.news-card-state-badge { + position: absolute; + top: 10px; + right: 10px; + display: inline-flex; + align-items: center; + gap: 4px; + background-color: rgba(0,0,0,0.7); + color: var(--rhpz-orange); + font-size: 0.72rem; + font-weight: 600; + padding: 3px 8px; + border: 1px solid rgba(255,115,0,0.3); +} + +.news-card-body { + padding: 16px; + display: flex; + flex-direction: column; + flex: 1; + gap: 8px; +} + +.news-card-title { + font-size: 1rem; + font-weight: 600; + color: var(--text); + line-height: 1.3; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.news-card-excerpt { + font-size: 0.82rem; + color: var(--text2); + line-height: 1.5; + margin: 0; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + flex: 1; +} + +.news-card-meta { + display: flex; + align-items: center; + gap: 12px; + font-size: 0.75rem; + color: var(--text2); + margin-top: auto; + padding-top: 8px; + border-top: 1px solid var(--border); +} + +.news-card-meta span { + display: flex; + align-items: center; + gap: 4px; +} + +@media (max-width: 600px) { + .news-hero { height: 240px; } + .news-hero-title { font-size: 1.4rem; } + .news-grid { grid-template-columns: 1fr; } +} diff --git a/resources/css/layout/submit.css b/resources/css/layout/submit.css new file mode 100644 index 0000000..92c22bf --- /dev/null +++ b/resources/css/layout/submit.css @@ -0,0 +1,297 @@ +.submit-hero { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 24px; + background-color: var(--bg2); + border-bottom: 1px solid var(--border); + padding: 40px 36px 32px; +} + +.submit-eyebrow { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + color: var(--rhpz-orange); + background: rgba(255,115,0,.1); + border: 1px solid rgba(255,115,0,.3); + padding: 3px 10px; + margin-bottom: 16px; +} + +.submit-hero-title { + font-size: 1.9rem; + font-weight: 300; + color: var(--text); + margin-bottom: 10px; + line-height: 1.25; +} + +.submit-hero-sub { + font-size: 0.9rem; + color: var(--text2); + max-width: 460px; + line-height: 1.65; +} + +.submit-review-note { + font-size: 0.8rem; + color: var(--text2); + border: 1px solid var(--border); + background: var(--bg3); + padding: 14px 18px; + max-width: 210px; + line-height: 1.6; + flex-shrink: 0; +} + +.submit-review-note strong { color: var(--rhpz-orange); } + +.submit-body { padding: 28px 36px 40px; } + +.submit-section-label { + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + color: var(--text2); + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 14px; +} + +.submit-section-label::after { + content: ''; + flex: 1; + height: 1px; + background: var(--border); +} + +.submit-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; + margin-bottom: 30px; +} + +.submit-card { + display: flex; + flex-direction: column; + background: var(--bg2); + border: 1px solid var(--border); + text-decoration: none; + transition: border-color .15s, background .1s; +} + +.submit-card:hover { + border-color: var(--card-color); + background: var(--bg3); + text-decoration: none; +} + +.submit-card-top { + display: flex; + align-items: flex-start; + gap: 14px; + padding: 20px 20px 16px; + border-bottom: 1px solid var(--border); +} + +.submit-card-icon { + width: 38px; + height: 38px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + background: var(--card-bg); + border: 1px solid var(--card-border); + color: var(--card-color); +} + +.submit-card-title { + font-size: 0.95rem; + font-weight: 600; + color: var(--text); + margin-bottom: 4px; +} + +.submit-card-desc { + font-size: 0.78rem; + color: var(--text2); + line-height: 1.55; +} + +.submit-card-bottom { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 20px; +} + +.submit-card-tag { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--card-color); + background: var(--card-bg); + border: 1px solid var(--card-border); + padding: 2px 7px; +} + +.submit-card-cta { + font-size: 0.75rem; + color: var(--text2); + display: flex; + align-items: center; + gap: 4px; + transition: color .15s; +} + +.submit-card:hover .submit-card-cta { color: var(--card-color); } + +.submit-news-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; + margin-bottom: 28px; +} + +.submit-news-card { + display: flex; + align-items: center; + gap: 14px; + background: var(--bg2); + border: 1px solid var(--border); + padding: 18px 22px; + text-decoration: none; + transition: border-color .15s, background .1s; +} + +.submit-news-card:hover { + border-color: var(--success); + background: var(--bg3); +} + +.submit-news-card--disabled { opacity: .5; cursor: not-allowed; } +.submit-news-card--disabled:hover { border-color: var(--border); background: var(--bg2); } + +.submit-news-icon { + width: 38px; + height: 38px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(129,199,132,.1); + border: 1px solid rgba(129,199,132,.3); + color: var(--success); +} + +.submit-news-title { + font-size: 0.95rem; + font-weight: 600; + color: var(--text); + margin-bottom: 3px; +} + +.submit-news-desc { font-size: 0.78rem; color: var(--text2); line-height: 1.55; } + +.submit-news-cta { + flex-shrink: 0; + font-size: 0.75rem; + color: var(--text2); + display: flex; + align-items: center; + gap: 4px; + transition: color .15s; +} + +.submit-news-card:hover .submit-news-cta { color: var(--success); } + +.submit-news-staff-note { + background: var(--bg2); + border: 1px solid var(--border); + padding: 18px 22px; + font-size: 0.8rem; + color: var(--text2); + line-height: 1.65; + display: flex; + flex-direction: column; + gap: 10px; +} + +.submit-news-staff-badge { + display: inline-flex; + align-items: center; + gap: 5px; + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: .6px; + color: var(--rhpz-orange); + background: rgba(255,115,0,.1); + border: 1px solid rgba(255,115,0,.3); + padding: 2px 8px; + width: fit-content; +} + +.submit-news-staff-note a { color: var(--text2); text-decoration: underline; } +.submit-news-staff-note a:hover { color: var(--text); } + +.submit-rules { + display: flex; + gap: 0; + background: var(--bg2); + border: 1px solid var(--border); +} + +.submit-rule { + flex: 1; + display: flex; + align-items: flex-start; + gap: 12px; + padding: 18px 22px; + border-right: 1px solid var(--border); + font-size: 0.8rem; + color: var(--text2); + line-height: 1.6; +} + +.submit-rule:last-child { border-right: none; } +.submit-rule strong { color: var(--text); } + +.submit-rule-num { + width: 22px; + height: 22px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255,115,0,.1); + border: 1px solid rgba(255,115,0,.3); + color: var(--rhpz-orange); + font-size: 0.72rem; + font-weight: 700; +} + +@media (max-width: 900px) { + .submit-hero { flex-direction: column; align-items: flex-start; } + .submit-grid { grid-template-columns: repeat(2, 1fr); } + .submit-rules { flex-direction: column; } + .submit-rule { border-right: none; border-bottom: 1px solid var(--border); } + .submit-rule:last-child { border-bottom: none; } +} + +@media (max-width: 600px) { + .submit-hero, .submit-body { padding-left: 20px; padding-right: 20px; } + .submit-grid { grid-template-columns: 1fr; } + .submit-news-row { grid-template-columns: 1fr; } + .submit-review-note { max-width: 100%; } +} diff --git a/resources/js/PlayOnlineAndPatcher.js b/resources/js/PlayOnlineAndPatcher.js new file mode 100644 index 0000000..30fe09f --- /dev/null +++ b/resources/js/PlayOnlineAndPatcher.js @@ -0,0 +1,85 @@ +import { RomPatcher } from './RomPatcher.js'; + +window.PlayOnline = function( initialPatches = {}, emulatorJsConfig = {} ){ + + const parent = RomPatcher( initialPatches ); + + return { + + ...parent, + + currentBlobUrl: null, + emuConfig: emulatorJsConfig, + launchGame: false, + + init(){ + parent.init({ + language: 'en', + requireValidation: false, + onpatch: this.handlePatchedRomFile.bind(this), + }); + }, + + cleanEmulatorJsVars() { + ['EJS_player','EJS_core','EJS_gameUrl','EJS_pathtodata', + 'EJS_startOnLoaded','EJS_threads'] + .forEach(k => delete window[k]); + }, + + prepareEmulatorJs(){ + window.EJS_player = '#game'; + window.EJS_core = this.emuConfig.core; + window.EJS_gameUrl = this.currentBlobUrl; + window.EJS_pathtodata = "https://cdn.emulatorjs.org/stable/data/"; + window.EJS_startOnLoaded = true; + window.EJS_threads = this.emuConfig.threads ?? false; + }, + + launchEmulatorJs(){ + if(!this.currentBlobUrl){ + console.error("EmulatorJS: Empty Blob field"); + return; + } + + console.log(this.currentBlobUrl); + + this.cleanEmulatorJsVars(); + this.prepareEmulatorJs(); + + const script = document.createElement('script'); + script.id = 'ejs-loader'; + script.src = 'https://cdn.emulatorjs.org/stable/data/loader.js'; + document.body.appendChild(script); + + this.launchGame = true; + + }, + + /** + * @param {BinFile} patchedRomFile + */ + handlePatchedRomFile( patchedRomFile ){ + + patchedRomFile.save = function(){ + // Remove save. + return; + } + + const u8 = patchedRomFile._u8array; + if( !u8 || u8.byteLength === 0 ){ + console.error("Patch error: Empty ROM file"); + return; + } + + if(this.currentBlobUrl){ + URL.revokeObjectURL(this.currentBlobUrl); + } + + const blob = new Blob([u8], { type: 'application/octet-stream' }); + this.currentBlobUrl = URL.createObjectURL(blob); + + this.launchEmulatorJs() + } + } + +} diff --git a/resources/js/RomPatcher.js b/resources/js/RomPatcher.js index 185d0dc..63c7e54 100644 --- a/resources/js/RomPatcher.js +++ b/resources/js/RomPatcher.js @@ -1,4 +1,4 @@ -export function RomPatcher( initialPatches = {} ) { +export const RomPatcher = function( initialPatches = {} ) { let patchesArray = []; if (initialPatches) { @@ -39,9 +39,9 @@ export function RomPatcher( initialPatches = {} ) { patchesData: patchesArray, hasEmbedded: patchesArray.length > 0, - init() { + init( config = {language: 'en', requireValidation: false} ) { - const CONFIG = {language: 'en', requireValidation: false}; + const CONFIG = config; if (!RomPatcherWeb.isInitialized()){ if (this.hasEmbedded) { @@ -112,3 +112,7 @@ export function RomPatcher( initialPatches = {} ) { } } } + +window.RomPatcher = RomPatcher; + + diff --git a/resources/js/SubmissionsClass/FSFileData.js b/resources/js/SubmissionsClass/FSFileData.js index a44b3c5..6c4fc13 100644 --- a/resources/js/SubmissionsClass/FSFileData.js +++ b/resources/js/SubmissionsClass/FSFileData.js @@ -2,6 +2,10 @@ export const CHUNK_SIZE = 8192; +const PATCH_EXTENSIONS = new Set([ + 'ips', 'bps', 'ups', 'aps', 'ppf', 'xdelta', "zip" +]); + /** * An uploaded file instance. * Create a new file data. @@ -12,6 +16,8 @@ export const CHUNK_SIZE = 8192; */ export function FSFileData(name, totalChunks, rawFile ) { + const extension = name.split('.').pop().toLowerCase(); + return { /** @@ -66,6 +72,8 @@ export function FSFileData(name, totalChunks, rawFile ) { */ state: 'public', + can_be_online_patched: PATCH_EXTENSIONS.has(extension), + /** * If the online patcher is enabled */ @@ -76,6 +84,21 @@ export function FSFileData(name, totalChunks, rawFile ) { */ meta_secondary_online_patcher: false, + /** + * If this patch can be played online. + */ + meta_play_online: false, + + /** + * Selected core for play online + */ + meta_play_online_core: null, + + /** + * If the threads are enabled for playing online. + */ + meta_play_online_threads: null, + /** * Look if this file is currently uploading. * @returns {boolean} @@ -164,6 +187,6 @@ export function FSFileData(name, totalChunks, rawFile ) { } } -} + } } diff --git a/resources/js/SubmissionsClass/GalleryManager.js b/resources/js/SubmissionsClass/GalleryManager.js index 1f680c2..3cd11e6 100644 --- a/resources/js/SubmissionsClass/GalleryManager.js +++ b/resources/js/SubmissionsClass/GalleryManager.js @@ -12,6 +12,8 @@ export function GalleryManager() { */ images: [], + dragSrcI: null, + /** * Forward to this.images.length * @returns {number} @@ -123,6 +125,25 @@ export function GalleryManager() { handleRemoveFile(index){ this.images[index].handleRemoveFile(null); this.images.splice(index, 1); + }, + + dragStart(index){ + this.dragSrcI = index; + }, + + dragOver(e, index){ + e.preventDefault(); + + if( this.dragSrcI === null || this.dragSrcI === index ) + return; + + const moved = this.images.splice(this.dragSrcI, 1)[0]; + this.images.splice(index, 0, moved); + this.dragSrcI = index; + }, + + dragEnd(){ + this.dragSrcI = null; } } } diff --git a/resources/js/app.js b/resources/js/app.js index 068c39a..4cd824a 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -7,7 +7,6 @@ import hovercard from "./hovercard.js"; import notifications from "./notifications.js"; import conversations from "./conversations.js"; import settings from "./settings.js"; -import {RomPatcher} from "./RomPatcher.js"; /** * Get config defined in meta.blade.php @@ -15,7 +14,7 @@ import {RomPatcher} from "./RomPatcher.js"; * @return {string|null} */ window.getConfig = function( key ){ - return document.querySelector('meta[name="config-' + key + '"]').getAttribute('content') ?? null; + return document.querySelector('meta[name="config-' + key + '"]')?.getAttribute('content') ?? null; } // Lucide icons. @@ -44,6 +43,3 @@ Alpine.store('conversations', conversations() ); // Settings Alpine.store('settings', settings() ); - -// ROMPatcher -window.RomPatcher = RomPatcher; diff --git a/resources/js/news-submissions.js b/resources/js/news-submissions.js new file mode 100644 index 0000000..905f150 --- /dev/null +++ b/resources/js/news-submissions.js @@ -0,0 +1,169 @@ +import { GalleryManager } from "./SubmissionsClass/GalleryManager.js"; + +/** + * If there is some server side errors. + * We may need reload some things. + * @type {boolean} + */ +const SERVER_SIDE_ERRORS = document.querySelector('meta[name="submission-has-errors"]')?.content === '1'; + +/** + * Object map of errors messages + * @type {Object} + */ +const ERROR_TABLE = { + noDescription: "Please provide a description.", + noGalleryImages: "Please select at least a gallery image.", + isSubmitting: "The entry is already during submission." +} + +window.GalleryManager = GalleryManager; + +/** + * Verify if an EasyMDE field is filled. + * + * @param {string} fieldName + * @returns {boolean} + */ +function verifyMDE( fieldName ){ + const textarea = document.querySelector('#field_' + fieldName); + if( textarea && textarea.value.trim().length > 0 ) { + return true; + } + + const field = window['mde_' + fieldName] || null; + return field && typeof field.value === 'function' && field.value().trim().length > 0; +} + +window.SubmissionVerifications = { + + /** + * Verify if the description field has at least one character. + * @returns {boolean} + */ + step1_VerifyDescription: function(){ + return verifyMDE('description'); + }, + + /** + * Verify if at least one image is uploaded in the gallery. + * @param element this.$el + * @return {boolean} + */ + step2_verifyGallery: function( element){ + let GalleryData = element.querySelector('[x-data="GalleryManager()"]'); + GalleryData = GalleryData ? Alpine.$data(GalleryData) : null; + + if( ! GalleryData ){ + return false; + } + + return GalleryData.number > 0 && GalleryData.allUploaded; + } + +} + +/** + * Handle entire submission process. + */ +window.NewsSubmission = function(){ + return { + + /** + * If the script is during a try of submission process. + * @type {boolean} + */ + duringSubmissionProcess: false, + + /** + * Error checked. + * @type {string|null} + */ + errorKey: null, + + /** + * Return error message. + * @return {string} + */ + get errorMessage(){ + return ERROR_TABLE[this.errorKey] ?? "Unknown error"; + }, + + init(){ + }, + + /** + * Do each form verifications. + * Update also this.errorKey. + * + * @returns {boolean} + */ + verifyForm(){ + + console.log( "Step 1" ); + if( !SubmissionVerifications.step1_VerifyDescription() ){ + this.errorKey = "noDescription"; + return false; + } + + console.log( "Step 2" ); + if( !SubmissionVerifications.step2_verifyGallery( this.$el )){ + this.errorKey = "noGalleryImages"; + return false; + } + + return true; + + }, + + /** + * Scroll to the specific error field. + */ + scrollToError(){ + const refMap = { + noDescription: 'descriptionField', + noGalleryImages: 'gallery-field', + isSubmitting: 'submitButton' + }; + + const target = this.$refs[refMap[this.errorKey]] + || this.$el.querySelector('.upload-list') + || this.$el.querySelector('.form-upload'); + + if (target) { + target.scrollIntoView({behavior: 'smooth', block: 'center'}); + return; + } + }, + + /** + * If you want to submit the form. + * @param {Event} e + */ + submitForm( e ){ + + if( this.duringSubmissionProcess ) + return; // Don't submit two times. + + this.errorKey = null; // Reset. + this.duringSubmissionProcess = true; + + const STATE = document.querySelector('select[name="submit-state"]')?.value; + if( STATE === 'draft' ){ + e.target.submit(); + return; + } + + if( !this.verifyForm() ){ + + this.scrollToError(); + + this.duringSubmissionProcess = false; + return; + } + + e.target.submit(); + } + + } +} diff --git a/resources/js/settings.js b/resources/js/settings.js index 51194fb..56cda37 100644 --- a/resources/js/settings.js +++ b/resources/js/settings.js @@ -14,20 +14,15 @@ export default function settings() { */ xfUrls: {}, - /** - * @type {number[]} - */ - entriesPerPage: [ 12, 30, 48 ], - /** * @type {string} */ - currentTheme: Cookies.get("theme") ?? 'default', + currentTheme: 'default', /** - * @type {number} + * @type {list|null} */ - currentEntriesPerPage: Cookies.get("entries_per_page") ?? 30, + currentActivityFilters: null, /** * @@ -43,7 +38,7 @@ export default function settings() { this.currentTheme = newTheme; document.documentElement.classList.toggle('light-mode', this.currentTheme === 'alternate'); - Cookies.set('theme', this.currentTheme, { expires: 365, path: '/', domain: window.getConfig('session-domain') } ); + // Cookies.set('theme', this.currentTheme, { expires: 365, path: '/', domain: window.getConfig('session-domain') } ); this.syncXF(); }, @@ -62,22 +57,48 @@ export default function settings() { this.themeChanged(this.currentTheme === 'default' ? 'alternate' : 'default'); }, - /** - * - * @param n - */ - entriesPerPageChanged( n ){ - if( !this.entriesPerPage.includes(n) ) - return; - - this.entriesPerPage = n; - Cookies.set('entries_per_page', this.entriesPerPage, { expires: 365, path: '/', domain: window.getConfig('session-domain') } ); - if( window.Livewire ){ - Livewire.dispatch('entriesPerPageChanged', {n}); - } - }, - open(){ this.start = !this.start; }, close(){ this.start = false; }, + + async toggleActivityFilter( type ){ + + if( this.currentActivityFilters === null ) + return; + + const i = this.currentActivityFilters.indexOf( type ); + if( i !== -1 && this.currentActivityFilters.length === 1) + return; + + if( i === -1 ) + this.currentActivityFilters.push( type ); + else + this.currentActivityFilters.splice( i, 1 ); + + Cookies.set( 'activity_filters', JSON.stringify(this.currentActivityFilters), { expires: 365, path: '/', domain: window.getConfig('session-domain') } ); + await this.syncTimeline(); + }, + + async syncTimeline(){ + + const tl = document.getElementById('activity-timeline'); + if( !tl ) + return; + + tl.style.opacity = 0.5; + + const params = this.currentActivityFilters.join(','); + const response = await fetch(`/api/dynamic/activity/feed?filters=${params}`); + const data = await response.json(); + + if( !data.html ) + return; + + tl.innerHTML = data.html; + tl.style.opacity = 1; + + refreshIcons(tl); + + } + } } diff --git a/resources/js/submissions.js b/resources/js/submissions.js index 7931261..ae70c19 100644 --- a/resources/js/submissions.js +++ b/resources/js/submissions.js @@ -38,6 +38,7 @@ const ERROR_TABLE = { * @constructor */ const SECTION = () => document.querySelector("meta[name='fs-section']")?.content ?? ''; +const CSRF = () => document.querySelector("meta[name='csrf-token']")?.content ?? ''; window.FSUploader = FSUploader; window.HashesManager = HashesManager; @@ -403,6 +404,31 @@ window.Submission = function(){ } e.target.submit(); + }, + + async requestFeatured( entryId ){ + const csrf = CSRF(); + + const response = await fetch(`/api/entry/${entryId}/featured`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-Token': csrf + } + }); + const json = await response.json(); + + const entry_featured_button = document.querySelector('#entry-featured-button'); + const entry_featured_body = document.querySelector('#entry-featured-body'); + + if( json.success ){ + entry_featured_body.innerHTML = '

Request submitted

'; + entry_featured_button.style.display = 'none'; + } else { + entry_featured_body.innerHTML = '

Request failed. Please refresh the page and retry.

'; + entry_featured_button.style.display = 'none'; + } + } } diff --git a/resources/views/activity/featured-entries.blade.php b/resources/views/activity/featured-entries.blade.php new file mode 100644 index 0000000..b518475 --- /dev/null +++ b/resources/views/activity/featured-entries.blade.php @@ -0,0 +1,40 @@ + +@if($featuredEntries->isNotEmpty()) +
+
+

+ + Featured entries +

+
+ +
+
+@endif diff --git a/resources/views/activity/latest-news.blade.php b/resources/views/activity/latest-news.blade.php new file mode 100644 index 0000000..6d13d74 --- /dev/null +++ b/resources/views/activity/latest-news.blade.php @@ -0,0 +1,34 @@ + +
+
+

+ + Latest news +

+ + See all + +
+ + +
diff --git a/resources/views/activity/timeline.blade.php b/resources/views/activity/timeline.blade.php new file mode 100644 index 0000000..a9aa66e --- /dev/null +++ b/resources/views/activity/timeline.blade.php @@ -0,0 +1,103 @@ +@php $currentDay = null; @endphp +
+ @forelse($items as $item) + + @php + $day = $item->date->format('Y-m-d'); + $dayLabel = $item->date->isToday() ? 'Today' + : ($item->date->isYesterday() ? 'Yesterday' + : $item->date->format('M d, Y')); + @endphp + + @if($day !== $currentDay) + @php $currentDay = $day; @endphp +
+ {{ $dayLabel }} +
+
+ @endif + + + + @empty +
+ +

No recent activity.

+
+ @endforelse +
diff --git a/resources/views/components/gallery-field.blade.php b/resources/views/components/gallery-field.blade.php index bc8e932..0bedff0 100644 --- a/resources/views/components/gallery-field.blade.php +++ b/resources/views/components/gallery-field.blade.php @@ -15,8 +15,14 @@