Skip to content

Instantly share code, notes, and snippets.

@domthomas-dev
Last active February 26, 2023 14:07
Show Gist options
  • Save domthomas-dev/2af477ba0b2f0413135518c6141c6f3b to your computer and use it in GitHub Desktop.
Save domthomas-dev/2af477ba0b2f0413135518c6141c6f3b to your computer and use it in GitHub Desktop.
<?php
namespace App\Providers;
use App\Models\Consumer;
use App\Models\Mission;
use App\Models\Product;
use App\Models\Worker;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\ServiceProvider;
use WireElements\Pro\Components\Spotlight\Spotlight;
use WireElements\Pro\Components\Spotlight\SpotlightQuery;
use WireElements\Pro\Components\Spotlight\SpotlightResult;
use WireElements\Pro\Components\Spotlight\SpotlightScopeToken;
class SpotlightMissionProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
$this->registerSpotlightGroups();
// $this->registerSpotlightModes();
// $this->registerSpotlightRandomTips();
$this->registerSpotlightTokens();
$this->registerSpotlightScopes();
$this->registerSpotlightQueries();
}
/**
* Bootstrap services.
*/
public function boot(): void
{
//
}
private function registerSpotlightTokens(): void
{
Spotlight::registerTokens(
SpotlightScopeToken::make('mission', function (SpotlightScopeToken $token, Mission $mission): void {
$mission->refresh();
$token->setParameters(['id' => $mission->id]);
$token->setText($mission->id.' - '.$mission->product?->serial_number.' - '.$mission->consumer?->lastname.' '.$mission->consumer?->lastname.' - '.$mission->worker?->name);
}),
);
}
private function registerSpotlightScopes(): void
{
//
}
private function registerSpotlightGroups(): void
{
Spotlight::registerGroup('pages', 'Pages');
Spotlight::registerGroup('missions', 'Missions');
}
private function registerSpotlightQueries(): void
{
Spotlight::registerQueries(
SpotlightQuery::asDefault(function ($query) {
$pages = collect([
SpotlightResult::make()
->setTitle('Dashboard')
->setGroup('pages')
->setAction('jump_to', ['path' => '/'])
->setIcon('home'),
SpotlightResult::make()
->setTitle('Produits')
->setTypeahead('Liste des modèles de produits')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.product-models.index')])
->setIcon('circle-stack'),
])->when(! blank($query), function ($pages) use ($query) {
return $pages->where(fn (SpotlightResult $result) => str($result->title())->lower()->contains(str($query)->lower()));
});
$missions = Mission::query()
->select(['id'])
->addSelect(['customer_name' => Consumer::query()->selectRaw('concat_ws(lastname,firstname)')->whereColumn('missions.consumer_id', 'consumers.id')])
->addSelect(['worker_name' => Worker::query()->select(['name'])->whereColumn('missions.worker_id', 'workers.id')])
->addSelect(['product_serial' => Product::query()->select('serial_number')->whereColumn('missions.product_id', 'products.id')])
->limit(5)
->orderByDesc('updated_at')
->when(! blank($query), fn (Builder $q) => $q->whereRelation('product', 'serial_number', 'like', "{$query}%")->orderByDesc('updated_at'))
->get()->map(function (Mission $mission) {
return SpotlightResult::make()
->setTitle($mission->id.' - '.$mission->product_serial.' - '.$mission->customer_name.' - '.$mission->worker_name)
->setGroup('missions')
->setAction('jump_to', ['path' => route('admin.missions.edit', $mission), 'description' => 'aller sur la fiche mission'])
->setTokens(['mission' => $mission])
->setIcon('circle-stack')
;
});
return collect()
->merge($pages)
->merge($missions)
;
}),
SpotlightQuery::forToken('mission', function ($query, SpotlightScopeToken $mission) {
$pages = collect([
SpotlightResult::make()
->setTitle('Fiche mission')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.missions.edit', $mission), 'description' => 'aller à la fiche mission'])
->setIcon('arrow-path-rounded-square'),
SpotlightResult::make()
->setTitle('Imprimer')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.missions.edit', $mission), 'description' => 'Imprimer la fiche'])
->setIcon('printer')
,
]
)
->when(! blank($query), function ($collection) use ($query) {
return $collection->where(fn (SpotlightResult $result
) => str($result->title())->lower()->contains(str($query)->lower()));
})
;
return collect()
->merge($pages)
;
}),
);
}
}
<?php
namespace App\Providers;
use App\Models\Brand;
use App\Models\Category;
use App\Models\Consumer;
use App\Models\Mission;
use App\Models\Product;
use App\Models\ProductModel;
use App\Models\Worker;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use WireElements\Pro\Components\Spotlight\Spotlight;
use WireElements\Pro\Components\Spotlight\SpotlightQuery;
use WireElements\Pro\Components\Spotlight\SpotlightResult;
use WireElements\Pro\Components\Spotlight\SpotlightScope;
use WireElements\Pro\Components\Spotlight\SpotlightScopeToken;
class SpotlightProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
$this->registerSpotlightGroups();
// $this->registerSpotlightModes();
// $this->registerSpotlightRandomTips();
$this->registerSpotlightTokens();
$this->registerSpotlightScopes();
$this->registerSpotlightQueries();
}
/**
* Bootstrap services.
*/
public function boot(): void
{
//
}
private function registerSpotlightTokens(): void
{
Spotlight::registerTokens(
SpotlightScopeToken::make('productModel', function (SpotlightScopeToken $token, ProductModel $productModel): void {
ray($token, $productModel);
$token->setParameters(['id' => $productModel->id, 'serial_start' => $productModel->serial_start]);
$token->setText($productModel->complete_name);
}),
SpotlightScopeToken::make('mission', function (SpotlightScopeToken $token, Mission $mission): void {
$mission->refresh();
$token->setParameters(['id' => $mission->id]);
$token->setText($mission->id.' - '.$mission->product?->serial_number.' - '.$mission->consumer?->lastname.' '.$mission->consumer?->lastname.' - '.$mission->worker?->name);
}),
);
}
private function registerSpotlightScopes(): void
{
// Spotlight::registerScopes(
// SpotlightScope::forRoute('missions.edit', function (SpotlightScope $scope, Request $request) {
// $scope->applyToken('mission', Mission::findOrFail($request->id));
// }),
// SpotlightScope::forRoute('product-models.edit', function (SpotlightScope $scope, Request $request) {
// $scope->applyToken('productModel', ProductModel::findOrFail($request->id));
// }),
// );
}
private function registerSpotlightGroups(): void
{
Spotlight::registerGroup('pages', 'Pages');
Spotlight::registerGroup('products', 'Produits');
Spotlight::registerGroup('missions', 'Missions');
}
private function registerSpotlightQueries(): void
{
Spotlight::registerQueries(
SpotlightQuery::asDefault(function ($query) {
$pages = collect([
SpotlightResult::make()
->setTitle('Dashboard')
->setGroup('pages')
->setAction('jump_to', ['path' => '/'])
->setIcon('home'),
SpotlightResult::make()
->setTitle('Produits')
->setTypeahead('Liste des modèles de produits')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.product-models.index')])
->setIcon('circle-stack'),
])->when(! blank($query), function ($pages) use ($query) {
return $pages->where(fn (SpotlightResult $result) => str($result->title())->lower()->contains(str($query)->lower()));
});
$products = ProductModel::query()
->select(['id', 'code', 'serial_start'])
->addSelect([
'brand_name' => Brand::query()->select('name')->whereColumn('brand_id', 'brands.id'),
'category_name' => Category::query()->select('name')->whereColumn('category_id', 'categories.id'),
])
->limit(5)
->orderByDesc('updated_at')
->when(! blank($query), fn (Builder $q) => $q->where('code', 'like', "{$query}%")
->orWhere('serial_start', 'like', Str::of($query)->substr(0, 8)->append('%'))
->orderBy('code'))
->get()->map(function (ProductModel $productModel) {
return SpotlightResult::make()
->setTitle($productModel->code.' - '.$productModel->category_name.' - '.$productModel->brand_name.' '.$productModel->name)
->setGroup('products')
->setAction('jump_to', ['path' => route('admin.product-models.edit', $productModel), 'description' => 'aller sur la fiche produit'])
->setTokens(['productModel' => $productModel])
->setIcon('circle-stack')
;
});
$missions = Mission::query()
->select(['id'])
->addSelect(['customer_name' => Consumer::query()->selectRaw('concat_ws(lastname,firstname)')->whereColumn('missions.consumer_id', 'consumers.id')])
->addSelect(['worker_name' => Worker::query()->select(['name'])->whereColumn('missions.worker_id', 'workers.id')])
->addSelect(['product_serial' => Product::query()->select('serial_number')->whereColumn('missions.product_id', 'products.id')])
->limit(5)
->orderByDesc('updated_at')
->when(! blank($query), fn (Builder $q) => $q->whereRelation('product', 'serial_number', 'like', "{$query}%")->orderByDesc('updated_at'))
->get()->map(function (Mission $mission) {
return SpotlightResult::make()
->setTitle($mission->id.' - '.$mission->product_serial.' - '.$mission->customer_name.' - '.$mission->worker_name)
->setGroup('missions')
->setAction('jump_to', ['path' => route('admin.missions.edit', $mission), 'description' => 'aller sur la fiche mission'])
->setTokens(['mission' => $mission])
->setIcon('circle-stack')
;
});
return collect()
->merge($products)
->merge($pages)
->merge($missions)
;
}),
SpotlightQuery::forToken('productModel', function ($query, SpotlightScopeToken $productToken) {
$pages = collect([
SpotlightResult::make()
->setTitle('Créer un modèle de produit')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.product-models.create'), 'description' => 'créer un nouveau modèle de produit'])
->setIcon('arrow-path-rounded-square'),
SpotlightResult::make()
->setTitle('Voir la fiche')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.product-models.edit'), 'description' => 'aller sur la fiche du modèle'])
->setIcon('arrow-path-rounded-square'),
]
)->when(! blank($query), function ($collection) use ($query) {
return $collection->where(fn (SpotlightResult $result
) => str($result->title())->lower()->contains(str($query)->lower()));
});
return collect()
->merge($pages)
;
}),
SpotlightQuery::forToken('mission', function ($query, SpotlightScopeToken $mission) {
$pages = collect([
SpotlightResult::make()
->setTitle('Fiche mission')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.missions.edit', $mission), 'description' => 'aller à la fiche mission'])
->setIcon('arrow-path-rounded-square'),
SpotlightResult::make()
->setTitle('Imprimer')
->setGroup('pages')
->setAction('jump_to', ['path' => route('admin.missions.edit', $mission), 'description' => 'Imprimer la fiche'])
->setIcon('printer'),
]
)
->when(! blank($query), function ($collection) use ($query) {
return $collection->where(fn (SpotlightResult $result
) => str($result->title())->lower()->contains(str($query)->lower()));
})
;
return collect()
->merge($pages)
;
}),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment