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