Skip to content

Commit 23157ab

Browse files
author
Sasa Orasanin
committed
Filament version 4 support
1 parent 72387b1 commit 23157ab

File tree

17 files changed

+324
-176
lines changed

17 files changed

+324
-176
lines changed

composer.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"name": "zpmlabs/filament-api-docs-builder",
3+
"version": "2.0.1",
34
"description": "This package will give you the best API docs building experience.",
45
"keywords": [
56
"zpmlabs",
@@ -20,9 +21,9 @@
2021
}
2122
],
2223
"require": {
23-
"php": "^8.1",
24-
"filament/filament": "^3.0",
25-
"guava/filament-icon-picker": "^2.2",
24+
"php": "^8.2",
25+
"filament/filament": "^4.0",
26+
"zpmlabs/filament-icon-picker": "^1.0.0",
2627
"spatie/laravel-package-tools": "^1.15.0",
2728
"tempest/highlight": "^2.10"
2829
},

config/filament-api-docs-builder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
],
3434

3535
// Resource class used for managing API documentation within Filament
36-
'resource' => \ZPMLabs\FilamentApiDocsBuilder\Filament\Resources\ApiDocsResource::class,
36+
'resource' => \ZPMLabs\FilamentApiDocsBuilder\Filament\Resources\ApiDocsResource\ApiDocsResource::class,
37+
'resource_icon' => \Filament\Support\Icons\Heroicon::OutlinedCodeBracket,
3738

3839
// Model class representing API documentation
3940
'model' => \ZPMLabs\FilamentApiDocsBuilder\Models\ApiDocs::class,
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
pre, code {
2+
color: #839496;
3+
background-color: #002B36;
4+
}
5+
6+
.hl-keyword {
7+
color: #859900;
8+
}
9+
10+
.hl-property {
11+
color: #268BD2;
12+
}
13+
14+
.hl-attribute {
15+
font-style: italic;
16+
}
17+
18+
.hl-type {
19+
color: #CB4B16;
20+
}
21+
22+
.hl-generic {
23+
color: #B58900;
24+
}
25+
26+
.hl-value {
27+
color: #2AA198;
28+
}
29+
30+
.hl-literal {
31+
color: #2AA198;
32+
}
33+
34+
.hl-number {
35+
color: #D33682;
36+
}
37+
38+
.hl-variable {
39+
color: #839496;
40+
}
41+
42+
.hl-comment {
43+
color: #586E75;
44+
}
45+
46+
.hl-blur {
47+
filter: blur(2px);
48+
}
49+
50+
.hl-strong {
51+
font-weight: bold;
52+
}
53+
54+
.hl-em {
55+
font-style: italic;
56+
}
57+
58+
.hl-addition {
59+
display: inline-block;
60+
min-width: 100%;
61+
background-color: #00FF0022;
62+
}
63+
64+
.hl-deletion {
65+
display: inline-block;
66+
min-width: 100%;
67+
background-color: #FF000011;
68+
}
69+
70+
.hl-gutter {
71+
display: inline-block;
72+
font-size: 0.9em;
73+
color: #555;
74+
padding: 0 1ch;
75+
margin-right: 1ch;
76+
user-select: none;
77+
}
78+
79+
.hl-gutter-addition {
80+
background-color: #34A853;
81+
color: #fff;
82+
}
83+
84+
.hl-gutter-deletion {
85+
background-color: #EA4334;
86+
color: #fff;
87+
}

resources/views/filament/code.blade.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,22 @@
1010
copy() {
1111
const code = document.querySelector(`#${this.codeElID}`).textContent;
1212
navigator.clipboard.writeText(code);
13-
14-
// Update buttonText to 'Copied'
1513
this.buttonText = 'Copied';
16-
17-
// Use a delayed reset after 1 second
1814
setTimeout(() => {
1915
this.buttonText = 'Copy';
2016
}, 1000);
2117
}
2218
}"
2319
>
24-
<pre class="relative"><button @click="copy()" x-text="buttonText" class="absolute top-1 right-1 text-xs text-gray-500" style="right: 10px"></button><code id="{{ $codeID }}">{{ $getValue() }}</code></pre>
20+
<div class="flex justify-end mb-1">
21+
<button
22+
@click="copy()"
23+
x-text="buttonText"
24+
class="text-xs bg-primary-100 text-primary-800 font-medium px-2 py-0.5 rounded-full"
25+
></button>
26+
</div>
27+
28+
<pre><code id="{{ $codeID }}">{{ $getValue() }}</code></pre>
2529
</div>
2630
</x-dynamic-component>
31+

src/Actions/ExportJsonAction.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ protected function formatHeaders(array $params, $authRequired = false)
7979
// Filter parameters to extract headers
8080
$headers = collect($params)
8181
->filter(function($param)use ($params) {
82-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
82+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
8383
return $param['param_location'] === 'header' && ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
8484
})
8585
->map(function ($param) {
@@ -111,7 +111,7 @@ protected function formatRouteParams($endpoint, array $params)
111111
{
112112
// Replace placeholders in the endpoint URL with parameter values
113113
collect($params)->filter(function($param) use ($params) {
114-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
114+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
115115
return $param['param_location'] === 'query' && ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
116116
})
117117
->each(function ($param) use (&$endpoint) {
@@ -132,7 +132,7 @@ protected function formatQueryParams(array $params)
132132
// Filter and format query parameters
133133
return collect($params)
134134
->filter(function($param)use ($params) {
135-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
135+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
136136
return $param['param_location'] === 'query' && ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
137137
})
138138
->map(function ($param) {
@@ -156,7 +156,7 @@ protected function formatBody(array $params)
156156
// Extract and format body parameters
157157
$bodyParams = collect($params)
158158
->filter(function($param)use ($params) {
159-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
159+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
160160
return $param['param_location'] === 'body' && ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
161161
})
162162
->mapWithKeys(function ($param) {

src/Actions/PredefineCodeBuilderAction.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,23 @@ public static function handle(array $data)
3434

3535
// Filter query parameters based on visibility conditions
3636
$queryParams = array_filter($params, function ($param) use ($params) {
37-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
37+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
3838
$conditionally = ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
3939

4040
return $param['param_location'] === "query" && $conditionally;
4141
});
4242

4343
// Filter header parameters based on visibility conditions
4444
$headers = array_filter($params, function ($param) use ($params) {
45-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
45+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
4646
$conditionally = ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
4747

4848
return $param['param_location'] === "header" && $conditionally;
4949
});
5050

5151
// Filter body parameters based on visibility conditions
5252
$bodyParams = array_filter($params, function ($param) use ($params) {
53-
$condParam = collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
53+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : collect($params)->where('name', '=', $param['visibility_condition_param'])->first();
5454
$conditionally = ($param['visible'] === 'always' || ($param['visible'] === 'conditionally' && !is_null($condParam) && $condParam['value'] === $param['visibility_condition_value']));
5555

5656
return $param['param_location'] === "body" && $conditionally;

src/Filament/Actions/TestApiEndpointAction.php

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,19 @@
22

33
namespace ZPMLabs\FilamentApiDocsBuilder\Filament\Actions;
44

5+
use Filament\Actions\Action;
6+
use Filament\Forms\Components\KeyValue;
7+
use Filament\Forms\Components\TextInput;
8+
use Filament\Forms\Components\ViewField;
9+
use Filament\Schemas\Components\Actions;
10+
use Filament\Schemas\Components\Grid;
11+
use Filament\Schemas\Components\Utilities\Get;
12+
use Filament\Schemas\Components\Utilities\Set;
13+
use Filament\Support\Enums\Width;
514
use ZPMLabs\FilamentApiDocsBuilder\Enums\HttpStatuses;
6-
use Filament\Infolists\Components\Actions\Action;
715
use Illuminate\Support\Facades\Http;
816
use InvalidArgumentException;
9-
use Filament\Forms;
10-
use Filament\Forms\Get;
11-
use Filament\Forms\Set;
12-
use Filament\Support\Enums\MaxWidth;
1317
use Illuminate\Support\Collection;
14-
use Illuminate\Support\HtmlString;
1518
use Tempest\Highlight\Highlighter;
1619
use Tempest\Highlight\Themes\InlineTheme;
1720

@@ -38,7 +41,7 @@ public function item($item, $parameters, $allParams)
3841
$testingForm = [];
3942

4043
if ($item['details']['auth_required']) {
41-
$testingForm[] = Forms\Components\TextInput::make('token')
44+
$testingForm[] = TextInput::make('token')
4245
->columnSpanFull()
4346
->revealable()
4447
->password(); // Token input for authentication
@@ -50,23 +53,23 @@ public function item($item, $parameters, $allParams)
5053
$this->hidden(fn() => empty($item['details']['endpoint']))
5154
->label('Test Endpoint')
5255
->modalDescription($item['details']['endpoint'])
53-
->modalWidth(MaxWidth::FiveExtraLarge)
56+
->modalWidth(Width::FiveExtraLarge)
5457
->modalCancelAction(false)
5558
->modalSubmitAction(false)
5659
->form([
57-
Forms\Components\Grid::make()
60+
Grid::make()
5861
->columns()
5962
->schema([
60-
Forms\Components\Grid::make()
63+
Grid::make()
6164
->columnSpan(1)
6265
->schema($testingForm), // Form fields for API testing
63-
Forms\Components\ViewField::make('response')
66+
ViewField::make('response')
6467
->view('filament-api-docs-builder::filament.viewJson')
6568
->default(['response' => '{}'])
6669
->columnSpan(1) // Display formatted response
6770
]),
68-
Forms\Components\Actions::make([
69-
Forms\Components\Actions\Action::make('send')
71+
Actions::make([
72+
Action::make('send')
7073
->action(function (Set $set, Get $get) use ($item, $allParams) {
7174
// Handle request sending and response processing
7275
$data = $get();
@@ -99,7 +102,7 @@ protected function handleResponse($response, $set)
99102
$prettyResponse = json_encode($responseData, JSON_PRETTY_PRINT);
100103

101104
// Highlight the JSON response using a syntax highlighter
102-
$formated = (new Highlighter(new InlineTheme(__DIR__ . '/../../../vendor/tempest/highlight/src/Themes/Css/solarized-dark.css')))
105+
$formated = (new Highlighter(new InlineTheme(__DIR__ . '/../../../resources/themes/solarized-dark.css')))
103106
->parse($prettyResponse, 'json');
104107

105108
$set('response', [
@@ -211,7 +214,7 @@ protected function buildTestingFormComponents($parameters, $allParams)
211214

212215
foreach ($parameters as $location => $data) {
213216
if (!empty($data['params'])) {
214-
$components[$location] = Forms\Components\KeyValue::make(strtolower($location))
217+
$components[$location] = KeyValue::make(strtolower($location))
215218
->label(ucfirst($location))
216219
->columnSpanFull()
217220
->addable(false)
@@ -239,7 +242,7 @@ protected function updateStateOnChange($state, $allParams, $location)
239242
{
240243
foreach ($allParams->where('visible', 'conditionally') as $param) {
241244
$name = $param['required'] ? $param['name'] . '*' : $param['name'];
242-
$condParam = $allParams->where('name', $param['visibility_condition_param'])->first();
245+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : $allParams->where('name', $param['visibility_condition_param'])->first();
243246

244247
if ($this->shouldRemoveParamFromState($param, $location, $state, $name, $condParam)) {
245248
unset($state[$name]);
@@ -250,7 +253,7 @@ protected function updateStateOnChange($state, $allParams, $location)
250253

251254
foreach ($allParams->where('visible', 'conditionally') as $param) {
252255
$name = $param['required'] ? $param['name'] . '*' : $param['name'];
253-
$condParam = $allParams->where('name', $param['visibility_condition_param'])->first();
256+
$condParam = ($param['visible'] == 'always' || !isset($param['visibility_condition_param'])) ? null : $allParams->where('name', $param['visibility_condition_param'])->first();
254257

255258
if ($this->shouldAddParamToState($param, $location, $state, $name, $condParam)) {
256259
$state[$name] = $param['value'];

0 commit comments

Comments
 (0)