diff --git a/app/Enums/FeatureFlag.php b/app/Enums/FeatureFlag.php index 02ea0debc..5d1f5fc86 100644 --- a/app/Enums/FeatureFlag.php +++ b/app/Enums/FeatureFlag.php @@ -45,9 +45,6 @@ enum FeatureFlag: string implements HasLabel #[DefaultFeatureFlagState(true)] case UserNavigation = 'user_navigation'; - #[DefaultFeatureFlagState(true)] - case BroadcasterOnboarding = 'broadcaster_onboarding'; - #[Description('Toggles the Tenant Feature in the Broadcaster Dashboard')] #[DefaultFeatureFlagState(false)] case BroadcasterTenant = 'broadcaster_tenant'; diff --git a/app/Filament/Dashboard/Pages/Broadcaster/GeneralSettings.php b/app/Filament/Dashboard/Pages/Broadcaster/GeneralSettings.php index 53efeb1f9..cfd816d94 100644 --- a/app/Filament/Dashboard/Pages/Broadcaster/GeneralSettings.php +++ b/app/Filament/Dashboard/Pages/Broadcaster/GeneralSettings.php @@ -11,6 +11,7 @@ use App\Enums\Clips\ClipStatus; use App\Enums\Filament\LucideIcon; use App\Filament\Dashboard\Actions\ApplyDefaultStatusAction; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use App\Models\Broadcaster\Broadcaster; use BackedEnum; use Filament\Facades\Filament; @@ -35,6 +36,7 @@ */ class GeneralSettings extends Page implements HasForms { + use DisabledNavigationUntilOnboarding; use InteractsWithForms; /** @var array|null */ diff --git a/app/Filament/Dashboard/Pages/Broadcaster/ManageCategoryFilter.php b/app/Filament/Dashboard/Pages/Broadcaster/ManageCategoryFilter.php index 09dfeb454..af2dd6d1f 100644 --- a/app/Filament/Dashboard/Pages/Broadcaster/ManageCategoryFilter.php +++ b/app/Filament/Dashboard/Pages/Broadcaster/ManageCategoryFilter.php @@ -8,6 +8,7 @@ use App\Enums\Broadcaster\DashboardNavigationGroup; use App\Enums\Broadcaster\DashboardNavigationItem; use App\Enums\Filament\LucideIcon; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use App\Filament\Resources\Categories\CategorySelect; use App\Models\Broadcaster\Broadcaster; use App\Models\Broadcaster\BroadcasterSubmissionFilter; @@ -36,6 +37,7 @@ class ManageCategoryFilter extends Page implements HasTable { + use DisabledNavigationUntilOnboarding; use InteractsWithActions; use InteractsWithSchemas; use InteractsWithTable; diff --git a/app/Filament/Dashboard/Pages/Broadcaster/ManageTeamMember.php b/app/Filament/Dashboard/Pages/Broadcaster/ManageTeamMember.php index 02b23702e..ea8f4d9fe 100644 --- a/app/Filament/Dashboard/Pages/Broadcaster/ManageTeamMember.php +++ b/app/Filament/Dashboard/Pages/Broadcaster/ManageTeamMember.php @@ -9,6 +9,7 @@ use App\Enums\Broadcaster\DashboardNavigationItem; use App\Enums\FeatureFlag; use App\Enums\Filament\LucideIcon; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use App\Filament\Resources\Users\UserSelect; use App\Models\Broadcaster\Broadcaster; use App\Support\FeatureFlag\Feature; @@ -41,6 +42,7 @@ class ManageTeamMember extends Page implements HasForms, HasTable { + use DisabledNavigationUntilOnboarding; use InteractsWithActions; use InteractsWithForms; use InteractsWithTable; diff --git a/app/Filament/Dashboard/Pages/Broadcaster/ManageUserFilter.php b/app/Filament/Dashboard/Pages/Broadcaster/ManageUserFilter.php index 9da89a38e..93b6d96e1 100644 --- a/app/Filament/Dashboard/Pages/Broadcaster/ManageUserFilter.php +++ b/app/Filament/Dashboard/Pages/Broadcaster/ManageUserFilter.php @@ -9,6 +9,7 @@ use App\Enums\Broadcaster\DashboardNavigationItem; use App\Enums\FeatureFlag; use App\Enums\Filament\LucideIcon; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use App\Filament\Resources\Users\UserSelect; use App\Models\Broadcaster\Broadcaster; use App\Models\User; @@ -38,6 +39,7 @@ class ManageUserFilter extends Page implements HasTable { + use DisabledNavigationUntilOnboarding; use InteractsWithActions; use InteractsWithSchemas; use InteractsWithTable; diff --git a/app/Filament/Dashboard/Pages/Dashboard.php b/app/Filament/Dashboard/Pages/Dashboard.php index 461d36f3f..d416c075d 100644 --- a/app/Filament/Dashboard/Pages/Dashboard.php +++ b/app/Filament/Dashboard/Pages/Dashboard.php @@ -6,6 +6,7 @@ use App\Enums\Broadcaster\BroadcasterPermission; use App\Enums\Filament\LucideIcon; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use BackedEnum; use Filament\Facades\Filament; use Filament\Pages\Dashboard as BaseDashboard; @@ -14,6 +15,8 @@ class Dashboard extends BaseDashboard { + use DisabledNavigationUntilOnboarding; + protected static string|BackedEnum|null $navigationIcon = LucideIcon::House; public static function canAccess(): bool diff --git a/app/Filament/Dashboard/Pages/Onboarding.php b/app/Filament/Dashboard/Pages/Onboarding.php new file mode 100644 index 000000000..63402f958 --- /dev/null +++ b/app/Filament/Dashboard/Pages/Onboarding.php @@ -0,0 +1,195 @@ +getKey() === auth()->id(); + } + + public function getHeading(): string|Htmlable|null + { + return __('dashboard/onboarding.heading', ['username' => auth()->user()->name]); + } + + public function getSubheading(): string|Htmlable|null + { + return __('dashboard/onboarding.setup.heading'); + } + + public function mount(): void + { + $broadcaster = $this->getBroadcaster(); + + if ($broadcaster->exists && $broadcaster->onboarded_at !== null) { + $this->redirect(Dashboard::getUrl(panel: 'dashboard', tenant: $broadcaster)); + } + + $this->getSchema('form')->fill([ + 'submit_user_allowed' => true, + 'submit_mods_allowed' => true, + 'default_clip_status' => ClipStatus::NeedApproval, + 'consent' => [], + ]); + } + + public function content(Schema $schema): Schema + { + return $schema->components([ + Form::make([EmbeddedSchema::make('form')]) + ->footer([ + Actions::make([ + Action::make('save') + ->label(__('dashboard/onboarding.setup.submit')) + ->keyBindings(['mod+s']) + ->submit('save'), + ]) + ->alignment(Alignment::End) + ->sticky() + ->key('form-actions'), + ]) + ->livewireSubmitHandler('save') + ->id('form'), + ]); + } + + public function form(Schema $schema): Schema + { + return $schema + ->statePath('formData') + ->schema([ + Section::make(__('dashboard/onboarding.setup.consent.heading')) + ->description(__('dashboard/onboarding.setup.consent.subheading')) + ->schema([ + CheckboxList::make('consent') + ->options(BroadcasterConsent::class) + ->hiddenLabel(), + ]), + + Section::make(__('dashboard/onboarding.setup.default_clip_status.heading')) + ->description(__('dashboard/onboarding.setup.default_clip_status.subheading')) + ->schema([ + Radio::make('default_clip_status') + ->options( + collect(ClipStatus::defaultableOptions()) + ->mapWithKeys(fn (ClipStatus $status): array => [$status->value => $status->getLabel()]) + ->toArray() + ) + ->descriptions( + collect(ClipStatus::defaultableOptions()) + ->mapWithKeys(fn (ClipStatus $status): array => [ + $status->value => __('dashboard/onboarding.setup.default_clip_status.options.'.Str::snake($status->name)), + ]) + ->toArray() + ) + ->default(ClipStatus::NeedApproval) + ->hiddenLabel() + ->required(), + ]), + + Section::make(__('dashboard/onboarding.setup.submissions.heading')) + ->description(__('dashboard/onboarding.setup.submissions.subheading')) + ->schema([ + Toggle::make('submit_user_allowed') + ->afterStateUpdated(function (bool $state, Set $set): void { + if ($state) { + $set('submit_mods_allowed', true); + } + }) + ->extraAlpineAttributes(['x-on:change' => 'console.log(1)']) + ->helperText(__('dashboard/onboarding.setup.submissions.options.everyone.description')) + ->label(__('dashboard/onboarding.setup.submissions.options.everyone.label')) + ->default(true) + ->live(), + + Toggle::make('submit_mods_allowed') + ->afterStateUpdated(function (bool $state, Set $set): void { + if (! $state) { + $set('submit_user_allowed', false); + } + }) + ->helperText(__('dashboard/onboarding.setup.submissions.options.mods.description')) + ->label(__('dashboard/onboarding.setup.submissions.options.mods.label')) + ->default(true) + ->live(), + ]), + ]); + } + + public function save(): void + { + $state = $this->getSchema('form')->getState(); + $broadcaster = $this->getBroadcaster(); + + DB::transaction(function () use ($broadcaster, $state): void { + Broadcaster::withTrashed()->updateOrCreate(['id' => $broadcaster->id], [ + 'consent' => $state['consent'], + 'submit_user_allowed' => $state['submit_user_allowed'], + 'submit_mods_allowed' => $state['submit_mods_allowed'], + 'default_clip_status' => $state['default_clip_status'], + 'onboarded_at' => now(), + 'deleted_at' => null, + ]); + + BroadcasterConsentLog::create([ + 'broadcaster_id' => $broadcaster->id, + 'state' => collect($state['consent'])->values()->all(), + 'changed_by' => auth()->id(), + 'change_reason' => 'Self Onboarding', + 'changed_at' => now(), + ]); + }); + + $this->redirect(Dashboard::getUrl(panel: 'dashboard', tenant: $broadcaster)); + } + + /** + * just a wrapper around getTenant so we have autocompletion stuff for Broadcaster + * + * @return Broadcaster + */ + private function getBroadcaster(): Model + { + return Filament::getTenant(); + } +} diff --git a/app/Filament/Dashboard/Resources/Clips/ClipResource.php b/app/Filament/Dashboard/Resources/Clips/ClipResource.php index cb2250673..c2ee3f0cd 100644 --- a/app/Filament/Dashboard/Resources/Clips/ClipResource.php +++ b/app/Filament/Dashboard/Resources/Clips/ClipResource.php @@ -13,6 +13,7 @@ use App\Filament\Dashboard\Resources\Clips\Schemas\ClipForm; use App\Filament\Dashboard\Resources\Clips\Schemas\ClipInfolist; use App\Filament\Dashboard\Resources\Clips\Tables\ClipsTable; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use App\Models\Clip; use BackedEnum; use Filament\Facades\Filament; @@ -24,6 +25,8 @@ class ClipResource extends Resource { + use DisabledNavigationUntilOnboarding; + protected static bool $shouldSkipAuthorization = true; protected static ?string $model = Clip::class; diff --git a/app/Filament/Dashboard/Resources/RemovalRequests/RemovalRequestResource.php b/app/Filament/Dashboard/Resources/RemovalRequests/RemovalRequestResource.php index 51b2e9cfc..cde8ba8b9 100644 --- a/app/Filament/Dashboard/Resources/RemovalRequests/RemovalRequestResource.php +++ b/app/Filament/Dashboard/Resources/RemovalRequests/RemovalRequestResource.php @@ -12,6 +12,7 @@ use App\Filament\Dashboard\Resources\RemovalRequests\Schemas\RemovalRequestForm; use App\Filament\Dashboard\Resources\RemovalRequests\Schemas\RemovalRequestInfolist; use App\Filament\Dashboard\Resources\RemovalRequests\Tables\RemovalRequestsTable; +use App\Filament\Dashboard\Traits\DisabledNavigationUntilOnboarding; use App\Models\Broadcaster\RemovalRequest; use App\Support\FeatureFlag\Feature; use BackedEnum; @@ -23,6 +24,8 @@ class RemovalRequestResource extends Resource { + use DisabledNavigationUntilOnboarding; + protected static bool $shouldSkipAuthorization = true; protected static ?string $model = RemovalRequest::class; diff --git a/app/Filament/Dashboard/Traits/DisabledNavigationUntilOnboarding.php b/app/Filament/Dashboard/Traits/DisabledNavigationUntilOnboarding.php new file mode 100644 index 000000000..641a9e5ee --- /dev/null +++ b/app/Filament/Dashboard/Traits/DisabledNavigationUntilOnboarding.php @@ -0,0 +1,40 @@ +user(); + $items = parent::getNavigationItems(); + + if ($user->id !== $tenant->id || $tenant->onboarded_at !== null) { + return $items; + } + + return collect($items) + ->map(fn (NavigationItem $item): NavigationItem => $item + ->extraAttributes([ + 'class' => 'opacity-40 cursor-not-allowed select-none [&_a]:pointer-events-none', + 'aria-label' => __('dashboard/navigation.locked'), + 'title' => __('dashboard/navigation.locked'), + 'aria-disabled' => 'true', + ]) + ->icon(LucideIcon::Lock), + ) + ->all(); + } +} diff --git a/app/Http/Controllers/Broadcaster/OnboardingController.php b/app/Http/Controllers/Broadcaster/OnboardingController.php deleted file mode 100644 index 164706291..000000000 --- a/app/Http/Controllers/Broadcaster/OnboardingController.php +++ /dev/null @@ -1,26 +0,0 @@ -where('id', $request->user()->id)->whereOnboarded()->exists()) { - return Feature::isActive(FeatureFlag::UserDashboard) - ? redirect()->to(Filament::getPanel('dashboard')->getUrl()) - : redirect()->route('home'); - } - - return view('broadcaster.onboarding'); - } -} diff --git a/app/Http/Controllers/Broadcaster/OnboardingSubmitController.php b/app/Http/Controllers/Broadcaster/OnboardingSubmitController.php deleted file mode 100644 index ea6b5151f..000000000 --- a/app/Http/Controllers/Broadcaster/OnboardingSubmitController.php +++ /dev/null @@ -1,44 +0,0 @@ -updateOrCreate(['id' => auth()->id()], [ - 'consent' => $request->array('consent'), - 'submit_user_allowed' => $request->boolean('everyone'), - 'submit_vip_allowed' => $request->boolean('vips'), - 'submit_mods_allowed' => $request->boolean('moderators'), - 'default_clip_status' => $request->enum('default_clip_status', ClipStatus::class, ClipStatus::Unknown), - 'onboarded_at' => now(), - 'deleted_at' => null, - ]); - - BroadcasterConsentLog::create([ - 'broadcaster_id' => $broadcaster->id, - 'state' => $broadcaster->consent?->values(), - 'changed_by' => auth()->id(), - 'change_reason' => 'Self Onboarding', - 'changed_at' => now(), - ]); - - $fallbackRoute = Feature::isActive(FeatureFlag::UserDashboard) - ? Filament::getPanel('dashboard')->getUrl($broadcaster) - : route('home'); - - return redirect()->intended($fallbackRoute); - } -} diff --git a/app/Http/Middleware/RequiresBroadcasterProfile.php b/app/Http/Middleware/RequiresBroadcasterProfile.php index abf317c07..549ed72aa 100644 --- a/app/Http/Middleware/RequiresBroadcasterProfile.php +++ b/app/Http/Middleware/RequiresBroadcasterProfile.php @@ -4,13 +4,14 @@ namespace App\Http\Middleware; +use App\Filament\Dashboard\Pages\Onboarding; use App\Models\Broadcaster\Broadcaster; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; /** - * If the user has no broadcaster profile setup this will redirect them to the onboarding instead (remembering the intended route) + * Redirect the user to their own broadcaster onboarding if they try to access their own stuff without being onboarded */ class RequiresBroadcasterProfile { @@ -19,16 +20,20 @@ class RequiresBroadcasterProfile */ public function handle(Request $request, Closure $next): Response { - if ($request->routeIs('dashboard.onboarding')) { + if ($request->routeIs(Onboarding::getRouteName())) { + return $next($request); + } + + if ($request->route('tenant') !== (string) auth()->id()) { return $next($request); } $user = $request->user(); - $tenantId = $request->route('tenant'); - $isSelfTenant = ((int) $tenantId) === $user?->id; - if ((! $tenantId || $isSelfTenant) && ! Broadcaster::where('id', $user?->id)->whereOnboarded()->exists()) { - return redirect()->guest(route('dashboard.onboarding')); + if (Broadcaster::where('id', $user->id)->whereOnboarded()->doesntExist()) { + return redirect()->guest( + Onboarding::getUrl(panel: 'dashboard', tenant: Broadcaster::placeholder($user->id)), + ); } return $next($request); diff --git a/app/Http/Requests/Broadcaster/OnboardingRequest.php b/app/Http/Requests/Broadcaster/OnboardingRequest.php deleted file mode 100644 index ad9622e4a..000000000 --- a/app/Http/Requests/Broadcaster/OnboardingRequest.php +++ /dev/null @@ -1,36 +0,0 @@ -check() && Feature::isActive(FeatureFlag::BroadcasterOnboarding); - } - - /** - * @return array - */ - public function rules(): array - { - return [ - 'consent' => ['nullable', 'array'], - 'default_clip_status' => ['nullable', Rule::enum(ClipStatus::class), Rule::in(ClipStatus::defaultableOptions())], - 'consent.*' => ['required', Rule::enum(BroadcasterConsent::class)], - 'everyone' => ['nullable', 'boolean'], - 'vips' => ['nullable', 'boolean'], - 'moderators' => ['nullable', 'boolean'], - ]; - } -} diff --git a/app/Models/Broadcaster/Broadcaster.php b/app/Models/Broadcaster/Broadcaster.php index d2416ca21..9b89d0171 100644 --- a/app/Models/Broadcaster/Broadcaster.php +++ b/app/Models/Broadcaster/Broadcaster.php @@ -54,6 +54,28 @@ class Broadcaster extends Model implements HasAvatar, HasCurrentTenantLabel, Has use Reportable; use SoftDeletes; + /** + * Creates a placeholder instance for the given user id we can use as a proxy + * + * Will not be stored in database unless you explicitly do so with something like `->save()` + */ + public static function placeholder(?int $userId): self + { + return new self([ + 'id' => $userId, + 'consent' => [], + 'twitch_mod_permissions' => [], + 'submit_user_allowed' => false, + 'submit_mods_allowed' => false, + 'submit_vip_allowed' => false, + 'onboarded_at' => null, + 'created_at' => now(), + 'updated_at' => now(), + 'deleted_at' => null, + 'default_clip_status' => ClipStatus::Unknown, + ]); + } + public static function getFilamentInfolistEntry(string $name): FilamentSchemaComponent { return User::getFilamentInfolistEntry($name); diff --git a/app/Models/Traits/User/UserFilamentConfiguration.php b/app/Models/Traits/User/UserFilamentConfiguration.php index 80bd7f95e..8e3719c11 100644 --- a/app/Models/Traits/User/UserFilamentConfiguration.php +++ b/app/Models/Traits/User/UserFilamentConfiguration.php @@ -145,10 +145,6 @@ public function getTenants(Panel $panel): array|Collection } $broadcasterIds = $this->broadcasterTeamMembers()->pluck('broadcaster_id'); - if ($this->broadcaster) { - $broadcasterIds->add($this->broadcaster->id); - } - $twitchService = app(TwitchService::class); $twitchModChannelsIds = $twitchService @@ -162,7 +158,10 @@ public function getTenants(Panel $panel): array|Collection $broadcasterIds = $broadcasterIds->merge($allowedBroadcasters); - return Broadcaster::findMany($broadcasterIds->unique()); + return [ + $this->broadcaster ?? Broadcaster::placeholder($this->id), + ...Broadcaster::findMany($broadcasterIds->unique()), + ]; } public function getDefaultTenant(Panel $panel): ?Model diff --git a/app/Providers/Filament/DashboardPanelProvider.php b/app/Providers/Filament/DashboardPanelProvider.php index 7a52acdbe..61177ef86 100644 --- a/app/Providers/Filament/DashboardPanelProvider.php +++ b/app/Providers/Filament/DashboardPanelProvider.php @@ -29,6 +29,8 @@ use Illuminate\Contracts\View\View; use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse; use Illuminate\Cookie\Middleware\EncryptCookies; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Http\Middleware\PreventRequestForgery; use Illuminate\Routing\Middleware\SubstituteBindings; use Illuminate\Session\Middleware\StartSession; @@ -104,6 +106,20 @@ public function panel(Panel $panel): Panel DispatchServingFilamentEvent::class, RequiresBroadcasterProfile::class, ]) + ->resolveTenantUsing(function (string $key): Model { + $tenant = app(Filament::getTenantModel()) + ->resolveRouteBinding($key); + + if (! $tenant instanceof Model && $key === (string) auth()->id()) { + return Broadcaster::placeholder(auth()->id()); + } + + if (! $tenant instanceof Model) { + throw new ModelNotFoundException()->setModel(Filament::getTenantModel(), [$key]); + } + + return $tenant; + }) ->renderHook( PanelsRenderHook::PAGE_START, fn (): ?HtmlString => $this->renderBanNotice(), diff --git a/lang/de/dashboard/navigation.php b/lang/de/dashboard/navigation.php index f4716e158..f2a7d994f 100644 --- a/lang/de/dashboard/navigation.php +++ b/lang/de/dashboard/navigation.php @@ -11,4 +11,5 @@ 'single' => 'Dein Kanal', 'multiple' => 'Kanal Wechseln', ], + 'locked' => 'Bitte vorher das Onboarding abschließen', ]; diff --git a/lang/de/onboarding.php b/lang/de/dashboard/onboarding.php similarity index 100% rename from lang/de/onboarding.php rename to lang/de/dashboard/onboarding.php diff --git a/lang/en/dashboard/navigation.php b/lang/en/dashboard/navigation.php index 683bd5f01..52809abe0 100644 --- a/lang/en/dashboard/navigation.php +++ b/lang/en/dashboard/navigation.php @@ -11,4 +11,5 @@ 'single' => 'Your Channel', 'multiple' => 'Switch Channel', ], + 'locked' => 'Please finish Onboarding first', ]; diff --git a/lang/en/onboarding.php b/lang/en/dashboard/onboarding.php similarity index 100% rename from lang/en/onboarding.php rename to lang/en/dashboard/onboarding.php diff --git a/resources/views/components/layout/header.blade.php b/resources/views/components/layout/header.blade.php index b98157a8b..6a850880c 100644 --- a/resources/views/components/layout/header.blade.php +++ b/resources/views/components/layout/header.blade.php @@ -67,19 +67,9 @@ class="hidden size-4 opacity-70 transition-transform duration-200 group-hover:sc @feature(FeatureFlag::UserDashboard) - @if(Broadcaster::where('id', auth()->id())->exists()) - - {{ __('navigation.dashboard') }} - - @endif - @endfeature - - @feature(FeatureFlag::BroadcasterOnboarding) - @if(! Feature::isActive(FeatureFlag::UserDashboard) || ! Broadcaster::where('id', auth()->id())->exists()) - - {{ __('navigation.onboarding') }} - - @endif + + {{ __('navigation.dashboard') }} + @endfeature @feature(FeatureFlag::UserSettings) @@ -88,7 +78,7 @@ class="hidden size-4 opacity-70 transition-transform duration-200 group-hover:sc @endfeature - @featureAny([FeatureFlag::UserDashboard, FeatureFlag::UserSettings, FeatureFlag::BroadcasterOnboarding]) + @featureAny([FeatureFlag::UserDashboard, FeatureFlag::UserSettings]) @endfeatureAny diff --git a/resources/views/components/layout/shared/onboarding-alert.blade.php b/resources/views/components/layout/shared/onboarding-alert.blade.php index 6cbc728e0..631979595 100644 --- a/resources/views/components/layout/shared/onboarding-alert.blade.php +++ b/resources/views/components/layout/shared/onboarding-alert.blade.php @@ -1,4 +1,3 @@ -@feature(App\Enums\FeatureFlag::BroadcasterOnboarding) @if (session('showTwitchPermissionsPrompt'))
@endif -@endfeature diff --git a/resources/views/filament/dashboard/pages/onboarding-page.blade.php b/resources/views/filament/dashboard/pages/onboarding-page.blade.php new file mode 100644 index 000000000..a7417332f --- /dev/null +++ b/resources/views/filament/dashboard/pages/onboarding-page.blade.php @@ -0,0 +1,3 @@ + + {{ $this->content }} + diff --git a/routes/dashboard.php b/routes/dashboard.php deleted file mode 100644 index 71cd4bc52..000000000 --- a/routes/dashboard.php +++ /dev/null @@ -1,14 +0,0 @@ -group(function () { - Route::get('/onboarding', OnboardingController::class)->name('dashboard.onboarding'); - Route::post('/onboarding', OnboardingSubmitController::class)->name('dashboard.onboarding.store'); -}); diff --git a/routes/web.php b/routes/web.php index 985faf0ff..a36a505b8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -14,6 +14,7 @@ use App\Http\Controllers\Legal\TermsController; use App\Http\Controllers\ReportController; use App\Http\Controllers\TeamController; +use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; Route::get('/', IndexController::class)->name('home'); @@ -39,8 +40,9 @@ Route::feature(FeatureFlag::Reports)->group(function () { Route::post('/reports', [ReportController::class, 'store'])->name('reports.store'); }); + + Route::get('dashboard', static fn (Request $request) => redirect('dashboard/'.$request->user()->id)); }); -require __DIR__.'/dashboard.php'; require __DIR__.'/settings.php'; require __DIR__.'/auth.php';