Commit workspace changes

This commit is contained in:
2026-04-05 19:42:33 +02:00
parent 148a3bbe43
commit 08ad757bcb
312 changed files with 35149 additions and 399 deletions

View File

@@ -1,8 +1,10 @@
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
use App\Http\Controllers\User\ProfileController;
use App\Models\ContentType;
use App\Models\Group;
use App\Http\Controllers\User\AvatarController;
use App\Http\Controllers\Dashboard\ArtworkController as DashboardArtworkController;
use App\Http\Controllers\Web\ArtworkPageController;
@@ -32,6 +34,7 @@ use App\Http\Controllers\RSS\ExploreFeedController;
use App\Http\Controllers\RSS\TagFeedController;
use App\Http\Controllers\RSS\CreatorFeedController;
use App\Http\Controllers\RSS\BlogFeedController;
use App\Http\Controllers\Studio\StudioNewsController;
use App\Http\Controllers\Studio\StudioController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\Community\LatestController;
@@ -46,6 +49,7 @@ use App\Http\Controllers\Settings\CollectionInsightsController;
use App\Http\Controllers\Settings\CollectionManageController;
use App\Http\Controllers\Settings\CollectionProgrammingController;
use App\Http\Controllers\Settings\CollectionSurfaceController;
use App\Services\GroupMembershipService;
use Inertia\Inertia;
Route::get('/', [HomeController::class, 'index'])->name('index');
@@ -105,7 +109,17 @@ Route::get('/pages/{slug}', [PageController::class, 'show'])
->name('pages.show');
Route::get('/about', [PageController::class, 'marketing'])->defaults('slug', 'about')->name('about');
Route::get('/help', [PageController::class, 'marketing'])->defaults('slug', 'help')->name('help');
Route::get('/help', \App\Http\Controllers\Web\HelpCenterPageController::class)->name('help');
Route::get('/help/studio', \App\Http\Controllers\Web\StudioHelpPageController::class)->name('help.studio');
Route::get('/help/upload', \App\Http\Controllers\Web\UploadHelpPageController::class)->name('help.upload');
Route::get('/help/cards', \App\Http\Controllers\Web\CardsHelpPageController::class)->name('help.cards');
Route::get('/help/profile', \App\Http\Controllers\Web\ProfileHelpPageController::class)->name('help.profile');
Route::get('/help/auth', \App\Http\Controllers\Web\AuthHelpPageController::class)->name('help.auth');
Route::get('/help/account', \App\Http\Controllers\Web\AccountHelpPageController::class)->name('help.account');
Route::get('/help/troubleshooting', \App\Http\Controllers\Web\TroubleshootingHelpPageController::class)->name('help.troubleshooting');
Route::get('/help/groups', \App\Http\Controllers\Web\GroupHelpPageController::class)->name('help.groups');
Route::get('/help/groups/quickstart', \App\Http\Controllers\Web\GroupQuickstartPageController::class)->name('help.groups.quickstart');
Route::get('/help/groups/faq', \App\Http\Controllers\Web\GroupFaqPageController::class)->name('help.groups.faq');
Route::get('/contact', [PageController::class, 'marketing'])->defaults('slug', 'contact')->name('contact');
Route::get('/legal/{section}', [PageController::class, 'legal'])
@@ -248,6 +262,10 @@ Route::get('/download/artwork/{id}', ArtworkDownloadController::class)
// ── NEWS (/news/*) ────────────────────────────────────────────────────────────
Route::prefix('news')->name('news.')->group(function () {
Route::get('/', [FrontendNewsController::class, 'index'])->name('index');
Route::get('archive/{year}/{month}', [FrontendNewsController::class, 'archive'])->whereNumber('year')->whereNumber('month')->name('archive');
Route::get('author/{username}', [FrontendNewsController::class, 'author'])
->where('username', '[A-Za-z0-9_-]{3,20}')
->name('author');
Route::get('category/{slug}', [FrontendNewsController::class, 'category'])->name('category');
Route::get('tag/{slug}', [FrontendNewsController::class, 'tag'])->name('tag');
Route::get('{slug}', [FrontendNewsController::class, 'show'])
@@ -277,6 +295,25 @@ Route::get('/collections/recommended', [\App\Http\Controllers\Web\CollectionDisc
Route::get('/collections/search', [\App\Http\Controllers\Web\CollectionDiscoveryController::class, 'search'])
->name('collections.search');
Route::get('/groups', [\App\Http\Controllers\GroupController::class, 'index'])->name('groups.index');
Route::get('/groups/{group}', [\App\Http\Controllers\GroupController::class, 'show'])->name('groups.show');
Route::get('/groups/{group}/posts', [\App\Http\Controllers\GroupController::class, 'posts'])->name('groups.posts.index');
Route::get('/groups/{group}/projects', [\App\Http\Controllers\GroupController::class, 'projects'])->name('groups.projects.index');
Route::get('/groups/{group}/projects/{project}', [\App\Http\Controllers\GroupProjectController::class, 'show'])->name('groups.projects.show');
Route::get('/groups/{group}/releases', [\App\Http\Controllers\GroupController::class, 'releases'])->name('groups.releases.index');
Route::get('/groups/{group}/releases/{release}', [\App\Http\Controllers\GroupReleaseController::class, 'show'])->name('groups.releases.show');
Route::get('/groups/{group}/challenges', [\App\Http\Controllers\GroupController::class, 'challenges'])->name('groups.challenges.index');
Route::get('/groups/{group}/challenges/{challenge}', [\App\Http\Controllers\GroupChallengeController::class, 'show'])->name('groups.challenges.show');
Route::get('/groups/{group}/events', [\App\Http\Controllers\GroupController::class, 'events'])->name('groups.events.index');
Route::get('/groups/{group}/events/{event}', [\App\Http\Controllers\GroupEventController::class, 'show'])->name('groups.events.show');
Route::get('/groups/{group}/activity', [\App\Http\Controllers\GroupController::class, 'activity'])->name('groups.activity.index');
Route::get('/groups/{group}/assets/{asset}/download', [\App\Http\Controllers\GroupAssetController::class, 'download'])->name('groups.assets.download');
Route::get('/groups/{group}/{section}', [\App\Http\Controllers\GroupController::class, 'show'])
->where('section', 'overview|artworks|collections|members|about|posts|projects|releases|challenges|events|activity')
->name('groups.section');
Route::get('/groups/{group}/posts/{post}', [\App\Http\Controllers\GroupPostController::class, 'show'])
->name('groups.posts.show');
Route::middleware('auth')->group(function () {
Route::post('/me/saved/collections/lists', [CollectionSavedLibraryController::class, 'storeList'])
->name('me.saved.collections.lists.store');
@@ -302,6 +339,11 @@ Route::middleware('auth')->group(function () {
Route::post('/collections/submissions/{submission}/reject', [\App\Http\Controllers\CollectionSubmissionController::class, 'reject'])->name('collections.submissions.reject');
Route::post('/collections/{collection}/comments', [\App\Http\Controllers\CollectionCommentController::class, 'store'])->name('collections.comments.store');
Route::delete('/collections/{collection}/comments/{comment}', [\App\Http\Controllers\CollectionCommentController::class, 'destroy'])->name('collections.comments.destroy');
Route::post('/groups/{group}/follow', [\App\Http\Controllers\GroupEngagementController::class, 'follow'])->name('groups.follow');
Route::delete('/groups/{group}/follow', [\App\Http\Controllers\GroupEngagementController::class, 'unfollow'])->name('groups.unfollow');
Route::post('/groups/{group}/join-requests', [\App\Http\Controllers\GroupJoinRequestController::class, 'store'])->name('groups.join-requests.store');
Route::delete('/groups/{group}/join-requests/{joinRequest}', [\App\Http\Controllers\GroupJoinRequestController::class, 'destroy'])->name('groups.join-requests.destroy');
Route::post('/groups/{group}/challenges/{challenge}/entries', [\App\Http\Controllers\GroupChallengeController::class, 'attachArtwork'])->name('groups.challenges.entries.store');
});
Route::post('/collections/{collection}/share', [\App\Http\Controllers\CollectionEngagementController::class, 'share'])
@@ -412,6 +454,101 @@ Route::middleware(['auth', 'ensure.onboarding.complete'])->prefix('studio')->nam
Route::get('/cards/{id}/edit', [\App\Http\Controllers\Studio\StudioNovaCardsController::class, 'edit'])->whereNumber('id')->name('cards.edit');
Route::get('/cards/{id}/preview', [\App\Http\Controllers\Studio\StudioNovaCardsController::class, 'preview'])->whereNumber('id')->name('cards.preview');
Route::get('/cards/{id}/analytics', [\App\Http\Controllers\Studio\StudioNovaCardsController::class, 'analytics'])->whereNumber('id')->name('cards.analytics');
Route::get('/news', [StudioNewsController::class, 'index'])->name('news.index');
Route::get('/news/create', [StudioNewsController::class, 'create'])->name('news.create');
Route::post('/news', [StudioNewsController::class, 'store'])->name('news.store');
Route::get('/news/entity-search', [StudioNewsController::class, 'entitySearch'])->name('news.entity-search');
Route::get('/news/categories', [StudioNewsController::class, 'categories'])->name('news.categories');
Route::post('/news/categories', [StudioNewsController::class, 'storeCategory'])->name('news.categories.store');
Route::patch('/news/categories/{category}', [StudioNewsController::class, 'updateCategory'])->whereNumber('category')->name('news.categories.update');
Route::get('/news/tags', [StudioNewsController::class, 'tags'])->name('news.tags');
Route::post('/news/tags', [StudioNewsController::class, 'storeTag'])->name('news.tags.store');
Route::patch('/news/tags/{tag}', [StudioNewsController::class, 'updateTag'])->whereNumber('tag')->name('news.tags.update');
Route::get('/news/{article}/preview', [StudioNewsController::class, 'preview'])->whereNumber('article')->name('news.preview');
Route::get('/news/{article}/edit', [StudioNewsController::class, 'edit'])->whereNumber('article')->name('news.edit');
Route::patch('/news/{article}', [StudioNewsController::class, 'update'])->whereNumber('article')->name('news.update');
Route::post('/news/{article}/publish', [StudioNewsController::class, 'publish'])->whereNumber('article')->name('news.publish');
Route::post('/news/{article}/archive', [StudioNewsController::class, 'archive'])->whereNumber('article')->name('news.archive');
Route::post('/news/{article}/feature', [StudioNewsController::class, 'feature'])->whereNumber('article')->name('news.feature');
Route::post('/news/{article}/pin', [StudioNewsController::class, 'pin'])->whereNumber('article')->name('news.pin');
Route::get('/groups', [\App\Http\Controllers\Studio\GroupStudioController::class, 'index'])->name('groups.index');
Route::get('/groups/create', [\App\Http\Controllers\Studio\GroupStudioController::class, 'create'])->name('groups.create');
Route::post('/groups', [\App\Http\Controllers\Studio\GroupStudioController::class, 'store'])->name('groups.store');
Route::get('/groups/{group}', [\App\Http\Controllers\Studio\GroupStudioController::class, 'show'])->name('groups.show');
Route::get('/groups/{group}/artworks', [\App\Http\Controllers\Studio\GroupStudioController::class, 'artworks'])->name('groups.artworks');
Route::get('/groups/{group}/collections', [\App\Http\Controllers\Studio\GroupStudioController::class, 'collections'])->name('groups.collections');
Route::get('/groups/{group}/members', [\App\Http\Controllers\Studio\GroupStudioController::class, 'members'])->name('groups.members');
Route::get('/groups/{group}/invitations', [\App\Http\Controllers\Studio\GroupStudioController::class, 'invitations'])->name('groups.invitations');
Route::get('/groups/{group}/join-requests', [\App\Http\Controllers\Studio\GroupJoinRequestStudioController::class, 'index'])->name('groups.join-requests');
Route::get('/groups/{group}/review', [\App\Http\Controllers\Studio\GroupReviewStudioController::class, 'index'])->name('groups.review');
Route::get('/groups/{group}/recruitment', [\App\Http\Controllers\Studio\GroupRecruitmentStudioController::class, 'show'])->name('groups.recruitment');
Route::patch('/groups/{group}/recruitment', [\App\Http\Controllers\Studio\GroupRecruitmentStudioController::class, 'update'])->name('groups.recruitment.update');
Route::get('/groups/{group}/posts', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'index'])->name('groups.posts.index');
Route::get('/groups/{group}/posts/create', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'create'])->name('groups.posts.create');
Route::post('/groups/{group}/posts', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'store'])->name('groups.posts.store');
Route::get('/groups/{group}/posts/{post}/edit', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'edit'])->name('groups.posts.edit');
Route::patch('/groups/{group}/posts/{post}', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'update'])->name('groups.posts.update');
Route::post('/groups/{group}/posts/{post}/publish', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'publish'])->name('groups.posts.publish');
Route::post('/groups/{group}/posts/{post}/pin', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'pin'])->name('groups.posts.pin');
Route::post('/groups/{group}/posts/{post}/archive', [\App\Http\Controllers\Studio\GroupPostStudioController::class, 'archive'])->name('groups.posts.archive');
Route::get('/groups/{group}/projects', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'index'])->name('groups.projects.index');
Route::get('/groups/{group}/projects/create', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'create'])->name('groups.projects.create');
Route::post('/groups/{group}/projects', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'store'])->name('groups.projects.store');
Route::get('/groups/{group}/projects/{project}/edit', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'edit'])->name('groups.projects.edit');
Route::patch('/groups/{group}/projects/{project}', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'update'])->name('groups.projects.update');
Route::post('/groups/{group}/projects/{project}/attach-artwork', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'attachArtwork'])->name('groups.projects.attach-artwork');
Route::post('/groups/{group}/projects/{project}/attach-asset', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'attachAsset'])->name('groups.projects.attach-asset');
Route::post('/groups/{group}/projects/{project}/status', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'status'])->name('groups.projects.status');
Route::post('/groups/{group}/projects/{project}/milestones', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'storeMilestone'])->name('groups.projects.milestones.store');
Route::patch('/groups/{group}/projects/{project}/milestones/{milestone}', [\App\Http\Controllers\Studio\GroupProjectStudioController::class, 'updateMilestone'])->name('groups.projects.milestones.update');
Route::get('/groups/{group}/releases', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'index'])->name('groups.releases.index');
Route::get('/groups/{group}/releases/create', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'create'])->name('groups.releases.create');
Route::post('/groups/{group}/releases', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'store'])->name('groups.releases.store');
Route::get('/groups/{group}/releases/{release}', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'show'])->name('groups.releases.show');
Route::patch('/groups/{group}/releases/{release}', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'update'])->name('groups.releases.update');
Route::post('/groups/{group}/releases/{release}/stage', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'stage'])->name('groups.releases.stage');
Route::post('/groups/{group}/releases/{release}/publish', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'publish'])->name('groups.releases.publish');
Route::post('/groups/{group}/releases/{release}/attach-artwork', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'attachArtwork'])->name('groups.releases.attach-artwork');
Route::post('/groups/{group}/releases/{release}/attach-contributor', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'attachContributor'])->name('groups.releases.attach-contributor');
Route::post('/groups/{group}/releases/{release}/milestones', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'storeMilestone'])->name('groups.releases.milestones.store');
Route::patch('/groups/{group}/releases/{release}/milestones/{milestone}', [\App\Http\Controllers\Studio\GroupReleaseStudioController::class, 'updateMilestone'])->name('groups.releases.milestones.update');
Route::get('/groups/{group}/reputation', [\App\Http\Controllers\Studio\GroupReputationStudioController::class, 'show'])->name('groups.reputation');
Route::get('/groups/{group}/challenges', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'index'])->name('groups.challenges.index');
Route::get('/groups/{group}/challenges/create', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'create'])->name('groups.challenges.create');
Route::post('/groups/{group}/challenges', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'store'])->name('groups.challenges.store');
Route::get('/groups/{group}/challenges/{challenge}/edit', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'edit'])->name('groups.challenges.edit');
Route::patch('/groups/{group}/challenges/{challenge}', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'update'])->name('groups.challenges.update');
Route::post('/groups/{group}/challenges/{challenge}/publish', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'publish'])->name('groups.challenges.publish');
Route::post('/groups/{group}/challenges/{challenge}/attach-artwork', [\App\Http\Controllers\Studio\GroupChallengeStudioController::class, 'attachArtwork'])->name('groups.challenges.attach-artwork');
Route::get('/groups/{group}/events', [\App\Http\Controllers\Studio\GroupEventStudioController::class, 'index'])->name('groups.events.index');
Route::get('/groups/{group}/events/create', [\App\Http\Controllers\Studio\GroupEventStudioController::class, 'create'])->name('groups.events.create');
Route::post('/groups/{group}/events', [\App\Http\Controllers\Studio\GroupEventStudioController::class, 'store'])->name('groups.events.store');
Route::get('/groups/{group}/events/{event}/edit', [\App\Http\Controllers\Studio\GroupEventStudioController::class, 'edit'])->name('groups.events.edit');
Route::patch('/groups/{group}/events/{event}', [\App\Http\Controllers\Studio\GroupEventStudioController::class, 'update'])->name('groups.events.update');
Route::post('/groups/{group}/events/{event}/publish', [\App\Http\Controllers\Studio\GroupEventStudioController::class, 'publish'])->name('groups.events.publish');
Route::get('/groups/{group}/assets', [\App\Http\Controllers\Studio\GroupAssetStudioController::class, 'index'])->name('groups.assets.index');
Route::post('/groups/{group}/assets', [\App\Http\Controllers\Studio\GroupAssetStudioController::class, 'store'])->name('groups.assets.store');
Route::patch('/groups/{group}/assets/{asset}', [\App\Http\Controllers\Studio\GroupAssetStudioController::class, 'update'])->name('groups.assets.update');
Route::get('/groups/{group}/activity', [\App\Http\Controllers\Studio\GroupActivityStudioController::class, 'index'])->name('groups.activity');
Route::post('/groups/{group}/activity/{item}/pin', [\App\Http\Controllers\Studio\GroupActivityStudioController::class, 'pin'])->name('groups.activity.pin');
Route::get('/groups/{group}/settings', [\App\Http\Controllers\Studio\GroupStudioController::class, 'settings'])->name('groups.settings');
Route::patch('/groups/{group}', [\App\Http\Controllers\Studio\GroupStudioController::class, 'update'])->name('groups.update');
Route::post('/groups/{group}/archive', [\App\Http\Controllers\Studio\GroupStudioController::class, 'archive'])->name('groups.archive');
Route::post('/groups/{group}/members', [\App\Http\Controllers\GroupMemberController::class, 'store'])->name('groups.members.store');
Route::patch('/groups/{group}/members/{member}', [\App\Http\Controllers\GroupMemberController::class, 'update'])->name('groups.members.update');
Route::patch('/groups/{group}/members/{member}/permissions', [\App\Http\Controllers\GroupMemberController::class, 'updatePermissions'])->name('groups.members.permissions.update');
Route::post('/groups/{group}/members/{member}/transfer', [\App\Http\Controllers\GroupMemberController::class, 'transfer'])->name('groups.members.transfer');
Route::delete('/groups/{group}/members/{member}', [\App\Http\Controllers\GroupMemberController::class, 'destroy'])->name('groups.members.destroy');
Route::delete('/groups/{group}/invitations/{invitation}', [\App\Http\Controllers\GroupMemberController::class, 'destroyInvitation'])->name('groups.invitations.destroy');
Route::post('/groups/{group}/join-requests/{joinRequest}/approve', [\App\Http\Controllers\Studio\GroupJoinRequestStudioController::class, 'approve'])->name('groups.join-requests.approve');
Route::post('/groups/{group}/join-requests/{joinRequest}/reject', [\App\Http\Controllers\Studio\GroupJoinRequestStudioController::class, 'reject'])->name('groups.join-requests.reject');
Route::post('/groups/{group}/artworks/{artwork}/approve', [\App\Http\Controllers\Studio\GroupReviewStudioController::class, 'approve'])->name('groups.artworks.approve');
Route::post('/groups/{group}/artworks/{artwork}/needs-changes', [\App\Http\Controllers\Studio\GroupReviewStudioController::class, 'needsChanges'])->name('groups.artworks.needs-changes');
Route::post('/groups/{group}/artworks/{artwork}/reject', [\App\Http\Controllers\Studio\GroupReviewStudioController::class, 'reject'])->name('groups.artworks.reject');
Route::post('/groups/invitations/{invitation}/accept', [\App\Http\Controllers\GroupMemberController::class, 'acceptInvitation'])->name('groups.invitations.accept');
Route::post('/groups/invitations/{invitation}/decline', [\App\Http\Controllers\GroupMemberController::class, 'declineInvitation'])->name('groups.invitations.decline');
Route::post('/groups/members/{member}/accept', [\App\Http\Controllers\GroupMemberController::class, 'accept'])->name('groups.members.accept');
Route::post('/groups/members/{member}/decline', [\App\Http\Controllers\GroupMemberController::class, 'decline'])->name('groups.members.decline');
});
Route::get('/cards', [\App\Http\Controllers\Web\NovaCardsController::class, 'index'])->name('cards.index');
@@ -588,7 +725,7 @@ Route::middleware(['auth', 'normalize.username', 'ensure.onboarding.complete'])-
// ── UPLOAD ────────────────────────────────────────────────────────────────────
Route::middleware(['auth', 'ensure.onboarding.complete'])->group(function () {
Route::get('/upload', function () {
Route::get('/upload', function (Request $request) {
$contentTypes = ContentType::with(['rootCategories.children'])->ordered()->get()->map(function ($ct) {
return [
'id' => $ct->id,
@@ -605,10 +742,36 @@ Route::middleware(['auth', 'ensure.onboarding.complete'])->group(function () {
];
})->values()->all();
$availableGroups = [];
$contributorOptionsByGroup = [];
$initialGroupSlug = trim((string) $request->query('group', ''));
$user = $request->user();
if ($user) {
$membershipService = app(GroupMembershipService::class);
$availableGroups = app(\App\Services\GroupService::class)->studioOptionsForUser($user);
foreach ($availableGroups as $groupOption) {
$group = Group::query()->with('members')->where('slug', (string) ($groupOption['slug'] ?? ''))->first();
if (! $group || ! $group->hasActiveMember($user)) {
continue;
}
$contributorOptionsByGroup[(string) $group->slug] = $membershipService->contributorOptions($group);
}
if ($initialGroupSlug !== '' && ! collect($availableGroups)->contains(fn (array $group): bool => (string) ($group['slug'] ?? '') === $initialGroupSlug)) {
$initialGroupSlug = '';
}
}
return Inertia::render('Upload/Index', [
'draftId' => null,
'content_types' => $contentTypes,
'suggested_tags' => [],
'group_options' => $availableGroups,
'contributor_options_by_group' => $contributorOptionsByGroup,
'initial_group' => $initialGroupSlug !== '' ? $initialGroupSlug : null,
'filesCdnUrl' => config('cdn.files_url'),
'chunkSize' => (int) config('uploads.chunk.max_bytes', 5242880),
'feature_flags' => [
@@ -617,7 +780,7 @@ Route::middleware(['auth', 'ensure.onboarding.complete'])->group(function () {
]);
})->name('upload');
Route::get('/upload/draft/{id}', function (string $id) {
Route::get('/upload/draft/{id}', function (Request $request, string $id) {
$contentTypes = ContentType::with(['rootCategories.children'])->ordered()->get()->map(function ($ct) {
return [
'id' => $ct->id,
@@ -634,10 +797,36 @@ Route::middleware(['auth', 'ensure.onboarding.complete'])->group(function () {
];
})->values()->all();
$availableGroups = [];
$contributorOptionsByGroup = [];
$initialGroupSlug = trim((string) $request->query('group', ''));
$user = $request->user();
if ($user) {
$membershipService = app(GroupMembershipService::class);
$availableGroups = app(\App\Services\GroupService::class)->studioOptionsForUser($user);
foreach ($availableGroups as $groupOption) {
$group = Group::query()->with('members')->where('slug', (string) ($groupOption['slug'] ?? ''))->first();
if (! $group || ! $group->hasActiveMember($user)) {
continue;
}
$contributorOptionsByGroup[(string) $group->slug] = $membershipService->contributorOptions($group);
}
if ($initialGroupSlug !== '' && ! collect($availableGroups)->contains(fn (array $group): bool => (string) ($group['slug'] ?? '') === $initialGroupSlug)) {
$initialGroupSlug = '';
}
}
return Inertia::render('Upload/Index', [
'draftId' => $id,
'content_types' => $contentTypes,
'suggested_tags' => [],
'group_options' => $availableGroups,
'contributor_options_by_group' => $contributorOptionsByGroup,
'initial_group' => $initialGroupSlug !== '' ? $initialGroupSlug : null,
'filesCdnUrl' => config('cdn.files_url'),
'chunkSize' => (int) config('uploads.chunk.max_bytes', 5242880),
'feature_flags' => [