22
33declare (strict_types=1 );
44
5- namespace App \MoonShine \Resources ;
5+ namespace App \MoonShine \Resources \ MoonShineUser \ Pages ;
66
77use Illuminate \Contracts \Database \Eloquent \Builder ;
88use Illuminate \Validation \Rule ;
9- use MoonShine \Laravel \Enums \Action ;
9+ use Illuminate \Validation \Rules \Password as PasswordRule ;
10+ use MoonShine \Contracts \Core \TypeCasts \DataWrapperContract ;
11+ use MoonShine \Contracts \UI \ComponentContract ;
12+ use MoonShine \Contracts \UI \FieldContract ;
1013use MoonShine \Laravel \Fields \Relationships \BelongsTo ;
1114use MoonShine \Laravel \Models \MoonshineUser ;
12- use MoonShine \Laravel \Resources \ModelResource ;
1315use MoonShine \Laravel \Models \MoonshineUserRole ;
14- use MoonShine \MenuManager \Attributes \Group ;
15- use MoonShine \MenuManager \Attributes \Order ;
16- use MoonShine \Support \Attributes \Icon ;
17- use MoonShine \Support \Enums \Color ;
18- use MoonShine \Support \ListOf ;
16+ use MoonShine \Laravel \Pages \Crud \FormPage ;
17+ use App \MoonShine \Resources \MoonShineUser \MoonShineUserResource ;
18+ use App \MoonShine \Resources \MoonShineUserRole \MoonShineUserRoleResource ;
1919use MoonShine \UI \Components \Collapse ;
2020use MoonShine \UI \Components \Layout \Box ;
2121use MoonShine \UI \Components \Layout \Flex ;
2929use MoonShine \UI \Fields \PasswordRepeat ;
3030use MoonShine \UI \Fields \Text ;
3131
32- #[Icon('users ' )]
33- #[Group('moonshine::ui.resource.system ' , 'users ' , translatable: true )]
34- #[Order(1 )]
3532/**
36- * @extends ModelResource<MoonshineUser >
33+ * @extends FormPage<MoonShineUserResource, MoonShineUser >
3734 */
38- class MoonShineUserResource extends ModelResource
35+ final class MoonShineUserFormPage extends FormPage
3936{
40- protected string $ model = MoonshineUser::class;
41-
42- protected string $ column = 'name ' ;
43-
44- protected array $ with = ['moonshineUserRole ' ];
45-
46- protected bool $ simplePaginate = true ;
47-
48- protected bool $ columnSelection = true ;
49-
50- public function getTitle (): string
51- {
52- return __ ('moonshine::ui.resource.admins_title ' );
53- }
54-
55- protected function activeActions (): ListOf
56- {
57- return parent ::activeActions ()->except (Action::VIEW );
58- }
59-
60- protected function indexFields (): iterable
61- {
62- return [
63- ID ::make ()->sortable (),
64-
65- BelongsTo::make (
66- __ ('moonshine::ui.resource.role ' ),
67- 'moonshineUserRole ' ,
68- formatted: static fn (MoonshineUserRole $ model ) => $ model ->name ,
69- resource: MoonShineUserRoleResource::class,
70- )->badge (Color::PURPLE ),
71-
72- Text::make (__ ('moonshine::ui.resource.name ' ), 'name ' ),
73-
74- Image::make (__ ('moonshine::ui.resource.avatar ' ), 'avatar ' )->modifyRawValue (fn (
75- ?string $ raw
76- ): string => $ raw ?? '' ),
77-
78- Date::make (__ ('moonshine::ui.resource.created_at ' ), 'created_at ' )
79- ->format ("d.m.Y " )
80- ->sortable (),
81-
82- Email::make (__ ('moonshine::ui.resource.email ' ), 'email ' )
83- ->sortable (),
84- ];
85- }
86-
87- protected function detailFields (): iterable
88- {
89- return $ this ->indexFields ();
90- }
91-
92- protected function formFields (): iterable
37+ /**
38+ * @return list<ComponentContract|FieldContract>
39+ */
40+ protected function fields (): iterable
9341 {
9442 return [
9543 Box::make ([
@@ -103,7 +51,6 @@ protected function formFields(): iterable
10351 formatted: static fn (MoonshineUserRole $ model ) => $ model ->name ,
10452 resource: MoonShineUserRoleResource::class,
10553 )
106- ->reactive ()
10754 ->creatable ()
10855 ->valuesQuery (static fn (Builder $ q ) => $ q ->select (['id ' , 'name ' ])),
10956
@@ -131,7 +78,7 @@ protected function formFields(): iterable
13178 ->customAttributes (['autocomplete ' => 'new-password ' ])
13279 ->eye (),
13380
134- PasswordRepeat::make (__ ('moonshine::ui.resource.repeat_password ' ), 'password_repeat ' )
81+ PasswordRepeat::make (__ ('moonshine::ui.resource.repeat_password ' ), 'password_confirmation ' )
13582 ->customAttributes (['autocomplete ' => 'confirm-password ' ])
13683 ->eye (),
13784 ])->icon ('lock-closed ' ),
@@ -141,10 +88,7 @@ protected function formFields(): iterable
14188 ];
14289 }
14390
144- /**
145- * @return array{name: array|string, moonshine_user_role_id: array|string, email: array|string, password: array|string}
146- */
147- protected function rules ($ item ): array
91+ protected function rules (DataWrapperContract $ item ): array
14892 {
14993 return [
15094 'name ' => 'required ' ,
@@ -154,33 +98,14 @@ protected function rules($item): array
15498 'bail ' ,
15599 'required ' ,
156100 'email ' ,
157- Rule::unique ('moonshine_users ' )->ignoreModel ($ item ),
101+ Rule::unique ('moonshine_users ' )->ignoreModel ($ item ->getOriginal ()),
102+ ],
103+ 'avatar ' => ['sometimes ' , 'nullable ' , 'image ' , 'mimes:jpeg,jpg,png,gif ' ],
104+ 'password ' => [
105+ ...$ item ->getKey () !== null ? ['sometimes ' , 'nullable ' ] : ['required ' ],
106+ PasswordRule::defaults (),
107+ 'confirmed ' ,
158108 ],
159- 'password ' => $ item ->exists
160- ? 'sometimes|nullable|min:6|required_with:password_repeat|same:password_repeat '
161- : 'required|min:6|required_with:password_repeat|same:password_repeat ' ,
162- ];
163- }
164-
165- protected function search (): array
166- {
167- return [
168- 'id ' ,
169- 'name ' ,
170- ];
171- }
172-
173- protected function filters (): iterable
174- {
175- return [
176- BelongsTo::make (
177- __ ('moonshine::ui.resource.role ' ),
178- 'moonshineUserRole ' ,
179- formatted: static fn (MoonshineUserRole $ model ) => $ model ->name ,
180- resource: MoonShineUserRoleResource::class,
181- )->valuesQuery (static fn (Builder $ q ) => $ q ->select (['id ' , 'name ' ])),
182-
183- Email::make ('E-mail ' , 'email ' ),
184109 ];
185110 }
186111}
0 commit comments