From 3a523348739ed63e12ac11839eab963b4e636ef4 Mon Sep 17 00:00:00 2001 From: "Ralph J. Smit" <59207045+ralphjsmit@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:35:40 +0200 Subject: [PATCH 1/8] Update 17-color-picker.md --- packages/forms/docs/03-fields/17-color-picker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/docs/03-fields/17-color-picker.md b/packages/forms/docs/03-fields/17-color-picker.md index 5f25664089..0d53d650c5 100644 --- a/packages/forms/docs/03-fields/17-color-picker.md +++ b/packages/forms/docs/03-fields/17-color-picker.md @@ -42,7 +42,7 @@ You may use Laravel's validation rules to validate the values of the color picke use Filament\Forms\Components\ColorPicker; ColorPicker::make('hex_color') - ->regex('/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/') + ->regex('/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})\b$/') ColorPicker::make('hsl_color') ->hsl() From bdc3633aaf46b6f0a1948f7234066bf8f4ff9e24 Mon Sep 17 00:00:00 2001 From: "Ralph J. Smit" <59207045+ralphjsmit@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:09:11 +0200 Subject: [PATCH 2/8] Update Select.php --- packages/forms/src/Components/Select.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/src/Components/Select.php b/packages/forms/src/Components/Select.php index 52692bff81..7bdbc0d067 100644 --- a/packages/forms/src/Components/Select.php +++ b/packages/forms/src/Components/Select.php @@ -433,7 +433,7 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has $form->model($component->getSelectedRecord()), ); }) - ->fillForm($this->getEditOptionActionFormData()) + ->fillForm(fn () => $this->getEditOptionActionFormData()) ->action(static function (Action $action, array $arguments, Select $component, array $data, ComponentContainer $form) { if (! $component->getUpdateOptionUsing()) { throw new Exception("Select field [{$component->getStatePath()}] must have a [updateOptionUsing()] closure set."); From e2d22546faaea58209aad2cd96d1a5d1691a77a8 Mon Sep 17 00:00:00 2001 From: "Ralph J. Smit" <59207045+ralphjsmit@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:10:51 +0200 Subject: [PATCH 3/8] Update Select.php --- packages/forms/src/Components/Select.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/forms/src/Components/Select.php b/packages/forms/src/Components/Select.php index 7bdbc0d067..a28c93ae64 100644 --- a/packages/forms/src/Components/Select.php +++ b/packages/forms/src/Components/Select.php @@ -428,12 +428,12 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has $action = Action::make($this->getEditOptionActionName()) ->label(__('filament-forms::components.select.actions.edit_option.label')) - ->form(function (Select $component, Form $form): array | Form | null { + ->form(static function (Select $component, Form $form): array | Form | null { return $component->getEditOptionActionForm( $form->model($component->getSelectedRecord()), ); }) - ->fillForm(fn () => $this->getEditOptionActionFormData()) + ->fillForm(static fn (Select $component) => $component->getEditOptionActionFormData()) ->action(static function (Action $action, array $arguments, Select $component, array $data, ComponentContainer $form) { if (! $component->getUpdateOptionUsing()) { throw new Exception("Select field [{$component->getStatePath()}] must have a [updateOptionUsing()] closure set."); From 56976700a3d16f761f0943e5cf6c17b8b3ff4ac6 Mon Sep 17 00:00:00 2001 From: "Ralph J. Smit" <59207045+ralphjsmit@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:12:21 +0200 Subject: [PATCH 4/8] Update Select.php --- packages/forms/src/Components/Select.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/src/Components/Select.php b/packages/forms/src/Components/Select.php index a28c93ae64..a7c82befb2 100644 --- a/packages/forms/src/Components/Select.php +++ b/packages/forms/src/Components/Select.php @@ -277,7 +277,7 @@ class Select extends Field implements Contracts\CanDisableOptions, Contracts\Has $action = Action::make($this->getCreateOptionActionName()) ->label(__('filament-forms::components.select.actions.create_option.label')) - ->form(function (Select $component, Form $form): array | Form | null { + ->form(static function (Select $component, Form $form): array | Form | null { return $component->getCreateOptionActionForm($form->model( $component->getRelationship() ? $component->getRelationship()->getModel()::class : null, )); From 635508c96dd7fca2140cc72dbba60c4eefe03a2c Mon Sep 17 00:00:00 2001 From: dvarilek Date: Thu, 24 Jul 2025 21:57:08 +0200 Subject: [PATCH 5/8] fix loading indicator in table after group deselection --- packages/tables/dist/components/table.js | 2 +- packages/tables/resources/js/components/table.js | 14 +++++--------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/tables/dist/components/table.js b/packages/tables/dist/components/table.js index ea16d85610..4e3ce3a940 100644 --- a/packages/tables/dist/components/table.js +++ b/packages/tables/dist/components/table.js @@ -1 +1 @@ -function n(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(e,t=null){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableAction(e,t)},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){if(this.isLoading=!0,this.areRecordsSelected(this.getRecordsInGroupOnPage(e))){this.deselectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e));return}this.selectRecords(await this.$wire.getGroupedSelectableTableRecordKeys(e)),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)this.isRecordSelected(t)||this.selectedRecords.push(t)},deselectRecords:function(e){for(let t of e){let s=this.selectedRecords.indexOf(t);s!==-1&&this.selectedRecords.splice(s,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let o=s.indexOf(this.lastChecked),r=s.indexOf(t),l=[o,r].sort((i,d)=>i-d),c=[];for(let i=l[0];i<=l[1];i++)s[i].checked=t.checked,c.push(s[i].value);t.checked?this.selectRecords(c):this.deselectRecords(c)}this.lastChecked=t}}}export{n as default}; +function d(){return{checkboxClickController:null,collapsedGroups:[],isLoading:!1,selectedRecords:[],shouldCheckUniqueSelection:!0,lastCheckedRecord:null,livewireId:null,init:function(){this.livewireId=this.$root.closest("[wire\\:id]").attributes["wire:id"].value,this.$wire.$on("deselectAllTableRecords",()=>this.deselectAllRecords()),this.$watch("selectedRecords",()=>{if(!this.shouldCheckUniqueSelection){this.shouldCheckUniqueSelection=!0;return}this.selectedRecords=[...new Set(this.selectedRecords)],this.shouldCheckUniqueSelection=!1}),this.$nextTick(()=>this.watchForCheckboxClicks()),Livewire.hook("element.init",({component:e})=>{e.id===this.livewireId&&this.watchForCheckboxClicks()})},mountAction:function(e,t=null){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableAction(e,t)},mountBulkAction:function(e){this.$wire.set("selectedTableRecords",this.selectedRecords,!1),this.$wire.mountTableBulkAction(e)},toggleSelectRecordsOnPage:function(){let e=this.getRecordsOnPage();if(this.areRecordsSelected(e)){this.deselectRecords(e);return}this.selectRecords(e)},toggleSelectRecordsInGroup:async function(e){this.isLoading=!0;let t=await this.$wire.getGroupedSelectableTableRecordKeys(e);this.areRecordsSelected(this.getRecordsInGroupOnPage(e))?this.deselectRecords(t):this.selectRecords(t),this.isLoading=!1},getRecordsInGroupOnPage:function(e){let t=[];for(let s of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])s.dataset.group===e&&t.push(s.value);return t},getRecordsOnPage:function(){let e=[];for(let t of this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[])e.push(t.value);return e},selectRecords:function(e){for(let t of e)this.isRecordSelected(t)||this.selectedRecords.push(t)},deselectRecords:function(e){for(let t of e){let s=this.selectedRecords.indexOf(t);s!==-1&&this.selectedRecords.splice(s,1)}},selectAllRecords:async function(){this.isLoading=!0,this.selectedRecords=await this.$wire.getAllSelectableTableRecordKeys(),this.isLoading=!1},deselectAllRecords:function(){this.selectedRecords=[]},isRecordSelected:function(e){return this.selectedRecords.includes(e)},areRecordsSelected:function(e){return e.every(t=>this.isRecordSelected(t))},toggleCollapseGroup:function(e){if(this.isGroupCollapsed(e)){this.collapsedGroups.splice(this.collapsedGroups.indexOf(e),1);return}this.collapsedGroups.push(e)},isGroupCollapsed:function(e){return this.collapsedGroups.includes(e)},resetCollapsedGroups:function(){this.collapsedGroups=[]},watchForCheckboxClicks:function(){this.checkboxClickController&&this.checkboxClickController.abort(),this.checkboxClickController=new AbortController;let{signal:e}=this.checkboxClickController;this.$root?.addEventListener("click",t=>t.target?.matches(".fi-ta-record-checkbox")&&this.handleCheckboxClick(t,t.target),{signal:e})},handleCheckboxClick:function(e,t){if(!this.lastChecked){this.lastChecked=t;return}if(e.shiftKey){let s=Array.from(this.$root?.getElementsByClassName("fi-ta-record-checkbox")??[]);if(!s.includes(this.lastChecked)){this.lastChecked=t;return}let l=s.indexOf(this.lastChecked),r=s.indexOf(t),o=[l,r].sort((c,n)=>c-n),i=[];for(let c=o[0];c<=o[1];c++)s[c].checked=t.checked,i.push(s[c].value);t.checked?this.selectRecords(i):this.deselectRecords(i)}this.lastChecked=t}}}export{d as default}; diff --git a/packages/tables/resources/js/components/table.js b/packages/tables/resources/js/components/table.js index d09fec040e..3b2bc4a0d8 100644 --- a/packages/tables/resources/js/components/table.js +++ b/packages/tables/resources/js/components/table.js @@ -68,18 +68,14 @@ export default function table() { toggleSelectRecordsInGroup: async function (group) { this.isLoading = true + const keys = await this.$wire.getGroupedSelectableTableRecordKeys(group) + if (this.areRecordsSelected(this.getRecordsInGroupOnPage(group))) { - this.deselectRecords( - await this.$wire.getGroupedSelectableTableRecordKeys(group), - ) - - return + this.deselectRecords(keys) + } else { + this.selectRecords(keys) } - this.selectRecords( - await this.$wire.getGroupedSelectableTableRecordKeys(group), - ) - this.isLoading = false }, From eaf1a07df1df2320a031d1aae41d167ea176760f Mon Sep 17 00:00:00 2001 From: dvarilek Date: Thu, 24 Jul 2025 20:05:17 +0000 Subject: [PATCH 6/8] chore: fix code style --- packages/tables/resources/js/components/table.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tables/resources/js/components/table.js b/packages/tables/resources/js/components/table.js index 3b2bc4a0d8..2be4753957 100644 --- a/packages/tables/resources/js/components/table.js +++ b/packages/tables/resources/js/components/table.js @@ -68,7 +68,8 @@ export default function table() { toggleSelectRecordsInGroup: async function (group) { this.isLoading = true - const keys = await this.$wire.getGroupedSelectableTableRecordKeys(group) + const keys = + await this.$wire.getGroupedSelectableTableRecordKeys(group) if (this.areRecordsSelected(this.getRecordsInGroupOnPage(group))) { this.deselectRecords(keys) From b43e5fe4850dc9f0d6086719f3767506d2b91f63 Mon Sep 17 00:00:00 2001 From: yebor974 Date: Fri, 25 Jul 2025 10:12:01 +0400 Subject: [PATCH 7/8] Add missing FR translations: - pages/auth/password-reset/request-password-reset.notifications.sent.body --- .../fr/pages/auth/password-reset/request-password-reset.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/panels/resources/lang/fr/pages/auth/password-reset/request-password-reset.php b/packages/panels/resources/lang/fr/pages/auth/password-reset/request-password-reset.php index a2bfdad60b..1db8598721 100644 --- a/packages/panels/resources/lang/fr/pages/auth/password-reset/request-password-reset.php +++ b/packages/panels/resources/lang/fr/pages/auth/password-reset/request-password-reset.php @@ -32,6 +32,10 @@ return [ 'notifications' => [ + 'sent' => [ + 'body' => 'Vous ne recevrez aucun email si aucun compte n’est associé à cette adresse.', + ], + 'throttled' => [ 'title' => 'Trop de requêtes', 'body' => 'Merci de réessayer dans :seconds secondes.', From 3faed3506ab1d81944da796686c2aa87cb0ff1f1 Mon Sep 17 00:00:00 2001 From: Aliaksei Matsesha <49055065+matsesh@users.noreply.github.com> Date: Fri, 25 Jul 2025 13:11:46 +0300 Subject: [PATCH 8/8] fix: replace blank() with null check on ReflectionClass --- packages/support/src/Concerns/EvaluatesClosures.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/support/src/Concerns/EvaluatesClosures.php b/packages/support/src/Concerns/EvaluatesClosures.php index 47bb8439ed..9870918a46 100644 --- a/packages/support/src/Concerns/EvaluatesClosures.php +++ b/packages/support/src/Concerns/EvaluatesClosures.php @@ -130,7 +130,7 @@ trait EvaluatesClosures $class = $parameter->getDeclaringClass(); - if (blank($class)) { + if (is_null($class)) { return $name; }