Andrew 1 个月前
父节点
当前提交
b72147db70

+ 18
- 14
app/Filament/Resources/AlbumResource.php 查看文件

63
                         ->directory('album/img')
63
                         ->directory('album/img')
64
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
64
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
65
                     FileUpload::make('news_img_pc')->label('列表圖(desktop)')
65
                     FileUpload::make('news_img_pc')->label('列表圖(desktop)')
66
+                        ->image()
67
+                        ->optimize('webp')
66
                         ->directory('album/img')
68
                         ->directory('album/img')
67
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
69
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
68
                     FileUpload::make('news_img_mobile')->label('列表圖(mobile)')
70
                     FileUpload::make('news_img_mobile')->label('列表圖(mobile)')
71
+                        ->image()
72
+                        ->optimize('webp')
69
                         ->directory('album/img')
73
                         ->directory('album/img')
70
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
74
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
71
-                    Translate::make()->schema(fn(string $locale) => [
75
+                    Translate::make()->schema(fn (string $locale) => [
72
                         TextInput::make('title')
76
                         TextInput::make('title')
73
                             ->label('標題')
77
                             ->label('標題')
74
                             ->columnSpan(1),
78
                             ->columnSpan(1),
86
                         ])->columnSpanFull()->default(1)->live(),
90
                         ])->columnSpanFull()->default(1)->live(),
87
                         Group::make()->schema([
91
                         Group::make()->schema([
88
                             TextInput::make('link_video')->label('網址')->nullable(),
92
                             TextInput::make('link_video')->label('網址')->nullable(),
89
-                        ])->visible(fn(Get $get): bool => $get('upload_type') == 1)->columnSpanFull(),
93
+                        ])->visible(fn (Get $get): bool => $get('upload_type') == 1)->columnSpanFull(),
90
                         Group::make()->schema([
94
                         Group::make()->schema([
91
                             FileUpload::make('link_upload')->label('')->directory('album/video')
95
                             FileUpload::make('link_upload')->label('')->directory('album/video')
92
                                 ->acceptedFileTypes(['video/mp4', 'video/mpeg', 'video/quicktime', 'video/x-msvideo', 'video/x-ms-wmv'])
96
                                 ->acceptedFileTypes(['video/mp4', 'video/mpeg', 'video/quicktime', 'video/x-msvideo', 'video/x-ms-wmv'])
93
                                 ->helperText('建議影片寬高限制為:1920*1080px,出血寬度720px,大小限制為:100M以下')
97
                                 ->helperText('建議影片寬高限制為:1920*1080px,出血寬度720px,大小限制為:100M以下')
94
                                 ->maxSize(102400)->nullable(),
98
                                 ->maxSize(102400)->nullable(),
95
-                        ])->visible(fn(Get $get): bool => $get('upload_type') == 2)->columnSpanFull(),
99
+                        ])->visible(fn (Get $get): bool => $get('upload_type') == 2)->columnSpanFull(),
96
                     ])->columnSpanFull(),
100
                     ])->columnSpanFull(),
97
                     Toggle::make('on_top')->inline()->label('置頂輪播')->columnSpanFull(),
101
                     Toggle::make('on_top')->inline()->label('置頂輪播')->columnSpanFull(),
98
-//                    Toggle::make('homepage_top')->inline()->label('在首頁輪播')->columnSpanFull(),
102
+                    //                    Toggle::make('homepage_top')->inline()->label('在首頁輪播')->columnSpanFull(),
99
                 ])->columns(3),
103
                 ])->columns(3),
100
             ]);
104
             ]);
101
     }
105
     }
110
                 TextColumn::make('post_date')->label('發布日期')->date()->alignCenter(),
114
                 TextColumn::make('post_date')->label('發布日期')->date()->alignCenter(),
111
                 ImageColumn::make('news_img_pc')->label('列表圖(desktop)')->alignCenter(),
115
                 ImageColumn::make('news_img_pc')->label('列表圖(desktop)')->alignCenter(),
112
                 TextColumn::make('list_audit_state')->label('狀態')->badge()
116
                 TextColumn::make('list_audit_state')->label('狀態')->badge()
113
-                    ->color(fn(string $state): string => match ($state) {
117
+                    ->color(fn (string $state): string => match ($state) {
114
                         '暫存' => 'warning',
118
                         '暫存' => 'warning',
115
                         '已發佈' => 'success',
119
                         '已發佈' => 'success',
116
                     }),
120
                     }),
121
                 SelectFilter::make('post_date')->label('年份')
125
                 SelectFilter::make('post_date')->label('年份')
122
                     ->options(Album::select(DB::raw("DATE_FORMAT(post_date, '%Y') as year"))->whereNotNull('post_date')->distinct()->pluck('year', 'year')->toArray())
126
                     ->options(Album::select(DB::raw("DATE_FORMAT(post_date, '%Y') as year"))->whereNotNull('post_date')->distinct()->pluck('year', 'year')->toArray())
123
                     ->query(
127
                     ->query(
124
-                        fn(array $data, Builder $query): Builder => $query->when(
128
+                        fn (array $data, Builder $query): Builder => $query->when(
125
                             $data['value'],
129
                             $data['value'],
126
-                            fn(Builder $query, $value): Builder => $query->where('post_date', 'like', $data['value'] . '%')
130
+                            fn (Builder $query, $value): Builder => $query->where('post_date', 'like', $data['value'].'%')
127
                         )
131
                         )
128
                     ),
132
                     ),
129
                 SelectFilter::make('album_category_id')->label('分類')
133
                 SelectFilter::make('album_category_id')->label('分類')
130
                     ->relationship('albumCategory', 'name')
134
                     ->relationship('albumCategory', 'name')
131
-                    ->getOptionLabelFromRecordUsing(fn($record, $livewire) => $record->getTranslation('name', 'zh_TW')),
135
+                    ->getOptionLabelFromRecordUsing(fn ($record, $livewire) => $record->getTranslation('name', 'zh_TW')),
132
                 SelectFilter::make('visible')->label('狀態')
136
                 SelectFilter::make('visible')->label('狀態')
133
                     ->options([
137
                     ->options([
134
                         0 => '暫存',
138
                         0 => '暫存',
135
                         1 => '已發佈',
139
                         1 => '已發佈',
136
                     ])
140
                     ])
137
                     ->query(
141
                     ->query(
138
-                        fn(array $data, Builder $query): Builder => $query->when(
142
+                        fn (array $data, Builder $query): Builder => $query->when(
139
                             $data['value'],
143
                             $data['value'],
140
-                            fn(Builder $query, $value): Builder => $query->where('visible', $data['value'])
144
+                            fn (Builder $query, $value): Builder => $query->where('visible', $data['value'])
141
                         )
145
                         )
142
                     ),
146
                     ),
143
             ])
147
             ])
145
                 Tables\Actions\EditAction::make(),
149
                 Tables\Actions\EditAction::make(),
146
                 Tables\Actions\DeleteAction::make(),
150
                 Tables\Actions\DeleteAction::make(),
147
                 \Filament\Tables\Actions\Action::make('audit')
151
                 \Filament\Tables\Actions\Action::make('audit')
148
-                    ->label(fn($record) => match ($record->visible) {
152
+                    ->label(fn ($record) => match ($record->visible) {
149
                         0 => '發佈',
153
                         0 => '發佈',
150
                         1 => '下架',
154
                         1 => '下架',
151
                     })
155
                     })
152
-                    ->color(fn($record) => match ($record->visible) {
156
+                    ->color(fn ($record) => match ($record->visible) {
153
                         0 => 'warning',
157
                         0 => 'warning',
154
                         1 => 'gray',
158
                         1 => 'gray',
155
                     })
159
                     })
156
-                    ->icon(fn($record) => match ($record->visible) {
160
+                    ->icon(fn ($record) => match ($record->visible) {
157
                         0 => 'heroicon-m-chevron-double-up',
161
                         0 => 'heroicon-m-chevron-double-up',
158
                         1 => 'heroicon-m-chevron-double-down',
162
                         1 => 'heroicon-m-chevron-double-down',
159
                     })
163
                     })
160
                     ->action(function ($record) {
164
                     ->action(function ($record) {
161
-                        $record->visible = !$record->visible;
165
+                        $record->visible = ! $record->visible;
162
                         $record->save();
166
                         $record->save();
163
                     })
167
                     })
164
                     ->outlined()
168
                     ->outlined()

+ 2
- 0
app/Filament/Resources/BadgeResource.php 查看文件

55
                         ])->columns(2)->columnSpanFull(),
55
                         ])->columns(2)->columnSpanFull(),
56
                         Group::make()->schema([
56
                         Group::make()->schema([
57
                             FileUpload::make('img_url')->label('圖片')->directory('badge')->columnSpan(1)
57
                             FileUpload::make('img_url')->label('圖片')->directory('badge')->columnSpan(1)
58
+                                ->image()
59
+                                ->optimize('webp')
58
                                 ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
60
                                 ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
59
                         ])->columnSpanFull(),
61
                         ])->columnSpanFull(),
60
                     ])->columns(4)->columnSpanFull(),
62
                     ])->columns(4)->columnSpanFull(),

+ 22
- 18
app/Filament/Resources/BannerResource.php 查看文件

14
 use Filament\Forms\Form;
14
 use Filament\Forms\Form;
15
 use Filament\Resources\Resource;
15
 use Filament\Resources\Resource;
16
 use Filament\Tables;
16
 use Filament\Tables;
17
+use Filament\Tables\Columns\IconColumn;
17
 use Filament\Tables\Columns\ImageColumn;
18
 use Filament\Tables\Columns\ImageColumn;
18
 use Filament\Tables\Columns\TextColumn;
19
 use Filament\Tables\Columns\TextColumn;
19
-use Filament\Tables\Columns\IconColumn;
20
 use Filament\Tables\Table;
20
 use Filament\Tables\Table;
21
 use SolutionForest\FilamentTranslateField\Forms\Component\Translate;
21
 use SolutionForest\FilamentTranslateField\Forms\Component\Translate;
22
 
22
 
51
                 Section::make('')->schema([
51
                 Section::make('')->schema([
52
                     Group::make()->schema([
52
                     Group::make()->schema([
53
                         Radio::make('type')->label('')->default(1)->options([1 => '圖片', 2 => '影片'])->reactive(),
53
                         Radio::make('type')->label('')->default(1)->options([1 => '圖片', 2 => '影片'])->reactive(),
54
-                        Translate::make()->schema(fn(string $locale) => [
54
+                        Translate::make()->schema(fn (string $locale) => [
55
                             Textarea::make('title')
55
                             Textarea::make('title')
56
-                                ->required(fn($get) => $locale == 'zh_TW' && $get('../../type') == 1)
56
+                                ->required(fn ($get) => $locale == 'zh_TW' && $get('../../type') == 1)
57
                                 ->label('大字標題'),
57
                                 ->label('大字標題'),
58
                             Textarea::make('content')
58
                             Textarea::make('content')
59
-                                ->required(fn($get) => $locale == 'zh_TW' && $get('../../type') == 1)
59
+                                ->required(fn ($get) => $locale == 'zh_TW' && $get('../../type') == 1)
60
                                 ->label('小字標題'),
60
                                 ->label('小字標題'),
61
                         ])
61
                         ])
62
                             ->locales(['zh_TW', 'en'])
62
                             ->locales(['zh_TW', 'en'])
63
                             ->actions([
63
                             ->actions([
64
                                 app(DeepLService::class)->createTranslationAction('Main', ['title', 'content']),
64
                                 app(DeepLService::class)->createTranslationAction('Main', ['title', 'content']),
65
                             ])->columnSpanFull()
65
                             ])->columnSpanFull()
66
-                            ->visible(fn($get) => $get('type') == 1),
66
+                            ->visible(fn ($get) => $get('type') == 1),
67
                         Group::make()->schema([
67
                         Group::make()->schema([
68
                             FileUpload::make('img_url')->label('圖片')->directory('banners')->columnSpan(1)
68
                             FileUpload::make('img_url')->label('圖片')->directory('banners')->columnSpan(1)
69
+                                ->image()
70
+                                ->optimize('webp')
69
                                 ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])
71
                                 ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])
70
-                                ->required(fn($get) => $get('type') == 1)
72
+                                ->required(fn ($get) => $get('type') == 1)
71
                                 ->imageEditor()
73
                                 ->imageEditor()
72
-                                ->visible(fn($get) => $get('type') == 1),
74
+                                ->visible(fn ($get) => $get('type') == 1),
73
                             FileUpload::make('mobile_img')->label('手機板圖片')->directory('banners')->columnSpan(1)
75
                             FileUpload::make('mobile_img')->label('手機板圖片')->directory('banners')->columnSpan(1)
76
+                                ->image()
77
+                                ->optimize('webp')
74
                                 ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])
78
                                 ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])
75
-                                ->required(fn($get) => $get('type') == 1)
79
+                                ->required(fn ($get) => $get('type') == 1)
76
                                 ->imageEditor()
80
                                 ->imageEditor()
77
-                                ->visible(fn($get) => $get('type') == 1),
78
-                            Translate::make()->schema(fn(string $locale) => [
81
+                                ->visible(fn ($get) => $get('type') == 1),
82
+                            Translate::make()->schema(fn (string $locale) => [
79
                                 TextInput::make('img_alt')
83
                                 TextInput::make('img_alt')
80
-                                    ->required(fn($get) => $locale == 'zh_TW' && $get('../../type') == 1)
84
+                                    ->required(fn ($get) => $locale == 'zh_TW' && $get('../../type') == 1)
81
                                     ->label('圖片註釋'),
85
                                     ->label('圖片註釋'),
82
                             ])
86
                             ])
83
                                 ->locales(['zh_TW', 'en'])
87
                                 ->locales(['zh_TW', 'en'])
84
                                 ->actions([
88
                                 ->actions([
85
                                     app(DeepLService::class)->createTranslationAction('Main', ['img_alt']),
89
                                     app(DeepLService::class)->createTranslationAction('Main', ['img_alt']),
86
                                 ])->columnSpan(1)
90
                                 ])->columnSpan(1)
87
-                                ->visible(fn($get) => $get('../type') == 1),
91
+                                ->visible(fn ($get) => $get('../type') == 1),
88
                         ])->columnSpanFull(),
92
                         ])->columnSpanFull(),
89
                         TextInput::make('video_url')->label('影片網址')->url()->columnSpanFull()
93
                         TextInput::make('video_url')->label('影片網址')->url()->columnSpanFull()
90
-                            ->required(fn($get) => $get('type') == 2)
91
-                            ->visible(fn($get) => $get('type') == 2),
94
+                            ->required(fn ($get) => $get('type') == 2)
95
+                            ->visible(fn ($get) => $get('type') == 2),
92
                         Radio::make('visible')->label('顯示/不顯示')->options([1 => '顯示', 0 => '不顯示'])->inline()->default(1)->columnSpan(2),
96
                         Radio::make('visible')->label('顯示/不顯示')->options([1 => '顯示', 0 => '不顯示'])->inline()->default(1)->columnSpan(2),
93
                     ])->columns(4)->columnSpanFull(),
97
                     ])->columns(4)->columnSpanFull(),
94
                 ]),
98
                 ]),
100
         return $table
104
         return $table
101
             ->columns([
105
             ->columns([
102
                 IconColumn::make('type')->label('類別')
106
                 IconColumn::make('type')->label('類別')
103
-                    ->icon(fn(string $state): string => match ($state) {
107
+                    ->icon(fn (string $state): string => match ($state) {
104
                         '1' => 'heroicon-o-photo',
108
                         '1' => 'heroicon-o-photo',
105
                         '2' => 'heroicon-o-film',
109
                         '2' => 'heroicon-o-film',
106
                     }),
110
                     }),
107
                 ImageColumn::make('img_url')->label('圖片')
111
                 ImageColumn::make('img_url')->label('圖片')
108
-                    ->getStateUsing(fn($record) => $record->type == 1 ? $record->img_url : null),
112
+                    ->getStateUsing(fn ($record) => $record->type == 1 ? $record->img_url : null),
109
                 TextColumn::make('title')->label('標題')
113
                 TextColumn::make('title')->label('標題')
110
-                    ->getStateUsing(fn($record) => $record->type == 1 ? $record->title : null),
114
+                    ->getStateUsing(fn ($record) => $record->type == 1 ? $record->title : null),
111
                 TextColumn::make('video_url')->label('影片網址')
115
                 TextColumn::make('video_url')->label('影片網址')
112
-                    ->formatStateUsing(fn($record) => $record->type == 2 ? $record->video_url : null),
116
+                    ->formatStateUsing(fn ($record) => $record->type == 2 ? $record->video_url : null),
113
             ])
117
             ])
114
             ->filters([
118
             ->filters([
115
                 //
119
                 //

+ 2
- 0
app/Filament/Resources/HistoryResource.php 查看文件

68
                         ])->columnSpanFull(),
68
                         ])->columnSpanFull(),
69
                     Group::make()->schema([
69
                     Group::make()->schema([
70
                         FileUpload::make('img_url')->label('圖片')->directory('histories')
70
                         FileUpload::make('img_url')->label('圖片')->directory('histories')
71
+                            ->image()
72
+                            ->optimize('webp')
71
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->imageEditor()
73
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->imageEditor()
72
                             ->columnSpanFull(),
74
                             ->columnSpanFull(),
73
                     ])->columnSpanFull(),
75
                     ])->columnSpanFull(),

+ 28
- 22
app/Filament/Resources/NewsResource.php 查看文件

72
                             ->closeOnDateSelection()
72
                             ->closeOnDateSelection()
73
                             ->required()
73
                             ->required()
74
                             ->columnSpan(1),
74
                             ->columnSpan(1),
75
-                        Translate::make()->schema(fn(string $locale) => [
75
+                        Translate::make()->schema(fn (string $locale) => [
76
                             TextInput::make('title')->required($locale == 'zh_TW')->label('標題')->columnSpan(1),
76
                             TextInput::make('title')->required($locale == 'zh_TW')->label('標題')->columnSpan(1),
77
                             TextInput::make('written_by')->required($locale == 'zh_TW')->label('撰文者')->columnSpan(1),
77
                             TextInput::make('written_by')->required($locale == 'zh_TW')->label('撰文者')->columnSpan(1),
78
                             Textarea::make('description')->required($locale == 'zh_TW')->label('簡述')->columnSpan(2),
78
                             Textarea::make('description')->required($locale == 'zh_TW')->label('簡述')->columnSpan(2),
84
                             ->columnSpan(2)
84
                             ->columnSpan(2)
85
                             ->id('Main-content'),
85
                             ->id('Main-content'),
86
                         FileUpload::make('news_img')->label('圖片')
86
                         FileUpload::make('news_img')->label('圖片')
87
+                            ->image()
88
+                            ->optimize('webp')
87
                             ->directory('news')
89
                             ->directory('news')
88
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()
90
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()
89
                             ->columnSpan(2),
91
                             ->columnSpan(2),
90
-                        Translate::make()->schema(fn(string $locale) => [
92
+                        Translate::make()->schema(fn (string $locale) => [
91
                             TextInput::make('news_img_alt')->label('圖片註釋'),
93
                             TextInput::make('news_img_alt')->label('圖片註釋'),
92
                         ])
94
                         ])
93
                             ->locales(['zh_TW', 'en'])
95
                             ->locales(['zh_TW', 'en'])
97
                             ->id('Main-alt'),
99
                             ->id('Main-alt'),
98
                     ])->columns(2),
100
                     ])->columns(2),
99
                     Tab::make('SEO')->schema([
101
                     Tab::make('SEO')->schema([
100
-                        Translate::make()->schema(fn(string $locale) => [
102
+                        Translate::make()->schema(fn (string $locale) => [
101
                             TextInput::make('meta_title')->label('SEO 標題'),
103
                             TextInput::make('meta_title')->label('SEO 標題'),
102
                             TextInput::make('meta_keyword')->label('SEO 關鍵字'),
104
                             TextInput::make('meta_keyword')->label('SEO 關鍵字'),
103
                             Textarea::make('meta_description')->label('SEO 簡述'),
105
                             Textarea::make('meta_description')->label('SEO 簡述'),
107
                                 app(DeepLService::class)->createTranslationAction('Seo', ['meta_title', 'meta_keyword', 'meta_description']),
109
                                 app(DeepLService::class)->createTranslationAction('Seo', ['meta_title', 'meta_keyword', 'meta_description']),
108
                             ])->columnSpanFull(),
110
                             ])->columnSpanFull(),
109
                         FileUpload::make('meta_img')->label('放大預覽圖')
111
                         FileUpload::make('meta_img')->label('放大預覽圖')
112
+                            ->image()
113
+                            ->optimize('webp')
110
                             ->directory('news/seo')
114
                             ->directory('news/seo')
111
                             ->columnSpan(1)
115
                             ->columnSpan(1)
112
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->imageEditor()
116
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->imageEditor()
115
                     Tab::make('內文編輯')->schema([
119
                     Tab::make('內文編輯')->schema([
116
                         Repeater::make('paragraphs')->schema([
120
                         Repeater::make('paragraphs')->schema([
117
                             TextInput::make('item_key')
121
                             TextInput::make('item_key')
118
-                                ->default(fn() => Str::random())
122
+                                ->default(fn () => Str::random())
119
                                 ->hidden()
123
                                 ->hidden()
120
                                 ->afterStateHydrated(function (TextInput $component, $state) {
124
                                 ->afterStateHydrated(function (TextInput $component, $state) {
121
                                     if (empty($state)) {
125
                                     if (empty($state)) {
130
                             Group::make()->schema([
134
                             Group::make()->schema([
131
                                 Section::make('')->schema([
135
                                 Section::make('')->schema([
132
                                     FileUpload::make('img_url')->label('')->directory('news/paragraphs')
136
                                     FileUpload::make('img_url')->label('')->directory('news/paragraphs')
137
+                                        ->image()
138
+                                        ->optimize('webp')
133
                                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
139
                                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
134
-                                    Translate::make()->schema(fn(string $locale) => [
140
+                                    Translate::make()->schema(fn (string $locale) => [
135
                                         TextInput::make('img_alt')->label('圖片註釋'),
141
                                         TextInput::make('img_alt')->label('圖片註釋'),
136
                                     ])
142
                                     ])
137
                                         ->locales(['zh_TW', 'en'])
143
                                         ->locales(['zh_TW', 'en'])
138
                                         ->actions([
144
                                         ->actions([
139
                                             app(DeepLService::class)->createTranslationAction('ParagraphImgAlt', ['img_alt']),
145
                                             app(DeepLService::class)->createTranslationAction('ParagraphImgAlt', ['img_alt']),
140
                                         ])->columnSpan(1)
146
                                         ])->columnSpan(1)
141
-                                        ->id(fn($get) => 'para_img_' . $get('item_key')),
147
+                                        ->id(fn ($get) => 'para_img_'.$get('item_key')),
142
                                 ]),
148
                                 ]),
143
-                            ])->visible(fn(Get $get): bool => $get('paragraph_type') == 1),
149
+                            ])->visible(fn (Get $get): bool => $get('paragraph_type') == 1),
144
                             Group::make()->schema([
150
                             Group::make()->schema([
145
-                                Translate::make()->schema(fn(string $locale) => [
151
+                                Translate::make()->schema(fn (string $locale) => [
146
                                     RichEditor::make('text_content')
152
                                     RichEditor::make('text_content')
147
                                         ->toolbarButtons([
153
                                         ->toolbarButtons([
148
                                             'blockquote',
154
                                             'blockquote',
171
                                     ->actions([
177
                                     ->actions([
172
                                         app(DeepLService::class)->createTranslationAction('ParagraphText', ['text_content']),
178
                                         app(DeepLService::class)->createTranslationAction('ParagraphText', ['text_content']),
173
                                     ])->columnSpan(1)
179
                                     ])->columnSpan(1)
174
-                                    ->id(fn($get) => 'para_text_' . $get('item_key')),
175
-                            ])->visible(fn(Get $get): bool => $get('paragraph_type') == 2),
180
+                                    ->id(fn ($get) => 'para_text_'.$get('item_key')),
181
+                            ])->visible(fn (Get $get): bool => $get('paragraph_type') == 2),
176
                         ])
182
                         ])
177
                             ->relationship('paragraphs')
183
                             ->relationship('paragraphs')
178
                             ->label('段落')
184
                             ->label('段落')
196
                 TextColumn::make('post_date')->label('發佈時間')->dateTime('Y/m/d')->alignCenter(),
202
                 TextColumn::make('post_date')->label('發佈時間')->dateTime('Y/m/d')->alignCenter(),
197
                 ImageColumn::make('news_img')->label('列表圖')->alignCenter(),
203
                 ImageColumn::make('news_img')->label('列表圖')->alignCenter(),
198
                 TextColumn::make('list_audit_state')->label('狀態')->badge()
204
                 TextColumn::make('list_audit_state')->label('狀態')->badge()
199
-                    ->color(fn(string $state): string => match ($state) {
205
+                    ->color(fn (string $state): string => match ($state) {
200
                         '暫存' => 'warning',
206
                         '暫存' => 'warning',
201
                         '已發佈' => 'success',
207
                         '已發佈' => 'success',
202
                     }),
208
                     }),
203
                 IconColumn::make('on_top')->label('置頂')
209
                 IconColumn::make('on_top')->label('置頂')
204
-                    ->color(fn(string $state): string => match ($state) {
210
+                    ->color(fn (string $state): string => match ($state) {
205
                         1 => 'success',
211
                         1 => 'success',
206
                         default => ''
212
                         default => ''
207
                     })
213
                     })
208
-                    ->icon(fn(string $state): string => match ($state) {
214
+                    ->icon(fn (string $state): string => match ($state) {
209
                         1 => 'heroicon-o-check-circle',
215
                         1 => 'heroicon-o-check-circle',
210
                         default => ''
216
                         default => ''
211
                     })
217
                     })
212
                     ->action(function ($record): void {
218
                     ->action(function ($record): void {
213
-                        $record->on_top = !$record->on_top;
219
+                        $record->on_top = ! $record->on_top;
214
                         $record->save();
220
                         $record->save();
215
                     }),
221
                     }),
216
                 TextColumn::make('created_at')->label('建立時間')->dateTime('Y/m/d H:i:s')->alignCenter(),
222
                 TextColumn::make('created_at')->label('建立時間')->dateTime('Y/m/d H:i:s')->alignCenter(),
223
                 SelectFilter::make('post_date')->label('年份')
229
                 SelectFilter::make('post_date')->label('年份')
224
                     ->options(News::select(\DB::raw("DATE_FORMAT(post_date, '%Y') as year"))->whereNotNull('post_date')->distinct()->pluck('year', 'year')->toArray())
230
                     ->options(News::select(\DB::raw("DATE_FORMAT(post_date, '%Y') as year"))->whereNotNull('post_date')->distinct()->pluck('year', 'year')->toArray())
225
                     ->query(
231
                     ->query(
226
-                        fn(array $data, Builder $query): Builder => $query->when(
232
+                        fn (array $data, Builder $query): Builder => $query->when(
227
                             $data['value'],
233
                             $data['value'],
228
-                            fn(Builder $query, $value): Builder => $query->where('post_date', 'like', $data['value'] . '%')
234
+                            fn (Builder $query, $value): Builder => $query->where('post_date', 'like', $data['value'].'%')
229
                         )
235
                         )
230
                     ),
236
                     ),
231
                 SelectFilter::make('visible')->label('狀態')
237
                 SelectFilter::make('visible')->label('狀態')
234
                         1 => '已發佈',
240
                         1 => '已發佈',
235
                     ])
241
                     ])
236
                     ->query(
242
                     ->query(
237
-                        fn(array $data, Builder $query): Builder => $query->when(
243
+                        fn (array $data, Builder $query): Builder => $query->when(
238
                             $data['value'],
244
                             $data['value'],
239
-                            fn(Builder $query, $value): Builder => $query->where('visible', $data['value'])
245
+                            fn (Builder $query, $value): Builder => $query->where('visible', $data['value'])
240
                         )
246
                         )
241
                     ),
247
                     ),
242
             ])
248
             ])
244
                 Tables\Actions\EditAction::make(),
250
                 Tables\Actions\EditAction::make(),
245
                 Tables\Actions\DeleteAction::make(),
251
                 Tables\Actions\DeleteAction::make(),
246
                 \Filament\Tables\Actions\Action::make('audit')
252
                 \Filament\Tables\Actions\Action::make('audit')
247
-                    ->label(fn($record) => match ($record->visible) {
253
+                    ->label(fn ($record) => match ($record->visible) {
248
                         0 => '發佈',
254
                         0 => '發佈',
249
                         1 => '下架',
255
                         1 => '下架',
250
                     })
256
                     })
251
-                    ->color(fn($record) => match ($record->visible) {
257
+                    ->color(fn ($record) => match ($record->visible) {
252
                         0 => 'warning',
258
                         0 => 'warning',
253
                         1 => 'gray',
259
                         1 => 'gray',
254
                     })
260
                     })
255
-                    ->icon(fn($record) => match ($record->visible) {
261
+                    ->icon(fn ($record) => match ($record->visible) {
256
                         0 => 'heroicon-m-chevron-double-up',
262
                         0 => 'heroicon-m-chevron-double-up',
257
                         1 => 'heroicon-m-chevron-double-down',
263
                         1 => 'heroicon-m-chevron-double-down',
258
                     })
264
                     })
259
                     ->action(function ($record): void {
265
                     ->action(function ($record): void {
260
-                        $record->visible = !$record->visible;
266
+                        $record->visible = ! $record->visible;
261
                         $record->save();
267
                         $record->save();
262
                     })
268
                     })
263
                     ->outlined()
269
                     ->outlined()

+ 2
- 0
app/Filament/Resources/ProfilePartResource.php 查看文件

56
                         ->id('Main')->columnSpanFull(),
56
                         ->id('Main')->columnSpanFull(),
57
                     Group::make()->schema([
57
                     Group::make()->schema([
58
                         FileUpload::make('img_url')->label('圖片')
58
                         FileUpload::make('img_url')->label('圖片')
59
+                            ->image()
60
+                            ->optimize('webp')
59
                             ->directory('profile-parts')
61
                             ->directory('profile-parts')
60
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()
62
                             ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()
61
                             ->columnSpanFull(),
63
                             ->columnSpanFull(),

+ 7
- 2
app/Filament/Resources/ProjectResource.php 查看文件

63
                         ->preload()
63
                         ->preload()
64
                         ->label('標籤'),
64
                         ->label('標籤'),
65
                     FileUpload::make('thumbnail')->label('縮圖')->directory('project')->image()
65
                     FileUpload::make('thumbnail')->label('縮圖')->directory('project')->image()
66
+                        ->optimize('webp')
66
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
67
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor(),
67
                     FileUpload::make('img_url')->label('圖片')->directory('project')->reorderable()
68
                     FileUpload::make('img_url')->label('圖片')->directory('project')->reorderable()
69
+                        ->image()
70
+                        ->optimize('webp')
68
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()->multiple()->maxFiles(20),
71
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()->multiple()->maxFiles(20),
69
                     FileUpload::make('mobile_img_url')->label('手機版圖片')->directory('project')->reorderable()
72
                     FileUpload::make('mobile_img_url')->label('手機版圖片')->directory('project')->reorderable()
73
+                        ->image()
74
+                        ->optimize('webp')
70
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()->multiple()->maxFiles(20),
75
                         ->acceptedFileTypes(['image/jpeg', 'image/jpg', 'image/png', 'image/webp'])->required()->imageEditor()->multiple()->maxFiles(20),
71
                 ]),
76
                 ]),
72
                 Tabs::make()->schema([
77
                 Tabs::make()->schema([
108
                         ])
113
                         ])
109
                             ->reorderableWithButtons()
114
                             ->reorderableWithButtons()
110
                             ->defaultItems(0)
115
                             ->defaultItems(0)
111
-                            ->visible(fn($get) => $get('badge_type') == 1),
116
+                            ->visible(fn ($get) => $get('badge_type') == 1),
112
                         Repeater::make('badgesAward')->label('取得標章')->schema([
117
                         Repeater::make('badgesAward')->label('取得標章')->schema([
113
                             Select::make('badge_id')
118
                             Select::make('badge_id')
114
                                 ->options(function () {
119
                                 ->options(function () {
135
                         ])
140
                         ])
136
                             ->reorderableWithButtons()
141
                             ->reorderableWithButtons()
137
                             ->defaultItems(0)
142
                             ->defaultItems(0)
138
-                            ->visible(fn($get) => $get('badge_type') == 2),
143
+                            ->visible(fn ($get) => $get('badge_type') == 2),
139
                     ]),
144
                     ]),
140
                     Tab::make('開發歷程')->schema([
145
                     Tab::make('開發歷程')->schema([
141
                         Repeater::make('histories')->label('')->schema([
146
                         Repeater::make('histories')->label('')->schema([

+ 1
- 1
config/livewire.php 查看文件

64
     */
64
     */
65
 
65
 
66
     'temporary_file_upload' => [
66
     'temporary_file_upload' => [
67
-        'disk' => null,        // Example: 'local', 's3'              | Default: 'default'
67
+        'disk' => 'local',        // Example: 'local', 's3'              | Default: 'default'
68
         'rules' => ["max:122880"],       // Example: ['file', 'mimes:png,jpg']  | Default: ['required', 'file', 'max:12288'] (12MB)
68
         'rules' => ["max:122880"],       // Example: ['file', 'mimes:png,jpg']  | Default: ['required', 'file', 'max:12288'] (12MB)
69
         'directory' => null,   // Example: 'tmp'                      | Default: 'livewire-tmp'
69
         'directory' => null,   // Example: 'tmp'                      | Default: 'livewire-tmp'
70
         'middleware' => null,  // Example: 'throttle:5,1'             | Default: 'throttle:60,1'
70
         'middleware' => null,  // Example: 'throttle:5,1'             | Default: 'throttle:60,1'