Forms\Components\Select::make('currency_code') ->label('Currency') ->relationship('currency', 'name', static fn (Builder $query) => $query->where('company_id', Auth::user()->currentCompany->id)) ->preload() ->searchable() ->default(static fn () => Account::getDefaultCurrencyCode()) ->required() ->createOptionForm([ Forms\Components\Select::make('currency.code') ->label('Code') ->searchable() ->options(Account::getCurrencyCodes()) ->reactive() ->afterStateUpdated(static function (callable $set, $state) { $code = $state; $name = config("money.{$code}.name"); $set('currency.name', $name); }) ->required(), Forms\Components\TextInput::make('currency.name') ->label('Name') ->maxLength(100) ->required(), Forms\Components\TextInput::make('currency.rate') ->label('Rate') ->numeric() ->mask(static fn (Forms\Components\TextInput\Mask $mask) => $mask ->numeric() ->decimalPlaces(4) ->signed(false) ->padFractionalZeros() ->normalizeZeros(false) ->minValue(0.0001) ->maxValue(999999.9999) ->lazyPlaceholder(false)) ->required(), ]) ->createOptionAction(static function (Forms\Components\Actions\Action $action) { return $action ->label('Add Currency') ->modalHeading('Add Currency') ->modalButton('Add') ->action(static function (array $data) { return DB::transaction(static function () use ($data) { $code = $data['currency']['code']; $name = $data['currency']['name']; $rate = $data['currency']['rate']; $createCurrencyFromAccountAction = new CreateCurrencyFromAccount(); return $createCurrencyFromAccountAction->create($code, $name, $rate); }); }); }), Forms\Components\TextInput::make('opening_balance') ->label('Starting Balance') ->required() ->mask(static fn (Forms\Components\TextInput\Mask $mask, Closure $get) => $mask ->patternBlocks([ 'money' => static fn (Mask $mask) => $mask ->numeric() ->decimalPlaces(config('money.' . $get('currency_code') . '.precision')) ->decimalSeparator(config('money.' . $get('currency_code') . '.decimal_mark')) ->thousandsSeparator(config('money.' . $get('currency_code') . '.thousands_separator')) ->signed() ->padFractionalZeros() ->normalizeZeros(false), ]) ->pattern(config('money.' . $get('currency_code') . '.symbol_first') ? config('money.' . $get('currency_code') . '.symbol') . 'money' : 'money' . config('money.' . $get('currency_code') . '.symbol')) ->lazyPlaceholder(false)),