Last active
February 26, 2023 14:07
-
-
Save domthomas-dev/2af477ba0b2f0413135518c6141c6f3b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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) | |
; | |
}), | |
); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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