You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CreateCurrencySelect.php 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. namespace App\Filament\Forms\Components;
  3. use App\Models\Setting\Currency;
  4. use App\Utilities\Currency\CurrencyAccessor;
  5. use App\Utilities\Currency\CurrencyConverter;
  6. use Filament\Forms\Components\Actions\Action;
  7. use Filament\Forms\Components\Select;
  8. use Filament\Forms\Components\TextInput;
  9. use Filament\Forms\Set;
  10. use Filament\Support\Enums\MaxWidth;
  11. use Illuminate\Support\Facades\DB;
  12. class CreateCurrencySelect extends Select
  13. {
  14. protected function setUp(): void
  15. {
  16. parent::setUp();
  17. $this->localizeLabel('Currency')
  18. ->default(CurrencyAccessor::getDefaultCurrency())
  19. ->preload()
  20. ->searchable()
  21. ->live()
  22. ->required()
  23. ->createOptionForm($this->createCurrencyForm())
  24. ->createOptionAction(fn (Action $action) => $this->createCurrencyAction($action));
  25. $this->relationship('currency', 'name');
  26. $this->createOptionUsing(static function (array $data) {
  27. return DB::transaction(static function () use ($data) {
  28. $currency = Currency::create([
  29. 'code' => $data['code'],
  30. 'rate' => $data['rate'],
  31. ]);
  32. return $currency->code;
  33. });
  34. });
  35. }
  36. protected function createCurrencyForm(): array
  37. {
  38. return [
  39. Select::make('code')
  40. ->localizeLabel()
  41. ->searchable()
  42. ->options(CurrencyAccessor::getAvailableCurrencies())
  43. ->live()
  44. ->afterStateUpdated(static function (Set $set, $state) {
  45. CurrencyConverter::handleCurrencyChange($set, $state);
  46. })
  47. ->required(),
  48. TextInput::make('rate')
  49. ->localizeLabel()
  50. ->numeric()
  51. ->required(),
  52. ];
  53. }
  54. protected function createCurrencyAction(Action $action): Action
  55. {
  56. return $action
  57. ->label('Add currency')
  58. ->slideOver()
  59. ->modalWidth(MaxWidth::Medium);
  60. }
  61. }