schema([
Section::make('')->schema([
Translate::make()->schema(fn (string $locale) => [
TextInput::make('name')->label('項目名稱'),
TextInput::make('sub_name')->label('項目子名稱'),
])
->locales(['zh_TW', 'en'])
->actions([
app(DeepLService::class)->createTranslationAction('Main', ['name', 'sub_name']),
])->columnSpanFull()->id('main'),
Select::make('tags')
->multiple()
->relationship('tags', 'name')
->preload()
->label('標籤'),
FileUpload::make('thumbnail')->label('縮圖')->directory('project')->image(),
FileUpload::make('img_url')->label('圖片')->directory('project')->multiple()->maxFiles(5),
TextInput::make('order')->label('排序')->default('0'),
]),
Tabs::make()->schema([
Tab::make('專案概要')->schema([
Select::make('region_id')->label('地區')->options(function () {
return Region::where('visible', true)->pluck('name', 'id');
}),
Translate::make()->schema(fn (string $locale) => [
Textarea::make('summaries')->label('簡述'),
TextInput::make('district')->label('區域'),
TextInput::make('address')->label('地址'),
Textarea::make('floor_plan')->label('樓層規劃'),
Textarea::make('building_structure')->label('建築結構'),
Textarea::make('design_unit')->label('設計單位'),
])
->locales(['zh_TW', 'en'])
->actions([
app(DeepLService::class)->createTranslationAction('summaries', ['summaries', 'address',
'floor_plan', 'building_structure', 'design_unit']),
])->columnSpanFull()->id('summaries'),
Radio::make('badge_type')->label('')->options([1 => '永續目標', 2 => '取得標章'])->default(1)->inline(),
Repeater::make('badgesTarget')->label('永續目標')->schema([
Hidden::make('award_type')->default(1),
Select::make('badge_id')
->options(function () {
return Badge::all()->mapWithKeys(function ($badge) {
return [
$badge->id => '
'.$badge->title.'
',
];
});
})
->allowHtml()
->preload()
->searchable()
->label('')
->required(),
])->reorderable(false),
Repeater::make('badgesAward')->label('取得標章')->schema([
Hidden::make('award_type')->default(2),
Select::make('badge_id')
->options(function () {
return Badge::all()->mapWithKeys(function ($badge) {
return [
$badge->id => '
'.$badge->title.'
',
];
});
})
->allowHtml()
->preload()
->searchable()
->label('')
->required(),
DatePicker::make('award_date')
->label('選擇年月')
->format('Y-m')
->displayFormat('Y年m月')
->native(false)
->closeOnDateSelection(),
])->reorderable(false),
]),
Tab::make('開發歷程')->schema([
Repeater::make('histories')->label('')->schema([
TextInput::make('histories_item_key')
->default(fn () => Str::random())
->hidden()
->afterStateHydrated(function (TextInput $component, $state) {
if (empty($state)) {
$component->state(Str::random());
}
}),
DatePicker::make('operate_date')->label('歷程日期')->columnSpan(1),
Translate::make()->schema(fn (string $locale) => [
TextInput::make('title')->label('標題')->columnSpanFull(),
])
->locales(['zh_TW', 'en'])
->actions([
app(DeepLService::class)->createTranslationAction('histories', ['title']),
])->columnSpanFull()
->id(fn ($get) => 'histories_'.$get('histories_item_key')),
])
->relationship('histories', function ($query, Get $get, $livewire) {
return $query->orderby('operate_date', 'desc');
})
->collapsible()
->cloneable(),
]),
Tab::make('空間資訊')->schema([
Group::make()->schema([
Translate::make()->schema(fn (string $locale) => [
TextInput::make('contact_unit')->label('物管單位'),
TextInput::make('contact_phone')->label('物管電話'),
TextInput::make('inversment_phone')->label('招商電話'),
])
->locales(['zh_TW', 'en'])
->actions([
app(DeepLService::class)->createTranslationAction('contact', ['contact_unit', 'contact_phone', 'inversment_phone']),
])->columnSpanFull()->columns(3)
->id('contact'),
TextInput::make('offical_link')->label('官網連結'),
])->columnSpanFull(),
Repeater::make('spaceInfos')->label('')->schema([
Translate::make()->schema(fn (string $locale) => [
TextInput::make('title')->label('標題')->columnSpanFull(),
Textarea::make('content')->label('內文')->columnSpanFull(),
])
->locales(['zh_TW', 'en'])
->actions([
app(DeepLService::class)->createTranslationAction('spaceInfos', ['title', 'content']),
])->columnSpanFull()
->id(fn ($get) => 'spaceInfos_'.$get('item_key')),
])
->relationship('spaceInfos')
->label('')
->collapsible()
->reorderableWithButtons()
->orderColumn('order')
->cloneable(),
]),
])->columnSpanFull(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
//
TextColumn::make('name')->label('項目名稱')->alignCenter(),
ImageColumn::make('thumbnail_url')->label('縮圖')->alignCenter(),
ImageColumn::make('first_list_img_url')->label('列表圖')->alignCenter(),
TextColumn::make('region.name')->label('地址')->alignCenter()
->formatStateUsing(fn ($record) => $record->region->getTranslation('name', 'zh_TW').' | '.$record->getTranslation('address', 'zh_TW')),
])
->filters([
SelectFilter::make('visible')->label('上/下架')
->options([
0 => '下架',
1 => '上架',
])
->query(
fn (array $data, Builder $query): Builder => $query->when(
$data['value'],
fn (Builder $query, $value): Builder => $query->where('visible', $data['value'])
)
),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
\Filament\Tables\Actions\Action::make('audit')
->label(fn ($record) => match ($record->visible) {
0 => '上架',
1 => '下架',
})
->color(fn ($record) => match ($record->visible) {
0 => 'warning',
1 => 'gray',
})
->icon(fn ($record) => match ($record->visible) {
0 => 'heroicon-m-chevron-double-up',
1 => 'heroicon-m-chevron-double-down',
})
->action(function ($record): void {
$record->visible = ! $record->visible;
$record->save();
})
->outlined()
->requiresConfirmation(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListProjects::route('/'),
'create' => Pages\CreateProject::route('/create'),
'edit' => Pages\EditProject::route('/{record}/edit'),
];
}
}