• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

luttje / filament-user-attributes / 7254443569

18 Dec 2023 10:14PM UTC coverage: 73.72% (-0.2%) from 73.873%
7254443569

push

github

web-flow
Feature/custom config field support (#6)

* refactor so configs related to user attributes can be fetched + better livewire support

* let devs add custom config fields

* remove changelog workflow

43 of 67 new or added lines in 8 files covered. (64.18%)

1 existing line in 1 file now uncovered.

1296 of 1758 relevant lines covered (73.72%)

30.13 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.56
/src/Filament/Resources/UserAttributeConfigResource.php
1
<?php
2

3
namespace Luttje\FilamentUserAttributes\Filament\Resources;
4

5
use Filament\Forms;
6
use Filament\Forms\Form;
7
use Filament\Resources\Resource;
8
use Filament\Tables;
9
use Filament\Tables\Table;
10
use Illuminate\Database\Eloquent\Builder;
11
use Illuminate\Database\Eloquent\Casts\ArrayObject;
12
use Illuminate\Database\Eloquent\Model;
13
use Luttje\FilamentUserAttributes\Facades\FilamentUserAttributes;
14
use Luttje\FilamentUserAttributes\Filament\Resources\UserAttributeConfigResource\Pages\EditUserAttributeConfig;
15
use Luttje\FilamentUserAttributes\Filament\Resources\UserAttributeConfigResource\Pages\ManageUserAttributeConfigs;
16
use Luttje\FilamentUserAttributes\Filament\UserAttributeComponentFactoryRegistry;
17
use Luttje\FilamentUserAttributes\Models\UserAttributeConfig;
18

19
class UserAttributeConfigResource extends Resource
20
{
21
    protected static ?string $model = UserAttributeConfig::class;
22

23
    protected static ?string $tenantOwnershipRelationshipName = 'owner';
24

25
    /**
26
     * Limit the query to only the user attributes for the correct config (like a user or tenant).
27
     */
28
    public static function getEloquentQuery(): Builder
4✔
29
    {
30
        $resources = FilamentUserAttributes::getConfigurableResources();
4✔
31
        $query = parent::getEloquentQuery();
4✔
32

33
        /** @var \Luttje\FilamentUserAttributes\Contracts\UserAttributesConfigContract $resource */
34
        foreach ($resources as $resource => $_) {
4✔
35
            $config = $resource::getUserAttributesConfig();
×
36

37
            if (!$config) {
×
38
                continue;
×
39
            }
40

UNCOV
41
            $query->where('owner_type', get_class($config))
×
42
                ->where('owner_id', $config->getKey());
×
43

44
            break;
×
45
        }
46

47
        return $query;
4✔
48
    }
49

50
    public static function resolveRecordRouteBinding(int | string $key): ?Model
36✔
51
    {
52
        if(class_exists($key)) {
36✔
53
            $resource = $key;
36✔
54
            $config = $resource::getUserAttributesConfig();
36✔
55

56
            if (!$config) {
36✔
57
                throw new \Exception("No valid user attributes config found for resource {$resource}. Did you forget to implement the `UserAttributesConfigContract` method `getUserAttributesConfig()`?");
×
58
            }
59

60
            $userAttributeConfigs = $config
36✔
61
                ->userAttributesConfigs()
36✔
62
                ->where('resource_type', $resource)
36✔
63
                ->first();
36✔
64

65
            if (!$userAttributeConfigs) {
36✔
66
                $modelType = FilamentUserAttributes::getModelFromResource($resource);
36✔
67

68
                $userAttributeConfigs = UserAttributeConfig::create([
36✔
69
                    'resource_type' => $resource,
36✔
70
                    'model_type' => $modelType,
36✔
71
                    'owner_type' => get_class($config),
36✔
72
                    'owner_id' => $config->id,
36✔
73
                    'config' => [],
36✔
74
                ]);
36✔
75
            }
76

77
            return $userAttributeConfigs;
36✔
78
        }
79

80
        return parent::resolveRecordRouteBinding($key);
×
81
    }
82

83
    public static function form(Form $form): Form
36✔
84
    {
85
        /** @var UserAttributeConfig */
86
        $model = $form->model;
36✔
87
        return $form
36✔
88
            ->schema([
36✔
89
                Forms\Components\Repeater::make('config')
36✔
90
                    ->addActionLabel(__('filament-user-attributes::user-attributes.add_attribute'))
36✔
91
                    ->label(ucfirst(__('filament-user-attributes::user-attributes.attributes.config')))
36✔
92
                    ->reorderable(false)
36✔
93
                    ->schema([
36✔
94
                        ...UserAttributeComponentFactoryRegistry::getConfigurationSchemas($model),
36✔
95
                    ])
36✔
96
                ])
36✔
97
            ->columns(1);
36✔
98
    }
99

100
    public static function table(Table $table): Table
4✔
101
    {
102
        return $table
4✔
103
            ->columns([
4✔
104
                Tables\Columns\TextColumn::make('resource_type')
4✔
105
                    ->label(ucfirst(__('filament-user-attributes::user-attributes.attributes.resource_type')))
4✔
106
                    ->formatStateUsing(function (string $state) {
4✔
107
                        $nameTransformer = config('filament-user-attributes.discovery_resource_name_transformer');
×
108
                        return $nameTransformer($state);
×
109
                    }),
4✔
110
                Tables\Columns\TextColumn::make('config')
4✔
111
                    ->label(ucfirst(__('filament-user-attributes::user-attributes.attributes.config')))
4✔
112
                    ->formatStateUsing(function (ArrayObject $state) {
4✔
113
                        $count = count($state);
×
114
                        return trans_choice('filament-user-attributes::user-attributes.amount', $count, ['amount' => $count]);
×
115
                    }),
4✔
116
            ])
4✔
117
            ->actions([
4✔
118
                Tables\Actions\EditAction::make(),
4✔
119
                Tables\Actions\DeleteAction::make(),
4✔
120
            ]);
4✔
121
    }
122

123
    public static function getPages(): array
292✔
124
    {
125
        $callerClass = get_called_class();
292✔
126
        ManageUserAttributeConfigs::$injectedResource = $callerClass;
292✔
127
        EditUserAttributeConfig::$injectedResource = $callerClass;
292✔
128

129
        return [
292✔
130
            'index' => ManageUserAttributeConfigs::route('/'),
292✔
131
            'edit' => EditUserAttributeConfig::route('/{record}/edit'),
292✔
132
        ];
292✔
133
    }
134
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc