diff --git a/app/Http/Controllers/Api/MaintenancesController.php b/app/Http/Controllers/Api/MaintenancesController.php index 86f561c86c..319a7b0b18 100644 --- a/app/Http/Controllers/Api/MaintenancesController.php +++ b/app/Http/Controllers/Api/MaintenancesController.php @@ -52,6 +52,10 @@ class MaintenancesController extends Controller $maintenances->where('maintenances.created_by', '=', $request->input('created_by')); } + if ($request->filled('url')) { + $maintenances->where('maintenances.url', '=', $request->input('url')); + } + if ($request->filled('asset_maintenance_type')) { $maintenances->where('asset_maintenance_type', '=', $request->input('asset_maintenance_type')); } diff --git a/app/Http/Controllers/MaintenancesController.php b/app/Http/Controllers/MaintenancesController.php index e893b75f39..b3f287e6e7 100644 --- a/app/Http/Controllers/MaintenancesController.php +++ b/app/Http/Controllers/MaintenancesController.php @@ -78,6 +78,7 @@ class MaintenancesController extends Controller $maintenance->is_warranty = $request->input('is_warranty'); $maintenance->cost = $request->input('cost'); $maintenance->notes = $request->input('notes'); + $maintenance->url = $request->input('url'); // Save the asset maintenance data $maintenance->asset_id = $asset->id; @@ -152,6 +153,7 @@ class MaintenancesController extends Controller $maintenance->name = $request->input('name'); $maintenance->start_date = $request->input('start_date'); $maintenance->completion_date = $request->input('completion_date'); + $maintenance->url = $request->input('url'); // Todo - put this in a getter/setter? diff --git a/app/Http/Transformers/MaintenancesTransformer.php b/app/Http/Transformers/MaintenancesTransformer.php index c20c254869..05268de5ac 100644 --- a/app/Http/Transformers/MaintenancesTransformer.php +++ b/app/Http/Transformers/MaintenancesTransformer.php @@ -66,6 +66,7 @@ class MaintenancesTransformer 'id' => $assetmaintenance->supplier->id, 'name'=> e($assetmaintenance->supplier->name) ] : null, + 'url' => ($assetmaintenance->url) ? e($assetmaintenance->url) : null, 'cost' => Helper::formatCurrencyOutput($assetmaintenance->cost), 'asset_maintenance_type' => e($assetmaintenance->asset_maintenance_type), 'start_date' => Helper::getFormattedDateObject($assetmaintenance->start_date, 'date'), diff --git a/app/Models/Maintenance.php b/app/Models/Maintenance.php index 942fdb122a..40a96dcb62 100644 --- a/app/Models/Maintenance.php +++ b/app/Models/Maintenance.php @@ -38,6 +38,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild 'completion_date' => 'date_format:Y-m-d|nullable|after_or_equal:start_date', 'notes' => 'string|nullable', 'cost' => 'numeric|nullable|gte:0|max:99999999999999999.99', + 'url' => 'nullable|url|max:255', ]; @@ -57,6 +58,7 @@ class Maintenance extends SnipeModel implements ICompanyableChild 'asset_maintenance_time', 'notes', 'cost', + 'url', ]; use Searchable; diff --git a/app/Presenters/MaintenancesPresenter.php b/app/Presenters/MaintenancesPresenter.php index 41ff927f67..9edd0f5035 100644 --- a/app/Presenters/MaintenancesPresenter.php +++ b/app/Presenters/MaintenancesPresenter.php @@ -111,6 +111,12 @@ class MaintenancesPresenter extends Presenter 'sortable' => true, 'title' => trans('admin/maintenances/form.completion_date'), 'formatter' => 'dateDisplayFormatter', + ], [ + 'field' => 'url', + 'searchable' => true, + 'sortable' => true, + 'title' => trans('general.url'), + 'formatter' => 'externalLinkFormatter', ], [ 'field' => 'notes', 'searchable' => true, diff --git a/database/factories/MaintenanceFactory.php b/database/factories/MaintenanceFactory.php index e07de8d24d..01adf08560 100644 --- a/database/factories/MaintenanceFactory.php +++ b/database/factories/MaintenanceFactory.php @@ -31,6 +31,7 @@ class MaintenanceFactory extends Factory 'start_date' => $this->faker->date(), 'is_warranty' => $this->faker->boolean(), 'notes' => $this->faker->paragraph(), + 'url' => $this->faker->url(), ]; } } diff --git a/database/migrations/2025_10_07_113331_add_url_to_maintenances.php b/database/migrations/2025_10_07_113331_add_url_to_maintenances.php new file mode 100644 index 0000000000..53b0e30dd4 --- /dev/null +++ b/database/migrations/2025_10_07_113331_add_url_to_maintenances.php @@ -0,0 +1,32 @@ +text('url')->after('name')->nullable()->default(null); + } + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('maintenances', function (Blueprint $table) { + if (Schema::hasColumn('maintenances', 'url')) { + $table->dropColumn('url'); + } + }); + } +}; diff --git a/resources/views/maintenances/edit.blade.php b/resources/views/maintenances/edit.blade.php index 24df4210a7..80c19377a8 100644 --- a/resources/views/maintenances/edit.blade.php +++ b/resources/views/maintenances/edit.blade.php @@ -153,6 +153,7 @@ +
@@ -171,6 +172,15 @@
+
+ +
+ + {!! $errors->first('url', '') !!} +
+
+ + @include ('partials.forms.edit.image-upload', ['image_path' => app('maintenances_path')]) diff --git a/resources/views/maintenances/view.blade.php b/resources/views/maintenances/view.blade.php index df85ed544f..5a5c2da8ad 100644 --- a/resources/views/maintenances/view.blade.php +++ b/resources/views/maintenances/view.blade.php @@ -138,6 +138,20 @@ use Carbon\Carbon; + @if ($maintenance->url) +
+
+ {{ trans('general.url') }} +
+
+ + {{ $maintenance->url }} + + +
+
+ @endif +
{{ trans('admin/maintenances/form.asset_maintenance_time') }} diff --git a/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php b/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php index 594d89466f..5924b1c1fa 100644 --- a/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php +++ b/tests/Feature/Maintenances/Api/CreateMaintenanceTest.php @@ -41,6 +41,7 @@ class CreateMaintenanceTest extends TestCase 'completion_date' => '2021-01-10', 'is_warranty' => '1', 'cost' => '100.00', + 'url' => 'https://snipeitapp.com', 'image' => UploadedFile::fake()->image('test_image.png'), 'notes' => 'A note', ]) @@ -62,6 +63,7 @@ class CreateMaintenanceTest extends TestCase 'start_date' => '2021-01-01', 'completion_date' => '2021-01-10', 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', 'image' => $maintenance->image, 'created_by' => $actor->id, ]); diff --git a/tests/Feature/Maintenances/Api/EditMaintenanceTest.php b/tests/Feature/Maintenances/Api/EditMaintenanceTest.php index 4ca589bec2..c3a4dd337f 100644 --- a/tests/Feature/Maintenances/Api/EditMaintenanceTest.php +++ b/tests/Feature/Maintenances/Api/EditMaintenanceTest.php @@ -38,6 +38,7 @@ class EditMaintenanceTest extends TestCase 'is_warranty' => '1', 'image' => UploadedFile::fake()->image('test_image.png'), 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', ]) ->assertOk(); @@ -57,6 +58,7 @@ class EditMaintenanceTest extends TestCase 'completion_date' => '2021-01-10', 'asset_maintenance_time' => '9', 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', 'image' => $maintenance->image, ]); diff --git a/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php b/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php index de1201e17f..a731828899 100644 --- a/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php +++ b/tests/Feature/Maintenances/Ui/CreateMaintenanceTest.php @@ -46,6 +46,7 @@ class CreateMaintenanceTest extends TestCase 'cost' => '100.00', 'image' => UploadedFile::fake()->image('test_image.png'), 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', ]) ->assertSessionHasNoErrors() ->assertRedirect(route('maintenances.index')); @@ -67,6 +68,7 @@ class CreateMaintenanceTest extends TestCase 'completion_date' => '2021-01-10', 'asset_maintenance_time' => '9', 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', 'cost' => '100.00', 'image' => $maintenance->image, 'created_by' => $actor->id, diff --git a/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php b/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php index ad8aea4a56..cf92a10499 100644 --- a/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php +++ b/tests/Feature/Maintenances/Ui/EditMaintenanceTest.php @@ -38,6 +38,7 @@ class EditMaintenanceTest extends TestCase 'image' => UploadedFile::fake()->image('test_image.png'), 'cost' => '100.99', 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', ]) ->assertSessionHasNoErrors() ->assertRedirect(route('maintenances.index')); @@ -58,6 +59,7 @@ class EditMaintenanceTest extends TestCase 'completion_date' => '2021-01-10', 'asset_maintenance_time' => '9', 'notes' => 'A note', + 'url' => 'https://snipeitapp.com', 'cost' => '100.99', ]);