schema([ Select::make('role') ->options(Role::class), ]); } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ TextColumn::make('name'), TextColumn::make('role'), TextColumn::make('membership.billable_rate') ->label('Billable rate') ->money(fn (Organization $resource) => $resource->currency, divideBy: 100), ]) ->headerActions([ ]) ->actions([ Action::make('view') ->icon('heroicon-o-eye') ->color('gray') ->url(fn (Organization $record): string => OrganizationResource::getUrl('view', [ 'record' => $record->getKey(), ])), Tables\Actions\EditAction::make() ->using(function (Organization $record, array $data): Organization { /** @var Member $member */ $member = $record->getRelation('membership'); if ($data['role'] !== $member->role) { try { app(MemberService::class)->changeRole($member, $record, Role::from($data['role']), true); } catch (ApiException $exception) { Notification::make() ->danger() ->title('Update failed') ->body($exception->getTranslatedMessage()) ->persistent() ->send(); } } $member->save(); return $record; }), Tables\Actions\DetachAction::make() ->using(function (Organization $record): void { /** @var User $user */ $user = $this->getOwnerRecord(); $member = Member::query() ->whereBelongsTo($user, 'user') ->whereBelongsTo($record, 'organization') ->firstOrFail(); try { app(MemberService::class)->removeMember($member, $record); } catch (ApiException $exception) { Notification::make() ->danger() ->title('Delete failed') ->body($exception->getTranslatedMessage()) ->persistent() ->send(); } }), ]) ->bulkActions([ ]); } }