Skip to content

Commit a687a68

Browse files
authored
Merge pull request #3 from statikbe/implement-search
Added resource and global search on page resource
2 parents 87f20e5 + 75c3261 commit a687a68

File tree

4 files changed

+84
-2
lines changed

4 files changed

+84
-2
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns;
4+
5+
trait HasSearchFilterTrait
6+
{
7+
public function scopeSearch($query, string $search): void
8+
{
9+
$search = strtolower($search);
10+
$query->when($search, function ($query, $search) {
11+
$locale = app()->getLocale();
12+
$query->where(function ($query) use ($search, $locale) {
13+
$query->whereRaw("LOWER(title->>'$.{$locale}') LIKE ?", ["%{$search}%"])
14+
->orWhereRaw("LOWER(intro->>'$.{$locale}') LIKE ?", ["%{$search}%"])
15+
->orWhereRaw("LOWER(content_blocks->>'$.{$locale}') LIKE ?", ["%{$search}%"])
16+
->orWhereRaw("LOWER(seo_title->>'$.{$locale}') LIKE ?", ["%{$search}%"])
17+
->orWhereRaw("LOWER(seo_description->>'$.{$locale}') LIKE ?", ["%{$search}%"])
18+
->orWhereRaw("LOWER(overview_title->>'$.{$locale}') LIKE ?", ["%{$search}%"])
19+
->orWhereRaw("LOWER(overview_description->>'$.{$locale}') LIKE ?", ["%{$search}%"]);
20+
});
21+
});
22+
}
23+
}

src/Models/Page.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Illuminate\Database\Eloquent\Model;
88
use Spatie\MediaLibrary\HasMedia;
99
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
10+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns\HasSearchFilterTrait;
1011
use Statikbe\FilamentFlexibleContentBlockPages\Models\Concerns\HasTitleMenuLabelTrait;
1112
use Statikbe\FilamentFlexibleContentBlockPages\Models\Contracts\HasMenuLabel;
1213
use Statikbe\FilamentFlexibleContentBlockPages\Observers\PageObserver;
@@ -45,6 +46,7 @@ class Page extends Model implements HasCode, HasContentBlocks, HasHeroCallToActi
4546
use HasFactory;
4647
use HasHeroCallToActionsTrait;
4748
use HasParentTrait;
49+
use HasSearchFilterTrait;
4850
use HasTitleMenuLabelTrait;
4951
use HasTranslatedContentBlocksTrait;
5052
use HasTranslatedHeroImageAttributesTrait;

src/Resources/PageResource.php

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use Filament\Tables\Columns\TextColumn;
1313
use Filament\Tables\Table;
1414
use Illuminate\Database\Eloquent\Builder;
15+
use Illuminate\Database\Eloquent\Model;
16+
use Illuminate\Support\Str;
1517
use Statikbe\FilamentFlexibleContentBlockPages\Actions\LinkedToMenuItemBulkDeleteAction;
1618
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
1719
use Statikbe\FilamentFlexibleContentBlockPages\Resources\PageResource\Pages\CreatePage;
@@ -47,6 +49,10 @@ class PageResource extends Resource
4749

4850
protected static ?string $recordTitleAttribute = 'title';
4951

52+
protected static int $globalSearchResultsLimit = 10;
53+
54+
protected static ?bool $isGlobalSearchForcedCaseInsensitive = true;
55+
5056
public static function getModel(): string
5157
{
5258
return FilamentFlexibleContentBlockPages::config()->getPageModel()::class;
@@ -179,12 +185,19 @@ public static function table(Table $table): Table
179185
{
180186
return $table
181187
->columns([
182-
TitleColumn::create(),
188+
TitleColumn::create()
189+
->searchable(query: function ($query, $search) {
190+
$locale = app()->getLocale();
191+
$search = strtolower($search);
192+
193+
return $query->whereRaw("LOWER(title->>'$.{$locale}') LIKE ?", ["%{$search}%"]);
194+
}),
183195
TextColumn::make('created_at')
184196
->label(flexiblePagesTrans('pages.table.created_at_col'))
185197
->dateTime(FilamentFlexibleBlocksConfig::getPublishingDateFormatting())
186198
->sortable(),
187-
PublishedColumn::create(),
199+
PublishedColumn::create()
200+
->sortable(),
188201
])
189202
->filters([
190203
PublishedFilter::create(),
@@ -220,4 +233,38 @@ public static function getPages(): array
220233
'edit' => EditPage::route('/{record:id}/edit'),
221234
];
222235
}
236+
237+
public static function getGloballySearchableAttributes(): array
238+
{
239+
return [
240+
'title',
241+
'intro',
242+
'content_blocks',
243+
'seo_title',
244+
'seo_description',
245+
'seo_keywords',
246+
'overview_title',
247+
'overview_description',
248+
];
249+
}
250+
251+
public static function getGlobalSearchResultTitle(Model $record): string
252+
{
253+
return $record->getTranslation('title', app()->getLocale());
254+
}
255+
256+
public static function getGlobalSearchResultDetails(Model $record): array
257+
{
258+
$published = trans('filament-flexible-content-blocks::filament-flexible-content-blocks.columns.is_published_state_unpublished');
259+
if ($record->isPublished()) {
260+
$published = trans(
261+
'filament-flexible-content-blocks::filament-flexible-content-blocks.columns.is_published_state_published'
262+
);
263+
}
264+
265+
return [
266+
trans('filament-flexible-content-blocks::filament-flexible-content-blocks.form_component.intro_lbl') => Str::limit(strip_tags($record->intro)),
267+
trans('filament-flexible-content-blocks::filament-flexible-content-blocks.columns.is_published') => $published,
268+
];
269+
}
223270
}

src/Resources/PageResource/Pages/ListPages.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Filament\Actions\CreateAction;
66
use Filament\Resources\Pages\ListRecords;
77
use Filament\Resources\Pages\ListRecords\Concerns\Translatable;
8+
use Illuminate\Database\Eloquent\Builder;
89
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
910
use Statikbe\FilamentFlexibleContentBlockPages\FilamentFlexibleContentBlockPagesConfig;
1011
use Statikbe\FilamentFlexibleContentBlocks\Filament\Actions\FlexibleLocaleSwitcher;
@@ -30,4 +31,13 @@ public function isTableSearchable(): bool
3031
{
3132
return true;
3233
}
34+
35+
protected function applySearchToTableQuery(Builder $query): Builder
36+
{
37+
if (filled($searchQuery = $this->getTableSearch())) {
38+
$query->search($searchQuery);
39+
}
40+
41+
return $query;
42+
}
3343
}

0 commit comments

Comments
 (0)