From 4382fbfa5260d2363e7b3535aa680f203608f819 Mon Sep 17 00:00:00 2001 From: Rias Date: Thu, 18 Jun 2026 22:07:17 +0200 Subject: [PATCH 1/8] Make cpTrigger and actionTrigger dynamic --- routes/actions.php | 25 +++++----- routes/routes.php | 6 ++- routes/web.php | 7 ++- .../Middleware/ForgetTriggerParameters.php | 24 ++++++++++ src/Http/Mixins/RequestMixin.php | 17 ++++++- src/Http/Routing/ActionRoute.php | 9 ++-- src/Http/Routing/ActionRouteResolver.php | 13 +++++- src/Plugin/Concerns/HasRoutes.php | 30 +++++++----- src/Route/RouteServiceProvider.php | 12 ++++- src/Route/Routes.php | 41 +++++++++++++++++ .../Middleware/HandleActionRequestTest.php | 20 ++++++++ tests/Unit/Http/RequestMixinTest.php | 9 ++++ .../Http/Routing/ActionRouteResolverTest.php | 21 +++++++++ tests/Unit/Plugin/Concerns/HasRoutesTest.php | 46 ++++++++++++++++--- 14 files changed, 234 insertions(+), 46 deletions(-) create mode 100644 src/Http/Middleware/ForgetTriggerParameters.php diff --git a/routes/actions.php b/routes/actions.php index 63ee2f2ec05..b1ce41e66e9 100644 --- a/routes/actions.php +++ b/routes/actions.php @@ -2,7 +2,6 @@ declare(strict_types=1); -use CraftCms\Cms\Cms; use CraftCms\Cms\Edition; use CraftCms\Cms\Http\Controllers\AddressesController; use CraftCms\Cms\Http\Controllers\AnnouncementsController; @@ -107,21 +106,24 @@ use CraftCms\Cms\Http\Middleware\RequireEdition; use CraftCms\Cms\Http\Middleware\RequireToken; use CraftCms\Cms\Http\Middleware\StartSessionWithoutPersistence; +use CraftCms\Cms\Route\Routes as CraftRoutes; use Illuminate\Foundation\Http\Middleware\PreventRequestForgery; use Illuminate\Session\Middleware\StartSession; use Illuminate\Support\Facades\Route; use Illuminate\View\Middleware\ShareErrorsFromSession; +$routes = app(CraftRoutes::class); +$sharedActionRouteGroups = $routes->actionTriggerRoutePrefix() === $routes->cpActionTriggerRoutePrefix() + ? [[$routes->cpActionTriggerRoutePrefix(), ['craft.cp']]] + : [ + [$routes->actionTriggerRoutePrefix(), ['craft.web']], + [$routes->cpActionTriggerRoutePrefix(), ['craft.cp']], + ]; + /** * Actions that are accessible both with and without CP can be registered here. */ -foreach ([ - Cms::config()->actionTrigger => ['craft.web'], - implode('/', [ - Cms::config()->cpTrigger, - Cms::config()->actionTrigger, - ]) => ['craft.cp'], -] as $prefix => $middleware) { +foreach ($sharedActionRouteGroups as [$prefix, $middleware]) { Route::prefix($prefix)->middleware($middleware)->group(function () use ($middleware) { // App Route::get('app/health-check', HealthCheckController::class); @@ -158,7 +160,7 @@ /** * Actions that are accessible without CP can be registered here. */ -Route::prefix(Cms::config()->actionTrigger)->group(function () { +Route::prefix($routes->actionTriggerRoutePrefix())->group(function () { Route::post('migrate', MigrateController::class); Route::middleware(['auth'])->group(function () { @@ -173,10 +175,7 @@ }); }); -Route::prefix(implode('/', [ - Cms::config()->cpTrigger, - Cms::config()->actionTrigger, -]))->middleware(['craft.cp'])->group(function () { +Route::prefix($routes->cpActionTriggerRoutePrefix())->middleware(['craft.cp'])->group(function () { /** * Actions not needing auth */ diff --git a/routes/routes.php b/routes/routes.php index 9d96e937e98..a95de848cf4 100644 --- a/routes/routes.php +++ b/routes/routes.php @@ -1,15 +1,17 @@ name('craft.actions.') ->group(__DIR__.'/actions.php'); Route::middleware(['web', 'craft', 'craft.cp']) ->name('craft.cp.') - ->prefix(Cms::config()->cpTrigger) + ->prefix($routes->cpTriggerRoutePrefix()) ->group(__DIR__.'/cp.php'); Route::middleware(['web', 'craft', 'craft.web']) diff --git a/routes/web.php b/routes/web.php index b4f636a82dd..c74e83d2870 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,9 +9,12 @@ use CraftCms\Cms\Http\Controllers\Auth\TwoFactorAuthenticationController; use CraftCms\Cms\Http\Controllers\Auth\VerifyEmailController; use CraftCms\Cms\Http\Middleware\RequireEdition; +use CraftCms\Cms\Route\Routes as CraftRoutes; use CraftCms\Cms\Site\Sites; use Illuminate\Support\Facades\Route; +$routes = app(CraftRoutes::class); + if (Edition::get()->registersFrontendUserRoutes()) { if (Cms::config()->loginPath !== false) { Route::get(Cms::config()->loginPath, [LoginController::class, 'showLogin']); @@ -31,11 +34,11 @@ } if (OAuth::isAvailable()) { - Route::middleware([RequireEdition::class.':'.Edition::Pro->value])->group(function () { + Route::middleware([RequireEdition::class.':'.Edition::Pro->value])->group(function () use ($routes) { Route::get('oauth/{provider}/redirect', [OAuthController::class, 'redirect'])->name('oauth.redirect'); Route::get('oauth/{provider}/callback', [OAuthController::class, 'callback'])->name('oauth.callback'); - Route::prefix(Cms::config()->cpTrigger)->middleware('craft.cp')->group(function () { + Route::prefix($routes->cpTriggerRoutePrefix())->middleware('craft.cp')->group(function () { Route::get('oauth/{provider}/redirect', [OAuthController::class, 'redirect']); }); }); diff --git a/src/Http/Middleware/ForgetTriggerParameters.php b/src/Http/Middleware/ForgetTriggerParameters.php new file mode 100644 index 00000000000..f3e384efc36 --- /dev/null +++ b/src/Http/Middleware/ForgetTriggerParameters.php @@ -0,0 +1,24 @@ +route()?->forgetParameter('cpTrigger'); + $request->route()?->forgetParameter('actionTrigger'); + + return $next($request); + } +} diff --git a/src/Http/Mixins/RequestMixin.php b/src/Http/Mixins/RequestMixin.php index 7128201571f..d9c928e2741 100644 --- a/src/Http/Mixins/RequestMixin.php +++ b/src/Http/Mixins/RequestMixin.php @@ -116,10 +116,23 @@ public function isCpRequest(): Closure * @phpstan-ignore-next-line */ $request = $this; + $cpTrigger = trim((string) Cms::config()->cpTrigger, '/'); + + if ($request->attributes->has('isCpRequest')) { + return (bool) $request->attributes->get('isCpRequest'); + } + + if ($request->routeIs('craft.cp.*')) { + return true; + } + + if ($cpTrigger === '') { + return true; + } return $request->is( - Cms::config()->cpTrigger, - Cms::config()->cpTrigger.'/*', + $cpTrigger, + "$cpTrigger/*", ); }; } diff --git a/src/Http/Routing/ActionRoute.php b/src/Http/Routing/ActionRoute.php index 4c0321203ba..a188e4d8ab6 100644 --- a/src/Http/Routing/ActionRoute.php +++ b/src/Http/Routing/ActionRoute.php @@ -32,12 +32,11 @@ public static function fromSegments(array $segments, bool $isCp): ?self public static function uriForSegments(array $segments, bool $isCp): string { - return implode('/', array_filter([ - '', - $isCp ? Cms::config()->cpTrigger : null, - Cms::config()->actionTrigger, + return '/'.implode('/', array_filter([ + $isCp ? trim((string) Cms::config()->cpTrigger, '/') : null, + trim(Cms::config()->actionTrigger, '/'), ...$segments, - ], fn ($value) => $value !== null)); + ], fn (?string $value) => $value !== null && $value !== '')); } public function matches(Request $request): bool diff --git a/src/Http/Routing/ActionRouteResolver.php b/src/Http/Routing/ActionRouteResolver.php index 0600cc92f4b..585d135ff7b 100644 --- a/src/Http/Routing/ActionRouteResolver.php +++ b/src/Http/Routing/ActionRouteResolver.php @@ -34,8 +34,8 @@ public function resolve(Request $request): ?ActionRoute private function segmentsFromPath(Request $request): ?array { - $actionTrigger = Cms::config()->actionTrigger; - $segmentIndex = $request->isCpRequest() ? 2 : 1; + $actionTrigger = trim(Cms::config()->actionTrigger, '/'); + $segmentIndex = $this->actionTriggerSegmentIndex($request); if ($request->segment($segmentIndex) === $actionTrigger && count($request->segments()) > $segmentIndex) { return array_slice($request->segments(), $segmentIndex); @@ -60,4 +60,13 @@ private function segmentsFromActionParam(Request $request): ?array return $segments === [] ? null : $segments; } + + private function actionTriggerSegmentIndex(Request $request): int + { + if (! $request->isCpRequest()) { + return 1; + } + + return trim((string) Cms::config()->cpTrigger, '/') === '' ? 1 : 2; + } } diff --git a/src/Plugin/Concerns/HasRoutes.php b/src/Plugin/Concerns/HasRoutes.php index 2a0452bcc04..55fd14b2203 100644 --- a/src/Plugin/Concerns/HasRoutes.php +++ b/src/Plugin/Concerns/HasRoutes.php @@ -5,8 +5,8 @@ namespace CraftCms\Cms\Plugin\Concerns; use Closure; -use CraftCms\Cms\Cms; use CraftCms\Cms\Plugin\Plugin; +use CraftCms\Cms\Route\Routes; /** * @mixin Plugin @@ -41,31 +41,39 @@ protected function registerWebRoutes(string|Closure $routes): void protected function registerCpRoutes(string|Closure $routes): void { + $craftRoutes = $this->app->get(Routes::class); + $this->app['router'] ->middleware(['web', 'craft', 'craft.cp']) - ->prefix(Cms::config()->cpTrigger) + ->prefix($craftRoutes->cpTriggerRoutePrefix()) ->group($routes); } protected function registerActionRoutes(string|Closure $routes): void { $handle = self::getInstance()->handle; + $craftRoutes = $this->app->get(Routes::class); + $cpActionPrefix = $craftRoutes->joinRoutePrefix([ + $craftRoutes->cpActionTriggerRoutePrefix(), + $handle, + ]); + $siteActionPrefix = $craftRoutes->joinRoutePrefix([ + $craftRoutes->actionTriggerRoutePrefix(), + $handle, + ]); $this->app['router'] ->middleware(['web', 'craft', 'craft.cp']) - ->prefix(implode('/', [ - Cms::config()->cpTrigger, - Cms::config()->actionTrigger, - $handle, - ])) + ->prefix($cpActionPrefix) ->group($routes); + if ($siteActionPrefix === $cpActionPrefix) { + return; + } + $this->app['router'] ->middleware(['craft', 'craft.web']) - ->prefix(implode('/', [ - Cms::config()->actionTrigger, - $handle, - ])) + ->prefix($siteActionPrefix) ->group($routes); } } diff --git a/src/Route/RouteServiceProvider.php b/src/Route/RouteServiceProvider.php index 3d91eb34af8..5b15e9d618f 100644 --- a/src/Route/RouteServiceProvider.php +++ b/src/Route/RouteServiceProvider.php @@ -18,6 +18,7 @@ use CraftCms\Cms\Http\Middleware\EnforceLicenses; use CraftCms\Cms\Http\Middleware\EnsureInstalled; use CraftCms\Cms\Http\Middleware\ExtractNamespace; +use CraftCms\Cms\Http\Middleware\ForgetTriggerParameters; use CraftCms\Cms\Http\Middleware\HandleActionRequest; use CraftCms\Cms\Http\Middleware\HandleInertiaRequests; use CraftCms\Cms\Http\Middleware\HandleMatchedElementRoute; @@ -43,6 +44,7 @@ use Illuminate\Session\Middleware\AuthenticateSession; use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\RateLimiter; +use Illuminate\Support\Facades\URL; use Illuminate\Support\ServiceProvider; use Override; @@ -72,6 +74,11 @@ public function register(): void public function boot(Router $router, Routes $routes): void { + URL::defaults([ + 'cpTrigger' => trim((string) Cms::config()->cpTrigger, '/') ?: null, + 'actionTrigger' => trim(Cms::config()->actionTrigger, '/'), + ]); + $router->patterns($routes->tokens); $this->bootMiddleware($router); @@ -124,8 +131,8 @@ private function bootRequestForgeryExceptions(): void 'preview/preview', ])->flatMap(fn (string $route) => [ $route, - Cms::config()->actionTrigger.Str::start($route, '/'), - Cms::config()->cpTrigger.'/'.Cms::config()->actionTrigger.Str::start($route, '/'), + app(Routes::class)->actionTriggerUriPrefix().Str::start($route, '/'), + app(Routes::class)->cpActionTriggerUriPrefix().Str::start($route, '/'), ])->all()); } @@ -151,6 +158,7 @@ private function bootMaintenanceModeExceptions(): void private function bootMiddleware(Router $router): void { collect([ + ForgetTriggerParameters::class, EnsureInstalled::class, AddLogContext::class, ResolveSite::class, diff --git a/src/Route/Routes.php b/src/Route/Routes.php index 7b80d7cc831..c5d7c75332e 100644 --- a/src/Route/Routes.php +++ b/src/Route/Routes.php @@ -32,10 +32,51 @@ class Routes 'handle' => '[^\/]+', 'slug' => '[^\/]+', 'tag' => '[^\/]+', + 'cpTrigger' => preg_quote(trim((string) Cms::config()->cpTrigger, '/'), '#') ?: '(?!)', + 'actionTrigger' => preg_quote(trim(Cms::config()->actionTrigger, '/'), '#') ?: '(?!)', '*' => '[^\/]+', ]; } + public function cpTriggerRoutePrefix(): string + { + return trim((string) Cms::config()->cpTrigger, '/') === '' ? '' : '{cpTrigger}'; + } + + public function actionTriggerRoutePrefix(): string + { + return trim(Cms::config()->actionTrigger, '/') === '' ? '' : '{actionTrigger}'; + } + + public function cpActionTriggerRoutePrefix(): string + { + return $this->joinRoutePrefix([ + $this->cpTriggerRoutePrefix(), + $this->actionTriggerRoutePrefix(), + ]); + } + + public function actionTriggerUriPrefix(): string + { + return trim(Cms::config()->actionTrigger, '/'); + } + + public function cpActionTriggerUriPrefix(): string + { + return $this->joinRoutePrefix([ + trim((string) Cms::config()->cpTrigger, '/'), + $this->actionTriggerUriPrefix(), + ]); + } + + public function joinRoutePrefix(array $segments): string + { + return implode('/', array_filter( + $segments, + fn (?string $segment) => $segment !== null && $segment !== '', + )); + } + /** * @var array|null all the routes in project config for current site */ diff --git a/tests/Unit/Http/Middleware/HandleActionRequestTest.php b/tests/Unit/Http/Middleware/HandleActionRequestTest.php index 00b7a0c617b..9b7104205e2 100644 --- a/tests/Unit/Http/Middleware/HandleActionRequestTest.php +++ b/tests/Unit/Http/Middleware/HandleActionRequestTest.php @@ -28,6 +28,26 @@ ->and($handledRequest->attributes->get(ActionRoute::class))->toBeInstanceOf(ActionRoute::class); }); +it('rebinds rewritten root control panel action requests as the current request', function (?string $cpTrigger) { + Cms::config()->cpTrigger = $cpTrigger; + $request = Request::create('/utilities/query', 'POST', [ + 'action' => 'query/execute', + ]); + app()->instance('request', $request); + + $handledRequest = app(HandleActionRequest::class)->handle( + $request, + fn (Request $request) => $request, + ); + + expect($handledRequest->path())->toBe('actions/query/execute') + ->and(request())->toBe($handledRequest) + ->and($handledRequest->attributes->get(ActionRoute::class))->toBeInstanceOf(ActionRoute::class); +})->with([ + 'null' => [null], + 'slash' => ['/'], +]); + it('does not rebind action requests that already use the normalized action uri', function () { $request = Request::create('/admin/actions/query/execute', 'POST'); app()->instance('request', $request); diff --git a/tests/Unit/Http/RequestMixinTest.php b/tests/Unit/Http/RequestMixinTest.php index fb59e64df08..891dbab0b84 100644 --- a/tests/Unit/Http/RequestMixinTest.php +++ b/tests/Unit/Http/RequestMixinTest.php @@ -90,6 +90,15 @@ public function getRememberTokenName() it('returns false for site requests', function () { expect(Request::create('/news')->isCpRequest())->toBeFalse(); }); + + it('returns true for root control panel requests', function (?string $cpTrigger) { + Cms::config()->cpTrigger = $cpTrigger; + + expect(Request::create('/dashboard')->isCpRequest())->toBeTrue(); + })->with([ + 'null' => [null], + 'slash' => ['/'], + ]); }); describe('getToken', function () { diff --git a/tests/Unit/Http/Routing/ActionRouteResolverTest.php b/tests/Unit/Http/Routing/ActionRouteResolverTest.php index 82dfc7d7cad..fcfcb76f7b1 100644 --- a/tests/Unit/Http/Routing/ActionRouteResolverTest.php +++ b/tests/Unit/Http/Routing/ActionRouteResolverTest.php @@ -36,6 +36,18 @@ ->and($actionRoute->isCp)->toBeTrue(); }); +it('resolves root control panel action routes from the request path', function () { + Cms::config()->cpTrigger = null; + $request = Request::create('/actions/users/login'); + + $actionRoute = app(ActionRouteResolver::class)->resolve($request); + + expect($actionRoute)->toBeInstanceOf(ActionRoute::class) + ->and($actionRoute->segments)->toBe(['users', 'login']) + ->and($actionRoute->uri)->toBe('/actions/users/login') + ->and($actionRoute->isCp)->toBeTrue(); +}); + it('resolves action routes from the action param', function () { $request = Request::create('/admin/utilities/query', 'POST', [ 'action' => 'query/execute', @@ -70,3 +82,12 @@ expect(ActionRoute::uriForSegments(['users', 'login'], false))->toBe('/actions/users/login') ->and(ActionRoute::uriForSegments(['users', 'login'], true))->toBe('/admin/actions/users/login'); }); + +it('builds root control panel action uris from explicit segments', function (?string $cpTrigger) { + Cms::config()->cpTrigger = $cpTrigger; + + expect(ActionRoute::uriForSegments(['users', 'login'], true))->toBe('/actions/users/login'); +})->with([ + 'null' => [null], + 'slash' => ['/'], +]); diff --git a/tests/Unit/Plugin/Concerns/HasRoutesTest.php b/tests/Unit/Plugin/Concerns/HasRoutesTest.php index 3c8a9784c09..232b2da4f84 100644 --- a/tests/Unit/Plugin/Concerns/HasRoutesTest.php +++ b/tests/Unit/Plugin/Concerns/HasRoutesTest.php @@ -36,15 +36,47 @@ ->all(); expect($uris)->toContain('plugin-web') - ->and($uris)->toContain('admin/plugin-cp') - ->and($uris)->toContain('admin/actions/test-plugin/plugin-action') - ->and($uris)->toContain('actions/test-plugin/plugin-action') - ->and($uris)->not()->toContain('admin/actions/plugin-action') - ->and($uris)->not()->toContain('actions/plugin-action'); + ->and($uris)->toContain('{cpTrigger}/plugin-cp') + ->and($uris)->toContain('{cpTrigger}/{actionTrigger}/test-plugin/plugin-action') + ->and($uris)->toContain('{actionTrigger}/test-plugin/plugin-action') + ->and($uris)->not()->toContain('{cpTrigger}/{actionTrigger}/plugin-action') + ->and($uris)->not()->toContain('{actionTrigger}/plugin-action'); $routesByUri = collect(Route::getRoutes()->getRoutes()) ->keyBy(fn ($route) => $route->uri()); - expect($routesByUri->get('admin/plugin-cp')->middleware())->toContain('web', 'craft', 'craft.cp') - ->and($routesByUri->get('admin/actions/test-plugin/plugin-action')->middleware())->toContain('web', 'craft', 'craft.cp'); + expect($routesByUri->get('{cpTrigger}/plugin-cp')->middleware())->toContain('web', 'craft', 'craft.cp') + ->and($routesByUri->get('{cpTrigger}/{actionTrigger}/test-plugin/plugin-action')->middleware())->toContain('web', 'craft', 'craft.cp'); +}); + +it('registers root control panel routes when the cp trigger is null', function () { + /** @var GeneralConfig $config */ + $config = app(GeneralConfig::class); + $config->cpTrigger = null; + $config->actionTrigger = 'actions'; + + $plugin = TestPlugin::create([ + 'handle' => 'test-plugin', + 'name' => 'Test Plugin', + ]); + + $plugin->useBasePath($this->basePath); + $plugin->bootHasRoutes(); + + $routes = collect(Route::getRoutes()->getRoutes()); + $uris = $routes + ->map(fn ($route) => $route->uri()) + ->all(); + + expect($uris)->toContain('plugin-web') + ->and($uris)->toContain('plugin-cp') + ->and($uris)->toContain('{actionTrigger}/test-plugin/plugin-action') + ->and($uris)->not()->toContain('{cpTrigger}/plugin-cp') + ->and($uris)->not()->toContain('{cpTrigger}/{actionTrigger}/test-plugin/plugin-action'); + + $pluginActionRoutes = $routes->filter(fn ($route) => $route->uri() === '{actionTrigger}/test-plugin/plugin-action'); + + expect($routes->first(fn ($route) => $route->uri() === 'plugin-cp')->middleware())->toContain('web', 'craft', 'craft.cp'); + expect($pluginActionRoutes)->toHaveCount(1) + ->and($pluginActionRoutes->first()->middleware())->toContain('web', 'craft', 'craft.cp'); }); From 76c942906eee8c6235f2adc985274c95fd4cceef Mon Sep 17 00:00:00 2001 From: Rias Date: Thu, 18 Jun 2026 22:19:50 +0200 Subject: [PATCH 2/8] Set Wayfinder url defaults on cp boot --- resources/js/bootstrap/cp.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/js/bootstrap/cp.ts b/resources/js/bootstrap/cp.ts index 60275f799cb..503c6f9b595 100644 --- a/resources/js/bootstrap/cp.ts +++ b/resources/js/bootstrap/cp.ts @@ -15,6 +15,7 @@ import AssetIndexes from '@/modules/utilities/components/asset-indexes/AssetInde import SystemMessages from '@/modules/utilities/components/system-messages/SystemMessages.vue'; import DeprecationErrorsToolbar from '@/modules/utilities/components/deprecation-errors/DeprecationErrorsToolbar.vue'; import {setTranslations} from '@craftcms/cp/utilities/translate.ts.mjs'; +import {setUrlDefaults} from '@/wayfinder'; let bootedCallbacks: Array<(instance: any) => void> = []; let bootingCallbacks: Array<(instance: any) => void> = []; @@ -23,6 +24,14 @@ let bootingCallbacks: Array<(instance: any) => void> = []; const config = ConfigService.getInstance(); const queue = QueueService.getInstance(); +function routeSegment(value: unknown): string { + if (value === null || value === undefined) { + return ''; + } + + return value.toString().replace(/^\/+|\/+$/g, ''); +} + // Create our object const Cp = { initialConfig: {} as Record, @@ -53,6 +62,12 @@ const Cp = { init() { config.initialize(this.initialConfig); + + setUrlDefaults(() => ({ + cpTrigger: routeSegment(config.get('cpTrigger')), + actionTrigger: routeSegment(config.get('actionTrigger')), + })); + queue.initialize({ runAutomatically: config.get('runQueueAutomatically', true), enabled: true, From b71d74c1974b2adbb6ad8f8985a96b28dae58205 Mon Sep 17 00:00:00 2001 From: Rias Date: Thu, 18 Jun 2026 22:30:22 +0200 Subject: [PATCH 3/8] Cleanup wayfinder callsites due to new signatures --- .../js/common/components/CurrentUser.vue | 4 +++- resources/js/common/components/UserMenu.vue | 6 +++-- .../js/components/form/EntryTypeSelect.vue | 2 +- .../components/CreateEntryTypeButton.vue | 2 +- .../install/components/InstallingScreen.vue | 4 ++-- .../plugin-manager/components/PluginLinks.vue | 2 +- .../sites/components/DeleteSiteModal.vue | 2 +- .../js/modules/updater/components/Update.vue | 6 ++++- .../js/modules/updater/components/Updates.vue | 2 +- .../modules/updater/composables/useUpdater.ts | 6 +++-- resources/js/pages/graphql/Schemas.vue | 6 ++--- resources/js/pages/graphql/Tokens.vue | 7 ++++-- resources/js/pages/settings/EntryTypes.vue | 22 +++++++++++------- resources/js/pages/settings/Fields.vue | 18 ++++++++++----- resources/js/pages/settings/Filesystems.vue | 4 ++-- .../js/pages/settings/ImageTransforms.vue | 2 +- resources/js/pages/settings/Sections.vue | 23 ++++++++++++------- resources/js/pages/settings/Sites.vue | 8 +++---- resources/js/pages/settings/UserGroups.vue | 4 ++-- resources/js/pages/settings/Volumes.vue | 4 ++-- resources/js/pages/settings/routes/Edit.vue | 2 +- resources/js/pages/settings/routes/Index.vue | 6 ++--- 22 files changed, 87 insertions(+), 55 deletions(-) diff --git a/resources/js/common/components/CurrentUser.vue b/resources/js/common/components/CurrentUser.vue index 30c21fdc165..184c14f52c6 100644 --- a/resources/js/common/components/CurrentUser.vue +++ b/resources/js/common/components/CurrentUser.vue @@ -24,7 +24,9 @@