columns(1) ->schema([ Forms\Components\TextInput::make('name') ->label('Name') ->required() ->maxLength(255), Forms\Components\Toggle::make('personal_team') ->label('Is personal?') ->required(), Forms\Components\Select::make('user_id') ->relationship(name: 'owner', titleAttribute: 'email') ->searchable(['name', 'email']) ->required(), Forms\Components\Select::make('currency') ->label('Currency') ->options(ISOCurrencyProvider::getInstance()->getAvailableCurrencies()) ->searchable(), Forms\Components\TextInput::make('billable_rate') ->label('Billable rate (in Cents)') ->nullable() ->numeric(), Forms\Components\DateTimePicker::make('created_at') ->label('Created At') ->disabled(), Forms\Components\DateTimePicker::make('updated_at') ->label('Updated At') ->disabled(), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('name') ->searchable() ->sortable(), Tables\Columns\IconColumn::make('personal_team') ->boolean() ->label('Is personal?') ->sortable(), Tables\Columns\TextColumn::make('owner.email') ->sortable(), Tables\Columns\TextColumn::make('currency'), TextColumn::make('billable_rate') ->money(fn (Organization $resource) => $resource->currency ?? 'EUR', divideBy: 100), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->sortable(), Tables\Columns\TextColumn::make('updated_at') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->defaultSort('created_at', 'desc') ->filters([ // ]) ->actions([ Tables\Actions\EditAction::make(), Action::make('Import') ->icon('heroicon-o-inbox-arrow-down') ->action(function (Organization $record, array $data) { try { /** @var ReportDto $report */ $report = app(ImportService::class)->import( $record, $data['type'], Storage::disk(config('filament.default_filesystem_disk'))->get($data['file']) ); Notification::make() ->title('Import successful') ->success() ->body( 'Imported time entries: '.$report->timeEntriesCreated.'
'. 'Imported clients: '.$report->clientsCreated.'
'. 'Imported projects: '.$report->projectsCreated.'
'. 'Imported tasks: '.$report->tasksCreated.'
'. 'Imported tags: '.$report->tagsCreated.'
'. 'Imported users: '.$report->usersCreated ) ->persistent() ->send(); } catch (ImportException $exception) { report($exception); Notification::make() ->title('Import failed, changes rolled back') ->danger() ->body('Message: '.$exception->getMessage()) ->persistent() ->send(); } }) ->tooltip(fn (Organization $record): string => 'Import into '.$record->name) ->form([ Forms\Components\FileUpload::make('file') ->label('File') ->required(), Select::make('type') ->required() ->options(function (): array { $select = []; foreach (app(ImporterProvider::class)->getImporterKeys() as $key) { $select[$key] = $key; } return $select; }), ]), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ UsersRelationManager::class, ]; } public static function getPages(): array { return [ 'index' => Pages\ListOrganizations::route('/'), 'create' => Pages\CreateOrganization::route('/create'), 'edit' => Pages\EditOrganization::route('/{record}/edit'), 'view' => Pages\ViewOrganization::route('/{record}'), ]; } }