From c1f268c8b27e2ca9549cbe2d37350ebf1b173229 Mon Sep 17 00:00:00 2001 From: Igor Clauss Date: Wed, 30 Jul 2025 10:28:25 +0200 Subject: [PATCH 01/20] Add missing DE translation to request-password-reset.php --- .../de/pages/auth/password-reset/request-password-reset.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php b/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php index 1f3a49b508..dcfacdf5e9 100644 --- a/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php @@ -31,6 +31,10 @@ return [ ], 'notifications' => [ + 'sent' => [ + 'body' => 'Wenn Ihr Konto nicht existiert, erhalten Sie keine E-Mail.', + ], + 'throttled' => [ 'title' => 'Zu viele Versuche.', From f3b2599693436d828f6240b7888448cd81537a94 Mon Sep 17 00:00:00 2001 From: Ali Salehi <111766206+alisalehi1380@users.noreply.github.com> Date: Sun, 3 Aug 2025 16:14:26 +0330 Subject: [PATCH 02/20] Update register.php --- packages/panels/resources/lang/fa/pages/auth/register.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/panels/resources/lang/fa/pages/auth/register.php b/packages/panels/resources/lang/fa/pages/auth/register.php index 1693f76a7b..162f29c5cc 100644 --- a/packages/panels/resources/lang/fa/pages/auth/register.php +++ b/packages/panels/resources/lang/fa/pages/auth/register.php @@ -10,7 +10,7 @@ return [ 'login' => [ 'before' => 'یا', - 'label' => 'وارد حساب خود شوید.', + 'label' => 'وارد حساب خود شوید', ], ], From c1f122b80e9986c60b113b97768f617753e8f36a Mon Sep 17 00:00:00 2001 From: Ali Salehi <111766206+alisalehi1380@users.noreply.github.com> Date: Sun, 3 Aug 2025 16:30:31 +0330 Subject: [PATCH 03/20] Update register.php --- packages/panels/resources/lang/fa/pages/auth/register.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/panels/resources/lang/fa/pages/auth/register.php b/packages/panels/resources/lang/fa/pages/auth/register.php index 162f29c5cc..303090ead9 100644 --- a/packages/panels/resources/lang/fa/pages/auth/register.php +++ b/packages/panels/resources/lang/fa/pages/auth/register.php @@ -10,7 +10,7 @@ return [ 'login' => [ 'before' => 'یا', - 'label' => 'وارد حساب خود شوید', + 'label' => 'ورود به حساب کاربری', ], ], From 8d62f95b66cd8c4093b877c41031ff0314c9551f Mon Sep 17 00:00:00 2001 From: Ali Salehi <111766206+alisalehi1380@users.noreply.github.com> Date: Sun, 3 Aug 2025 17:16:47 +0330 Subject: [PATCH 04/20] add return type in wrapInDatabaseTransaction to Register page --- packages/panels/src/Pages/Auth/Register.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/panels/src/Pages/Auth/Register.php b/packages/panels/src/Pages/Auth/Register.php index 1c52d44af6..e9aca6afc2 100644 --- a/packages/panels/src/Pages/Auth/Register.php +++ b/packages/panels/src/Pages/Auth/Register.php @@ -25,6 +25,7 @@ use Illuminate\Contracts\Support\Htmlable; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules\Password; +use Illuminate\Database\Eloquent\Model; /** * @property Form $form @@ -70,7 +71,7 @@ class Register extends SimplePage return null; } - $user = $this->wrapInDatabaseTransaction(function () { + $user = $this->wrapInDatabaseTransaction(function (): Model { $this->callHook('beforeValidate'); $data = $this->form->getState(); From ac0a8c5881662c713925f4df15452d0809c90638 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Mon, 4 Aug 2025 08:54:28 +0100 Subject: [PATCH 05/20] Update Register.php --- packages/panels/src/Pages/Auth/Register.php | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/panels/src/Pages/Auth/Register.php b/packages/panels/src/Pages/Auth/Register.php index e9aca6afc2..f78dc814e7 100644 --- a/packages/panels/src/Pages/Auth/Register.php +++ b/packages/panels/src/Pages/Auth/Register.php @@ -25,7 +25,6 @@ use Illuminate\Contracts\Support\Htmlable; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Hash; use Illuminate\Validation\Rules\Password; -use Illuminate\Database\Eloquent\Model; /** * @property Form $form From 14b3a46c165b1b561c51e478660888b14b666271 Mon Sep 17 00:00:00 2001 From: Kevin Winardi <145827247+KevinWinardi@users.noreply.github.com> Date: Tue, 5 Aug 2025 13:32:58 +0700 Subject: [PATCH 06/20] fix: EditAction gray color in ActionGroup If use an EditAction inside an ActionGroup, its color will be gray, the same as the ViewAction default color. Apparently, there's a line of code missing in the EditAction.php file for $this->defaultColor('warning'). --- packages/tables/src/Actions/EditAction.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/tables/src/Actions/EditAction.php b/packages/tables/src/Actions/EditAction.php index 90f310e6ba..b9ac364268 100644 --- a/packages/tables/src/Actions/EditAction.php +++ b/packages/tables/src/Actions/EditAction.php @@ -33,6 +33,8 @@ class EditAction extends Action $this->successNotificationTitle(__('filament-actions::edit.single.notifications.saved.title')); + $this->defaultColor('warning'); + $this->icon(FilamentIcon::resolve('actions::edit-action') ?? 'heroicon-m-pencil-square'); $this->fillForm(function (Model $record, Table $table): array { From 48cfa5b14e716ce3eb21f2d83689603dd6fdb3c5 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Tue, 5 Aug 2025 09:32:50 +0100 Subject: [PATCH 07/20] Update EditAction.php --- packages/tables/src/Actions/EditAction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tables/src/Actions/EditAction.php b/packages/tables/src/Actions/EditAction.php index b9ac364268..d3d55097b9 100644 --- a/packages/tables/src/Actions/EditAction.php +++ b/packages/tables/src/Actions/EditAction.php @@ -33,7 +33,7 @@ class EditAction extends Action $this->successNotificationTitle(__('filament-actions::edit.single.notifications.saved.title')); - $this->defaultColor('warning'); + $this->defaultColor('primary'); $this->icon(FilamentIcon::resolve('actions::edit-action') ?? 'heroicon-m-pencil-square'); From 9542e4fc0bccacd4528a3a7a5c76403b4a69bb3a Mon Sep 17 00:00:00 2001 From: elmergustavo Date: Tue, 5 Aug 2025 21:57:27 +0000 Subject: [PATCH 08/20] chore: fix code style --- .../lang/de/pages/auth/password-reset/request-password-reset.php | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php b/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php index dcfacdf5e9..95f3f6c41e 100644 --- a/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/de/pages/auth/password-reset/request-password-reset.php @@ -34,7 +34,6 @@ return [ 'sent' => [ 'body' => 'Wenn Ihr Konto nicht existiert, erhalten Sie keine E-Mail.', ], - 'throttled' => [ 'title' => 'Zu viele Versuche.', From 73d5341e99e4c8ec931a50d03385f960d6b0d805 Mon Sep 17 00:00:00 2001 From: Aurel Demiri <30560661+AurelDemiri@users.noreply.github.com> Date: Wed, 6 Aug 2025 16:24:10 +0200 Subject: [PATCH 09/20] add missing Dutch translation: request-password-reset.notifications.sent.body --- .../nl/pages/auth/password-reset/request-password-reset.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/panels/resources/lang/nl/pages/auth/password-reset/request-password-reset.php b/packages/panels/resources/lang/nl/pages/auth/password-reset/request-password-reset.php index e210600fcd..e9818d100d 100644 --- a/packages/panels/resources/lang/nl/pages/auth/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/nl/pages/auth/password-reset/request-password-reset.php @@ -32,6 +32,10 @@ return [ 'notifications' => [ + 'sent' => [ + 'body' => 'Als uw account niet bestaat, ontvangt u de e-mail niet.', + ], + 'throttled' => [ 'title' => 'Te veel pogingen', 'body' => 'Probeer het opnieuw over :seconds seconden.', From c08a749e22087d2e37b81fc568bcaa51272aa999 Mon Sep 17 00:00:00 2001 From: Maytham Mahdi Date: Fri, 8 Aug 2025 08:12:36 +0300 Subject: [PATCH 10/20] Fix PostgreSQL JSON field search syntax error - Add check for existing ->> operator before processing JSON paths - Prevents malformed SQL generation that caused syntax errors - Fixes regression introduced in v3.3.31 - Resolves issue #17237 The fix ensures that PostgreSQL JSON field searches generate valid SQL by properly handling cases where the ->> operator is already present in the column expression. --- packages/support/src/helpers.php | 46 +++++++++++++++++--------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/packages/support/src/helpers.php b/packages/support/src/helpers.php index e0362a5f6a..164f958383 100644 --- a/packages/support/src/helpers.php +++ b/packages/support/src/helpers.php @@ -165,28 +165,32 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { $column = match ($driverName) { 'pgsql' => ( - str($column)->contains('->') - ? ( - // Handle `table.field` part with double quotes - str($column) - ->before('->') - ->explode('.') - ->map(fn (string $part): string => (string) str($part)->wrap('"')) - ->implode('.') - ) . collect(str($column)->after('->')->explode('->')) // Handle JSON path parts - ->map(function ($segment, $index) use ($column): string { - $totalParts = substr_count($column, '->'); + str($column)->contains('->>') + ? $column + : ( + str($column)->contains('->') + ? ( + // Handle `table.field` part with double quotes + str($column) + ->before('->') + ->explode('.') + ->map(fn (string $part): string => (string) str($part)->wrap('"')) + ->implode('.') + ).collect(str($column)->after('->')->explode('->')) // Handle JSON path parts + ->map(function ($segment, $index) use ($column): string { + $totalParts = substr_count($column, '->'); - return ($index === ($totalParts - 1)) - ? "->>'{$segment}'" - : "->'{$segment}'"; - }) - ->implode('') - : str($column) - ->explode('.') - ->map(fn (string $part): string => (string) str($part)->wrap('"')) - ->implode('.') - ) . '::text', + return ($index === ($totalParts - 1)) + ? "->>'{$segment}'" + : "->'{$segment}'"; + }) + ->implode('') + : str($column) + ->explode('.') + ->map(fn (string $part): string => (string) str($part)->wrap('"')) + ->implode('.') + ) + ).'::text', default => $column, }; From f11c00a282a6f464f0ad0dd8807bfe6472e9f520 Mon Sep 17 00:00:00 2001 From: Maytham Mahdi Date: Fri, 8 Aug 2025 08:13:51 +0300 Subject: [PATCH 11/20] Apply code style fixes to PostgreSQL JSON search fix --- packages/support/src/helpers.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/support/src/helpers.php b/packages/support/src/helpers.php index 164f958383..07422f0e0e 100644 --- a/packages/support/src/helpers.php +++ b/packages/support/src/helpers.php @@ -176,7 +176,7 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { ->explode('.') ->map(fn (string $part): string => (string) str($part)->wrap('"')) ->implode('.') - ).collect(str($column)->after('->')->explode('->')) // Handle JSON path parts + ) . collect(str($column)->after('->')->explode('->')) // Handle JSON path parts ->map(function ($segment, $index) use ($column): string { $totalParts = substr_count($column, '->'); @@ -190,7 +190,7 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { ->map(fn (string $part): string => (string) str($part)->wrap('"')) ->implode('.') ) - ).'::text', + ) . '::text', default => $column, }; From 6ed167d69d9f24f324b467c69239f801a1f80846 Mon Sep 17 00:00:00 2001 From: Maytham Mahdi Date: Fri, 8 Aug 2025 08:58:41 +0300 Subject: [PATCH 12/20] Add test cases for PostgreSQL columns with existing ->> operator - Test basic columns with ->> operator (e.g., name->>'ar') - Test table-prefixed columns with ->> operator (e.g., products.name->>'en') - Test relationship columns with ->> operator (e.g., categories.name->>'ar') - Test nested relationship columns with ->> operator (e.g., categories.parent.name->>'en') These tests ensure our fix properly handles cases where the ->> operator is already present in the column expression, preventing double-processing and malformed SQL generation. --- tests/src/Support/helpersTest.php | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/src/Support/helpersTest.php b/tests/src/Support/helpersTest.php index fb9f27ba7e..048812e85d 100644 --- a/tests/src/Support/helpersTest.php +++ b/tests/src/Support/helpersTest.php @@ -112,3 +112,67 @@ it('will generate a column expression for Postgres with colons in the table name ['blog:posts.title', 'lower("blog:posts"."title"::text)'], ['blog:posts:comments.author.name', 'lower("blog:posts:comments"."author"."name"::text)'], ]); + +it('will handle PostgreSQL columns that already contain ->> operator', function () { + $column = 'name->>\'ar\''; + $isSearchForcedCaseInsensitive = true; + + $databaseConnection = Mockery::mock(Connection::class); + $databaseConnection->shouldReceive('getDriverName')->andReturn('pgsql'); + $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); + + $grammar = new PostgresGrammar($databaseConnection); + + $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); + + expect($expression->getValue($grammar)) + ->toBe("lower(name->>'ar'::text)"); +}); + +it('will handle PostgreSQL columns with table prefix that already contain ->> operator', function () { + $column = 'products.name->>\'en\''; + $isSearchForcedCaseInsensitive = true; + + $databaseConnection = Mockery::mock(Connection::class); + $databaseConnection->shouldReceive('getDriverName')->andReturn('pgsql'); + $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); + + $grammar = new PostgresGrammar($databaseConnection); + + $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); + + expect($expression->getValue($grammar)) + ->toBe("lower(products.name->>'en'::text)"); +}); + +it('will handle PostgreSQL columns from relationships that already contain ->> operator', function () { + $column = 'categories.name->>\'ar\''; + $isSearchForcedCaseInsensitive = true; + + $databaseConnection = Mockery::mock(Connection::class); + $databaseConnection->shouldReceive('getDriverName')->andReturn('pgsql'); + $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); + + $grammar = new PostgresGrammar($databaseConnection); + + $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); + + expect($expression->getValue($grammar)) + ->toBe("lower(categories.name->>'ar'::text)"); +}); + +it('will handle PostgreSQL columns from nested relationships that already contain ->> operator', function () { + $column = 'categories.parent.name->>\'en\''; + $isSearchForcedCaseInsensitive = true; + + $databaseConnection = Mockery::mock(Connection::class); + $databaseConnection->shouldReceive('getDriverName')->andReturn('pgsql'); + $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); + + $grammar = new PostgresGrammar($databaseConnection); + + $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); + + expect($expression->getValue($grammar)) + ->toBe("lower(categories.parent.name->>'en'::text)"); +}); From 7a0411a1a5e5d00b3f9d2e28fd5651e2e30cd52f Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Fri, 8 Aug 2025 08:27:40 +0100 Subject: [PATCH 13/20] Update README.md --- packages/spatie-laravel-translatable-plugin/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/spatie-laravel-translatable-plugin/README.md b/packages/spatie-laravel-translatable-plugin/README.md index 48fc07e62b..6c5c72548c 100644 --- a/packages/spatie-laravel-translatable-plugin/README.md +++ b/packages/spatie-laravel-translatable-plugin/README.md @@ -1,3 +1,6 @@ +> [!IMPORTANT] +> This plugin is now maintained by Lara Zeus: https://github.com/lara-zeus/translatable + # Filament Spatie Translatable Plugin ## Installation From 537a183c64f9d73d8de28245dac185bb4ed8d2d1 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Fri, 8 Aug 2025 09:33:53 +0100 Subject: [PATCH 14/20] Update helpers.php --- packages/panels/src/helpers.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/panels/src/helpers.php b/packages/panels/src/helpers.php index 1c312932c0..82722a623c 100644 --- a/packages/panels/src/helpers.php +++ b/packages/panels/src/helpers.php @@ -6,6 +6,7 @@ use Filament\Facades\Filament; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Auth\Access\Response; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Gate; if (! function_exists('Filament\authorize')) { @@ -17,7 +18,7 @@ if (! function_exists('Filament\authorize')) { $user = Filament::auth()->user(); if (! $shouldCheckPolicyExistence) { - return Gate::forUser($user)->authorize($action, $model); + return Gate::forUser($user)->authorize($action, Arr::wrap($model)); } $policy = Gate::getPolicyFor($model); @@ -44,6 +45,6 @@ if (! function_exists('Filament\authorize')) { return $response->authorize(); } - return Gate::forUser($user)->authorize($action, $model); + return Gate::forUser($user)->authorize($action, Arr::wrap($model)); } } From 43e3f7f995c6369b0f470817ee93911824f5ecc4 Mon Sep 17 00:00:00 2001 From: Pjotr van der Horst Date: Fri, 8 Aug 2025 12:11:21 +0200 Subject: [PATCH 15/20] fix helper text color in dark mode --- .../views/components/field-wrapper/helper-text.blade.php | 2 +- .../views/components/entry-wrapper/helper-text.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php b/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php index a8e1ec60b5..a7f2fcc5e3 100644 --- a/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php +++ b/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php @@ -1,5 +1,5 @@
class(['fi-fo-field-wrp-helper-text break-words text-sm text-gray-500']) }} + {{ $attributes->class(['fi-fo-field-wrp-helper-text break-words text-sm text-gray-500 dark:text-gray-400']) }} > {{ $slot }}
diff --git a/packages/infolists/resources/views/components/entry-wrapper/helper-text.blade.php b/packages/infolists/resources/views/components/entry-wrapper/helper-text.blade.php index b8ea4bea6a..1453669af9 100644 --- a/packages/infolists/resources/views/components/entry-wrapper/helper-text.blade.php +++ b/packages/infolists/resources/views/components/entry-wrapper/helper-text.blade.php @@ -1,5 +1,5 @@
class(['fi-in-entry-wrp-helper-text break-words text-sm text-gray-500']) }} + {{ $attributes->class(['fi-in-entry-wrp-helper-text break-words text-sm text-gray-500 dark:text-gray-400']) }} > {{ $slot }}
From cb3aa5d02032331dff724547f7909bd4b4f782ff Mon Sep 17 00:00:00 2001 From: Pjotr van der Horst Date: Fri, 8 Aug 2025 12:48:15 +0200 Subject: [PATCH 16/20] fix hint label color in dark mode --- .../resources/views/components/field-wrapper/hint.blade.php | 2 +- .../resources/views/components/entry-wrapper/hint.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/forms/resources/views/components/field-wrapper/hint.blade.php b/packages/forms/resources/views/components/field-wrapper/hint.blade.php index 4555abbd56..82ab10d808 100644 --- a/packages/forms/resources/views/components/field-wrapper/hint.blade.php +++ b/packages/forms/resources/views/components/field-wrapper/hint.blade.php @@ -17,7 +17,7 @@ @class([ 'fi-fo-field-wrp-hint-label', match ($color) { - 'gray' => 'text-gray-500', + 'gray' => 'text-gray-500 dark:text-gray-400', default => 'fi-color-custom text-custom-600 dark:text-custom-400', }, is_string($color) ? "fi-color-{$color}" : null, diff --git a/packages/infolists/resources/views/components/entry-wrapper/hint.blade.php b/packages/infolists/resources/views/components/entry-wrapper/hint.blade.php index d13075c9b5..4d43399107 100644 --- a/packages/infolists/resources/views/components/entry-wrapper/hint.blade.php +++ b/packages/infolists/resources/views/components/entry-wrapper/hint.blade.php @@ -17,7 +17,7 @@ @class([ 'fi-in-entry-wrp-hint-label', match ($color) { - 'gray' => 'text-gray-500', + 'gray' => 'text-gray-500 dark:text-gray-400', default => 'fi-color-custom text-custom-600 dark:text-custom-400', }, is_string($color) ? "fi-color-{$color}" : null, From 64728002470ed09f45d4569ab65ad9b82eddc27f Mon Sep 17 00:00:00 2001 From: Kevin Winardi <145827247+KevinWinardi@users.noreply.github.com> Date: Fri, 8 Aug 2025 18:37:24 +0700 Subject: [PATCH 17/20] chore(i18n): add missing translation --- .../id/pages/auth/password-reset/request-password-reset.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php b/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php index 4f9bc89eef..99ecda105f 100644 --- a/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php @@ -32,6 +32,10 @@ return [ 'notifications' => [ + 'sent' => [ + 'body' => 'Jika akun Anda tidak ada, Anda tidak akan menerima email.', + ], + 'throttled' => [ 'title' => 'Terlalu banyak permintaan', 'body' => 'Silakan coba lagi dalam :seconds detik.', From ab315c7e4be089feb3c6504e710b904f543ca931 Mon Sep 17 00:00:00 2001 From: elmergustavo Date: Fri, 8 Aug 2025 21:50:56 +0000 Subject: [PATCH 18/20] chore: fix code style --- .../id/pages/auth/password-reset/request-password-reset.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php b/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php index 99ecda105f..7d77e7ab87 100644 --- a/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/id/pages/auth/password-reset/request-password-reset.php @@ -35,7 +35,7 @@ return [ 'sent' => [ 'body' => 'Jika akun Anda tidak ada, Anda tidak akan menerima email.', ], - + 'throttled' => [ 'title' => 'Terlalu banyak permintaan', 'body' => 'Silakan coba lagi dalam :seconds detik.', From 282d9a23496fd0627d824d91a67f51faebccdded Mon Sep 17 00:00:00 2001 From: Maytham Mahdi Date: Sun, 10 Aug 2025 15:03:57 +0300 Subject: [PATCH 19/20] Refactor PostgreSQL JSON search column expression handling - Simplified logic for processing columns with existing ->> operator. - Updated tests to reflect changes in column expression generation, ensuring proper handling of explicit ->> operator and nested JSON paths. - Improved clarity in test descriptions for better understanding of functionality. --- packages/support/src/helpers.php | 18 +++++++++++----- tests/src/Support/helpersTest.php | 34 ++++++++----------------------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/packages/support/src/helpers.php b/packages/support/src/helpers.php index 07422f0e0e..d50a539e22 100644 --- a/packages/support/src/helpers.php +++ b/packages/support/src/helpers.php @@ -165,10 +165,7 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { $column = match ($driverName) { 'pgsql' => ( - str($column)->contains('->>') - ? $column - : ( - str($column)->contains('->') + str($column)->contains('->') ? ( // Handle `table.field` part with double quotes str($column) @@ -178,6 +175,18 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { ->implode('.') ) . collect(str($column)->after('->')->explode('->')) // Handle JSON path parts ->map(function ($segment, $index) use ($column): string { + // if segment already contains '>something' (from ->> operator), preserve it + $isExplicitOperatorPrefixed = str($segment)->startsWith('>'); + $segment = $isExplicitOperatorPrefixed ? (string) str($segment)->after('>') : $segment; + + // Remove single quotes from segment if present to avoid redundant quoting + $isWrappedWithSingleQuotes = str($segment)->startsWith("'") && str($segment)->endsWith("'"); + $segment = $isWrappedWithSingleQuotes ? (string) str($segment)->trim("'") : $segment; + + if ($isExplicitOperatorPrefixed) { + return "->>'{$segment}'"; + } + $totalParts = substr_count($column, '->'); return ($index === ($totalParts - 1)) @@ -189,7 +198,6 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { ->explode('.') ->map(fn (string $part): string => (string) str($part)->wrap('"')) ->implode('.') - ) ) . '::text', default => $column, }; diff --git a/tests/src/Support/helpersTest.php b/tests/src/Support/helpersTest.php index 048812e85d..e26449a189 100644 --- a/tests/src/Support/helpersTest.php +++ b/tests/src/Support/helpersTest.php @@ -113,8 +113,8 @@ it('will generate a column expression for Postgres with colons in the table name ['blog:posts:comments.author.name', 'lower("blog:posts:comments"."author"."name"::text)'], ]); -it('will handle PostgreSQL columns that already contain ->> operator', function () { - $column = 'name->>\'ar\''; +it('will generate a JSON search column expression for Postgres with explicit ->> operator', function () { + $column = 'data->>name'; $isSearchForcedCaseInsensitive = true; $databaseConnection = Mockery::mock(Connection::class); @@ -126,11 +126,11 @@ it('will handle PostgreSQL columns that already contain ->> operator', function $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); expect($expression->getValue($grammar)) - ->toBe("lower(name->>'ar'::text)"); + ->toBe("lower(\"data\"->>'name'::text)"); }); -it('will handle PostgreSQL columns with table prefix that already contain ->> operator', function () { - $column = 'products.name->>\'en\''; +it('will generate a nested JSON search column expression for Postgres with explicit ->> operator on the last segment', function () { + $column = 'data->name->>ar'; $isSearchForcedCaseInsensitive = true; $databaseConnection = Mockery::mock(Connection::class); @@ -142,11 +142,11 @@ it('will handle PostgreSQL columns with table prefix that already contain ->> op $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); expect($expression->getValue($grammar)) - ->toBe("lower(products.name->>'en'::text)"); + ->toBe("lower(\"data\"->'name'->>'ar'::text)"); }); -it('will handle PostgreSQL columns from relationships that already contain ->> operator', function () { - $column = 'categories.name->>\'ar\''; +it('will generate a JSON search column expression for Postgres with explicit ->> operator and simple key', function () { + $column = 'name->>\'en\''; $isSearchForcedCaseInsensitive = true; $databaseConnection = Mockery::mock(Connection::class); @@ -158,21 +158,5 @@ it('will handle PostgreSQL columns from relationships that already contain ->> o $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); expect($expression->getValue($grammar)) - ->toBe("lower(categories.name->>'ar'::text)"); -}); - -it('will handle PostgreSQL columns from nested relationships that already contain ->> operator', function () { - $column = 'categories.parent.name->>\'en\''; - $isSearchForcedCaseInsensitive = true; - - $databaseConnection = Mockery::mock(Connection::class); - $databaseConnection->shouldReceive('getDriverName')->andReturn('pgsql'); - $databaseConnection->shouldReceive('getConfig')->with('search_collation')->andReturn(null); - - $grammar = new PostgresGrammar($databaseConnection); - - $expression = generate_search_column_expression($column, $isSearchForcedCaseInsensitive, $databaseConnection); - - expect($expression->getValue($grammar)) - ->toBe("lower(categories.parent.name->>'en'::text)"); + ->toBe("lower(\"name\"->>'en'::text)"); }); From 1f80864d129558a1a5178d4545e68c59da78ff17 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Sun, 10 Aug 2025 20:26:20 +0100 Subject: [PATCH 20/20] Update packages/support/src/helpers.php --- packages/support/src/helpers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/support/src/helpers.php b/packages/support/src/helpers.php index d50a539e22..05eeb77d59 100644 --- a/packages/support/src/helpers.php +++ b/packages/support/src/helpers.php @@ -175,7 +175,7 @@ if (! function_exists('Filament\Support\generate_search_column_expression')) { ->implode('.') ) . collect(str($column)->after('->')->explode('->')) // Handle JSON path parts ->map(function ($segment, $index) use ($column): string { - // if segment already contains '>something' (from ->> operator), preserve it + // If segment already starts with `>` (from `->>` operator), preserve it $isExplicitOperatorPrefixed = str($segment)->startsWith('>'); $segment = $isExplicitOperatorPrefixed ? (string) str($segment)->after('>') : $segment;