Skip to content

Commit e776a08

Browse files
committed
feat: add support filters
1 parent 7c0af19 commit e776a08

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/Bootstrap.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
namespace PressbooksMultiInstitution;
44

5+
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
6+
use Illuminate\Database\Query\Builder;
57
use Kucrut\Vite;
68
use Pressbooks\Container;
79
use PressbooksMultiInstitution\Actions\AssignBookToInstitution;
810
use PressbooksMultiInstitution\Actions\AssignUserToInstitution;
911
use PressbooksMultiInstitution\Actions\InstitutionalManagerDashboard;
12+
use PressbooksMultiInstitution\Models\Institution;
1013
use PressbooksMultiInstitution\Services\InstitutionStatsService;
1114
use PressbooksMultiInstitution\Services\MenuManager;
1215
use PressbooksMultiInstitution\Services\PermissionsManager;
@@ -40,6 +43,8 @@ public function setUp(): void
4043

4144
Container::getInstance()->singleton(BookList::class, fn () => new BookList(app('db')));
4245
Container::getInstance()->singleton(UserList::class, fn () => new UserList(app('db')));
46+
47+
$this->registerInstitutionHooks();
4348
}
4449

4550
private function registerActions(): void
@@ -71,6 +76,57 @@ private function registerBlade(): void
7176
);
7277
}
7378

79+
private function registerInstitutionHooks(): void
80+
{
81+
add_filter(
82+
hook_name: 'pressbooks_get_institution_by_id',
83+
callback: function (bool $default, string|int $id) {
84+
$institution = Institution::query()->find($id);
85+
86+
return $institution?->id ?? $default;
87+
},
88+
accepted_args: 2
89+
);
90+
91+
add_filter(
92+
hook_name: 'pressbooks_get_institution_dropdown',
93+
callback: function (array $default) {
94+
return Institution::query()
95+
->orderBy('name')
96+
->pluck('name', 'id')
97+
->prepend(__('Unassigned', 'pressbooks-multi-institution'), 0)
98+
->toArray();
99+
},
100+
);
101+
102+
add_filter(
103+
hook_name: 'pressbooks_append_institution_to_query',
104+
callback: function (EloquentBuilder $query, string $columnToCompare, string $search, string $order, string $direction) {
105+
$query
106+
->addSelect([
107+
'institution' => Institution::query()
108+
->select('name')
109+
->whereColumn('id', '=', $columnToCompare)
110+
])
111+
->when($search, function (EloquentBuilder $query, string $value) use ($columnToCompare) {
112+
$query->orWhereExists(function (Builder $query) use ($value, $columnToCompare) {
113+
$query
114+
->selectRaw(1)
115+
->from('institutions')
116+
->whereColumn('id', '=', $columnToCompare)
117+
->where('name', 'like', "%{$value}%");
118+
});
119+
})
120+
->when($order === 'institution', function (EloquentBuilder $query) use ($direction) {
121+
$query
122+
->orderByRaw($direction === 'asc' ? 'institution IS NOT NULL' : 'institution IS NULL')
123+
->orderBy('institution', $direction);
124+
});
125+
},
126+
accepted_args: 5
127+
);
128+
}
129+
74130
private function enqueueScripts(): void
75131
{
76132
add_action('admin_enqueue_scripts', function ($page) {

src/Services/MenuManager.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public function registerMenus(): void
7676
}
7777
);
7878

79-
apply_filters('pressbooks-multi-institution-add-menu', $this->slug);
79+
apply_filters('pressbooks_multi_institution_add_menu', $this->slug);
8080
}
8181

8282
/**

0 commit comments

Comments
 (0)