From 6da69f7cffdcbb86288fa53934ab6f7fda94e74e Mon Sep 17 00:00:00 2001 From: TheSkybreaker Date: Thu, 31 Jul 2025 15:00:40 +0200 Subject: [PATCH 001/154] Dynamically disable JS inputs for v.3 --- .../forms/resources/views/components/file-upload.blade.php | 5 +++++ .../forms/resources/views/components/key-value.blade.php | 7 ++++++- .../forms/resources/views/components/rich-editor.blade.php | 5 +++++ packages/forms/resources/views/components/select.blade.php | 5 +++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/forms/resources/views/components/file-upload.blade.php b/packages/forms/resources/views/components/file-upload.blade.php index 545714d350..bf522580e2 100644 --- a/packages/forms/resources/views/components/file-upload.blade.php +++ b/packages/forms/resources/views/components/file-upload.blade.php @@ -104,6 +104,11 @@ }, })" wire:ignore + wire:key="{{ $this->getId() }}.{{ $statePath }}.{{ $field::class }}.{{ + substr(md5(serialize([ + $isDisabled, + ])), 0, 64) + }}" {{ $attributes ->merge([ diff --git a/packages/forms/resources/views/components/key-value.blade.php b/packages/forms/resources/views/components/key-value.blade.php index 1d2b0f05dc..03470b6eec 100644 --- a/packages/forms/resources/views/components/key-value.blade.php +++ b/packages/forms/resources/views/components/key-value.blade.php @@ -39,7 +39,6 @@ x-load @endif x-load-src="{{ \Filament\Support\Facades\FilamentAsset::getAlpineComponentSrc('key-value', 'filament/forms') }}" - wire:ignore x-data="keyValueFormComponent({ state: $wire.{{ $applyStateBindingModifiers("\$entangle('{$statePath}')") }}, })" @@ -48,6 +47,12 @@ ->merge($getExtraAlpineAttributes(), escape: false) ->class(['divide-y divide-gray-200 dark:divide-white/10']) }} + wire:ignore + wire:key="{{ $this->getId() }}.{{ $statePath }}.{{ $field::class }}.{{ + substr(md5(serialize([ + $isDisabled, + ])), 0, 64) + }}" > Date: Tue, 12 Aug 2025 18:00:45 +0200 Subject: [PATCH 002/154] Add a command that checks plugins compatibility with v4 --- .../CheckPluginsCompatibilityWithV4.php | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php new file mode 100644 index 0000000000..fef82a057c --- /dev/null +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -0,0 +1,206 @@ +error('composer.json not found.'); + return 1; + } + + $composer = json_decode(file_get_contents($composerPath), true); + $dependencies = $composer['require'] ?? []; + + $allPackages = collect($dependencies)->keys(); + + // Filter packages to only those that require filament/filament + $filamentPlugins = $allPackages->filter(function ($package) { + return $this->packageRequiresFilament($package); + }); + + $this->info("Found " . $filamentPlugins->count() . " packages that require filament/filament"); + + $results = []; + + foreach ($filamentPlugins as $package) { + $compatibility = $this->checkFilamentV4Compatibility($package); + $versionDisplay = '–'; + + if ($compatibility !== null) { + $versionDisplay = $compatibility['version']; + if ($compatibility['isPrerelease']) { + $versionDisplay .= ' (prerelease)'; + } + } + + $results[] = [ + 'package' => $package, + 'installed' => $dependencies[$package], + 'compatible' => $compatibility ? '✅' : '❌', + 'latest_v4_version' => $versionDisplay, + ]; + } + + // Display result in a formatted table + $this->table( + ['Package', 'Installed Version', 'Compatible with v4?', 'Latest Compatible v4 Version'], + $results + ); + + return 0; + } + + /** + * Checks on Packagist whether the given package has any version compatible with Filament v4. + * + * @param string $package The full package name (e.g. vendor/package) + * @return array|null Array with version string and isPrerelease flag, or null if not found + */ + protected function checkFilamentV4Compatibility(string $package): ?array + { + // First check regular releases + $url = "https://repo.packagist.org/p2/{$package}.json"; + $compatibleVersion = $this->checkPackageCompatibility($package, $url); + + if ($compatibleVersion !== null) { + return [ + 'version' => $compatibleVersion, + 'isPrerelease' => false + ]; + } + + // If no compatible version found, check dev versions + $devUrl = "https://repo.packagist.org/p2/{$package}~dev.json"; + $compatibleVersion = $this->checkPackageCompatibility($package, $devUrl); + + if ($compatibleVersion !== null) { + return [ + 'version' => $compatibleVersion, + 'isPrerelease' => true + ]; + } + + return null; + } + + /** + * Checks a specific package URL for Filament v4 compatibility + * + * @param string $package The full package name + * @param string $url The Packagist API URL to check + * @return string|null The compatible version string or null if not found + */ + protected function checkPackageCompatibility(string $package, string $url): ?string + { + try { + $response = Http::get($url); + + if (!$response->ok()) { + return null; + } + + $data = $response->json(); + $versions = $data['packages'][$package] ?? []; + + foreach ($versions as $version) { + $requires = $version['require'] ?? []; + + if (isset($requires['filament/filament'])) { + $constraint = $requires['filament/filament']; + + // Match common constraint patterns for v4 + if (preg_match('/\^4\.|~4\.|>=4\./', $constraint)) { + return $version['version']; + } + } + } + + } catch (\Exception $e) { + $this->error("Error checking {$package} at {$url}: " . $e->getMessage()); + } + + return null; + } + + /** + * Checks if a package requires filament/filament + * + * @param string $package The full package name + * @return bool True if the package requires filament/filament + */ + protected function packageRequiresFilament(string $package): bool + { + // Skip filament/filament itself + if ($package === 'filament/filament') { + return true; + } + + // Skip filament/* packages as they're part of the Filament ecosystem + if (str_starts_with($package, 'filament/')) { + return true; + } + + try { + // Check regular releases + $url = "https://repo.packagist.org/p2/{$package}.json"; + $response = Http::get($url); + + if ($response->ok()) { + $data = $response->json(); + $versions = $data['packages'][$package] ?? []; + + // Check all versions, not just the latest + foreach ($versions as $version) { + $requires = $version['require'] ?? []; + + if (isset($requires['filament/filament'])) { + return true; + } + } + } + + // If not found in regular releases, check dev versions + $devUrl = "https://repo.packagist.org/p2/{$package}~dev.json"; + $devResponse = Http::get($devUrl); + + if ($devResponse->ok()) { + $devData = $devResponse->json(); + $devVersions = $devData['packages'][$package] ?? []; + + foreach ($devVersions as $version) { + $requires = $version['require'] ?? []; + + if (isset($requires['filament/filament'])) { + return true; + } + } + } + } catch (\Exception $e) { + $this->error("Error checking if {$package} requires filament/filament: " . $e->getMessage()); + } + + return false; + } +} From f631ae7a50d401a36206bdf20fb3e4ee58c295cd Mon Sep 17 00:00:00 2001 From: Charlie Etienne Date: Tue, 12 Aug 2025 18:03:18 +0200 Subject: [PATCH 003/154] Fix class name --- .../upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index fef82a057c..91dda18c38 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -6,7 +6,7 @@ use Illuminate\Console\Command; use Illuminate\Support\Facades\Http; #[AsCommand(name: 'filament:check-plugins-compatibility-with-v4')] -class CheckFilamentCompat extends Command +class CheckPluginsCompatibilityWithV4 extends Command { /** * The name and signature of the console command. From 5a1d38768df77d33ce1e2d8581d9eca6e1d36b96 Mon Sep 17 00:00:00 2001 From: CharlieEtienne Date: Tue, 12 Aug 2025 16:13:52 +0000 Subject: [PATCH 004/154] chore: fix code style --- .../CheckPluginsCompatibilityWithV4.php | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index 91dda18c38..e94d0fa960 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -2,6 +2,7 @@ namespace Filament\Upgrade\Commands; +use Exception; use Illuminate\Console\Command; use Illuminate\Support\Facades\Http; @@ -25,8 +26,9 @@ class CheckPluginsCompatibilityWithV4 extends Command { $composerPath = base_path('composer.json'); - if (!file_exists($composerPath)) { + if (! file_exists($composerPath)) { $this->error('composer.json not found.'); + return 1; } @@ -40,7 +42,7 @@ class CheckPluginsCompatibilityWithV4 extends Command return $this->packageRequiresFilament($package); }); - $this->info("Found " . $filamentPlugins->count() . " packages that require filament/filament"); + $this->info('Found ' . $filamentPlugins->count() . ' packages that require filament/filament'); $results = []; @@ -75,7 +77,7 @@ class CheckPluginsCompatibilityWithV4 extends Command /** * Checks on Packagist whether the given package has any version compatible with Filament v4. * - * @param string $package The full package name (e.g. vendor/package) + * @param string $package The full package name (e.g. vendor/package) * @return array|null Array with version string and isPrerelease flag, or null if not found */ protected function checkFilamentV4Compatibility(string $package): ?array @@ -87,7 +89,7 @@ class CheckPluginsCompatibilityWithV4 extends Command if ($compatibleVersion !== null) { return [ 'version' => $compatibleVersion, - 'isPrerelease' => false + 'isPrerelease' => false, ]; } @@ -98,7 +100,7 @@ class CheckPluginsCompatibilityWithV4 extends Command if ($compatibleVersion !== null) { return [ 'version' => $compatibleVersion, - 'isPrerelease' => true + 'isPrerelease' => true, ]; } @@ -107,9 +109,9 @@ class CheckPluginsCompatibilityWithV4 extends Command /** * Checks a specific package URL for Filament v4 compatibility - * - * @param string $package The full package name - * @param string $url The Packagist API URL to check + * + * @param string $package The full package name + * @param string $url The Packagist API URL to check * @return string|null The compatible version string or null if not found */ protected function checkPackageCompatibility(string $package, string $url): ?string @@ -117,7 +119,7 @@ class CheckPluginsCompatibilityWithV4 extends Command try { $response = Http::get($url); - if (!$response->ok()) { + if (! $response->ok()) { return null; } @@ -137,7 +139,7 @@ class CheckPluginsCompatibilityWithV4 extends Command } } - } catch (\Exception $e) { + } catch (Exception $e) { $this->error("Error checking {$package} at {$url}: " . $e->getMessage()); } @@ -147,7 +149,7 @@ class CheckPluginsCompatibilityWithV4 extends Command /** * Checks if a package requires filament/filament * - * @param string $package The full package name + * @param string $package The full package name * @return bool True if the package requires filament/filament */ protected function packageRequiresFilament(string $package): bool @@ -197,7 +199,7 @@ class CheckPluginsCompatibilityWithV4 extends Command } } } - } catch (\Exception $e) { + } catch (Exception $e) { $this->error("Error checking if {$package} requires filament/filament: " . $e->getMessage()); } From c7eee71fad2bb455d0abf07753dec81a5bbe5a3b Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Tue, 12 Aug 2025 22:33:38 +0200 Subject: [PATCH 005/154] Fix missing import --- .../upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index e94d0fa960..a74ec05b10 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -5,6 +5,7 @@ namespace Filament\Upgrade\Commands; use Exception; use Illuminate\Console\Command; use Illuminate\Support\Facades\Http; +use Symfony\Component\Console\Attribute\AsCommand; #[AsCommand(name: 'filament:check-plugins-compatibility-with-v4')] class CheckPluginsCompatibilityWithV4 extends Command From 7fbac9d8f6988bb407681c8000a1e133c91d6bbf Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Tue, 12 Aug 2025 23:12:51 +0200 Subject: [PATCH 006/154] Refactor package compatibility check to use local composer.json instead of HTTP requests as suggested by Saade --- .../CheckPluginsCompatibilityWithV4.php | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index a74ec05b10..f85f265bec 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -148,7 +148,7 @@ class CheckPluginsCompatibilityWithV4 extends Command } /** - * Checks if a package requires filament/filament + * Checks if a package requires filament/filament by reading its local composer.json * * @param string $package The full package name * @return bool True if the package requires filament/filament @@ -166,40 +166,24 @@ class CheckPluginsCompatibilityWithV4 extends Command } try { - // Check regular releases - $url = "https://repo.packagist.org/p2/{$package}.json"; - $response = Http::get($url); + // Read the local composer.json file from vendor directory + $composerPath = base_path("vendor/{$package}/composer.json"); - if ($response->ok()) { - $data = $response->json(); - $versions = $data['packages'][$package] ?? []; - - // Check all versions, not just the latest - foreach ($versions as $version) { - $requires = $version['require'] ?? []; - - if (isset($requires['filament/filament'])) { - return true; - } - } + if (! file_exists($composerPath)) { + return false; } - // If not found in regular releases, check dev versions - $devUrl = "https://repo.packagist.org/p2/{$package}~dev.json"; - $devResponse = Http::get($devUrl); + $composerContent = file_get_contents($composerPath); + $composer = json_decode($composerContent, true); - if ($devResponse->ok()) { - $devData = $devResponse->json(); - $devVersions = $devData['packages'][$package] ?? []; - - foreach ($devVersions as $version) { - $requires = $version['require'] ?? []; - - if (isset($requires['filament/filament'])) { - return true; - } - } + if (! $composer || ! is_array($composer)) { + return false; } + + // Check if the package requires filament/filament + $requires = $composer['require'] ?? []; + return isset($requires['filament/filament']); + } catch (Exception $e) { $this->error("Error checking if {$package} requires filament/filament: " . $e->getMessage()); } From 4bb1c983de8f85d81a8d559b270c5995f496be04 Mon Sep 17 00:00:00 2001 From: CharlieEtienne Date: Tue, 12 Aug 2025 21:23:34 +0000 Subject: [PATCH 007/154] chore: fix code style --- .../upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index f85f265bec..17b0eea9ba 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -182,6 +182,7 @@ class CheckPluginsCompatibilityWithV4 extends Command // Check if the package requires filament/filament $requires = $composer['require'] ?? []; + return isset($requires['filament/filament']); } catch (Exception $e) { From eb7412d1d50e5e07c36a2b7f7e724f133d11f345 Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Wed, 13 Aug 2025 00:37:32 +0200 Subject: [PATCH 008/154] Add CheckPluginsCompatibilityWithV4 command to UpgradeServiceProvider --- packages/upgrade/src/UpgradeServiceProvider.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/upgrade/src/UpgradeServiceProvider.php b/packages/upgrade/src/UpgradeServiceProvider.php index 126fcb9066..2fbad0abd7 100644 --- a/packages/upgrade/src/UpgradeServiceProvider.php +++ b/packages/upgrade/src/UpgradeServiceProvider.php @@ -2,6 +2,7 @@ namespace Filament\Upgrade; +use Filament\Upgrade\Commands\CheckPluginsCompatibilityWithV4; use Filament\Upgrade\Commands\UpgradeDirectoryStructureToV4Command; use Illuminate\Support\ServiceProvider; @@ -11,6 +12,7 @@ class UpgradeServiceProvider extends ServiceProvider { $this->commands([ UpgradeDirectoryStructureToV4Command::class, + CheckPluginsCompatibilityWithV4::class, ]); } } From 13b4ee55545ff26e3c7fb305e510735795237b3d Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Wed, 13 Aug 2025 00:40:53 +0200 Subject: [PATCH 009/154] properly exclude filament itself --- .../upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index 17b0eea9ba..fe8568ad22 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -157,7 +157,7 @@ class CheckPluginsCompatibilityWithV4 extends Command { // Skip filament/filament itself if ($package === 'filament/filament') { - return true; + return false; } // Skip filament/* packages as they're part of the Filament ecosystem From 4aa58f427698a3b2d81164e04ce6eb2ad6db0f37 Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Wed, 13 Aug 2025 02:18:24 +0200 Subject: [PATCH 010/154] fix plugin compatibility check to not skip Filament packages --- .../upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index fe8568ad22..cdbc5ddd10 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -162,7 +162,7 @@ class CheckPluginsCompatibilityWithV4 extends Command // Skip filament/* packages as they're part of the Filament ecosystem if (str_starts_with($package, 'filament/')) { - return true; + return false; } try { From 1aa070810ca960ef9e3035878a42c996ad3e3615 Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Wed, 13 Aug 2025 02:41:41 +0200 Subject: [PATCH 011/154] Update upgrade script --- packages/upgrade/bin/filament-v4 | 2 + .../check-plugins-compatibility-with-v4.php | 142 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 packages/upgrade/src/check-plugins-compatibility-with-v4.php diff --git a/packages/upgrade/bin/filament-v4 b/packages/upgrade/bin/filament-v4 index c7208c4e34..4c22ba8ff0 100755 --- a/packages/upgrade/bin/filament-v4 +++ b/packages/upgrade/bin/filament-v4 @@ -53,6 +53,8 @@ render(<< HTML); +include __DIR__ . '/../src/check-plugins-compatibility-with-v4.php'; + $rectorScriptPath = implode(DIRECTORY_SEPARATOR, ['vendor', 'bin', 'rector']); foreach (explode(',', $directories) as $directory) { diff --git a/packages/upgrade/src/check-plugins-compatibility-with-v4.php b/packages/upgrade/src/check-plugins-compatibility-with-v4.php new file mode 100644 index 0000000000..c951e77e08 --- /dev/null +++ b/packages/upgrade/src/check-plugins-compatibility-with-v4.php @@ -0,0 +1,142 @@ +Error checking if {$package} requires filament/filament: " . $e->getMessage() . ""); + } + + return false; +}); +render("
📦 Checking plugin compatibility with v4...
"); +render("
Found " . count($filamentPlugins) . " packages that require filament/filament
"); + +// Collect incompatible plugins +$incompatiblePlugins = []; +foreach ($filamentPlugins as $pkg) { + $version = $deps[$pkg]; + $compatibility = null; + + // First check regular releases + $url = "https://repo.packagist.org/p2/{$pkg}.json"; + try { + $json = @file_get_contents($url); + if ($json) { + $data = json_decode($json, true); + $versions = $data["packages"][$pkg] ?? []; + + foreach ($versions as $v) { + $requires = $v["require"] ?? []; + + if (isset($requires["filament/filament"])) { + $constraint = $requires["filament/filament"]; + + // Match common constraint patterns for v4 + if (preg_match("/\^4\.|~4\.|>=4\./", $constraint)) { + $compatibility = [ + "version" => $v["version"], + "isPrerelease" => false + ]; + break; + } + } + } + } + + // If no compatible version found, check dev versions + if ($compatibility === null) { + $devUrl = "https://repo.packagist.org/p2/{$pkg}~dev.json"; + $devJson = @file_get_contents($devUrl); + + if ($devJson) { + $devData = json_decode($devJson, true); + $devVersions = $devData["packages"][$pkg] ?? []; + + foreach ($devVersions as $v) { + $requires = $v["require"] ?? []; + + if (isset($requires["filament/filament"])) { + $constraint = $requires["filament/filament"]; + + // Match common constraint patterns for v4 + if (preg_match("/\^4\.|~4\.|>=4\./", $constraint)) { + $compatibility = [ + "version" => $v["version"], + "isPrerelease" => true + ]; + break; + } + } + } + } + } + + // Only collect incompatible plugins + if ($compatibility === null) { + $incompatiblePlugins[] = $pkg; + } + } catch (Exception $e) { + // Treat errors as incompatible + $incompatiblePlugins[] = $pkg; + } +} + +// Check if there are any incompatible plugins +if (!empty($incompatiblePlugins)) { + $pluginList = implode(', ', $incompatiblePlugins); + render("
❌  Incompatible plugins found!
"); + render("
The following plugins are incompatible with Filament v4 and need to be removed before upgrading:
"); + render("
{$pluginList}
"); + render(<< +

Some plugins you’re using are not available in v4 just yet.

+

You could temporarily remove them from your composer.json file until they’ve been upgraded, + replace them with a similar plugin that is v4-compatible, + wait for the plugins to be upgraded before upgrading your app, + or even write PRs to help the authors upgrade them.

+ + HTML); + render(<< + Upgrade aborted + + HTML); + exit(1); +} + +render("
✅  All plugins are compatible with Filament v4!
"); From 3043d96ebfc00d8f757d29c6c7e8bea07a5923a8 Mon Sep 17 00:00:00 2001 From: CharlieEtienne Date: Wed, 13 Aug 2025 00:53:56 +0000 Subject: [PATCH 012/154] chore: fix code style --- .../check-plugins-compatibility-with-v4.php | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/packages/upgrade/src/check-plugins-compatibility-with-v4.php b/packages/upgrade/src/check-plugins-compatibility-with-v4.php index c951e77e08..c94c0fad7a 100644 --- a/packages/upgrade/src/check-plugins-compatibility-with-v4.php +++ b/packages/upgrade/src/check-plugins-compatibility-with-v4.php @@ -1,19 +1,19 @@ Error checking if {$package} requires filament/filament: " . $e->getMessage() . ""); + render("
Error checking if {$package} requires filament/filament: " . $e->getMessage() . '
'); } return false; }); render("
📦 Checking plugin compatibility with v4...
"); -render("
Found " . count($filamentPlugins) . " packages that require filament/filament
"); +render("
Found " . count($filamentPlugins) . ' packages that require filament/filament
'); // Collect incompatible plugins $incompatiblePlugins = []; @@ -54,24 +54,26 @@ foreach ($filamentPlugins as $pkg) { // First check regular releases $url = "https://repo.packagist.org/p2/{$pkg}.json"; + try { $json = @file_get_contents($url); if ($json) { $data = json_decode($json, true); - $versions = $data["packages"][$pkg] ?? []; + $versions = $data['packages'][$pkg] ?? []; foreach ($versions as $v) { - $requires = $v["require"] ?? []; + $requires = $v['require'] ?? []; - if (isset($requires["filament/filament"])) { - $constraint = $requires["filament/filament"]; + if (isset($requires['filament/filament'])) { + $constraint = $requires['filament/filament']; // Match common constraint patterns for v4 if (preg_match("/\^4\.|~4\.|>=4\./", $constraint)) { $compatibility = [ - "version" => $v["version"], - "isPrerelease" => false + 'version' => $v['version'], + 'isPrerelease' => false, ]; + break; } } @@ -85,20 +87,21 @@ foreach ($filamentPlugins as $pkg) { if ($devJson) { $devData = json_decode($devJson, true); - $devVersions = $devData["packages"][$pkg] ?? []; + $devVersions = $devData['packages'][$pkg] ?? []; foreach ($devVersions as $v) { - $requires = $v["require"] ?? []; + $requires = $v['require'] ?? []; - if (isset($requires["filament/filament"])) { - $constraint = $requires["filament/filament"]; + if (isset($requires['filament/filament'])) { + $constraint = $requires['filament/filament']; // Match common constraint patterns for v4 if (preg_match("/\^4\.|~4\.|>=4\./", $constraint)) { $compatibility = [ - "version" => $v["version"], - "isPrerelease" => true + 'version' => $v['version'], + 'isPrerelease' => true, ]; + break; } } @@ -117,12 +120,12 @@ foreach ($filamentPlugins as $pkg) { } // Check if there are any incompatible plugins -if (!empty($incompatiblePlugins)) { +if (! empty($incompatiblePlugins)) { $pluginList = implode(', ', $incompatiblePlugins); render("
❌  Incompatible plugins found!
"); render("
The following plugins are incompatible with Filament v4 and need to be removed before upgrading:
"); render("
{$pluginList}
"); - render(<<

Some plugins you’re using are not available in v4 just yet.

You could temporarily remove them from your composer.json file until they’ve been upgraded, @@ -131,7 +134,7 @@ if (!empty($incompatiblePlugins)) { or even write PRs to help the authors upgrade them.

HTML); - render(<< Upgrade aborted From 2ae97eb5261a3e61f4c27d7b8f2e32b0180d4040 Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Wed, 13 Aug 2025 02:55:43 +0200 Subject: [PATCH 013/154] fix ci --- .../upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php index cdbc5ddd10..a3d356ebe1 100644 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php @@ -79,7 +79,7 @@ class CheckPluginsCompatibilityWithV4 extends Command * Checks on Packagist whether the given package has any version compatible with Filament v4. * * @param string $package The full package name (e.g. vendor/package) - * @return array|null Array with version string and isPrerelease flag, or null if not found + * @return array{version:string,isPrerelease:bool}|null Array with version string and isPrerelease flag, or null if not found */ protected function checkFilamentV4Compatibility(string $package): ?array { From 0ced074d15cfcf85af5a4bd6e2cef80b0678eaf4 Mon Sep 17 00:00:00 2001 From: Yusuf Bouzekri Date: Wed, 13 Aug 2025 14:05:11 +0100 Subject: [PATCH 014/154] Allow for class generation without a model being specified --- .../Concerns/CanGenerateModelTables.php | 11 ++++++++++- .../FileGenerators/TableWidgetClassGenerator.php | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php b/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php index 047b48a058..d6bfc09c54 100644 --- a/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php +++ b/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php @@ -22,7 +22,7 @@ trait CanGenerateModelTables return <<query(fn (): {$this->simplifyFqn(Builder::class)} => {$this->simplifyFqn($model)}::query()) + ->query({$this->outputQueryBody($model)}) ->columns([ {$this->outputTableColumns($model)} ]) @@ -217,4 +217,13 @@ trait CanGenerateModelTables return implode(PHP_EOL . ' ', $columns); } + public function outputQueryBody(?string $model = null): string { + if(blank($model)) { + return ""; + } + + return (string) new Literal(<<simplifyFqn(Builder::class)} => {$this->simplifyFqn($model)}::query() + PHP); + } } diff --git a/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php b/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php index e2830862ab..3d77f6a879 100644 --- a/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php +++ b/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php @@ -44,7 +44,7 @@ class TableWidgetClassGenerator extends ClassGenerator Table::class, ...($this->hasPartialImports() ? ['Filament\Tables'] : []), Builder::class, - $this->getModelFqn(), + ...(blank($this->getModelFqn()) ? [] : [$this->getModelFqn()]) , ]; } From a7a22b114cb164996869926ece4714c16a44ff17 Mon Sep 17 00:00:00 2001 From: Yusuf Bouzekri Date: Wed, 13 Aug 2025 14:25:49 +0100 Subject: [PATCH 015/154] Run Composer CS --- .../FileGenerators/Concerns/CanGenerateModelTables.php | 10 ++++++---- .../FileGenerators/TableWidgetClassGenerator.php | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php b/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php index d6bfc09c54..ea45e0f318 100644 --- a/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php +++ b/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php @@ -217,12 +217,14 @@ trait CanGenerateModelTables return implode(PHP_EOL . ' ', $columns); } - public function outputQueryBody(?string $model = null): string { - if(blank($model)) { - return ""; + + public function outputQueryBody(?string $model = null): string + { + if (blank($model)) { + return ''; } - return (string) new Literal(<<simplifyFqn(Builder::class)} => {$this->simplifyFqn($model)}::query() PHP); } diff --git a/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php b/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php index 3d77f6a879..49ed9076d3 100644 --- a/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php +++ b/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php @@ -44,7 +44,7 @@ class TableWidgetClassGenerator extends ClassGenerator Table::class, ...($this->hasPartialImports() ? ['Filament\Tables'] : []), Builder::class, - ...(blank($this->getModelFqn()) ? [] : [$this->getModelFqn()]) , + ...(blank($this->getModelFqn()) ? [] : [$this->getModelFqn()]), ]; } From e2836960f7740f4a67a1767907239d71403d8143 Mon Sep 17 00:00:00 2001 From: Oliver Scase Date: Wed, 13 Aug 2025 17:58:38 +0200 Subject: [PATCH 016/154] fix: allow getting tenant menu items even if the tenant menu has been disabled --- packages/panels/src/Livewire/Concerns/HasTenantMenu.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php index ea0b42b3e9..76589b5d7d 100644 --- a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php +++ b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php @@ -10,7 +10,7 @@ trait HasTenantMenu /** * @var array */ - protected array $tenantMenuItems = []; + protected ?array $tenantMenuItems = null; public function bootHasTenantMenu(): void { @@ -36,6 +36,11 @@ trait HasTenantMenu */ protected function getTenantMenuItems(): array { + if (! isset($this->tenantMenuItems)) { + // If tenant menu items are not set, fetch them from Filament + $this->tenantMenuItems = Filament::getTenantMenuItems(); + } + return $this->tenantMenuItems; } } From 85aff62fe1adc3ea2cc47ff6c127adf124c7b49b Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 13 Aug 2025 21:39:34 +0100 Subject: [PATCH 017/154] Add failing test for action with arguments --- tests/src/Actions/ActionTest.php | 13 +++++++++++++ tests/src/Fixtures/Pages/Actions.php | 2 ++ 2 files changed, 15 insertions(+) diff --git a/tests/src/Actions/ActionTest.php b/tests/src/Actions/ActionTest.php index f27128e161..85404e4877 100644 --- a/tests/src/Actions/ActionTest.php +++ b/tests/src/Actions/ActionTest.php @@ -3,6 +3,7 @@ use Filament\Actions\Action; use Filament\Actions\Testing\TestAction; use Filament\Notifications\Notification; +use Filament\Pages\Page; use Filament\Support\Icons\Heroicon; use Filament\Tests\Actions\TestCase; use Filament\Tests\Fixtures\Pages\Actions; @@ -132,6 +133,18 @@ it('can mount an action with arguments', function (): void { ]); }); +it('can mount an action record with arguments', function (): void { + livewire(Actions::class) + ->mountAction([ + TestAction::make('record-arguments')->arguments(['key' => 123]), + 'record-arguments', + ]) + ->callMountedAction() + ->assertDispatched('record-arguments-called', arguments: [ + 'key' => 123, + ]); +}); + it('can mount a nested action with parent arguments', function (): void { livewire(Actions::class) ->mountAction([ diff --git a/tests/src/Fixtures/Pages/Actions.php b/tests/src/Fixtures/Pages/Actions.php index d9fae1de62..6dd5ad2180 100644 --- a/tests/src/Fixtures/Pages/Actions.php +++ b/tests/src/Fixtures/Pages/Actions.php @@ -47,6 +47,8 @@ class Actions extends Page $this->dispatch('nested-called', arguments: $arguments); }), ]), + Action::make('record-arguments') + ->record(fn (array $arguments) => $arguments['key']), Action::make('parent') ->schema([ TextInput::make('foo') From 43f323efbff7a9a43a83419d60281ded5e2a8f18 Mon Sep 17 00:00:00 2001 From: howdu Date: Wed, 13 Aug 2025 20:50:22 +0000 Subject: [PATCH 018/154] chore: fix code style --- packages/actions/resources/lang/it/delete.php | 1 - packages/actions/resources/lang/it/restore.php | 1 - tests/src/Actions/ActionTest.php | 1 - 3 files changed, 3 deletions(-) diff --git a/packages/actions/resources/lang/it/delete.php b/packages/actions/resources/lang/it/delete.php index 6d331d9231..0a2fc7d2e3 100644 --- a/packages/actions/resources/lang/it/delete.php +++ b/packages/actions/resources/lang/it/delete.php @@ -68,7 +68,6 @@ return [ 'missing_processing_failure_message' => ':count non possono essere eliminati.', ], - ], ]; diff --git a/packages/actions/resources/lang/it/restore.php b/packages/actions/resources/lang/it/restore.php index c2520fdf0d..a65946d58f 100644 --- a/packages/actions/resources/lang/it/restore.php +++ b/packages/actions/resources/lang/it/restore.php @@ -66,7 +66,6 @@ return [ 'missing_processing_failure_message' => ':count non possono essere ripristinati.', ], - ], ], diff --git a/tests/src/Actions/ActionTest.php b/tests/src/Actions/ActionTest.php index 85404e4877..e9d1c79af1 100644 --- a/tests/src/Actions/ActionTest.php +++ b/tests/src/Actions/ActionTest.php @@ -3,7 +3,6 @@ use Filament\Actions\Action; use Filament\Actions\Testing\TestAction; use Filament\Notifications\Notification; -use Filament\Pages\Page; use Filament\Support\Icons\Heroicon; use Filament\Tests\Actions\TestCase; use Filament\Tests\Fixtures\Pages\Actions; From afa2c96eb32b2d128a75bf7465d20b20f952edc5 Mon Sep 17 00:00:00 2001 From: Yusuf Bouzekri Date: Thu, 14 Aug 2025 13:12:53 +0100 Subject: [PATCH 019/154] revert multiple commits --- .../Concerns/CanGenerateModelTables.php | 13 +------------ .../FileGenerators/TableWidgetClassGenerator.php | 2 +- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php b/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php index ea45e0f318..047b48a058 100644 --- a/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php +++ b/packages/tables/src/Commands/FileGenerators/Concerns/CanGenerateModelTables.php @@ -22,7 +22,7 @@ trait CanGenerateModelTables return <<query({$this->outputQueryBody($model)}) + ->query(fn (): {$this->simplifyFqn(Builder::class)} => {$this->simplifyFqn($model)}::query()) ->columns([ {$this->outputTableColumns($model)} ]) @@ -217,15 +217,4 @@ trait CanGenerateModelTables return implode(PHP_EOL . ' ', $columns); } - - public function outputQueryBody(?string $model = null): string - { - if (blank($model)) { - return ''; - } - - return (string) new Literal(<<simplifyFqn(Builder::class)} => {$this->simplifyFqn($model)}::query() - PHP); - } } diff --git a/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php b/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php index 49ed9076d3..e2830862ab 100644 --- a/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php +++ b/packages/widgets/src/Commands/FileGenerators/TableWidgetClassGenerator.php @@ -44,7 +44,7 @@ class TableWidgetClassGenerator extends ClassGenerator Table::class, ...($this->hasPartialImports() ? ['Filament\Tables'] : []), Builder::class, - ...(blank($this->getModelFqn()) ? [] : [$this->getModelFqn()]), + $this->getModelFqn(), ]; } From 01e981c8bebd3c8465c1c2e5998ef4a7fb95508f Mon Sep 17 00:00:00 2001 From: Erik Gaal Date: Thu, 14 Aug 2025 15:53:22 +0200 Subject: [PATCH 020/154] feat: allow binding value object constant state --- .../src/Components/RepeatableEntry.php | 2 +- packages/schemas/src/Concerns/HasState.php | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/infolists/src/Components/RepeatableEntry.php b/packages/infolists/src/Components/RepeatableEntry.php index 05cc93c744..335b5fb2e3 100644 --- a/packages/infolists/src/Components/RepeatableEntry.php +++ b/packages/infolists/src/Components/RepeatableEntry.php @@ -30,7 +30,7 @@ class RepeatableEntry extends Entry implements HasEmbeddedView if ($itemData instanceof Model) { $container->record($itemData); - } elseif (is_array($itemData)) { + } elseif (is_array($itemData) || is_object($itemData)) { $container->constantState($itemData); } diff --git a/packages/schemas/src/Concerns/HasState.php b/packages/schemas/src/Concerns/HasState.php index 729c6bc64b..f7b6ec0de7 100644 --- a/packages/schemas/src/Concerns/HasState.php +++ b/packages/schemas/src/Concerns/HasState.php @@ -8,7 +8,6 @@ use Filament\Infolists\Components\Entry; use Filament\Schemas\Components\Component; use Filament\Support\Livewire\Partials\PartialsComponentHook; use Illuminate\Contracts\Support\Arrayable; -use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; trait HasState @@ -18,9 +17,9 @@ trait HasState protected string $cachedAbsoluteStatePath; /** - * @var array | null + * @var object | array | null */ - protected ?array $constantState = null; + protected object | array | null $constantState = null; protected bool | Closure $shouldPartiallyRender = false; @@ -30,9 +29,9 @@ trait HasState protected ?array $dehydratedComponentsCache = null; /** - * @param array | null $state + * @param object | array | null $state */ - public function state(?array $state): static + public function state(object | array | null $state): static { $this->constantState($state); @@ -78,9 +77,9 @@ trait HasState } /** - * @param array | null $state + * @param object | array | null $state */ - public function constantState(?array $state): static + public function constantState(array | object | null $state): static { $this->constantState = $state; @@ -385,9 +384,9 @@ trait HasState /** * @internal Do not use this method outside the internals of Filament. It is subject to breaking changes in minor and patch releases. * - * @return Model | array + * @return object | array */ - public function getConstantState(): Model | array + public function getConstantState(): object | array { return $this->constantState ?? $this->getRecord(withParentComponentRecord: false) ?? $this->getParentComponent()?->getContainer()->getConstantState() ?? $this->getRecord() ?? throw new Exception('Schema has no [record()] or [state()] set.'); } From 5003c9586bb3f178e3e063dc6e83112435464ba2 Mon Sep 17 00:00:00 2001 From: Oliver Scase Date: Thu, 14 Aug 2025 16:47:51 +0200 Subject: [PATCH 021/154] fix: still get tenant menu items regardless of Filament::hasTenantMenu --- packages/panels/src/Livewire/Concerns/HasTenantMenu.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php index 76589b5d7d..0221f1ce8c 100644 --- a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php +++ b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php @@ -18,10 +18,6 @@ trait HasTenantMenu return; } - if (! Filament::hasTenantMenu()) { - return; - } - $this->tenantMenuItems = Filament::getTenantMenuItems(); foreach ($this->tenantMenuItems as $action) { @@ -36,11 +32,6 @@ trait HasTenantMenu */ protected function getTenantMenuItems(): array { - if (! isset($this->tenantMenuItems)) { - // If tenant menu items are not set, fetch them from Filament - $this->tenantMenuItems = Filament::getTenantMenuItems(); - } - return $this->tenantMenuItems; } } From fc9273826629da17dff7257a873885109e268173 Mon Sep 17 00:00:00 2001 From: Oliver Scase Date: Thu, 14 Aug 2025 16:48:39 +0200 Subject: [PATCH 022/154] fix: cleanup typing --- packages/panels/src/Livewire/Concerns/HasTenantMenu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php index 0221f1ce8c..0b10b4da71 100644 --- a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php +++ b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php @@ -10,7 +10,7 @@ trait HasTenantMenu /** * @var array */ - protected ?array $tenantMenuItems = null; + protected array $tenantMenuItems = []; public function bootHasTenantMenu(): void { From f82ab72075f04b22d467dff473e9aee0fb21cffc Mon Sep 17 00:00:00 2001 From: CHARLIE ETIENNE Date: Thu, 14 Aug 2025 17:01:32 +0200 Subject: [PATCH 023/154] remove the separate command --- .../CheckPluginsCompatibilityWithV4.php | 194 ------------------ .../upgrade/src/UpgradeServiceProvider.php | 2 - 2 files changed, 196 deletions(-) delete mode 100644 packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php diff --git a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php b/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php deleted file mode 100644 index a3d356ebe1..0000000000 --- a/packages/upgrade/src/Commands/CheckPluginsCompatibilityWithV4.php +++ /dev/null @@ -1,194 +0,0 @@ -error('composer.json not found.'); - - return 1; - } - - $composer = json_decode(file_get_contents($composerPath), true); - $dependencies = $composer['require'] ?? []; - - $allPackages = collect($dependencies)->keys(); - - // Filter packages to only those that require filament/filament - $filamentPlugins = $allPackages->filter(function ($package) { - return $this->packageRequiresFilament($package); - }); - - $this->info('Found ' . $filamentPlugins->count() . ' packages that require filament/filament'); - - $results = []; - - foreach ($filamentPlugins as $package) { - $compatibility = $this->checkFilamentV4Compatibility($package); - $versionDisplay = '–'; - - if ($compatibility !== null) { - $versionDisplay = $compatibility['version']; - if ($compatibility['isPrerelease']) { - $versionDisplay .= ' (prerelease)'; - } - } - - $results[] = [ - 'package' => $package, - 'installed' => $dependencies[$package], - 'compatible' => $compatibility ? '✅' : '❌', - 'latest_v4_version' => $versionDisplay, - ]; - } - - // Display result in a formatted table - $this->table( - ['Package', 'Installed Version', 'Compatible with v4?', 'Latest Compatible v4 Version'], - $results - ); - - return 0; - } - - /** - * Checks on Packagist whether the given package has any version compatible with Filament v4. - * - * @param string $package The full package name (e.g. vendor/package) - * @return array{version:string,isPrerelease:bool}|null Array with version string and isPrerelease flag, or null if not found - */ - protected function checkFilamentV4Compatibility(string $package): ?array - { - // First check regular releases - $url = "https://repo.packagist.org/p2/{$package}.json"; - $compatibleVersion = $this->checkPackageCompatibility($package, $url); - - if ($compatibleVersion !== null) { - return [ - 'version' => $compatibleVersion, - 'isPrerelease' => false, - ]; - } - - // If no compatible version found, check dev versions - $devUrl = "https://repo.packagist.org/p2/{$package}~dev.json"; - $compatibleVersion = $this->checkPackageCompatibility($package, $devUrl); - - if ($compatibleVersion !== null) { - return [ - 'version' => $compatibleVersion, - 'isPrerelease' => true, - ]; - } - - return null; - } - - /** - * Checks a specific package URL for Filament v4 compatibility - * - * @param string $package The full package name - * @param string $url The Packagist API URL to check - * @return string|null The compatible version string or null if not found - */ - protected function checkPackageCompatibility(string $package, string $url): ?string - { - try { - $response = Http::get($url); - - if (! $response->ok()) { - return null; - } - - $data = $response->json(); - $versions = $data['packages'][$package] ?? []; - - foreach ($versions as $version) { - $requires = $version['require'] ?? []; - - if (isset($requires['filament/filament'])) { - $constraint = $requires['filament/filament']; - - // Match common constraint patterns for v4 - if (preg_match('/\^4\.|~4\.|>=4\./', $constraint)) { - return $version['version']; - } - } - } - - } catch (Exception $e) { - $this->error("Error checking {$package} at {$url}: " . $e->getMessage()); - } - - return null; - } - - /** - * Checks if a package requires filament/filament by reading its local composer.json - * - * @param string $package The full package name - * @return bool True if the package requires filament/filament - */ - protected function packageRequiresFilament(string $package): bool - { - // Skip filament/filament itself - if ($package === 'filament/filament') { - return false; - } - - // Skip filament/* packages as they're part of the Filament ecosystem - if (str_starts_with($package, 'filament/')) { - return false; - } - - try { - // Read the local composer.json file from vendor directory - $composerPath = base_path("vendor/{$package}/composer.json"); - - if (! file_exists($composerPath)) { - return false; - } - - $composerContent = file_get_contents($composerPath); - $composer = json_decode($composerContent, true); - - if (! $composer || ! is_array($composer)) { - return false; - } - - // Check if the package requires filament/filament - $requires = $composer['require'] ?? []; - - return isset($requires['filament/filament']); - - } catch (Exception $e) { - $this->error("Error checking if {$package} requires filament/filament: " . $e->getMessage()); - } - - return false; - } -} diff --git a/packages/upgrade/src/UpgradeServiceProvider.php b/packages/upgrade/src/UpgradeServiceProvider.php index 2fbad0abd7..126fcb9066 100644 --- a/packages/upgrade/src/UpgradeServiceProvider.php +++ b/packages/upgrade/src/UpgradeServiceProvider.php @@ -2,7 +2,6 @@ namespace Filament\Upgrade; -use Filament\Upgrade\Commands\CheckPluginsCompatibilityWithV4; use Filament\Upgrade\Commands\UpgradeDirectoryStructureToV4Command; use Illuminate\Support\ServiceProvider; @@ -12,7 +11,6 @@ class UpgradeServiceProvider extends ServiceProvider { $this->commands([ UpgradeDirectoryStructureToV4Command::class, - CheckPluginsCompatibilityWithV4::class, ]); } } From 8f1a07cf7d0b985d2966132b6beb3f81448b0875 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Fri, 15 Aug 2025 12:32:20 +0100 Subject: [PATCH 024/154] Update HasTenantMenu.php --- .../src/Livewire/Concerns/HasTenantMenu.php | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php index 0b10b4da71..160b506153 100644 --- a/packages/panels/src/Livewire/Concerns/HasTenantMenu.php +++ b/packages/panels/src/Livewire/Concerns/HasTenantMenu.php @@ -8,14 +8,17 @@ use Filament\Facades\Filament; trait HasTenantMenu { /** - * @var array + * @var ?array */ - protected array $tenantMenuItems = []; + protected ?array $tenantMenuItems; - public function bootHasTenantMenu(): void + /** + * @return array + */ + protected function getTenantMenuItems(): array { - if (! Filament::hasTenancy()) { - return; + if (isset($this->tenantMenuItems)) { + return $this->tenantMenuItems; } $this->tenantMenuItems = Filament::getTenantMenuItems(); @@ -25,13 +28,7 @@ trait HasTenantMenu $this->cacheAction($action); } - } - /** - * @return array - */ - protected function getTenantMenuItems(): array - { return $this->tenantMenuItems; } } From c94a2d9593722926b02bf1cdd41a773c750e1269 Mon Sep 17 00:00:00 2001 From: Yusuf Bouzekri Date: Fri, 15 Aug 2025 14:52:30 +0100 Subject: [PATCH 025/154] Default to Eloquent Model if no model is provided --- packages/widgets/src/Commands/MakeWidgetCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/widgets/src/Commands/MakeWidgetCommand.php b/packages/widgets/src/Commands/MakeWidgetCommand.php index 62e8b88c7c..b3788ad622 100644 --- a/packages/widgets/src/Commands/MakeWidgetCommand.php +++ b/packages/widgets/src/Commands/MakeWidgetCommand.php @@ -504,7 +504,7 @@ class MakeWidgetCommand extends Command $this->writeFile($path, app(TableWidgetClassGenerator::class, [ 'fqn' => $this->fqn, - 'modelFqn' => $modelFqn, + 'modelFqn' => $modelFqn ?: Model::class, 'isGenerated' => $isGenerated, ])); } From ba525e9b0e3b82aa49831a0eb55e9b312ce66e1a Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Fri, 15 Aug 2025 22:42:54 +0530 Subject: [PATCH 026/154] feat: make `afterStateUpdatedJs` work on table repeater --- .../views/components/repeater/table.blade.php | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/packages/forms/resources/views/components/repeater/table.blade.php b/packages/forms/resources/views/components/repeater/table.blade.php index 6e812aa24e..f041cec6f6 100644 --- a/packages/forms/resources/views/components/repeater/table.blade.php +++ b/packages/forms/resources/views/components/repeater/table.blade.php @@ -149,12 +149,37 @@ @if ($component instanceof \Filament\Forms\Components\Hidden) {{ $component }} @else - @php - $counter++ - @endphp - @if ($component->isVisible()) -
@else From c7cf0b822b00de2c3ed67902ef39203369734c93 Mon Sep 17 00:00:00 2001 From: JT Smith Date: Fri, 15 Aug 2025 18:48:16 -0600 Subject: [PATCH 027/154] Update 01-overview.md --- docs/08-styling/01-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/08-styling/01-overview.md b/docs/08-styling/01-overview.md index a31bfa0b57..fa1a9dbc3d 100644 --- a/docs/08-styling/01-overview.md +++ b/docs/08-styling/01-overview.md @@ -130,7 +130,7 @@ php artisan make:filament-theme --pm=bun This command generates a CSS file in the `resources/css/filament` directory. -Add the theme's CSS file to the input array in `vite.config.js`: +Add the theme's CSS file to the input array under the Laravel plugin in `vite.config.js`: ```js input: [ From dacfa39bd043ffeaa3f9719fbe21cbd8e8b56857 Mon Sep 17 00:00:00 2001 From: JT Smith Date: Fri, 15 Aug 2025 18:54:36 -0600 Subject: [PATCH 028/154] Update MakeThemeCommand.php --- packages/panels/src/Commands/MakeThemeCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/panels/src/Commands/MakeThemeCommand.php b/packages/panels/src/Commands/MakeThemeCommand.php index 54f2e289c0..0dfb3cec6a 100644 --- a/packages/panels/src/Commands/MakeThemeCommand.php +++ b/packages/panels/src/Commands/MakeThemeCommand.php @@ -94,7 +94,7 @@ class MakeThemeCommand extends Command $this->components->warn('Action is required to complete the theme setup:'); $this->components->bulletList([ - "First, add a new item to the `input` array of `vite.config.js`: `resources/css/filament/{$this->panel->getId()}/theme.css`.", + "First, add a new item to the `input` array under the Laravel plugin in `vite.config.js`: `resources/css/filament/{$this->panel->getId()}/theme.css`.", "Next, register the theme in the {$this->panel->getId()} panel provider using `->viteTheme('resources/css/filament/{$this->panel->getId()}/theme.css')`", "Finally, run `{$this->pm} run build` to compile the theme.", ]); From 0c221c0cfd06432916a9f2ae879dc574605d26cc Mon Sep 17 00:00:00 2001 From: Punyapal Shah Date: Sat, 16 Aug 2025 16:42:50 +0530 Subject: [PATCH 029/154] fix: increment counter variable for component visibility check --- .../resources/views/components/repeater/table.blade.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/forms/resources/views/components/repeater/table.blade.php b/packages/forms/resources/views/components/repeater/table.blade.php index f041cec6f6..cee6b77d6f 100644 --- a/packages/forms/resources/views/components/repeater/table.blade.php +++ b/packages/forms/resources/views/components/repeater/table.blade.php @@ -149,10 +149,12 @@ @if ($component instanceof \Filament\Forms\Components\Hidden) {{ $component }} @else + @php + $counter++; + @endphp + @if ($component->isVisible()) @php - $counter++; - $componentStatePath = null; $canUseAlpineIntegration = false; From 504cd0dacc9c44c9d8bcda330423c5723e94e041 Mon Sep 17 00:00:00 2001 From: John Wagner <55443800+cainydev@users.noreply.github.com> Date: Sat, 16 Aug 2025 21:41:39 +0200 Subject: [PATCH 030/154] Apply state binding modifiers correctly I know this component is more of an helper for the Modal Table Select, but i lowkey think this component itself is super useful and should be documented and fixed up. --- .../forms/resources/views/components/table-select.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/resources/views/components/table-select.blade.php b/packages/forms/resources/views/components/table-select.blade.php index 4c298f5a54..fb0c1b8c9d 100644 --- a/packages/forms/resources/views/components/table-select.blade.php +++ b/packages/forms/resources/views/components/table-select.blade.php @@ -24,7 +24,7 @@ 'relationshipName' => $getRelationshipName(), 'tableConfiguration' => base64_encode($getTableConfiguration()), 'tableArguments' => $getTableArguments(), - 'wire:model' => $getStatePath(), + $applyStateBindingModifiers('wire:model') => $getStatePath(), ], key($getLivewireKey())) From f8498f957ba5cc7bcf5de253a819d8cb265ff263 Mon Sep 17 00:00:00 2001 From: Igor Clauss Date: Sat, 16 Aug 2025 22:37:22 +0200 Subject: [PATCH 031/154] Update 02-form.md Changing old v3 Trait Name to new v4 one. --- docs/12-components/02-form.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/12-components/02-form.md b/docs/12-components/02-form.md index d714e2424c..c1087b42fb 100644 --- a/docs/12-components/02-form.md +++ b/docs/12-components/02-form.md @@ -246,7 +246,7 @@ public function form(Schema $schema): Schema ## Using multiple forms -By default, the `InteractsWithForms` trait only handles one form per Livewire component - `form()`. To add more forms to the Livewire component, you can define them in the `getForms()` method, and return an array containing the name of each form: +By default, the `InteractsWithSchemas` trait only handles one form per Livewire component - `form()`. To add more forms to the Livewire component, you can define them in the `getForms()` method, and return an array containing the name of each form: ```php protected function getForms(): array From 2d8b36b09356b3e85f877a322752da0c998e2a21 Mon Sep 17 00:00:00 2001 From: zvizvi <5633910@gmail.com> Date: Sun, 17 Aug 2025 01:47:22 +0300 Subject: [PATCH 032/154] Allow html in ActionGroup label --- packages/actions/src/ActionGroup.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/actions/src/ActionGroup.php b/packages/actions/src/ActionGroup.php index f2f3b74d32..8798aa76a8 100644 --- a/packages/actions/src/ActionGroup.php +++ b/packages/actions/src/ActionGroup.php @@ -26,6 +26,7 @@ use Filament\Support\View\Concerns\CanGenerateDropdownItemHtml; use Filament\Support\View\Concerns\CanGenerateIconButtonHtml; use Filament\Support\View\Concerns\CanGenerateLinkHtml; use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Htmlable; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; @@ -220,11 +221,13 @@ class ActionGroup extends ViewComponent implements Arrayable, HasEmbeddedView return $this->getTriggerView() === static::LINK_VIEW; } - public function getLabel(): string + public function getLabel(): string | Htmlable | null { $label = $this->evaluate($this->label) ?? __('filament-actions::group.trigger.label'); - return $this->shouldTranslateLabel ? __($label) : $label; + return is_string($label) && $this->shouldTranslateLabel + ? __($label) + : $label; } /** From ec430e115e50bc2b16952396fd231e7179b75a74 Mon Sep 17 00:00:00 2001 From: corean Date: Sun, 17 Aug 2025 10:22:43 +0900 Subject: [PATCH 033/154] =?UTF-8?q?4.x=20korean(=ED=95=9C=EA=B8=80)=20lang?= =?UTF-8?q?uage=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/actions/resources/lang/ko/delete.php | 12 ++ .../resources/lang/ko/force-delete.php | 12 ++ .../resources/lang/ko/notifications.php | 10 ++ .../actions/resources/lang/ko/restore.php | 12 ++ .../forms/resources/lang/ko/components.php | 140 +++++++++++++++++- ...k-email-change-verification-controller.php | 19 +++ .../email-change-verification-controller.php | 14 ++ .../auth/multi-factor/app/actions/disable.php | 71 +++++++++ .../app/actions/regenerate-recovery-codes.php | 77 ++++++++++ .../auth/multi-factor/app/actions/set-up.php | 81 ++++++++++ .../ko/auth/multi-factor/app/provider.php | 64 ++++++++ .../multi-factor/email/actions/disable.php | 67 +++++++++ .../multi-factor/email/actions/set-up.php | 67 +++++++++ .../verify-email-authentication.php | 12 ++ .../ko/auth/multi-factor/email/provider.php | 60 ++++++++ ...p-required-multi-factor-authentication.php | 19 +++ .../recovery-codes-modal-content.php | 27 ++++ .../notice-of-email-change-request.php | 16 ++ .../lang/ko/auth/pages/edit-profile.php | 17 +++ .../resources/lang/ko/auth/pages/login.php | 24 +++ .../password-reset/request-password-reset.php | 4 + .../resources/lang/ko/error-notifications.php | 9 ++ .../lang/ko/resources/pages/edit-record.php | 2 + .../pages/manage-related-records.php | 7 + .../lang/ko/resources/pages/view-record.php | 2 + .../resources/lang/ko/pages/settings-page.php | 25 ++++ packages/tables/resources/lang/ko/table.php | 33 ++++- packages/widgets/resources/lang/ko/chart.php | 13 ++ 28 files changed, 907 insertions(+), 9 deletions(-) create mode 100644 packages/actions/resources/lang/ko/notifications.php create mode 100644 packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php create mode 100644 packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php create mode 100644 packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php create mode 100644 packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php create mode 100644 packages/panels/resources/lang/ko/error-notifications.php create mode 100644 packages/panels/resources/lang/ko/resources/pages/manage-related-records.php create mode 100644 packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php create mode 100644 packages/widgets/resources/lang/ko/chart.php diff --git a/packages/actions/resources/lang/ko/delete.php b/packages/actions/resources/lang/ko/delete.php index a2326fa2f5..6023e0da0f 100644 --- a/packages/actions/resources/lang/ko/delete.php +++ b/packages/actions/resources/lang/ko/delete.php @@ -54,6 +54,18 @@ return [ 'title' => '삭제 완료', ], + 'deleted_partial' => [ + 'title' => ':total 중 :count개 삭제됨', + 'missing_authorization_failure_message' => ':count개를 삭제할 권한이 없습니다.', + 'missing_processing_failure_message' => ':count개를 삭제할 수 없습니다.', + ], + + 'deleted_none' => [ + 'title' => '삭제 실패', + 'missing_authorization_failure_message' => ':count개를 삭제할 권한이 없습니다.', + 'missing_processing_failure_message' => ':count개를 삭제할 수 없습니다.', + ], + ], ], diff --git a/packages/actions/resources/lang/ko/force-delete.php b/packages/actions/resources/lang/ko/force-delete.php index 9bde030cac..a605580042 100644 --- a/packages/actions/resources/lang/ko/force-delete.php +++ b/packages/actions/resources/lang/ko/force-delete.php @@ -54,6 +54,18 @@ return [ 'title' => '삭제 완료', ], + 'deleted_partial' => [ + 'title' => ':total 중 :count개 삭제됨', + 'missing_authorization_failure_message' => ':count개를 삭제할 권한이 없습니다.', + 'missing_processing_failure_message' => ':count개를 삭제할 수 없습니다.', + ], + + 'deleted_none' => [ + 'title' => '삭제 실패', + 'missing_authorization_failure_message' => ':count개를 삭제할 권한이 없습니다.', + 'missing_processing_failure_message' => ':count개를 삭제할 수 없습니다.', + ], + ], ], diff --git a/packages/actions/resources/lang/ko/notifications.php b/packages/actions/resources/lang/ko/notifications.php new file mode 100644 index 0000000000..97805ac55d --- /dev/null +++ b/packages/actions/resources/lang/ko/notifications.php @@ -0,0 +1,10 @@ + [ + 'title' => '너무 많은 시도', + 'body' => ':seconds초 후에 다시 시도해 주세요.', + ], + +]; \ No newline at end of file diff --git a/packages/actions/resources/lang/ko/restore.php b/packages/actions/resources/lang/ko/restore.php index 615a2ee69d..3580a02169 100644 --- a/packages/actions/resources/lang/ko/restore.php +++ b/packages/actions/resources/lang/ko/restore.php @@ -54,6 +54,18 @@ return [ 'title' => '복원 완료', ], + 'restored_partial' => [ + 'title' => ':total 중 :count개 복원됨', + 'missing_authorization_failure_message' => ':count개를 복원할 권한이 없습니다.', + 'missing_processing_failure_message' => ':count개를 복원할 수 없습니다.', + ], + + 'restored_none' => [ + 'title' => '복원 실패', + 'missing_authorization_failure_message' => ':count개를 복원할 권한이 없습니다.', + 'missing_processing_failure_message' => ':count개를 복원할 수 없습니다.', + ], + ], ], diff --git a/packages/forms/resources/lang/ko/components.php b/packages/forms/resources/lang/ko/components.php index f751c3d38c..8c89da73bf 100644 --- a/packages/forms/resources/lang/ko/components.php +++ b/packages/forms/resources/lang/ko/components.php @@ -297,6 +297,28 @@ return [ ], + 'modal_table_select' => [ + + 'actions' => [ + + 'select' => [ + + 'label' => '선택', + + 'actions' => [ + + 'select' => [ + 'label' => '선택', + ], + + ], + + ], + + ], + + ], + 'radio' => [ 'boolean' => [ @@ -360,37 +382,130 @@ return [ 'rich_editor' => [ - 'dialogs' => [ + 'actions' => [ + + 'attach_files' => [ + + 'label' => '파일 업로드', + + 'modal' => [ + + 'heading' => '파일 업로드', + + 'form' => [ + + 'file' => [ + + 'label' => [ + 'new' => '파일', + 'existing' => '파일 교체', + ], + + ], + + 'alt' => [ + + 'label' => [ + 'new' => '대체 텍스트', + 'existing' => '대체 텍스트 변경', + ], + + ], + + ], + + ], + + ], + + 'custom_block' => [ + + 'modal' => [ + + 'actions' => [ + + 'insert' => [ + 'label' => '삽입', + ], + + 'save' => [ + 'label' => '저장', + ], + + ], + + ], + + ], 'link' => [ - 'actions' => [ - 'link' => '링크', - 'unlink' => '링크 해제', + 'label' => '수정', + + 'modal' => [ + + 'heading' => '링크', + + 'form' => [ + + 'url' => [ + 'label' => 'URL', + ], + + 'should_open_in_new_tab' => [ + 'label' => '새 탭에서 열기', + ], + + ], + ], - 'label' => 'URL', - - 'placeholder' => 'URL을 입력하세요', - ], ], + 'no_merge_tag_search_results_message' => '병합 태그 결과가 없습니다.', + 'tools' => [ + 'align_center' => '가운데 정렬', + 'align_end' => '끝 정렬', + 'align_justify' => '양쪽 정렬', + 'align_start' => '시작 정렬', 'attach_files' => '파일 첨부', 'blockquote' => '인용구', 'bold' => '굵게', 'bullet_list' => '순서가 없는 목록', + 'clear_formatting' => '서식 지우기', + 'code' => '코드', 'code_block' => '코드 블록', + 'custom_blocks' => '블록', + 'details' => '세부사항', 'h1' => '큰 제목', 'h2' => '중간 제목', 'h3' => '작은 제목', + 'highlight' => '강조', + 'horizontal_rule' => '수평선', 'italic' => '기울임체', + 'lead' => '강조 텍스트', 'link' => '링크', + 'merge_tags' => '병합 태그', 'ordered_list' => '번호 목록', 'redo' => '다시 실행', + 'small' => '작은 텍스트', 'strike' => '취소선', + 'subscript' => '아래 첨자', + 'superscript' => '위 첨자', + 'table' => '테이블', + 'table_delete' => '테이블 삭제', + 'table_add_column_before' => '이전에 열 추가', + 'table_add_column_after' => '이후에 열 추가', + 'table_delete_column' => '열 삭제', + 'table_add_row_before' => '위에 행 추가', + 'table_add_row_after' => '아래에 행 추가', + 'table_delete_row' => '행 삭제', + 'table_merge_cells' => '셀 병합', + 'table_split_cell' => '셀 분할', + 'table_toggle_header_row' => '헤더 행 토글', 'underline' => '밑줄', 'undo' => '실행 취소', ], @@ -403,6 +518,8 @@ return [ 'create_option' => [ + 'label' => '만들기', + 'modal' => [ 'heading' => '새로 만들기', @@ -425,6 +542,8 @@ return [ 'edit_option' => [ + 'label' => '수정', + 'modal' => [ 'heading' => '수정', @@ -469,6 +588,11 @@ return [ 'actions' => [ + 'copy' => [ + 'label' => '복사', + 'message' => '복사됨', + ], + 'hide_password' => [ 'label' => '비밀번호 숨기기', ], diff --git a/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php b/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php new file mode 100644 index 0000000000..a54a0fbdda --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php @@ -0,0 +1,19 @@ + [ + + 'blocked' => [ + 'title' => '이메일 주소 변경 차단됨', + 'body' => ':email로의 이메일 주소 변경 시도를 성공적으로 차단했습니다. 원래 요청을 하지 않았다면 즉시 문의해 주세요.', + ], + + 'failed' => [ + 'title' => '이메일 주소 변경 차단 실패', + 'body' => '안타깝게도 이미 차단하기 전에 확인되었기 때문에 이메일 주소가 :email로 변경되는 것을 막을 수 없었습니다. 원래 요청을 하지 않았다면 즉시 문의해 주세요.', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php b/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php new file mode 100644 index 0000000000..b9474e2913 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php @@ -0,0 +1,14 @@ + [ + + 'verified' => [ + 'title' => '이메일 주소 변경됨', + 'body' => '이메일 주소가 :email로 성공적으로 변경되었습니다.', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php new file mode 100644 index 0000000000..4b6f2c00c6 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php @@ -0,0 +1,71 @@ + '비활성화', + + 'modal' => [ + + 'heading' => '인증 앱 비활성화', + + 'description' => '인증 앱 사용을 중단하시겠습니까? 이를 비활성화하면 계정에서 추가 보안 계층이 제거됩니다.', + + 'form' => [ + + 'code' => [ + + 'label' => '인증 앱에서 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'actions' => [ + + 'use_recovery_code' => [ + 'label' => '대신 복구 코드 사용', + ], + + ], + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + 'recovery_code' => [ + + 'label' => '또는 복구 코드를 입력하세요', + + 'validation_attribute' => '복구 코드', + + 'messages' => [ + + 'invalid' => '입력한 복구 코드가 올바르지 않습니다.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => '인증 앱 비활성화', + ], + + ], + + ], + + 'notifications' => [ + + 'disabled' => [ + 'title' => '인증 앱이 비활성화되었습니다', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php new file mode 100644 index 0000000000..7c5bbd3ad6 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php @@ -0,0 +1,77 @@ + '복구 코드 재생성', + + 'modal' => [ + + 'heading' => '인증 앱 복구 코드 재생성', + + 'description' => '복구 코드를 분실한 경우 여기에서 재생성할 수 있습니다. 기존 복구 코드는 즉시 무효화됩니다.', + + 'form' => [ + + 'code' => [ + + 'label' => '인증 앱에서 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + 'password' => [ + + 'label' => '또는 현재 비밀번호를 입력하세요', + + 'validation_attribute' => '비밀번호', + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => '복구 코드 재생성', + ], + + ], + + ], + + 'notifications' => [ + + 'regenerated' => [ + 'title' => '새로운 인증 앱 복구 코드가 생성되었습니다', + ], + + ], + + 'show_new_recovery_codes' => [ + + 'modal' => [ + + 'heading' => '새 복구 코드', + + 'description' => '다음 복구 코드를 안전한 곳에 저장하세요. 한 번만 표시되며, 인증 앱에 액세스할 수 없을 때 필요합니다:', + + 'actions' => [ + + 'submit' => [ + 'label' => '닫기', + ], + + ], + + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php new file mode 100644 index 0000000000..c7d6fb8a88 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php @@ -0,0 +1,81 @@ + '설정', + + 'modal' => [ + + 'heading' => '인증 앱 설정', + + 'description' => <<<'BLADE' + 이 과정을 완료하려면 Google Authenticator (iOS, Android)와 같은 앱이 필요합니다. + BLADE, + + 'content' => [ + + 'qr_code' => [ + + 'instruction' => '인증 앱으로 이 QR 코드를 스캔하세요:', + + 'alt' => '인증 앱으로 스캔할 QR 코드', + + ], + + 'text_code' => [ + + 'instruction' => '또는 이 코드를 수동으로 입력하세요:', + + 'messages' => [ + 'copied' => '복사됨', + ], + + ], + + 'recovery_codes' => [ + + 'instruction' => '다음 복구 코드를 안전한 곳에 저장하세요. 한 번만 표시되며, 인증 앱에 액세스할 수 없을 때 필요합니다:', + + ], + + ], + + 'form' => [ + + 'code' => [ + + 'label' => '인증 앱에서 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'below_content' => '로그인하거나 민감한 작업을 수행할 때마다 인증 앱에서 6자리 코드를 입력해야 합니다.', + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => '인증 앱 활성화', + ], + + ], + + ], + + 'notifications' => [ + + 'enabled' => [ + 'title' => '인증 앱이 활성화되었습니다', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php new file mode 100644 index 0000000000..a7666679f6 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php @@ -0,0 +1,64 @@ + [ + + 'actions' => [ + + 'label' => '인증 앱', + + 'below_content' => '보안 앱을 사용하여 로그인 확인을 위한 임시 코드를 생성합니다.', + + 'messages' => [ + 'enabled' => '활성화됨', + 'disabled' => '비활성화됨', + ], + + ], + + ], + + 'login_form' => [ + + 'label' => '인증 앱의 코드를 사용하세요', + + 'code' => [ + + 'label' => '인증 앱에서 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'actions' => [ + + 'use_recovery_code' => [ + 'label' => '대신 복구 코드 사용', + ], + + ], + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + 'recovery_code' => [ + + 'label' => '또는 복구 코드를 입력하세요', + + 'validation_attribute' => '복구 코드', + + 'messages' => [ + + 'invalid' => '입력한 복구 코드가 올바르지 않습니다.', + + ], + + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php new file mode 100644 index 0000000000..872b63884a --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php @@ -0,0 +1,67 @@ + '비활성화', + + 'modal' => [ + + 'heading' => '이메일 인증 코드 비활성화', + + 'description' => '이메일 인증 코드 수신을 중단하시겠습니까? 이를 비활성화하면 계정에서 추가 보안 계층이 제거됩니다.', + + 'form' => [ + + 'code' => [ + + 'label' => '이메일로 보낸 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'actions' => [ + + 'resend' => [ + + 'label' => '이메일로 새 코드 보내기', + + 'notifications' => [ + + 'resent' => [ + 'title' => '이메일로 새 코드를 보냈습니다', + ], + + ], + + ], + + ], + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => '이메일 인증 코드 비활성화', + ], + + ], + + ], + + 'notifications' => [ + + 'disabled' => [ + 'title' => '이메일 인증 코드가 비활성화되었습니다', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php new file mode 100644 index 0000000000..23f7f5b92e --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php @@ -0,0 +1,67 @@ + '설정', + + 'modal' => [ + + 'heading' => '이메일 인증 코드 설정', + + 'description' => '로그인하거나 민감한 작업을 수행할 때마다 이메일로 보낸 6자리 코드를 입력해야 합니다. 설정을 완료하려면 이메일에서 6자리 코드를 확인하세요.', + + 'form' => [ + + 'code' => [ + + 'label' => '이메일로 보낸 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'actions' => [ + + 'resend' => [ + + 'label' => '이메일로 새 코드 보내기', + + 'notifications' => [ + + 'resent' => [ + 'title' => '이메일로 새 코드를 보냈습니다', + ], + + ], + + ], + + ], + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => '이메일 인증 코드 활성화', + ], + + ], + + ], + + 'notifications' => [ + + 'enabled' => [ + 'title' => '이메일 인증 코드가 활성화되었습니다', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php new file mode 100644 index 0000000000..d5e83d7e98 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php @@ -0,0 +1,12 @@ + '로그인 코드입니다', + + 'lines' => [ + '로그인 코드: :code', + '이 코드는 1분 후에 만료됩니다.|이 코드는 :minutes분 후에 만료됩니다.', + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php new file mode 100644 index 0000000000..f580a9e106 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php @@ -0,0 +1,60 @@ + [ + + 'actions' => [ + + 'label' => '이메일 인증 코드', + + 'below_content' => '로그인 시 신원 확인을 위해 이메일 주소로 임시 코드를 받습니다.', + + 'messages' => [ + 'enabled' => '활성화됨', + 'disabled' => '비활성화됨', + ], + + ], + + ], + + 'login_form' => [ + + 'label' => '이메일로 코드 보내기', + + 'code' => [ + + 'label' => '이메일로 보낸 6자리 코드를 입력하세요', + + 'validation_attribute' => '코드', + + 'actions' => [ + + 'resend' => [ + + 'label' => '이메일로 새 코드 보내기', + + 'notifications' => [ + + 'resent' => [ + 'title' => '이메일로 새 코드를 보냈습니다', + ], + + ], + + ], + + ], + + 'messages' => [ + + 'invalid' => '입력한 코드가 올바르지 않습니다.', + + ], + + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php b/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php new file mode 100644 index 0000000000..55f6c2636e --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php @@ -0,0 +1,19 @@ + '이중 인증(2FA) 설정', + + 'heading' => '이중 인증 설정', + + 'subheading' => '2FA는 로그인 시 두 번째 형태의 인증을 요구하여 계정에 추가 보안 계층을 추가합니다.', + + 'actions' => [ + + 'continue' => [ + 'label' => '계속', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php b/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php new file mode 100644 index 0000000000..fd72644b37 --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php @@ -0,0 +1,27 @@ + [ + + '클릭하여', + + 'copy' => [ + 'label' => '복사', + ], + + '하거나', + + 'download' => [ + 'label' => '다운로드', + ], + + '하여 모든 코드를 한 번에 가져오세요.', + + ], + + 'messages' => [ + 'copied' => '복사됨', + ], + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php b/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php new file mode 100644 index 0000000000..3dd3c8678d --- /dev/null +++ b/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php @@ -0,0 +1,16 @@ + '이메일 주소가 변경되고 있습니다', + + 'lines' => [ + '계정과 연결된 이메일 주소 변경 요청을 받았습니다. 이 변경을 확인하기 위해 비밀번호가 사용되었습니다.', + '확인되면 계정의 새 이메일 주소는 :email이 됩니다.', + '확인되기 전에 아래 버튼을 클릭하여 변경을 차단할 수 있습니다.', + '이 요청을 하지 않았다면 즉시 문의해 주세요.', + ], + + 'action' => '이메일 변경 차단', + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/auth/pages/edit-profile.php b/packages/panels/resources/lang/ko/auth/pages/edit-profile.php index 620ee69619..fbbcf7393f 100644 --- a/packages/panels/resources/lang/ko/auth/pages/edit-profile.php +++ b/packages/panels/resources/lang/ko/auth/pages/edit-profile.php @@ -16,10 +16,18 @@ return [ 'password' => [ 'label' => '새 비밀번호', + 'validation_attribute' => '비밀번호', ], 'password_confirmation' => [ 'label' => '새 비밀번호 확인', + 'validation_attribute' => '비밀번호 확인', + ], + + 'current_password' => [ + 'label' => '현재 비밀번호', + 'below_content' => '보안을 위해 계속하려면 비밀번호를 확인해 주세요.', + 'validation_attribute' => '현재 비밀번호', ], 'actions' => [ @@ -32,8 +40,17 @@ return [ ], + 'multi_factor_authentication' => [ + 'label' => '이중 인증 (2FA)', + ], + 'notifications' => [ + 'email_change_verification_sent' => [ + 'title' => '이메일 주소 변경 요청이 전송됨', + 'body' => ':email로 이메일 주소 변경 요청이 전송되었습니다. 변경사항을 확인하려면 이메일을 확인해 주세요.', + ], + 'saved' => [ 'title' => '저장 완료', ], diff --git a/packages/panels/resources/lang/ko/auth/pages/login.php b/packages/panels/resources/lang/ko/auth/pages/login.php index d0ee441dcb..4296457765 100644 --- a/packages/panels/resources/lang/ko/auth/pages/login.php +++ b/packages/panels/resources/lang/ko/auth/pages/login.php @@ -43,6 +43,30 @@ return [ ], + 'multi_factor' => [ + + 'heading' => '신원 확인', + + 'subheading' => '로그인을 계속하려면 신원을 확인해야 합니다.', + + 'form' => [ + + 'provider' => [ + 'label' => '어떻게 확인하시겠습니까?', + ], + + 'actions' => [ + + 'authenticate' => [ + 'label' => '로그인 확인', + ], + + ], + + ], + + ], + 'messages' => [ 'failed' => '일치하는 계정이 없습니다.', diff --git a/packages/panels/resources/lang/ko/auth/pages/password-reset/request-password-reset.php b/packages/panels/resources/lang/ko/auth/pages/password-reset/request-password-reset.php index d97a302f26..28c399789d 100644 --- a/packages/panels/resources/lang/ko/auth/pages/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/ko/auth/pages/password-reset/request-password-reset.php @@ -32,6 +32,10 @@ return [ 'notifications' => [ + 'sent' => [ + 'body' => '계정이 존재하지 않으면 이메일을 받지 못합니다.', + ], + 'throttled' => [ 'title' => '너무 많이 시도했습니다', 'body' => ':seconds 초 후에 다시 시도해 주세요.', diff --git a/packages/panels/resources/lang/ko/error-notifications.php b/packages/panels/resources/lang/ko/error-notifications.php new file mode 100644 index 0000000000..46fa64ae99 --- /dev/null +++ b/packages/panels/resources/lang/ko/error-notifications.php @@ -0,0 +1,9 @@ + '페이지 로드 중 오류', + + 'body' => '이 페이지를 로드하는 동안 오류가 발생했습니다. 나중에 다시 시도해 주세요.', + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/resources/pages/edit-record.php b/packages/panels/resources/lang/ko/resources/pages/edit-record.php index 60dc615de1..69f7157181 100644 --- a/packages/panels/resources/lang/ko/resources/pages/edit-record.php +++ b/packages/panels/resources/lang/ko/resources/pages/edit-record.php @@ -6,6 +6,8 @@ return [ 'breadcrumb' => '수정', + 'navigation_label' => '수정', + 'form' => [ 'actions' => [ diff --git a/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php b/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php new file mode 100644 index 0000000000..eb1c7bb0f6 --- /dev/null +++ b/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php @@ -0,0 +1,7 @@ + ':label :relationship 관리', + +]; \ No newline at end of file diff --git a/packages/panels/resources/lang/ko/resources/pages/view-record.php b/packages/panels/resources/lang/ko/resources/pages/view-record.php index 7c54bdd5f0..045780c7a5 100644 --- a/packages/panels/resources/lang/ko/resources/pages/view-record.php +++ b/packages/panels/resources/lang/ko/resources/pages/view-record.php @@ -6,6 +6,8 @@ return [ 'breadcrumb' => '보기', + 'navigation_label' => '보기', + 'content' => [ 'tab' => [ diff --git a/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php b/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php new file mode 100644 index 0000000000..b0c852e3a1 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php @@ -0,0 +1,25 @@ + [ + + 'actions' => [ + + 'save' => [ + 'label' => '변경사항 저장', + ], + + ], + + ], + + 'notifications' => [ + + 'saved' => [ + 'title' => '저장됨', + ], + + ], + +]; \ No newline at end of file diff --git a/packages/tables/resources/lang/ko/table.php b/packages/tables/resources/lang/ko/table.php index f202cda906..300fc3aa11 100644 --- a/packages/tables/resources/lang/ko/table.php +++ b/packages/tables/resources/lang/ko/table.php @@ -6,6 +6,18 @@ return [ 'heading' => '열', + 'actions' => [ + + 'apply' => [ + 'label' => '열 적용', + ], + + 'reset' => [ + 'label' => '초기화', + ], + + ], + ], 'columns' => [ @@ -14,6 +26,20 @@ return [ 'label' => '작업|작업들', ], + 'select' => [ + + 'loading_message' => '로드 중...', + + 'no_search_results_message' => '검색 결과가 없습니다.', + + 'placeholder' => '옵션을 선택하세요', + + 'searching_message' => '검색 중...', + + 'search_prompt' => '검색어를 입력하세요...', + + ], + 'text' => [ 'actions' => [ @@ -145,7 +171,13 @@ return [ ], 'select' => [ + 'placeholder' => '전체', + + 'relationship' => [ + 'empty_option_label' => '없음', + ], + ], 'trashed' => [ @@ -168,7 +200,6 @@ return [ 'group' => [ 'label' => '그룹 기준', - 'placeholder' => '그룹 기준', ], 'direction' => [ diff --git a/packages/widgets/resources/lang/ko/chart.php b/packages/widgets/resources/lang/ko/chart.php new file mode 100644 index 0000000000..ffe0942340 --- /dev/null +++ b/packages/widgets/resources/lang/ko/chart.php @@ -0,0 +1,13 @@ + [ + + 'filter' => [ + 'label' => '필터', + ], + + ], + +]; \ No newline at end of file From 0a2894c173aa4bcc9bda525ad1ec454d837c36fe Mon Sep 17 00:00:00 2001 From: corean Date: Sun, 17 Aug 2025 10:32:26 +0900 Subject: [PATCH 034/154] Fix code style for Korean translation files --- packages/actions/resources/lang/ko/notifications.php | 2 +- packages/actions/resources/lang/nb/import.php | 10 +++++----- .../block-email-change-verification-controller.php | 2 +- .../email-change-verification-controller.php | 2 +- .../lang/ko/auth/multi-factor/app/actions/disable.php | 2 +- .../app/actions/regenerate-recovery-codes.php | 2 +- .../lang/ko/auth/multi-factor/app/actions/set-up.php | 2 +- .../lang/ko/auth/multi-factor/app/provider.php | 2 +- .../ko/auth/multi-factor/email/actions/disable.php | 2 +- .../lang/ko/auth/multi-factor/email/actions/set-up.php | 2 +- .../notifications/verify-email-authentication.php | 2 +- .../lang/ko/auth/multi-factor/email/provider.php | 2 +- .../set-up-required-multi-factor-authentication.php | 2 +- .../auth/multi-factor/recovery-codes-modal-content.php | 2 +- .../notifications/notice-of-email-change-request.php | 2 +- .../panels/resources/lang/ko/error-notifications.php | 2 +- .../lang/ko/resources/pages/manage-related-records.php | 2 +- .../resources/lang/ko/pages/settings-page.php | 2 +- packages/widgets/resources/lang/ko/chart.php | 2 +- 19 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/actions/resources/lang/ko/notifications.php b/packages/actions/resources/lang/ko/notifications.php index 97805ac55d..1814ecd721 100644 --- a/packages/actions/resources/lang/ko/notifications.php +++ b/packages/actions/resources/lang/ko/notifications.php @@ -7,4 +7,4 @@ return [ 'body' => ':seconds초 후에 다시 시도해 주세요.', ], -]; \ No newline at end of file +]; diff --git a/packages/actions/resources/lang/nb/import.php b/packages/actions/resources/lang/nb/import.php index 7019d849b8..e86122b9f2 100644 --- a/packages/actions/resources/lang/nb/import.php +++ b/packages/actions/resources/lang/nb/import.php @@ -11,12 +11,12 @@ return [ 'form' => [ 'file' => [ - 'label' => 'Fil', - 'placeholder' => 'Last opp en CSV fil', - 'rules' => [ - 'duplicate_columns' => '{0} Filen kan ikke inneholde mer enn én tom kolonneoverskrift.|{1,*} Filen kan ikke inneholde dupliserte kolonneoverskrifter: :columns.', - ], + 'label' => 'Fil', + 'placeholder' => 'Last opp en CSV fil', + 'rules' => [ + 'duplicate_columns' => '{0} Filen kan ikke inneholde mer enn én tom kolonneoverskrift.|{1,*} Filen kan ikke inneholde dupliserte kolonneoverskrifter: :columns.', ], + ], 'columns' => [ 'label' => 'Kolonner', diff --git a/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php b/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php index a54a0fbdda..730ed49837 100644 --- a/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php +++ b/packages/panels/resources/lang/ko/auth/http/controllers/block-email-change-verification-controller.php @@ -16,4 +16,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php b/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php index b9474e2913..831964573e 100644 --- a/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php +++ b/packages/panels/resources/lang/ko/auth/http/controllers/email-change-verification-controller.php @@ -11,4 +11,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php index 4b6f2c00c6..1814b169d5 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/disable.php @@ -68,4 +68,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php index 7c5bbd3ad6..d9ccc58169 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/regenerate-recovery-codes.php @@ -74,4 +74,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php index c7d6fb8a88..ea7af6b5f5 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/actions/set-up.php @@ -78,4 +78,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php b/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php index a7666679f6..c34e056d43 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/app/provider.php @@ -61,4 +61,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php index 872b63884a..3c63751913 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/disable.php @@ -64,4 +64,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php index 23f7f5b92e..503921a971 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/actions/set-up.php @@ -64,4 +64,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php index d5e83d7e98..38bff03c29 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/notifications/verify-email-authentication.php @@ -9,4 +9,4 @@ return [ '이 코드는 1분 후에 만료됩니다.|이 코드는 :minutes분 후에 만료됩니다.', ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php b/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php index f580a9e106..1b973398eb 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/email/provider.php @@ -57,4 +57,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php b/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php index 55f6c2636e..3a805ae210 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php @@ -16,4 +16,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php b/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php index fd72644b37..0c13bb9836 100644 --- a/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php +++ b/packages/panels/resources/lang/ko/auth/multi-factor/recovery-codes-modal-content.php @@ -24,4 +24,4 @@ return [ 'copied' => '복사됨', ], -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php b/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php index 3dd3c8678d..e036398afb 100644 --- a/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php +++ b/packages/panels/resources/lang/ko/auth/notifications/notice-of-email-change-request.php @@ -13,4 +13,4 @@ return [ 'action' => '이메일 변경 차단', -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/error-notifications.php b/packages/panels/resources/lang/ko/error-notifications.php index 46fa64ae99..d4e33a8898 100644 --- a/packages/panels/resources/lang/ko/error-notifications.php +++ b/packages/panels/resources/lang/ko/error-notifications.php @@ -6,4 +6,4 @@ return [ 'body' => '이 페이지를 로드하는 동안 오류가 발생했습니다. 나중에 다시 시도해 주세요.', -]; \ No newline at end of file +]; diff --git a/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php b/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php index eb1c7bb0f6..3ed3f4347b 100644 --- a/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php +++ b/packages/panels/resources/lang/ko/resources/pages/manage-related-records.php @@ -4,4 +4,4 @@ return [ 'title' => ':label :relationship 관리', -]; \ No newline at end of file +]; diff --git a/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php b/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php index b0c852e3a1..675535cc1e 100644 --- a/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php +++ b/packages/spatie-laravel-settings-plugin/resources/lang/ko/pages/settings-page.php @@ -22,4 +22,4 @@ return [ ], -]; \ No newline at end of file +]; diff --git a/packages/widgets/resources/lang/ko/chart.php b/packages/widgets/resources/lang/ko/chart.php index ffe0942340..161f540f8a 100644 --- a/packages/widgets/resources/lang/ko/chart.php +++ b/packages/widgets/resources/lang/ko/chart.php @@ -10,4 +10,4 @@ return [ ], -]; \ No newline at end of file +]; From 08a9e8657ef54f82eaae6dfe6465d9878548b907 Mon Sep 17 00:00:00 2001 From: Mason Curry Date: Sun, 17 Aug 2025 00:12:54 -0500 Subject: [PATCH 035/154] fix: fix link to contributing page in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 01aef2a689..b6793fda3a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Why rebuild dashboards, forms, and tables from scratch every time? ## Contributing -Please see our [contributing guide](https://filamentphp.com/docs/support/contributing). +Please see our [contributing guide](https://filamentphp.com/docs/4.x/introduction/contributing). ## Need Help? From 3956b08567a0e53cdb902e2b0fda8d5dadd538b7 Mon Sep 17 00:00:00 2001 From: Amid Esfahani Date: Sun, 17 Aug 2025 13:34:26 +0330 Subject: [PATCH 036/154] fix(i18n/fa): add missing Farsi translations for multi-factor, notifications & manage-related-records --- .../auth/multi-factor/app/actions/disable.php | 71 ++++++++++++++++ .../app/actions/regenerate-recovery-codes.php | 77 ++++++++++++++++++ .../auth/multi-factor/app/actions/set-up.php | 81 +++++++++++++++++++ .../fa/auth/multi-factor/app/provider.php | 64 +++++++++++++++ .../multi-factor/email/actions/disable.php | 67 +++++++++++++++ .../multi-factor/email/actions/set-up.php | 67 +++++++++++++++ .../verify-email-authentication.php | 12 +++ .../fa/auth/multi-factor/email/provider.php | 60 ++++++++++++++ ...p-required-multi-factor-authentication.php | 19 +++++ .../recovery-codes-modal-content.php | 27 +++++++ .../notice-of-email-change-request.php | 14 ++++ .../pages/manage-related-records.php | 7 ++ 12 files changed, 566 insertions(+) create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/app/actions/disable.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/app/actions/regenerate-recovery-codes.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/app/actions/set-up.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/app/provider.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/email/actions/disable.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/email/actions/set-up.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/email/notifications/verify-email-authentication.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/email/provider.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php create mode 100644 packages/panels/resources/lang/fa/auth/multi-factor/recovery-codes-modal-content.php create mode 100644 packages/panels/resources/lang/fa/auth/notifications/notice-of-email-change-request.php create mode 100644 packages/panels/resources/lang/fa/resources/pages/manage-related-records.php diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/disable.php b/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/disable.php new file mode 100644 index 0000000000..88f3f74763 --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/disable.php @@ -0,0 +1,71 @@ + 'خاموش کردن', + + 'modal' => [ + + 'heading' => 'غیرفعال کردن اپلیکیشن تأییدکننده', + + 'description' => 'آیا مطمئن هستید که می‌خواهید استفاده از اپلیکیشن تأییدکننده را متوقف کنید؟ با غیرفعال‌سازی، یک لایه امنیتی اضافی از حساب شما حذف خواهد شد.', + + 'form' => [ + + 'code' => [ + + 'label' => 'کد ۶ رقمی اپلیکیشن تأییدکننده را وارد کنید', + + 'validation_attribute' => 'کد', + + 'actions' => [ + + 'use_recovery_code' => [ + 'label' => 'به‌جای آن از کد بازیابی استفاده کنید', + ], + + ], + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + 'recovery_code' => [ + + 'label' => 'یا کد بازیابی را وارد کنید', + + 'validation_attribute' => 'کد بازیابی', + + 'messages' => [ + + 'invalid' => 'کد بازیابی واردشده معتبر نیست.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => 'غیرفعال کردن اپلیکیشن تأییدکننده', + ], + + ], + + ], + + 'notifications' => [ + + 'disabled' => [ + 'title' => 'اپلیکیشن تأییدکننده غیرفعال شد', + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/regenerate-recovery-codes.php b/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/regenerate-recovery-codes.php new file mode 100644 index 0000000000..8e4c8c2470 --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/regenerate-recovery-codes.php @@ -0,0 +1,77 @@ + 'تولید مجدد کدهای بازیابی', + + 'modal' => [ + + 'heading' => 'تولید مجدد کدهای بازیابی اپلیکیشن تأییدکننده', + + 'description' => 'اگر کدهای بازیابی خود را از دست داده‌اید، می‌توانید از اینجا آن‌ها را دوباره تولید کنید. کدهای قدیمی بلافاصله نامعتبر خواهند شد.', + + 'form' => [ + + 'code' => [ + + 'label' => 'کد ۶ رقمی اپلیکیشن تأییدکننده را وارد کنید', + + 'validation_attribute' => 'کد', + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + 'password' => [ + + 'label' => 'یا رمز عبور فعلی خود را وارد کنید', + + 'validation_attribute' => 'رمز عبور', + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => 'تولید مجدد کدهای بازیابی', + ], + + ], + + ], + + 'notifications' => [ + + 'regenerated' => [ + 'title' => 'کدهای جدید بازیابی اپلیکیشن تأییدکننده تولید شدند', + ], + + ], + + 'show_new_recovery_codes' => [ + + 'modal' => [ + + 'heading' => 'کدهای بازیابی جدید', + + 'description' => 'لطفاً کدهای زیر را در جایی امن ذخیره کنید. این کدها فقط یک بار نمایش داده می‌شوند اما در صورت از دست دادن دسترسی به اپلیکیشن تأییدکننده به آن‌ها نیاز خواهید داشت:', + + 'actions' => [ + + 'submit' => [ + 'label' => 'بستن', + ], + + ], + + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/set-up.php b/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/set-up.php new file mode 100644 index 0000000000..91fe44468b --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/app/actions/set-up.php @@ -0,0 +1,81 @@ + 'راه‌اندازی', + + 'modal' => [ + + 'heading' => 'راه‌اندازی اپلیکیشن تأییدکننده', + + 'description' => <<<'BLADE' + برای تکمیل این فرآیند نیاز به یک اپلیکیشن مانند Google Authenticator دارید (iOS، Android). + BLADE, + + 'content' => [ + + 'qr_code' => [ + + 'instruction' => 'این کد QR را با اپلیکیشن تأییدکننده خود اسکن کنید:', + + 'alt' => 'کد QR برای اسکن توسط اپلیکیشن تأییدکننده', + + ], + + 'text_code' => [ + + 'instruction' => 'یا این کد را به‌صورت دستی وارد کنید:', + + 'messages' => [ + 'copied' => 'کپی شد', + ], + + ], + + 'recovery_codes' => [ + + 'instruction' => 'لطفاً کدهای زیر را در جایی امن ذخیره کنید. این کدها فقط یک بار نمایش داده می‌شوند اما در صورت از دست دادن دسترسی به اپلیکیشن تأییدکننده به آن‌ها نیاز خواهید داشت:', + + ], + + ], + + 'form' => [ + + 'code' => [ + + 'label' => 'کد ۶ رقمی اپلیکیشن تأییدکننده را وارد کنید', + + 'validation_attribute' => 'کد', + + 'below_content' => 'شما باید هر بار هنگام ورود یا انجام عملیات حساس، کد ۶ رقمی اپلیکیشن تأییدکننده را وارد کنید.', + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => 'فعال‌سازی اپلیکیشن تأییدکننده', + ], + + ], + + ], + + 'notifications' => [ + + 'enabled' => [ + 'title' => 'اپلیکیشن تأییدکننده فعال شد', + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/app/provider.php b/packages/panels/resources/lang/fa/auth/multi-factor/app/provider.php new file mode 100644 index 0000000000..606a03d5dc --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/app/provider.php @@ -0,0 +1,64 @@ + [ + + 'actions' => [ + + 'label' => 'اپلیکیشن تأییدکننده', + + 'below_content' => 'از یک اپلیکیشن امن برای تولید کد موقت ورود استفاده کنید.', + + 'messages' => [ + 'enabled' => 'فعال', + 'disabled' => 'غیرفعال', + ], + + ], + + ], + + 'login_form' => [ + + 'label' => 'استفاده از کد اپلیکیشن تأییدکننده', + + 'code' => [ + + 'label' => 'کد ۶ رقمی اپلیکیشن تأییدکننده را وارد کنید', + + 'validation_attribute' => 'کد', + + 'actions' => [ + + 'use_recovery_code' => [ + 'label' => 'به‌جای آن از کد بازیابی استفاده کنید', + ], + + ], + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + 'recovery_code' => [ + + 'label' => 'یا کد بازیابی را وارد کنید', + + 'validation_attribute' => 'کد بازیابی', + + 'messages' => [ + + 'invalid' => 'کد بازیابی واردشده معتبر نیست.', + + ], + + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/email/actions/disable.php b/packages/panels/resources/lang/fa/auth/multi-factor/email/actions/disable.php new file mode 100644 index 0000000000..985b17b8d6 --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/email/actions/disable.php @@ -0,0 +1,67 @@ + 'خاموش کردن', + + 'modal' => [ + + 'heading' => 'غیرفعال کردن کدهای تأیید ایمیل', + + 'description' => 'آیا مطمئن هستید که می‌خواهید دریافت کدهای تأیید ایمیل را متوقف کنید؟ با غیرفعال‌سازی، یک لایه امنیتی اضافی از حساب شما حذف خواهد شد.', + + 'form' => [ + + 'code' => [ + + 'label' => 'کد ۶ رقمی ارسال‌شده به ایمیل خود را وارد کنید', + + 'validation_attribute' => 'کد', + + 'actions' => [ + + 'resend' => [ + + 'label' => 'ارسال کد جدید به ایمیل', + + 'notifications' => [ + + 'resent' => [ + 'title' => 'کد جدیدی به ایمیل شما ارسال شد', + ], + + ], + + ], + + ], + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => 'غیرفعال کردن کدهای تأیید ایمیل', + ], + + ], + + ], + + 'notifications' => [ + + 'disabled' => [ + 'title' => 'کدهای تأیید ایمیل غیرفعال شدند', + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/email/actions/set-up.php b/packages/panels/resources/lang/fa/auth/multi-factor/email/actions/set-up.php new file mode 100644 index 0000000000..4402e6db0a --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/email/actions/set-up.php @@ -0,0 +1,67 @@ + 'راه‌اندازی', + + 'modal' => [ + + 'heading' => 'راه‌اندازی کدهای تأیید ایمیل', + + 'description' => 'برای ورود یا انجام عملیات حساس باید هر بار کد ۶ رقمی ارسال‌شده به ایمیل خود را وارد کنید. لطفاً برای تکمیل راه‌اندازی ایمیل خود را بررسی کنید.', + + 'form' => [ + + 'code' => [ + + 'label' => 'کد ۶ رقمی ارسال‌شده به ایمیل خود را وارد کنید', + + 'validation_attribute' => 'کد', + + 'actions' => [ + + 'resend' => [ + + 'label' => 'ارسال کد جدید به ایمیل', + + 'notifications' => [ + + 'resent' => [ + 'title' => 'کد جدیدی به ایمیل شما ارسال شد', + ], + + ], + + ], + + ], + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + ], + + 'actions' => [ + + 'submit' => [ + 'label' => 'فعال‌سازی کدهای تأیید ایمیل', + ], + + ], + + ], + + 'notifications' => [ + + 'enabled' => [ + 'title' => 'کدهای تأیید ایمیل فعال شدند', + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/email/notifications/verify-email-authentication.php b/packages/panels/resources/lang/fa/auth/multi-factor/email/notifications/verify-email-authentication.php new file mode 100644 index 0000000000..0718c25cc6 --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/email/notifications/verify-email-authentication.php @@ -0,0 +1,12 @@ + 'کد ورود شما', + + 'lines' => [ + 'کد ورود شما: :code', + 'این کد تا یک دقیقه معتبر است.|این کد تا :minutes دقیقه معتبر است.', + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/email/provider.php b/packages/panels/resources/lang/fa/auth/multi-factor/email/provider.php new file mode 100644 index 0000000000..2808352115 --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/email/provider.php @@ -0,0 +1,60 @@ + [ + + 'actions' => [ + + 'label' => 'کدهای تأیید ایمیل', + + 'below_content' => 'یک کد موقت به آدرس ایمیل شما ارسال می‌شود تا هنگام ورود هویت شما تأیید شود.', + + 'messages' => [ + 'enabled' => 'فعال', + 'disabled' => 'غیرفعال', + ], + + ], + + ], + + 'login_form' => [ + + 'label' => 'ارسال کد به ایمیل شما', + + 'code' => [ + + 'label' => 'کد ۶ رقمی ارسال‌شده به ایمیل خود را وارد کنید', + + 'validation_attribute' => 'کد', + + 'actions' => [ + + 'resend' => [ + + 'label' => 'ارسال کد جدید به ایمیل', + + 'notifications' => [ + + 'resent' => [ + 'title' => 'کد جدیدی به ایمیل شما ارسال شد', + ], + + ], + + ], + + ], + + 'messages' => [ + + 'invalid' => 'کدی که وارد کرده‌اید معتبر نیست.', + + ], + + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php b/packages/panels/resources/lang/fa/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php new file mode 100644 index 0000000000..34721358dc --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/pages/set-up-required-multi-factor-authentication.php @@ -0,0 +1,19 @@ + 'راه‌اندازی تأیید هویت دو مرحله‌ای (2FA)', + + 'heading' => 'راه‌اندازی تأیید هویت دو مرحله‌ای', + + 'subheading' => 'تأیید هویت دو مرحله‌ای یک لایه امنیتی اضافی به حساب شما اضافه می‌کند و هنگام ورود نیاز به یک روش تأیید دوم خواهد داشت.', + + 'actions' => [ + + 'continue' => [ + 'label' => 'ادامه', + ], + + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/multi-factor/recovery-codes-modal-content.php b/packages/panels/resources/lang/fa/auth/multi-factor/recovery-codes-modal-content.php new file mode 100644 index 0000000000..afad86629d --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/multi-factor/recovery-codes-modal-content.php @@ -0,0 +1,27 @@ + [ + + 'کلیک برای', + + 'copy' => [ + 'label' => 'کپی', + ], + + 'یا', + + 'download' => [ + 'label' => 'دانلود', + ], + + 'تمام کد به صورت یکجا.', + + ], + + 'messages' => [ + 'copied' => 'کپی شد', + ], + +]; diff --git a/packages/panels/resources/lang/fa/auth/notifications/notice-of-email-change-request.php b/packages/panels/resources/lang/fa/auth/notifications/notice-of-email-change-request.php new file mode 100644 index 0000000000..afc5201492 --- /dev/null +++ b/packages/panels/resources/lang/fa/auth/notifications/notice-of-email-change-request.php @@ -0,0 +1,14 @@ + 'در حال تغییر آدرس ایمیل شما', + 'lines' => [ + 'ما درخواستی برای تغییر آدرس ایمیل مرتبط با حساب شما دریافت کردیم. رمز عبور شما برای تأیید این تغییر استفاده شده است.', + 'پس از تأیید، آدرس ایمیل جدید حساب شما خواهد بود: :email.', + 'می‌توانید قبل از تأیید، این تغییر را با کلیک روی دکمه زیر متوقف کنید.', + 'اگر شما این درخواست را ثبت نکرده‌اید، لطفاً فوراً با ما تماس بگیرید.', + ], + 'action' => 'جلوگیری از تغییر ایمیل', + +]; diff --git a/packages/panels/resources/lang/fa/resources/pages/manage-related-records.php b/packages/panels/resources/lang/fa/resources/pages/manage-related-records.php new file mode 100644 index 0000000000..1712e16ee6 --- /dev/null +++ b/packages/panels/resources/lang/fa/resources/pages/manage-related-records.php @@ -0,0 +1,7 @@ + 'مدیریت :label :relationship', + +]; From 3381d31ac7fee48cee23a23c4fb5fe4b2a97b491 Mon Sep 17 00:00:00 2001 From: Erik Gaal Date: Sun, 17 Aug 2025 17:12:10 +0200 Subject: [PATCH 037/154] Update HasState.php --- packages/schemas/src/Concerns/HasState.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/schemas/src/Concerns/HasState.php b/packages/schemas/src/Concerns/HasState.php index f7b6ec0de7..b7f0cfb12a 100644 --- a/packages/schemas/src/Concerns/HasState.php +++ b/packages/schemas/src/Concerns/HasState.php @@ -17,9 +17,9 @@ trait HasState protected string $cachedAbsoluteStatePath; /** - * @var object | array | null + * @var array | object | null */ - protected object | array | null $constantState = null; + protected array | object | null $constantState = null; protected bool | Closure $shouldPartiallyRender = false; @@ -29,9 +29,9 @@ trait HasState protected ?array $dehydratedComponentsCache = null; /** - * @param object | array | null $state + * @param array | object | null $state */ - public function state(object | array | null $state): static + public function state(array | object | null $state): static { $this->constantState($state); @@ -77,7 +77,7 @@ trait HasState } /** - * @param object | array | null $state + * @param array | object | null $state */ public function constantState(array | object | null $state): static { @@ -384,9 +384,9 @@ trait HasState /** * @internal Do not use this method outside the internals of Filament. It is subject to breaking changes in minor and patch releases. * - * @return object | array + * @return array | object */ - public function getConstantState(): object | array + public function getConstantState(): array | object { return $this->constantState ?? $this->getRecord(withParentComponentRecord: false) ?? $this->getParentComponent()?->getContainer()->getConstantState() ?? $this->getRecord() ?? throw new Exception('Schema has no [record()] or [state()] set.'); } From 1b5453432a49268a7d874d6d1aee8e3c36d79d05 Mon Sep 17 00:00:00 2001 From: mohamedsabil83 Date: Mon, 18 Aug 2025 03:38:51 +0300 Subject: [PATCH 038/154] i18n: Missing Arabic translations --- packages/forms/resources/lang/ar/components.php | 6 ++++++ .../lang/ar/resources/pages/edit-record.php | 2 ++ .../resources/pages/manage-related-records.php | 7 +++++++ .../lang/ar/resources/pages/view-record.php | 2 ++ packages/tables/resources/lang/ar/table.php | 17 +++++++++++++++-- 5 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 packages/panels/resources/lang/ar/resources/pages/manage-related-records.php diff --git a/packages/forms/resources/lang/ar/components.php b/packages/forms/resources/lang/ar/components.php index 2ee80f8fe3..e0999f6946 100644 --- a/packages/forms/resources/lang/ar/components.php +++ b/packages/forms/resources/lang/ar/components.php @@ -481,6 +481,7 @@ return [ 'bold' => 'عريض', 'bullet_list' => 'قائمة نقطية', 'clear_formatting' => 'مسح التنسيق', + 'code' => 'كود', 'code_block' => 'نص برمجي', 'custom_blocks' => 'الكتل المخصصة', 'details' => 'التفاصيل', @@ -593,6 +594,11 @@ return [ 'actions' => [ + 'copy' => [ + 'label' => 'نسخ', + 'message' => 'تم النسخ', + ], + 'hide_password' => [ 'label' => 'إخفاء كلمة المرور', ], diff --git a/packages/panels/resources/lang/ar/resources/pages/edit-record.php b/packages/panels/resources/lang/ar/resources/pages/edit-record.php index b8cf65b0bc..f787d5cdca 100644 --- a/packages/panels/resources/lang/ar/resources/pages/edit-record.php +++ b/packages/panels/resources/lang/ar/resources/pages/edit-record.php @@ -6,6 +6,8 @@ return [ 'breadcrumb' => 'تعديل', + 'navigation_label' => 'تعديل', + 'form' => [ 'actions' => [ diff --git a/packages/panels/resources/lang/ar/resources/pages/manage-related-records.php b/packages/panels/resources/lang/ar/resources/pages/manage-related-records.php new file mode 100644 index 0000000000..04a05c50a3 --- /dev/null +++ b/packages/panels/resources/lang/ar/resources/pages/manage-related-records.php @@ -0,0 +1,7 @@ + 'إدارة :label :relationship', + +]; diff --git a/packages/panels/resources/lang/ar/resources/pages/view-record.php b/packages/panels/resources/lang/ar/resources/pages/view-record.php index 2777550955..547b6f68f0 100644 --- a/packages/panels/resources/lang/ar/resources/pages/view-record.php +++ b/packages/panels/resources/lang/ar/resources/pages/view-record.php @@ -6,6 +6,8 @@ return [ 'breadcrumb' => 'عرض', + 'navigation_label' => 'عرض', + 'content' => [ 'tab' => [ diff --git a/packages/tables/resources/lang/ar/table.php b/packages/tables/resources/lang/ar/table.php index 931ee0dcdb..9115de69f3 100644 --- a/packages/tables/resources/lang/ar/table.php +++ b/packages/tables/resources/lang/ar/table.php @@ -26,6 +26,20 @@ return [ 'label' => 'إجراء | إجراءات', ], + 'select' => [ + + 'loading_message' => 'جاري التحميل...', + + 'no_search_results_message' => 'لا توجد خيارات مطابقة لبحثك.', + + 'placeholder' => 'اختر', + + 'searching_message' => 'جاري البحث...', + + 'search_prompt' => 'ابدأ الكتابة للبحث...', + + ], + 'text' => [ 'actions' => [ @@ -186,7 +200,6 @@ return [ 'group' => [ 'label' => 'تجميع حسب', - 'placeholder' => 'تجميع حسب', ], 'direction' => [ @@ -247,6 +260,6 @@ return [ ], - 'default_model_label' => 'سِجِلّ', + 'default_model_label' => 'سجل', ]; From 5f1571823cdb3ac08f84e7739e4c98ac463015c7 Mon Sep 17 00:00:00 2001 From: mohamedsabil83 Date: Mon, 18 Aug 2025 00:50:33 +0000 Subject: [PATCH 039/154] chore: fix code style --- packages/actions/resources/lang/nb/import.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/actions/resources/lang/nb/import.php b/packages/actions/resources/lang/nb/import.php index 7019d849b8..e86122b9f2 100644 --- a/packages/actions/resources/lang/nb/import.php +++ b/packages/actions/resources/lang/nb/import.php @@ -11,12 +11,12 @@ return [ 'form' => [ 'file' => [ - 'label' => 'Fil', - 'placeholder' => 'Last opp en CSV fil', - 'rules' => [ - 'duplicate_columns' => '{0} Filen kan ikke inneholde mer enn én tom kolonneoverskrift.|{1,*} Filen kan ikke inneholde dupliserte kolonneoverskrifter: :columns.', - ], + 'label' => 'Fil', + 'placeholder' => 'Last opp en CSV fil', + 'rules' => [ + 'duplicate_columns' => '{0} Filen kan ikke inneholde mer enn én tom kolonneoverskrift.|{1,*} Filen kan ikke inneholde dupliserte kolonneoverskrifter: :columns.', ], + ], 'columns' => [ 'label' => 'Kolonner', From db1c6e10bffb01a6fadf5a4fa26b5c7e4663dc65 Mon Sep 17 00:00:00 2001 From: Vittorio Simoni <96138792+TheSkybreaker@users.noreply.github.com> Date: Mon, 18 Aug 2025 10:05:02 +0200 Subject: [PATCH 040/154] $isDisabled as variable --- .../forms/resources/views/components/rich-editor.blade.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/forms/resources/views/components/rich-editor.blade.php b/packages/forms/resources/views/components/rich-editor.blade.php index 660849de2c..672b6c9b81 100644 --- a/packages/forms/resources/views/components/rich-editor.blade.php +++ b/packages/forms/resources/views/components/rich-editor.blade.php @@ -3,10 +3,11 @@ $id = $getId(); $statePath = $getStatePath(); + $isDisabled = $isDisabled(); @endphp - @if ($isDisabled()) + @if ($isDisabled)
Date: Mon, 18 Aug 2025 11:46:58 +0200 Subject: [PATCH 041/154] Update InteractsWithToolbarButtons.php $toolbarButtons is initial `null`, that throws an error on array_reduce(). Adding `$this->toolbarButtons ?? []`on line 34 solves the issue. --- .../src/Components/Concerns/InteractsWithToolbarButtons.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php b/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php index cd348cdaba..54dfce89b9 100644 --- a/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php +++ b/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php @@ -31,7 +31,7 @@ trait InteractsWithToolbarButtons } $this->toolbarButtons = array_reduce( - $this->toolbarButtons, + $this->toolbarButtons ?? [], function ($carry, $button) use ($buttonsToDisable) { if (is_array($button)) { $carry[] = array_values(array_filter( From 561d6fadf87d12cb33935d91ce5a703bc64f5207 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 18 Aug 2025 10:47:59 +0100 Subject: [PATCH 042/154] Update 02-form.md --- docs/12-components/02-form.md | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/docs/12-components/02-form.md b/docs/12-components/02-form.md index c1087b42fb..67c7c2cb53 100644 --- a/docs/12-components/02-form.md +++ b/docs/12-components/02-form.md @@ -246,25 +246,17 @@ public function form(Schema $schema): Schema ## Using multiple forms -By default, the `InteractsWithSchemas` trait only handles one form per Livewire component - `form()`. To add more forms to the Livewire component, you can define them in the `getForms()` method, and return an array containing the name of each form: - -```php -protected function getForms(): array -{ - return [ - 'editPostForm', - 'createCommentForm', - ]; -} -``` - -Each of these forms can now be defined within the Livewire component, using a method with the same name: +Many forms can be defined using the `InteractsWithSchemas` trait. Each of the forms should use a method with the same name: ```php use Filament\Forms\Components\MarkdownEditor; use Filament\Forms\Components\TextInput; use Filament\Schemas\Schema; +public ?array $postData = []; + +public ?array $commentData = []; + public function editPostForm(Schema $schema): Schema { return $schema @@ -298,12 +290,7 @@ public function createCommentForm(Schema $schema): Schema Now, each form is addressable by its name instead of `form`. For example, to fill the post form, you can use `$this->editPostForm->fill([...])`, or to get the data from the comment form you can use `$this->createCommentForm->getState()`. -You'll notice that each form has its own unique `statePath()`. Each form will write its state to a different array on your Livewire component, so it's important to define these: - -```php -public ?array $postData = []; -public ?array $commentData = []; -``` +You'll notice that each form has its own unique `statePath()`. Each form will write its state to a different array on your Livewire component, so it's important to define the public properties, `$postData` and `$commentData` in this example. ## Resetting a form's data From a2945f1b2ea0e6e50a881e8a582a3b6b8e3578a8 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 18 Aug 2025 10:52:18 +0100 Subject: [PATCH 043/154] Update InteractsWithToolbarButtons.php --- .../src/Components/Concerns/InteractsWithToolbarButtons.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php b/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php index 54dfce89b9..1bdad1b80c 100644 --- a/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php +++ b/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php @@ -60,7 +60,7 @@ trait InteractsWithToolbarButtons } $this->toolbarButtons = [ - ...$this->toolbarButtons, + ...$this->toolbarButtons ?? [], ...$buttonsToEnable, ]; From fae8d64f832ad4447a978438bbd3abb81f01ffac Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 18 Aug 2025 10:54:38 +0100 Subject: [PATCH 044/154] Update MakeThemeCommand.php --- packages/panels/src/Commands/MakeThemeCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/panels/src/Commands/MakeThemeCommand.php b/packages/panels/src/Commands/MakeThemeCommand.php index 0dfb3cec6a..3be77f0ab0 100644 --- a/packages/panels/src/Commands/MakeThemeCommand.php +++ b/packages/panels/src/Commands/MakeThemeCommand.php @@ -94,7 +94,7 @@ class MakeThemeCommand extends Command $this->components->warn('Action is required to complete the theme setup:'); $this->components->bulletList([ - "First, add a new item to the `input` array under the Laravel plugin in `vite.config.js`: `resources/css/filament/{$this->panel->getId()}/theme.css`.", + "First, add a new item to the Laravel plugin's `input` array in `vite.config.js`: `resources/css/filament/{$this->panel->getId()}/theme.css`.", "Next, register the theme in the {$this->panel->getId()} panel provider using `->viteTheme('resources/css/filament/{$this->panel->getId()}/theme.css')`", "Finally, run `{$this->pm} run build` to compile the theme.", ]); From 431215aa9520365f404379c9f3a1d43191b935db Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 18 Aug 2025 10:54:54 +0100 Subject: [PATCH 045/154] Update 01-overview.md --- docs/08-styling/01-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/08-styling/01-overview.md b/docs/08-styling/01-overview.md index fa1a9dbc3d..eeb515979c 100644 --- a/docs/08-styling/01-overview.md +++ b/docs/08-styling/01-overview.md @@ -130,7 +130,7 @@ php artisan make:filament-theme --pm=bun This command generates a CSS file in the `resources/css/filament` directory. -Add the theme's CSS file to the input array under the Laravel plugin in `vite.config.js`: +Add the theme's CSS file to the Laravel plugin's `input` array in `vite.config.js`: ```js input: [ From 1d800af4aad954eecf63c5ae41387f6bf5570775 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 18 Aug 2025 10:55:16 +0100 Subject: [PATCH 046/154] Update 01-overview.md --- docs/08-styling/01-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/08-styling/01-overview.md b/docs/08-styling/01-overview.md index eeb515979c..5531f61956 100644 --- a/docs/08-styling/01-overview.md +++ b/docs/08-styling/01-overview.md @@ -130,7 +130,7 @@ php artisan make:filament-theme --pm=bun This command generates a CSS file in the `resources/css/filament` directory. -Add the theme's CSS file to the Laravel plugin's `input` array in `vite.config.js`: +Add the theme's CSS file to the Laravel plugin's `input` array in `vite.config.js`: ```js input: [ From cdbf4f9b32632b4d4f8eed9e5f2d0f45e1f86c4e Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 18 Aug 2025 11:09:50 +0100 Subject: [PATCH 047/154] fix: Page expired notifications loop --- .../resources/views/components/page/index.blade.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/panels/resources/views/components/page/index.blade.php b/packages/panels/resources/views/components/page/index.blade.php index 4fb061fa6b..1a28e446bf 100644 --- a/packages/panels/resources/views/components/page/index.blade.php +++ b/packages/panels/resources/views/components/page/index.blade.php @@ -167,8 +167,16 @@ From 2470217b4def6062dfb0e0274473c0901a72d35b Mon Sep 17 00:00:00 2001 From: Janis Eglitis Date: Tue, 26 Aug 2025 17:57:13 +0300 Subject: [PATCH 153/154] Update request-password-reset.php Added missing notifications.sent in request-password-reset.php --- .../lv/auth/pages/password-reset/request-password-reset.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/panels/resources/lang/lv/auth/pages/password-reset/request-password-reset.php b/packages/panels/resources/lang/lv/auth/pages/password-reset/request-password-reset.php index b34fbd8aa6..3f68fd62d8 100644 --- a/packages/panels/resources/lang/lv/auth/pages/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/lv/auth/pages/password-reset/request-password-reset.php @@ -32,6 +32,10 @@ return [ 'notifications' => [ + 'sent' => [ + 'body' => 'Jūs saņemsiet e-pastu, ja Jūsu konts eksistē.', + ], + 'throttled' => [ 'title' => 'Pārāk daudz mēģinājumu', 'body' => 'Lūdzu, mēģiniet vēlreiz pēc :seconds sekundēm.', From ee2af89f8b7e60a10bc95f1e9e945f5b9aba99ab Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Wed, 27 Aug 2025 10:48:51 +0100 Subject: [PATCH 154/154] cs --- .../resources/views/components/page/index.blade.php | 8 ++++++-- packages/support/resources/js/sortable.js | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/panels/resources/views/components/page/index.blade.php b/packages/panels/resources/views/components/page/index.blade.php index a0a05355af..9af17e0592 100644 --- a/packages/panels/resources/views/components/page/index.blade.php +++ b/packages/panels/resources/views/components/page/index.blade.php @@ -170,8 +170,12 @@ Livewire.hook('request', ({ payload, fail }) => { fail(({ status, preventDefault }) => { if (JSON.parse(payload).components.length === 1) { - for (const component of JSON.parse(payload).components) { - if (JSON.parse(component.snapshot).data.isFilamentNotificationsComponent) { + for (const component of JSON.parse(payload) + .components) { + if ( + JSON.parse(component.snapshot).data + .isFilamentNotificationsComponent + ) { return } } diff --git a/packages/support/resources/js/sortable.js b/packages/support/resources/js/sortable.js index 912f0a3d14..6252f75c7e 100644 --- a/packages/support/resources/js/sortable.js +++ b/packages/support/resources/js/sortable.js @@ -22,7 +22,8 @@ export default (Alpine) => { const { item: draggedNode, to: parentNode, newIndex } = event const draggableSelector = this.options.draggable - const previousNode = parentNode.querySelectorAll(draggableSelector)[newIndex - 1] + const previousNode = + parentNode.querySelectorAll(draggableSelector)[newIndex - 1] if (previousNode) { parentNode.insertBefore(
+ @php + $counter++; + + $componentStatePath = null; + $canUseAlpineIntegration = false; + + try { + $name = $component->getName(); + $componentStatePath = $component->getStatePath(); + $canUseAlpineIntegration = filled($componentStatePath) && $component->getLivewire(); + } catch (\Exception $e) { + $canUseAlpineIntegration = false; + } + @endphp + getAfterStateUpdatedJs())) + x-init="{{ implode(';', array_map( + fn (string $js): string => '$wire.watch(' . \Illuminate\Support\Js::from($componentStatePath) . ', ($state, $old) => ($state !== undefined) && eval(' . \Illuminate\Support\Js::from($js) . '))', + $afterStateUpdatedJs, + )) }}" + @endif + @endif + > {{ $component }}