diff --git a/composer.lock b/composer.lock
index 68b09143d..595ef56ac 100644
--- a/composer.lock
+++ b/composer.lock
@@ -317,16 +317,16 @@
},
{
"name": "amphp/parallel",
- "version": "v2.2.9",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/amphp/parallel.git",
- "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238"
+ "reference": "9777db1460d1535bc2a843840684fb1205225b87"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/parallel/zipball/73d293f1fc4df1bebc3c4fce1432e82dd7032238",
- "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238",
+ "url": "https://api.github.com/repos/amphp/parallel/zipball/9777db1460d1535bc2a843840684fb1205225b87",
+ "reference": "9777db1460d1535bc2a843840684fb1205225b87",
"shasum": ""
},
"require": {
@@ -389,7 +389,7 @@
],
"support": {
"issues": "https://github.com/amphp/parallel/issues",
- "source": "https://github.com/amphp/parallel/tree/v2.2.9"
+ "source": "https://github.com/amphp/parallel/tree/v2.3.0"
},
"funding": [
{
@@ -397,7 +397,7 @@
"type": "github"
}
],
- "time": "2024-03-24T18:27:44+00:00"
+ "time": "2024-09-14T19:16:14+00:00"
},
{
"name": "amphp/parser",
@@ -1284,16 +1284,16 @@
},
{
"name": "aws/aws-sdk-php",
- "version": "3.323.3",
+ "version": "3.324.1",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "9dec2a6453bdb32b3abeb475fc63b46ba1cbd996"
+ "reference": "5b824a9b8015a38f18c53b023975c0f63c7bd3dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/9dec2a6453bdb32b3abeb475fc63b46ba1cbd996",
- "reference": "9dec2a6453bdb32b3abeb475fc63b46ba1cbd996",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5b824a9b8015a38f18c53b023975c0f63c7bd3dc",
+ "reference": "5b824a9b8015a38f18c53b023975c0f63c7bd3dc",
"shasum": ""
},
"require": {
@@ -1376,9 +1376,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.323.3"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.324.1"
},
- "time": "2024-10-08T18:05:47+00:00"
+ "time": "2024-10-11T18:22:01+00:00"
},
{
"name": "bacon/bacon-qr-code",
@@ -2221,16 +2221,16 @@
},
{
"name": "doctrine/dbal",
- "version": "4.1.1",
+ "version": "4.2.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8"
+ "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/7a8252418689feb860ea8dfeab66d64a56a64df8",
- "reference": "7a8252418689feb860ea8dfeab66d64a56a64df8",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/dadd35300837a3a2184bd47d403333b15d0a9bd0",
+ "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0",
"shasum": ""
},
"require": {
@@ -2243,7 +2243,7 @@
"doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1",
"jetbrains/phpstorm-stubs": "2023.2",
- "phpstan/phpstan": "1.12.0",
+ "phpstan/phpstan": "1.12.6",
"phpstan/phpstan-phpunit": "1.4.0",
"phpstan/phpstan-strict-rules": "^1.6",
"phpunit/phpunit": "10.5.30",
@@ -2309,7 +2309,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
- "source": "https://github.com/doctrine/dbal/tree/4.1.1"
+ "source": "https://github.com/doctrine/dbal/tree/4.2.1"
},
"funding": [
{
@@ -2325,7 +2325,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-03T08:58:39+00:00"
+ "time": "2024-10-10T18:01:27+00:00"
},
{
"name": "doctrine/deprecations",
@@ -2600,16 +2600,16 @@
},
{
"name": "dragonmantank/cron-expression",
- "version": "v3.3.3",
+ "version": "v3.4.0",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a"
+ "reference": "8c784d071debd117328803d86b2097615b457500"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
- "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500",
+ "reference": "8c784d071debd117328803d86b2097615b457500",
"shasum": ""
},
"require": {
@@ -2622,10 +2622,14 @@
"require-dev": {
"phpstan/extension-installer": "^1.0",
"phpstan/phpstan": "^1.0",
- "phpstan/phpstan-webmozart-assert": "^1.0",
"phpunit/phpunit": "^7.0|^8.0|^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
"Cron\\": "src/Cron/"
@@ -2649,7 +2653,7 @@
],
"support": {
"issues": "https://github.com/dragonmantank/cron-expression/issues",
- "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3"
+ "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0"
},
"funding": [
{
@@ -2657,7 +2661,7 @@
"type": "github"
}
],
- "time": "2023-08-10T19:36:49+00:00"
+ "time": "2024-10-09T13:47:03+00:00"
},
{
"name": "egulias/email-validator",
@@ -2781,16 +2785,16 @@
},
{
"name": "filament/actions",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/actions.git",
- "reference": "79dce62359b61b755a5e3d8faa0e047a1f92ad9a"
+ "reference": "886108b59ce99edc26f5bc1231134a95ec58718a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filamentphp/actions/zipball/79dce62359b61b755a5e3d8faa0e047a1f92ad9a",
- "reference": "79dce62359b61b755a5e3d8faa0e047a1f92ad9a",
+ "url": "https://api.github.com/repos/filamentphp/actions/zipball/886108b59ce99edc26f5bc1231134a95ec58718a",
+ "reference": "886108b59ce99edc26f5bc1231134a95ec58718a",
"shasum": ""
},
"require": {
@@ -2830,20 +2834,20 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
- "time": "2024-10-08T14:24:13+00:00"
+ "time": "2024-10-09T11:19:22+00:00"
},
{
"name": "filament/forms",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/forms.git",
- "reference": "94f0c7c66d766efc0f1f5c80e790e2391c7c09d7"
+ "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filamentphp/forms/zipball/94f0c7c66d766efc0f1f5c80e790e2391c7c09d7",
- "reference": "94f0c7c66d766efc0f1f5c80e790e2391c7c09d7",
+ "url": "https://api.github.com/repos/filamentphp/forms/zipball/896c868cca474b2e925a3e6162b7c76d8ff3e5fc",
+ "reference": "896c868cca474b2e925a3e6162b7c76d8ff3e5fc",
"shasum": ""
},
"require": {
@@ -2886,11 +2890,11 @@
"issues": "https://github.com/filamentphp/filament/issues",
"source": "https://github.com/filamentphp/filament"
},
- "time": "2024-10-08T14:24:11+00:00"
+ "time": "2024-10-09T11:19:26+00:00"
},
{
"name": "filament/infolists",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/infolists.git",
@@ -2941,7 +2945,7 @@
},
{
"name": "filament/notifications",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/notifications.git",
@@ -2993,7 +2997,7 @@
},
{
"name": "filament/spatie-laravel-media-library-plugin",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/spatie-laravel-media-library-plugin.git",
@@ -3030,7 +3034,7 @@
},
{
"name": "filament/support",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/support.git",
@@ -3089,7 +3093,7 @@
},
{
"name": "filament/tables",
- "version": "v3.2.116",
+ "version": "v3.2.117",
"source": {
"type": "git",
"url": "https://github.com/filamentphp/tables.git",
@@ -3988,16 +3992,16 @@
},
{
"name": "laravel/framework",
- "version": "v11.27.0",
+ "version": "v11.27.2",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "fa6ce79f02d35c045605534bc9b105763c4eff1b"
+ "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/fa6ce79f02d35c045605534bc9b105763c4eff1b",
- "reference": "fa6ce79f02d35c045605534bc9b105763c4eff1b",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
+ "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
"shasum": ""
},
"require": {
@@ -4193,7 +4197,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-10-08T16:02:30+00:00"
+ "time": "2024-10-09T04:17:35+00:00"
},
{
"name": "laravel/prompts",
@@ -4799,16 +4803,16 @@
},
{
"name": "league/csv",
- "version": "9.16.0",
+ "version": "9.17.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/csv.git",
- "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440"
+ "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/csv/zipball/998280c6c34bd67d8125fdc8b45bae28d761b440",
- "reference": "998280c6c34bd67d8125fdc8b45bae28d761b440",
+ "url": "https://api.github.com/repos/thephpleague/csv/zipball/8cab815fb11ec93aa2f7b8a57b3daa1f1a364011",
+ "reference": "8cab815fb11ec93aa2f7b8a57b3daa1f1a364011",
"shasum": ""
},
"require": {
@@ -4816,17 +4820,16 @@
"php": "^8.1.2"
},
"require-dev": {
- "doctrine/collections": "^2.2.2",
"ext-dom": "*",
"ext-xdebug": "*",
- "friendsofphp/php-cs-fixer": "^3.57.1",
- "phpbench/phpbench": "^1.2.15",
- "phpstan/phpstan": "^1.11.1",
- "phpstan/phpstan-deprecation-rules": "^1.2.0",
+ "friendsofphp/php-cs-fixer": "^3.64.0",
+ "phpbench/phpbench": "^1.3.1",
+ "phpstan/phpstan": "^1.12.5",
+ "phpstan/phpstan-deprecation-rules": "^1.2.1",
"phpstan/phpstan-phpunit": "^1.4.0",
- "phpstan/phpstan-strict-rules": "^1.6.0",
- "phpunit/phpunit": "^10.5.16 || ^11.1.3",
- "symfony/var-dumper": "^6.4.6 || ^7.0.7"
+ "phpstan/phpstan-strict-rules": "^1.6.1",
+ "phpunit/phpunit": "^10.5.16 || ^11.4.0",
+ "symfony/var-dumper": "^6.4.8 || ^7.1.5"
},
"suggest": {
"ext-dom": "Required to use the XMLConverter and the HTMLConverter classes",
@@ -4844,7 +4847,7 @@
"src/functions_include.php"
],
"psr-4": {
- "League\\Csv\\": "src"
+ "League\\Csv\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -4883,7 +4886,7 @@
"type": "github"
}
],
- "time": "2024-05-24T11:04:54+00:00"
+ "time": "2024-10-10T10:30:28+00:00"
},
{
"name": "league/flysystem",
@@ -5562,16 +5565,16 @@
},
{
"name": "maennchen/zipstream-php",
- "version": "3.1.0",
+ "version": "3.1.1",
"source": {
"type": "git",
"url": "https://github.com/maennchen/ZipStream-PHP.git",
- "reference": "b8174494eda667f7d13876b4a7bfef0f62a7c0d1"
+ "reference": "6187e9cc4493da94b9b63eb2315821552015fca9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/b8174494eda667f7d13876b4a7bfef0f62a7c0d1",
- "reference": "b8174494eda667f7d13876b4a7bfef0f62a7c0d1",
+ "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/6187e9cc4493da94b9b63eb2315821552015fca9",
+ "reference": "6187e9cc4493da94b9b63eb2315821552015fca9",
"shasum": ""
},
"require": {
@@ -5627,19 +5630,15 @@
],
"support": {
"issues": "https://github.com/maennchen/ZipStream-PHP/issues",
- "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.0"
+ "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.1"
},
"funding": [
{
"url": "https://github.com/maennchen",
"type": "github"
- },
- {
- "url": "https://opencollective.com/zipstream",
- "type": "open_collective"
}
],
- "time": "2023-06-21T14:59:35+00:00"
+ "time": "2024-10-10T12:33:01+00:00"
},
{
"name": "mailersend/laravel-driver",
@@ -10500,16 +10499,16 @@
},
{
"name": "staudenmeir/eloquent-has-many-deep",
- "version": "v1.20.3",
+ "version": "v1.20.4",
"source": {
"type": "git",
"url": "https://github.com/staudenmeir/eloquent-has-many-deep.git",
- "reference": "b47868794ef5502a3c7aa927a011c5194c4b0e4a"
+ "reference": "8966b76667eb8de528ed4cc935cf4e1d2dec96a8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/staudenmeir/eloquent-has-many-deep/zipball/b47868794ef5502a3c7aa927a011c5194c4b0e4a",
- "reference": "b47868794ef5502a3c7aa927a011c5194c4b0e4a",
+ "url": "https://api.github.com/repos/staudenmeir/eloquent-has-many-deep/zipball/8966b76667eb8de528ed4cc935cf4e1d2dec96a8",
+ "reference": "8966b76667eb8de528ed4cc935cf4e1d2dec96a8",
"shasum": ""
},
"require": {
@@ -10555,7 +10554,7 @@
"description": "Laravel Eloquent HasManyThrough relationships with unlimited levels",
"support": {
"issues": "https://github.com/staudenmeir/eloquent-has-many-deep/issues",
- "source": "https://github.com/staudenmeir/eloquent-has-many-deep/tree/v1.20.3"
+ "source": "https://github.com/staudenmeir/eloquent-has-many-deep/tree/v1.20.4"
},
"funding": [
{
@@ -10563,7 +10562,7 @@
"type": "custom"
}
],
- "time": "2024-10-06T18:16:18+00:00"
+ "time": "2024-10-11T20:29:22+00:00"
},
{
"name": "staudenmeir/eloquent-has-many-deep-contracts",
diff --git a/nova/database/migrations/2019_04_00_100000_populate_pages_table.php b/nova/database/migrations/2019_04_00_100000_populate_pages_table.php
index 43d1d3a5a..b79ec78a9 100644
--- a/nova/database/migrations/2019_04_00_100000_populate_pages_table.php
+++ b/nova/database/migrations/2019_04_00_100000_populate_pages_table.php
@@ -44,11 +44,11 @@ protected function populateAdminPages(): void
['name' => 'List activity logs', 'uri' => 'admin/activity-log', 'key' => 'admin.activity-log.index', 'resource' => 'Nova\\Dashboards\\Controllers\\ActivityLogController@index', 'layout' => 'admin', 'content_can_be_edited' => true, 'heading' => 'Activity log', 'subheading' => 'Track all user activity in Nova'],
['name' => 'View activity log', 'uri' => 'admin/activity-log/{activity}/show', 'key' => 'admin.activity-log.show', 'resource' => 'Nova\\Dashboards\\Controllers\\ActivityLogController@show', 'layout' => 'admin', 'content_can_be_edited' => true, 'heading' => 'Activity log detail'],
- ['name' => 'List themes', 'uri' => 'admin/themes', 'key' => 'admin.themes.index', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@index', 'layout' => 'admin'],
+ ['name' => 'List themes', 'uri' => 'admin/themes', 'key' => 'admin.themes.index', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@index', 'layout' => 'admin', 'content_can_be_edited' => true, 'heading' => 'Themes', 'subheading' => 'Personalize your public-facing site with a custom theme'],
['name' => 'View theme', 'uri' => 'admin/themes/{theme}/show', 'key' => 'admin.themes.show', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@show', 'layout' => 'admin'],
- ['name' => 'Create theme', 'uri' => 'admin/themes/create', 'key' => 'admin.themes.create', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@create', 'layout' => 'admin'],
+ ['name' => 'Create theme', 'uri' => 'admin/themes/create', 'key' => 'admin.themes.create', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@create', 'layout' => 'admin', 'content_can_be_edited' => true, 'heading' => 'Add a new theme'],
['name' => 'Store theme', 'uri' => 'admin/themes', 'key' => 'admin.themes.store', 'verb' => PageVerb::post, 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@store', 'layout' => 'admin'],
- ['name' => 'Edit theme', 'uri' => 'admin/themes/{theme}/edit', 'key' => 'admin.themes.edit', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@edit', 'layout' => 'admin'],
+ ['name' => 'Edit theme', 'uri' => 'admin/themes/{theme}/edit', 'key' => 'admin.themes.edit', 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@edit', 'layout' => 'admin', 'content_can_be_edited' => true, 'heading' => 'Edit theme'],
['name' => 'Update theme', 'uri' => 'admin/themes/{theme}', 'key' => 'admin.themes.update', 'verb' => PageVerb::put, 'resource' => 'Nova\\Themes\\Controllers\\ThemeController@update', 'layout' => 'admin'],
['name' => 'List roles', 'uri' => 'admin/roles', 'key' => 'admin.roles.index', 'resource' => 'Nova\\Roles\\Controllers\\RoleController@index', 'layout' => 'admin', 'content_can_be_edited' => true, 'heading' => 'Roles', 'subheading' => 'Control what users can do throughout Nova'],
diff --git a/nova/resources/views/components/button/index.blade.php b/nova/resources/views/components/button/index.blade.php
index 9a36b4573..dfa6b7f53 100644
--- a/nova/resources/views/components/button/index.blade.php
+++ b/nova/resources/views/components/button/index.blade.php
@@ -68,10 +68,10 @@
'border-transparent text-gray-950 [--btn-icon:theme(colors.gray.500)] hover:bg-gray-950/5 hover:[--btn-icon:theme(colors.gray.700)] active:bg-gray-950/5 active:bg-gray-950/5 active:[--btn-icon:theme(colors.gray.700)] active:[--btn-icon:theme(colors.gray.700)] dark:text-white dark:[--btn-icon:theme(colors.gray.500)] dark:hover:bg-white/10 dark:hover:[--btn-icon:theme(colors.gray.400)] dark:active:bg-white/10 dark:active:bg-white/10 dark:active:[--btn-icon:theme(colors.gray.400)] dark:active:[--btn-icon:theme(colors.gray.400)]',
match ($color) {
- 'primary', 'panda' => 'text-white [--btn-bg:theme(colors.primary.500)] [--btn-border:theme(colors.primary.600/80%)] [--btn-hover-overlay:theme(colors.white/10%)] [--btn-icon:theme(colors.white/60%)] hover:[--btn-icon:theme(colors.white/80%)] active:[--btn-icon:theme(colors.white/80%)]',
- 'danger' => 'text-white [--btn-hover-overlay:theme(colors.white/10%)] [--btn-icon:theme(colors.white/60%)] [--btn-bg:theme(colors.danger.500)] [--btn-border:theme(colors.danger.600/80%)] hover:[--btn-icon:theme(colors.white/80%)] active:[--btn-icon:theme(colors.white/80%)]',
- 'warning' => 'text-white [--btn-hover-overlay:theme(colors.white/10%)] [--btn-icon:theme(colors.white/60%)] [--btn-bg:theme(colors.warning.500)] [--btn-border:theme(colors.warning.600/80%)] hover:[--btn-icon:theme(colors.white/80%)] active:[--btn-icon:theme(colors.white/80%)]',
- default => 'text-gray-950 [--btn-icon:theme(colors.gray.500)] [--btn-bg:white] [--btn-border:theme(colors.gray.950/10%)] [--btn-hover-overlay:theme(colors.gray.950/2.5%)] hover:[--btn-icon:theme(colors.gray.700)] hover:[--btn-border:theme(colors.gray.950/15%)] active:[--btn-icon:theme(colors.gray.700)] active:[--btn-border:theme(colors.gray.950/15%)] dark:text-white dark:[--btn-icon:theme(colors.gray.500)] dark:[--btn-bg:theme(colors.gray.800)] dark:[--btn-hover-overlay:theme(colors.white/5%)] dark:hover:[--btn-icon:theme(colors.gray.400)] dark:active:[--btn-icon:theme(colors.gray.400)]',
+ 'primary' => 'hover:text-primary-500',
+ 'danger' => 'hover:text-danger-500',
+ 'warning' => 'hover:text-warning-700 dark:hover:text-warning-400',
+ default => 'hover:text-danger-950',
},
]),
diff --git a/nova/resources/views/filament/tables/themes.blade.php b/nova/resources/views/filament/tables/themes.blade.php
deleted file mode 100644
index ca5b4f320..000000000
--- a/nova/resources/views/filament/tables/themes.blade.php
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
- @forelse ($records as $record)
-
-
-
location}/{$record->preview}") }}"
- alt=""
- />
-
-
-
-
- {{ $record->name }}
-
-
-
-
-
- themes/{{ $record->location }}
-
-
-
- {{ ($record->exists) ? $record->status->getLabel() : 'Pending' }}
-
-
-
-
- @empty
-
Nothing
- @endforelse
-
-
diff --git a/nova/resources/views/pages/post-types/create.blade.php b/nova/resources/views/pages/post-types/create.blade.php
index 9774f42a8..4e60ad877 100644
--- a/nova/resources/views/pages/post-types/create.blade.php
+++ b/nova/resources/views/pages/post-types/create.blade.php
@@ -150,18 +150,20 @@ class="text-left text-base font-semibold text-gray-900 dark:text-white"
Enabled
Disabled
-
-
+
+
+
+
+
+
diff --git a/nova/resources/views/pages/post-types/edit.blade.php b/nova/resources/views/pages/post-types/edit.blade.php
index a0fd25c8e..139a75619 100644
--- a/nova/resources/views/pages/post-types/edit.blade.php
+++ b/nova/resources/views/pages/post-types/edit.blade.php
@@ -138,18 +138,20 @@ class="flex w-full appearance-none items-center justify-between"
Enabled
Disabled
-
-
+
+
+
+
+
+
diff --git a/nova/resources/views/pages/posts/create-new.blade.php b/nova/resources/views/pages/posts/create-new.blade.php
new file mode 100644
index 000000000..6aa28c976
--- /dev/null
+++ b/nova/resources/views/pages/posts/create-new.blade.php
@@ -0,0 +1,687 @@
+
+
+
+
+
+
+ {{--
+
+ --}}
+
+
+
+
+
+
+ Authors
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Admiral Jean-Luc Picard
+
+
+ Martok (played by user1)
+
+
+
+
+ Manage authors
+
+
+
+
+
+
+
+
+ Content ratings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Post participants
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Post position
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{--
+
+
+
+
+
+ Manage authors
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Content ratings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Review participants
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ admin
+
+
+
Admiral Jean-Luc Picard
+
+
+
+
+
+
+
+
+
+
+
+ Are you sure you want to remove
+
+ User
+
+ and any characters they’re marked as writing as authors of this
+ post?
+
+
+
+
+ Remove
+
+
+ Cancel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Are you sure you want to remove
+
+ User
+
+ and any characters they’re marked as writing as authors of this
+ post?
+
+
+
+
+ Remove
+
+
+ Cancel
+
+
+
+
+
+
+
+
+
+
+ Remove all non-participating users
+
+
+
+
+
+ Are you sure you want to remove all users who did not
+ participate in writing this post and their characters?
+
+
+
+
+ Remove all
+
+
+ Cancel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Post position
+
+
+
+
+
+
+
+
+
+
+
+
+ --}}
+
+ {{--
+
+
+
+
+ Manage authors
+
+
+
+ Let players and readers know what to expect from your post by setting the content ratings.
+ These content ratings follow the game’s default ratings unless you specify otherwise.
+
+
+
+
Update authors
+
+
+
+
+
+
+ Content ratings
+
+
+
+ Let players and readers know what to expect from your post by setting the content ratings.
+ These content ratings follow the game’s default ratings unless you specify otherwise.
+
+
+
+
Change content ratings
+
+
+
+
+
+
+ Review participants
+
+
+
+ You can review players who participated in writing this post to ensure that the proper
+ authors are credited.
+
+
+
+
Review post participants
+
+
+
+
+
+
+ Post position
+
+
+
+ Posts live on a timeline which allows you to set exactly where this post should appear in
+ the story’s timeline.
+
+
+
+
Change post position
+
+ --}}
+
+
+ Publish post →
+
+
+
+ Discard draft
+
+
+
+
+
+
diff --git a/nova/resources/views/pages/posts/livewire/select-post-position-modal.blade.php b/nova/resources/views/pages/posts/livewire/select-post-position-modal.blade.php
index f82e695c3..687257fa4 100644
--- a/nova/resources/views/pages/posts/livewire/select-post-position-modal.blade.php
+++ b/nova/resources/views/pages/posts/livewire/select-post-position-modal.blade.php
@@ -1,12 +1,5 @@
-
-
-
-
-
Set post position
-
-
-
-
+
+
@@ -24,37 +17,59 @@
-
+
@if ($posts->count() > 0)
@foreach ($posts as $post)
-
-
+
@if ($selected && $direction)
Apply
@endif
Cancel
-
+
diff --git a/nova/resources/views/pages/posts/livewire/steps/publish-post.blade.php b/nova/resources/views/pages/posts/livewire/steps/publish-post.blade.php
index 42bcb6a81..82d30b647 100644
--- a/nova/resources/views/pages/posts/livewire/steps/publish-post.blade.php
+++ b/nova/resources/views/pages/posts/livewire/steps/publish-post.blade.php
@@ -310,10 +310,8 @@ class="mt-5"
@endif
-
-
+
+
@can('discardDraft', $post)
Discard draft
@@ -365,7 +363,7 @@ class="flex flex-col rounded-b-lg border-t border-gray-950/5 px-4 py-4 md:flex-r
@endcan
-
+
@if ($post->is_published)
Update post
@else
@@ -373,5 +371,5 @@ class="flex flex-col rounded-b-lg border-t border-gray-950/5 px-4 py-4 md:flex-r
Publish post
@endif
-
+
diff --git a/nova/resources/views/pages/stories/livewire/timeline.blade.php b/nova/resources/views/pages/stories/livewire/timeline.blade.php
index 3bf14d5ec..c8686934c 100644
--- a/nova/resources/views/pages/stories/livewire/timeline.blade.php
+++ b/nova/resources/views/pages/stories/livewire/timeline.blade.php
@@ -1,52 +1,56 @@
-@if ($stories->count() > 0)
-
-
-
-
-
+@use('Nova\Stories\Models\Story')
+
+
+ @if ($stories->count() > 0)
+
+
+
+
+
+
+ Sort by timeline order
+ Sort by start date
+ Sort by end date
+
+
+
- Sort by timeline order
- Sort by start date
- Sort by end date
+ Newest first
+ Oldest first
-
+
+
-
- Newest first
- Oldest first
-
-
+ @can('viewAny', Story::class)
+
+
+
+ Manage stories
+
+
+ @endcan
- @can('viewAny', $storyClass)
-
-
-
- Manage stories
-
-
- @endcan
-
-
-
-
-
-
-@else
-
-
- No stories found
+
+
+
+
+ @else
+
+
+ No stories found
- @can('create', $storyClass)
- Add your first story
- @endcan
-
-@endif
+ @can('create', Story::class)
+ Add your first story
+ @endcan
+
+ @endif
+
diff --git a/nova/resources/views/pages/stories/show.blade.php b/nova/resources/views/pages/stories/show.blade.php
index 92a84b655..af06206f5 100644
--- a/nova/resources/views/pages/stories/show.blade.php
+++ b/nova/resources/views/pages/stories/show.blade.php
@@ -1,13 +1,15 @@
@if ($story->hasMedia('story-image'))
-
-
-
+
+
+
+
+
@endif
diff --git a/nova/resources/views/pages/themes/create.blade.php b/nova/resources/views/pages/themes/create.blade.php
index afdf510cc..aeb55d8a8 100644
--- a/nova/resources/views/pages/themes/create.blade.php
+++ b/nova/resources/views/pages/themes/create.blade.php
@@ -1,80 +1,111 @@
+@use('Nova\Themes\Models\Theme')
+
-
-
-
- @can('viewAny', Nova\Themes\Models\Theme::class)
- ← Back
- @endcan
-
-
+
+
+ @can('viewAny', Theme::class)
+
+ ← Back
+
+ @endcan
+
-
-
-
-
+
+
+
+
-
-
-
+ :error="$errors->first('location')"
+ >
+
+ Themes are stored in the
+ themes/
+ directory at the root level of Nova’s file tree.
+
-
-
-
+
+
-
- {{ old('credits') }}
-
+
+
+
-
-
- Active
-
-
+
+ {{ old('credits') }}
+
-
-
-
-
-
+
+
+ Active
+
+
+
+
+
+
+
+ Fonts
+ Customize your theme by changing the fonts used.
+
+
+
+
+
+
+
+
+
+
-
+
Add
Cancel
-
+
-
+
diff --git a/nova/resources/views/pages/themes/edit.blade.php b/nova/resources/views/pages/themes/edit.blade.php
index 693c356f0..edb75e436 100644
--- a/nova/resources/views/pages/themes/edit.blade.php
+++ b/nova/resources/views/pages/themes/edit.blade.php
@@ -1,70 +1,81 @@
-
-
+
+
- @can('viewAny', Nova\Themes\Models\Theme::class)
+ @can('viewAny', $theme::class)
← Back
@endcan
+
+ @can('update', $theme)
+
+ @endcan
+
- @if (settings('appearance.theme') === $theme->name)
-
-
- {{ $theme->name }} is currently set as the theme for your public-facing site. Be careful when
- making any updates to this theme as it could impact your public-facing site.
-
-
+
+ @if (settings('appearance.theme') === $theme->location)
+
+ {{ $theme->name }} is currently set as the theme for your public-facing site. Be careful when
+ making any updates to this theme as it could impact your public-facing site.
+
@endif
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+ :error="$errors->first('location')"
+ >
+
+ Themes are stored in the
+ themes/
+ directory at the root level of Nova’s file tree.
+
+
+
+
-
-
-
+
+
+
-
-
- {{ old('credits', $theme->credits) }}
-
-
+
+ {{ old('credits', $theme->credits) }}
+
-
-
- Active
-
-
+
+
+ Active
+
+
+
-
+
Update
Cancel
-
+
-
+
diff --git a/nova/resources/views/pages/themes/index.blade.php b/nova/resources/views/pages/themes/index.blade.php
index 43aad7f69..fe2681455 100644
--- a/nova/resources/views/pages/themes/index.blade.php
+++ b/nova/resources/views/pages/themes/index.blade.php
@@ -1,4 +1,17 @@
+@use('Nova\Themes\Models\Theme')
+
+
+
+ @can('create', Theme::class)
+
+
+ Add
+
+ @endcan
+
+
+
diff --git a/nova/resources/views/pages/themes/livewire/theme-settings.blade.php b/nova/resources/views/pages/themes/livewire/theme-settings.blade.php
index 53fdfa1aa..6faf3d3aa 100644
--- a/nova/resources/views/pages/themes/livewire/theme-settings.blade.php
+++ b/nova/resources/views/pages/themes/livewire/theme-settings.blade.php
@@ -1,9 +1,16 @@
-
-
-
-
-
+ @if ($iconTrigger)
+
+
+
+
+
+ @else
+
+
+ Theme settings
+
+ @endif
+
+
+
+ ← Back
+
+ @can('update', $theme)
+
+
+ Edit
+
+ @endcan
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $theme->credits }}
+
+
+ @if (settings('appearance.theme') === $theme->location)
+
+ Currently selected theme for public site
+
+ @endif
+
+
+
+
+
diff --git a/nova/resources/views/subnavs/system.blade.php b/nova/resources/views/subnavs/system.blade.php
index 044ab28d5..8aa8df20b 100644
--- a/nova/resources/views/subnavs/system.blade.php
+++ b/nova/resources/views/subnavs/system.blade.php
@@ -1,4 +1,5 @@
@use('Nova\Menus\Models\MenuItem')
+@use('Nova\Themes\Models\Theme')
@@ -19,11 +20,13 @@
@endcan
{{-- Add-ons --}}
- {{--
-
- Themes
+
+ @can('viewAny', Theme::class)
+
+ Themes
- --}}
+ @endcan
+
@can('viewAny', Spatie\Activitylog\Models\Activity::class)
authorize('decide', $this->application);
+
$this->form->save();
$notification = match ($this->form->result) {
@@ -38,6 +42,8 @@ public function save(): void
public function mount()
{
+ $this->authorize('decide', $this->application);
+
$this->form->setApplication($this->application);
}
diff --git a/nova/src/Applications/Livewire/ApplicationDiscussion.php b/nova/src/Applications/Livewire/ApplicationDiscussion.php
index 176f55c9b..007d5cdbc 100644
--- a/nova/src/Applications/Livewire/ApplicationDiscussion.php
+++ b/nova/src/Applications/Livewire/ApplicationDiscussion.php
@@ -7,6 +7,7 @@
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\On;
use Livewire\Component;
use Nova\Applications\Models\Application;
@@ -17,6 +18,7 @@
#[On('review-submitted')]
class ApplicationDiscussion extends Component
{
+ #[Locked]
public Application $application;
public ?string $content = null;
diff --git a/nova/src/Applications/Livewire/ApplicationReview.php b/nova/src/Applications/Livewire/ApplicationReview.php
index 634fa43de..24b1d4d35 100644
--- a/nova/src/Applications/Livewire/ApplicationReview.php
+++ b/nova/src/Applications/Livewire/ApplicationReview.php
@@ -6,6 +6,7 @@
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\On;
use Livewire\Component;
use Nova\Applications\Models\Application;
@@ -15,6 +16,7 @@
#[On('reviewers-updated')]
class ApplicationReview extends Component
{
+ #[Locked]
public Application $application;
#[Computed]
diff --git a/nova/src/Applications/Livewire/ApplicationReviewForm.php b/nova/src/Applications/Livewire/ApplicationReviewForm.php
index b04523c8e..2b1dfc082 100644
--- a/nova/src/Applications/Livewire/ApplicationReviewForm.php
+++ b/nova/src/Applications/Livewire/ApplicationReviewForm.php
@@ -4,6 +4,7 @@
namespace Nova\Applications\Livewire;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Form;
use Nova\Applications\Enums\ApplicationResult;
@@ -13,6 +14,7 @@
class ApplicationReviewForm extends Form
{
+ #[Locked]
public Application $application;
#[Validate('required')]
diff --git a/nova/src/Applications/Livewire/ApplicationReviewModal.php b/nova/src/Applications/Livewire/ApplicationReviewModal.php
index e70ea2f03..c855173c2 100644
--- a/nova/src/Applications/Livewire/ApplicationReviewModal.php
+++ b/nova/src/Applications/Livewire/ApplicationReviewModal.php
@@ -6,6 +6,7 @@
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use LivewireUI\Modal\ModalComponent;
use Nova\Applications\Models\Application;
use Nova\Applications\Models\ApplicationReview;
@@ -18,10 +19,13 @@
class ApplicationReviewModal extends ModalComponent
{
+ #[Locked]
public Application $application;
+ #[Locked]
public ?User $user = null;
+ #[Locked]
public ?ApplicationReview $review;
public ApplicationReviewForm $form;
@@ -35,6 +39,8 @@ public function dismiss(): void
public function save(): void
{
+ $this->authorize('vote', $this->application);
+
$this->form->save();
if (filled($this->applicationReviewForm->published_fields)) {
@@ -66,6 +72,8 @@ public function owner(): User
public function mount()
{
+ $this->authorize('vote', $this->application);
+
$this->review = $this->application->reviews()
->wherePivot('user_id', $this->owner->id)
->first()->pivot;
diff --git a/nova/src/Applications/Livewire/ApplicationReviewersModal.php b/nova/src/Applications/Livewire/ApplicationReviewersModal.php
index 6f6e2d3f3..619191293 100644
--- a/nova/src/Applications/Livewire/ApplicationReviewersModal.php
+++ b/nova/src/Applications/Livewire/ApplicationReviewersModal.php
@@ -6,6 +6,7 @@
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use LivewireUI\Modal\ModalComponent;
use Nova\Applications\Models\Application;
use Nova\Applications\Notifications\ApplicationReadyForReview;
@@ -14,6 +15,7 @@
class ApplicationReviewersModal extends ModalComponent
{
+ #[Locked]
public Application $application;
public array $selectedReviewers = [];
@@ -25,6 +27,8 @@ public function dismiss(): void
public function save(): void
{
+ $this->authorize('decide', $this->application);
+
$changes = $this->application->reviews()->sync($this->selectedReviewers);
User::query()
@@ -51,6 +55,8 @@ public function users(): Collection
public function mount()
{
+ $this->authorize('decide', $this->application);
+
$this->selectedReviewers = $this->application->reviews
->flatMap(fn (User $user) => [(string) $user->id])
->all();
diff --git a/nova/src/Characters/Livewire/ActivateCharacterButton.php b/nova/src/Characters/Livewire/ActivateCharacterButton.php
index 2e813835b..a7a4c5a47 100644
--- a/nova/src/Characters/Livewire/ActivateCharacterButton.php
+++ b/nova/src/Characters/Livewire/ActivateCharacterButton.php
@@ -4,6 +4,7 @@
namespace Nova\Characters\Livewire;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Characters\Actions\ActivateCharacter;
use Nova\Characters\Events\CharacterActivated;
@@ -11,6 +12,7 @@
class ActivateCharacterButton extends Component
{
+ #[Locked]
public Character $character;
public function activate(): void
diff --git a/nova/src/Characters/Livewire/DeactivateCharacterButton.php b/nova/src/Characters/Livewire/DeactivateCharacterButton.php
index 060c58779..6ac24eabd 100644
--- a/nova/src/Characters/Livewire/DeactivateCharacterButton.php
+++ b/nova/src/Characters/Livewire/DeactivateCharacterButton.php
@@ -4,6 +4,7 @@
namespace Nova\Characters\Livewire;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Characters\Actions\DeactivateCharacter;
use Nova\Characters\Events\CharacterDeactivated;
@@ -11,6 +12,7 @@
class DeactivateCharacterButton extends Component
{
+ #[Locked]
public Character $character;
public function deactivate(): void
diff --git a/nova/src/Forms/Livewire/DynamicForm.php b/nova/src/Forms/Livewire/DynamicForm.php
index 64b216af3..ea32bfcfd 100644
--- a/nova/src/Forms/Livewire/DynamicForm.php
+++ b/nova/src/Forms/Livewire/DynamicForm.php
@@ -8,6 +8,7 @@
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Mail;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Forms\Actions\CreateFormSubmission;
use Nova\Forms\Actions\SyncFormSubmissionResponses;
@@ -23,14 +24,18 @@
class DynamicForm extends Component
{
+ #[Locked]
public Form $form;
+ #[Locked]
public ?Model $owner = null;
public ?FormSubmission $submission = null;
+ #[Locked]
public bool $admin = false;
+ #[Locked]
public bool $static = false;
public array $values = [];
diff --git a/nova/src/Forms/Livewire/FormDesigner.php b/nova/src/Forms/Livewire/FormDesigner.php
index 81d3641db..91ba28432 100644
--- a/nova/src/Forms/Livewire/FormDesigner.php
+++ b/nova/src/Forms/Livewire/FormDesigner.php
@@ -7,6 +7,7 @@
use Awcodes\Scribble\ScribbleEditor;
use Filament\Forms\Form;
use Illuminate\Support\Facades\Cache;
+use Livewire\Attributes\Locked;
use Nova\Forms\Actions\PublishFormManager;
use Nova\Forms\Actions\UnpublishForm;
use Nova\Forms\Actions\UpdateForm;
@@ -18,6 +19,7 @@
class FormDesigner extends FormComponent
{
+ #[Locked]
public NovaForm $novaForm;
protected string $view = 'pages.forms.livewire.form-designer';
diff --git a/nova/src/Media/Livewire/UploadImage.php b/nova/src/Media/Livewire/UploadImage.php
index ab6e8e0fa..e48a05cb2 100644
--- a/nova/src/Media/Livewire/UploadImage.php
+++ b/nova/src/Media/Livewire/UploadImage.php
@@ -6,6 +6,7 @@
use Illuminate\Database\Eloquent\Model;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Livewire\WithFileUploads;
@@ -14,6 +15,7 @@ class UploadImage extends Component
{
use WithFileUploads;
+ #[Locked]
public ?Model $model = null;
public ?string $modelAttribute = null;
diff --git a/nova/src/Pages/Livewire/PageDesigner.php b/nova/src/Pages/Livewire/PageDesigner.php
index 30c03cf49..bb0a7057d 100644
--- a/nova/src/Pages/Livewire/PageDesigner.php
+++ b/nova/src/Pages/Livewire/PageDesigner.php
@@ -8,6 +8,7 @@
use Awcodes\Typist\TypistEditor;
use Filament\Forms\Form;
use Illuminate\Support\Facades\Cache;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\On;
use Nova\Foundation\Filament\Notifications\Notification;
use Nova\Foundation\Livewire\FormComponent;
@@ -19,6 +20,7 @@
class PageDesigner extends FormComponent
{
+ #[Locked]
public Page $page;
protected string $view = 'pages.pages.livewire.page-designer';
diff --git a/nova/src/PublicSite/Livewire/PostsTimeline.php b/nova/src/PublicSite/Livewire/PostsTimeline.php
index a15fcb9ed..ca43c23c2 100644
--- a/nova/src/PublicSite/Livewire/PostsTimeline.php
+++ b/nova/src/PublicSite/Livewire/PostsTimeline.php
@@ -6,12 +6,14 @@
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Stories\Models\Post;
use Nova\Stories\Models\Story;
class PostsTimeline extends Component
{
+ #[Locked]
public ?Story $story = null;
#[Computed]
diff --git a/nova/src/Roles/Livewire/ManagePermissions.php b/nova/src/Roles/Livewire/ManagePermissions.php
index 624d1ea0a..36afc9e8c 100644
--- a/nova/src/Roles/Livewire/ManagePermissions.php
+++ b/nova/src/Roles/Livewire/ManagePermissions.php
@@ -7,6 +7,7 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Roles\Models\Permission;
use Nova\Roles\Models\Role;
@@ -15,6 +16,7 @@ class ManagePermissions extends Component
{
public string $search = '';
+ #[Locked]
public ?Role $role = null;
public Collection $assigned;
diff --git a/nova/src/Roles/Livewire/ManageUsers.php b/nova/src/Roles/Livewire/ManageUsers.php
index 385e90c15..e99c5ecbb 100644
--- a/nova/src/Roles/Livewire/ManageUsers.php
+++ b/nova/src/Roles/Livewire/ManageUsers.php
@@ -7,6 +7,7 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Roles\Models\Role;
use Nova\Users\Models\User;
@@ -15,6 +16,7 @@ class ManageUsers extends Component
{
public string $search = '';
+ #[Locked]
public ?Role $role = null;
public Collection $assigned;
diff --git a/nova/src/Settings/Livewire/FontSelector.php b/nova/src/Settings/Livewire/FontSelector.php
index 704ae5dfb..8e7d91d1e 100644
--- a/nova/src/Settings/Livewire/FontSelector.php
+++ b/nova/src/Settings/Livewire/FontSelector.php
@@ -16,8 +16,12 @@ class FontSelector extends Component
public ?string $provider = null;
+ public ?string $providerInputName = null;
+
public ?string $family = null;
+ public ?string $familyInputName = null;
+
#[Computed]
public function localFonts(): array
{
@@ -34,12 +38,20 @@ public function localFonts(): array
#[Computed]
public function fontFamilyInputName(): ?string
{
+ if (filled($this->familyInputName)) {
+ return $this->familyInputName;
+ }
+
return sprintf('%s_fonts[%sFamily]', $this->section, $this->type);
}
#[Computed]
public function fontProviderInputName(): ?string
{
+ if (filled($this->providerInputName)) {
+ return $this->providerInputName;
+ }
+
return sprintf('%s_fonts[%sProvider]', $this->section, $this->type);
}
diff --git a/nova/src/Stories/Livewire/Concerns/HandlesCharacterAuthors.php b/nova/src/Stories/Livewire/Concerns/HandlesCharacterAuthors.php
index 45e27b7b3..80abb442c 100644
--- a/nova/src/Stories/Livewire/Concerns/HandlesCharacterAuthors.php
+++ b/nova/src/Stories/Livewire/Concerns/HandlesCharacterAuthors.php
@@ -23,6 +23,11 @@ public function mountHandlesCharacterAuthors()
$this->setCharacterPivotData();
}
+ public function hydrateHandlesCharacterAuthors()
+ {
+ $this->characters->loadMissing('activeUsers');
+ }
+
public function addCharacterAuthor(Character $character): void
{
$this->search = '';
diff --git a/nova/src/Stories/Livewire/ReadPostModal.php b/nova/src/Stories/Livewire/ReadPostModal.php
index 94bf70ab0..a21da6cf0 100644
--- a/nova/src/Stories/Livewire/ReadPostModal.php
+++ b/nova/src/Stories/Livewire/ReadPostModal.php
@@ -4,11 +4,13 @@
namespace Nova\Stories\Livewire;
+use Livewire\Attributes\Locked;
use LivewireUI\Modal\ModalComponent;
use Nova\Stories\Models\Post;
class ReadPostModal extends ModalComponent
{
+ #[Locked]
public Post $post;
/**
diff --git a/nova/src/Stories/Livewire/SelectPostPositionModal.php b/nova/src/Stories/Livewire/SelectPostPositionModal.php
index 773366bfd..fe1dc4958 100644
--- a/nova/src/Stories/Livewire/SelectPostPositionModal.php
+++ b/nova/src/Stories/Livewire/SelectPostPositionModal.php
@@ -5,12 +5,14 @@
namespace Nova\Stories\Livewire;
use Illuminate\Support\Collection;
+use Livewire\Attributes\Locked;
use LivewireUI\Modal\ModalComponent;
use Nova\Stories\Livewire\Steps\PublishPostStep;
use Nova\Stories\Models\Post;
class SelectPostPositionModal extends ModalComponent
{
+ #[Locked]
public int $story = 0;
public string $search = '';
@@ -70,9 +72,4 @@ public function render()
'posts' => $this->filteredPosts,
]);
}
-
- public static function modalMaxWidth(): string
- {
- return 'sm';
- }
}
diff --git a/nova/src/Stories/Livewire/Steps/SetupPostStep.php b/nova/src/Stories/Livewire/Steps/SetupPostStep.php
index ef357e22a..3abd960b7 100644
--- a/nova/src/Stories/Livewire/Steps/SetupPostStep.php
+++ b/nova/src/Stories/Livewire/Steps/SetupPostStep.php
@@ -7,6 +7,7 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Computed;
use Nova\Foundation\Filament\Notifications\Notification;
use Nova\Stories\Livewire\Concerns\HandlesCharacterAuthors;
@@ -193,7 +194,7 @@ public function availablePostTypes(): Collection
->withTrashed()
->where(function (Builder $query): Builder {
return $query->active()
- ->userHasAccess(auth()->user()->loadMissing('roles'))
+ ->userHasAccess(Auth::user()->loadMissing('roles'))
->orWhere('id', $this->postTypeId);
})
->ordered()
@@ -257,7 +258,8 @@ public function mount(): void
$this->updatedStoryId();
}
- $this->post = Post::firstOrNew(['id' => $this->postId])->loadMissing('characterAuthors', 'userAuthors');
+ $this->post = Post::firstOrNew(['id' => $this->postId])
+ ->loadMissing(['characterAuthors.activeUsers', 'userAuthors']);
$this->characters = $this->post?->characterAuthors ?? Collection::make();
$this->users = $this->post?->userAuthors ?? Collection::make();
diff --git a/nova/src/Stories/Livewire/StoriesTimeline.php b/nova/src/Stories/Livewire/StoriesTimeline.php
index ab5998656..e54af4a65 100644
--- a/nova/src/Stories/Livewire/StoriesTimeline.php
+++ b/nova/src/Stories/Livewire/StoriesTimeline.php
@@ -30,7 +30,6 @@ public function render()
{
return view('pages.stories.livewire.timeline', [
'stories' => $this->stories,
- 'storyClass' => Story::class,
]);
}
}
diff --git a/nova/src/Stories/Livewire/StoryPosition.php b/nova/src/Stories/Livewire/StoryPosition.php
index 3d39144ed..49cf2b3db 100644
--- a/nova/src/Stories/Livewire/StoryPosition.php
+++ b/nova/src/Stories/Livewire/StoryPosition.php
@@ -7,6 +7,7 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Stories\Models\Story;
@@ -22,6 +23,7 @@ class StoryPosition extends Component
public ?int $parentId = null;
+ #[Locked]
public ?Story $story = null;
public function updated($property): void
diff --git a/nova/src/Themes/Actions/CreateTheme.php b/nova/src/Themes/Actions/CreateTheme.php
index 64fc49b30..92a5fcb0e 100644
--- a/nova/src/Themes/Actions/CreateTheme.php
+++ b/nova/src/Themes/Actions/CreateTheme.php
@@ -14,6 +14,6 @@ class CreateTheme
public function handle(ThemeData $data): Theme
{
- return Theme::create($data->except('variants')->all());
+ return Theme::create($data->all());
}
}
diff --git a/nova/src/Themes/Actions/SetupThemeDirectory.php b/nova/src/Themes/Actions/SetupThemeDirectory.php
index ee61ddc29..34494b958 100644
--- a/nova/src/Themes/Actions/SetupThemeDirectory.php
+++ b/nova/src/Themes/Actions/SetupThemeDirectory.php
@@ -46,7 +46,7 @@ public function handle(ThemeData $data): void
$this->createThemeDesignDirectoryAndStylesheet();
- $this->createThemeVariants();
+ $this->createThemeLayout();
} catch (Throwable $th) {
throw $th;
}
@@ -68,11 +68,6 @@ public function asCommand(Command $command): void
}
}
- /**
- * Create the theme directory.
- *
- * @throws \Nova\Themes\Exceptions\ThemeException
- */
protected function createThemeDirectory(): void
{
$location = $this->getThemeLocation();
@@ -85,12 +80,7 @@ protected function createThemeDirectory(): void
$this->files->makeDirectory($location);
}
- /**
- * Create the theme.json file.
- *
- * @return void
- */
- protected function createThemeInstallFile()
+ protected function createThemeInstallFile(): void
{
$stub = file_get_contents(__DIR__.'/../stubs/theme.json.stub');
@@ -107,12 +97,7 @@ protected function createThemeInstallFile()
$this->files->put($this->getThemeLocation().'/theme.json', $stub);
}
- /**
- * Create the Theme.php file.
- *
- * @return void
- */
- protected function createThemeClass()
+ protected function createThemeClass(): void
{
$stub = file_get_contents(__DIR__.'/../stubs/theme.php.stub');
@@ -125,62 +110,44 @@ protected function createThemeClass()
$this->files->put($this->getThemeLocation().'/Theme.php', $stub);
}
- /**
- * Create the design directory and add the custom.css file to it.
- *
- * @return void
- */
- protected function createThemeDesignDirectoryAndStylesheet()
+ protected function createThemeDesignDirectoryAndStylesheet(): void
{
$this->files->makeDirectory($this->getThemeLocation().'/design');
- $this->createStylesheet('custom.css');
+ $this->createStylesheet('theme.css');
}
- /**
- * Create the variants directory and add the stylesheets.
- *
- * @return void
- */
- protected function createThemeVariants()
+ protected function createThemeLayout()
{
- if ($variants = $this->data->variants) {
- $this->files->makeDirectory($this->getThemeLocation().'/design/variants');
+ $this->files->makeDirectory($this->getThemeLocation().'/views/components/layouts');
- collect($variants)
- ->map(fn ($variant) => trim($variant))
- ->each(fn ($variant) => $this->createStylesheet("variants/{$variant}.css"));
- }
+ $stub = file_get_contents(__DIR__.'/../stubs/theme-layout.blade.php.stub');
+
+ $stub = str_replace(
+ ['DummyLocation'],
+ [$this->getThemeLocation()],
+ $stub
+ );
+
+ $this->files->put($this->getThemeLocation().'/views/components/layouts/theme.blade.php', $stub);
}
- /**
- * Create a new stylesheet.
- *
- * @param string $stylesheet
- * @return void
- */
- protected function createStylesheet($stylesheet)
+ protected function createStylesheet($stylesheet): void
{
- $stub = file_get_contents(__DIR__.'/../stubs/custom.css.stub');
+ $stub = file_get_contents(__DIR__.'/../stubs/theme.css.stub');
$this->files->put($this->getThemeLocation()."/design/{$stylesheet}", $stub);
}
- /**
- * Get the location of the theme.
- */
protected function getThemeLocation(): string
{
if ($location = $this->data->location) {
- return strtolower($location);
+ return $location;
}
- return strtolower($this->getThemeName());
+ return $this->getThemeName();
}
- /**
- * Get the name of the theme.
- */
protected function getThemeName(): string
{
return $this->data->name;
diff --git a/nova/src/Themes/Actions/UpdateTheme.php b/nova/src/Themes/Actions/UpdateTheme.php
index acd70c989..db6b2d074 100644
--- a/nova/src/Themes/Actions/UpdateTheme.php
+++ b/nova/src/Themes/Actions/UpdateTheme.php
@@ -15,7 +15,7 @@ class UpdateTheme
public function handle(Theme $theme, ThemeData $data): Theme
{
return tap($theme)
- ->update($data->all())
+ ->update($data->except('settings')->all())
->refresh();
}
}
diff --git a/nova/src/Themes/Controllers/ThemeController.php b/nova/src/Themes/Controllers/ThemeController.php
index c12ce519e..5eaccaf13 100644
--- a/nova/src/Themes/Controllers/ThemeController.php
+++ b/nova/src/Themes/Controllers/ThemeController.php
@@ -4,11 +4,9 @@
namespace Nova\Themes\Controllers;
-use Illuminate\Http\Request;
use Nova\Foundation\Controllers\Controller;
use Nova\Themes\Actions\CreateThemeManager;
use Nova\Themes\Actions\UpdateTheme;
-use Nova\Themes\Data\ThemeData;
use Nova\Themes\Models\Theme;
use Nova\Themes\Requests\StoreThemeRequest;
use Nova\Themes\Requests\UpdateThemeRequest;
@@ -28,13 +26,9 @@ public function __construct()
$this->authorizeResource(Theme::class);
}
- public function index(Request $request)
+ public function index()
{
- $themes = Theme::orderBy('name')->get();
-
- return ListThemesResponse::sendWith([
- 'themes' => ($request->has('pending')) ? $themes->onlyPending() : $themes->withPending(),
- ]);
+ return ListThemesResponse::send();
}
public function show(Theme $theme)
@@ -53,8 +47,7 @@ public function store(StoreThemeRequest $request)
{
$theme = CreateThemeManager::run($request);
- return redirect()
- ->route('admin.themes.index')
+ return to_route('admin.themes.index')
->notify("{$theme->name} theme was created", 'A folder has been created in the themes directory to help you get started creating your theme.');
}
@@ -67,10 +60,9 @@ public function edit(Theme $theme)
public function update(UpdateThemeRequest $request, Theme $theme)
{
- $theme = UpdateTheme::run($theme, ThemeData::from($request));
+ $theme = UpdateTheme::run($theme, $request->getThemeData());
- return redirect()
- ->route('admin.themes.edit', $theme)
+ return to_route('admin.themes.edit', $theme)
->notify("{$theme->name} theme was updated");
}
}
diff --git a/nova/src/Themes/Data/ThemeData.php b/nova/src/Themes/Data/ThemeData.php
index fafe1157d..28d0b4a29 100644
--- a/nova/src/Themes/Data/ThemeData.php
+++ b/nova/src/Themes/Data/ThemeData.php
@@ -4,7 +4,6 @@
namespace Nova\Themes\Data;
-use Illuminate\Http\Request;
use Nova\Themes\Enums\ThemeStatus;
use Spatie\LaravelData\Attributes\Validation\Enum;
use Spatie\LaravelData\Data;
@@ -23,30 +22,6 @@ public function __construct(
public string $preview,
- public ?array $variants,
+ public ?ThemeSettings $settings
) {}
-
- public static function fromArray(array $data): static
- {
- return new self(
- status: ThemeStatus::tryFrom(data_get($data, 'status', ThemeStatus::active->value)),
- credits: data_get($data, 'credits'),
- location: data_get($data, 'location'),
- name: data_get($data, 'name'),
- preview: data_get($data, 'preview', 'preview.jpg'),
- variants: explode(',', data_get($data, 'variants', ' ')),
- );
- }
-
- public static function fromRequest(Request $request): static
- {
- return new self(
- status: ThemeStatus::tryFrom($request->input('status', ThemeStatus::active->value)),
- credits: $request->input('credits'),
- location: $request->input('location'),
- name: $request->input('name'),
- preview: $request->input('preview', 'preview.jpg'),
- variants: $request->input('variants') !== null ? explode(',', $request->input('variants')) : null,
- );
- }
}
diff --git a/nova/src/Themes/Livewire/ThemeSettings.php b/nova/src/Themes/Livewire/ThemeSettings.php
index c5e7fb642..329eb54a8 100644
--- a/nova/src/Themes/Livewire/ThemeSettings.php
+++ b/nova/src/Themes/Livewire/ThemeSettings.php
@@ -22,6 +22,8 @@ class ThemeSettings extends Component implements HasForms
public ?Theme $theme = null;
+ public bool $iconTrigger = true;
+
public function form(Form $form): Form
{
return $form
diff --git a/nova/src/Themes/Livewire/ThemesList.php b/nova/src/Themes/Livewire/ThemesList.php
index b540065cd..cb7894737 100644
--- a/nova/src/Themes/Livewire/ThemesList.php
+++ b/nova/src/Themes/Livewire/ThemesList.php
@@ -6,12 +6,12 @@
use Filament\Forms\Components\CheckboxList;
use Filament\Tables\Actions\Action;
+use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
use Illuminate\Contracts\View\View;
-use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Nova\Foundation\Filament\Actions\ActionGroup;
use Nova\Foundation\Filament\Actions\CreateAction;
@@ -20,9 +20,11 @@
use Nova\Foundation\Filament\Actions\ViewAction;
use Nova\Foundation\Filament\Notifications\Notification;
use Nova\Foundation\Livewire\TableComponent;
+use Nova\Settings\Data\FontFamilies;
use Nova\Themes\Actions\CreateTheme;
use Nova\Themes\Actions\DeleteTheme;
use Nova\Themes\Data\ThemeData;
+use Nova\Themes\Data\ThemeSettings;
use Nova\Themes\Enums\ThemeStatus;
use Nova\Themes\Events\ThemeInstalled;
use Nova\Themes\Models\Theme;
@@ -33,50 +35,52 @@ public function table(Table $table): Table
{
return $table
->query(Theme::query())
- ->content(view('filament.tables.themes'))
->columns([
TextColumn::make('name')
->titleColumn()
->searchable(),
TextColumn::make('location')
->prefix('themes/')
- ->icon(iconName('folder'))
- ->searchable(),
+ ->searchable()
+ ->toggleable(),
+ IconColumn::make('is_current_public_theme')
+ ->label('Current theme')
+ ->icon(fn (bool $state): ?string => $state ? iconName('check') : null)
+ ->color(fn (bool $state): ?string => $state ? 'success' : null)
+ ->toggleable(),
TextColumn::make('status')
->badge()
- ->color(fn (Model $record): string => $record->status->color()),
+ ->color(fn (Theme $record): string => $record->status->color())
+ ->toggleable(),
])
->actions([
ActionGroup::make([
ActionGroup::make([
ViewAction::make()
->authorize('view')
- ->url(fn (Model $record): string => route('admin.themes.show', $record)),
+ ->url(fn (Theme $record): string => route('admin.themes.show', $record)),
EditAction::make()
->authorize('update')
- ->url(fn (Model $record): string => route('admin.themes.edit', $record)),
+ ->url(fn (Theme $record): string => route('admin.themes.edit', $record)),
])->authorizeAny(['view', 'update'])->divided(),
ActionGroup::make([
DeleteAction::make()
->modalContentView('pages.themes.delete')
- ->successNotificationTitle(fn (Model $record): string => $record->name.' theme was deleted')
- ->using(fn (Model $record): Model => DeleteTheme::run($record)),
+ ->successNotificationTitle(fn (Theme $record): string => $record->name.' theme was deleted')
+ ->using(fn (Theme $record): Theme => DeleteTheme::run($record)),
])->authorize('delete')->divided(),
]),
])
->filters([
SelectFilter::make('status')->options(ThemeStatus::class),
])
- ->heading('Themes')
- ->description('Personalize your public-facing site with a custom theme')
->headerActions([
Action::make('install')
->authorize('create')
->label('Themes available to install')
- ->link()
->icon(iconName('sparkles'))
- ->iconSize('md')
+ ->color('gray')
->visible(fn (): bool => Theme::hasInstallableThemes())
->modalWidth('xl')
->modalIcon(null)
@@ -87,7 +91,7 @@ public function table(Table $table): Table
->form([
CheckboxList::make('themes')
->options(Theme::getInstallableThemes()->flatMap(fn ($theme): array => [$theme => $theme]))
- ->label("Select the pending themes you'd like to install:"),
+ ->label('Select the pending themes you’d like to install:'),
])
->action(function (array $data): void {
$themes = data_get($data, 'themes', []);
@@ -99,7 +103,22 @@ public function table(Table $table): Table
try {
$data = json_decode(Storage::disk('themes')->get("{$theme}/theme.json"), true);
- $theme = CreateTheme::run(ThemeData::from($data));
+ $theme = CreateTheme::run(new ThemeData(
+ name: data_get($data, 'name'),
+ location: data_get($data, 'location'),
+ credits: data_get($data, 'credits'),
+ status: ThemeStatus::active,
+ preview: data_get($data, 'preview'),
+ settings: new ThemeSettings(
+ fonts: new FontFamilies(
+ headerProvider: 'local',
+ headerFamily: 'Geist',
+ bodyProvider: 'local',
+ bodyFamily: 'Inter',
+ ),
+ settings: []
+ )
+ ));
ThemeInstalled::dispatch($theme);
@@ -133,10 +152,6 @@ public function table(Table $table): Table
$notification->send();
}),
- CreateAction::make()
- ->authorize('create')
- ->label('Add')
- ->url(route('admin.themes.create')),
])
->emptyStateIcon(iconName('paint-brush'))
->emptyStateHeading('No theme found')
diff --git a/nova/src/Themes/Models/Theme.php b/nova/src/Themes/Models/Theme.php
index fcfbacfc7..aa1f2e494 100644
--- a/nova/src/Themes/Models/Theme.php
+++ b/nova/src/Themes/Models/Theme.php
@@ -4,6 +4,7 @@
namespace Nova\Themes\Models;
+use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
@@ -39,6 +40,13 @@ class Theme extends Model
'updated' => Events\ThemeUpdated::class,
];
+ public function isCurrentPublicTheme(): Attribute
+ {
+ return Attribute::make(
+ get: fn (): bool => settings('appearance.theme') === $this->location
+ );
+ }
+
public function themeClass(): BaseTheme
{
$themeClass = 'Themes\\'.$this->location.'\\Theme';
diff --git a/nova/src/Themes/Policies/ThemePolicy.php b/nova/src/Themes/Policies/ThemePolicy.php
index d2fc47b4d..9ae456904 100644
--- a/nova/src/Themes/Policies/ThemePolicy.php
+++ b/nova/src/Themes/Policies/ThemePolicy.php
@@ -43,7 +43,7 @@ public function update(User $user): Response
public function delete(User $user, Theme $theme): Response
{
- return $user->isAbleTo('theme.delete') && Theme::count() > 1
+ return $user->isAbleTo('theme.delete') && Theme::count() > 1 && settings('appearance.theme') !== $theme->location
? $this->allow()
: $this->deny();
}
diff --git a/nova/src/Themes/Requests/StoreThemeRequest.php b/nova/src/Themes/Requests/StoreThemeRequest.php
index d18994716..0315e8823 100644
--- a/nova/src/Themes/Requests/StoreThemeRequest.php
+++ b/nova/src/Themes/Requests/StoreThemeRequest.php
@@ -16,7 +16,7 @@ public function rules(): array
'credits' => ['nullable'],
'location' => ['required', 'unique:themes,location'],
'name' => ['required'],
- 'variants' => ['nullable'],
+ 'settings' => ['nullable'],
];
}
diff --git a/nova/src/Themes/Requests/UpdateThemeRequest.php b/nova/src/Themes/Requests/UpdateThemeRequest.php
index 45ac52a8a..248c263d2 100644
--- a/nova/src/Themes/Requests/UpdateThemeRequest.php
+++ b/nova/src/Themes/Requests/UpdateThemeRequest.php
@@ -4,4 +4,12 @@
namespace Nova\Themes\Requests;
-class UpdateThemeRequest extends StoreThemeRequest {}
+class UpdateThemeRequest extends StoreThemeRequest
+{
+ public function rules(): array
+ {
+ return array_merge(parent::rules(), [
+ 'location' => ['required'],
+ ]);
+ }
+}
diff --git a/nova/src/Themes/stubs/theme-layout.blade.php.stub b/nova/src/Themes/stubs/theme-layout.blade.php.stub
new file mode 100644
index 000000000..3f405aa39
--- /dev/null
+++ b/nova/src/Themes/stubs/theme-layout.blade.php.stub
@@ -0,0 +1,39 @@
+@push('styles')
+
+
+@endpush
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nova/src/Themes/stubs/custom.css.stub b/nova/src/Themes/stubs/theme.css.stub
similarity index 100%
rename from nova/src/Themes/stubs/custom.css.stub
rename to nova/src/Themes/stubs/theme.css.stub
diff --git a/nova/src/Themes/stubs/theme.php.stub b/nova/src/Themes/stubs/theme.php.stub
index 183349521..629445a17 100644
--- a/nova/src/Themes/stubs/theme.php.stub
+++ b/nova/src/Themes/stubs/theme.php.stub
@@ -2,9 +2,18 @@
namespace Themes\DummyNamespace;
+use Filament\Forms\Components\ColorPicker;
use Nova\Themes\BaseTheme;
class Theme extends BaseTheme
{
public $location = 'DummyLocation';
+
+ public function settingsForm(): array
+ {
+ return [
+ ColorPicker::make('accentColor'),
+ ColorPicker::make('textAccentColor'),
+ ];
+ }
}
\ No newline at end of file
diff --git a/nova/src/Users/Livewire/ActivateUserButton.php b/nova/src/Users/Livewire/ActivateUserButton.php
index ca8346feb..ee727a1cc 100644
--- a/nova/src/Users/Livewire/ActivateUserButton.php
+++ b/nova/src/Users/Livewire/ActivateUserButton.php
@@ -4,6 +4,7 @@
namespace Nova\Users\Livewire;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Users\Actions\ActivateUser;
use Nova\Users\Events\UserActivated;
@@ -11,6 +12,7 @@
class ActivateUserButton extends Component
{
+ #[Locked]
public User $user;
public function activate(): void
diff --git a/nova/src/Users/Livewire/DeactivateUserButton.php b/nova/src/Users/Livewire/DeactivateUserButton.php
index 2142aba02..75db4b8cf 100644
--- a/nova/src/Users/Livewire/DeactivateUserButton.php
+++ b/nova/src/Users/Livewire/DeactivateUserButton.php
@@ -4,6 +4,7 @@
namespace Nova\Users\Livewire;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Users\Actions\DeactivateUser;
use Nova\Users\Events\UserDeactivated;
@@ -11,6 +12,7 @@
class DeactivateUserButton extends Component
{
+ #[Locked]
public User $user;
public function deactivate(): void
diff --git a/nova/src/Users/Livewire/ForcePasswordResetButton.php b/nova/src/Users/Livewire/ForcePasswordResetButton.php
index dd382ed11..956807143 100644
--- a/nova/src/Users/Livewire/ForcePasswordResetButton.php
+++ b/nova/src/Users/Livewire/ForcePasswordResetButton.php
@@ -4,12 +4,14 @@
namespace Nova\Users\Livewire;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Users\Actions\ForcePasswordReset;
use Nova\Users\Models\User;
class ForcePasswordResetButton extends Component
{
+ #[Locked]
public User $user;
public function forcePasswordReset(): void
diff --git a/nova/src/Users/Livewire/ManageCharacters.php b/nova/src/Users/Livewire/ManageCharacters.php
index f94e3eb4d..cabc5a755 100644
--- a/nova/src/Users/Livewire/ManageCharacters.php
+++ b/nova/src/Users/Livewire/ManageCharacters.php
@@ -7,6 +7,7 @@
use Illuminate\Contracts\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Characters\Models\Character;
use Nova\Users\Models\User;
@@ -15,6 +16,7 @@ class ManageCharacters extends Component
{
public string $search = '';
+ #[Locked]
public ?User $user = null;
public Collection $assigned;
diff --git a/nova/src/Users/Livewire/ManageRoles.php b/nova/src/Users/Livewire/ManageRoles.php
index 0ebcf3a05..79baa8c01 100644
--- a/nova/src/Users/Livewire/ManageRoles.php
+++ b/nova/src/Users/Livewire/ManageRoles.php
@@ -7,6 +7,7 @@
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Component;
use Nova\Roles\Models\Role;
use Nova\Users\Models\User;
@@ -15,6 +16,7 @@ class ManageRoles extends Component
{
public string $search = '';
+ #[Locked]
public ?User $user = null;
public Collection $assigned;
diff --git a/package-lock.json b/package-lock.json
index bad08d916..6801c9d63 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -97,9 +97,9 @@
"integrity": "sha512-JmRiWPtdQOgqJxVXtPRu8yqrm4mUYKCuyH+ssoQ6HRNBcqzjgQhLRJfqmXDuQqeuQNTh4/1r9yUgBozqn2wpDw=="
},
"node_modules/@babel/runtime": {
- "version": "7.25.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz",
- "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==",
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1103,9 +1103,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.7.4",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz",
- "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==",
+ "version": "22.7.5",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
+ "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2090,9 +2090,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001664",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz",
- "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==",
+ "version": "1.0.30001668",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
+ "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==",
"dev": true,
"funding": [
{
@@ -3085,9 +3085,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.30",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.30.tgz",
- "integrity": "sha512-sXI35EBN4lYxzc/pIGorlymYNzDBOqkSlVRe6MkgBsW/hW1tpC/HDJ2fjG7XnjakzfLEuvdmux0Mjs6jHq4UOA==",
+ "version": "1.5.36",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz",
+ "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==",
"dev": true,
"license": "ISC"
},
@@ -3687,6 +3687,7 @@
"version": "8.57.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
"integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3884,9 +3885,9 @@
}
},
"node_modules/eslint-plugin-import": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz",
- "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==",
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3898,7 +3899,7 @@
"debug": "^3.2.7",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.9.0",
+ "eslint-module-utils": "^2.12.0",
"hasown": "^2.0.2",
"is-core-module": "^2.15.1",
"is-glob": "^4.0.3",
@@ -3907,13 +3908,14 @@
"object.groupby": "^1.0.3",
"object.values": "^1.2.0",
"semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
"tsconfig-paths": "^3.15.0"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
}
},
"node_modules/eslint-plugin-import/node_modules/debug": {
@@ -4395,9 +4397,9 @@
}
},
"node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
@@ -7277,9 +7279,9 @@
"license": "MIT"
},
"node_modules/preact": {
- "version": "10.24.1",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.1.tgz",
- "integrity": "sha512-PnBAwFI3Yjxxcxw75n6VId/5TFxNW/81zexzWD9jn1+eSrOP84NdsS38H5IkF/UH3frqRPT+MvuCoVHjTDTnDw==",
+ "version": "10.24.2",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.2.tgz",
+ "integrity": "sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==",
"license": "MIT",
"funding": {
"type": "opencollective",
@@ -7478,14 +7480,14 @@
}
},
"node_modules/prosemirror-commands": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.0.tgz",
- "integrity": "sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.1.tgz",
+ "integrity": "sha512-tNy4uaGWzvuUYXDke7B28krndIrdQJhSh0OLpubtwtEwFbjItOj/eoAfPvstBJyyV0S2+b5t4G+4XPXdxar6pg==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.0.0",
"prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.0.0"
+ "prosemirror-transform": "^1.10.2"
}
},
"node_modules/prosemirror-dropcursor": {
@@ -7567,9 +7569,9 @@
}
},
"node_modules/prosemirror-model": {
- "version": "1.22.3",
- "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.22.3.tgz",
- "integrity": "sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==",
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.23.0.tgz",
+ "integrity": "sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==",
"license": "MIT",
"dependencies": {
"orderedmap": "^2.0.0"
@@ -7635,9 +7637,9 @@
}
},
"node_modules/prosemirror-transform": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.0.tgz",
- "integrity": "sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==",
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz",
+ "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==",
"license": "MIT",
"dependencies": {
"prosemirror-model": "^1.21.0"
@@ -7829,16 +7831,16 @@
"license": "MIT"
},
"node_modules/regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bind": "^1.0.7",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"